UNPKG

@esotericsoftware/spine-core

Version:
215 lines 30.4 kB
/****************************************************************************** * Spine Runtimes License Agreement * Last updated April 5, 2025. Replaces all prior versions. * * Copyright (c) 2013-2025, 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. * * THE SPINE RUNTIMES ARE 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 * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { Color, MathUtils, Utils } from "../Utils.js"; import { Attachment } from "./Attachment.js"; /** An attachment that displays a textured quadrilateral. * * See [Region attachments](http://esotericsoftware.com/spine-regions) in the Spine User Guide. */ export class RegionAttachment extends Attachment { /** The local x translation. */ x = 0; /** The local y translation. */ y = 0; /** The local scaleX. */ scaleX = 1; /** The local scaleY. */ scaleY = 1; /** The local rotation. */ rotation = 0; /** The width of the region attachment in Spine. */ width = 0; /** The height of the region attachment in Spine. */ height = 0; /** The color to tint the region attachment. */ color = new Color(1, 1, 1, 1); /** The name of the texture region for this attachment. */ path; region = null; sequence = null; /** For each of the 4 vertices, a pair of <code>x,y</code> values that is the local position of the vertex. * * See {@link #updateOffset()}. */ offset = Utils.newFloatArray(8); uvs = Utils.newFloatArray(8); tempColor = new Color(1, 1, 1, 1); constructor(name, path) { super(name); this.path = path; } /** Calculates the {@link #offset} using the region settings. Must be called after changing region settings. */ updateRegion() { if (!this.region) throw new Error("Region not set."); let region = this.region; let uvs = this.uvs; if (region == null) { uvs[0] = 0; uvs[1] = 0; uvs[2] = 0; uvs[3] = 1; uvs[4] = 1; uvs[5] = 1; uvs[6] = 1; uvs[7] = 0; return; } let regionScaleX = this.width / this.region.originalWidth * this.scaleX; let regionScaleY = this.height / this.region.originalHeight * this.scaleY; let localX = -this.width / 2 * this.scaleX + this.region.offsetX * regionScaleX; let localY = -this.height / 2 * this.scaleY + this.region.offsetY * regionScaleY; let localX2 = localX + this.region.width * regionScaleX; let localY2 = localY + this.region.height * regionScaleY; let radians = this.rotation * MathUtils.degRad; let cos = Math.cos(radians); let sin = Math.sin(radians); let x = this.x, y = this.y; let localXCos = localX * cos + x; let localXSin = localX * sin; let localYCos = localY * cos + y; let localYSin = localY * sin; let localX2Cos = localX2 * cos + x; let localX2Sin = localX2 * sin; let localY2Cos = localY2 * cos + y; let localY2Sin = localY2 * sin; let offset = this.offset; offset[0] = localXCos - localYSin; offset[1] = localYCos + localXSin; offset[2] = localXCos - localY2Sin; offset[3] = localY2Cos + localXSin; offset[4] = localX2Cos - localY2Sin; offset[5] = localY2Cos + localX2Sin; offset[6] = localX2Cos - localYSin; offset[7] = localYCos + localX2Sin; if (region.degrees == 90) { uvs[0] = region.u2; uvs[1] = region.v2; uvs[2] = region.u; uvs[3] = region.v2; uvs[4] = region.u; uvs[5] = region.v; uvs[6] = region.u2; uvs[7] = region.v; } else { uvs[0] = region.u; uvs[1] = region.v2; uvs[2] = region.u; uvs[3] = region.v; uvs[4] = region.u2; uvs[5] = region.v; uvs[6] = region.u2; uvs[7] = region.v2; } } /** Transforms the attachment's four vertices to world coordinates. If the attachment has a {@link #sequence}, the region may * be changed. * <p> * See <a href="http://esotericsoftware.com/spine-runtime-skeletons#World-transforms">World transforms</a> in the Spine * Runtimes Guide. * @param worldVertices The output world vertices. Must have a length >= <code>offset</code> + 8. * @param offset The <code>worldVertices</code> index to begin writing values. * @param stride The number of <code>worldVertices</code> entries between the value pairs written. */ computeWorldVertices(slot, worldVertices, offset, stride) { if (this.sequence != null) this.sequence.apply(slot, this); let bone = slot.bone; let vertexOffset = this.offset; let x = bone.worldX, y = bone.worldY; let a = bone.a, b = bone.b, c = bone.c, d = bone.d; let offsetX = 0, offsetY = 0; offsetX = vertexOffset[0]; offsetY = vertexOffset[1]; worldVertices[offset] = offsetX * a + offsetY * b + x; // br worldVertices[offset + 1] = offsetX * c + offsetY * d + y; offset += stride; offsetX = vertexOffset[2]; offsetY = vertexOffset[3]; worldVertices[offset] = offsetX * a + offsetY * b + x; // bl worldVertices[offset + 1] = offsetX * c + offsetY * d + y; offset += stride; offsetX = vertexOffset[4]; offsetY = vertexOffset[5]; worldVertices[offset] = offsetX * a + offsetY * b + x; // ul worldVertices[offset + 1] = offsetX * c + offsetY * d + y; offset += stride; offsetX = vertexOffset[6]; offsetY = vertexOffset[7]; worldVertices[offset] = offsetX * a + offsetY * b + x; // ur worldVertices[offset + 1] = offsetX * c + offsetY * d + y; } copy() { let copy = new RegionAttachment(this.name, this.path); copy.region = this.region; copy.x = this.x; copy.y = this.y; copy.scaleX = this.scaleX; copy.scaleY = this.scaleY; copy.rotation = this.rotation; copy.width = this.width; copy.height = this.height; Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8); Utils.arrayCopy(this.offset, 0, copy.offset, 0, 8); copy.color.setFromColor(this.color); copy.sequence = this.sequence != null ? this.sequence.copy() : null; return copy; } static X1 = 0; static Y1 = 1; static C1R = 2; static C1G = 3; static C1B = 4; static C1A = 5; static U1 = 6; static V1 = 7; static X2 = 8; static Y2 = 9; static C2R = 10; static C2G = 11; static C2B = 12; static C2A = 13; static U2 = 14; static V2 = 15; static X3 = 16; static Y3 = 17; static C3R = 18; static C3G = 19; static C3B = 20; static C3A = 21; static U3 = 22; static V3 = 23; static X4 = 24; static Y4 = 25; static C4R = 26; static C4G = 27; static C4B = 28; static C4A = 29; static U4 = 30; static V4 = 31; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVnaW9uQXR0YWNobWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdHRhY2htZW50cy9SZWdpb25BdHRhY2htZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUkvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBbUIsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUs3Qzs7a0dBRWtHO0FBQ2xHLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxVQUFVO0lBQy9DLCtCQUErQjtJQUMvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRU4sK0JBQStCO0lBQy9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFTix3QkFBd0I7SUFDeEIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVYLHdCQUF3QjtJQUN4QixNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRVgsMEJBQTBCO0lBQzFCLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFYixtREFBbUQ7SUFDbkQsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVWLG9EQUFvRDtJQUNwRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRVgsK0NBQStDO0lBQy9DLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU5QiwwREFBMEQ7SUFDMUQsSUFBSSxDQUFTO0lBRWIsTUFBTSxHQUF5QixJQUFJLENBQUM7SUFDcEMsUUFBUSxHQUFvQixJQUFJLENBQUM7SUFFakM7O3NDQUVrQztJQUNsQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoQyxHQUFHLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3QixTQUFTLEdBQUcsSUFB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VUFBVSxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksVUFBVSxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDL0IsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLFVBQVUsQ0FBQztRQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLFVBQVUsQ0FBQztRQUVuQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7WUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsR0FBRyxDQUFDLENB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LEVBQUUsR0FBRyxFQUFFLENBQUM7SUFFZixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDZixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUVmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDZixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBCb25lIH0gZnJvbSBcIi4uL0JvbmUuanNcIjtcbmltcG9ydCB7IFRleHR1cmVSZWdpb24gfSBmcm9tIFwiLi4vVGV4dHVyZS5qc1wiO1xuaW1wb3J0IHsgQ29sb3IsIE1hdGhVdGlscywgTnVtYmVyQXJyYXlMaWtlLCBVdGlscyB9IGZyb20gXCIuLi9VdGlscy5qc1wiO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gXCIuL0F0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB7IEhhc1RleHR1cmVSZWdpb24gfSBmcm9tIFwiLi9IYXNUZXh0dXJlUmVnaW9uLmpzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuL1NlcXVlbmNlLmpzXCI7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIi4uL1Nsb3QuanNcIjtcblxuLyoqIEFuIGF0dGFjaG1lbnQgdGhhdCBkaXNwbGF5cyBhIHRleHR1cmVkIHF1YWRyaWxhdGVyYWwuXG4gKlxuICogU2VlIFtSZWdpb24gYXR0YWNobWVudHNdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1yZWdpb25zKSBpbiB0aGUgU3BpbmUgVXNlciBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpb25BdHRhY2htZW50IGV4dGVuZHMgQXR0YWNobWVudCBpbXBsZW1lbnRzIEhhc1RleHR1cmVSZWdpb24ge1xuXHQvKiogVGhlIGxvY2FsIHggdHJhbnNsYXRpb24uICovXG5cdHggPSAwO1xuXG5cdC8qKiBUaGUgbG9jYWwgeSB0cmFuc2xhdGlvbi4gKi9cblx0eSA9IDA7XG5cblx0LyoqIFRoZSBsb2NhbCBzY2FsZVguICovXG5cdHNjYWxlWCA9IDE7XG5cblx0LyoqIFRoZSBsb2NhbCBzY2FsZVkuICovXG5cdHNjYWxlWSA9IDE7XG5cblx0LyoqIFRoZSBsb2NhbCByb3RhdGlvbi4gKi9cblx0cm90YXRpb24gPSAwO1xuXG5cdC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiBhdHRhY2htZW50IGluIFNwaW5lLiAqL1xuXHR3aWR0aCA9IDA7XG5cblx0LyoqIFRoZSBoZWlnaHQgb2YgdGhlIHJlZ2lvbiBhdHRhY2htZW50IGluIFNwaW5lLiAqL1xuXHRoZWlnaHQgPSAwO1xuXG5cdC8qKiBUaGUgY29sb3IgdG8gdGludCB0aGUgcmVnaW9uIGF0dGFjaG1lbnQuICovXG5cdGNvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xuXG5cdC8qKiBUaGUgbmFtZSBvZiB0aGUgdGV4dHVyZSByZWdpb24gZm9yIHRoaXMgYXR0YWNobWVudC4gKi9cblx0cGF0aDogc3RyaW5nO1xuXG5cdHJlZ2lvbjogVGV4dHVyZVJlZ2lvbiB8IG51bGwgPSBudWxsO1xuXHRzZXF1ZW5jZTogU2VxdWVuY2UgfCBudWxsID0gbnVsbDtcblxuXHQvKiogRm9yIGVhY2ggb2YgdGhlIDQgdmVydGljZXMsIGEgcGFpciBvZiA8Y29kZT54LHk8L2NvZGU+IHZhbHVlcyB0aGF0IGlzIHRoZSBsb2NhbCBwb3NpdGlvbiBvZiB0aGUgdmVydGV4LlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rICN1cGRhdGVPZmZzZXQoKX0uICovXG5cdG9mZnNldCA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkoOCk7XG5cblx0dXZzID0gVXRpbHMubmV3RmxvYXRBcnJheSg4KTtcblxuXHR0ZW1wQ29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSk7XG5cblx0Y29uc3RydWN0b3IgKG5hbWU6IHN0cmluZywgcGF0aDogc3RyaW5nKSB7XG5cdFx0c3VwZXIobmFtZSk7XG5cdFx0dGhpcy5wYXRoID0gcGF0aDtcblx0fVxuXG5cdC8qKiBDYWxjdWxhdGVzIHRoZSB7QGxpbmsgI29mZnNldH0gdXNpbmcgdGhlIHJlZ2lvbiBzZXR0aW5ncy4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hhbmdpbmcgcmVnaW9uIHNldHRpbmdzLiAqL1xuXHR1cGRhdGVSZWdpb24gKCk6IHZvaWQge1xuXHRcdGlmICghdGhpcy5yZWdpb24pIHRocm93IG5ldyBFcnJvcihcIlJlZ2lvbiBub3Qgc2V0LlwiKTtcblx0XHRsZXQgcmVnaW9uID0gdGhpcy5yZWdpb247XG5cdFx0bGV0IHV2cyA9IHRoaXMudXZzO1xuXG5cdFx0aWYgKHJlZ2lvbiA9PSBudWxsKSB7XG5cdFx0XHR1dnNbMF0gPSAwO1xuXHRcdFx0dXZzWzFdID0gMDtcblx0XHRcdHV2c1syXSA9IDA7XG5cdFx0XHR1dnNbM10gPSAxO1xuXHRcdFx0dXZzWzRdID0gMTtcblx0XHRcdHV2c1s1XSA9IDE7XG5cdFx0XHR1dnNbNl0gPSAxO1xuXHRcdFx0dXZzWzddID0gMDtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgcmVnaW9uU2NhbGVYID0gdGhpcy53aWR0aCAvIHRoaXMucmVnaW9uLm9yaWdpbmFsV2lkdGggKiB0aGlzLnNjYWxlWDtcblx0XHRsZXQgcmVnaW9uU2NhbGVZID0gdGhpcy5oZWlnaHQgLyB0aGlzLnJlZ2lvbi5vcmlnaW5hbEhlaWdodCAqIHRoaXMuc2NhbGVZO1xuXHRcdGxldCBsb2NhbFggPSAtdGhpcy53aWR0aCAvIDIgKiB0aGlzLnNjYWxlWCArIHRoaXMucmVnaW9uLm9mZnNldFggKiByZWdpb25TY2FsZVg7XG5cdFx0bGV0IGxvY2FsWSA9IC10aGlzLmhlaWdodCAvIDIgKiB0aGlzLnNjYWxlWSArIHRoaXMucmVnaW9uLm9mZnNldFkgKiByZWdpb25TY2FsZVk7XG5cdFx0bGV0IGxvY2FsWDIgPSBsb2NhbFggKyB0aGlzLnJlZ2lvbi53aWR0aCAqIHJlZ2lvblNjYWxlWDtcblx0XHRsZXQgbG9jYWxZMiA9IGxvY2FsWSArIHRoaXMucmVnaW9uLmhlaWdodCAqIHJlZ2lvblNjYWxlWTtcblx0XHRsZXQgcmFkaWFucyA9IHRoaXMucm90YXRpb24gKiBNYXRoVXRpbHMuZGVnUmFkO1xuXHRcdGxldCBjb3MgPSBNYXRoLmNvcyhyYWRpYW5zKTtcblx0XHRsZXQgc2luID0gTWF0aC5zaW4ocmFkaWFucyk7XG5cdFx0bGV0IHggPSB0aGlzLngsIHkgPSB0aGlzLnk7XG5cdFx0bGV0IGxvY2FsWENvcyA9IGxvY2FsWCAqIGNvcyArIHg7XG5cdFx0bGV0IGxvY2FsWFNpbiA9IGxvY2FsWCAqIHNpbjtcblx0XHRsZXQgbG9jYWxZQ29zID0gbG9jYWxZICogY29zICsgeTtcblx0XHRsZXQgbG9jYWxZU2luID0gbG9jYWxZICogc2luO1xuXHRcdGxldCBsb2NhbFgyQ29zID0gbG9jYWxYMiAqIGNvcyArIHg7XG5cdFx0bGV0IGxvY2FsWDJTaW4gPSBsb2NhbFgyICogc2luO1xuXHRcdGxldCBsb2NhbFkyQ29zID0gbG9jYWxZMiAqIGNvcyArIHk7XG5cdFx0bGV0IGxvY2FsWTJTaW4gPSBsb2NhbFkyICogc2luO1xuXHRcdGxldCBvZmZzZXQgPSB0aGlzLm9mZnNldDtcblx0XHRvZmZzZXRbMF0gPSBsb2NhbFhDb3MgLSBsb2NhbFlTaW47XG5cdFx0b2Zmc2V0WzFdID0gbG9jYWxZQ29zICsgbG9jYWxYU2luO1xuXHRcdG9mZnNldFsyXSA9IGxvY2FsWENvcyAtIGxvY2FsWTJTaW47XG5cdFx0b2Zmc2V0WzNdID0gbG9jYWxZMkNvcyArIGxvY2FsWFNpbjtcblx0XHRvZmZzZXRbNF0gPSBsb2NhbFgyQ29zIC0gbG9jYWxZMlNpbjtcblx0XHRvZmZzZXRbNV0gPSBsb2NhbFkyQ29zICsgbG9jYWxYMlNpbjtcblx0XHRvZmZzZXRbNl0gPSBsb2NhbFgyQ29zIC0gbG9jYWxZU2luO1xuXHRcdG9mZnNldFs3XSA9IGxvY2FsWUNvcyArIGxvY2FsWDJTaW47XG5cblx0XHRpZiAocmVnaW9uLmRlZ3JlZXMgPT0gOTApIHtcblx0XHRcdHV2c1swXSA9IHJlZ2lvbi51Mjtcblx0XHRcdHV2c1sxXSA9IHJlZ2lvbi52Mjtcblx0XHRcdHV2c1syXSA9IHJlZ2lvbi51O1xuXHRcdFx0dXZzWzNdID0gcmVnaW9uLnYyO1xuXHRcdFx0dXZzWzRdID0gcmVnaW9uLnU7XG5cdFx0XHR1dnNbNV0gPSByZWdpb24udjtcblx0XHRcdHV2c1s2XSA9IHJlZ2lvbi51Mjtcblx0XHRcdHV2c1s3XSA9IHJlZ2lvbi52O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR1dnNbMF0gPSByZWdpb24udTtcblx0XHRcdHV2c1sxXSA9IHJlZ2lvbi52Mjtcblx0XHRcdHV2c1syXSA9IHJlZ2lvbi51O1xuXHRcdFx0dXZzWzNdID0gcmVnaW9uLnY7XG5cdFx0XHR1dnNbNF0gPSByZWdpb24udTI7XG5cdFx0XHR1dnNbNV0gPSByZWdpb24udjtcblx0XHRcdHV2c1s2XSA9IHJlZ2lvbi51Mjtcblx0XHRcdHV2c1s3XSA9IHJlZ2lvbi52Mjtcblx0XHR9XG5cdH1cblxuXHQvKiogVHJhbnNmb3JtcyB0aGUgYXR0YWNobWVudCdzIGZvdXIgdmVydGljZXMgdG8gd29ybGQgY29vcmRpbmF0ZXMuIElmIHRoZSBhdHRhY2htZW50IGhhcyBhIHtAbGluayAjc2VxdWVuY2V9LCB0aGUgcmVnaW9uIG1heVxuXHQgKiBiZSBjaGFuZ2VkLlxuXHQgKiA8cD5cblx0ICogU2VlIDxhIGhyZWY9XCJodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtcnVudGltZS1za2VsZXRvbnMjV29ybGQtdHJhbnNmb3Jtc1wiPldvcmxkIHRyYW5zZm9ybXM8L2E+IGluIHRoZSBTcGluZVxuXHQgKiBSdW50aW1lcyBHdWlkZS5cblx0ICogQHBhcmFtIHdvcmxkVmVydGljZXMgVGhlIG91dHB1dCB3b3JsZCB2ZXJ0aWNlcy4gTXVzdCBoYXZlIGEgbGVuZ3RoID49IDxjb2RlPm9mZnNldDwvY29kZT4gKyA4LlxuXHQgKiBAcGFyYW0gb2Zmc2V0IFRoZSA8Y29kZT53b3JsZFZlcnRpY2VzPC9jb2RlPiBpbmRleCB0byBiZWdpbiB3cml0aW5nIHZhbHVlcy5cblx0ICogQHBhcmFtIHN0cmlkZSBUaGUgbnVtYmVyIG9mIDxjb2RlPndvcmxkVmVydGljZXM8L2NvZGU+IGVudHJpZXMgYmV0d2VlbiB0aGUgdmFsdWUgcGFpcnMgd3JpdHRlbi4gKi9cblx0Y29tcHV0ZVdvcmxkVmVydGljZXMgKHNsb3Q6IFNsb3QsIHdvcmxkVmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgb2Zmc2V0OiBudW1iZXIsIHN0cmlkZTogbnVtYmVyKSB7XG5cdFx0aWYgKHRoaXMuc2VxdWVuY2UgIT0gbnVsbClcblx0XHRcdHRoaXMuc2VxdWVuY2UuYXBwbHkoc2xvdCwgdGhpcyk7XG5cblx0XHRsZXQgYm9uZSA9IHNsb3QuYm9uZTtcblx0XHRsZXQgdmVydGV4T2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG5cdFx0bGV0IHggPSBib25lLndvcmxkWCwgeSA9IGJvbmUud29ybGRZO1xuXHRcdGxldCBhID0gYm9uZS5hLCBiID0gYm9uZS5iLCBjID0gYm9uZS5jLCBkID0gYm9uZS5kO1xuXHRcdGxldCBvZmZzZXRYID0gMCwgb2Zmc2V0WSA9IDA7XG5cblx0XHRvZmZzZXRYID0gdmVydGV4T2Zmc2V0WzBdO1xuXHRcdG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRbMV07XG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIGJyXG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xuXHRcdG9mZnNldCArPSBzdHJpZGU7XG5cblx0XHRvZmZzZXRYID0gdmVydGV4T2Zmc2V0WzJdO1xuXHRcdG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRbM107XG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIGJsXG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xuXHRcdG9mZnNldCArPSBzdHJpZGU7XG5cblx0XHRvZmZzZXRYID0gdmVydGV4T2Zmc2V0WzRdO1xuXHRcdG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRbNV07XG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIHVsXG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xuXHRcdG9mZnNldCArPSBzdHJpZGU7XG5cblx0XHRvZmZzZXRYID0gdmVydGV4T2Zmc2V0WzZdO1xuXHRcdG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRbN107XG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIHVyXG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xuXHR9XG5cblx0Y29weSAoKTogQXR0YWNobWVudCB7XG5cdFx0bGV0IGNvcHkgPSBuZXcgUmVnaW9uQXR0YWNobWVudCh0aGlzLm5hbWUsIHRoaXMucGF0aCk7XG5cdFx0Y29weS5yZWdpb24gPSB0aGlzLnJlZ2lvbjtcblx0XHRjb3B5LnggPSB0aGlzLng7XG5cdFx0Y29weS55ID0gdGhpcy55O1xuXHRcdGNvcHkuc2NhbGVYID0gdGhpcy5zY2FsZVg7XG5cdFx0Y29weS5zY2FsZVkgPSB0aGlzLnNjYWxlWTtcblx0XHRjb3B5LnJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjtcblx0XHRjb3B5LndpZHRoID0gdGhpcy53aWR0aDtcblx0XHRjb3B5LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXHRcdFV0aWxzLmFycmF5Q29weSh0aGlzLnV2cywgMCwgY29weS51dnMsIDAsIDgpO1xuXHRcdFV0aWxzLmFycmF5Q29weSh0aGlzLm9mZnNldCwgMCwgY29weS5vZmZzZXQsIDAsIDgpO1xuXHRcdGNvcHkuY29sb3Iuc2V0RnJvbUNvbG9yKHRoaXMuY29sb3IpO1xuXHRcdGNvcHkuc2VxdWVuY2UgPSB0aGlzLnNlcXVlbmNlICE9IG51bGwgPyB0aGlzLnNlcXVlbmNlLmNvcHkoKSA6IG51bGw7XG5cdFx0cmV0dXJuIGNvcHk7XG5cdH1cblxuXHRzdGF0aWMgWDEgPSAwO1xuXHRzdGF0aWMgWTEgPSAxO1xuXHRzdGF0aWMgQzFSID0gMjtcblx0c3RhdGljIEMxRyA9IDM7XG5cdHN0YXRpYyBDMUIgPSA0O1xuXHRzdGF0aWMgQzFBID0gNTtcblx0c3RhdGljIFUxID0gNjtcblx0c3RhdGljIFYxID0gNztcblxuXHRzdGF0aWMgWDIgPSA4O1xuXHRzdGF0aWMgWTIgPSA5O1xuXHRzdGF0aWMgQzJSID0gMTA7XG5cdHN0YXRpYyBDMkcgPSAxMTtcblx0c3RhdGljIEMyQiA9IDEyO1xuXHRzdGF0aWMgQzJBID0gMTM7XG5cdHN0YXRpYyBVMiA9IDE0O1xuXHRzdGF0aWMgVjIgPSAxNTtcblxuXHRzdGF0aWMgWDMgPSAxNjtcblx0c3RhdGljIFkzID0gMTc7XG5cdHN0YXRpYyBDM1IgPSAxODtcblx0c3RhdGljIEMzRyA9IDE5O1xuXHRzdGF0aWMgQzNCID0gMjA7XG5cdHN0YXRpYyBDM0EgPSAyMTtcblx0c3RhdGljIFUzID0gMjI7XG5cdHN0YXRpYyBWMyA9IDIzO1xuXG5cdHN0YXRpYyBYNCA9IDI0O1xuXHRzdGF0aWMgWTQgPSAyNTtcblx0c3RhdGljIEM0UiA9IDI2O1xuXHRzdGF0aWMgQzRHID0gMjc7XG5cdHN0YXRpYyBDNEIgPSAyODtcblx0c3RhdGljIEM0QSA9IDI5O1xuXHRzdGF0aWMgVTQgPSAzMDtcblx0c3RhdGljIFY0ID0gMzE7XG59XG4iXX0=