UNPKG

ngx-spine

Version:

[![Build Status](https://travis-ci.org/PoiScript/ngx-spine.svg?branch=master)](https://travis-ci.org/PoiScript/ngx-spine)

456 lines 34.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /****************************************************************************** * Spine Runtimes License Agreement * Last updated May 1, 2019. Replaces all prior versions. * * Copyright (c) 2013-2019, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software * or otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS * INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { ManagedWebGLRenderingContext } from "./WebGL"; import { Shader } from "./Shader"; var Mesh = /** @class */ (function () { function Mesh(context, attributes, maxVertices, maxIndices) { this.attributes = attributes; this.verticesLength = 0; this.dirtyVertices = false; this.indicesLength = 0; this.dirtyIndices = false; this.elementsPerVertex = 0; this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); this.elementsPerVertex = 0; for (var i = 0; i < attributes.length; i++) { this.elementsPerVertex += attributes[i].numElements; } this.vertices = new Float32Array(maxVertices * this.elementsPerVertex); this.indices = new Uint16Array(maxIndices); this.context.addRestorable(this); } /** * @return {?} */ Mesh.prototype.getAttributes = /** * @return {?} */ function () { return this.attributes; }; /** * @return {?} */ Mesh.prototype.maxVertices = /** * @return {?} */ function () { return this.vertices.length / this.elementsPerVertex; }; /** * @return {?} */ Mesh.prototype.numVertices = /** * @return {?} */ function () { return this.verticesLength / this.elementsPerVertex; }; /** * @param {?} length * @return {?} */ Mesh.prototype.setVerticesLength = /** * @param {?} length * @return {?} */ function (length) { this.dirtyVertices = true; this.verticesLength = length; }; /** * @return {?} */ Mesh.prototype.getVertices = /** * @return {?} */ function () { return this.vertices; }; /** * @return {?} */ Mesh.prototype.maxIndices = /** * @return {?} */ function () { return this.indices.length; }; /** * @return {?} */ Mesh.prototype.numIndices = /** * @return {?} */ function () { return this.indicesLength; }; /** * @param {?} length * @return {?} */ Mesh.prototype.setIndicesLength = /** * @param {?} length * @return {?} */ function (length) { this.dirtyIndices = true; this.indicesLength = length; }; /** * @return {?} */ Mesh.prototype.getIndices = /** * @return {?} */ function () { return this.indices; }; /** * @return {?} */ Mesh.prototype.getVertexSizeInFloats = /** * @return {?} */ function () { /** @type {?} */ var size = 0; for (var i = 0; i < this.attributes.length; i++) { /** @type {?} */ var attribute = this.attributes[i]; size += attribute.numElements; } return size; }; /** * @param {?} vertices * @return {?} */ Mesh.prototype.setVertices = /** * @param {?} vertices * @return {?} */ function (vertices) { this.dirtyVertices = true; if (vertices.length > this.vertices.length) throw Error("Mesh can't store more than " + this.maxVertices() + " vertices"); this.vertices.set(vertices, 0); this.verticesLength = vertices.length; }; /** * @param {?} indices * @return {?} */ Mesh.prototype.setIndices = /** * @param {?} indices * @return {?} */ function (indices) { this.dirtyIndices = true; if (indices.length > this.indices.length) throw Error("Mesh can't store more than " + this.maxIndices() + " indices"); this.indices.set(indices, 0); this.indicesLength = indices.length; }; /** * @param {?} shader * @param {?} primitiveType * @return {?} */ Mesh.prototype.draw = /** * @param {?} shader * @param {?} primitiveType * @return {?} */ function (shader, primitiveType) { this.drawWithOffset(shader, primitiveType, 0, this.indicesLength > 0 ? this.indicesLength : this.verticesLength / this.elementsPerVertex); }; /** * @param {?} shader * @param {?} primitiveType * @param {?} offset * @param {?} count * @return {?} */ Mesh.prototype.drawWithOffset = /** * @param {?} shader * @param {?} primitiveType * @param {?} offset * @param {?} count * @return {?} */ function (shader, primitiveType, offset, count) { /** @type {?} */ var gl = this.context.gl; if (this.dirtyVertices || this.dirtyIndices) this.update(); this.bind(shader); if (this.indicesLength > 0) { gl.drawElements(primitiveType, count, gl.UNSIGNED_SHORT, offset * 2); } else { gl.drawArrays(primitiveType, offset, count); } this.unbind(shader); }; /** * @param {?} shader * @return {?} */ Mesh.prototype.bind = /** * @param {?} shader * @return {?} */ function (shader) { /** @type {?} */ var gl = this.context.gl; gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer); /** @type {?} */ var offset = 0; for (var i = 0; i < this.attributes.length; i++) { /** @type {?} */ var attrib = this.attributes[i]; /** @type {?} */ var location_1 = shader.getAttributeLocation(attrib.name); gl.enableVertexAttribArray(location_1); gl.vertexAttribPointer(location_1, attrib.numElements, gl.FLOAT, false, this.elementsPerVertex * 4, offset * 4); offset += attrib.numElements; } if (this.indicesLength > 0) gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer); }; /** * @param {?} shader * @return {?} */ Mesh.prototype.unbind = /** * @param {?} shader * @return {?} */ function (shader) { /** @type {?} */ var gl = this.context.gl; for (var i = 0; i < this.attributes.length; i++) { /** @type {?} */ var attrib = this.attributes[i]; /** @type {?} */ var location_2 = shader.getAttributeLocation(attrib.name); gl.disableVertexAttribArray(location_2); } gl.bindBuffer(gl.ARRAY_BUFFER, null); if (this.indicesLength > 0) gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); }; /** * @private * @return {?} */ Mesh.prototype.update = /** * @private * @return {?} */ function () { /** @type {?} */ var gl = this.context.gl; if (this.dirtyVertices) { if (!this.verticesBuffer) { this.verticesBuffer = gl.createBuffer(); } gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.vertices.subarray(0, this.verticesLength), gl.DYNAMIC_DRAW); this.dirtyVertices = false; } if (this.dirtyIndices) { if (!this.indicesBuffer) { this.indicesBuffer = gl.createBuffer(); } gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices.subarray(0, this.indicesLength), gl.DYNAMIC_DRAW); this.dirtyIndices = false; } }; /** * @return {?} */ Mesh.prototype.restore = /** * @return {?} */ function () { this.verticesBuffer = null; this.indicesBuffer = null; this.update(); }; /** * @return {?} */ Mesh.prototype.dispose = /** * @return {?} */ function () { this.context.removeRestorable(this); /** @type {?} */ var gl = this.context.gl; gl.deleteBuffer(this.verticesBuffer); gl.deleteBuffer(this.indicesBuffer); }; return Mesh; }()); export { Mesh }; if (false) { /** * @type {?} * @private */ Mesh.prototype.context; /** * @type {?} * @private */ Mesh.prototype.vertices; /** * @type {?} * @private */ Mesh.prototype.verticesBuffer; /** * @type {?} * @private */ Mesh.prototype.verticesLength; /** * @type {?} * @private */ Mesh.prototype.dirtyVertices; /** * @type {?} * @private */ Mesh.prototype.indices; /** * @type {?} * @private */ Mesh.prototype.indicesBuffer; /** * @type {?} * @private */ Mesh.prototype.indicesLength; /** * @type {?} * @private */ Mesh.prototype.dirtyIndices; /** * @type {?} * @private */ Mesh.prototype.elementsPerVertex; /** * @type {?} * @private */ Mesh.prototype.attributes; } var VertexAttribute = /** @class */ (function () { function VertexAttribute(name, type, numElements) { this.name = name; this.type = type; this.numElements = numElements; } return VertexAttribute; }()); export { VertexAttribute }; if (false) { /** @type {?} */ VertexAttribute.prototype.name; /** @type {?} */ VertexAttribute.prototype.type; /** @type {?} */ VertexAttribute.prototype.numElements; } var Position2Attribute = /** @class */ (function (_super) { tslib_1.__extends(Position2Attribute, _super); function Position2Attribute() { return _super.call(this, Shader.POSITION, VertexAttributeType.Float, 2) || this; } return Position2Attribute; }(VertexAttribute)); export { Position2Attribute }; var Position3Attribute = /** @class */ (function (_super) { tslib_1.__extends(Position3Attribute, _super); function Position3Attribute() { return _super.call(this, Shader.POSITION, VertexAttributeType.Float, 3) || this; } return Position3Attribute; }(VertexAttribute)); export { Position3Attribute }; var TexCoordAttribute = /** @class */ (function (_super) { tslib_1.__extends(TexCoordAttribute, _super); function TexCoordAttribute(unit) { if (unit === void 0) { unit = 0; } return _super.call(this, Shader.TEXCOORDS + (unit == 0 ? "" : unit), VertexAttributeType.Float, 2) || this; } return TexCoordAttribute; }(VertexAttribute)); export { TexCoordAttribute }; var ColorAttribute = /** @class */ (function (_super) { tslib_1.__extends(ColorAttribute, _super); function ColorAttribute() { return _super.call(this, Shader.COLOR, VertexAttributeType.Float, 4) || this; } return ColorAttribute; }(VertexAttribute)); export { ColorAttribute }; var Color2Attribute = /** @class */ (function (_super) { tslib_1.__extends(Color2Attribute, _super); function Color2Attribute() { return _super.call(this, Shader.COLOR2, VertexAttributeType.Float, 4) || this; } return Color2Attribute; }(VertexAttribute)); export { Color2Attribute }; /** @enum {number} */ var VertexAttributeType = { Float: 0, }; export { VertexAttributeType }; VertexAttributeType[VertexAttributeType.Float] = 'Float'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzaC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy93ZWJnbC9NZXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVsQztJQWdERSxjQUNFLE9BQTZELEVBQ3JELFVBQTZCLEVBQ3JDLFdBQW1CLEVBQ25CLFVBQWtCO1FBRlYsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUE5Qy9CLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBR3RCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQTRDNUIsSUFBSSxDQUFDLE9BQU87WUFDVixPQUFPLFlBQVksNEJBQTRCO2dCQUM3QyxDQUFDLENBQUMsT0FBTztnQkFDVCxDQUFDLENBQUMsSUFBSSw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFlBQVksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztR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ckQ7ZUFDRSxrQkFBTSxNQUFNLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNILHlCQUFDO0FBQUQsQ0FBQyxBQUpELENBQXdDLGVBQWUsR0FJdEQ7O0FBQ0Q7SUFBdUMsNkNBQWU7SUFDcEQsMkJBQVksSUFBZ0I7UUFBaEIscUJBQUEsRUFBQSxRQUFnQjtlQUMxQixrQkFDRSxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDMUMsbUJBQW1CLENBQUMsS0FBSyxFQUN6QixDQUFDLENBQ0Y7SUFDSCxDQUFDO0lBQ0gsd0JBQUM7QUFBRCxDQUFDLEFBUkQsQ0FBdUMsZUFBZSxHQVFyRDs7QUFDRDtJQUFvQywwQ0FBZTtJQUNqRDtlQUNFLGtCQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0gscUJBQUM7QUFBRCxDQUFDLEFBSkQsQ0FBb0MsZUFBZSxHQUlsRDs7QUFDRDtJQUFxQywyQ0FBZTtJQUNsRDtlQUNFLGtCQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0gsc0JBQUM7QUFBRCxDQUFDLEFBSkQsQ0FBcUMsZUFBZSxHQUluRDs7OztJQUVDLFFBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuaW1wb3J0IHsgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB9IGZyb20gXCIuL1dlYkdMXCI7XHJcbmltcG9ydCB7IERpc3Bvc2FibGUsIFJlc3RvcmFibGUgfSBmcm9tIFwiLi4vY29yZS9VdGlsc1wiO1xyXG5pbXBvcnQgeyBTaGFkZXIgfSBmcm9tIFwiLi9TaGFkZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNZXNoIGltcGxlbWVudHMgRGlzcG9zYWJsZSwgUmVzdG9yYWJsZSB7XHJcbiAgcHJpdmF0ZSBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xyXG4gIHByaXZhdGUgdmVydGljZXM6IEZsb2F0MzJBcnJheTtcclxuICBwcml2YXRlIHZlcnRpY2VzQnVmZmVyOiBXZWJHTEJ1ZmZlcjtcclxuICBwcml2YXRlIHZlcnRpY2VzTGVuZ3RoID0gMDtcclxuICBwcml2YXRlIGRpcnR5VmVydGljZXMgPSBmYWxzZTtcclxuICBwcml2YXRlIGluZGljZXM6IFVpbnQxNkFycmF5O1xyXG4gIHByaXZhdGUgaW5kaWNlc0J1ZmZlcjogV2ViR0xCdWZmZXI7XHJcbiAgcHJpdmF0ZSBpbmRpY2VzTGVuZ3RoID0gMDtcclxuICBwcml2YXRlIGRpcnR5SW5kaWNlcyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgZWxlbWVudHNQZXJWZXJ0ZXggPSAwO1xyXG4gIGdldEF0dHJpYnV0ZXMoKTogVmVydGV4QXR0cmlidXRlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlcztcclxuICB9XHJcbiAgbWF4VmVydGljZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnZlcnRpY2VzLmxlbmd0aCAvIHRoaXMuZWxlbWVudHNQZXJWZXJ0ZXg7XHJcbiAgfVxyXG4gIG51bVZlcnRpY2VzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy52ZXJ0aWNlc0xlbmd0aCAvIHRoaXMuZWxlbWVudHNQZXJWZXJ0ZXg7XHJcbiAgfVxyXG4gIHNldFZlcnRpY2VzTGVuZ3RoKGxlbmd0aDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRpcnR5VmVydGljZXMgPSB0cnVlO1xyXG4gICAgdGhpcy52ZXJ0aWNlc0xlbmd0aCA9IGxlbmd0aDtcclxuICB9XHJcbiAgZ2V0VmVydGljZXMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLnZlcnRpY2VzO1xyXG4gIH1cclxuICBtYXhJbmRpY2VzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmRpY2VzLmxlbmd0aDtcclxuICB9XHJcbiAgbnVtSW5kaWNlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5kaWNlc0xlbmd0aDtcclxuICB9XHJcbiAgc2V0SW5kaWNlc0xlbmd0aChsZW5ndGg6IG51bWJlcikge1xyXG4gICAgdGhpcy5kaXJ0eUluZGljZXMgPSB0cnVlO1xyXG4gICAgdGhpcy5pbmRpY2VzTGVuZ3RoID0gbGVuZ3RoO1xyXG4gIH1cclxuICBnZXRJbmRpY2VzKCk6IFVpbnQxNkFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmluZGljZXM7XHJcbiAgfVxyXG4gIGdldFZlcnRleFNpemVJbkZsb2F0cygpOiBudW1iZXIge1xyXG4gICAgbGV0IHNpemUgPSAwO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlc1tpXTtcclxuICAgICAgc2l6ZSArPSBhdHRyaWJ1dGUubnVtRWxlbWVudHM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2l6ZTtcclxuICB9XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0IHwgV2ViR0xSZW5kZXJpbmdDb250ZXh0LFxyXG4gICAgcHJpdmF0ZSBhdHRyaWJ1dGVzOiBWZXJ0ZXhBdHRyaWJ1dGVbXSxcclxuICAgIG1heFZlcnRpY2VzOiBudW1iZXIsXHJcbiAgICBtYXhJbmRpY2VzOiBudW1iZXJcclxuICApIHtcclxuICAgIHRoaXMuY29udGV4dCA9XHJcbiAgICAgIGNvbnRleHQgaW5zdGFuY2VvZiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0XHJcbiAgICAgICAgPyBjb250ZXh0XHJcbiAgICAgICAgOiBuZXcgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dChjb250ZXh0KTtcclxuICAgIHRoaXMuZWxlbWVudHNQZXJWZXJ0ZXggPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudHNQZXJWZXJ0ZXggKz0gYXR0cmlidXRlc1tpXS5udW1FbGVtZW50cztcclxuICAgIH1cclxuICAgIHRoaXMudmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KG1heFZlcnRpY2VzICogdGhpcy5lbGVtZW50c1BlclZlcnRleCk7XHJcbiAgICB0aGlzLmluZGljZXMgPSBuZXcgVWludDE2QXJyYXkobWF4SW5kaWNlcyk7XHJcbiAgICB0aGlzLmNvbnRleHQuYWRkUmVzdG9yYWJsZSh0aGlzKTtcclxuICB9XHJcbiAgc2V0VmVydGljZXModmVydGljZXM6IEFycmF5PG51bWJlcj4pIHtcclxuICAgIHRoaXMuZGlydHlWZXJ0aWNlcyA9IHRydWU7XHJcbiAgICBpZiAodmVydGljZXMubGVuZ3RoID4gdGhpcy52ZXJ0aWNlcy5sZW5ndGgpXHJcbiAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgIFwiTWVzaCBjYW4ndCBzdG9yZSBtb3JlIHRoYW4gXCIgKyB0aGlzLm1heFZlcnRpY2VzKCkgKyBcIiB2ZXJ0aWNlc1wiXHJcbiAgICAgICk7XHJcbiAgICB0aGlzLnZlcnRpY2VzLnNldCh2ZXJ0aWNlcywgMCk7XHJcbiAgICB0aGlzLnZlcnRpY2VzTGVuZ3RoID0gdmVydGljZXMubGVuZ3RoO1xyXG4gIH1cclxuICBzZXRJbmRpY2VzKGluZGljZXM6IEFycmF5PG51bWJlcj4pIHtcclxuICAgIHRoaXMuZGlydHlJbmRpY2VzID0gdHJ1ZTtcclxuICAgIGlmIChpbmRpY2VzLmxlbmd0aCA+IHRoaXMuaW5kaWNlcy5sZW5ndGgpXHJcbiAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgIFwiTWVzaCBjYW4ndCBzdG9yZSBtb3JlIHRoYW4gXCIgKyB0aGlzLm1heEluZGljZXMoKSArIFwiIGluZGljZXNcIlxyXG4gICAgICApO1xyXG4gICAgdGhpcy5pbmRpY2VzLnNldChpbmRpY2VzLCAwKTtcclxuICAgIHRoaXMuaW5kaWNlc0xlbmd0aCA9IGluZGljZXMubGVuZ3RoO1xyXG4gIH1cclxuICBkcmF3KHNoYWRlcjogU2hhZGVyLCBwcmltaXRpdmVUeXBlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZHJhd1dpdGhPZmZzZXQoXHJcbiAgICAgIHNoYWRlcixcclxuICAgICAgcHJpbWl0aXZlVHlwZSxcclxuICAgICAgMCxcclxuICAgICAgdGhpcy5pbmRpY2VzTGVuZ3RoID4gMFxyXG4gICAgICAgID8gdGhpcy5pbmRpY2VzTGVuZ3RoXHJcbiAgICAgICAgOiB0aGlzLnZlcnRpY2VzTGVuZ3RoIC8gdGhpcy5lbGVtZW50c1BlclZlcnRleFxyXG4gICAgKTtcclxuICB9XHJcbiAgZHJhd1dpdGhPZmZzZXQoXHJcbiAgICBzaGFkZXI6IFNoYWRlcixcclxuICAgIHByaW1pdGl2ZVR5cGU6IG51bWJlcixcclxuICAgIG9mZnNldDogbnVtYmVyLFxyXG4gICAgY291bnQ6IG51bWJlclxyXG4gICkge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgaWYgKHRoaXMuZGlydHlWZXJ0aWNlcyB8fCB0aGlzLmRpcnR5SW5kaWNlcykgdGhpcy51cGRhdGUoKTtcclxuICAgIHRoaXMuYmluZChzaGFkZXIpO1xyXG4gICAgaWYgKHRoaXMuaW5kaWNlc0xlbmd0aCA+IDApIHtcclxuICAgICAgZ2wuZHJhd0VsZW1lbnRzKHByaW1pdGl2ZVR5cGUsIGNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgb2Zmc2V0ICogMik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBnbC5kcmF3QXJyYXlzKHByaW1pdGl2ZVR5cGUsIG9mZnNldCwgY291bnQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51bmJpbmQoc2hhZGVyKTtcclxuICB9XHJcbiAgYmluZChzaGFkZXI6IFNoYWRlcikge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMudmVydGljZXNCdWZmZXIpO1xyXG4gICAgbGV0IG9mZnNldCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYXR0cmliID0gdGhpcy5hdHRyaWJ1dGVzW2ldO1xyXG4gICAgICBsZXQgbG9jYXRpb24gPSBzaGFkZXIuZ2V0QXR0cmlidXRlTG9jYXRpb24oYXR0cmliLm5hbWUpO1xyXG4gICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XHJcbiAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXHJcbiAgICAgICAgbG9jYXRpb24sXHJcbiAgICAgICAgYXR0cmliLm51bUVsZW1lbnRzLFxyXG4gICAgICAgIGdsLkZMT0FULFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIHRoaXMuZWxlbWVudHNQZXJWZXJ0ZXggKiA0LFxyXG4gICAgICAgIG9mZnNldCAqIDRcclxuICAgICAgKTtcclxuICAgICAgb2Zmc2V0ICs9IGF0dHJpYi5udW1FbGVtZW50cztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmluZGljZXNMZW5ndGggPiAwKVxyXG4gICAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmluZGljZXNCdWZmZXIpO1xyXG4gIH1cclxuICB1bmJpbmQoc2hhZGVyOiBTaGFkZXIpIHtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBhdHRyaWIgPSB0aGlzLmF0dHJpYnV0ZXNbaV07XHJcbiAgICAgIGxldCBsb2NhdGlvbiA9IHNoYWRlci5nZXRBdHRyaWJ1dGVMb2NhdGlvbihhdHRyaWIubmFtZSk7XHJcbiAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XHJcbiAgICB9XHJcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7XHJcbiAgICBpZiAodGhpcy5pbmRpY2VzTGVuZ3RoID4gMCkgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbnVsbCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgdXBkYXRlKCkge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgaWYgKHRoaXMuZGlydHlWZXJ0aWNlcykge1xyXG4gICAgICBpZiAoIXRoaXMudmVydGljZXNCdWZmZXIpIHtcclxuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XHJcbiAgICAgIH1cclxuICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMudmVydGljZXNCdWZmZXIpO1xyXG4gICAgICBnbC5idWZmZXJEYXRhKFxyXG4gICAgICAgIGdsLkFSUkFZX0JVRkZFUixcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLnN1YmFycmF5KDAsIHRoaXMudmVydGljZXNMZW5ndGgpLFxyXG4gICAgICAgIGdsLkRZTkFNSUNfRFJBV1xyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmRpcnR5VmVydGljZXMgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRpcnR5SW5kaWNlcykge1xyXG4gICAgICBpZiAoIXRoaXMuaW5kaWNlc0J1ZmZlcikge1xyXG4gICAgICAgIHRoaXMuaW5kaWNlc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuaW5kaWNlc0J1ZmZlcik7XHJcbiAgICAgIGdsLmJ1ZmZlckRhdGEoXHJcbiAgICAgICAgZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsXHJcbiAgICAgICAgdGhpcy5pbmRpY2VzLnN1YmFycmF5KDAsIHRoaXMuaW5kaWNlc0xlbmd0aCksXHJcbiAgICAgICAgZ2wuRFlOQU1JQ19EUkFXXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZGlydHlJbmRpY2VzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlc3RvcmUoKSB7XHJcbiAgICB0aGlzLnZlcnRpY2VzQnVmZmVyID0gbnVsbDtcclxuICAgIHRoaXMuaW5kaWNlc0J1ZmZlciA9IG51bGw7XHJcbiAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gIH1cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5jb250ZXh0LnJlbW92ZVJlc3RvcmFibGUodGhpcyk7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBnbC5kZWxldGVCdWZmZXIodGhpcy52ZXJ0aWNlc0J1ZmZlcik7XHJcbiAgICBnbC5kZWxldGVCdWZmZXIodGhpcy5pbmRpY2VzQnVmZmVyKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFZlcnRleEF0dHJpYnV0ZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxyXG4gICAgcHVibGljIHR5cGU6IFZlcnRleEF0dHJpYnV0ZVR5cGUsXHJcbiAgICBwdWJsaWMgbnVtRWxlbWVudHM6IG51bWJlclxyXG4gICkge31cclxufVxyXG5leHBvcnQgY2xhc3MgUG9zaXRpb24yQXR0cmlidXRlIGV4dGVuZHMgVmVydGV4QXR0cmlidXRlIHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKFNoYWRlci5QT1NJVElPTiwgVmVydGV4QXR0cmlidXRlVHlwZS5GbG9hdCwgMik7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBQb3NpdGlvbjNBdHRyaWJ1dGUgZXh0ZW5kcyBWZXJ0ZXhBdHRyaWJ1dGUge1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoU2hhZGVyLlBPU0lUSU9OLCBWZXJ0ZXhBdHRyaWJ1dGVUeXBlLkZsb2F0LCAzKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFRleENvb3JkQXR0cmlidXRlIGV4dGVuZHMgVmVydGV4QXR0cmlidXRlIHtcclxuICBjb25zdHJ1Y3Rvcih1bml0OiBudW1iZXIgPSAwKSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgU2hhZGVyLlRFWENPT1JEUyArICh1bml0ID09IDAgPyBcIlwiIDogdW5pdCksXHJcbiAgICAgIFZlcnRleEF0dHJpYnV0ZVR5cGUuRmxvYXQsXHJcbiAgICAgIDJcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBDb2xvckF0dHJpYnV0ZSBleHRlbmRzIFZlcnRleEF0dHJpYnV0ZSB7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcihTaGFkZXIuQ09MT1IsIFZlcnRleEF0dHJpYnV0ZVR5cGUuRmxvYXQsIDQpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgQ29sb3IyQXR0cmlidXRlIGV4dGVuZHMgVmVydGV4QXR0cmlidXRlIHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKFNoYWRlci5DT0xPUjIsIFZlcnRleEF0dHJpYnV0ZVR5cGUuRmxvYXQsIDQpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgZW51bSBWZXJ0ZXhBdHRyaWJ1dGVUeXBlIHtcclxuICBGbG9hdFxyXG59XHJcbiJdfQ==