ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
392 lines • 54.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { SkeletonClipping } from "../core/SkeletonClipping";
import { Color, Vector2, Utils } from "../core/Utils";
import { WebGLBlendModeConverter } from "./WebGL";
import { RegionAttachment } from "../core/attachments/RegionAttachment";
import { MeshAttachment } from "../core/attachments/MeshAttachment";
import { ClippingAttachment } from "../core/attachments/ClippingAttachment";
class Renderable {
/**
* @param {?} vertices
* @param {?} numVertices
* @param {?} numFloats
*/
constructor(vertices, numVertices, numFloats) {
this.vertices = vertices;
this.numVertices = numVertices;
this.numFloats = numFloats;
}
}
if (false) {
/** @type {?} */
Renderable.prototype.vertices;
/** @type {?} */
Renderable.prototype.numVertices;
/** @type {?} */
Renderable.prototype.numFloats;
}
export class SkeletonRenderer {
/**
* @param {?} context
* @param {?=} twoColorTint
*/
constructor(context, twoColorTint = true) {
this.premultipliedAlpha = false;
this.vertexEffect = null;
this.tempColor = new Color();
this.tempColor2 = new Color();
this.vertexSize = 2 + 2 + 4;
this.twoColorTint = false;
this.renderable = new Renderable(null, 0, 0);
this.clipper = new SkeletonClipping();
this.temp = new Vector2();
this.temp2 = new Vector2();
this.temp3 = new Color();
this.temp4 = new Color();
this.twoColorTint = twoColorTint;
if (twoColorTint)
this.vertexSize += 4;
this.vertices = Utils.newFloatArray(this.vertexSize * 1024);
}
/**
* @param {?} batcher
* @param {?} skeleton
* @param {?=} slotRangeStart
* @param {?=} slotRangeEnd
* @return {?}
*/
draw(batcher, skeleton, slotRangeStart = -1, slotRangeEnd = -1) {
/** @type {?} */
let clipper = this.clipper;
/** @type {?} */
let premultipliedAlpha = this.premultipliedAlpha;
/** @type {?} */
let twoColorTint = this.twoColorTint;
/** @type {?} */
let blendMode = null;
/** @type {?} */
let tempPos = this.temp;
/** @type {?} */
let tempUv = this.temp2;
/** @type {?} */
let tempLight = this.temp3;
/** @type {?} */
let tempDark = this.temp4;
/** @type {?} */
let renderable = this.renderable;
/** @type {?} */
let uvs = null;
/** @type {?} */
let triangles = null;
/** @type {?} */
let drawOrder = skeleton.drawOrder;
/** @type {?} */
let attachmentColor = null;
/** @type {?} */
let skeletonColor = skeleton.color;
/** @type {?} */
let vertexSize = twoColorTint ? 12 : 8;
/** @type {?} */
let inRange = false;
if (slotRangeStart == -1)
inRange = true;
for (let i = 0, n = drawOrder.length; i < n; i++) {
/** @type {?} */
let clippedVertexSize = clipper.isClipping() ? 2 : vertexSize;
/** @type {?} */
let slot = drawOrder[i];
if (slotRangeStart >= 0 && slotRangeStart == slot.data.index) {
inRange = true;
}
if (!inRange) {
clipper.clipEndWithSlot(slot);
continue;
}
if (slotRangeEnd >= 0 && slotRangeEnd == slot.data.index) {
inRange = false;
}
/** @type {?} */
let attachment = slot.getAttachment();
/** @type {?} */
let texture = null;
if (attachment instanceof RegionAttachment) {
/** @type {?} */
let region = (/** @type {?} */ (attachment));
renderable.vertices = this.vertices;
renderable.numVertices = 4;
renderable.numFloats = clippedVertexSize << 2;
region.computeWorldVertices(slot.bone, renderable.vertices, 0, clippedVertexSize);
triangles = SkeletonRenderer.QUAD_TRIANGLES;
uvs = region.uvs;
texture = (/** @type {?} */ ((((/** @type {?} */ (region.region.renderObject))).texture)));
attachmentColor = region.color;
}
else if (attachment instanceof MeshAttachment) {
/** @type {?} */
let mesh = (/** @type {?} */ (attachment));
renderable.vertices = this.vertices;
renderable.numVertices = mesh.worldVerticesLength >> 1;
renderable.numFloats = renderable.numVertices * clippedVertexSize;
if (renderable.numFloats > renderable.vertices.length) {
renderable.vertices = this.vertices = Utils.newFloatArray(renderable.numFloats);
}
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, renderable.vertices, 0, clippedVertexSize);
triangles = mesh.triangles;
texture = (/** @type {?} */ ((((/** @type {?} */ (mesh.region.renderObject))).texture)));
uvs = mesh.uvs;
attachmentColor = mesh.color;
}
else if (attachment instanceof ClippingAttachment) {
/** @type {?} */
let clip = (/** @type {?} */ (attachment));
clipper.clipStart(slot, clip);
continue;
}
else {
clipper.clipEndWithSlot(slot);
continue;
}
if (texture != null) {
/** @type {?} */
let slotColor = slot.color;
/** @type {?} */
let finalColor = this.tempColor;
finalColor.r = skeletonColor.r * slotColor.r * attachmentColor.r;
finalColor.g = skeletonColor.g * slotColor.g * attachmentColor.g;
finalColor.b = skeletonColor.b * slotColor.b * attachmentColor.b;
finalColor.a = skeletonColor.a * slotColor.a * attachmentColor.a;
if (premultipliedAlpha) {
finalColor.r *= finalColor.a;
finalColor.g *= finalColor.a;
finalColor.b *= finalColor.a;
}
/** @type {?} */
let darkColor = this.tempColor2;
if (slot.darkColor == null)
darkColor.set(0, 0, 0, 1.0);
else {
if (premultipliedAlpha) {
darkColor.r = slot.darkColor.r * finalColor.a;
darkColor.g = slot.darkColor.g * finalColor.a;
darkColor.b = slot.darkColor.b * finalColor.a;
}
else {
darkColor.setFromColor(slot.darkColor);
}
darkColor.a = premultipliedAlpha ? 1.0 : 0.0;
}
/** @type {?} */
let slotBlendMode = slot.data.blendMode;
if (slotBlendMode != blendMode) {
blendMode = slotBlendMode;
batcher.setBlendMode(WebGLBlendModeConverter.getSourceGLBlendMode(blendMode, premultipliedAlpha), WebGLBlendModeConverter.getDestGLBlendMode(blendMode));
}
if (clipper.isClipping()) {
clipper.clipTriangles(renderable.vertices, renderable.numFloats, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint);
/** @type {?} */
let clippedVertices = new Float32Array(clipper.clippedVertices);
/** @type {?} */
let clippedTriangles = clipper.clippedTriangles;
if (this.vertexEffect != null) {
/** @type {?} */
let vertexEffect = this.vertexEffect;
/** @type {?} */
let verts = clippedVertices;
if (!twoColorTint) {
for (let v = 0, n = clippedVertices.length; v < n; v += vertexSize) {
tempPos.x = verts[v];
tempPos.y = verts[v + 1];
tempLight.set(verts[v + 2], verts[v + 3], verts[v + 4], verts[v + 5]);
tempUv.x = verts[v + 6];
tempUv.y = verts[v + 7];
tempDark.set(0, 0, 0, 0);
vertexEffect.transform(tempPos, tempUv, tempLight, tempDark);
verts[v] = tempPos.x;
verts[v + 1] = tempPos.y;
verts[v + 2] = tempLight.r;
verts[v + 3] = tempLight.g;
verts[v + 4] = tempLight.b;
verts[v + 5] = tempLight.a;
verts[v + 6] = tempUv.x;
verts[v + 7] = tempUv.y;
}
}
else {
for (let v = 0, n = clippedVertices.length; v < n; v += vertexSize) {
tempPos.x = verts[v];
tempPos.y = verts[v + 1];
tempLight.set(verts[v + 2], verts[v + 3], verts[v + 4], verts[v + 5]);
tempUv.x = verts[v + 6];
tempUv.y = verts[v + 7];
tempDark.set(verts[v + 8], verts[v + 9], verts[v + 10], verts[v + 11]);
vertexEffect.transform(tempPos, tempUv, tempLight, tempDark);
verts[v] = tempPos.x;
verts[v + 1] = tempPos.y;
verts[v + 2] = tempLight.r;
verts[v + 3] = tempLight.g;
verts[v + 4] = tempLight.b;
verts[v + 5] = tempLight.a;
verts[v + 6] = tempUv.x;
verts[v + 7] = tempUv.y;
verts[v + 8] = tempDark.r;
verts[v + 9] = tempDark.g;
verts[v + 10] = tempDark.b;
verts[v + 11] = tempDark.a;
}
}
}
batcher.draw(texture, clippedVertices, clippedTriangles);
}
else {
/** @type {?} */
let verts = renderable.vertices;
if (this.vertexEffect != null) {
/** @type {?} */
let vertexEffect = this.vertexEffect;
if (!twoColorTint) {
for (let v = 0, u = 0, n = renderable.numFloats; v < n; v += vertexSize, u += 2) {
tempPos.x = verts[v];
tempPos.y = verts[v + 1];
tempUv.x = uvs[u];
tempUv.y = uvs[u + 1];
tempLight.setFromColor(finalColor);
tempDark.set(0, 0, 0, 0);
vertexEffect.transform(tempPos, tempUv, tempLight, tempDark);
verts[v] = tempPos.x;
verts[v + 1] = tempPos.y;
verts[v + 2] = tempLight.r;
verts[v + 3] = tempLight.g;
verts[v + 4] = tempLight.b;
verts[v + 5] = tempLight.a;
verts[v + 6] = tempUv.x;
verts[v + 7] = tempUv.y;
}
}
else {
for (let v = 0, u = 0, n = renderable.numFloats; v < n; v += vertexSize, u += 2) {
tempPos.x = verts[v];
tempPos.y = verts[v + 1];
tempUv.x = uvs[u];
tempUv.y = uvs[u + 1];
tempLight.setFromColor(finalColor);
tempDark.setFromColor(darkColor);
vertexEffect.transform(tempPos, tempUv, tempLight, tempDark);
verts[v] = tempPos.x;
verts[v + 1] = tempPos.y;
verts[v + 2] = tempLight.r;
verts[v + 3] = tempLight.g;
verts[v + 4] = tempLight.b;
verts[v + 5] = tempLight.a;
verts[v + 6] = tempUv.x;
verts[v + 7] = tempUv.y;
verts[v + 8] = tempDark.r;
verts[v + 9] = tempDark.g;
verts[v + 10] = tempDark.b;
verts[v + 11] = tempDark.a;
}
}
}
else {
if (!twoColorTint) {
for (let v = 2, u = 0, n = renderable.numFloats; v < n; v += vertexSize, u += 2) {
verts[v] = finalColor.r;
verts[v + 1] = finalColor.g;
verts[v + 2] = finalColor.b;
verts[v + 3] = finalColor.a;
verts[v + 4] = uvs[u];
verts[v + 5] = uvs[u + 1];
}
}
else {
for (let v = 2, u = 0, n = renderable.numFloats; v < n; v += vertexSize, u += 2) {
verts[v] = finalColor.r;
verts[v + 1] = finalColor.g;
verts[v + 2] = finalColor.b;
verts[v + 3] = finalColor.a;
verts[v + 4] = uvs[u];
verts[v + 5] = uvs[u + 1];
verts[v + 6] = darkColor.r;
verts[v + 7] = darkColor.g;
verts[v + 8] = darkColor.b;
verts[v + 9] = darkColor.a;
}
}
}
/** @type {?} */
let view = ((/** @type {?} */ (renderable.vertices))).subarray(0, renderable.numFloats);
batcher.draw(texture, view, triangles);
}
}
clipper.clipEndWithSlot(slot);
}
clipper.clipEnd();
}
}
SkeletonRenderer.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
if (false) {
/** @type {?} */
SkeletonRenderer.QUAD_TRIANGLES;
/** @type {?} */
SkeletonRenderer.prototype.premultipliedAlpha;
/** @type {?} */
SkeletonRenderer.prototype.vertexEffect;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.tempColor;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.tempColor2;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.vertices;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.vertexSize;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.twoColorTint;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.renderable;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.clipper;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.temp;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.temp2;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.temp3;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.temp4;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25SZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy93ZWJnbC9Ta2VsZXRvblJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUE2QkEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBZ0MsdUJBQXVCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFLaEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRzVFLE1BQU0sVUFBVTs7Ozs7O0lBQ2QsWUFDUyxRQUEyQixFQUMzQixXQUFtQixFQUNuQixTQUFpQjtRQUZqQixhQUFRLEdBQVIsUUFBUSxDQUFtQjtRQUMzQixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFRO0lBQ3ZCLENBQUM7Q0FDTDs7O0lBSkcsOEJBQWtDOztJQUNsQyxpQ0FBMEI7O0lBQzFCLCtCQUF3Qjs7QUFHNUIsTUFBTSxPQUFPLGdCQUFnQjs7Ozs7SUFlM0IsWUFDRSxPQUFxQyxFQUNyQyxlQUF3QixJQUFJO1FBZjlCLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixpQkFBWSxHQUFpQixJQUFJLENBQUM7UUFDMUIsY0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEIsZUFBVSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFFekIsZUFBVSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FB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QUksQ0FBQyxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLENBQUM7O0FBbFVNLCtCQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7SUFBM0MsZ0NBQTJDOztJQUMzQyw4Q0FBMkI7O0lBQzNCLHdDQUFrQzs7Ozs7SUFDbEMscUNBQWdDOzs7OztJQUNoQyxzQ0FBaUM7Ozs7O0lBQ2pDLG9DQUFvQzs7Ozs7SUFDcEMsc0NBQStCOzs7OztJQUMvQix3Q0FBNkI7Ozs7O0lBQzdCLHNDQUE0RDs7Ozs7SUFDNUQsbUNBQTJEOzs7OztJQUMzRCxnQ0FBNkI7Ozs7O0lBQzdCLGlDQUE4Qjs7Ozs7SUFDOUIsaUNBQTRCOzs7OztJQUM1QixpQ0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuaW1wb3J0IHsgVmVydGV4RWZmZWN0IH0gZnJvbSBcIi4uL2NvcmUvVmVydGV4RWZmZWN0XCI7XHJcbmltcG9ydCB7IFNrZWxldG9uQ2xpcHBpbmcgfSBmcm9tIFwiLi4vY29yZS9Ta2VsZXRvbkNsaXBwaW5nXCI7XHJcbmltcG9ydCB7IENvbG9yLCBWZWN0b3IyLCBVdGlscyB9IGZyb20gXCIuLi9jb3JlL1V0aWxzXCI7XHJcbmltcG9ydCB7IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQsIFdlYkdMQmxlbmRNb2RlQ29udmVydGVyIH0gZnJvbSBcIi4vV2ViR0xcIjtcclxuaW1wb3J0IHsgU2tlbGV0b24gfSBmcm9tIFwiLi4vY29yZS9Ta2VsZXRvblwiO1xyXG5pbXBvcnQgeyBQb2x5Z29uQmF0Y2hlciB9IGZyb20gXCIuL1BvbHlnb25CYXRjaGVyXCI7XHJcbmltcG9ydCB7IEJsZW5kTW9kZSB9IGZyb20gXCIuLi9jb3JlL0JsZW5kTW9kZVwiO1xyXG5pbXBvcnQgeyBHTFRleHR1cmUgfSBmcm9tIFwiLi9HTFRleHR1cmVcIjtcclxuaW1wb3J0IHsgUmVnaW9uQXR0YWNobWVudCB9IGZyb20gXCIuLi9jb3JlL2F0dGFjaG1lbnRzL1JlZ2lvbkF0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgTWVzaEF0dGFjaG1lbnQgfSBmcm9tIFwiLi4vY29yZS9hdHRhY2htZW50cy9NZXNoQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBUZXh0dXJlQXRsYXNSZWdpb24gfSBmcm9tIFwiLi4vY29yZS9UZXh0dXJlQXRsYXNcIjtcclxuaW1wb3J0IHsgQ2xpcHBpbmdBdHRhY2htZW50IH0gZnJvbSBcIi4uL2NvcmUvYXR0YWNobWVudHMvQ2xpcHBpbmdBdHRhY2htZW50XCI7XHJcbmltcG9ydCB7IEFycmF5TGlrZSB9IGZyb20gXCIuLi9jb3JlL1V0aWxzXCI7XHJcblxyXG5jbGFzcyBSZW5kZXJhYmxlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyB2ZXJ0aWNlczogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICBwdWJsaWMgbnVtVmVydGljZXM6IG51bWJlcixcclxuICAgIHB1YmxpYyBudW1GbG9hdHM6IG51bWJlclxyXG4gICkge31cclxufVxyXG5leHBvcnQgY2xhc3MgU2tlbGV0b25SZW5kZXJlciB7XHJcbiAgc3RhdGljIFFVQURfVFJJQU5HTEVTID0gWzAsIDEsIDIsIDIsIDMsIDBdO1xyXG4gIHByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlO1xyXG4gIHZlcnRleEVmZmVjdDogVmVydGV4RWZmZWN0ID0gbnVsbDtcclxuICBwcml2YXRlIHRlbXBDb2xvciA9IG5ldyBDb2xvcigpO1xyXG4gIHByaXZhdGUgdGVtcENvbG9yMiA9IG5ldyBDb2xvcigpO1xyXG4gIHByaXZhdGUgdmVydGljZXM6IEFycmF5TGlrZTxudW1iZXI+O1xyXG4gIHByaXZhdGUgdmVydGV4U2l6ZSA9IDIgKyAyICsgNDtcclxuICBwcml2YXRlIHR3b0NvbG9yVGludCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVuZGVyYWJsZTogUmVuZGVyYWJsZSA9IG5ldyBSZW5kZXJhYmxlKG51bGwsIDAsIDApO1xyXG4gIHByaXZhdGUgY2xpcHBlcjogU2tlbGV0b25DbGlwcGluZyA9IG5ldyBTa2VsZXRvbkNsaXBwaW5nKCk7XHJcbiAgcHJpdmF0ZSB0ZW1wID0gbmV3IFZlY3RvcjIoKTtcclxuICBwcml2YXRlIHRlbXAyID0gbmV3IFZlY3RvcjIoKTtcclxuICBwcml2YXRlIHRlbXAzID0gbmV3IENvbG9yKCk7XHJcbiAgcHJpdmF0ZSB0ZW1wNCA9IG5ldyBDb2xvcigpO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCxcclxuICAgIHR3b0NvbG9yVGludDogYm9vbGVhbiA9IHRydWVcclxuICApIHtcclxuICAgIHRoaXMudHdvQ29sb3JUaW50ID0gdHdvQ29sb3JUaW50O1xyXG4gICAgaWYgKHR3b0NvbG9yVGludCkgdGhpcy52ZXJ0ZXhTaXplICs9IDQ7XHJcbiAgICB0aGlzLnZlcnRpY2VzID0gVXRpbHMubmV3RmxvYXRBcnJheSh0aGlzLnZlcnRleFNpemUgKiAxMDI0KTtcclxuICB9XHJcbiAgZHJhdyhcclxuICAgIGJhdGNoZXI6IFBvbHlnb25CYXRjaGVyLFxyXG4gICAgc2tlbGV0b246IFNrZWxldG9uLFxyXG4gICAgc2xvdFJhbmdlU3RhcnQ6IG51bWJlciA9IC0xLFxyXG4gICAgc2xvdFJhbmdlRW5kOiBudW1iZXIgPSAtMVxyXG4gICkge1xyXG4gICAgbGV0IGNsaXBwZXIgPSB0aGlzLmNsaXBwZXI7XHJcbiAgICBsZXQgcHJlbXVsdGlwbGllZEFscGhhID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE7XHJcbiAgICBsZXQgdHdvQ29sb3JUaW50ID0gdGhpcy50d29Db2xvclRpbnQ7XHJcbiAgICBsZXQgYmxlbmRNb2RlOiBCbGVuZE1vZGUgPSBudWxsO1xyXG4gICAgbGV0IHRlbXBQb3MgPSB0aGlzLnRlbXA7XHJcbiAgICBsZXQgdGVtcFV2ID0gdGhpcy50ZW1wMjtcclxuICAgIGxldCB0ZW1wTGlnaHQgPSB0aGlzLnRlbXAzO1xyXG4gICAgbGV0IHRlbXBEYXJrID0gdGhpcy50ZW1wNDtcclxuICAgIGxldCByZW5kZXJhYmxlOiBSZW5kZXJhYmxlID0gdGhpcy5yZW5kZXJhYmxlO1xyXG4gICAgbGV0IHV2czogQXJyYXlMaWtlPG51bWJlcj4gPSBudWxsO1xyXG4gICAgbGV0IHRyaWFuZ2xlczogQXJyYXk8bnVtYmVyPiA9IG51bGw7XHJcbiAgICBsZXQgZHJhd09yZGVyID0gc2tlbGV0b24uZHJhd09yZGVyO1xyXG4gICAgbGV0IGF0dGFjaG1lbnRDb2xvcjogQ29sb3IgPSBudWxsO1xyXG4gICAgbGV0IHNrZWxldG9uQ29sb3IgPSBza2VsZXRvbi5jb2xvcjtcclxuICAgIGxldCB2ZXJ0ZXhTaXplID0gdHdvQ29sb3JUaW50ID8gMTIgOiA4O1xyXG4gICAgbGV0IGluUmFuZ2UgPSBmYWxzZTtcclxuICAgIGlmIChzbG90UmFuZ2VTdGFydCA9PSAtMSkgaW5SYW5nZSA9IHRydWU7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGRyYXdPcmRlci5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgbGV0IGNsaXBwZWRWZXJ0ZXhTaXplID0gY2xpcHBlci5pc0NsaXBwaW5nKCkgPyAyIDogdmVydGV4U2l6ZTtcclxuICAgICAgbGV0IHNsb3QgPSBkcmF3T3JkZXJbaV07XHJcbiAgICAgIGlmIChzbG90UmFuZ2VTdGFydCA+PSAwICYmIHNsb3RSYW5nZVN0YXJ0ID09IHNsb3QuZGF0YS5pbmRleCkge1xyXG4gICAgICAgIGluUmFuZ2UgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaW5SYW5nZSkge1xyXG4gICAgICAgIGNsaXBwZXIuY2xpcEVuZFdpdGhTbG90KHNsb3QpO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzbG90UmFuZ2VFbmQgPj0gMCAmJiBzbG90UmFuZ2VFbmQgPT0gc2xvdC5kYXRhLmluZGV4KSB7XHJcbiAgICAgICAgaW5SYW5nZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XHJcbiAgICAgIGxldCB0ZXh0dXJlOiBHTFRleHR1cmUgPSBudWxsO1xyXG4gICAgICBpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQpIHtcclxuICAgICAgICBsZXQgcmVnaW9uID0gPFJlZ2lvbkF0dGFjaG1lbnQ+YXR0YWNobWVudDtcclxuICAgICAgICByZW5kZXJhYmxlLnZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcclxuICAgICAgICByZW5kZXJhYmxlLm51bVZlcnRpY2VzID0gNDtcclxuICAgICAgICByZW5kZXJhYmxlLm51bUZsb2F0cyA9IGNsaXBwZWRWZXJ0ZXhTaXplIDw8IDI7XHJcbiAgICAgICAgcmVnaW9uLmNvbXB1dGVXb3JsZFZlcnRpY2VzKFxyXG4gICAgICAgICAgc2xvdC5ib25lLFxyXG4gICAgICAgICAgcmVuZGVyYWJsZS52ZXJ0aWNlcyxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICBjbGlwcGVkVmVydGV4U2l6ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdHJpYW5nbGVzID0gU2tlbGV0b25SZW5kZXJlci5RVUFEX1RSSUFOR0xFUztcclxuICAgICAgICB1dnMgPSByZWdpb24udXZzO1xyXG4gICAgICAgIHRleHR1cmUgPSA8R0xUZXh0dXJlPihcclxuICAgICAgICAgICg8VGV4dHVyZUF0bGFzUmVnaW9uPnJlZ2lvbi5yZWdpb24ucmVuZGVyT2JqZWN0KS50ZXh0dXJlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhdHRhY2htZW50Q29sb3IgPSByZWdpb24uY29sb3I7XHJcbiAgICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIE1lc2hBdHRhY2htZW50KSB7XHJcbiAgICAgICAgbGV0IG1lc2ggPSA8TWVzaEF0dGFjaG1lbnQ+YXR0YWNobWVudDtcclxuICAgICAgICByZW5kZXJhYmxlLnZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcclxuICAgICAgICByZW5kZXJhYmxlLm51bVZlcnRpY2VzID0gbWVzaC53b3JsZFZlcnRpY2VzTGVuZ3RoID4+IDE7XHJcbiAgICAgICAgcmVuZGVyYWJsZS5udW1GbG9hdHMgPSByZW5kZXJhYmxlLm51bVZlcnRpY2VzICogY2xpcHBlZFZlcnRleFNpemU7XHJcbiAgICAgICAgaWYgKHJlbmRlcmFibGUubnVtRmxvYXRzID4gcmVuZGVyYWJsZS52ZXJ0aWNlcy5sZW5ndGgpIHtcclxuICAgICAgICAgIHJlbmRlcmFibGUudmVydGljZXMgPSB0aGlzLnZlcnRpY2VzID0gVXRpbHMubmV3RmxvYXRBcnJheShcclxuICAgICAgICAgICAgcmVuZGVyYWJsZS5udW1GbG9hdHNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1lc2guY29tcHV0ZVdvcmxkVmVydGljZXMoXHJcbiAgICAgICAgICBzbG90LFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIG1lc2gud29ybGRWZXJ0aWNlc0xlbmd0aCxcclxuICAgICAgICAgIHJlbmRlcmFibGUudmVydGljZXMsXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgY2xpcHBlZFZlcnRleFNpemVcclxuICAgICAgICApO1xyXG4gICAgICAgIHRyaWFuZ2xlcyA9IG1lc2gudHJpYW5nbGVzO1xyXG4gICAgICAgIHRleHR1cmUgPSA8R0xUZXh0dXJlPihcclxuICAgICAgICAgICg8VGV4dHVyZUF0bGFzUmVnaW9uPm1lc2gucmVnaW9uLnJlbmRlck9iamVjdCkudGV4dHVyZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdXZzID0gbWVzaC51dnM7XHJcbiAgICAgICAgYXR0YWNobWVudENvbG9yID0gbWVzaC5jb2xvcjtcclxuICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgQ2xpcHBpbmdBdHRhY2htZW50KSB7XHJcbiAgICAgICAgbGV0IGNsaXAgPSA8Q2xpcHBpbmdBdHRhY2htZW50PmF0dGFjaG1lbnQ7XHJcbiAgICAgICAgY2xpcHBlci5jbGlwU3RhcnQoc2xvdCwgY2xpcCk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2xpcHBlci5jbGlwRW5kV2l0aFNsb3Qoc2xvdCk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRleHR1cmUgIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBzbG90Q29sb3IgPSBzbG90LmNvbG9yO1xyXG4gICAgICAgIGxldCBmaW5hbENvbG9yID0gdGhpcy50ZW1wQ29sb3I7XHJcbiAgICAgICAgZmluYWxDb2xvci5yID0gc2tlbGV0b25Db2xvci5yICogc2xvdENvbG9yLnIgKiBhdHRhY2htZW50Q29sb3IucjtcclxuICAgICAgICBmaW5hbENvbG9yLmcgPSBza2VsZXRvbkNvbG9yLmcgKiBzbG90Q29sb3IuZyAqIGF0dGFjaG1lbnRDb2xvci5nO1xyXG4gICAgICAgIGZpbmFsQ29sb3IuYiA9IHNrZWxldG9uQ29sb3IuYiAqIHNsb3RDb2xvci5iICogYXR0YWNobWVudENvbG9yLmI7XHJcbiAgICAgICAgZmluYWxDb2xvci5hID0gc2tlbGV0b25Db2xvci5hICogc2xvdENvbG9yLmEgKiBhdHRhY2htZW50Q29sb3IuYTtcclxuICAgICAgICBpZiAocHJlbXVsdGlwbGllZEFscGhhKSB7XHJcbiAgICAgICAgICBmaW5hbENvbG9yLnIgKj0gZmluYWxDb2xvci5hO1xyXG4gICAgICAgICAgZmluYWxDb2xvci5nICo9IGZpbmFsQ29sb3IuYTtcclxuICAgICAgICAgIGZpbmFsQ29sb3IuYiAqPSBmaW5hbENvbG9yLmE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkYXJrQ29sb3IgPSB0aGlzLnRlbXBDb2xvcjI7XHJcbiAgICAgICAgaWYgKHNsb3QuZGFya0NvbG9yID09IG51bGwpIGRhcmtDb2xvci5zZXQoMCwgMCwgMCwgMS4wKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmIChwcmVtdWx0aXBsaWVkQWxwaGEpIHtcclxuICAgICAgICAgICAgZGFya0NvbG9yLnIgPSBzbG90LmRhcmtDb2xvci5yICogZmluYWxDb2xvci5hO1xyXG4gICAgICAgICAgICBkYXJrQ29sb3IuZyA9IHNsb3QuZGFya0NvbG9yLmcgKiBmaW5hbENvbG9yLmE7XHJcbiAgICAgICAgICAgIGRhcmtDb2xvci5iID0gc2xvdC5kYXJrQ29sb3IuYiAqIGZpbmFsQ29sb3IuYTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhcmtDb2xvci5zZXRGcm9tQ29sb3Ioc2xvdC5kYXJrQ29sb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGFya0NvbG9yLmEgPSBwcmVtdWx0aXBsaWVkQWxwaGEgPyAxLjAgOiAwLjA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzbG90QmxlbmRNb2RlID0gc2xvdC5kYXRhLmJsZW5kTW9kZTtcclxuICAgICAgICBpZiAoc2xvdEJsZW5kTW9kZSAhPSBibGVuZE1vZGUpIHtcclxuICAgICAgICAgIGJsZW5kTW9kZSA9IHNsb3RCbGVuZE1vZGU7XHJcbiAgICAgICAgICBiYXRjaGVyLnNldEJsZW5kTW9kZShcclxuICAgICAgICAgICAgV2ViR0xCbGVuZE1vZGVDb252ZXJ0ZXIuZ2V0U291cmNlR0xCbGVuZE1vZGUoXHJcbiAgICAgICAgICAgICAgYmxlbmRNb2RlLFxyXG4gICAgICAgICAgICAgIHByZW11bHRpcGxpZWRBbHBoYVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBXZWJHTEJsZW5kTW9kZUNvbnZlcnRlci5nZXREZXN0R0xCbGVuZE1vZGUoYmxlbmRNb2RlKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNsaXBwZXIuaXNDbGlwcGluZygpKSB7XHJcbiAgICAgICAgICBjbGlwcGVyLmNsaXBUcmlhbmdsZXMoXHJcbiAgICAgICAgICAgIHJlbmRlcmFibGUudmVydGljZXMsXHJcbiAgICAgICAgICAgIHJlbmRlcmFibGUubnVtRmxvYXRzLFxyXG4gICAgICAgICAgICB0cmlhbmdsZXMsXHJcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHV2cyxcclxuICAgICAgICAgICAgZmluYWxDb2xvcixcclxuICAgICAgICAgICAgZGFya0NvbG9yLFxyXG4gICAgICAgICAgICB0d29Db2xvclRpbnRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBsZXQgY2xpcHBlZFZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheShjbGlwcGVyLmNsaXBwZWRWZXJ0aWNlcyk7XHJcbiAgICAgICAgICBsZXQgY2xpcHBlZFRyaWFuZ2xlcyA9IGNsaXBwZXIuY2xpcHBlZFRyaWFuZ2xlcztcclxuICAgICAgICAgIGlmICh0aGlzLnZlcnRleEVmZmVjdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCB2ZXJ0ZXhFZmZlY3QgPSB0aGlzLnZlcnRleEVmZmVjdDtcclxuICAgICAgICAgICAgbGV0IHZlcnRzID0gY2xpcHBlZFZlcnRpY2VzO1xyXG4gICAgICAgICAgICBpZiAoIXR3b0NvbG9yVGludCkge1xyXG4gICAgICAgICAgICAgIGZvciAoXHJcbiAgICAgICAgICAgICAgICBsZXQgdiA9IDAsIG4gPSBjbGlwcGVkVmVydGljZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgdiA8IG47XHJcbiAgICAgICAgICAgICAgICB2ICs9IHZlcnRleFNpemVcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRlbXBQb3MueCA9IHZlcnRzW3ZdO1xyXG4gICAgICAgICAgICAgICAgdGVtcFBvcy55ID0gdmVydHNbdiArIDFdO1xyXG4gICAgICAgICAgICAgICAgdGVtcExpZ2h0LnNldChcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDJdLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgM10sXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA0XSxcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDVdXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGVtcFV2LnggPSB2ZXJ0c1t2ICsgNl07XHJcbiAgICAgICAgICAgICAgICB0ZW1wVXYueSA9IHZlcnRzW3YgKyA3XTtcclxuICAgICAgICAgICAgICAgIHRlbXBEYXJrLnNldCgwLCAwLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgIHZlcnRleEVmZmVjdC50cmFuc2Zvcm0odGVtcFBvcywgdGVtcFV2LCB0ZW1wTGlnaHQsIHRlbXBEYXJrKTtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3ZdID0gdGVtcFBvcy54O1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDFdID0gdGVtcFBvcy55O1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDJdID0gdGVtcExpZ2h0LnI7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgM10gPSB0ZW1wTGlnaHQuZztcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA0XSA9IHRlbXBMaWdodC5iO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDVdID0gdGVtcExpZ2h0LmE7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgNl0gPSB0ZW1wVXYueDtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA3XSA9IHRlbXBVdi55O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBmb3IgKFxyXG4gICAgICAgICAgICAgICAgbGV0IHYgPSAwLCBuID0gY2xpcHBlZFZlcnRpY2VzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHYgPCBuO1xyXG4gICAgICAgICAgICAgICAgdiArPSB2ZXJ0ZXhTaXplXHJcbiAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wUG9zLnggPSB2ZXJ0c1t2XTtcclxuICAgICAgICAgICAgICAgIHRlbXBQb3MueSA9IHZlcnRzW3YgKyAxXTtcclxuICAgICAgICAgICAgICAgIHRlbXBMaWdodC5zZXQoXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAyXSxcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDNdLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgNF0sXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA1XVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRlbXBVdi54ID0gdmVydHNbdiArIDZdO1xyXG4gICAgICAgICAgICAgICAgdGVtcFV2LnkgPSB2ZXJ0c1t2ICsgN107XHJcbiAgICAgICAgICAgICAgICB0ZW1wRGFyay5zZXQoXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA4XSxcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDldLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMTBdLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMTFdXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdmVydGV4RWZmZWN0LnRyYW5zZm9ybSh0ZW1wUG9zLCB0ZW1wVXYsIHRlbXBMaWdodCwgdGVtcERhcmspO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdl0gPSB0ZW1wUG9zLng7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMV0gPSB0ZW1wUG9zLnk7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMl0gPSB0ZW1wTGlnaHQucjtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAzXSA9IHRlbXBMaWdodC5nO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDRdID0gdGVtcExpZ2h0LmI7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgNV0gPSB0ZW1wTGlnaHQuYTtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA2XSA9IHRlbXBVdi54O1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDddID0gdGVtcFV2Lnk7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgOF0gPSB0ZW1wRGFyay5yO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDldID0gdGVtcERhcmsuZztcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAxMF0gPSB0ZW1wRGFyay5iO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDExXSA9IHRlbXBEYXJrLmE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBiYXRjaGVyLmRyYXcodGV4dHVyZSwgY2xpcHBlZFZlcnRpY2VzLCBjbGlwcGVkVHJpYW5nbGVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHZlcnRzID0gcmVuZGVyYWJsZS52ZXJ0aWNlcztcclxuICAgICAgICAgIGlmICh0aGlzLnZlcnRleEVmZmVjdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCB2ZXJ0ZXhFZmZlY3QgPSB0aGlzLnZlcnRleEVmZmVjdDtcclxuICAgICAgICAgICAgaWYgKCF0d29Db2xvclRpbnQpIHtcclxuICAgICAgICAgICAgICBmb3IgKFxyXG4gICAgICAgICAgICAgICAgbGV0IHYgPSAwLCB1ID0gMCwgbiA9IHJlbmRlcmFibGUubnVtRmxvYXRzO1xyXG4g