UNPKG

ngx-spine

Version:

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

396 lines 55.2 kB
/** * @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"; var Renderable = /** @class */ (function () { function Renderable(vertices, numVertices, numFloats) { this.vertices = vertices; this.numVertices = numVertices; this.numFloats = numFloats; } return Renderable; }()); if (false) { /** @type {?} */ Renderable.prototype.vertices; /** @type {?} */ Renderable.prototype.numVertices; /** @type {?} */ Renderable.prototype.numFloats; } var SkeletonRenderer = /** @class */ (function () { function SkeletonRenderer(context, twoColorTint) { if (twoColorTint === void 0) { 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 {?} */ SkeletonRenderer.prototype.draw = /** * @param {?} batcher * @param {?} skeleton * @param {?=} slotRangeStart * @param {?=} slotRangeEnd * @return {?} */ function (batcher, skeleton, slotRangeStart, slotRangeEnd) { if (slotRangeStart === void 0) { slotRangeStart = -1; } if (slotRangeEnd === void 0) { slotRangeEnd = -1; } /** @type {?} */ var clipper = this.clipper; /** @type {?} */ var premultipliedAlpha = this.premultipliedAlpha; /** @type {?} */ var twoColorTint = this.twoColorTint; /** @type {?} */ var blendMode = null; /** @type {?} */ var tempPos = this.temp; /** @type {?} */ var tempUv = this.temp2; /** @type {?} */ var tempLight = this.temp3; /** @type {?} */ var tempDark = this.temp4; /** @type {?} */ var renderable = this.renderable; /** @type {?} */ var uvs = null; /** @type {?} */ var triangles = null; /** @type {?} */ var drawOrder = skeleton.drawOrder; /** @type {?} */ var attachmentColor = null; /** @type {?} */ var skeletonColor = skeleton.color; /** @type {?} */ var vertexSize = twoColorTint ? 12 : 8; /** @type {?} */ var inRange = false; if (slotRangeStart == -1) inRange = true; for (var i = 0, n = drawOrder.length; i < n; i++) { /** @type {?} */ var clippedVertexSize = clipper.isClipping() ? 2 : vertexSize; /** @type {?} */ var 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 {?} */ var attachment = slot.getAttachment(); /** @type {?} */ var texture = null; if (attachment instanceof RegionAttachment) { /** @type {?} */ var 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 {?} */ var 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 {?} */ var clip = (/** @type {?} */ (attachment)); clipper.clipStart(slot, clip); continue; } else { clipper.clipEndWithSlot(slot); continue; } if (texture != null) { /** @type {?} */ var slotColor = slot.color; /** @type {?} */ var 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 {?} */ var 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 {?} */ var 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 {?} */ var clippedVertices = new Float32Array(clipper.clippedVertices); /** @type {?} */ var clippedTriangles = clipper.clippedTriangles; if (this.vertexEffect != null) { /** @type {?} */ var vertexEffect = this.vertexEffect; /** @type {?} */ var verts = clippedVertices; if (!twoColorTint) { for (var v = 0, n_1 = clippedVertices.length; v < n_1; 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 (var v = 0, n_2 = clippedVertices.length; v < n_2; 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 {?} */ var verts = renderable.vertices; if (this.vertexEffect != null) { /** @type {?} */ var vertexEffect = this.vertexEffect; if (!twoColorTint) { for (var v = 0, u = 0, n_3 = renderable.numFloats; v < n_3; 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 (var v = 0, u = 0, n_4 = renderable.numFloats; v < n_4; 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 (var v = 2, u = 0, n_5 = renderable.numFloats; v < n_5; 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 (var v = 2, u = 0, n_6 = renderable.numFloats; v < n_6; 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 {?} */ var 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]; return SkeletonRenderer; }()); export { SkeletonRenderer }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25SZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy93ZWJnbC9Ta2VsZXRvblJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUE2QkEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBZ0MsdUJBQXVCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFLaEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRzVFO0lBQ0Usb0JBQ1MsUUFBMkIsRUFDM0IsV0FBbUIsRUFDbkIsU0FBaUI7UUFGakIsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7UUFDM0IsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBUTtJQUN2QixDQUFDO0lBQ04saUJBQUM7QUFBRCxDQUFDLEFBTkQsSUFNQzs7O0lBSkcsOEJBQWtDOztJQUNsQyxpQ0FBMEI7O0lBQzFCLCtCQUF3Qjs7QUFHNUI7SUFlRSwwQkFDRSxPQUFxQyxFQUNyQyxZQUE0QjtRQUE1Qiw2QkFBQSxFQUFBLG1CQUE0QjtRQWY5Qix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsaUJBQVksR0FBaUIsSUFBSSxDQUFDO1FBQzFCLGNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBRXpCLGVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixpQkFBWSxHQUFHLEtB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RUFBRSxTQUFTLENBQUMsQ0FBQztpQkFDeEM7YUFDRjtZQUNELE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0I7UUFDRCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQWxVTSwrQkFBYyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQW1VN0MsdUJBQUM7Q0FBQSxBQXBVRCxJQW9VQztTQXBVWSxnQkFBZ0I7OztJQUMzQixnQ0FBMkM7O0lBQzNDLDhDQUEyQjs7SUFDM0Isd0NBQWtDOzs7OztJQUNsQyxxQ0FBZ0M7Ozs7O0lBQ2hDLHNDQUFpQzs7Ozs7SUFDakMsb0NBQW9DOzs7OztJQUNwQyxzQ0FBK0I7Ozs7O0lBQy9CLHdDQUE2Qjs7Ozs7SUFDN0Isc0NBQTREOzs7OztJQUM1RCxtQ0FBMkQ7Ozs7O0lBQzNELGdDQUE2Qjs7Ozs7SUFDN0IsaUNBQThCOzs7OztJQUM5QixpQ0FBNEI7Ozs7O0lBQzVCLGlDQUE0QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5pbXBvcnQgeyBWZXJ0ZXhFZmZlY3QgfSBmcm9tIFwiLi4vY29yZS9WZXJ0ZXhFZmZlY3RcIjtcclxuaW1wb3J0IHsgU2tlbGV0b25DbGlwcGluZyB9IGZyb20gXCIuLi9jb3JlL1NrZWxldG9uQ2xpcHBpbmdcIjtcclxuaW1wb3J0IHsgQ29sb3IsIFZlY3RvcjIsIFV0aWxzIH0gZnJvbSBcIi4uL2NvcmUvVXRpbHNcIjtcclxuaW1wb3J0IHsgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgV2ViR0xCbGVuZE1vZGVDb252ZXJ0ZXIgfSBmcm9tIFwiLi9XZWJHTFwiO1xyXG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gXCIuLi9jb3JlL1NrZWxldG9uXCI7XHJcbmltcG9ydCB7IFBvbHlnb25CYXRjaGVyIH0gZnJvbSBcIi4vUG9seWdvbkJhdGNoZXJcIjtcclxuaW1wb3J0IHsgQmxlbmRNb2RlIH0gZnJvbSBcIi4uL2NvcmUvQmxlbmRNb2RlXCI7XHJcbmltcG9ydCB7IEdMVGV4dHVyZSB9IGZyb20gXCIuL0dMVGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBSZWdpb25BdHRhY2htZW50IH0gZnJvbSBcIi4uL2NvcmUvYXR0YWNobWVudHMvUmVnaW9uQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBNZXNoQXR0YWNobWVudCB9IGZyb20gXCIuLi9jb3JlL2F0dGFjaG1lbnRzL01lc2hBdHRhY2htZW50XCI7XHJcbmltcG9ydCB7IFRleHR1cmVBdGxhc1JlZ2lvbiB9IGZyb20gXCIuLi9jb3JlL1RleHR1cmVBdGxhc1wiO1xyXG5pbXBvcnQgeyBDbGlwcGluZ0F0dGFjaG1lbnQgfSBmcm9tIFwiLi4vY29yZS9hdHRhY2htZW50cy9DbGlwcGluZ0F0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgQXJyYXlMaWtlIH0gZnJvbSBcIi4uL2NvcmUvVXRpbHNcIjtcclxuXHJcbmNsYXNzIFJlbmRlcmFibGUge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHZlcnRpY2VzOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgIHB1YmxpYyBudW1WZXJ0aWNlczogbnVtYmVyLFxyXG4gICAgcHVibGljIG51bUZsb2F0czogbnVtYmVyXHJcbiAgKSB7fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBTa2VsZXRvblJlbmRlcmVyIHtcclxuICBzdGF0aWMgUVVBRF9UUklBTkdMRVMgPSBbMCwgMSwgMiwgMiwgMywgMF07XHJcbiAgcHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7XHJcbiAgdmVydGV4RWZmZWN0OiBWZXJ0ZXhFZmZlY3QgPSBudWxsO1xyXG4gIHByaXZhdGUgdGVtcENvbG9yID0gbmV3IENvbG9yKCk7XHJcbiAgcHJpdmF0ZSB0ZW1wQ29sb3IyID0gbmV3IENvbG9yKCk7XHJcbiAgcHJpdmF0ZSB2ZXJ0aWNlczogQXJyYXlMaWtlPG51bWJlcj47XHJcbiAgcHJpdmF0ZSB2ZXJ0ZXhTaXplID0gMiArIDIgKyA0O1xyXG4gIHByaXZhdGUgdHdvQ29sb3JUaW50ID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByZW5kZXJhYmxlOiBSZW5kZXJhYmxlID0gbmV3IFJlbmRlcmFibGUobnVsbCwgMCwgMCk7XHJcbiAgcHJpdmF0ZSBjbGlwcGVyOiBTa2VsZXRvbkNsaXBwaW5nID0gbmV3IFNrZWxldG9uQ2xpcHBpbmcoKTtcclxuICBwcml2YXRlIHRlbXAgPSBuZXcgVmVjdG9yMigpO1xyXG4gIHByaXZhdGUgdGVtcDIgPSBuZXcgVmVjdG9yMigpO1xyXG4gIHByaXZhdGUgdGVtcDMgPSBuZXcgQ29sb3IoKTtcclxuICBwcml2YXRlIHRlbXA0ID0gbmV3IENvbG9yKCk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0LFxyXG4gICAgdHdvQ29sb3JUaW50OiBib29sZWFuID0gdHJ1ZVxyXG4gICkge1xyXG4gICAgdGhpcy50d29Db2xvclRpbnQgPSB0d29Db2xvclRpbnQ7XHJcbiAgICBpZiAodHdvQ29sb3JUaW50KSB0aGlzLnZlcnRleFNpemUgKz0gNDtcclxuICAgIHRoaXMudmVydGljZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KHRoaXMudmVydGV4U2l6ZSAqIDEwMjQpO1xyXG4gIH1cclxuICBkcmF3KFxyXG4gICAgYmF0Y2hlcjogUG9seWdvbkJhdGNoZXIsXHJcbiAgICBza2VsZXRvbjogU2tlbGV0b24sXHJcbiAgICBzbG90UmFuZ2VTdGFydDogbnVtYmVyID0gLTEsXHJcbiAgICBzbG90UmFuZ2VFbmQ6IG51bWJlciA9IC0xXHJcbiAgKSB7XHJcbiAgICBsZXQgY2xpcHBlciA9IHRoaXMuY2xpcHBlcjtcclxuICAgIGxldCBwcmVtdWx0aXBsaWVkQWxwaGEgPSB0aGlzLnByZW11bHRpcGxpZWRBbHBoYTtcclxuICAgIGxldCB0d29Db2xvclRpbnQgPSB0aGlzLnR3b0NvbG9yVGludDtcclxuICAgIGxldCBibGVuZE1vZGU6IEJsZW5kTW9kZSA9IG51bGw7XHJcbiAgICBsZXQgdGVtcFBvcyA9IHRoaXMudGVtcDtcclxuICAgIGxldCB0ZW1wVXYgPSB0aGlzLnRlbXAyO1xyXG4gICAgbGV0IHRlbXBMaWdodCA9IHRoaXMudGVtcDM7XHJcbiAgICBsZXQgdGVtcERhcmsgPSB0aGlzLnRlbXA0O1xyXG4gICAgbGV0IHJlbmRlcmFibGU6IFJlbmRlcmFibGUgPSB0aGlzLnJlbmRlcmFibGU7XHJcbiAgICBsZXQgdXZzOiBBcnJheUxpa2U8bnVtYmVyPiA9IG51bGw7XHJcbiAgICBsZXQgdHJpYW5nbGVzOiBBcnJheTxudW1iZXI+ID0gbnVsbDtcclxuICAgIGxldCBkcmF3T3JkZXIgPSBza2VsZXRvbi5kcmF3T3JkZXI7XHJcbiAgICBsZXQgYXR0YWNobWVudENvbG9yOiBDb2xvciA9IG51bGw7XHJcbiAgICBsZXQgc2tlbGV0b25Db2xvciA9IHNrZWxldG9uLmNvbG9yO1xyXG4gICAgbGV0IHZlcnRleFNpemUgPSB0d29Db2xvclRpbnQgPyAxMiA6IDg7XHJcbiAgICBsZXQgaW5SYW5nZSA9IGZhbHNlO1xyXG4gICAgaWYgKHNsb3RSYW5nZVN0YXJ0ID09IC0xKSBpblJhbmdlID0gdHJ1ZTtcclxuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZHJhd09yZGVyLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICBsZXQgY2xpcHBlZFZlcnRleFNpemUgPSBjbGlwcGVyLmlzQ2xpcHBpbmcoKSA/IDIgOiB2ZXJ0ZXhTaXplO1xyXG4gICAgICBsZXQgc2xvdCA9IGRyYXdPcmRlcltpXTtcclxuICAgICAgaWYgKHNsb3RSYW5nZVN0YXJ0ID49IDAgJiYgc2xvdFJhbmdlU3RhcnQgPT0gc2xvdC5kYXRhLmluZGV4KSB7XHJcbiAgICAgICAgaW5SYW5nZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpblJhbmdlKSB7XHJcbiAgICAgICAgY2xpcHBlci5jbGlwRW5kV2l0aFNsb3Qoc2xvdCk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNsb3RSYW5nZUVuZCA+PSAwICYmIHNsb3RSYW5nZUVuZCA9PSBzbG90LmRhdGEuaW5kZXgpIHtcclxuICAgICAgICBpblJhbmdlID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcclxuICAgICAgbGV0IHRleHR1cmU6IEdMVGV4dHVyZSA9IG51bGw7XHJcbiAgICAgIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCkge1xyXG4gICAgICAgIGxldCByZWdpb24gPSA8UmVnaW9uQXR0YWNobWVudD5hdHRhY2htZW50O1xyXG4gICAgICAgIHJlbmRlcmFibGUudmVydGljZXMgPSB0aGlzLnZlcnRpY2VzO1xyXG4gICAgICAgIHJlbmRlcmFibGUubnVtVmVydGljZXMgPSA0O1xyXG4gICAgICAgIHJlbmRlcmFibGUubnVtRmxvYXRzID0gY2xpcHBlZFZlcnRleFNpemUgPDwgMjtcclxuICAgICAgICByZWdpb24uY29tcHV0ZVdvcmxkVmVydGljZXMoXHJcbiAgICAgICAgICBzbG90LmJvbmUsXHJcbiAgICAgICAgICByZW5kZXJhYmxlLnZlcnRpY2VzLFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIGNsaXBwZWRWZXJ0ZXhTaXplXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0cmlhbmdsZXMgPSBTa2VsZXRvblJlbmRlcmVyLlFVQURfVFJJQU5HTEVTO1xyXG4gICAgICAgIHV2cyA9IHJlZ2lvbi51dnM7XHJcbiAgICAgICAgdGV4dHVyZSA9IDxHTFRleHR1cmU+KFxyXG4gICAgICAgICAgKDxUZXh0dXJlQXRsYXNSZWdpb24+cmVnaW9uLnJlZ2lvbi5yZW5kZXJPYmplY3QpLnRleHR1cmVcclxuICAgICAgICApO1xyXG4gICAgICAgIGF0dGFjaG1lbnRDb2xvciA9IHJlZ2lvbi5jb2xvcjtcclxuICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcclxuICAgICAgICBsZXQgbWVzaCA9IDxNZXNoQXR0YWNobWVudD5hdHRhY2htZW50O1xyXG4gICAgICAgIHJlbmRlcmFibGUudmVydGljZXMgPSB0aGlzLnZlcnRpY2VzO1xyXG4gICAgICAgIHJlbmRlcmFibGUubnVtVmVydGljZXMgPSBtZXNoLndvcmxkVmVydGljZXNMZW5ndGggPj4gMTtcclxuICAgICAgICByZW5kZXJhYmxlLm51bUZsb2F0cyA9IHJlbmRlcmFibGUubnVtVmVydGljZXMgKiBjbGlwcGVkVmVydGV4U2l6ZTtcclxuICAgICAgICBpZiAocmVuZGVyYWJsZS5udW1GbG9hdHMgPiByZW5kZXJhYmxlLnZlcnRpY2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgcmVuZGVyYWJsZS52ZXJ0aWNlcyA9IHRoaXMudmVydGljZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KFxyXG4gICAgICAgICAgICByZW5kZXJhYmxlLm51bUZsb2F0c1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWVzaC5jb21wdXRlV29ybGRWZXJ0aWNlcyhcclxuICAgICAgICAgIHNsb3QsXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgbWVzaC53b3JsZFZlcnRpY2VzTGVuZ3RoLFxyXG4gICAgICAgICAgcmVuZGVyYWJsZS52ZXJ0aWNlcyxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICBjbGlwcGVkVmVydGV4U2l6ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdHJpYW5nbGVzID0gbWVzaC50cmlhbmdsZXM7XHJcbiAgICAgICAgdGV4dHVyZSA9IDxHTFRleHR1cmU+KFxyXG4gICAgICAgICAgKDxUZXh0dXJlQXRsYXNSZWdpb24+bWVzaC5yZWdpb24ucmVuZGVyT2JqZWN0KS50ZXh0dXJlXHJcbiAgICAgICAgKTtcclxuICAgICAgICB1dnMgPSBtZXNoLnV2cztcclxuICAgICAgICBhdHRhY2htZW50Q29sb3IgPSBtZXNoLmNvbG9yO1xyXG4gICAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQpIHtcclxuICAgICAgICBsZXQgY2xpcCA9IDxDbGlwcGluZ0F0dGFjaG1lbnQ+YXR0YWNobWVudDtcclxuICAgICAgICBjbGlwcGVyLmNsaXBTdGFydChzbG90LCBjbGlwKTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGlwcGVyLmNsaXBFbmRXaXRoU2xvdChzbG90KTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGV4dHVyZSAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHNsb3RDb2xvciA9IHNsb3QuY29sb3I7XHJcbiAgICAgICAgbGV0IGZpbmFsQ29sb3IgPSB0aGlzLnRlbXBDb2xvcjtcclxuICAgICAgICBmaW5hbENvbG9yLnIgPSBza2VsZXRvbkNvbG9yLnIgKiBzbG90Q29sb3IuciAqIGF0dGFjaG1lbnRDb2xvci5yO1xyXG4gICAgICAgIGZpbmFsQ29sb3IuZyA9IHNrZWxldG9uQ29sb3IuZyAqIHNsb3RDb2xvci5nICogYXR0YWNobWVudENvbG9yLmc7XHJcbiAgICAgICAgZmluYWxDb2xvci5iID0gc2tlbGV0b25Db2xvci5iICogc2xvdENvbG9yLmIgKiBhdHRhY2htZW50Q29sb3IuYjtcclxuICAgICAgICBmaW5hbENvbG9yLmEgPSBza2VsZXRvbkNvbG9yLmEgKiBzbG90Q29sb3IuYSAqIGF0dGFjaG1lbnRDb2xvci5hO1xyXG4gICAgICAgIGlmIChwcmVtdWx0aXBsaWVkQWxwaGEpIHtcclxuICAgICAgICAgIGZpbmFsQ29sb3IuciAqPSBmaW5hbENvbG9yLmE7XHJcbiAgICAgICAgICBmaW5hbENvbG9yLmcgKj0gZmluYWxDb2xvci5hO1xyXG4gICAgICAgICAgZmluYWxDb2xvci5iICo9IGZpbmFsQ29sb3IuYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRhcmtDb2xvciA9IHRoaXMudGVtcENvbG9yMjtcclxuICAgICAgICBpZiAoc2xvdC5kYXJrQ29sb3IgPT0gbnVsbCkgZGFya0NvbG9yLnNldCgwLCAwLCAwLCAxLjApO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHByZW11bHRpcGxpZWRBbHBoYSkge1xyXG4gICAgICAgICAgICBkYXJrQ29sb3IuciA9IHNsb3QuZGFya0NvbG9yLnIgKiBmaW5hbENvbG9yLmE7XHJcbiAgICAgICAgICAgIGRhcmtDb2xvci5nID0gc2xvdC5kYXJrQ29sb3IuZyAqIGZpbmFsQ29sb3IuYTtcclxuICAgICAgICAgICAgZGFya0NvbG9yLmIgPSBzbG90LmRhcmtDb2xvci5iICogZmluYWxDb2xvci5hO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGFya0NvbG9yLnNldEZyb21Db2xvcihzbG90LmRhcmtDb2xvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXJrQ29sb3IuYSA9IHByZW11bHRpcGxpZWRBbHBoYSA/IDEuMCA6IDAuMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNsb3RCbGVuZE1vZGUgPSBzbG90LmRhdGEuYmxlbmRNb2RlO1xyXG4gICAgICAgIGlmIChzbG90QmxlbmRNb2RlICE9IGJsZW5kTW9kZSkge1xyXG4gICAgICAgICAgYmxlbmRNb2RlID0gc2xvdEJsZW5kTW9kZTtcclxuICAgICAgICAgIGJhdGNoZXIuc2V0QmxlbmRNb2RlKFxyXG4gICAgICAgICAgICBXZWJHTEJsZW5kTW9kZUNvbnZlcnRlci5nZXRTb3VyY2VHTEJsZW5kTW9kZShcclxuICAgICAgICAgICAgICBibGVuZE1vZGUsXHJcbiAgICAgICAgICAgICAgcHJlbXVsdGlwbGllZEFscGhhXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIFdlYkdMQmxlbmRNb2RlQ29udmVydGVyLmdldERlc3RHTEJsZW5kTW9kZShibGVuZE1vZGUpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2xpcHBlci5pc0NsaXBwaW5nKCkpIHtcclxuICAgICAgICAgIGNsaXBwZXIuY2xpcFRyaWFuZ2xlcyhcclxuICAgICAgICAgICAgcmVuZGVyYWJsZS52ZXJ0aWNlcyxcclxuICAgICAgICAgICAgcmVuZGVyYWJsZS5udW1GbG9hdHMsXHJcbiAgICAgICAgICAgIHRyaWFuZ2xlcyxcclxuICAgICAgICAgICAgdHJpYW5nbGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgdXZzLFxyXG4gICAgICAgICAgICBmaW5hbENvbG9yLFxyXG4gICAgICAgICAgICBkYXJrQ29sb3IsXHJcbiAgICAgICAgICAgIHR3b0NvbG9yVGludFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGxldCBjbGlwcGVkVmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNsaXBwZXIuY2xpcHBlZFZlcnRpY2VzKTtcclxuICAgICAgICAgIGxldCBjbGlwcGVkVHJpYW5nbGVzID0gY2xpcHBlci5jbGlwcGVkVHJpYW5nbGVzO1xyXG4gICAgICAgICAgaWYgKHRoaXMudmVydGV4RWZmZWN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IHZlcnRleEVmZmVjdCA9IHRoaXMudmVydGV4RWZmZWN0O1xyXG4gICAgICAgICAgICBsZXQgdmVydHMgPSBjbGlwcGVkVmVydGljZXM7XHJcbiAgICAgICAgICAgIGlmICghdHdvQ29sb3JUaW50KSB7XHJcbiAgICAgICAgICAgICAgZm9yIChcclxuICAgICAgICAgICAgICAgIGxldCB2ID0gMCwgbiA9IGNsaXBwZWRWZXJ0aWNlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB2IDwgbjtcclxuICAgICAgICAgICAgICAgIHYgKz0gdmVydGV4U2l6ZVxyXG4gICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGVtcFBvcy54ID0gdmVydHNbdl07XHJcbiAgICAgICAgICAgICAgICB0ZW1wUG9zLnkgPSB2ZXJ0c1t2ICsgMV07XHJcbiAgICAgICAgICAgICAgICB0ZW1wTGlnaHQuc2V0KFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMl0sXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAzXSxcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDRdLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgNV1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wVXYueCA9IHZlcnRzW3YgKyA2XTtcclxuICAgICAgICAgICAgICAgIHRlbXBVdi55ID0gdmVydHNbdiArIDddO1xyXG4gICAgICAgICAgICAgICAgdGVtcERhcmsuc2V0KDAsIDAsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgdmVydGV4RWZmZWN0LnRyYW5zZm9ybSh0ZW1wUG9zLCB0ZW1wVXYsIHRlbXBMaWdodCwgdGVtcERhcmspO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdl0gPSB0ZW1wUG9zLng7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMV0gPSB0ZW1wUG9zLnk7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMl0gPSB0ZW1wTGlnaHQucjtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAzXSA9IHRlbXBMaWdodC5nO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDRdID0gdGVtcExpZ2h0LmI7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgNV0gPSB0ZW1wTGlnaHQuYTtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA2XSA9IHRlbXBVdi54O1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDddID0gdGVtcFV2Lnk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGZvciAoXHJcbiAgICAgICAgICAgICAgICBsZXQgdiA9IDAsIG4gPSBjbGlwcGVkVmVydGljZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgdiA8IG47XHJcbiAgICAgICAgICAgICAgICB2ICs9IHZlcnRleFNpemVcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRlbXBQb3MueCA9IHZlcnRzW3ZdO1xyXG4gICAgICAgICAgICAgICAgdGVtcFBvcy55ID0gdmVydHNbdiArIDFdO1xyXG4gICAgICAgICAgICAgICAgdGVtcExpZ2h0LnNldChcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDJdLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgM10sXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA0XSxcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDVdXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGVtcFV2LnggPSB2ZXJ0c1t2ICsgNl07XHJcbiAgICAgICAgICAgICAgICB0ZW1wVXYueSA9IHZlcnRzW3YgKyA3XTtcclxuICAgICAgICAgICAgICAgIHRlbXBEYXJrLnNldChcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDhdLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgOV0sXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAxMF0sXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAxMV1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhFZmZlY3QudHJhbnNmb3JtKHRlbXBQb3MsIHRlbXBVdiwgdGVtcExpZ2h0LCB0ZW1wRGFyayk7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2XSA9IHRlbXBQb3MueDtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAxXSA9IHRlbXBQb3MueTtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAyXSA9IHRlbXBMaWdodC5yO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDNdID0gdGVtcExpZ2h0Lmc7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgNF0gPSB0ZW1wTGlnaHQuYjtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA1XSA9IHRlbXBMaWdodC5hO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDZdID0gdGVtcFV2Lng7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgN10gPSB0ZW1wVXYueTtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA4XSA9IHRlbXBEYXJrLnI7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgOV0gPSB0ZW1wRGFyay5nO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDEwXSA9IHRlbXBEYXJrLmI7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMTFdID0gdGVtcERhcmsuYTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgIC