UNPKG

ngx-spine

Version:

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

467 lines 49.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /****************************************************************************** * 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 { Vector2, MathUtils } from "./Utils"; var TransformConstraint = /** @class */ (function () { function TransformConstraint(data, skeleton) { this.rotateMix = 0; this.translateMix = 0; this.scaleMix = 0; this.shearMix = 0; this.temp = new Vector2(); this.active = false; if (data == null) throw new Error("data cannot be null."); if (skeleton == null) throw new Error("skeleton cannot be null."); this.data = data; this.rotateMix = data.rotateMix; this.translateMix = data.translateMix; this.scaleMix = data.scaleMix; this.shearMix = data.shearMix; this.bones = new Array(); for (var i = 0; i < data.bones.length; i++) this.bones.push(skeleton.findBone(data.bones[i].name)); this.target = skeleton.findBone(data.target.name); } /** * @return {?} */ TransformConstraint.prototype.isActive = /** * @return {?} */ function () { return this.active; }; /** * @return {?} */ TransformConstraint.prototype.apply = /** * @return {?} */ function () { this.update(); }; /** * @return {?} */ TransformConstraint.prototype.update = /** * @return {?} */ function () { if (this.data.local) { if (this.data.relative) this.applyRelativeLocal(); else this.applyAbsoluteLocal(); } else { if (this.data.relative) this.applyRelativeWorld(); else this.applyAbsoluteWorld(); } }; /** * @return {?} */ TransformConstraint.prototype.applyAbsoluteWorld = /** * @return {?} */ function () { /** @type {?} */ var rotateMix = this.rotateMix; /** @type {?} */ var translateMix = this.translateMix; /** @type {?} */ var scaleMix = this.scaleMix; /** @type {?} */ var shearMix = this.shearMix; /** @type {?} */ var target = this.target; /** @type {?} */ var ta = target.a; /** @type {?} */ var tb = target.b; /** @type {?} */ var tc = target.c; /** @type {?} */ var td = target.d; /** @type {?} */ var degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad; /** @type {?} */ var offsetRotation = this.data.offsetRotation * degRadReflect; /** @type {?} */ var offsetShearY = this.data.offsetShearY * degRadReflect; /** @type {?} */ var bones = this.bones; for (var i = 0, n = bones.length; i < n; i++) { /** @type {?} */ var bone = bones[i]; /** @type {?} */ var modified = false; if (rotateMix != 0) { /** @type {?} */ var a = bone.a; /** @type {?} */ var b = bone.b; /** @type {?} */ var c = bone.c; /** @type {?} */ var d = bone.d; /** @type {?} */ var r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation; if (r > MathUtils.PI) r -= MathUtils.PI2; else if (r < -MathUtils.PI) r += MathUtils.PI2; r *= rotateMix; /** @type {?} */ var cos = Math.cos(r); /** @type {?} */ var sin = Math.sin(r); bone.a = cos * a - sin * c; bone.b = cos * b - sin * d; bone.c = sin * a + cos * c; bone.d = sin * b + cos * d; modified = true; } if (translateMix != 0) { /** @type {?} */ var temp = this.temp; target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); bone.worldX += (temp.x - bone.worldX) * translateMix; bone.worldY += (temp.y - bone.worldY) * translateMix; modified = true; } if (scaleMix > 0) { /** @type {?} */ var s = Math.sqrt(bone.a * bone.a + bone.c * bone.c); /** @type {?} */ var ts = Math.sqrt(ta * ta + tc * tc); if (s > 0.00001) s = (s + (ts - s + this.data.offsetScaleX) * scaleMix) / s; bone.a *= s; bone.c *= s; s = Math.sqrt(bone.b * bone.b + bone.d * bone.d); ts = Math.sqrt(tb * tb + td * td); if (s > 0.00001) s = (s + (ts - s + this.data.offsetScaleY) * scaleMix) / s; bone.b *= s; bone.d *= s; modified = true; } if (shearMix > 0) { /** @type {?} */ var b = bone.b; /** @type {?} */ var d = bone.d; /** @type {?} */ var by = Math.atan2(d, b); /** @type {?} */ var r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(bone.c, bone.a)); if (r > MathUtils.PI) r -= MathUtils.PI2; else if (r < -MathUtils.PI) r += MathUtils.PI2; r = by + (r + offsetShearY) * shearMix; /** @type {?} */ var s = Math.sqrt(b * b + d * d); bone.b = Math.cos(r) * s; bone.d = Math.sin(r) * s; modified = true; } if (modified) bone.appliedValid = false; } }; /** * @return {?} */ TransformConstraint.prototype.applyRelativeWorld = /** * @return {?} */ function () { /** @type {?} */ var rotateMix = this.rotateMix; /** @type {?} */ var translateMix = this.translateMix; /** @type {?} */ var scaleMix = this.scaleMix; /** @type {?} */ var shearMix = this.shearMix; /** @type {?} */ var target = this.target; /** @type {?} */ var ta = target.a; /** @type {?} */ var tb = target.b; /** @type {?} */ var tc = target.c; /** @type {?} */ var td = target.d; /** @type {?} */ var degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad; /** @type {?} */ var offsetRotation = this.data.offsetRotation * degRadReflect; /** @type {?} */ var offsetShearY = this.data.offsetShearY * degRadReflect; /** @type {?} */ var bones = this.bones; for (var i = 0, n = bones.length; i < n; i++) { /** @type {?} */ var bone = bones[i]; /** @type {?} */ var modified = false; if (rotateMix != 0) { /** @type {?} */ var a = bone.a; /** @type {?} */ var b = bone.b; /** @type {?} */ var c = bone.c; /** @type {?} */ var d = bone.d; /** @type {?} */ var r = Math.atan2(tc, ta) + offsetRotation; if (r > MathUtils.PI) r -= MathUtils.PI2; else if (r < -MathUtils.PI) r += MathUtils.PI2; r *= rotateMix; /** @type {?} */ var cos = Math.cos(r); /** @type {?} */ var sin = Math.sin(r); bone.a = cos * a - sin * c; bone.b = cos * b - sin * d; bone.c = sin * a + cos * c; bone.d = sin * b + cos * d; modified = true; } if (translateMix != 0) { /** @type {?} */ var temp = this.temp; target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); bone.worldX += temp.x * translateMix; bone.worldY += temp.y * translateMix; modified = true; } if (scaleMix > 0) { /** @type {?} */ var s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * scaleMix + 1; bone.a *= s; bone.c *= s; s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * scaleMix + 1; bone.b *= s; bone.d *= s; modified = true; } if (shearMix > 0) { /** @type {?} */ var r = Math.atan2(td, tb) - Math.atan2(tc, ta); if (r > MathUtils.PI) r -= MathUtils.PI2; else if (r < -MathUtils.PI) r += MathUtils.PI2; /** @type {?} */ var b = bone.b; /** @type {?} */ var d = bone.d; r = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * shearMix; /** @type {?} */ var s = Math.sqrt(b * b + d * d); bone.b = Math.cos(r) * s; bone.d = Math.sin(r) * s; modified = true; } if (modified) bone.appliedValid = false; } }; /** * @return {?} */ TransformConstraint.prototype.applyAbsoluteLocal = /** * @return {?} */ function () { /** @type {?} */ var rotateMix = this.rotateMix; /** @type {?} */ var translateMix = this.translateMix; /** @type {?} */ var scaleMix = this.scaleMix; /** @type {?} */ var shearMix = this.shearMix; /** @type {?} */ var target = this.target; if (!target.appliedValid) target.updateAppliedTransform(); /** @type {?} */ var bones = this.bones; for (var i = 0, n = bones.length; i < n; i++) { /** @type {?} */ var bone = bones[i]; if (!bone.appliedValid) bone.updateAppliedTransform(); /** @type {?} */ var rotation = bone.arotation; if (rotateMix != 0) { /** @type {?} */ var r = target.arotation - rotation + this.data.offsetRotation; r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; rotation += r * rotateMix; } /** @type {?} */ var x = bone.ax; /** @type {?} */ var y = bone.ay; if (translateMix != 0) { x += (target.ax - x + this.data.offsetX) * translateMix; y += (target.ay - y + this.data.offsetY) * translateMix; } /** @type {?} */ var scaleX = bone.ascaleX; /** @type {?} */ var scaleY = bone.ascaleY; if (scaleMix != 0) { if (scaleX > 0.00001) scaleX = (scaleX + (target.ascaleX - scaleX + this.data.offsetScaleX) * scaleMix) / scaleX; if (scaleY > 0.00001) scaleY = (scaleY + (target.ascaleY - scaleY + this.data.offsetScaleY) * scaleMix) / scaleY; } /** @type {?} */ var shearY = bone.ashearY; if (shearMix != 0) { /** @type {?} */ var r = target.ashearY - shearY + this.data.offsetShearY; r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; bone.shearY += r * shearMix; } bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); } }; /** * @return {?} */ TransformConstraint.prototype.applyRelativeLocal = /** * @return {?} */ function () { /** @type {?} */ var rotateMix = this.rotateMix; /** @type {?} */ var translateMix = this.translateMix; /** @type {?} */ var scaleMix = this.scaleMix; /** @type {?} */ var shearMix = this.shearMix; /** @type {?} */ var target = this.target; if (!target.appliedValid) target.updateAppliedTransform(); /** @type {?} */ var bones = this.bones; for (var i = 0, n = bones.length; i < n; i++) { /** @type {?} */ var bone = bones[i]; if (!bone.appliedValid) bone.updateAppliedTransform(); /** @type {?} */ var rotation = bone.arotation; if (rotateMix != 0) rotation += (target.arotation + this.data.offsetRotation) * rotateMix; /** @type {?} */ var x = bone.ax; /** @type {?} */ var y = bone.ay; if (translateMix != 0) { x += (target.ax + this.data.offsetX) * translateMix; y += (target.ay + this.data.offsetY) * translateMix; } /** @type {?} */ var scaleX = bone.ascaleX; /** @type {?} */ var scaleY = bone.ascaleY; if (scaleMix != 0) { if (scaleX > 0.00001) scaleX *= (target.ascaleX - 1 + this.data.offsetScaleX) * scaleMix + 1; if (scaleY > 0.00001) scaleY *= (target.ascaleY - 1 + this.data.offsetScaleY) * scaleMix + 1; } /** @type {?} */ var shearY = bone.ashearY; if (shearMix != 0) shearY += (target.ashearY + this.data.offsetShearY) * shearMix; bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); } }; return TransformConstraint; }()); export { TransformConstraint }; if (false) { /** @type {?} */ TransformConstraint.prototype.data; /** @type {?} */ TransformConstraint.prototype.bones; /** @type {?} */ TransformConstraint.prototype.target; /** @type {?} */ TransformConstraint.prototype.rotateMix; /** @type {?} */ TransformConstraint.prototype.translateMix; /** @type {?} */ TransformConstraint.prototype.scaleMix; /** @type {?} */ TransformConstraint.prototype.shearMix; /** @type {?} */ TransformConstraint.prototype.temp; /** @type {?} */ TransformConstraint.prototype.active; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNmb3JtQ29uc3RyYWludC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL1RyYW5zZm9ybUNvbnN0cmFpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFHN0M7SUFVRSw2QkFBWSxJQUE2QixFQUFFLFFBQWtCO1FBTjdELGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLFNBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFYixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFELElBQUksUUFBUSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVEsQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FB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Q0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBQ2pFLElBQUksQ0FBQyx3QkFBd0IsQ0FDM0IsQ0FBQyxFQUNELENBQUMsRUFDRCxRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixJQUFJLENBQUMsT0FBTyxFQUNaLE1BQU0sQ0FDUCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBQ0gsMEJBQUM7QUFBRCxDQUFDLEFBNVJELElBNFJDOzs7O0lBM1JDLG1DQUE4Qjs7SUFDOUIsb0NBQW1COztJQUNuQixxQ0FBYTs7SUFDYix3Q0FBYzs7SUFDZCwyQ0FBaUI7O0lBQ2pCLHVDQUFhOztJQUNiLHVDQUFhOztJQUNiLG1DQUFxQjs7SUFDckIscUNBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbmltcG9ydCB7IFVwZGF0YWJsZSB9IGZyb20gXCIuL1VwZGF0YWJsZVwiO1xyXG5pbXBvcnQgeyBUcmFuc2Zvcm1Db25zdHJhaW50RGF0YSB9IGZyb20gXCIuL1RyYW5zZm9ybUNvbnN0cmFpbnREYXRhXCI7XHJcbmltcG9ydCB7IEJvbmUgfSBmcm9tIFwiLi9Cb25lXCI7XHJcbmltcG9ydCB7IFZlY3RvcjIsIE1hdGhVdGlscyB9IGZyb20gXCIuL1V0aWxzXCI7XHJcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSBcIi4vU2tlbGV0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1Db25zdHJhaW50IGltcGxlbWVudHMgVXBkYXRhYmxlIHtcclxuICBkYXRhOiBUcmFuc2Zvcm1Db25zdHJhaW50RGF0YTtcclxuICBib25lczogQXJyYXk8Qm9uZT47XHJcbiAgdGFyZ2V0OiBCb25lO1xyXG4gIHJvdGF0ZU1peCA9IDA7XHJcbiAgdHJhbnNsYXRlTWl4ID0gMDtcclxuICBzY2FsZU1peCA9IDA7XHJcbiAgc2hlYXJNaXggPSAwO1xyXG4gIHRlbXAgPSBuZXcgVmVjdG9yMigpO1xyXG4gIGFjdGl2ZSA9IGZhbHNlO1xyXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhLCBza2VsZXRvbjogU2tlbGV0b24pIHtcclxuICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcImRhdGEgY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgaWYgKHNrZWxldG9uID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLnJvdGF0ZU1peCA9IGRhdGEucm90YXRlTWl4O1xyXG4gICAgdGhpcy50cmFuc2xhdGVNaXggPSBkYXRhLnRyYW5zbGF0ZU1peDtcclxuICAgIHRoaXMuc2NhbGVNaXggPSBkYXRhLnNjYWxlTWl4O1xyXG4gICAgdGhpcy5zaGVhck1peCA9IGRhdGEuc2hlYXJNaXg7XHJcbiAgICB0aGlzLmJvbmVzID0gbmV3IEFycmF5PEJvbmU+KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEuYm9uZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgIHRoaXMuYm9uZXMucHVzaChza2VsZXRvbi5maW5kQm9uZShkYXRhLmJvbmVzW2ldLm5hbWUpKTtcclxuICAgIHRoaXMudGFyZ2V0ID0gc2tlbGV0b24uZmluZEJvbmUoZGF0YS50YXJnZXQubmFtZSk7XHJcbiAgfVxyXG4gIGlzQWN0aXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gIH1cclxuICBhcHBseSgpIHtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgfVxyXG4gIHVwZGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLmRhdGEubG9jYWwpIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YS5yZWxhdGl2ZSkgdGhpcy5hcHBseVJlbGF0aXZlTG9jYWwoKTtcclxuICAgICAgZWxzZSB0aGlzLmFwcGx5QWJzb2x1dGVMb2NhbCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YS5yZWxhdGl2ZSkgdGhpcy5hcHBseVJlbGF0aXZlV29ybGQoKTtcclxuICAgICAgZWxzZSB0aGlzLmFwcGx5QWJzb2x1dGVXb3JsZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBhcHBseUFic29sdXRlV29ybGQoKSB7XHJcbiAgICBsZXQgcm90YXRlTWl4ID0gdGhpcy5yb3RhdGVNaXgsXHJcbiAgICAgIHRyYW5zbGF0ZU1peCA9IHRoaXMudHJhbnNsYXRlTWl4LFxyXG4gICAgICBzY2FsZU1peCA9IHRoaXMuc2NhbGVNaXgsXHJcbiAgICAgIHNoZWFyTWl4ID0gdGhpcy5zaGVhck1peDtcclxuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldDtcclxuICAgIGxldCB0YSA9IHRhcmdldC5hLFxyXG4gICAgICB0YiA9IHRhcmdldC5iLFxyXG4gICAgICB0YyA9IHRhcmdldC5jLFxyXG4gICAgICB0ZCA9IHRhcmdldC5kO1xyXG4gICAgbGV0IGRlZ1JhZFJlZmxlY3QgPVxyXG4gICAgICB0YSAqIHRkIC0gdGIgKiB0YyA+IDAgPyBNYXRoVXRpbHMuZGVnUmFkIDogLU1hdGhVdGlscy5kZWdSYWQ7XHJcbiAgICBsZXQgb2Zmc2V0Um90YXRpb24gPSB0aGlzLmRhdGEub2Zmc2V0Um90YXRpb24gKiBkZWdSYWRSZWZsZWN0O1xyXG4gICAgbGV0IG9mZnNldFNoZWFyWSA9IHRoaXMuZGF0YS5vZmZzZXRTaGVhclkgKiBkZWdSYWRSZWZsZWN0O1xyXG4gICAgbGV0IGJvbmVzID0gdGhpcy5ib25lcztcclxuICAgIGZvciAobGV0IGkgPSAwLCBuID0gYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgIGxldCBib25lID0gYm9uZXNbaV07XHJcbiAgICAgIGxldCBtb2RpZmllZCA9IGZhbHNlO1xyXG4gICAgICBpZiAocm90YXRlTWl4ICE9IDApIHtcclxuICAgICAgICBsZXQgYSA9IGJvbmUuYSxcclxuICAgICAgICAgIGIgPSBib25lLmIsXHJcbiAgICAgICAgICBjID0gYm9uZS5jLFxyXG4gICAgICAgICAgZCA9IGJvbmUuZDtcclxuICAgICAgICBsZXQgciA9IE1hdGguYXRhbjIodGMsIHRhKSAtIE1hdGguYXRhbjIoYywgYSkgKyBvZmZzZXRSb3RhdGlvbjtcclxuICAgICAgICBpZiAociA+IE1hdGhVdGlscy5QSSkgciAtPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIGVsc2UgaWYgKHIgPCAtTWF0aFV0aWxzLlBJKSByICs9IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgciAqPSByb3RhdGVNaXg7XHJcbiAgICAgICAgbGV0IGNvcyA9IE1hdGguY29zKHIpLFxyXG4gICAgICAgICAgc2luID0gTWF0aC5zaW4ocik7XHJcbiAgICAgICAgYm9uZS5hID0gY29zICogYSAtIHNpbiAqIGM7XHJcbiAgICAgICAgYm9uZS5iID0gY29zICogYiAtIHNpbiAqIGQ7XHJcbiAgICAgICAgYm9uZS5jID0gc2luICogYSArIGNvcyAqIGM7XHJcbiAgICAgICAgYm9uZS5kID0gc2luICogYiArIGNvcyAqIGQ7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0cmFuc2xhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCB0ZW1wID0gdGhpcy50ZW1wO1xyXG4gICAgICAgIHRhcmdldC5sb2NhbFRvV29ybGQodGVtcC5zZXQodGhpcy5kYXRhLm9mZnNldFgsIHRoaXMuZGF0YS5vZmZzZXRZKSk7XHJcbiAgICAgICAgYm9uZS53b3JsZFggKz0gKHRlbXAueCAtIGJvbmUud29ybGRYKSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgICBib25lLndvcmxkWSArPSAodGVtcC55IC0gYm9uZS53b3JsZFkpICogdHJhbnNsYXRlTWl4O1xyXG4gICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2NhbGVNaXggPiAwKSB7XHJcbiAgICAgICAgbGV0IHMgPSBNYXRoLnNxcnQoYm9uZS5hICogYm9uZS5hICsgYm9uZS5jICogYm9uZS5jKTtcclxuICAgICAgICBsZXQgdHMgPSBNYXRoLnNxcnQodGEgKiB0YSArIHRjICogdGMpO1xyXG4gICAgICAgIGlmIChzID4gMC4wMDAwMSlcclxuICAgICAgICAgIHMgPSAocyArICh0cyAtIHMgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVYKSAqIHNjYWxlTWl4KSAvIHM7XHJcbiAgICAgICAgYm9uZS5hICo9IHM7XHJcbiAgICAgICAgYm9uZS5jICo9IHM7XHJcbiAgICAgICAgcyA9IE1hdGguc3FydChib25lLmIgKiBib25lLmIgKyBib25lLmQgKiBib25lLmQpO1xyXG4gICAgICAgIHRzID0gTWF0aC5zcXJ0KHRiICogdGIgKyB0ZCAqIHRkKTtcclxuICAgICAgICBpZiAocyA+IDAuMDAwMDEpXHJcbiAgICAgICAgICBzID0gKHMgKyAodHMgLSBzICsgdGhpcy5kYXRhLm9mZnNldFNjYWxlWSkgKiBzY2FsZU1peCkgLyBzO1xyXG4gICAgICAgIGJvbmUuYiAqPSBzO1xyXG4gICAgICAgIGJvbmUuZCAqPSBzO1xyXG4gICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2hlYXJNaXggPiAwKSB7XHJcbiAgICAgICAgbGV0IGIgPSBib25lLmIsXHJcbiAgICAgICAgICBkID0gYm9uZS5kO1xyXG4gICAgICAgIGxldCBieSA9IE1hdGguYXRhbjIoZCwgYik7XHJcbiAgICAgICAgbGV0IHIgPVxyXG4gICAgICAgICAgTWF0aC5hdGFuMih0ZCwgdGIpIC1cclxuICAgICAgICAgIE1hdGguYXRhbjIodGMsIHRhKSAtXHJcbiAgICAgICAgICAoYnkgLSBNYXRoLmF0YW4yKGJvbmUuYywgYm9uZS5hKSk7XHJcbiAgICAgICAgaWYgKHIgPiBNYXRoVXRpbHMuUEkpIHIgLT0gTWF0aFV0aWxzLlBJMjtcclxuICAgICAgICBlbHNlIGlmIChyIDwgLU1hdGhVdGlscy5QSSkgciArPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIHIgPSBieSArIChyICsgb2Zmc2V0U2hlYXJZKSAqIHNoZWFyTWl4O1xyXG4gICAgICAgIGxldCBzID0gTWF0aC5zcXJ0KGIgKiBiICsgZCAqIGQpO1xyXG4gICAgICAgIGJvbmUuYiA9IE1hdGguY29zKHIpICogcztcclxuICAgICAgICBib25lLmQgPSBNYXRoLnNpbihyKSAqIHM7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtb2RpZmllZCkgYm9uZS5hcHBsaWVkVmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgYXBwbHlSZWxhdGl2ZVdvcmxkKCkge1xyXG4gICAgbGV0IHJvdGF0ZU1peCA9IHRoaXMucm90YXRlTWl4LFxyXG4gICAgICB0cmFuc2xhdGVNaXggPSB0aGlzLnRyYW5zbGF0ZU1peCxcclxuICAgICAgc2NhbGVNaXggPSB0aGlzLnNjYWxlTWl4LFxyXG4gICAgICBzaGVhck1peCA9IHRoaXMuc2hlYXJNaXg7XHJcbiAgICBsZXQgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XHJcbiAgICBsZXQgdGEgPSB0YXJnZXQuYSxcclxuICAgICAgdGIgPSB0YXJnZXQuYixcclxuICAgICAgdGMgPSB0YXJnZXQuYyxcclxuICAgICAgdGQgPSB0YXJnZXQuZDtcclxuICAgIGxldCBkZWdSYWRSZWZsZWN0ID1cclxuICAgICAgdGEgKiB0ZCAtIHRiICogdGMgPiAwID8gTWF0aFV0aWxzLmRlZ1JhZCA6IC1NYXRoVXRpbHMuZGVnUmFkO1xyXG4gICAgbGV0IG9mZnNldFJvdGF0aW9uID0gdGhpcy5kYXRhLm9mZnNldFJvdGF0aW9uICogZGVnUmFkUmVmbGVjdCxcclxuICAgICAgb2Zmc2V0U2hlYXJZID0gdGhpcy5kYXRhLm9mZnNldFNoZWFyWSAqIGRlZ1JhZFJlZmxlY3Q7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XHJcbiAgICAgIGlmIChyb3RhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCBhID0gYm9uZS5hLFxyXG4gICAgICAgICAgYiA9IGJvbmUuYixcclxuICAgICAgICAgIGMgPSBib25lLmMsXHJcbiAgICAgICAgICBkID0gYm9uZS5kO1xyXG4gICAgICAgIGxldCByID0gTWF0aC5hdGFuMih0YywgdGEpICsgb2Zmc2V0Um90YXRpb247XHJcbiAgICAgICAgaWYgKHIgPiBNYXRoVXRpbHMuUEkpIHIgLT0gTWF0aFV0aWxzLlBJMjtcclxuICAgICAgICBlbHNlIGlmIChyIDwgLU1hdGhVdGlscy5QSSkgciArPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIHIgKj0gcm90YXRlTWl4O1xyXG4gICAgICAgIGxldCBjb3MgPSBNYXRoLmNvcyhyKSxcclxuICAgICAgICAgIHNpbiA9IE1hdGguc2luKHIpO1xyXG4gICAgICAgIGJvbmUuYSA9IGNvcyAqIGEgLSBzaW4gKiBjO1xyXG4gICAgICAgIGJvbmUuYiA9IGNvcyAqIGIgLSBzaW4gKiBkO1xyXG4gICAgICAgIGJvbmUuYyA9IHNpbiAqIGEgKyBjb3MgKiBjO1xyXG4gICAgICAgIGJvbmUuZCA9IHNpbiAqIGIgKyBjb3MgKiBkO1xyXG4gICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodHJhbnNsYXRlTWl4ICE9IDApIHtcclxuICAgICAgICBsZXQgdGVtcCA9IHRoaXMudGVtcDtcclxuICAgICAgICB0YXJnZXQubG9jYWxUb1dvcmxkKHRlbXAuc2V0KHRoaXMuZGF0YS5vZmZzZXRYLCB0aGlzLmRhdGEub2Zmc2V0WSkpO1xyXG4gICAgICAgIGJvbmUud29ybGRYICs9IHRlbXAueCAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgICBib25lLndvcmxkWSArPSB0ZW1wLnkgKiB0cmFuc2xhdGVNaXg7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzY2FsZU1peCA+IDApIHtcclxuICAgICAgICBsZXQgcyA9XHJcbiAgICAgICAgICAoTWF0aC5zcXJ0KHRhICogdGEgKyB0YyAqIHRjKSAtIDEgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVYKSAqXHJcbiAgICAgICAgICAgIHNjYWxlTWl4ICtcclxuICAgICAgICAgIDE7XHJcbiAgICAgICAgYm9uZS5hICo9IHM7XHJcbiAgICAgICAgYm9uZS5jICo9IHM7XHJcbiAgICAgICAgcyA9XHJcbiAgICAgICAgICAoTWF0aC5zcXJ0KHRiICogdGIgKyB0ZCAqIHRkKSAtIDEgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVZKSAqXHJcbiAgICAgICAgICAgIHNjYWxlTWl4ICtcclxuICAgICAgICAgIDE7XHJcbiAgICAgICAgYm9uZS5iICo9IHM7XHJcbiAgICAgICAgYm9uZS5kICo9IHM7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzaGVhck1peCA+IDApIHtcclxuICAgICAgICBsZXQgciA9IE1hdGguYXRhbjIodGQsIHRiKSAtIE1hdGguYXRhbjIodGMsIHRhKTtcclxuICAgICAgICBpZiAociA+IE1hdGhVdGlscy5QSSkgciAtPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIGVsc2UgaWYgKHIgPCAtTWF0aFV0aWxzLlBJKSByICs9IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgbGV0IGIgPSBib25lLmIsXHJcbiAgICAgICAgICBkID0gYm9uZS5kO1xyXG4gICAgICAgIHIgPSBNYXRoLmF0YW4yKGQsIGIpICsgKHIgLSBNYXRoVXRpbHMuUEkgLyAyICsgb2Zmc2V0U2hlYXJZKSAqIHNoZWFyTWl4O1xyXG4gICAgICAgIGxldCBzID0gTWF0aC5zcXJ0KGIgKiBiICsgZCAqIGQpO1xyXG4gICAgICAgIGJvbmUuYiA9IE1hdGguY29zKHIpICogcztcclxuICAgICAgICBib25lLmQgPSBNYXRoLnNpbihyKSAqIHM7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtb2RpZmllZCkgYm9uZS5hcHBsaWVkVmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgYXBwbHlBYnNvbHV0ZUxvY2FsKCkge1xyXG4gICAgbGV0IHJvdGF0ZU1peCA9IHRoaXMucm90YXRlTWl4LFxyXG4gICAgICB0cmFuc2xhdGVNaXggPSB0aGlzLnRyYW5zbGF0ZU1peCxcclxuICAgICAgc2NhbGVNaXggPSB0aGlzLnNjYWxlTWl4LFxyXG4gICAgICBzaGVhck1peCA9IHRoaXMuc2hlYXJNaXg7XHJcbiAgICBsZXQgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XHJcbiAgICBpZiAoIXRhcmdldC5hcHBsaWVkVmFsaWQpIHRhcmdldC51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgaWYgKCFib25lLmFwcGxpZWRWYWxpZCkgYm9uZS51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICAgIGxldCByb3RhdGlvbiA9IGJvbmUuYXJvdGF0aW9uO1xyXG4gICAgICBpZiAocm90YXRlTWl4ICE9IDApIHtcclxuICAgICAgICBsZXQgciA9IHRhcmdldC5hcm90YXRpb24gLSByb3RhdGlvbiArIHRoaXMuZGF0YS5vZmZzZXRSb3RhdGlvbjtcclxuICAgICAgICByIC09ICgxNjM4NCAtICgoMTYzODQuNDk5OTk5OTk5OTk2IC0gciAvIDM2MCkgfCAwKSkgKiAzNjA7XHJcbiAgICAgICAgcm90YXRpb24gKz0gciAqIHJvdGF0ZU1peDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgeCA9IGJvbmUuYXgsXHJcbiAgICAgICAgeSA9IGJvbmUuYXk7XHJcbiAgICAgIGlmICh0cmFuc2xhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIHggKz0gKHRhcmdldC5heCAtIHggKyB0aGlzLmRhdGEub2Zmc2V0WCkgKiB0cmFuc2xhdGVNaXg7XHJcbiAgICAgICAgeSArPSAodGFyZ2V0LmF5IC0geSArIHRoaXMuZGF0YS5vZmZzZXRZKSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2NhbGVYID0gYm9uZS5hc2NhbGVYLFxyXG4gICAgICAgIHNjYWxlWSA9IGJvbmUuYXNjYWxlWTtcclxuICAgICAgaWYgKHNjYWxlTWl4ICE9IDApIHtcclxuICAgICAgICBpZiAoc2NhbGVYID4gMC4wMDAwMSlcclxuICAgICAgICAgIHNjYWxlWCA9XHJcbiAgICAgICAgICAgIChzY2FsZVggK1xyXG4gICAgICAgICAgICAgICh0YXJnZXQuYXNjYWxlWCAtIHNjYWxlWCArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVgpICogc2NhbGVNaXgpIC9cclxuICAgICAgICAgICAgc2NhbGVYO1xyXG4gICAgICAgIGlmIChzY2FsZVkgPiAwLjAwMDAxKVxyXG4gICAgICAgICAgc2NhbGVZID1cclxuICAgICAgICAgICAgKHNjYWxlWSArXHJcbiAgICAgICAgICAgICAgKHRhcmdldC5hc2NhbGVZIC0gc2NhbGVZICsgdGhpcy5kYXRhLm9mZnNldFNjYWxlWSkgKiBzY2FsZU1peCkgL1xyXG4gICAgICAgICAgICBzY2FsZVk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHNoZWFyWSA9IGJvbmUuYXNoZWFyWTtcclxuICAgICAgaWYgKHNoZWFyTWl4ICE9IDApIHtcclxuICAgICAgICBsZXQgciA9IHRhcmdldC5hc2hlYXJZIC0gc2hlYXJZICsgdGhpcy5kYXRhLm9mZnNldFNoZWFyWTtcclxuICAgICAgICByIC09ICgxNjM4NCAtICgoMTYzODQuNDk5OTk5OTk5OTk2IC0gciAvIDM2MCkgfCAwKSkgKiAzNjA7XHJcbiAgICAgICAgYm9uZS5zaGVhclkgKz0gciAqIHNoZWFyTWl4O1xyXG4gICAgICB9XHJcbiAgICAgIGJvbmUudXBkYXRlV29ybGRUcmFuc2Zvcm1XaXRoKFxyXG4gICAgICAgIHgsXHJcbiAgICAgICAgeSxcclxuICAgICAgICByb3RhdGlvbixcclxuICAgICAgICBzY2FsZVgsXHJcbiAgICAgICAgc2NhbGVZLFxyXG4gICAgICAgIGJvbmUuYXNoZWFyWCxcclxuICAgICAgICBzaGVhcllcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcbiAgYXBwbHlSZWxhdGl2ZUxvY2FsKCkge1xyXG4gICAgbGV0IHJvdGF0ZU1peCA9IHRoaXMucm90YXRlTWl4LFxyXG4gICAgICB0cmFuc2xhdGVNaXggPSB0aGlzLnRyYW5zbGF0ZU1peCxcclxuICAgICAgc2NhbGVNaXggPSB0aGlzLnNjYWxlTWl4LFxyXG4gICAgICBzaGVhck1peCA9IHRoaXMuc2hlYXJNaXg7XHJcbiAgICBsZXQgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XHJcbiAgICBpZiAoIXRhcmdldC5hcHBsaWVkVmFsaWQpIHRhcmdldC51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgaWYgKCFib25lLmFwcGxpZWRWYWxpZCkgYm9uZS51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICAgIGxldCByb3RhdGlvbiA9IGJvbmUuYXJvdGF0aW9uO1xyXG4gICAgICBpZiAocm90YXRlTWl4ICE9IDApXHJcbiAgICAgICAgcm90YXRpb24gKz0gKHRhcmdldC5hcm90YXRpb24gKyB0aGlzLmRhdGEub2Zmc2V0Um90YXRpb24pICogcm90YXRlTWl4O1xyXG4gICAgICBsZXQgeCA9IGJvbmUuYXgsXHJcbiAgICAgICAgeSA9IGJvbmUuYXk7XHJcbiAgICAgIGlmICh0cmFuc2xhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIHggKz0gKHRhcmdldC5heCArIHRoaXMuZGF0YS5vZmZzZXRYKSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgICB5ICs9ICh0YXJnZXQuYXkgKyB0aGlzLmRhdGEub2Zmc2V0WSkgKiB0cmFuc2xhdGVNaXg7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHNjYWxlWCA9IGJvbmUuYXNjYWxlWCxcclxuICAgICAgICBzY2FsZVkgPSBib25lLmFzY2FsZVk7XHJcbiAgICAgIGlmIChzY2FsZU1peCAhPSAwKSB7XHJcbiAgICAgICAgaWYgKHNjYWxlWCA+IDAuMDAwMDEpXHJcbiAgICAgICAgICBzY2FsZVggKj1cclxuICAgICAgICAgICAgKHRhcmdldC5hc2NhbGVYIC0gMSArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVgpICogc2NhbGVNaXggKyAxO1xyXG4gICAgICAgIGlmIChzY2FsZVkgPiAwLjAwMDAxKVxyXG4gICAgICAgICAgc2NhbGVZICo9XHJcbiAgICAgICAgICAgICh0YXJnZXQuYXNjYWxlWSAtIDEgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVZKSAqIHNjYWxlTWl4ICsgMTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2hlYXJZID0gYm9uZS5hc2hlYXJZO1xyXG4gICAgICBpZiAoc2hlYXJNaXggIT0gMClcclxuICAgICAgICBzaGVhclkgKz0gKHRhcmdldC5hc2hlYXJZICsgdGhpcy5kYXRhLm9mZnNldFNoZWFyWSkgKiBzaGVhck1peDtcclxuICAgICAgYm9uZS51cGRhdGVXb3JsZFRyYW5zZm9ybVdpdGgoXHJcbiAgICAgICAgeCxcclxuICAgICAgICB5LFxyXG4gICAgICAgIHJvdGF0aW9uLFxyXG4gICAgICAgIHNjYWxlWCxcclxuICAgICAgICBzY2FsZVksXHJcbiAgICAgICAgYm9uZS5hc2hlYXJYLFxyXG4gICAgICAgIHNoZWFyWVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=