diff --git a/docs.json b/docs.json index 2d00334..d6623eb 100644 --- a/docs.json +++ b/docs.json @@ -1,17 +1,17 @@ [ { - "comment": "/**\n * @class Matrix\n * @classdesc Matrix applicative providing standard matrix operations\n * @summary The Matrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.\n * @hidecontructor\n * @see of\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n *\n */", + "comment": "/**\n * @class GpuMatrix\n * @classdesc GpuMatrix applicative providing standard matrix operations\n * @summary The GpuMatrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.\n * @hidecontructor\n * @see of\n * @example\n *\n * const gpu = new GPU()\n * const m = GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)\n *\n */", "meta": { - "filename": "matrix.js", - "lineno": 12, + "filename": "gpumatrix.js", + "lineno": 7, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "kind": "class", - "name": "Matrix", - "classdesc": "Matrix applicative providing standard matrix operations", - "summary": "The Matrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.", + "name": "GpuMatrix", + "classdesc": "GpuMatrix applicative providing standard matrix operations", + "summary": "The GpuMatrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.", "tags": [ { "originalTitle": "hidecontructor", @@ -23,416 +23,455 @@ "of" ], "examples": [ - "const m = Matrix.of([[1,2],[2,3],[4,5]])" + "const gpu = new GPU()\nconst m = GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)" ], - "longname": "Matrix", + "longname": "GpuMatrix", "scope": "global" }, { "comment": "", "meta": { "range": [ - 745, - 793 + 611, + 746 ], - "filename": "matrix.js", - "lineno": 23, - "columnno": 4, + "filename": "gpumatrix.js", + "lineno": 19, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000043", - "name": "Matrix", - "type": "FunctionExpression" - }, - "vars": { - "this.__value": null + "id": "astnode100000022", + "name": "GpuMatrix", + "type": "ClassDeclaration", + "paramnames": [ + "val", + "GPUJS" + ] } }, "undocumented": true, - "name": "Matrix", - "longname": "Matrix", - "kind": "function", - "scope": "global", - "params": [] + "name": "GpuMatrix", + "longname": "GpuMatrix", + "kind": "class", + "scope": "global" }, { "comment": "", "meta": { "range": [ - 773, - 791 + 646, + 744 ], - "filename": "matrix.js", - "lineno": 24, + "filename": "gpumatrix.js", + "lineno": 20, "columnno": 2, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000049", - "name": "this.__value", - "type": "Identifier", - "value": "val", - "paramnames": [] + "id": "astnode100000026", + "name": "GpuMatrix", + "type": "MethodDefinition", + "paramnames": [ + "val", + "GPUJS" + ] + }, + "vars": { + "": null } }, "undocumented": true, - "name": "__value", - "longname": "__value", - "kind": "member", - "scope": "global" + "name": "GpuMatrix", + "longname": "GpuMatrix", + "kind": "class", + "scope": "global", + "params": [] }, { - "comment": "/**\n * @memberOf Matrix\n * @property {string} type\n * @type {string}\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n * m.type === 'Matrix'\n */", + "comment": "", "meta": { "range": [ - 951, - 983 + 708, + 734 ], - "filename": "matrix.js", - "lineno": 36, - "columnno": 0, + "filename": "gpumatrix.js", + "lineno": 23, + "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000055", - "name": "Matrix.prototype.type", - "type": "Literal", - "value": "Matrix", + "id": "astnode100000039", + "name": "this.gpujs", + "type": "LogicalExpression", + "value": "", "paramnames": [] } }, - "memberof": "Matrix", - "properties": [ - { - "type": { - "names": [ - "string" - ] - }, - "name": "type" - } - ], - "type": { - "names": [ - "string" - ] - }, - "examples": [ - "const m = Matrix.of([[1,2],[2,3],[4,5]])\nm.type === 'Matrix'" - ], - "name": "type", - "longname": "Matrix#type", + "undocumented": true, + "name": "gpujs", + "longname": "GpuMatrix#gpujs", "kind": "member", + "memberof": "GpuMatrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @property {number} precision\n * @type {number}\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n * m.precision === 4\n */", + "comment": "/**\n * @memberOf GpuMatrix\n * @static\n * @function GpuMatrix.of\n * @desc Creates a GpuMatrix object and flattens the GpuMatrix\n * @param val {array|function} An array of arrays\n * @param GPUJS {Object}\n * @returns {GpuMatrix}\n * @example\n *\n * const m = GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)\n *\n */", "meta": { - "range": [ - 1144, - 1174 - ], - "filename": "matrix.js", - "lineno": 47, + "filename": "gpumatrix.js", + "lineno": 28, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100000063", - "name": "Matrix.prototype.precision", - "type": "Literal", - "value": 4, - "paramnames": [] - } + "code": {} }, - "memberof": "Matrix", - "properties": [ + "memberof": "GpuMatrix", + "scope": "static", + "kind": "function", + "name": "of", + "description": "Creates a GpuMatrix object and flattens the GpuMatrix", + "params": [ { "type": { "names": [ - "number" + "array", + "function" ] }, - "name": "precision" + "description": "An array of arrays", + "name": "val" + }, + { + "type": { + "names": [ + "Object" + ] + }, + "name": "GPUJS" } ], - "type": { - "names": [ - "number" - ] - }, - "examples": [ - "const m = Matrix.of([[1,2],[2,3],[4,5]])\nm.precision === 4" - ], - "name": "precision", - "longname": "Matrix#precision", - "kind": "member", - "scope": "instance" - }, - { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member setPrecision\n * @param precision {number} Set the number of decimals for rounding\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n * m.setPrecision(10)\n * m.precision === 10\n */", - "meta": { - "filename": "matrix.js", - "lineno": 49, - "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": {} - }, - "memberof": "Matrix", - "scope": "instance", - "kind": "member", - "name": "setPrecision", - "params": [ + "returns": [ { "type": { "names": [ - "number" + "GpuMatrix" ] - }, - "description": "Set the number of decimals for rounding", - "name": "precision" + } } ], "examples": [ - "const m = Matrix.of([[1,2],[2,3],[4,5]])\nm.setPrecision(10)\nm.precision === 10" + "const m = GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)" ], - "longname": "Matrix#setPrecision" + "longname": "GpuMatrix.of" }, { "comment": "", "meta": { "range": [ - 1414, - 1499 + 1049, + 1275 ], - "filename": "matrix.js", - "lineno": 60, + "filename": "gpumatrix.js", + "lineno": 41, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000071", - "name": "Matrix.prototype.setPrecision", + "id": "astnode100000047", + "name": "GpuMatrix.of", "type": "FunctionExpression", "paramnames": [ - "precision" + "val", + "GPUJS" ] }, "vars": { - "this.precision": "Matrix#setPrecision#precision" + "this.__value": "GpuMatrix.of#__value", + "this.gpujs": "GpuMatrix.of#gpujs" } }, "undocumented": true, - "name": "setPrecision", - "longname": "Matrix#setPrecision", + "name": "of", + "longname": "GpuMatrix.of", "kind": "function", - "memberof": "Matrix", + "memberof": "GpuMatrix", + "scope": "static" + }, + { + "comment": "", + "meta": { + "range": [ + 1177, + 1195 + ], + "filename": "gpumatrix.js", + "lineno": 44, + "columnno": 4, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100000069", + "name": "this.__value", + "type": "Identifier", + "value": "val", + "paramnames": [] + } + }, + "undocumented": true, + "name": "__value", + "longname": "GpuMatrix.of#__value", + "kind": "member", + "memberof": "GpuMatrix.of", "scope": "instance" }, { "comment": "", "meta": { "range": [ - 1471, - 1497 + 1200, + 1218 ], - "filename": "matrix.js", - "lineno": 61, - "columnno": 2, + "filename": "gpumatrix.js", + "lineno": 45, + "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000081", - "name": "this.precision", + "id": "astnode100000075", + "name": "this.gpujs", "type": "Identifier", - "value": "precision", + "value": "GPUJS", "paramnames": [] } }, "undocumented": true, - "name": "precision", - "longname": "Matrix#setPrecision#precision", + "name": "gpujs", + "longname": "GpuMatrix.of#gpujs", "kind": "member", - "memberof": "Matrix#setPrecision", + "memberof": "GpuMatrix.of", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member isSymmetric\n * @returns {boolean}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * true === A.isSymmetric()\n *\n */", + "comment": "/**\n * @memberOf GpuMatrix\n * @instance\n * @member gpuMap\n * @description Maps over the rows of the GpuMatrix using a map function using the GPU\n * @param f {function} An GPU.js enabled iterator function\n * @returns {GpuMatrix}\n * @example\n *\n * function gpuMapper (a) { return a[this.thread.y][this.thread.x] }\n * const m = GpuMatrix.of([[2, 2], [2, 2]], GPUJS)\n * m.gpuMap(gpuMapper)\n * // [Float32Array(2,2), Float32Array(2,2)]\n *\n *\n */", "meta": { - "filename": "matrix.js", - "lineno": 64, + "filename": "gpumatrix.js", + "lineno": 55, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, - "memberof": "Matrix", + "memberof": "GpuMatrix", "scope": "instance", "kind": "member", - "name": "isSymmetric", + "name": "gpuMap", + "description": "Maps over the rows of the GpuMatrix using a map function using the GPU", + "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "An GPU.js enabled iterator function", + "name": "f" + } + ], "returns": [ { "type": { "names": [ - "boolean" + "GpuMatrix" ] } } ], "examples": [ - "const A = Matrix.of([[1, 1], [1, 1]])\ntrue === A.isSymmetric()" + "function gpuMapper (a) { return a[this.thread.y][this.thread.x] }\nconst m = GpuMatrix.of([[2, 2], [2, 2]], GPUJS)\nm.gpuMap(gpuMapper)\n// [Float32Array(2,2), Float32Array(2,2)]" ], - "longname": "Matrix#isSymmetric" + "longname": "GpuMatrix#gpuMap" }, { "comment": "", "meta": { "range": [ - 1674, - 1810 + 1794, + 1898 ], - "filename": "matrix.js", - "lineno": 75, + "filename": "gpumatrix.js", + "lineno": 71, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000087", - "name": "Matrix.prototype.isSymmetric", + "id": "astnode100000088", + "name": "GpuMatrix.prototype.gpuMap", "type": "FunctionExpression", - "paramnames": [] - }, - "vars": { - "a": "Matrix#isSymmetric~a", - "b": "Matrix#isSymmetric~b" + "paramnames": [ + "f" + ] } }, "undocumented": true, - "name": "isSymmetric", - "longname": "Matrix#isSymmetric", + "name": "gpuMap", + "longname": "GpuMatrix#gpuMap", "kind": "function", - "memberof": "Matrix", + "memberof": "GpuMatrix", "scope": "instance" }, { - "comment": "", + "comment": "/**\n * @memberOf GpuMatrix\n * @static\n * @function gpuMap\n * @description Static function that maps over the rows of the GpuMatrix using a map function using the GPU\n * @param f {function} An GPU.js enabled iterator function\n * @param M {GpuMatrix|array} GpuMatrix or array to map\n * @returns {GpuMatrix}\n * @example\n *\n * function gpuMapper (a) { return a[this.thread.y][this.thread.x] }\n * const m = GpuMatrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]])\n * // [Float32Array(2,2), Float32Array(2,2)]\n *\n */", "meta": { - "range": [ - 1727, - 1743 - ], - "filename": "matrix.js", - "lineno": 76, - "columnno": 8, + "filename": "gpumatrix.js", + "lineno": 75, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100000096", - "name": "a", - "type": "MemberExpression", - "value": "this.__value" - } + "code": {} }, - "undocumented": true, - "name": "a", - "longname": "Matrix#isSymmetric~a", - "kind": "constant", - "memberof": "Matrix#isSymmetric", - "scope": "inner", - "params": [] + "memberof": "GpuMatrix", + "scope": "static", + "kind": "function", + "name": "gpuMap", + "description": "Static function that maps over the rows of the GpuMatrix using a map function using the GPU", + "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "An GPU.js enabled iterator function", + "name": "f" + }, + { + "type": { + "names": [ + "GpuMatrix", + "array" + ] + }, + "description": "GpuMatrix or array to map", + "name": "M" + } + ], + "returns": [ + { + "type": { + "names": [ + "GpuMatrix" + ] + } + } + ], + "examples": [ + "function gpuMapper (a) { return a[this.thread.y][this.thread.x] }\nconst m = GpuMatrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]])\n// [Float32Array(2,2), Float32Array(2,2)]" + ], + "longname": "GpuMatrix.gpuMap" }, { "comment": "", "meta": { "range": [ - 1752, - 1786 + 2407, + 2497 ], - "filename": "matrix.js", - "lineno": 77, - "columnno": 8, + "filename": "gpumatrix.js", + "lineno": 90, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000102", - "name": "b", - "type": "MemberExpression", - "value": ".__value" + "id": "astnode100000112", + "name": "GpuMatrix.gpuMap", + "type": "CallExpression", + "value": "", + "paramnames": [] } }, "undocumented": true, - "name": "b", - "longname": "Matrix#isSymmetric~b", - "kind": "constant", - "memberof": "Matrix#isSymmetric", - "scope": "inner", - "params": [] + "name": "gpuMap", + "longname": "GpuMatrix.gpuMap", + "kind": "member", + "memberof": "GpuMatrix", + "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member isSquare\n * @desc Boolean indicating whether this contains a square Matrix\n * @returns {boolean}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * true === A.isSquare()\n *\n */", + "comment": "/**\n * @memberOf GpuMatrix\n * @instance\n * @member gpuFold\n * @description Folds the rows of the GpuMatrix using a GPUS.js enqbled reduce function, using the GPU\n * @param f {function} An iterator function\n * @returns {GpuMatrix}\n * @example\n *\n * const m = GpuMatrix.of([[1, 1], [1, 1]])\n * m.map(x => x.map(y => y+ 1))\n * // [[2, 2], [2, 2]]\n *\n */", "meta": { - "filename": "matrix.js", - "lineno": 81, + "filename": "gpumatrix.js", + "lineno": 94, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, - "memberof": "Matrix", + "memberof": "GpuMatrix", "scope": "instance", "kind": "member", - "name": "isSquare", - "description": "Boolean indicating whether this contains a square Matrix", + "name": "gpuFold", + "description": "Folds the rows of the GpuMatrix using a GPUS.js enqbled reduce function, using the GPU", + "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "An iterator function", + "name": "f" + } + ], "returns": [ { "type": { "names": [ - "boolean" + "GpuMatrix" ] } } ], "examples": [ - "const A = Matrix.of([[1, 1], [1, 1]])\ntrue === A.isSquare()" + "const m = GpuMatrix.of([[1, 1], [1, 1]])\nm.map(x => x.map(y => y+ 1))\n// [[2, 2], [2, 2]]" ], - "longname": "Matrix#isSquare" + "longname": "GpuMatrix#gpuFold" }, { "comment": "", "meta": { "range": [ - 2045, - 2136 + 2850, + 2972 ], - "filename": "matrix.js", - "lineno": 93, + "filename": "gpumatrix.js", + "lineno": 108, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000117", - "name": "Matrix.prototype.isSquare", + "id": "astnode100000135", + "name": "GpuMatrix.prototype.gpuFold", "type": "FunctionExpression", - "paramnames": [] + "paramnames": [ + "f", + "output" + ] } }, "undocumented": true, - "name": "isSquare", - "longname": "Matrix#isSquare", + "name": "gpuFold", + "longname": "GpuMatrix#gpuFold", "kind": "function", - "memberof": "Matrix", + "memberof": "GpuMatrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member isOrthogonal\n * @param M {Matrix|array}\n * @returns {boolean}\n * @example\n *\n * const result = [[-0.3092, -0.9510], [-0.9510, 0.3092]]\n * const A = Matrix.fromArray(result)\n * true === A.isOrthogonal()\n */", + "comment": "/**\n * @memberOf GpuMatrix\n * @function GpuMatrix#gpuProduct\n * @param f\n * @param output\n * @param M\n * @returns {GpuMatrix}\n */", "meta": { - "filename": "matrix.js", - "lineno": 97, + "filename": "gpumatrix.js", + "lineno": 112, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, - "memberof": "Matrix", - "scope": "instance", - "kind": "member", - "name": "isOrthogonal", + "memberof": "GpuMatrix", + "kind": "function", + "name": "gpuProduct", "params": [ { - "type": { - "names": [ - "Matrix", - "array" - ] - }, + "name": "f" + }, + { + "name": "output" + }, + { "name": "M" } ], @@ -440,419 +479,473 @@ { "type": { "names": [ - "boolean" + "GpuMatrix" ] } } ], - "examples": [ - "const result = [[-0.3092, -0.9510], [-0.9510, 0.3092]]\nconst A = Matrix.fromArray(result)\ntrue === A.isOrthogonal()" - ], - "longname": "Matrix#isOrthogonal" + "longname": "GpuMatrix#gpuProduct", + "scope": "instance" }, { "comment": "", "meta": { "range": [ - 2393, - 2535 + 3104, + 3289 ], - "filename": "matrix.js", - "lineno": 109, + "filename": "gpumatrix.js", + "lineno": 120, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000137", - "name": "Matrix.prototype.isOrthogonal", + "id": "astnode100000161", + "name": "GpuMatrix.prototype.gpuProduct", "type": "FunctionExpression", - "paramnames": [] - }, - "vars": { - "AxAt": "Matrix#isOrthogonal~AxAt", - "I": "Matrix#isOrthogonal~I" + "paramnames": [ + "f", + "output", + "M" + ] } }, "undocumented": true, - "name": "isOrthogonal", - "longname": "Matrix#isOrthogonal", + "name": "gpuProduct", + "longname": "GpuMatrix#gpuProduct", "kind": "function", - "memberof": "Matrix", + "memberof": "GpuMatrix", "scope": "instance" }, { "comment": "", "meta": { "range": [ - 2447, - 2480 + 3291, + 3315 ], - "filename": "matrix.js", - "lineno": 110, - "columnno": 8, + "filename": "gpumatrix.js", + "lineno": 125, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000146", - "name": "AxAt", - "type": "CallExpression", - "value": "" + "id": "astnode100000190", + "name": "module.exports", + "type": "Identifier" } }, "undocumented": true, - "name": "AxAt", - "longname": "Matrix#isOrthogonal~AxAt", - "kind": "constant", - "memberof": "Matrix#isOrthogonal", - "scope": "inner", - "params": [] + "name": "exports", + "longname": "module.exports", + "kind": "member", + "memberof": "module", + "scope": "static" + }, + { + "comment": "/**\n * @class Matrix\n * @classdesc Matrix applicative providing standard matrix operations\n * @summary The Matrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.\n * @hidecontructor\n * @see of\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 15, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "kind": "class", + "name": "Matrix", + "classdesc": "Matrix applicative providing standard matrix operations", + "summary": "The Matrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.", + "tags": [ + { + "originalTitle": "hidecontructor", + "title": "hidecontructor", + "text": "" + } + ], + "see": [ + "of" + ], + "examples": [ + "const m = Matrix.of([[1,2],[2,3],[4,5]])" + ], + "longname": "Matrix", + "scope": "global" }, { "comment": "", "meta": { "range": [ - 2489, - 2508 + 854, + 959 ], "filename": "matrix.js", - "lineno": 111, - "columnno": 8, + "lineno": 26, + "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000157", - "name": "I", - "type": "CallExpression", - "value": "" + "id": "astnode100000247", + "name": "Matrix", + "type": "FunctionExpression" + }, + "vars": { + "this.__value": null, + "this.gpujs": null } }, "undocumented": true, - "name": "I", - "longname": "Matrix#isOrthogonal~I", - "kind": "constant", - "memberof": "Matrix#isOrthogonal", - "scope": "inner", + "name": "Matrix", + "longname": "Matrix", + "kind": "function", + "scope": "global", "params": [] }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member getCols\n * @returns {Number}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * A.getCols() === 2\n *\n */", + "comment": "", "meta": { + "range": [ + 889, + 907 + ], "filename": "matrix.js", - "lineno": 115, - "columnno": 0, + "lineno": 27, + "columnno": 2, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": {} + "code": { + "id": "astnode100000254", + "name": "this.__value", + "type": "Identifier", + "value": "val", + "paramnames": [] + } }, - "memberof": "Matrix", - "scope": "instance", + "undocumented": true, + "name": "__value", + "longname": "__value", "kind": "member", - "name": "getCols", - "returns": [ - { - "type": { - "names": [ - "Number" - ] - } - } - ], - "examples": [ - "const A = Matrix.of([[1, 1], [1, 1]])\nA.getCols() === 2" - ], - "longname": "Matrix#getCols" + "scope": "global" }, { "comment": "", "meta": { "range": [ - 2699, - 2773 + 927, + 953 ], "filename": "matrix.js", - "lineno": 126, - "columnno": 0, + "lineno": 29, + "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000169", - "name": "Matrix.prototype.getCols", - "type": "FunctionExpression", + "id": "astnode100000263", + "name": "this.gpujs", + "type": "LogicalExpression", + "value": "", "paramnames": [] } }, "undocumented": true, - "name": "getCols", - "longname": "Matrix#getCols", - "kind": "function", - "memberof": "Matrix", - "scope": "instance" + "name": "gpujs", + "longname": "gpujs", + "kind": "member", + "scope": "global" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member equals\n * @param M {Matrix|array}\n * @returns {Boolean}\n * @example\n *\n * var a = [[1, 1], [1, 1]]\n * var A = Matrix.of(a)\n * var B = Matrix.of(a)\n * true === A.equals(B)\n */", + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function of\n * @desc Creates a Matrix object and flattens the Matrix\n * @param val {array|function} An array of arrays\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 130, + "lineno": 33, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "scope": "instance", - "kind": "member", - "name": "equals", + "scope": "static", + "kind": "function", + "name": "of", + "description": "Creates a Matrix object and flattens the Matrix", "params": [ { "type": { "names": [ - "Matrix", - "array" + "array", + "function" ] }, - "name": "M" + "description": "An array of arrays", + "name": "val" } ], "returns": [ { "type": { "names": [ - "Boolean" + "Matrix" ] } } ], "examples": [ - "var a = [[1, 1], [1, 1]]\nvar A = Matrix.of(a)\nvar B = Matrix.of(a)\ntrue === A.equals(B)" + "const m = Matrix.of([[1,2],[2,3],[4,5]])" ], - "longname": "Matrix#equals" + "longname": "Matrix.of" }, { "comment": "", "meta": { "range": [ - 2999, - 3087 + 1207, + 1400 ], "filename": "matrix.js", - "lineno": 143, + "lineno": 45, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000186", - "name": "Matrix.prototype.equals", + "id": "astnode100000271", + "name": "Matrix.of", "type": "FunctionExpression", "paramnames": [ - "M" + "val" ] + }, + "vars": { + "this.__value": "Matrix.of#__value", + "this.gpujs": "Matrix.of#gpujs" } }, "undocumented": true, - "name": "equals", - "longname": "Matrix#equals", + "name": "of", + "longname": "Matrix.of", "kind": "function", "memberof": "Matrix", - "scope": "instance" + "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member getRows\n * @returns {Number}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * A.getRows() // 2\n */", + "comment": "", "meta": { + "range": [ + 1312, + 1330 + ], "filename": "matrix.js", - "lineno": 147, - "columnno": 0, + "lineno": 48, + "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": {} + "code": { + "id": "astnode100000290", + "name": "this.__value", + "type": "Identifier", + "value": "val", + "paramnames": [] + } }, - "memberof": "Matrix", - "scope": "instance", + "undocumented": true, + "name": "__value", + "longname": "Matrix.of#__value", "kind": "member", - "name": "getRows", - "returns": [ - { - "type": { - "names": [ - "Number" - ] - } - } - ], - "examples": [ - "const A = Matrix.of([[1, 1], [1, 1]])\nA.getRows() // 2" - ], - "longname": "Matrix#getRows" + "memberof": "Matrix.of", + "scope": "instance" }, { "comment": "", "meta": { "range": [ - 3247, - 3318 + 1335, + 1353 ], "filename": "matrix.js", - "lineno": 157, - "columnno": 0, + "lineno": 49, + "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000207", - "name": "Matrix.prototype.getRows", - "type": "FunctionExpression", + "id": "astnode100000296", + "name": "this.gpujs", + "type": "Identifier", + "value": "GPUJS", "paramnames": [] } }, "undocumented": true, - "name": "getRows", - "longname": "Matrix#getRows", - "kind": "function", - "memberof": "Matrix", + "name": "gpujs", + "longname": "Matrix.of#gpujs", + "kind": "member", + "memberof": "Matrix.of", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member getShape\n * @returns {Array}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * A.getShape() // [2, 2]\n */", + "comment": "/**\n * @memberOf Matrix\n * @property {string} type\n * @type {string}\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n * m.type === 'Matrix'\n */", "meta": { + "range": [ + 1558, + 1590 + ], "filename": "matrix.js", - "lineno": 161, + "lineno": 64, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": {} + "code": { + "id": "astnode100000308", + "name": "Matrix.prototype.type", + "type": "Literal", + "value": "Matrix", + "paramnames": [] + } }, "memberof": "Matrix", - "scope": "instance", - "kind": "member", - "name": "getShape", - "returns": [ + "properties": [ { "type": { "names": [ - "Array" + "string" ] - } + }, + "name": "type" } ], + "type": { + "names": [ + "string" + ] + }, "examples": [ - "const A = Matrix.of([[1, 1], [1, 1]])\nA.getShape() // [2, 2]" + "const m = Matrix.of([[1,2],[2,3],[4,5]])\nm.type === 'Matrix'" ], - "longname": "Matrix#getShape" + "name": "type", + "longname": "Matrix#type", + "kind": "member", + "scope": "instance" }, { - "comment": "", + "comment": "/**\n * @memberOf Matrix\n * @property {number} precision\n * @type {number}\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n * m.precision === 4\n */", "meta": { "range": [ - 3484, - 3569 + 1751, + 1781 ], "filename": "matrix.js", - "lineno": 171, + "lineno": 75, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000222", - "name": "Matrix.prototype.getShape", - "type": "FunctionExpression", + "id": "astnode100000316", + "name": "Matrix.prototype.precision", + "type": "Literal", + "value": 4, "paramnames": [] } }, - "undocumented": true, - "name": "getShape", - "longname": "Matrix#getShape", - "kind": "function", "memberof": "Matrix", + "properties": [ + { + "type": { + "names": [ + "number" + ] + }, + "name": "precision" + } + ], + "type": { + "names": [ + "number" + ] + }, + "examples": [ + "const m = Matrix.of([[1,2],[2,3],[4,5]])\nm.precision === 4" + ], + "name": "precision", + "longname": "Matrix#precision", + "kind": "member", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @static\n * @function of\n * @desc Creates a Matrix object and flattens the Matrix\n * @param val {array|function} An array of arrays\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member setPrecision\n * @param precision {number} Set the number of decimals for rounding\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n * m.setPrecision(10)\n * m.precision === 10\n */", "meta": { "filename": "matrix.js", - "lineno": 175, + "lineno": 77, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "scope": "static", - "kind": "function", - "name": "of", - "description": "Creates a Matrix object and flattens the Matrix", + "scope": "instance", + "kind": "member", + "name": "setPrecision", "params": [ { "type": { "names": [ - "array", - "function" + "number" ] }, - "description": "An array of arrays", - "name": "val" - } - ], - "returns": [ - { - "type": { - "names": [ - "Matrix" - ] - } + "description": "Set the number of decimals for rounding", + "name": "precision" } ], "examples": [ - "const m = Matrix.of([[1,2],[2,3],[4,5]])" + "const m = Matrix.of([[1,2],[2,3],[4,5]])\nm.setPrecision(10)\nm.precision === 10" ], - "longname": "Matrix.of" + "longname": "Matrix#setPrecision" }, { "comment": "", "meta": { "range": [ - 3817, - 3987 + 2021, + 2106 ], "filename": "matrix.js", - "lineno": 187, + "lineno": 88, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000241", - "name": "Matrix.of", + "id": "astnode100000324", + "name": "Matrix.prototype.setPrecision", "type": "FunctionExpression", "paramnames": [ - "val" + "precision" ] }, "vars": { - "this.__value": "Matrix.of#__value" + "this.precision": "Matrix#setPrecision#precision" } }, "undocumented": true, - "name": "of", - "longname": "Matrix.of", + "name": "setPrecision", + "longname": "Matrix#setPrecision", "kind": "function", "memberof": "Matrix", - "scope": "static" + "scope": "instance" }, { "comment": "", "meta": { "range": [ - 3922, - 3940 + 2078, + 2104 ], "filename": "matrix.js", - "lineno": 190, - "columnno": 4, + "lineno": 89, + "columnno": 2, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000260", - "name": "this.__value", + "id": "astnode100000334", + "name": "this.precision", "type": "Identifier", - "value": "val", + "value": "precision", "paramnames": [] } }, "undocumented": true, - "name": "__value", - "longname": "Matrix.of#__value", + "name": "precision", + "longname": "Matrix#setPrecision#precision", "kind": "member", - "memberof": "Matrix.of", + "memberof": "Matrix#setPrecision", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member map\n * @description Maps over the rows of the matrix using a map function\n * @param f {function} An iterator function\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.of([[1, 1], [1, 1]])\n * m.map(x => x.map(y => y+ 1))\n * // [[2, 2], [2, 2]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member isSymmetric\n * @returns {boolean}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * true === A.isSymmetric()\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 196, + "lineno": 92, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -860,140 +953,107 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "map", - "description": "Maps over the rows of the matrix using a map function", - "params": [ - { - "type": { - "names": [ - "function" - ] - }, - "description": "An iterator function", - "name": "f" - } - ], + "name": "isSymmetric", "returns": [ { "type": { "names": [ - "Matrix" + "boolean" ] } } ], "examples": [ - "const m = Matrix.of([[1, 1], [1, 1]])\nm.map(x => x.map(y => y+ 1))\n// [[2, 2], [2, 2]]" + "const A = Matrix.of([[1, 1], [1, 1]])\ntrue === A.isSymmetric()" ], - "longname": "Matrix#map" + "longname": "Matrix#isSymmetric" }, { "comment": "", "meta": { "range": [ - 4294, - 4374 + 2281, + 2417 ], "filename": "matrix.js", - "lineno": 210, + "lineno": 103, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000272", - "name": "Matrix.prototype.map", + "id": "astnode100000340", + "name": "Matrix.prototype.isSymmetric", "type": "FunctionExpression", - "paramnames": [ - "f" - ] + "paramnames": [] + }, + "vars": { + "a": "Matrix#isSymmetric~a", + "b": "Matrix#isSymmetric~b" } }, "undocumented": true, - "name": "map", - "longname": "Matrix#map", + "name": "isSymmetric", + "longname": "Matrix#isSymmetric", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @static\n * @function map\n * @description Static function that maps over the rows of the matrix using a map function\n * @param f {function} An iterator function\n * @param M {Matrix|array} Matrix or array to map\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.map(x= > x.map(y => y+ 1), [[1, 1], [1, 1]])\n * // [[2, 2], [2, 2]]\n *\n */", + "comment": "", "meta": { + "range": [ + 2334, + 2350 + ], "filename": "matrix.js", - "lineno": 214, - "columnno": 0, + "lineno": 104, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": {} - }, - "memberof": "Matrix", - "scope": "static", - "kind": "function", - "name": "map", - "description": "Static function that maps over the rows of the matrix using a map function", - "params": [ - { - "type": { - "names": [ - "function" - ] - }, - "description": "An iterator function", - "name": "f" - }, - { - "type": { - "names": [ - "Matrix", - "array" - ] - }, - "description": "Matrix or array to map", - "name": "M" - } - ], - "returns": [ - { - "type": { - "names": [ - "Matrix" - ] - } + "code": { + "id": "astnode100000349", + "name": "a", + "type": "MemberExpression", + "value": "this.__value" } - ], - "examples": [ - "const m = Matrix.map(x= > x.map(y => y+ 1), [[1, 1], [1, 1]])\n// [[2, 2], [2, 2]]" - ], - "longname": "Matrix.map" + }, + "undocumented": true, + "name": "a", + "longname": "Matrix#isSymmetric~a", + "kind": "constant", + "memberof": "Matrix#isSymmetric", + "scope": "inner", + "params": [] }, { "comment": "", "meta": { "range": [ - 4744, - 4812 + 2359, + 2393 ], "filename": "matrix.js", - "lineno": 228, - "columnno": 0, + "lineno": 105, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000294", - "name": "Matrix.map", - "type": "CallExpression", - "value": "", - "paramnames": [] + "id": "astnode100000355", + "name": "b", + "type": "MemberExpression", + "value": ".__value" } }, "undocumented": true, - "name": "map", - "longname": "Matrix.map", - "kind": "member", - "memberof": "Matrix", - "scope": "static" - }, - { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member fold\n * @description Reduce the matrix rows using a reduce function\n * @param f {function} A reduce/fold function\n * @returns {Matrix}\n * @example\n *\n * // Flatten Matrix\n * Matrix.of([[1, 1], [1, 1]]).fold((prev, next) => prev.concat(next))\n * // [1, 1, 1, 1]\n */", - "meta": { - "filename": "matrix.js", - "lineno": 232, + "name": "b", + "longname": "Matrix#isSymmetric~b", + "kind": "constant", + "memberof": "Matrix#isSymmetric", + "scope": "inner", + "params": [] + }, + { + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member isSquare\n * @desc Boolean indicating whether this contains a square Matrix\n * @returns {boolean}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * true === A.isSquare()\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 109, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1001,91 +1061,68 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "fold", - "description": "Reduce the matrix rows using a reduce function", - "params": [ - { - "type": { - "names": [ - "function" - ] - }, - "description": "A reduce/fold function", - "name": "f" - } - ], + "name": "isSquare", + "description": "Boolean indicating whether this contains a square Matrix", "returns": [ { "type": { "names": [ - "Matrix" + "boolean" ] } } ], "examples": [ - "// Flatten Matrix\nMatrix.of([[1, 1], [1, 1]]).fold((prev, next) => prev.concat(next))\n// [1, 1, 1, 1]" + "const A = Matrix.of([[1, 1], [1, 1]])\ntrue === A.isSquare()" ], - "longname": "Matrix#fold" + "longname": "Matrix#isSquare" }, { "comment": "", "meta": { "range": [ - 5127, - 5213 + 2652, + 2743 ], "filename": "matrix.js", - "lineno": 245, + "lineno": 121, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000315", - "name": "Matrix.prototype.fold", + "id": "astnode100000370", + "name": "Matrix.prototype.isSquare", "type": "FunctionExpression", - "paramnames": [ - "f" - ] + "paramnames": [] } }, "undocumented": true, - "name": "fold", - "longname": "Matrix#fold", + "name": "isSquare", + "longname": "Matrix#isSquare", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @static\n * @function fold\n * @description Static function to reduce the matrix rows using a reduce function\n * @param f {function} A reduce/fold function\n * @param M {Matrix} The Matrix to reduce\n * @returns {Matrix}\n * @example\n\n * // Sum of all matrix values\n * const reducer = (prev, next) => Number(prev) + next.reduce((acc, x) => acc + x, 0)\n * const A = Matrix.of([[1, 1], [1, 1]]\n * Matrix.fold(reducer, A)\n * // 4\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member isOrthogonal\n * @param M {Matrix|array}\n * @returns {boolean}\n * @example\n *\n * const result = [[-0.3092, -0.9510], [-0.9510, 0.3092]]\n * const A = Matrix.fromArray(result)\n * true === A.isOrthogonal()\n */", "meta": { "filename": "matrix.js", - "lineno": 249, + "lineno": 125, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "scope": "static", - "kind": "function", - "name": "fold", - "description": "Static function to reduce the matrix rows using a reduce function", + "scope": "instance", + "kind": "member", + "name": "isOrthogonal", "params": [ { "type": { "names": [ - "function" - ] - }, - "description": "A reduce/fold function", - "name": "f" - }, - { - "type": { - "names": [ - "Matrix" + "Matrix", + "array" ] }, - "description": "The Matrix to reduce", "name": "M" } ], @@ -1093,47 +1130,102 @@ { "type": { "names": [ - "Matrix" + "boolean" ] } } ], "examples": [ - "// Sum of all matrix values\nconst reducer = (prev, next) => Number(prev) + next.reduce((acc, x) => acc + x, 0)\nconst A = Matrix.of([[1, 1], [1, 1]]\nMatrix.fold(reducer, A)\n// 4" + "const result = [[-0.3092, -0.9510], [-0.9510, 0.3092]]\nconst A = Matrix.fromArray(result)\ntrue === A.isOrthogonal()" ], - "longname": "Matrix.fold" + "longname": "Matrix#isOrthogonal" }, { "comment": "", "meta": { "range": [ - 5668, - 5738 + 3000, + 3142 ], "filename": "matrix.js", - "lineno": 265, + "lineno": 137, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000338", - "name": "Matrix.fold", - "type": "CallExpression", - "value": "", + "id": "astnode100000390", + "name": "Matrix.prototype.isOrthogonal", + "type": "FunctionExpression", "paramnames": [] + }, + "vars": { + "AxAt": "Matrix#isOrthogonal~AxAt", + "I": "Matrix#isOrthogonal~I" } }, "undocumented": true, - "name": "fold", - "longname": "Matrix.fold", - "kind": "member", + "name": "isOrthogonal", + "longname": "Matrix#isOrthogonal", + "kind": "function", "memberof": "Matrix", - "scope": "static" + "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member ap\n * @description Applies a Matrix to a function\n * @param M {Matrix}\n * @returns {Matrix}\n * @example\n *\n * const f = x => x.reduce((prev, next) => prev + next)\n * const A = Matrix.of([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n * Matrix.of(f).ap(M)\n * // [[6], [15], [24]\n */", + "comment": "", + "meta": { + "range": [ + 3054, + 3087 + ], + "filename": "matrix.js", + "lineno": 138, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100000399", + "name": "AxAt", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "AxAt", + "longname": "Matrix#isOrthogonal~AxAt", + "kind": "constant", + "memberof": "Matrix#isOrthogonal", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 3096, + 3115 + ], + "filename": "matrix.js", + "lineno": 139, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100000410", + "name": "I", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "I", + "longname": "Matrix#isOrthogonal~I", + "kind": "constant", + "memberof": "Matrix#isOrthogonal", + "scope": "inner", + "params": [] + }, + { + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member getCols\n * @returns {Number}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * A.getCols() === 2\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 269, + "lineno": 143, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1141,82 +1233,60 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "ap", - "description": "Applies a Matrix to a function", - "params": [ - { - "type": { - "names": [ - "Matrix" - ] - }, - "name": "M" - } - ], + "name": "getCols", "returns": [ { "type": { "names": [ - "Matrix" + "Number" ] } } ], "examples": [ - "const f = x => x.reduce((prev, next) => prev + next)\nconst A = Matrix.of([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\nMatrix.of(f).ap(M)\n// [[6], [15], [24]" + "const A = Matrix.of([[1, 1], [1, 1]])\nA.getCols() === 2" ], - "longname": "Matrix#ap" + "longname": "Matrix#getCols" }, { "comment": "", "meta": { "range": [ - 6058, - 6136 + 3306, + 3380 ], "filename": "matrix.js", - "lineno": 283, + "lineno": 154, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000359", - "name": "Matrix.prototype.ap", + "id": "astnode100000422", + "name": "Matrix.prototype.getCols", "type": "FunctionExpression", - "paramnames": [ - "M" - ] + "paramnames": [] } }, "undocumented": true, - "name": "ap", - "longname": "Matrix#ap", + "name": "getCols", + "longname": "Matrix#getCols", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @static\n * @function ap\n * @description Applies a Matrix to a function\n * @param f {function}\n * @param M {Matrix|array}\n * @returns {Matrix}\n * @example\n *\n * const f = x => x.reduce((prev, next) => prev + next)\n * Matrix.ap(f, [[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n * // [[6], [15], [24]\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member equals\n * @param M {Matrix|array}\n * @returns {Boolean}\n * @example\n *\n * var a = [[1, 1], [1, 1]]\n * var A = Matrix.of(a)\n * var B = Matrix.of(a)\n * true === A.equals(B)\n */", "meta": { "filename": "matrix.js", - "lineno": 287, + "lineno": 158, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "scope": "static", - "kind": "function", - "name": "ap", - "description": "Applies a Matrix to a function", + "scope": "instance", + "kind": "member", + "name": "equals", "params": [ - { - "type": { - "names": [ - "function" - ] - }, - "name": "f" - }, { "type": { "names": [ @@ -1231,47 +1301,48 @@ { "type": { "names": [ - "Matrix" + "Boolean" ] } } ], "examples": [ - "const f = x => x.reduce((prev, next) => prev + next)\nMatrix.ap(f, [[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n// [[6], [15], [24]" + "var a = [[1, 1], [1, 1]]\nvar A = Matrix.of(a)\nvar B = Matrix.of(a)\ntrue === A.equals(B)" ], - "longname": "Matrix.ap" + "longname": "Matrix#equals" }, { "comment": "", "meta": { "range": [ - 6456, - 6522 + 3606, + 3694 ], "filename": "matrix.js", - "lineno": 301, + "lineno": 171, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000381", - "name": "Matrix.ap", - "type": "CallExpression", - "value": "", - "paramnames": [] + "id": "astnode100000439", + "name": "Matrix.prototype.equals", + "type": "FunctionExpression", + "paramnames": [ + "M" + ] } }, "undocumented": true, - "name": "ap", - "longname": "Matrix.ap", - "kind": "member", + "name": "equals", + "longname": "Matrix#equals", + "kind": "function", "memberof": "Matrix", - "scope": "static" + "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member concat\n * @description Concatenates 2 Matrices using a function as operator\n * @param M {Matrix}\n * @returns {Matrix}\n * @example\n *\n * const a = [[0, 1, 1], [2, 3, 4]]\n * const b = [[2, 2, 2], [3, 3, 3]]\n * const A = Matrix.of(a)\n * const B = Matrix.of(b)\n * const M = A.concat(B)\n * // [[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member getRows\n * @returns {Number}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * A.getRows() // 2\n */", "meta": { "filename": "matrix.js", - "lineno": 305, + "lineno": 175, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1279,137 +1350,103 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "concat", - "description": "Concatenates 2 Matrices using a function as operator", - "params": [ - { - "type": { - "names": [ - "Matrix" - ] - }, - "name": "M" - } - ], + "name": "getRows", "returns": [ { "type": { "names": [ - "Matrix" + "Number" ] } } ], "examples": [ - "const a = [[0, 1, 1], [2, 3, 4]]\nconst b = [[2, 2, 2], [3, 3, 3]]\nconst A = Matrix.of(a)\nconst B = Matrix.of(b)\nconst M = A.concat(B)\n// [[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]" + "const A = Matrix.of([[1, 1], [1, 1]])\nA.getRows() // 2" ], - "longname": "Matrix#concat" + "longname": "Matrix#getRows" }, { "comment": "", "meta": { "range": [ - 6908, - 6997 + 3854, + 3925 ], "filename": "matrix.js", - "lineno": 322, + "lineno": 185, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000402", - "name": "Matrix.prototype.concat", + "id": "astnode100000460", + "name": "Matrix.prototype.getRows", "type": "FunctionExpression", - "paramnames": [ - "M", - "f" - ] + "paramnames": [] } }, "undocumented": true, - "name": "concat", - "longname": "Matrix#concat", + "name": "getRows", + "longname": "Matrix#getRows", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @static\n * @function concat\n * @description Concatenates 2 Matrices using a function as operator\n * @param A {Matrix}\n * @param B {Matrix}\n * @returns {Matrix}\n * @example\n *\n * const a = [[0, 1, 1], [2, 3, 4]]\n * const b = [[2, 2, 2], [3, 3, 3]]\n * const A = Matrix.of(a)\n * const B = Matrix.of(b)\n * const M = Matrix.concat(A, B)\n * // [[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member getShape\n * @returns {Array}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * A.getShape() // [2, 2]\n */", "meta": { "filename": "matrix.js", - "lineno": 326, + "lineno": 189, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "scope": "static", - "kind": "function", - "name": "concat", - "description": "Concatenates 2 Matrices using a function as operator", - "params": [ + "scope": "instance", + "kind": "member", + "name": "getShape", + "returns": [ { "type": { "names": [ - "Matrix" - ] - }, - "name": "A" - }, - { - "type": { - "names": [ - "Matrix" - ] - }, - "name": "B" - } - ], - "returns": [ - { - "type": { - "names": [ - "Matrix" + "Array" ] } } ], "examples": [ - "const a = [[0, 1, 1], [2, 3, 4]]\nconst b = [[2, 2, 2], [3, 3, 3]]\nconst A = Matrix.of(a)\nconst B = Matrix.of(b)\nconst M = Matrix.concat(A, B)\n// [[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]" + "const A = Matrix.of([[1, 1], [1, 1]])\nA.getShape() // [2, 2]" ], - "longname": "Matrix.concat" + "longname": "Matrix#getShape" }, { "comment": "", "meta": { "range": [ - 7412, - 7498 + 4091, + 4176 ], "filename": "matrix.js", - "lineno": 344, + "lineno": 199, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000427", - "name": "Matrix.concat", - "type": "CallExpression", - "value": "", + "id": "astnode100000475", + "name": "Matrix.prototype.getShape", + "type": "FunctionExpression", "paramnames": [] } }, "undocumented": true, - "name": "concat", - "longname": "Matrix.concat", - "kind": "member", + "name": "getShape", + "longname": "Matrix#getShape", + "kind": "function", "memberof": "Matrix", - "scope": "static" + "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member empty\n * @description Return an empty Matrix from an existing Matrix\n * @returns {Matrix}\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member map\n * @description Maps over the rows of the matrix using a map function\n * @param f {function} An iterator function\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.of([[1, 1], [1, 1]])\n * m.map(x => x.map(y => y+ 1))\n * // [[2, 2], [2, 2]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 348, + "lineno": 203, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1417,8 +1454,19 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "empty", - "description": "Return an empty Matrix from an existing Matrix", + "name": "map", + "description": "Maps over the rows of the matrix using a map function", + "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "An iterator function", + "name": "f" + } + ], "returns": [ { "type": { @@ -1428,38 +1476,43 @@ } } ], - "longname": "Matrix#empty" + "examples": [ + "const m = Matrix.of([[1, 1], [1, 1]])\nm.map(x => x.map(y => y+ 1))\n// [[2, 2], [2, 2]]" + ], + "longname": "Matrix#map" }, { "comment": "", "meta": { "range": [ - 7642, - 7718 + 4483, + 4563 ], "filename": "matrix.js", - "lineno": 355, + "lineno": 217, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000453", - "name": "Matrix.prototype.empty", + "id": "astnode100000494", + "name": "Matrix.prototype.map", "type": "FunctionExpression", - "paramnames": [] + "paramnames": [ + "f" + ] } }, "undocumented": true, - "name": "empty", - "longname": "Matrix#empty", + "name": "map", + "longname": "Matrix#map", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @static\n * @function empty\n * @description Return an empty Matrix from an existing Matrix\n * @param rows {number}\n * @param cols {number}\n * @returns {Matrix}\n */", + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function map\n * @description Static function that maps over the rows of the matrix using a map function\n * @param f {function} An iterator function\n * @param M {Matrix|array} Matrix or array to map\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.map(x= > x.map(y => y+ 1), [[1, 1], [1, 1]])\n * // [[2, 2], [2, 2]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 359, + "lineno": 221, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1467,24 +1520,27 @@ "memberof": "Matrix", "scope": "static", "kind": "function", - "name": "empty", - "description": "Return an empty Matrix from an existing Matrix", + "name": "map", + "description": "Static function that maps over the rows of the matrix using a map function", "params": [ { "type": { "names": [ - "number" + "function" ] }, - "name": "rows" + "description": "An iterator function", + "name": "f" }, { "type": { "names": [ - "number" + "Matrix", + "array" ] }, - "name": "cols" + "description": "Matrix or array to map", + "name": "M" } ], "returns": [ @@ -1496,65 +1552,42 @@ } } ], - "longname": "Matrix.empty" + "examples": [ + "const m = Matrix.map(x= > x.map(y => y+ 1), [[1, 1], [1, 1]])\n// [[2, 2], [2, 2]]" + ], + "longname": "Matrix.map" }, { "comment": "", "meta": { "range": [ - 7910, - 8106 + 4933, + 5001 ], "filename": "matrix.js", - "lineno": 368, + "lineno": 235, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000472", - "name": "Matrix.empty", + "id": "astnode100000516", + "name": "Matrix.map", "type": "CallExpression", "value": "", "paramnames": [] } }, "undocumented": true, - "name": "empty", - "longname": "Matrix.empty", + "name": "map", + "longname": "Matrix.map", "kind": "member", "memberof": "Matrix", "scope": "static" }, { - "comment": "", - "meta": { - "range": [ - 7971, - 7995 - ], - "filename": "matrix.js", - "lineno": 369, - "columnno": 8, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100000487", - "name": "m", - "type": "CallExpression", - "value": "" - } - }, - "undocumented": true, - "name": "m", - "longname": "~m", - "kind": "constant", - "memberof": "", - "scope": "inner", - "params": [] - }, - { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member identity\n * @desc Returns an identity matrix\n * @returns {Matrix}\n * @example\n *\n * const a = [[1, 2, 3], [4, 5, 6]]\n * const A = Matrix.of(a)\n * const Aidentity = A.identity()\n * // [[1, 0, 0], [0, 1, 0]]\n *\n*/", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member fold\n * @description Reduce the matrix rows using a reduce function\n * @param f {function} A reduce/fold function\n * @returns {Matrix}\n * @example\n *\n * // Flatten Matrix\n * Matrix.of([[1, 1], [1, 1]]).fold((prev, next) => prev.concat(next))\n * // [1, 1, 1, 1]\n */", "meta": { "filename": "matrix.js", - "lineno": 375, + "lineno": 239, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1562,8 +1595,19 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "identity", - "description": "Returns an identity matrix", + "name": "fold", + "description": "Reduce the matrix rows using a reduce function", + "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "A reduce/fold function", + "name": "f" + } + ], "returns": [ { "type": { @@ -1574,40 +1618,42 @@ } ], "examples": [ - "const a = [[1, 2, 3], [4, 5, 6]]\nconst A = Matrix.of(a)\nconst Aidentity = A.identity()\n// [[1, 0, 0], [0, 1, 0]]" + "// Flatten Matrix\nMatrix.of([[1, 1], [1, 1]]).fold((prev, next) => prev.concat(next))\n// [1, 1, 1, 1]" ], - "longname": "Matrix#identity" + "longname": "Matrix#fold" }, { "comment": "", "meta": { "range": [ - 8390, - 8471 + 5316, + 5402 ], "filename": "matrix.js", - "lineno": 389, + "lineno": 252, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000504", - "name": "Matrix.prototype.identity", + "id": "astnode100000537", + "name": "Matrix.prototype.fold", "type": "FunctionExpression", - "paramnames": [] + "paramnames": [ + "f" + ] } }, "undocumented": true, - "name": "identity", - "longname": "Matrix#identity", + "name": "fold", + "longname": "Matrix#fold", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @static\n * @function identity\n * @desc Returns an identity matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.identity(3, 2)\n * // [[1, 0, 0], [0, 1, 0]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function fold\n * @description Static function to reduce the matrix rows using a reduce function\n * @param f {function} A reduce/fold function\n * @param M {Matrix} The Matrix to reduce\n * @returns {Matrix}\n * @example\n\n * // Sum of all matrix values\n * const reducer = (prev, next) => Number(prev) + next.reduce((acc, x) => acc + x, 0)\n * const A = Matrix.of([[1, 1], [1, 1]]\n * Matrix.fold(reducer, A)\n * // 4\n */", "meta": { "filename": "matrix.js", - "lineno": 393, + "lineno": 256, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1615,8 +1661,28 @@ "memberof": "Matrix", "scope": "static", "kind": "function", - "name": "identity", - "description": "Returns an identity matrix", + "name": "fold", + "description": "Static function to reduce the matrix rows using a reduce function", + "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "A reduce/fold function", + "name": "f" + }, + { + "type": { + "names": [ + "Matrix" + ] + }, + "description": "The Matrix to reduce", + "name": "M" + } + ], "returns": [ { "type": { @@ -1627,72 +1693,41 @@ } ], "examples": [ - "const A = Matrix.identity(3, 2)\n// [[1, 0, 0], [0, 1, 0]]" + "// Sum of all matrix values\nconst reducer = (prev, next) => Number(prev) + next.reduce((acc, x) => acc + x, 0)\nconst A = Matrix.of([[1, 1], [1, 1]]\nMatrix.fold(reducer, A)\n// 4" ], - "longname": "Matrix.identity" + "longname": "Matrix.fold" }, { "comment": "", "meta": { "range": [ - 8673, - 8859 + 5857, + 5927 ], "filename": "matrix.js", - "lineno": 405, + "lineno": 272, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000523", - "name": "Matrix.identity", - "type": "FunctionExpression", - "paramnames": [ - "rows", - "cols" - ] - }, - "vars": { - "m": "Matrix.identity~m" + "id": "astnode100000560", + "name": "Matrix.fold", + "type": "CallExpression", + "value": "", + "paramnames": [] } }, "undocumented": true, - "name": "identity", - "longname": "Matrix.identity", - "kind": "function", + "name": "fold", + "longname": "Matrix.fold", + "kind": "member", "memberof": "Matrix", "scope": "static" }, { - "comment": "", - "meta": { - "range": [ - 8723, - 8747 - ], - "filename": "matrix.js", - "lineno": 406, - "columnno": 8, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100000532", - "name": "m", - "type": "CallExpression", - "value": "" - } - }, - "undocumented": true, - "name": "m", - "longname": "Matrix.identity~m", - "kind": "constant", - "memberof": "Matrix.identity", - "scope": "inner", - "params": [] - }, - { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member combine\n * @see Matrix.concat\n * @param M\n * @returns {Matrix}\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member ap\n * @description Applies a Matrix to a function\n * @param M {Matrix}\n * @returns {Matrix}\n * @example\n *\n * const f = x => x.reduce((prev, next) => prev + next)\n * const A = Matrix.of([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n * Matrix.of(f).ap(M)\n * // [[6], [15], [24]\n */", "meta": { "filename": "matrix.js", - "lineno": 410, + "lineno": 276, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1700,12 +1735,15 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "combine", - "see": [ - "Matrix.concat" - ], + "name": "ap", + "description": "Applies a Matrix to a function", "params": [ { + "type": { + "names": [ + "Matrix" + ] + }, "name": "M" } ], @@ -1718,22 +1756,25 @@ } } ], - "longname": "Matrix#combine" + "examples": [ + "const f = x => x.reduce((prev, next) => prev + next)\nconst A = Matrix.of([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\nMatrix.of(f).ap(M)\n// [[6], [15], [24]" + ], + "longname": "Matrix#ap" }, { "comment": "", "meta": { "range": [ - 8976, - 9073 + 6247, + 6325 ], "filename": "matrix.js", - "lineno": 418, + "lineno": 290, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000549", - "name": "Matrix.prototype.combine", + "id": "astnode100000581", + "name": "Matrix.prototype.ap", "type": "FunctionExpression", "paramnames": [ "M" @@ -1741,17 +1782,17 @@ } }, "undocumented": true, - "name": "combine", - "longname": "Matrix#combine", + "name": "ap", + "longname": "Matrix#ap", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @static\n * @function combine\n * @see Matrix.concat\n * @param M\n * @returns {Matrix}\n */", + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function ap\n * @description Applies a Matrix to a function\n * @param f {function}\n * @param M {Matrix|array}\n * @returns {Matrix}\n * @example\n *\n * const f = x => x.reduce((prev, next) => prev + next)\n * Matrix.ap(f, [[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n * // [[6], [15], [24]\n */", "meta": { "filename": "matrix.js", - "lineno": 422, + "lineno": 294, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1759,74 +1800,25 @@ "memberof": "Matrix", "scope": "static", "kind": "function", - "name": "combine", - "see": [ - "Matrix.concat" - ], + "name": "ap", + "description": "Applies a Matrix to a function", "params": [ - { - "name": "M" - } - ], - "returns": [ { "type": { "names": [ - "Matrix" + "function" ] - } - } - ], - "longname": "Matrix.combine" - }, - { - "comment": "", - "meta": { - "range": [ - 9190, - 9277 - ], - "filename": "matrix.js", - "lineno": 430, - "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100000574", - "name": "Matrix.combine", - "type": "FunctionExpression", - "paramnames": [ - "A", - "B" - ] - } - }, - "undocumented": true, - "name": "combine", - "longname": "Matrix.combine", - "kind": "function", - "memberof": "Matrix", - "scope": "static" - }, - { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member dot\n * @description Returns the dot product between 2 matrices\n * @param M\n * @param f\n * @returns {Matrix}\n * @example\n *\n * // Create matrix\n * const m = Matrix.of([[1, 2], [3, 4]])\n *\n * // Generate identity matrix\n * const I = m.identity() // [[1, 0], [0, 1]]\n *\n * if(m.dot(I).equals(m)) {\n * console.log('Dot product with identity matrix returns the same matrix')\n * }\n *\n */", - "meta": { - "filename": "matrix.js", - "lineno": 434, - "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": {} - }, - "memberof": "Matrix", - "scope": "instance", - "kind": "member", - "name": "dot", - "description": "Returns the dot product between 2 matrices", - "params": [ - { - "name": "M" + }, + "name": "f" }, { - "name": "f" + "type": { + "names": [ + "Matrix", + "array" + ] + }, + "name": "M" } ], "returns": [ @@ -1839,53 +1831,57 @@ } ], "examples": [ - "// Create matrix\nconst m = Matrix.of([[1, 2], [3, 4]])\n\n// Generate identity matrix\nconst I = m.identity() // [[1, 0], [0, 1]]\n\nif(m.dot(I).equals(m)) {\n console.log('Dot product with identity matrix returns the same matrix')\n}" + "const f = x => x.reduce((prev, next) => prev + next)\nMatrix.ap(f, [[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n// [[6], [15], [24]" ], - "longname": "Matrix#dot" + "longname": "Matrix.ap" }, { "comment": "", "meta": { "range": [ - 9713, - 9819 + 6645, + 6711 ], "filename": "matrix.js", - "lineno": 455, + "lineno": 308, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000598", - "name": "Matrix.prototype.dot", - "type": "FunctionExpression", - "paramnames": [ - "M" - ] + "id": "astnode100000603", + "name": "Matrix.ap", + "type": "CallExpression", + "value": "", + "paramnames": [] } }, "undocumented": true, - "name": "dot", - "longname": "Matrix#dot", - "kind": "function", + "name": "ap", + "longname": "Matrix.ap", + "kind": "member", "memberof": "Matrix", - "scope": "instance" + "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @static\n * @function dot\n * @description Returns the dot product between 2 matrices\n * @param M\n * @returns {Matrix}\n * @example\n * const a = [[1, 2, 3], [4, 5, 6]]\n * const b = [[7, 8], [9, 10], [11, 12]]\n *\n * const A = Matrix.of(a)\n * const B = Matrix.of(b)\n *\n * Matrix.dot(A, B) // [[58, 64], [139, 154]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member concat\n * @description Concatenates 2 Matrices using a function as operator\n * @param M {Matrix}\n * @returns {Matrix}\n * @example\n *\n * const a = [[0, 1, 1], [2, 3, 4]]\n * const b = [[2, 2, 2], [3, 3, 3]]\n * const A = Matrix.of(a)\n * const B = Matrix.of(b)\n * const M = A.concat(B)\n * // [[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 459, + "lineno": 312, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "scope": "static", - "kind": "function", - "name": "dot", - "description": "Returns the dot product between 2 matrices", + "scope": "instance", + "kind": "member", + "name": "concat", + "description": "Concatenates 2 Matrices using a function as operator", "params": [ { + "type": { + "names": [ + "Matrix" + ] + }, "name": "M" } ], @@ -1899,55 +1895,68 @@ } ], "examples": [ - "const a = [[1, 2, 3], [4, 5, 6]]\nconst b = [[7, 8], [9, 10], [11, 12]]\n\nconst A = Matrix.of(a)\nconst B = Matrix.of(b)\n\nMatrix.dot(A, B) // [[58, 64], [139, 154]]" + "const a = [[0, 1, 1], [2, 3, 4]]\nconst b = [[2, 2, 2], [3, 3, 3]]\nconst A = Matrix.of(a)\nconst B = Matrix.of(b)\nconst M = A.concat(B)\n// [[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]" ], - "longname": "Matrix.dot" + "longname": "Matrix#concat" }, { "comment": "", "meta": { "range": [ - 10165, - 10237 + 7097, + 7186 ], "filename": "matrix.js", - "lineno": 476, + "lineno": 329, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000627", - "name": "Matrix.dot", + "id": "astnode100000624", + "name": "Matrix.prototype.concat", "type": "FunctionExpression", "paramnames": [ - "A", - "B" + "M", + "f" ] } }, "undocumented": true, - "name": "dot", - "longname": "Matrix.dot", + "name": "concat", + "longname": "Matrix#concat", "kind": "function", "memberof": "Matrix", - "scope": "static" + "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member fill\n * @desc Fill up an empty matrix with the provided map function\n * @param f\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).fill(x => 42)\n * // [[42,42,42], [42,42,42], [42,42,42]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function concat\n * @description Concatenates 2 Matrices using a function as operator\n * @param A {Matrix}\n * @param B {Matrix}\n * @returns {Matrix}\n * @example\n *\n * const a = [[0, 1, 1], [2, 3, 4]]\n * const b = [[2, 2, 2], [3, 3, 3]]\n * const A = Matrix.of(a)\n * const B = Matrix.of(b)\n * const M = Matrix.concat(A, B)\n * // [[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 480, + "lineno": 333, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "scope": "instance", - "kind": "member", - "name": "fill", - "description": "Fill up an empty matrix with the provided map function", + "scope": "static", + "kind": "function", + "name": "concat", + "description": "Concatenates 2 Matrices using a function as operator", "params": [ { - "name": "f" + "type": { + "names": [ + "Matrix" + ] + }, + "name": "A" + }, + { + "type": { + "names": [ + "Matrix" + ] + }, + "name": "B" } ], "returns": [ @@ -1960,45 +1969,41 @@ } ], "examples": [ - "const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).fill(x => 42)\n// [[42,42,42], [42,42,42], [42,42,42]]" + "const a = [[0, 1, 1], [2, 3, 4]]\nconst b = [[2, 2, 2], [3, 3, 3]]\nconst A = Matrix.of(a)\nconst B = Matrix.of(b)\nconst M = Matrix.concat(A, B)\n// [[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]" ], - "longname": "Matrix#fill" + "longname": "Matrix.concat" }, { "comment": "", "meta": { "range": [ - 10520, - 10605 + 7601, + 7687 ], "filename": "matrix.js", - "lineno": 493, + "lineno": 351, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000650", - "name": "Matrix.prototype.fill", - "type": "FunctionExpression", - "paramnames": [ - "f" - ] - }, - "vars": { - "": null + "id": "astnode100000649", + "name": "Matrix.concat", + "type": "CallExpression", + "value": "", + "paramnames": [] } }, "undocumented": true, - "name": "fill", - "longname": "Matrix#fill", - "kind": "function", + "name": "concat", + "longname": "Matrix.concat", + "kind": "member", "memberof": "Matrix", - "scope": "instance" + "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member zeros\n * @desc Fill up an empty matrix with zeros\n * @returns {Matrix}\n *\n * @example\n *\n * const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).zeros()\n * // [[0,0,0], [0,0,0], [0,0,0]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member empty\n * @description Return an empty Matrix from an existing Matrix\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 497, + "lineno": 355, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2006,8 +2011,8 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "zeros", - "description": "Fill up an empty matrix with zeros", + "name": "empty", + "description": "Return an empty Matrix from an existing Matrix", "returns": [ { "type": { @@ -2017,52 +2022,47 @@ } } ], - "examples": [ - "const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).zeros()\n// [[0,0,0], [0,0,0], [0,0,0]]" - ], - "longname": "Matrix#zeros" + "longname": "Matrix#empty" }, { "comment": "", "meta": { "range": [ - 10845, - 10923 + 7831, + 7907 ], "filename": "matrix.js", - "lineno": 510, + "lineno": 362, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000676", - "name": "Matrix.prototype.zeros", + "id": "astnode100000675", + "name": "Matrix.prototype.empty", "type": "FunctionExpression", "paramnames": [] - }, - "vars": { - "": null } }, "undocumented": true, - "name": "zeros", - "longname": "Matrix#zeros", + "name": "empty", + "longname": "Matrix#empty", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @function zeros\n * @desc Fill up an empty matrix with zeros\n * @param rows {number} Defines the rows of the matrix\n * @param cols {number} Defines the columns of the matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.zeros(3, 3)\n * // [[0,0,0], [0,0,0], [0,0,0]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function empty\n * @description Return an empty Matrix from an existing Matrix\n * @param rows {number}\n * @param cols {number}\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 514, + "lineno": 366, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", + "scope": "static", "kind": "function", - "name": "zeros", - "description": "Fill up an empty matrix with zeros", + "name": "empty", + "description": "Return an empty Matrix from an existing Matrix", "params": [ { "type": { @@ -2070,7 +2070,6 @@ "number" ] }, - "description": "Defines the rows of the matrix", "name": "rows" }, { @@ -2079,7 +2078,6 @@ "number" ] }, - "description": "Defines the columns of the matrix", "name": "cols" } ], @@ -2092,41 +2090,31 @@ } } ], - "examples": [ - "const A = Matrix.zeros(3, 3)\n// [[0,0,0], [0,0,0], [0,0,0]]" - ], - "scope": "static", - "longname": "Matrix.zeros" + "longname": "Matrix.empty" }, { "comment": "", "meta": { "range": [ - 11234, - 11342 + 8099, + 8295 ], "filename": "matrix.js", - "lineno": 527, + "lineno": 375, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000697", - "name": "Matrix.zeros", - "type": "FunctionExpression", - "paramnames": [ - "rows", - "cols" - ] - }, - "vars": { - "m": "Matrix.zeros~m", - "": null + "id": "astnode100000694", + "name": "Matrix.empty", + "type": "CallExpression", + "value": "", + "paramnames": [] } }, "undocumented": true, - "name": "zeros", - "longname": "Matrix.zeros", - "kind": "function", + "name": "empty", + "longname": "Matrix.empty", + "kind": "member", "memberof": "Matrix", "scope": "static" }, @@ -2134,15 +2122,15 @@ "comment": "", "meta": { "range": [ - 11281, - 11305 + 8160, + 8184 ], "filename": "matrix.js", - "lineno": 528, + "lineno": 376, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000706", + "id": "astnode100000709", "name": "m", "type": "CallExpression", "value": "" @@ -2150,17 +2138,17 @@ }, "undocumented": true, "name": "m", - "longname": "Matrix.zeros~m", + "longname": "~m", "kind": "constant", - "memberof": "Matrix.zeros", + "memberof": "", "scope": "inner", "params": [] }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member ones\n * @desc Fill up an empty matrix with ones\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).ones()\n * // [[1,1,1], [1,1,1], [1,1,1]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member identity\n * @desc Returns an identity matrix\n * @returns {Matrix}\n * @example\n *\n * const a = [[1, 2, 3], [4, 5, 6]]\n * const A = Matrix.of(a)\n * const Aidentity = A.identity()\n * // [[1, 0, 0], [0, 1, 0]]\n *\n*/", "meta": { "filename": "matrix.js", - "lineno": 532, + "lineno": 382, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2168,8 +2156,8 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "ones", - "description": "Fill up an empty matrix with ones", + "name": "identity", + "description": "Returns an identity matrix", "returns": [ { "type": { @@ -2180,100 +2168,77 @@ } ], "examples": [ - "const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).ones()\n// [[1,1,1], [1,1,1], [1,1,1]]" + "const a = [[1, 2, 3], [4, 5, 6]]\nconst A = Matrix.of(a)\nconst Aidentity = A.identity()\n// [[1, 0, 0], [0, 1, 0]]" ], - "longname": "Matrix#ones" + "longname": "Matrix#identity" }, { "comment": "", "meta": { "range": [ - 11576, - 11653 + 8579, + 8660 ], "filename": "matrix.js", - "lineno": 544, + "lineno": 396, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000725", - "name": "Matrix.prototype.ones", + "id": "astnode100000726", + "name": "Matrix.prototype.identity", "type": "FunctionExpression", "paramnames": [] - }, - "vars": { - "": null } }, "undocumented": true, - "name": "ones", - "longname": "Matrix#ones", + "name": "identity", + "longname": "Matrix#identity", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @function ones\n * @desc Fill up an empty matrix with ones\n * @param rows {number} Defines the rows of the matrix\n * @param cols {number} Defines the columns of the matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.ones(1, 1)\n * // [[1,1,1], [1,1,1], [1,1,1]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function identity\n * @desc Returns an identity matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.identity(3, 2)\n * // [[1, 0, 0], [0, 1, 0]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 548, + "lineno": 400, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", + "scope": "static", "kind": "function", - "name": "ones", - "description": "Fill up an empty matrix with ones", - "params": [ - { - "type": { - "names": [ - "number" - ] - }, - "description": "Defines the rows of the matrix", - "name": "rows" - }, + "name": "identity", + "description": "Returns an identity matrix", + "returns": [ { "type": { "names": [ - "number" - ] - }, - "description": "Defines the columns of the matrix", - "name": "cols" - } - ], - "returns": [ - { - "type": { - "names": [ - "Matrix" + "Matrix" ] } } ], "examples": [ - "const A = Matrix.ones(1, 1)\n// [[1,1,1], [1,1,1], [1,1,1]]" + "const A = Matrix.identity(3, 2)\n// [[1, 0, 0], [0, 1, 0]]" ], - "scope": "static", - "longname": "Matrix.ones" + "longname": "Matrix.identity" }, { "comment": "", "meta": { "range": [ - 11961, - 12068 + 8862, + 9048 ], "filename": "matrix.js", - "lineno": 561, + "lineno": 412, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000746", - "name": "Matrix.ones", + "id": "astnode100000745", + "name": "Matrix.identity", "type": "FunctionExpression", "paramnames": [ "rows", @@ -2281,13 +2246,12 @@ ] }, "vars": { - "m": "Matrix.ones~m", - "": null + "m": "Matrix.identity~m" } }, "undocumented": true, - "name": "ones", - "longname": "Matrix.ones", + "name": "identity", + "longname": "Matrix.identity", "kind": "function", "memberof": "Matrix", "scope": "static" @@ -2296,15 +2260,15 @@ "comment": "", "meta": { "range": [ - 12007, - 12031 + 8912, + 8936 ], "filename": "matrix.js", - "lineno": 562, + "lineno": 413, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000755", + "id": "astnode100000754", "name": "m", "type": "CallExpression", "value": "" @@ -2312,17 +2276,17 @@ }, "undocumented": true, "name": "m", - "longname": "Matrix.ones~m", + "longname": "Matrix.identity~m", "kind": "constant", - "memberof": "Matrix.ones", + "memberof": "Matrix.identity", "scope": "inner", "params": [] }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member random\n * @desc Fill up an empty matrix with random values\n * @param {function} [f = e => Math.random() * 2 - 1]\n * @returns {Matrix}\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member combine\n * @see Matrix.concat\n * @param M\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 566, + "lineno": 417, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2330,18 +2294,13 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "random", - "description": "Fill up an empty matrix with random values", + "name": "combine", + "see": [ + "Matrix.concat" + ], "params": [ { - "type": { - "names": [ - "function" - ] - }, - "optional": true, - "defaultvalue": "e => Math.random() * 2 - 1", - "name": "f" + "name": "M" } ], "returns": [ @@ -2353,78 +2312,54 @@ } } ], - "longname": "Matrix#random" + "longname": "Matrix#combine" }, { "comment": "", "meta": { "range": [ - 12256, - 12360 + 9165, + 9262 ], "filename": "matrix.js", - "lineno": 574, + "lineno": 425, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000774", - "name": "Matrix.prototype.random", + "id": "astnode100000771", + "name": "Matrix.prototype.combine", "type": "FunctionExpression", "paramnames": [ - "f" + "M" ] - }, - "vars": { - "": null } }, "undocumented": true, - "name": "random", - "longname": "Matrix#random", + "name": "combine", + "longname": "Matrix#combine", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @function random\n * @desc Fill up an empty matrix with random numbers\n * @param f {function} Function which returns random values. Default random values are between -1 and 1\n * @param rows {number} Defines the rows of the matrix\n * @param cols {number} Defines the columns of the matrix\n * @returns {Matrix}\n */", + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function combine\n * @see Matrix.concat\n * @param M\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 578, + "lineno": 429, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", + "scope": "static", "kind": "function", - "name": "random", - "description": "Fill up an empty matrix with random numbers", + "name": "combine", + "see": [ + "Matrix.concat" + ], "params": [ { - "type": { - "names": [ - "function" - ] - }, - "description": "Function which returns random values. Default random values are between -1 and 1", - "name": "f" - }, - { - "type": { - "names": [ - "number" - ] - }, - "description": "Defines the rows of the matrix", - "name": "rows" - }, - { - "type": { - "names": [ - "number" - ] - }, - "description": "Defines the columns of the matrix", - "name": "cols" + "name": "M" } ], "returns": [ @@ -2436,73 +2371,41 @@ } } ], - "scope": "static", - "longname": "Matrix.random" + "longname": "Matrix.combine" }, { "comment": "", "meta": { "range": [ - 12701, - 12839 + 9379, + 9466 ], "filename": "matrix.js", - "lineno": 587, + "lineno": 437, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000805", - "name": "Matrix.random", + "id": "astnode100000796", + "name": "Matrix.combine", "type": "FunctionExpression", "paramnames": [ - "f", - "rows", - "cols" + "A", + "B" ] - }, - "vars": { - "": null, - "m": "Matrix.random~m" } }, "undocumented": true, - "name": "random", - "longname": "Matrix.random", + "name": "combine", + "longname": "Matrix.combine", "kind": "function", "memberof": "Matrix", "scope": "static" }, { - "comment": "", - "meta": { - "range": [ - 12783, - 12807 - ], - "filename": "matrix.js", - "lineno": 588, - "columnno": 8, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100000826", - "name": "m", - "type": "CallExpression", - "value": "" - } - }, - "undocumented": true, - "name": "m", - "longname": "Matrix.random~m", - "kind": "constant", - "memberof": "Matrix.random", - "scope": "inner", - "params": [] - }, - { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member toArray\n * @desc Returns the array from the matrix\n * @returns {Array}\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member dot\n * @description Returns the dot product between 2 matrices\n * @param M\n * @param f\n * @returns {Matrix}\n * @example\n *\n * // Create matrix\n * const m = Matrix.of([[1, 2], [3, 4]])\n *\n * // Generate identity matrix\n * const I = m.identity() // [[1, 0], [0, 1]]\n *\n * if(m.dot(I).equals(m)) {\n * console.log('Dot product with identity matrix returns the same matrix')\n * }\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 592, + "lineno": 441, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2510,61 +2413,76 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "toArray", - "description": "Returns the array from the matrix", + "name": "dot", + "description": "Returns the dot product between 2 matrices", + "params": [ + { + "name": "M" + }, + { + "name": "f" + } + ], "returns": [ { "type": { "names": [ - "Array" + "Matrix" ] } } ], - "longname": "Matrix#toArray" + "examples": [ + "// Create matrix\nconst m = Matrix.of([[1, 2], [3, 4]])\n\n// Generate identity matrix\nconst I = m.identity() // [[1, 0], [0, 1]]\n\nif(m.dot(I).equals(m)) {\n console.log('Dot product with identity matrix returns the same matrix')\n}" + ], + "longname": "Matrix#dot" }, { "comment": "", "meta": { "range": [ - 12964, - 13060 + 9902, + 10008 ], "filename": "matrix.js", - "lineno": 599, + "lineno": 462, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000843", - "name": "Matrix.prototype.toArray", + "id": "astnode100000820", + "name": "Matrix.prototype.dot", "type": "FunctionExpression", - "paramnames": [] - }, - "vars": { - "": null + "paramnames": [ + "M" + ] } }, "undocumented": true, - "name": "toArray", - "longname": "Matrix#toArray", + "name": "dot", + "longname": "Matrix#dot", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member clone\n * @desc Returns a clone of the matrix\n * @returns {Matrix}\n */", + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function dot\n * @description Returns the dot product between 2 matrices\n * @param M\n * @returns {Matrix}\n * @example\n * const a = [[1, 2, 3], [4, 5, 6]]\n * const b = [[7, 8], [9, 10], [11, 12]]\n *\n * const A = Matrix.of(a)\n * const B = Matrix.of(b)\n *\n * Matrix.dot(A, B) // [[58, 64], [139, 154]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 603, + "lineno": 466, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "scope": "instance", - "kind": "member", - "name": "clone", - "description": "Returns a clone of the matrix", + "scope": "static", + "kind": "function", + "name": "dot", + "description": "Returns the dot product between 2 matrices", + "params": [ + { + "name": "M" + } + ], "returns": [ { "type": { @@ -2574,38 +2492,44 @@ } } ], - "longname": "Matrix#clone" + "examples": [ + "const a = [[1, 2, 3], [4, 5, 6]]\nconst b = [[7, 8], [9, 10], [11, 12]]\n\nconst A = Matrix.of(a)\nconst B = Matrix.of(b)\n\nMatrix.dot(A, B) // [[58, 64], [139, 154]]" + ], + "longname": "Matrix.dot" }, { "comment": "", "meta": { "range": [ - 13180, - 13260 + 10354, + 10426 ], "filename": "matrix.js", - "lineno": 610, + "lineno": 483, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000868", - "name": "Matrix.prototype.clone", + "id": "astnode100000849", + "name": "Matrix.dot", "type": "FunctionExpression", - "paramnames": [] + "paramnames": [ + "A", + "B" + ] } }, "undocumented": true, - "name": "clone", - "longname": "Matrix#clone", + "name": "dot", + "longname": "Matrix.dot", "kind": "function", "memberof": "Matrix", - "scope": "instance" + "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member fromArray\n * @desc Returns a Matrix from an array\n * @returns {Array}\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member fill\n * @desc Fill up an empty matrix with the provided map function\n * @param f\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).fill(x => 42)\n * // [[42,42,42], [42,42,42], [42,42,42]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 614, + "lineno": 487, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2613,36 +2537,44 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "fromArray", - "description": "Returns a Matrix from an array", + "name": "fill", + "description": "Fill up an empty matrix with the provided map function", + "params": [ + { + "name": "f" + } + ], "returns": [ { "type": { "names": [ - "Array" + "Matrix" ] } } ], - "longname": "Matrix#fromArray" + "examples": [ + "const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).fill(x => 42)\n// [[42,42,42], [42,42,42], [42,42,42]]" + ], + "longname": "Matrix#fill" }, { "comment": "", "meta": { "range": [ - 13384, - 13479 + 10709, + 10794 ], "filename": "matrix.js", - "lineno": 621, + "lineno": 500, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000885", - "name": "Matrix.fromArray", + "id": "astnode100000872", + "name": "Matrix.prototype.fill", "type": "FunctionExpression", "paramnames": [ - "arr" + "f" ] }, "vars": { @@ -2650,17 +2582,17 @@ } }, "undocumented": true, - "name": "fromArray", - "longname": "Matrix.fromArray", + "name": "fill", + "longname": "Matrix#fill", "kind": "function", "memberof": "Matrix", - "scope": "static" + "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member transpose\n * @desc Returns a transposed Matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([-1, 2], [3, 4], [-8, 2])\n * const b = A.transpose().toArray()\n * // returns [[-1, 3,-8], [2, 4, 2]]\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member zeros\n * @desc Fill up an empty matrix with zeros\n * @returns {Matrix}\n *\n * @example\n *\n * const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).zeros()\n * // [[0,0,0], [0,0,0], [0,0,0]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 625, + "lineno": 504, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2668,8 +2600,8 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "transpose", - "description": "Returns a transposed Matrix", + "name": "zeros", + "description": "Fill up an empty matrix with zeros", "returns": [ { "type": { @@ -2680,58 +2612,69 @@ } ], "examples": [ - "const A = Matrix.of([-1, 2], [3, 4], [-8, 2])\nconst b = A.transpose().toArray()\n// returns [[-1, 3,-8], [2, 4, 2]]" + "const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).zeros()\n// [[0,0,0], [0,0,0], [0,0,0]]" ], - "longname": "Matrix#transpose" + "longname": "Matrix#zeros" }, { "comment": "", "meta": { "range": [ - 13740, - 13838 + 11034, + 11112 ], "filename": "matrix.js", - "lineno": 637, + "lineno": 517, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000911", - "name": "Matrix.prototype.transpose", + "id": "astnode100000898", + "name": "Matrix.prototype.zeros", "type": "FunctionExpression", "paramnames": [] + }, + "vars": { + "": null } }, "undocumented": true, - "name": "transpose", - "longname": "Matrix#transpose", + "name": "zeros", + "longname": "Matrix#zeros", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @function transpose\n * @desc Returns a transposed Matrix\n * @param M {Matrix|array} A Matrix or a matrix array\n * @returns {Matrix}\n * @example\n *\n * const a = [-1, 2], [3, 4], [-8, 2]\n * const b = Matrix.transpose(a).toArray()\n * // returns [[-1, 3,-8], [2, 4, 2]]\n */", + "comment": "/**\n * @memberOf Matrix\n * @function zeros\n * @desc Fill up an empty matrix with zeros\n * @param rows {number} Defines the rows of the matrix\n * @param cols {number} Defines the columns of the matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.zeros(3, 3)\n * // [[0,0,0], [0,0,0], [0,0,0]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 641, + "lineno": 521, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", "kind": "function", - "name": "transpose", - "description": "Returns a transposed Matrix", - "params": [ + "name": "zeros", + "description": "Fill up an empty matrix with zeros", + "params": [ { "type": { "names": [ - "Matrix", - "array" + "number" ] }, - "description": "A Matrix or a matrix array", - "name": "M" + "description": "Defines the rows of the matrix", + "name": "rows" + }, + { + "type": { + "names": [ + "number" + ] + }, + "description": "Defines the columns of the matrix", + "name": "cols" } ], "returns": [ @@ -2744,63 +2687,83 @@ } ], "examples": [ - "const a = [-1, 2], [3, 4], [-8, 2]\nconst b = Matrix.transpose(a).toArray()\n// returns [[-1, 3,-8], [2, 4, 2]]" + "const A = Matrix.zeros(3, 3)\n// [[0,0,0], [0,0,0], [0,0,0]]" ], "scope": "static", - "longname": "Matrix.transpose" + "longname": "Matrix.zeros" }, { "comment": "", "meta": { "range": [ - 14137, - 14206 + 11423, + 11531 ], "filename": "matrix.js", - "lineno": 653, + "lineno": 534, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000932", - "name": "Matrix.transpose", + "id": "astnode100000919", + "name": "Matrix.zeros", "type": "FunctionExpression", "paramnames": [ - "M" + "rows", + "cols" ] + }, + "vars": { + "m": "Matrix.zeros~m", + "": null } }, "undocumented": true, - "name": "transpose", - "longname": "Matrix.transpose", + "name": "zeros", + "longname": "Matrix.zeros", "kind": "function", "memberof": "Matrix", "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @member add\n * @instance\n * @param M {Matrix|number} Add a Matrix or a number\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.add(1) // [[6, 5]]\n * const B = Matrix.of([[5, 5]])\n * B.add(B) // [[10, 10]]\n *\n */", + "comment": "", + "meta": { + "range": [ + 11470, + 11494 + ], + "filename": "matrix.js", + "lineno": 535, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100000928", + "name": "m", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "m", + "longname": "Matrix.zeros~m", + "kind": "constant", + "memberof": "Matrix.zeros", + "scope": "inner", + "params": [] + }, + { + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member ones\n * @desc Fill up an empty matrix with ones\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).ones()\n * // [[1,1,1], [1,1,1], [1,1,1]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 657, + "lineno": 539, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "kind": "member", - "name": "add", "scope": "instance", - "params": [ - { - "type": { - "names": [ - "Matrix", - "number" - ] - }, - "description": "Add a Matrix or a number", - "name": "M" - } - ], + "kind": "member", + "name": "ones", + "description": "Fill up an empty matrix with ones", "returns": [ { "type": { @@ -2811,63 +2774,69 @@ } ], "examples": [ - "const A = Matrix.of([[5, 4]])\nA.add(1) // [[6, 5]]\nconst B = Matrix.of([[5, 5]])\nB.add(B) // [[10, 10]]" + "const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).ones()\n// [[1,1,1], [1,1,1], [1,1,1]]" ], - "longname": "Matrix#add" + "longname": "Matrix#ones" }, { "comment": "", "meta": { "range": [ - 14472, - 14818 + 11765, + 11842 ], "filename": "matrix.js", - "lineno": 671, + "lineno": 551, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000949", - "name": "Matrix.prototype.add", + "id": "astnode100000947", + "name": "Matrix.prototype.ones", "type": "FunctionExpression", - "paramnames": [ - "M" - ] + "paramnames": [] }, "vars": { "": null } }, "undocumented": true, - "name": "add", - "longname": "Matrix#add", + "name": "ones", + "longname": "Matrix#ones", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @member subtract\n * @instance\n * @param M {Matrix|number} Subtract a Matrix or a number\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.subtract(1) // [[4, 2]]\n * const B = Matrix.of([[5, 5]])\n * B.subtract(B) // [[0, 0]]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @function ones\n * @desc Fill up an empty matrix with ones\n * @param rows {number} Defines the rows of the matrix\n * @param cols {number} Defines the columns of the matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.ones(1, 1)\n * // [[1,1,1], [1,1,1], [1,1,1]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 682, + "lineno": 555, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "kind": "member", - "name": "subtract", - "scope": "instance", + "kind": "function", + "name": "ones", + "description": "Fill up an empty matrix with ones", "params": [ { "type": { "names": [ - "Matrix", "number" ] }, - "description": "Subtract a Matrix or a number", - "name": "M" + "description": "Defines the rows of the matrix", + "name": "rows" + }, + { + "type": { + "names": [ + "number" + ] + }, + "description": "Defines the columns of the matrix", + "name": "cols" } ], "returns": [ @@ -2880,63 +2849,93 @@ } ], "examples": [ - "const A = Matrix.of([[5, 4]])\nA.subtract(1) // [[4, 2]]\nconst B = Matrix.of([[5, 5]])\nB.subtract(B) // [[0, 0]]" + "const A = Matrix.ones(1, 1)\n// [[1,1,1], [1,1,1], [1,1,1]]" ], - "longname": "Matrix#subtract" + "scope": "static", + "longname": "Matrix.ones" }, { "comment": "", "meta": { "range": [ - 15102, - 15458 + 12150, + 12257 ], "filename": "matrix.js", - "lineno": 696, + "lineno": 568, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001026", - "name": "Matrix.prototype.subtract", + "id": "astnode100000968", + "name": "Matrix.ones", "type": "FunctionExpression", "paramnames": [ - "M" + "rows", + "cols" ] }, "vars": { + "m": "Matrix.ones~m", "": null } }, "undocumented": true, - "name": "subtract", - "longname": "Matrix#subtract", + "name": "ones", + "longname": "Matrix.ones", "kind": "function", "memberof": "Matrix", - "scope": "instance" + "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @member multiply\n * @instance\n * @desc Mutliply a scalar or a mtraix with a matrix. Throws an error if the multiplication is not possible.\n * @param M {Matrix|number}\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.multiply(2) // [[10, 8]]\n * const B = Matrix.of([[5, 5]])\n * B.multiply(B) // [[25, 25]]\n *\n */", + "comment": "", + "meta": { + "range": [ + 12196, + 12220 + ], + "filename": "matrix.js", + "lineno": 569, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100000977", + "name": "m", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "m", + "longname": "Matrix.ones~m", + "kind": "constant", + "memberof": "Matrix.ones", + "scope": "inner", + "params": [] + }, + { + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member random\n * @desc Fill up an empty matrix with random values\n * @param {function} [f = e => Math.random() * 2 - 1]\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 707, + "lineno": 573, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "kind": "member", - "name": "multiply", "scope": "instance", - "description": "Mutliply a scalar or a mtraix with a matrix. Throws an error if the multiplication is not possible.", + "kind": "member", + "name": "random", + "description": "Fill up an empty matrix with random values", "params": [ { "type": { "names": [ - "Matrix", - "number" + "function" ] }, - "name": "M" + "optional": true, + "defaultvalue": "e => Math.random() * 2 - 1", + "name": "f" } ], "returns": [ @@ -2948,28 +2947,25 @@ } } ], - "examples": [ - "const A = Matrix.of([[5, 4]])\nA.multiply(2) // [[10, 8]]\nconst B = Matrix.of([[5, 5]])\nB.multiply(B) // [[25, 25]]" - ], - "longname": "Matrix#multiply" + "longname": "Matrix#random" }, { "comment": "", "meta": { "range": [ - 15824, - 16270 + 12445, + 12549 ], "filename": "matrix.js", - "lineno": 722, + "lineno": 581, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001103", - "name": "Matrix.prototype.multiply", + "id": "astnode100000996", + "name": "Matrix.prototype.random", "type": "FunctionExpression", "paramnames": [ - "M" + "f" ] }, "vars": { @@ -2977,26 +2973,54 @@ } }, "undocumented": true, - "name": "multiply", - "longname": "Matrix#multiply", + "name": "random", + "longname": "Matrix#random", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @member additiveinverse\n * @instance\n * @desc Function that returns the matrix obtained by changing the sign of every matrix element. The additive inverse of matrix A is written –A.\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5,-5], [-4, 4]])\n * const minusA = A.additiveinverse()\n * // [[-5, 5], [4, -4]]\n */", + "comment": "/**\n * @memberOf Matrix\n * @function random\n * @desc Fill up an empty matrix with random numbers\n * @param f {function} Function which returns random values. Default random values are between -1 and 1\n * @param rows {number} Defines the rows of the matrix\n * @param cols {number} Defines the columns of the matrix\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 734, + "lineno": 585, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "kind": "member", - "name": "additiveinverse", - "scope": "instance", - "description": "Function that returns the matrix obtained by changing the sign of every matrix element. The additive inverse of matrix A is written –A.", + "kind": "function", + "name": "random", + "description": "Fill up an empty matrix with random numbers", + "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "Function which returns random values. Default random values are between -1 and 1", + "name": "f" + }, + { + "type": { + "names": [ + "number" + ] + }, + "description": "Defines the rows of the matrix", + "name": "rows" + }, + { + "type": { + "names": [ + "number" + ] + }, + "description": "Defines the columns of the matrix", + "name": "cols" + } + ], "returns": [ { "type": { @@ -3006,103 +3030,126 @@ } } ], - "examples": [ - "const A = Matrix.of([[5,-5], [-4, 4]])\nconst minusA = A.additiveinverse()\n// [[-5, 5], [4, -4]]" - ], - "longname": "Matrix#additiveinverse" + "scope": "static", + "longname": "Matrix.random" }, { "comment": "", "meta": { "range": [ - 16626, - 16714 + 12890, + 13028 ], "filename": "matrix.js", - "lineno": 746, + "lineno": 594, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001186", - "name": "Matrix.prototype.additiveinverse", + "id": "astnode100001027", + "name": "Matrix.random", "type": "FunctionExpression", - "paramnames": [] + "paramnames": [ + "f", + "rows", + "cols" + ] + }, + "vars": { + "": null, + "m": "Matrix.random~m" } }, "undocumented": true, - "name": "additiveinverse", - "longname": "Matrix#additiveinverse", + "name": "random", + "longname": "Matrix.random", "kind": "function", "memberof": "Matrix", - "scope": "instance" + "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @member hadamard\n * @instance\n * @see multiply\n * @param M\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.hadamard(2) // [[10, 8]]\n * const B = Matrix.of([[5, 5]])\n * B.hadamard(B) // [[25, 25]]\n\n */", + "comment": "", "meta": { + "range": [ + 12972, + 12996 + ], "filename": "matrix.js", - "lineno": 750, - "columnno": 0, + "lineno": 595, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": {} + "code": { + "id": "astnode100001048", + "name": "m", + "type": "CallExpression", + "value": "" + } }, - "memberof": "Matrix", - "kind": "member", - "name": "hadamard", + "undocumented": true, + "name": "m", + "longname": "Matrix.random~m", + "kind": "constant", + "memberof": "Matrix.random", + "scope": "inner", + "params": [] + }, + { + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member toArray\n * @desc Returns the array from the matrix\n * @returns {Array}\n */", + "meta": { + "filename": "matrix.js", + "lineno": 599, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", "scope": "instance", - "see": [ - "multiply" - ], - "params": [ - { - "name": "M" - } - ], + "kind": "member", + "name": "toArray", + "description": "Returns the array from the matrix", "returns": [ { "type": { "names": [ - "Matrix" + "Array" ] } } ], - "examples": [ - "const A = Matrix.of([[5, 4]])\nA.hadamard(2) // [[10, 8]]\nconst B = Matrix.of([[5, 5]])\nB.hadamard(B) // [[25, 25]]" - ], - "longname": "Matrix#hadamard" + "longname": "Matrix#toArray" }, { "comment": "", "meta": { "range": [ - 16970, - 17051 + 13153, + 13249 ], "filename": "matrix.js", - "lineno": 765, + "lineno": 606, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001206", - "name": "Matrix.prototype.hadamard", + "id": "astnode100001065", + "name": "Matrix.prototype.toArray", "type": "FunctionExpression", - "paramnames": [ - "M" - ] + "paramnames": [] + }, + "vars": { + "": null } }, "undocumented": true, - "name": "hadamard", - "longname": "Matrix#hadamard", + "name": "toArray", + "longname": "Matrix#toArray", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member lu\n * @desc Calculates LU decomposition of the current Matrix\n * @returns {Matrix[]}\n * @example\n *\n * const result = [[3, -7, -2, 2], [-3, 5, 1, 0], [6, -4, 0, -5], [-9, 5, -5, 12]]\n * const A = Matrix.fromArray(result)\n * const lu = A.lu()\n * // L.__value = [ [ 1, 0, 0, 0 ], [ -1, 1, 0, 0 ], [ 2, -5, 1, 0 ], [ -3, 8, 3, 1 ] ]\n * // U.__value = [ [ 3, -7, -2, 2 ], [ 0, -2, -1, 2 ], [ 0, 0, -1, 1 ], [ 0, 0, 0, -1 ] ]\n * Matrix.dot(lu[0], lu[1]) // returns clone of A\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member clone\n * @desc Returns a clone of the matrix\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 769, + "lineno": 610, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -3110,214 +3157,1037 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "lu", - "description": "Calculates LU decomposition of the current Matrix", + "name": "clone", + "description": "Returns a clone of the matrix", "returns": [ { "type": { "names": [ - "Array." + "Matrix" ] } } ], - "examples": [ - "const result = [[3, -7, -2, 2], [-3, 5, 1, 0], [6, -4, 0, -5], [-9, 5, -5, 12]]\nconst A = Matrix.fromArray(result)\nconst lu = A.lu()\n// L.__value = [ [ 1, 0, 0, 0 ], [ -1, 1, 0, 0 ], [ 2, -5, 1, 0 ], [ -3, 8, 3, 1 ] ]\n// U.__value = [ [ 3, -7, -2, 2 ], [ 0, -2, -1, 2 ], [ 0, 0, -1, 1 ], [ 0, 0, 0, -1 ] ]\nMatrix.dot(lu[0], lu[1]) // returns clone of A" - ], - "longname": "Matrix#lu" + "longname": "Matrix#clone" }, { "comment": "", "meta": { "range": [ - 17580, - 18217 + 13369, + 13449 ], "filename": "matrix.js", - "lineno": 785, + "lineno": 617, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001226", - "name": "Matrix.prototype.lu", + "id": "astnode100001090", + "name": "Matrix.prototype.clone", "type": "FunctionExpression", "paramnames": [] - }, - "vars": { - "n": "Matrix#lu~n", - "tol": "Matrix#lu~tol", - "A": "Matrix#lu~A", - "L": "Matrix#lu~L", - "U": "Matrix#lu~U", - "k": "Matrix#lu~k", - "L.__value[undefined][undefined]": "Matrix#lu~L.__value[undefined][undefined]", - "i": "Matrix#lu~i", - "j": "Matrix#lu~j", - "A.__value[undefined][undefined]": "Matrix#lu~A.__value[undefined][undefined]", - "l": "Matrix#lu~l", - "U.__value[undefined][undefined]": "Matrix#lu~U.__value[undefined][undefined]" } }, "undocumented": true, - "name": "lu", - "longname": "Matrix#lu", + "name": "clone", + "longname": "Matrix#clone", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member fromArray\n * @desc Returns a Matrix from an array\n * @returns {Array}\n */", "meta": { - "range": [ - 17624, - 17642 - ], "filename": "matrix.js", - "lineno": 786, - "columnno": 8, + "lineno": 621, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100001235", - "name": "n", - "type": "CallExpression", - "value": "" - } + "code": {} }, - "undocumented": true, - "name": "n", - "longname": "Matrix#lu~n", - "kind": "constant", - "memberof": "Matrix#lu", - "scope": "inner", - "params": [] + "memberof": "Matrix", + "scope": "instance", + "kind": "member", + "name": "fromArray", + "description": "Returns a Matrix from an array", + "returns": [ + { + "type": { + "names": [ + "Array" + ] + } + } + ], + "longname": "Matrix#fromArray" }, { "comment": "", "meta": { "range": [ - 17651, - 17661 + 13573, + 13668 ], "filename": "matrix.js", - "lineno": 787, - "columnno": 8, + "lineno": 628, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001242", - "name": "tol", - "type": "Literal", - "value": 0.000001 + "id": "astnode100001107", + "name": "Matrix.fromArray", + "type": "FunctionExpression", + "paramnames": [ + "arr" + ] + }, + "vars": { + "": null } }, "undocumented": true, - "name": "tol", - "longname": "Matrix#lu~tol", - "kind": "constant", - "memberof": "Matrix#lu", - "scope": "inner", - "params": [] + "name": "fromArray", + "longname": "Matrix.fromArray", + "kind": "function", + "memberof": "Matrix", + "scope": "static" }, { - "comment": "", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member transpose\n * @desc Returns a transposed Matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([-1, 2], [3, 4], [-8, 2])\n * const b = A.transpose().toArray()\n * // returns [[-1, 3,-8], [2, 4, 2]]\n */", "meta": { - "range": [ - 17670, - 17686 - ], "filename": "matrix.js", - "lineno": 788, - "columnno": 8, + "lineno": 632, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100001246", - "name": "A", - "type": "CallExpression", - "value": "" - } + "code": {} }, - "undocumented": true, - "name": "A", - "longname": "Matrix#lu~A", - "kind": "constant", - "memberof": "Matrix#lu", - "scope": "inner", - "params": [] + "memberof": "Matrix", + "scope": "instance", + "kind": "member", + "name": "transpose", + "description": "Returns a transposed Matrix", + "returns": [ + { + "type": { + "names": [ + "Matrix" + ] + } + } + ], + "examples": [ + "const A = Matrix.of([-1, 2], [3, 4], [-8, 2])\nconst b = A.transpose().toArray()\n// returns [[-1, 3,-8], [2, 4, 2]]" + ], + "longname": "Matrix#transpose" }, { "comment": "", "meta": { "range": [ - 17695, - 17711 + 13929, + 14027 ], "filename": "matrix.js", - "lineno": 789, - "columnno": 8, + "lineno": 644, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001253", - "name": "L", - "type": "CallExpression", - "value": "" + "id": "astnode100001133", + "name": "Matrix.prototype.transpose", + "type": "FunctionExpression", + "paramnames": [] } }, "undocumented": true, - "name": "L", - "longname": "Matrix#lu~L", - "kind": "constant", - "memberof": "Matrix#lu", - "scope": "inner", - "params": [] + "name": "transpose", + "longname": "Matrix#transpose", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" }, { - "comment": "", + "comment": "/**\n * @memberOf Matrix\n * @function transpose\n * @desc Returns a transposed Matrix\n * @param M {Matrix|array} A Matrix or a matrix array\n * @returns {Matrix}\n * @example\n *\n * const a = [-1, 2], [3, 4], [-8, 2]\n * const b = Matrix.transpose(a).toArray()\n * // returns [[-1, 3,-8], [2, 4, 2]]\n */", "meta": { - "range": [ - 17720, - 17736 - ], "filename": "matrix.js", - "lineno": 790, - "columnno": 8, + "lineno": 648, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100001260", - "name": "U", - "type": "CallExpression", - "value": "" - } + "code": {} }, - "undocumented": true, - "name": "U", - "longname": "Matrix#lu~U", - "kind": "constant", - "memberof": "Matrix#lu", - "scope": "inner", - "params": [] + "memberof": "Matrix", + "kind": "function", + "name": "transpose", + "description": "Returns a transposed Matrix", + "params": [ + { + "type": { + "names": [ + "Matrix", + "array" + ] + }, + "description": "A Matrix or a matrix array", + "name": "M" + } + ], + "returns": [ + { + "type": { + "names": [ + "Matrix" + ] + } + } + ], + "examples": [ + "const a = [-1, 2], [3, 4], [-8, 2]\nconst b = Matrix.transpose(a).toArray()\n// returns [[-1, 3,-8], [2, 4, 2]]" + ], + "scope": "static", + "longname": "Matrix.transpose" }, { "comment": "", "meta": { "range": [ - 17749, - 17754 + 14326, + 14395 ], "filename": "matrix.js", - "lineno": 792, - "columnno": 11, + "lineno": 660, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001268", - "name": "k", - "type": "Literal", - "value": 0 - } - }, - "undocumented": true, + "id": "astnode100001154", + "name": "Matrix.transpose", + "type": "FunctionExpression", + "paramnames": [ + "M" + ] + } + }, + "undocumented": true, + "name": "transpose", + "longname": "Matrix.transpose", + "kind": "function", + "memberof": "Matrix", + "scope": "static" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @function add\n * @instance\n * @param M {Matrix|number} Add a Matrix or a number\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.add(1) // [[6, 5]]\n * const B = Matrix.of([[5, 5]])\n * B.add(B) // [[10, 10]]\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 664, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "kind": "function", + "name": "add", + "scope": "instance", + "params": [ + { + "type": { + "names": [ + "Matrix", + "number" + ] + }, + "description": "Add a Matrix or a number", + "name": "M" + } + ], + "returns": [ + { + "type": { + "names": [ + "Matrix" + ] + } + } + ], + "examples": [ + "const A = Matrix.of([[5, 4]])\nA.add(1) // [[6, 5]]\nconst B = Matrix.of([[5, 5]])\nB.add(B) // [[10, 10]]" + ], + "longname": "Matrix#add" + }, + { + "comment": "", + "meta": { + "range": [ + 14663, + 15009 + ], + "filename": "matrix.js", + "lineno": 678, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001171", + "name": "Matrix.prototype.add", + "type": "FunctionExpression", + "paramnames": [ + "M" + ] + }, + "vars": { + "": null + } + }, + "undocumented": true, + "name": "add", + "longname": "Matrix#add", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @member subtract\n * @instance\n * @param M {Matrix|number} Subtract a Matrix or a number\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.subtract(1) // [[4, 2]]\n * const B = Matrix.of([[5, 5]])\n * B.subtract(B) // [[0, 0]]\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 689, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "kind": "member", + "name": "subtract", + "scope": "instance", + "params": [ + { + "type": { + "names": [ + "Matrix", + "number" + ] + }, + "description": "Subtract a Matrix or a number", + "name": "M" + } + ], + "returns": [ + { + "type": { + "names": [ + "Matrix" + ] + } + } + ], + "examples": [ + "const A = Matrix.of([[5, 4]])\nA.subtract(1) // [[4, 2]]\nconst B = Matrix.of([[5, 5]])\nB.subtract(B) // [[0, 0]]" + ], + "longname": "Matrix#subtract" + }, + { + "comment": "", + "meta": { + "range": [ + 15293, + 15649 + ], + "filename": "matrix.js", + "lineno": 703, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001248", + "name": "Matrix.prototype.subtract", + "type": "FunctionExpression", + "paramnames": [ + "M" + ] + }, + "vars": { + "": null + } + }, + "undocumented": true, + "name": "subtract", + "longname": "Matrix#subtract", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @member multiply\n * @instance\n * @desc Mutliply a scalar or a mtraix with a matrix. Throws an error if the multiplication is not possible.\n * @param M {Matrix|number}\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.multiply(2) // [[10, 8]]\n * const B = Matrix.of([[5, 5]])\n * B.multiply(B) // [[25, 25]]\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 714, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "kind": "member", + "name": "multiply", + "scope": "instance", + "description": "Mutliply a scalar or a mtraix with a matrix. Throws an error if the multiplication is not possible.", + "params": [ + { + "type": { + "names": [ + "Matrix", + "number" + ] + }, + "name": "M" + } + ], + "returns": [ + { + "type": { + "names": [ + "Matrix" + ] + } + } + ], + "examples": [ + "const A = Matrix.of([[5, 4]])\nA.multiply(2) // [[10, 8]]\nconst B = Matrix.of([[5, 5]])\nB.multiply(B) // [[25, 25]]" + ], + "longname": "Matrix#multiply" + }, + { + "comment": "", + "meta": { + "range": [ + 16015, + 16461 + ], + "filename": "matrix.js", + "lineno": 729, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001325", + "name": "Matrix.prototype.multiply", + "type": "FunctionExpression", + "paramnames": [ + "M" + ] + }, + "vars": { + "": null + } + }, + "undocumented": true, + "name": "multiply", + "longname": "Matrix#multiply", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @member additiveinverse\n * @instance\n * @desc Function that returns the matrix obtained by changing the sign of every matrix element. The additive inverse of matrix A is written –A.\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5,-5], [-4, 4]])\n * const minusA = A.additiveinverse()\n * // [[-5, 5], [4, -4]]\n */", + "meta": { + "filename": "matrix.js", + "lineno": 741, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "kind": "member", + "name": "additiveinverse", + "scope": "instance", + "description": "Function that returns the matrix obtained by changing the sign of every matrix element. The additive inverse of matrix A is written –A.", + "returns": [ + { + "type": { + "names": [ + "Matrix" + ] + } + } + ], + "examples": [ + "const A = Matrix.of([[5,-5], [-4, 4]])\nconst minusA = A.additiveinverse()\n// [[-5, 5], [4, -4]]" + ], + "longname": "Matrix#additiveinverse" + }, + { + "comment": "", + "meta": { + "range": [ + 16817, + 16905 + ], + "filename": "matrix.js", + "lineno": 753, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001408", + "name": "Matrix.prototype.additiveinverse", + "type": "FunctionExpression", + "paramnames": [] + } + }, + "undocumented": true, + "name": "additiveinverse", + "longname": "Matrix#additiveinverse", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @member hadamard\n * @instance\n * @see multiply\n * @param M\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.hadamard(2) // [[10, 8]]\n * const B = Matrix.of([[5, 5]])\n * B.hadamard(B) // [[25, 25]]\n\n */", + "meta": { + "filename": "matrix.js", + "lineno": 757, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "kind": "member", + "name": "hadamard", + "scope": "instance", + "see": [ + "multiply" + ], + "params": [ + { + "name": "M" + } + ], + "returns": [ + { + "type": { + "names": [ + "Matrix" + ] + } + } + ], + "examples": [ + "const A = Matrix.of([[5, 4]])\nA.hadamard(2) // [[10, 8]]\nconst B = Matrix.of([[5, 5]])\nB.hadamard(B) // [[25, 25]]" + ], + "longname": "Matrix#hadamard" + }, + { + "comment": "", + "meta": { + "range": [ + 17161, + 17242 + ], + "filename": "matrix.js", + "lineno": 772, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001428", + "name": "Matrix.prototype.hadamard", + "type": "FunctionExpression", + "paramnames": [ + "M" + ] + } + }, + "undocumented": true, + "name": "hadamard", + "longname": "Matrix#hadamard", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member lu\n * @desc Calculates LU decomposition of the current Matrix\n * @returns {Matrix[]}\n * @example\n *\n * const result = [[3, -7, -2, 2], [-3, 5, 1, 0], [6, -4, 0, -5], [-9, 5, -5, 12]]\n * const A = Matrix.fromArray(result)\n * const lu = A.lu()\n * // L.__value = [ [ 1, 0, 0, 0 ], [ -1, 1, 0, 0 ], [ 2, -5, 1, 0 ], [ -3, 8, 3, 1 ] ]\n * // U.__value = [ [ 3, -7, -2, 2 ], [ 0, -2, -1, 2 ], [ 0, 0, -1, 1 ], [ 0, 0, 0, -1 ] ]\n * Matrix.dot(lu[0], lu[1]) // returns clone of A\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 776, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "scope": "instance", + "kind": "member", + "name": "lu", + "description": "Calculates LU decomposition of the current Matrix", + "returns": [ + { + "type": { + "names": [ + "Array." + ] + } + } + ], + "examples": [ + "const result = [[3, -7, -2, 2], [-3, 5, 1, 0], [6, -4, 0, -5], [-9, 5, -5, 12]]\nconst A = Matrix.fromArray(result)\nconst lu = A.lu()\n// L.__value = [ [ 1, 0, 0, 0 ], [ -1, 1, 0, 0 ], [ 2, -5, 1, 0 ], [ -3, 8, 3, 1 ] ]\n// U.__value = [ [ 3, -7, -2, 2 ], [ 0, -2, -1, 2 ], [ 0, 0, -1, 1 ], [ 0, 0, 0, -1 ] ]\nMatrix.dot(lu[0], lu[1]) // returns clone of A" + ], + "longname": "Matrix#lu" + }, + { + "comment": "", + "meta": { + "range": [ + 17771, + 18408 + ], + "filename": "matrix.js", + "lineno": 792, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001448", + "name": "Matrix.prototype.lu", + "type": "FunctionExpression", + "paramnames": [] + }, + "vars": { + "n": "Matrix#lu~n", + "tol": "Matrix#lu~tol", + "A": "Matrix#lu~A", + "L": "Matrix#lu~L", + "U": "Matrix#lu~U", + "k": "Matrix#lu~k", + "L.__value[undefined][undefined]": "Matrix#lu~L.__value[undefined][undefined]", + "i": "Matrix#lu~i", + "j": "Matrix#lu~j", + "A.__value[undefined][undefined]": "Matrix#lu~A.__value[undefined][undefined]", + "l": "Matrix#lu~l", + "U.__value[undefined][undefined]": "Matrix#lu~U.__value[undefined][undefined]" + } + }, + "undocumented": true, + "name": "lu", + "longname": "Matrix#lu", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" + }, + { + "comment": "", + "meta": { + "range": [ + 17815, + 17833 + ], + "filename": "matrix.js", + "lineno": 793, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001457", + "name": "n", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "n", + "longname": "Matrix#lu~n", + "kind": "constant", + "memberof": "Matrix#lu", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 17842, + 17852 + ], + "filename": "matrix.js", + "lineno": 794, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001464", + "name": "tol", + "type": "Literal", + "value": 0.000001 + } + }, + "undocumented": true, + "name": "tol", + "longname": "Matrix#lu~tol", + "kind": "constant", + "memberof": "Matrix#lu", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 17861, + 17877 + ], + "filename": "matrix.js", + "lineno": 795, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001468", + "name": "A", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "A", + "longname": "Matrix#lu~A", + "kind": "constant", + "memberof": "Matrix#lu", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 17886, + 17902 + ], + "filename": "matrix.js", + "lineno": 796, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001475", + "name": "L", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "L", + "longname": "Matrix#lu~L", + "kind": "constant", + "memberof": "Matrix#lu", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 17911, + 17927 + ], + "filename": "matrix.js", + "lineno": 797, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001482", + "name": "U", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "U", + "longname": "Matrix#lu~U", + "kind": "constant", + "memberof": "Matrix#lu", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 17940, + 17945 + ], + "filename": "matrix.js", + "lineno": 799, + "columnno": 11, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001490", + "name": "k", + "type": "Literal", + "value": 0 + } + }, + "undocumented": true, "name": "k", "longname": "Matrix#lu~k", "kind": "member", - "memberof": "Matrix#lu", + "memberof": "Matrix#lu", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 18059, + 18078 + ], + "filename": "matrix.js", + "lineno": 801, + "columnno": 4, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001518", + "name": "L.__value[undefined][undefined]", + "type": "Literal", + "funcscope": "Matrix#lu", + "value": 1, + "paramnames": [] + } + }, + "undocumented": true, + "name": "__value[undefined][undefined]", + "longname": "Matrix#lu~L.__value[undefined][undefined]", + "kind": "member", + "memberof": "Matrix#lu~L", + "scope": "static" + }, + { + "comment": "", + "meta": { + "range": [ + 18092, + 18101 + ], + "filename": "matrix.js", + "lineno": 802, + "columnno": 13, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001529", + "name": "i", + "type": "BinaryExpression", + "value": "" + } + }, + "undocumented": true, + "name": "i", + "longname": "Matrix#lu~i", + "kind": "member", + "memberof": "Matrix#lu", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 18123, + 18174 + ], + "filename": "matrix.js", + "lineno": 803, + "columnno": 6, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001541", + "name": "L.__value[undefined][undefined]", + "type": "BinaryExpression", + "funcscope": "Matrix#lu", + "value": "", + "paramnames": [] + } + }, + "undocumented": true, + "name": "__value[undefined][undefined]", + "longname": "Matrix#lu~L.__value[undefined][undefined]", + "kind": "member", + "memberof": "Matrix#lu~L", + "scope": "static" + }, + { + "comment": "", + "meta": { + "range": [ + 18190, + 18199 + ], + "filename": "matrix.js", + "lineno": 804, + "columnno": 15, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001566", + "name": "j", + "type": "BinaryExpression", + "value": "" + } + }, + "undocumented": true, + "name": "j", + "longname": "Matrix#lu~j", + "kind": "member", + "memberof": "Matrix#lu", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 18223, + 18292 + ], + "filename": "matrix.js", + "lineno": 805, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001578", + "name": "A.__value[undefined][undefined]", + "type": "BinaryExpression", + "funcscope": "Matrix#lu", + "value": "", + "paramnames": [] + } + }, + "undocumented": true, + "name": "__value[undefined][undefined]", + "longname": "Matrix#lu~A.__value[undefined][undefined]", + "kind": "member", + "memberof": "Matrix#lu~A", + "scope": "static" + }, + { + "comment": "", + "meta": { + "range": [ + 18320, + 18325 + ], + "filename": "matrix.js", + "lineno": 808, + "columnno": 13, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001611", + "name": "l", + "type": "Identifier", + "value": "k" + } + }, + "undocumented": true, + "name": "l", + "longname": "Matrix#lu~l", + "kind": "member", + "memberof": "Matrix#lu", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 18347, + 18380 + ], + "filename": "matrix.js", + "lineno": 809, + "columnno": 6, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001621", + "name": "U.__value[undefined][undefined]", + "type": "MemberExpression", + "funcscope": "Matrix#lu", + "value": "A.__value[undefined][undefined]", + "paramnames": [] + } + }, + "undocumented": true, + "name": "__value[undefined][undefined]", + "longname": "Matrix#lu~U.__value[undefined][undefined]", + "kind": "member", + "memberof": "Matrix#lu~U", + "scope": "static" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member rref\n * @returns {Matrix|array}\n * @example\n *\n * var A = Matrix.of([[-1, 1], [-1, 0], [0, -1], [-1, -2]])\n * A.rref() // [ [ 1, 0 ], [ -0, 1 ], [ 0, 0 ], [ 0, 0 ] ]\n */", + "meta": { + "filename": "matrix.js", + "lineno": 815, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "scope": "instance", + "kind": "member", + "name": "rref", + "returns": [ + { + "type": { + "names": [ + "Matrix", + "array" + ] + } + } + ], + "examples": [ + "var A = Matrix.of([[-1, 1], [-1, 0], [0, -1], [-1, -2]])\nA.rref() // [ [ 1, 0 ], [ -0, 1 ], [ 0, 0 ], [ 0, 0 ] ]" + ], + "longname": "Matrix#rref" + }, + { + "comment": "", + "meta": { + "range": [ + 18629, + 19615 + ], + "filename": "matrix.js", + "lineno": 825, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001641", + "name": "Matrix.prototype.rref", + "type": "FunctionExpression", + "paramnames": [] + }, + "vars": { + "lead": "Matrix#rref~lead", + "resultMatrix": "Matrix#rref~resultMatrix", + "r": "Matrix#rref~r", + "i": "Matrix#rref~i", + "tmp": "Matrix#rref~tmp", + "resultMatrix.__value[undefined]": "Matrix#rref~resultMatrix.__value[undefined]", + "val": "Matrix#rref~val", + "j": "Matrix#rref~j", + "resultMatrix.__value[undefined][undefined]": "Matrix#rref~resultMatrix.__value[undefined][undefined]" + } + }, + "undocumented": true, + "name": "rref", + "longname": "Matrix#rref", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" + }, + { + "comment": "", + "meta": { + "range": [ + 18673, + 18681 + ], + "filename": "matrix.js", + "lineno": 826, + "columnno": 6, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001650", + "name": "lead", + "type": "Literal", + "value": 0 + } + }, + "undocumented": true, + "name": "lead", + "longname": "Matrix#rref~lead", + "kind": "member", + "memberof": "Matrix#rref", "scope": "inner", "params": [] }, @@ -3325,52 +4195,77 @@ "comment": "", "meta": { "range": [ - 17868, - 17887 + 18690, + 18717 ], "filename": "matrix.js", - "lineno": 794, - "columnno": 4, + "lineno": 827, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001296", - "name": "L.__value[undefined][undefined]", + "id": "astnode100001654", + "name": "resultMatrix", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "resultMatrix", + "longname": "Matrix#rref~resultMatrix", + "kind": "constant", + "memberof": "Matrix#rref", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 18730, + 18735 + ], + "filename": "matrix.js", + "lineno": 829, + "columnno": 11, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001662", + "name": "r", "type": "Literal", - "funcscope": "Matrix#lu", - "value": 1, - "paramnames": [] + "value": 0 } }, "undocumented": true, - "name": "__value[undefined][undefined]", - "longname": "Matrix#lu~L.__value[undefined][undefined]", + "name": "r", + "longname": "Matrix#rref~r", "kind": "member", - "memberof": "Matrix#lu~L", - "scope": "static" + "memberof": "Matrix#rref", + "scope": "inner", + "params": [] }, { "comment": "", "meta": { "range": [ - 17901, - 17910 + 18838, + 18843 ], "filename": "matrix.js", - "lineno": 795, - "columnno": 13, + "lineno": 833, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001307", + "id": "astnode100001685", "name": "i", - "type": "BinaryExpression", - "value": "" + "type": "Identifier", + "value": "r" } }, "undocumented": true, "name": "i", - "longname": "Matrix#lu~i", + "longname": "Matrix#rref~i", "kind": "member", - "memberof": "Matrix#lu", + "memberof": "Matrix#rref", "scope": "inner", "params": [] }, @@ -3378,52 +4273,158 @@ "comment": "", "meta": { "range": [ - 17932, - 17983 + 18946, + 18951 ], "filename": "matrix.js", - "lineno": 796, - "columnno": 6, + "lineno": 837, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001319", - "name": "L.__value[undefined][undefined]", - "type": "BinaryExpression", - "funcscope": "Matrix#lu", - "value": "", + "id": "astnode100001711", + "name": "i", + "type": "Identifier", + "funcscope": "Matrix#rref", + "value": "r", "paramnames": [] } }, "undocumented": true, - "name": "__value[undefined][undefined]", - "longname": "Matrix#lu~L.__value[undefined][undefined]", + "name": "i", + "longname": "Matrix#rref~i", "kind": "member", - "memberof": "Matrix#lu~L", + "memberof": "Matrix#rref", + "scope": "inner" + }, + { + "comment": "", + "meta": { + "range": [ + 19069, + 19098 + ], + "filename": "matrix.js", + "lineno": 845, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001728", + "name": "tmp", + "type": "MemberExpression", + "value": "resultMatrix.__value[undefined]" + } + }, + "undocumented": true, + "name": "tmp", + "longname": "Matrix#rref~tmp", + "kind": "member", + "memberof": "Matrix#rref", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 19103, + 19152 + ], + "filename": "matrix.js", + "lineno": 846, + "columnno": 4, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001736", + "name": "resultMatrix.__value[undefined]", + "type": "MemberExpression", + "funcscope": "Matrix#rref", + "value": "resultMatrix.__value[undefined]", + "paramnames": [] + } + }, + "undocumented": true, + "name": "__value[undefined]", + "longname": "Matrix#rref~resultMatrix.__value[undefined]", + "kind": "member", + "memberof": "Matrix#rref~resultMatrix", "scope": "static" }, { "comment": "", "meta": { "range": [ - 17999, - 18008 + 19157, + 19186 ], "filename": "matrix.js", - "lineno": 797, - "columnno": 15, + "lineno": 847, + "columnno": 4, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001748", + "name": "resultMatrix.__value[undefined]", + "type": "Identifier", + "funcscope": "Matrix#rref", + "value": "tmp", + "paramnames": [] + } + }, + "undocumented": true, + "name": "__value[undefined]", + "longname": "Matrix#rref~resultMatrix.__value[undefined]", + "kind": "member", + "memberof": "Matrix#rref~resultMatrix", + "scope": "static" + }, + { + "comment": "", + "meta": { + "range": [ + 19196, + 19231 + ], + "filename": "matrix.js", + "lineno": 849, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001344", + "id": "astnode100001756", + "name": "val", + "type": "MemberExpression", + "value": "resultMatrix.__value[undefined][undefined]" + } + }, + "undocumented": true, + "name": "val", + "longname": "Matrix#rref~val", + "kind": "member", + "memberof": "Matrix#rref", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 19245, + 19250 + ], + "filename": "matrix.js", + "lineno": 850, + "columnno": 13, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001767", "name": "j", - "type": "BinaryExpression", - "value": "" + "type": "Literal", + "value": 0 } }, "undocumented": true, "name": "j", - "longname": "Matrix#lu~j", + "longname": "Matrix#rref~j", "kind": "member", - "memberof": "Matrix#lu", + "memberof": "Matrix#rref", "scope": "inner", "params": [] }, @@ -3431,52 +4432,105 @@ "comment": "", "meta": { "range": [ - 18032, - 18101 + 19285, + 19318 ], "filename": "matrix.js", - "lineno": 798, - "columnno": 8, + "lineno": 851, + "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001356", - "name": "A.__value[undefined][undefined]", - "type": "BinaryExpression", - "funcscope": "Matrix#lu", - "value": "", + "id": "astnode100001780", + "name": "resultMatrix.__value[undefined][undefined]", + "type": "Identifier", + "funcscope": "Matrix#rref", + "value": "val", "paramnames": [] } }, "undocumented": true, "name": "__value[undefined][undefined]", - "longname": "Matrix#lu~A.__value[undefined][undefined]", + "longname": "Matrix#rref~resultMatrix.__value[undefined][undefined]", "kind": "member", - "memberof": "Matrix#lu~A", + "memberof": "Matrix#rref~resultMatrix", "scope": "static" }, { "comment": "", "meta": { "range": [ - 18129, - 18134 + 19339, + 19344 ], "filename": "matrix.js", - "lineno": 801, + "lineno": 854, "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001389", - "name": "l", - "type": "Identifier", - "value": "k" + "id": "astnode100001791", + "name": "i", + "type": "Literal", + "value": 0 + } + }, + "undocumented": true, + "name": "i", + "longname": "Matrix#rref~i", + "kind": "member", + "memberof": "Matrix#rref", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 19407, + 19442 + ], + "filename": "matrix.js", + "lineno": 856, + "columnno": 6, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001809", + "name": "val", + "type": "MemberExpression", + "funcscope": "Matrix#rref", + "value": "resultMatrix.__value[undefined][undefined]", + "paramnames": [] + } + }, + "undocumented": true, + "name": "val", + "longname": "Matrix#rref~val", + "kind": "member", + "memberof": "Matrix#rref", + "scope": "inner" + }, + { + "comment": "", + "meta": { + "range": [ + 19458, + 19463 + ], + "filename": "matrix.js", + "lineno": 857, + "columnno": 15, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001820", + "name": "j", + "type": "Literal", + "value": 0 } }, "undocumented": true, - "name": "l", - "longname": "Matrix#lu~l", + "name": "j", + "longname": "Matrix#rref~j", "kind": "member", - "memberof": "Matrix#lu", + "memberof": "Matrix#rref", "scope": "inner", "params": [] }, @@ -3484,34 +4538,34 @@ "comment": "", "meta": { "range": [ - 18156, - 18189 + 19500, + 19562 ], "filename": "matrix.js", - "lineno": 802, - "columnno": 6, + "lineno": 858, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001399", - "name": "U.__value[undefined][undefined]", - "type": "MemberExpression", - "funcscope": "Matrix#lu", - "value": "A.__value[undefined][undefined]", + "id": "astnode100001833", + "name": "resultMatrix.__value[undefined][undefined]", + "type": "BinaryExpression", + "funcscope": "Matrix#rref", + "value": "", "paramnames": [] } }, "undocumented": true, "name": "__value[undefined][undefined]", - "longname": "Matrix#lu~U.__value[undefined][undefined]", + "longname": "Matrix#rref~resultMatrix.__value[undefined][undefined]", "kind": "member", - "memberof": "Matrix#lu~U", + "memberof": "Matrix#rref~resultMatrix", "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member rref\n * @returns {Matrix|array}\n * @example\n *\n * var A = Matrix.of([[-1, 1], [-1, 0], [0, -1], [-1, -2]])\n * A.rref() // [ [ 1, 0 ], [ -0, 1 ], [ 0, 0 ], [ 0, 0 ] ]\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member solve\n * @param b\n * @returns {Array}\n * @example\n *\n * // Solve xA = b\n * // 5x + y = 7\n * // 3x - 4y = 18\n * // Solution for x and y:\n * // x = 2\n * // y = -3\n *\n * const A = Matrix.of([[5, 1], [3, -4]])\n * const solveA = A.solve([7, 18]) // [2, -3]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 808, + "lineno": 866, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -3519,54 +4573,66 @@ "memberof": "Matrix", "scope": "instance", "kind": "member", - "name": "rref", + "name": "solve", + "params": [ + { + "name": "b" + } + ], "returns": [ { "type": { "names": [ - "Matrix", - "array" + "Array" ] } } ], "examples": [ - "var A = Matrix.of([[-1, 1], [-1, 0], [0, -1], [-1, -2]])\nA.rref() // [ [ 1, 0 ], [ -0, 1 ], [ 0, 0 ], [ 0, 0 ] ]" + "// Solve xA = b\n// 5x + y = 7\n// 3x - 4y = 18\n// Solution for x and y:\n// x = 2\n// y = -3\n\nconst A = Matrix.of([[5, 1], [3, -4]])\nconst solveA = A.solve([7, 18]) // [2, -3]" ], - "longname": "Matrix#rref" + "longname": "Matrix#solve" }, { "comment": "", "meta": { "range": [ - 18438, - 19424 + 19925, + 20447 ], "filename": "matrix.js", - "lineno": 818, + "lineno": 885, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001419", - "name": "Matrix.prototype.rref", + "id": "astnode100001856", + "name": "Matrix.prototype.solve", "type": "FunctionExpression", - "paramnames": [] + "paramnames": [ + "b" + ] }, "vars": { - "lead": "Matrix#rref~lead", - "resultMatrix": "Matrix#rref~resultMatrix", - "r": "Matrix#rref~r", - "i": "Matrix#rref~i", - "tmp": "Matrix#rref~tmp", - "resultMatrix.__value[undefined]": "Matrix#rref~resultMatrix.__value[undefined]", - "val": "Matrix#rref~val", - "j": "Matrix#rref~j", - "resultMatrix.__value[undefined][undefined]": "Matrix#rref~resultMatrix.__value[undefined][undefined]" + "A": "Matrix#solve~A", + "LU": "Matrix#solve~LU", + "L": "Matrix#solve~L", + "U": "Matrix#solve~U", + "n": "Matrix#solve~n", + "s": "Matrix#solve~s", + "c": "Matrix#solve~c", + "x": "Matrix#solve~x", + "k": "Matrix#solve~k", + "j": "Matrix#solve~j", + "c[undefined]": "Matrix#solve~c.undefined]", + "a": "Matrix#solve~a", + "t": "Matrix#solve~t", + "b": "Matrix#solve~b", + "x[undefined]": "Matrix#solve~x.undefined]" } }, "undocumented": true, - "name": "rref", - "longname": "Matrix#rref", + "name": "solve", + "longname": "Matrix#solve", "kind": "function", "memberof": "Matrix", "scope": "instance" @@ -3575,25 +4641,25 @@ "comment": "", "meta": { "range": [ - 18482, - 18490 + 19973, + 19989 ], "filename": "matrix.js", - "lineno": 819, - "columnno": 6, + "lineno": 886, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001428", - "name": "lead", - "type": "Literal", - "value": 0 + "id": "astnode100001866", + "name": "A", + "type": "CallExpression", + "value": "" } }, "undocumented": true, - "name": "lead", - "longname": "Matrix#rref~lead", - "kind": "member", - "memberof": "Matrix#rref", + "name": "A", + "longname": "Matrix#solve~A", + "kind": "constant", + "memberof": "Matrix#solve", "scope": "inner", "params": [] }, @@ -3601,25 +4667,25 @@ "comment": "", "meta": { "range": [ - 18499, - 18526 + 19998, + 20009 ], "filename": "matrix.js", - "lineno": 820, + "lineno": 887, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001432", - "name": "resultMatrix", + "id": "astnode100001873", + "name": "LU", "type": "CallExpression", "value": "" } }, "undocumented": true, - "name": "resultMatrix", - "longname": "Matrix#rref~resultMatrix", + "name": "LU", + "longname": "Matrix#solve~LU", "kind": "constant", - "memberof": "Matrix#rref", + "memberof": "Matrix#solve", "scope": "inner", "params": [] }, @@ -3627,25 +4693,103 @@ "comment": "", "meta": { "range": [ - 18539, - 18544 + 20018, + 20027 ], "filename": "matrix.js", - "lineno": 822, - "columnno": 11, + "lineno": 888, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001440", - "name": "r", + "id": "astnode100001880", + "name": "L", + "type": "MemberExpression", + "value": "LU[0]" + } + }, + "undocumented": true, + "name": "L", + "longname": "Matrix#solve~L", + "kind": "constant", + "memberof": "Matrix#solve", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 20036, + 20045 + ], + "filename": "matrix.js", + "lineno": 889, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001886", + "name": "U", + "type": "MemberExpression", + "value": "LU[1]" + } + }, + "undocumented": true, + "name": "U", + "longname": "Matrix#solve~U", + "kind": "constant", + "memberof": "Matrix#solve", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 20054, + 20072 + ], + "filename": "matrix.js", + "lineno": 890, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001892", + "name": "n", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "n", + "longname": "Matrix#solve~n", + "kind": "constant", + "memberof": "Matrix#solve", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 20079, + 20084 + ], + "filename": "matrix.js", + "lineno": 891, + "columnno": 6, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001899", + "name": "s", "type": "Literal", "value": 0 } }, "undocumented": true, - "name": "r", - "longname": "Matrix#rref~r", + "name": "s", + "longname": "Matrix#solve~s", "kind": "member", - "memberof": "Matrix#rref", + "memberof": "Matrix#solve", "scope": "inner", "params": [] }, @@ -3653,25 +4797,25 @@ "comment": "", "meta": { "range": [ - 18647, - 18652 + 20093, + 20099 ], "filename": "matrix.js", - "lineno": 826, + "lineno": 892, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001463", - "name": "i", - "type": "Identifier", - "value": "r" + "id": "astnode100001903", + "name": "c", + "type": "ArrayExpression", + "value": "[]" } }, "undocumented": true, - "name": "i", - "longname": "Matrix#rref~i", - "kind": "member", - "memberof": "Matrix#rref", + "name": "c", + "longname": "Matrix#solve~c", + "kind": "constant", + "memberof": "Matrix#solve", "scope": "inner", "params": [] }, @@ -3679,52 +4823,77 @@ "comment": "", "meta": { "range": [ - 18755, - 18760 + 20108, + 20114 ], "filename": "matrix.js", - "lineno": 830, + "lineno": 893, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001489", - "name": "i", - "type": "Identifier", - "funcscope": "Matrix#rref", - "value": "r", - "paramnames": [] + "id": "astnode100001907", + "name": "x", + "type": "ArrayExpression", + "value": "[]" } }, "undocumented": true, - "name": "i", - "longname": "Matrix#rref~i", + "name": "x", + "longname": "Matrix#solve~x", + "kind": "constant", + "memberof": "Matrix#solve", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 20127, + 20132 + ], + "filename": "matrix.js", + "lineno": 895, + "columnno": 11, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100001912", + "name": "k", + "type": "Literal", + "value": 0 + } + }, + "undocumented": true, + "name": "k", + "longname": "Matrix#solve~k", "kind": "member", - "memberof": "Matrix#rref", - "scope": "inner" + "memberof": "Matrix#solve", + "scope": "inner", + "params": [] }, { "comment": "", "meta": { "range": [ - 18878, - 18907 + 20161, + 20166 ], "filename": "matrix.js", - "lineno": 838, - "columnno": 8, + "lineno": 896, + "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001506", - "name": "tmp", - "type": "MemberExpression", - "value": "resultMatrix.__value[undefined]" + "id": "astnode100001923", + "name": "j", + "type": "Literal", + "value": 0 } }, "undocumented": true, - "name": "tmp", - "longname": "Matrix#rref~tmp", + "name": "j", + "longname": "Matrix#solve~j", "kind": "member", - "memberof": "Matrix#rref", + "memberof": "Matrix#solve", "scope": "inner", "params": [] }, @@ -3732,105 +4901,106 @@ "comment": "", "meta": { "range": [ - 18912, - 18961 + 20188, + 20218 ], "filename": "matrix.js", - "lineno": 839, - "columnno": 4, + "lineno": 897, + "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001514", - "name": "resultMatrix.__value[undefined]", - "type": "MemberExpression", - "funcscope": "Matrix#rref", - "value": "resultMatrix.__value[undefined]", + "id": "astnode100001933", + "name": "s", + "type": "BinaryExpression", + "funcscope": "Matrix#solve", + "value": "", "paramnames": [] } }, "undocumented": true, - "name": "__value[undefined]", - "longname": "Matrix#rref~resultMatrix.__value[undefined]", + "name": "s", + "longname": "Matrix#solve~s", "kind": "member", - "memberof": "Matrix#rref~resultMatrix", - "scope": "static" + "memberof": "Matrix#solve", + "scope": "inner" }, { "comment": "", "meta": { "range": [ - 18966, - 18995 + 20229, + 20244 ], "filename": "matrix.js", - "lineno": 840, + "lineno": 899, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001526", - "name": "resultMatrix.__value[undefined]", - "type": "Identifier", - "funcscope": "Matrix#rref", - "value": "tmp", + "id": "astnode100001949", + "name": "c[undefined]", + "type": "BinaryExpression", + "funcscope": "Matrix#solve", + "value": "", "paramnames": [] } }, "undocumented": true, - "name": "__value[undefined]", - "longname": "Matrix#rref~resultMatrix.__value[undefined]", + "name": "undefined]", + "longname": "Matrix#solve~c.undefined]", "kind": "member", - "memberof": "Matrix#rref~resultMatrix", + "memberof": "Matrix#solve~c", "scope": "static" }, { "comment": "", "meta": { "range": [ - 19005, - 19040 + 20249, + 20254 ], "filename": "matrix.js", - "lineno": 842, - "columnno": 8, + "lineno": 900, + "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001534", - "name": "val", - "type": "MemberExpression", - "value": "resultMatrix.__value[undefined][undefined]" + "id": "astnode100001959", + "name": "s", + "type": "Literal", + "funcscope": "Matrix#solve", + "value": 0, + "paramnames": [] } }, "undocumented": true, - "name": "val", - "longname": "Matrix#rref~val", + "name": "s", + "longname": "Matrix#solve~s", "kind": "member", - "memberof": "Matrix#rref", - "scope": "inner", - "params": [] + "memberof": "Matrix#solve", + "scope": "inner" }, { "comment": "", "meta": { "range": [ - 19054, - 19059 + 20270, + 20279 ], "filename": "matrix.js", - "lineno": 843, - "columnno": 13, + "lineno": 902, + "columnno": 11, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001545", - "name": "j", - "type": "Literal", - "value": 0 + "id": "astnode100001964", + "name": "a", + "type": "BinaryExpression", + "value": "" } }, "undocumented": true, - "name": "j", - "longname": "Matrix#rref~j", + "name": "a", + "longname": "Matrix#solve~a", "kind": "member", - "memberof": "Matrix#rref", + "memberof": "Matrix#solve", "scope": "inner", "params": [] }, @@ -3838,52 +5008,51 @@ "comment": "", "meta": { "range": [ - 19094, - 19127 + 20304, + 20309 ], "filename": "matrix.js", - "lineno": 844, - "columnno": 6, + "lineno": 903, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001558", - "name": "resultMatrix.__value[undefined][undefined]", - "type": "Identifier", - "funcscope": "Matrix#rref", - "value": "val", - "paramnames": [] + "id": "astnode100001977", + "name": "t", + "type": "Literal", + "value": 0 } }, "undocumented": true, - "name": "__value[undefined][undefined]", - "longname": "Matrix#rref~resultMatrix.__value[undefined][undefined]", + "name": "t", + "longname": "Matrix#solve~t", "kind": "member", - "memberof": "Matrix#rref~resultMatrix", - "scope": "static" + "memberof": "Matrix#solve", + "scope": "inner", + "params": [] }, { "comment": "", "meta": { "range": [ - 19148, - 19153 + 20323, + 20332 ], "filename": "matrix.js", - "lineno": 847, + "lineno": 904, "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001569", - "name": "i", - "type": "Literal", - "value": 0 + "id": "astnode100001982", + "name": "b", + "type": "BinaryExpression", + "value": "" } }, "undocumented": true, - "name": "i", - "longname": "Matrix#rref~i", + "name": "b", + "longname": "Matrix#solve~b", "kind": "member", - "memberof": "Matrix#rref", + "memberof": "Matrix#solve", "scope": "inner", "params": [] }, @@ -3891,154 +5060,111 @@ "comment": "", "meta": { "range": [ - 19216, - 19251 + 20354, + 20384 ], "filename": "matrix.js", - "lineno": 849, + "lineno": 905, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001587", - "name": "val", - "type": "MemberExpression", - "funcscope": "Matrix#rref", - "value": "resultMatrix.__value[undefined][undefined]", + "id": "astnode100001994", + "name": "t", + "type": "BinaryExpression", + "funcscope": "Matrix#solve", + "value": "", "paramnames": [] } }, "undocumented": true, - "name": "val", - "longname": "Matrix#rref~val", + "name": "t", + "longname": "Matrix#solve~t", "kind": "member", - "memberof": "Matrix#rref", + "memberof": "Matrix#solve", "scope": "inner" }, { "comment": "", "meta": { "range": [ - 19267, - 19272 - ], - "filename": "matrix.js", - "lineno": 850, - "columnno": 15, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100001598", - "name": "j", - "type": "Literal", - "value": 0 - } - }, - "undocumented": true, - "name": "j", - "longname": "Matrix#rref~j", - "kind": "member", - "memberof": "Matrix#rref", - "scope": "inner", - "params": [] - }, - { - "comment": "", - "meta": { - "range": [ - 19309, - 19371 + 20395, + 20430 ], "filename": "matrix.js", - "lineno": 851, - "columnno": 8, + "lineno": 907, + "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001611", - "name": "resultMatrix.__value[undefined][undefined]", + "id": "astnode100002010", + "name": "x[undefined]", "type": "BinaryExpression", - "funcscope": "Matrix#rref", + "funcscope": "Matrix#solve", "value": "", "paramnames": [] } }, "undocumented": true, - "name": "__value[undefined][undefined]", - "longname": "Matrix#rref~resultMatrix.__value[undefined][undefined]", + "name": "undefined]", + "longname": "Matrix#solve~x.undefined]", "kind": "member", - "memberof": "Matrix#rref~resultMatrix", + "memberof": "Matrix#solve~x", "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member solve\n * @param b\n * @returns {Array}\n * @example\n *\n * // Solve xA = b\n * // 5x + y = 7\n * // 3x - 4y = 18\n * // Solution for x and y:\n * // x = 2\n * // y = -3\n *\n * const A = Matrix.of([[5, 1], [3, -4]])\n * const solveA = A.solve([7, 18]) // [2, -3]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @member inverse\n * @instance\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[1, 1], [2, 4]]).inverse()\n * // [ [ 2, -0.5 ], [ -1, 0.5 ] ]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 859, + "lineno": 912, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "scope": "instance", "kind": "member", - "name": "solve", - "params": [ - { - "name": "b" - } - ], + "name": "inverse", + "scope": "instance", "returns": [ { "type": { "names": [ - "Array" + "Matrix" ] } } ], "examples": [ - "// Solve xA = b\n// 5x + y = 7\n// 3x - 4y = 18\n// Solution for x and y:\n// x = 2\n// y = -3\n\nconst A = Matrix.of([[5, 1], [3, -4]])\nconst solveA = A.solve([7, 18]) // [2, -3]" + "const A = Matrix.of([[1, 1], [2, 4]]).inverse()\n// [ [ 2, -0.5 ], [ -1, 0.5 ] ]" ], - "longname": "Matrix#solve" + "longname": "Matrix#inverse" }, { "comment": "", "meta": { "range": [ - 19734, - 20256 + 20634, + 20943 ], "filename": "matrix.js", - "lineno": 878, + "lineno": 923, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001634", - "name": "Matrix.prototype.solve", + "id": "astnode100002030", + "name": "Matrix.prototype.inverse", "type": "FunctionExpression", - "paramnames": [ - "b" - ] + "paramnames": [] }, "vars": { - "A": "Matrix#solve~A", - "LU": "Matrix#solve~LU", - "L": "Matrix#solve~L", - "U": "Matrix#solve~U", - "n": "Matrix#solve~n", - "s": "Matrix#solve~s", - "c": "Matrix#solve~c", - "x": "Matrix#solve~x", - "k": "Matrix#solve~k", - "j": "Matrix#solve~j", - "c[undefined]": "Matrix#solve~c.undefined]", - "a": "Matrix#solve~a", - "t": "Matrix#solve~t", - "b": "Matrix#solve~b", - "x[undefined]": "Matrix#solve~x.undefined]" + "A": "Matrix#inverse~A", + "I": "Matrix#inverse~I", + "Inv": "Matrix#inverse~Inv", + "result": "Matrix#inverse~result", + "": null } }, "undocumented": true, - "name": "solve", - "longname": "Matrix#solve", + "name": "inverse", + "longname": "Matrix#inverse", "kind": "function", "memberof": "Matrix", "scope": "instance" @@ -4047,15 +5173,15 @@ "comment": "", "meta": { "range": [ - 19782, - 19798 + 20683, + 20699 ], "filename": "matrix.js", - "lineno": 879, + "lineno": 924, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001644", + "id": "astnode100002039", "name": "A", "type": "CallExpression", "value": "" @@ -4063,9 +5189,9 @@ }, "undocumented": true, "name": "A", - "longname": "Matrix#solve~A", + "longname": "Matrix#inverse~A", "kind": "constant", - "memberof": "Matrix#solve", + "memberof": "Matrix#inverse", "scope": "inner", "params": [] }, @@ -4073,25 +5199,77 @@ "comment": "", "meta": { "range": [ - 19807, - 19818 + 20708, + 20724 ], "filename": "matrix.js", - "lineno": 880, + "lineno": 925, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001651", - "name": "LU", + "id": "astnode100002046", + "name": "I", "type": "CallExpression", "value": "" } }, "undocumented": true, - "name": "LU", - "longname": "Matrix#solve~LU", + "name": "I", + "longname": "Matrix#inverse~I", + "kind": "constant", + "memberof": "Matrix#inverse", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 20733, + 20757 + ], + "filename": "matrix.js", + "lineno": 926, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100002053", + "name": "Inv", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "Inv", + "longname": "Matrix#inverse~Inv", + "kind": "constant", + "memberof": "Matrix#inverse", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 20767, + 20914 + ], + "filename": "matrix.js", + "lineno": 928, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100002064", + "name": "result", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "result", + "longname": "Matrix#inverse~result", "kind": "constant", - "memberof": "Matrix#solve", + "memberof": "Matrix#inverse", "scope": "inner", "params": [] }, @@ -4099,77 +5277,105 @@ "comment": "", "meta": { "range": [ - 19827, - 19836 + 20827, + 20846 ], "filename": "matrix.js", - "lineno": 881, - "columnno": 8, + "lineno": 929, + "columnno": 10, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001658", - "name": "L", - "type": "MemberExpression", - "value": "LU[0]" + "id": "astnode100002078", + "name": "half", + "type": "BinaryExpression", + "value": "" } }, "undocumented": true, - "name": "L", - "longname": "Matrix#solve~L", + "name": "half", + "longname": "~half", "kind": "constant", - "memberof": "Matrix#solve", + "memberof": "", "scope": "inner", "params": [] }, + { + "comment": "/**\n * @memberOf Matrix\n * @member rank\n * @instance\n * @returns {Number}\n */", + "meta": { + "filename": "matrix.js", + "lineno": 936, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "kind": "member", + "name": "rank", + "scope": "instance", + "returns": [ + { + "type": { + "names": [ + "Number" + ] + } + } + ], + "longname": "Matrix#rank" + }, { "comment": "", "meta": { "range": [ - 19845, - 19854 + 21023, + 21204 ], "filename": "matrix.js", - "lineno": 882, - "columnno": 8, + "lineno": 942, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001664", - "name": "U", - "type": "MemberExpression", - "value": "LU[1]" + "id": "astnode100002108", + "name": "Matrix.prototype.rank", + "type": "FunctionExpression", + "paramnames": [] + }, + "vars": { + "rref": "Matrix#rank~rref", + "result": "Matrix#rank~result", + "i": "Matrix#rank~i" } }, "undocumented": true, - "name": "U", - "longname": "Matrix#solve~U", - "kind": "constant", - "memberof": "Matrix#solve", - "scope": "inner", - "params": [] + "name": "rank", + "longname": "Matrix#rank", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" }, { "comment": "", "meta": { "range": [ - 19863, - 19881 + 21069, + 21087 ], "filename": "matrix.js", - "lineno": 883, + "lineno": 943, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001670", - "name": "n", + "id": "astnode100002117", + "name": "rref", "type": "CallExpression", "value": "" } }, "undocumented": true, - "name": "n", - "longname": "Matrix#solve~n", + "name": "rref", + "longname": "Matrix#rank~rref", "kind": "constant", - "memberof": "Matrix#solve", + "memberof": "Matrix#rank", "scope": "inner", "params": [] }, @@ -4177,25 +5383,25 @@ "comment": "", "meta": { "range": [ - 19888, - 19893 + 21094, + 21104 ], "filename": "matrix.js", - "lineno": 884, + "lineno": 944, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001677", - "name": "s", + "id": "astnode100002124", + "name": "result", "type": "Literal", "value": 0 } }, "undocumented": true, - "name": "s", - "longname": "Matrix#solve~s", + "name": "result", + "longname": "Matrix#rank~result", "kind": "member", - "memberof": "Matrix#solve", + "memberof": "Matrix#rank", "scope": "inner", "params": [] }, @@ -4203,25 +5409,25 @@ "comment": "", "meta": { "range": [ - 19902, - 19908 + 21116, + 21121 ], "filename": "matrix.js", - "lineno": 885, - "columnno": 8, + "lineno": 945, + "columnno": 11, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001681", - "name": "c", - "type": "ArrayExpression", - "value": "[]" + "id": "astnode100002129", + "name": "i", + "type": "Literal", + "value": 0 } }, "undocumented": true, - "name": "c", - "longname": "Matrix#solve~c", - "kind": "constant", - "memberof": "Matrix#solve", + "name": "i", + "longname": "Matrix#rank~i", + "kind": "member", + "memberof": "Matrix#rank", "scope": "inner", "params": [] }, @@ -4229,306 +5435,529 @@ "comment": "", "meta": { "range": [ - 19917, - 19923 + 21154, + 21182 ], "filename": "matrix.js", - "lineno": 886, - "columnno": 8, + "lineno": 946, + "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001685", - "name": "x", - "type": "ArrayExpression", - "value": "[]" + "id": "astnode100002142", + "name": "result", + "type": "MemberExpression", + "funcscope": "Matrix#rank", + "value": "rref.__value[undefined][undefined]", + "paramnames": [] } }, "undocumented": true, - "name": "x", - "longname": "Matrix#solve~x", - "kind": "constant", - "memberof": "Matrix#solve", - "scope": "inner", - "params": [] + "name": "result", + "longname": "Matrix#rank~result", + "kind": "member", + "memberof": "Matrix#rank", + "scope": "inner" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @member dimension\n * @instance\n * @see rank\n * @returns {Number}\n */", + "meta": { + "filename": "matrix.js", + "lineno": 951, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "kind": "member", + "name": "dimension", + "scope": "instance", + "see": [ + "rank" + ], + "returns": [ + { + "type": { + "names": [ + "Number" + ] + } + } + ], + "longname": "Matrix#dimension" }, { "comment": "", "meta": { "range": [ - 19936, - 19941 + 21302, + 21367 ], "filename": "matrix.js", - "lineno": 888, - "columnno": 11, + "lineno": 958, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001690", - "name": "k", - "type": "Literal", - "value": 0 + "id": "astnode100002154", + "name": "Matrix.prototype.dimension", + "type": "FunctionExpression", + "paramnames": [] } }, "undocumented": true, - "name": "k", - "longname": "Matrix#solve~k", + "name": "dimension", + "longname": "Matrix#dimension", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @member diag\n * @instance\n * @desc Returns an array containing the values on the diagonal\n * @returns {Array}\n * @example\n *\n * const diag1 = Matrix.ones(3, 3).diag()\n * // [1, 1, 1]\n *\n * const diag0 = Matrix.zeros(5, 5).diag()\n * // [0, 0, 0, 0, 0]\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 962, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", "kind": "member", - "memberof": "Matrix#solve", - "scope": "inner", - "params": [] + "name": "diag", + "scope": "instance", + "description": "Returns an array containing the values on the diagonal", + "returns": [ + { + "type": { + "names": [ + "Array" + ] + } + } + ], + "examples": [ + "const diag1 = Matrix.ones(3, 3).diag()\n// [1, 1, 1]\n\nconst diag0 = Matrix.zeros(5, 5).diag()\n// [0, 0, 0, 0, 0]" + ], + "longname": "Matrix#diag" }, { "comment": "", "meta": { "range": [ - 19970, - 19975 + 21654, + 21779 ], "filename": "matrix.js", - "lineno": 889, - "columnno": 13, + "lineno": 977, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001701", - "name": "j", - "type": "Literal", - "value": 0 + "id": "astnode100002168", + "name": "Matrix.prototype.diag", + "type": "FunctionExpression", + "paramnames": [] + }, + "vars": { + "": null } }, "undocumented": true, - "name": "j", - "longname": "Matrix#solve~j", - "kind": "member", - "memberof": "Matrix#solve", - "scope": "inner", - "params": [] + "name": "diag", + "longname": "Matrix#diag", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @function diag\n * @desc Returns an array containing the values on the diagonal\n * @param M {Matrix|Array} Matrix from which to return the diagonal\n * @returns {Array}\n * @example\n *\n * const diag1 = Matrix.diag([[2, 1], [1, 5]])\n * // [2, 5]\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 983, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "kind": "function", + "name": "diag", + "description": "Returns an array containing the values on the diagonal", + "params": [ + { + "type": { + "names": [ + "Matrix", + "Array" + ] + }, + "description": "Matrix from which to return the diagonal", + "name": "M" + } + ], + "returns": [ + { + "type": { + "names": [ + "Array" + ] + } + } + ], + "examples": [ + "const diag1 = Matrix.diag([[2, 1], [1, 5]])\n// [2, 5]" + ], + "scope": "static", + "longname": "Matrix.diag" }, { "comment": "", "meta": { "range": [ - 19997, - 20027 + 22057, + 22116 ], "filename": "matrix.js", - "lineno": 890, - "columnno": 6, + "lineno": 995, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001711", - "name": "s", - "type": "BinaryExpression", - "funcscope": "Matrix#solve", - "value": "", - "paramnames": [] + "id": "astnode100002199", + "name": "Matrix.diag", + "type": "FunctionExpression", + "paramnames": [ + "M" + ] } }, "undocumented": true, - "name": "s", - "longname": "Matrix#solve~s", + "name": "diag", + "longname": "Matrix.diag", + "kind": "function", + "memberof": "Matrix", + "scope": "static" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @member diagproduct\n * @instance\n * @desc Returns the product of the values on the diagonal\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.ones(3, 3).diagproduct()\n * // 1\n *\n * const diag0 = Matrix.zeros(5, 5).diagproduct()\n * // 0\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 999, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", "kind": "member", - "memberof": "Matrix#solve", - "scope": "inner" + "name": "diagproduct", + "scope": "instance", + "description": "Returns the product of the values on the diagonal", + "returns": [ + { + "type": { + "names": [ + "Number" + ] + } + } + ], + "examples": [ + "const diag1 = Matrix.ones(3, 3).diagproduct()\n// 1\n\nconst diag0 = Matrix.zeros(5, 5).diagproduct()\n// 0" + ], + "longname": "Matrix#diagproduct" }, { "comment": "", "meta": { "range": [ - 20038, - 20053 + 22398, + 22532 ], "filename": "matrix.js", - "lineno": 892, - "columnno": 4, + "lineno": 1014, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001727", - "name": "c[undefined]", - "type": "BinaryExpression", - "funcscope": "Matrix#solve", - "value": "", + "id": "astnode100002216", + "name": "Matrix.prototype.diagproduct", + "type": "FunctionExpression", "paramnames": [] + }, + "vars": { + "": null } }, "undocumented": true, - "name": "undefined]", - "longname": "Matrix#solve~c.undefined]", - "kind": "member", - "memberof": "Matrix#solve~c", - "scope": "static" + "name": "diagproduct", + "longname": "Matrix#diagproduct", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" }, { "comment": "", "meta": { "range": [ - 20058, - 20063 + 22480, + 22493 ], "filename": "matrix.js", - "lineno": 893, + "lineno": 1016, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001737", - "name": "s", - "type": "Literal", - "funcscope": "Matrix#solve", - "value": 0, + "id": "astnode100002235", + "name": "acc", + "type": "MemberExpression", + "funcscope": "", + "value": "x[undefined]", "paramnames": [] } }, "undocumented": true, - "name": "s", - "longname": "Matrix#solve~s", + "name": "acc", + "longname": "~acc", "kind": "member", - "memberof": "Matrix#solve", + "memberof": "", "scope": "inner" }, { - "comment": "", + "comment": "/**\n * @memberOf Matrix\n * @function diagproduct\n * @desc Returns the product of the values on the diagonal\n * @param M {Matrix|Array} Matrix from which to return the diagonal\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.diagproduct([[2, 1], [1, 5]])\n * // 10\n *\n */", "meta": { - "range": [ - 20079, - 20088 - ], "filename": "matrix.js", - "lineno": 895, - "columnno": 11, + "lineno": 1021, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100001742", - "name": "a", - "type": "BinaryExpression", - "value": "" - } + "code": {} }, - "undocumented": true, - "name": "a", - "longname": "Matrix#solve~a", - "kind": "member", - "memberof": "Matrix#solve", - "scope": "inner", - "params": [] + "memberof": "Matrix", + "kind": "function", + "name": "diagproduct", + "description": "Returns the product of the values on the diagonal", + "params": [ + { + "type": { + "names": [ + "Matrix", + "Array" + ] + }, + "description": "Matrix from which to return the diagonal", + "name": "M" + } + ], + "returns": [ + { + "type": { + "names": [ + "Number" + ] + } + } + ], + "examples": [ + "const diag1 = Matrix.diagproduct([[2, 1], [1, 5]])\n// 10" + ], + "scope": "static", + "longname": "Matrix.diagproduct" }, { "comment": "", "meta": { "range": [ - 20113, - 20118 + 22816, + 22889 ], "filename": "matrix.js", - "lineno": 896, - "columnno": 8, + "lineno": 1033, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001755", - "name": "t", - "type": "Literal", - "value": 0 + "id": "astnode100002247", + "name": "Matrix.diagproduct", + "type": "FunctionExpression", + "paramnames": [ + "M" + ] } }, "undocumented": true, - "name": "t", - "longname": "Matrix#solve~t", + "name": "diagproduct", + "longname": "Matrix.diagproduct", + "kind": "function", + "memberof": "Matrix", + "scope": "static" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @member sum\n * @instance\n * @desc Returns the sum of the values in the Matrix\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.ones(3, 3).sum()\n * // 9\n *\n * const diag0 = Matrix.zeros(5, 5).sum()\n * // 0\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 1037, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", "kind": "member", - "memberof": "Matrix#solve", - "scope": "inner", - "params": [] + "name": "sum", + "scope": "instance", + "description": "Returns the sum of the values in the Matrix", + "returns": [ + { + "type": { + "names": [ + "Number" + ] + } + } + ], + "examples": [ + "const diag1 = Matrix.ones(3, 3).sum()\n// 9\n\nconst diag0 = Matrix.zeros(5, 5).sum()\n// 0" + ], + "longname": "Matrix#sum" }, { "comment": "", "meta": { "range": [ - 20132, - 20141 + 23141, + 23295 ], "filename": "matrix.js", - "lineno": 897, - "columnno": 13, + "lineno": 1052, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001760", - "name": "b", - "type": "BinaryExpression", - "value": "" + "id": "astnode100002264", + "name": "Matrix.prototype.sum", + "type": "FunctionExpression", + "paramnames": [] + }, + "vars": { + "": null } }, "undocumented": true, - "name": "b", - "longname": "Matrix#solve~b", - "kind": "member", - "memberof": "Matrix#solve", - "scope": "inner", - "params": [] + "name": "sum", + "longname": "Matrix#sum", + "kind": "function", + "memberof": "Matrix", + "scope": "instance" }, { "comment": "", "meta": { "range": [ - 20163, - 20193 + 23210, + 23256 ], "filename": "matrix.js", - "lineno": 898, - "columnno": 6, + "lineno": 1054, + "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001772", - "name": "t", - "type": "BinaryExpression", - "funcscope": "Matrix#solve", + "id": "astnode100002282", + "name": "acc", + "type": "CallExpression", + "funcscope": "", "value": "", "paramnames": [] } }, "undocumented": true, - "name": "t", - "longname": "Matrix#solve~t", + "name": "acc", + "longname": "~acc", "kind": "member", - "memberof": "Matrix#solve", + "memberof": "", "scope": "inner" }, + { + "comment": "/**\n * @memberOf Matrix\n * @function sum\n * @desc Returns the sum of the values in the Matrix\n * @param M {Matrix|Array} Matrix from which to return the diagonal\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.sum([[2, 1], [1, 5]])\n * // 9\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 1059, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "kind": "function", + "name": "sum", + "description": "Returns the sum of the values in the Matrix", + "params": [ + { + "type": { + "names": [ + "Matrix", + "Array" + ] + }, + "description": "Matrix from which to return the diagonal", + "name": "M" + } + ], + "returns": [ + { + "type": { + "names": [ + "Number" + ] + } + } + ], + "examples": [ + "const diag1 = Matrix.sum([[2, 1], [1, 5]])\n// 9" + ], + "scope": "static", + "longname": "Matrix.sum" + }, { "comment": "", "meta": { "range": [ - 20204, - 20239 + 23556, + 23613 ], "filename": "matrix.js", - "lineno": 900, - "columnno": 4, + "lineno": 1071, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001788", - "name": "x[undefined]", - "type": "BinaryExpression", - "funcscope": "Matrix#solve", - "value": "", - "paramnames": [] + "id": "astnode100002303", + "name": "Matrix.sum", + "type": "FunctionExpression", + "paramnames": [ + "M" + ] } }, "undocumented": true, - "name": "undefined]", - "longname": "Matrix#solve~x.undefined]", - "kind": "member", - "memberof": "Matrix#solve~x", + "name": "sum", + "longname": "Matrix.sum", + "kind": "function", + "memberof": "Matrix", "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @member inverse\n * @instance\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[1, 1], [2, 4]]).inverse()\n * // [ [ 2, -0.5 ], [ -1, 0.5 ] ]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @member kronecker\n * @instance\n * @desc The Kronecker product is an operation on two matrices of arbitrary size resulting in a block matrix.\n * @param M {Matrix} The right side Matrix of the product (this ⊗ M)\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 905, + "lineno": 1075, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", "kind": "member", - "name": "inverse", + "name": "kronecker", "scope": "instance", + "description": "The Kronecker product is an operation on two matrices of arbitrary size resulting in a block matrix.", + "params": [ + { + "type": { + "names": [ + "Matrix" + ] + }, + "description": "The right side Matrix of the product (this ⊗ M)", + "name": "M" + } + ], "returns": [ { "type": { @@ -4538,39 +5967,45 @@ } } ], - "examples": [ - "const A = Matrix.of([[1, 1], [2, 4]]).inverse()\n// [ [ 2, -0.5 ], [ -1, 0.5 ] ]" - ], - "longname": "Matrix#inverse" + "longname": "Matrix#kronecker" }, { "comment": "", "meta": { "range": [ - 20443, - 20752 + 23877, + 24380 ], "filename": "matrix.js", - "lineno": 916, + "lineno": 1083, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001808", - "name": "Matrix.prototype.inverse", + "id": "astnode100002320", + "name": "Matrix.prototype.kronecker", "type": "FunctionExpression", - "paramnames": [] + "paramnames": [ + "M" + ] }, "vars": { - "A": "Matrix#inverse~A", - "I": "Matrix#inverse~I", - "Inv": "Matrix#inverse~Inv", - "result": "Matrix#inverse~result", - "": null + "m": "Matrix#kronecker~m", + "n": "Matrix#kronecker~n", + "p": "Matrix#kronecker~p", + "q": "Matrix#kronecker~q", + "left": "Matrix#kronecker~left", + "right": "Matrix#kronecker~right", + "frame": "Matrix#kronecker~frame", + "i": "Matrix#kronecker~i", + "j": "Matrix#kronecker~j", + "k": "Matrix#kronecker~k", + "l": "Matrix#kronecker~l", + "frame[undefined][undefined]": "Matrix#kronecker~frame.undefined][undefined]" } }, "undocumented": true, - "name": "inverse", - "longname": "Matrix#inverse", + "name": "kronecker", + "longname": "Matrix#kronecker", "kind": "function", "memberof": "Matrix", "scope": "instance" @@ -4579,25 +6014,25 @@ "comment": "", "meta": { "range": [ - 20492, - 20508 + 23929, + 23947 ], "filename": "matrix.js", - "lineno": 917, + "lineno": 1084, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001817", - "name": "A", + "id": "astnode100002330", + "name": "m", "type": "CallExpression", "value": "" } }, "undocumented": true, - "name": "A", - "longname": "Matrix#inverse~A", + "name": "m", + "longname": "Matrix#kronecker~m", "kind": "constant", - "memberof": "Matrix#inverse", + "memberof": "Matrix#kronecker", "scope": "inner", "params": [] }, @@ -4605,25 +6040,25 @@ "comment": "", "meta": { "range": [ - 20517, - 20533 + 23956, + 23974 ], "filename": "matrix.js", - "lineno": 918, + "lineno": 1085, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001824", - "name": "I", + "id": "astnode100002337", + "name": "n", "type": "CallExpression", "value": "" } }, "undocumented": true, - "name": "I", - "longname": "Matrix#inverse~I", + "name": "n", + "longname": "Matrix#kronecker~n", "kind": "constant", - "memberof": "Matrix#inverse", + "memberof": "Matrix#kronecker", "scope": "inner", "params": [] }, @@ -4631,25 +6066,25 @@ "comment": "", "meta": { "range": [ - 20542, - 20566 + 23983, + 23998 ], "filename": "matrix.js", - "lineno": 919, + "lineno": 1086, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001831", - "name": "Inv", + "id": "astnode100002344", + "name": "p", "type": "CallExpression", "value": "" } }, "undocumented": true, - "name": "Inv", - "longname": "Matrix#inverse~Inv", + "name": "p", + "longname": "Matrix#kronecker~p", "kind": "constant", - "memberof": "Matrix#inverse", + "memberof": "Matrix#kronecker", "scope": "inner", "params": [] }, @@ -4657,25 +6092,25 @@ "comment": "", "meta": { "range": [ - 20576, - 20723 + 24007, + 24022 ], "filename": "matrix.js", - "lineno": 921, + "lineno": 1087, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001842", - "name": "result", + "id": "astnode100002351", + "name": "q", "type": "CallExpression", "value": "" } }, "undocumented": true, - "name": "result", - "longname": "Matrix#inverse~result", + "name": "q", + "longname": "Matrix#kronecker~q", "kind": "constant", - "memberof": "Matrix#inverse", + "memberof": "Matrix#kronecker", "scope": "inner", "params": [] }, @@ -4683,105 +6118,103 @@ "comment": "", "meta": { "range": [ - 20636, - 20655 + 24032, + 24051 ], "filename": "matrix.js", - "lineno": 922, - "columnno": 10, + "lineno": 1089, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001856", - "name": "half", - "type": "BinaryExpression", - "value": "" + "id": "astnode100002358", + "name": "left", + "type": "MemberExpression", + "value": "this.__value" } }, "undocumented": true, - "name": "half", - "longname": "~half", + "name": "left", + "longname": "Matrix#kronecker~left", "kind": "constant", - "memberof": "", + "memberof": "Matrix#kronecker", "scope": "inner", "params": [] }, { - "comment": "/**\n * @memberOf Matrix\n * @member rank\n * @instance\n * @returns {Number}\n */", + "comment": "", "meta": { + "range": [ + 24060, + 24077 + ], "filename": "matrix.js", - "lineno": 929, - "columnno": 0, + "lineno": 1090, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": {} - }, - "memberof": "Matrix", - "kind": "member", - "name": "rank", - "scope": "instance", - "returns": [ - { - "type": { - "names": [ - "Number" - ] - } + "code": { + "id": "astnode100002364", + "name": "right", + "type": "MemberExpression", + "value": "M.__value" } - ], - "longname": "Matrix#rank" + }, + "undocumented": true, + "name": "right", + "longname": "Matrix#kronecker~right", + "kind": "constant", + "memberof": "Matrix#kronecker", + "scope": "inner", + "params": [] }, { "comment": "", "meta": { "range": [ - 20832, - 21013 + 24087, + 24117 ], "filename": "matrix.js", - "lineno": 935, - "columnno": 0, + "lineno": 1092, + "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001886", - "name": "Matrix.prototype.rank", - "type": "FunctionExpression", - "paramnames": [] - }, - "vars": { - "rref": "Matrix#rank~rref", - "result": "Matrix#rank~result", - "i": "Matrix#rank~i" + "id": "astnode100002370", + "name": "frame", + "type": "CallExpression", + "value": "" } }, "undocumented": true, - "name": "rank", - "longname": "Matrix#rank", - "kind": "function", - "memberof": "Matrix", - "scope": "instance" + "name": "frame", + "longname": "Matrix#kronecker~frame", + "kind": "constant", + "memberof": "Matrix#kronecker", + "scope": "inner", + "params": [] }, { "comment": "", "meta": { "range": [ - 20878, - 20896 + 24130, + 24135 ], "filename": "matrix.js", - "lineno": 936, - "columnno": 8, + "lineno": 1094, + "columnno": 11, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001895", - "name": "rref", - "type": "CallExpression", - "value": "" + "id": "astnode100002382", + "name": "i", + "type": "Literal", + "value": 0 } }, "undocumented": true, - "name": "rref", - "longname": "Matrix#rank~rref", - "kind": "constant", - "memberof": "Matrix#rank", + "name": "i", + "longname": "Matrix#kronecker~i", + "kind": "member", + "memberof": "Matrix#kronecker", "scope": "inner", "params": [] }, @@ -4789,25 +6222,25 @@ "comment": "", "meta": { "range": [ - 20903, - 20913 + 24164, + 24169 ], "filename": "matrix.js", - "lineno": 937, - "columnno": 6, + "lineno": 1095, + "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001902", - "name": "result", + "id": "astnode100002393", + "name": "j", "type": "Literal", "value": 0 } }, "undocumented": true, - "name": "result", - "longname": "Matrix#rank~result", + "name": "j", + "longname": "Matrix#kronecker~j", "kind": "member", - "memberof": "Matrix#rank", + "memberof": "Matrix#kronecker", "scope": "inner", "params": [] }, @@ -4815,25 +6248,25 @@ "comment": "", "meta": { "range": [ - 20925, - 20930 + 24200, + 24205 ], "filename": "matrix.js", - "lineno": 938, - "columnno": 11, + "lineno": 1096, + "columnno": 15, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001907", - "name": "i", + "id": "astnode100002404", + "name": "k", "type": "Literal", "value": 0 } }, "undocumented": true, - "name": "i", - "longname": "Matrix#rank~i", + "name": "k", + "longname": "Matrix#kronecker~k", "kind": "member", - "memberof": "Matrix#rank", + "memberof": "Matrix#kronecker", "scope": "inner", "params": [] }, @@ -4841,159 +6274,226 @@ "comment": "", "meta": { "range": [ - 20963, - 20991 + 24238, + 24243 ], "filename": "matrix.js", - "lineno": 939, - "columnno": 4, + "lineno": 1097, + "columnno": 17, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001920", - "name": "result", - "type": "MemberExpression", - "funcscope": "Matrix#rank", - "value": "rref.__value[undefined][undefined]", + "id": "astnode100002415", + "name": "l", + "type": "Literal", + "value": 0 + } + }, + "undocumented": true, + "name": "l", + "longname": "Matrix#kronecker~l", + "kind": "member", + "memberof": "Matrix#kronecker", + "scope": "inner", + "params": [] + }, + { + "comment": "", + "meta": { + "range": [ + 24269, + 24323 + ], + "filename": "matrix.js", + "lineno": 1098, + "columnno": 10, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100002425", + "name": "frame[undefined][undefined]", + "type": "BinaryExpression", + "funcscope": "Matrix#kronecker", + "value": "", "paramnames": [] } }, "undocumented": true, - "name": "result", - "longname": "Matrix#rank~result", + "name": "undefined][undefined]", + "longname": "Matrix#kronecker~frame.undefined][undefined]", "kind": "member", - "memberof": "Matrix#rank", - "scope": "inner" + "memberof": "Matrix#kronecker~frame", + "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @member dimension\n * @instance\n * @see rank\n * @returns {Number}\n */", + "comment": "/**\n * @memberOf Matrix\n * @function kronecker\n * @desc The Kronecker product is an operation on two matrices of arbitrary size resulting in a block matrix.\n * @param A {Matrix} The left side Matrix of the product (A ⊗ B)\n * @param B {Matrix} The right side Matrix of the product (A ⊗ B)\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 944, + "lineno": 1107, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "kind": "member", - "name": "dimension", - "scope": "instance", - "see": [ - "rank" + "kind": "function", + "name": "kronecker", + "description": "The Kronecker product is an operation on two matrices of arbitrary size resulting in a block matrix.", + "params": [ + { + "type": { + "names": [ + "Matrix" + ] + }, + "description": "The left side Matrix of the product (A ⊗ B)", + "name": "A" + }, + { + "type": { + "names": [ + "Matrix" + ] + }, + "description": "The right side Matrix of the product (A ⊗ B)", + "name": "B" + } ], "returns": [ { "type": { "names": [ - "Number" + "Matrix" ] } } ], - "longname": "Matrix#dimension" + "scope": "static", + "longname": "Matrix.kronecker" }, { "comment": "", "meta": { "range": [ - 21111, - 21176 + 24695, + 24768 ], "filename": "matrix.js", - "lineno": 951, + "lineno": 1115, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001932", - "name": "Matrix.prototype.dimension", + "id": "astnode100002457", + "name": "Matrix.kronecker", "type": "FunctionExpression", - "paramnames": [] + "paramnames": [ + "A", + "B" + ] } }, "undocumented": true, - "name": "dimension", - "longname": "Matrix#dimension", + "name": "kronecker", + "longname": "Matrix.kronecker", "kind": "function", "memberof": "Matrix", - "scope": "instance" + "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @member diag\n * @instance\n * @desc Returns an array containing the values on the diagonal\n * @returns {Array}\n * @example\n *\n * const diag1 = Matrix.ones(3, 3).diag()\n * // [1, 1, 1]\n *\n * const diag0 = Matrix.zeros(5, 5).diag()\n * // [0, 0, 0, 0, 0]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member gpuMap\n * @description Maps over the rows of the matrix using a map function using the GPU\n * @param f {function} An GPU.js enabled iterator function\n * @returns {Matrix}\n * @example\n *\n * function gpuMapper (a) { return a[this.thread.y][this.thread.x] }\n * const m = Matrix.of([[2, 2], [2, 2]], GPUJS)\n * m.gpuMap(gpuMapper)\n * // [Float32Array(2,2), Float32Array(2,2)]\n *\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 955, + "lineno": 1123, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "kind": "member", - "name": "diag", "scope": "instance", - "description": "Returns an array containing the values on the diagonal", + "kind": "member", + "name": "gpuMap", + "description": "Maps over the rows of the matrix using a map function using the GPU", + "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "An GPU.js enabled iterator function", + "name": "f" + } + ], "returns": [ { "type": { "names": [ - "Array" + "Matrix" ] } } ], "examples": [ - "const diag1 = Matrix.ones(3, 3).diag()\n// [1, 1, 1]\n\nconst diag0 = Matrix.zeros(5, 5).diag()\n// [0, 0, 0, 0, 0]" + "function gpuMapper (a) { return a[this.thread.y][this.thread.x] }\nconst m = Matrix.of([[2, 2], [2, 2]], GPUJS)\nm.gpuMap(gpuMapper)\n// [Float32Array(2,2), Float32Array(2,2)]" ], - "longname": "Matrix#diag" + "longname": "Matrix#gpuMap" }, { "comment": "", "meta": { "range": [ - 21463, - 21588 + 25275, + 25373 ], "filename": "matrix.js", - "lineno": 970, + "lineno": 1139, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001946", - "name": "Matrix.prototype.diag", + "id": "astnode100002476", + "name": "Matrix.prototype.gpuMap", "type": "FunctionExpression", - "paramnames": [] - }, - "vars": { - "": null + "paramnames": [ + "f" + ] } }, "undocumented": true, - "name": "diag", - "longname": "Matrix#diag", + "name": "gpuMap", + "longname": "Matrix#gpuMap", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @function diag\n * @desc Returns an array containing the values on the diagonal\n * @param M {Matrix|Array} Matrix from which to return the diagonal\n * @returns {Array}\n * @example\n *\n * const diag1 = Matrix.diag([[2, 1], [1, 5]])\n * // [2, 5]\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function gpuMap\n * @description Static function that maps over the rows of the matrix using a map function using the GPU\n * @param f {function} An GPU.js enabled iterator function\n * @param M {Matrix|array} Matrix or array to map\n * @returns {Matrix}\n * @example\n *\n * function gpuMapper (a) { return a[this.thread.y][this.thread.x] }\n * const m = Matrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]])\n * // [Float32Array(2,2), Float32Array(2,2)]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 976, + "lineno": 1143, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", + "scope": "static", "kind": "function", - "name": "diag", - "description": "Returns an array containing the values on the diagonal", + "name": "gpuMap", + "description": "Static function that maps over the rows of the matrix using a map function using the GPU", "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "An GPU.js enabled iterator function", + "name": "f" + }, { "type": { "names": [ "Matrix", - "Array" + "array" ] }, - "description": "Matrix from which to return the diagonal", + "description": "Matrix or array to map", "name": "M" } ], @@ -5001,149 +6501,129 @@ { "type": { "names": [ - "Array" + "Matrix" ] } } ], "examples": [ - "const diag1 = Matrix.diag([[2, 1], [1, 5]])\n// [2, 5]" + "function gpuMapper (a) { return a[this.thread.y][this.thread.x] }\nconst m = Matrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]])\n// [Float32Array(2,2), Float32Array(2,2)]" ], - "scope": "static", - "longname": "Matrix.diag" + "longname": "Matrix.gpuMap" }, { "comment": "", "meta": { "range": [ - 21866, - 21925 + 25864, + 25948 ], "filename": "matrix.js", - "lineno": 988, + "lineno": 1158, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001977", - "name": "Matrix.diag", - "type": "FunctionExpression", - "paramnames": [ - "M" - ] + "id": "astnode100002500", + "name": "Matrix.gpuMap", + "type": "CallExpression", + "value": "", + "paramnames": [] } }, "undocumented": true, - "name": "diag", - "longname": "Matrix.diag", - "kind": "function", + "name": "gpuMap", + "longname": "Matrix.gpuMap", + "kind": "member", "memberof": "Matrix", "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @member diagproduct\n * @instance\n * @desc Returns the product of the values on the diagonal\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.ones(3, 3).diagproduct()\n * // 1\n *\n * const diag0 = Matrix.zeros(5, 5).diagproduct()\n * // 0\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member gpuFold\n * @description Folds the rows of the matrix using a GPUS.js enqbled reduce function, using the GPU\n * @param f {function} An iterator function\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.of([[1, 1], [1, 1]])\n * m.map(x => x.map(y => y+ 1))\n * // [[2, 2], [2, 2]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 992, + "lineno": 1162, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "kind": "member", - "name": "diagproduct", "scope": "instance", - "description": "Returns the product of the values on the diagonal", + "kind": "member", + "name": "gpuFold", + "description": "Folds the rows of the matrix using a GPUS.js enqbled reduce function, using the GPU", + "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "An iterator function", + "name": "f" + } + ], "returns": [ { "type": { "names": [ - "Number" + "Matrix" ] } } ], "examples": [ - "const diag1 = Matrix.ones(3, 3).diagproduct()\n// 1\n\nconst diag0 = Matrix.zeros(5, 5).diagproduct()\n// 0" + "const m = Matrix.of([[1, 1], [1, 1]])\nm.map(x => x.map(y => y+ 1))\n// [[2, 2], [2, 2]]" ], - "longname": "Matrix#diagproduct" + "longname": "Matrix#gpuFold" }, { "comment": "", "meta": { "range": [ - 22207, - 22341 + 26289, + 26405 ], "filename": "matrix.js", - "lineno": 1007, + "lineno": 1176, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001994", - "name": "Matrix.prototype.diagproduct", + "id": "astnode100002523", + "name": "Matrix.prototype.gpuFold", "type": "FunctionExpression", - "paramnames": [] - }, - "vars": { - "": null + "paramnames": [ + "f", + "output" + ] } }, "undocumented": true, - "name": "diagproduct", - "longname": "Matrix#diagproduct", + "name": "gpuFold", + "longname": "Matrix#gpuFold", "kind": "function", "memberof": "Matrix", "scope": "instance" }, { - "comment": "", - "meta": { - "range": [ - 22289, - 22302 - ], - "filename": "matrix.js", - "lineno": 1009, - "columnno": 4, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100002013", - "name": "acc", - "type": "MemberExpression", - "funcscope": "", - "value": "x[undefined]", - "paramnames": [] - } - }, - "undocumented": true, - "name": "acc", - "longname": "~acc", - "kind": "member", - "memberof": "", - "scope": "inner" - }, - { - "comment": "/**\n * @memberOf Matrix\n * @function diagproduct\n * @desc Returns the product of the values on the diagonal\n * @param M {Matrix|Array} Matrix from which to return the diagonal\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.diagproduct([[2, 1], [1, 5]])\n * // 10\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @function Matrix#gpuProduct\n * @param f\n * @param output\n * @param M\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 1014, + "lineno": 1180, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", "kind": "function", - "name": "diagproduct", - "description": "Returns the product of the values on the diagonal", + "name": "gpuProduct", "params": [ { - "type": { - "names": [ - "Matrix", - "Array" - ] - }, - "description": "Matrix from which to return the diagonal", + "name": "f" + }, + { + "name": "output" + }, + { "name": "M" } ], @@ -5151,208 +6631,199 @@ { "type": { "names": [ - "Number" + "Matrix" ] } } ], - "examples": [ - "const diag1 = Matrix.diagproduct([[2, 1], [1, 5]])\n// 10" - ], - "scope": "static", - "longname": "Matrix.diagproduct" + "longname": "Matrix#gpuProduct", + "scope": "instance" }, { "comment": "", "meta": { "range": [ - 22625, - 22698 + 26528, + 26707 ], "filename": "matrix.js", - "lineno": 1026, + "lineno": 1188, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002025", - "name": "Matrix.diagproduct", + "id": "astnode100002549", + "name": "Matrix.prototype.gpuProduct", "type": "FunctionExpression", "paramnames": [ + "f", + "output", "M" ] } }, "undocumented": true, - "name": "diagproduct", - "longname": "Matrix.diagproduct", + "name": "gpuProduct", + "longname": "Matrix#gpuProduct", "kind": "function", "memberof": "Matrix", - "scope": "static" + "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @member sum\n * @instance\n * @desc Returns the sum of the values in the Matrix\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.ones(3, 3).sum()\n * // 9\n *\n * const diag0 = Matrix.zeros(5, 5).sum()\n * // 0\n *\n */", + "comment": "", "meta": { + "range": [ + 26709, + 26730 + ], "filename": "matrix.js", - "lineno": 1030, + "lineno": 1193, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", - "code": {} + "code": { + "id": "astnode100002578", + "name": "module.exports", + "type": "Identifier" + } }, - "memberof": "Matrix", + "undocumented": true, + "name": "exports", + "longname": "module.exports", "kind": "member", - "name": "sum", - "scope": "instance", - "description": "Returns the sum of the values in the Matrix", - "returns": [ - { - "type": { - "names": [ - "Number" - ] - } - } - ], - "examples": [ - "const diag1 = Matrix.ones(3, 3).sum()\n// 9\n\nconst diag0 = Matrix.zeros(5, 5).sum()\n// 0" - ], - "longname": "Matrix#sum" + "memberof": "module", + "scope": "static" }, { "comment": "", "meta": { "range": [ - 22950, - 23104 + 37, + 139 ], - "filename": "matrix.js", - "lineno": 1045, + "filename": "addMatrix.js", + "lineno": 3, "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100002042", - "name": "Matrix.prototype.sum", - "type": "FunctionExpression", - "paramnames": [] - }, - "vars": { - "": null + "path": "/Volumes/BigOne/github/funMatrix/src/util", + "code": { + "id": "astnode100002588", + "name": "module.exports", + "type": "CallExpression" } }, "undocumented": true, - "name": "sum", - "longname": "Matrix#sum", - "kind": "function", - "memberof": "Matrix", - "scope": "instance" + "name": "exports", + "longname": "module.exports", + "kind": "member", + "memberof": "module", + "scope": "static" }, { "comment": "", "meta": { "range": [ - 23019, - 23065 + 37, + 99 ], - "filename": "matrix.js", - "lineno": 1047, - "columnno": 4, - "path": "/Volumes/BigOne/github/funMatrix/src", + "filename": "addScalar.js", + "lineno": 3, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002060", - "name": "acc", - "type": "CallExpression", - "funcscope": "", - "value": "", - "paramnames": [] + "id": "astnode100002625", + "name": "module.exports", + "type": "CallExpression" } }, "undocumented": true, - "name": "acc", - "longname": "~acc", + "name": "exports", + "longname": "module.exports", "kind": "member", - "memberof": "", - "scope": "inner" + "memberof": "module", + "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @function sum\n * @desc Returns the sum of the values in the Matrix\n * @param M {Matrix|Array} Matrix from which to return the diagonal\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.sum([[2, 1], [1, 5]])\n * // 9\n *\n */", + "comment": "/**\n * @function concat\n * @param M {Matrix}\n * @param m {Array}\n * @param idx {number}\n * @returns {Array}\n */", "meta": { - "filename": "matrix.js", - "lineno": 1052, + "filename": "concat.js", + "lineno": 3, "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": {} }, - "memberof": "Matrix", "kind": "function", - "name": "sum", - "description": "Returns the sum of the values in the Matrix", + "name": "concat", "params": [ { "type": { "names": [ - "Matrix", - "Array" + "Matrix" ] }, - "description": "Matrix from which to return the diagonal", "name": "M" + }, + { + "type": { + "names": [ + "Array" + ] + }, + "name": "m" + }, + { + "type": { + "names": [ + "number" + ] + }, + "name": "idx" } ], "returns": [ { "type": { "names": [ - "Number" + "Array" ] } } ], - "examples": [ - "const diag1 = Matrix.sum([[2, 1], [1, 5]])\n// 9" - ], - "scope": "static", - "longname": "Matrix.sum" + "longname": "concat", + "scope": "global" }, { "comment": "", "meta": { "range": [ - 23365, - 23422 + 152, + 233 ], - "filename": "matrix.js", - "lineno": 1064, + "filename": "concat.js", + "lineno": 10, "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002081", - "name": "Matrix.sum", - "type": "FunctionExpression", - "paramnames": [ - "M" - ] + "id": "astnode100002650", + "name": "module.exports", + "type": "CallExpression" } }, "undocumented": true, - "name": "sum", - "longname": "Matrix.sum", - "kind": "function", - "memberof": "Matrix", + "name": "exports", + "longname": "module.exports", + "kind": "member", + "memberof": "module", "scope": "static" }, { - "comment": "/**\n * @memberOf Matrix\n * @member kronecker\n * @instance\n * @desc The Kronecker product is an operation on two matrices of arbitrary size resulting in a block matrix.\n * @param M {Matrix} The right side Matrix of the product (this ⊗ M)\n * @returns {Matrix}\n */", + "comment": "/**\n * @function dot\n * @param B {Matrix}\n * @param a {Array}\n * @returns {Array}\n */", "meta": { - "filename": "matrix.js", - "lineno": 1068, + "filename": "dot.js", + "lineno": 4, "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": {} }, - "memberof": "Matrix", - "kind": "member", - "name": "kronecker", - "scope": "instance", - "description": "The Kronecker product is an operation on two matrices of arbitrary size resulting in a block matrix.", + "kind": "function", + "name": "dot", "params": [ { "type": { @@ -5360,215 +6831,203 @@ "Matrix" ] }, - "description": "The right side Matrix of the product (this ⊗ M)", - "name": "M" + "name": "B" + }, + { + "type": { + "names": [ + "Array" + ] + }, + "name": "a" } ], "returns": [ { "type": { "names": [ - "Matrix" + "Array" ] } } ], - "longname": "Matrix#kronecker" + "longname": "dot", + "scope": "global" }, { "comment": "", "meta": { "range": [ - 23686, - 24188 + 157, + 339 ], - "filename": "matrix.js", - "lineno": 1076, + "filename": "dot.js", + "lineno": 10, "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002098", - "name": "Matrix.prototype.kronecker", - "type": "FunctionExpression", - "paramnames": [ - "M" - ] - }, - "vars": { - "m": "Matrix#kronecker~m", - "n": "Matrix#kronecker~n", - "p": "Matrix#kronecker~p", - "q": "Matrix#kronecker~q", - "left": "Matrix#kronecker~left", - "right": "Matrix#kronecker~right", - "frame": "Matrix#kronecker~frame", - "i": "Matrix#kronecker~i", - "j": "Matrix#kronecker~j", - "k": "Matrix#kronecker~k", - "l": "Matrix#kronecker~l", - "frame[undefined][undefined]": "Matrix#kronecker~frame.undefined][undefined]" + "id": "astnode100002681", + "name": "module.exports", + "type": "CallExpression" } }, "undocumented": true, - "name": "kronecker", - "longname": "Matrix#kronecker", - "kind": "function", - "memberof": "Matrix", - "scope": "instance" + "name": "exports", + "longname": "module.exports", + "kind": "member", + "memberof": "module", + "scope": "static" }, { "comment": "", "meta": { "range": [ - 23738, - 23756 + 252, + 295 ], - "filename": "matrix.js", - "lineno": 1077, - "columnno": 8, - "path": "/Volumes/BigOne/github/funMatrix/src", + "filename": "dot.js", + "lineno": 12, + "columnno": 4, + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002108", - "name": "m", + "id": "astnode100002705", + "name": "acc", "type": "CallExpression", - "value": "" + "funcscope": "", + "value": "", + "paramnames": [] } }, "undocumented": true, - "name": "m", - "longname": "Matrix#kronecker~m", - "kind": "constant", - "memberof": "Matrix#kronecker", - "scope": "inner", - "params": [] + "name": "acc", + "longname": "~acc", + "kind": "member", + "memberof": "", + "scope": "inner" }, { "comment": "", "meta": { "range": [ - 23765, - 23783 + 31, + 60 ], - "filename": "matrix.js", - "lineno": 1078, - "columnno": 8, - "path": "/Volumes/BigOne/github/funMatrix/src", + "filename": "empty.js", + "lineno": 2, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002115", - "name": "n", - "type": "CallExpression", - "value": "" + "id": "astnode100002734", + "name": "module.exports", + "type": "CallExpression" } }, "undocumented": true, - "name": "n", - "longname": "Matrix#kronecker~n", - "kind": "constant", - "memberof": "Matrix#kronecker", - "scope": "inner", - "params": [] + "name": "exports", + "longname": "module.exports", + "kind": "member", + "memberof": "module", + "scope": "static" }, { - "comment": "", + "comment": "/**\n * @function generate\n * @desc Generator function for a matrix array, values are set to undefined\n * @param rows {number}\n * @param cols {number}\n * @returns {any[][]}\n */", "meta": { - "range": [ - 23792, - 23807 - ], - "filename": "matrix.js", - "lineno": 1079, - "columnno": 8, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100002122", - "name": "p", - "type": "CallExpression", - "value": "" - } + "filename": "generate.js", + "lineno": 3, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src/util", + "code": {} }, - "undocumented": true, - "name": "p", - "longname": "Matrix#kronecker~p", - "kind": "constant", - "memberof": "Matrix#kronecker", - "scope": "inner", - "params": [] - }, - { - "comment": "", - "meta": { - "range": [ - 23816, - 23831 - ], - "filename": "matrix.js", - "lineno": 1080, - "columnno": 8, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": { - "id": "astnode100002129", - "name": "q", - "type": "CallExpression", - "value": "" + "kind": "function", + "name": "generate", + "description": "Generator function for a matrix array, values are set to undefined", + "params": [ + { + "type": { + "names": [ + "number" + ] + }, + "name": "rows" + }, + { + "type": { + "names": [ + "number" + ] + }, + "name": "cols" } - }, - "undocumented": true, - "name": "q", - "longname": "Matrix#kronecker~q", - "kind": "constant", - "memberof": "Matrix#kronecker", - "scope": "inner", - "params": [] + ], + "returns": [ + { + "type": { + "names": [ + "Array.>" + ] + } + } + ], + "longname": "generate", + "scope": "global" }, { "comment": "", "meta": { "range": [ - 23841, - 23860 + 206, + 376 ], - "filename": "matrix.js", - "lineno": 1082, - "columnno": 8, - "path": "/Volumes/BigOne/github/funMatrix/src", + "filename": "generate.js", + "lineno": 10, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002136", - "name": "left", - "type": "MemberExpression", - "value": "this.__value" + "id": "astnode100002746", + "name": "module.exports", + "type": "ArrowFunctionExpression", + "paramnames": [ + "rows", + "cols", + "value" + ] + }, + "vars": { + "_cols": "module.exports~_cols", + "y": "module.exports~y", + "": null } }, "undocumented": true, - "name": "left", - "longname": "Matrix#kronecker~left", - "kind": "constant", - "memberof": "Matrix#kronecker", - "scope": "inner", - "params": [] + "name": "exports", + "longname": "module.exports", + "kind": "function", + "memberof": "module", + "scope": "static" }, { "comment": "", "meta": { "range": [ - 23869, - 23886 + 270, + 290 ], - "filename": "matrix.js", - "lineno": 1083, + "filename": "generate.js", + "lineno": 11, "columnno": 8, - "path": "/Volumes/BigOne/github/funMatrix/src", + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002142", - "name": "right", - "type": "MemberExpression", - "value": "M.__value" + "id": "astnode100002757", + "name": "_cols", + "type": "LogicalExpression", + "value": "" } }, "undocumented": true, - "name": "right", - "longname": "Matrix#kronecker~right", + "name": "_cols", + "longname": "module.exports~_cols", "kind": "constant", - "memberof": "Matrix#kronecker", + "memberof": "module.exports", "scope": "inner", "params": [] }, @@ -5576,25 +7035,25 @@ "comment": "", "meta": { "range": [ - 23896, - 23926 + 299, + 336 ], - "filename": "matrix.js", - "lineno": 1085, + "filename": "generate.js", + "lineno": 12, "columnno": 8, - "path": "/Volumes/BigOne/github/funMatrix/src", + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002148", - "name": "frame", + "id": "astnode100002763", + "name": "y", "type": "CallExpression", "value": "" } }, "undocumented": true, - "name": "frame", - "longname": "Matrix#kronecker~frame", + "name": "y", + "longname": "module.exports~y", "kind": "constant", - "memberof": "Matrix#kronecker", + "memberof": "module.exports", "scope": "inner", "params": [] }, @@ -5602,77 +7061,85 @@ "comment": "", "meta": { "range": [ - 23939, - 23944 + 0, + 169 ], - "filename": "matrix.js", - "lineno": 1087, - "columnno": 11, - "path": "/Volumes/BigOne/github/funMatrix/src", + "filename": "gpudot.js", + "lineno": 1, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002160", - "name": "i", - "type": "Literal", - "value": 0 + "id": "astnode100002786", + "name": "module.exports", + "type": "FunctionDeclaration", + "paramnames": [ + "a", + "b" + ] } }, "undocumented": true, - "name": "i", - "longname": "Matrix#kronecker~i", - "kind": "member", - "memberof": "Matrix#kronecker", - "scope": "inner", - "params": [] + "name": "exports", + "longname": "module.exports", + "kind": "function", + "memberof": "module", + "scope": "static" }, { "comment": "", "meta": { "range": [ - 23973, - 23978 + 15, + 169 ], - "filename": "matrix.js", - "lineno": 1088, - "columnno": 13, - "path": "/Volumes/BigOne/github/funMatrix/src", + "filename": "gpudot.js", + "lineno": 1, + "columnno": 15, + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002171", - "name": "j", - "type": "Literal", - "value": 0 + "id": "astnode100002787", + "name": "dot", + "type": "FunctionDeclaration", + "paramnames": [ + "a", + "b" + ] + }, + "vars": { + "sum": "dot~sum", + "i": "dot~i" } }, "undocumented": true, - "name": "j", - "longname": "Matrix#kronecker~j", - "kind": "member", - "memberof": "Matrix#kronecker", - "scope": "inner", + "name": "dot", + "longname": "dot", + "kind": "function", + "scope": "global", "params": [] }, { "comment": "", "meta": { "range": [ - 24009, - 24014 + 43, + 50 ], - "filename": "matrix.js", - "lineno": 1089, - "columnno": 15, - "path": "/Volumes/BigOne/github/funMatrix/src", + "filename": "gpudot.js", + "lineno": 2, + "columnno": 6, + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002182", - "name": "k", + "id": "astnode100002793", + "name": "sum", "type": "Literal", "value": 0 } }, "undocumented": true, - "name": "k", - "longname": "Matrix#kronecker~k", + "name": "sum", + "longname": "dot~sum", "kind": "member", - "memberof": "Matrix#kronecker", + "memberof": "dot", "scope": "inner", "params": [] }, @@ -5680,25 +7147,25 @@ "comment": "", "meta": { "range": [ - 24047, - 24052 + 62, + 67 ], - "filename": "matrix.js", - "lineno": 1090, - "columnno": 17, - "path": "/Volumes/BigOne/github/funMatrix/src", + "filename": "gpudot.js", + "lineno": 3, + "columnno": 11, + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002193", - "name": "l", + "id": "astnode100002798", + "name": "i", "type": "Literal", "value": 0 } }, "undocumented": true, - "name": "l", - "longname": "Matrix#kronecker~l", + "name": "i", + "longname": "dot~i", "kind": "member", - "memberof": "Matrix#kronecker", + "memberof": "dot", "scope": "inner", "params": [] }, @@ -5706,309 +7173,250 @@ "comment": "", "meta": { "range": [ - 24078, - 24132 + 102, + 150 ], - "filename": "matrix.js", - "lineno": 1091, - "columnno": 10, - "path": "/Volumes/BigOne/github/funMatrix/src", + "filename": "gpudot.js", + "lineno": 4, + "columnno": 4, + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002203", - "name": "frame[undefined][undefined]", + "id": "astnode100002812", + "name": "sum", "type": "BinaryExpression", - "funcscope": "Matrix#kronecker", + "funcscope": "dot", "value": "", "paramnames": [] } }, "undocumented": true, - "name": "undefined][undefined]", - "longname": "Matrix#kronecker~frame.undefined][undefined]", + "name": "sum", + "longname": "dot~sum", "kind": "member", - "memberof": "Matrix#kronecker~frame", - "scope": "static" - }, - { - "comment": "/**\n * @memberOf Matrix\n * @function kronecker\n * @desc The Kronecker product is an operation on two matrices of arbitrary size resulting in a block matrix.\n * @param A {Matrix} The left side Matrix of the product (A ⊗ B)\n * @param B {Matrix} The right side Matrix of the product (A ⊗ B)\n * @returns {Matrix}\n */", - "meta": { - "filename": "matrix.js", - "lineno": 1099, - "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", - "code": {} - }, - "memberof": "Matrix", - "kind": "function", - "name": "kronecker", - "description": "The Kronecker product is an operation on two matrices of arbitrary size resulting in a block matrix.", - "params": [ - { - "type": { - "names": [ - "Matrix" - ] - }, - "description": "The left side Matrix of the product (A ⊗ B)", - "name": "A" - }, - { - "type": { - "names": [ - "Matrix" - ] - }, - "description": "The right side Matrix of the product (A ⊗ B)", - "name": "B" - } - ], - "returns": [ - { - "type": { - "names": [ - "Matrix" - ] - } - } - ], - "scope": "static", - "longname": "Matrix.kronecker" + "memberof": "dot", + "scope": "inner" }, { "comment": "", "meta": { "range": [ - 24503, - 24576 + 0, + 229 ], - "filename": "matrix.js", - "lineno": 1107, + "filename": "gpufold.js", + "lineno": 1, "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002235", - "name": "Matrix.kronecker", - "type": "FunctionExpression", + "id": "astnode100002837", + "name": "module.exports", + "type": "FunctionDeclaration", "paramnames": [ - "A", - "B" + "gpu", + "f", + "output", + "matrix", + "constants" ] } }, "undocumented": true, - "name": "kronecker", - "longname": "Matrix.kronecker", + "name": "exports", + "longname": "module.exports", "kind": "function", - "memberof": "Matrix", + "memberof": "module", "scope": "static" }, { "comment": "", "meta": { "range": [ - 24578, - 24599 + 15, + 229 ], - "filename": "matrix.js", - "lineno": 1111, - "columnno": 0, - "path": "/Volumes/BigOne/github/funMatrix/src", + "filename": "gpufold.js", + "lineno": 1, + "columnno": 15, + "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002253", - "name": "module.exports", - "type": "Identifier" + "id": "astnode100002838", + "name": "gpufold", + "type": "FunctionDeclaration", + "paramnames": [ + "gpu", + "f", + "output", + "matrix", + "constants" + ] } }, "undocumented": true, - "name": "exports", - "longname": "module.exports", - "kind": "member", - "memberof": "module", - "scope": "static" + "name": "gpufold", + "longname": "gpufold", + "kind": "function", + "scope": "global", + "params": [] }, { "comment": "", "meta": { "range": [ - 71, - 173 + 111, + 193 ], - "filename": "addMatrix.js", - "lineno": 4, - "columnno": 0, + "filename": "gpufold.js", + "lineno": 3, + "columnno": 23, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002265", - "name": "module.exports", - "type": "CallExpression" + "id": "astnode100002858", + "name": "constants", + "type": "CallExpression", + "value": "" } }, "undocumented": true, - "name": "exports", - "longname": "module.exports", + "name": "constants", + "longname": "constants", "kind": "member", - "memberof": "module", - "scope": "static" + "scope": "global" }, { "comment": "", "meta": { "range": [ - 71, - 133 + 142, + 158 ], - "filename": "addScalar.js", - "lineno": 4, - "columnno": 0, + "filename": "gpufold.js", + "lineno": 3, + "columnno": 54, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002304", - "name": "module.exports", - "type": "CallExpression" + "id": "astnode100002865", + "name": "m", + "type": "MemberExpression", + "value": "matrix.length" } }, "undocumented": true, - "name": "exports", - "longname": "module.exports", + "name": "m", + "longname": "m", "kind": "member", - "memberof": "module", - "scope": "static" + "scope": "global" }, { - "comment": "/**\n * @function concat\n * @param M {Matrix}\n * @param m {Array}\n * @param idx {number}\n * @returns {Array}\n */", + "comment": "", "meta": { - "filename": "concat.js", - "lineno": 4, - "columnno": 0, + "range": [ + 160, + 179 + ], + "filename": "gpufold.js", + "lineno": 3, + "columnno": 72, "path": "/Volumes/BigOne/github/funMatrix/src/util", - "code": {} - }, - "kind": "function", - "name": "concat", - "params": [ - { - "type": { - "names": [ - "Matrix" - ] - }, - "name": "M" - }, - { - "type": { - "names": [ - "Array" - ] - }, - "name": "m" - }, - { - "type": { - "names": [ - "number" - ] - }, - "name": "idx" - } - ], - "returns": [ - { - "type": { - "names": [ - "Array" - ] - } + "code": { + "id": "astnode100002869", + "name": "n", + "type": "MemberExpression", + "value": "matrix[0].length" } - ], - "longname": "concat", + }, + "undocumented": true, + "name": "n", + "longname": "n", + "kind": "member", "scope": "global" }, { "comment": "", "meta": { "range": [ - 189, - 270 + 41, + 174 ], - "filename": "concat.js", - "lineno": 11, + "filename": "gpumap.js", + "lineno": 3, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002331", + "id": "astnode100002881", "name": "module.exports", - "type": "CallExpression" + "type": "FunctionDeclaration", + "paramnames": [ + "gpu", + "f", + "matrix" + ] } }, "undocumented": true, "name": "exports", "longname": "module.exports", - "kind": "member", + "kind": "function", "memberof": "module", "scope": "static" }, { - "comment": "/**\n * @function dot\n * @param B {Matrix}\n * @param a {Array}\n * @returns {Array}\n */", + "comment": "", "meta": { - "filename": "dot.js", - "lineno": 6, - "columnno": 0, + "range": [ + 56, + 174 + ], + "filename": "gpumap.js", + "lineno": 3, + "columnno": 15, "path": "/Volumes/BigOne/github/funMatrix/src/util", - "code": {} + "code": { + "id": "astnode100002882", + "name": "gpumap", + "type": "FunctionDeclaration", + "paramnames": [ + "gpu", + "f", + "matrix" + ] + } }, + "undocumented": true, + "name": "gpumap", + "longname": "gpumap", "kind": "function", - "name": "dot", - "params": [ - { - "type": { - "names": [ - "Matrix" - ] - }, - "name": "B" - }, - { - "type": { - "names": [ - "Array" - ] - }, - "name": "a" - } - ], - "returns": [ - { - "type": { - "names": [ - "Array" - ] - } - } - ], - "longname": "dot", - "scope": "global" + "scope": "global", + "params": [] }, { "comment": "", "meta": { "range": [ - 220, - 402 + 0, + 218 ], - "filename": "dot.js", - "lineno": 12, + "filename": "gpuproduct.js", + "lineno": 1, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002366", + "id": "astnode100002910", "name": "module.exports", - "type": "CallExpression" + "type": "FunctionDeclaration", + "paramnames": [ + "gpu", + "f", + "output", + "a", + "b", + "constants" + ] } }, "undocumented": true, "name": "exports", "longname": "module.exports", - "kind": "member", + "kind": "function", "memberof": "module", "scope": "static" }, @@ -6016,125 +7424,105 @@ "comment": "", "meta": { "range": [ - 315, - 358 + 15, + 218 ], - "filename": "dot.js", - "lineno": 14, - "columnno": 4, + "filename": "gpuproduct.js", + "lineno": 1, + "columnno": 15, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002390", - "name": "acc", - "type": "CallExpression", - "funcscope": "", - "value": "", - "paramnames": [] + "id": "astnode100002911", + "name": "gpuproduct", + "type": "FunctionDeclaration", + "paramnames": [ + "gpu", + "f", + "output", + "a", + "b", + "constants" + ] } }, "undocumented": true, - "name": "acc", - "longname": "~acc", - "kind": "member", - "memberof": "", - "scope": "inner" + "name": "gpuproduct", + "longname": "gpuproduct", + "kind": "function", + "scope": "global", + "params": [] }, { "comment": "", "meta": { "range": [ - 38, - 67 + 112, + 184 ], - "filename": "empty.js", + "filename": "gpuproduct.js", "lineno": 3, - "columnno": 0, + "columnno": 23, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002419", - "name": "module.exports", - "type": "CallExpression" + "id": "astnode100002932", + "name": "constants", + "type": "CallExpression", + "value": "" } }, "undocumented": true, - "name": "exports", - "longname": "module.exports", + "name": "constants", + "longname": "constants", "kind": "member", - "memberof": "module", - "scope": "static" + "scope": "global" }, { - "comment": "/**\n * @function generate\n * @desc Generator function for a matrix array, values are set to undefined\n * @param rows {number}\n * @param cols {number}\n * @returns {any[][]}\n */", + "comment": "", "meta": { - "filename": "generate.js", - "lineno": 1, - "columnno": 0, + "range": [ + 143, + 154 + ], + "filename": "gpuproduct.js", + "lineno": 3, + "columnno": 54, "path": "/Volumes/BigOne/github/funMatrix/src/util", - "code": {} - }, - "kind": "function", - "name": "generate", - "description": "Generator function for a matrix array, values are set to undefined", - "params": [ - { - "type": { - "names": [ - "number" - ] - }, - "name": "rows" - }, - { - "type": { - "names": [ - "number" - ] - }, - "name": "cols" - } - ], - "returns": [ - { - "type": { - "names": [ - "Array.>" - ] - } + "code": { + "id": "astnode100002939", + "name": "m", + "type": "MemberExpression", + "value": "b.length" } - ], - "longname": "generate", + }, + "undocumented": true, + "name": "m", + "longname": "m", + "kind": "member", "scope": "global" }, { "comment": "", "meta": { "range": [ - 176, - 278 + 156, + 170 ], - "filename": "generate.js", - "lineno": 8, - "columnno": 0, + "filename": "gpuproduct.js", + "lineno": 3, + "columnno": 67, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002427", - "name": "module.exports", - "type": "ArrowFunctionExpression", - "paramnames": [ - "rows", - "cols" - ] - }, - "vars": { - "": null + "id": "astnode100002943", + "name": "n", + "type": "MemberExpression", + "value": "a[0].length" } }, "undocumented": true, - "name": "exports", - "longname": "module.exports", - "kind": "function", - "memberof": "module", - "scope": "static" + "name": "n", + "longname": "n", + "kind": "member", + "scope": "global" }, { "comment": "/**\n * @function identity\n * @desc Creates an identiy matrix from an empty array\n * @param m {Array}\n * @param idx {number}\n * @return {Matrix}\n */", @@ -6182,15 +7570,15 @@ "comment": "", "meta": { "range": [ - 182, - 249 + 178, + 245 ], "filename": "identity.js", "lineno": 10, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002458", + "id": "astnode100002960", "name": "module.exports", "type": "ArrowFunctionExpression", "paramnames": [ @@ -6262,7 +7650,7 @@ "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002476", + "id": "astnode100002978", "name": "module.exports", "type": "FunctionDeclaration", "paramnames": [ @@ -6290,7 +7678,7 @@ "columnno": 15, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002477", + "id": "astnode100002979", "name": "round", "type": "FunctionDeclaration", "paramnames": [ @@ -6310,7 +7698,7 @@ "comment": "/**\n * @function transpose\n * @desc Transposes a array of arrays using the Matrix.map function\n * @param m {Array}\n * @param idx {number}\n * @return {Matrix}\n */", "meta": { "filename": "transpose.js", - "lineno": 4, + "lineno": 3, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": {} @@ -6352,15 +7740,15 @@ "comment": "", "meta": { "range": [ - 233, - 326 + 199, + 292 ], "filename": "transpose.js", - "lineno": 11, + "lineno": 10, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002508", + "id": "astnode100003008", "name": "module.exports", "type": "CallExpression" } @@ -6376,6 +7764,7 @@ "kind": "package", "longname": "package:undefined", "files": [ + "/Volumes/BigOne/github/funMatrix/src/gpumatrix.js", "/Volumes/BigOne/github/funMatrix/src/matrix.js", "/Volumes/BigOne/github/funMatrix/src/util/addMatrix.js", "/Volumes/BigOne/github/funMatrix/src/util/addScalar.js", @@ -6383,6 +7772,10 @@ "/Volumes/BigOne/github/funMatrix/src/util/dot.js", "/Volumes/BigOne/github/funMatrix/src/util/empty.js", "/Volumes/BigOne/github/funMatrix/src/util/generate.js", + "/Volumes/BigOne/github/funMatrix/src/util/gpudot.js", + "/Volumes/BigOne/github/funMatrix/src/util/gpufold.js", + "/Volumes/BigOne/github/funMatrix/src/util/gpumap.js", + "/Volumes/BigOne/github/funMatrix/src/util/gpuproduct.js", "/Volumes/BigOne/github/funMatrix/src/util/identity.js", "/Volumes/BigOne/github/funMatrix/src/util/round.js", "/Volumes/BigOne/github/funMatrix/src/util/transpose.js" diff --git a/docs/GpuMatrix.html b/docs/GpuMatrix.html new file mode 100644 index 0000000..2bc05d0 --- /dev/null +++ b/docs/GpuMatrix.html @@ -0,0 +1,917 @@ + + + + + + GpuMatrix - Documentation + + + + + + + + + + + + + + + + + +
+ +

GpuMatrix

+ + + + + + + +
+ +
+ +

+ GpuMatrix +

+ +
GpuMatrix applicative providing standard matrix operations
+ + +
+ +
+
+ + +
+ + +

Constructor

+ + +

new GpuMatrix()

+ + +

The GpuMatrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.

+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + +
See:
+
+
    +
  • of
  • +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
Example
+ +
const gpu = new GPU()
+const m =  GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)
+ +
+ +
+ +
+ + + + + + + + + + + + +

Members

+ + + +
+

gpuFold

+ + + + +
+ Folds the rows of the GpuMatrix using a GPUS.js enqbled reduce function, using the GPU +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
Example
+ +
const m = GpuMatrix.of([[1, 1], [1, 1]])
+m.map(x => x.map(y => y+ 1))
+// [[2, 2], [2, 2]]
+ + +
+ + + +
+

gpuMap

+ + + + +
+ Maps over the rows of the GpuMatrix using a map function using the GPU +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
Example
+ +
function gpuMapper (a) { return a[this.thread.y][this.thread.x] }
+const m = GpuMatrix.of([[2, 2], [2, 2]], GPUJS)
+m.gpuMap(gpuMapper)
+// [Float32Array(2,2), Float32Array(2,2)]
+ + +
+ + + + + +

Methods

+ + + +
+ + + +

(static) gpuMap(f, M) → {GpuMatrix}

+ + + + + +
+ Static function that maps over the rows of the GpuMatrix using a map function using the GPU +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
f + + +function + + + + + An GPU.js enabled iterator function + +
M + + +GpuMatrix +| + +array + + + + + GpuMatrix or array to map + +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +GpuMatrix + + +
+
+ + + +
+ + + +
+
Example
+ +
function gpuMapper (a) { return a[this.thread.y][this.thread.x] }
+const m = GpuMatrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]])
+// [Float32Array(2,2), Float32Array(2,2)]
+ +
+ +
+ + +
+ + + +

(static) of(val, GPUJS) → {GpuMatrix}

+ + + + + +
+ Creates a GpuMatrix object and flattens the GpuMatrix +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
val + + +array +| + +function + + + + + An array of arrays + +
GPUJS + + +Object + + + + + + +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +GpuMatrix + + +
+
+ + + +
+ + + +
+
Example
+ +
const m =  GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)
+ +
+ +
+ + +
+ + + +

gpuProduct(f, output, M) → {GpuMatrix}

+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
f + + + + +
output + + + + +
M + + + + +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +GpuMatrix + + +
+
+ + + +
+ + + +
+ + + + + + +
+ +
+ + + + +
+ +
+ +
+ Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme. +
+ + + + + \ No newline at end of file diff --git a/docs/Matrix.html b/docs/Matrix.html index c01c8db..f6d008b 100644 --- a/docs/Matrix.html +++ b/docs/Matrix.html @@ -24,7 +24,7 @@
@@ -101,7 +101,7 @@

new MatrixSource:
@@ -167,74 +167,6 @@

Members

-
-

add

- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - -
Example
- -
const A = Matrix.of([[5, 4]])
-A.add(1) // [[6, 5]]
-const B = Matrix.of([[5, 5]])
-B.add(B) // [[10, 10]]
- - -
- - -

additiveinverse

@@ -278,7 +210,7 @@

additi
Source:
@@ -349,7 +281,7 @@

apSource:
@@ -421,7 +353,7 @@

cloneSource:
@@ -481,7 +413,7 @@

combineSource:
@@ -552,7 +484,7 @@

concatSource:
@@ -626,7 +558,7 @@

diagSource:
@@ -699,7 +631,7 @@

diagproduc
Source:
@@ -768,7 +700,7 @@

dimensionSource:
@@ -839,7 +771,7 @@

dotSource:
@@ -916,7 +848,7 @@

emptySource:
@@ -976,7 +908,7 @@

equalsSource:
@@ -1048,7 +980,7 @@

fillSource:
@@ -1118,7 +1050,7 @@

foldSource:
@@ -1189,7 +1121,7 @@

fromArraySource:
@@ -1249,7 +1181,7 @@

getColsSource:
@@ -1315,7 +1247,7 @@

getRowsSource:
@@ -1381,7 +1313,7 @@

getShapeSource:
@@ -1408,6 +1340,149 @@
Example
+
+

gpuFold

+ + + + +
+ Folds the rows of the matrix using a GPUS.js enqbled reduce function, using the GPU +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
Example
+ +
const m = Matrix.of([[1, 1], [1, 1]])
+m.map(x => x.map(y => y+ 1))
+// [[2, 2], [2, 2]]
+ + +
+ + + +
+

gpuMap

+ + + + +
+ Maps over the rows of the matrix using a map function using the GPU +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
Example
+ +
function gpuMapper (a) { return a[this.thread.y][this.thread.x] }
+const m = Matrix.of([[2, 2], [2, 2]], GPUJS)
+m.gpuMap(gpuMapper)
+// [Float32Array(2,2), Float32Array(2,2)]
+ + +
+ + +

hadamard

@@ -1447,7 +1522,7 @@

hadamardSource:
@@ -1526,7 +1601,7 @@

identitySource:
@@ -1594,7 +1669,7 @@

inverseSource:
@@ -1660,7 +1735,7 @@

isOrthogo
Source:
@@ -1731,7 +1806,7 @@

isSquareSource:
@@ -1797,7 +1872,7 @@

isSymmetri
Source:
@@ -1867,7 +1942,7 @@

kroneckerSource:
@@ -1931,7 +2006,7 @@

luSource:
@@ -2005,7 +2080,7 @@

mapSource:
@@ -2076,7 +2151,7 @@

multiplySource:
@@ -2148,7 +2223,7 @@

onesSource:
@@ -2268,7 +2343,7 @@
Properties:
Source:
@@ -2348,7 +2423,7 @@

randomSource:
@@ -2408,7 +2483,7 @@

rankSource:
@@ -2468,7 +2543,7 @@

rrefSource:
@@ -2534,7 +2609,7 @@

setPrecis
Source:
@@ -2601,7 +2676,7 @@

solveSource:
@@ -2674,7 +2749,7 @@

subtractSource:
@@ -2746,7 +2821,7 @@

sumSource:
@@ -2819,7 +2894,7 @@

toArraySource:
@@ -2883,7 +2958,7 @@

transposeSource:
@@ -3004,7 +3079,7 @@
Properties:
Source:
@@ -3084,7 +3159,7 @@

zerosSource:
@@ -3164,7 +3239,7 @@

(static) apSource:
@@ -3354,7 +3429,7 @@

(static) comb
Source:
@@ -3512,7 +3587,7 @@

(static) conca
Source:
@@ -3706,7 +3781,7 @@

(static) diagSource:
@@ -3873,7 +3948,7 @@

(static)
Source:
@@ -4040,7 +4115,7 @@

(static) dotSource:
@@ -4204,7 +4279,7 @@

(static) empty<
Source:
@@ -4386,7 +4461,7 @@

(static) foldSource:
@@ -4536,14 +4611,14 @@
Example
-

(static) identity() → {Matrix}

+

(static) gpuMap(f, M) → {Matrix}

- Returns an identity matrix + Static function that maps over the rows of the matrix using a map function using the GPU
@@ -4579,7 +4654,7 @@

(static) ide
Source:
@@ -4598,42 +4673,236 @@

(static) ide +

Parameters:
+ + + + + + + + + + + + + + + + + + + + + -
-
Returns:
- - - -
-
- Type: -
-
- -Matrix - - -
-
+ +
+ - - - -
+
+ + + + + + + + + + + + + + + +
NameTypeDescription
f + + +function + + + An GPU.js enabled iterator function + +
M + + +Matrix +| + +array + + + + + Matrix or array to map + +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Matrix + + +
+
+ + + +
+ + + +
+
Example
+ +
function gpuMapper (a) { return a[this.thread.y][this.thread.x] }
+const m = Matrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]])
+// [Float32Array(2,2), Float32Array(2,2)]
+ +
+ +

+ + +
+ + + +

(static) identity() → {Matrix}

+ + + + + +
+ Returns an identity matrix +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Matrix + + +
+
+ + + +
+ + + +
Example
const A = Matrix.identity(3, 2)
@@ -4691,7 +4960,7 @@ 

(static) kr
Source:
@@ -4873,7 +5142,7 @@

(static) mapSource:
@@ -5066,7 +5335,7 @@

(static) ofSource:
@@ -5232,7 +5501,7 @@

(static) onesSource:
@@ -5422,7 +5691,7 @@

(static) rando
Source:
@@ -5630,7 +5899,7 @@

(static) sumSource:
@@ -5797,7 +6066,7 @@

(static) tr
Source:
@@ -5965,7 +6234,7 @@

(static) zeros<
Source:
@@ -6107,6 +6376,360 @@

Example

+ +
+ + + +

add(M) → {Matrix}

+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
M + + +Matrix +| + +number + + + + + Add a Matrix or a number + +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Matrix + + +
+
+ + + +
+ + + +
+
Example
+ +
const A = Matrix.of([[5, 4]])
+A.add(1) // [[6, 5]]
+const B = Matrix.of([[5, 5]])
+B.add(B) // [[10, 10]]
+ +
+ +
+ + +
+ + + +

gpuProduct(f, output, M) → {Matrix}

+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
f + + + + +
output + + + + +
M + + + + +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Matrix + + +
+
+ + + +
+ + + +
+ @@ -6124,7 +6747,7 @@
Example

- Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
diff --git a/docs/global.html b/docs/global.html index 0416bd3..0e0a30f 100644 --- a/docs/global.html +++ b/docs/global.html @@ -24,7 +24,7 @@
@@ -156,7 +156,7 @@

concatSource:
@@ -360,7 +360,7 @@

dotSource:
@@ -542,7 +542,7 @@

generateSource:
@@ -1084,7 +1084,7 @@

transposeSource:
@@ -1235,7 +1235,7 @@
Returns:

- Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
diff --git a/docs/gpumatrix.js.html b/docs/gpumatrix.js.html new file mode 100644 index 0000000..93b0ebb --- /dev/null +++ b/docs/gpumatrix.js.html @@ -0,0 +1,185 @@ + + + + + + gpumatrix.js - Documentation + + + + + + + + + + + + + + + + + +
+ +

gpumatrix.js

+ + + + + + + +
+
+
import Matrix from './Matrix'
+import curry from 'fun.js/src/curry'
+import gpumap from 'util/gpumap'
+import gpufold from 'util/gpufold'
+import gpuproduct from 'util/gpuproduct'
+
+/**
+ * @class GpuMatrix
+ * @classdesc GpuMatrix applicative providing standard matrix operations
+ * @summary The GpuMatrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.
+ * @hidecontructor
+ * @see of
+ * @example
+ *
+ * const gpu = new GPU()
+ * const m =  GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)
+ *
+ */
+class GpuMatrix extends Matrix {
+  constructor (val, GPUJS) {
+    super()
+    if (GPUJS) {
+      this.gpujs = GPUJS || null
+    }
+  }
+}
+
+/**
+ * @memberOf GpuMatrix
+ * @static
+ * @function GpuMatrix.of
+ * @desc Creates a GpuMatrix object and flattens the GpuMatrix
+ * @param val {array|function} An array of arrays
+ * @param GPUJS {Object}
+ * @returns {GpuMatrix}
+ * @example
+ *
+ * const m =  GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)
+ *
+ */
+GpuMatrix.of = function (val, GPUJS = null) {
+  if (val instanceof GpuMatrix) return val
+  if (this instanceof GpuMatrix) {
+    this.__value = val
+    this.gpujs = GPUJS
+    return this
+  }
+  return new GpuMatrix(val, GPUJS)
+}
+
+//* ***********************/
+// GPU Functions
+//* ***********************/
+
+/**
+ * @memberOf GpuMatrix
+ * @instance
+ * @member gpuMap
+ * @description Maps over the rows of the GpuMatrix using a map function using the GPU
+ * @param f {function} An GPU.js enabled iterator function
+ * @returns {GpuMatrix}
+ * @example
+ *
+ * function gpuMapper (a) { return a[this.thread.y][this.thread.x] }
+ * const m = GpuMatrix.of([[2, 2], [2, 2]], GPUJS)
+ * m.gpuMap(gpuMapper)
+ * // [Float32Array(2,2), Float32Array(2,2)]
+ *
+ *
+ */
+GpuMatrix.prototype.gpuMap = function (f) {
+  return GpuMatrix.of(gpumap(this.gpujs, f, this.__value))
+}
+
+/**
+ * @memberOf GpuMatrix
+ * @static
+ * @function gpuMap
+ * @description Static function that maps over the rows of the GpuMatrix using a map function using the GPU
+ * @param f {function} An GPU.js enabled iterator function
+ * @param M {GpuMatrix|array} GpuMatrix or array to map
+ * @returns {GpuMatrix}
+ * @example
+ *
+ * function gpuMapper (a) { return a[this.thread.y][this.thread.x] }
+ * const m = GpuMatrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]])
+ * // [Float32Array(2,2), Float32Array(2,2)]
+ *
+ */
+GpuMatrix.gpuMap = curry(function (gpu, f, M) {
+  return GpuMatrix.of(M, gpu).gpuMap(f)
+})
+
+/**
+ * @memberOf GpuMatrix
+ * @instance
+ * @member gpuFold
+ * @description Folds the rows of the GpuMatrix using a GPUS.js enqbled reduce function, using the GPU
+ * @param f {function} An iterator function
+ * @returns {GpuMatrix}
+ * @example
+ *
+ * const m = GpuMatrix.of([[1, 1], [1, 1]])
+ * m.map(x => x.map(y => y+ 1))
+ * // [[2, 2], [2, 2]]
+ *
+ */
+GpuMatrix.prototype.gpuFold = function (f, output) {
+  return GpuMatrix.of(gpufold(this.gpujs, f, output, this.__value))
+}
+
+/**
+ * @memberOf GpuMatrix
+ * @function GpuMatrix#gpuProduct
+ * @param f
+ * @param output
+ * @param M
+ * @returns {GpuMatrix}
+ */
+GpuMatrix.prototype.gpuProduct = function (f, output, M) {
+  // (gpu, f, output, a, b, constants = {}
+  return GpuMatrix.of(gpuproduct(this.gpujs, f, output, this.__value, M.__value))
+}
+
+export default GpuMatrix
+
+
+
+ + + + +
+ +
+ +
+ Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme. +
+ + + + + diff --git a/docs/index.html b/docs/index.html index 2793897..b0a555f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -24,7 +24,7 @@
@@ -113,7 +113,7 @@

Methods and properties


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/matrix.js.html b/docs/matrix.js.html index 138820b..8c3023c 100644 --- a/docs/matrix.js.html +++ b/docs/matrix.js.html @@ -24,7 +24,7 @@
    @@ -49,6 +49,9 @@

    matrix.js

    import identity from 'util/identity' import transpose from 'util/transpose' import generate from 'util/generate' +import gpumap from 'util/gpumap' +import gpufold from 'util/gpufold' +import gpuproduct from 'util/gpuproduct' /** * @class Matrix @@ -61,8 +64,33 @@

    matrix.js

    * const m = Matrix.of([[1,2],[2,3],[4,5]]) * */ -let Matrix = function (val) { +let Matrix = function (val, GPUJS) { this.__value = val + if (GPUJS) { + this.gpujs = GPUJS || null + } +} + +/** + * @memberOf Matrix + * @static + * @function of + * @desc Creates a Matrix object and flattens the Matrix + * @param val {array|function} An array of arrays + * @returns {Matrix} + * @example + * + * const m = Matrix.of([[1,2],[2,3],[4,5]]) + * + */ +Matrix.of = function (val) { + if (val instanceof Matrix) return val + if (this instanceof Matrix) { + this.__value = val + this.gpujs = GPUJS + return this + } + return new Matrix(val) } /** @@ -213,27 +241,6 @@

    matrix.js

    return [this.getRows(), this.getCols()] } -/** - * @memberOf Matrix - * @static - * @function of - * @desc Creates a Matrix object and flattens the Matrix - * @param val {array|function} An array of arrays - * @returns {Matrix} - * @example - * - * const m = Matrix.of([[1,2],[2,3],[4,5]]) - * - */ -Matrix.of = function (val) { - if (val instanceof Matrix) return val - if (this instanceof Matrix) { - this.__value = val - return this - } - return new Matrix(val) -} - /** * @memberOf Matrix * @instance @@ -697,7 +704,7 @@

    matrix.js

    /** * @memberOf Matrix - * @member add + * @function add * @instance * @param M {Matrix|number} Add a Matrix or a number * @returns {Matrix} @@ -1125,15 +1132,16 @@

    matrix.js

    const frame = generate(m * p, n * q) - for (var i = 0; i < m; i++) { - for (var j = 0; j < n; j++) { - for (var k = 0; k < p; k++) { - for (var l = 0; l < q; l++) { + for (let i = 0; i < m; i++) { + for (let j = 0; j < n; j++) { + for (let k = 0; k < p; k++) { + for (let l = 0; l < q; l++) { frame[p * i + k][q * j + l] = left[i][j] * right[k][l] } } } } + return Matrix.of(frame) } @@ -1149,6 +1157,80 @@

    matrix.js

    return Matrix.of(A).kronecker(B) } +//* ***********************/ +// GPU Functions +//* ***********************/ + +/** + * @memberOf Matrix + * @instance + * @member gpuMap + * @description Maps over the rows of the matrix using a map function using the GPU + * @param f {function} An GPU.js enabled iterator function + * @returns {Matrix} + * @example + * + * function gpuMapper (a) { return a[this.thread.y][this.thread.x] } + * const m = Matrix.of([[2, 2], [2, 2]], GPUJS) + * m.gpuMap(gpuMapper) + * // [Float32Array(2,2), Float32Array(2,2)] + * + * + */ +Matrix.prototype.gpuMap = function (f) { + return Matrix.of(gpumap(this.gpujs, f, this.__value)) +} + +/** + * @memberOf Matrix + * @static + * @function gpuMap + * @description Static function that maps over the rows of the matrix using a map function using the GPU + * @param f {function} An GPU.js enabled iterator function + * @param M {Matrix|array} Matrix or array to map + * @returns {Matrix} + * @example + * + * function gpuMapper (a) { return a[this.thread.y][this.thread.x] } + * const m = Matrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]]) + * // [Float32Array(2,2), Float32Array(2,2)] + * + */ +Matrix.gpuMap = curry(function (gpu, f, M) { + return Matrix.of(M, gpu).gpuMap(f) +}) + +/** + * @memberOf Matrix + * @instance + * @member gpuFold + * @description Folds the rows of the matrix using a GPUS.js enqbled reduce function, using the GPU + * @param f {function} An iterator function + * @returns {Matrix} + * @example + * + * const m = Matrix.of([[1, 1], [1, 1]]) + * m.map(x => x.map(y => y+ 1)) + * // [[2, 2], [2, 2]] + * + */ +Matrix.prototype.gpuFold = function (f, output) { + return Matrix.of(gpufold(this.gpujs, f, output, this.__value)) +} + +/** + * @memberOf Matrix + * @function Matrix#gpuProduct + * @param f + * @param output + * @param M + * @returns {Matrix} + */ +Matrix.prototype.gpuProduct = function (f, output, M) { + // (gpu, f, output, a, b, constants = {} + return Matrix.of(gpuproduct(this.gpujs, f, output, this.__value, M.__value)) +} + export default Matrix @@ -1162,7 +1244,7 @@

    matrix.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_concat.js.html b/docs/util_concat.js.html index 692611d..9e7484c 100644 --- a/docs/util_concat.js.html +++ b/docs/util_concat.js.html @@ -24,7 +24,7 @@
    @@ -39,8 +39,7 @@

    util/concat.js

    -
    import curry from 'fun.js/src/curry'
    -import concat from 'fun.js/src/concat'
    +            
    import { concat, curry } from 'fun.js'
     
     /**
      * @function concat
    @@ -64,7 +63,7 @@ 

    util/concat.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_dot.js.html b/docs/util_dot.js.html index dcd31e8..66bcab8 100644 --- a/docs/util_dot.js.html +++ b/docs/util_dot.js.html @@ -24,7 +24,7 @@
    @@ -39,9 +39,7 @@

    util/dot.js

    -
    import curry from 'fun.js/src/curry'
    -import fold from 'fun.js/src/fold'
    -import map from 'fun.js/src/map'
    +            
    import { fold, map, curry } from 'fun.js'
     import round from './round'
     
     /**
    @@ -68,7 +66,7 @@ 

    util/dot.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_generate.js.html b/docs/util_generate.js.html index 851dad0..0683837 100644 --- a/docs/util_generate.js.html +++ b/docs/util_generate.js.html @@ -24,7 +24,7 @@
    @@ -39,14 +39,20 @@

    util/generate.js

    -
    /**
    +            
    import { map } from 'fun.js'
    +
    +/**
      * @function generate
      * @desc Generator function for a matrix array, values are set to undefined
      * @param rows {number}
      * @param cols {number}
      * @returns {any[][]}
      */
    -export default (rows, cols) => Array.apply(null, Array(rows)).map(x => Array.apply(null, Array(cols)))
    +export default (rows, cols = undefined, value = 0) => {
    +  const _cols = cols || rows
    +  const y = map(z => value)(new Array(_cols))
    +  return map(z => y)(new Array(rows))
    +}
     
    @@ -59,7 +65,7 @@

    util/generate.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_identity.js.html b/docs/util_identity.js.html index fd7a879..0a65a40 100644 --- a/docs/util_identity.js.html +++ b/docs/util_identity.js.html @@ -24,7 +24,7 @@
    @@ -39,7 +39,7 @@

    util/identity.js

    -
    import map from 'fun.js/src/map'
    +            
    import { map } from 'fun.js'
     
     /**
      * @function identity
    @@ -61,7 +61,7 @@ 

    util/identity.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_round.js.html b/docs/util_round.js.html index daab8f4..0acfb18 100644 --- a/docs/util_round.js.html +++ b/docs/util_round.js.html @@ -24,7 +24,7 @@
    @@ -60,7 +60,7 @@

    util/round.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_transpose.js.html b/docs/util_transpose.js.html index 510f805..4d95c8e 100644 --- a/docs/util_transpose.js.html +++ b/docs/util_transpose.js.html @@ -24,7 +24,7 @@
    @@ -39,8 +39,7 @@

    util/transpose.js

    -
    import map from 'fun.js/src/map'
    -import curry from 'fun.js/src/curry'
    +            
    import { map, curry } from 'fun.js'
     
     /**
      * @function transpose
    @@ -62,7 +61,7 @@ 

    util/transpose.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/lib/@astuanax/funmatrix.js b/lib/@astuanax/funmatrix.js index 5f17b20..e8e4259 100644 --- a/lib/@astuanax/funmatrix.js +++ b/lib/@astuanax/funmatrix.js @@ -91,7 +91,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./src/matrix.js"); +/******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /************************************************************************/ /******/ ({ @@ -124,10 +124,10 @@ function curry1 (fn) { /***/ }), -/***/ "./node_modules/fun.js/src/and.js": -/*!****************************************!*\ - !*** ./node_modules/fun.js/src/and.js ***! - \****************************************/ +/***/ "./node_modules/fun.js/src/addIndex.js": +/*!*********************************************!*\ + !*** ./node_modules/fun.js/src/addIndex.js ***! + \*********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -135,81 +135,165 @@ function curry1 (fn) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); /** - * Checks if both predicates are true + * @function addIndex + * @summary Adds a specified index to iterate a collection + * @description The addIndex function is notnecessary for the map functions in the fun.js library as they behave the sa,e as the native javascript functions + * @param {Function} f Iterator function + * @param {Function} g Function to which to add the index + * @param {Array} a The array on which to work + * @since 1.0.2 + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function addIndex (f, g, a) { + let i = 0 + return f( + function (v) { + return g(v, i++) + }, + a + ) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/adjust.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/adjust.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/** + * Modifies an item in an array using the provided function * - * @function and - * @description Checks if both predicates are true + * @function adjust + * @description Modifies an item in an array using the provided function * @since v1.0.2 - * @sig (x, y) -> boolean - * @param {*} x - A predicate - * @param {*} y - A predicate - * @return {boolean} + * @sig (a -> a) -> num -> [a] -> [a] + * @param {Function} fn - to modify the item at the specified index + * @param {Number} i - The index at which to modify the array, accepts postitive and negative indexes + * @param {Iterable} [a] - Array with data + * @return {Iterable} [a] **/ -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function and (x, y) { - return x && y +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function adjust (fn, i, a) { + const r = Array.prototype.slice.call(a) + const idx = i < 0 ? r.length + i : i + if (!a[idx]) return r + r[idx] = fn(r[idx]) + return r })); /***/ }), -/***/ "./node_modules/fun.js/src/array/concat.js": -/*!*************************************************!*\ - !*** ./node_modules/fun.js/src/array/concat.js ***! - \*************************************************/ +/***/ "./node_modules/fun.js/src/adjustWith.js": +/*!***********************************************!*\ + !*** ./node_modules/fun.js/src/adjustWith.js ***! + \***********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./map */ "./node_modules/fun.js/src/map.js"); /** - * @private - * @function arrayConcat - * @param a1 - * @param a2 - * @returns {T[]} - */ + * Modifies an item in an array using the provided function + * + * @function adjustWith + * @description Modifies an item in an array using the provided function + * @since v1.0.2 + * @sig (a -> a) -> ((a -> [a]) -> [a] -> num) -> [a] -> [a] + * @param {Function} fn - to modify the item at the specified index + * @param {Function} pred - The predicate that returns the indexes if found + * @param {Iterable} [a] + * @return {Iterable} [a] + **/ -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function concat (a, b) { - return Array.prototype.concat(a, b) + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function adjustWith (fn, pred, a) { + const _fn = x => { + if (pred(x)) { + return fn(x) + } + return x + } + return Object(_map__WEBPACK_IMPORTED_MODULE_1__["default"])(_fn, Array.prototype.slice.call(a)) })); /***/ }), -/***/ "./node_modules/fun.js/src/array/equals.js": -/*!*************************************************!*\ - !*** ./node_modules/fun.js/src/array/equals.js ***! - \*************************************************/ +/***/ "./node_modules/fun.js/src/all.js": +/*!****************************************!*\ + !*** ./node_modules/fun.js/src/all.js ***! + \****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _not__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../not */ "./node_modules/fun.js/src/not.js"); -/* harmony import */ var _equals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../equals */ "./node_modules/fun.js/src/equals.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); /** - * @private - * @function equalsArray - * @description Autocurried function for deep comparison of arrays - * @param {a} x - Object to compare of type a - * @param {a} y - Object x to compare with object x - * @return {boolean} - */ + * Returns true if all items in the enumerable match the predicate + * + * @function all + * @description Returns true if all items in the enumerable match the predicate + * @since v1.0.2 + * @sig (a -> Boolean) -> [a] -> Boolean + * @param {Function} cb + * @param {Iterable} a + * @return {Boolean} + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function all (cb, a) { + let res = true + for (let i in a) { + if (!cb(a[i])) { + res = false + break + } + } + return res +})); +/***/ }), +/***/ "./node_modules/fun.js/src/allPass.js": +/*!********************************************!*\ + !*** ./node_modules/fun.js/src/allPass.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function equalsArray (x, y) { - if (x.length !== y.length) { - return false - } - for (let i = 0; i < x.length; i++) { - if (Object(_not__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_equals__WEBPACK_IMPORTED_MODULE_2__["default"])(x[i], y[i]))) return false +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/** + * Applies a list of predicates to the data and returns true if all pass + * + * @function allPass + * @description Applies a list of predicates to the data and returns true if all pass + * @since v1.0.2 + * @sig [(*... -> Boolean)] -> (*... -> Boolean + * @param {Array} predicates An array of predicates to check + * @return {Function} The combined predicate + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function allPass (cbs, a) { + for (let i = 0; i < cbs.length; i++) { + if (!cbs[i](a)) return false } return true })); @@ -217,176 +301,157 @@ __webpack_require__.r(__webpack_exports__); /***/ }), -/***/ "./node_modules/fun.js/src/array/fold.js": -/*!***********************************************!*\ - !*** ./node_modules/fun.js/src/array/fold.js ***! - \***********************************************/ +/***/ "./node_modules/fun.js/src/always.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/always.js ***! + \*******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); /** - * @private - * @function fold - * @description Returns a single item by mapping over the provided array and calling an iterator function - * @param {cbFunction} cb - Callback function to modify the item - * @param {*} init - Initial value - * @param {Array} a - Array with items to modify by the cb function - * @return {Array} - * @alias reduce - * @since 1.0.2 - * @example + * Returns a function with the initial value provided * - * const result = fold(add, 0, [1,1,1]) - * // result = 3 - */ - -/** - * @callback cbFunction - * @param {*} r - Accumulator which accumulates the callback's return values - * @param {*} item - the current element being processed - * @param {number} index - the indey of the item being processed - * @param {Array} a - The initial array - * @return {*} - */ + * @function always + * @description Returns a function with the initial value provided + * @since v1.0.2 + * @sig a -> (* -> a) + * @param {*} a + * @return {Function} + **/ -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function fold (cb, init, a) { - let i = -1 - const l = a.length - let r = init - while (++i < l) { - r = cb(r, a[i], i, a) - } - return r +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function always (x) { + return function () { return x } })); /***/ }), -/***/ "./node_modules/fun.js/src/array/is.js": -/*!*********************************************!*\ - !*** ./node_modules/fun.js/src/array/is.js ***! - \*********************************************/ +/***/ "./node_modules/fun.js/src/and.js": +/*!****************************************!*\ + !*** ./node_modules/fun.js/src/and.js ***! + \****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); /** - * Checks if the provided object is an array, autocurried function + * Checks if both predicates are true * - * @private - * @function isArray - * @description Checks if the provided object is an array, autocurried function - * @param {*} Object to verifiy + * @function and + * @description Checks if both predicates are true + * @since v1.0.2 + * @sig (x, y) -> boolean + * @param {*} x - A predicate + * @param {*} y - A predicate * @return {boolean} - * @since 1.0.2 - * @example - * - * const result = isArray([1,1,1]) - * // result = true - */ - + **/ -/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Array')); +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function and (x, y) { + return x && y +})); /***/ }), -/***/ "./node_modules/fun.js/src/array/map.js": -/*!**********************************************!*\ - !*** ./node_modules/fun.js/src/array/map.js ***! - \**********************************************/ +/***/ "./node_modules/fun.js/src/any.js": +/*!****************************************!*\ + !*** ./node_modules/fun.js/src/any.js ***! + \****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); /** - * @function map - * @description Maps over an array and applies a function + * Returns true if at least on of the items in the enumerable match the predicate + * + * @function any + * @description Returns true if at least on of the items in the enumerable match the predicate + * @since v1.0.2 + * @sig (TODO) * @param {Function} cb * @param {Iterable} a - * @return {Iterable} - * @since v1.0.2 - * @example - * - * const result = map(identity, [0,2,3]) - * // result = [0,2,3] - * const add2 = add(2) - * const result = map(add2, [0,2,3]) - * // result = [2,4,5] + * @return {Boolean} **/ -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (cb, a) { - let i = -1 - const l = a.length - const r = new Array(l) - while (++i < l) { - r[i] = cb(a[i], i, a) +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function any (cb, a) { + let res = false + for (let i in a) { + if (cb(a[i])) { + res = true + break + } } - return r + return res })); /***/ }), -/***/ "./node_modules/fun.js/src/boolean/is.js": -/*!***********************************************!*\ - !*** ./node_modules/fun.js/src/boolean/is.js ***! - \***********************************************/ +/***/ "./node_modules/fun.js/src/anyPass.js": +/*!********************************************!*\ + !*** ./node_modules/fun.js/src/anyPass.js ***! + \********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); /** - * Curried function that verifies of the provided argument is a boolean + * Applies a list of predicates to the data and returns true if one passes * - * @private - * @function is - * @description Curried function that verifies of the provided argument is a boolean + * @function anyPass * @since v1.0.2 - * @param {*} Item to verify - * @return {boolean} + * @sig [(*... -> Boolean)] -> (*...) -> Boolean + * @param {Array} predicates An array of predicates to check + * @return {Function} The combined predicate **/ -/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Boolean')); +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function anyPass (cbs, a) { + for (let i = 0; i < cbs.length; i++) { + if (cbs[i](a)) return true + } + return false +})); /***/ }), -/***/ "./node_modules/fun.js/src/concat.js": -/*!*******************************************!*\ - !*** ./node_modules/fun.js/src/concat.js ***! - \*******************************************/ +/***/ "./node_modules/fun.js/src/ap.js": +/*!***************************************!*\ + !*** ./node_modules/fun.js/src/ap.js ***! + \***************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _array_concat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array/concat */ "./node_modules/fun.js/src/array/concat.js"); -/* harmony import */ var _string_concat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./string/concat */ "./node_modules/fun.js/src/string/concat.js"); -/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/* harmony import */ var _private_curry1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_private/curry1 */ "./node_modules/fun.js/src/_private/curry1.js"); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./is */ "./node_modules/fun.js/src/is.js"); +/* harmony import */ var _array_fold__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./array/fold */ "./node_modules/fun.js/src/array/fold.js"); +/* harmony import */ var _array_map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./array/map */ "./node_modules/fun.js/src/array/map.js"); /** - * Concatenates 2 items together + * Applies a list of functions to a list of values and returns a combined result array * - * @function concat - * @description Concatenates 2 items together - * @since v1.0.4 - * @param {a} a - Left side of the concatenation - * @param {a} b - right side of the concatenation - * @return {a} Concatenated item + * @function ap + * @description Applies a list of functions to a list of values and returns a combined result array + * @since v1.0.2 + * @sig @sig [a -> b] -> [a] -> [b] + * @param {(Function[]|Function|Applicative)} fns - An array of functions or a function or an applicative + * @param {Array} vals - An array of values + * @return {Iterable} [a] **/ @@ -394,347 +459,2775 @@ __webpack_require__.r(__webpack_exports__); -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function concat (a, b) { - const typeMap = { - 'String': _string_concat__WEBPACK_IMPORTED_MODULE_2__["default"], - 'Array': _array_concat__WEBPACK_IMPORTED_MODULE_1__["default"] +const isFunction = Object(_is__WEBPACK_IMPORTED_MODULE_2__["default"])('Function') + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function ap (fns, vals) { + if (isFunction(fns.ap)) { + return fns.ap(vals) } - return typeMap[Object(_type__WEBPACK_IMPORTED_MODULE_3__["default"])(a)](a, b) + if (isFunction(fns)) { + return x => fns(x)(vals(x)) + } + return Object(_array_fold__WEBPACK_IMPORTED_MODULE_3__["default"])((acc, f) => acc.concat(Object(_array_map__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(_private_curry1__WEBPACK_IMPORTED_MODULE_1__["default"])(f), vals)), [], fns) })); /***/ }), -/***/ "./node_modules/fun.js/src/curry.js": -/*!******************************************!*\ - !*** ./node_modules/fun.js/src/curry.js ***! - \******************************************/ +/***/ "./node_modules/fun.js/src/aperture.js": +/*!*********************************************!*\ + !*** ./node_modules/fun.js/src/aperture.js ***! + \*********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return curry; }); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./map */ "./node_modules/fun.js/src/map.js"); + + + +/** + * @function aperture + * @param n + * @param arr + * @returns {*} + */ +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function aperture (n, a) { + if (a.length < n) { + return [] + } + const res = Array(a.length - n + 1) + return Object(_map__WEBPACK_IMPORTED_MODULE_1__["default"])((item, idx) => a.slice(idx, idx + n), res) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/append.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/append.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _concat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./concat */ "./node_modules/fun.js/src/concat.js"); +/** + * @function append + * @description Append an elment to a list + * @param {*} el - Element to add to a list + * @param {array} list - List to which to add the element + * @return {array} + * @example + * + * const l = [0, 1] + * append('a', l) // reutnr [0, 1, 'a'] + * + **/ + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function append (el, list) { + return Object(_concat__WEBPACK_IMPORTED_MODULE_1__["default"])(list, [ el ]) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/apply.js": +/*!******************************************!*\ + !*** ./node_modules/fun.js/src/apply.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/** + * @function apply + * @description The apply() method calls a function with the given arguments provided as an array, and the function as context. + * @param fn + * @param args + * @return {*} + * @example + * + * var a = apply(function () { + * return [].slice.call(arguments).map(x => x * 2) + * }) + * a([1, 2, 3]) + * // [2, 4, 6] + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function apply (fn, args) { + return fn.apply(fn, args) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/array/concat.js": +/*!*************************************************!*\ + !*** ./node_modules/fun.js/src/array/concat.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * @private + * @function arrayConcat + * @param a1 + * @param a2 + * @returns {T[]} + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function concat (a, b) { + return Array.prototype.concat(a, b) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/array/equals.js": +/*!*************************************************!*\ + !*** ./node_modules/fun.js/src/array/equals.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _not__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../not */ "./node_modules/fun.js/src/not.js"); +/* harmony import */ var _equals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../equals */ "./node_modules/fun.js/src/equals.js"); +/** + * @private + * @function equalsArray + * @description Autocurried function for deep comparison of arrays + * @param {a} x - Object to compare of type a + * @param {a} y - Object x to compare with object x + * @return {boolean} + */ + + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function equalsArray (x, y) { + if (x.length !== y.length) { + return false + } + for (let i = 0; i < x.length; i++) { + if (Object(_not__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_equals__WEBPACK_IMPORTED_MODULE_2__["default"])(x[i], y[i]))) return false + } + return true +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/array/filter.js": +/*!*************************************************!*\ + !*** ./node_modules/fun.js/src/array/filter.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * @function arrayFilter + * @private + * + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function arrayFilter (fn, a) { + var r = [] + for (let i = 0; i < a.length; i++) { + if (fn(a[i])) r.push(a[i]) + } + return r +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/array/fold.js": +/*!***********************************************!*\ + !*** ./node_modules/fun.js/src/array/fold.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * @private + * @function fold + * @description Returns a single item by mapping over the provided array and calling an iterator function + * @param {cbFunction} cb - Callback function to modify the item + * @param {*} init - Initial value + * @param {Array} a - Array with items to modify by the cb function + * @return {Array} + * @alias reduce + * @since 1.0.2 + * @example + * + * const result = fold(add, 0, [1,1,1]) + * // result = 3 + */ + +/** + * @callback cbFunction + * @param {*} r - Accumulator which accumulates the callback's return values + * @param {*} item - the current element being processed + * @param {number} index - the indey of the item being processed + * @param {Array} a - The initial array + * @return {*} + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function fold (cb, init, a) { + let i = -1 + const l = a.length + let r = init + while (++i < l) { + r = cb(r, a[i], i, a) + } + return r +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/array/is.js": +/*!*********************************************!*\ + !*** ./node_modules/fun.js/src/array/is.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + * Checks if the provided object is an array, autocurried function + * + * @private + * @function isArray + * @description Checks if the provided object is an array, autocurried function + * @param {*} Object to verifiy + * @return {boolean} + * @since 1.0.2 + * @example + * + * const result = isArray([1,1,1]) + * // result = true + */ + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Array')); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/array/map.js": +/*!**********************************************!*\ + !*** ./node_modules/fun.js/src/array/map.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * @function map + * @description Maps over an array and applies a function + * @param {Function} cb + * @param {Iterable} a + * @return {Iterable} + * @since v1.0.2 + * @example + * + * const result = map(identity, [0,2,3]) + * // result = [0,2,3] + * const add2 = add(2) + * const result = map(add2, [0,2,3]) + * // result = [2,4,5] + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (cb, a) { + let i = -1 + const l = a.length + const r = new Array(l) + while (++i < l) { + r[i] = cb(a[i], i, a) + } + return r +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/array/to.js": +/*!*********************************************!*\ + !*** ./node_modules/fun.js/src/array/to.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return toArray; }); +/** + * @function toArray + * @description Converts the input to an array + * @param {ArrayLike} x - Object to convert to an array + * @return {Array} + * @since 1.0.2 + * @example + * + * const result = toArray("string") + * // result = ['s','t','r','i','n','g'] + * + * function () { + * const args = toArray(arguments) + * console.log(typeof args) // Array + * } + * + **/ +function toArray (x) { + return x.length === 1 ? [x[0]] : Array.apply(null, x) +}; + + +/***/ }), + +/***/ "./node_modules/fun.js/src/array/union.js": +/*!************************************************!*\ + !*** ./node_modules/fun.js/src/array/union.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * @function unionArray + * @description Merges 2 arrays + * @param {Array} aL - Array to merge + * @param {Array} aR - Array to merge + * @return {Array} + * @since 1.0.2 + * @example + * + * const result = unionArray([0,1,2], [3,4,5]) + * // result = [0.1.2.3.4.5] + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function unionArray (aL, aR) { + return Array.from(new Set(aL.concat(aR))) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/binary.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/binary.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _private_curry1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_private/curry1 */ "./node_modules/fun.js/src/_private/curry1.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/** + * @function binary + * @param cb + * @returns {function(*=, *=): *} + */ + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_private_curry1__WEBPACK_IMPORTED_MODULE_0__["default"])(function binary (cb) { + return Object(_curry__WEBPACK_IMPORTED_MODULE_1__["default"])(function (a, b) { + return cb(a, b) + }) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/bind.js": +/*!*****************************************!*\ + !*** ./node_modules/fun.js/src/bind.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); + + +/** + * @function bind + * @description Bind a function to a context + * @param {function }fn + * @param {*} context + * @returns {*} + */ +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function bind (fn, context) { + return fn.bind(context) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/boolean/F.js": +/*!**********************************************!*\ + !*** ./node_modules/fun.js/src/boolean/F.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _always__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../always */ "./node_modules/fun.js/src/always.js"); +/** + * Always returns a function with a False boolean + * + * @function F + * @description Always returns a function with a False boolean + * @since v1.0.2 + * @param {*} a + * @return {Function} + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_always__WEBPACK_IMPORTED_MODULE_0__["default"])(false)); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/boolean/T.js": +/*!**********************************************!*\ + !*** ./node_modules/fun.js/src/boolean/T.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _always__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../always */ "./node_modules/fun.js/src/always.js"); +/** + * Always returns a function with a False boolean + * + * @function T + * @description Always returns a function with a False boolean + * @since v1.0.2 + * @param {*} a + * @return {Function} + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_always__WEBPACK_IMPORTED_MODULE_0__["default"])(true)); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/boolean/both.js": +/*!*************************************************!*\ + !*** ./node_modules/fun.js/src/boolean/both.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _lift__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lift */ "./node_modules/fun.js/src/lift.js"); +/* harmony import */ var _and__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../and */ "./node_modules/fun.js/src/and.js"); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + * Returns true when both predicates return true + * + * @function + * @since v1.0.2 + * @param {Function} fn1 A predicate function + * @param {Function} fn2 A predicate function + * @return {Boolean} + **/ + + + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function both (fn1, fn2) { + return Object(_is__WEBPACK_IMPORTED_MODULE_3__["default"])('Function')(fn1) + ? function _both () { return fn1.apply(this, arguments) && fn2.apply(this, arguments) } + : Object(_lift__WEBPACK_IMPORTED_MODULE_1__["default"])(_and__WEBPACK_IMPORTED_MODULE_2__["default"])(fn1, fn2) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/boolean/is.js": +/*!***********************************************!*\ + !*** ./node_modules/fun.js/src/boolean/is.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + * Curried function that verifies of the provided argument is a boolean + * + * @private + * @function is + * @description Curried function that verifies of the provided argument is a boolean + * @since v1.0.2 + * @param {*} Item to verify + * @return {boolean} + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Boolean')); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/call.js": +/*!*****************************************!*\ + !*** ./node_modules/fun.js/src/call.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/** + * @function call + * @param fn + * @returns {*} + */ +// import curry1 from './_private/curry1' + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function call (fn) { + return fn.apply(fn, [].slice.call(arguments, 1)) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/complement.js": +/*!***********************************************!*\ + !*** ./node_modules/fun.js/src/complement.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _lift__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lift */ "./node_modules/fun.js/src/lift.js"); +/* harmony import */ var _not__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./not */ "./node_modules/fun.js/src/not.js"); +/** + * @function complement + * @description Lifts a predicate function and returns the complement + * @param {Function} A predicate function + * @return {Function} + * @see not + * @see lift + * @since v1.0.2 + * @example + * + * const isNotEmpty = complement(isEmpty) + * isNotEmpty([]) // false + * isNotEmpty({'a' : 1}) // true + * + * complement(Maybe.of(false)) // true + * complement(Maybe.of(true)) // false + */ + + + +const complement = Object(_lift__WEBPACK_IMPORTED_MODULE_0__["default"])(_not__WEBPACK_IMPORTED_MODULE_1__["default"]) +/* harmony default export */ __webpack_exports__["default"] = (complement); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/compose.js": +/*!********************************************!*\ + !*** ./node_modules/fun.js/src/compose.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return compose; }); +/** + * @function compose + * @returns {function(): *} + */ +function compose () { + let fns = Array.prototype.slice.call(arguments) + + return function _compose () { + let init = fns[fns.length - 1] + let result = [init.apply(init, arguments)] + let i = fns.length - 2 + + for (i; i >= 0; --i) { + const fn = fns[i] + + result = [fn.apply(fn, result)] + } + return result[0] + } +}; + + +/***/ }), + +/***/ "./node_modules/fun.js/src/concat.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/concat.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _array_concat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array/concat */ "./node_modules/fun.js/src/array/concat.js"); +/* harmony import */ var _string_concat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./string/concat */ "./node_modules/fun.js/src/string/concat.js"); +/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/** + * Concatenates 2 items together + * + * @function concat + * @description Concatenates 2 items together + * @since v1.0.4 + * @param {a} a - Left side of the concatenation + * @param {a} b - right side of the concatenation + * @return {a} Concatenated item + **/ + + + + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function concat (a, b) { + const typeMap = { + 'String': _string_concat__WEBPACK_IMPORTED_MODULE_2__["default"], + 'Array': _array_concat__WEBPACK_IMPORTED_MODULE_1__["default"] + } + return typeMap[Object(_type__WEBPACK_IMPORTED_MODULE_3__["default"])(a)](a, b) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/cond.js": +/*!*****************************************!*\ + !*** ./node_modules/fun.js/src/cond.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return cond; }); +/** + * @function cond + * @param conds + * @returns {Function} + */ +function cond (conds) { + return function (value) { + for (var i = 0; i < conds.length; i++) { + if (conds[i][0](value)) return conds[i][1](value) + } + } +} + + +/***/ }), + +/***/ "./node_modules/fun.js/src/curry.js": +/*!******************************************!*\ + !*** ./node_modules/fun.js/src/curry.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return curry; }); /* eslint-disable no-use-before-define */ /** - * @function curry - * @description Autocurries the provided function + * @function curry + * @description Autocurries the provided function + */ +function curry (fun) { + const argslen = fun.length + + if (argslen === 0) { + return fun + } + return createRecurser([]) + + function recurse (acc, args) { + const _acc = acc.concat(args) + return _acc.length < argslen + ? createRecurser(_acc) + : fun.apply(this, _acc) + } + + function createRecurser (acc) { + return function () { + return recurse(acc, Array.prototype.slice.call(arguments)) + } + } +} + + +/***/ }), + +/***/ "./node_modules/fun.js/src/date/diffDate.js": +/*!**************************************************!*\ + !*** ./node_modules/fun.js/src/date/diffDate.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * @function diffDate + * @description Returns the difference between 2 dates in millisecond + * @param {Date} start - Start date + * @param {Date} end - End date + * @return {number} REturn the difference in milliseconds + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function diffDate (start, end) { + return (new Date(start).getTime() - new Date(end).getTime()) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/date/is.js": +/*!********************************************!*\ + !*** ./node_modules/fun.js/src/date/is.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + * Created by dierickx.len on 01/04/2017. + */ +/** + * Created by dierickx.len on 01/04/2017. + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Date')); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/date/isFutureDate.js": +/*!******************************************************!*\ + !*** ./node_modules/fun.js/src/date/isFutureDate.js ***! + \******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _diffDate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./diffDate */ "./node_modules/fun.js/src/date/diffDate.js"); +/** + * Created by dierickx.len on 09/03/2017. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ((d) => { + return Object(_diffDate__WEBPACK_IMPORTED_MODULE_0__["default"])(new Date())(d) < 0 +}); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/date/isValid.js": +/*!*************************************************!*\ + !*** ./node_modules/fun.js/src/date/isValid.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isValid; }); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/fun.js/src/date/is.js"); +/** + * + */ + + +function isValid (x) { + // noinspection JSCheckFunctionSignatures + return Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])(x) && isFinite(x.valueOf()) +}; + + +/***/ }), + +/***/ "./node_modules/fun.js/src/date/toDay.js": +/*!***********************************************!*\ + !*** ./node_modules/fun.js/src/date/toDay.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Created by dierickx.len on 26/03/2017. + */ +/* harmony default export */ __webpack_exports__["default"] = ((d) => d / 86400000); // 24*60*60*1000 = 86400000 + + +/***/ }), + +/***/ "./node_modules/fun.js/src/date/toHour.js": +/*!************************************************!*\ + !*** ./node_modules/fun.js/src/date/toHour.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Created by dierickx.len on 26/03/2017. + */ +/* harmony default export */ __webpack_exports__["default"] = ((d) => d / 3600000); // 60*60*1000 = 3600000 + + +/***/ }), + +/***/ "./node_modules/fun.js/src/date/toMinutes.js": +/*!***************************************************!*\ + !*** ./node_modules/fun.js/src/date/toMinutes.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Created by dierickx.len on 26/03/2017. + */ +/* harmony default export */ __webpack_exports__["default"] = ((d) => d / 60000); // 60*1000 = 60000 + + +/***/ }), + +/***/ "./node_modules/fun.js/src/date/toSeconds.js": +/*!***************************************************!*\ + !*** ./node_modules/fun.js/src/date/toSeconds.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Created by dierickx.len on 26/03/2017. + */ +/* harmony default export */ __webpack_exports__["default"] = ((d) => d / 1000); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/defaultTo.js": +/*!**********************************************!*\ + !*** ./node_modules/fun.js/src/defaultTo.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/** + * Returns true if all items in the enumerable match the predicate + * + * @function defaultTo + * @description Returns true if all items in the enumerable match the predicate + * @since v1.0.2 + * @sig a -> b -> a | b + * @param {a} default The default value. + * @param {b} val `val` will be returned instead of `default` unless `val` is `null`, `undefined` or `NaN`. + * @return {*} The second value if it is not `null`, `undefined` or `NaN`, otherwise the default value + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function defaultTo (d, v) { +// eslint-disable-next-line no-self-compare + return v == null || v !== v ? d : v +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/empty.js": +/*!******************************************!*\ + !*** ./node_modules/fun.js/src/empty.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return empty; }); +/** + + * @function empty + * @description Returns the empty equivalent of the first argument + */ + +function empty (x) { + return new x.constructor() +}; + + +/***/ }), + +/***/ "./node_modules/fun.js/src/equals.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/equals.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _exists__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./exists */ "./node_modules/fun.js/src/exists.js"); +/* harmony import */ var _identical__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./identical */ "./node_modules/fun.js/src/identical.js"); +/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/* harmony import */ var _not__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./not */ "./node_modules/fun.js/src/not.js"); +/* harmony import */ var _or__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./or */ "./node_modules/fun.js/src/or.js"); +/* harmony import */ var _object_is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./object/is */ "./node_modules/fun.js/src/object/is.js"); +/* harmony import */ var _array_is__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./array/is */ "./node_modules/fun.js/src/array/is.js"); +/* harmony import */ var _boolean_is__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./boolean/is */ "./node_modules/fun.js/src/boolean/is.js"); +/* harmony import */ var _number_is__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./number/is */ "./node_modules/fun.js/src/number/is.js"); +/* harmony import */ var _string_is__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./string/is */ "./node_modules/fun.js/src/string/is.js"); +/* harmony import */ var _date_is__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./date/is */ "./node_modules/fun.js/src/date/is.js"); +/* harmony import */ var _array_equals__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./array/equals */ "./node_modules/fun.js/src/array/equals.js"); +/* harmony import */ var _object_equals__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./object/equals */ "./node_modules/fun.js/src/object/equals.js"); +/** + + * @function equals + * @description Autocurried function that checks for equality of 2 items + * @param {*} x - Left side of the equality check + * @param {*} y - Right side of the equality check + * @return {boolean} + * @example + * + * const nan = Number.NaN + * equal(nan, nan) // returns true + * + * const arr1 = [0, 1, 2, 3] + * const arr2 = [null, 1, 2, 3] + * equals(arr1, arr2) // returns false + * + * equals(new Object({'a': 0, 'b': 1}), {'a': 0, 'b': 1}) // true + * + */ + + + + + + + + + + + + + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function equals (x, y) { + if (Object(_identical__WEBPACK_IMPORTED_MODULE_2__["default"])(x, y)) return true + + if (Object(_type__WEBPACK_IMPORTED_MODULE_3__["default"])(x) !== Object(_type__WEBPACK_IMPORTED_MODULE_3__["default"])(y)) return false + + if (Object(_or__WEBPACK_IMPORTED_MODULE_5__["default"])(Object(_not__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(_exists__WEBPACK_IMPORTED_MODULE_1__["default"])(x)), Object(_not__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(_exists__WEBPACK_IMPORTED_MODULE_1__["default"])(y)))) return false + + if (x.constructor !== y.constructor) return false + + if (Object(_string_is__WEBPACK_IMPORTED_MODULE_10__["default"])(x) || Object(_boolean_is__WEBPACK_IMPORTED_MODULE_8__["default"])(x) || Object(_number_is__WEBPACK_IMPORTED_MODULE_9__["default"])(x) || Object(_date_is__WEBPACK_IMPORTED_MODULE_11__["default"])(x)) { + return Object(_identical__WEBPACK_IMPORTED_MODULE_2__["default"])(x.valueOf(), y.valueOf()) + } + if (Object(_array_is__WEBPACK_IMPORTED_MODULE_7__["default"])(x)) { + return Object(_array_equals__WEBPACK_IMPORTED_MODULE_12__["default"])(x, y) + } else if (Object(_object_is__WEBPACK_IMPORTED_MODULE_6__["default"])(x)) { + return Object(_object_equals__WEBPACK_IMPORTED_MODULE_13__["default"])(x, y) + } + return false +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/exists.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/exists.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return exists; }); +/** + * @function exists + */ +function exists (x) { + return !(x == null) +}; + + +/***/ }), + +/***/ "./node_modules/fun.js/src/filter.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/filter.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _array_filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array/filter */ "./node_modules/fun.js/src/array/filter.js"); +/* harmony import */ var _object_filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./object/filter */ "./node_modules/fun.js/src/object/filter.js"); +/* harmony import */ var _map_filter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./map/filter */ "./node_modules/fun.js/src/map/filter.js"); +/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/** + * @function filter + * @description Autocurried fucntion that filters Objects, Arrays and Maps + * + */ + + + + +// TODO +// import setFilter from '../set/filter' + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function filter (fn, a) { + switch (Object(_type__WEBPACK_IMPORTED_MODULE_4__["default"])(a)) { + // switch (Object.prototype.toString.call(a)) { + // case 'Function': + // return curry(function () { + // return cb.call(this, a.apply(this, arguments)) + // }) + case 'Object': + return Object(_object_filter__WEBPACK_IMPORTED_MODULE_2__["default"])(fn, a) + // case 'String': + // return stringMap(cb, a) + case 'Map': + return Object(_map_filter__WEBPACK_IMPORTED_MODULE_3__["default"])(fn, a) + // case 'Set': + // return setFilter(fn, a) + default: + return Object(_array_filter__WEBPACK_IMPORTED_MODULE_1__["default"])(fn, a) + } +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/findIndex.js": +/*!**********************************************!*\ + !*** ./node_modules/fun.js/src/findIndex.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/** + * Find the index matching a predicate + * + * @function findIndex + * @description Find the index matching a predicate + * @since v1.0.2 + * @sig (a -> boolean) -> [a] -> number + * @param {Function} Predicate function returns a boolean + * @param {Array} An array like object + * @return {number} + **/ + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function findIndex (fn, a) { + let i = 0 + const l = a.length + while (i < l) { + if (fn(a[i])) { + return i + } + i += 1 + } + return -1 +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/first.js": +/*!******************************************!*\ + !*** ./node_modules/fun.js/src/first.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _private_curry1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_private/curry1 */ "./node_modules/fun.js/src/_private/curry1.js"); +/** + * @function first + * @param [a] + * @return a | undefined + * @example + * + * const arr = [1, 2, 4] + * first([1, 2, 4]) // returns 1 + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_private_curry1__WEBPACK_IMPORTED_MODULE_0__["default"])(function first (a) { + return a && a.length ? a[0] : undefined +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/flatMap.js": +/*!********************************************!*\ + !*** ./node_modules/fun.js/src/flatMap.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _fold__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fold */ "./node_modules/fun.js/src/fold.js"); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./empty */ "./node_modules/fun.js/src/empty.js"); +/* harmony import */ var _concat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./concat */ "./node_modules/fun.js/src/concat.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./is */ "./node_modules/fun.js/src/is.js"); + + + + + + +const isFunction = Object(_is__WEBPACK_IMPORTED_MODULE_4__["default"])('Function') + +/** + * @function flatMap + * @param fn + * @param a + */ +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_3__["default"])(function flatMap (fn, a) { + if (isFunction(a)) { + return function (x) { + return fn(a(x))(x) + } + } + if (isFunction(a.flatMap)) { + return a.flatMap(fn) + } + return Object(_fold__WEBPACK_IMPORTED_MODULE_0__["default"])((acc, x) => Object(_concat__WEBPACK_IMPORTED_MODULE_2__["default"])(acc, fn(x)), Object(_empty__WEBPACK_IMPORTED_MODULE_1__["default"])(a), a) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/fold.js": +/*!*****************************************!*\ + !*** ./node_modules/fun.js/src/fold.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _array_fold__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array/fold */ "./node_modules/fun.js/src/array/fold.js"); +/* harmony import */ var _object_fold__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./object/fold */ "./node_modules/fun.js/src/object/fold.js"); +/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/** + * Returns a single item by iterating over an array like object and call a function on each item + * + * @function fold + * @description Returns a single item by iterating over an array like object and call a function on each item + * @since v1.0.2 + * @sig ((a, b, c, a) → a) → a → [b] → a + * @param {Function} cb receives 4 values: the accumulator, the item, the index, and the initial value. + * @param {*} a is the initial value + * @param {*} [b] the array like item to iterate over + * @return {*} a is the accumulated value + **/ + + + + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function fold (cb, init, a) { + const typeMap = { + 'Object': _object_fold__WEBPACK_IMPORTED_MODULE_2__["default"], + 'Array': _array_fold__WEBPACK_IMPORTED_MODULE_1__["default"] + } + // if (a.next) { + // return iterableFold(cb, init, a) + // } + // if (type(Symbol) !== 'undefined' && a[Symbol.iterator]) { + // return iterableFold(cb, init, a[Symbol.iterator]()) + // } + return typeMap[Object(_type__WEBPACK_IMPORTED_MODULE_3__["default"])(a)](cb, init, a) +})); + +// function iterableFold (cb, acc, gen) { +// let step = gen.next() +// while (!step.done) { +// acc = cb(acc, step.value) +// step = gen.next() +// } +// return acc +// } + + +/***/ }), + +/***/ "./node_modules/fun.js/src/identical.js": +/*!**********************************************!*\ + !*** ./node_modules/fun.js/src/identical.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _number_isNan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./number/isNan */ "./node_modules/fun.js/src/number/isNan.js"); +/** + + * @function identical + * @description checks for identintical items + */ + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function identical (x, y) { + if (x === 0 && y === 0) { + return 1 / x === 1 / y + } + if (x === y) { + return true + } + return !!(Object(_number_isNan__WEBPACK_IMPORTED_MODULE_1__["default"])(x) && Object(_number_isNan__WEBPACK_IMPORTED_MODULE_1__["default"])(y)) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/identity.js": +/*!*********************************************!*\ + !*** ./node_modules/fun.js/src/identity.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return identity; }); +/** + + * @function identity + * @description Returns the value supplied to the function + */ + +function identity (x) { + return x +}; + + +/***/ }), + +/***/ "./node_modules/fun.js/src/index.js": +/*!******************************************!*\ + !*** ./node_modules/fun.js/src/index.js ***! + \******************************************/ +/*! exports provided: aperture, add, addIndex, adjust, adjustWith, all, allPass, always, and, any, anyPass, ap, append, apply, binary, bind, both, call, complement, compose, concat, cond, curry, defaultTo, diffDate, divide, empty, equals, exists, F, filter, findIndex, first, flatMap, fold, formatString, has, hasIn, identical, identity, is, isArray, isBoolean, isDate, isEmpty, isFutureDate, isMap, isNan, isNull, isNumber, isObject, isSet, isString, isUndefined, isValidDate, Just, keys, keysIn, last, lift, map, max, Maybe, merge, multiply, not, Nothing, omit, or, path, pick, prop, sum, T, toDay, toHour, toMinutes, toSeconds, truthy, type, union, values, zip, zipWith */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _aperture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./aperture */ "./node_modules/fun.js/src/aperture.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "aperture", function() { return _aperture__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + +/* harmony import */ var _number_add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./number/add */ "./node_modules/fun.js/src/number/add.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "add", function() { return _number_add__WEBPACK_IMPORTED_MODULE_1__["default"]; }); + +/* harmony import */ var _addIndex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./addIndex */ "./node_modules/fun.js/src/addIndex.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addIndex", function() { return _addIndex__WEBPACK_IMPORTED_MODULE_2__["default"]; }); + +/* harmony import */ var _adjust__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./adjust */ "./node_modules/fun.js/src/adjust.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "adjust", function() { return _adjust__WEBPACK_IMPORTED_MODULE_3__["default"]; }); + +/* harmony import */ var _adjustWith__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./adjustWith */ "./node_modules/fun.js/src/adjustWith.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "adjustWith", function() { return _adjustWith__WEBPACK_IMPORTED_MODULE_4__["default"]; }); + +/* harmony import */ var _all__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./all */ "./node_modules/fun.js/src/all.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "all", function() { return _all__WEBPACK_IMPORTED_MODULE_5__["default"]; }); + +/* harmony import */ var _allPass__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./allPass */ "./node_modules/fun.js/src/allPass.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "allPass", function() { return _allPass__WEBPACK_IMPORTED_MODULE_6__["default"]; }); + +/* harmony import */ var _always__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./always */ "./node_modules/fun.js/src/always.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "always", function() { return _always__WEBPACK_IMPORTED_MODULE_7__["default"]; }); + +/* harmony import */ var _and__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./and */ "./node_modules/fun.js/src/and.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "and", function() { return _and__WEBPACK_IMPORTED_MODULE_8__["default"]; }); + +/* harmony import */ var _any__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./any */ "./node_modules/fun.js/src/any.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "any", function() { return _any__WEBPACK_IMPORTED_MODULE_9__["default"]; }); + +/* harmony import */ var _anyPass__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./anyPass */ "./node_modules/fun.js/src/anyPass.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "anyPass", function() { return _anyPass__WEBPACK_IMPORTED_MODULE_10__["default"]; }); + +/* harmony import */ var _ap__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ap */ "./node_modules/fun.js/src/ap.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ap", function() { return _ap__WEBPACK_IMPORTED_MODULE_11__["default"]; }); + +/* harmony import */ var _append__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./append */ "./node_modules/fun.js/src/append.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "append", function() { return _append__WEBPACK_IMPORTED_MODULE_12__["default"]; }); + +/* harmony import */ var _apply__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./apply */ "./node_modules/fun.js/src/apply.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "apply", function() { return _apply__WEBPACK_IMPORTED_MODULE_13__["default"]; }); + +/* harmony import */ var _binary__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./binary */ "./node_modules/fun.js/src/binary.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "binary", function() { return _binary__WEBPACK_IMPORTED_MODULE_14__["default"]; }); + +/* harmony import */ var _bind__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./bind */ "./node_modules/fun.js/src/bind.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bind", function() { return _bind__WEBPACK_IMPORTED_MODULE_15__["default"]; }); + +/* harmony import */ var _boolean_both__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./boolean/both */ "./node_modules/fun.js/src/boolean/both.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "both", function() { return _boolean_both__WEBPACK_IMPORTED_MODULE_16__["default"]; }); + +/* harmony import */ var _call__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./call */ "./node_modules/fun.js/src/call.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "call", function() { return _call__WEBPACK_IMPORTED_MODULE_17__["default"]; }); + +/* harmony import */ var _complement__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./complement */ "./node_modules/fun.js/src/complement.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "complement", function() { return _complement__WEBPACK_IMPORTED_MODULE_18__["default"]; }); + +/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./compose */ "./node_modules/fun.js/src/compose.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "compose", function() { return _compose__WEBPACK_IMPORTED_MODULE_19__["default"]; }); + +/* harmony import */ var _concat__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./concat */ "./node_modules/fun.js/src/concat.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _concat__WEBPACK_IMPORTED_MODULE_20__["default"]; }); + +/* harmony import */ var _cond__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./cond */ "./node_modules/fun.js/src/cond.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cond", function() { return _cond__WEBPACK_IMPORTED_MODULE_21__["default"]; }); + +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curry", function() { return _curry__WEBPACK_IMPORTED_MODULE_22__["default"]; }); + +/* harmony import */ var _defaultTo__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./defaultTo */ "./node_modules/fun.js/src/defaultTo.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultTo", function() { return _defaultTo__WEBPACK_IMPORTED_MODULE_23__["default"]; }); + +/* harmony import */ var _date_diffDate__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./date/diffDate */ "./node_modules/fun.js/src/date/diffDate.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "diffDate", function() { return _date_diffDate__WEBPACK_IMPORTED_MODULE_24__["default"]; }); + +/* harmony import */ var _number_divide__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./number/divide */ "./node_modules/fun.js/src/number/divide.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "divide", function() { return _number_divide__WEBPACK_IMPORTED_MODULE_25__["default"]; }); + +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./empty */ "./node_modules/fun.js/src/empty.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return _empty__WEBPACK_IMPORTED_MODULE_26__["default"]; }); + +/* harmony import */ var _equals__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./equals */ "./node_modules/fun.js/src/equals.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "equals", function() { return _equals__WEBPACK_IMPORTED_MODULE_27__["default"]; }); + +/* harmony import */ var _exists__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./exists */ "./node_modules/fun.js/src/exists.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exists", function() { return _exists__WEBPACK_IMPORTED_MODULE_28__["default"]; }); + +/* harmony import */ var _boolean_F__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./boolean/F */ "./node_modules/fun.js/src/boolean/F.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "F", function() { return _boolean_F__WEBPACK_IMPORTED_MODULE_29__["default"]; }); + +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./filter */ "./node_modules/fun.js/src/filter.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return _filter__WEBPACK_IMPORTED_MODULE_30__["default"]; }); + +/* harmony import */ var _findIndex__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./findIndex */ "./node_modules/fun.js/src/findIndex.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return _findIndex__WEBPACK_IMPORTED_MODULE_31__["default"]; }); + +/* harmony import */ var _first__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./first */ "./node_modules/fun.js/src/first.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "first", function() { return _first__WEBPACK_IMPORTED_MODULE_32__["default"]; }); + +/* harmony import */ var _flatMap__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./flatMap */ "./node_modules/fun.js/src/flatMap.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _flatMap__WEBPACK_IMPORTED_MODULE_33__["default"]; }); + +/* harmony import */ var _fold__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./fold */ "./node_modules/fun.js/src/fold.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fold", function() { return _fold__WEBPACK_IMPORTED_MODULE_34__["default"]; }); + +/* harmony import */ var _string_formatString__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./string/formatString */ "./node_modules/fun.js/src/string/formatString.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatString", function() { return _string_formatString__WEBPACK_IMPORTED_MODULE_35__["default"]; }); + +/* harmony import */ var _object_has__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./object/has */ "./node_modules/fun.js/src/object/has.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "has", function() { return _object_has__WEBPACK_IMPORTED_MODULE_36__["default"]; }); + +/* harmony import */ var _object_hasIn__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./object/hasIn */ "./node_modules/fun.js/src/object/hasIn.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hasIn", function() { return _object_hasIn__WEBPACK_IMPORTED_MODULE_37__["default"]; }); + +/* harmony import */ var _identical__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./identical */ "./node_modules/fun.js/src/identical.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "identical", function() { return _identical__WEBPACK_IMPORTED_MODULE_38__["default"]; }); + +/* harmony import */ var _identity__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./identity */ "./node_modules/fun.js/src/identity.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return _identity__WEBPACK_IMPORTED_MODULE_39__["default"]; }); + +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./is */ "./node_modules/fun.js/src/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "is", function() { return _is__WEBPACK_IMPORTED_MODULE_40__["default"]; }); + +/* harmony import */ var _array_is__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./array/is */ "./node_modules/fun.js/src/array/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isArray", function() { return _array_is__WEBPACK_IMPORTED_MODULE_41__["default"]; }); + +/* harmony import */ var _boolean_is__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./boolean/is */ "./node_modules/fun.js/src/boolean/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isBoolean", function() { return _boolean_is__WEBPACK_IMPORTED_MODULE_42__["default"]; }); + +/* harmony import */ var _date_is__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./date/is */ "./node_modules/fun.js/src/date/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isDate", function() { return _date_is__WEBPACK_IMPORTED_MODULE_43__["default"]; }); + +/* harmony import */ var _isEmpty__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./isEmpty */ "./node_modules/fun.js/src/isEmpty.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return _isEmpty__WEBPACK_IMPORTED_MODULE_44__["default"]; }); + +/* harmony import */ var _date_isFutureDate__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./date/isFutureDate */ "./node_modules/fun.js/src/date/isFutureDate.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isFutureDate", function() { return _date_isFutureDate__WEBPACK_IMPORTED_MODULE_45__["default"]; }); + +/* harmony import */ var _map_is__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./map/is */ "./node_modules/fun.js/src/map/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isMap", function() { return _map_is__WEBPACK_IMPORTED_MODULE_46__["default"]; }); + +/* harmony import */ var _number_isNan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./number/isNan */ "./node_modules/fun.js/src/number/isNan.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isNan", function() { return _number_isNan__WEBPACK_IMPORTED_MODULE_47__["default"]; }); + +/* harmony import */ var _null_is__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./null/is */ "./node_modules/fun.js/src/null/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isNull", function() { return _null_is__WEBPACK_IMPORTED_MODULE_48__["default"]; }); + +/* harmony import */ var _number_is__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./number/is */ "./node_modules/fun.js/src/number/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isNumber", function() { return _number_is__WEBPACK_IMPORTED_MODULE_49__["default"]; }); + +/* harmony import */ var _object_is__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./object/is */ "./node_modules/fun.js/src/object/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isObject", function() { return _object_is__WEBPACK_IMPORTED_MODULE_50__["default"]; }); + +/* harmony import */ var _set_is__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./set/is */ "./node_modules/fun.js/src/set/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isSet", function() { return _set_is__WEBPACK_IMPORTED_MODULE_51__["default"]; }); + +/* harmony import */ var _string_is__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./string/is */ "./node_modules/fun.js/src/string/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isString", function() { return _string_is__WEBPACK_IMPORTED_MODULE_52__["default"]; }); + +/* harmony import */ var _undefined_is__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./undefined/is */ "./node_modules/fun.js/src/undefined/is.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isUndefined", function() { return _undefined_is__WEBPACK_IMPORTED_MODULE_53__["default"]; }); + +/* harmony import */ var _date_isValid__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./date/isValid */ "./node_modules/fun.js/src/date/isValid.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isValidDate", function() { return _date_isValid__WEBPACK_IMPORTED_MODULE_54__["default"]; }); + +/* harmony import */ var _monads_Just__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./monads/Just */ "./node_modules/fun.js/src/monads/Just.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Just", function() { return _monads_Just__WEBPACK_IMPORTED_MODULE_55__["default"]; }); + +/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./keys */ "./node_modules/fun.js/src/keys.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "keys", function() { return _keys__WEBPACK_IMPORTED_MODULE_56__["default"]; }); + +/* harmony import */ var _object_keysIn__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./object/keysIn */ "./node_modules/fun.js/src/object/keysIn.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "keysIn", function() { return _object_keysIn__WEBPACK_IMPORTED_MODULE_57__["default"]; }); + +/* harmony import */ var _last__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./last */ "./node_modules/fun.js/src/last.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "last", function() { return _last__WEBPACK_IMPORTED_MODULE_58__["default"]; }); + +/* harmony import */ var _lift__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./lift */ "./node_modules/fun.js/src/lift.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lift", function() { return _lift__WEBPACK_IMPORTED_MODULE_59__["default"]; }); + +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./map */ "./node_modules/fun.js/src/map.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _map__WEBPACK_IMPORTED_MODULE_60__["default"]; }); + +/* harmony import */ var _max__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./max */ "./node_modules/fun.js/src/max.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _max__WEBPACK_IMPORTED_MODULE_61__["default"]; }); + +/* harmony import */ var _monads_Maybe__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./monads/Maybe */ "./node_modules/fun.js/src/monads/Maybe.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Maybe", function() { return _monads_Maybe__WEBPACK_IMPORTED_MODULE_62__["default"]; }); + +/* harmony import */ var _object_merge__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./object/merge */ "./node_modules/fun.js/src/object/merge.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _object_merge__WEBPACK_IMPORTED_MODULE_63__["default"]; }); + +/* harmony import */ var _number_multiply__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./number/multiply */ "./node_modules/fun.js/src/number/multiply.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multiply", function() { return _number_multiply__WEBPACK_IMPORTED_MODULE_64__["default"]; }); + +/* harmony import */ var _not__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./not */ "./node_modules/fun.js/src/not.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "not", function() { return _not__WEBPACK_IMPORTED_MODULE_65__["default"]; }); + +/* harmony import */ var _monads_Nothing__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./monads/Nothing */ "./node_modules/fun.js/src/monads/Nothing.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Nothing", function() { return _monads_Nothing__WEBPACK_IMPORTED_MODULE_66__["default"]; }); + +/* harmony import */ var _object_omit__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./object/omit */ "./node_modules/fun.js/src/object/omit.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "omit", function() { return _object_omit__WEBPACK_IMPORTED_MODULE_67__["default"]; }); + +/* harmony import */ var _or__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./or */ "./node_modules/fun.js/src/or.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "or", function() { return _or__WEBPACK_IMPORTED_MODULE_68__["default"]; }); + +/* harmony import */ var _object_path__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./object/path */ "./node_modules/fun.js/src/object/path.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "path", function() { return _object_path__WEBPACK_IMPORTED_MODULE_69__["default"]; }); + +/* harmony import */ var _object_pick__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./object/pick */ "./node_modules/fun.js/src/object/pick.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pick", function() { return _object_pick__WEBPACK_IMPORTED_MODULE_70__["default"]; }); + +/* harmony import */ var _object_prop__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ./object/prop */ "./node_modules/fun.js/src/object/prop.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prop", function() { return _object_prop__WEBPACK_IMPORTED_MODULE_71__["default"]; }); + +/* harmony import */ var _number_sum__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ./number/sum */ "./node_modules/fun.js/src/number/sum.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sum", function() { return _number_sum__WEBPACK_IMPORTED_MODULE_72__["default"]; }); + +/* harmony import */ var _boolean_T__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ./boolean/T */ "./node_modules/fun.js/src/boolean/T.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "T", function() { return _boolean_T__WEBPACK_IMPORTED_MODULE_73__["default"]; }); + +/* harmony import */ var _date_toDay__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ./date/toDay */ "./node_modules/fun.js/src/date/toDay.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toDay", function() { return _date_toDay__WEBPACK_IMPORTED_MODULE_74__["default"]; }); + +/* harmony import */ var _date_toHour__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ./date/toHour */ "./node_modules/fun.js/src/date/toHour.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toHour", function() { return _date_toHour__WEBPACK_IMPORTED_MODULE_75__["default"]; }); + +/* harmony import */ var _date_toMinutes__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ./date/toMinutes */ "./node_modules/fun.js/src/date/toMinutes.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toMinutes", function() { return _date_toMinutes__WEBPACK_IMPORTED_MODULE_76__["default"]; }); + +/* harmony import */ var _date_toSeconds__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ./date/toSeconds */ "./node_modules/fun.js/src/date/toSeconds.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toSeconds", function() { return _date_toSeconds__WEBPACK_IMPORTED_MODULE_77__["default"]; }); + +/* harmony import */ var _truthy__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! ./truthy */ "./node_modules/fun.js/src/truthy.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "truthy", function() { return _truthy__WEBPACK_IMPORTED_MODULE_78__["default"]; }); + +/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "type", function() { return _type__WEBPACK_IMPORTED_MODULE_79__["default"]; }); + +/* harmony import */ var _array_union__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! ./array/union */ "./node_modules/fun.js/src/array/union.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "union", function() { return _array_union__WEBPACK_IMPORTED_MODULE_80__["default"]; }); + +/* harmony import */ var _object_values__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! ./object/values */ "./node_modules/fun.js/src/object/values.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "values", function() { return _object_values__WEBPACK_IMPORTED_MODULE_81__["default"]; }); + +/* harmony import */ var _zip__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(/*! ./zip */ "./node_modules/fun.js/src/zip.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _zip__WEBPACK_IMPORTED_MODULE_82__["default"]; }); + +/* harmony import */ var _zipWith__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(/*! ./zipWith */ "./node_modules/fun.js/src/zipWith.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipWith", function() { return _zipWith__WEBPACK_IMPORTED_MODULE_83__["default"]; }); + +// export { default as __ } from './__'; + +// export { default as applySpec } from './applySpec' +// export { default as applyTo } from './applyTo' +// export { default as ascend } from './ascend' +// export { default as assoc } from './assoc' +// export { default as assocPath } from './assocPath' +// export { default as clamp } from './clamp' +// export { default as clone } from './clone' +// export { default as comparator } from './comparator' +// export { default as composeK } from './composeK' +// export { default as composeP } from './composeP' +// export { default as composeWith } from './composeWith' +// export { default as construct } from './construct' +// export { default as constructN } from './constructN' +// export { default as contains } from './contains' +// export { default as converge } from './converge' +// export { default as countBy } from './countBy' +// export { default as dec } from './dec' +// export { default as descend } from './descend' +// export { default as difference } from './difference' +// export { default as differenceWith } from './differenceWith' +// export { default as dissoc } from './dissoc' +// export { default as dissocPath } from './dissocPath' +// export { default as drop } from './drop' +// export { default as dropLast } from './dropLast' +// export { default as dropLastWhile } from './dropLastWhile' +// export { default as dropRepeats } from './dropRepeats' +// export { default as dropRepeatsWith } from './dropRepeatsWith' +// export { default as dropWhile } from './dropWhile' +// export { default as either } from './either' +// export { default as endsWith } from './endsWith' +// export { default as eqBy } from './eqBy' +// export { default as eqProps } from './eqProps' +// export { default as evolve } from './evolve' +// export { default as find } from './find' +// export { default as findLast } from './findLast' +// export { default as findLastIndex } from './findLastIndex' +// export { default as flatten } from './flatten' +// export { default as flip } from './flip' +// export { default as forEach } from './forEach' +// export { default as forEachObjIndexed } from './forEachObjIndexed' +// export { default as fromPairs } from './fromPairs' +// export { default as groupBy } from './groupBy' +// export { default as groupWith } from './groupWith' +// export { default as gt } from './gt' +// export { default as gte } from './gte' +// export { default as hasPath } from './hasPath' +// export { default as head } from './head' +// export { default as ifElse } from './ifElse' +// export { default as inc } from './inc' +// export { default as includes } from './includes' +// export { default as indexBy } from './indexBy' +// export { default as indexOf } from './indexOf' +// export { default as init } from './init' +// export { default as innerJoin } from './innerJoin' +// export { default as insert } from './insert' +// export { default as insertAll } from './insertAll' +// export { default as intersection } from './intersection' +// export { default as intersperse } from './intersperse' +// export { default as into } from './into' +// export { default as invert } from './invert' +// export { default as invertObj } from './invertObj' +// export { default as invoker } from './invoker' +// export { default as join } from './join' +// export { default as juxt } from './juxt' +// export { default as lastIndexOf } from './lastIndexOf' +// export { default as length } from './length' +// export { default as lens } from './lens' +// export { default as lensIndex } from './lensIndex' +// export { default as lensPath } from './lensPath' +// export { default as lensProp } from './lensProp' +// export { default as liftN } from './liftN' +// export { default as lt } from './lt' +// export { default as lte } from './lte' +// export { default as mapAccum } from './mapAccum' +// export { default as mapAccumRight } from './mapAccumRight' +// export { default as mapObjIndexed } from './mapObjIndexed' +// export { default as match } from './match' +// export { default as mathMod } from './mathMod' +// export { default as maxBy } from './maxBy' +// export { default as mean } from './mean' +// export { default as median } from './median' +// export { default as memoizeWith } from './memoizeWith' +// export { default as mergeAll } from './mergeAll' +// export { default as mergeDeepLeft } from './mergeDeepLeft' +// export { default as mergeDeepRight } from './mergeDeepRight' +// export { default as mergeDeepWith } from './mergeDeepWith' +// export { default as mergeDeepWithKey } from './mergeDeepWithKey' +// export { default as mergeLeft } from './mergeLeft' +// export { default as mergeRight } from './mergeRight' +// export { default as mergeWith } from './mergeWith' +// export { default as mergeWithKey } from './mergeWithKey' +// export { default as min } from './min' +// export { default as minBy } from './minBy' +// export { default as modulo } from './modulo' +// export { default as move } from './move' +// export { default as nAry } from './nAry' +// export { default as negate } from './negate' +// export { default as none } from './none' +// export { default as nth } from './nth' +// export { default as nthArg } from './nthArg' +// export { default as o } from './o' +// export { default as objOf } from './objOf' +// export { default as of } from './of' +// export { default as once } from './once' +// export { default as otherwise } from './otherwise' +// export { default as over } from './over' +// export { default as pair } from './pair' +// export { default as partial } from './partial' +// export { default as partialRight } from './partialRight' +// export { default as partition } from './partition' +// export { default as pathEq } from './pathEq' +// export { default as pathOr } from './pathOr' +// export { default as pathSatisfies } from './pathSatisfies' +// export { default as pickAll } from './pickAll' +// export { default as pickBy } from './pickBy' +// export { default as pipe } from './pipe' +// export { default as pipeK } from './pipeK' +// export { default as pipeP } from './pipeP' +// export { default as pipeWith } from './pipeWith' +// export { default as pluck } from './pluck' +// export { default as prepend } from './prepend' +// export { default as product } from './product' +// export { default as project } from './project' +// export { default as propEq } from './propEq' +// export { default as propIs } from './propIs' +// export { default as propOr } from './propOr' +// export { default as props } from './props' +// export { default as propSatisfies } from './propSatisfies' +// export { default as range } from './range' +// export { default as reduce } from './reduce' +// export { default as reduceBy } from './reduceBy' +// export { default as reduced } from './reduced' +// export { default as reduceRight } from './reduceRight' +// export { default as reduceWhile } from './reduceWhile' +// export { default as reject } from './reject' +// export { default as remove } from './remove' +// export { default as repeat } from './repeat' +// export { default as replace } from './replace' +// export { default as reverse } from './reverse' +// export { default as scan } from './scan' +// export { default as sequence } from './sequence' +// export { default as set } from './set' +// export { default as slice } from './slice' +// export { default as sort } from './sort' +// export { default as sortBy } from './sortBy' +// export { default as sortWith } from './sortWith' +// export { default as split } from './split' +// export { default as splitAt } from './splitAt' +// export { default as splitEvery } from './splitEvery' +// export { default as splitWhen } from './splitWhen' +// export { default as startsWith } from './startsWith' +// export { default as subtract } from './subtract' +// export { default as symmetricDifference } from './symmetricDifference' +// export { default as symmetricDifferenceWith } from './symmetricDifferenceWith' +// export { default as tail } from './tail' +// export { default as take } from './take' +// export { default as takeLast } from './takeLast' +// export { default as takeLastWhile } from './takeLastWhile' +// export { default as takeWhile } from './takeWhile' +// export { default as tap } from './tap' +// export { default as test } from './test' +// export { default as then } from './then' +// export { default as thunkify } from './thunkify' +// export { default as times } from './times' +// export { default as toLower } from './toLower' +// export { default as toPairs } from './toPairs' +// export { default as toPairsIn } from './toPairsIn' +// export { default as toString } from './toString' +// export { default as toUpper } from './toUpper' +// export { default as transduce } from './transduce' +// export { default as transpose } from './transpose' +// export { default as traverse } from './traverse' +// export { default as trim } from './trim' +// export { default as tryCatch } from './tryCatch' +// export { default as unapply } from './unapply' +// export { default as unary } from './unary' +// export { default as uncurryN } from './uncurryN' +// export { default as unfold } from './unfold' +// export { default as unionWith } from './unionWith' +// export { default as uniq } from './uniq' +// export { default as uniqBy } from './uniqBy' +// export { default as uniqWith } from './uniqWith' +// export { default as unless } from './unless' +// export { default as unnest } from './unnest' +// export { default as until } from './until' +// export { default as update } from './update' +// export { default as useWith } from './useWith' +// export { default as valuesIn } from './valuesIn' +// export { default as view } from './view' +// export { default as when } from './when' +// export { default as where } from './where' +// export { default as whereEq } from './whereEq' +// export { default as without } from './without' +// export { default as xprod } from './xprod' +// export { default as zipObj } from './zipObj' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/***/ }), + +/***/ "./node_modules/fun.js/src/is.js": +/*!***************************************!*\ + !*** ./node_modules/fun.js/src/is.js ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/** + * @function is + * @description Verifies the type of the provided argument + * + */ + + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function is (Ctor, val) { + return Object(_type__WEBPACK_IMPORTED_MODULE_1__["default"])(val) === Ctor +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/isEmpty.js": +/*!********************************************!*\ + !*** ./node_modules/fun.js/src/isEmpty.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isEmpty; }); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./empty */ "./node_modules/fun.js/src/empty.js"); +/* harmony import */ var _exists__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./exists */ "./node_modules/fun.js/src/exists.js"); +/* harmony import */ var _equals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./equals */ "./node_modules/fun.js/src/equals.js"); +/** + + * @function empty + * @description Returns the empty equivalent of the first argument + */ + + + + +function isEmpty (x) { + return Object(_exists__WEBPACK_IMPORTED_MODULE_1__["default"])(x) && Object(_equals__WEBPACK_IMPORTED_MODULE_2__["default"])(x, Object(_empty__WEBPACK_IMPORTED_MODULE_0__["default"])(x)) +}; + + +/***/ }), + +/***/ "./node_modules/fun.js/src/iterator/is.js": +/*!************************************************!*\ + !*** ./node_modules/fun.js/src/iterator/is.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isIter; }); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + * Created by dierickx.len on 01/04/2017. + */ + +const isFunction = Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Function') + +function isIter (iter) { + return isFunction(iter[Symbol.iterator]) +} + + +/***/ }), + +/***/ "./node_modules/fun.js/src/iterator/map.js": +/*!*************************************************!*\ + !*** ./node_modules/fun.js/src/iterator/map.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * Maps over an Iterator and applies a function + * + * @function + * @since v1.0.3 + * @sig (currentValue, idx, [a]) -> {b} -> [b] + * @param {Function} cb + * @param {Iterator} a + * @return {Iterator} + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (callback, iterator) { + let r = [] + for (let nextValue = iterator.next(); nextValue.done !== true; nextValue = iterator.next()) { + r.push(callback(iterator.value())) + } + return r +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/keys.js": +/*!*****************************************!*\ + !*** ./node_modules/fun.js/src/keys.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _object_keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./object/keys */ "./node_modules/fun.js/src/object/keys.js"); +/* harmony import */ var _map_keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./map/keys */ "./node_modules/fun.js/src/map/keys.js"); +/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/** + * Returns the keys of the provided object or iterator + * + * @function keys + * @description Autocurried function which returns the keys of the provided object or iterator + * @since v1.0.2 + * @sig obj -> [*] + * @param {Object} obj - Obj from zhich to take the keys + * @return {Iterable} + **/ + + + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (obj) { + switch (Object(_type__WEBPACK_IMPORTED_MODULE_3__["default"])(obj)) { + case 'Map': + return Object(_map_keys__WEBPACK_IMPORTED_MODULE_2__["default"])(obj) + default: + return Object(_object_keys__WEBPACK_IMPORTED_MODULE_1__["default"])(obj) + } +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/last.js": +/*!*****************************************!*\ + !*** ./node_modules/fun.js/src/last.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _private_curry1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_private/curry1 */ "./node_modules/fun.js/src/_private/curry1.js"); +/** + * @function last + * @param [a] + * @return a | undefined + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_private_curry1__WEBPACK_IMPORTED_MODULE_0__["default"])(function last (a) { + return a && a.length ? a[a.length - 1] : undefined +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/lift.js": +/*!*****************************************!*\ + !*** ./node_modules/fun.js/src/lift.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _private_curry1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_private/curry1 */ "./node_modules/fun.js/src/_private/curry1.js"); +/* harmony import */ var _fold__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fold */ "./node_modules/fun.js/src/fold.js"); +/* harmony import */ var _ap__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ap */ "./node_modules/fun.js/src/ap.js"); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./map */ "./node_modules/fun.js/src/map.js"); +/** + * "lifts" a function of arity > 1 so that it may "map over" a list, Function + * + * @function lift + * @since v1.0.2 + * @sig (*... -> *) -> ([*]... -> [*]) + **/ + + + + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function lift (fn) { + const lifted = Object(_private_curry1__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(fn)) + return Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function _lift () { + return Object(_fold__WEBPACK_IMPORTED_MODULE_2__["default"])(_ap__WEBPACK_IMPORTED_MODULE_3__["default"], Object(_map__WEBPACK_IMPORTED_MODULE_4__["default"])(lifted, arguments[0]), Array.prototype.slice.call(arguments, 1)) + }) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/map.js": +/*!****************************************!*\ + !*** ./node_modules/fun.js/src/map.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _array_map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array/map */ "./node_modules/fun.js/src/array/map.js"); +/* harmony import */ var _object_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./object/map */ "./node_modules/fun.js/src/object/map.js"); +/* harmony import */ var _map_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./map/map */ "./node_modules/fun.js/src/map/map.js"); +/* harmony import */ var _string_map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./string/map */ "./node_modules/fun.js/src/string/map.js"); +/* harmony import */ var _iterator_map__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./iterator/map */ "./node_modules/fun.js/src/iterator/map.js"); +/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/* harmony import */ var _iterator_is__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./iterator/is */ "./node_modules/fun.js/src/iterator/is.js"); +/** + * Maps over an iterable and applies a function + * + * @function map + * @description Autocurried function which maps over an iterable. + * @since v1.0.2 + * @sig (currentValue, idx, [a]) -> b -> b + * @param {Function} cb + * @param {Iterable} a + * @return {Iterable} + **/ + + + + + + + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (cb, a) { + switch (Object(_type__WEBPACK_IMPORTED_MODULE_6__["default"])(a)) { + case 'Function': + return Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { + return cb.call(this, a.apply(this, arguments)) + }) + case 'Object': + return Object(_object_map__WEBPACK_IMPORTED_MODULE_2__["default"])(cb, a) + case 'String': + return Object(_string_map__WEBPACK_IMPORTED_MODULE_4__["default"])(cb, a) + case 'Map': + return Object(_map_map__WEBPACK_IMPORTED_MODULE_3__["default"])(cb, a) + case 'Array': + return Object(_array_map__WEBPACK_IMPORTED_MODULE_1__["default"])(cb, a) + default: + return Object(_iterator_is__WEBPACK_IMPORTED_MODULE_7__["default"])(a) + ? Object(_iterator_map__WEBPACK_IMPORTED_MODULE_5__["default"])(cb, a) + : Object(_array_map__WEBPACK_IMPORTED_MODULE_1__["default"])(cb, a) + } +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/map/filter.js": +/*!***********************************************!*\ + !*** ./node_modules/fun.js/src/map/filter.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * @function mapFilter + * @private + * */ -function curry (fun) { - const argslen = fun.length - if (argslen === 0) { - return fun + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function mapFilter (fn, m) { + let r = new Map() + + let it = m.entries() + let result = it.next() + + while (!result.done) { + const k = result.value[0] + const v = result.value[1] + if (fn(k, v)) r.set(k, v) + result = it.next() } - return createRecurser([]) - function recurse (acc, args) { - const _acc = acc.concat(args) - return _acc.length < argslen - ? createRecurser(_acc) - : fun.apply(this, _acc) - } + // Limited browser support + // m.forEach((v, k) => { + // if (fn(k, v)) r.set(k, v) + // }) + + // babel transpile issues + // for (const [k, v] of m.entries()) { + // + // } + return r +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/map/is.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/map/is.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + * Created by dierickx.len on 01/04/2017. + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Map')); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/map/keys.js": +/*!*********************************************!*\ + !*** ./node_modules/fun.js/src/map/keys.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * Returns the own keys of an Map as an Array + * + * @function + * @since v1.0.2 + * @sig a -> [b] + * @param {Object} + * @return {Array} + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function keys (a) { + return a.keys() +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/map/map.js": +/*!********************************************!*\ + !*** ./node_modules/fun.js/src/map/map.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../empty */ "./node_modules/fun.js/src/empty.js"); +/** + * Maps over a Map and applies a function + * + * @function + * @since v1.0.2 + * @sig (currentValue, idx, [a]) -> {b} -> [b] + * @param {Function} cb + * @param {Map} a + * @return {Map} + **/ + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (cb, a) { + const r = Object(_empty__WEBPACK_IMPORTED_MODULE_1__["default"])(a) + a.forEach((v, k, map) => { + r.set(k, cb(v, k, map)) + }) + return r +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/max.js": +/*!****************************************!*\ + !*** ./node_modules/fun.js/src/max.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/** + * Returns the largest of the 2 arguments provided + * + * @function max + * @since v1.0.2 + * @param {*} a + * @param {*} b + * @return {*} + **/ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function max (a, b) { + return b > a ? b : a +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/monads/Just.js": +/*!************************************************!*\ + !*** ./node_modules/fun.js/src/monads/Just.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * @function Just + * @param val + * @returns {Just} + * @constructor + */ +let Just = function (val) { + this._value = val + return this +} + +Just.prototype.isJust = function () { + return true +} +Just.prototype.isNothing = function () { + return false +} + +/* harmony default export */ __webpack_exports__["default"] = (Just); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/monads/Maybe.js": +/*!*************************************************!*\ + !*** ./node_modules/fun.js/src/monads/Maybe.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Just__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Just */ "./node_modules/fun.js/src/monads/Just.js"); +/* harmony import */ var _Nothing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Nothing */ "./node_modules/fun.js/src/monads/Nothing.js"); + + + +/** + * @function Maybe + * @param val + * @constructor + */ +let Maybe = function (val) { + this.__value = val +} + +Maybe.of = function (val) { + if (val instanceof Maybe) return val + if (this instanceof Maybe) { + this.__value = val + return this + } + return new Maybe(val) +} + +Maybe.prototype.getOrElse = function (n) { + return this.isNothing() ? n : this.__value +} + +Maybe.prototype.map = function (f) { + if (this.isNothing()) { + return Maybe.of(null) + } + return Maybe.of(f(this.__value)) +} + +Maybe.prototype.ap = function (m) { + return m.map(this.__value) +} + +Maybe.prototype.isNothing = function () { + return (this.__value == null) +} + +Maybe.prototype.isJust = function () { + return !this.isNothing() +} + +Maybe.prototype.Nothing = function () { + return new _Nothing__WEBPACK_IMPORTED_MODULE_1__["default"]() +} - function createRecurser (acc) { - return function () { - return recurse(acc, Array.prototype.slice.call(arguments)) - } - } +Maybe.prototype.Just = function () { + return new _Just__WEBPACK_IMPORTED_MODULE_0__["default"](this._value) } +/* harmony default export */ __webpack_exports__["default"] = (Maybe); + /***/ }), -/***/ "./node_modules/fun.js/src/date/is.js": -/*!********************************************!*\ - !*** ./node_modules/fun.js/src/date/is.js ***! - \********************************************/ +/***/ "./node_modules/fun.js/src/monads/Nothing.js": +/*!***************************************************!*\ + !*** ./node_modules/fun.js/src/monads/Nothing.js ***! + \***************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); -/** - * Created by dierickx.len on 01/04/2017. - */ /** - * Created by dierickx.len on 01/04/2017. + * @function Nothing + * @constructor */ +let Nothing = function () { +} +Nothing.prototype.isJust = function () { + return false +} +Nothing.prototype.isNothing = function () { + return true +} -/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Date')); +/* harmony default export */ __webpack_exports__["default"] = (Nothing); /***/ }), -/***/ "./node_modules/fun.js/src/empty.js": -/*!******************************************!*\ - !*** ./node_modules/fun.js/src/empty.js ***! - \******************************************/ +/***/ "./node_modules/fun.js/src/not.js": +/*!****************************************!*\ + !*** ./node_modules/fun.js/src/not.js ***! + \****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return empty; }); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); /** - - * @function empty - * @description Returns the empty equivalent of the first argument + * @function not */ -function empty (x) { - return new x.constructor() -}; + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function not (x) { + return !x +})); /***/ }), -/***/ "./node_modules/fun.js/src/equals.js": -/*!*******************************************!*\ - !*** ./node_modules/fun.js/src/equals.js ***! - \*******************************************/ +/***/ "./node_modules/fun.js/src/null/is.js": +/*!********************************************!*\ + !*** ./node_modules/fun.js/src/null/is.js ***! + \********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _exists__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./exists */ "./node_modules/fun.js/src/exists.js"); -/* harmony import */ var _identical__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./identical */ "./node_modules/fun.js/src/identical.js"); -/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); -/* harmony import */ var _not__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./not */ "./node_modules/fun.js/src/not.js"); -/* harmony import */ var _or__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./or */ "./node_modules/fun.js/src/or.js"); -/* harmony import */ var _object_is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./object/is */ "./node_modules/fun.js/src/object/is.js"); -/* harmony import */ var _array_is__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./array/is */ "./node_modules/fun.js/src/array/is.js"); -/* harmony import */ var _boolean_is__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./boolean/is */ "./node_modules/fun.js/src/boolean/is.js"); -/* harmony import */ var _number_is__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./number/is */ "./node_modules/fun.js/src/number/is.js"); -/* harmony import */ var _string_is__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./string/is */ "./node_modules/fun.js/src/string/is.js"); -/* harmony import */ var _date_is__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./date/is */ "./node_modules/fun.js/src/date/is.js"); -/* harmony import */ var _array_equals__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./array/equals */ "./node_modules/fun.js/src/array/equals.js"); -/* harmony import */ var _object_equals__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./object/equals */ "./node_modules/fun.js/src/object/equals.js"); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); /** - - * @function equals - * @description Autocurried function that checks for equality of 2 items - * @param {*} x - Left side of the equality check - * @param {*} y - Right side of the equality check - * @return {boolean} - * @example - * - * const nan = Number.NaN - * equal(nan, nan) // returns true - * - * const arr1 = [0, 1, 2, 3] - * const arr2 = [null, 1, 2, 3] - * equals(arr1, arr2) // returns false - * - * equals(new Object({'a': 0, 'b': 1}), {'a': 0, 'b': 1}) // true - * + * Created by dierickx.len on 03/02/2019 */ +/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('null')); +/***/ }), +/***/ "./node_modules/fun.js/src/number/add.js": +/*!***********************************************!*\ + !*** ./node_modules/fun.js/src/number/add.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * Returns the sum of the 2 arguments + * + * @function add + * @description Returns the sum of the 2 arguments + * @since v1.0.2 + * @sig Number -> Number -> Number + * @param {Number} a + * @param {Number} b + * @return {Number} + **/ +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function add (a, b) { + return +a + +b +})); +/***/ }), +/***/ "./node_modules/fun.js/src/number/divide.js": +/*!**************************************************!*\ + !*** ./node_modules/fun.js/src/number/divide.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/** + * + * + * @function divide + * @description Returns the division of the 2 arguments + * @since v1.0.2 + * @sig Number -> Number -> Number + * @param {Number} a + * @param {Number} b + * @return {Number} + **/ +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function divide (a, b) { + return +a / +b +})); -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function equals (x, y) { - if (Object(_identical__WEBPACK_IMPORTED_MODULE_2__["default"])(x, y)) return true - if (Object(_type__WEBPACK_IMPORTED_MODULE_3__["default"])(x) !== Object(_type__WEBPACK_IMPORTED_MODULE_3__["default"])(y)) return false +/***/ }), - if (Object(_or__WEBPACK_IMPORTED_MODULE_5__["default"])(Object(_not__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(_exists__WEBPACK_IMPORTED_MODULE_1__["default"])(x)), Object(_not__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(_exists__WEBPACK_IMPORTED_MODULE_1__["default"])(y)))) return false +/***/ "./node_modules/fun.js/src/number/is.js": +/*!**********************************************!*\ + !*** ./node_modules/fun.js/src/number/is.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (x.constructor !== y.constructor) return false +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + * @private + */ - if (Object(_string_is__WEBPACK_IMPORTED_MODULE_10__["default"])(x) || Object(_boolean_is__WEBPACK_IMPORTED_MODULE_8__["default"])(x) || Object(_number_is__WEBPACK_IMPORTED_MODULE_9__["default"])(x) || Object(_date_is__WEBPACK_IMPORTED_MODULE_11__["default"])(x)) { - return Object(_identical__WEBPACK_IMPORTED_MODULE_2__["default"])(x.valueOf(), y.valueOf()) - } - if (Object(_array_is__WEBPACK_IMPORTED_MODULE_7__["default"])(x)) { - return Object(_array_equals__WEBPACK_IMPORTED_MODULE_12__["default"])(x, y) - } else if (Object(_object_is__WEBPACK_IMPORTED_MODULE_6__["default"])(x)) { - return Object(_object_equals__WEBPACK_IMPORTED_MODULE_13__["default"])(x, y) - } - return false -})); + +/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Number')); /***/ }), -/***/ "./node_modules/fun.js/src/exists.js": -/*!*******************************************!*\ - !*** ./node_modules/fun.js/src/exists.js ***! - \*******************************************/ +/***/ "./node_modules/fun.js/src/number/isNan.js": +/*!*************************************************!*\ + !*** ./node_modules/fun.js/src/number/isNan.js ***! + \*************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return exists; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isNan; }); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/fun.js/src/number/is.js"); +/* harmony import */ var _and__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../and */ "./node_modules/fun.js/src/and.js"); /** - * @function exists + * @function isNaN + * @description Checks if number is NAN + */ -function exists (x) { - return !(x == null) + + + +function isNan (x) { + return Object(_and__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])(x), isNaN(x)) }; /***/ }), -/***/ "./node_modules/fun.js/src/fold.js": -/*!*****************************************!*\ - !*** ./node_modules/fun.js/src/fold.js ***! - \*****************************************/ +/***/ "./node_modules/fun.js/src/number/multiply.js": +/*!****************************************************!*\ + !*** ./node_modules/fun.js/src/number/multiply.js ***! + \****************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _array_fold__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array/fold */ "./node_modules/fun.js/src/array/fold.js"); -/* harmony import */ var _object_fold__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./object/fold */ "./node_modules/fun.js/src/object/fold.js"); -/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); /** - * Returns a single item by iterating over an array like object and call a function on each item + * Returns the product of the 2 arguments * - * @function fold - * @description Returns a single item by iterating over an array like object and call a function on each item + * @function * @since v1.0.2 - * @sig ((a, b, c, a) → a) → a → [b] → a - * @param {Function} cb receives 4 values: the accumulator, the item, the index, and the initial value. - * @param {*} a is the initial value - * @param {*} [b] the array like item to iterate over - * @return {*} a is the accumulated value + * @sig Number -> Number -> Number + * @param {Number} a + * @param {Number} b + * @return {Number} **/ +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function multiply (a, b) { + return +a * +b +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/number/sum.js": +/*!***********************************************!*\ + !*** ./node_modules/fun.js/src/number/sum.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add */ "./node_modules/fun.js/src/number/add.js"); +/* harmony import */ var _fold__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../fold */ "./node_modules/fun.js/src/fold.js"); +/** + * Returns the sum of the numbers in an array + * + * @function + * @since v1.0.2 + * @sig [Number] -> Number + * @param {Array} a + * @return {Number} + **/ -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function fold (cb, init, a) { - const typeMap = { - 'Object': _object_fold__WEBPACK_IMPORTED_MODULE_2__["default"], - 'Array': _array_fold__WEBPACK_IMPORTED_MODULE_1__["default"] - } - // if (a.next) { - // return iterableFold(cb, init, a) - // } - // if (type(Symbol) !== 'undefined' && a[Symbol.iterator]) { - // return iterableFold(cb, init, a[Symbol.iterator]()) - // } - return typeMap[Object(_type__WEBPACK_IMPORTED_MODULE_3__["default"])(a)](cb, init, a) +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function sum (a) { + return Object(_fold__WEBPACK_IMPORTED_MODULE_2__["default"])(_add__WEBPACK_IMPORTED_MODULE_1__["default"], 0, a) })); -// function iterableFold (cb, acc, gen) { -// let step = gen.next() -// while (!step.done) { -// acc = cb(acc, step.value) -// step = gen.next() -// } -// return acc -// } - /***/ }), -/***/ "./node_modules/fun.js/src/identical.js": -/*!**********************************************!*\ - !*** ./node_modules/fun.js/src/identical.js ***! - \**********************************************/ +/***/ "./node_modules/fun.js/src/object/equals.js": +/*!**************************************************!*\ + !*** ./node_modules/fun.js/src/object/equals.js ***! + \**************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _number_isNan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./number/isNan */ "./node_modules/fun.js/src/number/isNan.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _exists__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../exists */ "./node_modules/fun.js/src/exists.js"); +/* harmony import */ var _not__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../not */ "./node_modules/fun.js/src/not.js"); +/* harmony import */ var _equals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../equals */ "./node_modules/fun.js/src/equals.js"); /** - * @function identical - * @description checks for identintical items + * equals + * checks for equality */ -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function identical (x, y) { - if (x === 0 && y === 0) { - return 1 / x === 1 / y + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])((x, y) => { + for (let keyX in x) { + // noinspection JSUnfilteredForInLoop + if (Object(_not__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_equals__WEBPACK_IMPORTED_MODULE_3__["default"])(x[keyX], y[keyX]))) return false } - if (x === y) { - return true + + for (let keyY in y) { + if (Object(_not__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_exists__WEBPACK_IMPORTED_MODULE_1__["default"])(x[keyY])) && Object(_exists__WEBPACK_IMPORTED_MODULE_1__["default"])(y[keyY])) return false } - return !!(Object(_number_isNan__WEBPACK_IMPORTED_MODULE_1__["default"])(x) && Object(_number_isNan__WEBPACK_IMPORTED_MODULE_1__["default"])(y)) + + return true })); /***/ }), -/***/ "./node_modules/fun.js/src/is.js": -/*!***************************************!*\ - !*** ./node_modules/fun.js/src/is.js ***! - \***************************************/ +/***/ "./node_modules/fun.js/src/object/filter.js": +/*!**************************************************!*\ + !*** ./node_modules/fun.js/src/object/filter.js ***! + \**************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys */ "./node_modules/fun.js/src/object/keys.js"); /** - * @function is - * @description Verifies the type of the provided argument + * @function objectFilter + * @private * */ - -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function is (Ctor, val) { - return Object(_type__WEBPACK_IMPORTED_MODULE_1__["default"])(val) === Ctor +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function objectFilter (fn, o) { + let r = {} + const k = Object(_keys__WEBPACK_IMPORTED_MODULE_1__["default"])(o) + for (let i = 0; i < k.length; i++) { + if (fn(o[k[i]])) r[k[i]] = o[k[i]] + } + return r })); /***/ }), -/***/ "./node_modules/fun.js/src/iterator/is.js": +/***/ "./node_modules/fun.js/src/object/fold.js": /*!************************************************!*\ - !*** ./node_modules/fun.js/src/iterator/is.js ***! + !*** ./node_modules/fun.js/src/object/fold.js ***! \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isIter; }); -/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys */ "./node_modules/fun.js/src/object/keys.js"); /** - * Created by dierickx.len on 01/04/2017. + * @function fold + * @private + * */ -const isFunction = Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Function') -function isIter (iter) { - return isFunction(iter[Symbol.iterator]) -} + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function fold (cb, init, o) { + const k = Object(_keys__WEBPACK_IMPORTED_MODULE_1__["default"])(o) + let i = -1 + const l = k.length + let r = Object(init) + while (++i < l) { + r = cb(r, o[k[i]], k[i], o) + } + return r +})); /***/ }), -/***/ "./node_modules/fun.js/src/iterator/map.js": -/*!*************************************************!*\ - !*** ./node_modules/fun.js/src/iterator/map.js ***! - \*************************************************/ +/***/ "./node_modules/fun.js/src/object/has.js": +/*!***********************************************!*\ + !*** ./node_modules/fun.js/src/object/has.js ***! + \***********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -742,206 +3235,237 @@ function isIter (iter) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); /** - * Maps over an Iterator and applies a function + * Returns true if an object has the property * * @function - * @since v1.0.3 - * @sig (currentValue, idx, [a]) -> {b} -> [b] - * @param {Function} cb - * @param {Iterator} a - * @return {Iterator} + * @since v1.0.2 + * @sig {String} -> {Object} -> Boolean + * @param {String} prop + * @param {Object} obj + * @return {Boolean} **/ -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (callback, iterator) { - let r = [] - for (let nextValue = iterator.next(); nextValue.done !== true; nextValue = iterator.next()) { - r.push(callback(iterator.value())) - } - return r +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function has (prop, obj) { + return Object.prototype.hasOwnProperty.call(obj, prop) })); /***/ }), -/***/ "./node_modules/fun.js/src/map.js": -/*!****************************************!*\ - !*** ./node_modules/fun.js/src/map.js ***! - \****************************************/ +/***/ "./node_modules/fun.js/src/object/hasIn.js": +/*!*************************************************!*\ + !*** ./node_modules/fun.js/src/object/hasIn.js ***! + \*************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _array_map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array/map */ "./node_modules/fun.js/src/array/map.js"); -/* harmony import */ var _object_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./object/map */ "./node_modules/fun.js/src/object/map.js"); -/* harmony import */ var _map_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./map/map */ "./node_modules/fun.js/src/map/map.js"); -/* harmony import */ var _string_map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./string/map */ "./node_modules/fun.js/src/string/map.js"); -/* harmony import */ var _iterator_map__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./iterator/map */ "./node_modules/fun.js/src/iterator/map.js"); -/* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./type */ "./node_modules/fun.js/src/type.js"); -/* harmony import */ var _iterator_is__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./iterator/is */ "./node_modules/fun.js/src/iterator/is.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); /** - * Maps over an iterable and applies a function + * Returns true if an object has the property, even if it is inherited * - * @function map - * @description Autocurried function which maps over an iterable. + * @function * @since v1.0.2 - * @sig (currentValue, idx, [a]) -> b -> b - * @param {Function} cb - * @param {Iterable} a - * @return {Iterable} + * @sig {String} -> {Object} -> Boolean + * @param {String} prop + * @param {Object} obj + * @return {Boolean} **/ +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function hasIn (prop, obj) { + return prop in obj +})); +/***/ }), +/***/ "./node_modules/fun.js/src/object/is.js": +/*!**********************************************!*\ + !*** ./node_modules/fun.js/src/object/is.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + */ -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (cb, a) { - switch (Object(_type__WEBPACK_IMPORTED_MODULE_6__["default"])(a)) { - case 'Function': - return Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { - return cb.call(this, a.apply(this, arguments)) - }) - case 'Object': - return Object(_object_map__WEBPACK_IMPORTED_MODULE_2__["default"])(cb, a) - case 'String': - return Object(_string_map__WEBPACK_IMPORTED_MODULE_4__["default"])(cb, a) - case 'Map': - return Object(_map_map__WEBPACK_IMPORTED_MODULE_3__["default"])(cb, a) - case 'Array': - return Object(_array_map__WEBPACK_IMPORTED_MODULE_1__["default"])(cb, a) - default: - return Object(_iterator_is__WEBPACK_IMPORTED_MODULE_7__["default"])(a) - ? Object(_iterator_map__WEBPACK_IMPORTED_MODULE_5__["default"])(cb, a) - : Object(_array_map__WEBPACK_IMPORTED_MODULE_1__["default"])(cb, a) - } -})); +/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Object')); /***/ }), -/***/ "./node_modules/fun.js/src/map/map.js": -/*!********************************************!*\ - !*** ./node_modules/fun.js/src/map/map.js ***! - \********************************************/ +/***/ "./node_modules/fun.js/src/object/keys.js": +/*!************************************************!*\ + !*** ./node_modules/fun.js/src/object/keys.js ***! + \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../empty */ "./node_modules/fun.js/src/empty.js"); /** - * Maps over a Map and applies a function + * Returns the own keys of an object as an Array * * @function * @since v1.0.2 - * @sig (currentValue, idx, [a]) -> {b} -> [b] - * @param {Function} cb - * @param {Map} a - * @return {Map} + * @sig a -> [b] + * @param {Object} + * @return {Array} **/ - -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (cb, a) { - const r = Object(_empty__WEBPACK_IMPORTED_MODULE_1__["default"])(a) - a.forEach((v, k, map) => { - r.set(k, cb(v, k, map)) - }) - return r +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function keys (a) { + return Object.keys(Object(a)) })); /***/ }), -/***/ "./node_modules/fun.js/src/not.js": -/*!****************************************!*\ - !*** ./node_modules/fun.js/src/not.js ***! - \****************************************/ +/***/ "./node_modules/fun.js/src/object/keysIn.js": +/*!**************************************************!*\ + !*** ./node_modules/fun.js/src/object/keysIn.js ***! + \**************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); /** - * @function not - */ + * Returns all the keys of an object as an Array + * + * @function + * @since v1.0.2 + * @sig a -> [b] + * @param {Object} + * @return {Array} + **/ -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function not (x) { - return !x +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function keys (a) { + const r = [] + for (const k in a) { + r.push(k) + } + return r })); /***/ }), -/***/ "./node_modules/fun.js/src/number/is.js": -/*!**********************************************!*\ - !*** ./node_modules/fun.js/src/number/is.js ***! - \**********************************************/ +/***/ "./node_modules/fun.js/src/object/map.js": +/*!***********************************************!*\ + !*** ./node_modules/fun.js/src/object/map.js ***! + \***********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../empty */ "./node_modules/fun.js/src/empty.js"); +/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys */ "./node_modules/fun.js/src/object/keys.js"); /** - * @private - */ + * Maps over an object and applies a function + * + * @function + * @since v1.0.2 + * @sig (currentValue, idx, [a]) -> {b} -> [b] + * @param {Function} cb + * @param {Object} a + * @return {Object} + **/ -/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Number')); + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (cb, a) { + const k = Object(_keys__WEBPACK_IMPORTED_MODULE_2__["default"])(a) + let i = -1 + const l = k.length + const r = Object(_empty__WEBPACK_IMPORTED_MODULE_1__["default"])(a) + while (++i < l) { + r[k[i]] = cb(a[k[i]], k[i], a) + } + return r +})); /***/ }), -/***/ "./node_modules/fun.js/src/number/isNan.js": +/***/ "./node_modules/fun.js/src/object/merge.js": /*!*************************************************!*\ - !*** ./node_modules/fun.js/src/number/isNan.js ***! + !*** ./node_modules/fun.js/src/object/merge.js ***! \*************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isNan; }); -/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/fun.js/src/number/is.js"); -/* harmony import */ var _and__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../and */ "./node_modules/fun.js/src/and.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _identical__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../identical */ "./node_modules/fun.js/src/identical.js"); +/* harmony import */ var _object_is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../object/is */ "./node_modules/fun.js/src/object/is.js"); +/* harmony import */ var _array_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../array/is */ "./node_modules/fun.js/src/array/is.js"); +/* harmony import */ var _array_union__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../array/union */ "./node_modules/fun.js/src/array/union.js"); /** - * @function isNaN - * @description Checks if number is NAN + * equals + * checks for equality */ -function isNan (x) { - return Object(_and__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])(x), isNaN(x)) -}; + + + +const merge = Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])((objL, objR) => { + let result = Object.assign({}, objL) + + if (Object(_identical__WEBPACK_IMPORTED_MODULE_1__["default"])(objL, objR)) { + return Object.assign({}, objL) + } + for (let key in objR) { + if (!Object.prototype.hasOwnProperty.call(objR, key)) { + continue + } + const oldValue = objR[key] + const newValue = objL[key] + + if (Object(_object_is__WEBPACK_IMPORTED_MODULE_2__["default"])(oldValue) && Object(_object_is__WEBPACK_IMPORTED_MODULE_2__["default"])(newValue)) { + result[key] = merge(oldValue, newValue) + } else if (Object(_array_is__WEBPACK_IMPORTED_MODULE_3__["default"])(newValue)) { + result[key] = Object(_array_union__WEBPACK_IMPORTED_MODULE_4__["default"])(newValue, oldValue) + } else { + result[key] = oldValue // TODO: this is a reference, should be clone + } + } + return result +}) + +/* harmony default export */ __webpack_exports__["default"] = (merge); /***/ }), -/***/ "./node_modules/fun.js/src/object/equals.js": -/*!**************************************************!*\ - !*** ./node_modules/fun.js/src/object/equals.js ***! - \**************************************************/ +/***/ "./node_modules/fun.js/src/object/omit.js": +/*!************************************************!*\ + !*** ./node_modules/fun.js/src/object/omit.js ***! + \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _exists__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../exists */ "./node_modules/fun.js/src/exists.js"); -/* harmony import */ var _not__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../not */ "./node_modules/fun.js/src/not.js"); -/* harmony import */ var _equals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../equals */ "./node_modules/fun.js/src/equals.js"); /** * equals @@ -949,28 +3473,23 @@ __webpack_require__.r(__webpack_exports__); */ +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])((obj, names) => { + let result = {} - - -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])((x, y) => { - for (let keyX in x) { - // noinspection JSUnfilteredForInLoop - if (Object(_not__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_equals__WEBPACK_IMPORTED_MODULE_3__["default"])(x[keyX], y[keyX]))) return false - } - - for (let keyY in y) { - if (Object(_not__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_exists__WEBPACK_IMPORTED_MODULE_1__["default"])(x[keyY])) && Object(_exists__WEBPACK_IMPORTED_MODULE_1__["default"])(y[keyY])) return false - } - - return true + Object.keys(obj).filter((key) => { + return names.indexOf(key) === -1 + }).forEach((key) => { + result[key] = obj[key] + }) + return result })); /***/ }), -/***/ "./node_modules/fun.js/src/object/fold.js": +/***/ "./node_modules/fun.js/src/object/path.js": /*!************************************************!*\ - !*** ./node_modules/fun.js/src/object/fold.js ***! + !*** ./node_modules/fun.js/src/object/path.js ***! \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -978,52 +3497,75 @@ __webpack_require__.r(__webpack_exports__); "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys */ "./node_modules/fun.js/src/object/keys.js"); /** - * @function fold - * @private - * + * @function path */ - -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function fold (cb, init, o) { - const k = Object(_keys__WEBPACK_IMPORTED_MODULE_1__["default"])(o) - let i = -1 - const l = k.length - let r = Object(init) - while (++i < l) { - r = cb(r, o[k[i]], k[i], o) +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function path (path, obj) { + let val = obj + let idx = 0 + let p + while (idx < path.length) { + if (val == null) { + return + } + p = path[idx] + val = Number.isInteger(p) + ? p < 0 ? val[val.length + p] : val[p] + : val[p] + idx += 1 } - return r + return val })); +// let r = obj +// for (let i = 0; i < path.length; i++) { +// if (r == null) return undefined +// r = r[path[i]] +// } +// return r +// }) /***/ }), -/***/ "./node_modules/fun.js/src/object/is.js": -/*!**********************************************!*\ - !*** ./node_modules/fun.js/src/object/is.js ***! - \**********************************************/ +/***/ "./node_modules/fun.js/src/object/pick.js": +/*!************************************************!*\ + !*** ./node_modules/fun.js/src/object/pick.js ***! + \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); /** - + * @function pick + * @description returns a new bject with only the props that are provided + * @param {Array} props - Array of property names + * @param {Object} obj - The object from which to take the properties + * @return {Object} */ -/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Object')); +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function pick (props, obj) { + const r = {} + let i = 0 + while (i < props.length) { + if (props[i] in obj) { + r[props[i]] = obj[props[i]] + } + i += 1 + } + return r +})); /***/ }), -/***/ "./node_modules/fun.js/src/object/keys.js": +/***/ "./node_modules/fun.js/src/object/prop.js": /*!************************************************!*\ - !*** ./node_modules/fun.js/src/object/keys.js ***! + !*** ./node_modules/fun.js/src/object/prop.js ***! \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -1032,56 +3574,46 @@ __webpack_require__.r(__webpack_exports__); __webpack_require__.r(__webpack_exports__); /* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); /** - * Returns the own keys of an object as an Array - * - * @function - * @since v1.0.2 - * @sig a -> [b] - * @param {Object} - * @return {Array} - **/ + * @function prop + */ -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function keys (a) { - return Object.keys(Object(a)) +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function prop (p, obj) { + return obj[p] })); /***/ }), -/***/ "./node_modules/fun.js/src/object/map.js": -/*!***********************************************!*\ - !*** ./node_modules/fun.js/src/object/map.js ***! - \***********************************************/ +/***/ "./node_modules/fun.js/src/object/values.js": +/*!**************************************************!*\ + !*** ./node_modules/fun.js/src/object/values.js ***! + \**************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../curry */ "./node_modules/fun.js/src/curry.js"); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../empty */ "./node_modules/fun.js/src/empty.js"); -/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys */ "./node_modules/fun.js/src/object/keys.js"); +/* harmony import */ var _private_curry1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../_private/curry1 */ "./node_modules/fun.js/src/_private/curry1.js"); +/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys */ "./node_modules/fun.js/src/object/keys.js"); /** - * Maps over an object and applies a function + * @function values + * @description REturns a list of values taken from an objects own properties + * @param {object} - obj The object from which to take the values + * @return {array} * - * @function - * @since v1.0.2 - * @sig (currentValue, idx, [a]) -> {b} -> [b] - * @param {Function} cb - * @param {Object} a - * @return {Object} **/ - -/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function map (cb, a) { - const k = Object(_keys__WEBPACK_IMPORTED_MODULE_2__["default"])(a) - let i = -1 +/* harmony default export */ __webpack_exports__["default"] = (Object(_private_curry1__WEBPACK_IMPORTED_MODULE_0__["default"])(function values (obj) { + const k = Object(_keys__WEBPACK_IMPORTED_MODULE_1__["default"])(obj) const l = k.length - const r = Object(_empty__WEBPACK_IMPORTED_MODULE_1__["default"])(a) - while (++i < l) { - r[k[i]] = cb(a[k[i]], k[i], a) + const r = [] + let i = 0 + while (i < l) { + r[i] = obj[k[i]] + i += 1 } return r })); @@ -1110,6 +3642,26 @@ __webpack_require__.r(__webpack_exports__); })); +/***/ }), + +/***/ "./node_modules/fun.js/src/set/is.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/set/is.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + * Created by dierickx.len on 01/04/2017. + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('Set')); + + /***/ }), /***/ "./node_modules/fun.js/src/string/concat.js": @@ -1132,6 +3684,38 @@ function concat (a, b) { // use function(), arrow function doesn't bind argument } +/***/ }), + +/***/ "./node_modules/fun.js/src/string/formatString.js": +/*!********************************************************!*\ + !*** ./node_modules/fun.js/src/string/formatString.js ***! + \********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return formatString; }); +/* harmony import */ var _array_to__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../array/to */ "./node_modules/fun.js/src/array/to.js"); +/* harmony import */ var _not__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../not */ "./node_modules/fun.js/src/not.js"); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + * Created by dierickx.len on 26/03/2017. + */ + + + + +function formatString (str) { // use function(), arrow function doesn't bind arguments + let args = Object(_array_to__WEBPACK_IMPORTED_MODULE_0__["default"])(arguments) + + args.shift() + return str.replace(/{(\d+)}/g, (match, idx) => { + return Object(_not__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_is__WEBPACK_IMPORTED_MODULE_2__["default"])('Undefined', args[idx])) ? args[idx] : match + }) +} + + /***/ }), /***/ "./node_modules/fun.js/src/string/is.js": @@ -1187,6 +3771,29 @@ __webpack_require__.r(__webpack_exports__); })); +/***/ }), + +/***/ "./node_modules/fun.js/src/truthy.js": +/*!*******************************************!*\ + !*** ./node_modules/fun.js/src/truthy.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return truthy; }); +/* harmony import */ var _exists__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./exists */ "./node_modules/fun.js/src/exists.js"); +/** + * @function truthy + */ + + +function truthy (x) { + return (x !== false) && Object(_exists__WEBPACK_IMPORTED_MODULE_0__["default"])(x) +}; + + /***/ }), /***/ "./node_modules/fun.js/src/type.js": @@ -1209,6 +3816,84 @@ __webpack_require__.r(__webpack_exports__); })); +/***/ }), + +/***/ "./node_modules/fun.js/src/undefined/is.js": +/*!*************************************************!*\ + !*** ./node_modules/fun.js/src/undefined/is.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../is */ "./node_modules/fun.js/src/is.js"); +/** + * Created by dierickx.len on 03/02/2019 + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_is__WEBPACK_IMPORTED_MODULE_0__["default"])('undefined')); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/zip.js": +/*!****************************************!*\ + !*** ./node_modules/fun.js/src/zip.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/* harmony import */ var _zipWith__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./zipWith */ "./node_modules/fun.js/src/zipWith.js"); +/** + + * zip + * + * @function zip + */ + + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function zip (a, b) { + return Object(_zipWith__WEBPACK_IMPORTED_MODULE_1__["default"])(function _zipWith (x, y) { return [x, y] }, a, b) +})); + + +/***/ }), + +/***/ "./node_modules/fun.js/src/zipWith.js": +/*!********************************************!*\ + !*** ./node_modules/fun.js/src/zipWith.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _curry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curry */ "./node_modules/fun.js/src/curry.js"); +/** + + * zipWith + * + * @function zipWith + */ + + +/* harmony default export */ __webpack_exports__["default"] = (Object(_curry__WEBPACK_IMPORTED_MODULE_0__["default"])(function zipWith (cb, a, b) { + const arr = [] + const len = Math.min(a.length, b.length) + let i = 0 + for (i = 0; i < len; i++) { + arr.push(cb(a[i], b[i])) + } + return arr +})); + + /***/ }), /***/ "./src/matrix.js": @@ -1248,6 +3933,10 @@ var _generate = _interopRequireDefault(__webpack_require__(/*! util/generate */ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// import gpumap from 'util/gpumap' +// import gpufold from 'util/gpufold' +// import gpuproduct from 'util/gpuproduct' + /** * @class Matrix * @classdesc Matrix applicative providing standard matrix operations @@ -1262,6 +3951,30 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var Matrix = function Matrix(val) { this.__value = val; }; +/** + * @memberOf Matrix + * @static + * @function of + * @desc Creates a Matrix object and flattens the Matrix + * @param val {array|function} An array of arrays + * @returns {Matrix} + * @example + * + * const m = Matrix.of([[1,2],[2,3],[4,5]]) + * + */ + + +Matrix.of = function (val) { + if (val instanceof Matrix) return val; + + if (this instanceof Matrix) { + this.__value = val; + return this; + } + + return new Matrix(val); +}; /** * @memberOf Matrix * @property {string} type @@ -1420,30 +4133,6 @@ Matrix.prototype.getRows = function () { Matrix.prototype.getShape = function () { return [this.getRows(), this.getCols()]; }; -/** - * @memberOf Matrix - * @static - * @function of - * @desc Creates a Matrix object and flattens the Matrix - * @param val {array|function} An array of arrays - * @returns {Matrix} - * @example - * - * const m = Matrix.of([[1,2],[2,3],[4,5]]) - * - */ - - -Matrix.of = function (val) { - if (val instanceof Matrix) return val; - - if (this instanceof Matrix) { - this.__value = val; - return this; - } - - return new Matrix(val); -}; /** * @memberOf Matrix * @instance @@ -1961,7 +4650,7 @@ Matrix.transpose = function (M) { }; /** * @memberOf Matrix - * @member add + * @function add * @instance * @param M {Matrix|number} Add a Matrix or a number * @returns {Matrix} @@ -2495,11 +5184,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _curry = _interopRequireDefault(__webpack_require__(/*! fun.js/src/curry */ "./node_modules/fun.js/src/curry.js")); - -var _concat = _interopRequireDefault(__webpack_require__(/*! fun.js/src/concat */ "./node_modules/fun.js/src/concat.js")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _fun = __webpack_require__(/*! fun.js */ "./node_modules/fun.js/src/index.js"); /** * @function concat @@ -2508,8 +5193,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de * @param idx {number} * @returns {Array} */ -var _default = (0, _curry.default)(function (M, m, idx) { - return (0, _concat.default)(m, M.__value[idx]); +var _default = (0, _fun.curry)(function (M, m, idx) { + return (0, _fun.concat)(m, M.__value[idx]); }); exports.default = _default; @@ -2532,11 +5217,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _curry = _interopRequireDefault(__webpack_require__(/*! fun.js/src/curry */ "./node_modules/fun.js/src/curry.js")); - -var _fold = _interopRequireDefault(__webpack_require__(/*! fun.js/src/fold */ "./node_modules/fun.js/src/fold.js")); - -var _map = _interopRequireDefault(__webpack_require__(/*! fun.js/src/map */ "./node_modules/fun.js/src/map.js")); +var _fun = __webpack_require__(/*! fun.js */ "./node_modules/fun.js/src/index.js"); var _round = _interopRequireDefault(__webpack_require__(/*! ./round */ "./src/util/round.js")); @@ -2548,9 +5229,9 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de * @param a {Array} * @returns {Array} */ -var _default = (0, _curry.default)(function (decimals, B, a) { - return (0, _map.default)(function (item, i) { - return (0, _fold.default)(function (acc, x, j) { +var _default = (0, _fun.curry)(function (decimals, B, a) { + return (0, _fun.map)(function (item, i) { + return (0, _fun.fold)(function (acc, x, j) { acc += (0, _round.default)(x * B.__value[j][i], decimals); return acc; }, 0)(a); @@ -2577,11 +5258,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _curry = _interopRequireDefault(__webpack_require__(/*! fun.js/src/curry */ "./node_modules/fun.js/src/curry.js")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _fun = __webpack_require__(/*! fun.js */ "./node_modules/fun.js/src/index.js"); -var _default = (0, _curry.default)(function (m) { +var _default = (0, _fun.curry)(function (m) { return []; }); @@ -2605,6 +5284,8 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; +var _fun = __webpack_require__(/*! fun.js */ "./node_modules/fun.js/src/index.js"); + /** * @function generate * @desc Generator function for a matrix array, values are set to undefined @@ -2612,10 +5293,18 @@ exports.default = void 0; * @param cols {number} * @returns {any[][]} */ -var _default = function _default(rows, cols) { - return Array.apply(null, Array(rows)).map(function (x) { - return Array.apply(null, Array(cols)); - }); +var _default = function _default(rows) { + var cols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + var value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + + var _cols = cols || rows; + + var y = (0, _fun.map)(function (z) { + return value; + })(new Array(_cols)); + return (0, _fun.map)(function (z) { + return y; + })(new Array(rows)); }; exports.default = _default; @@ -2638,9 +5327,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _map = _interopRequireDefault(__webpack_require__(/*! fun.js/src/map */ "./node_modules/fun.js/src/map.js")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _fun = __webpack_require__(/*! fun.js */ "./node_modules/fun.js/src/index.js"); /** * @function identity @@ -2650,7 +5337,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de * @return {Matrix} */ var _default = function _default(m, idx) { - return (0, _map.default)(function (rows, jdx) { + return (0, _fun.map)(function (rows, jdx) { return (idx === jdx) * 1; })(m); }; @@ -2704,11 +5391,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _map = _interopRequireDefault(__webpack_require__(/*! fun.js/src/map */ "./node_modules/fun.js/src/map.js")); - -var _curry = _interopRequireDefault(__webpack_require__(/*! fun.js/src/curry */ "./node_modules/fun.js/src/curry.js")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _fun = __webpack_require__(/*! fun.js */ "./node_modules/fun.js/src/index.js"); /** * @function transpose @@ -2717,8 +5400,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de * @param idx {number} * @return {Matrix} */ -var _default = (0, _curry.default)(function (prev, next) { - return (0, _map.default)(function (item, i) { +var _default = (0, _fun.curry)(function (prev, next) { + return (0, _fun.map)(function (item, i) { return (prev[i] || []).concat(next[i]); })(next); }); @@ -2726,8 +5409,20 @@ var _default = (0, _curry.default)(function (prev, next) { exports.default = _default; module.exports = exports["default"]; +/***/ }), + +/***/ 0: +/*!*****************************!*\ + !*** multi ./src/matrix.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! /Volumes/BigOne/github/funMatrix/src/matrix.js */"./src/matrix.js"); + + /***/ }) /******/ }); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9fcHJpdmF0ZS9jdXJyeTEuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FuZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L2ZvbGQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY3VycnkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2V4aXN0cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2l0ZXJhdG9yL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9ub3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2lzTmFuLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb3IuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3N0cmluZy9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3N0cmluZy9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvdHlwZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL21hdHJpeC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9kb3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9nZW5lcmF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL3JvdW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC90cmFuc3Bvc2UuanMiXSwibmFtZXMiOlsiTWF0cml4IiwidmFsIiwiX192YWx1ZSIsInByb3RvdHlwZSIsInR5cGUiLCJwcmVjaXNpb24iLCJzZXRQcmVjaXNpb24iLCJpc1N5bW1ldHJpYyIsImEiLCJiIiwidHJhbnNwb3NlIiwiaXNTcXVhcmUiLCJnZXRDb2xzIiwiZ2V0Um93cyIsImlzT3J0aG9nb25hbCIsIkF4QXQiLCJkb3QiLCJJIiwiaWRlbnRpdHkiLCJsZW5ndGgiLCJlcXVhbHMiLCJNIiwiZ2V0U2hhcGUiLCJvZiIsIm1hcCIsImYiLCJmb2xkIiwiYXAiLCJjb25jYXQiLCJBIiwiQiIsImVtcHR5Iiwicm93cyIsImNvbHMiLCJtIiwiY29tYmluZSIsImZpbGwiLCJ4IiwiemVyb3MiLCJvbmVzIiwicmFuZG9tIiwiZSIsIk1hdGgiLCJ0b0FycmF5Iiwicm93IiwiY29sIiwiY2xvbmUiLCJmcm9tQXJyYXkiLCJhcnIiLCJhZGQiLCJFcnJvciIsImlkeCIsImpkeCIsInN1YnRyYWN0IiwibXVsdGlwbHkiLCJjb25zb2xlIiwibG9nIiwiYWRkaXRpdmVpbnZlcnNlIiwiaGFkYW1hcmQiLCJsdSIsIm4iLCJ0b2wiLCJMIiwiVSIsImsiLCJhYnMiLCJpIiwiaiIsImwiLCJycmVmIiwibGVhZCIsInJlc3VsdE1hdHJpeCIsInIiLCJ0bXAiLCJzb2x2ZSIsIkxVIiwicyIsImMiLCJ0IiwiaW52ZXJzZSIsIkludiIsInJlc3VsdCIsInJlZHVjZSIsImhhbGYiLCJwdXNoIiwic2xpY2UiLCJyYW5rIiwiZGltZW5zaW9uIiwiZGlhZyIsImFjYyIsImRpYWdwcm9kdWN0Iiwic3VtIiwicHJldiIsIm5leHQiLCJrcm9uZWNrZXIiLCJwIiwicSIsImxlZnQiLCJyaWdodCIsImZyYW1lIiwiZGVjaW1hbHMiLCJpdGVtIiwiQXJyYXkiLCJhcHBseSIsInJvdW5kIiwidmFsdWUiLCJOdW1iZXIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBMEMsZ0NBQWdDO0FBQzFFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQXdELGtCQUFrQjtBQUMxRTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBeUMsaUNBQWlDO0FBQzFFLHdIQUFnSCxtQkFBbUIsRUFBRTtBQUNySTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDbEZBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNiQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFD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QUFDQyxLQUFOLENBQVksSUFBWixFQUFrQkQsS0FBSyxDQUFDckUsSUFBRCxDQUF2QixDQUFKO0FBQUEsR0FBcEMsQ0FBaEI7QUFBQSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUGY7Ozs7QUFFQTs7Ozs7OztlQU9lLGtCQUFDQyxDQUFELEVBQUlpQixHQUFKO0FBQUEsU0FBWSxrQkFBSSxVQUFDbkIsSUFBRCxFQUFPb0IsR0FBUDtBQUFBLFdBQWUsQ0FBQ0QsR0FBRyxLQUFLQyxHQUFULElBQWdCLENBQS9CO0FBQUEsR0FBSixFQUFzQ2xCLENBQXRDLENBQVo7QUFBQSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVGY7Ozs7OztBQU1lLFNBQVNzRSxLQUFULENBQWdCQyxLQUFoQixFQUF1QkwsUUFBdkIsRUFBaUM7QUFDOUMsU0FBT00sTUFBTSxDQUFDaEUsSUFBSSxDQUFDOEQsS0FBTCxDQUFXQyxLQUFLLEdBQUcsR0FBUixHQUFjTCxRQUF6QixJQUFxQyxJQUFyQyxHQUE0Q0EsUUFBN0MsQ0FBYjtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNSRDs7QUFDQTs7OztBQUVBOzs7Ozs7O2VBT2Usb0JBQU0sVUFBQ1IsSUFBRCxFQUFPQyxJQUFQO0FBQUEsU0FBZ0Isa0JBQUksVUFBQ1EsSUFBRCxFQUFPbkMsQ0FBUDtBQUFBLFdBQWEsQ0FBQzBCLElBQUksQ0FBQzFCLENBQUQsQ0FBSixJQUFXLEVBQVosRUFBZ0J0QyxNQUFoQixDQUF1QmlFLElBQUksQ0FBQzNCLENBQUQsQ0FBM0IsQ0FBYjtBQUFBLEdBQUosRUFBa0QyQixJQUFsRCxDQUFoQjtBQUFBLENBQU4sQyIsImZpbGUiOiJAYXN0dWFuYXgvZnVubWF0cml4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJAYXN0dWFuYXgvZnVubWF0cml4XCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkBhc3R1YW5heC9mdW5tYXRyaXhcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9tYXRyaXguanNcIik7XG4iLCIvKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGZ1bmN0aW9uIHdpdGggYXJpdHkgMVxuICogQGZ1bmN0aW9uIGN1cnJ5MVxuICogQHByaXZhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3VycnkxIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gY3VycmllZCAoYSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAwXG4gICAgICA/IHRoaXNcbiAgICAgIDogZm4oYSlcbiAgfVxufVxuIiwiLyoqXG4gKiBDaGVja3MgaWYgYm90aCBwcmVkaWNhdGVzIGFyZSB0cnVlXG4gKlxuICogQGZ1bmN0aW9uIGFuZFxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBib3RoIHByZWRpY2F0ZXMgYXJlIHRydWVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKHgsIHkpIC0+IGJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCAtIEEgcHJlZGljYXRlXG4gKiBAcGFyYW0geyp9IHkgLSBBIHByZWRpY2F0ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbmQgKHgsIHkpIHtcbiAgcmV0dXJuIHggJiYgeVxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBhcnJheUNvbmNhdFxuICogQHBhcmFtIGExXG4gKiBAcGFyYW0gYTJcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0KGEsIGIpXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGVxdWFsc0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gZm9yIGRlZXAgY29tcGFyaXNvbiBvZiBhcnJheXNcbiAqIEBwYXJhbSB7YX0geCAtIE9iamVjdCB0byBjb21wYXJlIG9mIHR5cGUgYVxuICogQHBhcmFtIHthfSB5IC0gT2JqZWN0IHggdG8gY29tcGFyZSB3aXRoIG9iamVjdCB4XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBlcXVhbHNBcnJheSAoeCwgeSkge1xuICBpZiAoeC5sZW5ndGggIT09IHkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG5vdChlcXVhbHMoeFtpXSwgeVtpXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IG1hcHBpbmcgb3ZlciB0aGUgcHJvdmlkZWQgYXJyYXkgYW5kIGNhbGxpbmcgYW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Y2JGdW5jdGlvbn0gY2IgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIGl0ZW1cbiAqIEBwYXJhbSB7Kn0gaW5pdCAtIEluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXl9IGEgLSBBcnJheSB3aXRoIGl0ZW1zIHRvIG1vZGlmeSBieSB0aGUgY2IgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFsaWFzIHJlZHVjZVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvbGQoYWRkLCAwLCBbMSwxLDFdKVxuICogLy8gcmVzdWx0ID0gM1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIGNiRnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gciAtIEFjY3VtdWxhdG9yIHdoaWNoIGFjY3VtdWxhdGVzIHRoZSBjYWxsYmFjaydzIHJldHVybiB2YWx1ZXNcbiAqIEBwYXJhbSB7Kn0gaXRlbSAtIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSB0aGUgaW5kZXkgb2YgdGhlIGl0ZW0gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge0FycmF5fSBhIC0gVGhlIGluaXRpYWwgYXJyYXlcbiAqIEByZXR1cm4geyp9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSBpbml0XG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgciA9IGNiKHIsIGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGFuIGFycmF5LCBhdXRvY3VycmllZCBmdW5jdGlvblxuICpcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gaXNBcnJheVxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGFuIGFycmF5LCBhdXRvY3VycmllZCBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBPYmplY3QgdG8gdmVyaWZpeVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBpc0FycmF5KFsxLDEsMV0pXG4gKiAvLyByZXN1bHQgPSB0cnVlXG4gKi9cblxuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQXJyYXknKVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIGFuIGFycmF5IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChpZGVudGl0eSwgWzAsMiwzXSlcbiAqICAvLyByZXN1bHQgPSBbMCwyLDNdXG4gKiAgY29uc3QgYWRkMiA9IGFkZCgyKVxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChhZGQyLCBbMCwyLDNdKVxuICogIC8vIHJlc3VsdCA9IFsyLDQsNV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBjb25zdCByID0gbmV3IEFycmF5KGwpXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgcltpXSA9IGNiKGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IEl0ZW0gdG8gdmVyaWZ5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICoqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQm9vbGVhbicpXG4iLCIvKipcbiAqIENvbmNhdGVuYXRlcyAyIGl0ZW1zIHRvZ2V0aGVyXG4gKlxuICogQGZ1bmN0aW9uIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIGl0ZW1zIHRvZ2V0aGVyXG4gKiBAc2luY2UgdjEuMC40XG4gKiBAcGFyYW0ge2F9IGEgLSBMZWZ0IHNpZGUgb2YgdGhlIGNvbmNhdGVuYXRpb25cbiAqIEBwYXJhbSB7YX0gYiAtIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbmNhdGVuYXRpb25cbiAqIEByZXR1cm4ge2F9IENvbmNhdGVuYXRlZCBpdGVtXG4gKiovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5Q29uY2F0IGZyb20gJy4vYXJyYXkvY29uY2F0J1xuaW1wb3J0IHN0cmluZ0NvbmNhdCBmcm9tICcuL3N0cmluZy9jb25jYXQnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikge1xuICBjb25zdCB0eXBlTWFwID0ge1xuICAgICdTdHJpbmcnOiBzdHJpbmdDb25jYXQsXG4gICAgJ0FycmF5JzogYXJyYXlDb25jYXRcbiAgfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShhLCBiKVxufSlcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG4vKipcbiAqIEBmdW5jdGlvbiBjdXJyeVxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVzIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeSAoZnVuKSB7XG4gIGNvbnN0IGFyZ3NsZW4gPSBmdW4ubGVuZ3RoXG5cbiAgaWYgKGFyZ3NsZW4gPT09IDApIHtcbiAgICByZXR1cm4gZnVuXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVJlY3Vyc2VyKFtdKVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UgKGFjYywgYXJncykge1xuICAgIGNvbnN0IF9hY2MgPSBhY2MuY29uY2F0KGFyZ3MpXG4gICAgcmV0dXJuIF9hY2MubGVuZ3RoIDwgYXJnc2xlblxuICAgICAgPyBjcmVhdGVSZWN1cnNlcihfYWNjKVxuICAgICAgOiBmdW4uYXBwbHkodGhpcywgX2FjYylcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlY3Vyc2VyIChhY2MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlY3Vyc2UoYWNjLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG4vKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0RhdGUnKVxuIiwiLyoqXG5cbiAqIEBmdW5jdGlvbiBlbXB0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGVtcHR5IGVxdWl2YWxlbnQgb2YgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW1wdHkgKHgpIHtcbiAgcmV0dXJuIG5ldyB4LmNvbnN0cnVjdG9yKClcbn07XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVxdWFsc1xuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBlcXVhbGl0eSBvZiAyIGl0ZW1zXG4gKiBAcGFyYW0geyp9IHggLSBMZWZ0IHNpZGUgb2YgdGhlIGVxdWFsaXR5IGNoZWNrXG4gKiBAcGFyYW0geyp9IHkgLSBSaWdodCBzaWRlIG9mIHRoZSBlcXVhbGl0eSBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbmFuID0gTnVtYmVyLk5hTlxuICogZXF1YWwobmFuLCBuYW4pIC8vIHJldHVybnMgdHJ1ZVxuICpcbiAqIGNvbnN0IGFycjEgPSBbMCwgMSwgMiwgM11cbiAqIGNvbnN0IGFycjIgPSBbbnVsbCwgMSwgMiwgM11cbiAqIGVxdWFscyhhcnIxLCBhcnIyKSAvLyByZXR1cm5zIGZhbHNlXG4gKlxuICogZXF1YWxzKG5ldyBPYmplY3QoeydhJzogMCwgJ2InOiAxfSksIHsnYSc6IDAsICdiJzogMX0pIC8vIHRydWVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuL2V4aXN0cydcbmltcG9ydCBpZGVudGljYWwgZnJvbSAnLi9pZGVudGljYWwnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5pbXBvcnQgbm90IGZyb20gJy4vbm90J1xuaW1wb3J0IG9yIGZyb20gJy4vb3InXG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9vYmplY3QvaXMnXG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2FycmF5L2lzJ1xuaW1wb3J0IGlzQm9vbGVhbiBmcm9tICcuL2Jvb2xlYW4vaXMnXG5pbXBvcnQgaXNOdW1iZXIgZnJvbSAnLi9udW1iZXIvaXMnXG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnLi9zdHJpbmcvaXMnXG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vZGF0ZS9pcydcbmltcG9ydCBlcXVhbHNBcnJheSBmcm9tICcuL2FycmF5L2VxdWFscydcbmltcG9ydCBlcXVhbHNPYmplY3QgZnJvbSAnLi9vYmplY3QvZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBlcXVhbHMgKHgsIHkpIHtcbiAgaWYgKGlkZW50aWNhbCh4LCB5KSkgcmV0dXJuIHRydWVcblxuICBpZiAodHlwZSh4KSAhPT0gdHlwZSh5KSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKG9yKG5vdChleGlzdHMoeCkpLCBub3QoZXhpc3RzKHkpKSkpIHJldHVybiBmYWxzZVxuXG4gIGlmICh4LmNvbnN0cnVjdG9yICE9PSB5LmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2VcblxuICBpZiAoaXNTdHJpbmcoeCkgfHwgaXNCb29sZWFuKHgpIHx8IGlzTnVtYmVyKHgpIHx8IGlzRGF0ZSh4KSkge1xuICAgIHJldHVybiBpZGVudGljYWwoeC52YWx1ZU9mKCksIHkudmFsdWVPZigpKVxuICB9XG4gIGlmIChpc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIGVxdWFsc0FycmF5KHgsIHkpXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoeCkpIHtcbiAgICByZXR1cm4gZXF1YWxzT2JqZWN0KHgsIHkpXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZXhpc3RzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4aXN0cyAoeCkge1xuICByZXR1cm4gISh4ID09IG51bGwpXG59O1xuIiwiLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheSBsaWtlIG9iamVjdCBhbmQgY2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoKGEsIGIsIGMsIGEpIOKGkiBhKSDihpIgYSDihpIgW2JdIOKGkiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiByZWNlaXZlcyA0IHZhbHVlczogdGhlIGFjY3VtdWxhdG9yLCB0aGUgaXRlbSwgdGhlIGluZGV4LCBhbmQgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0geyp9IGEgaXMgdGhlIGluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7Kn0gW2JdIHRoZSBhcnJheSBsaWtlIGl0ZW0gdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcmV0dXJuIHsqfSBhIGlzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG9iamVjdEZvbGQgZnJvbSAnLi9vYmplY3QvZm9sZCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAnT2JqZWN0Jzogb2JqZWN0Rm9sZCxcbiAgICAnQXJyYXknOiBhcnJheUZvbGRcbiAgfVxuICAvLyBpZiAoYS5uZXh0KSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYSlcbiAgLy8gfVxuICAvLyBpZiAodHlwZShTeW1ib2wpICE9PSAndW5kZWZpbmVkJyAmJiBhW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgLy8gICByZXR1cm4gaXRlcmFibGVGb2xkKGNiLCBpbml0LCBhW1N5bWJvbC5pdGVyYXRvcl0oKSlcbiAgLy8gfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShjYiwgaW5pdCwgYSlcbn0pXG5cbi8vIGZ1bmN0aW9uIGl0ZXJhYmxlRm9sZCAoY2IsIGFjYywgZ2VuKSB7XG4vLyAgIGxldCBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuLy8gICAgIGFjYyA9IGNiKGFjYywgc3RlcC52YWx1ZSlcbi8vICAgICBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB9XG4vLyAgIHJldHVybiBhY2Ncbi8vIH1cbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpY2FsXG4gKiBAZGVzY3JpcHRpb24gY2hlY2tzIGZvciBpZGVudGludGljYWwgaXRlbXNcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXNOYW4gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlkZW50aWNhbCAoeCwgeSkge1xuICBpZiAoeCA9PT0gMCAmJiB5ID09PSAwKSB7XG4gICAgcmV0dXJuIDEgLyB4ID09PSAxIC8geVxuICB9XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gISEoaXNOYW4oeCkgJiYgaXNOYW4oeSkpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNcbiAqIEBkZXNjcmlwdGlvbiBWZXJpZmllcyB0aGUgdHlwZSBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnRcbiAqXG4gKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlzIChDdG9yLCB2YWwpIHtcbiAgcmV0dXJuIHR5cGUodmFsKSA9PT0gQ3RvclxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzSXRlciAoaXRlcikge1xuICByZXR1cm4gaXNGdW5jdGlvbihpdGVyW1N5bWJvbC5pdGVyYXRvcl0pXG59XG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBJdGVyYXRvciBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4zXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYXRvcn0gYVxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2FsbGJhY2ssIGl0ZXJhdG9yKSB7XG4gIGxldCByID0gW11cbiAgZm9yIChsZXQgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpOyBuZXh0VmFsdWUuZG9uZSAhPT0gdHJ1ZTsgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpKSB7XG4gICAgci5wdXNoKGNhbGxiYWNrKGl0ZXJhdG9yLnZhbHVlKCkpKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gaXRlcmFibGUgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBtYXBcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiB3aGljaCBtYXBzIG92ZXIgYW4gaXRlcmFibGUuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiBiIC0+IGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vYXJyYXkvbWFwJ1xuaW1wb3J0IG9iamVjdE1hcCBmcm9tICcuL29iamVjdC9tYXAnXG5pbXBvcnQgbWFwTWFwIGZyb20gJy4vbWFwL21hcCdcbmltcG9ydCBzdHJpbmdNYXAgZnJvbSAnLi9zdHJpbmcvbWFwJ1xuaW1wb3J0IGl0ZXJhdG9yTWFwIGZyb20gJy4vaXRlcmF0b3IvbWFwJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuaW1wb3J0IGlzSXRlcmF0b3IgZnJvbSAnLi9pdGVyYXRvci9pcydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBzd2l0Y2ggKHR5cGUoYSkpIHtcbiAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgICByZXR1cm4gY3VycnkoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY2IuY2FsbCh0aGlzLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpXG4gICAgICB9KVxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICByZXR1cm4gb2JqZWN0TWFwKGNiLCBhKVxuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICByZXR1cm4gc3RyaW5nTWFwKGNiLCBhKVxuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwTWFwKGNiLCBhKVxuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiBhcnJheU1hcChjYiwgYSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGlzSXRlcmF0b3IoYSlcbiAgICAgICAgPyBpdGVyYXRvck1hcChjYiwgYSlcbiAgICAgICAgOiBhcnJheU1hcChjYiwgYSlcbiAgfVxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGEgTWFwIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge01hcH0gYVxuICogQHJldHVybiB7TWFwfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICBhLmZvckVhY2goKHYsIGssIG1hcCkgPT4ge1xuICAgIHIuc2V0KGssIGNiKHYsIGssIG1hcCkpXG4gIH0pXG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbm90XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBub3QgKHgpIHtcbiAgcmV0dXJuICF4XG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdOdW1iZXInKVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNOYU5cbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgbnVtYmVyIGlzIE5BTlxuXG4gKi9cbmltcG9ydCBpc051bWJlciBmcm9tICcuL2lzJ1xuaW1wb3J0IGFuZCBmcm9tICcuLi9hbmQnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTmFuICh4KSB7XG4gIHJldHVybiBhbmQoaXNOdW1iZXIoeCksIGlzTmFOKHgpKVxufTtcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuLi9leGlzdHMnXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgoeCwgeSkgPT4ge1xuICBmb3IgKGxldCBrZXlYIGluIHgpIHtcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbmZpbHRlcmVkRm9ySW5Mb29wXG4gICAgaWYgKG5vdChlcXVhbHMoeFtrZXlYXSwgeVtrZXlYXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAobGV0IGtleVkgaW4geSkge1xuICAgIGlmIChub3QoZXhpc3RzKHhba2V5WV0pKSAmJiBleGlzdHMoeVtrZXlZXSkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgbykge1xuICBjb25zdCBrID0ga2V5cyhvKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBsZXQgciA9IE9iamVjdChpbml0KVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgPSBjYihyLCBvW2tbaV1dLCBrW2ldLCBvKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnT2JqZWN0JylcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duIGtleXMgb2YgYW4gb2JqZWN0IGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhPYmplY3QoYSkpXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gb2JqZWN0IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge09iamVjdH0gYVxuICogQHJldHVybiB7T2JqZWN0fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IGsgPSBrZXlzKGEpXG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGsubGVuZ3RoXG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHJba1tpXV0gPSBjYihhW2tbaV1dLCBrW2ldLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gb3JcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgb25lIG9yIHRoZSBvdGhlciBpcyB0cnVlXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBvciAoeCwgeSkge1xuICByZXR1cm4geCB8fCB5XG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIHN0cmluZ0NvbmNhdFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikgeyAvLyB1c2UgZnVuY3Rpb24oKSwgYXJyb3cgZnVuY3Rpb24gZG9lc24ndCBiaW5kIGFyZ3VtZW50c1xuICByZXR1cm4gU3RyaW5nKGEpICsgU3RyaW5nKGIpXG59XG4iLCIvKipcblxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdTdHJpbmcnKVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYSBzdHJpbmcgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGEubGVuZ3RoXG4gIGxldCByID0gJydcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByICs9IGNiKGEuY2hhckF0KGkpLCBpLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdHlwZSAoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpLnNsaWNlKDgsIC0xKVxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICdmdW4uanMvc3JjL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICdmdW4uanMvc3JjL21hcCdcbmltcG9ydCBmb2xkIGZyb20gJ2Z1bi5qcy9zcmMvZm9sZCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnZnVuLmpzL3NyYy9lcXVhbHMnXG5pbXBvcnQgY29uY2F0IGZyb20gJ3V0aWwvY29uY2F0J1xuaW1wb3J0IGVtcHR5IGZyb20gJ3V0aWwvZW1wdHknXG5pbXBvcnQgZG90IGZyb20gJ3V0aWwvZG90J1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJ3V0aWwvaWRlbnRpdHknXG5pbXBvcnQgdHJhbnNwb3NlIGZyb20gJ3V0aWwvdHJhbnNwb3NlJ1xuaW1wb3J0IGdlbmVyYXRlIGZyb20gJ3V0aWwvZ2VuZXJhdGUnXG5cbi8qKlxuICogQGNsYXNzIE1hdHJpeFxuICogQGNsYXNzZGVzYyBNYXRyaXggYXBwbGljYXRpdmUgcHJvdmlkaW5nIHN0YW5kYXJkIG1hdHJpeCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGUgTWF0cml4IGNsYXNzIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIHdpdGggdGhlIG5ldyBrZXl3b3JkLiBJbnN0ZWFkIHVzZSB0aGUgTWF0cml4Lm9mIHN5bnRheCB0byBjcmVhdGUgYSBuZXcgTWF0cml4LiBVbmZvcnR1bmF0bHkganNkb2NzIGRvZXMgbm90IGFsbG93IGZvciB0aGUgY29uc3RydWN0b3IgdG8gYmUgaGlkZGVuLlxuICogQGhpZGVjb250cnVjdG9yXG4gKiBAc2VlIG9mXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKlxuICovXG5sZXQgTWF0cml4ID0gZnVuY3Rpb24gKHZhbCkge1xuICB0aGlzLl9fdmFsdWUgPSB2YWxcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0udHlwZSA9PT0gJ01hdHJpeCdcbiAqL1xuTWF0cml4LnByb3RvdHlwZS50eXBlID0gJ01hdHJpeCdcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJlY2lzaW9uXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS5wcmVjaXNpb24gPT09IDRcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5wcmVjaXNpb24gPSA0XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHNldFByZWNpc2lvblxuICogQHBhcmFtIHByZWNpc2lvbiB7bnVtYmVyfSBTZXQgdGhlIG51bWJlciBvZiBkZWNpbWFscyBmb3Igcm91bmRpbmdcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0uc2V0UHJlY2lzaW9uKDEwKVxuICogbS5wcmVjaXNpb24gPT09IDEwXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc2V0UHJlY2lzaW9uID0gZnVuY3Rpb24gKHByZWNpc2lvbikge1xuICB0aGlzLnByZWNpc2lvbiA9IHByZWNpc2lvblxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc1N5bW1ldHJpY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIHRydWUgPT09IEEuaXNTeW1tZXRyaWMoKVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc1N5bW1ldHJpYyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYSA9IHRoaXMuX192YWx1ZVxuICBjb25zdCBiID0gTWF0cml4LnRyYW5zcG9zZSh0aGlzKS5fX3ZhbHVlXG4gIHJldHVybiBlcXVhbHMoYSwgYilcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNTcXVhcmVcbiAqIEBkZXNjIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgY29udGFpbnMgYSBzcXVhcmUgTWF0cml4XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogdHJ1ZSA9PT0gQS5pc1NxdWFyZSgpXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzU3F1YXJlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZXF1YWxzKHRoaXMuZ2V0Q29scygpLCB0aGlzLmdldFJvd3MoKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNPcnRob2dvbmFsXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IFtbLTAuMzA5MiwgLTAuOTUxMF0sIFstMC45NTEwLCAwLjMwOTJdXVxuICogY29uc3QgQSA9IE1hdHJpeC5mcm9tQXJyYXkocmVzdWx0KVxuICogdHJ1ZSAgPT09IEEuaXNPcnRob2dvbmFsKClcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc09ydGhvZ29uYWwgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEF4QXQgPSB0aGlzLmRvdCh0aGlzLnRyYW5zcG9zZSgpKVxuICBjb25zdCBJID0gdGhpcy5pZGVudGl0eSgpXG4gIHJldHVybiBlcXVhbHMoQXhBdCwgSSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0Q29sc1xuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRDb2xzKCkgID09PSAyXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldENvbHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9fdmFsdWVbMF0ubGVuZ3RoXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGVxdWFsc1xuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYSA9IFtbMSwgMV0sIFsxLCAxXV1cbiAqIHZhciBBID0gTWF0cml4Lm9mKGEpXG4gKiB2YXIgQiA9IE1hdHJpeC5vZihhKVxuICogdHJ1ZSAgPT09IEEuZXF1YWxzKEIpXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIGVxdWFscyh0aGlzLl9fdmFsdWUsIE0uX192YWx1ZSB8fCBNKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRSb3dzXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldFJvd3MoKSAgLy8gMlxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldFJvd3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9fdmFsdWUubGVuZ3RoXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldFNoYXBlXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0U2hhcGUoKSAgLy8gWzIsIDJdXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0U2hhcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBbdGhpcy5nZXRSb3dzKCksIHRoaXMuZ2V0Q29scygpXVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBvZlxuICogQGRlc2MgQ3JlYXRlcyBhIE1hdHJpeCBvYmplY3QgYW5kIGZsYXR0ZW5zIHRoZSBNYXRyaXhcbiAqIEBwYXJhbSB2YWwge2FycmF5fGZ1bmN0aW9ufSBBbiBhcnJheSBvZiBhcnJheXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKlxuICovXG5NYXRyaXgub2YgPSBmdW5jdGlvbiAodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBNYXRyaXgpIHJldHVybiB2YWxcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICB0aGlzLl9fdmFsdWUgPSB2YWxcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIHJldHVybiBuZXcgTWF0cml4KHZhbClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIG0ubWFwKHggPT4geC5tYXAoeSA9PiB5KyAxKSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihtYXAoZikodGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGZ1bmN0aW9uIHRoYXQgbWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IE1hdHJpeCBvciBhcnJheSB0byBtYXBcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgubWFwKHg9ID4geC5tYXAoeSA9PiB5KyAxKSwgW1sxLCAxXSwgWzEsIDFdXSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5tYXAgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLm1hcChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZm9sZFxuICogQGRlc2NyaXB0aW9uIFJlZHVjZSB0aGUgbWF0cml4IHJvd3MgdXNpbmcgYSByZWR1Y2UgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQSByZWR1Y2UvZm9sZCBmdW5jdGlvblxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gRmxhdHRlbiBNYXRyaXhcbiAqIE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKS5mb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2LmNvbmNhdChuZXh0KSlcbiAqIC8vIFsxLCAxLCAxLCAxXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQoZiwgW10pKHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdG8gcmVkdWNlIHRoZSBtYXRyaXggcm93cyB1c2luZyBhIHJlZHVjZSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBIHJlZHVjZS9mb2xkIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fSBUaGUgTWF0cml4IHRvIHJlZHVjZVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG5cbiAqIC8vIFN1bSBvZiBhbGwgbWF0cml4IHZhbHVlc1xuICogY29uc3QgcmVkdWNlciA9IChwcmV2LCBuZXh0KSA9PiBOdW1iZXIocHJldikgKyBuZXh0LnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgKyB4LCAwKVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dXG4gKiBNYXRyaXguZm9sZChyZWR1Y2VyLCBBKVxuICogLy8gNFxuICovXG5NYXRyaXguZm9sZCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuZm9sZChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgTWF0cml4IHRvIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmID0geCA9PiB4LnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMiwgM10sIFs0LCA1LCA2XSwgWzcsIDgsIDldXSlcbiAqIE1hdHJpeC5vZihmKS5hcChNKVxuICogLy8gW1s2XSwgWzE1XSwgWzI0XVxuICovXG5NYXRyaXgucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5tYXAodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBNYXRyaXggdG8gYSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufVxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGYgPSB4ID0+IHgucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dClcbiAqIE1hdHJpeC5hcChmLCBbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0pXG4gKiAvLyBbWzZdLCBbMTVdLCBbMjRdXG4gKi9cbk1hdHJpeC5hcCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZikuYXAoTSlcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIE1hdHJpY2VzIHVzaW5nIGEgZnVuY3Rpb24gYXMgb3BlcmF0b3JcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1swLCAxLCAxXSwgWzIsIDMsIDRdXVxuICogY29uc3QgYiA9IFtbMiwgMiwgMl0sIFszLCAzLCAzXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqIGNvbnN0IE0gPSBBLmNvbmNhdChCKVxuICogLy8gW1swLCAxLCAxLCAyLCAyLCAyXSwgWzIsIDMsIDQsIDMsIDMsIDNdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAoTSwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChmKE0pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBNYXRyaWNlcyB1c2luZyBhIGZ1bmN0aW9uIGFzIG9wZXJhdG9yXG4gKiBAcGFyYW0gQSB7TWF0cml4fVxuICogQHBhcmFtIEIge01hdHJpeH1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbWzAsIDEsIDFdLCBbMiwgMywgNF1dXG4gKiBjb25zdCBiID0gW1syLCAyLCAyXSwgWzMsIDMsIDNdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICogY29uc3QgTSA9IE1hdHJpeC5jb25jYXQoQSwgQilcbiAqIC8vIFtbMCwgMSwgMSwgMiwgMiwgMl0sIFsyLCAzLCA0LCAzLCAzLCAzXV1cbiAqXG4gKi9cbk1hdHJpeC5jb25jYXQgPSBjdXJyeShmdW5jdGlvbiAoQSwgQiwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLm1hcChmKEIpKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChlbXB0eSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5lbXB0eSA9IGN1cnJ5KGZ1bmN0aW9uIChyb3dzID0gMCwgY29scyA9IDApIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YobSkubWFwKGVtcHR5KVxufSlcblxuLy8gIyMjIyAjIyMjICMjIyMgLy9cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaWRlbnRpdHlcbiAqIEBkZXNjIFJldHVybnMgYW4gaWRlbnRpdHkgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQWlkZW50aXR5ID0gQS5pZGVudGl0eSgpXG4gKiAvLyBbWzEsIDAsIDBdLCBbMCwgMSwgMF1dXG4gKlxuKi9cbk1hdHJpeC5wcm90b3R5cGUuaWRlbnRpdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKHRoaXMpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzYyBSZXR1cm5zIGFuIGlkZW50aXR5IG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5pZGVudGl0eSgzLCAyKVxuICogLy8gW1sxLCAwLCAwXSwgWzAsIDEsIDBdXVxuICpcbiAqL1xuTWF0cml4LmlkZW50aXR5ID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKG0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbWJpbmVcbiAqIEBzZWUgTWF0cml4LmNvbmNhdFxuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY29tYmluZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuY29uY2F0KE1hdHJpeC5vZihNKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb21iaW5lXG4gKiBAc2VlIE1hdHJpeC5jb25jYXRcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXguY29tYmluZSA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuY29uY2F0KE1hdHJpeC5vZihCKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQ3JlYXRlIG1hdHJpeFxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzEsIDJdLCBbMywgNF1dKVxuICpcbiAqIC8vIEdlbmVyYXRlIGlkZW50aXR5IG1hdHJpeFxuICogY29uc3QgSSAgPSBtLmlkZW50aXR5KCkgLy8gW1sxLCAwXSwgWzAsIDFdXVxuICpcbiAqIGlmKG0uZG90KEkpLmVxdWFscyhtKSkge1xuICogICAgY29uc29sZS5sb2coJ0RvdCBwcm9kdWN0IHdpdGggaWRlbnRpdHkgbWF0cml4IHJldHVybnMgdGhlIHNhbWUgbWF0cml4JylcbiAqIH1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZG90ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5jb25jYXQoTWF0cml4Lm9mKE0pLCBkb3QodGhpcy5wcmVjaXNpb24pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGEgPSBbWzEsIDIsIDNdLCBbNCwgNSwgNl1dXG4gKiBjb25zdCBiID0gW1s3LCA4XSwgWzksIDEwXSwgWzExLCAxMl1dXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICpcbiAqIE1hdHJpeC5kb3QoQSwgQikgLy8gW1s1OCwgNjRdLCBbMTM5LCAxNTRdXVxuICpcbiAqL1xuTWF0cml4LmRvdCA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuZG90KE1hdHJpeC5vZihCKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZmlsbFxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB0aGUgcHJvdmlkZWQgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLmZpbGwoeCA9PiA0MilcbiAqIC8vIFtbNDIsNDIsNDJdLCBbNDIsNDIsNDJdLCBbNDIsNDIsNDJdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAobWFwKHggPT4gZih4KSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHplcm9zXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHplcm9zXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLnplcm9zKClcbiAqIC8vIFtbMCwwLDBdLCBbMCwwLDBdLCBbMCwwLDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS56ZXJvcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKHggPT4gMClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gemVyb3NcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggemVyb3NcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lnplcm9zKDMsIDMpXG4gKiAvLyBbWzAsMCwwXSwgWzAsMCwwXSwgWzAsMCwwXV1cbiAqXG4gKi9cbk1hdHJpeC56ZXJvcyA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoeCA9PiAwKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS5vbmVzKClcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5vbmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmZpbGwoeCA9PiAxKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9uZXMoMSwgMSlcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4Lm9uZXMgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKHggPT4gMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgcmFuZG9tXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHJhbmRvbSB2YWx1ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDFdXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJhbmRvbSA9IGZ1bmN0aW9uIChmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDEpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKGYpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHJhbmRvbVxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCByYW5kb20gbnVtYmVyc1xuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBGdW5jdGlvbiB3aGljaCByZXR1cm5zIHJhbmRvbSB2YWx1ZXMuIERlZmF1bHQgcmFuZG9tIHZhbHVlcyBhcmUgYmV0d2VlbiAtMSBhbmQgMVxuICogQHBhcmFtIHJvd3Mge251bWJlcn0gRGVmaW5lcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfSBEZWZpbmVzIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5yYW5kb20gPSBmdW5jdGlvbiAoZiA9IGUgPT4gKE1hdGgucmFuZG9tKCkgKiAyIC0gMSksIHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbChmKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB0b0FycmF5XG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBhcnJheSBmcm9tIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlLm1hcChyb3cgPT4gcm93Lm1hcChjb2wgPT4gY29sKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgY2xvbmVcbiAqIEBkZXNjIFJldHVybnMgYSBjbG9uZSBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4LmZyb21BcnJheSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZyb21BcnJheVxuICogQGRlc2MgUmV0dXJucyBhIE1hdHJpeCBmcm9tIGFuIGFycmF5XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbk1hdHJpeC5mcm9tQXJyYXkgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBNYXRyaXgub2YobWFwKHJvdyA9PiBtYXAoY29sID0+IGNvbCkocm93KSkoYXJyKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdKVxuICogY29uc3QgYiA9IEEudHJhbnNwb3NlKCkudG9BcnJheSgpXG4gKiAvLyByZXR1cm5zIFtbLTEsIDMsLThdLCBbMiwgNCwgMl1dXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQodHJhbnNwb3NlLCBbXSwgdGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IEEgTWF0cml4IG9yIGEgbWF0cml4IGFycmF5XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdXG4gKiBjb25zdCBiID0gTWF0cml4LnRyYW5zcG9zZShhKS50b0FycmF5KClcbiAqIC8vIHJldHVybnMgW1stMSwgMywtOF0sIFsyLCA0LCAyXV1cbiAqL1xuTWF0cml4LnRyYW5zcG9zZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkudHJhbnNwb3NlKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGFkZFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gQWRkIGEgTWF0cml4IG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5hZGQoMSkgLy8gW1s2LCA1XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLmFkZChCKSAvLyBbWzEwLCAxMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3QgYWRkJylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKCh2YWwsIGpkeCkgPT4gdmFsICsgTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCArIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdWJ0cmFjdFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gU3VidHJhY3QgYSBNYXRyaXggb3IgYSBudW1iZXJcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLnN1YnRyYWN0KDEpIC8vIFtbNCwgMl1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5zdWJ0cmFjdChCKSAvLyBbWzAsIDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3Qgc3VidHJhY3QnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKHZhbCwgamR4KSA9PiB2YWwgLSBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4IC0gTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIG11bHRpcGx5XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIE11dGxpcGx5IGEgc2NhbGFyIG9yIGEgbXRyYWl4IHdpdGggYSBtYXRyaXguIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbXVsdGlwbGljYXRpb24gaXMgbm90IHBvc3NpYmxlLlxuICogQHBhcmFtIE0ge01hdHJpeHxudW1iZXJ9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5tdWx0aXBseSgyKSAvLyBbWzEwLCA4XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLm11bHRpcGx5KEIpIC8vIFtbMjUsIDI1XV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiAoTSkge1xuICBpZiAoTSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSAhPT0gTS5nZXRDb2xzKCkgfHwgdGhpcy5nZXRSb3dzKCkgIT09IE0uZ2V0Um93cygpKSB7XG4gICAgICBjb25zb2xlLmxvZygnVXNlIHN0YXRpYyBtZXRob2QgXFwnZG90XFwnIHRvIGRvIG1hdHJpeCBtdWx0aXBsaWNhdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHJpY2VzIGRvIG5vdCBtYXRjaCwgY2Fubm90IGNyZWF0ZSBoYWRhbWFyZCBwcm9kdWN0JylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKChjb2wsIGpkeCkgPT4gY29sICogTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCAqIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBhZGRpdGl2ZWludmVyc2VcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtYXRyaXggb2J0YWluZWQgYnkgY2hhbmdpbmcgdGhlIHNpZ24gb2YgZXZlcnkgbWF0cml4IGVsZW1lbnQuIFRoZSBhZGRpdGl2ZSBpbnZlcnNlIG9mIG1hdHJpeCBBIGlzIHdyaXR0ZW4g4oCTQS5cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LC01XSwgWy00LCA0XV0pXG4gKiBjb25zdCBtaW51c0EgPSBBLmFkZGl0aXZlaW52ZXJzZSgpXG4gKiAvLyBbWy01LCA1XSwgWzQsIC00XV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hZGRpdGl2ZWludmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoLTEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBoYWRhbWFyZFxuICogQGluc3RhbmNlXG4gKiBAc2VlIG11bHRpcGx5XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuaGFkYW1hcmQoMikgLy8gW1sxMCwgOF1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5oYWRhbWFyZChCKSAvLyBbWzI1LCAyNV1dXG5cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5oYWRhbWFyZCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoTSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbHVcbiAqIEBkZXNjIENhbGN1bGF0ZXMgTFUgZGVjb21wb3NpdGlvbiBvZiB0aGUgY3VycmVudCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXhbXX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gW1szLCAtNywgLTIsIDJdLCBbLTMsIDUsIDEsIDBdLCBbNiwgLTQsIDAsIC01XSwgWy05LCA1LCAtNSwgMTJdXVxuICogY29uc3QgQSA9IE1hdHJpeC5mcm9tQXJyYXkocmVzdWx0KVxuICogY29uc3QgbHUgPSBBLmx1KClcbiAqIC8vIEwuX192YWx1ZSA9IFsgWyAxLCAwLCAwLCAwIF0sIFsgLTEsIDEsIDAsIDAgXSwgWyAyLCAtNSwgMSwgMCBdLCBbIC0zLCA4LCAzLCAxIF0gXVxuICogLy8gVS5fX3ZhbHVlID0gIFsgWyAzLCAtNywgLTIsIDIgXSwgWyAwLCAtMiwgLTEsIDIgXSwgWyAwLCAwLCAtMSwgMSBdLCBbIDAsIDAsIDAsIC0xIF0gXVxuICogTWF0cml4LmRvdChsdVswXSwgbHVbMV0pIC8vIHJldHVybnMgY2xvbmUgb2YgQVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5sdSA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Um93cygpXG4gIGNvbnN0IHRvbCA9IDFlLTZcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBMID0gdGhpcy56ZXJvcygpXG4gIGNvbnN0IFUgPSB0aGlzLnplcm9zKClcblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGlmIChNYXRoLmFicyhBLl9fdmFsdWVba11ba10pIDwgdG9sKSB0aHJvdyBFcnJvcignQ2Fubm90IHByb2NlZWQgd2l0aG91dCBhIHJvdyBleGNoYW5nZScpXG4gICAgTC5fX3ZhbHVlW2tdW2tdID0gMVxuICAgIGZvciAobGV0IGkgPSBrICsgMTsgaSA8IG47ICsraSkge1xuICAgICAgTC5fX3ZhbHVlW2ldW2tdID0gQS5fX3ZhbHVlW2ldW2tdIC8gQS5fX3ZhbHVlW2tdW2tdXG4gICAgICBmb3IgKGxldCBqID0gayArIDE7IGogPCBuOyArK2opIHtcbiAgICAgICAgQS5fX3ZhbHVlW2ldW2pdID0gQS5fX3ZhbHVlW2ldW2pdIC0gTC5fX3ZhbHVlW2ldW2tdICogQS5fX3ZhbHVlW2tdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGwgPSBrOyBsIDwgbjsgKytsKSB7XG4gICAgICBVLl9fdmFsdWVba11bbF0gPSBBLl9fdmFsdWVba11bbF1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtMLCBVXVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBycmVmXG4gKiBAcmV0dXJucyB7TWF0cml4fGFycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgQSA9IE1hdHJpeC5vZihbWy0xLCAxXSwgWy0xLCAwXSwgWzAsIC0xXSwgWy0xLCAtMl1dKVxuICogQS5ycmVmKCkgLy8gIFsgWyAxLCAwIF0sIFsgLTAsIDEgXSwgWyAwLCAwIF0sIFsgMCwgMCBdIF1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ycmVmID0gZnVuY3Rpb24gKCkge1xuICBsZXQgbGVhZCA9IDBcbiAgY29uc3QgcmVzdWx0TWF0cml4ID0gdGhpcy5jbG9uZSgpXG5cbiAgZm9yIChsZXQgciA9IDA7IHIgPCB0aGlzLmdldFJvd3MoKTsgKytyKSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpIDw9IGxlYWQpIHtcbiAgICAgIHJldHVybiByZXN1bHRNYXRyaXhcbiAgICB9XG4gICAgbGV0IGkgPSByXG4gICAgd2hpbGUgKHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2xlYWRdID09PSAwKSB7XG4gICAgICArK2lcbiAgICAgIGlmICh0aGlzLmdldFJvd3MoKSA9PT0gaSkge1xuICAgICAgICBpID0gclxuICAgICAgICArK2xlYWRcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29scygpID09PSBsZWFkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdE1hdHJpeFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRtcCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldXG4gICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV0gPSByZXN1bHRNYXRyaXguX192YWx1ZVtyXVxuICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdID0gdG1wXG5cbiAgICBsZXQgdmFsID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bbGVhZF1cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZ2V0Q29scygpOyArK2opIHtcbiAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdIC89IHZhbFxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5nZXRSb3dzKCk7ICsraSkge1xuICAgICAgaWYgKGkgPT09IHIpIGNvbnRpbnVlXG4gICAgICB2YWwgPSByZXN1bHRNYXRyaXguX192YWx1ZVtpXVtsZWFkXVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmdldENvbHMoKTsgKytqKSB7XG4gICAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2pdIC09IHZhbCAqIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGxlYWQrK1xuICB9XG4gIHJldHVybiByZXN1bHRNYXRyaXhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgc29sdmVcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNvbHZlIHhBID0gYlxuICogLy8gNXggKyB5ICA9IDdcbiAqIC8vIDN4IC0gNHkgPSAxOFxuICogLy8gU29sdXRpb24gZm9yIHggYW5kIHk6XG4gKiAvLyB4ID0gMlxuICogLy8geSA9IC0zXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDFdLCBbMywgLTRdXSlcbiAqIGNvbnN0IHNvbHZlQSA9IEEuc29sdmUoWzcsIDE4XSkgLy8gWzIsIC0zXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uIChiKSB7XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgTFUgPSBBLmx1KClcbiAgY29uc3QgTCA9IExVWzBdXG4gIGNvbnN0IFUgPSBMVVsxXVxuICBjb25zdCBuID0gdGhpcy5nZXRSb3dzKClcbiAgbGV0IHMgPSAwXG4gIGNvbnN0IGMgPSBbXVxuICBjb25zdCB4ID0gW11cblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgazsgKytqKSB7XG4gICAgICBzID0gcyArIEwuX192YWx1ZVtrXVtqXSAqIGNbal1cbiAgICB9XG4gICAgY1trXSA9IGJba10gLSBzXG4gICAgcyA9IDBcbiAgfVxuICBmb3IgKGxldCBhID0gbiAtIDE7IGEgPiAtMTsgLS1hKSB7XG4gICAgbGV0IHQgPSAwXG4gICAgZm9yIChsZXQgYiA9IGEgKyAxOyBiIDwgbjsgKytiKSB7XG4gICAgICB0ID0gdCArIFUuX192YWx1ZVthXVtiXSAqIHhbYl1cbiAgICB9XG4gICAgeFthXSA9IChjW2FdIC0gdCkgLyBVLl9fdmFsdWVbYV1bYV1cbiAgfVxuICByZXR1cm4geFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgaW52ZXJzZVxuICogQGluc3RhbmNlXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsyLCA0XV0pLmludmVyc2UoKVxuICogLy8gWyBbIDIsIC0wLjUgXSwgWyAtMSwgMC41IF0gXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pbnZlcnNlID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IEkgPSBBLmlkZW50aXR5KClcbiAgY29uc3QgSW52ID0gQS5jb25jYXQoSSkucnJlZigpXG5cbiAgY29uc3QgcmVzdWx0ID0gSW52Ll9fdmFsdWUucmVkdWNlKChyZXN1bHQsIHgsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGhhbGYgPSB4Lmxlbmd0aCAvIDJcbiAgICByZXN1bHQucHVzaCh4LnNsaWNlKGhhbGYsIHgubGVuZ3RoKSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sIFtdKVxuICByZXR1cm4gTWF0cml4Lm9mKHJlc3VsdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHJhbmtcbiAqIEBpbnN0YW5jZVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5yYW5rID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBycmVmID0gdGhpcy5ycmVmKClcbiAgbGV0IHJlc3VsdCA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBycmVmLmdldENvbHMoKTsgKytpKSB7XG4gICAgcmVzdWx0ICs9IHJyZWYuX192YWx1ZVtpXVtpXVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpbWVuc2lvblxuICogQGluc3RhbmNlXG4gKiBAc2VlIHJhbmtcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGltZW5zaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yYW5rKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZygpXG4gKiAvLyBbMSwgMSwgMV1cbiAqXG4gKiBjb25zdCBkaWFnMCA9IE1hdHJpeC56ZXJvcyg1LCA1KS5kaWFnKClcbiAqIC8vIFswLCAwLCAwLCAwLCAwXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaWFnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBpZHgpID0+IHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdCh4W2lkeF0pXG4gIH0pKFtdKSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGRpYWdcbiAqIEBkZXNjIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5kaWFnKFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyBbMiwgNV1cbiAqXG4gKi9cbk1hdHJpeC5kaWFnID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFnKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdwcm9kdWN0XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZ3Byb2R1Y3QoKVxuICogLy8gMVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLmRpYWdwcm9kdWN0KClcbiAqIC8vIDBcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGlhZ3Byb2R1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGlkeCkgPT4ge1xuICAgIGFjYyAqPSB4W2lkeF1cbiAgICByZXR1cm4gYWNjXG4gIH0pKDEpKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gZGlhZ3Byb2R1Y3RcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LmRpYWdwcm9kdWN0KFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyAxMFxuICpcbiAqL1xuTWF0cml4LmRpYWdwcm9kdWN0ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFncHJvZHVjdCgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdW1cbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIE1hdHJpeFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5zdW0oKVxuICogLy8gOVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLnN1bSgpXG4gKiAvLyAwXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnN1bSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCkgPT4ge1xuICAgIGFjYyArPSBmb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dCkoMCkoeClcbiAgICByZXR1cm4gYWNjXG4gIH0pKDApKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gc3VtXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgTWF0cml4XG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5zdW0oW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIDlcbiAqXG4gKi9cbk1hdHJpeC5zdW0gPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLnN1bSgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBrcm9uZWNrZXJcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgVGhlIEtyb25lY2tlciBwcm9kdWN0IGlzIGFuIG9wZXJhdGlvbiBvbiB0d28gbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUgcmVzdWx0aW5nIGluIGEgYmxvY2sgbWF0cml4LlxuICogQHBhcmFtIE0ge01hdHJpeH0gVGhlIHJpZ2h0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0ICh0aGlzIOKKlyBNKVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5rcm9uZWNrZXIgPSBmdW5jdGlvbiAoTSkge1xuICBjb25zdCBtID0gdGhpcy5nZXRSb3dzKClcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Q29scygpXG4gIGNvbnN0IHAgPSBNLmdldFJvd3MoKVxuICBjb25zdCBxID0gTS5nZXRDb2xzKClcblxuICBjb25zdCBsZWZ0ID0gdGhpcy5fX3ZhbHVlXG4gIGNvbnN0IHJpZ2h0ID0gTS5fX3ZhbHVlXG5cbiAgY29uc3QgZnJhbWUgPSBnZW5lcmF0ZShtICogcCwgbiAqIHEpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBwOyBrKyspIHtcbiAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBxOyBsKyspIHtcbiAgICAgICAgICBmcmFtZVtwICogaSArIGtdW3EgKiBqICsgbF0gPSBsZWZ0W2ldW2pdICogcmlnaHRba11bbF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gTWF0cml4Lm9mKGZyYW1lKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBrcm9uZWNrZXJcbiAqIEBkZXNjIFRoZSBLcm9uZWNrZXIgcHJvZHVjdCBpcyBhbiBvcGVyYXRpb24gb24gdHdvIG1hdHJpY2VzIG9mIGFyYml0cmFyeSBzaXplIHJlc3VsdGluZyBpbiBhIGJsb2NrIG1hdHJpeC5cbiAqIEBwYXJhbSBBIHtNYXRyaXh9IFRoZSBsZWZ0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0IChBIOKKlyBCKVxuICogQHBhcmFtIEIge01hdHJpeH0gVGhlIHJpZ2h0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0IChBIOKKlyBCKVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4Lmtyb25lY2tlciA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkua3JvbmVja2VyKEIpXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hdHJpeFxuIiwiaW1wb3J0IGN1cnJ5IGZyb20gJ2Z1bi5qcy9zcmMvY3VycnknXG5pbXBvcnQgY29uY2F0IGZyb20gJ2Z1bi5qcy9zcmMvY29uY2F0J1xuXG4vKipcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIChNLCBtLCBpZHgpIHtcbiAgcmV0dXJuIGNvbmNhdChtLCBNLl9fdmFsdWVbaWR4XSlcbn0pXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnZnVuLmpzL3NyYy9jdXJyeSdcbmltcG9ydCBmb2xkIGZyb20gJ2Z1bi5qcy9zcmMvZm9sZCdcbmltcG9ydCBtYXAgZnJvbSAnZnVuLmpzL3NyYy9tYXAnXG5pbXBvcnQgcm91bmQgZnJvbSAnLi9yb3VuZCdcblxuLyoqXG4gKiBAZnVuY3Rpb24gZG90XG4gKiBAcGFyYW0gQiB7TWF0cml4fVxuICogQHBhcmFtIGEge0FycmF5fVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgoZGVjaW1hbHMsIEIsIGEpID0+IG1hcCgoaXRlbSwgaSkgPT4ge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBqKSA9PiB7XG4gICAgYWNjICs9IHJvdW5kKHggKiBCLl9fdmFsdWVbal1baV0sIGRlY2ltYWxzKVxuICAgIHJldHVybiBhY2NcbiAgfSwgMCkoYSlcbn0pKEIuX192YWx1ZVswXSkpXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnZnVuLmpzL3NyYy9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkobSA9PiBbXSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlXG4gKiBAZGVzYyBHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGEgbWF0cml4IGFycmF5LCB2YWx1ZXMgYXJlIHNldCB0byB1bmRlZmluZWRcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfVxuICogQHJldHVybnMge2FueVtdW119XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChyb3dzLCBjb2xzKSA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShyb3dzKSkubWFwKHggPT4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoY29scykpKVxuIiwiaW1wb3J0IG1hcCBmcm9tICdmdW4uanMvc3JjL21hcCdcblxuLyoqXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjIENyZWF0ZXMgYW4gaWRlbnRpeSBtYXRyaXggZnJvbSBhbiBlbXB0eSBhcnJheVxuICogQHBhcmFtIG0ge0FycmF5fVxuICogQHBhcmFtIGlkeCB7bnVtYmVyfVxuICogQHJldHVybiB7TWF0cml4fVxuICovXG5leHBvcnQgZGVmYXVsdCAobSwgaWR4KSA9PiBtYXAoKHJvd3MsIGpkeCkgPT4gKGlkeCA9PT0gamR4KSAqIDEpKG0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiByb3VuZFxuICogQHBhcmFtIHZhbHVlIHtudW1iZXJ9XG4gKiBAcGFyYW0gZGVjaW1hbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJvdW5kICh2YWx1ZSwgZGVjaW1hbHMpIHtcbiAgcmV0dXJuIE51bWJlcihNYXRoLnJvdW5kKHZhbHVlICsgJ2UnICsgZGVjaW1hbHMpICsgJ2UtJyArIGRlY2ltYWxzKVxufVxuIiwiaW1wb3J0IG1hcCBmcm9tICdmdW4uanMvc3JjL21hcCdcbmltcG9ydCBjdXJyeSBmcm9tICdmdW4uanMvc3JjL2N1cnJ5J1xuXG4vKipcbiAqIEBmdW5jdGlvbiB0cmFuc3Bvc2VcbiAqIEBkZXNjIFRyYW5zcG9zZXMgYSBhcnJheSBvZiBhcnJheXMgdXNpbmcgdGhlIE1hdHJpeC5tYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm4ge01hdHJpeH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoKHByZXYsIG5leHQpID0+IG1hcCgoaXRlbSwgaSkgPT4gKHByZXZbaV0gfHwgW10pLmNvbmNhdChuZXh0W2ldKSkobmV4dCkpXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9fcHJpdmF0ZS9jdXJyeTEuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FkZEluZGV4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGp1c3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FkanVzdFdpdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FsbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWxsUGFzcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWx3YXlzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FueS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW55UGFzcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwZXJ0dXJlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcHBlbmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwcGx5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9mb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS90by5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvdW5pb24uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2JpbmFyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYmluZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9GLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9ib29sZWFuL1QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vYm90aC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY2FsbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29tcGxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9kaWZmRGF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pc0Z1dHVyZURhdGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvaXNWYWxpZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b0RheS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b0hvdXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvdG9NaW51dGVzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvU2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGVmYXVsdFRvLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lbXB0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmluZEluZGV4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9maXJzdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmxhdE1hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pc0VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9rZXlzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9sYXN0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9saWZ0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL0p1c3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21vbmFkcy9NYXliZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL05vdGhpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL25vdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVsbC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2FkZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2RpdmlkZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvaXNOYW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9tdWx0aXBseS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL3N1bS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZvbGQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9oYXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9oYXNJbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2tleXNJbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21lcmdlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qvb21pdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3BhdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9waWNrLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvcHJvcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb3IuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3NldC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2Zvcm1hdFN0cmluZy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy90cnV0aHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3VuZGVmaW5lZC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvemlwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy96aXBXaXRoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvbWF0cml4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2RvdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvZW1wdHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2dlbmVyYXRlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvcm91bmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL3RyYW5zcG9zZS5qcyJdLCJuYW1lcyI6WyJNYXRyaXgiLCJ2YWwiLCJfX3ZhbHVlIiwib2YiLCJwcm90b3R5cGUiLCJ0eXBlIiwicHJlY2lzaW9uIiwic2V0UHJlY2lzaW9uIiwiaXNTeW1tZXRyaWMiLCJhIiwiYiIsInRyYW5zcG9zZSIsImlzU3F1YXJlIiwiZ2V0Q29scyIsImdldFJvd3MiLCJpc09ydGhvZ29uYWwiLCJBeEF0IiwiZG90IiwiSSIsImlkZW50aXR5IiwibGVuZ3RoIiwiZXF1YWxzIiwiTSIsImdldFNoYXBlIiwibWFwIiwiZiIsImZvbGQiLCJhcCIsImNvbmNhdCIsIkEiLCJCIiwiZW1wdHkiLCJyb3dzIiwiY29scyIsIm0iLCJjb21iaW5lIiwiZmlsbCIsIngiLCJ6ZXJvcyIsIm9uZXMiLCJyYW5kb20iLCJlIiwiTWF0aCIsInRvQXJyYXkiLCJyb3ciLCJjb2wiLCJjbG9uZSIsImZyb21BcnJheSIsImFyciIsImFkZCIsIkVycm9yIiwiaWR4IiwiamR4Iiwic3VidHJhY3QiLCJtdWx0aXBseSIsImNvbnNvbGUiLCJsb2ciLCJhZGRpdGl2ZWludmVyc2UiLCJoYWRhbWFyZCIsImx1IiwibiIsInRvbCIsIkwiLCJVIiwiayIsImFicyIsImkiLCJqIiwibCIsInJyZWYiLCJsZWFkIiwicmVzdWx0TWF0cml4IiwiciIsInRtcCIsInNvbHZlIiwiTFUiLCJzIiwiYyIsInQiLCJpbnZlcnNlIiwiSW52IiwicmVzdWx0IiwicmVkdWNlIiwiaGFsZiIsInB1c2giLCJzbGljZSIsInJhbmsiLCJkaW1lbnNpb24iLCJkaWFnIiwiYWNjIiwiZGlhZ3Byb2R1Y3QiLCJzdW0iLCJwcmV2IiwibmV4dCIsImtyb25lY2tlciIsInAiLCJxIiwibGVmdCIsInJpZ2h0IiwiZnJhbWUiLCJkZWNpbWFscyIsIml0ZW0iLCJ1bmRlZmluZWQiLCJ2YWx1ZSIsIl9jb2xzIiwieSIsInoiLCJBcnJheSIsInJvdW5kIiwiTnVtYmVyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztB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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQUFXLGdCQUFnQjtBQUNxQjtBQUNoRCxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLGlCQUFpQjtBQUM1QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLDRCQUE0QjtBQUN2QyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLDZCQUE2QjtBQUN4QyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLCtCQUErQjtBQUMxQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLGdCQUFnQjtBQUMzQixXQUFXLGlCQUFpQjtBQUM1QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLGlCQUFpQjtBQUM1QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLDBCQUEwQjtBQUNyQyxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLGdCQUFnQjtBQUMzQixXQUFXLGlCQUFpQjtBQUM1QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLDRCQUE0QjtBQUN2QyxXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLDhCQUE4QjtBQUN6QyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLDBCQUEwQjtBQUNyQyxXQUFXLGlCQUFpQjtBQUM1QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGlCQUFpQjtBQUM1QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLGVBQWU7QUFDMUIsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxnQkFBZ0I7QUFDM0IsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVywwQkFBMEI7QUFDckMsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVywyQkFBMkI7QUFDdEMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVywyQkFBMkI7QUFDdEMsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyx5QkFBeUI7QUFDcEMsV0FBVyx5QkFBeUI7QUFDcEMsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyx3QkFBd0I7QUFDbkMsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyx3QkFBd0I7QUFDbkMsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxpQ0FBaUM7QUFDNUMsV0FBVyxxQ0FBcUM7QUFDaEQsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVywyQkFBMkI7QUFDdEMsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxrQkFBa0I7QUFDN0Is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QUFBLEdBQUosRUFBa0QyQixJQUFsRCxDQUFoQjtBQUFBLENBQU4sQyIsImZpbGUiOiJAYXN0dWFuYXgvZnVubWF0cml4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJAYXN0dWFuYXgvZnVubWF0cml4XCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkBhc3R1YW5heC9mdW5tYXRyaXhcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4iLCIvKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGZ1bmN0aW9uIHdpdGggYXJpdHkgMVxuICogQGZ1bmN0aW9uIGN1cnJ5MVxuICogQHByaXZhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3VycnkxIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gY3VycmllZCAoYSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAwXG4gICAgICA/IHRoaXNcbiAgICAgIDogZm4oYSlcbiAgfVxufVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYWRkSW5kZXhcbiAqIEBzdW1tYXJ5IEFkZHMgYSBzcGVjaWZpZWQgaW5kZXggdG8gaXRlcmF0ZSBhIGNvbGxlY3Rpb25cbiAqIEBkZXNjcmlwdGlvbiBUaGUgYWRkSW5kZXggZnVuY3Rpb24gaXMgbm90bmVjZXNzYXJ5IGZvciB0aGUgbWFwIGZ1bmN0aW9ucyBpbiB0aGUgZnVuLmpzIGxpYnJhcnkgYXMgdGhleSBiZWhhdmUgdGhlIHNhLGUgYXMgdGhlIG5hdGl2ZSBqYXZhc2NyaXB0IGZ1bmN0aW9uc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZiBJdGVyYXRvciBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZyBGdW5jdGlvbiB0byB3aGljaCB0byBhZGQgdGhlIGluZGV4XG4gKiBAcGFyYW0ge0FycmF5fSBhIFRoZSBhcnJheSBvbiB3aGljaCB0byB3b3JrXG4gKiBAc2luY2UgMS4wLjJcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkZEluZGV4IChmLCBnLCBhKSB7XG4gIGxldCBpID0gMFxuICByZXR1cm4gZihcbiAgICBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIGcodiwgaSsrKVxuICAgIH0sXG4gICAgYVxuICApXG59KVxuIiwiLyoqXG4gKiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBhZGp1c3RcbiAqIEBkZXNjcmlwdGlvbiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoYSAtPiBhKSAtPiBudW0gLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0byBtb2RpZnkgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICogQHBhcmFtIHtOdW1iZXJ9IGkgLSBUaGUgaW5kZXggYXQgd2hpY2ggdG8gbW9kaWZ5IHRoZSBhcnJheSwgYWNjZXB0cyBwb3N0aXRpdmUgYW5kIG5lZ2F0aXZlIGluZGV4ZXNcbiAqIEBwYXJhbSB7SXRlcmFibGV9IFthXSAtIEFycmF5IHdpdGggZGF0YVxuICogQHJldHVybiB7SXRlcmFibGV9IFthXVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkanVzdCAoZm4sIGksIGEpIHtcbiAgY29uc3QgciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpXG4gIGNvbnN0IGlkeCA9IGkgPCAwID8gci5sZW5ndGggKyBpIDogaVxuICBpZiAoIWFbaWR4XSkgcmV0dXJuIHJcbiAgcltpZHhdID0gZm4ocltpZHhdKVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gYWRqdXN0V2l0aFxuICogQGRlc2NyaXB0aW9uIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGEpIC0+ICgoYSAtPiBbYV0pIC0+IFthXSAtPiBudW0pIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdG8gbW9kaWZ5IHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgLSBUaGUgcHJlZGljYXRlIHRoYXQgcmV0dXJucyB0aGUgaW5kZXhlcyBpZiBmb3VuZFxuICogQHBhcmFtIHtJdGVyYWJsZX0gW2FdXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkanVzdFdpdGggKGZuLCBwcmVkLCBhKSB7XG4gIGNvbnN0IF9mbiA9IHggPT4ge1xuICAgIGlmIChwcmVkKHgpKSB7XG4gICAgICByZXR1cm4gZm4oeClcbiAgICB9XG4gICAgcmV0dXJuIHhcbiAgfVxuICByZXR1cm4gbWFwKF9mbiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSkpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gYWxsXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbGwgKGNiLCBhKSB7XG4gIGxldCByZXMgPSB0cnVlXG4gIGZvciAobGV0IGkgaW4gYSkge1xuICAgIGlmICghY2IoYVtpXSkpIHtcbiAgICAgIHJlcyA9IGZhbHNlXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59KVxuIiwiLyoqXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBwcmVkaWNhdGVzIHRvIHRoZSBkYXRhIGFuZCByZXR1cm5zIHRydWUgaWYgYWxsIHBhc3NcbiAqXG4gKiBAZnVuY3Rpb24gYWxsUGFzc1xuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzc1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBbKCouLi4gLT4gQm9vbGVhbildIC0+ICgqLi4uIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IHByZWRpY2F0ZXMgQW4gYXJyYXkgb2YgcHJlZGljYXRlcyB0byBjaGVja1xuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjb21iaW5lZCBwcmVkaWNhdGVcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbGxQYXNzIChjYnMsIGEpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWNic1tpXShhKSkgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB3aXRoIHRoZSBpbml0aWFsIHZhbHVlIHByb3ZpZGVkXG4gKlxuICogQGZ1bmN0aW9uIGFsd2F5c1xuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBmdW5jdGlvbiB3aXRoIHRoZSBpbml0aWFsIHZhbHVlIHByb3ZpZGVkXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWx3YXlzICh4KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB4IH1cbn0pXG4iLCIvKipcbiAqIENoZWNrcyBpZiBib3RoIHByZWRpY2F0ZXMgYXJlIHRydWVcbiAqXG4gKiBAZnVuY3Rpb24gYW5kXG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGJvdGggcHJlZGljYXRlcyBhcmUgdHJ1ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoeCwgeSkgLT4gYm9vbGVhblxuICogQHBhcmFtIHsqfSB4IC0gQSBwcmVkaWNhdGVcbiAqIEBwYXJhbSB7Kn0geSAtIEEgcHJlZGljYXRlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFuZCAoeCwgeSkge1xuICByZXR1cm4geCAmJiB5XG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb24gb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gYW55XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uIG9mIHRoZSBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChUT0RPKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYW55IChjYiwgYSkge1xuICBsZXQgcmVzID0gZmFsc2VcbiAgZm9yIChsZXQgaSBpbiBhKSB7XG4gICAgaWYgKGNiKGFbaV0pKSB7XG4gICAgICByZXMgPSB0cnVlXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59KVxuIiwiLyoqXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBwcmVkaWNhdGVzIHRvIHRoZSBkYXRhIGFuZCByZXR1cm5zIHRydWUgaWYgb25lIHBhc3Nlc1xuICpcbiAqIEBmdW5jdGlvbiBhbnlQYXNzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIFsoKi4uLiAtPiBCb29sZWFuKV0gLT4gKCouLi4pIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IHByZWRpY2F0ZXMgQW4gYXJyYXkgb2YgcHJlZGljYXRlcyB0byBjaGVja1xuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjb21iaW5lZCBwcmVkaWNhdGVcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbnlQYXNzIChjYnMsIGEpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY2JzW2ldKGEpKSByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufSlcbiIsIi8qKlxuICogQXBwbGllcyBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHJldHVybnMgYSBjb21iaW5lZCByZXN1bHQgYXJyYXlcbiAqXG4gKiBAZnVuY3Rpb24gYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcyBhbmQgcmV0dXJucyBhIGNvbWJpbmVkIHJlc3VsdCBhcnJheVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBAc2lnIFthIC0+IGJdIC0+IFthXSAtPiBbYl1cbiAqIEBwYXJhbSB7KEZ1bmN0aW9uW118RnVuY3Rpb258QXBwbGljYXRpdmUpfSBmbnMgLSBBbiBhcnJheSBvZiBmdW5jdGlvbnMgb3IgYSBmdW5jdGlvbiBvciBhbiBhcHBsaWNhdGl2ZVxuICogQHBhcmFtIHtBcnJheX0gdmFscyAtIEFuIGFycmF5IG9mIHZhbHVlc1xuICogQHJldHVybiB7SXRlcmFibGV9IFthXVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGlzIGZyb20gJy4vaXMnXG5pbXBvcnQgZm9sZCBmcm9tICcuL2FycmF5L2ZvbGQnXG5pbXBvcnQgbWFwIGZyb20gJy4vYXJyYXkvbWFwJ1xuXG5jb25zdCBpc0Z1bmN0aW9uID0gaXMoJ0Z1bmN0aW9uJylcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXAgKGZucywgdmFscykge1xuICBpZiAoaXNGdW5jdGlvbihmbnMuYXApKSB7XG4gICAgcmV0dXJuIGZucy5hcCh2YWxzKVxuICB9XG4gIGlmIChpc0Z1bmN0aW9uKGZucykpIHtcbiAgICByZXR1cm4geCA9PiBmbnMoeCkodmFscyh4KSlcbiAgfVxuICByZXR1cm4gZm9sZCgoYWNjLCBmKSA9PiBhY2MuY29uY2F0KG1hcChjdXJyeTEoZiksIHZhbHMpKSwgW10sIGZucylcbn0pXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGFwZXJ0dXJlXG4gKiBAcGFyYW0gblxuICogQHBhcmFtIGFyclxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwZXJ0dXJlIChuLCBhKSB7XG4gIGlmIChhLmxlbmd0aCA8IG4pIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBjb25zdCByZXMgPSBBcnJheShhLmxlbmd0aCAtIG4gKyAxKVxuICByZXR1cm4gbWFwKChpdGVtLCBpZHgpID0+IGEuc2xpY2UoaWR4LCBpZHggKyBuKSwgcmVzKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGFwcGVuZFxuICogQGRlc2NyaXB0aW9uIEFwcGVuZCBhbiBlbG1lbnQgdG8gYSBsaXN0XG4gKiBAcGFyYW0geyp9IGVsIC0gRWxlbWVudCB0byBhZGQgdG8gYSBsaXN0XG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0IC0gTGlzdCB0byB3aGljaCB0byBhZGQgdGhlIGVsZW1lbnRcbiAqIEByZXR1cm4ge2FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBsID0gWzAsIDFdXG4gKiBhcHBlbmQoJ2EnLCBsKSAvLyByZXV0bnIgWzAsIDEsICdhJ11cbiAqXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBjb25jYXQgZnJvbSAnLi9jb25jYXQnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwcGVuZCAoZWwsIGxpc3QpIHtcbiAgcmV0dXJuIGNvbmNhdChsaXN0LCBbIGVsIF0pXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXBwbHlcbiAqIEBkZXNjcmlwdGlvbiBUaGUgYXBwbHkoKSBtZXRob2QgY2FsbHMgYSBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgcHJvdmlkZWQgYXMgYW4gYXJyYXksIGFuZCB0aGUgZnVuY3Rpb24gYXMgY29udGV4dC5cbiAqIEBwYXJhbSBmblxuICogQHBhcmFtIGFyZ3NcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhID0gYXBwbHkoZnVuY3Rpb24gKCkge1xuICogICAgICByZXR1cm4gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpLm1hcCh4ID0+IHggKiAyKVxuICogICB9KVxuICogYShbMSwgMiwgM10pXG4gKiAvLyBbMiwgNCwgNl1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwcGx5IChmbiwgYXJncykge1xuICByZXR1cm4gZm4uYXBwbHkoZm4sIGFyZ3MpXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGFycmF5Q29uY2F0XG4gKiBAcGFyYW0gYTFcbiAqIEBwYXJhbSBhMlxuICogQHJldHVybnMge1RbXX1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoYSwgYilcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gZXF1YWxzQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiBmb3IgZGVlcCBjb21wYXJpc29uIG9mIGFycmF5c1xuICogQHBhcmFtIHthfSB4IC0gT2JqZWN0IHRvIGNvbXBhcmUgb2YgdHlwZSBhXG4gKiBAcGFyYW0ge2F9IHkgLSBPYmplY3QgeCB0byBjb21wYXJlIHdpdGggb2JqZWN0IHhcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGVxdWFscyBmcm9tICcuLi9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGVxdWFsc0FycmF5ICh4LCB5KSB7XG4gIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobm90KGVxdWFscyh4W2ldLCB5W2ldKSkpIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXJyYXlGaWx0ZXJcbiAqIEBwcml2YXRlXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFycmF5RmlsdGVyIChmbiwgYSkge1xuICB2YXIgciA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmbihhW2ldKSkgci5wdXNoKGFbaV0pXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBtYXBwaW5nIG92ZXIgdGhlIHByb3ZpZGVkIGFycmF5IGFuZCBjYWxsaW5nIGFuIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge2NiRnVuY3Rpb259IGNiIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSBpdGVtXG4gKiBAcGFyYW0geyp9IGluaXQgLSBJbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0ge0FycmF5fSBhIC0gQXJyYXkgd2l0aCBpdGVtcyB0byBtb2RpZnkgYnkgdGhlIGNiIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhbGlhcyByZWR1Y2VcbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBmb2xkKGFkZCwgMCwgWzEsMSwxXSlcbiAqIC8vIHJlc3VsdCA9IDNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBjYkZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHIgLSBBY2N1bXVsYXRvciB3aGljaCBhY2N1bXVsYXRlcyB0aGUgY2FsbGJhY2sncyByZXR1cm4gdmFsdWVzXG4gKiBAcGFyYW0geyp9IGl0ZW0gLSB0aGUgY3VycmVudCBlbGVtZW50IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gdGhlIGluZGV5IG9mIHRoZSBpdGVtIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtBcnJheX0gYSAtIFRoZSBpbml0aWFsIGFycmF5XG4gKiBAcmV0dXJuIHsqfVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZvbGQgKGNiLCBpbml0LCBhKSB7XG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGEubGVuZ3RoXG4gIGxldCByID0gaW5pdFxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgPSBjYihyLCBhW2ldLCBpLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBpcyBhbiBhcnJheSwgYXV0b2N1cnJpZWQgZnVuY3Rpb25cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGlzQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBpcyBhbiBhcnJheSwgYXV0b2N1cnJpZWQgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gT2JqZWN0IHRvIHZlcmlmaXlcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gaXNBcnJheShbMSwxLDFdKVxuICogLy8gcmVzdWx0ID0gdHJ1ZVxuICovXG5cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0FycmF5JylcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIE1hcHMgb3ZlciBhbiBhcnJheSBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqICBjb25zdCByZXN1bHQgPSBtYXAoaWRlbnRpdHksIFswLDIsM10pXG4gKiAgLy8gcmVzdWx0ID0gWzAsMiwzXVxuICogIGNvbnN0IGFkZDIgPSBhZGQoMilcbiAqICBjb25zdCByZXN1bHQgPSBtYXAoYWRkMiwgWzAsMiwzXSlcbiAqICAvLyByZXN1bHQgPSBbMiw0LDVdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgY29uc3QgciA9IG5ldyBBcnJheShsKVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHJbaV0gPSBjYihhW2ldLCBpLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdG9BcnJheVxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHRoZSBpbnB1dCB0byBhbiBhcnJheVxuICogQHBhcmFtIHtBcnJheUxpa2V9IHggLSBPYmplY3QgdG8gY29udmVydCB0byBhbiBhcnJheVxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gdG9BcnJheShcInN0cmluZ1wiKVxuICogLy8gcmVzdWx0ID0gWydzJywndCcsJ3InLCdpJywnbicsJ2cnXVxuICpcbiAqIGZ1bmN0aW9uICgpIHtcbiAqICBjb25zdCBhcmdzID0gdG9BcnJheShhcmd1bWVudHMpXG4gKiAgY29uc29sZS5sb2codHlwZW9mIGFyZ3MpIC8vIEFycmF5XG4gKiB9XG4gKlxuICoqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9BcnJheSAoeCkge1xuICByZXR1cm4geC5sZW5ndGggPT09IDEgPyBbeFswXV0gOiBBcnJheS5hcHBseShudWxsLCB4KVxufTtcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHVuaW9uQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBNZXJnZXMgMiBhcnJheXNcbiAqIEBwYXJhbSB7QXJyYXl9IGFMIC0gQXJyYXkgdG8gbWVyZ2VcbiAqIEBwYXJhbSB7QXJyYXl9IGFSIC0gQXJyYXkgdG8gbWVyZ2VcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHVuaW9uQXJyYXkoWzAsMSwyXSwgWzMsNCw1XSlcbiAqIC8vIHJlc3VsdCA9IFswLjEuMi4zLjQuNV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gdW5pb25BcnJheSAoYUwsIGFSKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYUwuY29uY2F0KGFSKSkpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYmluYXJ5XG4gKiBAcGFyYW0gY2JcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigqPSwgKj0pOiAqfVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiBiaW5hcnkgKGNiKSB7XG4gIHJldHVybiBjdXJyeShmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBjYihhLCBiKVxuICB9KVxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG4vKipcbiAqIEBmdW5jdGlvbiBiaW5kXG4gKiBAZGVzY3JpcHRpb24gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dFxuICogQHBhcmFtIHtmdW5jdGlvbiB9Zm5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dFxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGJpbmQgKGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBmbi5iaW5kKGNvbnRleHQpXG59KVxuIiwiLyoqXG4gKiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKlxuICogQGZ1bmN0aW9uIEZcbiAqIEBkZXNjcmlwdGlvbiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICoqL1xuaW1wb3J0IGFsd2F5cyBmcm9tICcuLi9hbHdheXMnXG5cbmV4cG9ydCBkZWZhdWx0IGFsd2F5cyhmYWxzZSlcbiIsIi8qKlxuICogQWx3YXlzIHJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgRmFsc2UgYm9vbGVhblxuICpcbiAqIEBmdW5jdGlvbiBUXG4gKiBAZGVzY3JpcHRpb24gQWx3YXlzIHJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgRmFsc2UgYm9vbGVhblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqKi9cbmltcG9ydCBhbHdheXMgZnJvbSAnLi4vYWx3YXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBhbHdheXModHJ1ZSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gYm90aCBwcmVkaWNhdGVzIHJldHVybiB0cnVlXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbjEgQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuMiBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBsaWZ0IGZyb20gJy4uL2xpZnQnXG5pbXBvcnQgYW5kIGZyb20gJy4uL2FuZCdcbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYm90aCAoZm4xLCBmbjIpIHtcbiAgcmV0dXJuIGlzKCdGdW5jdGlvbicpKGZuMSlcbiAgICA/IGZ1bmN0aW9uIF9ib3RoICgpIHsgcmV0dXJuIGZuMS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICYmIGZuMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgICA6IGxpZnQoYW5kKShmbjEsIGZuMilcbn0pXG4iLCIvKipcbiAqIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IEl0ZW0gdG8gdmVyaWZ5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICoqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQm9vbGVhbicpXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjYWxsXG4gKiBAcGFyYW0gZm5cbiAqIEByZXR1cm5zIHsqfVxuICovXG4vLyBpbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNhbGwgKGZuKSB7XG4gIHJldHVybiBmbi5hcHBseShmbiwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbXBsZW1lbnRcbiAqIEBkZXNjcmlwdGlvbiBMaWZ0cyBhIHByZWRpY2F0ZSBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGUgY29tcGxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBub3RcbiAqIEBzZWUgbGlmdFxuICogQHNpbmNlIHYxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBpc05vdEVtcHR5ID0gY29tcGxlbWVudChpc0VtcHR5KVxuICogaXNOb3RFbXB0eShbXSkgLy8gZmFsc2VcbiAqIGlzTm90RW1wdHkoeydhJyA6IDF9KSAvLyB0cnVlXG4gKlxuICogY29tcGxlbWVudChNYXliZS5vZihmYWxzZSkpIC8vIHRydWVcbiAqIGNvbXBsZW1lbnQoTWF5YmUub2YodHJ1ZSkpIC8vIGZhbHNlXG4gKi9cbmltcG9ydCBsaWZ0IGZyb20gJy4vbGlmdCdcbmltcG9ydCBub3QgZnJvbSAnLi9ub3QnXG5cbmNvbnN0IGNvbXBsZW1lbnQgPSBsaWZ0KG5vdClcbmV4cG9ydCBkZWZhdWx0IGNvbXBsZW1lbnRcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbXBvc2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigpOiAqfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlICgpIHtcbiAgbGV0IGZucyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcblxuICByZXR1cm4gZnVuY3Rpb24gX2NvbXBvc2UgKCkge1xuICAgIGxldCBpbml0ID0gZm5zW2Zucy5sZW5ndGggLSAxXVxuICAgIGxldCByZXN1bHQgPSBbaW5pdC5hcHBseShpbml0LCBhcmd1bWVudHMpXVxuICAgIGxldCBpID0gZm5zLmxlbmd0aCAtIDJcblxuICAgIGZvciAoaTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIGNvbnN0IGZuID0gZm5zW2ldXG5cbiAgICAgIHJlc3VsdCA9IFtmbi5hcHBseShmbiwgcmVzdWx0KV1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFswXVxuICB9XG59O1xuIiwiLyoqXG4gKiBDb25jYXRlbmF0ZXMgMiBpdGVtcyB0b2dldGhlclxuICpcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBpdGVtcyB0b2dldGhlclxuICogQHNpbmNlIHYxLjAuNFxuICogQHBhcmFtIHthfSBhIC0gTGVmdCBzaWRlIG9mIHRoZSBjb25jYXRlbmF0aW9uXG4gKiBAcGFyYW0ge2F9IGIgLSByaWdodCBzaWRlIG9mIHRoZSBjb25jYXRlbmF0aW9uXG4gKiBAcmV0dXJuIHthfSBDb25jYXRlbmF0ZWQgaXRlbVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUNvbmNhdCBmcm9tICcuL2FycmF5L2NvbmNhdCdcbmltcG9ydCBzdHJpbmdDb25jYXQgZnJvbSAnLi9zdHJpbmcvY29uY2F0J1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAnU3RyaW5nJzogc3RyaW5nQ29uY2F0LFxuICAgICdBcnJheSc6IGFycmF5Q29uY2F0XG4gIH1cbiAgcmV0dXJuIHR5cGVNYXBbdHlwZShhKV0oYSwgYilcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjb25kXG4gKiBAcGFyYW0gY29uZHNcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uZCAoY29uZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChjb25kc1tpXVswXSh2YWx1ZSkpIHJldHVybiBjb25kc1tpXVsxXSh2YWx1ZSlcbiAgICB9XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG4vKipcbiAqIEBmdW5jdGlvbiBjdXJyeVxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVzIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeSAoZnVuKSB7XG4gIGNvbnN0IGFyZ3NsZW4gPSBmdW4ubGVuZ3RoXG5cbiAgaWYgKGFyZ3NsZW4gPT09IDApIHtcbiAgICByZXR1cm4gZnVuXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVJlY3Vyc2VyKFtdKVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UgKGFjYywgYXJncykge1xuICAgIGNvbnN0IF9hY2MgPSBhY2MuY29uY2F0KGFyZ3MpXG4gICAgcmV0dXJuIF9hY2MubGVuZ3RoIDwgYXJnc2xlblxuICAgICAgPyBjcmVhdGVSZWN1cnNlcihfYWNjKVxuICAgICAgOiBmdW4uYXBwbHkodGhpcywgX2FjYylcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlY3Vyc2VyIChhY2MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlY3Vyc2UoYWNjLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZGlmZkRhdGVcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBkYXRlcyBpbiBtaWxsaXNlY29uZFxuICogQHBhcmFtIHtEYXRlfSBzdGFydCAtIFN0YXJ0IGRhdGVcbiAqIEBwYXJhbSB7RGF0ZX0gZW5kIC0gRW5kIGRhdGVcbiAqIEByZXR1cm4ge251bWJlcn0gUkV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kc1xuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRpZmZEYXRlIChzdGFydCwgZW5kKSB7XG4gIHJldHVybiAobmV3IERhdGUoc3RhcnQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGVuZCkuZ2V0VGltZSgpKVxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdEYXRlJylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDkvMDMvMjAxNy5cbiAqL1xuaW1wb3J0IGRpZmZEYXRlIGZyb20gJy4vZGlmZkRhdGUnXG5cbmV4cG9ydCBkZWZhdWx0IChkKSA9PiB7XG4gIHJldHVybiBkaWZmRGF0ZShuZXcgRGF0ZSgpKShkKSA8IDBcbn1cbiIsIi8qKlxuICpcbiAqL1xuaW1wb3J0IGlzRGF0ZSBmcm9tICcuL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1ZhbGlkICh4KSB7XG4gIC8vIG5vaW5zcGVjdGlvbiBKU0NoZWNrRnVuY3Rpb25TaWduYXR1cmVzXG4gIHJldHVybiBpc0RhdGUoeCkgJiYgaXNGaW5pdGUoeC52YWx1ZU9mKCkpXG59O1xuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDg2NDAwMDAwIC8vIDI0KjYwKjYwKjEwMDAgPSA4NjQwMDAwMFxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gMzYwMDAwMCAvLyA2MCo2MCoxMDAwID0gMzYwMDAwMFxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gNjAwMDAgLy8gNjAqMTAwMCA9IDYwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyAxMDAwXHJcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGRlZmF1bHRUb1xuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IGIgLT4gYSB8IGJcbiAqIEBwYXJhbSB7YX0gZGVmYXVsdCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7Yn0gdmFsIGB2YWxgIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBgZGVmYXVsdGAgdW5sZXNzIGB2YWxgIGlzIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAuXG4gKiBAcmV0dXJuIHsqfSBUaGUgc2Vjb25kIHZhbHVlIGlmIGl0IGlzIG5vdCBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgdmFsdWVcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBkZWZhdWx0VG8gKGQsIHYpIHtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuIHYgPT0gbnVsbCB8fCB2ICE9PSB2ID8gZCA6IHZcbn0pXG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZW1wdHkgZXF1aXZhbGVudCBvZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbXB0eSAoeCkge1xuICByZXR1cm4gbmV3IHguY29uc3RydWN0b3IoKVxufTtcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZXF1YWxzXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGVxdWFsaXR5IG9mIDIgaXRlbXNcbiAqIEBwYXJhbSB7Kn0geCAtIExlZnQgc2lkZSBvZiB0aGUgZXF1YWxpdHkgY2hlY2tcbiAqIEBwYXJhbSB7Kn0geSAtIFJpZ2h0IHNpZGUgb2YgdGhlIGVxdWFsaXR5IGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBuYW4gPSBOdW1iZXIuTmFOXG4gKiBlcXVhbChuYW4sIG5hbikgLy8gcmV0dXJucyB0cnVlXG4gKlxuICogY29uc3QgYXJyMSA9IFswLCAxLCAyLCAzXVxuICogY29uc3QgYXJyMiA9IFtudWxsLCAxLCAyLCAzXVxuICogZXF1YWxzKGFycjEsIGFycjIpIC8vIHJldHVybnMgZmFsc2VcbiAqXG4gKiBlcXVhbHMobmV3IE9iamVjdCh7J2EnOiAwLCAnYic6IDF9KSwgeydhJzogMCwgJ2InOiAxfSkgLy8gdHJ1ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuaW1wb3J0IGlkZW50aWNhbCBmcm9tICcuL2lkZW50aWNhbCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBub3QgZnJvbSAnLi9ub3QnXG5pbXBvcnQgb3IgZnJvbSAnLi9vcidcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL29iamVjdC9pcydcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vYXJyYXkvaXMnXG5pbXBvcnQgaXNCb29sZWFuIGZyb20gJy4vYm9vbGVhbi9pcydcbmltcG9ydCBpc051bWJlciBmcm9tICcuL251bWJlci9pcydcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL3N0cmluZy9pcydcbmltcG9ydCBpc0RhdGUgZnJvbSAnLi9kYXRlL2lzJ1xuaW1wb3J0IGVxdWFsc0FycmF5IGZyb20gJy4vYXJyYXkvZXF1YWxzJ1xuaW1wb3J0IGVxdWFsc09iamVjdCBmcm9tICcuL29iamVjdC9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGVxdWFscyAoeCwgeSkge1xuICBpZiAoaWRlbnRpY2FsKHgsIHkpKSByZXR1cm4gdHJ1ZVxuXG4gIGlmICh0eXBlKHgpICE9PSB0eXBlKHkpKSByZXR1cm4gZmFsc2VcblxuICBpZiAob3Iobm90KGV4aXN0cyh4KSksIG5vdChleGlzdHMoeSkpKSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKHguY29uc3RydWN0b3IgIT09IHkuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZVxuXG4gIGlmIChpc1N0cmluZyh4KSB8fCBpc0Jvb2xlYW4oeCkgfHwgaXNOdW1iZXIoeCkgfHwgaXNEYXRlKHgpKSB7XG4gICAgcmV0dXJuIGlkZW50aWNhbCh4LnZhbHVlT2YoKSwgeS52YWx1ZU9mKCkpXG4gIH1cbiAgaWYgKGlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gZXF1YWxzQXJyYXkoeCwgeSlcbiAgfSBlbHNlIGlmIChpc09iamVjdCh4KSkge1xuICAgIHJldHVybiBlcXVhbHNPYmplY3QoeCwgeSlcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBleGlzdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhpc3RzICh4KSB7XG4gIHJldHVybiAhKHggPT0gbnVsbClcbn07XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmaWx0ZXJcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdWNudGlvbiB0aGF0IGZpbHRlcnMgT2JqZWN0cywgQXJyYXlzIGFuZCBNYXBzXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL2FycmF5L2ZpbHRlcidcbmltcG9ydCBvYmplY3RGaWx0ZXIgZnJvbSAnLi9vYmplY3QvZmlsdGVyJ1xuaW1wb3J0IG1hcEZpbHRlciBmcm9tICcuL21hcC9maWx0ZXInXG4vLyBUT0RPXG4vLyBpbXBvcnQgc2V0RmlsdGVyIGZyb20gJy4uL3NldC9maWx0ZXInXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZpbHRlciAoZm4sIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgLy8gc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpIHtcbiAgICAvLyBjYXNlICdGdW5jdGlvbic6XG4gICAgLy8gICByZXR1cm4gY3VycnkoZnVuY3Rpb24gKCkge1xuICAgIC8vICAgICByZXR1cm4gY2IuY2FsbCh0aGlzLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpXG4gICAgLy8gICB9KVxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICByZXR1cm4gb2JqZWN0RmlsdGVyKGZuLCBhKVxuICAgIC8vIGNhc2UgJ1N0cmluZyc6XG4gICAgLy8gICByZXR1cm4gc3RyaW5nTWFwKGNiLCBhKVxuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwRmlsdGVyKGZuLCBhKVxuICAgIC8vIGNhc2UgJ1NldCc6XG4gICAgLy8gICByZXR1cm4gc2V0RmlsdGVyKGZuLCBhKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIoZm4sIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIEZpbmQgdGhlIGluZGV4IG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGZpbmRJbmRleFxuICogQGRlc2NyaXB0aW9uIEZpbmQgdGhlIGluZGV4IG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGJvb2xlYW4pIC0+IFthXSAtPiBudW1iZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFByZWRpY2F0ZSBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gQW4gYXJyYXkgbGlrZSBvYmplY3RcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZpbmRJbmRleCAoZm4sIGEpIHtcbiAgbGV0IGkgPSAwXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICB3aGlsZSAoaSA8IGwpIHtcbiAgICBpZiAoZm4oYVtpXSkpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiAtMVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGZpcnN0XG4gKiBAcGFyYW0gW2FdXG4gKiBAcmV0dXJuIGEgfCB1bmRlZmluZWRcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYXJyID0gWzEsIDIsIDRdXG4gKiBmaXJzdChbMSwgMiwgNF0pIC8vIHJldHVybnMgMVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gZmlyc3QgKGEpIHtcbiAgcmV0dXJuIGEgJiYgYS5sZW5ndGggPyBhWzBdIDogdW5kZWZpbmVkXG59KVxuIiwiaW1wb3J0IGZvbGQgZnJvbSAnLi9mb2xkJ1xuaW1wb3J0IGVtcHR5IGZyb20gJy4vZW1wdHknXG5pbXBvcnQgY29uY2F0IGZyb20gJy4vY29uY2F0J1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXMgZnJvbSAnLi9pcydcblxuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbi8qKlxuICogQGZ1bmN0aW9uIGZsYXRNYXBcbiAqIEBwYXJhbSBmblxuICogQHBhcmFtIGFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZmxhdE1hcCAoZm4sIGEpIHtcbiAgaWYgKGlzRnVuY3Rpb24oYSkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBmbihhKHgpKSh4KVxuICAgIH1cbiAgfVxuICBpZiAoaXNGdW5jdGlvbihhLmZsYXRNYXApKSB7XG4gICAgcmV0dXJuIGEuZmxhdE1hcChmbilcbiAgfVxuICByZXR1cm4gZm9sZCgoYWNjLCB4KSA9PiBjb25jYXQoYWNjLCBmbih4KSksIGVtcHR5KGEpLCBhKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5IGxpa2Ugb2JqZWN0IGFuZCBjYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBpdGVtXG4gKlxuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKChhLCBiLCBjLCBhKSDihpIgYSkg4oaSIGEg4oaSIFtiXSDihpIgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgcmVjZWl2ZXMgNCB2YWx1ZXM6IHRoZSBhY2N1bXVsYXRvciwgdGhlIGl0ZW0sIHRoZSBpbmRleCwgYW5kIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHsqfSBhIGlzIHRoZSBpbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0geyp9IFtiXSB0aGUgYXJyYXkgbGlrZSBpdGVtIHRvIGl0ZXJhdGUgb3ZlclxuICogQHJldHVybiB7Kn0gYSBpcyB0aGUgYWNjdW11bGF0ZWQgdmFsdWVcbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlGb2xkIGZyb20gJy4vYXJyYXkvZm9sZCdcbmltcG9ydCBvYmplY3RGb2xkIGZyb20gJy4vb2JqZWN0L2ZvbGQnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZvbGQgKGNiLCBpbml0LCBhKSB7XG4gIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgJ09iamVjdCc6IG9iamVjdEZvbGQsXG4gICAgJ0FycmF5JzogYXJyYXlGb2xkXG4gIH1cbiAgLy8gaWYgKGEubmV4dCkge1xuICAvLyAgIHJldHVybiBpdGVyYWJsZUZvbGQoY2IsIGluaXQsIGEpXG4gIC8vIH1cbiAgLy8gaWYgKHR5cGUoU3ltYm9sKSAhPT0gJ3VuZGVmaW5lZCcgJiYgYVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYVtTeW1ib2wuaXRlcmF0b3JdKCkpXG4gIC8vIH1cbiAgcmV0dXJuIHR5cGVNYXBbdHlwZShhKV0oY2IsIGluaXQsIGEpXG59KVxuXG4vLyBmdW5jdGlvbiBpdGVyYWJsZUZvbGQgKGNiLCBhY2MsIGdlbikge1xuLy8gICBsZXQgc3RlcCA9IGdlbi5uZXh0KClcbi8vICAgd2hpbGUgKCFzdGVwLmRvbmUpIHtcbi8vICAgICBhY2MgPSBjYihhY2MsIHN0ZXAudmFsdWUpXG4vLyAgICAgc3RlcCA9IGdlbi5uZXh0KClcbi8vICAgfVxuLy8gICByZXR1cm4gYWNjXG4vLyB9XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGlkZW50aWNhbFxuICogQGRlc2NyaXB0aW9uIGNoZWNrcyBmb3IgaWRlbnRpbnRpY2FsIGl0ZW1zXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGlzTmFuIGZyb20gJy4vbnVtYmVyL2lzTmFuJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBpZGVudGljYWwgKHgsIHkpIHtcbiAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkge1xuICAgIHJldHVybiAxIC8geCA9PT0gMSAvIHlcbiAgfVxuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuICEhKGlzTmFuKHgpICYmIGlzTmFuKHkpKVxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSB2YWx1ZSBzdXBwbGllZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpZGVudGl0eSAoeCkge1xuICByZXR1cm4geFxufTtcbiIsIi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgX18gfSBmcm9tICcuL19fJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBlcnR1cmUgfSBmcm9tICcuL2FwZXJ0dXJlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseVNwZWMgfSBmcm9tICcuL2FwcGx5U3BlYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHlUbyB9IGZyb20gJy4vYXBwbHlUbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNjZW5kIH0gZnJvbSAnLi9hc2NlbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFzc29jIH0gZnJvbSAnLi9hc3NvYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNzb2NQYXRoIH0gZnJvbSAnLi9hc3NvY1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNsYW1wIH0gZnJvbSAnLi9jbGFtcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY2xvbmUgfSBmcm9tICcuL2Nsb25lJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wYXJhdG9yIH0gZnJvbSAnLi9jb21wYXJhdG9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlSyB9IGZyb20gJy4vY29tcG9zZUsnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VQIH0gZnJvbSAnLi9jb21wb3NlUCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZVdpdGggfSBmcm9tICcuL2NvbXBvc2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25zdHJ1Y3QgfSBmcm9tICcuL2NvbnN0cnVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29uc3RydWN0TiB9IGZyb20gJy4vY29uc3RydWN0Tidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29udGFpbnMgfSBmcm9tICcuL2NvbnRhaW5zJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb252ZXJnZSB9IGZyb20gJy4vY29udmVyZ2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvdW50QnkgfSBmcm9tICcuL2NvdW50QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRlYyB9IGZyb20gJy4vZGVjJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkZXNjZW5kIH0gZnJvbSAnLi9kZXNjZW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmZXJlbmNlIH0gZnJvbSAnLi9kaWZmZXJlbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmZXJlbmNlV2l0aCB9IGZyb20gJy4vZGlmZmVyZW5jZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpc3NvYyB9IGZyb20gJy4vZGlzc29jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXNzb2NQYXRoIH0gZnJvbSAnLi9kaXNzb2NQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wIH0gZnJvbSAnLi9kcm9wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wTGFzdCB9IGZyb20gJy4vZHJvcExhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BMYXN0V2hpbGUgfSBmcm9tICcuL2Ryb3BMYXN0V2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BSZXBlYXRzIH0gZnJvbSAnLi9kcm9wUmVwZWF0cydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFJlcGVhdHNXaXRoIH0gZnJvbSAnLi9kcm9wUmVwZWF0c1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BXaGlsZSB9IGZyb20gJy4vZHJvcFdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlaXRoZXIgfSBmcm9tICcuL2VpdGhlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZW5kc1dpdGggfSBmcm9tICcuL2VuZHNXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlcUJ5IH0gZnJvbSAnLi9lcUJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlcVByb3BzIH0gZnJvbSAnLi9lcVByb3BzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBldm9sdmUgfSBmcm9tICcuL2V2b2x2ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZCB9IGZyb20gJy4vZmluZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZExhc3QgfSBmcm9tICcuL2ZpbmRMYXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kTGFzdEluZGV4IH0gZnJvbSAnLi9maW5kTGFzdEluZGV4J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGF0dGVuIH0gZnJvbSAnLi9mbGF0dGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGlwIH0gZnJvbSAnLi9mbGlwJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JFYWNoIH0gZnJvbSAnLi9mb3JFYWNoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JFYWNoT2JqSW5kZXhlZCB9IGZyb20gJy4vZm9yRWFjaE9iakluZGV4ZWQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZyb21QYWlycyB9IGZyb20gJy4vZnJvbVBhaXJzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cEJ5IH0gZnJvbSAnLi9ncm91cEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cFdpdGggfSBmcm9tICcuL2dyb3VwV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZ3QgfSBmcm9tICcuL2d0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBndGUgfSBmcm9tICcuL2d0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzUGF0aCB9IGZyb20gJy4vaGFzUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaGVhZCB9IGZyb20gJy4vaGVhZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaWZFbHNlIH0gZnJvbSAnLi9pZkVsc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluYyB9IGZyb20gJy4vaW5jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmNsdWRlcyB9IGZyb20gJy4vaW5jbHVkZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluZGV4QnkgfSBmcm9tICcuL2luZGV4QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluZGV4T2YgfSBmcm9tICcuL2luZGV4T2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluaXQgfSBmcm9tICcuL2luaXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGlubmVySm9pbiB9IGZyb20gJy4vaW5uZXJKb2luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnNlcnQgfSBmcm9tICcuL2luc2VydCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5zZXJ0QWxsIH0gZnJvbSAnLi9pbnNlcnRBbGwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludGVyc2VjdGlvbiB9IGZyb20gJy4vaW50ZXJzZWN0aW9uJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnRlcnNwZXJzZSB9IGZyb20gJy4vaW50ZXJzcGVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludG8gfSBmcm9tICcuL2ludG8nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludmVydCB9IGZyb20gJy4vaW52ZXJ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZlcnRPYmogfSBmcm9tICcuL2ludmVydE9iaidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW52b2tlciB9IGZyb20gJy4vaW52b2tlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgam9pbiB9IGZyb20gJy4vam9pbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMganV4dCB9IGZyb20gJy4vanV4dCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGFzdEluZGV4T2YgfSBmcm9tICcuL2xhc3RJbmRleE9mJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5ndGggfSBmcm9tICcuL2xlbmd0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVucyB9IGZyb20gJy4vbGVucydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc0luZGV4IH0gZnJvbSAnLi9sZW5zSW5kZXgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbnNQYXRoIH0gZnJvbSAnLi9sZW5zUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc1Byb3AgfSBmcm9tICcuL2xlbnNQcm9wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWZ0TiB9IGZyb20gJy4vbGlmdE4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGx0IH0gZnJvbSAnLi9sdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbHRlIH0gZnJvbSAnLi9sdGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hcEFjY3VtIH0gZnJvbSAnLi9tYXBBY2N1bSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwQWNjdW1SaWdodCB9IGZyb20gJy4vbWFwQWNjdW1SaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwT2JqSW5kZXhlZCB9IGZyb20gJy4vbWFwT2JqSW5kZXhlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWF0Y2ggfSBmcm9tICcuL21hdGNoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXRoTW9kIH0gZnJvbSAnLi9tYXRoTW9kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXhCeSB9IGZyb20gJy4vbWF4QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lYW4gfSBmcm9tICcuL21lYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lZGlhbiB9IGZyb20gJy4vbWVkaWFuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZW1vaXplV2l0aCB9IGZyb20gJy4vbWVtb2l6ZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlQWxsIH0gZnJvbSAnLi9tZXJnZUFsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwTGVmdCB9IGZyb20gJy4vbWVyZ2VEZWVwTGVmdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwUmlnaHQgfSBmcm9tICcuL21lcmdlRGVlcFJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBXaXRoIH0gZnJvbSAnLi9tZXJnZURlZXBXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBXaXRoS2V5IH0gZnJvbSAnLi9tZXJnZURlZXBXaXRoS2V5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZUxlZnQgfSBmcm9tICcuL21lcmdlTGVmdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VSaWdodCB9IGZyb20gJy4vbWVyZ2VSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VXaXRoIH0gZnJvbSAnLi9tZXJnZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlV2l0aEtleSB9IGZyb20gJy4vbWVyZ2VXaXRoS2V5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtaW4gfSBmcm9tICcuL21pbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWluQnkgfSBmcm9tICcuL21pbkJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtb2R1bG8gfSBmcm9tICcuL21vZHVsbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbW92ZSB9IGZyb20gJy4vbW92ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbkFyeSB9IGZyb20gJy4vbkFyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbmVnYXRlIH0gZnJvbSAnLi9uZWdhdGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG5vbmUgfSBmcm9tICcuL25vbmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG50aCB9IGZyb20gJy4vbnRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBudGhBcmcgfSBmcm9tICcuL250aEFyZydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbyB9IGZyb20gJy4vbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb2JqT2YgfSBmcm9tICcuL29iak9mJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvZiB9IGZyb20gJy4vb2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG9uY2UgfSBmcm9tICcuL29uY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG90aGVyd2lzZSB9IGZyb20gJy4vb3RoZXJ3aXNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvdmVyIH0gZnJvbSAnLi9vdmVyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYWlyIH0gZnJvbSAnLi9wYWlyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aWFsIH0gZnJvbSAnLi9wYXJ0aWFsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aWFsUmlnaHQgfSBmcm9tICcuL3BhcnRpYWxSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGFydGl0aW9uIH0gZnJvbSAnLi9wYXJ0aXRpb24nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhFcSB9IGZyb20gJy4vcGF0aEVxJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoT3IgfSBmcm9tICcuL3BhdGhPcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aFNhdGlzZmllcyB9IGZyb20gJy4vcGF0aFNhdGlzZmllcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlja0FsbCB9IGZyb20gJy4vcGlja0FsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlja0J5IH0gZnJvbSAnLi9waWNrQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGUgfSBmcm9tICcuL3BpcGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGVLIH0gZnJvbSAnLi9waXBlSydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZVAgfSBmcm9tICcuL3BpcGVQJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlV2l0aCB9IGZyb20gJy4vcGlwZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBsdWNrIH0gZnJvbSAnLi9wbHVjaydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJlcGVuZCB9IGZyb20gJy4vcHJlcGVuZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvZHVjdCB9IGZyb20gJy4vcHJvZHVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvamVjdCB9IGZyb20gJy4vcHJvamVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcEVxIH0gZnJvbSAnLi9wcm9wRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BJcyB9IGZyb20gJy4vcHJvcElzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wT3IgfSBmcm9tICcuL3Byb3BPcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcHMgfSBmcm9tICcuL3Byb3BzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wU2F0aXNmaWVzIH0gZnJvbSAnLi9wcm9wU2F0aXNmaWVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByYW5nZSB9IGZyb20gJy4vcmFuZ2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZSB9IGZyb20gJy4vcmVkdWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VCeSB9IGZyb20gJy4vcmVkdWNlQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZWQgfSBmcm9tICcuL3JlZHVjZWQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZVJpZ2h0IH0gZnJvbSAnLi9yZWR1Y2VSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlV2hpbGUgfSBmcm9tICcuL3JlZHVjZVdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWplY3QgfSBmcm9tICcuL3JlamVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVtb3ZlIH0gZnJvbSAnLi9yZW1vdmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlcGVhdCB9IGZyb20gJy4vcmVwZWF0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZXBsYWNlIH0gZnJvbSAnLi9yZXBsYWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZXZlcnNlIH0gZnJvbSAnLi9yZXZlcnNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzY2FuIH0gZnJvbSAnLi9zY2FuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzZXF1ZW5jZSB9IGZyb20gJy4vc2VxdWVuY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNldCB9IGZyb20gJy4vc2V0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzbGljZSB9IGZyb20gJy4vc2xpY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnQgfSBmcm9tICcuL3NvcnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnRCeSB9IGZyb20gJy4vc29ydEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzb3J0V2l0aCB9IGZyb20gJy4vc29ydFdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNwbGl0IH0gZnJvbSAnLi9zcGxpdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRBdCB9IGZyb20gJy4vc3BsaXRBdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRFdmVyeSB9IGZyb20gJy4vc3BsaXRFdmVyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRXaGVuIH0gZnJvbSAnLi9zcGxpdFdoZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHN0YXJ0c1dpdGggfSBmcm9tICcuL3N0YXJ0c1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHN1YnRyYWN0IH0gZnJvbSAnLi9zdWJ0cmFjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3ltbWV0cmljRGlmZmVyZW5jZSB9IGZyb20gJy4vc3ltbWV0cmljRGlmZmVyZW5jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3ltbWV0cmljRGlmZmVyZW5jZVdpdGggfSBmcm9tICcuL3N5bW1ldHJpY0RpZmZlcmVuY2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWlsIH0gZnJvbSAnLi90YWlsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWtlIH0gZnJvbSAnLi90YWtlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWtlTGFzdCB9IGZyb20gJy4vdGFrZUxhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VMYXN0V2hpbGUgfSBmcm9tICcuL3Rha2VMYXN0V2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VXaGlsZSB9IGZyb20gJy4vdGFrZVdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YXAgfSBmcm9tICcuL3RhcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGVzdCB9IGZyb20gJy4vdGVzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGhlbiB9IGZyb20gJy4vdGhlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGh1bmtpZnkgfSBmcm9tICcuL3RodW5raWZ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aW1lcyB9IGZyb20gJy4vdGltZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvTG93ZXIgfSBmcm9tICcuL3RvTG93ZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvUGFpcnMgfSBmcm9tICcuL3RvUGFpcnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvUGFpcnNJbiB9IGZyb20gJy4vdG9QYWlyc0luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1N0cmluZyB9IGZyb20gJy4vdG9TdHJpbmcnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvVXBwZXIgfSBmcm9tICcuL3RvVXBwZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyYW5zZHVjZSB9IGZyb20gJy4vdHJhbnNkdWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmFuc3Bvc2UgfSBmcm9tICcuL3RyYW5zcG9zZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhdmVyc2UgfSBmcm9tICcuL3RyYXZlcnNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmltIH0gZnJvbSAnLi90cmltJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cnlDYXRjaCB9IGZyb20gJy4vdHJ5Q2F0Y2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuYXBwbHkgfSBmcm9tICcuL3VuYXBwbHknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuYXJ5IH0gZnJvbSAnLi91bmFyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5jdXJyeU4gfSBmcm9tICcuL3VuY3VycnlOJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmZvbGQgfSBmcm9tICcuL3VuZm9sZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb25XaXRoIH0gZnJvbSAnLi91bmlvbldpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXEgfSBmcm9tICcuL3VuaXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXFCeSB9IGZyb20gJy4vdW5pcUJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlxV2l0aCB9IGZyb20gJy4vdW5pcVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVubGVzcyB9IGZyb20gJy4vdW5sZXNzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bm5lc3QgfSBmcm9tICcuL3VubmVzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW50aWwgfSBmcm9tICcuL3VudGlsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1cGRhdGUgfSBmcm9tICcuL3VwZGF0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdXNlV2l0aCB9IGZyb20gJy4vdXNlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsdWVzSW4gfSBmcm9tICcuL3ZhbHVlc0luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB2aWV3IH0gZnJvbSAnLi92aWV3J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB3aGVuIH0gZnJvbSAnLi93aGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB3aGVyZSB9IGZyb20gJy4vd2hlcmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZXJlRXEgfSBmcm9tICcuL3doZXJlRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdpdGhvdXQgfSBmcm9tICcuL3dpdGhvdXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHhwcm9kIH0gZnJvbSAnLi94cHJvZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgemlwT2JqIH0gZnJvbSAnLi96aXBPYmonXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkZCB9IGZyb20gJy4vbnVtYmVyL2FkZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkSW5kZXggfSBmcm9tICcuL2FkZEluZGV4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGp1c3QgfSBmcm9tICcuL2FkanVzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRqdXN0V2l0aCB9IGZyb20gJy4vYWRqdXN0V2l0aCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWxsIH0gZnJvbSAnLi9hbGwnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFsbFBhc3MgfSBmcm9tICcuL2FsbFBhc3MnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFsd2F5cyB9IGZyb20gJy4vYWx3YXlzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbmQgfSBmcm9tICcuL2FuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW55IH0gZnJvbSAnLi9hbnknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFueVBhc3MgfSBmcm9tICcuL2FueVBhc3MnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwIH0gZnJvbSAnLi9hcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwZW5kIH0gZnJvbSAnLi9hcHBlbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5IH0gZnJvbSAnLi9hcHBseSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYmluYXJ5IH0gZnJvbSAnLi9iaW5hcnknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGJpbmQgfSBmcm9tICcuL2JpbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGJvdGggfSBmcm9tICcuL2Jvb2xlYW4vYm90aCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2FsbCB9IGZyb20gJy4vY2FsbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcGxlbWVudCB9IGZyb20gJy4vY29tcGxlbWVudCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZSB9IGZyb20gJy4vY29tcG9zZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbmQgfSBmcm9tICcuL2NvbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGN1cnJ5IH0gZnJvbSAnLi9jdXJyeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVmYXVsdFRvIH0gZnJvbSAnLi9kZWZhdWx0VG8nXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZEYXRlIH0gZnJvbSAnLi9kYXRlL2RpZmZEYXRlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXZpZGUgfSBmcm9tICcuL251bWJlci9kaXZpZGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGVtcHR5IH0gZnJvbSAnLi9lbXB0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXF1YWxzIH0gZnJvbSAnLi9lcXVhbHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGV4aXN0cyB9IGZyb20gJy4vZXhpc3RzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGIH0gZnJvbSAnLi9ib29sZWFuL0YnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbHRlciB9IGZyb20gJy4vZmlsdGVyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kSW5kZXggfSBmcm9tICcuL2ZpbmRJbmRleCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmlyc3QgfSBmcm9tICcuL2ZpcnN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGF0TWFwIH0gZnJvbSAnLi9mbGF0TWFwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb2xkIH0gZnJvbSAnLi9mb2xkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JtYXRTdHJpbmcgfSBmcm9tICcuL3N0cmluZy9mb3JtYXRTdHJpbmcnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGhhcyB9IGZyb20gJy4vb2JqZWN0L2hhcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzSW4gfSBmcm9tICcuL29iamVjdC9oYXNJbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWRlbnRpY2FsIH0gZnJvbSAnLi9pZGVudGljYWwnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlkZW50aXR5IH0gZnJvbSAnLi9pZGVudGl0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXMgfSBmcm9tICcuL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0FycmF5IH0gZnJvbSAnLi9hcnJheS9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNCb29sZWFuIH0gZnJvbSAnLi9ib29sZWFuL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0RhdGUgfSBmcm9tICcuL2RhdGUvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRW1wdHkgfSBmcm9tICcuL2lzRW1wdHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRnV0dXJlRGF0ZSB9IGZyb20gJy4vZGF0ZS9pc0Z1dHVyZURhdGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTWFwIH0gZnJvbSAnLi9tYXAvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTmFuIH0gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTnVsbCB9IGZyb20gJy4vbnVsbC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdW1iZXIgfSBmcm9tICcuL251bWJlci9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNPYmplY3QgfSBmcm9tICcuL29iamVjdC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNTZXQgfSBmcm9tICcuL3NldC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNTdHJpbmcgfSBmcm9tICcuL3N0cmluZy9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNVbmRlZmluZWQgfSBmcm9tICcuL3VuZGVmaW5lZC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNWYWxpZERhdGUgfSBmcm9tICcuL2RhdGUvaXNWYWxpZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSnVzdCB9IGZyb20gJy4vbW9uYWRzL0p1c3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGtleXMgfSBmcm9tICcuL2tleXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGtleXNJbiB9IGZyb20gJy4vb2JqZWN0L2tleXNJbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGFzdCB9IGZyb20gJy4vbGFzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGlmdCB9IGZyb20gJy4vbGlmdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwIH0gZnJvbSAnLi9tYXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG1heCB9IGZyb20gJy4vbWF4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXliZSB9IGZyb20gJy4vbW9uYWRzL01heWJlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZSB9IGZyb20gJy4vb2JqZWN0L21lcmdlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtdWx0aXBseSB9IGZyb20gJy4vbnVtYmVyL211bHRpcGx5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBub3QgfSBmcm9tICcuL25vdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTm90aGluZyB9IGZyb20gJy4vbW9uYWRzL05vdGhpbmcnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG9taXQgfSBmcm9tICcuL29iamVjdC9vbWl0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBvciB9IGZyb20gJy4vb3InXG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhdGggfSBmcm9tICcuL29iamVjdC9wYXRoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrIH0gZnJvbSAnLi9vYmplY3QvcGljaydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcCB9IGZyb20gJy4vb2JqZWN0L3Byb3AnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHN1bSB9IGZyb20gJy4vbnVtYmVyL3N1bSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVCB9IGZyb20gJy4vYm9vbGVhbi9UJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0RheSB9IGZyb20gJy4vZGF0ZS90b0RheSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9Ib3VyIH0gZnJvbSAnLi9kYXRlL3RvSG91cidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9NaW51dGVzIH0gZnJvbSAnLi9kYXRlL3RvTWludXRlcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9TZWNvbmRzIH0gZnJvbSAnLi9kYXRlL3RvU2Vjb25kcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHJ1dGh5IH0gZnJvbSAnLi90cnV0aHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIHR5cGUgfSBmcm9tICcuL3R5cGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHVuaW9uIH0gZnJvbSAnLi9hcnJheS91bmlvbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsdWVzIH0gZnJvbSAnLi9vYmplY3QvdmFsdWVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXAgfSBmcm9tICcuL3ppcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgemlwV2l0aCB9IGZyb20gJy4vemlwV2l0aCdcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGlzXG4gKiBAZGVzY3JpcHRpb24gVmVyaWZpZXMgdGhlIHR5cGUgb2YgdGhlIHByb3ZpZGVkIGFyZ3VtZW50XG4gKlxuICovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBpcyAoQ3RvciwgdmFsKSB7XG4gIHJldHVybiB0eXBlKHZhbCkgPT09IEN0b3Jcbn0pXG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZW1wdHkgZXF1aXZhbGVudCBvZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqL1xuaW1wb3J0IGVtcHR5IGZyb20gJy4vZW1wdHknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuaW1wb3J0IGVxdWFscyBmcm9tICcuL2VxdWFscydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNFbXB0eSAoeCkge1xuICByZXR1cm4gZXhpc3RzKHgpICYmIGVxdWFscyh4LCBlbXB0eSh4KSlcbn07XG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcbmNvbnN0IGlzRnVuY3Rpb24gPSBpcygnRnVuY3Rpb24nKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0l0ZXIgKGl0ZXIpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oaXRlcltTeW1ib2wuaXRlcmF0b3JdKVxufVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gSXRlcmF0b3IgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuM1xuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmF0b3J9IGFcbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNhbGxiYWNrLCBpdGVyYXRvcikge1xuICBsZXQgciA9IFtdXG4gIGZvciAobGV0IG5leHRWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKTsgbmV4dFZhbHVlLmRvbmUgIT09IHRydWU7IG5leHRWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKSkge1xuICAgIHIucHVzaChjYWxsYmFjayhpdGVyYXRvci52YWx1ZSgpKSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUga2V5cyBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0IG9yIGl0ZXJhdG9yXG4gKlxuICogQGZ1bmN0aW9uIGtleXNcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBwcm92aWRlZCBvYmplY3Qgb3IgaXRlcmF0b3JcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgb2JqIC0+IFsqXVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIE9iaiBmcm9tIHpoaWNoIHRvIHRha2UgdGhlIGtleXNcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgb2JqZWN0S2V5cyBmcm9tICcuL29iamVjdC9rZXlzJ1xuaW1wb3J0IG1hcEtleXMgZnJvbSAnLi9tYXAva2V5cydcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChvYmopIHtcbiAgc3dpdGNoICh0eXBlKG9iaikpIHtcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcEtleXMob2JqKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gb2JqZWN0S2V5cyhvYmopXG4gIH1cbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBsYXN0XG4gKiBAcGFyYW0gW2FdXG4gKiBAcmV0dXJuIGEgfCB1bmRlZmluZWRcbiAqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIGxhc3QgKGEpIHtcbiAgcmV0dXJuIGEgJiYgYS5sZW5ndGggPyBhW2EubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWRcbn0pXG4iLCIvKipcbiAqIFwibGlmdHNcIiBhIGZ1bmN0aW9uIG9mIGFyaXR5ID4gMSBzbyB0aGF0IGl0IG1heSBcIm1hcCBvdmVyXCIgYSBsaXN0LCBGdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBsaWZ0XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnICgqLi4uIC0+ICopIC0+IChbKl0uLi4gLT4gWypdKVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi9mb2xkJ1xuaW1wb3J0IGFwIGZyb20gJy4vYXAnXG5pbXBvcnQgbWFwIGZyb20gJy4vbWFwJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBsaWZ0IChmbikge1xuICBjb25zdCBsaWZ0ZWQgPSBjdXJyeTEoY3VycnkoZm4pKVxuICByZXR1cm4gY3VycnkoZnVuY3Rpb24gX2xpZnQgKCkge1xuICAgIHJldHVybiBmb2xkKGFwLCBtYXAobGlmdGVkLCBhcmd1bWVudHNbMF0pLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxuICB9KVxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIGl0ZXJhYmxlIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gd2hpY2ggbWFwcyBvdmVyIGFuIGl0ZXJhYmxlLlxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4gYiAtPiBiXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL2FycmF5L21hcCdcbmltcG9ydCBvYmplY3RNYXAgZnJvbSAnLi9vYmplY3QvbWFwJ1xuaW1wb3J0IG1hcE1hcCBmcm9tICcuL21hcC9tYXAnXG5pbXBvcnQgc3RyaW5nTWFwIGZyb20gJy4vc3RyaW5nL21hcCdcbmltcG9ydCBpdGVyYXRvck1hcCBmcm9tICcuL2l0ZXJhdG9yL21hcCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBpc0l0ZXJhdG9yIGZyb20gJy4vaXRlcmF0b3IvaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgY2FzZSAnRnVuY3Rpb24nOlxuICAgICAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKVxuICAgICAgfSlcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdE1hcChjYiwgYSlcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIHN0cmluZ01hcChjYiwgYSlcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcE1hcChjYiwgYSlcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gYXJyYXlNYXAoY2IsIGEpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpc0l0ZXJhdG9yKGEpXG4gICAgICAgID8gaXRlcmF0b3JNYXAoY2IsIGEpXG4gICAgICAgIDogYXJyYXlNYXAoY2IsIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBtYXBGaWx0ZXJcbiAqIEBwcml2YXRlXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcEZpbHRlciAoZm4sIG0pIHtcbiAgbGV0IHIgPSBuZXcgTWFwKClcblxuICBsZXQgaXQgPSBtLmVudHJpZXMoKVxuICBsZXQgcmVzdWx0ID0gaXQubmV4dCgpXG5cbiAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgIGNvbnN0IGsgPSByZXN1bHQudmFsdWVbMF1cbiAgICBjb25zdCB2ID0gcmVzdWx0LnZhbHVlWzFdXG4gICAgaWYgKGZuKGssIHYpKSByLnNldChrLCB2KVxuICAgIHJlc3VsdCA9IGl0Lm5leHQoKVxuICB9XG5cbiAgLy8gTGltaXRlZCBicm93c2VyIHN1cHBvcnRcbiAgLy8gbS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gIC8vICAgaWYgKGZuKGssIHYpKSByLnNldChrLCB2KVxuICAvLyB9KVxuXG4gIC8vIGJhYmVsIHRyYW5zcGlsZSBpc3N1ZXNcbiAgLy8gZm9yIChjb25zdCBbaywgdl0gb2YgbS5lbnRyaWVzKCkpIHtcbiAgLy9cbiAgLy8gfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnTWFwJylcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duIGtleXMgb2YgYW4gTWFwIGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIHJldHVybiBhLmtleXMoKVxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGEgTWFwIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge01hcH0gYVxuICogQHJldHVybiB7TWFwfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICBhLmZvckVhY2goKHYsIGssIG1hcCkgPT4ge1xuICAgIHIuc2V0KGssIGNiKHYsIGssIG1hcCkpXG4gIH0pXG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXJnZXN0IG9mIHRoZSAyIGFyZ3VtZW50cyBwcm92aWRlZFxuICpcbiAqIEBmdW5jdGlvbiBtYXhcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHsqfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1heCAoYSwgYikge1xuICByZXR1cm4gYiA+IGEgPyBiIDogYVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIEp1c3RcbiAqIEBwYXJhbSB2YWxcbiAqIEByZXR1cm5zIHtKdXN0fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmxldCBKdXN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICB0aGlzLl92YWx1ZSA9IHZhbFxuICByZXR1cm4gdGhpc1xufVxuXG5KdXN0LnByb3RvdHlwZS5pc0p1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlXG59XG5KdXN0LnByb3RvdHlwZS5pc05vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZGVmYXVsdCBKdXN0XG4iLCJpbXBvcnQgSnVzdCBmcm9tICcuL0p1c3QnXG5pbXBvcnQgTm90aGluZyBmcm9tICcuL05vdGhpbmcnXG5cbi8qKlxuICogQGZ1bmN0aW9uIE1heWJlXG4gKiBAcGFyYW0gdmFsXG4gKiBAY29uc3RydWN0b3JcbiAqL1xubGV0IE1heWJlID0gZnVuY3Rpb24gKHZhbCkge1xuICB0aGlzLl9fdmFsdWUgPSB2YWxcbn1cblxuTWF5YmUub2YgPSBmdW5jdGlvbiAodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBNYXliZSkgcmV0dXJuIHZhbFxuICBpZiAodGhpcyBpbnN0YW5jZW9mIE1heWJlKSB7XG4gICAgdGhpcy5fX3ZhbHVlID0gdmFsXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuICByZXR1cm4gbmV3IE1heWJlKHZhbClcbn1cblxuTWF5YmUucHJvdG90eXBlLmdldE9yRWxzZSA9IGZ1bmN0aW9uIChuKSB7XG4gIHJldHVybiB0aGlzLmlzTm90aGluZygpID8gbiA6IHRoaXMuX192YWx1ZVxufVxuXG5NYXliZS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gKGYpIHtcbiAgaWYgKHRoaXMuaXNOb3RoaW5nKCkpIHtcbiAgICByZXR1cm4gTWF5YmUub2YobnVsbClcbiAgfVxuICByZXR1cm4gTWF5YmUub2YoZih0aGlzLl9fdmFsdWUpKVxufVxuXG5NYXliZS5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbiAobSkge1xuICByZXR1cm4gbS5tYXAodGhpcy5fX3ZhbHVlKVxufVxuXG5NYXliZS5wcm90b3R5cGUuaXNOb3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKHRoaXMuX192YWx1ZSA9PSBudWxsKVxufVxuXG5NYXliZS5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIXRoaXMuaXNOb3RoaW5nKClcbn1cblxuTWF5YmUucHJvdG90eXBlLk5vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgTm90aGluZygpXG59XG5cbk1heWJlLnByb3RvdHlwZS5KdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IEp1c3QodGhpcy5fdmFsdWUpXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1heWJlXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBOb3RoaW5nXG4gKiBAY29uc3RydWN0b3JcbiAqL1xubGV0IE5vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG59XG5cbk5vdGhpbmcucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlXG59XG5Ob3RoaW5nLnByb3RvdHlwZS5pc05vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IE5vdGhpbmdcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG5vdFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbm90ICh4KSB7XG4gIHJldHVybiAheFxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDMvMDIvMjAxOVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdudWxsJylcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSAyIGFyZ3VtZW50c1xuICpcbiAqIEBmdW5jdGlvbiBhZGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIDIgYXJndW1lbnRzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRkIChhLCBiKSB7XG4gIHJldHVybiArYSArICtiXG59KVxuIiwiLyoqXG4gKlxuICpcbiAqIEBmdW5jdGlvbiBkaXZpZGVcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkaXZpc2lvbiBvZiB0aGUgMiBhcmd1bWVudHNcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBkaXZpZGUgKGEsIGIpIHtcbiAgcmV0dXJuICthIC8gK2Jcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ051bWJlcicpXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc05hTlxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBudW1iZXIgaXMgTkFOXG5cbiAqL1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vaXMnXG5pbXBvcnQgYW5kIGZyb20gJy4uL2FuZCdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNOYW4gKHgpIHtcbiAgcmV0dXJuIGFuZChpc051bWJlcih4KSwgaXNOYU4oeCkpXG59O1xuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSAyIGFyZ3VtZW50c1xuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAqIEBwYXJhbSB7TnVtYmVyfSBiXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG11bHRpcGx5IChhLCBiKSB7XG4gIHJldHVybiArYSAqICtiXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIG51bWJlcnMgaW4gYW4gYXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgW051bWJlcl0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgYWRkIGZyb20gJy4vYWRkJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi4vZm9sZCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gc3VtIChhKSB7XG4gIHJldHVybiBmb2xkKGFkZCwgMCwgYSlcbn0pXG4iLCIvKipcblxuICogZXF1YWxzXG4gKiBjaGVja3MgZm9yIGVxdWFsaXR5XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBleGlzdHMgZnJvbSAnLi4vZXhpc3RzJ1xuaW1wb3J0IG5vdCBmcm9tICcuLi9ub3QnXG5pbXBvcnQgZXF1YWxzIGZyb20gJy4uL2VxdWFscydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoKHgsIHkpID0+IHtcbiAgZm9yIChsZXQga2V5WCBpbiB4KSB7XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5maWx0ZXJlZEZvckluTG9vcFxuICAgIGlmIChub3QoZXF1YWxzKHhba2V5WF0sIHlba2V5WF0pKSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGxldCBrZXlZIGluIHkpIHtcbiAgICBpZiAobm90KGV4aXN0cyh4W2tleVldKSkgJiYgZXhpc3RzKHlba2V5WV0pKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gb2JqZWN0RmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBvYmplY3RGaWx0ZXIgKGZuLCBvKSB7XG4gIGxldCByID0ge31cbiAgY29uc3QgayA9IGtleXMobylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZuKG9ba1tpXV0pKSByW2tbaV1dID0gb1trW2ldXVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIG8pIHtcbiAgY29uc3QgayA9IGtleXMobylcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gay5sZW5ndGhcbiAgbGV0IHIgPSBPYmplY3QoaW5pdClcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByID0gY2Iociwgb1trW2ldXSwga1tpXSwgbylcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFuIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIHtTdHJpbmd9IC0+IHtPYmplY3R9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBoYXMgKHByb3AsIG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcClcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbiBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eSwgZXZlbiBpZiBpdCBpcyBpbmhlcml0ZWRcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcge1N0cmluZ30gLT4ge09iamVjdH0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGhhc0luIChwcm9wLCBvYmopIHtcbiAgcmV0dXJuIHByb3AgaW4gb2JqXG59KVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnT2JqZWN0JylcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duIGtleXMgb2YgYW4gb2JqZWN0IGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhPYmplY3QoYSkpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIGFsbCB0aGUga2V5cyBvZiBhbiBvYmplY3QgYXMgYW4gQXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBbYl1cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQHJldHVybiB7QXJyYXl9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGtleXMgKGEpIHtcbiAgY29uc3QgciA9IFtdXG4gIGZvciAoY29uc3QgayBpbiBhKSB7XG4gICAgci5wdXNoKGspXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBvYmplY3QgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7T2JqZWN0fSBhXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi4vZW1wdHknXG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgY29uc3QgayA9IGtleXMoYSlcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gay5sZW5ndGhcbiAgY29uc3QgciA9IGVtcHR5KGEpXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgcltrW2ldXSA9IGNiKGFba1tpXV0sIGtbaV0sIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcblxuICogZXF1YWxzXG4gKiBjaGVja3MgZm9yIGVxdWFsaXR5XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBpZGVudGljYWwgZnJvbSAnLi4vaWRlbnRpY2FsJ1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4uL29iamVjdC9pcydcbmltcG9ydCBpc0FycmF5IGZyb20gJy4uL2FycmF5L2lzJ1xuaW1wb3J0IHVuaW9uIGZyb20gJy4uL2FycmF5L3VuaW9uJ1xuXG5jb25zdCBtZXJnZSA9IGN1cnJ5KChvYmpMLCBvYmpSKSA9PiB7XG4gIGxldCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBvYmpMKVxuXG4gIGlmIChpZGVudGljYWwob2JqTCwgb2JqUikpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb2JqTClcbiAgfVxuICBmb3IgKGxldCBrZXkgaW4gb2JqUikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9ialIsIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IG9sZFZhbHVlID0gb2JqUltrZXldXG4gICAgY29uc3QgbmV3VmFsdWUgPSBvYmpMW2tleV1cblxuICAgIGlmIChpc09iamVjdChvbGRWYWx1ZSkgJiYgaXNPYmplY3QobmV3VmFsdWUpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkobmV3VmFsdWUpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHVuaW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBvbGRWYWx1ZSAvLyBUT0RPOiB0aGlzIGlzIGEgcmVmZXJlbmNlLCBzaG91bGQgYmUgY2xvbmVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufSlcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgob2JqLCBuYW1lcykgPT4ge1xuICBsZXQgcmVzdWx0ID0ge31cblxuICBPYmplY3Qua2V5cyhvYmopLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgcmV0dXJuIG5hbWVzLmluZGV4T2Yoa2V5KSA9PT0gLTFcbiAgfSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcGF0aFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHBhdGggKHBhdGgsIG9iaikge1xuICBsZXQgdmFsID0gb2JqXG4gIGxldCBpZHggPSAwXG4gIGxldCBwXG4gIHdoaWxlIChpZHggPCBwYXRoLmxlbmd0aCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHAgPSBwYXRoW2lkeF1cbiAgICB2YWwgPSBOdW1iZXIuaXNJbnRlZ2VyKHApXG4gICAgICA/IHAgPCAwID8gdmFsW3ZhbC5sZW5ndGggKyBwXSA6IHZhbFtwXVxuICAgICAgOiB2YWxbcF1cbiAgICBpZHggKz0gMVxuICB9XG4gIHJldHVybiB2YWxcbn0pXG4vLyBsZXQgciA9IG9ialxuLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4vLyAgIGlmIChyID09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbi8vICAgciA9IHJbcGF0aFtpXV1cbi8vIH1cbi8vIHJldHVybiByXG4vLyB9KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcGlja1xuICogQGRlc2NyaXB0aW9uIHJldHVybnMgYSBuZXcgYmplY3Qgd2l0aCBvbmx5IHRoZSBwcm9wcyB0aGF0IGFyZSBwcm92aWRlZFxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgLSBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lc1xuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byB0YWtlIHRoZSBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gcGljayAocHJvcHMsIG9iaikge1xuICBjb25zdCByID0ge31cbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgcHJvcHMubGVuZ3RoKSB7XG4gICAgaWYgKHByb3BzW2ldIGluIG9iaikge1xuICAgICAgcltwcm9wc1tpXV0gPSBvYmpbcHJvcHNbaV1dXG4gICAgfVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcHJvcFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHByb3AgKHAsIG9iaikge1xuICByZXR1cm4gb2JqW3BdXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdmFsdWVzXG4gKiBAZGVzY3JpcHRpb24gUkV0dXJucyBhIGxpc3Qgb2YgdmFsdWVzIHRha2VuIGZyb20gYW4gb2JqZWN0cyBvd24gcHJvcGVydGllc1xuICogQHBhcmFtIHtvYmplY3R9IC0gb2JqIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byB0YWtlIHRoZSB2YWx1ZXNcbiAqIEByZXR1cm4ge2FycmF5fVxuICpcbiAqKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdmFsdWVzIChvYmopIHtcbiAgY29uc3QgayA9IGtleXMob2JqKVxuICBjb25zdCBsID0gay5sZW5ndGhcbiAgY29uc3QgciA9IFtdXG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IGwpIHtcbiAgICByW2ldID0gb2JqW2tbaV1dXG4gICAgaSArPSAxXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBvclxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBvbmUgb3IgdGhlIG90aGVyIGlzIHRydWVcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG9yICh4LCB5KSB7XG4gIHJldHVybiB4IHx8IHlcbn0pXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ1NldCcpXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gc3RyaW5nQ29uY2F0XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7IC8vIHVzZSBmdW5jdGlvbigpLCBhcnJvdyBmdW5jdGlvbiBkb2Vzbid0IGJpbmQgYXJndW1lbnRzXG4gIHJldHVybiBTdHJpbmcoYSkgKyBTdHJpbmcoYilcbn1cbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cbiAqL1xuaW1wb3J0IHRvQXJyYXkgZnJvbSAnLi4vYXJyYXkvdG8nXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0U3RyaW5nIChzdHIpIHsgLy8gdXNlIGZ1bmN0aW9uKCksIGFycm93IGZ1bmN0aW9uIGRvZXNuJ3QgYmluZCBhcmd1bWVudHNcbiAgbGV0IGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cylcblxuICBhcmdzLnNoaWZ0KClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC97KFxcZCspfS9nLCAobWF0Y2gsIGlkeCkgPT4ge1xuICAgIHJldHVybiBub3QoaXMoJ1VuZGVmaW5lZCcsIGFyZ3NbaWR4XSkpID8gYXJnc1tpZHhdIDogbWF0Y2hcbiAgfSlcbn1cbiIsIi8qKlxuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ1N0cmluZycpXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhIHN0cmluZyBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSAnJ1xuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgKz0gY2IoYS5jaGFyQXQoaSksIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiB0cnV0aHlcbiAqL1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuL2V4aXN0cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJ1dGh5ICh4KSB7XG4gIHJldHVybiAoeCAhPT0gZmFsc2UpICYmIGV4aXN0cyh4KVxufTtcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHR5cGVcbiAqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIHR5cGUgKHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KS5zbGljZSg4LCAtMSlcbn0pXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAzLzAyLzIwMTlcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygndW5kZWZpbmVkJylcbiIsIi8qKlxuXG4gKiB6aXBcbiAqXG4gKiBAZnVuY3Rpb24gemlwXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IHppcFdpdGggZnJvbSAnLi96aXBXaXRoJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB6aXAgKGEsIGIpIHtcbiAgcmV0dXJuIHppcFdpdGgoZnVuY3Rpb24gX3ppcFdpdGggKHgsIHkpIHsgcmV0dXJuIFt4LCB5XSB9LCBhLCBiKVxufSlcbiIsIi8qKlxuXG4gKiB6aXBXaXRoXG4gKlxuICogIEBmdW5jdGlvbiB6aXBXaXRoXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB6aXBXaXRoIChjYiwgYSwgYikge1xuICBjb25zdCBhcnIgPSBbXVxuICBjb25zdCBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpXG4gIGxldCBpID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIucHVzaChjYihhW2ldLCBiW2ldKSlcbiAgfVxuICByZXR1cm4gYXJyXG59KVxuIiwiaW1wb3J0IGN1cnJ5IGZyb20gJ2Z1bi5qcy9zcmMvY3VycnknXG5pbXBvcnQgbWFwIGZyb20gJ2Z1bi5qcy9zcmMvbWFwJ1xuaW1wb3J0IGZvbGQgZnJvbSAnZnVuLmpzL3NyYy9mb2xkJ1xuaW1wb3J0IGVxdWFscyBmcm9tICdmdW4uanMvc3JjL2VxdWFscydcbmltcG9ydCBjb25jYXQgZnJvbSAndXRpbC9jb25jYXQnXG5pbXBvcnQgZW1wdHkgZnJvbSAndXRpbC9lbXB0eSdcbmltcG9ydCBkb3QgZnJvbSAndXRpbC9kb3QnXG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAndXRpbC9pZGVudGl0eSdcbmltcG9ydCB0cmFuc3Bvc2UgZnJvbSAndXRpbC90cmFuc3Bvc2UnXG5pbXBvcnQgZ2VuZXJhdGUgZnJvbSAndXRpbC9nZW5lcmF0ZSdcbi8vIGltcG9ydCBncHVtYXAgZnJvbSAndXRpbC9ncHVtYXAnXG4vLyBpbXBvcnQgZ3B1Zm9sZCBmcm9tICd1dGlsL2dwdWZvbGQnXG4vLyBpbXBvcnQgZ3B1cHJvZHVjdCBmcm9tICd1dGlsL2dwdXByb2R1Y3QnXG5cbi8qKlxuICogQGNsYXNzIE1hdHJpeFxuICogQGNsYXNzZGVzYyBNYXRyaXggYXBwbGljYXRpdmUgcHJvdmlkaW5nIHN0YW5kYXJkIG1hdHJpeCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGUgTWF0cml4IGNsYXNzIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIHdpdGggdGhlIG5ldyBrZXl3b3JkLiBJbnN0ZWFkIHVzZSB0aGUgTWF0cml4Lm9mIHN5bnRheCB0byBjcmVhdGUgYSBuZXcgTWF0cml4LiBVbmZvcnR1bmF0bHkganNkb2NzIGRvZXMgbm90IGFsbG93IGZvciB0aGUgY29uc3RydWN0b3IgdG8gYmUgaGlkZGVuLlxuICogQGhpZGVjb250cnVjdG9yXG4gKiBAc2VlIG9mXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKlxuICovXG5sZXQgTWF0cml4ID0gZnVuY3Rpb24gKHZhbCkge1xuICB0aGlzLl9fdmFsdWUgPSB2YWxcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gb2ZcbiAqIEBkZXNjIENyZWF0ZXMgYSBNYXRyaXggb2JqZWN0IGFuZCBmbGF0dGVucyB0aGUgTWF0cml4XG4gKiBAcGFyYW0gdmFsIHthcnJheXxmdW5jdGlvbn0gQW4gYXJyYXkgb2YgYXJyYXlzXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICpcbiAqL1xuTWF0cml4Lm9mID0gZnVuY3Rpb24gKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgTWF0cml4KSByZXR1cm4gdmFsXG4gIGlmICh0aGlzIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgdGhpcy5fX3ZhbHVlID0gdmFsXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuICByZXR1cm4gbmV3IE1hdHJpeCh2YWwpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGVcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKiBtLnR5cGUgPT09ICdNYXRyaXgnXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudHlwZSA9ICdNYXRyaXgnXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHByZWNpc2lvblxuICogQHR5cGUge251bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0ucHJlY2lzaW9uID09PSA0XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUucHJlY2lzaW9uID0gNFxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBzZXRQcmVjaXNpb25cbiAqIEBwYXJhbSBwcmVjaXNpb24ge251bWJlcn0gU2V0IHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgZm9yIHJvdW5kaW5nXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKiBtLnNldFByZWNpc2lvbigxMClcbiAqIG0ucHJlY2lzaW9uID09PSAxMFxuICovXG5NYXRyaXgucHJvdG90eXBlLnNldFByZWNpc2lvbiA9IGZ1bmN0aW9uIChwcmVjaXNpb24pIHtcbiAgdGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb25cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNTeW1tZXRyaWNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiB0cnVlID09PSBBLmlzU3ltbWV0cmljKClcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNTeW1tZXRyaWMgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGEgPSB0aGlzLl9fdmFsdWVcbiAgY29uc3QgYiA9IE1hdHJpeC50cmFuc3Bvc2UodGhpcykuX192YWx1ZVxuICByZXR1cm4gZXF1YWxzKGEsIGIpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzU3F1YXJlXG4gKiBAZGVzYyBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGNvbnRhaW5zIGEgc3F1YXJlIE1hdHJpeFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIHRydWUgPT09IEEuaXNTcXVhcmUoKVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc1NxdWFyZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGVxdWFscyh0aGlzLmdldENvbHMoKSwgdGhpcy5nZXRSb3dzKCkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzT3J0aG9nb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBbWy0wLjMwOTIsIC0wLjk1MTBdLCBbLTAuOTUxMCwgMC4zMDkyXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXguZnJvbUFycmF5KHJlc3VsdClcbiAqIHRydWUgID09PSBBLmlzT3J0aG9nb25hbCgpXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNPcnRob2dvbmFsID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBBeEF0ID0gdGhpcy5kb3QodGhpcy50cmFuc3Bvc2UoKSlcbiAgY29uc3QgSSA9IHRoaXMuaWRlbnRpdHkoKVxuICByZXR1cm4gZXF1YWxzKEF4QXQsIEkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldENvbHNcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0Q29scygpICA9PT0gMlxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRDb2xzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlWzBdLmxlbmd0aFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBlcXVhbHNcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGEgPSBbWzEsIDFdLCBbMSwgMV1dXG4gKiB2YXIgQSA9IE1hdHJpeC5vZihhKVxuICogdmFyIEIgPSBNYXRyaXgub2YoYSlcbiAqIHRydWUgID09PSBBLmVxdWFscyhCKVxuICovXG5NYXRyaXgucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBlcXVhbHModGhpcy5fX3ZhbHVlLCBNLl9fdmFsdWUgfHwgTSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0Um93c1xuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRSb3dzKCkgIC8vIDJcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRSb3dzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlLmxlbmd0aFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRTaGFwZVxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldFNoYXBlKCkgIC8vIFsyLCAyXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldFNoYXBlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gW3RoaXMuZ2V0Um93cygpLCB0aGlzLmdldENvbHMoKV1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIG0ubWFwKHggPT4geC5tYXAoeSA9PiB5KyAxKSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihtYXAoZikodGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGZ1bmN0aW9uIHRoYXQgbWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IE1hdHJpeCBvciBhcnJheSB0byBtYXBcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgubWFwKHg9ID4geC5tYXAoeSA9PiB5KyAxKSwgW1sxLCAxXSwgWzEsIDFdXSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5tYXAgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLm1hcChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZm9sZFxuICogQGRlc2NyaXB0aW9uIFJlZHVjZSB0aGUgbWF0cml4IHJvd3MgdXNpbmcgYSByZWR1Y2UgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQSByZWR1Y2UvZm9sZCBmdW5jdGlvblxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gRmxhdHRlbiBNYXRyaXhcbiAqIE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKS5mb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2LmNvbmNhdChuZXh0KSlcbiAqIC8vIFsxLCAxLCAxLCAxXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQoZiwgW10pKHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdG8gcmVkdWNlIHRoZSBtYXRyaXggcm93cyB1c2luZyBhIHJlZHVjZSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBIHJlZHVjZS9mb2xkIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fSBUaGUgTWF0cml4IHRvIHJlZHVjZVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG5cbiAqIC8vIFN1bSBvZiBhbGwgbWF0cml4IHZhbHVlc1xuICogY29uc3QgcmVkdWNlciA9IChwcmV2LCBuZXh0KSA9PiBOdW1iZXIocHJldikgKyBuZXh0LnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgKyB4LCAwKVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dXG4gKiBNYXRyaXguZm9sZChyZWR1Y2VyLCBBKVxuICogLy8gNFxuICovXG5NYXRyaXguZm9sZCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuZm9sZChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgTWF0cml4IHRvIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmID0geCA9PiB4LnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMiwgM10sIFs0LCA1LCA2XSwgWzcsIDgsIDldXSlcbiAqIE1hdHJpeC5vZihmKS5hcChNKVxuICogLy8gW1s2XSwgWzE1XSwgWzI0XVxuICovXG5NYXRyaXgucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5tYXAodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBNYXRyaXggdG8gYSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufVxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGYgPSB4ID0+IHgucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dClcbiAqIE1hdHJpeC5hcChmLCBbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0pXG4gKiAvLyBbWzZdLCBbMTVdLCBbMjRdXG4gKi9cbk1hdHJpeC5hcCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZikuYXAoTSlcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIE1hdHJpY2VzIHVzaW5nIGEgZnVuY3Rpb24gYXMgb3BlcmF0b3JcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1swLCAxLCAxXSwgWzIsIDMsIDRdXVxuICogY29uc3QgYiA9IFtbMiwgMiwgMl0sIFszLCAzLCAzXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqIGNvbnN0IE0gPSBBLmNvbmNhdChCKVxuICogLy8gW1swLCAxLCAxLCAyLCAyLCAyXSwgWzIsIDMsIDQsIDMsIDMsIDNdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAoTSwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChmKE0pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBNYXRyaWNlcyB1c2luZyBhIGZ1bmN0aW9uIGFzIG9wZXJhdG9yXG4gKiBAcGFyYW0gQSB7TWF0cml4fVxuICogQHBhcmFtIEIge01hdHJpeH1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbWzAsIDEsIDFdLCBbMiwgMywgNF1dXG4gKiBjb25zdCBiID0gW1syLCAyLCAyXSwgWzMsIDMsIDNdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICogY29uc3QgTSA9IE1hdHJpeC5jb25jYXQoQSwgQilcbiAqIC8vIFtbMCwgMSwgMSwgMiwgMiwgMl0sIFsyLCAzLCA0LCAzLCAzLCAzXV1cbiAqXG4gKi9cbk1hdHJpeC5jb25jYXQgPSBjdXJyeShmdW5jdGlvbiAoQSwgQiwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLm1hcChmKEIpKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChlbXB0eSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5lbXB0eSA9IGN1cnJ5KGZ1bmN0aW9uIChyb3dzID0gMCwgY29scyA9IDApIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YobSkubWFwKGVtcHR5KVxufSlcblxuLy8gIyMjIyAjIyMjICMjIyMgLy9cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaWRlbnRpdHlcbiAqIEBkZXNjIFJldHVybnMgYW4gaWRlbnRpdHkgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQWlkZW50aXR5ID0gQS5pZGVudGl0eSgpXG4gKiAvLyBbWzEsIDAsIDBdLCBbMCwgMSwgMF1dXG4gKlxuKi9cbk1hdHJpeC5wcm90b3R5cGUuaWRlbnRpdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKHRoaXMpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzYyBSZXR1cm5zIGFuIGlkZW50aXR5IG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5pZGVudGl0eSgzLCAyKVxuICogLy8gW1sxLCAwLCAwXSwgWzAsIDEsIDBdXVxuICpcbiAqL1xuTWF0cml4LmlkZW50aXR5ID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKG0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbWJpbmVcbiAqIEBzZWUgTWF0cml4LmNvbmNhdFxuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY29tYmluZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuY29uY2F0KE1hdHJpeC5vZihNKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb21iaW5lXG4gKiBAc2VlIE1hdHJpeC5jb25jYXRcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXguY29tYmluZSA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuY29uY2F0KE1hdHJpeC5vZihCKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQ3JlYXRlIG1hdHJpeFxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzEsIDJdLCBbMywgNF1dKVxuICpcbiAqIC8vIEdlbmVyYXRlIGlkZW50aXR5IG1hdHJpeFxuICogY29uc3QgSSAgPSBtLmlkZW50aXR5KCkgLy8gW1sxLCAwXSwgWzAsIDFdXVxuICpcbiAqIGlmKG0uZG90KEkpLmVxdWFscyhtKSkge1xuICogICAgY29uc29sZS5sb2coJ0RvdCBwcm9kdWN0IHdpdGggaWRlbnRpdHkgbWF0cml4IHJldHVybnMgdGhlIHNhbWUgbWF0cml4JylcbiAqIH1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZG90ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5jb25jYXQoTWF0cml4Lm9mKE0pLCBkb3QodGhpcy5wcmVjaXNpb24pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGEgPSBbWzEsIDIsIDNdLCBbNCwgNSwgNl1dXG4gKiBjb25zdCBiID0gW1s3LCA4XSwgWzksIDEwXSwgWzExLCAxMl1dXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICpcbiAqIE1hdHJpeC5kb3QoQSwgQikgLy8gW1s1OCwgNjRdLCBbMTM5LCAxNTRdXVxuICpcbiAqL1xuTWF0cml4LmRvdCA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuZG90KE1hdHJpeC5vZihCKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZmlsbFxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB0aGUgcHJvdmlkZWQgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLmZpbGwoeCA9PiA0MilcbiAqIC8vIFtbNDIsNDIsNDJdLCBbNDIsNDIsNDJdLCBbNDIsNDIsNDJdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAobWFwKHggPT4gZih4KSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHplcm9zXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHplcm9zXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLnplcm9zKClcbiAqIC8vIFtbMCwwLDBdLCBbMCwwLDBdLCBbMCwwLDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS56ZXJvcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKHggPT4gMClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gemVyb3NcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggemVyb3NcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lnplcm9zKDMsIDMpXG4gKiAvLyBbWzAsMCwwXSwgWzAsMCwwXSwgWzAsMCwwXV1cbiAqXG4gKi9cbk1hdHJpeC56ZXJvcyA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoeCA9PiAwKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS5vbmVzKClcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5vbmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmZpbGwoeCA9PiAxKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9uZXMoMSwgMSlcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4Lm9uZXMgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKHggPT4gMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgcmFuZG9tXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHJhbmRvbSB2YWx1ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDFdXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJhbmRvbSA9IGZ1bmN0aW9uIChmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDEpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKGYpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHJhbmRvbVxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCByYW5kb20gbnVtYmVyc1xuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBGdW5jdGlvbiB3aGljaCByZXR1cm5zIHJhbmRvbSB2YWx1ZXMuIERlZmF1bHQgcmFuZG9tIHZhbHVlcyBhcmUgYmV0d2VlbiAtMSBhbmQgMVxuICogQHBhcmFtIHJvd3Mge251bWJlcn0gRGVmaW5lcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfSBEZWZpbmVzIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5yYW5kb20gPSBmdW5jdGlvbiAoZiA9IGUgPT4gKE1hdGgucmFuZG9tKCkgKiAyIC0gMSksIHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbChmKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB0b0FycmF5XG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBhcnJheSBmcm9tIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlLm1hcChyb3cgPT4gcm93Lm1hcChjb2wgPT4gY29sKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgY2xvbmVcbiAqIEBkZXNjIFJldHVybnMgYSBjbG9uZSBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4LmZyb21BcnJheSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZyb21BcnJheVxuICogQGRlc2MgUmV0dXJucyBhIE1hdHJpeCBmcm9tIGFuIGFycmF5XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbk1hdHJpeC5mcm9tQXJyYXkgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBNYXRyaXgub2YobWFwKHJvdyA9PiBtYXAoY29sID0+IGNvbCkocm93KSkoYXJyKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdKVxuICogY29uc3QgYiA9IEEudHJhbnNwb3NlKCkudG9BcnJheSgpXG4gKiAvLyByZXR1cm5zIFtbLTEsIDMsLThdLCBbMiwgNCwgMl1dXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQodHJhbnNwb3NlLCBbXSwgdGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IEEgTWF0cml4IG9yIGEgbWF0cml4IGFycmF5XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdXG4gKiBjb25zdCBiID0gTWF0cml4LnRyYW5zcG9zZShhKS50b0FycmF5KClcbiAqIC8vIHJldHVybnMgW1stMSwgMywtOF0sIFsyLCA0LCAyXV1cbiAqL1xuTWF0cml4LnRyYW5zcG9zZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkudHJhbnNwb3NlKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAaW5zdGFuY2VcbiAqIEBwYXJhbSBNIHtNYXRyaXh8bnVtYmVyfSBBZGQgYSBNYXRyaXggb3IgYSBudW1iZXJcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLmFkZCgxKSAvLyBbWzYsIDVdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIuYWRkKEIpIC8vIFtbMTAsIDEwXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKE0pIHtcbiAgaWYgKE0gaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgIT09IE0uZ2V0Q29scygpIHx8IHRoaXMuZ2V0Um93cygpICE9PSBNLmdldFJvd3MoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaWNlcyBkbyBub3QgbWF0Y2gsIGNhbm5vdCBhZGQnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKHZhbCwgamR4KSA9PiB2YWwgKyBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4ICsgTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHN1YnRyYWN0XG4gKiBAaW5zdGFuY2VcbiAqIEBwYXJhbSBNIHtNYXRyaXh8bnVtYmVyfSBTdWJ0cmFjdCBhIE1hdHJpeCBvciBhIG51bWJlclxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuc3VidHJhY3QoMSkgLy8gW1s0LCAyXV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLnN1YnRyYWN0KEIpIC8vIFtbMCwgMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gKE0pIHtcbiAgaWYgKE0gaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgIT09IE0uZ2V0Q29scygpIHx8IHRoaXMuZ2V0Um93cygpICE9PSBNLmdldFJvd3MoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaWNlcyBkbyBub3QgbWF0Y2gsIGNhbm5vdCBzdWJ0cmFjdCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcCgocm93LCBpZHgpID0+IG1hcCgodmFsLCBqZHgpID0+IHZhbCAtIE0uX192YWx1ZVtpZHhdW2pkeF0pKHJvdykpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKG1hcCh4ID0+IHggLSBNKSlcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgbXVsdGlwbHlcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgTXV0bGlwbHkgYSBzY2FsYXIgb3IgYSBtdHJhaXggd2l0aCBhIG1hdHJpeC4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBtdWx0aXBsaWNhdGlvbiBpcyBub3QgcG9zc2libGUuXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLm11bHRpcGx5KDIpIC8vIFtbMTAsIDhdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIubXVsdGlwbHkoQikgLy8gW1syNSwgMjVdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5tdWx0aXBseSA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdVc2Ugc3RhdGljIG1ldGhvZCBcXCdkb3RcXCcgdG8gZG8gbWF0cml4IG11bHRpcGxpY2F0aW9uJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3QgY3JlYXRlIGhhZGFtYXJkIHByb2R1Y3QnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKGNvbCwgamR4KSA9PiBjb2wgKiBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4ICogTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGFkZGl0aXZlaW52ZXJzZVxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1hdHJpeCBvYnRhaW5lZCBieSBjaGFuZ2luZyB0aGUgc2lnbiBvZiBldmVyeSBtYXRyaXggZWxlbWVudC4gVGhlIGFkZGl0aXZlIGludmVyc2Ugb2YgbWF0cml4IEEgaXMgd3JpdHRlbiDigJNBLlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsLTVdLCBbLTQsIDRdXSlcbiAqIGNvbnN0IG1pbnVzQSA9IEEuYWRkaXRpdmVpbnZlcnNlKClcbiAqIC8vIFtbLTUsIDVdLCBbNCwgLTRdXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmFkZGl0aXZlaW52ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tdWx0aXBseSgtMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGhhZGFtYXJkXG4gKiBAaW5zdGFuY2VcbiAqIEBzZWUgbXVsdGlwbHlcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5oYWRhbWFyZCgyKSAvLyBbWzEwLCA4XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLmhhZGFtYXJkKEIpIC8vIFtbMjUsIDI1XV1cblxuICovXG5NYXRyaXgucHJvdG90eXBlLmhhZGFtYXJkID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tdWx0aXBseShNKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBsdVxuICogQGRlc2MgQ2FsY3VsYXRlcyBMVSBkZWNvbXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IE1hdHJpeFxuICogQHJldHVybnMge01hdHJpeFtdfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBbWzMsIC03LCAtMiwgMl0sIFstMywgNSwgMSwgMF0sIFs2LCAtNCwgMCwgLTVdLCBbLTksIDUsIC01LCAxMl1dXG4gKiBjb25zdCBBID0gTWF0cml4LmZyb21BcnJheShyZXN1bHQpXG4gKiBjb25zdCBsdSA9IEEubHUoKVxuICogLy8gTC5fX3ZhbHVlID0gWyBbIDEsIDAsIDAsIDAgXSwgWyAtMSwgMSwgMCwgMCBdLCBbIDIsIC01LCAxLCAwIF0sIFsgLTMsIDgsIDMsIDEgXSBdXG4gKiAvLyBVLl9fdmFsdWUgPSAgWyBbIDMsIC03LCAtMiwgMiBdLCBbIDAsIC0yLCAtMSwgMiBdLCBbIDAsIDAsIC0xLCAxIF0sIFsgMCwgMCwgMCwgLTEgXSBdXG4gKiBNYXRyaXguZG90KGx1WzBdLCBsdVsxXSkgLy8gcmV0dXJucyBjbG9uZSBvZiBBXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmx1ID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBuID0gdGhpcy5nZXRSb3dzKClcbiAgY29uc3QgdG9sID0gMWUtNlxuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IEwgPSB0aGlzLnplcm9zKClcbiAgY29uc3QgVSA9IHRoaXMuemVyb3MoKVxuXG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKytrKSB7XG4gICAgaWYgKE1hdGguYWJzKEEuX192YWx1ZVtrXVtrXSkgPCB0b2wpIHRocm93IEVycm9yKCdDYW5ub3QgcHJvY2VlZCB3aXRob3V0IGEgcm93IGV4Y2hhbmdlJylcbiAgICBMLl9fdmFsdWVba11ba10gPSAxXG4gICAgZm9yIChsZXQgaSA9IGsgKyAxOyBpIDwgbjsgKytpKSB7XG4gICAgICBMLl9fdmFsdWVbaV1ba10gPSBBLl9fdmFsdWVbaV1ba10gLyBBLl9fdmFsdWVba11ba11cbiAgICAgIGZvciAobGV0IGogPSBrICsgMTsgaiA8IG47ICsraikge1xuICAgICAgICBBLl9fdmFsdWVbaV1bal0gPSBBLl9fdmFsdWVbaV1bal0gLSBMLl9fdmFsdWVbaV1ba10gKiBBLl9fdmFsdWVba11bal1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgbCA9IGs7IGwgPCBuOyArK2wpIHtcbiAgICAgIFUuX192YWx1ZVtrXVtsXSA9IEEuX192YWx1ZVtrXVtsXVxuICAgIH1cbiAgfVxuICByZXR1cm4gW0wsIFVdXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHJyZWZcbiAqIEByZXR1cm5zIHtNYXRyaXh8YXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBBID0gTWF0cml4Lm9mKFtbLTEsIDFdLCBbLTEsIDBdLCBbMCwgLTFdLCBbLTEsIC0yXV0pXG4gKiBBLnJyZWYoKSAvLyAgWyBbIDEsIDAgXSwgWyAtMCwgMSBdLCBbIDAsIDAgXSwgWyAwLCAwIF0gXVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJyZWYgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCBsZWFkID0gMFxuICBjb25zdCByZXN1bHRNYXRyaXggPSB0aGlzLmNsb25lKClcblxuICBmb3IgKGxldCByID0gMDsgciA8IHRoaXMuZ2V0Um93cygpOyArK3IpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgPD0gbGVhZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdE1hdHJpeFxuICAgIH1cbiAgICBsZXQgaSA9IHJcbiAgICB3aGlsZSAocmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1bbGVhZF0gPT09IDApIHtcbiAgICAgICsraVxuICAgICAgaWYgKHRoaXMuZ2V0Um93cygpID09PSBpKSB7XG4gICAgICAgIGkgPSByXG4gICAgICAgICsrbGVhZFxuICAgICAgICBpZiAodGhpcy5nZXRDb2xzKCkgPT09IGxlYWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0TWF0cml4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdG1wID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1cbiAgICByZXN1bHRNYXRyaXguX192YWx1ZVtpXSA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdXG4gICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl0gPSB0bXBcblxuICAgIGxldCB2YWwgPSByZXN1bHRNYXRyaXguX192YWx1ZVtyXVtsZWFkXVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5nZXRDb2xzKCk7ICsraikge1xuICAgICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bal0gLz0gdmFsXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdldFJvd3MoKTsgKytpKSB7XG4gICAgICBpZiAoaSA9PT0gcikgY29udGludWVcbiAgICAgIHZhbCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2xlYWRdXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZ2V0Q29scygpOyArK2opIHtcbiAgICAgICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1bal0gLT0gdmFsICogcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bal1cbiAgICAgIH1cbiAgICB9XG4gICAgbGVhZCsrXG4gIH1cbiAgcmV0dXJuIHJlc3VsdE1hdHJpeFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBzb2x2ZVxuICogQHBhcmFtIGJcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gU29sdmUgeEEgPSBiXG4gKiAvLyA1eCArIHkgID0gN1xuICogLy8gM3ggLSA0eSA9IDE4XG4gKiAvLyBTb2x1dGlvbiBmb3IgeCBhbmQgeTpcbiAqIC8vIHggPSAyXG4gKiAvLyB5ID0gLTNcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgMV0sIFszLCAtNF1dKVxuICogY29uc3Qgc29sdmVBID0gQS5zb2x2ZShbNywgMThdKSAvLyBbMiwgLTNdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnNvbHZlID0gZnVuY3Rpb24gKGIpIHtcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBMVSA9IEEubHUoKVxuICBjb25zdCBMID0gTFVbMF1cbiAgY29uc3QgVSA9IExVWzFdXG4gIGNvbnN0IG4gPSB0aGlzLmdldFJvd3MoKVxuICBsZXQgcyA9IDBcbiAgY29uc3QgYyA9IFtdXG4gIGNvbnN0IHggPSBbXVxuXG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKytrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBrOyArK2opIHtcbiAgICAgIHMgPSBzICsgTC5fX3ZhbHVlW2tdW2pdICogY1tqXVxuICAgIH1cbiAgICBjW2tdID0gYltrXSAtIHNcbiAgICBzID0gMFxuICB9XG4gIGZvciAobGV0IGEgPSBuIC0gMTsgYSA+IC0xOyAtLWEpIHtcbiAgICBsZXQgdCA9IDBcbiAgICBmb3IgKGxldCBiID0gYSArIDE7IGIgPCBuOyArK2IpIHtcbiAgICAgIHQgPSB0ICsgVS5fX3ZhbHVlW2FdW2JdICogeFtiXVxuICAgIH1cbiAgICB4W2FdID0gKGNbYV0gLSB0KSAvIFUuX192YWx1ZVthXVthXVxuICB9XG4gIHJldHVybiB4XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBpbnZlcnNlXG4gKiBAaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzIsIDRdXSkuaW52ZXJzZSgpXG4gKiAvLyBbIFsgMiwgLTAuNSBdLCBbIC0xLCAwLjUgXSBdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmludmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgSSA9IEEuaWRlbnRpdHkoKVxuICBjb25zdCBJbnYgPSBBLmNvbmNhdChJKS5ycmVmKClcblxuICBjb25zdCByZXN1bHQgPSBJbnYuX192YWx1ZS5yZWR1Y2UoKHJlc3VsdCwgeCwgaWR4KSA9PiB7XG4gICAgY29uc3QgaGFsZiA9IHgubGVuZ3RoIC8gMlxuICAgIHJlc3VsdC5wdXNoKHguc2xpY2UoaGFsZiwgeC5sZW5ndGgpKVxuICAgIHJldHVybiByZXN1bHRcbiAgfSwgW10pXG4gIHJldHVybiBNYXRyaXgub2YocmVzdWx0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgcmFua1xuICogQGluc3RhbmNlXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJhbmsgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHJyZWYgPSB0aGlzLnJyZWYoKVxuICBsZXQgcmVzdWx0ID0gMFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJyZWYuZ2V0Q29scygpOyArK2kpIHtcbiAgICByZXN1bHQgKz0gcnJlZi5fX3ZhbHVlW2ldW2ldXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGltZW5zaW9uXG4gKiBAaW5zdGFuY2VcbiAqIEBzZWUgcmFua1xuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaW1lbnNpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJhbmsoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGlhZ1xuICogQGluc3RhbmNlXG4gKiBAZGVzYyBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5kaWFnKClcbiAqIC8vIFsxLCAxLCAxXVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLmRpYWcoKVxuICogLy8gWzAsIDAsIDAsIDAsIDBdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmRpYWcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGlkeCkgPT4ge1xuICAgIHJldHVybiBhY2MuY29uY2F0KHhbaWR4XSlcbiAgfSkoW10pKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gZGlhZ1xuICogQGRlc2MgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LmRpYWcoW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIFsyLCA1XVxuICpcbiAqL1xuTWF0cml4LmRpYWcgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmRpYWcoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGlhZ3Byb2R1Y3RcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5kaWFncHJvZHVjdCgpXG4gKiAvLyAxXG4gKlxuICogY29uc3QgZGlhZzAgPSBNYXRyaXguemVyb3MoNSwgNSkuZGlhZ3Byb2R1Y3QoKVxuICogLy8gMFxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaWFncHJvZHVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCwgaWR4KSA9PiB7XG4gICAgYWNjICo9IHhbaWR4XVxuICAgIHJldHVybiBhY2NcbiAgfSkoMSkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBkaWFncHJvZHVjdFxuICogQGRlc2MgUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXguZGlhZ3Byb2R1Y3QoW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIDEwXG4gKlxuICovXG5NYXRyaXguZGlhZ3Byb2R1Y3QgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmRpYWdwcm9kdWN0KClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHN1bVxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgTWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5vbmVzKDMsIDMpLnN1bSgpXG4gKiAvLyA5XG4gKlxuICogY29uc3QgZGlhZzAgPSBNYXRyaXguemVyb3MoNSwgNSkuc3VtKClcbiAqIC8vIDBcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc3VtID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4KSA9PiB7XG4gICAgYWNjICs9IGZvbGQoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0KSgwKSh4KVxuICAgIHJldHVybiBhY2NcbiAgfSkoMCkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBzdW1cbiAqIEBkZXNjIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIHRoZSBNYXRyaXhcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LnN1bShbWzIsIDFdLCBbMSwgNV1dKVxuICogLy8gOVxuICpcbiAqL1xuTWF0cml4LnN1bSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuc3VtKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGtyb25lY2tlclxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBUaGUgS3JvbmVja2VyIHByb2R1Y3QgaXMgYW4gb3BlcmF0aW9uIG9uIHR3byBtYXRyaWNlcyBvZiBhcmJpdHJhcnkgc2l6ZSByZXN1bHRpbmcgaW4gYSBibG9jayBtYXRyaXguXG4gKiBAcGFyYW0gTSB7TWF0cml4fSBUaGUgcmlnaHQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKHRoaXMg4oqXIE0pXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmtyb25lY2tlciA9IGZ1bmN0aW9uIChNKSB7XG4gIGNvbnN0IG0gPSB0aGlzLmdldFJvd3MoKVxuICBjb25zdCBuID0gdGhpcy5nZXRDb2xzKClcbiAgY29uc3QgcCA9IE0uZ2V0Um93cygpXG4gIGNvbnN0IHEgPSBNLmdldENvbHMoKVxuXG4gIGNvbnN0IGxlZnQgPSB0aGlzLl9fdmFsdWVcbiAgY29uc3QgcmlnaHQgPSBNLl9fdmFsdWVcblxuICBjb25zdCBmcmFtZSA9IGdlbmVyYXRlKG0gKiBwLCBuICogcSlcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG07IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IHA7IGsrKykge1xuICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IHE7IGwrKykge1xuICAgICAgICAgIGZyYW1lW3AgKiBpICsga11bcSAqIGogKyBsXSA9IGxlZnRbaV1bal0gKiByaWdodFtrXVtsXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE1hdHJpeC5vZihmcmFtZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24ga3JvbmVja2VyXG4gKiBAZGVzYyBUaGUgS3JvbmVja2VyIHByb2R1Y3QgaXMgYW4gb3BlcmF0aW9uIG9uIHR3byBtYXRyaWNlcyBvZiBhcmJpdHJhcnkgc2l6ZSByZXN1bHRpbmcgaW4gYSBibG9jayBtYXRyaXguXG4gKiBAcGFyYW0gQSB7TWF0cml4fSBUaGUgbGVmdCBzaWRlIE1hdHJpeCBvZiB0aGUgcHJvZHVjdCAoQSDiipcgQilcbiAqIEBwYXJhbSBCIHtNYXRyaXh9IFRoZSByaWdodCBzaWRlIE1hdHJpeCBvZiB0aGUgcHJvZHVjdCAoQSDiipcgQilcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5rcm9uZWNrZXIgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmtyb25lY2tlcihCKVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXRyaXhcbiIsImltcG9ydCB7IGNvbmNhdCwgY3VycnkgfSBmcm9tICdmdW4uanMnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGNvbmNhdFxuICogQHBhcmFtIE0ge01hdHJpeH1cbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gKE0sIG0sIGlkeCkge1xuICByZXR1cm4gY29uY2F0KG0sIE0uX192YWx1ZVtpZHhdKVxufSlcbiIsImltcG9ydCB7IGZvbGQsIG1hcCwgY3VycnkgfSBmcm9tICdmdW4uanMnXG5pbXBvcnQgcm91bmQgZnJvbSAnLi9yb3VuZCdcblxuLyoqXG4gKiBAZnVuY3Rpb24gZG90XG4gKiBAcGFyYW0gQiB7TWF0cml4fVxuICogQHBhcmFtIGEge0FycmF5fVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgoZGVjaW1hbHMsIEIsIGEpID0+IG1hcCgoaXRlbSwgaSkgPT4ge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBqKSA9PiB7XG4gICAgYWNjICs9IHJvdW5kKHggKiBCLl9fdmFsdWVbal1baV0sIGRlY2ltYWxzKVxuICAgIHJldHVybiBhY2NcbiAgfSwgMCkoYSlcbn0pKEIuX192YWx1ZVswXSkpXG4iLCJpbXBvcnQgeyBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KG0gPT4gW10pXG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICdmdW4uanMnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlXG4gKiBAZGVzYyBHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGEgbWF0cml4IGFycmF5LCB2YWx1ZXMgYXJlIHNldCB0byB1bmRlZmluZWRcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfVxuICogQHJldHVybnMge2FueVtdW119XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChyb3dzLCBjb2xzID0gdW5kZWZpbmVkLCB2YWx1ZSA9IDApID0+IHtcbiAgY29uc3QgX2NvbHMgPSBjb2xzIHx8IHJvd3NcbiAgY29uc3QgeSA9IG1hcCh6ID0+IHZhbHVlKShuZXcgQXJyYXkoX2NvbHMpKVxuICByZXR1cm4gbWFwKHogPT4geSkobmV3IEFycmF5KHJvd3MpKVxufVxuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBpZGVudGl0eVxuICogQGRlc2MgQ3JlYXRlcyBhbiBpZGVudGl5IG1hdHJpeCBmcm9tIGFuIGVtcHR5IGFycmF5XG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChtLCBpZHgpID0+IG1hcCgocm93cywgamR4KSA9PiAoaWR4ID09PSBqZHgpICogMSkobSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHJvdW5kXG4gKiBAcGFyYW0gdmFsdWUge251bWJlcn1cbiAqIEBwYXJhbSBkZWNpbWFscyB7bnVtYmVyfVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm91bmQgKHZhbHVlLCBkZWNpbWFscykge1xuICByZXR1cm4gTnVtYmVyKE1hdGgucm91bmQodmFsdWUgKyAnZScgKyBkZWNpbWFscykgKyAnZS0nICsgZGVjaW1hbHMpXG59XG4iLCJpbXBvcnQgeyBtYXAsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiB0cmFuc3Bvc2VcbiAqIEBkZXNjIFRyYW5zcG9zZXMgYSBhcnJheSBvZiBhcnJheXMgdXNpbmcgdGhlIE1hdHJpeC5tYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm4ge01hdHJpeH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoKHByZXYsIG5leHQpID0+IG1hcCgoaXRlbSwgaSkgPT4gKHByZXZbaV0gfHwgW10pLmNvbmNhdChuZXh0W2ldKSkobmV4dCkpXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/lib/@astuanax/funmatrix.min.js b/lib/@astuanax/funmatrix.min.js index fbb103a..90607b2 100644 --- a/lib/@astuanax/funmatrix.min.js +++ b/lib/@astuanax/funmatrix.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("@astuanax/funmatrix",[],e):"object"==typeof exports?exports["@astuanax/funmatrix"]=e():t["@astuanax/funmatrix"]=e()}("undefined"!=typeof self?self:this,function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var u=e[r]={i:r,l:!1,exports:{}};return t[r].call(u.exports,u,u.exports,n),u.l=!0,u.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var u in t)n.d(r,u,function(e){return t[e]}.bind(null,u));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=6)}([function(t,e,n){"use strict";function r(t){const e=t.length;return 0===e?t:n([]);function n(r){return function(){return function(r,u){const o=r.concat(u);return o.length{n.set(r,t(e,r,u))}),n}),c=Object(r.default)(function(t,e){let n=-1;const r=e.length;let u="";for(;++n1&&void 0!==arguments[1]?arguments[1]:a.default;return v.of(this).map(e(t))},v.concat=(0,r.default)(function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:a.default;return v.of(t).map(n(e))}),v.prototype.empty=function(){return v.of(this).map(i.default)},v.empty=(0,r.default)(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(0,d.default)(t,e);return v.of(n).map(i.default)}),v.prototype.identity=function(){return v.of(l.default).ap(this)},v.identity=function(t,e){var n=(0,d.default)(t,e);return v.of(l.default).ap(n)},v.prototype.combine=function(t){return v.of(this).concat(v.of(t),a.default)},v.combine=function(t,e){return v.of(t).concat(v.of(e),a.default)},v.prototype.dot=function(t){return v.of(this).concat(v.of(t),(0,c.default)(this.precision))},v.dot=function(t,e){return v.of(t).dot(v.of(e))},v.prototype.fill=function(t){return v.of(this).map((0,u.default)(function(e){return t(e)}))},v.prototype.zeros=function(){return v.of(this).fill(function(t){return 0})},v.zeros=function(t,e){var n=(0,d.default)(t,e);return v.of(n).fill(function(t){return 0})},v.prototype.ones=function(){return v.of(this).fill(function(t){return 1})},v.ones=function(t,e){var n=(0,d.default)(t,e);return v.of(n).fill(function(t){return 1})},v.prototype.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1};return v.of(this).fill(t)},v.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1},e=arguments[1],n=arguments[2],r=(0,d.default)(e,n);return v.of(r).fill(t)},v.prototype.toArray=function(){return this.__value.map(function(t){return t.map(function(t){return t})})},v.prototype.clone=function(){return v.fromArray(this.__value)},v.fromArray=function(t){return v.of((0,u.default)(function(t){return(0,u.default)(function(t){return t})(t)})(t))},v.prototype.transpose=function(){return v.of((0,o.default)(s.default,[],this.__value))},v.transpose=function(t){return v.of(t).transpose()},v.prototype.add=function(t){if(t instanceof v){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot add");return this.map(function(e,n){return(0,u.default)(function(e,r){return e+t.__value[n][r]})(e)})}return this.map((0,u.default)(function(e){return e+t}))},v.prototype.subtract=function(t){if(t instanceof v){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot subtract");return this.map(function(e,n){return(0,u.default)(function(e,r){return e-t.__value[n][r]})(e)})}return this.map((0,u.default)(function(e){return e-t}))},v.prototype.multiply=function(t){if(t instanceof v){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw console.log("Use static method 'dot' to do matrix multiplication"),new Error("Matrices do not match, cannot create hadamard product");return this.map(function(e,n){return(0,u.default)(function(e,r){return e*t.__value[n][r]})(e)})}return this.map((0,u.default)(function(e){return e*t}))},v.prototype.additiveinverse=function(){return v.of(this).multiply(-1)},v.prototype.hadamard=function(t){return v.of(this).multiply(t)},v.prototype.lu=function(){for(var t=this.getRows(),e=this.clone(),n=this.zeros(),r=this.zeros(),u=0;u-1;--l){for(var s=0,d=l+1;d{for(let n in t)if(s(j(t[n],e[n])))return!1;for(let n in e)if(s(u(t[n]))&&u(e[n]))return!1;return!0}),j=e.default=Object(r.default)(function(t,e){return!!c(t,e)||Object(l.a)(t)===Object(l.a)(e)&&(!d(s(u(t)),s(u(e)))&&(t.constructor===e.constructor&&(h(t)||_(t)||f(t)||y(t)?c(t.valueOf(),e.valueOf()):v(t)?b(t,e):!!p(t)&&g(t,e))))})},function(t,e,n){"use strict";n.r(e);var r=n(0),u=Object(r.default)(function(t,e){return Array.prototype.concat(t,e)});function o(t,e){return String(t)+String(e)}var f=n(2);e.default=Object(r.default)(function(t,e){return{String:o,Array:u}[Object(f.a)(t)](t,e)})}])}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL19wcml2YXRlL2N1cnJ5MS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lbXB0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZvbGQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZvbGQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy9tYXRyaXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvZW1wdHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2RvdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvcm91bmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2lkZW50aXR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC90cmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2dlbmVyYXRlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvaXNOYW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lkZW50aWNhbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbm90LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25jYXQuanMiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsInRoaXMiLCJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiY3VycnkiLCJmdW4iLCJhcmdzbGVuIiwibGVuZ3RoIiwiY3JlYXRlUmVjdXJzZXIiLCJhY2MiLCJhcmdzIiwiX2FjYyIsImNvbmNhdCIsImFwcGx5IiwicmVjdXJzZSIsIkFycmF5Iiwic2xpY2UiLCJhcmd1bWVudHMiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiX2N1cnJ5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18iLCJfdHlwZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fIiwiQ3RvciIsInZhbCIsImZuIiwieCIsInRvU3RyaW5nIiwiYSIsImFycmF5X21hcCIsImNiIiwiZW1wdHkiLCJjb25zdHJ1Y3RvciIsIm9iamVjdF9tYXAiLCJrIiwia2V5cyIsIm1hcF9tYXAiLCJmb3JFYWNoIiwidiIsIm1hcCIsInNldCIsInN0cmluZ19tYXAiLCJjaGFyQXQiLCJpdGVyYXRvcl9tYXAiLCJjYWxsYmFjayIsIml0ZXJhdG9yIiwibmV4dFZhbHVlIiwibmV4dCIsImRvbmUiLCJwdXNoIiwiaXNGdW5jdGlvbiIsImlzIiwidHlwZSIsImFycmF5X2ZvbGQiLCJpbml0Iiwib2JqZWN0X2ZvbGQiLCJfY3VycnkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX21hcCIsIl9mb2xkIiwiX2VxdWFscyIsIl9jb25jYXQiLCJfZW1wdHkiLCJfZG90IiwiX2lkZW50aXR5IiwiX3RyYW5zcG9zZSIsIl9nZW5lcmF0ZSIsIk1hdHJpeCIsIl9fdmFsdWUiLCJwcmVjaXNpb24iLCJzZXRQcmVjaXNpb24iLCJpc1N5bW1ldHJpYyIsImIiLCJ0cmFuc3Bvc2UiLCJkZWZhdWx0IiwiaXNTcXVhcmUiLCJnZXRDb2xzIiwiZ2V0Um93cyIsImlzT3J0aG9nb25hbCIsIkF4QXQiLCJkb3QiLCJJIiwiaWRlbnRpdHkiLCJlcXVhbHMiLCJNIiwiZ2V0U2hhcGUiLCJvZiIsImYiLCJmb2xkIiwiYXAiLCJ1bmRlZmluZWQiLCJBIiwiQiIsInJvd3MiLCJjb2xzIiwiY29tYmluZSIsImZpbGwiLCJ6ZXJvcyIsIm9uZXMiLCJyYW5kb20iLCJlIiwiTWF0aCIsInRvQXJyYXkiLCJyb3ciLCJjb2wiLCJjbG9uZSIsImZyb21BcnJheSIsImFyciIsImFkZCIsIkVycm9yIiwiaWR4IiwiamR4Iiwic3VidHJhY3QiLCJtdWx0aXBseSIsImNvbnNvbGUiLCJsb2ciLCJhZGRpdGl2ZWludmVyc2UiLCJoYWRhbWFyZCIsImx1IiwiTCIsIlUiLCJhYnMiLCJqIiwicnJlZiIsImxlYWQiLCJyZXN1bHRNYXRyaXgiLCJ0bXAiLCJzb2x2ZSIsIkxVIiwiaW52ZXJzZSIsInJlc3VsdCIsInJlZHVjZSIsImhhbGYiLCJyYW5rIiwiZGltZW5zaW9uIiwiZGlhZyIsImRpYWdwcm9kdWN0Iiwic3VtIiwicHJldiIsImtyb25lY2tlciIsInEiLCJsZWZ0IiwicmlnaHQiLCJmcmFtZSIsIl9yb3VuZCIsImRlY2ltYWxzIiwiaXRlbSIsIk51bWJlciIsInJvdW5kIiwiZXhpc3RzIiwibnVtYmVyX2lzIiwiYW5kIiwieSIsImlzTmFuIiwiaXNOYU4iLCJzcmNfaWRlbnRpY2FsIiwibm90Iiwib3IiLCJvYmplY3RfaXMiLCJhcnJheV9pcyIsImJvb2xlYW5faXMiLCJzdHJpbmdfaXMiLCJkYXRlX2lzIiwiYXJyYXlfZXF1YWxzIiwic3JjX2VxdWFscyIsIm9iamVjdF9lcXVhbHMiLCJrZXlYIiwia2V5WSIsInZhbHVlT2YiLCJhcnJheV9jb25jYXQiLCJjb25jYXRfY29uY2F0IiwiU3RyaW5nIl0sIm1hcHBpbmdzIjoiQ0FBQSxTQUFBQSxFQUFBQyxHQUNBLGlCQUFBQyxTQUFBLGlCQUFBQyxPQUNBQSxPQUFBRCxRQUFBRCxJQUNBLG1CQUFBRyxlQUFBQyxJQUNBRCxPQUFBLHlCQUFBSCxHQUNBLGlCQUFBQyxRQUNBQSxRQUFBLHVCQUFBRCxJQUVBRCxFQUFBLHVCQUFBQyxJQVJBLENBU0Msb0JBQUFLLFVBQUFDLEtBQUEsV0FDRCxtQkNUQSxJQUFBQyxFQUFBLEdBR0EsU0FBQUMsRUFBQUMsR0FHQSxHQUFBRixFQUFBRSxHQUNBLE9BQUFGLEVBQUFFLEdBQUFSLFFBR0EsSUFBQUMsRUFBQUssRUFBQUUsR0FBQSxDQUNBQyxFQUFBRCxFQUNBRSxHQUFBLEVBQ0FWLFFBQUEsSUFVQSxPQU5BVyxFQUFBSCxHQUFBSSxLQUFBWCxFQUFBRCxRQUFBQyxJQUFBRCxRQUFBTyxHQUdBTixFQUFBUyxHQUFBLEVBR0FULEVBQUFELFFBMERBLE9BckRBTyxFQUFBTSxFQUFBRixFQUdBSixFQUFBTyxFQUFBUixFQUdBQyxFQUFBUSxFQUFBLFNBQUFmLEVBQUFnQixFQUFBQyxHQUNBVixFQUFBVyxFQUFBbEIsRUFBQWdCLElBQ0FHLE9BQUFDLGVBQUFwQixF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QUpBLENBQ0FtRyxPQUFjRCxFQUNkekosTUFBYXdKLEdBRUl6TCxPQUFBb0UsRUFBQSxFQUFBcEUsQ0FBSTRDLE1BQUE0QyIsImZpbGUiOiJAYXN0dWFuYXgvZnVubWF0cml4Lm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJAYXN0dWFuYXgvZnVubWF0cml4XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkBhc3R1YW5heC9mdW5tYXRyaXhcIl0gPSBmYWN0b3J5KCk7XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDYpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qKlxuICogQGZ1bmN0aW9uIGN1cnJ5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGN1cnJ5IChmdW4pIHtcbiAgY29uc3QgYXJnc2xlbiA9IGZ1bi5sZW5ndGhcblxuICBpZiAoYXJnc2xlbiA9PT0gMCkge1xuICAgIHJldHVybiBmdW5cbiAgfVxuICByZXR1cm4gY3JlYXRlUmVjdXJzZXIoW10pXG5cbiAgZnVuY3Rpb24gcmVjdXJzZSAoYWNjLCBhcmdzKSB7XG4gICAgY29uc3QgX2FjYyA9IGFjYy5jb25jYXQoYXJncylcbiAgICByZXR1cm4gX2FjYy5sZW5ndGggPCBhcmdzbGVuXG4gICAgICA/IGNyZWF0ZVJlY3Vyc2VyKF9hY2MpXG4gICAgICA6IGZ1bi5hcHBseSh0aGlzLCBfYWNjKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVjdXJzZXIgKGFjYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVjdXJzZShhY2MsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIFZlcmlmaWVzIHRoZSB0eXBlIG9mIHRoZSBwcm92aWRlZCBhcmd1bWVudFxuICpcbiAqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaXMgKEN0b3IsIHZhbCkge1xuICByZXR1cm4gdHlwZSh2YWwpID09PSBDdG9yXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdHlwZSAoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpLnNsaWNlKDgsIC0xKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24gd2l0aCBhcml0eSAxXG4gKiBAZnVuY3Rpb24gY3VycnkxXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIHYxLjAuMlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeTEgKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjdXJyaWVkIChhKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgID8gdGhpc1xuICAgICAgOiBmbihhKVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBtYXBcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIG92ZXIgYW4gYXJyYXkgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICogQHNpbmNlIHYxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiAgY29uc3QgcmVzdWx0ID0gbWFwKGlkZW50aXR5LCBbMCwyLDNdKVxuICogIC8vIHJlc3VsdCA9IFswLDIsM11cbiAqICBjb25zdCBhZGQyID0gYWRkKDIpXG4gKiAgY29uc3QgcmVzdWx0ID0gbWFwKGFkZDIsIFswLDIsM10pXG4gKiAgLy8gcmVzdWx0ID0gWzIsNCw1XVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGEubGVuZ3RoXG4gIGNvbnN0IHIgPSBuZXcgQXJyYXkobClcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByW2ldID0gY2IoYVtpXSwgaSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBlbXB0eSBlcXVpdmFsZW50IG9mIHRoZSBmaXJzdCBhcmd1bWVudFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVtcHR5ICh4KSB7XG4gIHJldHVybiBuZXcgeC5jb25zdHJ1Y3RvcigpXG59O1xuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gb2JqZWN0IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge09iamVjdH0gYVxuICogQHJldHVybiB7T2JqZWN0fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IGsgPSBrZXlzKGEpXG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGsubGVuZ3RoXG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHJba1tpXV0gPSBjYihhW2tbaV1dLCBrW2ldLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYSBNYXAgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7TWFwfSBhXG4gKiBAcmV0dXJuIHtNYXB9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi4vZW1wdHknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgY29uc3QgciA9IGVtcHR5KGEpXG4gIGEuZm9yRWFjaCgodiwgaywgbWFwKSA9PiB7XG4gICAgci5zZXQoaywgY2IodiwgaywgbWFwKSlcbiAgfSlcbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhIHN0cmluZyBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSAnJ1xuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgKz0gY2IoYS5jaGFyQXQoaSksIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBJdGVyYXRvciBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4zXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYXRvcn0gYVxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2FsbGJhY2ssIGl0ZXJhdG9yKSB7XG4gIGxldCByID0gW11cbiAgZm9yIChsZXQgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpOyBuZXh0VmFsdWUuZG9uZSAhPT0gdHJ1ZTsgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpKSB7XG4gICAgci5wdXNoKGNhbGxiYWNrKGl0ZXJhdG9yLnZhbHVlKCkpKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5jb25zdCBpc0Z1bmN0aW9uID0gaXMoJ0Z1bmN0aW9uJylcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJdGVyIChpdGVyKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSlcbn1cbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIGl0ZXJhYmxlIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gd2hpY2ggbWFwcyBvdmVyIGFuIGl0ZXJhYmxlLlxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4gYiAtPiBiXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL2FycmF5L21hcCdcbmltcG9ydCBvYmplY3RNYXAgZnJvbSAnLi9vYmplY3QvbWFwJ1xuaW1wb3J0IG1hcE1hcCBmcm9tICcuL21hcC9tYXAnXG5pbXBvcnQgc3RyaW5nTWFwIGZyb20gJy4vc3RyaW5nL21hcCdcbmltcG9ydCBpdGVyYXRvck1hcCBmcm9tICcuL2l0ZXJhdG9yL21hcCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBpc0l0ZXJhdG9yIGZyb20gJy4vaXRlcmF0b3IvaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgY2FzZSAnRnVuY3Rpb24nOlxuICAgICAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKVxuICAgICAgfSlcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdE1hcChjYiwgYSlcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIHN0cmluZ01hcChjYiwgYSlcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcE1hcChjYiwgYSlcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gYXJyYXlNYXAoY2IsIGEpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpc0l0ZXJhdG9yKGEpXG4gICAgICAgID8gaXRlcmF0b3JNYXAoY2IsIGEpXG4gICAgICAgIDogYXJyYXlNYXAoY2IsIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIG93biBrZXlzIG9mIGFuIG9iamVjdCBhcyBhbiBBcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IFtiXVxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24ga2V5cyAoYSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoT2JqZWN0KGEpKVxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IG1hcHBpbmcgb3ZlciB0aGUgcHJvdmlkZWQgYXJyYXkgYW5kIGNhbGxpbmcgYW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Y2JGdW5jdGlvbn0gY2IgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIGl0ZW1cbiAqIEBwYXJhbSB7Kn0gaW5pdCAtIEluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXl9IGEgLSBBcnJheSB3aXRoIGl0ZW1zIHRvIG1vZGlmeSBieSB0aGUgY2IgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFsaWFzIHJlZHVjZVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvbGQoYWRkLCAwLCBbMSwxLDFdKVxuICogLy8gcmVzdWx0ID0gM1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIGNiRnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gciAtIEFjY3VtdWxhdG9yIHdoaWNoIGFjY3VtdWxhdGVzIHRoZSBjYWxsYmFjaydzIHJldHVybiB2YWx1ZXNcbiAqIEBwYXJhbSB7Kn0gaXRlbSAtIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSB0aGUgaW5kZXkgb2YgdGhlIGl0ZW0gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge0FycmF5fSBhIC0gVGhlIGluaXRpYWwgYXJyYXlcbiAqIEByZXR1cm4geyp9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSBpbml0XG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgciA9IGNiKHIsIGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgbykge1xuICBjb25zdCBrID0ga2V5cyhvKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBsZXQgciA9IE9iamVjdChpbml0KVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgPSBjYihyLCBvW2tbaV1dLCBrW2ldLCBvKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheSBsaWtlIG9iamVjdCBhbmQgY2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoKGEsIGIsIGMsIGEpIOKGkiBhKSDihpIgYSDihpIgW2JdIOKGkiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiByZWNlaXZlcyA0IHZhbHVlczogdGhlIGFjY3VtdWxhdG9yLCB0aGUgaXRlbSwgdGhlIGluZGV4LCBhbmQgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0geyp9IGEgaXMgdGhlIGluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7Kn0gW2JdIHRoZSBhcnJheSBsaWtlIGl0ZW0gdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcmV0dXJuIHsqfSBhIGlzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG9iamVjdEZvbGQgZnJvbSAnLi9vYmplY3QvZm9sZCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAnT2JqZWN0Jzogb2JqZWN0Rm9sZCxcbiAgICAnQXJyYXknOiBhcnJheUZvbGRcbiAgfVxuICAvLyBpZiAoYS5uZXh0KSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYSlcbiAgLy8gfVxuICAvLyBpZiAodHlwZShTeW1ib2wpICE9PSAndW5kZWZpbmVkJyAmJiBhW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgLy8gICByZXR1cm4gaXRlcmFibGVGb2xkKGNiLCBpbml0LCBhW1N5bWJvbC5pdGVyYXRvcl0oKSlcbiAgLy8gfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShjYiwgaW5pdCwgYSlcbn0pXG5cbi8vIGZ1bmN0aW9uIGl0ZXJhYmxlRm9sZCAoY2IsIGFjYywgZ2VuKSB7XG4vLyAgIGxldCBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuLy8gICAgIGFjYyA9IGNiKGFjYywgc3RlcC52YWx1ZSlcbi8vICAgICBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB9XG4vLyAgIHJldHVybiBhY2Ncbi8vIH1cbiIsImltcG9ydCBjdXJyeSBmcm9tICdmdW4uanMvc3JjL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICdmdW4uanMvc3JjL21hcCdcbmltcG9ydCBmb2xkIGZyb20gJ2Z1bi5qcy9zcmMvZm9sZCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnZnVuLmpzL3NyYy9lcXVhbHMnXG5pbXBvcnQgY29uY2F0IGZyb20gJ3V0aWwvY29uY2F0J1xuaW1wb3J0IGVtcHR5IGZyb20gJ3V0aWwvZW1wdHknXG5pbXBvcnQgZG90IGZyb20gJ3V0aWwvZG90J1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJ3V0aWwvaWRlbnRpdHknXG5pbXBvcnQgdHJhbnNwb3NlIGZyb20gJ3V0aWwvdHJhbnNwb3NlJ1xuaW1wb3J0IGdlbmVyYXRlIGZyb20gJ3V0aWwvZ2VuZXJhdGUnXG5cbi8qKlxuICogQGNsYXNzIE1hdHJpeFxuICogQGNsYXNzZGVzYyBNYXRyaXggYXBwbGljYXRpdmUgcHJvdmlkaW5nIHN0YW5kYXJkIG1hdHJpeCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGUgTWF0cml4IGNsYXNzIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIHdpdGggdGhlIG5ldyBrZXl3b3JkLiBJbnN0ZWFkIHVzZSB0aGUgTWF0cml4Lm9mIHN5bnRheCB0byBjcmVhdGUgYSBuZXcgTWF0cml4LiBVbmZvcnR1bmF0bHkganNkb2NzIGRvZXMgbm90IGFsbG93IGZvciB0aGUgY29uc3RydWN0b3IgdG8gYmUgaGlkZGVuLlxuICogQGhpZGVjb250cnVjdG9yXG4gKiBAc2VlIG9mXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKlxuICovXG5sZXQgTWF0cml4ID0gZnVuY3Rpb24gKHZhbCkge1xuICB0aGlzLl9fdmFsdWUgPSB2YWxcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0udHlwZSA9PT0gJ01hdHJpeCdcbiAqL1xuTWF0cml4LnByb3RvdHlwZS50eXBlID0gJ01hdHJpeCdcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJlY2lzaW9uXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS5wcmVjaXNpb24gPT09IDRcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5wcmVjaXNpb24gPSA0XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHNldFByZWNpc2lvblxuICogQHBhcmFtIHByZWNpc2lvbiB7bnVtYmVyfSBTZXQgdGhlIG51bWJlciBvZiBkZWNpbWFscyBmb3Igcm91bmRpbmdcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0uc2V0UHJlY2lzaW9uKDEwKVxuICogbS5wcmVjaXNpb24gPT09IDEwXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc2V0UHJlY2lzaW9uID0gZnVuY3Rpb24gKHByZWNpc2lvbikge1xuICB0aGlzLnByZWNpc2lvbiA9IHByZWNpc2lvblxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc1N5bW1ldHJpY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIHRydWUgPT09IEEuaXNTeW1tZXRyaWMoKVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc1N5bW1ldHJpYyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYSA9IHRoaXMuX192YWx1ZVxuICBjb25zdCBiID0gTWF0cml4LnRyYW5zcG9zZSh0aGlzKS5fX3ZhbHVlXG4gIHJldHVybiBlcXVhbHMoYSwgYilcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNTcXVhcmVcbiAqIEBkZXNjIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgY29udGFpbnMgYSBzcXVhcmUgTWF0cml4XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogdHJ1ZSA9PT0gQS5pc1NxdWFyZSgpXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzU3F1YXJlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZXF1YWxzKHRoaXMuZ2V0Q29scygpLCB0aGlzLmdldFJvd3MoKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNPcnRob2dvbmFsXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IFtbLTAuMzA5MiwgLTAuOTUxMF0sIFstMC45NTEwLCAwLjMwOTJdXVxuICogY29uc3QgQSA9IE1hdHJpeC5mcm9tQXJyYXkocmVzdWx0KVxuICogdHJ1ZSAgPT09IEEuaXNPcnRob2dvbmFsKClcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc09ydGhvZ29uYWwgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEF4QXQgPSB0aGlzLmRvdCh0aGlzLnRyYW5zcG9zZSgpKVxuICBjb25zdCBJID0gdGhpcy5pZGVudGl0eSgpXG4gIHJldHVybiBlcXVhbHMoQXhBdCwgSSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0Q29sc1xuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRDb2xzKCkgID09PSAyXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldENvbHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9fdmFsdWVbMF0ubGVuZ3RoXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGVxdWFsc1xuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYSA9IFtbMSwgMV0sIFsxLCAxXV1cbiAqIHZhciBBID0gTWF0cml4Lm9mKGEpXG4gKiB2YXIgQiA9IE1hdHJpeC5vZihhKVxuICogdHJ1ZSAgPT09IEEuZXF1YWxzKEIpXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIGVxdWFscyh0aGlzLl9fdmFsdWUsIE0uX192YWx1ZSB8fCBNKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRSb3dzXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldFJvd3MoKSAgLy8gMlxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldFJvd3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9fdmFsdWUubGVuZ3RoXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldFNoYXBlXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0U2hhcGUoKSAgLy8gWzIsIDJdXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0U2hhcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBbdGhpcy5nZXRSb3dzKCksIHRoaXMuZ2V0Q29scygpXVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBvZlxuICogQGRlc2MgQ3JlYXRlcyBhIE1hdHJpeCBvYmplY3QgYW5kIGZsYXR0ZW5zIHRoZSBNYXRyaXhcbiAqIEBwYXJhbSB2YWwge2FycmF5fGZ1bmN0aW9ufSBBbiBhcnJheSBvZiBhcnJheXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKlxuICovXG5NYXRyaXgub2YgPSBmdW5jdGlvbiAodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBNYXRyaXgpIHJldHVybiB2YWxcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICB0aGlzLl9fdmFsdWUgPSB2YWxcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIHJldHVybiBuZXcgTWF0cml4KHZhbClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIG0ubWFwKHggPT4geC5tYXAoeSA9PiB5KyAxKSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihtYXAoZikodGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGZ1bmN0aW9uIHRoYXQgbWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IE1hdHJpeCBvciBhcnJheSB0byBtYXBcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgubWFwKHg9ID4geC5tYXAoeSA9PiB5KyAxKSwgW1sxLCAxXSwgWzEsIDFdXSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5tYXAgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLm1hcChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZm9sZFxuICogQGRlc2NyaXB0aW9uIFJlZHVjZSB0aGUgbWF0cml4IHJvd3MgdXNpbmcgYSByZWR1Y2UgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQSByZWR1Y2UvZm9sZCBmdW5jdGlvblxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gRmxhdHRlbiBNYXRyaXhcbiAqIE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKS5mb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2LmNvbmNhdChuZXh0KSlcbiAqIC8vIFsxLCAxLCAxLCAxXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQoZiwgW10pKHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdG8gcmVkdWNlIHRoZSBtYXRyaXggcm93cyB1c2luZyBhIHJlZHVjZSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBIHJlZHVjZS9mb2xkIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fSBUaGUgTWF0cml4IHRvIHJlZHVjZVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG5cbiAqIC8vIFN1bSBvZiBhbGwgbWF0cml4IHZhbHVlc1xuICogY29uc3QgcmVkdWNlciA9IChwcmV2LCBuZXh0KSA9PiBOdW1iZXIocHJldikgKyBuZXh0LnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgKyB4LCAwKVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dXG4gKiBNYXRyaXguZm9sZChyZWR1Y2VyLCBBKVxuICogLy8gNFxuICovXG5NYXRyaXguZm9sZCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuZm9sZChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgTWF0cml4IHRvIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmID0geCA9PiB4LnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMiwgM10sIFs0LCA1LCA2XSwgWzcsIDgsIDldXSlcbiAqIE1hdHJpeC5vZihmKS5hcChNKVxuICogLy8gW1s2XSwgWzE1XSwgWzI0XVxuICovXG5NYXRyaXgucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5tYXAodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBNYXRyaXggdG8gYSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufVxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGYgPSB4ID0+IHgucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dClcbiAqIE1hdHJpeC5hcChmLCBbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0pXG4gKiAvLyBbWzZdLCBbMTVdLCBbMjRdXG4gKi9cbk1hdHJpeC5hcCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZikuYXAoTSlcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIE1hdHJpY2VzIHVzaW5nIGEgZnVuY3Rpb24gYXMgb3BlcmF0b3JcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1swLCAxLCAxXSwgWzIsIDMsIDRdXVxuICogY29uc3QgYiA9IFtbMiwgMiwgMl0sIFszLCAzLCAzXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqIGNvbnN0IE0gPSBBLmNvbmNhdChCKVxuICogLy8gW1swLCAxLCAxLCAyLCAyLCAyXSwgWzIsIDMsIDQsIDMsIDMsIDNdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAoTSwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChmKE0pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBNYXRyaWNlcyB1c2luZyBhIGZ1bmN0aW9uIGFzIG9wZXJhdG9yXG4gKiBAcGFyYW0gQSB7TWF0cml4fVxuICogQHBhcmFtIEIge01hdHJpeH1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbWzAsIDEsIDFdLCBbMiwgMywgNF1dXG4gKiBjb25zdCBiID0gW1syLCAyLCAyXSwgWzMsIDMsIDNdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICogY29uc3QgTSA9IE1hdHJpeC5jb25jYXQoQSwgQilcbiAqIC8vIFtbMCwgMSwgMSwgMiwgMiwgMl0sIFsyLCAzLCA0LCAzLCAzLCAzXV1cbiAqXG4gKi9cbk1hdHJpeC5jb25jYXQgPSBjdXJyeShmdW5jdGlvbiAoQSwgQiwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLm1hcChmKEIpKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChlbXB0eSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5lbXB0eSA9IGN1cnJ5KGZ1bmN0aW9uIChyb3dzID0gMCwgY29scyA9IDApIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YobSkubWFwKGVtcHR5KVxufSlcblxuLy8gIyMjIyAjIyMjICMjIyMgLy9cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaWRlbnRpdHlcbiAqIEBkZXNjIFJldHVybnMgYW4gaWRlbnRpdHkgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQWlkZW50aXR5ID0gQS5pZGVudGl0eSgpXG4gKiAvLyBbWzEsIDAsIDBdLCBbMCwgMSwgMF1dXG4gKlxuKi9cbk1hdHJpeC5wcm90b3R5cGUuaWRlbnRpdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKHRoaXMpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzYyBSZXR1cm5zIGFuIGlkZW50aXR5IG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5pZGVudGl0eSgzLCAyKVxuICogLy8gW1sxLCAwLCAwXSwgWzAsIDEsIDBdXVxuICpcbiAqL1xuTWF0cml4LmlkZW50aXR5ID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKG0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbWJpbmVcbiAqIEBzZWUgTWF0cml4LmNvbmNhdFxuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY29tYmluZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuY29uY2F0KE1hdHJpeC5vZihNKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb21iaW5lXG4gKiBAc2VlIE1hdHJpeC5jb25jYXRcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXguY29tYmluZSA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuY29uY2F0KE1hdHJpeC5vZihCKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQ3JlYXRlIG1hdHJpeFxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzEsIDJdLCBbMywgNF1dKVxuICpcbiAqIC8vIEdlbmVyYXRlIGlkZW50aXR5IG1hdHJpeFxuICogY29uc3QgSSAgPSBtLmlkZW50aXR5KCkgLy8gW1sxLCAwXSwgWzAsIDFdXVxuICpcbiAqIGlmKG0uZG90KEkpLmVxdWFscyhtKSkge1xuICogICAgY29uc29sZS5sb2coJ0RvdCBwcm9kdWN0IHdpdGggaWRlbnRpdHkgbWF0cml4IHJldHVybnMgdGhlIHNhbWUgbWF0cml4JylcbiAqIH1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZG90ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5jb25jYXQoTWF0cml4Lm9mKE0pLCBkb3QodGhpcy5wcmVjaXNpb24pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGEgPSBbWzEsIDIsIDNdLCBbNCwgNSwgNl1dXG4gKiBjb25zdCBiID0gW1s3LCA4XSwgWzksIDEwXSwgWzExLCAxMl1dXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICpcbiAqIE1hdHJpeC5kb3QoQSwgQikgLy8gW1s1OCwgNjRdLCBbMTM5LCAxNTRdXVxuICpcbiAqL1xuTWF0cml4LmRvdCA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuZG90KE1hdHJpeC5vZihCKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZmlsbFxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB0aGUgcHJvdmlkZWQgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLmZpbGwoeCA9PiA0MilcbiAqIC8vIFtbNDIsNDIsNDJdLCBbNDIsNDIsNDJdLCBbNDIsNDIsNDJdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAobWFwKHggPT4gZih4KSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHplcm9zXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHplcm9zXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLnplcm9zKClcbiAqIC8vIFtbMCwwLDBdLCBbMCwwLDBdLCBbMCwwLDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS56ZXJvcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKHggPT4gMClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gemVyb3NcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggemVyb3NcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lnplcm9zKDMsIDMpXG4gKiAvLyBbWzAsMCwwXSwgWzAsMCwwXSwgWzAsMCwwXV1cbiAqXG4gKi9cbk1hdHJpeC56ZXJvcyA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoeCA9PiAwKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS5vbmVzKClcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5vbmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmZpbGwoeCA9PiAxKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9uZXMoMSwgMSlcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4Lm9uZXMgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKHggPT4gMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgcmFuZG9tXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHJhbmRvbSB2YWx1ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDFdXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJhbmRvbSA9IGZ1bmN0aW9uIChmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDEpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKGYpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHJhbmRvbVxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCByYW5kb20gbnVtYmVyc1xuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBGdW5jdGlvbiB3aGljaCByZXR1cm5zIHJhbmRvbSB2YWx1ZXMuIERlZmF1bHQgcmFuZG9tIHZhbHVlcyBhcmUgYmV0d2VlbiAtMSBhbmQgMVxuICogQHBhcmFtIHJvd3Mge251bWJlcn0gRGVmaW5lcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfSBEZWZpbmVzIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5yYW5kb20gPSBmdW5jdGlvbiAoZiA9IGUgPT4gKE1hdGgucmFuZG9tKCkgKiAyIC0gMSksIHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbChmKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB0b0FycmF5XG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBhcnJheSBmcm9tIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlLm1hcChyb3cgPT4gcm93Lm1hcChjb2wgPT4gY29sKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgY2xvbmVcbiAqIEBkZXNjIFJldHVybnMgYSBjbG9uZSBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4LmZyb21BcnJheSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZyb21BcnJheVxuICogQGRlc2MgUmV0dXJucyBhIE1hdHJpeCBmcm9tIGFuIGFycmF5XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbk1hdHJpeC5mcm9tQXJyYXkgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBNYXRyaXgub2YobWFwKHJvdyA9PiBtYXAoY29sID0+IGNvbCkocm93KSkoYXJyKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdKVxuICogY29uc3QgYiA9IEEudHJhbnNwb3NlKCkudG9BcnJheSgpXG4gKiAvLyByZXR1cm5zIFtbLTEsIDMsLThdLCBbMiwgNCwgMl1dXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQodHJhbnNwb3NlLCBbXSwgdGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IEEgTWF0cml4IG9yIGEgbWF0cml4IGFycmF5XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdXG4gKiBjb25zdCBiID0gTWF0cml4LnRyYW5zcG9zZShhKS50b0FycmF5KClcbiAqIC8vIHJldHVybnMgW1stMSwgMywtOF0sIFsyLCA0LCAyXV1cbiAqL1xuTWF0cml4LnRyYW5zcG9zZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkudHJhbnNwb3NlKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGFkZFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gQWRkIGEgTWF0cml4IG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5hZGQoMSkgLy8gW1s2LCA1XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLmFkZChCKSAvLyBbWzEwLCAxMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3QgYWRkJylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKCh2YWwsIGpkeCkgPT4gdmFsICsgTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCArIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdWJ0cmFjdFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gU3VidHJhY3QgYSBNYXRyaXggb3IgYSBudW1iZXJcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLnN1YnRyYWN0KDEpIC8vIFtbNCwgMl1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5zdWJ0cmFjdChCKSAvLyBbWzAsIDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3Qgc3VidHJhY3QnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKHZhbCwgamR4KSA9PiB2YWwgLSBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4IC0gTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIG11bHRpcGx5XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIE11dGxpcGx5IGEgc2NhbGFyIG9yIGEgbXRyYWl4IHdpdGggYSBtYXRyaXguIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbXVsdGlwbGljYXRpb24gaXMgbm90IHBvc3NpYmxlLlxuICogQHBhcmFtIE0ge01hdHJpeHxudW1iZXJ9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5tdWx0aXBseSgyKSAvLyBbWzEwLCA4XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLm11bHRpcGx5KEIpIC8vIFtbMjUsIDI1XV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiAoTSkge1xuICBpZiAoTSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSAhPT0gTS5nZXRDb2xzKCkgfHwgdGhpcy5nZXRSb3dzKCkgIT09IE0uZ2V0Um93cygpKSB7XG4gICAgICBjb25zb2xlLmxvZygnVXNlIHN0YXRpYyBtZXRob2QgXFwnZG90XFwnIHRvIGRvIG1hdHJpeCBtdWx0aXBsaWNhdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHJpY2VzIGRvIG5vdCBtYXRjaCwgY2Fubm90IGNyZWF0ZSBoYWRhbWFyZCBwcm9kdWN0JylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKChjb2wsIGpkeCkgPT4gY29sICogTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCAqIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBhZGRpdGl2ZWludmVyc2VcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtYXRyaXggb2J0YWluZWQgYnkgY2hhbmdpbmcgdGhlIHNpZ24gb2YgZXZlcnkgbWF0cml4IGVsZW1lbnQuIFRoZSBhZGRpdGl2ZSBpbnZlcnNlIG9mIG1hdHJpeCBBIGlzIHdyaXR0ZW4g4oCTQS5cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LC01XSwgWy00LCA0XV0pXG4gKiBjb25zdCBtaW51c0EgPSBBLmFkZGl0aXZlaW52ZXJzZSgpXG4gKiAvLyBbWy01LCA1XSwgWzQsIC00XV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hZGRpdGl2ZWludmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoLTEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBoYWRhbWFyZFxuICogQGluc3RhbmNlXG4gKiBAc2VlIG11bHRpcGx5XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuaGFkYW1hcmQoMikgLy8gW1sxMCwgOF1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5oYWRhbWFyZChCKSAvLyBbWzI1LCAyNV1dXG5cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5oYWRhbWFyZCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoTSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbHVcbiAqIEBkZXNjIENhbGN1bGF0ZXMgTFUgZGVjb21wb3NpdGlvbiBvZiB0aGUgY3VycmVudCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXhbXX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gW1szLCAtNywgLTIsIDJdLCBbLTMsIDUsIDEsIDBdLCBbNiwgLTQsIDAsIC01XSwgWy05LCA1LCAtNSwgMTJdXVxuICogY29uc3QgQSA9IE1hdHJpeC5mcm9tQXJyYXkocmVzdWx0KVxuICogY29uc3QgbHUgPSBBLmx1KClcbiAqIC8vIEwuX192YWx1ZSA9IFsgWyAxLCAwLCAwLCAwIF0sIFsgLTEsIDEsIDAsIDAgXSwgWyAyLCAtNSwgMSwgMCBdLCBbIC0zLCA4LCAzLCAxIF0gXVxuICogLy8gVS5fX3ZhbHVlID0gIFsgWyAzLCAtNywgLTIsIDIgXSwgWyAwLCAtMiwgLTEsIDIgXSwgWyAwLCAwLCAtMSwgMSBdLCBbIDAsIDAsIDAsIC0xIF0gXVxuICogTWF0cml4LmRvdChsdVswXSwgbHVbMV0pIC8vIHJldHVybnMgY2xvbmUgb2YgQVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5sdSA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Um93cygpXG4gIGNvbnN0IHRvbCA9IDFlLTZcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBMID0gdGhpcy56ZXJvcygpXG4gIGNvbnN0IFUgPSB0aGlzLnplcm9zKClcblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGlmIChNYXRoLmFicyhBLl9fdmFsdWVba11ba10pIDwgdG9sKSB0aHJvdyBFcnJvcignQ2Fubm90IHByb2NlZWQgd2l0aG91dCBhIHJvdyBleGNoYW5nZScpXG4gICAgTC5fX3ZhbHVlW2tdW2tdID0gMVxuICAgIGZvciAobGV0IGkgPSBrICsgMTsgaSA8IG47ICsraSkge1xuICAgICAgTC5fX3ZhbHVlW2ldW2tdID0gQS5fX3ZhbHVlW2ldW2tdIC8gQS5fX3ZhbHVlW2tdW2tdXG4gICAgICBmb3IgKGxldCBqID0gayArIDE7IGogPCBuOyArK2opIHtcbiAgICAgICAgQS5fX3ZhbHVlW2ldW2pdID0gQS5fX3ZhbHVlW2ldW2pdIC0gTC5fX3ZhbHVlW2ldW2tdICogQS5fX3ZhbHVlW2tdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGwgPSBrOyBsIDwgbjsgKytsKSB7XG4gICAgICBVLl9fdmFsdWVba11bbF0gPSBBLl9fdmFsdWVba11bbF1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtMLCBVXVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBycmVmXG4gKiBAcmV0dXJucyB7TWF0cml4fGFycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgQSA9IE1hdHJpeC5vZihbWy0xLCAxXSwgWy0xLCAwXSwgWzAsIC0xXSwgWy0xLCAtMl1dKVxuICogQS5ycmVmKCkgLy8gIFsgWyAxLCAwIF0sIFsgLTAsIDEgXSwgWyAwLCAwIF0sIFsgMCwgMCBdIF1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ycmVmID0gZnVuY3Rpb24gKCkge1xuICBsZXQgbGVhZCA9IDBcbiAgY29uc3QgcmVzdWx0TWF0cml4ID0gdGhpcy5jbG9uZSgpXG5cbiAgZm9yIChsZXQgciA9IDA7IHIgPCB0aGlzLmdldFJvd3MoKTsgKytyKSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpIDw9IGxlYWQpIHtcbiAgICAgIHJldHVybiByZXN1bHRNYXRyaXhcbiAgICB9XG4gICAgbGV0IGkgPSByXG4gICAgd2hpbGUgKHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2xlYWRdID09PSAwKSB7XG4gICAgICArK2lcbiAgICAgIGlmICh0aGlzLmdldFJvd3MoKSA9PT0gaSkge1xuICAgICAgICBpID0gclxuICAgICAgICArK2xlYWRcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29scygpID09PSBsZWFkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdE1hdHJpeFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRtcCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldXG4gICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV0gPSByZXN1bHRNYXRyaXguX192YWx1ZVtyXVxuICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdID0gdG1wXG5cbiAgICBsZXQgdmFsID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bbGVhZF1cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZ2V0Q29scygpOyArK2opIHtcbiAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdIC89IHZhbFxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5nZXRSb3dzKCk7ICsraSkge1xuICAgICAgaWYgKGkgPT09IHIpIGNvbnRpbnVlXG4gICAgICB2YWwgPSByZXN1bHRNYXRyaXguX192YWx1ZVtpXVtsZWFkXVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmdldENvbHMoKTsgKytqKSB7XG4gICAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2pdIC09IHZhbCAqIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGxlYWQrK1xuICB9XG4gIHJldHVybiByZXN1bHRNYXRyaXhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgc29sdmVcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNvbHZlIHhBID0gYlxuICogLy8gNXggKyB5ICA9IDdcbiAqIC8vIDN4IC0gNHkgPSAxOFxuICogLy8gU29sdXRpb24gZm9yIHggYW5kIHk6XG4gKiAvLyB4ID0gMlxuICogLy8geSA9IC0zXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDFdLCBbMywgLTRdXSlcbiAqIGNvbnN0IHNvbHZlQSA9IEEuc29sdmUoWzcsIDE4XSkgLy8gWzIsIC0zXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uIChiKSB7XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgTFUgPSBBLmx1KClcbiAgY29uc3QgTCA9IExVWzBdXG4gIGNvbnN0IFUgPSBMVVsxXVxuICBjb25zdCBuID0gdGhpcy5nZXRSb3dzKClcbiAgbGV0IHMgPSAwXG4gIGNvbnN0IGMgPSBbXVxuICBjb25zdCB4ID0gW11cblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgazsgKytqKSB7XG4gICAgICBzID0gcyArIEwuX192YWx1ZVtrXVtqXSAqIGNbal1cbiAgICB9XG4gICAgY1trXSA9IGJba10gLSBzXG4gICAgcyA9IDBcbiAgfVxuICBmb3IgKGxldCBhID0gbiAtIDE7IGEgPiAtMTsgLS1hKSB7XG4gICAgbGV0IHQgPSAwXG4gICAgZm9yIChsZXQgYiA9IGEgKyAxOyBiIDwgbjsgKytiKSB7XG4gICAgICB0ID0gdCArIFUuX192YWx1ZVthXVtiXSAqIHhbYl1cbiAgICB9XG4gICAgeFthXSA9IChjW2FdIC0gdCkgLyBVLl9fdmFsdWVbYV1bYV1cbiAgfVxuICByZXR1cm4geFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgaW52ZXJzZVxuICogQGluc3RhbmNlXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsyLCA0XV0pLmludmVyc2UoKVxuICogLy8gWyBbIDIsIC0wLjUgXSwgWyAtMSwgMC41IF0gXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pbnZlcnNlID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IEkgPSBBLmlkZW50aXR5KClcbiAgY29uc3QgSW52ID0gQS5jb25jYXQoSSkucnJlZigpXG5cbiAgY29uc3QgcmVzdWx0ID0gSW52Ll9fdmFsdWUucmVkdWNlKChyZXN1bHQsIHgsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGhhbGYgPSB4Lmxlbmd0aCAvIDJcbiAgICByZXN1bHQucHVzaCh4LnNsaWNlKGhhbGYsIHgubGVuZ3RoKSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sIFtdKVxuICByZXR1cm4gTWF0cml4Lm9mKHJlc3VsdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHJhbmtcbiAqIEBpbnN0YW5jZVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5yYW5rID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBycmVmID0gdGhpcy5ycmVmKClcbiAgbGV0IHJlc3VsdCA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBycmVmLmdldENvbHMoKTsgKytpKSB7XG4gICAgcmVzdWx0ICs9IHJyZWYuX192YWx1ZVtpXVtpXVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpbWVuc2lvblxuICogQGluc3RhbmNlXG4gKiBAc2VlIHJhbmtcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGltZW5zaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yYW5rKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZygpXG4gKiAvLyBbMSwgMSwgMV1cbiAqXG4gKiBjb25zdCBkaWFnMCA9IE1hdHJpeC56ZXJvcyg1LCA1KS5kaWFnKClcbiAqIC8vIFswLCAwLCAwLCAwLCAwXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaWFnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBpZHgpID0+IHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdCh4W2lkeF0pXG4gIH0pKFtdKSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGRpYWdcbiAqIEBkZXNjIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5kaWFnKFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyBbMiwgNV1cbiAqXG4gKi9cbk1hdHJpeC5kaWFnID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFnKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdwcm9kdWN0XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZ3Byb2R1Y3QoKVxuICogLy8gMVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLmRpYWdwcm9kdWN0KClcbiAqIC8vIDBcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGlhZ3Byb2R1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGlkeCkgPT4ge1xuICAgIGFjYyAqPSB4W2lkeF1cbiAgICByZXR1cm4gYWNjXG4gIH0pKDEpKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gZGlhZ3Byb2R1Y3RcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LmRpYWdwcm9kdWN0KFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyAxMFxuICpcbiAqL1xuTWF0cml4LmRpYWdwcm9kdWN0ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFncHJvZHVjdCgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdW1cbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIE1hdHJpeFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5zdW0oKVxuICogLy8gOVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLnN1bSgpXG4gKiAvLyAwXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnN1bSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCkgPT4ge1xuICAgIGFjYyArPSBmb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dCkoMCkoeClcbiAgICByZXR1cm4gYWNjXG4gIH0pKDApKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gc3VtXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgTWF0cml4XG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5zdW0oW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIDlcbiAqXG4gKi9cbk1hdHJpeC5zdW0gPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLnN1bSgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBrcm9uZWNrZXJcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgVGhlIEtyb25lY2tlciBwcm9kdWN0IGlzIGFuIG9wZXJhdGlvbiBvbiB0d28gbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUgcmVzdWx0aW5nIGluIGEgYmxvY2sgbWF0cml4LlxuICogQHBhcmFtIE0ge01hdHJpeH0gVGhlIHJpZ2h0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0ICh0aGlzIOKKlyBNKVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5rcm9uZWNrZXIgPSBmdW5jdGlvbiAoTSkge1xuICBjb25zdCBtID0gdGhpcy5nZXRSb3dzKClcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Q29scygpXG4gIGNvbnN0IHAgPSBNLmdldFJvd3MoKVxuICBjb25zdCBxID0gTS5nZXRDb2xzKClcblxuICBjb25zdCBsZWZ0ID0gdGhpcy5fX3ZhbHVlXG4gIGNvbnN0IHJpZ2h0ID0gTS5fX3ZhbHVlXG5cbiAgY29uc3QgZnJhbWUgPSBnZW5lcmF0ZShtICogcCwgbiAqIHEpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBwOyBrKyspIHtcbiAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBxOyBsKyspIHtcbiAgICAgICAgICBmcmFtZVtwICogaSArIGtdW3EgKiBqICsgbF0gPSBsZWZ0W2ldW2pdICogcmlnaHRba11bbF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gTWF0cml4Lm9mKGZyYW1lKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBrcm9uZWNrZXJcbiAqIEBkZXNjIFRoZSBLcm9uZWNrZXIgcHJvZHVjdCBpcyBhbiBvcGVyYXRpb24gb24gdHdvIG1hdHJpY2VzIG9mIGFyYml0cmFyeSBzaXplIHJlc3VsdGluZyBpbiBhIGJsb2NrIG1hdHJpeC5cbiAqIEBwYXJhbSBBIHtNYXRyaXh9IFRoZSBsZWZ0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0IChBIOKKlyBCKVxuICogQHBhcmFtIEIge01hdHJpeH0gVGhlIHJpZ2h0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0IChBIOKKlyBCKVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4Lmtyb25lY2tlciA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkua3JvbmVja2VyKEIpXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hdHJpeFxuIiwiaW1wb3J0IGN1cnJ5IGZyb20gJ2Z1bi5qcy9zcmMvY3VycnknXG5pbXBvcnQgY29uY2F0IGZyb20gJ2Z1bi5qcy9zcmMvY29uY2F0J1xuXG4vKipcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIChNLCBtLCBpZHgpIHtcbiAgcmV0dXJuIGNvbmNhdChtLCBNLl9fdmFsdWVbaWR4XSlcbn0pXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnZnVuLmpzL3NyYy9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkobSA9PiBbXSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICdmdW4uanMvc3JjL2N1cnJ5J1xuaW1wb3J0IGZvbGQgZnJvbSAnZnVuLmpzL3NyYy9mb2xkJ1xuaW1wb3J0IG1hcCBmcm9tICdmdW4uanMvc3JjL21hcCdcbmltcG9ydCByb3VuZCBmcm9tICcuL3JvdW5kJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBwYXJhbSBCIHtNYXRyaXh9XG4gKiBAcGFyYW0gYSB7QXJyYXl9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChkZWNpbWFscywgQiwgYSkgPT4gbWFwKChpdGVtLCBpKSA9PiB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGopID0+IHtcbiAgICBhY2MgKz0gcm91bmQoeCAqIEIuX192YWx1ZVtqXVtpXSwgZGVjaW1hbHMpXG4gICAgcmV0dXJuIGFjY1xuICB9LCAwKShhKVxufSkoQi5fX3ZhbHVlWzBdKSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHJvdW5kXG4gKiBAcGFyYW0gdmFsdWUge251bWJlcn1cbiAqIEBwYXJhbSBkZWNpbWFscyB7bnVtYmVyfVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm91bmQgKHZhbHVlLCBkZWNpbWFscykge1xuICByZXR1cm4gTnVtYmVyKE1hdGgucm91bmQodmFsdWUgKyAnZScgKyBkZWNpbWFscykgKyAnZS0nICsgZGVjaW1hbHMpXG59XG4iLCJpbXBvcnQgbWFwIGZyb20gJ2Z1bi5qcy9zcmMvbWFwJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBpZGVudGl0eVxuICogQGRlc2MgQ3JlYXRlcyBhbiBpZGVudGl5IG1hdHJpeCBmcm9tIGFuIGVtcHR5IGFycmF5XG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChtLCBpZHgpID0+IG1hcCgocm93cywgamR4KSA9PiAoaWR4ID09PSBqZHgpICogMSkobSlcbiIsImltcG9ydCBtYXAgZnJvbSAnZnVuLmpzL3NyYy9tYXAnXG5pbXBvcnQgY3VycnkgZnJvbSAnZnVuLmpzL3NyYy9jdXJyeSdcblxuLyoqXG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBUcmFuc3Bvc2VzIGEgYXJyYXkgb2YgYXJyYXlzIHVzaW5nIHRoZSBNYXRyaXgubWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChwcmV2LCBuZXh0KSA9PiBtYXAoKGl0ZW0sIGkpID0+IChwcmV2W2ldIHx8IFtdKS5jb25jYXQobmV4dFtpXSkpKG5leHQpKVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVcbiAqIEBkZXNjIEdlbmVyYXRvciBmdW5jdGlvbiBmb3IgYSBtYXRyaXggYXJyYXksIHZhbHVlcyBhcmUgc2V0IHRvIHVuZGVmaW5lZFxuICogQHBhcmFtIHJvd3Mge251bWJlcn1cbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7YW55W11bXX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKHJvd3MsIGNvbHMpID0+IEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBleGlzdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhpc3RzICh4KSB7XG4gIHJldHVybiAhKHggPT0gbnVsbClcbn07XG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ051bWJlcicpXG4iLCIvKipcbiAqIENoZWNrcyBpZiBib3RoIHByZWRpY2F0ZXMgYXJlIHRydWVcbiAqXG4gKiBAZnVuY3Rpb24gYW5kXG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGJvdGggcHJlZGljYXRlcyBhcmUgdHJ1ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoeCwgeSkgLT4gYm9vbGVhblxuICogQHBhcmFtIHsqfSB4IC0gQSBwcmVkaWNhdGVcbiAqIEBwYXJhbSB7Kn0geSAtIEEgcHJlZGljYXRlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFuZCAoeCwgeSkge1xuICByZXR1cm4geCAmJiB5XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNOYU5cbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgbnVtYmVyIGlzIE5BTlxuXG4gKi9cbmltcG9ydCBpc051bWJlciBmcm9tICcuL2lzJ1xuaW1wb3J0IGFuZCBmcm9tICcuLi9hbmQnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTmFuICh4KSB7XG4gIHJldHVybiBhbmQoaXNOdW1iZXIoeCksIGlzTmFOKHgpKVxufTtcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpY2FsXG4gKiBAZGVzY3JpcHRpb24gY2hlY2tzIGZvciBpZGVudGludGljYWwgaXRlbXNcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXNOYW4gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlkZW50aWNhbCAoeCwgeSkge1xuICBpZiAoeCA9PT0gMCAmJiB5ID09PSAwKSB7XG4gICAgcmV0dXJuIDEgLyB4ID09PSAxIC8geVxuICB9XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gISEoaXNOYW4oeCkgJiYgaXNOYW4oeSkpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbm90XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBub3QgKHgpIHtcbiAgcmV0dXJuICF4XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gb3JcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgb25lIG9yIHRoZSBvdGhlciBpcyB0cnVlXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBvciAoeCwgeSkge1xuICByZXR1cm4geCB8fCB5XG59KVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnT2JqZWN0JylcbiIsIi8qKlxuICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXksIGF1dG9jdXJyaWVkIGZ1bmN0aW9uXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXksIGF1dG9jdXJyaWVkIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IE9iamVjdCB0byB2ZXJpZml5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzQXJyYXkoWzEsMSwxXSlcbiAqIC8vIHJlc3VsdCA9IHRydWVcbiAqL1xuXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdBcnJheScpXG4iLCIvKipcbiAqIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IEl0ZW0gdG8gdmVyaWZ5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICoqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQm9vbGVhbicpXG4iLCIvKipcblxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdTdHJpbmcnKVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG4vKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0RhdGUnKVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGVxdWFsc0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gZm9yIGRlZXAgY29tcGFyaXNvbiBvZiBhcnJheXNcbiAqIEBwYXJhbSB7YX0geCAtIE9iamVjdCB0byBjb21wYXJlIG9mIHR5cGUgYVxuICogQHBhcmFtIHthfSB5IC0gT2JqZWN0IHggdG8gY29tcGFyZSB3aXRoIG9iamVjdCB4XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBlcXVhbHNBcnJheSAoeCwgeSkge1xuICBpZiAoeC5sZW5ndGggIT09IHkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG5vdChlcXVhbHMoeFtpXSwgeVtpXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuLi9leGlzdHMnXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgoeCwgeSkgPT4ge1xuICBmb3IgKGxldCBrZXlYIGluIHgpIHtcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbmZpbHRlcmVkRm9ySW5Mb29wXG4gICAgaWYgKG5vdChlcXVhbHMoeFtrZXlYXSwgeVtrZXlYXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAobGV0IGtleVkgaW4geSkge1xuICAgIGlmIChub3QoZXhpc3RzKHhba2V5WV0pKSAmJiBleGlzdHMoeVtrZXlZXSkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVxdWFsc1xuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBlcXVhbGl0eSBvZiAyIGl0ZW1zXG4gKiBAcGFyYW0geyp9IHggLSBMZWZ0IHNpZGUgb2YgdGhlIGVxdWFsaXR5IGNoZWNrXG4gKiBAcGFyYW0geyp9IHkgLSBSaWdodCBzaWRlIG9mIHRoZSBlcXVhbGl0eSBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbmFuID0gTnVtYmVyLk5hTlxuICogZXF1YWwobmFuLCBuYW4pIC8vIHJldHVybnMgdHJ1ZVxuICpcbiAqIGNvbnN0IGFycjEgPSBbMCwgMSwgMiwgM11cbiAqIGNvbnN0IGFycjIgPSBbbnVsbCwgMSwgMiwgM11cbiAqIGVxdWFscyhhcnIxLCBhcnIyKSAvLyByZXR1cm5zIGZhbHNlXG4gKlxuICogZXF1YWxzKG5ldyBPYmplY3QoeydhJzogMCwgJ2InOiAxfSksIHsnYSc6IDAsICdiJzogMX0pIC8vIHRydWVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuL2V4aXN0cydcbmltcG9ydCBpZGVudGljYWwgZnJvbSAnLi9pZGVudGljYWwnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5pbXBvcnQgbm90IGZyb20gJy4vbm90J1xuaW1wb3J0IG9yIGZyb20gJy4vb3InXG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9vYmplY3QvaXMnXG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2FycmF5L2lzJ1xuaW1wb3J0IGlzQm9vbGVhbiBmcm9tICcuL2Jvb2xlYW4vaXMnXG5pbXBvcnQgaXNOdW1iZXIgZnJvbSAnLi9udW1iZXIvaXMnXG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnLi9zdHJpbmcvaXMnXG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vZGF0ZS9pcydcbmltcG9ydCBlcXVhbHNBcnJheSBmcm9tICcuL2FycmF5L2VxdWFscydcbmltcG9ydCBlcXVhbHNPYmplY3QgZnJvbSAnLi9vYmplY3QvZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBlcXVhbHMgKHgsIHkpIHtcbiAgaWYgKGlkZW50aWNhbCh4LCB5KSkgcmV0dXJuIHRydWVcblxuICBpZiAodHlwZSh4KSAhPT0gdHlwZSh5KSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKG9yKG5vdChleGlzdHMoeCkpLCBub3QoZXhpc3RzKHkpKSkpIHJldHVybiBmYWxzZVxuXG4gIGlmICh4LmNvbnN0cnVjdG9yICE9PSB5LmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2VcblxuICBpZiAoaXNTdHJpbmcoeCkgfHwgaXNCb29sZWFuKHgpIHx8IGlzTnVtYmVyKHgpIHx8IGlzRGF0ZSh4KSkge1xuICAgIHJldHVybiBpZGVudGljYWwoeC52YWx1ZU9mKCksIHkudmFsdWVPZigpKVxuICB9XG4gIGlmIChpc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIGVxdWFsc0FycmF5KHgsIHkpXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoeCkpIHtcbiAgICByZXR1cm4gZXF1YWxzT2JqZWN0KHgsIHkpXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGFycmF5Q29uY2F0XG4gKiBAcGFyYW0gYTFcbiAqIEBwYXJhbSBhMlxuICogQHJldHVybnMge1RbXX1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoYSwgYilcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gc3RyaW5nQ29uY2F0XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7IC8vIHVzZSBmdW5jdGlvbigpLCBhcnJvdyBmdW5jdGlvbiBkb2Vzbid0IGJpbmQgYXJndW1lbnRzXG4gIHJldHVybiBTdHJpbmcoYSkgKyBTdHJpbmcoYilcbn1cbiIsIi8qKlxuICogQ29uY2F0ZW5hdGVzIDIgaXRlbXMgdG9nZXRoZXJcbiAqXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgaXRlbXMgdG9nZXRoZXJcbiAqIEBzaW5jZSB2MS4wLjRcbiAqIEBwYXJhbSB7YX0gYSAtIExlZnQgc2lkZSBvZiB0aGUgY29uY2F0ZW5hdGlvblxuICogQHBhcmFtIHthfSBiIC0gcmlnaHQgc2lkZSBvZiB0aGUgY29uY2F0ZW5hdGlvblxuICogQHJldHVybiB7YX0gQ29uY2F0ZW5hdGVkIGl0ZW1cbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlDb25jYXQgZnJvbSAnLi9hcnJheS9jb25jYXQnXG5pbXBvcnQgc3RyaW5nQ29uY2F0IGZyb20gJy4vc3RyaW5nL2NvbmNhdCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgJ1N0cmluZyc6IHN0cmluZ0NvbmNhdCxcbiAgICAnQXJyYXknOiBhcnJheUNvbmNhdFxuICB9XG4gIHJldHVybiB0eXBlTWFwW3R5cGUoYSldKGEsIGIpXG59KVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("@astuanax/funmatrix",[],n):"object"==typeof exports?exports["@astuanax/funmatrix"]=n():t["@astuanax/funmatrix"]=n()}("undefined"!=typeof self?self:this,function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var u=n[r]={i:r,l:!1,exports:{}};return t[r].call(u.exports,u,u.exports,e),u.l=!0,u.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var u in t)e.d(r,u,function(n){return t[n]}.bind(null,u));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=24)}([function(t,n,e){"use strict";function r(t){const n=t.length;return 0===n?t:e([]);function e(r){return function(){return function(r,u){const o=r.concat(u);return o.length{e.set(r,t(n,r,u))}),e}),a=Object(r.default)(function(t,n){let e=-1;const r=n.length;let u="";for(;++en.slice(r,r+t),e)}),c=Object(r.default)(function(t,n){return+t+ +n}),i=Object(r.default)(function(t,n,e){let r=0;return t(function(t){return n(t,r++)},e)}),f=Object(r.default)(function(t,n,e){const r=Array.prototype.slice.call(e),u=n<0?r.length+n:n;return e[u]?(r[u]=t(r[u]),r):r}),a=Object(r.default)(function(t,n,e){return Object(u.default)(e=>n(e)?t(e):e,Array.prototype.slice.call(e))}),l=Object(r.default)(function(t,n){let e=!0;for(let r in n)if(!t(n[r])){e=!1;break}return e}),s=Object(r.default)(function(t,n){for(let e=0;et(e)(n(e)):Object(j.a)((t,e)=>t.concat(Object(y.a)(Object(v.a)(e),n)),[],t)}),m=Object(r.default)(function(t,n){return Array.prototype.concat(t,n)});function w(t,n){return String(t)+String(n)}var x=e(2),M=Object(r.default)(function(t,n){return{String:w,Array:m}[Object(x.a)(t)](t,n)}),A=Object(r.default)(function(t,n){return M(n,[t])}),S=Object(r.default)(function(t,n){return t.apply(t,n)}),P=Object(v.a)(function(t){return Object(r.default)(function(n,e){return t(n,e)})}),C=Object(r.default)(function(t,n){return t.bind(n)}),k=e(9),N=Object(r.default)(function(t){const n=Object(v.a)(Object(r.default)(t));return Object(r.default)(function(){return Object(k.default)(g,Object(u.default)(n,arguments[0]),Array.prototype.slice.call(arguments,1))})}),R=Object(r.default)(function(t,n){return Object(O.a)("Function")(t)?function(){return t.apply(this,arguments)&&n.apply(this,arguments)}:N(p.a)(t,n)}),D=Object(r.default)(function(t){return t.apply(t,[].slice.call(arguments,1))}),E=e(4);var F=N(E.a);function z(){let t=Array.prototype.slice.call(arguments);return function(){let n=t[t.length-1],e=[n.apply(n,arguments)],r=t.length-2;for(;r>=0;--r){const n=t[r];e=[n.apply(n,e)]}return e[0]}}function T(t){return function(n){for(var e=0;eM(n,t(e)),Object(U.a)(n),n)});function tt(t){let n=1===(e=arguments).length?[e[0]]:Array.apply(null,e);var e;return n.shift(),t.replace(/{(\d+)}/g,(t,e)=>Object(E.a)(Object(O.a)("Undefined",n[e]))?n[e]:t)}var nt=Object(r.default)(function(t,n){return Object.prototype.hasOwnProperty.call(n,t)}),et=Object(r.default)(function(t,n){return t in n}),rt=e(10);function ut(t){return t}var ot=e(15),ct=e(21),it=e(16);function ft(t){return Object(W.a)(t)&&Object(B.default)(t,Object(U.a)(t))}var at=t=>J(new Date)(t)<0,lt=Object(O.a)("Map"),st=e(18),dt=Object(O.a)("null"),pt=e(13),bt=e(11),ht=Object(O.a)("Set"),vt=e(22),Ot=Object(O.a)("undefined");function jt(t){return Object(it.a)(t)&&isFinite(t.valueOf())}let yt=function(t){return this._value=t,this};yt.prototype.isJust=function(){return!0},yt.prototype.isNothing=function(){return!1};var _t=yt,gt=Object(r.default)(function(t){return t.keys()}),mt=Object(r.default)(function(t){switch(Object(x.a)(t)){case"Map":return gt(t);default:return Object(G.a)(t)}}),wt=Object(r.default)(function(t){const n=[];for(const e in t)n.push(e);return n}),xt=Object(v.a)(function(t){return t&&t.length?t[t.length-1]:void 0}),Mt=Object(r.default)(function(t,n){return n>t?n:t});let At=function(){};At.prototype.isJust=function(){return!1},At.prototype.isNothing=function(){return!0};var St=At;let Pt=function(t){this.__value=t};Pt.of=function(t){return t instanceof Pt?t:this instanceof Pt?(this.__value=t,this):new Pt(t)},Pt.prototype.getOrElse=function(t){return this.isNothing()?t:this.__value},Pt.prototype.map=function(t){return this.isNothing()?Pt.of(null):Pt.of(t(this.__value))},Pt.prototype.ap=function(t){return t.map(this.__value)},Pt.prototype.isNothing=function(){return null==this.__value},Pt.prototype.isJust=function(){return!this.isNothing()},Pt.prototype.Nothing=function(){return new St},Pt.prototype.Just=function(){return new _t(this._value)};var Ct=Pt,kt=Object(r.default)(function(t,n){return Array.from(new Set(t.concat(n)))});const Nt=Object(r.default)((t,n)=>{let e=Object.assign({},t);if(Object(rt.a)(t,n))return Object.assign({},t);for(let r in n){if(!Object.prototype.hasOwnProperty.call(n,r))continue;const u=n[r],o=t[r];Object(bt.a)(u)&&Object(bt.a)(o)?e[r]=Nt(u,o):Object(ot.a)(o)?e[r]=kt(o,u):e[r]=u}return e});var Rt=Nt,Dt=Object(r.default)(function(t,n){return+t*+n}),Et=Object(r.default)((t,n)=>{let e={};return Object.keys(t).filter(t=>-1===n.indexOf(t)).forEach(n=>{e[n]=t[n]}),e}),Ft=e(20),zt=Object(r.default)(function(t,n){let e,r=n,u=0;for(;ut/864e5,Bt=t=>t/36e5,Wt=t=>t/6e4,Ht=t=>t/1e3;function Vt(t){return!1!==t&&Object(W.a)(t)}var Gt=Object(v.a)(function(t){const n=Object(G.a)(t),e=n.length,r=[];let u=0;for(;u{for(let e in t)if(Object(i.a)(O(t[e],n[e])))return!1;for(let e in n)if(Object(i.a)(Object(u.a)(t[e]))&&Object(u.a)(n[e]))return!1;return!0}),O=n.default=Object(r.default)(function(t,n){return!!Object(o.a)(t,n)||Object(c.a)(t)===Object(c.a)(n)&&(!Object(f.a)(Object(i.a)(Object(u.a)(t)),Object(i.a)(Object(u.a)(n)))&&(t.constructor===n.constructor&&(Object(p.a)(t)||Object(s.a)(t)||Object(d.a)(t)||Object(b.a)(t)?Object(o.a)(t.valueOf(),n.valueOf()):Object(l.a)(t)?h(t,n):!!Object(a.a)(t)&&v(t,n))))})},function(t,n,e){"use strict";e.d(n,"a",function(){return o});var r=e(13),u=e(14);function o(t){return Object(u.a)(Object(r.a)(t),isNaN(t))}},function(t,n,e){"use strict";var r=e(0);n.a=Object(r.default)(function(t,n){let e=-1;const r=n.length,u=new Array(r);for(;++e1&&void 0!==arguments[1]?arguments[1]:i.default;return b.of(this).map(n(t))},b.concat=(0,r.default)(function(t,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:i.default;return b.of(t).map(e(n))}),b.prototype.empty=function(){return b.of(this).map(f.default)},b.empty=(0,r.default)(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,e=(0,d.default)(t,n);return b.of(e).map(f.default)}),b.prototype.identity=function(){return b.of(l.default).ap(this)},b.identity=function(t,n){var e=(0,d.default)(t,n);return b.of(l.default).ap(e)},b.prototype.combine=function(t){return b.of(this).concat(b.of(t),i.default)},b.combine=function(t,n){return b.of(t).concat(b.of(n),i.default)},b.prototype.dot=function(t){return b.of(this).concat(b.of(t),(0,a.default)(this.precision))},b.dot=function(t,n){return b.of(t).dot(b.of(n))},b.prototype.fill=function(t){return b.of(this).map((0,u.default)(function(n){return t(n)}))},b.prototype.zeros=function(){return b.of(this).fill(function(t){return 0})},b.zeros=function(t,n){var e=(0,d.default)(t,n);return b.of(e).fill(function(t){return 0})},b.prototype.ones=function(){return b.of(this).fill(function(t){return 1})},b.ones=function(t,n){var e=(0,d.default)(t,n);return b.of(e).fill(function(t){return 1})},b.prototype.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1};return b.of(this).fill(t)},b.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1},n=arguments[1],e=arguments[2],r=(0,d.default)(n,e);return b.of(r).fill(t)},b.prototype.toArray=function(){return this.__value.map(function(t){return t.map(function(t){return t})})},b.prototype.clone=function(){return b.fromArray(this.__value)},b.fromArray=function(t){return b.of((0,u.default)(function(t){return(0,u.default)(function(t){return t})(t)})(t))},b.prototype.transpose=function(){return b.of((0,o.default)(s.default,[],this.__value))},b.transpose=function(t){return b.of(t).transpose()},b.prototype.add=function(t){if(t instanceof b){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot add");return this.map(function(n,e){return(0,u.default)(function(n,r){return n+t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n+t}))},b.prototype.subtract=function(t){if(t instanceof b){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot subtract");return this.map(function(n,e){return(0,u.default)(function(n,r){return n-t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n-t}))},b.prototype.multiply=function(t){if(t instanceof b){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw console.log("Use static method 'dot' to do matrix multiplication"),new Error("Matrices do not match, cannot create hadamard product");return this.map(function(n,e){return(0,u.default)(function(n,r){return n*t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n*t}))},b.prototype.additiveinverse=function(){return b.of(this).multiply(-1)},b.prototype.hadamard=function(t){return b.of(this).multiply(t)},b.prototype.lu=function(){for(var t=this.getRows(),n=this.clone(),e=this.zeros(),r=this.zeros(),u=0;u-1;--l){for(var s=0,d=l+1;d1&&void 0!==arguments[1]?arguments[1]:void 0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,u=n||t,o=(0,r.map)(function(t){return e})(new Array(u));return(0,r.map)(function(t){return o})(new Array(t))},t.exports=n.default}])}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL19wcml2YXRlL2N1cnJ5MS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbm90LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwZXJ0dXJlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvYWRkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGRJbmRleC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWRqdXN0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGp1c3RXaXRoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbGwuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FsbFBhc3MuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Fsd2F5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW55LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbnlQYXNzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXBwbHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2JpbmFyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYmluZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbGlmdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9ib3RoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jYWxsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb21wbGVtZW50LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb21wb3NlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kZWZhdWx0VG8uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvZGlmZkRhdGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9kaXZpZGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vRi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmlyc3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZsYXRNYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3N0cmluZy9mb3JtYXRTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L3RvLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaGFzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaGFzSW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pc0VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL2lzRnV0dXJlRGF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udWxsL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zZXQvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3VuZGVmaW5lZC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pc1ZhbGlkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tb25hZHMvSnVzdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2xhc3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL05vdGhpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21vbmFkcy9NYXliZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvdW5pb24uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9tZXJnZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL211bHRpcGx5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qvb21pdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3BhdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9waWNrLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvcHJvcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL3N1bS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9ULmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvRGF5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvSG91ci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b01pbnV0ZXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvdG9TZWNvbmRzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy90cnV0aHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3ppcFdpdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3ppcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pc05hbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9mb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvbWF0cml4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9kb3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL3JvdW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvdHJhbnNwb3NlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9nZW5lcmF0ZS5qcyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJkZWZpbmUiLCJhbWQiLCJzZWxmIiwidGhpcyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJjdXJyeSIsImZ1biIsImFyZ3NsZW4iLCJsZW5ndGgiLCJjcmVhdGVSZWN1cnNlciIsImFjYyIsImFyZ3MiLCJfYWNjIiwiY29uY2F0IiwiYXBwbHkiLCJyZWN1cnNlIiwiQXJyYXkiLCJzbGljZSIsImFyZ3VtZW50cyIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY3VycnlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyIsIl90eXBlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18iLCJDdG9yIiwidmFsIiwiX3ByaXZhdGVfY3VycnkxX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18iLCJ4IiwidG9TdHJpbmciLCJjdXJyeTEiLCJmbiIsImEiLCJleGlzdHMiLCJlbXB0eSIsImNvbnN0cnVjdG9yIiwia2V5cyIsIm9iamVjdF9tYXAiLCJjYiIsImsiLCJtYXBfbWFwIiwiZm9yRWFjaCIsInYiLCJtYXAiLCJzZXQiLCJzdHJpbmdfbWFwIiwiY2hhckF0IiwiaXRlcmF0b3JfbWFwIiwiY2FsbGJhY2siLCJpdGVyYXRvciIsIm5leHRWYWx1ZSIsIm5leHQiLCJkb25lIiwicHVzaCIsImlzRnVuY3Rpb24iLCJpcyIsInR5cGUiLCJhcnJheV9tYXAiLCJvYmplY3RfZm9sZCIsImluaXQiLCJhcnJheV9mb2xkIiwiX251bWJlcl9pc05hbl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fIiwieSIsIl9pc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fIiwic3JjX2FwZXJ0dXJlIiwicmVzIiwic3JjX21hcCIsIml0ZW0iLCJpZHgiLCJhZGQiLCJiIiwiYWRkSW5kZXgiLCJmIiwiZyIsImFkanVzdCIsInNyY19hZGp1c3RXaXRoIiwicHJlZCIsInNyY19hbGwiLCJhbGxQYXNzIiwiY2JzIiwiYWx3YXlzIiwiYW55IiwiYW55UGFzcyIsInNyY19hcCIsImZucyIsInZhbHMiLCJhcCIsImZvbGQiLCJhcnJheV9jb25jYXQiLCJjb25jYXRfY29uY2F0IiwiU3RyaW5nIiwic3JjX2NvbmNhdCIsInNyY19hcHBlbmQiLCJlbCIsImxpc3QiLCJzcmNfYmluYXJ5IiwiY29udGV4dCIsInNyY19saWZ0IiwibGlmdGVkIiwic3JjX2ZvbGQiLCJib29sZWFuX2JvdGgiLCJmbjEiLCJmbjIiLCJhbmQiLCJzcmNfY29tcGxlbWVudCIsIm5vdCIsImNvbXBvc2UiLCJyZXN1bHQiLCJjb25kIiwiY29uZHMiLCJkZWZhdWx0VG8iLCJkaWZmRGF0ZSIsInN0YXJ0IiwiZW5kIiwiRGF0ZSIsImdldFRpbWUiLCJkaXZpZGUiLCJGIiwiYXJyYXlfZmlsdGVyIiwib2JqZWN0X2ZpbHRlciIsIm1hcF9maWx0ZXIiLCJNYXAiLCJpdCIsImVudHJpZXMiLCJzcmNfZmlsdGVyIiwiZmluZEluZGV4IiwiZmlyc3QiLCJ1bmRlZmluZWQiLCJmbGF0TWFwX2lzRnVuY3Rpb24iLCJzcmNfZmxhdE1hcCIsImZsYXRNYXAiLCJmb3JtYXRTdHJpbmciLCJzdHIiLCJzaGlmdCIsInJlcGxhY2UiLCJtYXRjaCIsImhhcyIsInByb3AiLCJvYmoiLCJoYXNJbiIsImlkZW50aXR5IiwiaXNFbXB0eSIsImVxdWFscyIsImlzRnV0dXJlRGF0ZSIsIm1hcF9pcyIsIm51bGxfaXMiLCJzZXRfaXMiLCJ1bmRlZmluZWRfaXMiLCJpc1ZhbGlkIiwiZGF0ZV9pcyIsImlzRmluaXRlIiwidmFsdWVPZiIsIkp1c3QiLCJfdmFsdWUiLCJpc0p1c3QiLCJpc05vdGhpbmciLCJtb25hZHNfSnVzdCIsIm1hcF9rZXlzIiwic3JjX2tleXMiLCJrZXlzSW4iLCJsYXN0IiwibWF4IiwiTm90aGluZyIsIm1vbmFkc19Ob3RoaW5nIiwiTWF5YmUiLCJfX3ZhbHVlIiwib2YiLCJnZXRPckVsc2UiLCJtb25hZHNfTWF5YmUiLCJ1bmlvbiIsImFMIiwiYVIiLCJmcm9tIiwiU2V0IiwibWVyZ2UiLCJvYmpMIiwib2JqUiIsImFzc2lnbiIsImlkZW50aWNhbCIsIm9sZFZhbHVlIiwibmV3VmFsdWUiLCJvYmplY3RfaXMiLCJhcnJheV9pcyIsIm9iamVjdF9tZXJnZSIsIm11bHRpcGx5Iiwib21pdCIsIm5hbWVzIiwiZmlsdGVyIiwiaW5kZXhPZiIsInBhdGgiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJwaWNrIiwicHJvcHMiLCJudW1iZXJfc3VtIiwiVCIsInRvRGF5IiwidG9Ib3VyIiwidG9NaW51dGVzIiwidG9TZWNvbmRzIiwidHJ1dGh5Iiwib2JqZWN0X3ZhbHVlcyIsInppcFdpdGgiLCJhcnIiLCJsZW4iLCJNYXRoIiwibWluIiwic3JjX3ppcCIsImJvb2xlYW5faXMiLCJpc05hbiIsIm51bWJlcl9pcyIsInN0cmluZ19pcyIsIm9yIiwiYXJyYXlfZXF1YWxzIiwic3JjX2VxdWFscyIsIm9iamVjdF9lcXVhbHMiLCJrZXlYIiwia2V5WSIsIl9hbmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyIsImlzTmFOIiwiX2N1cnJ5IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9tYXAiLCJfZm9sZCIsIl9lcXVhbHMiLCJfY29uY2F0IiwiX2VtcHR5IiwiX2RvdCIsIl9pZGVudGl0eSIsIl90cmFuc3Bvc2UiLCJfZ2VuZXJhdGUiLCJNYXRyaXgiLCJwcmVjaXNpb24iLCJzZXRQcmVjaXNpb24iLCJpc1N5bW1ldHJpYyIsInRyYW5zcG9zZSIsImRlZmF1bHQiLCJpc1NxdWFyZSIsImdldENvbHMiLCJnZXRSb3dzIiwiaXNPcnRob2dvbmFsIiwiQXhBdCIsImRvdCIsIkkiLCJNIiwiZ2V0U2hhcGUiLCJBIiwiQiIsInJvd3MiLCJjb2xzIiwiY29tYmluZSIsImZpbGwiLCJ6ZXJvcyIsIm9uZXMiLCJyYW5kb20iLCJlIiwidG9BcnJheSIsInJvdyIsImNvbCIsImNsb25lIiwiZnJvbUFycmF5IiwiRXJyb3IiLCJqZHgiLCJzdWJ0cmFjdCIsImNvbnNvbGUiLCJsb2ciLCJhZGRpdGl2ZWludmVyc2UiLCJoYWRhbWFyZCIsImx1IiwiTCIsIlUiLCJhYnMiLCJqIiwicnJlZiIsImxlYWQiLCJyZXN1bHRNYXRyaXgiLCJ0bXAiLCJzb2x2ZSIsIkxVIiwiaW52ZXJzZSIsInJlZHVjZSIsImhhbGYiLCJyYW5rIiwiZGltZW5zaW9uIiwiZGlhZyIsImRpYWdwcm9kdWN0Iiwic3VtIiwicHJldiIsImtyb25lY2tlciIsInEiLCJsZWZ0IiwicmlnaHQiLCJmcmFtZSIsIl9mdW4iLCJfcm91bmQiLCJkZWNpbWFscyIsInJvdW5kIiwiX2NvbHMiLCJ6Il0sIm1hcHBpbmdzIjoiQ0FBQSxTQUFBQSxFQUFBQyxHQUNBLGlCQUFBQyxTQUFBLGlCQUFBQyxPQUNBQSxPQUFBRCxRQUFBRCxJQUNBLG1CQUFBRyxlQUFBQyxJQUNBRCxPQUFBLHlCQUFBSCxHQUNBLGlCQUFBQyxRQUNBQSxRQUFBLHVCQUFBRCxJQUVBRCxFQUFBLHVCQUFBQyxJQVJBLENBU0Msb0JBQUFLLFVBQUFDLEtBQUEsV0FDRCxtQkNUQSxJQUFBQyxFQUFBLEdBR0EsU0FBQUMsRUFBQUMsR0FHQSxHQUFBRixFQUFBRSxHQUNBLE9BQUFGLEVBQUFFLEdBQUFSLFFBR0EsSUFBQUMsRUFBQUssRUFBQUUsR0FBQSxDQUNBQyxFQUFBRCxFQUNBRSxHQUFBLEVBQ0FWLFFBQUEsSUFVQSxPQU5BVyxFQUFBSCxHQUFBSSxLQUFBWCxFQUFBRCxRQUFBQyxJQUFBRCxRQUFBTyxHQUdBTixFQUFBUyxHQUFBLEVBR0FULEVBQUFELFFBMERBLE9BckRBTyxFQUFBTSxFQUFBRixFQUdBSixFQUFBTyxFQUFBUixFQUdBQyxFQUFBUSxFQUFBLFNBQUFmLEVBQUFnQixFQUFBQyxHQUNBVixFQUFBVyxFQUFBbEIsRUFBQWdCLElBQ0FHLE9BQUFDLGVBQUFwQixFQUFBZ0IsRUFBQSxDQUEwQ0ssWUFBQSxFQUFBQyxJQUFB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LEtBQUksU0FBQ3dCLEVBQU0zRixHQUFQLE9BQWN1VCxFQUFLdlQsSUFBTSxJQUFJd0MsT0FBT21DLEVBQUszRSxLQUE3QyxDQUFrRDJFLHFJQ1R2RixJQUFBa1AsRUFBQS9ULEVBQUEsY0FTZSxTQUFDa1IsR0FBc0MsSUFBaENDLEVBQWdDcE8sVUFBQVYsT0FBQSxRQUFBb0gsSUFBQTFHLFVBQUEsR0FBQUEsVUFBQSxRQUF6QjBHLEVBQVd0SSxFQUFjNEIsVUFBQVYsT0FBQSxRQUFBb0gsSUFBQTFHLFVBQUEsR0FBQUEsVUFBQSxHQUFOLEVBQ3hDb1IsRUFBUWhELEdBQVFELEVBQ2hCMUwsR0FBSSxFQUFBdU8sRUFBQTFQLEtBQUksU0FBQStQLEdBQUMsT0FBSWpULEdBQVQsQ0FBZ0IsSUFBSTBCLE1BQU1zUixJQUNwQyxPQUFPLEVBQUFKLEVBQUExUCxLQUFJLFNBQUErUCxHQUFDLE9BQUk1TyxHQUFULENBQVksSUFBSTNDLE1BQU1xTyIsImZpbGUiOiJAYXN0dWFuYXgvZnVubWF0cml4Lm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJAYXN0dWFuYXgvZnVubWF0cml4XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkBhc3R1YW5heC9mdW5tYXRyaXhcIl0gPSBmYWN0b3J5KCk7XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDI0KTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG4vKipcbiAqIEBmdW5jdGlvbiBjdXJyeVxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVzIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeSAoZnVuKSB7XG4gIGNvbnN0IGFyZ3NsZW4gPSBmdW4ubGVuZ3RoXG5cbiAgaWYgKGFyZ3NsZW4gPT09IDApIHtcbiAgICByZXR1cm4gZnVuXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVJlY3Vyc2VyKFtdKVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UgKGFjYywgYXJncykge1xuICAgIGNvbnN0IF9hY2MgPSBhY2MuY29uY2F0KGFyZ3MpXG4gICAgcmV0dXJuIF9hY2MubGVuZ3RoIDwgYXJnc2xlblxuICAgICAgPyBjcmVhdGVSZWN1cnNlcihfYWNjKVxuICAgICAgOiBmdW4uYXBwbHkodGhpcywgX2FjYylcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlY3Vyc2VyIChhY2MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlY3Vyc2UoYWNjLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNcbiAqIEBkZXNjcmlwdGlvbiBWZXJpZmllcyB0aGUgdHlwZSBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnRcbiAqXG4gKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlzIChDdG9yLCB2YWwpIHtcbiAgcmV0dXJuIHR5cGUodmFsKSA9PT0gQ3RvclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHR5cGVcbiAqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIHR5cGUgKHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KS5zbGljZSg4LCAtMSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGZ1bmN0aW9uIHdpdGggYXJpdHkgMVxuICogQGZ1bmN0aW9uIGN1cnJ5MVxuICogQHByaXZhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3VycnkxIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gY3VycmllZCAoYSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAwXG4gICAgICA/IHRoaXNcbiAgICAgIDogZm4oYSlcbiAgfVxufVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbm90XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBub3QgKHgpIHtcbiAgcmV0dXJuICF4XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZXhpc3RzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4aXN0cyAoeCkge1xuICByZXR1cm4gISh4ID09IG51bGwpXG59O1xuIiwiLyoqXG5cbiAqIEBmdW5jdGlvbiBlbXB0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGVtcHR5IGVxdWl2YWxlbnQgb2YgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW1wdHkgKHgpIHtcbiAgcmV0dXJuIG5ldyB4LmNvbnN0cnVjdG9yKClcbn07XG4iLCIvKipcbiAqIFJldHVybnMgdGhlIG93biBrZXlzIG9mIGFuIG9iamVjdCBhcyBhbiBBcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IFtiXVxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24ga2V5cyAoYSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoT2JqZWN0KGEpKVxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIG9iamVjdCBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtPYmplY3R9IGFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBlbXB0eSBmcm9tICcuLi9lbXB0eSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBjb25zdCBrID0ga2V5cyhhKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBjb25zdCByID0gZW1wdHkoYSlcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByW2tbaV1dID0gY2IoYVtrW2ldXSwga1tpXSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGEgTWFwIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge01hcH0gYVxuICogQHJldHVybiB7TWFwfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICBhLmZvckVhY2goKHYsIGssIG1hcCkgPT4ge1xuICAgIHIuc2V0KGssIGNiKHYsIGssIG1hcCkpXG4gIH0pXG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYSBzdHJpbmcgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGEubGVuZ3RoXG4gIGxldCByID0gJydcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByICs9IGNiKGEuY2hhckF0KGkpLCBpLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gSXRlcmF0b3IgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuM1xuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmF0b3J9IGFcbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNhbGxiYWNrLCBpdGVyYXRvcikge1xuICBsZXQgciA9IFtdXG4gIGZvciAobGV0IG5leHRWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKTsgbmV4dFZhbHVlLmRvbmUgIT09IHRydWU7IG5leHRWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKSkge1xuICAgIHIucHVzaChjYWxsYmFjayhpdGVyYXRvci52YWx1ZSgpKSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzSXRlciAoaXRlcikge1xuICByZXR1cm4gaXNGdW5jdGlvbihpdGVyW1N5bWJvbC5pdGVyYXRvcl0pXG59XG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBpdGVyYWJsZSBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHdoaWNoIG1hcHMgb3ZlciBhbiBpdGVyYWJsZS5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IGIgLT4gYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9hcnJheS9tYXAnXG5pbXBvcnQgb2JqZWN0TWFwIGZyb20gJy4vb2JqZWN0L21hcCdcbmltcG9ydCBtYXBNYXAgZnJvbSAnLi9tYXAvbWFwJ1xuaW1wb3J0IHN0cmluZ01hcCBmcm9tICcuL3N0cmluZy9tYXAnXG5pbXBvcnQgaXRlcmF0b3JNYXAgZnJvbSAnLi9pdGVyYXRvci9tYXAnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5pbXBvcnQgaXNJdGVyYXRvciBmcm9tICcuL2l0ZXJhdG9yL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIHN3aXRjaCAodHlwZShhKSkge1xuICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgIHJldHVybiBjdXJyeShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjYi5jYWxsKHRoaXMsIGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSlcbiAgICAgIH0pXG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiBvYmplY3RNYXAoY2IsIGEpXG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIHJldHVybiBzdHJpbmdNYXAoY2IsIGEpXG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIHJldHVybiBtYXBNYXAoY2IsIGEpXG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIGFycmF5TWFwKGNiLCBhKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gaXNJdGVyYXRvcihhKVxuICAgICAgICA/IGl0ZXJhdG9yTWFwKGNiLCBhKVxuICAgICAgICA6IGFycmF5TWFwKGNiLCBhKVxuICB9XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIG8pIHtcbiAgY29uc3QgayA9IGtleXMobylcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gay5sZW5ndGhcbiAgbGV0IHIgPSBPYmplY3QoaW5pdClcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByID0gY2Iociwgb1trW2ldXSwga1tpXSwgbylcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5IGxpa2Ugb2JqZWN0IGFuZCBjYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBpdGVtXG4gKlxuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKChhLCBiLCBjLCBhKSDihpIgYSkg4oaSIGEg4oaSIFtiXSDihpIgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgcmVjZWl2ZXMgNCB2YWx1ZXM6IHRoZSBhY2N1bXVsYXRvciwgdGhlIGl0ZW0sIHRoZSBpbmRleCwgYW5kIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHsqfSBhIGlzIHRoZSBpbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0geyp9IFtiXSB0aGUgYXJyYXkgbGlrZSBpdGVtIHRvIGl0ZXJhdGUgb3ZlclxuICogQHJldHVybiB7Kn0gYSBpcyB0aGUgYWNjdW11bGF0ZWQgdmFsdWVcbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlGb2xkIGZyb20gJy4vYXJyYXkvZm9sZCdcbmltcG9ydCBvYmplY3RGb2xkIGZyb20gJy4vb2JqZWN0L2ZvbGQnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZvbGQgKGNiLCBpbml0LCBhKSB7XG4gIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgJ09iamVjdCc6IG9iamVjdEZvbGQsXG4gICAgJ0FycmF5JzogYXJyYXlGb2xkXG4gIH1cbiAgLy8gaWYgKGEubmV4dCkge1xuICAvLyAgIHJldHVybiBpdGVyYWJsZUZvbGQoY2IsIGluaXQsIGEpXG4gIC8vIH1cbiAgLy8gaWYgKHR5cGUoU3ltYm9sKSAhPT0gJ3VuZGVmaW5lZCcgJiYgYVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYVtTeW1ib2wuaXRlcmF0b3JdKCkpXG4gIC8vIH1cbiAgcmV0dXJuIHR5cGVNYXBbdHlwZShhKV0oY2IsIGluaXQsIGEpXG59KVxuXG4vLyBmdW5jdGlvbiBpdGVyYWJsZUZvbGQgKGNiLCBhY2MsIGdlbikge1xuLy8gICBsZXQgc3RlcCA9IGdlbi5uZXh0KClcbi8vICAgd2hpbGUgKCFzdGVwLmRvbmUpIHtcbi8vICAgICBhY2MgPSBjYihhY2MsIHN0ZXAudmFsdWUpXG4vLyAgICAgc3RlcCA9IGdlbi5uZXh0KClcbi8vICAgfVxuLy8gICByZXR1cm4gYWNjXG4vLyB9XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGlkZW50aWNhbFxuICogQGRlc2NyaXB0aW9uIGNoZWNrcyBmb3IgaWRlbnRpbnRpY2FsIGl0ZW1zXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGlzTmFuIGZyb20gJy4vbnVtYmVyL2lzTmFuJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBpZGVudGljYWwgKHgsIHkpIHtcbiAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkge1xuICAgIHJldHVybiAxIC8geCA9PT0gMSAvIHlcbiAgfVxuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuICEhKGlzTmFuKHgpICYmIGlzTmFuKHkpKVxufSlcbiIsIi8qKlxuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ09iamVjdCcpXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGFwZXJ0dXJlXG4gKiBAcGFyYW0gblxuICogQHBhcmFtIGFyclxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwZXJ0dXJlIChuLCBhKSB7XG4gIGlmIChhLmxlbmd0aCA8IG4pIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBjb25zdCByZXMgPSBBcnJheShhLmxlbmd0aCAtIG4gKyAxKVxuICByZXR1cm4gbWFwKChpdGVtLCBpZHgpID0+IGEuc2xpY2UoaWR4LCBpZHggKyBuKSwgcmVzKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSAyIGFyZ3VtZW50c1xuICpcbiAqIEBmdW5jdGlvbiBhZGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIDIgYXJndW1lbnRzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRkIChhLCBiKSB7XG4gIHJldHVybiArYSArICtiXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYWRkSW5kZXhcbiAqIEBzdW1tYXJ5IEFkZHMgYSBzcGVjaWZpZWQgaW5kZXggdG8gaXRlcmF0ZSBhIGNvbGxlY3Rpb25cbiAqIEBkZXNjcmlwdGlvbiBUaGUgYWRkSW5kZXggZnVuY3Rpb24gaXMgbm90bmVjZXNzYXJ5IGZvciB0aGUgbWFwIGZ1bmN0aW9ucyBpbiB0aGUgZnVuLmpzIGxpYnJhcnkgYXMgdGhleSBiZWhhdmUgdGhlIHNhLGUgYXMgdGhlIG5hdGl2ZSBqYXZhc2NyaXB0IGZ1bmN0aW9uc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZiBJdGVyYXRvciBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZyBGdW5jdGlvbiB0byB3aGljaCB0byBhZGQgdGhlIGluZGV4XG4gKiBAcGFyYW0ge0FycmF5fSBhIFRoZSBhcnJheSBvbiB3aGljaCB0byB3b3JrXG4gKiBAc2luY2UgMS4wLjJcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkZEluZGV4IChmLCBnLCBhKSB7XG4gIGxldCBpID0gMFxuICByZXR1cm4gZihcbiAgICBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIGcodiwgaSsrKVxuICAgIH0sXG4gICAgYVxuICApXG59KVxuIiwiLyoqXG4gKiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBhZGp1c3RcbiAqIEBkZXNjcmlwdGlvbiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoYSAtPiBhKSAtPiBudW0gLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0byBtb2RpZnkgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICogQHBhcmFtIHtOdW1iZXJ9IGkgLSBUaGUgaW5kZXggYXQgd2hpY2ggdG8gbW9kaWZ5IHRoZSBhcnJheSwgYWNjZXB0cyBwb3N0aXRpdmUgYW5kIG5lZ2F0aXZlIGluZGV4ZXNcbiAqIEBwYXJhbSB7SXRlcmFibGV9IFthXSAtIEFycmF5IHdpdGggZGF0YVxuICogQHJldHVybiB7SXRlcmFibGV9IFthXVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkanVzdCAoZm4sIGksIGEpIHtcbiAgY29uc3QgciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpXG4gIGNvbnN0IGlkeCA9IGkgPCAwID8gci5sZW5ndGggKyBpIDogaVxuICBpZiAoIWFbaWR4XSkgcmV0dXJuIHJcbiAgcltpZHhdID0gZm4ocltpZHhdKVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gYWRqdXN0V2l0aFxuICogQGRlc2NyaXB0aW9uIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGEpIC0+ICgoYSAtPiBbYV0pIC0+IFthXSAtPiBudW0pIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdG8gbW9kaWZ5IHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgLSBUaGUgcHJlZGljYXRlIHRoYXQgcmV0dXJucyB0aGUgaW5kZXhlcyBpZiBmb3VuZFxuICogQHBhcmFtIHtJdGVyYWJsZX0gW2FdXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkanVzdFdpdGggKGZuLCBwcmVkLCBhKSB7XG4gIGNvbnN0IF9mbiA9IHggPT4ge1xuICAgIGlmIChwcmVkKHgpKSB7XG4gICAgICByZXR1cm4gZm4oeClcbiAgICB9XG4gICAgcmV0dXJuIHhcbiAgfVxuICByZXR1cm4gbWFwKF9mbiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSkpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gYWxsXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbGwgKGNiLCBhKSB7XG4gIGxldCByZXMgPSB0cnVlXG4gIGZvciAobGV0IGkgaW4gYSkge1xuICAgIGlmICghY2IoYVtpXSkpIHtcbiAgICAgIHJlcyA9IGZhbHNlXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59KVxuIiwiLyoqXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBwcmVkaWNhdGVzIHRvIHRoZSBkYXRhIGFuZCByZXR1cm5zIHRydWUgaWYgYWxsIHBhc3NcbiAqXG4gKiBAZnVuY3Rpb24gYWxsUGFzc1xuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzc1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBbKCouLi4gLT4gQm9vbGVhbildIC0+ICgqLi4uIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IHByZWRpY2F0ZXMgQW4gYXJyYXkgb2YgcHJlZGljYXRlcyB0byBjaGVja1xuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjb21iaW5lZCBwcmVkaWNhdGVcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbGxQYXNzIChjYnMsIGEpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWNic1tpXShhKSkgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB3aXRoIHRoZSBpbml0aWFsIHZhbHVlIHByb3ZpZGVkXG4gKlxuICogQGZ1bmN0aW9uIGFsd2F5c1xuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBmdW5jdGlvbiB3aXRoIHRoZSBpbml0aWFsIHZhbHVlIHByb3ZpZGVkXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWx3YXlzICh4KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB4IH1cbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbiBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBhbnlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb24gb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKFRPRE8pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbnkgKGNiLCBhKSB7XG4gIGxldCByZXMgPSBmYWxzZVxuICBmb3IgKGxldCBpIGluIGEpIHtcbiAgICBpZiAoY2IoYVtpXSkpIHtcbiAgICAgIHJlcyA9IHRydWVcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBvbmUgcGFzc2VzXG4gKlxuICogQGZ1bmN0aW9uIGFueVBhc3NcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgWygqLi4uIC0+IEJvb2xlYW4pXSAtPiAoKi4uLikgLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFueVBhc3MgKGNicywgYSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjYnNbaV0oYSkpIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59KVxuIiwiLyoqXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcyBhbmQgcmV0dXJucyBhIGNvbWJpbmVkIHJlc3VsdCBhcnJheVxuICpcbiAqIEBmdW5jdGlvbiBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzIGFuZCByZXR1cm5zIGEgY29tYmluZWQgcmVzdWx0IGFycmF5XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIEBzaWcgW2EgLT4gYl0gLT4gW2FdIC0+IFtiXVxuICogQHBhcmFtIHsoRnVuY3Rpb25bXXxGdW5jdGlvbnxBcHBsaWNhdGl2ZSl9IGZucyAtIEFuIGFycmF5IG9mIGZ1bmN0aW9ucyBvciBhIGZ1bmN0aW9uIG9yIGFuIGFwcGxpY2F0aXZlXG4gKiBAcGFyYW0ge0FycmF5fSB2YWxzIC0gQW4gYXJyYXkgb2YgdmFsdWVzXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgaXMgZnJvbSAnLi9pcydcbmltcG9ydCBmb2xkIGZyb20gJy4vYXJyYXkvZm9sZCdcbmltcG9ydCBtYXAgZnJvbSAnLi9hcnJheS9tYXAnXG5cbmNvbnN0IGlzRnVuY3Rpb24gPSBpcygnRnVuY3Rpb24nKVxuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcCAoZm5zLCB2YWxzKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGZucy5hcCkpIHtcbiAgICByZXR1cm4gZm5zLmFwKHZhbHMpXG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24oZm5zKSkge1xuICAgIHJldHVybiB4ID0+IGZucyh4KSh2YWxzKHgpKVxuICB9XG4gIHJldHVybiBmb2xkKChhY2MsIGYpID0+IGFjYy5jb25jYXQobWFwKGN1cnJ5MShmKSwgdmFscykpLCBbXSwgZm5zKVxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBhcnJheUNvbmNhdFxuICogQHBhcmFtIGExXG4gKiBAcGFyYW0gYTJcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0KGEsIGIpXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIHN0cmluZ0NvbmNhdFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikgeyAvLyB1c2UgZnVuY3Rpb24oKSwgYXJyb3cgZnVuY3Rpb24gZG9lc24ndCBiaW5kIGFyZ3VtZW50c1xuICByZXR1cm4gU3RyaW5nKGEpICsgU3RyaW5nKGIpXG59XG4iLCIvKipcbiAqIENvbmNhdGVuYXRlcyAyIGl0ZW1zIHRvZ2V0aGVyXG4gKlxuICogQGZ1bmN0aW9uIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIGl0ZW1zIHRvZ2V0aGVyXG4gKiBAc2luY2UgdjEuMC40XG4gKiBAcGFyYW0ge2F9IGEgLSBMZWZ0IHNpZGUgb2YgdGhlIGNvbmNhdGVuYXRpb25cbiAqIEBwYXJhbSB7YX0gYiAtIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbmNhdGVuYXRpb25cbiAqIEByZXR1cm4ge2F9IENvbmNhdGVuYXRlZCBpdGVtXG4gKiovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5Q29uY2F0IGZyb20gJy4vYXJyYXkvY29uY2F0J1xuaW1wb3J0IHN0cmluZ0NvbmNhdCBmcm9tICcuL3N0cmluZy9jb25jYXQnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikge1xuICBjb25zdCB0eXBlTWFwID0ge1xuICAgICdTdHJpbmcnOiBzdHJpbmdDb25jYXQsXG4gICAgJ0FycmF5JzogYXJyYXlDb25jYXRcbiAgfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShhLCBiKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGFwcGVuZFxuICogQGRlc2NyaXB0aW9uIEFwcGVuZCBhbiBlbG1lbnQgdG8gYSBsaXN0XG4gKiBAcGFyYW0geyp9IGVsIC0gRWxlbWVudCB0byBhZGQgdG8gYSBsaXN0XG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0IC0gTGlzdCB0byB3aGljaCB0byBhZGQgdGhlIGVsZW1lbnRcbiAqIEByZXR1cm4ge2FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBsID0gWzAsIDFdXG4gKiBhcHBlbmQoJ2EnLCBsKSAvLyByZXV0bnIgWzAsIDEsICdhJ11cbiAqXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBjb25jYXQgZnJvbSAnLi9jb25jYXQnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwcGVuZCAoZWwsIGxpc3QpIHtcbiAgcmV0dXJuIGNvbmNhdChsaXN0LCBbIGVsIF0pXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXBwbHlcbiAqIEBkZXNjcmlwdGlvbiBUaGUgYXBwbHkoKSBtZXRob2QgY2FsbHMgYSBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgcHJvdmlkZWQgYXMgYW4gYXJyYXksIGFuZCB0aGUgZnVuY3Rpb24gYXMgY29udGV4dC5cbiAqIEBwYXJhbSBmblxuICogQHBhcmFtIGFyZ3NcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhID0gYXBwbHkoZnVuY3Rpb24gKCkge1xuICogICAgICByZXR1cm4gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpLm1hcCh4ID0+IHggKiAyKVxuICogICB9KVxuICogYShbMSwgMiwgM10pXG4gKiAvLyBbMiwgNCwgNl1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwcGx5IChmbiwgYXJncykge1xuICByZXR1cm4gZm4uYXBwbHkoZm4sIGFyZ3MpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYmluYXJ5XG4gKiBAcGFyYW0gY2JcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigqPSwgKj0pOiAqfVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiBiaW5hcnkgKGNiKSB7XG4gIHJldHVybiBjdXJyeShmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBjYihhLCBiKVxuICB9KVxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG4vKipcbiAqIEBmdW5jdGlvbiBiaW5kXG4gKiBAZGVzY3JpcHRpb24gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dFxuICogQHBhcmFtIHtmdW5jdGlvbiB9Zm5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dFxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGJpbmQgKGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBmbi5iaW5kKGNvbnRleHQpXG59KVxuIiwiLyoqXG4gKiBcImxpZnRzXCIgYSBmdW5jdGlvbiBvZiBhcml0eSA+IDEgc28gdGhhdCBpdCBtYXkgXCJtYXAgb3ZlclwiIGEgbGlzdCwgRnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gbGlmdFxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoKi4uLiAtPiAqKSAtPiAoWypdLi4uIC0+IFsqXSlcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBmb2xkIGZyb20gJy4vZm9sZCdcbmltcG9ydCBhcCBmcm9tICcuL2FwJ1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbGlmdCAoZm4pIHtcbiAgY29uc3QgbGlmdGVkID0gY3VycnkxKGN1cnJ5KGZuKSlcbiAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uIF9saWZ0ICgpIHtcbiAgICByZXR1cm4gZm9sZChhcCwgbWFwKGxpZnRlZCwgYXJndW1lbnRzWzBdKSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSlcbiAgfSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIGJvdGggcHJlZGljYXRlcyByZXR1cm4gdHJ1ZVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4xIEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbjIgQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgbGlmdCBmcm9tICcuLi9saWZ0J1xuaW1wb3J0IGFuZCBmcm9tICcuLi9hbmQnXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGJvdGggKGZuMSwgZm4yKSB7XG4gIHJldHVybiBpcygnRnVuY3Rpb24nKShmbjEpXG4gICAgPyBmdW5jdGlvbiBfYm90aCAoKSB7IHJldHVybiBmbjEuYXBwbHkodGhpcywgYXJndW1lbnRzKSAmJiBmbjIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB9XG4gICAgOiBsaWZ0KGFuZCkoZm4xLCBmbjIpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY2FsbFxuICogQHBhcmFtIGZuXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuLy8gaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjYWxsIChmbikge1xuICByZXR1cm4gZm4uYXBwbHkoZm4sIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSlcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjb21wbGVtZW50XG4gKiBAZGVzY3JpcHRpb24gTGlmdHMgYSBwcmVkaWNhdGUgZnVuY3Rpb24gYW5kIHJldHVybnMgdGhlIGNvbXBsZW1lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBzZWUgbm90XG4gKiBAc2VlIGxpZnRcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBsZW1lbnQoaXNFbXB0eSlcbiAqIGlzTm90RW1wdHkoW10pIC8vIGZhbHNlXG4gKiBpc05vdEVtcHR5KHsnYScgOiAxfSkgLy8gdHJ1ZVxuICpcbiAqIGNvbXBsZW1lbnQoTWF5YmUub2YoZmFsc2UpKSAvLyB0cnVlXG4gKiBjb21wbGVtZW50KE1heWJlLm9mKHRydWUpKSAvLyBmYWxzZVxuICovXG5pbXBvcnQgbGlmdCBmcm9tICcuL2xpZnQnXG5pbXBvcnQgbm90IGZyb20gJy4vbm90J1xuXG5jb25zdCBjb21wbGVtZW50ID0gbGlmdChub3QpXG5leHBvcnQgZGVmYXVsdCBjb21wbGVtZW50XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjb21wb3NlXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oKTogKn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcG9zZSAoKSB7XG4gIGxldCBmbnMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIF9jb21wb3NlICgpIHtcbiAgICBsZXQgaW5pdCA9IGZuc1tmbnMubGVuZ3RoIC0gMV1cbiAgICBsZXQgcmVzdWx0ID0gW2luaXQuYXBwbHkoaW5pdCwgYXJndW1lbnRzKV1cbiAgICBsZXQgaSA9IGZucy5sZW5ndGggLSAyXG5cbiAgICBmb3IgKGk7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBjb25zdCBmbiA9IGZuc1tpXVxuXG4gICAgICByZXN1bHQgPSBbZm4uYXBwbHkoZm4sIHJlc3VsdCldXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRbMF1cbiAgfVxufTtcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbmRcbiAqIEBwYXJhbSBjb25kc1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25kIChjb25kcykge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNvbmRzW2ldWzBdKHZhbHVlKSkgcmV0dXJuIGNvbmRzW2ldWzFdKHZhbHVlKVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZGVmYXVsdFRvXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gYiAtPiBhIHwgYlxuICogQHBhcmFtIHthfSBkZWZhdWx0IFRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIHtifSB2YWwgYHZhbGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIGBkZWZhdWx0YCB1bmxlc3MgYHZhbGAgaXMgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYC5cbiAqIEByZXR1cm4geyp9IFRoZSBzZWNvbmQgdmFsdWUgaWYgaXQgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRlZmF1bHRUbyAoZCwgdikge1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4gdiA9PSBudWxsIHx8IHYgIT09IHYgPyBkIDogdlxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGRpZmZEYXRlXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIgZGF0ZXMgaW4gbWlsbGlzZWNvbmRcbiAqIEBwYXJhbSB7RGF0ZX0gc3RhcnQgLSBTdGFydCBkYXRlXG4gKiBAcGFyYW0ge0RhdGV9IGVuZCAtIEVuZCBkYXRlXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFJFdHVybiB0aGUgZGlmZmVyZW5jZSBpbiBtaWxsaXNlY29uZHNcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBkaWZmRGF0ZSAoc3RhcnQsIGVuZCkge1xuICByZXR1cm4gKG5ldyBEYXRlKHN0YXJ0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShlbmQpLmdldFRpbWUoKSlcbn0pXG4iLCIvKipcbiAqXG4gKlxuICogQGZ1bmN0aW9uIGRpdmlkZVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGRpdmlzaW9uIG9mIHRoZSAyIGFyZ3VtZW50c1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAqIEBwYXJhbSB7TnVtYmVyfSBiXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRpdmlkZSAoYSwgYikge1xuICByZXR1cm4gK2EgLyArYlxufSlcbiIsIi8qKlxuICogQWx3YXlzIHJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgRmFsc2UgYm9vbGVhblxuICpcbiAqIEBmdW5jdGlvbiBGXG4gKiBAZGVzY3JpcHRpb24gQWx3YXlzIHJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgRmFsc2UgYm9vbGVhblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqKi9cbmltcG9ydCBhbHdheXMgZnJvbSAnLi4vYWx3YXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBhbHdheXMoZmFsc2UpXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhcnJheUZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXJyYXlGaWx0ZXIgKGZuLCBhKSB7XG4gIHZhciByID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZuKGFbaV0pKSByLnB1c2goYVtpXSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG9iamVjdEZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gb2JqZWN0RmlsdGVyIChmbiwgbykge1xuICBsZXQgciA9IHt9XG4gIGNvbnN0IGsgPSBrZXlzKG8pXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmbihvW2tbaV1dKSkgcltrW2ldXSA9IG9ba1tpXV1cbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG1hcEZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwRmlsdGVyIChmbiwgbSkge1xuICBsZXQgciA9IG5ldyBNYXAoKVxuXG4gIGxldCBpdCA9IG0uZW50cmllcygpXG4gIGxldCByZXN1bHQgPSBpdC5uZXh0KClcblxuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgayA9IHJlc3VsdC52YWx1ZVswXVxuICAgIGNvbnN0IHYgPSByZXN1bHQudmFsdWVbMV1cbiAgICBpZiAoZm4oaywgdikpIHIuc2V0KGssIHYpXG4gICAgcmVzdWx0ID0gaXQubmV4dCgpXG4gIH1cblxuICAvLyBMaW1pdGVkIGJyb3dzZXIgc3VwcG9ydFxuICAvLyBtLmZvckVhY2goKHYsIGspID0+IHtcbiAgLy8gICBpZiAoZm4oaywgdikpIHIuc2V0KGssIHYpXG4gIC8vIH0pXG5cbiAgLy8gYmFiZWwgdHJhbnNwaWxlIGlzc3Vlc1xuICAvLyBmb3IgKGNvbnN0IFtrLCB2XSBvZiBtLmVudHJpZXMoKSkge1xuICAvL1xuICAvLyB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZmlsdGVyXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVjbnRpb24gdGhhdCBmaWx0ZXJzIE9iamVjdHMsIEFycmF5cyBhbmQgTWFwc1xuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlGaWx0ZXIgZnJvbSAnLi9hcnJheS9maWx0ZXInXG5pbXBvcnQgb2JqZWN0RmlsdGVyIGZyb20gJy4vb2JqZWN0L2ZpbHRlcidcbmltcG9ydCBtYXBGaWx0ZXIgZnJvbSAnLi9tYXAvZmlsdGVyJ1xuLy8gVE9ET1xuLy8gaW1wb3J0IHNldEZpbHRlciBmcm9tICcuLi9zZXQvZmlsdGVyJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmaWx0ZXIgKGZuLCBhKSB7XG4gIHN3aXRjaCAodHlwZShhKSkge1xuICAgIC8vIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKSB7XG4gICAgLy8gY2FzZSAnRnVuY3Rpb24nOlxuICAgIC8vICAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uICgpIHtcbiAgICAvLyAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKVxuICAgIC8vICAgfSlcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdEZpbHRlcihmbiwgYSlcbiAgICAvLyBjYXNlICdTdHJpbmcnOlxuICAgIC8vICAgcmV0dXJuIHN0cmluZ01hcChjYiwgYSlcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcEZpbHRlcihmbiwgYSlcbiAgICAvLyBjYXNlICdTZXQnOlxuICAgIC8vICAgcmV0dXJuIHNldEZpbHRlcihmbiwgYSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKGZuLCBhKVxuICB9XG59KVxuIiwiLyoqXG4gKiBGaW5kIHRoZSBpbmRleCBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBmaW5kSW5kZXhcbiAqIEBkZXNjcmlwdGlvbiBGaW5kIHRoZSBpbmRleCBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoYSAtPiBib29sZWFuKSAtPiBbYV0gLT4gbnVtYmVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBQcmVkaWNhdGUgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IEFuIGFycmF5IGxpa2Ugb2JqZWN0XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmaW5kSW5kZXggKGZuLCBhKSB7XG4gIGxldCBpID0gMFxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgd2hpbGUgKGkgPCBsKSB7XG4gICAgaWYgKGZuKGFbaV0pKSB7XG4gICAgICByZXR1cm4gaVxuICAgIH1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gLTFcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmaXJzdFxuICogQHBhcmFtIFthXVxuICogQHJldHVybiBhIHwgdW5kZWZpbmVkXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGFyciA9IFsxLCAyLCA0XVxuICogZmlyc3QoWzEsIDIsIDRdKSAvLyByZXR1cm5zIDFcbiAqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIGZpcnN0IChhKSB7XG4gIHJldHVybiBhICYmIGEubGVuZ3RoID8gYVswXSA6IHVuZGVmaW5lZFxufSlcbiIsImltcG9ydCBmb2xkIGZyb20gJy4vZm9sZCdcbmltcG9ydCBlbXB0eSBmcm9tICcuL2VtcHR5J1xuaW1wb3J0IGNvbmNhdCBmcm9tICcuL2NvbmNhdCdcbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGlzIGZyb20gJy4vaXMnXG5cbmNvbnN0IGlzRnVuY3Rpb24gPSBpcygnRnVuY3Rpb24nKVxuXG4vKipcbiAqIEBmdW5jdGlvbiBmbGF0TWFwXG4gKiBAcGFyYW0gZm5cbiAqIEBwYXJhbSBhXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZsYXRNYXAgKGZuLCBhKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGEpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gZm4oYSh4KSkoeClcbiAgICB9XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24oYS5mbGF0TWFwKSkge1xuICAgIHJldHVybiBhLmZsYXRNYXAoZm4pXG4gIH1cbiAgcmV0dXJuIGZvbGQoKGFjYywgeCkgPT4gY29uY2F0KGFjYywgZm4oeCkpLCBlbXB0eShhKSwgYSlcbn0pXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXG4gKi9cbmltcG9ydCB0b0FycmF5IGZyb20gJy4uL2FycmF5L3RvJ1xuaW1wb3J0IG5vdCBmcm9tICcuLi9ub3QnXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFN0cmluZyAoc3RyKSB7IC8vIHVzZSBmdW5jdGlvbigpLCBhcnJvdyBmdW5jdGlvbiBkb2Vzbid0IGJpbmQgYXJndW1lbnRzXG4gIGxldCBhcmdzID0gdG9BcnJheShhcmd1bWVudHMpXG5cbiAgYXJncy5zaGlmdCgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgveyhcXGQrKX0vZywgKG1hdGNoLCBpZHgpID0+IHtcbiAgICByZXR1cm4gbm90KGlzKCdVbmRlZmluZWQnLCBhcmdzW2lkeF0pKSA/IGFyZ3NbaWR4XSA6IG1hdGNoXG4gIH0pXG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiB0b0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgdGhlIGlucHV0IHRvIGFuIGFycmF5XG4gKiBAcGFyYW0ge0FycmF5TGlrZX0geCAtIE9iamVjdCB0byBjb252ZXJ0IHRvIGFuIGFycmF5XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSB0b0FycmF5KFwic3RyaW5nXCIpXG4gKiAvLyByZXN1bHQgPSBbJ3MnLCd0JywncicsJ2knLCduJywnZyddXG4gKlxuICogZnVuY3Rpb24gKCkge1xuICogIGNvbnN0IGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cylcbiAqICBjb25zb2xlLmxvZyh0eXBlb2YgYXJncykgLy8gQXJyYXlcbiAqIH1cbiAqXG4gKiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0FycmF5ICh4KSB7XG4gIHJldHVybiB4Lmxlbmd0aCA9PT0gMSA/IFt4WzBdXSA6IEFycmF5LmFwcGx5KG51bGwsIHgpXG59O1xuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcge1N0cmluZ30gLT4ge09iamVjdH0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGhhcyAocHJvcCwgb2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFuIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5LCBldmVuIGlmIGl0IGlzIGluaGVyaXRlZFxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyB7U3RyaW5nfSAtPiB7T2JqZWN0fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaGFzSW4gKHByb3AsIG9iaikge1xuICByZXR1cm4gcHJvcCBpbiBvYmpcbn0pXG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgdmFsdWUgc3VwcGxpZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaWRlbnRpdHkgKHgpIHtcbiAgcmV0dXJuIHhcbn07XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZW1wdHkgZXF1aXZhbGVudCBvZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqL1xuaW1wb3J0IGVtcHR5IGZyb20gJy4vZW1wdHknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuaW1wb3J0IGVxdWFscyBmcm9tICcuL2VxdWFscydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNFbXB0eSAoeCkge1xuICByZXR1cm4gZXhpc3RzKHgpICYmIGVxdWFscyh4LCBlbXB0eSh4KSlcbn07XG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDA5LzAzLzIwMTcuXG4gKi9cbmltcG9ydCBkaWZmRGF0ZSBmcm9tICcuL2RpZmZEYXRlJ1xuXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4ge1xuICByZXR1cm4gZGlmZkRhdGUobmV3IERhdGUoKSkoZCkgPCAwXG59XG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ01hcCcpXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAzLzAyLzIwMTlcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnbnVsbCcpXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ1NldCcpXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAzLzAyLzIwMTlcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygndW5kZWZpbmVkJylcbiIsIi8qKlxuICpcbiAqL1xuaW1wb3J0IGlzRGF0ZSBmcm9tICcuL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1ZhbGlkICh4KSB7XG4gIC8vIG5vaW5zcGVjdGlvbiBKU0NoZWNrRnVuY3Rpb25TaWduYXR1cmVzXG4gIHJldHVybiBpc0RhdGUoeCkgJiYgaXNGaW5pdGUoeC52YWx1ZU9mKCkpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gSnVzdFxuICogQHBhcmFtIHZhbFxuICogQHJldHVybnMge0p1c3R9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xubGV0IEp1c3QgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX3ZhbHVlID0gdmFsXG4gIHJldHVybiB0aGlzXG59XG5cbkp1c3QucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWVcbn1cbkp1c3QucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IEp1c3RcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duIGtleXMgb2YgYW4gTWFwIGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIHJldHVybiBhLmtleXMoKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUga2V5cyBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0IG9yIGl0ZXJhdG9yXG4gKlxuICogQGZ1bmN0aW9uIGtleXNcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBwcm92aWRlZCBvYmplY3Qgb3IgaXRlcmF0b3JcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgb2JqIC0+IFsqXVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIE9iaiBmcm9tIHpoaWNoIHRvIHRha2UgdGhlIGtleXNcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgb2JqZWN0S2V5cyBmcm9tICcuL29iamVjdC9rZXlzJ1xuaW1wb3J0IG1hcEtleXMgZnJvbSAnLi9tYXAva2V5cydcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChvYmopIHtcbiAgc3dpdGNoICh0eXBlKG9iaikpIHtcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcEtleXMob2JqKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gb2JqZWN0S2V5cyhvYmopXG4gIH1cbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYWxsIHRoZSBrZXlzIG9mIGFuIG9iamVjdCBhcyBhbiBBcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IFtiXVxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24ga2V5cyAoYSkge1xuICBjb25zdCByID0gW11cbiAgZm9yIChjb25zdCBrIGluIGEpIHtcbiAgICByLnB1c2goaylcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGxhc3RcbiAqIEBwYXJhbSBbYV1cbiAqIEByZXR1cm4gYSB8IHVuZGVmaW5lZFxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gbGFzdCAoYSkge1xuICByZXR1cm4gYSAmJiBhLmxlbmd0aCA/IGFbYS5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZFxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgbGFyZ2VzdCBvZiB0aGUgMiBhcmd1bWVudHMgcHJvdmlkZWRcbiAqXG4gKiBAZnVuY3Rpb24gbWF4XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Kn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXggKGEsIGIpIHtcbiAgcmV0dXJuIGIgPiBhID8gYiA6IGFcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBOb3RoaW5nXG4gKiBAY29uc3RydWN0b3JcbiAqL1xubGV0IE5vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG59XG5cbk5vdGhpbmcucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlXG59XG5Ob3RoaW5nLnByb3RvdHlwZS5pc05vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IE5vdGhpbmdcbiIsImltcG9ydCBKdXN0IGZyb20gJy4vSnVzdCdcbmltcG9ydCBOb3RoaW5nIGZyb20gJy4vTm90aGluZydcblxuLyoqXG4gKiBAZnVuY3Rpb24gTWF5YmVcbiAqIEBwYXJhbSB2YWxcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgTWF5YmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxufVxuXG5NYXliZS5vZiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIE1heWJlKSByZXR1cm4gdmFsXG4gIGlmICh0aGlzIGluc3RhbmNlb2YgTWF5YmUpIHtcbiAgICB0aGlzLl9fdmFsdWUgPSB2YWxcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIHJldHVybiBuZXcgTWF5YmUodmFsKVxufVxuXG5NYXliZS5wcm90b3R5cGUuZ2V0T3JFbHNlID0gZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIHRoaXMuaXNOb3RoaW5nKCkgPyBuIDogdGhpcy5fX3ZhbHVlXG59XG5cbk1heWJlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZikge1xuICBpZiAodGhpcy5pc05vdGhpbmcoKSkge1xuICAgIHJldHVybiBNYXliZS5vZihudWxsKVxuICB9XG4gIHJldHVybiBNYXliZS5vZihmKHRoaXMuX192YWx1ZSkpXG59XG5cbk1heWJlLnByb3RvdHlwZS5hcCA9IGZ1bmN0aW9uIChtKSB7XG4gIHJldHVybiBtLm1hcCh0aGlzLl9fdmFsdWUpXG59XG5cbk1heWJlLnByb3RvdHlwZS5pc05vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAodGhpcy5fX3ZhbHVlID09IG51bGwpXG59XG5cbk1heWJlLnByb3RvdHlwZS5pc0p1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhdGhpcy5pc05vdGhpbmcoKVxufVxuXG5NYXliZS5wcm90b3R5cGUuTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBOb3RoaW5nKClcbn1cblxuTWF5YmUucHJvdG90eXBlLkp1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgSnVzdCh0aGlzLl92YWx1ZSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF5YmVcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHVuaW9uQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBNZXJnZXMgMiBhcnJheXNcbiAqIEBwYXJhbSB7QXJyYXl9IGFMIC0gQXJyYXkgdG8gbWVyZ2VcbiAqIEBwYXJhbSB7QXJyYXl9IGFSIC0gQXJyYXkgdG8gbWVyZ2VcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHVuaW9uQXJyYXkoWzAsMSwyXSwgWzMsNCw1XSlcbiAqIC8vIHJlc3VsdCA9IFswLjEuMi4zLjQuNV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gdW5pb25BcnJheSAoYUwsIGFSKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYUwuY29uY2F0KGFSKSkpXG59KVxuIiwiLyoqXG5cbiAqIGVxdWFsc1xuICogY2hlY2tzIGZvciBlcXVhbGl0eVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgaWRlbnRpY2FsIGZyb20gJy4uL2lkZW50aWNhbCdcbmltcG9ydCBpc09iamVjdCBmcm9tICcuLi9vYmplY3QvaXMnXG5pbXBvcnQgaXNBcnJheSBmcm9tICcuLi9hcnJheS9pcydcbmltcG9ydCB1bmlvbiBmcm9tICcuLi9hcnJheS91bmlvbidcblxuY29uc3QgbWVyZ2UgPSBjdXJyeSgob2JqTCwgb2JqUikgPT4ge1xuICBsZXQgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqTClcblxuICBpZiAoaWRlbnRpY2FsKG9iakwsIG9ialIpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iakwpXG4gIH1cbiAgZm9yIChsZXQga2V5IGluIG9ialIpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmpSLCBrZXkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBvbGRWYWx1ZSA9IG9ialJba2V5XVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gb2JqTFtrZXldXG5cbiAgICBpZiAoaXNPYmplY3Qob2xkVmFsdWUpICYmIGlzT2JqZWN0KG5ld1ZhbHVlKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZShvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gICAgfSBlbHNlIGlmIChpc0FycmF5KG5ld1ZhbHVlKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB1bmlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gb2xkVmFsdWUgLy8gVE9ETzogdGhpcyBpcyBhIHJlZmVyZW5jZSwgc2hvdWxkIGJlIGNsb25lXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIDIgYXJndW1lbnRzXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbXVsdGlwbHkgKGEsIGIpIHtcbiAgcmV0dXJuICthICogK2Jcbn0pXG4iLCIvKipcblxuICogZXF1YWxzXG4gKiBjaGVja3MgZm9yIGVxdWFsaXR5XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoKG9iaiwgbmFtZXMpID0+IHtcbiAgbGV0IHJlc3VsdCA9IHt9XG5cbiAgT2JqZWN0LmtleXMob2JqKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgIHJldHVybiBuYW1lcy5pbmRleE9mKGtleSkgPT09IC0xXG4gIH0pLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHJlc3VsdFtrZXldID0gb2JqW2tleV1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdFxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHBhdGhcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBwYXRoIChwYXRoLCBvYmopIHtcbiAgbGV0IHZhbCA9IG9ialxuICBsZXQgaWR4ID0gMFxuICBsZXQgcFxuICB3aGlsZSAoaWR4IDwgcGF0aC5sZW5ndGgpIHtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBwID0gcGF0aFtpZHhdXG4gICAgdmFsID0gTnVtYmVyLmlzSW50ZWdlcihwKVxuICAgICAgPyBwIDwgMCA/IHZhbFt2YWwubGVuZ3RoICsgcF0gOiB2YWxbcF1cbiAgICAgIDogdmFsW3BdXG4gICAgaWR4ICs9IDFcbiAgfVxuICByZXR1cm4gdmFsXG59KVxuLy8gbGV0IHIgPSBvYmpcbi8vIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuLy8gICBpZiAociA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4vLyAgIHIgPSByW3BhdGhbaV1dXG4vLyB9XG4vLyByZXR1cm4gclxuLy8gfSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHBpY2tcbiAqIEBkZXNjcmlwdGlvbiByZXR1cm5zIGEgbmV3IGJqZWN0IHdpdGggb25seSB0aGUgcHJvcHMgdGhhdCBhcmUgcHJvdmlkZWRcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIC0gQXJyYXkgb2YgcHJvcGVydHkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBUaGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gdGFrZSB0aGUgcHJvcGVydGllc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHBpY2sgKHByb3BzLCBvYmopIHtcbiAgY29uc3QgciA9IHt9XG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IHByb3BzLmxlbmd0aCkge1xuICAgIGlmIChwcm9wc1tpXSBpbiBvYmopIHtcbiAgICAgIHJbcHJvcHNbaV1dID0gb2JqW3Byb3BzW2ldXVxuICAgIH1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHByb3BcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBwcm9wIChwLCBvYmopIHtcbiAgcmV0dXJuIG9ialtwXVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSBudW1iZXJzIGluIGFuIGFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIFtOdW1iZXJdIC0+IE51bWJlclxuICogQHBhcmFtIHtBcnJheX0gYVxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGFkZCBmcm9tICcuL2FkZCdcbmltcG9ydCBmb2xkIGZyb20gJy4uL2ZvbGQnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHN1bSAoYSkge1xuICByZXR1cm4gZm9sZChhZGQsIDAsIGEpXG59KVxuIiwiLyoqXG4gKiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKlxuICogQGZ1bmN0aW9uIFRcbiAqIEBkZXNjcmlwdGlvbiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICoqL1xuaW1wb3J0IGFsd2F5cyBmcm9tICcuLi9hbHdheXMnXG5cbmV4cG9ydCBkZWZhdWx0IGFsd2F5cyh0cnVlKVxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDg2NDAwMDAwIC8vIDI0KjYwKjYwKjEwMDAgPSA4NjQwMDAwMFxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gMzYwMDAwMCAvLyA2MCo2MCoxMDAwID0gMzYwMDAwMFxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gNjAwMDAgLy8gNjAqMTAwMCA9IDYwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyAxMDAwXHJcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHRydXRoeVxuICovXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cnV0aHkgKHgpIHtcbiAgcmV0dXJuICh4ICE9PSBmYWxzZSkgJiYgZXhpc3RzKHgpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdmFsdWVzXG4gKiBAZGVzY3JpcHRpb24gUkV0dXJucyBhIGxpc3Qgb2YgdmFsdWVzIHRha2VuIGZyb20gYW4gb2JqZWN0cyBvd24gcHJvcGVydGllc1xuICogQHBhcmFtIHtvYmplY3R9IC0gb2JqIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byB0YWtlIHRoZSB2YWx1ZXNcbiAqIEByZXR1cm4ge2FycmF5fVxuICpcbiAqKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdmFsdWVzIChvYmopIHtcbiAgY29uc3QgayA9IGtleXMob2JqKVxuICBjb25zdCBsID0gay5sZW5ndGhcbiAgY29uc3QgciA9IFtdXG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IGwpIHtcbiAgICByW2ldID0gb2JqW2tbaV1dXG4gICAgaSArPSAxXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcblxuICogemlwV2l0aFxuICpcbiAqICBAZnVuY3Rpb24gemlwV2l0aFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gemlwV2l0aCAoY2IsIGEsIGIpIHtcbiAgY29uc3QgYXJyID0gW11cbiAgY29uc3QgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICBsZXQgaSA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyLnB1c2goY2IoYVtpXSwgYltpXSkpXG4gIH1cbiAgcmV0dXJuIGFyclxufSlcbiIsIi8qKlxuXG4gKiB6aXBcbiAqXG4gKiBAZnVuY3Rpb24gemlwXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IHppcFdpdGggZnJvbSAnLi96aXBXaXRoJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB6aXAgKGEsIGIpIHtcbiAgcmV0dXJuIHppcFdpdGgoZnVuY3Rpb24gX3ppcFdpdGggKHgsIHkpIHsgcmV0dXJuIFt4LCB5XSB9LCBhLCBiKVxufSlcbiIsIi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgX18gfSBmcm9tICcuL19fJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBlcnR1cmUgfSBmcm9tICcuL2FwZXJ0dXJlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseVNwZWMgfSBmcm9tICcuL2FwcGx5U3BlYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHlUbyB9IGZyb20gJy4vYXBwbHlUbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNjZW5kIH0gZnJvbSAnLi9hc2NlbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFzc29jIH0gZnJvbSAnLi9hc3NvYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNzb2NQYXRoIH0gZnJvbSAnLi9hc3NvY1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNsYW1wIH0gZnJvbSAnLi9jbGFtcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY2xvbmUgfSBmcm9tICcuL2Nsb25lJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wYXJhdG9yIH0gZnJvbSAnLi9jb21wYXJhdG9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlSyB9IGZyb20gJy4vY29tcG9zZUsnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VQIH0gZnJvbSAnLi9jb21wb3NlUCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZVdpdGggfSBmcm9tICcuL2NvbXBvc2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25zdHJ1Y3QgfSBmcm9tICcuL2NvbnN0cnVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29uc3RydWN0TiB9IGZyb20gJy4vY29uc3RydWN0Tidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29udGFpbnMgfSBmcm9tICcuL2NvbnRhaW5zJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb252ZXJnZSB9IGZyb20gJy4vY29udmVyZ2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvdW50QnkgfSBmcm9tICcuL2NvdW50QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRlYyB9IGZyb20gJy4vZGVjJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkZXNjZW5kIH0gZnJvbSAnLi9kZXNjZW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmZXJlbmNlIH0gZnJvbSAnLi9kaWZmZXJlbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmZXJlbmNlV2l0aCB9IGZyb20gJy4vZGlmZmVyZW5jZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpc3NvYyB9IGZyb20gJy4vZGlzc29jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXNzb2NQYXRoIH0gZnJvbSAnLi9kaXNzb2NQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wIH0gZnJvbSAnLi9kcm9wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wTGFzdCB9IGZyb20gJy4vZHJvcExhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BMYXN0V2hpbGUgfSBmcm9tICcuL2Ryb3BMYXN0V2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BSZXBlYXRzIH0gZnJvbSAnLi9kcm9wUmVwZWF0cydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFJlcGVhdHNXaXRoIH0gZnJvbSAnLi9kcm9wUmVwZWF0c1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BXaGlsZSB9IGZyb20gJy4vZHJvcFdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlaXRoZXIgfSBmcm9tICcuL2VpdGhlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZW5kc1dpdGggfSBmcm9tICcuL2VuZHNXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlcUJ5IH0gZnJvbSAnLi9lcUJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlcVByb3BzIH0gZnJvbSAnLi9lcVByb3BzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBldm9sdmUgfSBmcm9tICcuL2V2b2x2ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZCB9IGZyb20gJy4vZmluZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZExhc3QgfSBmcm9tICcuL2ZpbmRMYXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kTGFzdEluZGV4IH0gZnJvbSAnLi9maW5kTGFzdEluZGV4J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGF0dGVuIH0gZnJvbSAnLi9mbGF0dGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGlwIH0gZnJvbSAnLi9mbGlwJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JFYWNoIH0gZnJvbSAnLi9mb3JFYWNoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JFYWNoT2JqSW5kZXhlZCB9IGZyb20gJy4vZm9yRWFjaE9iakluZGV4ZWQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZyb21QYWlycyB9IGZyb20gJy4vZnJvbVBhaXJzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cEJ5IH0gZnJvbSAnLi9ncm91cEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cFdpdGggfSBmcm9tICcuL2dyb3VwV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZ3QgfSBmcm9tICcuL2d0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBndGUgfSBmcm9tICcuL2d0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzUGF0aCB9IGZyb20gJy4vaGFzUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaGVhZCB9IGZyb20gJy4vaGVhZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaWZFbHNlIH0gZnJvbSAnLi9pZkVsc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluYyB9IGZyb20gJy4vaW5jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmNsdWRlcyB9IGZyb20gJy4vaW5jbHVkZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluZGV4QnkgfSBmcm9tICcuL2luZGV4QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluZGV4T2YgfSBmcm9tICcuL2luZGV4T2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluaXQgfSBmcm9tICcuL2luaXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGlubmVySm9pbiB9IGZyb20gJy4vaW5uZXJKb2luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnNlcnQgfSBmcm9tICcuL2luc2VydCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5zZXJ0QWxsIH0gZnJvbSAnLi9pbnNlcnRBbGwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludGVyc2VjdGlvbiB9IGZyb20gJy4vaW50ZXJzZWN0aW9uJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnRlcnNwZXJzZSB9IGZyb20gJy4vaW50ZXJzcGVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludG8gfSBmcm9tICcuL2ludG8nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludmVydCB9IGZyb20gJy4vaW52ZXJ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZlcnRPYmogfSBmcm9tICcuL2ludmVydE9iaidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW52b2tlciB9IGZyb20gJy4vaW52b2tlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgam9pbiB9IGZyb20gJy4vam9pbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMganV4dCB9IGZyb20gJy4vanV4dCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGFzdEluZGV4T2YgfSBmcm9tICcuL2xhc3RJbmRleE9mJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5ndGggfSBmcm9tICcuL2xlbmd0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVucyB9IGZyb20gJy4vbGVucydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc0luZGV4IH0gZnJvbSAnLi9sZW5zSW5kZXgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbnNQYXRoIH0gZnJvbSAnLi9sZW5zUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc1Byb3AgfSBmcm9tICcuL2xlbnNQcm9wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWZ0TiB9IGZyb20gJy4vbGlmdE4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGx0IH0gZnJvbSAnLi9sdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbHRlIH0gZnJvbSAnLi9sdGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hcEFjY3VtIH0gZnJvbSAnLi9tYXBBY2N1bSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwQWNjdW1SaWdodCB9IGZyb20gJy4vbWFwQWNjdW1SaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwT2JqSW5kZXhlZCB9IGZyb20gJy4vbWFwT2JqSW5kZXhlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWF0Y2ggfSBmcm9tICcuL21hdGNoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXRoTW9kIH0gZnJvbSAnLi9tYXRoTW9kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXhCeSB9IGZyb20gJy4vbWF4QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lYW4gfSBmcm9tICcuL21lYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lZGlhbiB9IGZyb20gJy4vbWVkaWFuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZW1vaXplV2l0aCB9IGZyb20gJy4vbWVtb2l6ZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlQWxsIH0gZnJvbSAnLi9tZXJnZUFsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwTGVmdCB9IGZyb20gJy4vbWVyZ2VEZWVwTGVmdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwUmlnaHQgfSBmcm9tICcuL21lcmdlRGVlcFJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBXaXRoIH0gZnJvbSAnLi9tZXJnZURlZXBXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBXaXRoS2V5IH0gZnJvbSAnLi9tZXJnZURlZXBXaXRoS2V5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZUxlZnQgfSBmcm9tICcuL21lcmdlTGVmdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VSaWdodCB9IGZyb20gJy4vbWVyZ2VSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VXaXRoIH0gZnJvbSAnLi9tZXJnZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlV2l0aEtleSB9IGZyb20gJy4vbWVyZ2VXaXRoS2V5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtaW4gfSBmcm9tICcuL21pbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWluQnkgfSBmcm9tICcuL21pbkJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtb2R1bG8gfSBmcm9tICcuL21vZHVsbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbW92ZSB9IGZyb20gJy4vbW92ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbkFyeSB9IGZyb20gJy4vbkFyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbmVnYXRlIH0gZnJvbSAnLi9uZWdhdGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG5vbmUgfSBmcm9tICcuL25vbmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG50aCB9IGZyb20gJy4vbnRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBudGhBcmcgfSBmcm9tICcuL250aEFyZydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbyB9IGZyb20gJy4vbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb2JqT2YgfSBmcm9tICcuL29iak9mJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvZiB9IGZyb20gJy4vb2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG9uY2UgfSBmcm9tICcuL29uY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG90aGVyd2lzZSB9IGZyb20gJy4vb3RoZXJ3aXNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvdmVyIH0gZnJvbSAnLi9vdmVyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYWlyIH0gZnJvbSAnLi9wYWlyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aWFsIH0gZnJvbSAnLi9wYXJ0aWFsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aWFsUmlnaHQgfSBmcm9tICcuL3BhcnRpYWxSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGFydGl0aW9uIH0gZnJvbSAnLi9wYXJ0aXRpb24nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhFcSB9IGZyb20gJy4vcGF0aEVxJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoT3IgfSBmcm9tICcuL3BhdGhPcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aFNhdGlzZmllcyB9IGZyb20gJy4vcGF0aFNhdGlzZmllcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlja0FsbCB9IGZyb20gJy4vcGlja0FsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlja0J5IH0gZnJvbSAnLi9waWNrQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGUgfSBmcm9tICcuL3BpcGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGVLIH0gZnJvbSAnLi9waXBlSydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZVAgfSBmcm9tICcuL3BpcGVQJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlV2l0aCB9IGZyb20gJy4vcGlwZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBsdWNrIH0gZnJvbSAnLi9wbHVjaydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJlcGVuZCB9IGZyb20gJy4vcHJlcGVuZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvZHVjdCB9IGZyb20gJy4vcHJvZHVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvamVjdCB9IGZyb20gJy4vcHJvamVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcEVxIH0gZnJvbSAnLi9wcm9wRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BJcyB9IGZyb20gJy4vcHJvcElzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wT3IgfSBmcm9tICcuL3Byb3BPcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcHMgfSBmcm9tICcuL3Byb3BzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wU2F0aXNmaWVzIH0gZnJvbSAnLi9wcm9wU2F0aXNmaWVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByYW5nZSB9IGZyb20gJy4vcmFuZ2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZSB9IGZyb20gJy4vcmVkdWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VCeSB9IGZyb20gJy4vcmVkdWNlQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZWQgfSBmcm9tICcuL3JlZHVjZWQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZVJpZ2h0IH0gZnJvbSAnLi9yZWR1Y2VSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlV2hpbGUgfSBmcm9tICcuL3JlZHVjZVdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWplY3QgfSBmcm9tICcuL3JlamVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVtb3ZlIH0gZnJvbSAnLi9yZW1vdmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlcGVhdCB9IGZyb20gJy4vcmVwZWF0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZXBsYWNlIH0gZnJvbSAnLi9yZXBsYWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZXZlcnNlIH0gZnJvbSAnLi9yZXZlcnNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzY2FuIH0gZnJvbSAnLi9zY2FuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzZXF1ZW5jZSB9IGZyb20gJy4vc2VxdWVuY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNldCB9IGZyb20gJy4vc2V0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzbGljZSB9IGZyb20gJy4vc2xpY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnQgfSBmcm9tICcuL3NvcnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnRCeSB9IGZyb20gJy4vc29ydEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzb3J0V2l0aCB9IGZyb20gJy4vc29ydFdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNwbGl0IH0gZnJvbSAnLi9zcGxpdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRBdCB9IGZyb20gJy4vc3BsaXRBdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRFdmVyeSB9IGZyb20gJy4vc3BsaXRFdmVyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRXaGVuIH0gZnJvbSAnLi9zcGxpdFdoZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHN0YXJ0c1dpdGggfSBmcm9tICcuL3N0YXJ0c1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHN1YnRyYWN0IH0gZnJvbSAnLi9zdWJ0cmFjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3ltbWV0cmljRGlmZmVyZW5jZSB9IGZyb20gJy4vc3ltbWV0cmljRGlmZmVyZW5jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3ltbWV0cmljRGlmZmVyZW5jZVdpdGggfSBmcm9tICcuL3N5bW1ldHJpY0RpZmZlcmVuY2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWlsIH0gZnJvbSAnLi90YWlsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWtlIH0gZnJvbSAnLi90YWtlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWtlTGFzdCB9IGZyb20gJy4vdGFrZUxhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VMYXN0V2hpbGUgfSBmcm9tICcuL3Rha2VMYXN0V2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VXaGlsZSB9IGZyb20gJy4vdGFrZVdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YXAgfSBmcm9tICcuL3RhcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGVzdCB9IGZyb20gJy4vdGVzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGhlbiB9IGZyb20gJy4vdGhlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGh1bmtpZnkgfSBmcm9tICcuL3RodW5raWZ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aW1lcyB9IGZyb20gJy4vdGltZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvTG93ZXIgfSBmcm9tICcuL3RvTG93ZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvUGFpcnMgfSBmcm9tICcuL3RvUGFpcnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvUGFpcnNJbiB9IGZyb20gJy4vdG9QYWlyc0luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1N0cmluZyB9IGZyb20gJy4vdG9TdHJpbmcnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvVXBwZXIgfSBmcm9tICcuL3RvVXBwZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyYW5zZHVjZSB9IGZyb20gJy4vdHJhbnNkdWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmFuc3Bvc2UgfSBmcm9tICcuL3RyYW5zcG9zZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhdmVyc2UgfSBmcm9tICcuL3RyYXZlcnNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmltIH0gZnJvbSAnLi90cmltJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cnlDYXRjaCB9IGZyb20gJy4vdHJ5Q2F0Y2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuYXBwbHkgfSBmcm9tICcuL3VuYXBwbHknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuYXJ5IH0gZnJvbSAnLi91bmFyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5jdXJyeU4gfSBmcm9tICcuL3VuY3VycnlOJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmZvbGQgfSBmcm9tICcuL3VuZm9sZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb25XaXRoIH0gZnJvbSAnLi91bmlvbldpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXEgfSBmcm9tICcuL3VuaXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXFCeSB9IGZyb20gJy4vdW5pcUJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlxV2l0aCB9IGZyb20gJy4vdW5pcVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVubGVzcyB9IGZyb20gJy4vdW5sZXNzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bm5lc3QgfSBmcm9tICcuL3VubmVzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW50aWwgfSBmcm9tICcuL3VudGlsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1cGRhdGUgfSBmcm9tICcuL3VwZGF0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdXNlV2l0aCB9IGZyb20gJy4vdXNlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsdWVzSW4gfSBmcm9tICcuL3ZhbHVlc0luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB2aWV3IH0gZnJvbSAnLi92aWV3J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB3aGVuIH0gZnJvbSAnLi93aGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB3aGVyZSB9IGZyb20gJy4vd2hlcmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZXJlRXEgfSBmcm9tICcuL3doZXJlRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdpdGhvdXQgfSBmcm9tICcuL3dpdGhvdXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHhwcm9kIH0gZnJvbSAnLi94cHJvZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgemlwT2JqIH0gZnJvbSAnLi96aXBPYmonXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkZCB9IGZyb20gJy4vbnVtYmVyL2FkZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkSW5kZXggfSBmcm9tICcuL2FkZEluZGV4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGp1c3QgfSBmcm9tICcuL2FkanVzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRqdXN0V2l0aCB9IGZyb20gJy4vYWRqdXN0V2l0aCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWxsIH0gZnJvbSAnLi9hbGwnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFsbFBhc3MgfSBmcm9tICcuL2FsbFBhc3MnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFsd2F5cyB9IGZyb20gJy4vYWx3YXlzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbmQgfSBmcm9tICcuL2FuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW55IH0gZnJvbSAnLi9hbnknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFueVBhc3MgfSBmcm9tICcuL2FueVBhc3MnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwIH0gZnJvbSAnLi9hcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwZW5kIH0gZnJvbSAnLi9hcHBlbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5IH0gZnJvbSAnLi9hcHBseSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYmluYXJ5IH0gZnJvbSAnLi9iaW5hcnknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGJpbmQgfSBmcm9tICcuL2JpbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGJvdGggfSBmcm9tICcuL2Jvb2xlYW4vYm90aCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2FsbCB9IGZyb20gJy4vY2FsbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcGxlbWVudCB9IGZyb20gJy4vY29tcGxlbWVudCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZSB9IGZyb20gJy4vY29tcG9zZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbmQgfSBmcm9tICcuL2NvbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGN1cnJ5IH0gZnJvbSAnLi9jdXJyeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVmYXVsdFRvIH0gZnJvbSAnLi9kZWZhdWx0VG8nXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZEYXRlIH0gZnJvbSAnLi9kYXRlL2RpZmZEYXRlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXZpZGUgfSBmcm9tICcuL251bWJlci9kaXZpZGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGVtcHR5IH0gZnJvbSAnLi9lbXB0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXF1YWxzIH0gZnJvbSAnLi9lcXVhbHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGV4aXN0cyB9IGZyb20gJy4vZXhpc3RzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGIH0gZnJvbSAnLi9ib29sZWFuL0YnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbHRlciB9IGZyb20gJy4vZmlsdGVyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kSW5kZXggfSBmcm9tICcuL2ZpbmRJbmRleCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmlyc3QgfSBmcm9tICcuL2ZpcnN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGF0TWFwIH0gZnJvbSAnLi9mbGF0TWFwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb2xkIH0gZnJvbSAnLi9mb2xkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JtYXRTdHJpbmcgfSBmcm9tICcuL3N0cmluZy9mb3JtYXRTdHJpbmcnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGhhcyB9IGZyb20gJy4vb2JqZWN0L2hhcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzSW4gfSBmcm9tICcuL29iamVjdC9oYXNJbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWRlbnRpY2FsIH0gZnJvbSAnLi9pZGVudGljYWwnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlkZW50aXR5IH0gZnJvbSAnLi9pZGVudGl0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXMgfSBmcm9tICcuL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0FycmF5IH0gZnJvbSAnLi9hcnJheS9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNCb29sZWFuIH0gZnJvbSAnLi9ib29sZWFuL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0RhdGUgfSBmcm9tICcuL2RhdGUvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRW1wdHkgfSBmcm9tICcuL2lzRW1wdHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRnV0dXJlRGF0ZSB9IGZyb20gJy4vZGF0ZS9pc0Z1dHVyZURhdGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTWFwIH0gZnJvbSAnLi9tYXAvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTmFuIH0gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTnVsbCB9IGZyb20gJy4vbnVsbC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdW1iZXIgfSBmcm9tICcuL251bWJlci9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNPYmplY3QgfSBmcm9tICcuL29iamVjdC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNTZXQgfSBmcm9tICcuL3NldC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNTdHJpbmcgfSBmcm9tICcuL3N0cmluZy9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNVbmRlZmluZWQgfSBmcm9tICcuL3VuZGVmaW5lZC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNWYWxpZERhdGUgfSBmcm9tICcuL2RhdGUvaXNWYWxpZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSnVzdCB9IGZyb20gJy4vbW9uYWRzL0p1c3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGtleXMgfSBmcm9tICcuL2tleXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGtleXNJbiB9IGZyb20gJy4vb2JqZWN0L2tleXNJbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGFzdCB9IGZyb20gJy4vbGFzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGlmdCB9IGZyb20gJy4vbGlmdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwIH0gZnJvbSAnLi9tYXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG1heCB9IGZyb20gJy4vbWF4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXliZSB9IGZyb20gJy4vbW9uYWRzL01heWJlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZSB9IGZyb20gJy4vb2JqZWN0L21lcmdlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtdWx0aXBseSB9IGZyb20gJy4vbnVtYmVyL211bHRpcGx5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBub3QgfSBmcm9tICcuL25vdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTm90aGluZyB9IGZyb20gJy4vbW9uYWRzL05vdGhpbmcnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG9taXQgfSBmcm9tICcuL29iamVjdC9vbWl0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBvciB9IGZyb20gJy4vb3InXG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhdGggfSBmcm9tICcuL29iamVjdC9wYXRoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrIH0gZnJvbSAnLi9vYmplY3QvcGljaydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcCB9IGZyb20gJy4vb2JqZWN0L3Byb3AnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHN1bSB9IGZyb20gJy4vbnVtYmVyL3N1bSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVCB9IGZyb20gJy4vYm9vbGVhbi9UJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0RheSB9IGZyb20gJy4vZGF0ZS90b0RheSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9Ib3VyIH0gZnJvbSAnLi9kYXRlL3RvSG91cidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9NaW51dGVzIH0gZnJvbSAnLi9kYXRlL3RvTWludXRlcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9TZWNvbmRzIH0gZnJvbSAnLi9kYXRlL3RvU2Vjb25kcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHJ1dGh5IH0gZnJvbSAnLi90cnV0aHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIHR5cGUgfSBmcm9tICcuL3R5cGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHVuaW9uIH0gZnJvbSAnLi9hcnJheS91bmlvbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsdWVzIH0gZnJvbSAnLi9vYmplY3QvdmFsdWVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXAgfSBmcm9tICcuL3ppcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgemlwV2l0aCB9IGZyb20gJy4vemlwV2l0aCdcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnTnVtYmVyJylcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGJvdGggcHJlZGljYXRlcyBhcmUgdHJ1ZVxuICpcbiAqIEBmdW5jdGlvbiBhbmRcbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYm90aCBwcmVkaWNhdGVzIGFyZSB0cnVlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnICh4LCB5KSAtPiBib29sZWFuXG4gKiBAcGFyYW0geyp9IHggLSBBIHByZWRpY2F0ZVxuICogQHBhcmFtIHsqfSB5IC0gQSBwcmVkaWNhdGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYW5kICh4LCB5KSB7XG4gIHJldHVybiB4ICYmIHlcbn0pXG4iLCIvKipcbiAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGFuIGFycmF5LCBhdXRvY3VycmllZCBmdW5jdGlvblxuICpcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gaXNBcnJheVxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGFuIGFycmF5LCBhdXRvY3VycmllZCBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBPYmplY3QgdG8gdmVyaWZpeVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBpc0FycmF5KFsxLDEsMV0pXG4gKiAvLyByZXN1bHQgPSB0cnVlXG4gKi9cblxuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQXJyYXknKVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG4vKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0RhdGUnKVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGVxdWFsc0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gZm9yIGRlZXAgY29tcGFyaXNvbiBvZiBhcnJheXNcbiAqIEBwYXJhbSB7YX0geCAtIE9iamVjdCB0byBjb21wYXJlIG9mIHR5cGUgYVxuICogQHBhcmFtIHthfSB5IC0gT2JqZWN0IHggdG8gY29tcGFyZSB3aXRoIG9iamVjdCB4XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBlcXVhbHNBcnJheSAoeCwgeSkge1xuICBpZiAoeC5sZW5ndGggIT09IHkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG5vdChlcXVhbHMoeFtpXSwgeVtpXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuLi9leGlzdHMnXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgoeCwgeSkgPT4ge1xuICBmb3IgKGxldCBrZXlYIGluIHgpIHtcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbmZpbHRlcmVkRm9ySW5Mb29wXG4gICAgaWYgKG5vdChlcXVhbHMoeFtrZXlYXSwgeVtrZXlYXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAobGV0IGtleVkgaW4geSkge1xuICAgIGlmIChub3QoZXhpc3RzKHhba2V5WV0pKSAmJiBleGlzdHMoeVtrZXlZXSkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVxdWFsc1xuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBlcXVhbGl0eSBvZiAyIGl0ZW1zXG4gKiBAcGFyYW0geyp9IHggLSBMZWZ0IHNpZGUgb2YgdGhlIGVxdWFsaXR5IGNoZWNrXG4gKiBAcGFyYW0geyp9IHkgLSBSaWdodCBzaWRlIG9mIHRoZSBlcXVhbGl0eSBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbmFuID0gTnVtYmVyLk5hTlxuICogZXF1YWwobmFuLCBuYW4pIC8vIHJldHVybnMgdHJ1ZVxuICpcbiAqIGNvbnN0IGFycjEgPSBbMCwgMSwgMiwgM11cbiAqIGNvbnN0IGFycjIgPSBbbnVsbCwgMSwgMiwgM11cbiAqIGVxdWFscyhhcnIxLCBhcnIyKSAvLyByZXR1cm5zIGZhbHNlXG4gKlxuICogZXF1YWxzKG5ldyBPYmplY3QoeydhJzogMCwgJ2InOiAxfSksIHsnYSc6IDAsICdiJzogMX0pIC8vIHRydWVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuL2V4aXN0cydcbmltcG9ydCBpZGVudGljYWwgZnJvbSAnLi9pZGVudGljYWwnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5pbXBvcnQgbm90IGZyb20gJy4vbm90J1xuaW1wb3J0IG9yIGZyb20gJy4vb3InXG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9vYmplY3QvaXMnXG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2FycmF5L2lzJ1xuaW1wb3J0IGlzQm9vbGVhbiBmcm9tICcuL2Jvb2xlYW4vaXMnXG5pbXBvcnQgaXNOdW1iZXIgZnJvbSAnLi9udW1iZXIvaXMnXG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnLi9zdHJpbmcvaXMnXG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vZGF0ZS9pcydcbmltcG9ydCBlcXVhbHNBcnJheSBmcm9tICcuL2FycmF5L2VxdWFscydcbmltcG9ydCBlcXVhbHNPYmplY3QgZnJvbSAnLi9vYmplY3QvZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBlcXVhbHMgKHgsIHkpIHtcbiAgaWYgKGlkZW50aWNhbCh4LCB5KSkgcmV0dXJuIHRydWVcblxuICBpZiAodHlwZSh4KSAhPT0gdHlwZSh5KSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKG9yKG5vdChleGlzdHMoeCkpLCBub3QoZXhpc3RzKHkpKSkpIHJldHVybiBmYWxzZVxuXG4gIGlmICh4LmNvbnN0cnVjdG9yICE9PSB5LmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2VcblxuICBpZiAoaXNTdHJpbmcoeCkgfHwgaXNCb29sZWFuKHgpIHx8IGlzTnVtYmVyKHgpIHx8IGlzRGF0ZSh4KSkge1xuICAgIHJldHVybiBpZGVudGljYWwoeC52YWx1ZU9mKCksIHkudmFsdWVPZigpKVxuICB9XG4gIGlmIChpc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIGVxdWFsc0FycmF5KHgsIHkpXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoeCkpIHtcbiAgICByZXR1cm4gZXF1YWxzT2JqZWN0KHgsIHkpXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNOYU5cbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgbnVtYmVyIGlzIE5BTlxuXG4gKi9cbmltcG9ydCBpc051bWJlciBmcm9tICcuL2lzJ1xuaW1wb3J0IGFuZCBmcm9tICcuLi9hbmQnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTmFuICh4KSB7XG4gIHJldHVybiBhbmQoaXNOdW1iZXIoeCksIGlzTmFOKHgpKVxufTtcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIE1hcHMgb3ZlciBhbiBhcnJheSBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqICBjb25zdCByZXN1bHQgPSBtYXAoaWRlbnRpdHksIFswLDIsM10pXG4gKiAgLy8gcmVzdWx0ID0gWzAsMiwzXVxuICogIGNvbnN0IGFkZDIgPSBhZGQoMilcbiAqICBjb25zdCByZXN1bHQgPSBtYXAoYWRkMiwgWzAsMiwzXSlcbiAqICAvLyByZXN1bHQgPSBbMiw0LDVdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgY29uc3QgciA9IG5ldyBBcnJheShsKVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHJbaV0gPSBjYihhW2ldLCBpLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gb3JcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgb25lIG9yIHRoZSBvdGhlciBpcyB0cnVlXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBvciAoeCwgeSkge1xuICByZXR1cm4geCB8fCB5XG59KVxuIiwiLyoqXG4gKiBDdXJyaWVkIGZ1bmN0aW9uIHRoYXQgdmVyaWZpZXMgb2YgdGhlIHByb3ZpZGVkIGFyZ3VtZW50IGlzIGEgYm9vbGVhblxuICpcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gaXNcbiAqIEBkZXNjcmlwdGlvbiBDdXJyaWVkIGZ1bmN0aW9uIHRoYXQgdmVyaWZpZXMgb2YgdGhlIHByb3ZpZGVkIGFyZ3VtZW50IGlzIGEgYm9vbGVhblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHsqfSBJdGVtIHRvIHZlcmlmeVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0Jvb2xlYW4nKVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnU3RyaW5nJylcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IG1hcHBpbmcgb3ZlciB0aGUgcHJvdmlkZWQgYXJyYXkgYW5kIGNhbGxpbmcgYW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Y2JGdW5jdGlvbn0gY2IgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIGl0ZW1cbiAqIEBwYXJhbSB7Kn0gaW5pdCAtIEluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXl9IGEgLSBBcnJheSB3aXRoIGl0ZW1zIHRvIG1vZGlmeSBieSB0aGUgY2IgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFsaWFzIHJlZHVjZVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvbGQoYWRkLCAwLCBbMSwxLDFdKVxuICogLy8gcmVzdWx0ID0gM1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIGNiRnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gciAtIEFjY3VtdWxhdG9yIHdoaWNoIGFjY3VtdWxhdGVzIHRoZSBjYWxsYmFjaydzIHJldHVybiB2YWx1ZXNcbiAqIEBwYXJhbSB7Kn0gaXRlbSAtIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSB0aGUgaW5kZXkgb2YgdGhlIGl0ZW0gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge0FycmF5fSBhIC0gVGhlIGluaXRpYWwgYXJyYXlcbiAqIEByZXR1cm4geyp9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSBpbml0XG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgciA9IGNiKHIsIGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnZnVuLmpzL3NyYy9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnZnVuLmpzL3NyYy9tYXAnXG5pbXBvcnQgZm9sZCBmcm9tICdmdW4uanMvc3JjL2ZvbGQnXG5pbXBvcnQgZXF1YWxzIGZyb20gJ2Z1bi5qcy9zcmMvZXF1YWxzJ1xuaW1wb3J0IGNvbmNhdCBmcm9tICd1dGlsL2NvbmNhdCdcbmltcG9ydCBlbXB0eSBmcm9tICd1dGlsL2VtcHR5J1xuaW1wb3J0IGRvdCBmcm9tICd1dGlsL2RvdCdcbmltcG9ydCBpZGVudGl0eSBmcm9tICd1dGlsL2lkZW50aXR5J1xuaW1wb3J0IHRyYW5zcG9zZSBmcm9tICd1dGlsL3RyYW5zcG9zZSdcbmltcG9ydCBnZW5lcmF0ZSBmcm9tICd1dGlsL2dlbmVyYXRlJ1xuLy8gaW1wb3J0IGdwdW1hcCBmcm9tICd1dGlsL2dwdW1hcCdcbi8vIGltcG9ydCBncHVmb2xkIGZyb20gJ3V0aWwvZ3B1Zm9sZCdcbi8vIGltcG9ydCBncHVwcm9kdWN0IGZyb20gJ3V0aWwvZ3B1cHJvZHVjdCdcblxuLyoqXG4gKiBAY2xhc3MgTWF0cml4XG4gKiBAY2xhc3NkZXNjIE1hdHJpeCBhcHBsaWNhdGl2ZSBwcm92aWRpbmcgc3RhbmRhcmQgbWF0cml4IG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFRoZSBNYXRyaXggY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgbmV3IGtleXdvcmQuIEluc3RlYWQgdXNlIHRoZSBNYXRyaXgub2Ygc3ludGF4IHRvIGNyZWF0ZSBhIG5ldyBNYXRyaXguIFVuZm9ydHVuYXRseSBqc2RvY3MgZG9lcyBub3QgYWxsb3cgZm9yIHRoZSBjb25zdHJ1Y3RvciB0byBiZSBoaWRkZW4uXG4gKiBAaGlkZWNvbnRydWN0b3JcbiAqIEBzZWUgb2ZcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqXG4gKi9cbmxldCBNYXRyaXggPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBvZlxuICogQGRlc2MgQ3JlYXRlcyBhIE1hdHJpeCBvYmplY3QgYW5kIGZsYXR0ZW5zIHRoZSBNYXRyaXhcbiAqIEBwYXJhbSB2YWwge2FycmF5fGZ1bmN0aW9ufSBBbiBhcnJheSBvZiBhcnJheXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKlxuICovXG5NYXRyaXgub2YgPSBmdW5jdGlvbiAodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBNYXRyaXgpIHJldHVybiB2YWxcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICB0aGlzLl9fdmFsdWUgPSB2YWxcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIHJldHVybiBuZXcgTWF0cml4KHZhbClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0udHlwZSA9PT0gJ01hdHJpeCdcbiAqL1xuTWF0cml4LnByb3RvdHlwZS50eXBlID0gJ01hdHJpeCdcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJlY2lzaW9uXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS5wcmVjaXNpb24gPT09IDRcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5wcmVjaXNpb24gPSA0XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHNldFByZWNpc2lvblxuICogQHBhcmFtIHByZWNpc2lvbiB7bnVtYmVyfSBTZXQgdGhlIG51bWJlciBvZiBkZWNpbWFscyBmb3Igcm91bmRpbmdcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0uc2V0UHJlY2lzaW9uKDEwKVxuICogbS5wcmVjaXNpb24gPT09IDEwXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc2V0UHJlY2lzaW9uID0gZnVuY3Rpb24gKHByZWNpc2lvbikge1xuICB0aGlzLnByZWNpc2lvbiA9IHByZWNpc2lvblxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc1N5bW1ldHJpY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIHRydWUgPT09IEEuaXNTeW1tZXRyaWMoKVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc1N5bW1ldHJpYyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYSA9IHRoaXMuX192YWx1ZVxuICBjb25zdCBiID0gTWF0cml4LnRyYW5zcG9zZSh0aGlzKS5fX3ZhbHVlXG4gIHJldHVybiBlcXVhbHMoYSwgYilcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNTcXVhcmVcbiAqIEBkZXNjIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgY29udGFpbnMgYSBzcXVhcmUgTWF0cml4XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogdHJ1ZSA9PT0gQS5pc1NxdWFyZSgpXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzU3F1YXJlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZXF1YWxzKHRoaXMuZ2V0Q29scygpLCB0aGlzLmdldFJvd3MoKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNPcnRob2dvbmFsXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IFtbLTAuMzA5MiwgLTAuOTUxMF0sIFstMC45NTEwLCAwLjMwOTJdXVxuICogY29uc3QgQSA9IE1hdHJpeC5mcm9tQXJyYXkocmVzdWx0KVxuICogdHJ1ZSAgPT09IEEuaXNPcnRob2dvbmFsKClcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc09ydGhvZ29uYWwgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEF4QXQgPSB0aGlzLmRvdCh0aGlzLnRyYW5zcG9zZSgpKVxuICBjb25zdCBJID0gdGhpcy5pZGVudGl0eSgpXG4gIHJldHVybiBlcXVhbHMoQXhBdCwgSSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0Q29sc1xuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRDb2xzKCkgID09PSAyXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldENvbHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9fdmFsdWVbMF0ubGVuZ3RoXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGVxdWFsc1xuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYSA9IFtbMSwgMV0sIFsxLCAxXV1cbiAqIHZhciBBID0gTWF0cml4Lm9mKGEpXG4gKiB2YXIgQiA9IE1hdHJpeC5vZihhKVxuICogdHJ1ZSAgPT09IEEuZXF1YWxzKEIpXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIGVxdWFscyh0aGlzLl9fdmFsdWUsIE0uX192YWx1ZSB8fCBNKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRSb3dzXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldFJvd3MoKSAgLy8gMlxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldFJvd3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9fdmFsdWUubGVuZ3RoXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldFNoYXBlXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0U2hhcGUoKSAgLy8gWzIsIDJdXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0U2hhcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBbdGhpcy5nZXRSb3dzKCksIHRoaXMuZ2V0Q29scygpXVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBtYXBcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBbiBpdGVyYXRvciBmdW5jdGlvblxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogbS5tYXAoeCA9PiB4Lm1hcCh5ID0+IHkrIDEpKVxuICogLy8gW1syLCAyXSwgWzIsIDJdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKG1hcChmKSh0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBtYXBcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdGhhdCBtYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBbiBpdGVyYXRvciBmdW5jdGlvblxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX0gTWF0cml4IG9yIGFycmF5IHRvIG1hcFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9IE1hdHJpeC5tYXAoeD0gPiB4Lm1hcCh5ID0+IHkrIDEpLCBbWzEsIDFdLCBbMSwgMV1dKVxuICogLy8gW1syLCAyXSwgWzIsIDJdXVxuICpcbiAqL1xuTWF0cml4Lm1hcCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkubWFwKGYpXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBmb2xkXG4gKiBAZGVzY3JpcHRpb24gUmVkdWNlIHRoZSBtYXRyaXggcm93cyB1c2luZyBhIHJlZHVjZSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBIHJlZHVjZS9mb2xkIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBGbGF0dGVuIE1hdHJpeFxuICogTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pLmZvbGQoKHByZXYsIG5leHQpID0+IHByZXYuY29uY2F0KG5leHQpKVxuICogLy8gWzEsIDEsIDEsIDFdXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZm9sZCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZm9sZChmLCBbXSkodGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFN0YXRpYyBmdW5jdGlvbiB0byByZWR1Y2UgdGhlIG1hdHJpeCByb3dzIHVzaW5nIGEgcmVkdWNlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEEgcmVkdWNlL2ZvbGQgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh9IFRoZSBNYXRyaXggdG8gcmVkdWNlXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcblxuICogLy8gU3VtIG9mIGFsbCBtYXRyaXggdmFsdWVzXG4gKiBjb25zdCByZWR1Y2VyID0gKHByZXYsIG5leHQpID0+IE51bWJlcihwcmV2KSArIG5leHQucmVkdWNlKChhY2MsIHgpID0+IGFjYyArIHgsIDApXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV1cbiAqIE1hdHJpeC5mb2xkKHJlZHVjZXIsIEEpXG4gKiAvLyA0XG4gKi9cbk1hdHJpeC5mb2xkID0gY3VycnkoZnVuY3Rpb24gKGYsIE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5mb2xkKGYpXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBNYXRyaXggdG8gYSBmdW5jdGlvblxuICogQHBhcmFtIE0ge01hdHJpeH1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGYgPSB4ID0+IHgucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dClcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAyLCAzXSwgWzQsIDUsIDZdLCBbNywgOCwgOV1dKVxuICogTWF0cml4Lm9mKGYpLmFwKE0pXG4gKiAvLyBbWzZdLCBbMTVdLCBbMjRdXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLm1hcCh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGFwXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIE1hdHJpeCB0byBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259XG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZiA9IHggPT4geC5yZWR1Y2UoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0KVxuICogTWF0cml4LmFwKGYsIFtbMSwgMiwgM10sIFs0LCA1LCA2XSwgWzcsIDgsIDldXSlcbiAqIC8vIFtbNl0sIFsxNV0sIFsyNF1cbiAqL1xuTWF0cml4LmFwID0gY3VycnkoZnVuY3Rpb24gKGYsIE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihmKS5hcChNKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgTWF0cmljZXMgdXNpbmcgYSBmdW5jdGlvbiBhcyBvcGVyYXRvclxuICogQHBhcmFtIE0ge01hdHJpeH1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbWzAsIDEsIDFdLCBbMiwgMywgNF1dXG4gKiBjb25zdCBiID0gW1syLCAyLCAyXSwgWzMsIDMsIDNdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICogY29uc3QgTSA9IEEuY29uY2F0KEIpXG4gKiAvLyBbWzAsIDEsIDEsIDIsIDIsIDJdLCBbMiwgMywgNCwgMywgMywgM11dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIChNLCBmID0gY29uY2F0KSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubWFwKGYoTSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIE1hdHJpY2VzIHVzaW5nIGEgZnVuY3Rpb24gYXMgb3BlcmF0b3JcbiAqIEBwYXJhbSBBIHtNYXRyaXh9XG4gKiBAcGFyYW0gQiB7TWF0cml4fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFtbMCwgMSwgMV0sIFsyLCAzLCA0XV1cbiAqIGNvbnN0IGIgPSBbWzIsIDIsIDJdLCBbMywgMywgM11dXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKGEpXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKGIpXG4gKiBjb25zdCBNID0gTWF0cml4LmNvbmNhdChBLCBCKVxuICogLy8gW1swLCAxLCAxLCAyLCAyLCAyXSwgWzIsIDMsIDQsIDMsIDMsIDNdXVxuICpcbiAqL1xuTWF0cml4LmNvbmNhdCA9IGN1cnJ5KGZ1bmN0aW9uIChBLCBCLCBmID0gY29uY2F0KSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkubWFwKGYoQikpXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBlbXB0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybiBhbiBlbXB0eSBNYXRyaXggZnJvbSBhbiBleGlzdGluZyBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubWFwKGVtcHR5KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBlbXB0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybiBhbiBlbXB0eSBNYXRyaXggZnJvbSBhbiBleGlzdGluZyBNYXRyaXhcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LmVtcHR5ID0gY3VycnkoZnVuY3Rpb24gKHJvd3MgPSAwLCBjb2xzID0gMCkge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scykgLy8gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkocm93cykpLm1hcCh4ID0+IEFycmF5LmFwcGx5KG51bGwsIEFycmF5KGNvbHMpKSlcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5tYXAoZW1wdHkpXG59KVxuXG4vLyAjIyMjICMjIyMgIyMjIyAvL1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpZGVudGl0eVxuICogQGRlc2MgUmV0dXJucyBhbiBpZGVudGl0eSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbWzEsIDIsIDNdLCBbNCwgNSwgNl1dXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKGEpXG4gKiBjb25zdCBBaWRlbnRpdHkgPSBBLmlkZW50aXR5KClcbiAqIC8vIFtbMSwgMCwgMF0sIFswLCAxLCAwXV1cbiAqXG4qL1xuTWF0cml4LnByb3RvdHlwZS5pZGVudGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihpZGVudGl0eSkuYXAodGhpcylcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjIFJldHVybnMgYW4gaWRlbnRpdHkgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4LmlkZW50aXR5KDMsIDIpXG4gKiAvLyBbWzEsIDAsIDBdLCBbMCwgMSwgMF1dXG4gKlxuICovXG5NYXRyaXguaWRlbnRpdHkgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scykgLy8gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkocm93cykpLm1hcCh4ID0+IEFycmF5LmFwcGx5KG51bGwsIEFycmF5KGNvbHMpKSlcbiAgcmV0dXJuIE1hdHJpeC5vZihpZGVudGl0eSkuYXAobSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgY29tYmluZVxuICogQHNlZSBNYXRyaXguY29uY2F0XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jb21iaW5lID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5jb25jYXQoTWF0cml4Lm9mKE0pLCBjb25jYXQpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGNvbWJpbmVcbiAqIEBzZWUgTWF0cml4LmNvbmNhdFxuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5jb21iaW5lID0gZnVuY3Rpb24gKEEsIEIpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5jb25jYXQoTWF0cml4Lm9mKEIpLCBjb25jYXQpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGRvdFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IGJldHdlZW4gMiBtYXRyaWNlc1xuICogQHBhcmFtIE1cbiAqIEBwYXJhbSBmXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBDcmVhdGUgbWF0cml4XG4gKiBjb25zdCBtID0gTWF0cml4Lm9mKFtbMSwgMl0sIFszLCA0XV0pXG4gKlxuICogLy8gR2VuZXJhdGUgaWRlbnRpdHkgbWF0cml4XG4gKiBjb25zdCBJICA9IG0uaWRlbnRpdHkoKSAvLyBbWzEsIDBdLCBbMCwgMV1dXG4gKlxuICogaWYobS5kb3QoSSkuZXF1YWxzKG0pKSB7XG4gKiAgICBjb25zb2xlLmxvZygnRG90IHByb2R1Y3Qgd2l0aCBpZGVudGl0eSBtYXRyaXggcmV0dXJucyB0aGUgc2FtZSBtYXRyaXgnKVxuICogfVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kb3QgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmNvbmNhdChNYXRyaXgub2YoTSksIGRvdCh0aGlzLnByZWNpc2lvbikpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGRvdFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IGJldHdlZW4gMiBtYXRyaWNlc1xuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICogY29uc3QgYSA9IFtbMSwgMiwgM10sIFs0LCA1LCA2XV1cbiAqIGNvbnN0IGIgPSBbWzcsIDhdLCBbOSwgMTBdLCBbMTEsIDEyXV1cbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKGEpXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKGIpXG4gKlxuICogTWF0cml4LmRvdChBLCBCKSAvLyBbWzU4LCA2NF0sIFsxMzksIDE1NF1dXG4gKlxuICovXG5NYXRyaXguZG90ID0gZnVuY3Rpb24gKEEsIEIpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5kb3QoTWF0cml4Lm9mKEIpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBmaWxsXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHRoZSBwcm92aWRlZCBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwyLDNdLCBbMywyLDFdLCBbNCw1LDZdXSkuZmlsbCh4ID0+IDQyKVxuICogLy8gW1s0Miw0Miw0Ml0sIFs0Miw0Miw0Ml0sIFs0Miw0Miw0Ml1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChtYXAoeCA9PiBmKHgpKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgemVyb3NcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggemVyb3NcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwyLDNdLCBbMywyLDFdLCBbNCw1LDZdXSkuemVyb3MoKVxuICogLy8gW1swLDAsMF0sIFswLDAsMF0sIFswLDAsMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnplcm9zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmZpbGwoeCA9PiAwKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiB6ZXJvc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB6ZXJvc1xuICogQHBhcmFtIHJvd3Mge251bWJlcn0gRGVmaW5lcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfSBEZWZpbmVzIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXguemVyb3MoMywgMylcbiAqIC8vIFtbMCwwLDBdLCBbMCwwLDBdLCBbMCwwLDBdXVxuICpcbiAqL1xuTWF0cml4Lnplcm9zID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbCh4ID0+IDApXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIG9uZXNcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggb25lc1xuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLm9uZXMoKVxuICogLy8gW1sxLDEsMV0sIFsxLDEsMV0sIFsxLDEsMV1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLm9uZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuZmlsbCh4ID0+IDEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIG9uZXNcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggb25lc1xuICogQHBhcmFtIHJvd3Mge251bWJlcn0gRGVmaW5lcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfSBEZWZpbmVzIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub25lcygxLCAxKVxuICogLy8gW1sxLDEsMV0sIFsxLDEsMV0sIFsxLDEsMV1dXG4gKlxuICovXG5NYXRyaXgub25lcyA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoeCA9PiAxKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciByYW5kb21cbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggcmFuZG9tIHZhbHVlc1xuICogQHBhcmFtIHtmdW5jdGlvbn0gW2YgPSBlID0+IE1hdGgucmFuZG9tKCkgKiAyIC0gMV1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUucmFuZG9tID0gZnVuY3Rpb24gKGYgPSBlID0+IE1hdGgucmFuZG9tKCkgKiAyIC0gMSkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmZpbGwoZilcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gcmFuZG9tXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHJhbmRvbSBudW1iZXJzXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEZ1bmN0aW9uIHdoaWNoIHJldHVybnMgcmFuZG9tIHZhbHVlcy4gRGVmYXVsdCByYW5kb20gdmFsdWVzIGFyZSBiZXR3ZWVuIC0xIGFuZCAxXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfSBEZWZpbmVzIHRoZSByb3dzIG9mIHRoZSBtYXRyaXhcbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9IERlZmluZXMgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnJhbmRvbSA9IGZ1bmN0aW9uIChmID0gZSA9PiAoTWF0aC5yYW5kb20oKSAqIDIgLSAxKSwgcm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKGYpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHRvQXJyYXlcbiAqIEBkZXNjIFJldHVybnMgdGhlIGFycmF5IGZyb20gdGhlIG1hdHJpeFxuICogQHJldHVybnMge0FycmF5fVxuICovXG5NYXRyaXgucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9fdmFsdWUubWFwKHJvdyA9PiByb3cubWFwKGNvbCA9PiBjb2wpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBjbG9uZVxuICogQGRlc2MgUmV0dXJucyBhIGNsb25lIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXguZnJvbUFycmF5KHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZnJvbUFycmF5XG4gKiBAZGVzYyBSZXR1cm5zIGEgTWF0cml4IGZyb20gYW4gYXJyYXlcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuTWF0cml4LmZyb21BcnJheSA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihtYXAocm93ID0+IG1hcChjb2wgPT4gY29sKShyb3cpKShhcnIpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB0cmFuc3Bvc2VcbiAqIEBkZXNjIFJldHVybnMgYSB0cmFuc3Bvc2VkIE1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbLTEsIDJdLCBbMywgNF0sIFstOCwgMl0pXG4gKiBjb25zdCBiID0gQS50cmFuc3Bvc2UoKS50b0FycmF5KClcbiAqIC8vIHJldHVybnMgW1stMSwgMywtOF0sIFsyLCA0LCAyXV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS50cmFuc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZm9sZCh0cmFuc3Bvc2UsIFtdLCB0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiB0cmFuc3Bvc2VcbiAqIEBkZXNjIFJldHVybnMgYSB0cmFuc3Bvc2VkIE1hdHJpeFxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX0gQSBNYXRyaXggb3IgYSBtYXRyaXggYXJyYXlcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbLTEsIDJdLCBbMywgNF0sIFstOCwgMl1cbiAqIGNvbnN0IGIgPSBNYXRyaXgudHJhbnNwb3NlKGEpLnRvQXJyYXkoKVxuICogLy8gcmV0dXJucyBbWy0xLCAzLC04XSwgWzIsIDQsIDJdXVxuICovXG5NYXRyaXgudHJhbnNwb3NlID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS50cmFuc3Bvc2UoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBhZGRcbiAqIEBpbnN0YW5jZVxuICogQHBhcmFtIE0ge01hdHJpeHxudW1iZXJ9IEFkZCBhIE1hdHJpeCBvciBhIG51bWJlclxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuYWRkKDEpIC8vIFtbNiwgNV1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5hZGQoQikgLy8gW1sxMCwgMTBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoTSkge1xuICBpZiAoTSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSAhPT0gTS5nZXRDb2xzKCkgfHwgdGhpcy5nZXRSb3dzKCkgIT09IE0uZ2V0Um93cygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHJpY2VzIGRvIG5vdCBtYXRjaCwgY2Fubm90IGFkZCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcCgocm93LCBpZHgpID0+IG1hcCgodmFsLCBqZHgpID0+IHZhbCArIE0uX192YWx1ZVtpZHhdW2pkeF0pKHJvdykpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKG1hcCh4ID0+IHggKyBNKSlcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgc3VidHJhY3RcbiAqIEBpbnN0YW5jZVxuICogQHBhcmFtIE0ge01hdHJpeHxudW1iZXJ9IFN1YnRyYWN0IGEgTWF0cml4IG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5zdWJ0cmFjdCgxKSAvLyBbWzQsIDJdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIuc3VidHJhY3QoQikgLy8gW1swLCAwXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc3VidHJhY3QgPSBmdW5jdGlvbiAoTSkge1xuICBpZiAoTSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSAhPT0gTS5nZXRDb2xzKCkgfHwgdGhpcy5nZXRSb3dzKCkgIT09IE0uZ2V0Um93cygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHJpY2VzIGRvIG5vdCBtYXRjaCwgY2Fubm90IHN1YnRyYWN0JylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKCh2YWwsIGpkeCkgPT4gdmFsIC0gTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCAtIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBtdWx0aXBseVxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBNdXRsaXBseSBhIHNjYWxhciBvciBhIG10cmFpeCB3aXRoIGEgbWF0cml4LiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIG11bHRpcGxpY2F0aW9uIGlzIG5vdCBwb3NzaWJsZS5cbiAqIEBwYXJhbSBNIHtNYXRyaXh8bnVtYmVyfVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEubXVsdGlwbHkoMikgLy8gW1sxMCwgOF1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5tdWx0aXBseShCKSAvLyBbWzI1LCAyNV1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gKE0pIHtcbiAgaWYgKE0gaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgIT09IE0uZ2V0Q29scygpIHx8IHRoaXMuZ2V0Um93cygpICE9PSBNLmdldFJvd3MoKSkge1xuICAgICAgY29uc29sZS5sb2coJ1VzZSBzdGF0aWMgbWV0aG9kIFxcJ2RvdFxcJyB0byBkbyBtYXRyaXggbXVsdGlwbGljYXRpb24nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaWNlcyBkbyBub3QgbWF0Y2gsIGNhbm5vdCBjcmVhdGUgaGFkYW1hcmQgcHJvZHVjdCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcCgocm93LCBpZHgpID0+IG1hcCgoY29sLCBqZHgpID0+IGNvbCAqIE0uX192YWx1ZVtpZHhdW2pkeF0pKHJvdykpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKG1hcCh4ID0+IHggKiBNKSlcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgYWRkaXRpdmVpbnZlcnNlXG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWF0cml4IG9idGFpbmVkIGJ5IGNoYW5naW5nIHRoZSBzaWduIG9mIGV2ZXJ5IG1hdHJpeCBlbGVtZW50LiBUaGUgYWRkaXRpdmUgaW52ZXJzZSBvZiBtYXRyaXggQSBpcyB3cml0dGVuIOKAk0EuXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwtNV0sIFstNCwgNF1dKVxuICogY29uc3QgbWludXNBID0gQS5hZGRpdGl2ZWludmVyc2UoKVxuICogLy8gW1stNSwgNV0sIFs0LCAtNF1dXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuYWRkaXRpdmVpbnZlcnNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm11bHRpcGx5KC0xKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgaGFkYW1hcmRcbiAqIEBpbnN0YW5jZVxuICogQHNlZSBtdWx0aXBseVxuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLmhhZGFtYXJkKDIpIC8vIFtbMTAsIDhdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIuaGFkYW1hcmQoQikgLy8gW1syNSwgMjVdXVxuXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaGFkYW1hcmQgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm11bHRpcGx5KE0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGx1XG4gKiBAZGVzYyBDYWxjdWxhdGVzIExVIGRlY29tcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4W119XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IFtbMywgLTcsIC0yLCAyXSwgWy0zLCA1LCAxLCAwXSwgWzYsIC00LCAwLCAtNV0sIFstOSwgNSwgLTUsIDEyXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXguZnJvbUFycmF5KHJlc3VsdClcbiAqIGNvbnN0IGx1ID0gQS5sdSgpXG4gKiAvLyBMLl9fdmFsdWUgPSBbIFsgMSwgMCwgMCwgMCBdLCBbIC0xLCAxLCAwLCAwIF0sIFsgMiwgLTUsIDEsIDAgXSwgWyAtMywgOCwgMywgMSBdIF1cbiAqIC8vIFUuX192YWx1ZSA9ICBbIFsgMywgLTcsIC0yLCAyIF0sIFsgMCwgLTIsIC0xLCAyIF0sIFsgMCwgMCwgLTEsIDEgXSwgWyAwLCAwLCAwLCAtMSBdIF1cbiAqIE1hdHJpeC5kb3QobHVbMF0sIGx1WzFdKSAvLyByZXR1cm5zIGNsb25lIG9mIEFcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubHUgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IG4gPSB0aGlzLmdldFJvd3MoKVxuICBjb25zdCB0b2wgPSAxZS02XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgTCA9IHRoaXMuemVyb3MoKVxuICBjb25zdCBVID0gdGhpcy56ZXJvcygpXG5cbiAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyArK2spIHtcbiAgICBpZiAoTWF0aC5hYnMoQS5fX3ZhbHVlW2tdW2tdKSA8IHRvbCkgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBwcm9jZWVkIHdpdGhvdXQgYSByb3cgZXhjaGFuZ2UnKVxuICAgIEwuX192YWx1ZVtrXVtrXSA9IDFcbiAgICBmb3IgKGxldCBpID0gayArIDE7IGkgPCBuOyArK2kpIHtcbiAgICAgIEwuX192YWx1ZVtpXVtrXSA9IEEuX192YWx1ZVtpXVtrXSAvIEEuX192YWx1ZVtrXVtrXVxuICAgICAgZm9yIChsZXQgaiA9IGsgKyAxOyBqIDwgbjsgKytqKSB7XG4gICAgICAgIEEuX192YWx1ZVtpXVtqXSA9IEEuX192YWx1ZVtpXVtqXSAtIEwuX192YWx1ZVtpXVtrXSAqIEEuX192YWx1ZVtrXVtqXVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBsID0gazsgbCA8IG47ICsrbCkge1xuICAgICAgVS5fX3ZhbHVlW2tdW2xdID0gQS5fX3ZhbHVlW2tdW2xdXG4gICAgfVxuICB9XG4gIHJldHVybiBbTCwgVV1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgcnJlZlxuICogQHJldHVybnMge01hdHJpeHxhcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIEEgPSBNYXRyaXgub2YoW1stMSwgMV0sIFstMSwgMF0sIFswLCAtMV0sIFstMSwgLTJdXSlcbiAqIEEucnJlZigpIC8vICBbIFsgMSwgMCBdLCBbIC0wLCAxIF0sIFsgMCwgMCBdLCBbIDAsIDAgXSBdXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUucnJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IGxlYWQgPSAwXG4gIGNvbnN0IHJlc3VsdE1hdHJpeCA9IHRoaXMuY2xvbmUoKVxuXG4gIGZvciAobGV0IHIgPSAwOyByIDwgdGhpcy5nZXRSb3dzKCk7ICsrcikge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSA8PSBsZWFkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0TWF0cml4XG4gICAgfVxuICAgIGxldCBpID0gclxuICAgIHdoaWxlIChyZXN1bHRNYXRyaXguX192YWx1ZVtpXVtsZWFkXSA9PT0gMCkge1xuICAgICAgKytpXG4gICAgICBpZiAodGhpcy5nZXRSb3dzKCkgPT09IGkpIHtcbiAgICAgICAgaSA9IHJcbiAgICAgICAgKytsZWFkXG4gICAgICAgIGlmICh0aGlzLmdldENvbHMoKSA9PT0gbGVhZCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRNYXRyaXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0bXAgPSByZXN1bHRNYXRyaXguX192YWx1ZVtpXVxuICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1cbiAgICByZXN1bHRNYXRyaXguX192YWx1ZVtyXSA9IHRtcFxuXG4gICAgbGV0IHZhbCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2xlYWRdXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmdldENvbHMoKTsgKytqKSB7XG4gICAgICByZXN1bHRNYXRyaXguX192YWx1ZVtyXVtqXSAvPSB2YWxcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZ2V0Um93cygpOyArK2kpIHtcbiAgICAgIGlmIChpID09PSByKSBjb250aW51ZVxuICAgICAgdmFsID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1bbGVhZF1cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5nZXRDb2xzKCk7ICsraikge1xuICAgICAgICByZXN1bHRNYXRyaXguX192YWx1ZVtpXVtqXSAtPSB2YWwgKiByZXN1bHRNYXRyaXguX192YWx1ZVtyXVtqXVxuICAgICAgfVxuICAgIH1cbiAgICBsZWFkKytcbiAgfVxuICByZXR1cm4gcmVzdWx0TWF0cml4XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHNvbHZlXG4gKiBAcGFyYW0gYlxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBTb2x2ZSB4QSA9IGJcbiAqIC8vIDV4ICsgeSAgPSA3XG4gKiAvLyAzeCAtIDR5ID0gMThcbiAqIC8vIFNvbHV0aW9uIGZvciB4IGFuZCB5OlxuICogLy8geCA9IDJcbiAqIC8vIHkgPSAtM1xuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCAxXSwgWzMsIC00XV0pXG4gKiBjb25zdCBzb2x2ZUEgPSBBLnNvbHZlKFs3LCAxOF0pIC8vIFsyLCAtM11cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc29sdmUgPSBmdW5jdGlvbiAoYikge1xuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IExVID0gQS5sdSgpXG4gIGNvbnN0IEwgPSBMVVswXVxuICBjb25zdCBVID0gTFVbMV1cbiAgY29uc3QgbiA9IHRoaXMuZ2V0Um93cygpXG4gIGxldCBzID0gMFxuICBjb25zdCBjID0gW11cbiAgY29uc3QgeCA9IFtdXG5cbiAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyArK2spIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGs7ICsraikge1xuICAgICAgcyA9IHMgKyBMLl9fdmFsdWVba11bal0gKiBjW2pdXG4gICAgfVxuICAgIGNba10gPSBiW2tdIC0gc1xuICAgIHMgPSAwXG4gIH1cbiAgZm9yIChsZXQgYSA9IG4gLSAxOyBhID4gLTE7IC0tYSkge1xuICAgIGxldCB0ID0gMFxuICAgIGZvciAobGV0IGIgPSBhICsgMTsgYiA8IG47ICsrYikge1xuICAgICAgdCA9IHQgKyBVLl9fdmFsdWVbYV1bYl0gKiB4W2JdXG4gICAgfVxuICAgIHhbYV0gPSAoY1thXSAtIHQpIC8gVS5fX3ZhbHVlW2FdW2FdXG4gIH1cbiAgcmV0dXJuIHhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGludmVyc2VcbiAqIEBpbnN0YW5jZVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMiwgNF1dKS5pbnZlcnNlKClcbiAqIC8vIFsgWyAyLCAtMC41IF0sIFsgLTEsIDAuNSBdIF1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaW52ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBJID0gQS5pZGVudGl0eSgpXG4gIGNvbnN0IEludiA9IEEuY29uY2F0KEkpLnJyZWYoKVxuXG4gIGNvbnN0IHJlc3VsdCA9IEludi5fX3ZhbHVlLnJlZHVjZSgocmVzdWx0LCB4LCBpZHgpID0+IHtcbiAgICBjb25zdCBoYWxmID0geC5sZW5ndGggLyAyXG4gICAgcmVzdWx0LnB1c2goeC5zbGljZShoYWxmLCB4Lmxlbmd0aCkpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9LCBbXSlcbiAgcmV0dXJuIE1hdHJpeC5vZihyZXN1bHQpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciByYW5rXG4gKiBAaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUucmFuayA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgcnJlZiA9IHRoaXMucnJlZigpXG4gIGxldCByZXN1bHQgPSAwXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcnJlZi5nZXRDb2xzKCk7ICsraSkge1xuICAgIHJlc3VsdCArPSBycmVmLl9fdmFsdWVbaV1baV1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBkaW1lbnNpb25cbiAqIEBpbnN0YW5jZVxuICogQHNlZSByYW5rXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5NYXRyaXgucHJvdG90eXBlLmRpbWVuc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmFuaygpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBkaWFnXG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5vbmVzKDMsIDMpLmRpYWcoKVxuICogLy8gWzEsIDEsIDFdXG4gKlxuICogY29uc3QgZGlhZzAgPSBNYXRyaXguemVyb3MoNSwgNSkuZGlhZygpXG4gKiAvLyBbMCwgMCwgMCwgMCwgMF1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGlhZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCwgaWR4KSA9PiB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoeFtpZHhdKVxuICB9KShbXSkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBkaWFnXG4gKiBAZGVzYyBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXguZGlhZyhbWzIsIDFdLCBbMSwgNV1dKVxuICogLy8gWzIsIDVdXG4gKlxuICovXG5NYXRyaXguZGlhZyA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuZGlhZygpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBkaWFncHJvZHVjdFxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5vbmVzKDMsIDMpLmRpYWdwcm9kdWN0KClcbiAqIC8vIDFcbiAqXG4gKiBjb25zdCBkaWFnMCA9IE1hdHJpeC56ZXJvcyg1LCA1KS5kaWFncHJvZHVjdCgpXG4gKiAvLyAwXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmRpYWdwcm9kdWN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBpZHgpID0+IHtcbiAgICBhY2MgKj0geFtpZHhdXG4gICAgcmV0dXJuIGFjY1xuICB9KSgxKSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGRpYWdwcm9kdWN0XG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5kaWFncHJvZHVjdChbWzIsIDFdLCBbMSwgNV1dKVxuICogLy8gMTBcbiAqXG4gKi9cbk1hdHJpeC5kaWFncHJvZHVjdCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuZGlhZ3Byb2R1Y3QoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgc3VtXG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIHRoZSBNYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuc3VtKClcbiAqIC8vIDlcbiAqXG4gKiBjb25zdCBkaWFnMCA9IE1hdHJpeC56ZXJvcyg1LCA1KS5zdW0oKVxuICogLy8gMFxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zdW0gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgpID0+IHtcbiAgICBhY2MgKz0gZm9sZCgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpKDApKHgpXG4gICAgcmV0dXJuIGFjY1xuICB9KSgwKSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHN1bVxuICogQGRlc2MgUmV0dXJucyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIE1hdHJpeFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXguc3VtKFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyA5XG4gKlxuICovXG5NYXRyaXguc3VtID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5zdW0oKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIga3JvbmVja2VyXG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFRoZSBLcm9uZWNrZXIgcHJvZHVjdCBpcyBhbiBvcGVyYXRpb24gb24gdHdvIG1hdHJpY2VzIG9mIGFyYml0cmFyeSBzaXplIHJlc3VsdGluZyBpbiBhIGJsb2NrIG1hdHJpeC5cbiAqIEBwYXJhbSBNIHtNYXRyaXh9IFRoZSByaWdodCBzaWRlIE1hdHJpeCBvZiB0aGUgcHJvZHVjdCAodGhpcyDiipcgTSlcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUua3JvbmVja2VyID0gZnVuY3Rpb24gKE0pIHtcbiAgY29uc3QgbSA9IHRoaXMuZ2V0Um93cygpXG4gIGNvbnN0IG4gPSB0aGlzLmdldENvbHMoKVxuICBjb25zdCBwID0gTS5nZXRSb3dzKClcbiAgY29uc3QgcSA9IE0uZ2V0Q29scygpXG5cbiAgY29uc3QgbGVmdCA9IHRoaXMuX192YWx1ZVxuICBjb25zdCByaWdodCA9IE0uX192YWx1ZVxuXG4gIGNvbnN0IGZyYW1lID0gZ2VuZXJhdGUobSAqIHAsIG4gKiBxKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbTsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcDsgaysrKSB7XG4gICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgcTsgbCsrKSB7XG4gICAgICAgICAgZnJhbWVbcCAqIGkgKyBrXVtxICogaiArIGxdID0gbGVmdFtpXVtqXSAqIHJpZ2h0W2tdW2xdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gTWF0cml4Lm9mKGZyYW1lKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBrcm9uZWNrZXJcbiAqIEBkZXNjIFRoZSBLcm9uZWNrZXIgcHJvZHVjdCBpcyBhbiBvcGVyYXRpb24gb24gdHdvIG1hdHJpY2VzIG9mIGFyYml0cmFyeSBzaXplIHJlc3VsdGluZyBpbiBhIGJsb2NrIG1hdHJpeC5cbiAqIEBwYXJhbSBBIHtNYXRyaXh9IFRoZSBsZWZ0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0IChBIOKKlyBCKVxuICogQHBhcmFtIEIge01hdHJpeH0gVGhlIHJpZ2h0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0IChBIOKKlyBCKVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4Lmtyb25lY2tlciA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkua3JvbmVja2VyKEIpXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hdHJpeFxuIiwiaW1wb3J0IHsgY29uY2F0LCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHBhcmFtIG0ge0FycmF5fVxuICogQHBhcmFtIGlkeCB7bnVtYmVyfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiAoTSwgbSwgaWR4KSB7XG4gIHJldHVybiBjb25jYXQobSwgTS5fX3ZhbHVlW2lkeF0pXG59KVxuIiwiaW1wb3J0IHsgY3VycnkgfSBmcm9tICdmdW4uanMnXG5leHBvcnQgZGVmYXVsdCBjdXJyeShtID0+IFtdKVxuIiwiaW1wb3J0IHsgZm9sZCwgbWFwLCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcbmltcG9ydCByb3VuZCBmcm9tICcuL3JvdW5kJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBwYXJhbSBCIHtNYXRyaXh9XG4gKiBAcGFyYW0gYSB7QXJyYXl9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChkZWNpbWFscywgQiwgYSkgPT4gbWFwKChpdGVtLCBpKSA9PiB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGopID0+IHtcbiAgICBhY2MgKz0gcm91bmQoeCAqIEIuX192YWx1ZVtqXVtpXSwgZGVjaW1hbHMpXG4gICAgcmV0dXJuIGFjY1xuICB9LCAwKShhKVxufSkoQi5fX3ZhbHVlWzBdKSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHJvdW5kXG4gKiBAcGFyYW0gdmFsdWUge251bWJlcn1cbiAqIEBwYXJhbSBkZWNpbWFscyB7bnVtYmVyfVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm91bmQgKHZhbHVlLCBkZWNpbWFscykge1xuICByZXR1cm4gTnVtYmVyKE1hdGgucm91bmQodmFsdWUgKyAnZScgKyBkZWNpbWFscykgKyAnZS0nICsgZGVjaW1hbHMpXG59XG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICdmdW4uanMnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzYyBDcmVhdGVzIGFuIGlkZW50aXkgbWF0cml4IGZyb20gYW4gZW1wdHkgYXJyYXlcbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm4ge01hdHJpeH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG0sIGlkeCkgPT4gbWFwKChyb3dzLCBqZHgpID0+IChpZHggPT09IGpkeCkgKiAxKShtKVxuIiwiaW1wb3J0IHsgbWFwLCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBUcmFuc3Bvc2VzIGEgYXJyYXkgb2YgYXJyYXlzIHVzaW5nIHRoZSBNYXRyaXgubWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChwcmV2LCBuZXh0KSA9PiBtYXAoKGl0ZW0sIGkpID0+IChwcmV2W2ldIHx8IFtdKS5jb25jYXQobmV4dFtpXSkpKG5leHQpKVxuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZVxuICogQGRlc2MgR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBhIG1hdHJpeCBhcnJheSwgdmFsdWVzIGFyZSBzZXQgdG8gdW5kZWZpbmVkXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHthbnlbXVtdfVxuICovXG5leHBvcnQgZGVmYXVsdCAocm93cywgY29scyA9IHVuZGVmaW5lZCwgdmFsdWUgPSAwKSA9PiB7XG4gIGNvbnN0IF9jb2xzID0gY29scyB8fCByb3dzXG4gIGNvbnN0IHkgPSBtYXAoeiA9PiB2YWx1ZSkobmV3IEFycmF5KF9jb2xzKSlcbiAgcmV0dXJuIG1hcCh6ID0+IHkpKG5ldyBBcnJheShyb3dzKSlcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9e9d420..d052b3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { - "name": "funmatrix", - "version": "1.0.0", + "name": "@astuanax/funmatrix", + "version": "1.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1152,6 +1152,11 @@ "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -1200,7 +1205,6 @@ "version": "6.7.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", - "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -1235,8 +1239,7 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "3.2.1", @@ -1260,8 +1263,16 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } }, "argparse": { "version": "1.0.10", @@ -1337,7 +1348,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -1382,8 +1392,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assertion-error": { "version": "1.1.0", @@ -1418,8 +1427,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", @@ -1430,14 +1438,12 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "babel-code-frame": { "version": "7.0.0-beta.3", @@ -2549,8 +2555,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -2617,7 +2622,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -2646,6 +2650,36 @@ "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4=" + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, "bluebird": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", @@ -2703,7 +2737,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2863,6 +2896,25 @@ "isarray": "^1.0.0" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -3004,8 +3056,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chai": { "version": "4.2.0", @@ -3074,8 +3125,7 @@ "chownr": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" }, "chrome-trace-event": { "version": "1.0.0", @@ -3171,8 +3221,7 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-visit": { "version": "1.0.0", @@ -3223,7 +3272,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -3340,8 +3388,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -3364,6 +3411,11 @@ "date-now": "^0.1.4" } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -3470,8 +3522,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "5.2.0", @@ -4043,7 +4094,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -4111,6 +4161,14 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -4120,6 +4178,11 @@ "type-detect": "^4.0.0" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -4201,8 +4264,12 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "depd": { "version": "1.1.2", @@ -4232,6 +4299,11 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", @@ -4339,7 +4411,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -4400,7 +4471,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -5114,6 +5184,11 @@ } } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -5164,8 +5239,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -5267,14 +5341,12 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-glob": { "version": "2.2.6", @@ -5293,8 +5365,7 @@ "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", @@ -5350,6 +5421,11 @@ } } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -5495,14 +5571,12 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -5540,6 +5614,11 @@ "readable-stream": "^2.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -5561,8 +5640,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.7", @@ -6159,6 +6237,17 @@ } } }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, "fun.js": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/fun.js/-/fun.js-1.0.4.tgz", @@ -6176,6 +6265,54 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -6213,16 +6350,32 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "gl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/gl/-/gl-4.2.2.tgz", + "integrity": "sha512-RiFX+eUrMiVXyYaO1/tsHE8ex+a/52GY2mTE5MjUWE6gJvRFqGYwE6psPtEeiucBlX7DDmHe2QjJ4qyT/ubrYA==", + "requires": { + "bindings": "^1.2.1", + "bit-twiddle": "^1.0.2", + "glsl-tokenizer": "^2.0.2", + "nan": "^2.6.2", + "node-gyp": "^3.6.2", + "prebuild-install": "^5.1.0" + } + }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6349,11 +6502,72 @@ } } }, + "glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "requires": { + "through2": "^0.6.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "gpu-mock.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gpu-mock.js/-/gpu-mock.js-1.0.1.tgz", + "integrity": "sha1-gecUajfu47bWJ/H+qnSibVExSKI=" + }, + "gpu.js": { + "version": "2.0.0-rc.13", + "resolved": "https://registry.npmjs.org/gpu.js/-/gpu.js-2.0.0-rc.13.tgz", + "integrity": "sha512-9WyBThe30fVgnsDxgZkAopYBlo8FlqQmwPFmYUnHfTVibiu1ObkvdlYtP6yJscWkwllskeYNWlfrKKR6G83u0w==", + "requires": { + "acorn": "^5.1.1", + "gl": "^4.2.2", + "gpu-mock.js": "^1.0.1" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + } + } + }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "growl": { "version": "1.10.3", @@ -6382,14 +6596,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -6433,6 +6645,11 @@ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -6578,7 +6795,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -6675,7 +6891,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -6684,14 +6899,12 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "6.3.1", @@ -6915,8 +7128,7 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-glob": { "version": "4.0.0", @@ -7028,8 +7240,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -7046,14 +7257,12 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -7064,8 +7273,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { "version": "2.0.4", @@ -7111,8 +7319,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { "version": "11.11.0", @@ -7177,14 +7384,12 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -7195,8 +7400,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "2.1.0", @@ -7219,7 +7423,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -7588,14 +7791,12 @@ "mime-db": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "dev": true + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" }, "mime-types": { "version": "2.1.21", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", - "dev": true, "requires": { "mime-db": "~1.37.0" } @@ -7606,6 +7807,11 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, "minami": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/minami/-/minami-1.2.3.tgz", @@ -7628,7 +7834,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -7636,8 +7841,7 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mississippi": { "version": "2.0.0", @@ -7694,7 +7898,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -7798,9 +8001,7 @@ "nan": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", - "dev": true, - "optional": true + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" }, "nanomatch": { "version": "1.2.13", @@ -7821,6 +8022,11 @@ "to-regex": "^3.0.1" } }, + "napi-build-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", + "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -7845,6 +8051,40 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-abi": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.8.0.tgz", + "integrity": "sha512-1/aa2clS0pue0HjckL62CsbhWWU35HARvBDXcJtYKbYR7LnIutmpxmXbuDMV9kEviD2lP/wACOgWmmwljghHyQ==", + "requires": { + "semver": "^5.4.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, "node-libs-browser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", @@ -7899,6 +8139,19 @@ "semver": "^5.3.0" } }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.2.tgz", @@ -7935,6 +8188,17 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -7947,8 +8211,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwsapi": { "version": "2.0.9", @@ -9130,14 +9393,12 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -9245,7 +9506,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -9295,6 +9555,11 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -9307,8 +9572,16 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } }, "output-file-sync": { "version": "2.0.1", @@ -9487,8 +9760,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -9545,8 +9817,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "3.0.0", @@ -10103,6 +10374,45 @@ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, + "prebuild-install": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz", + "integrity": "sha512-aaLVANlj4HgZweKttFNUVNRxDukytuIuxeK2boIMHjagNJCiVKWFsKF4tCE3ql3GbrD2tExPQ7/pwtEJcHNZeg==", + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "os-homedir": "^1.0.1", + "pump": "^2.0.1", + "rc": "^1.2.7", + "simple-get": "^2.7.0", + "tar-fs": "^1.13.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -10130,8 +10440,7 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { "version": "2.0.3", @@ -10181,8 +10490,7 @@ "psl": { "version": "1.1.31", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", - "dev": true + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" }, "public-encrypt": { "version": "4.0.3", @@ -10234,8 +10542,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "q": { "version": "1.5.1", @@ -10246,8 +10553,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "querystring": { "version": "0.2.0", @@ -10334,6 +10640,24 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "react-is": { "version": "16.8.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.2.tgz", @@ -10365,7 +10689,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -10507,7 +10830,6 @@ "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -10534,14 +10856,12 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -10679,7 +10999,6 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -10730,8 +11049,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -10745,8 +11063,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sax": { "version": "1.2.4", @@ -10767,8 +11084,7 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "send": { "version": "0.16.2", @@ -10812,8 +11128,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.0", @@ -10878,8 +11193,22 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } }, "simple-swizzle": { "version": "0.2.2", @@ -11273,7 +11602,6 @@ "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -11639,7 +11967,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -11649,7 +11976,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -11658,7 +11984,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -11678,8 +12003,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "style-loader": { "version": "0.23.1", @@ -11841,6 +12165,52 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "requires": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + }, + "dependencies": { + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, "terser": { "version": "3.17.0", "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", @@ -12041,6 +12411,11 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -12136,7 +12511,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -12144,8 +12518,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-check": { "version": "0.3.2", @@ -12467,7 +12840,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -12514,8 +12886,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.0.0", @@ -12536,8 +12907,7 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "v8-compile-cache": { "version": "2.0.2", @@ -12571,7 +12941,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -12837,7 +13206,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -12848,6 +13216,19 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -12913,8 +13294,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", @@ -12944,8 +13324,7 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "4.0.0", diff --git a/package.json b/package.json index e2af32c..6f4410f 100755 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "build": "./node_modules/.bin/eslint ./src --fix && npm run compile && npm run test && npm run jsdocs-json && npm run jsdocs && npm run size", "dev": "webpack --progress --colors --watch --env dev", "compile": "webpack --env dev && webpack --env build", - "test": "mocha --require babel-register --colors ./test/*.spec.js", + "test": "mocha --max_old_space_size=4096 --require babel-register --colors ./test/*.spec.js", "test:watch": "mocha --require babel-register --colors -w ./test/*.spec.js", "test:cover": "cross-env NODE_ENV=test nyc mocha --require babel-register --colors test/*.spec.js", "repl": "node -i -e \"$(< ./lib/@astuanax/funmatrix.js)\"", @@ -72,6 +72,7 @@ "instrument": false }, "dependencies": { - "fun.js": "^1.0.4" + "fun.js": "^1.0.4", + "gpu.js": "^2.0.0-rc.13" } } diff --git a/src/gpumatrix.js b/src/gpumatrix.js new file mode 100644 index 0000000..3cf3d81 --- /dev/null +++ b/src/gpumatrix.js @@ -0,0 +1,125 @@ +import Matrix from './Matrix' +import curry from 'fun.js/src/curry' +import gpumap from 'util/gpumap' +import gpufold from 'util/gpufold' +import gpuproduct from 'util/gpuproduct' + +/** + * @class GpuMatrix + * @classdesc GpuMatrix applicative providing standard matrix operations + * @summary The GpuMatrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden. + * @hidecontructor + * @see of + * @example + * + * const gpu = new GPU() + * const m = GpuMatrix.of([[1,2],[2,3],[4,5]], gpu) + * + */ +class GpuMatrix extends Matrix { + constructor (val, GPUJS) { + super() + if (GPUJS) { + this.gpujs = GPUJS || null + } + } +} + +/** + * @memberOf GpuMatrix + * @static + * @function GpuMatrix.of + * @desc Creates a GpuMatrix object and flattens the GpuMatrix + * @param val {array|function} An array of arrays + * @param GPUJS {Object} + * @returns {GpuMatrix} + * @example + * + * const m = GpuMatrix.of([[1,2],[2,3],[4,5]], gpu) + * + */ +GpuMatrix.of = function (val, GPUJS = null) { + if (val instanceof GpuMatrix) return val + if (this instanceof GpuMatrix) { + this.__value = val + this.gpujs = GPUJS + return this + } + return new GpuMatrix(val, GPUJS) +} + +//* ***********************/ +// GPU Functions +//* ***********************/ + +/** + * @memberOf GpuMatrix + * @instance + * @member gpuMap + * @description Maps over the rows of the GpuMatrix using a map function using the GPU + * @param f {function} An GPU.js enabled iterator function + * @returns {GpuMatrix} + * @example + * + * function gpuMapper (a) { return a[this.thread.y][this.thread.x] } + * const m = GpuMatrix.of([[2, 2], [2, 2]], GPUJS) + * m.gpuMap(gpuMapper) + * // [Float32Array(2,2), Float32Array(2,2)] + * + * + */ +GpuMatrix.prototype.gpuMap = function (f) { + return GpuMatrix.of(gpumap(this.gpujs, f, this.__value)) +} + +/** + * @memberOf GpuMatrix + * @static + * @function gpuMap + * @description Static function that maps over the rows of the GpuMatrix using a map function using the GPU + * @param f {function} An GPU.js enabled iterator function + * @param M {GpuMatrix|array} GpuMatrix or array to map + * @returns {GpuMatrix} + * @example + * + * function gpuMapper (a) { return a[this.thread.y][this.thread.x] } + * const m = GpuMatrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]]) + * // [Float32Array(2,2), Float32Array(2,2)] + * + */ +GpuMatrix.gpuMap = curry(function (gpu, f, M) { + return GpuMatrix.of(M, gpu).gpuMap(f) +}) + +/** + * @memberOf GpuMatrix + * @instance + * @member gpuFold + * @description Folds the rows of the GpuMatrix using a GPUS.js enqbled reduce function, using the GPU + * @param f {function} An iterator function + * @returns {GpuMatrix} + * @example + * + * const m = GpuMatrix.of([[1, 1], [1, 1]]) + * m.map(x => x.map(y => y+ 1)) + * // [[2, 2], [2, 2]] + * + */ +GpuMatrix.prototype.gpuFold = function (f, output) { + return GpuMatrix.of(gpufold(this.gpujs, f, output, this.__value)) +} + +/** + * @memberOf GpuMatrix + * @function GpuMatrix#gpuProduct + * @param f + * @param output + * @param M + * @returns {GpuMatrix} + */ +GpuMatrix.prototype.gpuProduct = function (f, output, M) { + // (gpu, f, output, a, b, constants = {} + return GpuMatrix.of(gpuproduct(this.gpujs, f, output, this.__value, M.__value)) +} + +export default GpuMatrix diff --git a/src/matrix.js b/src/matrix.js index 713f207..e61269e 100644 --- a/src/matrix.js +++ b/src/matrix.js @@ -2,12 +2,15 @@ import curry from 'fun.js/src/curry' import map from 'fun.js/src/map' import fold from 'fun.js/src/fold' import equals from 'fun.js/src/equals' -import concat from 'util/concat' -import empty from 'util/empty' -import dot from 'util/dot' -import identity from 'util/identity' -import transpose from 'util/transpose' -import generate from 'util/generate' +import concat from './util/concat' +import empty from './util/empty' +import dot from './util/dot' +import identity from './util/identity' +import transpose from './util/transpose' +import generate from './util/generate' +// import gpumap from 'util/gpumap' +// import gpufold from 'util/gpufold' +// import gpuproduct from 'util/gpuproduct' /** * @class Matrix @@ -24,6 +27,27 @@ let Matrix = function (val) { this.__value = val } +/** + * @memberOf Matrix + * @static + * @function of + * @desc Creates a Matrix object and flattens the Matrix + * @param val {array|function} An array of arrays + * @returns {Matrix} + * @example + * + * const m = Matrix.of([[1,2],[2,3],[4,5]]) + * + */ +Matrix.of = function (val) { + if (val instanceof Matrix) return val + if (this instanceof Matrix) { + this.__value = val + return this + } + return new Matrix(val) +} + /** * @memberOf Matrix * @property {string} type @@ -172,27 +196,6 @@ Matrix.prototype.getShape = function () { return [this.getRows(), this.getCols()] } -/** - * @memberOf Matrix - * @static - * @function of - * @desc Creates a Matrix object and flattens the Matrix - * @param val {array|function} An array of arrays - * @returns {Matrix} - * @example - * - * const m = Matrix.of([[1,2],[2,3],[4,5]]) - * - */ -Matrix.of = function (val) { - if (val instanceof Matrix) return val - if (this instanceof Matrix) { - this.__value = val - return this - } - return new Matrix(val) -} - /** * @memberOf Matrix * @instance @@ -656,7 +659,7 @@ Matrix.transpose = function (M) { /** * @memberOf Matrix - * @member add + * @function add * @instance * @param M {Matrix|number} Add a Matrix or a number * @returns {Matrix} @@ -1084,15 +1087,16 @@ Matrix.prototype.kronecker = function (M) { const frame = generate(m * p, n * q) - for (var i = 0; i < m; i++) { - for (var j = 0; j < n; j++) { - for (var k = 0; k < p; k++) { - for (var l = 0; l < q; l++) { + for (let i = 0; i < m; i++) { + for (let j = 0; j < n; j++) { + for (let k = 0; k < p; k++) { + for (let l = 0; l < q; l++) { frame[p * i + k][q * j + l] = left[i][j] * right[k][l] } } } } + return Matrix.of(frame) } diff --git a/src/util/addMatrix.js b/src/util/addMatrix.js index 9850bea..774841b 100644 --- a/src/util/addMatrix.js +++ b/src/util/addMatrix.js @@ -1,4 +1,3 @@ -import map from 'fun.js/src/map' -import curry from 'fun.js/src/curry' +import { map, curry } from 'fun.js' export default curry((M, m) => map((row, idx) => row.map((col, jdx) => col + M.__value[idx][jdx]))(m)) diff --git a/src/util/addScalar.js b/src/util/addScalar.js index 8503445..bb14031 100644 --- a/src/util/addScalar.js +++ b/src/util/addScalar.js @@ -1,4 +1,3 @@ -import curry from 'fun.js/src/curry' -import map from 'fun.js/src/map' +import { map, curry } from 'fun.js' export default curry((M, m) => map(col => col + M.__value)(m)) diff --git a/src/util/concat.js b/src/util/concat.js index da40164..e3a13d5 100644 --- a/src/util/concat.js +++ b/src/util/concat.js @@ -1,5 +1,4 @@ -import curry from 'fun.js/src/curry' -import concat from 'fun.js/src/concat' +import { concat, curry } from 'fun.js' /** * @function concat diff --git a/src/util/dot.js b/src/util/dot.js index c2c874c..c45d882 100644 --- a/src/util/dot.js +++ b/src/util/dot.js @@ -1,6 +1,4 @@ -import curry from 'fun.js/src/curry' -import fold from 'fun.js/src/fold' -import map from 'fun.js/src/map' +import { fold, map, curry } from 'fun.js' import round from './round' /** diff --git a/src/util/empty.js b/src/util/empty.js index 54cfecb..a5e242b 100644 --- a/src/util/empty.js +++ b/src/util/empty.js @@ -1,3 +1,2 @@ -import curry from 'fun.js/src/curry' - +import { curry } from 'fun.js' export default curry(m => []) diff --git a/src/util/generate.js b/src/util/generate.js index 9687300..b9c4935 100644 --- a/src/util/generate.js +++ b/src/util/generate.js @@ -1,3 +1,5 @@ +import { map } from 'fun.js' + /** * @function generate * @desc Generator function for a matrix array, values are set to undefined @@ -5,4 +7,8 @@ * @param cols {number} * @returns {any[][]} */ -export default (rows, cols) => Array.apply(null, Array(rows)).map(x => Array.apply(null, Array(cols))) +export default (rows, cols = undefined, value = 0) => { + const _cols = cols || rows + const y = map(z => value)(new Array(_cols)) + return map(z => y)(new Array(rows)) +} diff --git a/src/util/gpudot.js b/src/util/gpudot.js new file mode 100644 index 0000000..00915f4 --- /dev/null +++ b/src/util/gpudot.js @@ -0,0 +1,7 @@ +export default function dot (a, b) { + let sum = 0 + for (var i = 0; i < this.constants.n; i++) { + sum += a[this.thread.y][i] * b[i][this.thread.x] + } + return sum +} diff --git a/src/util/gpufold.js b/src/util/gpufold.js new file mode 100644 index 0000000..e3cb20c --- /dev/null +++ b/src/util/gpufold.js @@ -0,0 +1,5 @@ +export default function gpufold (gpu, f, output, matrix, constants = {}) { + return gpu + .createKernel(f, { constants: Object.assign({}, { m: matrix.length, n: matrix[0].length }, constants) }) + .setOutput(output)(matrix) +} diff --git a/src/util/gpumap.js b/src/util/gpumap.js new file mode 100644 index 0000000..d523e6b --- /dev/null +++ b/src/util/gpumap.js @@ -0,0 +1,5 @@ +// import curry from 'fun.js/src/curry' + +export default function gpumap (gpu, f, matrix) { + return gpu.createKernel(f).setOutput([matrix.length, matrix[0].length])(matrix) +} diff --git a/src/util/gpuproduct.js b/src/util/gpuproduct.js new file mode 100644 index 0000000..3750e96 --- /dev/null +++ b/src/util/gpuproduct.js @@ -0,0 +1,5 @@ +export default function gpuproduct (gpu, f, output, a, b, constants = {}) { + return gpu + .createKernel(f, { constants: Object.assign({}, { m: b.length, n: a[0].length }, constants) }) + .setOutput(output)(a, b) +} diff --git a/src/util/identity.js b/src/util/identity.js index 85d5518..70ae2bc 100644 --- a/src/util/identity.js +++ b/src/util/identity.js @@ -1,4 +1,4 @@ -import map from 'fun.js/src/map' +import { map } from 'fun.js' /** * @function identity diff --git a/src/util/transpose.js b/src/util/transpose.js index d723cd6..a286e84 100644 --- a/src/util/transpose.js +++ b/src/util/transpose.js @@ -1,5 +1,4 @@ -import map from 'fun.js/src/map' -import curry from 'fun.js/src/curry' +import { map, curry } from 'fun.js' /** * @function transpose diff --git a/test/gpumatrix.spec.js b/test/gpumatrix.spec.js new file mode 100644 index 0000000..09478ba --- /dev/null +++ b/test/gpumatrix.spec.js @@ -0,0 +1,55 @@ +// import chai from 'chai' +// import Matrix from '../lib/@astuanax/funmatrix' +// import generate from '../src/util/generate' +// import gpudot from '../src/util/gpudot' +// import { GPU } from 'gpu.js' +// const gpu = new GPU() +// +// describe('Matrix map on gpu', function () { +// it('generates square matrix array', function () { +// const dim = 2 +// const m = generate(dim) +// chai.expect(m).to.deep.equal([[0, 0], [0, 0]]) +// }) +// +// it('maps arrays on gpu', function () { +// const A = Matrix.of([[0]], gpu) +// function mapF (a) { return a[this.thread.y][this.thread.x] } +// chai.expect(A.gpuMap(mapF).__value).to.deep.equal([new Float32Array([0])]) +// }) +// +// it('maps large arrays on gpu', function () { +// const dim = 100 +// const m = generate(dim).map(row => row.map(x => 0)) +// const A = Matrix.of(m, gpu) +// function mapF (a) { return a[this.thread.y][this.thread.x] } +// const expected = m.map(row => new Float32Array(row.map(x => 0))) +// chai.expect(A.gpuMap(mapF).__value).to.deep.equal(expected) +// }) +// +// it('folds large arrays on gpu', function () { +// const sum = function (a) { +// let sum = 0 +// for (let i = 0; i < this.constants.m; i++) { +// for (let j = 0; j < this.constants.n; j++) { +// sum += a[i][j] +// } +// } +// return sum +// } +// const A = Matrix.of([[2, 0], [0, 2], [1, 1]], gpu) +// const test = A.gpuFold(sum, [1]) +// const expected = new Float32Array([6]) +// chai.expect(test.__value).to.deep.equal(expected) +// }) +// +// it('dot product on gpu', function () { +// const A = Matrix.of([[2, 0], [0, 2]], gpu) +// const B = Matrix.of([[1, 0], [0, 1]], gpu) +// +// const test = A.gpuProduct(gpudot, [2, 2], B) +// const expected = [new Float32Array([2, 0]), new Float32Array([0, 2])] +// +// chai.expect(test.__value).to.deep.equal(expected) +// }) +// }) diff --git a/webpack.config.js b/webpack.config.js index c9364af..b4d567b 100755 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,25 +1,25 @@ -/* global __dirname, require, module*/ +/* global __dirname, require, module */ -const webpack = require('webpack'); -const path = require('path'); -const env = require('yargs').argv.env; // use --env with webpack 2 -const pkg = require('./package.json'); +const webpack = require('webpack') +const path = require('path') +const env = require('yargs').argv.env // use --env with webpack 2 +const pkg = require('./package.json') -let libraryName = pkg.name; +let libraryName = pkg.name -let outputFile, mode; +let outputFile, mode if (env === 'build') { - mode = 'production'; - outputFile = libraryName + '.min.js'; + mode = 'production' + outputFile = libraryName + '.min.js' } else { - mode = 'development'; - outputFile = libraryName + '.js'; + mode = 'development' + outputFile = libraryName + '.js' } const config = { mode: mode, - entry: __dirname + '/src/matrix.js', + entry: [__dirname + '/src/matrix.js'], devtool: 'inline-source-map', output: { path: __dirname + '/lib', @@ -47,6 +47,6 @@ const config = { modules: [path.resolve('./node_modules'), path.resolve('./src')], extensions: ['.json', '.js'] } -}; +} -module.exports = config; +module.exports = config