UNPKG

ngx-spine

Version:

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

508 lines 40.1 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 { ManagedWebGLRenderingContext } from "./WebGL"; var Shader = /** @class */ (function () { function Shader(context, vertexShader, fragmentShader) { this.vertexShader = vertexShader; this.fragmentShader = fragmentShader; this.vs = null; this.fs = null; this.program = null; this.tmp2x2 = new Float32Array(2 * 2); this.tmp3x3 = new Float32Array(3 * 3); this.tmp4x4 = new Float32Array(4 * 4); this.vsSource = vertexShader; this.fsSource = fragmentShader; this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); this.context.addRestorable(this); this.compile(); } /** * @return {?} */ Shader.prototype.getProgram = /** * @return {?} */ function () { return this.program; }; /** * @return {?} */ Shader.prototype.getVertexShader = /** * @return {?} */ function () { return this.vertexShader; }; /** * @return {?} */ Shader.prototype.getFragmentShader = /** * @return {?} */ function () { return this.fragmentShader; }; /** * @return {?} */ Shader.prototype.getVertexShaderSource = /** * @return {?} */ function () { return this.vsSource; }; /** * @return {?} */ Shader.prototype.getFragmentSource = /** * @return {?} */ function () { return this.fsSource; }; /** * @private * @return {?} */ Shader.prototype.compile = /** * @private * @return {?} */ function () { /** @type {?} */ var gl = this.context.gl; try { this.vs = this.compileShader(gl.VERTEX_SHADER, this.vertexShader); this.fs = this.compileShader(gl.FRAGMENT_SHADER, this.fragmentShader); this.program = this.compileProgram(this.vs, this.fs); } catch (e) { this.dispose(); throw e; } }; /** * @private * @param {?} type * @param {?} source * @return {?} */ Shader.prototype.compileShader = /** * @private * @param {?} type * @param {?} source * @return {?} */ function (type, source) { /** @type {?} */ var gl = this.context.gl; /** @type {?} */ var shader = gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { /** @type {?} */ var error = "Couldn't compile shader: " + gl.getShaderInfoLog(shader); gl.deleteShader(shader); if (!gl.isContextLost()) throw new Error(error); } return shader; }; /** * @private * @param {?} vs * @param {?} fs * @return {?} */ Shader.prototype.compileProgram = /** * @private * @param {?} vs * @param {?} fs * @return {?} */ function (vs, fs) { /** @type {?} */ var gl = this.context.gl; /** @type {?} */ var program = gl.createProgram(); gl.attachShader(program, vs); gl.attachShader(program, fs); gl.linkProgram(program); if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { /** @type {?} */ var error = "Couldn't compile shader program: " + gl.getProgramInfoLog(program); gl.deleteProgram(program); if (!gl.isContextLost()) throw new Error(error); } return program; }; /** * @return {?} */ Shader.prototype.restore = /** * @return {?} */ function () { this.compile(); }; /** * @return {?} */ Shader.prototype.bind = /** * @return {?} */ function () { this.context.gl.useProgram(this.program); }; /** * @return {?} */ Shader.prototype.unbind = /** * @return {?} */ function () { this.context.gl.useProgram(null); }; /** * @param {?} uniform * @param {?} value * @return {?} */ Shader.prototype.setUniformi = /** * @param {?} uniform * @param {?} value * @return {?} */ function (uniform, value) { this.context.gl.uniform1i(this.getUniformLocation(uniform), value); }; /** * @param {?} uniform * @param {?} value * @return {?} */ Shader.prototype.setUniformf = /** * @param {?} uniform * @param {?} value * @return {?} */ function (uniform, value) { this.context.gl.uniform1f(this.getUniformLocation(uniform), value); }; /** * @param {?} uniform * @param {?} value * @param {?} value2 * @return {?} */ Shader.prototype.setUniform2f = /** * @param {?} uniform * @param {?} value * @param {?} value2 * @return {?} */ function (uniform, value, value2) { this.context.gl.uniform2f(this.getUniformLocation(uniform), value, value2); }; /** * @param {?} uniform * @param {?} value * @param {?} value2 * @param {?} value3 * @return {?} */ Shader.prototype.setUniform3f = /** * @param {?} uniform * @param {?} value * @param {?} value2 * @param {?} value3 * @return {?} */ function (uniform, value, value2, value3) { this.context.gl.uniform3f(this.getUniformLocation(uniform), value, value2, value3); }; /** * @param {?} uniform * @param {?} value * @param {?} value2 * @param {?} value3 * @param {?} value4 * @return {?} */ Shader.prototype.setUniform4f = /** * @param {?} uniform * @param {?} value * @param {?} value2 * @param {?} value3 * @param {?} value4 * @return {?} */ function (uniform, value, value2, value3, value4) { this.context.gl.uniform4f(this.getUniformLocation(uniform), value, value2, value3, value4); }; /** * @param {?} uniform * @param {?} value * @return {?} */ Shader.prototype.setUniform2x2f = /** * @param {?} uniform * @param {?} value * @return {?} */ function (uniform, value) { /** @type {?} */ var gl = this.context.gl; this.tmp2x2.set(value); gl.uniformMatrix2fv(this.getUniformLocation(uniform), false, this.tmp2x2); }; /** * @param {?} uniform * @param {?} value * @return {?} */ Shader.prototype.setUniform3x3f = /** * @param {?} uniform * @param {?} value * @return {?} */ function (uniform, value) { /** @type {?} */ var gl = this.context.gl; this.tmp3x3.set(value); gl.uniformMatrix3fv(this.getUniformLocation(uniform), false, this.tmp3x3); }; /** * @param {?} uniform * @param {?} value * @return {?} */ Shader.prototype.setUniform4x4f = /** * @param {?} uniform * @param {?} value * @return {?} */ function (uniform, value) { /** @type {?} */ var gl = this.context.gl; this.tmp4x4.set(value); gl.uniformMatrix4fv(this.getUniformLocation(uniform), false, this.tmp4x4); }; /** * @param {?} uniform * @return {?} */ Shader.prototype.getUniformLocation = /** * @param {?} uniform * @return {?} */ function (uniform) { /** @type {?} */ var gl = this.context.gl; /** @type {?} */ var location = gl.getUniformLocation(this.program, uniform); if (!location && !gl.isContextLost()) throw new Error("Couldn't find location for uniform " + uniform); return location; }; /** * @param {?} attribute * @return {?} */ Shader.prototype.getAttributeLocation = /** * @param {?} attribute * @return {?} */ function (attribute) { /** @type {?} */ var gl = this.context.gl; /** @type {?} */ var location = gl.getAttribLocation(this.program, attribute); if (location == -1 && !gl.isContextLost()) throw new Error("Couldn't find location for attribute " + attribute); return location; }; /** * @return {?} */ Shader.prototype.dispose = /** * @return {?} */ function () { this.context.removeRestorable(this); /** @type {?} */ var gl = this.context.gl; if (this.vs) { gl.deleteShader(this.vs); this.vs = null; } if (this.fs) { gl.deleteShader(this.fs); this.fs = null; } if (this.program) { gl.deleteProgram(this.program); this.program = null; } }; /** * @param {?} context * @return {?} */ Shader.newColoredTextured = /** * @param {?} context * @return {?} */ function (context) { /** @type {?} */ var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tattribute vec2 " + Shader.TEXCOORDS + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_color;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_color = " + Shader.COLOR + ";\n\t\t\t\t\tv_texCoords = " + Shader.TEXCOORDS + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t"; /** @type {?} */ var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_color;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tuniform sampler2D u_texture;\n\t\t\t\tvoid main () {\n\t\t\t\t\tgl_FragColor = v_color * texture2D(u_texture, v_texCoords);\n\t\t\t\t}\n\t\t\t"; return new Shader(context, vs, fs); }; /** * @param {?} context * @return {?} */ Shader.newTwoColoredTextured = /** * @param {?} context * @return {?} */ function (context) { /** @type {?} */ var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR2 + ";\n\t\t\t\tattribute vec2 " + Shader.TEXCOORDS + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_light;\n\t\t\t\tvarying vec4 v_dark;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_light = " + Shader.COLOR + ";\n\t\t\t\t\tv_dark = " + Shader.COLOR2 + ";\n\t\t\t\t\tv_texCoords = " + Shader.TEXCOORDS + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t"; /** @type {?} */ var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_light;\n\t\t\t\tvarying LOWP vec4 v_dark;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tuniform sampler2D u_texture;\n\t\t\t\tvoid main () {\n\t\t\t\t\tvec4 texColor = texture2D(u_texture, v_texCoords);\n\t\t\t\t\tgl_FragColor.a = texColor.a * v_light.a;\n\t\t\t\t\tgl_FragColor.rgb = ((texColor.a - 1.0) * v_dark.a + 1.0 - texColor.rgb) * v_dark.rgb + texColor.rgb * v_light.rgb;\n\t\t\t\t}\n\t\t\t"; return new Shader(context, vs, fs); }; /** * @param {?} context * @return {?} */ Shader.newColored = /** * @param {?} context * @return {?} */ function (context) { /** @type {?} */ var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_color;\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_color = " + Shader.COLOR + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t"; /** @type {?} */ var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_color;\n\t\t\t\tvoid main () {\n\t\t\t\t\tgl_FragColor = v_color;\n\t\t\t\t}\n\t\t\t"; return new Shader(context, vs, fs); }; Shader.MVP_MATRIX = "u_projTrans"; Shader.POSITION = "a_position"; Shader.COLOR = "a_color"; Shader.COLOR2 = "a_color2"; Shader.TEXCOORDS = "a_texCoords"; Shader.SAMPLER = "u_texture"; return Shader; }()); export { Shader }; if (false) { /** @type {?} */ Shader.MVP_MATRIX; /** @type {?} */ Shader.POSITION; /** @type {?} */ Shader.COLOR; /** @type {?} */ Shader.COLOR2; /** @type {?} */ Shader.TEXCOORDS; /** @type {?} */ Shader.SAMPLER; /** * @type {?} * @private */ Shader.prototype.context; /** * @type {?} * @private */ Shader.prototype.vs; /** * @type {?} * @private */ Shader.prototype.vsSource; /** * @type {?} * @private */ Shader.prototype.fs; /** * @type {?} * @private */ Shader.prototype.fsSource; /** * @type {?} * @private */ Shader.prototype.program; /** * @type {?} * @private */ Shader.prototype.tmp2x2; /** * @type {?} * @private */ Shader.prototype.tmp3x3; /** * @type {?} * @private */ Shader.prototype.tmp4x4; /** * @type {?} * @private */ Shader.prototype.vertexShader; /** * @type {?} * @private */ Shader.prototype.fragmentShader; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhZGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL3dlYmdsL1NoYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThCQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdkQ7SUErQkUsZ0JBQ0UsT0FBNkQsRUFDckQsWUFBb0IsRUFDcEIsY0FBc0I7UUFEdEIsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUExQnhCLE9BQUUsR0FBZ0IsSUFBSSxDQUFDO1FBRXZCLE9BQUUsR0FBZ0IsSUFBSSxDQUFDO1FBRXZCLFlBQU8sR0FBaUIsSUFBSSxDQUFDO1FBQzdCLFdBQU0sR0FBaUIsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLFdBQU0sR0FBaUIsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLFdBQU0sR0FBaUIsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBcUJyRCxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTztZQUNWLE9BQU8sWUFBWSw0QkFBNEI7Z0JBQzdDLENBQUMsQ0FBQyxPQUFPO2dCQUNULENBQUMsQ0FBQyxJQUFJLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDOzs7O0lBNUJNLDJCQUFVOzs7SUFBakI7UUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FB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QyxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7O0lBQ2EsaUJBQVU7Ozs7SUFBeEIsVUFDRSxPQUE2RDs7WUFFekQsRUFBRSxHQUFHLDhCQUNRLE1BQU0sQ0FBQyxRQUFRLGtDQUNmLE1BQU0sQ0FBQyxLQUFLLGdDQUNkLE1BQU0sQ0FBQyxVQUFVLHNGQUduQixNQUFNLENBQUMsS0FBSyxtQ0FDUixNQUFNLENBQUMsVUFBVSxXQUFNLE1BQU0sQ0FBQyxRQUFRLHlCQUV2RDs7WUFDSSxFQUFFLEdBQUcsa1FBV1Q7UUFDQSxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQTVRYSxpQkFBVSxHQUFHLGFBQWEsQ0FBQztJQUMzQixlQUFRLEdBQUcsWUFBWSxDQUFDO0lBQ3hCLFlBQUssR0FBRyxTQUFTLENBQUM7SUFDbEIsYUFBTSxHQUFHLFVBQVUsQ0FBQztJQUNwQixnQkFBUyxHQUFHLGFBQWEsQ0FBQztJQUMxQixjQUFPLEdBQUcsV0FBVyxDQUFDO0lBd1F0QyxhQUFDO0NBQUEsQUE5UUQsSUE4UUM7U0E5UVksTUFBTTs7O0lBQ2pCLGtCQUF5Qzs7SUFDekMsZ0JBQXNDOztJQUN0QyxhQUFnQzs7SUFDaEMsY0FBa0M7O0lBQ2xDLGlCQUF3Qzs7SUFDeEMsZUFBb0M7Ozs7O0lBQ3BDLHlCQUE4Qzs7Ozs7SUFDOUMsb0JBQStCOzs7OztJQUMvQiwwQkFBeUI7Ozs7O0lBQ3pCLG9CQUErQjs7Ozs7SUFDL0IsMEJBQXlCOzs7OztJQUN6Qix5QkFBcUM7Ozs7O0lBQ3JDLHdCQUF1RDs7Ozs7SUFDdkQsd0JBQXVEOzs7OztJQUN2RCx3QkFBdUQ7Ozs7O0lBa0JyRCw4QkFBNEI7Ozs7O0lBQzVCLGdDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgRGlzcG9zYWJsZSwgUmVzdG9yYWJsZSB9IGZyb20gXCIuLi9jb3JlL1V0aWxzXCI7XHJcbmltcG9ydCB7IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQgfSBmcm9tIFwiLi9XZWJHTFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNoYWRlciBpbXBsZW1lbnRzIERpc3Bvc2FibGUsIFJlc3RvcmFibGUge1xyXG4gIHB1YmxpYyBzdGF0aWMgTVZQX01BVFJJWCA9IFwidV9wcm9qVHJhbnNcIjtcclxuICBwdWJsaWMgc3RhdGljIFBPU0lUSU9OID0gXCJhX3Bvc2l0aW9uXCI7XHJcbiAgcHVibGljIHN0YXRpYyBDT0xPUiA9IFwiYV9jb2xvclwiO1xyXG4gIHB1YmxpYyBzdGF0aWMgQ09MT1IyID0gXCJhX2NvbG9yMlwiO1xyXG4gIHB1YmxpYyBzdGF0aWMgVEVYQ09PUkRTID0gXCJhX3RleENvb3Jkc1wiO1xyXG4gIHB1YmxpYyBzdGF0aWMgU0FNUExFUiA9IFwidV90ZXh0dXJlXCI7XHJcbiAgcHJpdmF0ZSBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xyXG4gIHByaXZhdGUgdnM6IFdlYkdMU2hhZGVyID0gbnVsbDtcclxuICBwcml2YXRlIHZzU291cmNlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBmczogV2ViR0xTaGFkZXIgPSBudWxsO1xyXG4gIHByaXZhdGUgZnNTb3VyY2U6IHN0cmluZztcclxuICBwcml2YXRlIHByb2dyYW06IFdlYkdMUHJvZ3JhbSA9IG51bGw7XHJcbiAgcHJpdmF0ZSB0bXAyeDI6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMiAqIDIpO1xyXG4gIHByaXZhdGUgdG1wM3gzOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDMgKiAzKTtcclxuICBwcml2YXRlIHRtcDR4NDogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSg0ICogNCk7XHJcbiAgcHVibGljIGdldFByb2dyYW0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0VmVydGV4U2hhZGVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudmVydGV4U2hhZGVyO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0RnJhZ21lbnRTaGFkZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mcmFnbWVudFNoYWRlcjtcclxuICB9XHJcbiAgcHVibGljIGdldFZlcnRleFNoYWRlclNvdXJjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnZzU291cmNlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0RnJhZ21lbnRTb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mc1NvdXJjZTtcclxuICB9XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0IHwgV2ViR0xSZW5kZXJpbmdDb250ZXh0LFxyXG4gICAgcHJpdmF0ZSB2ZXJ0ZXhTaGFkZXI6IHN0cmluZyxcclxuICAgIHByaXZhdGUgZnJhZ21lbnRTaGFkZXI6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgdGhpcy52c1NvdXJjZSA9IHZlcnRleFNoYWRlcjtcclxuICAgIHRoaXMuZnNTb3VyY2UgPSBmcmFnbWVudFNoYWRlcjtcclxuICAgIHRoaXMuY29udGV4dCA9XHJcbiAgICAgIGNvbnRleHQgaW5zdGFuY2VvZiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0XHJcbiAgICAgICAgPyBjb250ZXh0XHJcbiAgICAgICAgOiBuZXcgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dChjb250ZXh0KTtcclxuICAgIHRoaXMuY29udGV4dC5hZGRSZXN0b3JhYmxlKHRoaXMpO1xyXG4gICAgdGhpcy5jb21waWxlKCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgY29tcGlsZSgpIHtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMudnMgPSB0aGlzLmNvbXBpbGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUiwgdGhpcy52ZXJ0ZXhTaGFkZXIpO1xyXG4gICAgICB0aGlzLmZzID0gdGhpcy5jb21waWxlU2hhZGVyKGdsLkZSQUdNRU5UX1NIQURFUiwgdGhpcy5mcmFnbWVudFNoYWRlcik7XHJcbiAgICAgIHRoaXMucHJvZ3JhbSA9IHRoaXMuY29tcGlsZVByb2dyYW0odGhpcy52cywgdGhpcy5mcyk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMuZGlzcG9zZSgpO1xyXG4gICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGNvbXBpbGVTaGFkZXIodHlwZTogbnVtYmVyLCBzb3VyY2U6IHN0cmluZykge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgbGV0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKTtcclxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSk7XHJcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XHJcbiAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xyXG4gICAgICBsZXQgZXJyb3IgPSBcIkNvdWxkbid0IGNvbXBpbGUgc2hhZGVyOiBcIiArIGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKTtcclxuICAgICAgZ2wuZGVsZXRlU2hhZGVyKHNoYWRlcik7XHJcbiAgICAgIGlmICghZ2wuaXNDb250ZXh0TG9zdCgpKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNoYWRlcjtcclxuICB9XHJcbiAgcHJpdmF0ZSBjb21waWxlUHJvZ3JhbSh2czogV2ViR0xTaGFkZXIsIGZzOiBXZWJHTFNoYWRlcikge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgbGV0IHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XHJcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdnMpO1xyXG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZzKTtcclxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xyXG4gICAgaWYgKCFnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkge1xyXG4gICAgICBsZXQgZXJyb3IgPVxyXG4gICAgICAgIFwiQ291bGRuJ3QgY29tcGlsZSBzaGFkZXIgcHJvZ3JhbTogXCIgKyBnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKTtcclxuICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTtcclxuICAgICAgaWYgKCFnbC5pc0NvbnRleHRMb3N0KCkpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvZ3JhbTtcclxuICB9XHJcbiAgcmVzdG9yZSgpIHtcclxuICAgIHRoaXMuY29tcGlsZSgpO1xyXG4gIH1cclxuICBwdWJsaWMgYmluZCgpIHtcclxuICAgIHRoaXMuY29udGV4dC5nbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgfVxyXG4gIHB1YmxpYyB1bmJpbmQoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQuZ2wudXNlUHJvZ3JhbShudWxsKTtcclxuICB9XHJcbiAgcHVibGljIHNldFVuaWZvcm1pKHVuaWZvcm06IHN0cmluZywgdmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb250ZXh0LmdsLnVuaWZvcm0xaSh0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtKSwgdmFsdWUpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0VW5pZm9ybWYodW5pZm9ybTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmNvbnRleHQuZ2wudW5pZm9ybTFmKHRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9uKHVuaWZvcm0pLCB2YWx1ZSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXRVbmlmb3JtMmYodW5pZm9ybTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyLCB2YWx1ZTI6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb250ZXh0LmdsLnVuaWZvcm0yZih0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtKSwgdmFsdWUsIHZhbHVlMik7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXRVbmlmb3JtM2YoXHJcbiAgICB1bmlmb3JtOiBzdHJpbmcsXHJcbiAgICB2YWx1ZTogbnVtYmVyLFxyXG4gICAgdmFsdWUyOiBudW1iZXIsXHJcbiAgICB2YWx1ZTM6IG51bWJlclxyXG4gICkge1xyXG4gICAgdGhpcy5jb250ZXh0LmdsLnVuaWZvcm0zZihcclxuICAgICAgdGhpcy5nZXRVbmlmb3JtTG9jYXRpb24odW5pZm9ybSksXHJcbiAgICAgIHZhbHVlLFxyXG4gICAgICB2YWx1ZTIsXHJcbiAgICAgIHZhbHVlM1xyXG4gICAgKTtcclxuICB9XHJcbiAgcHVibGljIHNldFVuaWZvcm00ZihcclxuICAgIHVuaWZvcm06IHN0cmluZyxcclxuICAgIHZhbHVlOiBudW1iZXIsXHJcbiAgICB2YWx1ZTI6IG51bWJlcixcclxuICAgIHZhbHVlMzogbnVtYmVyLFxyXG4gICAgdmFsdWU0OiBudW1iZXJcclxuICApIHtcclxuICAgIHRoaXMuY29udGV4dC5nbC51bmlmb3JtNGYoXHJcbiAgICAgIHRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9uKHVuaWZvcm0pLFxyXG4gICAgICB2YWx1ZSxcclxuICAgICAgdmFsdWUyLFxyXG4gICAgICB2YWx1ZTMsXHJcbiAgICAgIHZhbHVlNFxyXG4gICAgKTtcclxuICB9XHJcbiAgcHVibGljIHNldFVuaWZvcm0yeDJmKHVuaWZvcm06IHN0cmluZywgdmFsdWU6IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICB0aGlzLnRtcDJ4Mi5zZXQodmFsdWUpO1xyXG4gICAgZ2wudW5pZm9ybU1hdHJpeDJmdih0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtKSwgZmFsc2UsIHRoaXMudG1wMngyKTtcclxuICB9XHJcbiAgcHVibGljIHNldFVuaWZvcm0zeDNmKHVuaWZvcm06IHN0cmluZywgdmFsdWU6IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICB0aGlzLnRtcDN4My5zZXQodmFsdWUpO1xyXG4gICAgZ2wudW5pZm9ybU1hdHJpeDNmdih0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtKSwgZmFsc2UsIHRoaXMudG1wM3gzKTtcclxuICB9XHJcbiAgcHVibGljIHNldFVuaWZvcm00eDRmKHVuaWZvcm06IHN0cmluZywgdmFsdWU6IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICB0aGlzLnRtcDR4NC5zZXQodmFsdWUpO1xyXG4gICAgZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtKSwgZmFsc2UsIHRoaXMudG1wNHg0KTtcclxuICB9XHJcbiAgcHVibGljIGdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtOiBzdHJpbmcpOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBsZXQgbG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCB1bmlmb3JtKTtcclxuICAgIGlmICghbG9jYXRpb24gJiYgIWdsLmlzQ29udGV4dExvc3QoKSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGxvY2F0aW9uIGZvciB1bmlmb3JtICR7dW5pZm9ybX1gKTtcclxuICAgIHJldHVybiBsb2NhdGlvbjtcclxuICB9XHJcbiAgcHVibGljIGdldEF0dHJpYnV0ZUxvY2F0aW9uKGF0dHJpYnV0ZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGxldCBsb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgYXR0cmlidXRlKTtcclxuICAgIGlmIChsb2NhdGlvbiA9PSAtMSAmJiAhZ2wuaXNDb250ZXh0TG9zdCgpKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgbG9jYXRpb24gZm9yIGF0dHJpYnV0ZSAke2F0dHJpYnV0ZX1gKTtcclxuICAgIHJldHVybiBsb2NhdGlvbjtcclxuICB9XHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQucmVtb3ZlUmVzdG9yYWJsZSh0aGlzKTtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGlmICh0aGlzLnZzKSB7XHJcbiAgICAgIGdsLmRlbGV0ZVNoYWRlcih0aGlzLnZzKTtcclxuICAgICAgdGhpcy52cyA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mcykge1xyXG4gICAgICBnbC5kZWxldGVTaGFkZXIodGhpcy5mcyk7XHJcbiAgICAgIHRoaXMuZnMgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucHJvZ3JhbSkge1xyXG4gICAgICBnbC5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgbmV3Q29sb3JlZFRleHR1cmVkKFxyXG4gICAgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMUmVuZGVyaW5nQ29udGV4dFxyXG4gICk6IFNoYWRlciB7XHJcbiAgICBsZXQgdnMgPSBgXHJcblx0XHRcdFx0YXR0cmlidXRlIHZlYzQgJHtTaGFkZXIuUE9TSVRJT059O1xyXG5cdFx0XHRcdGF0dHJpYnV0ZSB2ZWM0ICR7U2hhZGVyLkNPTE9SfTtcclxuXHRcdFx0XHRhdHRyaWJ1dGUgdmVjMiAke1NoYWRlci5URVhDT09SRFN9O1xyXG5cdFx0XHRcdHVuaWZvcm0gbWF0NCAke1NoYWRlci5NVlBfTUFUUklYfTtcclxuXHRcdFx0XHR2YXJ5aW5nIHZlYzQgdl9jb2xvcjtcclxuXHRcdFx0XHR2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZHM7XHJcblx0XHRcdFx0dm9pZCBtYWluICgpIHtcclxuXHRcdFx0XHRcdHZfY29sb3IgPSAke1NoYWRlci5DT0xPUn07XHJcblx0XHRcdFx0XHR2X3RleENvb3JkcyA9ICR7U2hhZGVyLlRFWENPT1JEU307XHJcblx0XHRcdFx0XHRnbF9Qb3NpdGlvbiA9ICR7U2hhZGVyLk1WUF9NQVRSSVh9ICogJHtTaGFkZXIuUE9TSVRJT059O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0YDtcclxuICAgIGxldCBmcyA9IGBcclxuXHRcdFx0XHQjaWZkZWYgR0xfRVNcclxuXHRcdFx0XHRcdCNkZWZpbmUgTE9XUCBsb3dwXHJcblx0XHRcdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0XHQjZWxzZVxyXG5cdFx0XHRcdFx0I2RlZmluZSBMT1dQXHJcblx0XHRcdFx0I2VuZGlmXHJcblx0XHRcdFx0dmFyeWluZyBMT1dQIHZlYzQgdl9jb2xvcjtcclxuXHRcdFx0XHR2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZHM7XHJcblx0XHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xyXG5cdFx0XHRcdHZvaWQgbWFpbiAoKSB7XHJcblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB2X2NvbG9yICogdGV4dHVyZTJEKHVfdGV4dHVyZSwgdl90ZXhDb29yZHMpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0YDtcclxuICAgIHJldHVybiBuZXcgU2hhZGVyKGNvbnRleHQsIHZzLCBmcyk7XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgbmV3VHdvQ29sb3JlZFRleHR1cmVkKFxyXG4gICAgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMUmVuZGVyaW5nQ29udGV4dFxyXG4gICk6IFNoYWRlciB7XHJcbiAgICBsZXQgdnMgPSBgXHJcblx0XHRcdFx0YXR0cmlidXRlIHZlYzQgJHtTaGFkZXIuUE9TSVRJT059O1xyXG5cdFx0XHRcdGF0dHJpYnV0ZSB2ZWM0ICR7U2hhZGVyLkNPTE9SfTtcclxuXHRcdFx0XHRhdHRyaWJ1dGUgdmVjNCAke1NoYWRlci5DT0xPUjJ9O1xyXG5cdFx0XHRcdGF0dHJpYnV0ZSB2ZWMyICR7U2hhZGVyLlRFWENPT1JEU307XHJcblx0XHRcdFx0dW5pZm9ybSBtYXQ0ICR7U2hhZGVyLk1WUF9NQVRSSVh9O1xyXG5cdFx0XHRcdHZhcnlpbmcgdmVjNCB2X2xpZ2h0O1xyXG5cdFx0XHRcdHZhcnlpbmcgdmVjNCB2X2Rhcms7XHJcblx0XHRcdFx0dmFyeWluZyB2ZWMyIHZfdGV4Q29vcmRzO1xyXG5cdFx0XHRcdHZvaWQgbWFpbiAoKSB7XHJcblx0XHRcdFx0XHR2X2xpZ2h0ID0gJHtTaGFkZXIuQ09MT1J9O1xyXG5cdFx0XHRcdFx0dl9kYXJrID0gJHtTaGFkZXIuQ09MT1IyfTtcclxuXHRcdFx0XHRcdHZfdGV4Q29vcmRzID0gJHtTaGFkZXIuVEVYQ09PUkRTfTtcclxuXHRcdFx0XHRcdGdsX1Bvc2l0aW9uID0gJHtTaGFkZXIuTVZQX01BVFJJWH0gKiAke1NoYWRlci5QT1NJVElPTn07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRgO1xyXG4gICAgbGV0IGZzID0gYFxyXG5cdFx0XHRcdCNpZmRlZiBHTF9FU1xyXG5cdFx0XHRcdFx0I2RlZmluZSBMT1dQIGxvd3BcclxuXHRcdFx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5cdFx0XHRcdCNlbHNlXHJcblx0XHRcdFx0XHQjZGVmaW5lIExPV1BcclxuXHRcdFx0XHQjZW5kaWZcclxuXHRcdFx0XHR2YXJ5aW5nIExPV1AgdmVjNCB2X2xpZ2h0O1xyXG5cdFx0XHRcdHZhcnlpbmcgTE9XUCB2ZWM0IHZfZGFyaztcclxuXHRcdFx0XHR2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZHM7XHJcblx0XHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xyXG5cdFx0XHRcdHZvaWQgbWFpbiAoKSB7XHJcblx0XHRcdFx0XHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZTJEKHVfdGV4dHVyZSwgdl90ZXhDb29yZHMpO1xyXG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLmEgPSB0ZXhDb2xvci5hICogdl9saWdodC5hO1xyXG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiA9ICgodGV4Q29sb3IuYSAtIDEuMCkgKiB2X2RhcmsuYSArIDEuMCAtIHRleENvbG9yLnJnYikgKiB2X2RhcmsucmdiICsgdGV4Q29sb3IucmdiICogdl9saWdodC5yZ2I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRgO1xyXG4gICAgcmV0dXJuIG5ldyBTaGFkZXIoY29udGV4dCwgdnMsIGZzKTtcclxuICB9XHJcbiAgcHVibGljIHN0YXRpYyBuZXdDb2xvcmVkKFxyXG4gICAgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMUmVuZGVyaW5nQ29udGV4dFxyXG4gICk6IFNoYWRlciB7XHJcbiAgICBsZXQgdnMgPSBgXHJcblx0XHRcdFx0YXR0cmlidXRlIHZlYzQgJHtTaGFkZXIuUE9TSVRJT059O1xyXG5cdFx0XHRcdGF0dHJpYnV0ZSB2ZWM0ICR7U2hhZGVyLkNPTE9SfTtcclxuXHRcdFx0XHR1bmlmb3JtIG1hdDQgJHtTaGFkZXIuTVZQX01BVFJJWH07XHJcblx0XHRcdFx0dmFyeWluZyB2ZWM0IHZfY29sb3I7XHJcblx0XHRcdFx0dm9pZCBtYWluICgpIHtcclxuXHRcdFx0XHRcdHZfY29sb3IgPSAke1NoYWRlci5DT0xPUn07XHJcblx0XHRcdFx0XHRnbF9Qb3NpdGlvbiA9ICR7U2hhZGVyLk1WUF9NQVRSSVh9ICogJHtTaGFkZXIuUE9TSVRJT059O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0YDtcclxuICAgIGxldCBmcyA9IGBcclxuXHRcdFx0XHQjaWZkZWYgR0xfRVNcclxuXHRcdFx0XHRcdCNkZWZpbmUgTE9XUCBsb3dwXHJcblx0XHRcdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0XHQjZWxzZVxyXG5cdFx0XHRcdFx0I2RlZmluZSBMT1dQXHJcblx0XHRcdFx0I2VuZGlmXHJcblx0XHRcdFx0dmFyeWluZyBMT1dQIHZlYzQgdl9jb2xvcjtcclxuXHRcdFx0XHR2b2lkIG1haW4gKCkge1xyXG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdl9jb2xvcjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdGA7XHJcbiAgICByZXR1cm4gbmV3IFNoYWRlcihjb250ZXh0LCB2cywgZnMpO1xyXG4gIH1cclxufVxyXG4iXX0=