!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n=e();for(var i in n)("object"==typeof exports?exports:t)[i]=n[i]}}(window,(function(){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var l=e[i]={i:i,l:!1,exports:{}};return t[i].call(l.exports,l,l.exports,n),l.l=!0,l.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},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 i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var l in t)n.d(i,l,function(e){return t[e]}.bind(null,l));return i},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=2)}([function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Util = void 0;\r\nconst StructV_1 = __webpack_require__(2);\r\nexports.Util = {\r\n generateId() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n },\r\n objectClone(obj) {\r\n return obj ? JSON.parse(JSON.stringify(obj)) : {};\r\n },\r\n removeFromList(list, fn) {\r\n for (let i = 0; i < list.length; i++) {\r\n fn(list[i]) && list.splice(i, 1) && i--;\r\n }\r\n },\r\n assert(condition, errorText) {\r\n if (condition) {\r\n throw errorText;\r\n }\r\n },\r\n textParser(text) {\r\n let fieldReg = /\\[[^\\]]*\\]/g;\r\n if (fieldReg.test(text)) {\r\n let contents = text.match(fieldReg), values = contents.map(item => item.replace(/\\[|\\]/g, ''));\r\n return values;\r\n }\r\n else {\r\n return text;\r\n }\r\n },\r\n clamp(value, max, min) {\r\n if (value <= max && value >= min)\r\n return value;\r\n if (value > max)\r\n return max;\r\n if (value < min)\r\n return min;\r\n },\r\n converterList(constructedDataType) {\r\n return [].concat(...Object.keys(constructedDataType).map(item => constructedDataType[item]));\r\n },\r\n convertG6Data(constructedData) {\r\n let nodes = [...exports.Util.converterList(constructedData.element), ...exports.Util.converterList(constructedData.pointer)], edges = exports.Util.converterList(constructedData.link);\r\n return {\r\n nodes: nodes.map(item => item.cloneProps()),\r\n edges: edges.map(item => item.cloneProps())\r\n };\r\n },\r\n calcRotateMatrix(matrix, rotation) {\r\n const Mat3 = StructV_1.SV.G6.Util.mat3;\r\n Mat3.rotate(matrix, matrix, rotation);\r\n return matrix;\r\n }\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQ29tbW9uL3V0aWwudHM/YWZkMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBZ0M7QUFPbkIsWUFBSSxHQUFHO0lBTWhCLFVBQVU7UUFDTixPQUFPLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBUyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEdBQUcsR0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzRCxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBTUQsV0FBVyxDQUFtQixHQUFNO1FBQ2hDLE9BQU8sR0FBRyxFQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFHLENBQUM7SUFDckQsQ0FBQztJQU9ELGNBQWMsQ0FBSSxJQUFTLEVBQUUsRUFBd0I7UUFDakQsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQzNDO0lBQ0wsQ0FBQztJQU9ELE1BQU0sQ0FBQyxTQUFrQixFQUFFLFNBQWlCO1FBQ3hDLElBQUcsU0FBUyxFQUFFO1lBQ1YsTUFBTSxTQUFTLENBQUM7U0FDbkI7SUFDTCxDQUFDO0lBTUQsVUFBVSxDQUFDLElBQVk7UUFDbkIsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDO1FBRTdCLElBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUMvQixNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUQsT0FBTyxNQUFNLENBQUM7U0FDakI7YUFDSTtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBTUQsS0FBSyxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsR0FBVztRQUN6QyxJQUFHLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM5QyxJQUFHLEtBQUssR0FBRyxHQUFHO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDM0IsSUFBRyxLQUFLLEdBQUcsR0FBRztZQUFFLE9BQU8sR0FBRyxDQUFDO0lBQy9CLENBQUM7SUFPRCxhQUFhLENBQUMsbUJBQTJEO1FBQ3JFLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQU9ELGFBQWEsQ0FBQyxlQUFnQztRQUMxQyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsWUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxZQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUN4RyxLQUFLLEdBQUcsWUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsT0FBTztZQUNILEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQzlDLENBQUM7SUFDTixDQUFDO0lBT0QsZ0JBQWdCLENBQUMsTUFBZ0IsRUFBRSxRQUFnQjtRQUMvQyxNQUFNLElBQUksR0FBRyxZQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FDSixDQUFDIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3RlZERhdGEgfSBmcm9tIFwiLi4vTW9kZWwvbW9kZWxDb25zdHJ1Y3RvclwiO1xyXG5pbXBvcnQgeyBTViB9IGZyb20gXCIuLi9TdHJ1Y3RWXCI7XHJcbmltcG9ydCB7IEc2RGF0YSB9IGZyb20gXCIuLi9WaWV3L3JlbmRlcmVyXCI7XHJcblxyXG5cclxuLyoqXHJcbiAqIOW3peWFt+WHveaVsFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFV0aWwgPSB7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55Sf5oiQ5ZSv5LiAaWRcclxuICAgICAqL1xyXG4gICAgZ2VuZXJhdGVJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybsKgJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLMKgZnVuY3Rpb24oYykge1xyXG4gICAgwqDCoMKgwqDCoMKgwqDCoGxldMKgciA9IE1hdGgucmFuZG9tKCkqMTZ8MCwgdiA9IGMgPT3CoCd4J8KgPyByIDogKHImMHgzfDB4OCk7XHJcbiAgICDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuwqB2LnRvU3RyaW5nKDE2KTtcclxuICAgIMKgwqDCoMKgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Lme5LiQ54mI5a+56LGh5YWL6ZqGXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBvYmplY3RDbG9uZTxUIGV4dGVuZHMgT2JqZWN0PihvYmo6IFQpOiBUIHtcclxuICAgICAgICByZXR1cm4gb2JqPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpOiB7IH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5YiX6KGo5Lit56e76Zmk5YWD57SgXHJcbiAgICAgKiBAcGFyYW0gbGlzdCDnp7vpmaTliJfooahcclxuICAgICAqIEBwYXJhbSBmbiDnp7vpmaTliKTmlq3op4TliJlcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlRnJvbUxpc3Q8VD4obGlzdDogVFtdLCBmbjogKGl0ZW06IFQpID0+IGJvb2xlYW4pIHtcclxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmbihsaXN0W2ldKSAmJiBsaXN0LnNwbGljZShpLCAxKSAmJiBpLS07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaWreiogOWHveaVsFxyXG4gICAgICogQHBhcmFtIGFzc2VydEZuIFxyXG4gICAgICogQHBhcmFtIGVycm9yVGV4dCBcclxuICAgICAqL1xyXG4gICAgYXNzZXJ0KGNvbmRpdGlvbjogYm9vbGVhbiwgZXJyb3JUZXh0OiBzdHJpbmcpOiB2b2lkIHwgbmV2ZXIge1xyXG4gICAgICAgIGlmKGNvbmRpdGlvbikge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvclRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaWh+acrOino+aekFxyXG4gICAgICogQHBhcmFtIHRleHQgXHJcbiAgICAgKi9cclxuICAgIHRleHRQYXJzZXIodGV4dDogc3RyaW5nKTogc3RyaW5nW10gfCBzdHJpbmcge1xyXG4gICAgICAgIGxldCBmaWVsZFJlZyA9IC9cXFtbXlxcXV0qXFxdL2c7XHJcblxyXG4gICAgICAgIGlmKGZpZWxkUmVnLnRlc3QodGV4dCkpIHtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnRzID0gdGV4dC5tYXRjaChmaWVsZFJlZyksXHJcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb250ZW50cy5tYXAoaXRlbSA9PiBpdGVtLnJlcGxhY2UoL1xcW3xcXF0vZywgJycpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnibXliLbmn5DkuKrlgLxcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgY2xhbXAodmFsdWU6IG51bWJlciwgbWF4OiBudW1iZXIsIG1pbjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBpZih2YWx1ZSA8PSBtYXggJiYgdmFsdWUgPj0gbWluKSByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgaWYodmFsdWUgPiBtYXgpIHJldHVybiBtYXg7XHJcbiAgICAgICAgaWYodmFsdWUgPCBtaW4pIHJldHVybiBtaW47XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gY29uc3RydWN0ZWREYXRhVHlwZSBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBjb252ZXJ0ZXJMaXN0KGNvbnN0cnVjdGVkRGF0YVR5cGU6IENvbnN0cnVjdGVkRGF0YVtrZXlvZiBDb25zdHJ1Y3RlZERhdGFdKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyhjb25zdHJ1Y3RlZERhdGFUeXBlKS5tYXAoaXRlbSA9PiBjb25zdHJ1Y3RlZERhdGFUeXBlW2l0ZW1dKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRzYgZGF0YSDovazmjaLlmahcclxuICAgICAqIEBwYXJhbSBjb25zdHJ1Y3RlZERhdGEgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgY29udmVydEc2RGF0YShjb25zdHJ1Y3RlZERhdGE6IENvbnN0cnVjdGVkRGF0YSk6IEc2RGF0YSB7XHJcbiAgICAgICAgbGV0IG5vZGVzID0gWy4uLlV0aWwuY29udmVydGVyTGlzdChjb25zdHJ1Y3RlZERhdGEuZWxlbWVudCksIC4uLlV0aWwuY29udmVydGVyTGlzdChjb25zdHJ1Y3RlZERhdGEucG9pbnRlcildLFxyXG4gICAgICAgICAgICBlZGdlcyA9IFV0aWwuY29udmVydGVyTGlzdChjb25zdHJ1Y3RlZERhdGEubGluayk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IFxyXG4gICAgICAgICAgICBub2Rlczogbm9kZXMubWFwKGl0ZW0gPT4gaXRlbS5jbG9uZVByb3BzKCkpLCBcclxuICAgICAgICAgICAgZWRnZXM6IGVkZ2VzLm1hcChpdGVtID0+IGl0ZW0uY2xvbmVQcm9wcygpKVxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6h566X5peL6L2s55+p6Zi1XHJcbiAgICAgKiBAcGFyYW0gbWF0cml4IFxyXG4gICAgICogQHBhcmFtIHJvdGF0aW9uIFxyXG4gICAgICovXHJcbiAgICBjYWxjUm90YXRlTWF0cml4KG1hdHJpeDogbnVtYmVyW10sIHJvdGF0aW9uOiBudW1iZXIpOiBudW1iZXJbXSB7XHJcbiAgICAgICAgY29uc3QgTWF0MyA9IFNWLkc2LlV0aWwubWF0MztcclxuICAgICAgICBNYXQzLnJvdGF0ZShtYXRyaXgsIG1hdHJpeCwgcm90YXRpb24pO1xyXG4gICAgICAgIHJldHVybiBtYXRyaXg7XHJcbiAgICB9XHJcbn07XHJcblxyXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n")},function(module,exports,__webpack_require__){eval('!function(t,e){ true?module.exports=e():undefined}(this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.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 i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));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=528)}([function(t,e,n){"use strict";n.d(e,"j",(function(){return v})),n.d(e,"k",(function(){return b})),n.d(e,"y",(function(){return x})),n.d(e,"g",(function(){return i})),n.d(e,"J",(function(){return w})),n.d(e,"h",(function(){return S})),n.d(e,"u",(function(){return _})),n.d(e,"B",(function(){return O})),n.d(e,"G",(function(){return M})),n.d(e,"I",(function(){return T})),n.d(e,"m",(function(){return c})),n.d(e,"n",(function(){return P})),n.d(e,"o",(function(){return j})),n.d(e,"r",(function(){return s})),n.d(e,"s",(function(){return u})),n.d(e,"t",(function(){return E})),n.d(e,"v",(function(){return l})),n.d(e,"w",(function(){return g})),n.d(e,"x",(function(){return m})),n.d(e,"D",(function(){return R})),n.d(e,"b",(function(){return L})),n.d(e,"c",(function(){return U})),n.d(e,"d",(function(){return z})),n.d(e,"e",(function(){return W})),n.d(e,"f",(function(){return h})),n.d(e,"l",(function(){return X})),n.d(e,"p",(function(){return H})),n.d(e,"q",(function(){return q})),n.d(e,"z",(function(){return K})),n.d(e,"A",(function(){return G})),n.d(e,"a",(function(){return G})),n.d(e,"i",(function(){return Z})),n.d(e,"F",(function(){return Q})),n.d(e,"H",(function(){return $})),n.d(e,"C",(function(){return tt})),n.d(e,"E",(function(){return et}));var r=function(t){return null!==t&&"function"!=typeof t&&isFinite(t.length)},i=function(t,e){if(!r(t))return t;for(var n=[],i=0;ie&&(e=t)})),e}}(e);return{min:function(t){if(c(t)){var e=t[0];return h(t,(function(t){t20&&(i=20),parseFloat(t.toFixed(i))},E=function(t){return a(t,"Number")};Number.isInteger&&Number.isInteger;function _(t,e,n){return void 0===n&&(n=1e-5),Math.abs(t-e)0?(n[0]=2*(u*a+l*r+c*o-f*i)/h,n[1]=2*(c*a+l*i+f*r-u*o)/h,n[2]=2*(f*a+l*o+u*i-c*r)/h):(n[0]=2*(u*a+l*r+c*o-f*i),n[1]=2*(c*a+l*i+f*r-u*o),n[2]=2*(f*a+l*o+u*i-c*r)),ct(t,e,n),t}function lt(t,e){return t[0]=e[12],t[1]=e[13],t[2]=e[14],t}function ht(t,e){var n=e[0],r=e[1],i=e[2],o=e[4],a=e[5],s=e[6],u=e[8],c=e[9],f=e[10];return t[0]=Math.hypot(n,r,i),t[1]=Math.hypot(o,a,s),t[2]=Math.hypot(u,c,f),t}function dt(t,e){var n=new s.a(3);ht(n,e);var r=1/n[0],i=1/n[1],o=1/n[2],a=e[0]*r,u=e[1]*i,c=e[2]*o,f=e[4]*r,l=e[5]*i,h=e[6]*o,d=e[8]*r,p=e[9]*i,g=e[10]*o,v=a+l+g,y=0;return v>0?(y=2*Math.sqrt(v+1),t[3]=.25*y,t[0]=(h-p)/y,t[1]=(d-c)/y,t[2]=(u-f)/y):a>l&&a>g?(y=2*Math.sqrt(1+a-l-g),t[3]=(h-p)/y,t[0]=.25*y,t[1]=(u+f)/y,t[2]=(d+c)/y):l>g?(y=2*Math.sqrt(1+l-a-g),t[3]=(d-c)/y,t[0]=(u+f)/y,t[1]=.25*y,t[2]=(h+p)/y):(y=2*Math.sqrt(1+g-a-l),t[3]=(u-f)/y,t[0]=(d+c)/y,t[1]=(h+p)/y,t[2]=.25*y),t}function pt(t,e,n,r){var i=e[0],o=e[1],a=e[2],s=e[3],u=i+i,c=o+o,f=a+a,l=i*u,h=i*c,d=i*f,p=o*c,g=o*f,v=a*f,y=s*u,m=s*c,b=s*f,x=r[0],w=r[1],S=r[2];return t[0]=(1-(p+v))*x,t[1]=(h+b)*x,t[2]=(d-m)*x,t[3]=0,t[4]=(h-b)*w,t[5]=(1-(l+v))*w,t[6]=(g+y)*w,t[7]=0,t[8]=(d+m)*S,t[9]=(g-y)*S,t[10]=(1-(l+p))*S,t[11]=0,t[12]=n[0],t[13]=n[1],t[14]=n[2],t[15]=1,t}function gt(t,e,n,r,i){var o=e[0],a=e[1],s=e[2],u=e[3],c=o+o,f=a+a,l=s+s,h=o*c,d=o*f,p=o*l,g=a*f,v=a*l,y=s*l,m=u*c,b=u*f,x=u*l,w=r[0],S=r[1],E=r[2],_=i[0],O=i[1],k=i[2],M=(1-(g+y))*w,A=(d+x)*w,T=(p-b)*w,C=(d-x)*S,I=(1-(h+y))*S,P=(v+m)*S,j=(p+b)*E,D=(v-m)*E,N=(1-(h+g))*E;return t[0]=M,t[1]=A,t[2]=T,t[3]=0,t[4]=C,t[5]=I,t[6]=P,t[7]=0,t[8]=j,t[9]=D,t[10]=N,t[11]=0,t[12]=n[0]+_-(M*_+C*O+j*k),t[13]=n[1]+O-(A*_+I*O+D*k),t[14]=n[2]+k-(T*_+P*O+N*k),t[15]=1,t}function vt(t,e){var n=e[0],r=e[1],i=e[2],o=e[3],a=n+n,s=r+r,u=i+i,c=n*a,f=r*a,l=r*s,h=i*a,d=i*s,p=i*u,g=o*a,v=o*s,y=o*u;return t[0]=1-l-p,t[1]=f+y,t[2]=h-v,t[3]=0,t[4]=f-y,t[5]=1-c-p,t[6]=d+g,t[7]=0,t[8]=h+v,t[9]=d-g,t[10]=1-c-l,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function yt(t,e,n,r,i,o,a){var s=1/(n-e),u=1/(i-r),c=1/(o-a);return t[0]=2*o*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*o*u,t[6]=0,t[7]=0,t[8]=(n+e)*s,t[9]=(i+r)*u,t[10]=(a+o)*c,t[11]=-1,t[12]=0,t[13]=0,t[14]=a*o*2*c,t[15]=0,t}function mt(t,e,n,r,i){var o,a=1/Math.tan(e/2);return t[0]=a/n,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=i&&i!==1/0?(o=1/(r-i),t[10]=(i+r)*o,t[14]=2*i*r*o):(t[10]=-1,t[14]=-2*r),t}function bt(t,e,n,r){var i=Math.tan(e.upDegrees*Math.PI/180),o=Math.tan(e.downDegrees*Math.PI/180),a=Math.tan(e.leftDegrees*Math.PI/180),s=Math.tan(e.rightDegrees*Math.PI/180),u=2/(a+s),c=2/(i+o);return t[0]=u,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=c,t[6]=0,t[7]=0,t[8]=-(a-s)*u*.5,t[9]=(i-o)*c*.5,t[10]=r/(n-r),t[11]=-1,t[12]=0,t[13]=0,t[14]=r*n/(n-r),t[15]=0,t}function xt(t,e,n,r,i,o,a){var s=1/(e-n),u=1/(r-i),c=1/(o-a);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*u,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*c,t[11]=0,t[12]=(e+n)*s,t[13]=(i+r)*u,t[14]=(a+o)*c,t[15]=1,t}function wt(t,e,n,r){var i,o,a,u,c,f,l,h,d,p,g=e[0],v=e[1],y=e[2],m=r[0],b=r[1],x=r[2],w=n[0],S=n[1],E=n[2];return Math.abs(g-w)0&&(f*=d=1/Math.sqrt(d),l*=d,h*=d);var p=u*h-c*l,g=c*f-s*h,v=s*l-u*f;return(d=p*p+g*g+v*v)>0&&(p*=d=1/Math.sqrt(d),g*=d,v*=d),t[0]=p,t[1]=g,t[2]=v,t[3]=0,t[4]=l*v-h*g,t[5]=h*p-f*v,t[6]=f*g-l*p,t[7]=0,t[8]=f,t[9]=l,t[10]=h,t[11]=0,t[12]=i,t[13]=o,t[14]=a,t[15]=1,t}function Et(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"}function _t(t){return Math.hypot(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}function Ot(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t[2]=e[2]+n[2],t[3]=e[3]+n[3],t[4]=e[4]+n[4],t[5]=e[5]+n[5],t[6]=e[6]+n[6],t[7]=e[7]+n[7],t[8]=e[8]+n[8],t[9]=e[9]+n[9],t[10]=e[10]+n[10],t[11]=e[11]+n[11],t[12]=e[12]+n[12],t[13]=e[13]+n[13],t[14]=e[14]+n[14],t[15]=e[15]+n[15],t}function kt(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t[3]=e[3]-n[3],t[4]=e[4]-n[4],t[5]=e[5]-n[5],t[6]=e[6]-n[6],t[7]=e[7]-n[7],t[8]=e[8]-n[8],t[9]=e[9]-n[9],t[10]=e[10]-n[10],t[11]=e[11]-n[11],t[12]=e[12]-n[12],t[13]=e[13]-n[13],t[14]=e[14]-n[14],t[15]=e[15]-n[15],t}function Mt(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*n,t[5]=e[5]*n,t[6]=e[6]*n,t[7]=e[7]*n,t[8]=e[8]*n,t[9]=e[9]*n,t[10]=e[10]*n,t[11]=e[11]*n,t[12]=e[12]*n,t[13]=e[13]*n,t[14]=e[14]*n,t[15]=e[15]*n,t}function At(t,e,n,r){return t[0]=e[0]+n[0]*r,t[1]=e[1]+n[1]*r,t[2]=e[2]+n[2]*r,t[3]=e[3]+n[3]*r,t[4]=e[4]+n[4]*r,t[5]=e[5]+n[5]*r,t[6]=e[6]+n[6]*r,t[7]=e[7]+n[7]*r,t[8]=e[8]+n[8]*r,t[9]=e[9]+n[9]*r,t[10]=e[10]+n[10]*r,t[11]=e[11]+n[11]*r,t[12]=e[12]+n[12]*r,t[13]=e[13]+n[13]*r,t[14]=e[14]+n[14]*r,t[15]=e[15]+n[15]*r,t}function Tt(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]&&t[4]===e[4]&&t[5]===e[5]&&t[6]===e[6]&&t[7]===e[7]&&t[8]===e[8]&&t[9]===e[9]&&t[10]===e[10]&&t[11]===e[11]&&t[12]===e[12]&&t[13]===e[13]&&t[14]===e[14]&&t[15]===e[15]}function Ct(t,e){var n=t[0],r=t[1],i=t[2],o=t[3],a=t[4],u=t[5],c=t[6],f=t[7],l=t[8],h=t[9],d=t[10],p=t[11],g=t[12],v=t[13],y=t[14],m=t[15],b=e[0],x=e[1],w=e[2],S=e[3],E=e[4],_=e[5],O=e[6],k=e[7],M=e[8],A=e[9],T=e[10],C=e[11],I=e[12],P=e[13],j=e[14],D=e[15];return Math.abs(n-b)<=s.b*Math.max(1,Math.abs(n),Math.abs(b))&&Math.abs(r-x)<=s.b*Math.max(1,Math.abs(r),Math.abs(x))&&Math.abs(i-w)<=s.b*Math.max(1,Math.abs(i),Math.abs(w))&&Math.abs(o-S)<=s.b*Math.max(1,Math.abs(o),Math.abs(S))&&Math.abs(a-E)<=s.b*Math.max(1,Math.abs(a),Math.abs(E))&&Math.abs(u-_)<=s.b*Math.max(1,Math.abs(u),Math.abs(_))&&Math.abs(c-O)<=s.b*Math.max(1,Math.abs(c),Math.abs(O))&&Math.abs(f-k)<=s.b*Math.max(1,Math.abs(f),Math.abs(k))&&Math.abs(l-M)<=s.b*Math.max(1,Math.abs(l),Math.abs(M))&&Math.abs(h-A)<=s.b*Math.max(1,Math.abs(h),Math.abs(A))&&Math.abs(d-T)<=s.b*Math.max(1,Math.abs(d),Math.abs(T))&&Math.abs(p-C)<=s.b*Math.max(1,Math.abs(p),Math.abs(C))&&Math.abs(g-I)<=s.b*Math.max(1,Math.abs(g),Math.abs(I))&&Math.abs(v-P)<=s.b*Math.max(1,Math.abs(v),Math.abs(P))&&Math.abs(y-j)<=s.b*Math.max(1,Math.abs(y),Math.abs(j))&&Math.abs(m-D)<=s.b*Math.max(1,Math.abs(m),Math.abs(D))}var It=Z,Pt=kt,jt=n(40);function Dt(){var t=new s.a(4);return s.a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0),t}function Nt(t){var e=new s.a(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e}function Rt(t,e,n,r){var i=new s.a(4);return i[0]=t,i[1]=e,i[2]=n,i[3]=r,i}function Lt(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function Bt(t,e,n,r,i){return t[0]=e,t[1]=n,t[2]=r,t[3]=i,t}function Gt(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t[2]=e[2]+n[2],t[3]=e[3]+n[3],t}function Ft(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t[3]=e[3]-n[3],t}function Ut(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t[2]=e[2]*n[2],t[3]=e[3]*n[3],t}function zt(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t[2]=e[2]/n[2],t[3]=e[3]/n[3],t}function Vt(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t[3]=Math.ceil(e[3]),t}function Wt(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t[3]=Math.floor(e[3]),t}function Xt(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t[2]=Math.min(e[2],n[2]),t[3]=Math.min(e[3],n[3]),t}function Yt(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t[2]=Math.max(e[2],n[2]),t[3]=Math.max(e[3],n[3]),t}function Ht(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t[2]=Math.round(e[2]),t[3]=Math.round(e[3]),t}function qt(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t}function Kt(t,e,n,r){return t[0]=e[0]+n[0]*r,t[1]=e[1]+n[1]*r,t[2]=e[2]+n[2]*r,t[3]=e[3]+n[3]*r,t}function Zt(t,e){var n=e[0]-t[0],r=e[1]-t[1],i=e[2]-t[2],o=e[3]-t[3];return Math.hypot(n,r,i,o)}function Qt(t,e){var n=e[0]-t[0],r=e[1]-t[1],i=e[2]-t[2],o=e[3]-t[3];return n*n+r*r+i*i+o*o}function Jt(t){var e=t[0],n=t[1],r=t[2],i=t[3];return Math.hypot(e,n,r,i)}function $t(t){var e=t[0],n=t[1],r=t[2],i=t[3];return e*e+n*n+r*r+i*i}function te(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t}function ee(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t[3]=1/e[3],t}function ne(t,e){var n=e[0],r=e[1],i=e[2],o=e[3],a=n*n+r*r+i*i+o*o;return a>0&&(a=1/Math.sqrt(a)),t[0]=n*a,t[1]=r*a,t[2]=i*a,t[3]=o*a,t}function re(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}function ie(t,e,n,r){var i=n[0]*r[1]-n[1]*r[0],o=n[0]*r[2]-n[2]*r[0],a=n[0]*r[3]-n[3]*r[0],s=n[1]*r[2]-n[2]*r[1],u=n[1]*r[3]-n[3]*r[1],c=n[2]*r[3]-n[3]*r[2],f=e[0],l=e[1],h=e[2],d=e[3];return t[0]=l*c-h*u+d*s,t[1]=-f*c+h*a-d*o,t[2]=f*u-l*a+d*i,t[3]=-f*s+l*o-h*i,t}function oe(t,e,n,r){var i=e[0],o=e[1],a=e[2],s=e[3];return t[0]=i+r*(n[0]-i),t[1]=o+r*(n[1]-o),t[2]=a+r*(n[2]-a),t[3]=s+r*(n[3]-s),t}function ae(t,e){var n,r,i,o,a,u;e=e||1;do{a=(n=2*s.c()-1)*n+(r=2*s.c()-1)*r}while(a>=1);do{u=(i=2*s.c()-1)*i+(o=2*s.c()-1)*o}while(u>=1);var c=Math.sqrt((1-a)/u);return t[0]=e*n,t[1]=e*r,t[2]=e*i*c,t[3]=e*o*c,t}function se(t,e,n){var r=e[0],i=e[1],o=e[2],a=e[3];return t[0]=n[0]*r+n[4]*i+n[8]*o+n[12]*a,t[1]=n[1]*r+n[5]*i+n[9]*o+n[13]*a,t[2]=n[2]*r+n[6]*i+n[10]*o+n[14]*a,t[3]=n[3]*r+n[7]*i+n[11]*o+n[15]*a,t}function ue(t,e,n){var r=e[0],i=e[1],o=e[2],a=n[0],s=n[1],u=n[2],c=n[3],f=c*r+s*o-u*i,l=c*i+u*r-a*o,h=c*o+a*i-s*r,d=-a*r-s*i-u*o;return t[0]=f*c+d*-a+l*-u-h*-s,t[1]=l*c+d*-s+h*-a-f*-u,t[2]=h*c+d*-u+f*-s-l*-a,t[3]=e[3],t}function ce(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t}function fe(t){return"vec4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"}function le(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]}function he(t,e){var n=t[0],r=t[1],i=t[2],o=t[3],a=e[0],u=e[1],c=e[2],f=e[3];return Math.abs(n-a)<=s.b*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(r-u)<=s.b*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(i-c)<=s.b*Math.max(1,Math.abs(i),Math.abs(c))&&Math.abs(o-f)<=s.b*Math.max(1,Math.abs(o),Math.abs(f))}var de,pe=Ft,ge=Ut,ve=zt,ye=Zt,me=Qt,be=Jt,xe=$t,we=(de=Dt(),function(t,e,n,r,i,o){var a,s;for(e||(e=4),n||(n=0),s=r?Math.min(r*e+n,t.length):t.length,a=n;as.b?(t[0]=e[0]/r,t[1]=e[1]/r,t[2]=e[2]/r):(t[0]=1,t[1]=0,t[2]=0),n}function ke(t,e){var n=en(t,e);return Math.acos(2*n*n-1)}function Me(t,e,n){var r=e[0],i=e[1],o=e[2],a=e[3],s=n[0],u=n[1],c=n[2],f=n[3];return t[0]=r*f+a*s+i*c-o*u,t[1]=i*f+a*u+o*s-r*c,t[2]=o*f+a*c+r*u-i*s,t[3]=a*f-r*s-i*u-o*c,t}function Ae(t,e,n){n*=.5;var r=e[0],i=e[1],o=e[2],a=e[3],s=Math.sin(n),u=Math.cos(n);return t[0]=r*u+a*s,t[1]=i*u+o*s,t[2]=o*u-i*s,t[3]=a*u-r*s,t}function Te(t,e,n){n*=.5;var r=e[0],i=e[1],o=e[2],a=e[3],s=Math.sin(n),u=Math.cos(n);return t[0]=r*u-o*s,t[1]=i*u+a*s,t[2]=o*u+r*s,t[3]=a*u-i*s,t}function Ce(t,e,n){n*=.5;var r=e[0],i=e[1],o=e[2],a=e[3],s=Math.sin(n),u=Math.cos(n);return t[0]=r*u+i*s,t[1]=i*u-r*s,t[2]=o*u+a*s,t[3]=a*u-o*s,t}function Ie(t,e){var n=e[0],r=e[1],i=e[2];return t[0]=n,t[1]=r,t[2]=i,t[3]=Math.sqrt(Math.abs(1-n*n-r*r-i*i)),t}function Pe(t,e){var n=e[0],r=e[1],i=e[2],o=e[3],a=Math.sqrt(n*n+r*r+i*i),s=Math.exp(o),u=a>0?s*Math.sin(a)/a:0;return t[0]=n*u,t[1]=r*u,t[2]=i*u,t[3]=s*Math.cos(a),t}function je(t,e){var n=e[0],r=e[1],i=e[2],o=e[3],a=Math.sqrt(n*n+r*r+i*i),s=a>0?Math.atan2(a,o)/a:0;return t[0]=n*s,t[1]=r*s,t[2]=i*s,t[3]=.5*Math.log(n*n+r*r+i*i+o*o),t}function De(t,e,n){return je(t,e),tn(t,t,n),Pe(t,t),t}function Ne(t,e,n,r){var i,o,a,u,c,f=e[0],l=e[1],h=e[2],d=e[3],p=n[0],g=n[1],v=n[2],y=n[3];return(o=f*p+l*g+h*v+d*y)<0&&(o=-o,p=-p,g=-g,v=-v,y=-y),1-o>s.b?(i=Math.acos(o),a=Math.sin(i),u=Math.sin((1-r)*i)/a,c=Math.sin(r*i)/a):(u=1-r,c=r),t[0]=u*f+c*p,t[1]=u*l+c*g,t[2]=u*h+c*v,t[3]=u*d+c*y,t}function Re(t){var e=s.c(),n=s.c(),r=s.c(),i=Math.sqrt(1-e),o=Math.sqrt(e);return t[0]=i*Math.sin(2*Math.PI*n),t[1]=i*Math.cos(2*Math.PI*n),t[2]=o*Math.sin(2*Math.PI*r),t[3]=o*Math.cos(2*Math.PI*r),t}function Le(t,e){var n=e[0],r=e[1],i=e[2],o=e[3],a=n*n+r*r+i*i+o*o,s=a?1/a:0;return t[0]=-n*s,t[1]=-r*s,t[2]=-i*s,t[3]=o*s,t}function Be(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],t}function Ge(t,e){var n,r=e[0]+e[4]+e[8];if(r>0)n=Math.sqrt(r+1),t[3]=.5*n,n=.5/n,t[0]=(e[5]-e[7])*n,t[1]=(e[6]-e[2])*n,t[2]=(e[1]-e[3])*n;else{var i=0;e[4]>e[0]&&(i=1),e[8]>e[3*i+i]&&(i=2);var o=(i+1)%3,a=(i+2)%3;n=Math.sqrt(e[3*i+i]-e[3*o+o]-e[3*a+a]+1),t[i]=.5*n,n=.5/n,t[3]=(e[3*o+a]-e[3*a+o])*n,t[o]=(e[3*o+i]+e[3*i+o])*n,t[a]=(e[3*a+i]+e[3*i+a])*n}return t}function Fe(t,e,n,r){var i=.5*Math.PI/180;e*=i,n*=i,r*=i;var o=Math.sin(e),a=Math.cos(e),s=Math.sin(n),u=Math.cos(n),c=Math.sin(r),f=Math.cos(r);return t[0]=o*u*f-a*s*c,t[1]=a*s*f+o*u*c,t[2]=a*u*c-o*s*f,t[3]=a*u*f+o*s*c,t}function Ue(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"}var ze,Ve,We,Xe,Ye,He,qe=Nt,Ke=Rt,Ze=Lt,Qe=Bt,Je=Gt,$e=Me,tn=qt,en=re,nn=oe,rn=Jt,on=rn,an=$t,sn=an,un=ne,cn=le,fn=he,ln=(ze=jt.create(),Ve=jt.fromValues(1,0,0),We=jt.fromValues(0,1,0),function(t,e,n){var r=jt.dot(e,n);return r<-.999999?(jt.cross(ze,Ve,e),jt.len(ze)<1e-6&&jt.cross(ze,We,e),jt.normalize(ze,ze),_e(t,ze,Math.PI),t):r>.999999?(t[0]=0,t[1]=0,t[2]=0,t[3]=1,t):(jt.cross(ze,e,n),t[0]=ze[0],t[1]=ze[1],t[2]=ze[2],t[3]=1+r,un(t,t))}),hn=(Xe=Se(),Ye=Se(),function(t,e,n,r,i,o){return Ne(Xe,e,i,o),Ne(Ye,n,r,o),Ne(t,Xe,Ye,2*o*(1-o)),t}),dn=(He=u(),function(t,e,n,r){return He[0]=n[0],He[3]=n[1],He[6]=n[2],He[1]=r[0],He[4]=r[1],He[7]=r[2],He[2]=-e[0],He[5]=-e[1],He[8]=-e[2],un(t,Ge(t,He))}),pn=n(82)},function(t,e,n){"use strict";n.d(e,"AST_TOKEN_TYPES",(function(){return l})),n.d(e,"STORAGE_CLASS",(function(){return d})),n.d(e,"Target",(function(){return p})),n.d(e,"DefineValuePlaceholder",(function(){return v}));n(232);var r=n(35);n.d(e,"Component",(function(){return r.a}));n(134),n(120),n(121),n(241),n(122),n(123),n(124),n(242),n(125),n(126),n(128),n(129),n(130),n(131);var i=n(36);n.d(e,"gl",(function(){return i.a}));n(161),n(162),n(243),n(163),n(164),n(115),n(165),n(48),n(166),n(244),n(70);var o=n(119);n.d(e,"createEntity",(function(){return o.b}));var a=n(13);n.d(e,"IDENTIFIER",(function(){return a.a}));var s=n(91);n.d(e,"createWorldContainer",(function(){return s.a}));n(245);var u=n(246);n.d(e,"generateAABBFromVertices",(function(){return u.a}));var c=n(247);n.d(e,"isSafari",(function(){return c.a}));var f=n(248);n.o(f,"AABB")&&n.d(e,"AABB",(function(){return f.AABB})),n.o(f,"Frustum")&&n.d(e,"Frustum",(function(){return f.Frustum}));var l,h,d,p,g=n(268);n.d(e,"AABB",(function(){return g.a})),n.d(e,"Frustum",(function(){return g.b})),function(t){t.Void="Void",t.Boolean="Boolean",t.Float="Float",t.Uint32="Uint32",t.Int32="Int32",t.Vector="Vector",t.Vector2Float="vec2",t.Vector3Float="vec3",t.Vector4Float="vec4",t.Vector2Boolean="vec2",t.Vector3Boolean="vec3",t.Vector4Boolean="vec4",t.Vector2Uint="vec2",t.Vector3Uint="vec3",t.Vector4Uint="vec4",t.Vector2Int="vec2",t.Vector3Int="vec3",t.Vector4Int="vec4",t.Matrix="Matrix",t.Matrix3x3Float="mat3x3",t.Matrix4x4Float="mat4x4",t.Struct="Struct",t.FloatArray="Float[]",t.Vector4FloatArray="vec4[]"}(l||(l={})),function(t){t.Program="Program",t.Identifier="Identifier",t.VariableDeclaration="VariableDeclaration",t.BlockStatement="BlockStatement",t.ReturnStatement="ReturnStatement",t.FunctionDeclaration="FunctionDeclaration",t.VariableDeclarator="VariableDeclarator",t.AssignmentExpression="AssignmentExpression",t.LogicalExpression="LogicalExpression",t.BinaryExpression="BinaryExpression",t.ArrayExpression="ArrayExpression",t.UnaryExpression="UnaryExpression",t.UpdateExpression="UpdateExpression",t.FunctionExpression="FunctionExpression",t.MemberExpression="MemberExpression",t.ConditionalExpression="ConditionalExpression",t.ExpressionStatement="ExpressionStatement",t.CallExpression="CallExpression",t.NumThreadStatement="NumThreadStatement",t.StorageStatement="StorageStatement",t.DoWhileStatement="DoWhileStatement",t.WhileStatement="WhileStatement",t.ForStatement="ForStatement",t.BreakStatement="BreakStatement",t.ContinueStatement="ContinueStatement",t.IfStatement="IfStatement",t.ImportedFunctionStatement="ImportedFunctionStatement"}(h||(h={})),function(t){t.Input="Input",t.Output="Output",t.Uniform="Uniform",t.Workgroup="Workgroup",t.UniformConstant="UniformConstant",t.Image="Image",t.StorageBuffer="StorageBuffer",t.Private="Private",t.Function="Function"}(d||(d={})),function(t){t.GLSL100="GLSL100",t.GLSL450="GLSL450",t.WGSL="WGSL"}(p||(p={}));var v="__DefineValuePlaceholder__"},function(t,e){t.exports=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.METADATA_KEY=void 0;var r=n(31);e.METADATA_KEY=r;var i=n(466);Object.defineProperty(e,"Container",{enumerable:!0,get:function(){return i.Container}});var o=n(56);Object.defineProperty(e,"BindingScopeEnum",{enumerable:!0,get:function(){return o.BindingScopeEnum}}),Object.defineProperty(e,"BindingTypeEnum",{enumerable:!0,get:function(){return o.BindingTypeEnum}}),Object.defineProperty(e,"TargetTypeEnum",{enumerable:!0,get:function(){return o.TargetTypeEnum}});var a=n(482);Object.defineProperty(e,"AsyncContainerModule",{enumerable:!0,get:function(){return a.AsyncContainerModule}}),Object.defineProperty(e,"ContainerModule",{enumerable:!0,get:function(){return a.ContainerModule}});var s=n(483);Object.defineProperty(e,"injectable",{enumerable:!0,get:function(){return s.injectable}});var u=n(484);Object.defineProperty(e,"tagged",{enumerable:!0,get:function(){return u.tagged}});var c=n(485);Object.defineProperty(e,"named",{enumerable:!0,get:function(){return c.named}});var f=n(237);Object.defineProperty(e,"inject",{enumerable:!0,get:function(){return f.inject}}),Object.defineProperty(e,"LazyServiceIdentifer",{enumerable:!0,get:function(){return f.LazyServiceIdentifer}});var l=n(486);Object.defineProperty(e,"optional",{enumerable:!0,get:function(){return l.optional}});var h=n(487);Object.defineProperty(e,"unmanaged",{enumerable:!0,get:function(){return h.unmanaged}});var d=n(488);Object.defineProperty(e,"multiInject",{enumerable:!0,get:function(){return d.multiInject}});var p=n(489);Object.defineProperty(e,"targetName",{enumerable:!0,get:function(){return p.targetName}});var g=n(490);Object.defineProperty(e,"postConstruct",{enumerable:!0,get:function(){return g.postConstruct}});var v=n(235);Object.defineProperty(e,"MetadataReader",{enumerable:!0,get:function(){return v.MetadataReader}});var y=n(68);Object.defineProperty(e,"id",{enumerable:!0,get:function(){return y.id}});var m=n(61);Object.defineProperty(e,"decorate",{enumerable:!0,get:function(){return m.decorate}});var b=n(240);Object.defineProperty(e,"traverseAncerstors",{enumerable:!0,get:function(){return b.traverseAncerstors}}),Object.defineProperty(e,"taggedConstraint",{enumerable:!0,get:function(){return b.taggedConstraint}}),Object.defineProperty(e,"namedConstraint",{enumerable:!0,get:function(){return b.namedConstraint}}),Object.defineProperty(e,"typeConstraint",{enumerable:!0,get:function(){return b.typeConstraint}});var x=n(90);Object.defineProperty(e,"getServiceIdentifierAsString",{enumerable:!0,get:function(){return x.getServiceIdentifierAsString}});var w=n(491);Object.defineProperty(e,"multiBindToService",{enumerable:!0,get:function(){return w.multiBindToService}})},function(t,e){t.exports=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}},function(t,e){function n(t,e){for(var n=0;n"),Renderable:Symbol("Factory"),MeshSystem:Symbol("MeshSystem"),MeshComponentManager:Symbol("MeshComponentManager"),CullableComponentManager:Symbol("CullableComponentManager"),Geometry:Symbol("Geometry"),GeometrySystem:Symbol("GeometrySystem"),GeometryComponentManager:Symbol("GeometryComponentManager"),Material:Symbol("Material"),MaterialSystem:Symbol("MaterialSystem"),MaterialComponentManager:Symbol("MaterialComponentManager"),ForwardRenderPath:Symbol("ForwardRenderPath"),ComputeSystem:Symbol("ComputeSystem"),ComputeComponentManager:Symbol("ComputeComponentManager"),ComputeStrategy:Symbol("ComputeStrategy"),Systems:Symbol("Systems"),World:Symbol("World"),RenderEngine:Symbol("RenderEngine"),WebGPUEngine:Symbol("WebGPUEngine"),WebGLEngine:Symbol("WebGLEngine"),ShaderModuleService:Symbol("ShaderModuleService"),ConfigService:Symbol("ConfigService"),InteractorService:Symbol("InteractorService"),IEventEmitter:Symbol("IEventEmitter"),Light:Symbol("Light")}},function(t,e){function n(t,e,n,r,i,o,a){try{var s=t[o](a),u=s.value}catch(t){return void n(t)}s.done?e(u):Promise.resolve(u).then(r,i)}t.exports=function(t){return function(){var e=this,r=arguments;return new Promise((function(i,o){var a=t.apply(e,r);function s(t){n(a,i,o,s,u,"next",t)}function u(t){n(a,i,o,s,u,"throw",t)}s(void 0)}))}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r})),n.d(e,"b",(function(){return i}));var r={rect:"path",circle:"circle",line:"line",path:"path",marker:"path",text:"text",polyline:"polyline",polygon:"polygon",image:"image",ellipse:"ellipse",dom:"foreignObject"},i={opacity:"opacity",fillStyle:"fill",fill:"fill",fillOpacity:"fill-opacity",strokeStyle:"stroke",strokeOpacity:"stroke-opacity",stroke:"stroke",x:"x",y:"y",r:"r",rx:"rx",ry:"ry",width:"width",height:"height",x1:"x1",x2:"x2",y1:"y1",y2:"y2",lineCap:"stroke-linecap",lineJoin:"stroke-linejoin",lineWidth:"stroke-width",lineDash:"stroke-dasharray",lineDashOffset:"stroke-dashoffset",miterLimit:"stroke-miterlimit",font:"font",fontSize:"font-size",fontStyle:"font-style",fontVariant:"font-variant",fontWeight:"font-weight",fontFamily:"font-family",startArrow:"marker-start",endArrow:"marker-end",path:"d",class:"class",id:"id",style:"style",preserveAspectRatio:"preserveAspectRatio"}},function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"b",(function(){return o})),n.d(e,"e",(function(){return a})),n.d(e,"f",(function(){return s})),n.d(e,"l",(function(){return u})),n.d(e,"j",(function(){return c}));var r=n(0);function i(){return window?window.devicePixelRatio:1}function o(t,e,n,r){var i=t-n,o=e-r;return Math.sqrt(i*i+o*o)}function a(t,e,n,r,i,o){return i>=t&&i<=t+n&&o>=e&&o<=e+r}function s(t,e){return!(e.minX>t.maxX||e.maxXt.maxY||e.maxY=0;return n?o?2*Math.PI-r:r:o?r:2*Math.PI-r}function l(t,e,n){return n?(t[0]=e[1],t[1]=-1*e[0]):(t[0]=-1*e[1],t[1]=e[0]),t}},function(t,e,n){"use strict";n.d(e,"j",(function(){return i})),n.d(e,"c",(function(){return o})),n.d(e,"g",(function(){return a})),n.d(e,"b",(function(){return s}));var r=n(0);function i(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}n.d(e,"e",(function(){return r.s})),n.d(e,"d",(function(){return r.r})),n.d(e,"h",(function(){return r.x})),n.d(e,"f",(function(){return r.v})),n.d(e,"i",(function(){return r.A})),n.d(e,"a",(function(){return r.f})),n.d(e,"k",(function(){return r.I}));var o="undefined"!=typeof window&&void 0!==window.document;function a(t,e){if(t.isCanvas())return!0;for(var n=e.getParent(),r=!1;n;){if(n===t){r=!0;break}n=n.getParent()}return r}function s(t){return t.cfg.visible&&t.cfg.capture}},function(t,e,n){"use strict";n.d(e,"e",(function(){return m})),n.d(e,"b",(function(){return _})),n.d(e,"a",(function(){return I})),n.d(e,"c",(function(){return h})),n.d(e,"d",(function(){return L})),n.d(e,"f",(function(){return r}));var r={};function i(t){return Math.min.apply(null,t)}function o(t){return Math.max.apply(null,t)}function a(t,e,n,r){var i=t-n,o=e-r;return Math.sqrt(i*i+o*o)}function s(t,e){return Math.abs(t-e)<.001}function u(t,e){var n=i(t),r=i(e);return{x:n,y:r,width:o(t)-n,height:o(e)-r}}function c(t,e,n,r){return{minX:i([t,n]),maxX:o([t,n]),minY:i([e,r]),maxY:o([e,r])}}function f(t){return(t+2*Math.PI)%(2*Math.PI)}n.r(r),n.d(r,"distance",(function(){return a})),n.d(r,"isNumberEqual",(function(){return s})),n.d(r,"getBBoxByArray",(function(){return u})),n.d(r,"getBBoxRange",(function(){return c})),n.d(r,"piMod",(function(){return f}));var l=n(82),h={box:function(t,e,n,r){return u([t,n],[e,r])},length:function(t,e,n,r){return a(t,e,n,r)},pointAt:function(t,e,n,r,i){return{x:(1-i)*t+i*n,y:(1-i)*e+i*r}},pointDistance:function(t,e,n,r,i,o){var s=(n-t)*(i-t)+(r-e)*(o-e);return s<0?a(t,e,i,o):s>(n-t)*(n-t)+(r-e)*(r-e)?a(n,r,i,o):this.pointToLine(t,e,n,r,i,o)},pointToLine:function(t,e,n,r,i,o){var a=[n-t,r-e];if(l.exactEquals(a,[0,0]))return Math.sqrt((i-t)*(i-t)+(o-e)*(o-e));var s=[-a[1],a[0]];l.normalize(s,s);var u=[i-t,o-e];return Math.abs(l.dot(u,s))},tangentAngle:function(t,e,n,r){return Math.atan2(r-e,n-t)}};function d(t,e,n,r,i,o){var s,u=1/0,c=[n,r],f=20;o&&o>200&&(f=o/10);for(var l=1/f,h=l/10,d=0;d<=f;d++){var p=d*l,g=[i.apply(null,t.concat([p])),i.apply(null,e.concat([p]))];(b=a(c[0],c[1],g[0],g[1]))=0&&b=0?[i]:[]}function v(t,e,n,r){return 2*(1-r)*(e-t)+2*r*(n-e)}function y(t,e,n,r,i,o,a){var s=p(t,n,i,a),u=p(e,r,o,a),c=h.pointAt(t,e,n,r,a),f=h.pointAt(n,r,i,o,a);return[[t,e,c.x,c.y,s,u],[s,u,f.x,f.y,i,o]]}var m={box:function(t,e,n,r,i,o){var a=g(t,n,i)[0],s=g(e,r,o)[0],c=[t,i],f=[e,o];return void 0!==a&&c.push(p(t,n,i,a)),void 0!==s&&f.push(p(e,r,o,s)),u(c,f)},length:function(t,e,n,r,i,o){return function t(e,n,r,i,o,s,u){if(0===u)return(a(e,n,r,i)+a(r,i,o,s)+a(e,n,o,s))/2;var c=y(e,n,r,i,o,s,.5),f=c[0],l=c[1];return f.push(u-1),l.push(u-1),t.apply(null,f)+t.apply(null,l)}(t,e,n,r,i,o,3)},nearestPoint:function(t,e,n,r,i,o,a,s){return d([t,n,i],[e,r,o],a,s,p)},pointDistance:function(t,e,n,r,i,o,s,u){var c=this.nearestPoint(t,e,n,r,i,o,s,u);return a(c.x,c.y,s,u)},interpolationAt:p,pointAt:function(t,e,n,r,i,o,a){return{x:p(t,n,i,a),y:p(e,r,o,a)}},divide:function(t,e,n,r,i,o,a){return y(t,e,n,r,i,o,a)},tangentAngle:function(t,e,n,r,i,o,a){var s=v(t,n,i,a),u=v(e,r,o,a);return f(Math.atan2(u,s))}};function b(t,e,n,r,i){var o=1-i;return o*o*o*t+3*e*i*o*o+3*n*i*i*o+r*i*i*i}function x(t,e,n,r,i){var o=1-i;return 3*(o*o*(e-t)+2*o*i*(n-e)+i*i*(r-n))}function w(t,e,n,r){var i,o,a,u=-3*t+9*e-9*n+3*r,c=6*t-12*e+6*n,f=3*e-3*t,l=[];if(s(u,0))s(c,0)||(i=-f/c)>=0&&i<=1&&l.push(i);else{var h=c*c-4*u*f;s(h,0)?l.push(-c/(2*u)):h>0&&(o=(-c-(a=Math.sqrt(h)))/(2*u),(i=(-c+a)/(2*u))>=0&&i<=1&&l.push(i),o>=0&&o<=1&&l.push(o))}return l}function S(t,e,n,r,i,o,a,s,u){var c=b(t,n,i,a,u),f=b(e,r,o,s,u),l=h.pointAt(t,e,n,r,u),d=h.pointAt(n,r,i,o,u),p=h.pointAt(i,o,a,s,u),g=h.pointAt(l.x,l.y,d.x,d.y,u),v=h.pointAt(d.x,d.y,p.x,p.y,u);return[[t,e,l.x,l.y,g.x,g.y,c,f],[c,f,v.x,v.y,p.x,p.y,a,s]]}function E(t,e,n,r,i,o,s,u,c){if(0===c)return function(t,e){for(var n=0,r=t.length,i=0;i0?n:-1*n}var k=function(t,e,n,r,i,o){var a=n,s=r;if(0===a||0===s)return{x:t,y:e};for(var u,c,f=i-t,l=o-e,h=Math.abs(f),d=Math.abs(l),p=a*a,g=s*s,v=Math.PI/4,y=0;y<4;y++){u=a*Math.cos(v),c=s*Math.sin(v);var m=(p-g)*Math.pow(Math.cos(v),3)/a,b=(g-p)*Math.pow(Math.sin(v),3)/s,x=u-m,w=c-b,S=h-m,E=d-b,_=Math.hypot(w,x),k=Math.hypot(E,S);v+=_*Math.asin((x*E-w*S)/(_*k))/Math.sqrt(p+g-u*u-c*c),v=Math.min(Math.PI/2,Math.max(0,v))}return{x:t+O(u,f),y:e+O(c,l)}};function M(t,e,n,r,i,o){return n*Math.cos(i)*Math.cos(o)-r*Math.sin(i)*Math.sin(o)+t}function A(t,e,n,r,i,o){return n*Math.sin(i)*Math.cos(o)+r*Math.cos(i)*Math.sin(o)+e}function T(t,e,n){return{x:t*Math.cos(n),y:e*Math.sin(n)}}function C(t,e,n){var r=Math.cos(n),i=Math.sin(n);return[t*r-e*i,t*i+e*r]}var I={box:function(t,e,n,r,i,o,a){for(var s=function(t,e,n){return Math.atan(-e/t*Math.tan(n))}(n,r,i),u=1/0,c=-1/0,f=[o,a],l=2*-Math.PI;l<=2*Math.PI;l+=Math.PI){var h=s+l;oc&&(c=d)}var p=function(t,e,n){return Math.atan(e/(t*Math.tan(n)))}(n,r,i),g=1/0,v=-1/0,y=[o,a];for(l=2*-Math.PI;l<=2*Math.PI;l+=Math.PI){var m=p+l;ov&&(v=b)}return{x:u,y:g,width:c-u,height:v-g}},length:function(t,e,n,r,i,o,a){},nearestPoint:function(t,e,n,r,i,o,a,s,u){var c=C(s-t,u-e,-i),f=c[0],l=c[1],h=k(0,0,n,r,f,l),d=function(t,e,n,r){return(Math.atan2(r*t,n*e)+2*Math.PI)%(2*Math.PI)}(n,r,h.x,h.y);da&&(h=T(n,r,a));var p=C(h.x,h.y,i);return{x:p[0]+t,y:p[1]+e}},pointDistance:function(t,e,n,r,i,o,s,u,c){var f=this.nearestPoint(t,e,n,r,u,c);return a(f.x,f.y,u,c)},pointAt:function(t,e,n,r,i,o,a,s){var u=(a-o)*s+o;return{x:M(t,0,n,r,i,u),y:A(0,e,n,r,i,u)}},tangentAngle:function(t,e,n,r,i,o,a,s){var u=(a-o)*s+o,c=function(t,e,n,r,i,o,a,s){return-1*n*Math.cos(i)*Math.sin(s)-r*Math.sin(i)*Math.cos(s)}(0,0,n,r,i,0,0,u),l=function(t,e,n,r,i,o,a,s){return-1*n*Math.sin(i)*Math.sin(s)+r*Math.cos(i)*Math.cos(s)}(0,0,n,r,i,0,0,u);return f(Math.atan2(l,c))}};function P(t){for(var e=0,n=[],r=0;r1||e<0||t.length<2)return null;var n=P(t),r=n.segments,i=n.totalLength;if(0===i)return{x:t[0][0],y:t[0][1]};for(var o=0,a=null,s=0;s=o&&e<=o+l){var d=(e-o)/l;a=h.pointAt(c[0],c[1],f[0],f[1],d);break}o+=l}return a}function N(t,e){if(e>1||e<0||t.length<2)return 0;for(var n=P(t),r=n.segments,i=n.totalLength,o=0,a=0,s=0;s=o&&e<=o+l){a=Math.atan2(f[1]-c[1],f[0]-c[0]);break}o+=l}return a}function R(t,e,n){for(var r=1/0,i=0;ie)n.insertBefore(t,i);else if(oS?w:S,A=w>S?1:w/S,T=w>S?S/w:1;e.translate(b,x),e.rotate(O),e.scale(A,T),e.arc(0,0,M,E,_,1-k),e.scale(1/A,1/T),e.rotate(-O),e.translate(-b,-x)}break;case"Z":e.closePath()}if("Z"===p)c=f;else{var C=d.length;c=[d[C-2],d[C-1]]}}}}function v(t,e){var n=t.get("canvas");n&&("remove"===e&&(t._cacheCanvasBBox=t.get("cacheCanvasBBox")),t.get("hasChanged")||(t.set("hasChanged",!0),t.cfg.parent&&t.cfg.parent.get("hasChanged")||(n.refreshElement(t,e,n),n.get("autoDraw")&&n.draw())))}function y(t){if(!t.length)return null;var e=[],n=[],i=[],o=[];return Object(r.f)(t,(function(t){var r=function(t){var e;if(t.destroyed)e=t._cacheCanvasBBox;else{var n=t.get("cacheCanvasBBox"),r=n&&!(!n.width||!n.height),i=t.getCanvasBBox(),o=i&&!(!i.width||!i.height);r&&o?e=Object(a.l)(n,i):r?e=n:o&&(e=i)}return e}(t);r&&(e.push(r.minX),n.push(r.minY),i.push(r.maxX),o.push(r.maxY))})),{minX:Math.min.apply(null,e),minY:Math.min.apply(null,n),maxX:Math.max.apply(null,i),maxY:Math.max.apply(null,o)}}function m(t,e){return t&&e&&Object(a.f)(t,e)?{minX:Math.max(t.minX,e.minX),minY:Math.max(t.minY,e.minY),maxX:Math.min(t.maxX,e.maxX),maxY:Math.min(t.maxY,e.maxY)}:null}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.POST_CONSTRUCT=e.DESIGN_PARAM_TYPES=e.PARAM_TYPES=e.TAGGED_PROP=e.TAGGED=e.MULTI_INJECT_TAG=e.INJECT_TAG=e.OPTIONAL_TAG=e.UNMANAGED_TAG=e.NAME_TAG=e.NAMED_TAG=void 0,e.NAMED_TAG="named",e.NAME_TAG="name",e.UNMANAGED_TAG="unmanaged",e.OPTIONAL_TAG="optional",e.INJECT_TAG="inject",e.MULTI_INJECT_TAG="multi_inject",e.TAGGED="inversify:tagged",e.TAGGED_PROP="inversify:tagged_props",e.PARAM_TYPES="inversify:paramtypes",e.DESIGN_PARAM_TYPES="design:paramtypes",e.POST_CONSTRUCT="post_construct"},function(t,e,n){var r=n(323),i=n(105),o=n(147),a=o&&o.isTypedArray,s=a?i(a):r;t.exports=s},function(t,e,n){"use strict";n.d(e,"c",(function(){return h})),n.d(e,"b",(function(){return d})),n.d(e,"a",(function(){return p}));var r=n(1),i=n(57);function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var a=Math.sin,s=Math.cos,u=Math.atan2,c=Math.PI;function f(t,e,n,r,o,f,l){var h=e.stroke,d=e.lineWidth,p=u(r-f,n-o),g=new i.Path({type:"path",canvas:t.get("canvas"),isArrowShape:!0,attrs:{path:"M"+10*s(c/6)+","+10*a(c/6)+" L0,0 L"+10*s(c/6)+",-"+10*a(c/6),stroke:h,lineWidth:d}});g.translate(o,f),g.rotateAtPoint(o,f,p),t.set(l?"startArrowShape":"endArrowShape",g)}function l(t,e,n,o,c,f,l){var h=e.startArrow,d=e.endArrow,p=e.stroke,g=e.lineWidth,v=l?h:d,y=v.d,m=v.fill,b=v.stroke,x=v.lineWidth,w=Object(r.c)(v,["d","fill","stroke","lineWidth"]),S=u(o-f,n-c);y&&(c-=s(S)*y,f-=a(S)*y);var E=new i.Path({type:"path",canvas:t.get("canvas"),isArrowShape:!0,attrs:Object(r.a)(Object(r.a)({},w),{stroke:b||p,lineWidth:x||g,fill:m})});E.translate(c,f),E.rotateAtPoint(c,f,S),t.set(l?"startArrowShape":"endArrowShape",E)}function h(t,e,n,r,i){var o=u(r-e,n-t);return{dx:s(o)*i,dy:a(o)*i}}function d(t,e,n,r,i,a){"object"===o(e.startArrow)?l(t,e,n,r,i,a,!0):e.startArrow?f(t,e,n,r,i,a,!0):t.set("startArrowShape",null)}function p(t,e,n,r,i,a){"object"===o(e.endArrow)?l(t,e,n,r,i,a,!1):e.endArrow?f(t,e,n,r,i,a,!1):t.set("startArrowShape",null)}},function(t,e,n){"use strict";n.d(e,"b",(function(){return i})),n.d(e,"c",(function(){return o})),n.d(e,"a",(function(){return a}));var r=n(25);function i(t,e){var n=t.cfg.el,r=t.attr(),i={dx:r.shadowOffsetX,dy:r.shadowOffsetY,blur:r.shadowBlur,color:r.shadowColor};if(i.dx||i.dy||i.blur||i.color){var o=e.find("filter",i);o||(o=e.addShadow(i)),n.setAttribute("filter","url(#"+o+")")}else n.removeAttribute("filter")}function o(t){var e=t.attr().matrix;if(e){for(var n=t.cfg.el,r=[],i=0;i<9;i+=3)r.push(e[i]+","+e[i+1]);-1===(r=r.join(",")).indexOf("NaN")?n.setAttribute("transform","matrix("+r+")"):console.warn("invalid matrix:",e)}}function a(t,e){var n=t.getClip(),i=t.get("el");if(n){if(n&&!i.hasAttribute("clip-path")){Object(r.a)(n),n.createPath(e);var o=e.addClip(n);i.setAttribute("clip-path","url(#"+o+")")}}else i.removeAttribute("clip-path")}},function(t,e,n){"use strict";n.d(e,"a",(function(){return h})),n.d(e,"b",(function(){return d}));var r=n(9),i=n.n(r),o=n(14),a=n.n(o),s=n(7),u=n.n(s),c=n(6),f=n.n(c),l=n(119),h=function t(e){f()(this,t)},d=function(){function t(e){f()(this,t),this.clazz=void 0,this.components=[],this.entities=[],this.lookup={},this.clazz=e}var e;return u()(t,[{key:"clear",value:function(){this.components=[],this.entities=[],this.lookup={}}},{key:"contains",value:function(t){return this.lookup[t]>-1}},{key:"create",value:function(t,e){this.lookup[t]=this.components.length;var n=new this.clazz(e||{});return this.components.push(n),this.entities.push(t),n}},{key:"remove",value:function(t){var e=this.lookup[t];e>-1&&e-1){var n=this.entities[e];if(e-1?this.components[e]:null}},{key:"getCount",value:function(){return this.components.length}},{key:"getEntityByComponentIndex",value:function(t){for(var e=0,n=Object.keys(this.lookup);eMath.abs(a)*c?(s<0&&(c=-c),n=c*a/s,r=c):(a<0&&(u=-u),n=u,r=u*s/a);return{x:i+n,y:o+r}},buildLayerMatrix:function(t){var e=r.map(r.range(a(t)+1),(function(){return[]}));return r.forEach(t.nodes(),(function(n){var i=t.node(n),o=i.rank;r.isUndefined(o)||(e[o][i.order]=n)})),e},normalizeRanks:function(t){var e=r.min(r.map(t.nodes(),(function(e){return t.node(e).rank})));r.forEach(t.nodes(),(function(n){var i=t.node(n);r.has(i,"rank")&&(i.rank-=e)}))},removeEmptyRanks:function(t){var e=r.min(r.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];r.forEach(t.nodes(),(function(r){var i=t.node(r).rank-e;n[i]||(n[i]=[]),n[i].push(r)}));var i=0,o=t.graph().nodeRankFactor;r.forEach(n,(function(e,n){r.isUndefined(e)&&n%o!=0?--i:i&&r.forEach(e,(function(e){t.node(e).rank+=i}))}))},addBorderNode:function(t,e,n,r){var i={width:0,height:0};arguments.length>=4&&(i.rank=n,i.order=r);return o(t,"border",i,e)},maxRank:a,partition:function(t,e){var n={lhs:[],rhs:[]};return r.forEach(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=r.now();try{return e()}finally{console.log(t+" time: "+(r.now()-n)+"ms")}},notime:function(t,e){return e()}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s})),n.d(e,"b",(function(){return l})),n.d(e,"c",(function(){return p})),n.d(e,"d",(function(){return w}));var r=n(0),i=/[MLHVQTCSAZ]([^MLHVQTCSAZ]*)/gi,o=/[^\\s\\,]+/gi;var a=function(t){var e=t||[];return Object(r.m)(e)?e:Object(r.x)(e)?(e=e.match(i),Object(r.f)(e,(function(t,n){if((t=t.match(o))[0].length>1){var i=t[0].charAt(0);t.splice(1,0,t[0].substr(1)),t[0]=i}Object(r.f)(t,(function(e,n){isNaN(e)||(t[n]=+e)})),e[n]=t})),e):void 0};function s(t,e){for(var n=[],r=0,i=t.length;i-2*!e>r;r+=2){var o=[{x:+t[r-2],y:+t[r-1]},{x:+t[r],y:+t[r+1]},{x:+t[r+2],y:+t[r+3]},{x:+t[r+4],y:+t[r+5]}];e?r?i-4===r?o[3]={x:+t[0],y:+t[1]}:i-2===r&&(o[2]={x:+t[0],y:+t[1]},o[3]={x:+t[2],y:+t[3]}):o[0]={x:+t[i-2],y:+t[i-1]}:i-4===r?o[3]=o[2]:r||(o[0]={x:+t[r],y:+t[r+1]}),n.push(["C",(-o[0].x+6*o[1].x+o[2].x)/6,(-o[0].y+6*o[1].y+o[2].y)/6,(o[1].x+6*o[2].x-o[3].x)/6,(o[1].y+6*o[2].y-o[3].y)/6,o[2].x,o[2].y])}return n}var u="\\t\\n\\v\\f\\r Â áš€á Žâ€€â€â€‚â€ƒâ€„â€…â€†â€‡â€ˆâ€‰â€Šâ€¯âŸã€€\\u2028\\u2029",c=new RegExp("([a-z])["+u+",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?["+u+"]*,?["+u+"]*)+)","ig"),f=new RegExp("(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)["+u+"]*,?["+u+"]*","ig");function l(t){if(!t)return null;if(Object(r.m)(t))return t;var e={a:7,c:6,o:2,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,u:3,z:0},n=[];return String(t).replace(c,(function(t,r,i){var o=[],a=r.toLowerCase();if(i.replace(f,(function(t,e){e&&o.push(+e)})),"m"===a&&o.length>2&&(n.push([r].concat(o.splice(0,2))),a="l",r="m"===r?"l":"L"),"o"===a&&1===o.length&&n.push([r,o[0]]),"r"===a)n.push([r].concat(o));else for(;o.length>=e[a]&&(n.push([r].concat(o.splice(0,e[a]))),e[a]););return""})),n}var h=/[a-z]/;function d(t,e){return[e[0]+(e[0]-t[0]),e[1]+(e[1]-t[1])]}function p(t){var e=l(t);if(!e||!e.length)return[["M",0,0]];for(var n=!1,r=0;r=0){n=!0;break}}if(!n)return e;var o=[],a=0,s=0,u=0,c=0,f=0,p=e[0];"M"!==p[0]&&"m"!==p[0]||(u=a=+p[1],c=s=+p[2],f++,o[0]=["M",a,s]);r=f;for(var g=e.length;r1&&(n*=Math.sqrt(p),i*=Math.sqrt(p));var g=n*n*(d*d)+i*i*(h*h),b=g?Math.sqrt((n*n*(i*i)-g)/g):1;a===s&&(b*=-1),isNaN(b)&&(b=0);var x=i?b*n*d/i:0,w=n?b*-i*h/n:0,S=(u+f)/2+Math.cos(o)*x-Math.sin(o)*w,E=(c+l)/2+Math.sin(o)*x+Math.cos(o)*w,_=[(h-x)/n,(d-w)/i],O=[(-1*h-x)/n,(-1*d-w)/i],k=y([1,0],_),M=y(_,O);return v(_,O)<=-1&&(M=Math.PI),v(_,O)>=1&&(M=0),0===s&&M>0&&(M-=2*Math.PI),1===s&&M<0&&(M+=2*Math.PI),{cx:S,cy:E,rx:m(t,[f,l])?0:n,ry:m(t,[f,l])?0:i,startAngle:k,endAngle:k+M,xRotation:o,arcFlag:a,sweepFlag:s}}function x(t,e){return[e[0]+(e[0]-t[0]),e[1]+(e[1]-t[1])]}function w(t){for(var e=[],n=null,r=null,i=null,o=0,s=(t=a(t)).length,u=0;u0&&(o=1/Math.sqrt(o)),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o,t}function M(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function A(t,e,n){var r=e[0],i=e[1],o=e[2],a=n[0],s=n[1],u=n[2];return t[0]=i*u-o*s,t[1]=o*a-r*u,t[2]=r*s-i*a,t}function T(t,e,n,r){var i=e[0],o=e[1],a=e[2];return t[0]=i+r*(n[0]-i),t[1]=o+r*(n[1]-o),t[2]=a+r*(n[2]-a),t}function C(t,e,n,r,i,o){var a=o*o,s=a*(2*o-3)+1,u=a*(o-2)+o,c=a*(o-1),f=a*(3-2*o);return t[0]=e[0]*s+n[0]*u+r[0]*c+i[0]*f,t[1]=e[1]*s+n[1]*u+r[1]*c+i[1]*f,t[2]=e[2]*s+n[2]*u+r[2]*c+i[2]*f,t}function I(t,e,n,r,i,o){var a=1-o,s=a*a,u=o*o,c=s*a,f=3*o*s,l=3*u*a,h=u*o;return t[0]=e[0]*c+n[0]*f+r[0]*l+i[0]*h,t[1]=e[1]*c+n[1]*f+r[1]*l+i[1]*h,t[2]=e[2]*c+n[2]*f+r[2]*l+i[2]*h,t}function P(t,e){e=e||1;var n=2*r.c()*Math.PI,i=2*r.c()-1,o=Math.sqrt(1-i*i)*e;return t[0]=Math.cos(n)*o,t[1]=Math.sin(n)*o,t[2]=i*e,t}function j(t,e,n){var r=e[0],i=e[1],o=e[2],a=n[3]*r+n[7]*i+n[11]*o+n[15];return a=a||1,t[0]=(n[0]*r+n[4]*i+n[8]*o+n[12])/a,t[1]=(n[1]*r+n[5]*i+n[9]*o+n[13])/a,t[2]=(n[2]*r+n[6]*i+n[10]*o+n[14])/a,t}function D(t,e,n){var r=e[0],i=e[1],o=e[2];return t[0]=r*n[0]+i*n[3]+o*n[6],t[1]=r*n[1]+i*n[4]+o*n[7],t[2]=r*n[2]+i*n[5]+o*n[8],t}function N(t,e,n){var r=n[0],i=n[1],o=n[2],a=n[3],s=e[0],u=e[1],c=e[2],f=i*c-o*u,l=o*s-r*c,h=r*u-i*s,d=i*h-o*l,p=o*f-r*h,g=r*l-i*f,v=2*a;return f*=v,l*=v,h*=v,d*=2,p*=2,g*=2,t[0]=s+f+d,t[1]=u+l+p,t[2]=c+h+g,t}function R(t,e,n,r){var i=[],o=[];return i[0]=e[0]-n[0],i[1]=e[1]-n[1],i[2]=e[2]-n[2],o[0]=i[0],o[1]=i[1]*Math.cos(r)-i[2]*Math.sin(r),o[2]=i[1]*Math.sin(r)+i[2]*Math.cos(r),t[0]=o[0]+n[0],t[1]=o[1]+n[1],t[2]=o[2]+n[2],t}function L(t,e,n,r){var i=[],o=[];return i[0]=e[0]-n[0],i[1]=e[1]-n[1],i[2]=e[2]-n[2],o[0]=i[2]*Math.sin(r)+i[0]*Math.cos(r),o[1]=i[1],o[2]=i[2]*Math.cos(r)-i[0]*Math.sin(r),t[0]=o[0]+n[0],t[1]=o[1]+n[1],t[2]=o[2]+n[2],t}function B(t,e,n,r){var i=[],o=[];return i[0]=e[0]-n[0],i[1]=e[1]-n[1],i[2]=e[2]-n[2],o[0]=i[0]*Math.cos(r)-i[1]*Math.sin(r),o[1]=i[0]*Math.sin(r)+i[1]*Math.cos(r),o[2]=i[2],t[0]=o[0]+n[0],t[1]=o[1]+n[1],t[2]=o[2]+n[2],t}function G(t,e){var n=t[0],r=t[1],i=t[2],o=e[0],a=e[1],s=e[2],u=Math.sqrt(n*n+r*r+i*i)*Math.sqrt(o*o+a*a+s*s),c=u&&M(t,e)/u;return Math.acos(Math.min(Math.max(c,-1),1))}function F(t){return t[0]=0,t[1]=0,t[2]=0,t}function U(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"}function z(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]}function V(t,e){var n=t[0],i=t[1],o=t[2],a=e[0],s=e[1],u=e[2];return Math.abs(n-a)<=r.b*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(i-s)<=r.b*Math.max(1,Math.abs(i),Math.abs(s))&&Math.abs(o-u)<=r.b*Math.max(1,Math.abs(o),Math.abs(u))}var W,X=l,Y=h,H=d,q=w,K=S,Z=a,Q=E,J=(W=i(),function(t,e,n,r,i,o){var a,s;for(e||(e=3),n||(n=0),s=r?Math.min(r*e+n,t.length):t.length,a=n;a= than the number of constructor arguments of its base class."},e.CONTAINER_OPTIONS_MUST_BE_AN_OBJECT="Invalid Container constructor argument. Container options must be an object.",e.CONTAINER_OPTIONS_INVALID_DEFAULT_SCOPE="Invalid Container option. Default scope must be a string (\'singleton\' or \'transient\').",e.CONTAINER_OPTIONS_INVALID_AUTO_BIND_INJECTABLE="Invalid Container option. Auto bind injectable must be a boolean",e.CONTAINER_OPTIONS_INVALID_SKIP_BASE_CHECK="Invalid Container option. Skip base check must be a boolean",e.MULTIPLE_POST_CONSTRUCT_METHODS="Cannot apply @postConstruct decorator multiple times in the same class",e.POST_CONSTRUCT_ERROR=function(){for(var t=[],e=0;e=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,o=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw o}}}}function W(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);nt.length)&&(e=t.length);for(var n=0,r=new Array(e);nl[e.id]+s?(l[a]=l[e.id]+s,h[a]=[e.id]):l[a]===l[e.id]+s&&h[a].push(e.id)}))},g=0;gi[a][u]+i[u][s]&&(i[a][s]=i[a][u]+i[u][s]);return i},S=function(t,e,n,r){for(var i=e.length,o=2*r,a=0,s=0;s0&&(this.list[0]=e,this.moveDown(0)),t},t.prototype.insert=function(t){if(null!==t){this.list.push(t);var e=this.list.length-1;return this.moveUp(e),!0}return!1},t.prototype.moveUp=function(t){for(var e=this.getParent(t);t&&t>0&&this.compareFn(this.list[e],this.list[t])>0;){var n=this.list[e];this.list[e]=this.list[t],this.list[t]=n,t=e,e=this.getParent(t)}},t.prototype.moveDown=function(t){var e,n=t,r=this.getLeft(t),i=this.getRight(t),o=this.list.length;null!==r&&r0?n=r:null!==i&&i0&&(n=i),t!==n&&(e=[this.list[n],this.list[t]],this.list[t]=e[0],this.list[n]=e[1],this.moveDown(n))},t}(),k=function(t,e){var n=[],r=t.nodes,i=void 0===r?[]:r,o=t.edges,a=void 0===o?[]:o;if(0===i.length)return n;var s=i[0],u=new Set;u.add(s);var c=new O((function(t,n){return e?t.weight-n.weight:0}));for(f(s.id,a).forEach((function(t){c.insert(t)}));!c.isEmpty();){var l=c.delMin(),h=l.source,d=l.target;u.has(h)&&u.has(d)||(n.push(l),u.has(h)||(u.add(h),f(h,a).forEach((function(t){c.insert(t)}))),u.has(d)||(u.add(d),f(d,a).forEach((function(t){c.insert(t)}))))}return n},M=function(t,e){var n=[],r=t.nodes,i=void 0===r?[]:r,o=t.edges,a=void 0===o?[]:o;if(0===i.length)return n;var s=a.map((function(t){return t}));e&&s.sort((function(t,e){return t.weight-e.weight}));for(var u=new E(i.map((function(t){return t.id})));s.length>0;){var c=s.shift(),f=c.source,l=c.target;u.connected(f,l)||(n.push(c),u.union(f,l))}return n},A="-1",T=function(t,e,n,r){void 0===t&&(t=-1),void 0===e&&(e=-1),void 0===n&&(n=-1),void 0===r&&(r="-1"),this.id=t,this.from=e,this.to=n,this.label=r},C=function(){function t(t,e){void 0===t&&(t=-1),void 0===e&&(e=A),this.id=t,this.label=e,this.edges=[],this.edgeMap={}}return t.prototype.addEdge=function(t){this.edges.push(t),this.edgeMap[t.id]=t},t}(),I=function(){function t(t,e,n){void 0===t&&(t=-1),void 0===e&&(e=!0),void 0===n&&(n=!1),this.id=t,this.edgeIdAutoIncrease=e,this.edges=[],this.nodes=[],this.nodeMap={},this.edgeMap={},this.nodeLabelMap={},this.edgeLabelMap={},this.counter=0,this.directed=n}return t.prototype.getNodeNum=function(){return this.nodes.length},t.prototype.addNode=function(t,e){if(!this.nodeMap[t]){var n=new C(t,e);this.nodes.push(n),this.nodeMap[t]=n,this.nodeLabelMap[e]||(this.nodeLabelMap[e]=[]),this.nodeLabelMap[e].push(t)}},t.prototype.addEdge=function(t,e,n,r){if((this.edgeIdAutoIncrease||void 0===t)&&(t=this.counter++),!(this.nodeMap[e]&&this.nodeMap[n]&&this.nodeMap[n].edgeMap[t])){var i=new T(t,e,n,r);if(this.edges.push(i),this.edgeMap[t]=i,this.nodeMap[e].addEdge(i),this.edgeLabelMap[r]||(this.edgeLabelMap[r]=[]),this.edgeLabelMap[r].push(i),!this.directed){var o=new T(t,n,e,r);this.nodeMap[n].addEdge(o),this.edgeLabelMap[r].push(o)}}},t}(),P=function(){function t(t,e,n,r,i){this.fromNode=t,this.toNode=e,this.nodeEdgeNodeLabel={nodeLabel1:n||A,edgeLabel:r||"-1",nodeLabel2:i||A}}return t.prototype.equalTo=function(t){return this.fromNode===t.formNode&&this.toNode===t.toNode&&this.nodeEdgeNodeLabel===t.nodeEdgeNodeLabel},t.prototype.notEqualTo=function(t){return!this.equalTo(t)},t}(),j=function(){function t(){this.rmpath=[],this.dfsEdgeList=[]}return t.prototype.equalTo=function(t){var e=this.dfsEdgeList.length;if(e!==t.length)return!1;for(var n=0;n=0;e--){var n=this.dfsEdgeList[e],r=n.fromNode,i=n.toNode;rl||r.hasNode(o[f.to])||(e.labelp&&"break"!==g(v);v--);if(h){var y=t.findMinLabel(l);o.dfsEdgeList.push(new P(f,d,A,y.edgeLabel,A));var m=o.dfsEdgeList.length-1;return t.dfsCode.dfsEdgeList[m]===o.dfsEdgeList[m]&&a(l[y.edgeLabel].projected)}var b={};h=!1;var x=0;s.forEach((function(e){var n=new D(e),o=t.findForwardPureEdges(r,n.edges[u[0]],c,n);o.length>0&&(h=!0,x=f,o.forEach((function(t){var n=t.label+"-"+i[t.to].label;b[n]||(b[n]={projected:[],edgeLabel:t.label,nodeLabel2:i[t.to].label}),b[n].projected.push({graphId:r.id,edge:t,preNode:e})})))}));var w=u.length,S=function(e){if(h)return"break";var n=u[e];s.forEach((function(e){var a=new D(e),s=t.findForwardRmpathEdges(r,a.edges[n],c,a);s.length>0&&(h=!0,x=o.dfsEdgeList[n].fromNode,s.forEach((function(t){var n=t.label+"-"+i[t.to].label;b[n]||(b[n]={projected:[],edgeLabel:t.label,nodeLabel2:i[t.to].label}),b[n].projected.push({graphId:r.id,edge:t,preNode:e})})))}))};for(v=0;v=0;l--){var h=e.findBackwardEdge(u,f.edges[r[l]],f.edges[r[0]],f);if(h){var d=e.dfsCode.dfsEdgeList[r[l]].fromNode+"-"+h.label;s[d]||(s[d]={projected:[],toNodeId:e.dfsCode.dfsEdgeList[r[l]].fromNode,edgeLabel:h.label}),s[d].projected.push({graphId:t.graphId,edge:h,preNode:t})}}if(!(n>=e.maxNodeNum)){e.findForwardPureEdges(u,f.edges[r[0]],o,f).forEach((function(e){var n=i+"-"+e.label+"-"+c[e.to].label;a[n]||(a[n]={projected:[],fromNodeId:i,edgeLabel:e.label,nodeLabel2:c[e.to].label}),a[n].projected.push({graphId:t.graphId,edge:e,preNode:t})}));var p=function(n){e.findForwardRmpathEdges(u,f.edges[r[n]],o,f).forEach((function(i){var o=e.dfsCode.dfsEdgeList[r[n]].fromNode+"-"+i.label+"-"+c[i.to].label;a[o]||(a[o]={projected:[],fromNodeId:e.dfsCode.dfsEdgeList[r[n]].fromNode,edgeLabel:i.label,nodeLabel2:c[i.to].label}),a[o].projected.push({graphId:t.graphId,edge:i,preNode:t})}))};for(l=0;li){var a=i;i=r,r=a}var f=t.label,l=n+"-"+r+"-"+f+"-"+i,h=r+"-"+f+"-"+i;if(!o[h]){var d=o[h]||0;d++,o[h]=d}s[l]={graphId:n,nodeLabel1:r,edgeLabel:f,nodeLabel2:i}}))}))})),Object.keys(i).forEach((function(t){if(!(i[t]=this.maxStep},t.prototype.peek=function(){return this.isEmpty()?null:this.linkedList.head.value},t.prototype.push=function(t){this.linkedList.prepend(t),this.length>this.maxStep&&this.linkedList.deleteTail()},t.prototype.pop=function(){var t=this.linkedList.deleteHead();return t?t.value:null},t.prototype.toArray=function(){return this.linkedList.toArray().map((function(t){return t.value}))},t.prototype.clear=function(){for(;!this.isEmpty();)this.pop()},t}(),X="SUCCESS",Y=function(t){return function(){for(var e=[],r=0;r-1})),h=function(i){var o=r[i];if(s[o]||0===s[o])a[o]&&(u[e.id]=Math.min(u[e.id],s[o]));else{var c=n.filter((function(t){return t.id===o}));c.length>0&&t(c[0]),u[e.id]=Math.min(u[e.id],u[o])}},d=0;d0;){var g=o.pop();if(a[g.id]=!1,p.push(g),g===e)break}p.length>0&&f.push(p)}},d=0,p=n;d0&&t(o[0])}},u=0;u0;)h.push(s.pop());o.push(h)}}return o}(t)},getDegree:d,getInDegree:function(t,e){return h(t)[e]?h(t)[e].inDegree:0},getOutDegree:function(t,e){return h(t)[e]?h(t)[e].outDegree:0},detectCycle:function(t){var e=null,n=t.nodes,r={},i={},o={},a={};(void 0===n?[]:n).forEach((function(t){i[t.id]=t}));for(var s={enter:function(t){var n=t.current,a=t.previous;if(o[n]){e={};for(var s=n,u=a;u!==n;)e[s]=u,s=u,u=r[u];e[s]=u}else o[n]=n,delete i[n],r[n]=a},leave:function(t){var e=t.current;a[e]=e,delete o[e]},allowTraversal:function(t){var n=t.next;return!e&&!a[n]}};Object.keys(i).length;)p(t,Object.keys(i)[0],s);return e},depthFirstSearch:p,dijkstra:b,findAllPath:function(t,e,n,r){var i;if(e===n)return[[e]];var o=t.edges,a=void 0===o?[]:o,s=[e],u=((i={})[e]=!0,i),f=[],l=[],h=r?c(e,a,"target"):c(e,a);for(f.push(h);s.length>0&&f.length>0;){var d=f[f.length-1];if(d.length){var p=d.shift();if(p&&(s.push(p),u[p]=!0,h=r?c(p,a,"target"):c(p,a),f.push(h.filter((function(t){return!u[t]})))),s[s.length-1]===n){var g=s.map((function(t){return t}));l.push(g),v=s.pop(),u[v]=!1,f.pop()}}else{var v=s.pop();u[v]=!1,f.pop()}}return l},findShortestPath:function(t,e,n,r,i){var o=b(t,e,r,i),a=o.length,s=o.path,u=o.allPaths;return{length:a[n],path:s[n],allPath:u[n]}},floydWarshall:w,labelPropagation:function(t,e,n,i){void 0===e&&(e=!1),void 0===n&&(n="weight"),void 0===i&&(i=1e3);var o=t.nodes,a=void 0===o?[]:o,s=t.edges,u=void 0===s?[]:s,c={},f={};a.forEach((function(t,e){var n=l();t.clusterId=n,c[n]={id:n,nodes:[t]},f[t.id]={node:t,idx:e}}));var h=r(t,e),d=[],p={};h.forEach((function(t,e){var n=0,r=a[e].id;p[r]={},t.forEach((function(t,e){if(t){n+=t;var i=a[e].id;p[r][i]=t}})),d.push(n)}));for(var g=0,v=function(){var t=!1;if(a.forEach((function(e){var n={};Object.keys(p[e.id]).forEach((function(t){var r=p[e.id][t],i=f[t].node.clusterId;n[i]||(n[i]=0),n[i]+=r}));var r=-1/0,i=[];if(Object.keys(n).forEach((function(t){r=0&&i.splice(o,1),i&&i.length){t=!0;var a=c[e.clusterId],s=a.nodes.indexOf(e);a.nodes.splice(s,1);var u=Math.floor(Math.random()*i.length),l=c[i[u]];l.nodes.push(e),e.clusterId=l.id}}})),!t)return"break";g++};g100);)y=v,m++,Object.keys(c).forEach((function(t){var e=0;u.forEach((function(r){var i=r.source,o=r.target,a=f[i].node.clusterId,s=f[o].node.clusterId;(a===t&&s!==t||s===t&&a!==t)&&(e+=r[n]||1)})),c[t].sumTot=e})),a.forEach((function(t,e){var r,i=c[t.clusterId],o=0,a=d[e]/(2*g),s=0;i.nodes.forEach((function(t){var n=f[t.id].idx;s+=h[e][n]||0}));var l=s-i.sumTot*a,v=p[t.id];if(Object.keys(v).forEach((function(n){var i=f[n].node.clusterId;if(i!==t.clusterId){var s=c[i],u=s.nodes;if(u&&u.length){var d=0;u.forEach((function(t){var n=f[t.id].idx;d+=h[e][n]||0}));var p=d-s.sumTot*a-l;p>o&&(o=p,r=s)}}})),o>0){r.nodes.push(t);var y=t.clusterId;t.clusterId=r.id;var m=i.nodes.indexOf(t);i.nodes.splice(m,1);var b=0,x=0;u.forEach((function(t){var e=t.source,i=t.target,o=f[e].node.clusterId,a=f[i].node.clusterId;(o===r.id&&a!==r.id||a===r.id&&o!==r.id)&&(b+=t[n]||1),(o===y&&a!==y||a===y&&o!==y)&&(x+=t[n]||1)})),r.sumTot=b,i.sumTot=x}}));Object.keys(c).forEach((function(t){var e=c[t];e.nodes&&e.nodes.length||delete c[t]}));var b=[],x={};u.forEach((function(t){var e=t.source,r=t.target,i=t[n]||1,o=f[e].node.clusterId,a=f[r].node.clusterId,s=o+"---"+a;if(x[s])x[s].weight+=i,x[s].count++;else{var u={source:o,target:a,weight:i,count:1};x[s]=u,b.push(u)}}));var w=[];return Object.keys(c).forEach((function(t){w.push(c[t])})),{clusters:w,clusterEdges:b}},minimumSpanningTree:function(t,e,n){return n?{prim:k,kruskal:M}[n](t,e):M(t,e)},pageRank:function(t,e,n){"number"!=typeof e&&(e=1e-6),"number"!=typeof n&&(n=.85);for(var r,i=1,o=0,a=1e3,s=t.nodes,u=void 0===s?[]:s,f=t.edges,l=void 0===f?[]:f,h=u.length,p={},g={},v=0;v0&&i>e;){for(o=0,v=0;v0&&(r+=g[w]/S)}p[m]=n*r,o+=p[m]}}for(o=(1-o)/h,i=0,v=0;v2*e)););if(d<2*e&&(a[r+"-"+h]={start:r,end:h,distance:i[r][h]},u++,++s>=n))return a;if(++c>2*e)break}uZ[n][h]){f=!0;break}if(f)return X.splice(e,1),"continue";var d={};i.neighbors.forEach((function(t){var e=l[r.id+"-"+t.id];d[r.id+"-"+t.id]={start:p[r.id].idx,end:p[t.id].idx,distance:e}})),k=G(d,E,t,k);var g=[];Object.keys(d).forEach((function(t){if(j[t])g.push(j[t]);else{var e=k[t];j[t]=F(e,P,o,a),g.push(j[t])}})),g=g.sort((function(t,e){return e-t}));var v=!1;for(h=0;h=0;d--)f(d)}));var Q=[];X.forEach((function(n){for(var r=p[n.id].idx,s=B(t.nodes,c[r],r,o,i).neighbors,f=s.length,h=!1,d=function(r){if(s.length+1Z[u][Z[u].length-1])return s.splice(r,1),"continue";var d=j[c]?j[c]:function(t,e,n,r,i,o,a,s,u,c,f){var l,h=e.id+"-"+n.id;if(c&&c[h])return c[h];var d=f?f[h]:void 0;if(!d){var p=((l={})[h]={start:r[e.id].idx,end:r[n.id].idx,distance:i},l);d=(f=G(p,o,t,f))[h]}return F(d,a,s,u)}(t,n,i,p,f,E,P,o,a,j,k),g=D.id+"-"+u;if(de&&(v=e)})),Y[u]=v),p[i.id].degree=0;g--){var v=d(g);if("object"==u(v))return v.value}h||Q.push({nodes:[n].concat(s)})}));var J=b(e,D.id,!1).length,$={};n?(Object.keys(J).forEach((function(t){var e=m[t].node[o];$[e]?$[e].push(J[t]):$[e]=[J[t]]})),Object.keys($).forEach((function(t){$[t].sort((function(t,e){return t-e}))}))):$=Z;for(var tt=function(r){var i=Q[r],s=i.nodes[0],u={},c={};i.nodes.forEach((function(t,e){c[t.id]={idx:e,node:t,degree:0};var n=t[o];u[n]?u[n]++:u[n]=1}));var f=[],l={};t.edges.forEach((function(t){c[t.source]&&c[t.target]&&(f.push(t),l[t[a]]?l[t[a]]++:l[t[a]]=1,c[t.source].degree++,c[t.target].degree++)}));for(var h=Object.keys(S).length,d=!1,g=0;g=0&&"break"!==E(g);g--);if(w)return Q.splice(r,1),"continue";i.edges=f;var _=b(i,i.nodes[0].id,!1).length;if(Object.keys(_).reverse().forEach((function(t){if(t!==i.nodes[0].id&&!w){if(_[t]===1/0){var e=c[t].node[o];if(u[e]--,u[e]$[r][$[r].length-1]){if(e=c[t].node[o],u[e]--,u[e]=0;M--){var A=i.nodes[M],T=c[A.id].degree,C=A[o];if(T=0;I--){var P=f[I];if(!c[P.source]||!c[P.target]){f.splice(I,1);var j=P[a];if(l[j]--,c[P.source]&&c[P.source].degree--,c[P.target]&&c[P.target].degree--,S[j]&&l[j]=0&&"break"!==tt(et);et--);var nt=Q.length,rt=function(t){var e=Q[t],n={};e.edges.forEach((function(t){var e=t.source+"-"+t.target+"-"+t.label;n[e]?n[e]++:n[e]=1}));for(var r=function(t){var e=Q[t],r={};e.edges.forEach((function(t){var e=t.source+"-"+t.target+"-"+t.label;r[e]?r[e]++:r[e]=1}));var i=!0;Object.keys(r).length!==Object.keys(n).length?i=!1:Object.keys(n).forEach((function(t){r[t]!==n[t]&&(i=!1)})),i&&Q.splice(t,1)},i=nt-1;i>t;i--)r(i);nt=Q.length};for(et=0;et<=nt-1;et++)rt(et);return Q}}},getAdjMatrixAsync:function(t,e){return Y("getAdjMatrix").apply(void 0,[t,e])},connectedComponentAsync:function(t,e){return Y("connectedComponent").apply(void 0,[t,e])},getDegreeAsync:function(t){return Y("getDegree")(t)},getInDegreeAsync:function(t,e){return Y("getInDegree")(t,e)},getOutDegreeAsync:function(t,e){return Y("getOutDegree")(t,e)},detectCycleAsync:function(t){return Y("detectCycle")(t)},dijkstraAsync:function(t,e,n,r){return Y("dijkstra").apply(void 0,[t,e,n,r])},findAllPathAsync:function(t,e,n,r){return Y("findAllPath").apply(void 0,[t,e,n,r])},findShortestPathAsync:function(t,e,n,r,i){return Y("findShortestPath").apply(void 0,[t,e,n,r,i])},floydWarshallAsync:function(t,e){return Y("floydWarshall").apply(void 0,[t,e])},labelPropagationAsync:function(t,e,n,r){return Y("labelPropagation")(t,e,n,r)},louvainAsync:function(t,e,n,r){return Y("louvain")(t,e,n,r)},minimumSpanningTreeAsync:function(t,e,n){return Y("minimumSpanningTree").apply(void 0,[t,e,n])},pageRankAsync:function(t,e,n){return Y("pageRank").apply(void 0,[t,e,n])},getNeighborsAsync:function(t,e,n){return Y("getNeighbors").apply(void 0,[t,e,n])},GADDIAsync:function(t,e,n,r,i,o,a){return void 0===n&&(n=!1),void 0===o&&(o="cluster"),void 0===a&&(a="cluster"),Y("GADDI").apply(void 0,[t,e,n,r,i,o,a])}}}},i={};function o(t){if(i[t])return i[t].exports;var e=i[t]={exports:{}};return r[t](e,e.exports,o),e.exports}return o.m=r,o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,{a:e}),e},o.d=function(t,e){for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.f={},o.e=function(t){return Promise.all(Object.keys(o.f).reduce((function(e,n){return o.f[n](t,e),e}),[]))},o.u=function(t){return t+".min.js"},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e={},n="Algorithm:",o.l=function(t,r,i,a){if(e[t])e[t].push(r);else{var s,u;if(void 0!==i)for(var c=document.getElementsByTagName("script"),f=0;f2&&(n.push([i].concat(s.splice(0,2))),u="l",i="m"===i?"l":"L"),"o"===u&&1===s.length&&n.push([i,s[0]]),"r"===u)n.push([i].concat(s));else for(;s.length>=e[u]&&(n.push([i].concat(s.splice(0,e[u]))),e[u]););return t})),n},u=function(t,e){for(var n=[],r=0,i=t.length;i-2*!e>r;r+=2){var o=[{x:+t[r-2],y:+t[r-1]},{x:+t[r],y:+t[r+1]},{x:+t[r+2],y:+t[r+3]},{x:+t[r+4],y:+t[r+5]}];e?r?i-4===r?o[3]={x:+t[0],y:+t[1]}:i-2===r&&(o[2]={x:+t[0],y:+t[1]},o[3]={x:+t[2],y:+t[3]}):o[0]={x:+t[i-2],y:+t[i-1]}:i-4===r?o[3]=o[2]:r||(o[0]={x:+t[r],y:+t[r+1]}),n.push(["C",(-o[0].x+6*o[1].x+o[2].x)/6,(-o[0].y+6*o[1].y+o[2].y)/6,(o[1].x+6*o[2].x-o[3].x)/6,(o[1].y+6*o[2].y-o[3].y)/6,o[2].x,o[2].y])}return n},c=function(t,e,n,r,i){var o=[];if(null===i&&null===r&&(r=n),t=+t,e=+e,n=+n,r=+r,null!==i){var a=Math.PI/180,s=t+n*Math.cos(-r*a),u=t+n*Math.cos(-i*a);o=[["M",s,e+n*Math.sin(-r*a)],["A",n,n,0,+(i-r>180),0,u,e+n*Math.sin(-i*a)]]}else o=[["M",t,e],["m",0,-r],["a",n,r,0,1,1,0,2*r],["a",n,r,0,1,1,0,-2*r],["z"]];return o},f=function(t){if(!(t=s(t))||!t.length)return[["M",0,0]];var e,n,r=[],i=0,o=0,a=0,f=0,l=0;"M"===t[0][0]&&(a=i=+t[0][1],f=o=+t[0][2],l++,r[0]=["M",i,o]);for(var h=3===t.length&&"M"===t[0][0]&&"R"===t[1][0].toUpperCase()&&"Z"===t[2][0].toUpperCase(),d=void 0,p=void 0,g=l,v=t.length;g1&&(r*=S=Math.sqrt(S),i*=S);var E=r*r,_=i*i,O=(a===s?-1:1)*Math.sqrt(Math.abs((E*_-E*w*w-_*x*x)/(E*w*w+_*x*x)));p=O*r*w/i+(e+u)/2,g=O*-i*x/r+(n+c)/2,h=Math.asin(((n-g)/i).toFixed(9)),d=Math.asin(((c-g)/i).toFixed(9)),h=ed&&(h-=2*Math.PI),!s&&d>h&&(d-=2*Math.PI)}var k=d-h;if(Math.abs(k)>v){var M=d,A=u,T=c;d=h+v*(s&&d>h?1:-1),m=t(u=p+r*Math.cos(d),c=g+i*Math.sin(d),r,i,o,0,s,A,T,[d,M,p,g])}k=d-h;var C=Math.cos(h),I=Math.sin(h),P=Math.cos(d),j=Math.sin(d),D=Math.tan(k/4),N=4/3*r*D,R=4/3*i*D,L=[e,n],B=[e+N*I,n-R*C],G=[u+N*j,c-R*P],F=[u,c];if(B[0]=2*L[0]-B[0],B[1]=2*L[1]-B[1],f)return[B,G,F].concat(m);for(var U=[],z=0,V=(m=[B,G,F].concat(m).join().split(",")).length;z7){t[e].shift();for(var o=t[e];o.length;)s[e]="A",i&&(u[e]="A"),t.splice(e++,0,["C"].concat(o.splice(0,6)));t.splice(e,1),n=Math.max(r.length,i&&i.length||0)}},y=function(t,e,o,a,s){t&&e&&"M"===t[s][0]&&"M"!==e[s][0]&&(e.splice(s,0,["M",a.x,a.y]),o.bx=0,o.by=0,o.x=t[s][1],o.y=t[s][2],n=Math.max(r.length,i&&i.length||0))};n=Math.max(r.length,i&&i.length||0);for(var m=0;m1?1:u<0?0:u)/2,f=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],l=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],h=0,d=0;d<12;d++){var p=c*f[d]+c,g=y(p,t,n,i,a),v=y(p,e,r,o,s),m=g*g+v*v;h+=l[d]*Math.sqrt(m)}return c*h},b=function(t,e,n,r,i,o,a,s){for(var u,c,f,l,h=[],d=[[],[]],p=0;p<2;++p)if(0===p?(c=6*t-12*n+6*i,u=-3*t+9*n-9*i+3*a,f=3*n-3*t):(c=6*e-12*r+6*o,u=-3*e+9*r-9*o+3*s,f=3*r-3*e),Math.abs(u)<1e-12){if(Math.abs(c)<1e-12)continue;(l=-f/c)>0&&l<1&&h.push(l)}else{var g=c*c-4*f*u,v=Math.sqrt(g);if(!(g<0)){var y=(-c+v)/(2*u);y>0&&y<1&&h.push(y);var m=(-c-v)/(2*u);m>0&&m<1&&h.push(m)}}for(var b,x=h.length,w=x;x--;)b=1-(l=h[x]),d[0][x]=b*b*b*t+3*b*b*l*n+3*b*l*l*i+l*l*l*a,d[1][x]=b*b*b*e+3*b*b*l*r+3*b*l*l*o+l*l*l*s;return d[0][w]=t,d[1][w]=e,d[0][w+1]=a,d[1][w+1]=s,d[0].length=d[1].length=w+2,{min:{x:Math.min.apply(0,d[0]),y:Math.min.apply(0,d[1])},max:{x:Math.max.apply(0,d[0]),y:Math.max.apply(0,d[1])}}},x=function(t,e,n,r,i,o,a,s){if(!(Math.max(t,n)Math.max(i,a)||Math.max(e,r)Math.max(o,s))){var u=(t-n)*(o-s)-(e-r)*(i-a);if(u){var c=((t*r-e*n)*(i-a)-(t-n)*(i*s-o*a))/u,f=((t*r-e*n)*(o-s)-(e-r)*(i*s-o*a))/u,l=+c.toFixed(2),h=+f.toFixed(2);if(!(l<+Math.min(t,n).toFixed(2)||l>+Math.max(t,n).toFixed(2)||l<+Math.min(i,a).toFixed(2)||l>+Math.max(i,a).toFixed(2)||h<+Math.min(e,r).toFixed(2)||h>+Math.max(e,r).toFixed(2)||h<+Math.min(o,s).toFixed(2)||h>+Math.max(o,s).toFixed(2)))return{x:c,y:f}}}},w=function(t,e,n){return e>=t.x&&e<=t.x+t.width&&n>=t.y&&n<=t.y+t.height},S=function(t,e,n,r,i){if(i)return[["M",+t+ +i,e],["l",n-2*i,0],["a",i,i,0,0,1,i,i],["l",0,r-2*i],["a",i,i,0,0,1,-i,i],["l",2*i-n,0],["a",i,i,0,0,1,-i,-i],["l",0,2*i-r],["a",i,i,0,0,1,i,-i],["z"]];var o=[["M",t,e],["l",n,0],["l",0,r],["l",-n,0],["z"]];return o.parsePathArray=v,o},E=function(t,e,n,r){return null===t&&(t=e=n=r=0),null===e&&(e=t.y,n=t.width,r=t.height,t=t.x),{x:t,y:e,width:n,w:n,height:r,h:r,x2:t+n,y2:e+r,cx:t+n/2,cy:e+r/2,r1:Math.min(n,r)/2,r2:Math.max(n,r)/2,r0:Math.sqrt(n*n+r*r)/2,path:S(t,e,n,r),vb:[t,e,n,r].join(" ")}},_=function(t,e,n,i,o,a,s,u){Object(r.m)(t)||(t=[t,e,n,i,o,a,s,u]);var c=b.apply(null,t);return E(c.min.x,c.min.y,c.max.x-c.min.x,c.max.y-c.min.y)},O=function(t,e,n,r,i,o,a,s,u){var c=1-u,f=Math.pow(c,3),l=Math.pow(c,2),h=u*u,d=h*u,p=t+2*u*(n-t)+h*(i-2*n+t),g=e+2*u*(r-e)+h*(o-2*r+e),v=n+2*u*(i-n)+h*(a-2*i+n),y=r+2*u*(o-r)+h*(s-2*o+r);return{x:f*t+3*l*u*n+3*c*u*u*i+d*a,y:f*e+3*l*u*r+3*c*u*u*o+d*s,m:{x:p,y:g},n:{x:v,y:y},start:{x:c*t+u*n,y:c*e+u*r},end:{x:c*i+u*a,y:c*o+u*s},alpha:90-180*Math.atan2(p-v,g-y)/Math.PI}},k=function(t,e,n){if(!function(t,e){return t=E(t),e=E(e),w(e,t.x,t.y)||w(e,t.x2,t.y)||w(e,t.x,t.y2)||w(e,t.x2,t.y2)||w(t,e.x,e.y)||w(t,e.x2,e.y)||w(t,e.x,e.y2)||w(t,e.x2,e.y2)||(t.xe.x||e.xt.x)&&(t.ye.y||e.yt.y)}(_(t),_(e)))return n?0:[];for(var r=~~(m.apply(0,t)/8),i=~~(m.apply(0,e)/8),o=[],a=[],s={},u=n?0:[],c=0;c=0&&S<=1&&k>=0&&k<=1&&(n?u+=1:u.push({x:b.x,y:b.y,t1:S,t2:k}))}}return u},M=function(t,e){return function(t,e,n){var r,i,o,a,s,u,c,f,l,h;t=p(t),e=p(e);for(var d=n?0:[],g=0,v=t.length;g=3&&(3===t.length&&e.push("Q"),e=e.concat(t[1])),2===t.length&&e.push("L"),e=e.concat(t[t.length-1])}))}(t,e,n));else{var i=[].concat(t);"M"===i[0]&&(i[0]="L");for(var o=0;o<=n-1;o++)r.push(i)}return r},C=function(t,e){if(1===t.length)return t;var n=t.length-1,r=e.length-1,i=n/r,o=[];if(1===t.length&&"M"===t[0][0]){for(var a=0;a=0;u--)a=o[u].index,"add"===o[u].type?t.splice(a,0,[].concat(t[a])):t.splice(a,1)}var l=i-(r=t.length);if(r0)){t[r]=e[r];break}n=D(n,t[r-1],1)}t[r]=["Q"].concat(n.reduce((function(t,e){return t.concat(e)}),[]));break;case"T":t[r]=["T"].concat(n[0]);break;case"C":if(n.length<3){if(!(r>0)){t[r]=e[r];break}n=D(n,t[r-1],2)}t[r]=["C"].concat(n.reduce((function(t,e){return t.concat(e)}),[]));break;case"S":if(n.length<2){if(!(r>0)){t[r]=e[r];break}n=D(n,t[r-1],1)}t[r]=["S"].concat(n.reduce((function(t,e){return t.concat(e)}),[]));break;default:t[r]=e[r]}return t}},function(t,e,n){"use strict";n(57),n(21);var r=n(269);n.d(e,"Canvas",(function(){return r.a}));n(78),n(92)},function(t,e,n){var r=n(86),i=n(146);t.exports=function(t){return null!=t&&i(t.length)&&!r(t)}},function(t,e,n){function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var i=n(346),o=n(356),a=n(67),s=n(29),u=n(363);t.exports=function(t){return"function"==typeof t?t:null==t?a:"object"==r(t)?s(t)?o(t[0],t[1]):i(t):u(t)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TargetTypeEnum=e.BindingTypeEnum=e.BindingScopeEnum=void 0;e.BindingScopeEnum={Request:"Request",Singleton:"Singleton",Transient:"Transient"};e.BindingTypeEnum={ConstantValue:"ConstantValue",Constructor:"Constructor",DynamicValue:"DynamicValue",Factory:"Factory",Function:"Function",Instance:"Instance",Invalid:"Invalid",Provider:"Provider"};e.TargetTypeEnum={ClassProperty:"ClassProperty",ConstructorArgument:"ConstructorArgument",Variable:"Variable"}},function(t,e,n){"use strict";n.r(e),n.d(e,"Base",(function(){return c})),n.d(e,"Circle",(function(){return f})),n.d(e,"Ellipse",(function(){return h})),n.d(e,"Image",(function(){return p})),n.d(e,"Line",(function(){return m})),n.d(e,"Marker",(function(){return S})),n.d(e,"Path",(function(){return j})),n.d(e,"Polygon",(function(){return N})),n.d(e,"Polyline",(function(){return R})),n.d(e,"Rect",(function(){return B})),n.d(e,"Text",(function(){return G}));var r={};n.r(r),n.d(r,"Base",(function(){return c})),n.d(r,"Circle",(function(){return f})),n.d(r,"Ellipse",(function(){return h})),n.d(r,"Image",(function(){return p})),n.d(r,"Line",(function(){return m})),n.d(r,"Marker",(function(){return S})),n.d(r,"Path",(function(){return j})),n.d(r,"Polygon",(function(){return N})),n.d(r,"Polyline",(function(){return R})),n.d(r,"Rect",(function(){return B})),n.d(r,"Text",(function(){return G}));var i=n(1),o=n(21),a=n(16),s=n(30),u=n(78),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{lineWidth:1,lineAppendWidth:0,strokeOpacity:1,fillOpacity:1})},e.prototype.getShapeBase=function(){return r},e.prototype.getGroupBase=function(){return u.a},e.prototype.onCanvasChange=function(t){Object(s.h)(this,t)},e.prototype.calculateBBox=function(){var t=this.get("type"),e=this.getHitLineWidth(),n=Object(o.getBBoxMethod)(t)(this),r=e/2,i=n.x-r,a=n.y-r,s=n.x+n.width+r,u=n.y+n.height+r;return{x:i,minX:i,y:a,minY:a,width:n.width+e,height:n.height+e,maxX:s,maxY:u}},e.prototype.isFill=function(){return!!this.attrs.fill||this.isClipShape()},e.prototype.isStroke=function(){return!!this.attrs.stroke},e.prototype._applyClip=function(t,e){e&&(t.save(),Object(s.a)(t,e),e.createPath(t),t.restore(),t.clip(),e._afterDraw())},e.prototype.draw=function(t,e){var n=this.cfg.clipShape;if(e){if(!1===this.cfg.refresh)return void this.set("hasChanged",!1);var r=this.getCanvasBBox();if(!Object(a.f)(e,r))return this.set("hasChanged",!1),void(this.cfg.isInView&&this._afterDraw())}t.save(),Object(s.a)(t,this),this._applyClip(t,n),this.drawPath(t),t.restore(),this._afterDraw()},e.prototype.getCanvasViewBox=function(){var t=this.cfg.canvas;return t?t.getViewRange():null},e.prototype.cacheCanvasBBox=function(){var t=this.getCanvasViewBox();if(t){var e=this.getCanvasBBox(),n=Object(a.f)(e,t);this.set("isInView",n),n?this.set("cacheCanvasBBox",e):this.set("cacheCanvasBBox",null)}},e.prototype._afterDraw=function(){this.cacheCanvasBBox(),this.set("hasChanged",!1),this.set("refresh",null)},e.prototype.skipDraw=function(){this.set("cacheCanvasBBox",null),this.set("isInView",null),this.set("hasChanged",!1)},e.prototype.drawPath=function(t){this.createPath(t),this.strokeAndFill(t),this.afterDrawPath(t)},e.prototype.fill=function(t){t.fill()},e.prototype.stroke=function(t){t.stroke()},e.prototype.strokeAndFill=function(t){var e=this.attrs,n=e.lineWidth,r=e.opacity,i=e.strokeOpacity,o=e.fillOpacity;this.isFill()&&(Object(a.i)(o)||1===o?this.fill(t):(t.globalAlpha=o,this.fill(t),t.globalAlpha=r)),this.isStroke()&&n>0&&(Object(a.i)(i)||1===i||(t.globalAlpha=i),this.stroke(t)),this.afterDrawPath(t)},e.prototype.createPath=function(t){},e.prototype.afterDrawPath=function(t){},e.prototype.isInShape=function(t,e){var n=this.isStroke(),r=this.isFill(),i=this.getHitLineWidth();return this.isInStrokeOrPath(t,e,n,r,i)},e.prototype.isInStrokeOrPath=function(t,e,n,r,i){return!1},e.prototype.getHitLineWidth=function(){if(!this.isStroke())return 0;var t=this.attrs;return t.lineWidth+t.lineAppendWidth},e}(o.AbstractShape),f=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x:0,y:0,r:0})},e.prototype.isInStrokeOrPath=function(t,e,n,r,i){var o=this.attr(),s=o.x,u=o.y,c=o.r,f=i/2,l=Object(a.b)(s,u,t,e);return r&&n?l<=c+f:r?l<=c:!!n&&(l>=c-f&&l<=c+f)},e.prototype.createPath=function(t){var e=this.attr(),n=e.x,r=e.y,i=e.r;t.beginPath(),t.arc(n,r,i,0,2*Math.PI,!1),t.closePath()},e}(c);function l(t,e,n,r){return t/(n*n)+e/(r*r)}var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x:0,y:0,rx:0,ry:0})},e.prototype.isInStrokeOrPath=function(t,e,n,r,i){var o=this.attr(),a=i/2,s=o.x,u=o.y,c=o.rx,f=o.ry,h=(t-s)*(t-s),d=(e-u)*(e-u);return r&&n?l(h,d,c+a,f+a)<=1:r?l(h,d,c,f)<=1:!!n&&(l(h,d,c-a,f-a)>=1&&l(h,d,c+a,f+a)<=1)},e.prototype.createPath=function(t){var e=this.attr(),n=e.x,r=e.y,i=e.rx,o=e.ry;if(t.beginPath(),t.ellipse)t.ellipse(n,r,i,o,0,0,2*Math.PI,!1);else{var a=i>o?i:o,s=i>o?1:i/o,u=i>o?o/i:1;t.save(),t.translate(n,r),t.scale(s,u),t.arc(0,0,a,0,2*Math.PI),t.restore(),t.closePath()}},e}(c);function d(t){return t instanceof HTMLElement&&Object(a.k)(t.nodeName)&&"CANVAS"===t.nodeName.toUpperCase()}var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x:0,y:0,width:0,height:0})},e.prototype.initAttrs=function(t){this._setImage(t.img)},e.prototype.isStroke=function(){return!1},e.prototype.isOnlyHitBox=function(){return!0},e.prototype._afterLoading=function(){if(!0===this.get("toDraw")){var t=this.get("canvas");t?t.draw():this.createPath(this.get("context"))}},e.prototype._setImage=function(t){var e=this,n=this.attrs;if(Object(a.k)(t)){var r=new Image;r.onload=function(){if(e.destroyed)return!1;e.attr("img",r),e.set("loading",!1),e._afterLoading();var t=e.get("callback");t&&t.call(e)},r.crossOrigin="Anonymous",r.src=t,this.set("loading",!0)}else t instanceof Image?(n.width||(n.width=t.width),n.height||(n.height=t.height)):d(t)&&(n.width||(n.width=Number(t.getAttribute("width"))),n.height||(n.height,Number(t.getAttribute("height"))))},e.prototype.onAttrChange=function(e,n,r){t.prototype.onAttrChange.call(this,e,n,r),"img"===e&&this._setImage(n)},e.prototype.createPath=function(t){if(this.get("loading"))return this.set("toDraw",!0),void this.set("context",t);var e=this.attr(),n=e.x,r=e.y,i=e.width,o=e.height,s=e.sx,u=e.sy,c=e.swidth,f=e.sheight,l=e.img;(l instanceof Image||d(l))&&(Object(a.i)(s)||Object(a.i)(u)||Object(a.i)(c)||Object(a.i)(f)?t.drawImage(l,n,r,i,o):t.drawImage(l,s,u,c,f,n,r,i,o))},e}(c),g=n(20);function v(t,e,n,r,i,o,a){var s=Math.min(t,n),u=Math.max(t,n),c=Math.min(e,r),f=Math.max(e,r),l=i/2;return o>=s-l&&o<=u+l&&a>=c-l&&a<=f+l&&g.c.pointToLine(t,e,n,r,o,a)<=i/2}var y=n(33),m=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x1:0,y1:0,x2:0,y2:0,startArrow:!1,endArrow:!1})},e.prototype.initAttrs=function(t){this.setArrow()},e.prototype.onAttrChange=function(e,n,r){t.prototype.onAttrChange.call(this,e,n,r),this.setArrow()},e.prototype.setArrow=function(){var t=this.attr(),e=t.x1,n=t.y1,r=t.x2,i=t.y2,o=t.startArrow,a=t.endArrow;o&&y.b(this,t,r,i,e,n),a&&y.a(this,t,e,n,r,i)},e.prototype.isInStrokeOrPath=function(t,e,n,r,i){if(!n||!i)return!1;var o=this.attr();return v(o.x1,o.y1,o.x2,o.y2,i,t,e)},e.prototype.createPath=function(t){var e=this.attr(),n=e.x1,r=e.y1,i=e.x2,o=e.y2,a=e.startArrow,s=e.endArrow,u={dx:0,dy:0},c={dx:0,dy:0};a&&a.d&&(u=y.c(n,r,i,o,e.startArrow.d)),s&&s.d&&(c=y.c(n,r,i,o,e.endArrow.d)),t.beginPath(),t.moveTo(n+u.dx,r+u.dy),t.lineTo(i-c.dx,o-c.dy)},e.prototype.afterDrawPath=function(t){var e=this.get("startArrowShape"),n=this.get("endArrowShape");e&&e.draw(t),n&&n.draw(t)},e.prototype.getTotalLength=function(){var t=this.attr(),e=t.x1,n=t.y1,r=t.x2,i=t.y2;return g.c.length(e,n,r,i)},e.prototype.getPoint=function(t){var e=this.attr(),n=e.x1,r=e.y1,i=e.x2,o=e.y2;return g.c.pointAt(n,r,i,o,t)},e}(c),b=n(0),x=n(38),w={circle:function(t,e,n){return[["M",t-n,e],["A",n,n,0,1,0,t+n,e],["A",n,n,0,1,0,t-n,e]]},square:function(t,e,n){return[["M",t-n,e-n],["L",t+n,e-n],["L",t+n,e+n],["L",t-n,e+n],["Z"]]},diamond:function(t,e,n){return[["M",t-n,e],["L",t,e-n],["L",t+n,e],["L",t,e+n],["Z"]]},triangle:function(t,e,n){var r=n*Math.sin(1/3*Math.PI);return[["M",t-n,e+r],["L",t,e-r],["L",t+n,e+r],["Z"]]},"triangle-down":function(t,e,n){var r=n*Math.sin(1/3*Math.PI);return[["M",t-n,e-r],["L",t+n,e-r],["L",t,e+r],["Z"]]}},S=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(i.b)(e,t),e.prototype.initAttrs=function(t){this._resetParamsCache()},e.prototype._resetParamsCache=function(){this.set("paramsCache",{})},e.prototype.onAttrChange=function(e,n,r){t.prototype.onAttrChange.call(this,e,n,r),-1!==["symbol","x","y","r","radius"].indexOf(e)&&this._resetParamsCache()},e.prototype.isOnlyHitBox=function(){return!0},e.prototype._getR=function(t){return Object(b.s)(t.r)?t.radius:t.r},e.prototype._getPath=function(){var t,n,r=this.attr(),i=r.x,o=r.y,s=r.symbol||"circle",u=this._getR(r);if(Object(a.h)(s))n=(t=s)(i,o,u),n=Object(x.c)(n);else{if(!(t=e.Symbols[s]))return console.warn(s+" marker is not supported."),null;n=t(i,o,u)}return n},e.prototype.createPath=function(t){var e=this._getPath(),n=this.get("paramsCache");Object(s.e)(this,t,{path:e},n)},e.Symbols=w,e}(c);function E(t,e,n){var r=Object(o.getOffScreenContext)();return t.createPath(r),r.isPointInPath(e,n)}function _(t){return Math.abs(t)<1e-6?0:t<0?-1:1}function O(t,e,n){return(n[0]-t[0])*(e[1]-t[1])==(e[0]-t[0])*(n[1]-t[1])&&Math.min(t[0],e[0])<=n[0]&&n[0]<=Math.max(t[0],e[0])&&Math.min(t[1],e[1])<=n[1]&&n[1]<=Math.max(t[1],e[1])}function k(t,e,n){var r=!1,i=t.length;if(i<=2)return!1;for(var o=0;o0!=_(s[1]-n)>0&&_(e-(n-a[1])*(a[0]-s[0])/(a[1]-s[1])-a[0])<0&&(r=!r)}return r}var M=n(18),A=n(40);function T(t,e,n,r,i,o,s,u){var c=(Math.atan2(u-e,s-t)+2*Math.PI)%(2*Math.PI);if(ci)return!1;var f={x:t+n*Math.cos(c),y:e+n*Math.sin(c)};return Object(a.b)(f.x,f.y,s,u)<=o/2}var C=M.a.transform;var I=Object(i.a)({hasArc:function(t){for(var e=!1,n=t.length,r=0;r0&&r.push(i),{polygons:n,polylines:r}},isPointInStroke:function(t,e,n,r,i){for(var o=!1,s=e/2,u=0;ux?b:x,k=C(null,[["t",-y,-m],["r",-E],["s",1/(b>x?1:b/x),1/(b>x?x/b:1)]]);A.transformMat3(_,_,k),o=T(0,0,O,w,S,e,_[0],_[1])}if(o)break}}return o}},o.PathUtil);function P(t,e,n){for(var r=!1,i=0;i=r[0]&&t<=r[1]&&(e=(t-r[0])/(r[1]-r[0]),n=i)}));var o=i[n];if(Object(b.s)(o)||Object(b.s)(n))return null;var a=o.length,s=i[n+1];return g.b.pointAt(o[a-2],o[a-1],s[1],s[2],s[3],s[4],s[5],s[6],e)},e.prototype._calculateCurve=function(){var t=this.attr().path;this.set("curve",I.pathToCurve(t))},e.prototype._setTcache=function(){var t,e,n,r,i=0,o=0,a=[],s=this.get("curve");s&&(Object(b.f)(s,(function(t,e){n=s[e+1],r=t.length,n&&(i+=g.b.length(t[r-2],t[r-1],n[1],n[2],n[3],n[4],n[5],n[6])||0)})),this.set("totalLength",i),0!==i?(Object(b.f)(s,(function(u,c){n=s[c+1],r=u.length,n&&((t=[])[0]=o/i,e=g.b.length(u[r-2],u[r-1],n[1],n[2],n[3],n[4],n[5],n[6]),o+=e||0,t[1]=o/i,a.push(t))})),this.set("tCache",a)):this.set("tCache",[]))},e.prototype.getStartTangent=function(){var t,e=this.getSegments();if(e.length>1){var n=e[0].currentPoint,r=e[1].currentPoint,i=e[1].startTangent;t=[],i?(t.push([n[0]-i[0],n[1]-i[1]]),t.push([n[0],n[1]])):(t.push([r[0],r[1]]),t.push([n[0],n[1]]))}return t},e.prototype.getEndTangent=function(){var t,e=this.getSegments(),n=e.length;if(n>1){var r=e[n-2].currentPoint,i=e[n-1].currentPoint,o=e[n-1].endTangent;t=[],o?(t.push([i[0]-o[0],i[1]-o[1]]),t.push([i[0],i[1]])):(t.push([r[0],r[1]]),t.push([i[0],i[1]]))}return t},e}(c);function D(t,e,n,r,i){var o=t.length;if(o<2)return!1;for(var a=0;a=r[0]&&t<=r[1]&&(e=(t-r[0])/(r[1]-r[0]),n=i)})),g.c.pointAt(r[n][0],r[n][1],r[n+1][0],r[n+1][1],e)},e.prototype._setTcache=function(){var t=this.attr().points;if(t&&0!==t.length){var e=this.getTotalLength();if(!(e<=0)){var n,r,i=0,o=[];Object(b.f)(t,(function(a,s){t[s+1]&&((n=[])[0]=i/e,r=g.c.length(a[0],a[1],t[s+1][0],t[s+1][1]),i+=r,n[1]=i/e,o.push(n))})),this.set("tCache",o)}}},e.prototype.getStartTangent=function(){var t=this.attr().points,e=[];return e.push([t[1][0],t[1][1]]),e.push([t[0][0],t[0][1]]),e},e.prototype.getEndTangent=function(){var t=this.attr().points,e=t.length-1,n=[];return n.push([t[e-1][0],t[e-1][1]]),n.push([t[e][0],t[e][1]]),n},e}(c),L=n(140);var B=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x:0,y:0,width:0,height:0,radius:0})},e.prototype.isInStrokeOrPath=function(t,e,n,r,i){var o=this.attr(),s=o.x,u=o.y,c=o.width,f=o.height,l=o.radius;if(l){var h=!1;return n&&(h=function(t,e,n,r,i,o,a,s){return v(t+i,e,t+n-i,e,o,a,s)||v(t+n,e+i,t+n,e+r-i,o,a,s)||v(t+n-i,e+r,t+i,e+r,o,a,s)||v(t,e+r-i,t,e+i,o,a,s)||T(t+n-i,e+i,i,1.5*Math.PI,2*Math.PI,o,a,s)||T(t+n-i,e+r-i,i,0,.5*Math.PI,o,a,s)||T(t+i,e+r-i,i,.5*Math.PI,Math.PI,o,a,s)||T(t+i,e+i,i,Math.PI,1.5*Math.PI,o,a,s)}(s,u,c,f,l,i,t,e)),!h&&r&&(h=E(this,t,e)),h}var d=i/2;return r&&n?Object(a.e)(s-d,u-d,c+d,f+d,t,e):r?Object(a.e)(s,u,c,f,t,e):n?function(t,e,n,r,i,o,s){var u=i/2;return Object(a.e)(t-u,e-u,n,i,o,s)||Object(a.e)(t+n-u,e-u,i,r,o,s)||Object(a.e)(t+u,e+r-u,n,i,o,s)||Object(a.e)(t-u,e+u,i,r,o,s)}(s,u,c,f,i,t,e):void 0},e.prototype.createPath=function(t){var e=this.attr(),n=e.x,r=e.y,i=e.width,o=e.height,a=e.radius;if(t.beginPath(),0===a)t.rect(n,r,i,o);else{var s=Object(L.a)(a),u=s[0],c=s[1],f=s[2],l=s[3];t.moveTo(n+u,r),t.lineTo(n+i-c,r),0!==c&&t.arc(n+i-c,r+c,c,-Math.PI/2,0),t.lineTo(n+i,r+o-f),0!==f&&t.arc(n+i-f,r+o-f,f,0,Math.PI/2),t.lineTo(n+l,r+o),0!==l&&t.arc(n+l,r+o-l,l,Math.PI/2,Math.PI),t.lineTo(n,r+u),0!==u&&t.arc(n+u,r+u,u,Math.PI,1.5*Math.PI),t.closePath()}},e}(c),G=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x:0,y:0,text:null,fontSize:12,fontFamily:"sans-serif",fontStyle:"normal",fontWeight:"normal",fontVariant:"normal",textAlign:"start",textBaseline:"bottom"})},e.prototype.isOnlyHitBox=function(){return!0},e.prototype.initAttrs=function(t){this._assembleFont(),t.text&&this._setText(t.text)},e.prototype._assembleFont=function(){var t=this.attrs;t.font=Object(o.assembleFont)(t)},e.prototype._setText=function(t){var e=null;Object(a.k)(t)&&-1!==t.indexOf("\\n")&&(e=t.split("\\n")),this.set("textArr",e)},e.prototype.onAttrChange=function(e,n,r){t.prototype.onAttrChange.call(this,e,n,r),e.startsWith("font")&&this._assembleFont(),"text"===e&&this._setText(n)},e.prototype._getSpaceingY=function(){var t=this.attrs,e=t.lineHeight,n=1*t.fontSize;return e?e-n:.14*n},e.prototype._drawTextArr=function(t,e,n){var r,i=this.attrs,s=i.textBaseline,u=i.x,c=i.y,f=1*i.fontSize,l=this._getSpaceingY(),h=Object(o.getTextHeight)(i.text,i.fontSize,i.lineHeight);Object(a.c)(e,(function(e,i){r=c+i*(l+f)-h+f,"middle"===s&&(r+=h-f-(h-f)/2),"top"===s&&(r+=h-f),n?t.fillText(e,u,r):t.strokeText(e,u,r)}))},e.prototype._drawText=function(t,e){var n=this.attr(),r=n.x,i=n.y,o=this.get("textArr");if(o)this._drawTextArr(t,o,e);else{var a=n.text;e?t.fillText(a,r,i):t.strokeText(a,r,i)}},e.prototype.strokeAndFill=function(t){var e=this.attrs,n=e.lineWidth,r=e.opacity,i=e.strokeOpacity,o=e.fillOpacity;this.isStroke()&&n>0&&(Object(a.i)(i)||1===i||(t.globalAlpha=r),this.stroke(t)),this.isFill()&&(Object(a.i)(o)||1===o?this.fill(t):(t.globalAlpha=o,this.fill(t),t.globalAlpha=r)),this.afterDrawPath(t)},e.prototype.fill=function(t){this._drawText(t,!0)},e.prototype.stroke=function(t){this._drawText(t,!1)},e}(c)},function(t,e,n){"use strict";n.d(e,"b",(function(){return r})),n.d(e,"a",(function(){return h}));var r,i=n(62),o=n.n(i),a=n(6),s=n.n(a),u=n(7),c=n.n(u),f=n(2),l=n(127);!function(t){t[t.OUTSIDE=4294967295]="OUTSIDE",t[t.INSIDE=0]="INSIDE",t[t.INDETERMINATE=2147483647]="INDETERMINATE"}(r||(r={}));var h=function(){function t(e){if(s()(this,t),this.planes=[],e)this.planes=e;else for(var n=0;n<6;n++)this.planes.push(new l.a)}return c()(t,[{key:"extractFromVPMatrix",value:function(t){var e=o()(t,16),n=e[0],r=e[1],i=e[2],a=e[3],s=e[4],u=e[5],c=e[6],l=e[7],h=e[8],d=e[9],p=e[10],g=e[11],v=e[12],y=e[13],m=e[14],b=e[15];f.e.set(this.planes[0].normal,a-n,l-s,g-h),this.planes[0].distance=-(b-v),f.e.set(this.planes[1].normal,a+n,l+s,g+h),this.planes[1].distance=-(b+v),f.e.set(this.planes[2].normal,a+r,l+u,g+d),this.planes[2].distance=-(b+y),f.e.set(this.planes[3].normal,a-r,l-u,g-d),this.planes[3].distance=-(b-y),f.e.set(this.planes[4].normal,a-i,l-c,g-p),this.planes[4].distance=-(b-m),f.e.set(this.planes[5].normal,a+i,l+c,g+p),this.planes[5].distance=-(b+m),this.planes.forEach((function(t){t.normalize(),t.updatePNVertexFlag()}))}}]),t}()},function(t,e,n){var r=n(74),i=n(302),o=n(303),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?i(t):o(t)}},function(t,e,n){var r=n(182),i=n(148),o=n(54);t.exports=function(t){return o(t)?r(t):i(t)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.tagProperty=e.tagParameter=e.decorate=void 0;var r=n(41),i=n(31);function o(t,e,n,i,o){var a={},s="number"==typeof o,u=void 0!==o&&s?o.toString():n;if(s&&void 0!==n)throw new Error(r.INVALID_DECORATOR_OPERATION);Reflect.hasOwnMetadata(t,e)&&(a=Reflect.getMetadata(t,e));var c=a[u];if(Array.isArray(c))for(var f=0,l=c;f1?e*i+function(t,e){return e?e-t:.14*t}(e,n)*(i-1):e}function a(t,e){var n=Object(i.a)(),o=0;if(Object(r.e)(t)||""===t)return o;if(n.save(),n.font=e,Object(r.h)(t)&&t.includes("\\n")){var a=t.split("\\n");Object(r.a)(a,(function(t){var e=n.measureText(t).width;o=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,o=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw o}}}}function j(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);nl||d<0||p>h||p<0))return c(e.pickingFBO,(function(){0===(r=u({x:Math.round(d),y:Math.round(h-(a+1)*window.devicePixelRatio),width:1,height:1,data:new Uint8Array(4),framebuffer:e.pickingFBO}))[0]&&0===r[1]&&0===r[2]||(i=Object(C.a)(r),e.highlightEnabled&&e.highlightPickedFeature(r,n))})),i}}return O()(t,[{key:"enableHighlight",value:function(t){this.highlightEnabled=t}},{key:"setHighlightColor",value:function(t){this.highlightColor=t}},{key:"highlightPickedFeature",value:function(t,e){if(t){var n,r=P(e.getScene().getEntities());try{for(r.s();!(n=r.n()).done;){var i=n.value,o=this.mesh.getComponentByEntity(i).material;o.setUniform("u_PickingStage",N),o.setUniform("u_PickingColor",[t[0],t[1],t[2]]),o.setUniform("u_HighlightColor",this.highlightColor)}}catch(t){r.e(t)}finally{r.f()}}}}]),t}(),p.IDENTIFIER="PixelPicking Pass",c=g,f=M()(c.prototype,"engine",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),l=M()(c.prototype,"resourcePool",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=M()(c.prototype,"renderPassFactory",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=M()(c.prototype,"mesh",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=c))||u)},function(t,e,n){"use strict";n.d(e,"a",(function(){return o})),n.d(e,"b",(function(){return a}));var r=n(34),i=n(25);function o(t,e){e.forEach((function(e){e.draw(t)}))}function a(t,e){var n=t.get("canvas");if(n&&n.get("autoDraw")){var o=n.get("context"),a=t.getParent(),s=a?a.getChildren():[n],u=t.get("el");if("remove"===e)if(t.get("isClipShape")){var c=u&&u.parentNode,f=c&&c.parentNode;c&&f&&f.removeChild(c)}else u&&u.parentNode&&u.parentNode.removeChild(u);else if("show"===e)u.setAttribute("visibility","visible");else if("hide"===e)u.setAttribute("visibility","hidden");else if("zIndex"===e)Object(i.c)(u,s.indexOf(t));else if("sort"===e){var l=t.get("children");l&&l.length&&Object(i.d)(t,(function(t,e){return l.indexOf(t)-l.indexOf(e)?1:0}))}else"clear"===e?u&&(u.innerHTML=""):"matrix"===e?Object(r.c)(t):"clip"===e?Object(r.a)(t,o):"attr"===e||"add"===e&&t.draw(o)}}},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},function(t,e,n){var r=n(45).Symbol;t.exports=r},function(t,e,n){(function(t){function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var i=n(45),o=n(322),a="object"==r(e)&&e&&!e.nodeType&&e,s=a&&"object"==r(t)&&t&&!t.nodeType&&t,u=s&&s.exports===a?i.Buffer:void 0,c=(u?u.isBuffer:void 0)||o;t.exports=c}).call(this,n(72)(t))},function(t,e,n){var r=n(331),i=n(143),o=n(332),a=n(191),s=n(333),u=n(59),c=n(180),f=c(r),l=c(i),h=c(o),d=c(a),p=c(s),g=u;(r&&"[object DataView]"!=g(new r(new ArrayBuffer(1)))||i&&"[object Map]"!=g(new i)||o&&"[object Promise]"!=g(o.resolve())||a&&"[object Set]"!=g(new a)||s&&"[object WeakMap]"!=g(new s))&&(g=function(t){var e=u(t),n="[object Object]"==e?t.constructor:void 0,r=n?c(n):"";if(r)switch(r){case f:return"[object DataView]";case l:return"[object Map]";case h:return"[object Promise]";case d:return"[object Set]";case p:return"[object WeakMap]"}return e}),t.exports=g},function(t,e,n){function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var i=n(59),o=n(46);t.exports=function(t){return"symbol"==r(t)||o(t)&&"[object Symbol]"==i(t)}},function(t,e,n){"use strict";var r=n(1),i=n(21),o=n(57),a=n(30),s=n(0),u=n(16),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(r.b)(e,t),e.prototype.onCanvasChange=function(t){Object(a.h)(this,t)},e.prototype.getShapeBase=function(){return o},e.prototype.getGroupBase=function(){return e},e.prototype._applyClip=function(t,e){e&&(t.save(),Object(a.a)(t,e),e.createPath(t),t.restore(),t.clip(),e._afterDraw())},e.prototype.cacheCanvasBBox=function(){var t=this.cfg.children,e=[],n=[];Object(s.f)(t,(function(t){var r=t.cfg.cacheCanvasBBox;r&&t.cfg.isInView&&(e.push(r.minX,r.maxX),n.push(r.minY,r.maxY))}));var r=null;if(e.length){var i=Math.min.apply(null,e),o=Math.max.apply(null,e),a=Math.min.apply(null,n),c=Math.max.apply(null,n);r={minX:i,minY:a,x:i,y:a,maxX:o,maxY:c,width:o-i,height:c-a};var f=this.cfg.canvas;if(f){var l=f.getViewRange();this.set("isInView",Object(u.f)(r,l))}}else this.set("isInView",!1);this.set("cacheCanvasBBox",r)},e.prototype.draw=function(t,e){var n=this.cfg.children,r=!e||this.cfg.refresh;n.length&&r&&(t.save(),Object(a.a)(t,this),this._applyClip(t,this.getClip()),Object(a.d)(t,n,e),t.restore(),this.cacheCanvasBBox()),this.cfg.refresh=null,this.set("hasChanged",!1)},e.prototype.skipDraw=function(){this.set("cacheCanvasBBox",null),this.set("hasChanged",!1)},e}(i.AbstractGroup);e.a=c},function(t,e,n){"use strict";var r=n(1),i=n(21),o=n(0),a=n(81),s=n(71),u=n(34),c=n(15),f=n(25),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(r.b)(e,t),e.prototype.isEntityGroup=function(){return!0},e.prototype.createDom=function(){var t=Object(f.b)("g");this.set("el",t);var e=this.getParent();if(e){var n=e.get("el");n||(n=e.createDom(),e.set("el",n)),n.appendChild(t)}return t},e.prototype.afterAttrsChange=function(e){t.prototype.afterAttrsChange.call(this,e);var n=this.get("canvas");if(n&&n.get("autoDraw")){var r=n.get("context");this.createPath(r,e)}},e.prototype.onCanvasChange=function(t){Object(s.b)(this,t)},e.prototype.getShapeBase=function(){return a},e.prototype.getGroupBase=function(){return e},e.prototype.draw=function(t){var e=this.getChildren(),n=this.get("el");this.get("destroyed")?n&&n.parentNode.removeChild(n):(n||this.createDom(),Object(u.a)(this,t),this.createPath(t),e.length&&Object(s.a)(t,e))},e.prototype.createPath=function(t,e){var n=this.attr(),r=this.get("el");Object(o.f)(e||n,(function(t,e){c.b[e]&&r.setAttribute(c.b[e],t)})),Object(u.c)(this)},e}(i.AbstractGroup);e.a=l},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(6),i=n.n(r),o=n(7),a=n.n(o),s=n(2),u=function(){function t(e,n){i()(this,t),this.center=void 0,this.halfExtents=void 0,this.min=s.e.create(),this.max=s.e.create(),this.update(e,n)}return a()(t,[{key:"update",value:function(t,e){this.center=t||s.e.create(),this.halfExtents=e||s.e.fromValues(.5,.5,.5),this.min=s.e.sub(this.min,this.center,this.halfExtents),this.max=s.e.add(this.max,this.center,this.halfExtents)}},{key:"setMinMax",value:function(t,e){s.e.add(this.center,e,t),s.e.scale(this.center,this.center,.5),s.e.sub(this.halfExtents,e,t),s.e.scale(this.halfExtents,this.halfExtents,.5),s.e.copy(this.min,t),s.e.copy(this.max,e)}},{key:"getMin",value:function(){return this.min}},{key:"getMax",value:function(){return this.max}},{key:"add",value:function(t){var e=this.center,n=e[0],r=e[1],i=e[2],o=this.halfExtents,a=o[0],s=o[1],u=o[2],c=n-a,f=n+a,l=r-s,h=r+s,d=i-u,p=i+u,g=t.center,v=g[0],y=g[1],m=g[2],b=t.halfExtents,x=b[0],w=b[1],S=b[2],E=v-x,_=v+x,O=y-w,k=y+w,M=m-S,A=m+S;Ef&&(f=_),Oh&&(h=k),Mp&&(p=A),e[0]=.5*(c+f),e[1]=.5*(l+h),e[2]=.5*(d+p),o[0]=.5*(f-c),o[1]=.5*(h-l),o[2]=.5*(p-d),this.min[0]=c,this.min[1]=l,this.min[2]=d,this.max[0]=f,this.max[1]=h,this.max[2]=p}},{key:"intersects",value:function(t){var e=this.getMax(),n=this.getMin(),r=t.getMax(),i=t.getMin();return n[0]<=r[0]&&e[0]>=i[0]&&n[1]<=r[1]&&e[1]>=i[1]&&n[2]<=r[2]&&e[2]>=i[2]}},{key:"containsPoint",value:function(t){var e=this.getMin(),n=this.getMax();return!(t[0]n[0]||t[1]n[1]||t[2]n[2])}},{key:"getNegativeFarPoint",value:function(t){return 273===t.pnVertexFlag?s.e.copy(s.e.create(),this.min):272===t.pnVertexFlag?s.e.fromValues(this.min[0],this.min[1],this.max[2]):257===t.pnVertexFlag?s.e.fromValues(this.min[0],this.max[1],this.min[2]):256===t.pnVertexFlag?s.e.fromValues(this.min[0],this.max[1],this.max[2]):17===t.pnVertexFlag?s.e.fromValues(this.max[0],this.min[1],this.min[2]):16===t.pnVertexFlag?s.e.fromValues(this.max[0],this.min[1],this.max[2]):1===t.pnVertexFlag?s.e.fromValues(this.max[0],this.max[1],this.min[2]):s.e.fromValues(this.max[0],this.max[1],this.max[2])}},{key:"getPositiveFarPoint",value:function(t){return 273===t.pnVertexFlag?s.e.copy(s.e.create(),this.max):272===t.pnVertexFlag?s.e.fromValues(this.max[0],this.max[1],this.min[2]):257===t.pnVertexFlag?s.e.fromValues(this.max[0],this.min[1],this.max[2]):256===t.pnVertexFlag?s.e.fromValues(this.max[0],this.min[1],this.min[2]):17===t.pnVertexFlag?s.e.fromValues(this.min[0],this.max[1],this.max[2]):16===t.pnVertexFlag?s.e.fromValues(this.min[0],this.max[1],this.min[2]):1===t.pnVertexFlag?s.e.fromValues(this.min[0],this.min[1],this.max[2]):s.e.fromValues(this.min[0],this.min[1],this.min[2])}}]),t}()},function(t,e,n){"use strict";n.r(e),n.d(e,"Base",(function(){return l})),n.d(e,"Circle",(function(){return d})),n.d(e,"Dom",(function(){return p})),n.d(e,"Ellipse",(function(){return g})),n.d(e,"Image",(function(){return v})),n.d(e,"Line",(function(){return m})),n.d(e,"Marker",(function(){return w})),n.d(e,"Path",(function(){return S})),n.d(e,"Polygon",(function(){return E})),n.d(e,"Polyline",(function(){return _})),n.d(e,"Rect",(function(){return O})),n.d(e,"Text",(function(){return C}));var r={};n.r(r),n.d(r,"Base",(function(){return l})),n.d(r,"Circle",(function(){return d})),n.d(r,"Dom",(function(){return p})),n.d(r,"Ellipse",(function(){return g})),n.d(r,"Image",(function(){return v})),n.d(r,"Line",(function(){return m})),n.d(r,"Marker",(function(){return w})),n.d(r,"Path",(function(){return S})),n.d(r,"Polygon",(function(){return E})),n.d(r,"Polyline",(function(){return _})),n.d(r,"Rect",(function(){return O})),n.d(r,"Text",(function(){return C}));var i=n(1),o=n(21),a=n(34),s=n(25),u=n(71),c=n(15),f=n(79),l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="svg",e.canFill=!1,e.canStroke=!1,e}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{lineWidth:1,lineAppendWidth:0,strokeOpacity:1,fillOpacity:1})},e.prototype.afterAttrsChange=function(e){t.prototype.afterAttrsChange.call(this,e);var n=this.get("canvas");if(n&&n.get("autoDraw")){var r=n.get("context");this.draw(r,e)}},e.prototype.getShapeBase=function(){return r},e.prototype.getGroupBase=function(){return f.a},e.prototype.onCanvasChange=function(t){Object(u.b)(this,t)},e.prototype.calculateBBox=function(){var t=this.get("el"),e=null;if(t)e=t.getBBox();else{var n=Object(o.getBBoxMethod)(this.get("type"));n&&(e=n(this))}if(e){var r=e.x,i=e.y,a=e.width,s=e.height,u=this.getHitLineWidth(),c=u/2,f=r-c,l=i-c;return{x:f,y:l,minX:f,minY:l,maxX:r+a+c,maxY:i+s+c,width:a+u,height:s+u}}return{x:0,y:0,minX:0,minY:0,maxX:0,maxY:0,width:0,height:0}},e.prototype.isFill=function(){var t=this.attr(),e=t.fill,n=t.fillStyle;return(e||n||this.isClipShape())&&this.canFill},e.prototype.isStroke=function(){var t=this.attr(),e=t.stroke,n=t.strokeStyle;return(e||n)&&this.canStroke},e.prototype.draw=function(t,e){var n=this.get("el");this.get("destroyed")?n&&n.parentNode.removeChild(n):(n||Object(s.a)(this),Object(a.a)(this,t),this.createPath(t,e),this.shadow(t,e),this.strokeAndFill(t,e),this.transform(e))},e.prototype.createPath=function(t,e){},e.prototype.strokeAndFill=function(t,e){var n=e||this.attr(),r=n.fill,i=n.fillStyle,o=n.stroke,a=n.strokeStyle,s=n.fillOpacity,u=n.strokeOpacity,f=n.lineWidth,l=this.get("el");this.canFill&&(e?"fill"in n?this._setColor(t,"fill",r):"fillStyle"in n&&this._setColor(t,"fill",i):this._setColor(t,"fill",r||i),s&&l.setAttribute(c.b.fillOpacity,s)),this.canStroke&&f>0&&(e?"stroke"in n?this._setColor(t,"stroke",o):"strokeStyle"in n&&this._setColor(t,"stroke",a):this._setColor(t,"stroke",o||a),u&&l.setAttribute(c.b.strokeOpacity,u),f&&l.setAttribute(c.b.lineWidth,f))},e.prototype._setColor=function(t,e,n){var r=this.get("el");if(n)if(n=n.trim(),/^[r,R,L,l]{1}[\\s]*\\(/.test(n))(i=t.find("gradient",n))||(i=t.addGradient(n)),r.setAttribute(c.b[e],"url(#"+i+")");else if(/^[p,P]{1}[\\s]*\\(/.test(n)){var i;(i=t.find("pattern",n))||(i=t.addPattern(n)),r.setAttribute(c.b[e],"url(#"+i+")")}else r.setAttribute(c.b[e],n);else r.setAttribute(c.b[e],"none")},e.prototype.shadow=function(t,e){var n=this.attr(),r=e||n,i=r.shadowOffsetX,o=r.shadowOffsetY,s=r.shadowBlur,u=r.shadowColor;(i||o||s||u)&&Object(a.b)(this,t)},e.prototype.transform=function(t){var e=this.attr();(t||e).matrix&&Object(a.c)(this)},e.prototype.isInShape=function(t,e){return this.isPointInPath(t,e)},e.prototype.isPointInPath=function(t,e){var n=this.get("el"),r=this.get("canvas").get("el").getBoundingClientRect(),i=t+r.left,o=e+r.top,a=document.elementFromPoint(i,o);return!(!a||!a.isEqualNode(n))},e.prototype.getHitLineWidth=function(){var t=this.attrs,e=t.lineWidth,n=t.lineAppendWidth;return this.isStroke()?e+n:0},e}(o.AbstractShape),h=n(0),d=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="circle",e.canFill=!0,e.canStroke=!0,e}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x:0,y:0,r:0})},e.prototype.createPath=function(t,e){var n=this.attr(),r=this.get("el");Object(h.f)(e||n,(function(t,e){"x"===e||"y"===e?r.setAttribute("c"+e,t):c.b[e]&&r.setAttribute(c.b[e],t)}))},e}(l),p=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dom",e.canFill=!1,e.canStroke=!1,e}return Object(i.b)(e,t),e.prototype.createPath=function(t,e){var n=this.attr(),r=this.get("el");if(Object(h.f)(e||n,(function(t,e){c.b[e]&&r.setAttribute(c.b[e],t)})),"function"==typeof n.html){var i=n.html.call(this,n);if(i instanceof Element||i instanceof HTMLDocument){for(var o=r.childNodes,a=o.length-1;a>=0;a--)r.removeChild(o[a]);r.appendChild(i)}else r.innerHTML=i}else r.innerHTML=n.html},e}(l),g=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="ellipse",e.canFill=!0,e.canStroke=!0,e}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x:0,y:0,rx:0,ry:0})},e.prototype.createPath=function(t,e){var n=this.attr(),r=this.get("el");Object(h.f)(e||n,(function(t,e){"x"===e||"y"===e?r.setAttribute("c"+e,t):c.b[e]&&r.setAttribute(c.b[e],t)}))},e}(l),v=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="image",e.canFill=!1,e.canStroke=!1,e}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x:0,y:0,width:0,height:0})},e.prototype.createPath=function(t,e){var n=this,r=this.attr(),i=this.get("el");Object(h.f)(e||r,(function(t,e){"img"===e?n._setImage(r.img):c.b[e]&&i.setAttribute(c.b[e],t)}))},e.prototype.setAttr=function(t,e){this.attrs[t]=e,"img"===t&&this._setImage(e)},e.prototype._setImage=function(t){var e=this.attr(),n=this.get("el");if(Object(h.x)(t))n.setAttribute("href",t);else if(t instanceof window.Image)e.width||(n.setAttribute("width",t.width),this.attr("width",t.width)),e.height||(n.setAttribute("height",t.height),this.attr("height",t.height)),n.setAttribute("href",t.src);else if(t instanceof HTMLElement&&Object(h.x)(t.nodeName)&&"CANVAS"===t.nodeName.toUpperCase())n.setAttribute("href",t.toDataURL());else if(t instanceof ImageData){var r=document.createElement("canvas");r.setAttribute("width",""+t.width),r.setAttribute("height",""+t.height),r.getContext("2d").putImageData(t,0,0),e.width||(n.setAttribute("width",""+t.width),this.attr("width",t.width)),e.height||(n.setAttribute("height",""+t.height),this.attr("height",t.height)),n.setAttribute("href",r.toDataURL())}},e}(l),y=n(20),m=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="line",e.canFill=!1,e.canStroke=!0,e}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x1:0,y1:0,x2:0,y2:0,startArrow:!1,endArrow:!1})},e.prototype.createPath=function(t,e){var n=this.attr(),r=this.get("el");Object(h.f)(e||n,(function(e,i){if("startArrow"===i||"endArrow"===i)if(e){var o=Object(h.v)(e)?t.addArrow(n,c.b[i]):t.getDefaultArrow(n,c.b[i]);r.setAttribute(c.b[i],"url(#"+o+")")}else r.removeAttribute(c.b[i]);else c.b[i]&&r.setAttribute(c.b[i],e)}))},e.prototype.getTotalLength=function(){var t=this.attr(),e=t.x1,n=t.y1,r=t.x2,i=t.y2;return y.c.length(e,n,r,i)},e.prototype.getPoint=function(t){var e=this.attr(),n=e.x1,r=e.y1,i=e.x2,o=e.y2;return y.c.pointAt(n,r,i,o,t)},e}(l),b={circle:function(t,e,n){return[["M",t,e],["m",-n,0],["a",n,n,0,1,0,2*n,0],["a",n,n,0,1,0,2*-n,0]]},square:function(t,e,n){return[["M",t-n,e-n],["L",t+n,e-n],["L",t+n,e+n],["L",t-n,e+n],["Z"]]},diamond:function(t,e,n){return[["M",t-n,e],["L",t,e-n],["L",t+n,e],["L",t,e+n],["Z"]]},triangle:function(t,e,n){var r=n*Math.sin(1/3*Math.PI);return[["M",t-n,e+r],["L",t,e-r],["L",t+n,e+r],["z"]]},triangleDown:function(t,e,n){var r=n*Math.sin(1/3*Math.PI);return[["M",t-n,e-r],["L",t+n,e-r],["L",t,e+r],["Z"]]}},x={get:function(t){return b[t]},register:function(t,e){b[t]=e},remove:function(t){delete b[t]},getAll:function(){return b}},w=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="marker",e.canFill=!0,e.canStroke=!0,e}return Object(i.b)(e,t),e.prototype.createPath=function(t){this.get("el").setAttribute("d",this._assembleMarker())},e.prototype._assembleMarker=function(){var t=this._getPath();return Object(h.m)(t)?t.map((function(t){return t.join(" ")})).join(""):t},e.prototype._getPath=function(){var t,e=this.attr(),n=e.x,r=e.y,i=e.r||e.radius,o=e.symbol||"circle";return(t=Object(h.r)(o)?o:x.get(o))?t(n,r,i):(console.warn(t+" symbol is not exist."),null)},e.symbolsFactory=x,e}(l),S=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="path",e.canFill=!0,e.canStroke=!0,e}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{startArrow:!1,endArrow:!1})},e.prototype.createPath=function(t,e){var n=this,r=this.attr(),i=this.get("el");Object(h.f)(e||r,(function(e,o){if("path"===o&&Object(h.m)(e))i.setAttribute("d",n._formatPath(e));else if("startArrow"===o||"endArrow"===o)if(e){var a=Object(h.v)(e)?t.addArrow(r,c.b[o]):t.getDefaultArrow(r,c.b[o]);i.setAttribute(c.b[o],"url(#"+a+")")}else i.removeAttribute(c.b[o]);else c.b[o]&&i.setAttribute(c.b[o],e)}))},e.prototype._formatPath=function(t){var e=t.map((function(t){return t.join(" ")})).join("");return~e.indexOf("NaN")?"":e},e.prototype.getTotalLength=function(){var t=this.get("el");return t?t.getTotalLength():null},e.prototype.getPoint=function(t){var e=this.get("el"),n=this.getTotalLength();if(0===n)return null;var r=e?e.getPointAtLength(t*n):null;return r?{x:r.x,y:r.y}:null},e}(l),E=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="polygon",e.canFill=!0,e.canStroke=!0,e}return Object(i.b)(e,t),e.prototype.createPath=function(t,e){var n=this.attr(),r=this.get("el");Object(h.f)(e||n,(function(t,e){"points"===e&&Object(h.m)(t)&&t.length>=2?r.setAttribute("points",t.map((function(t){return t[0]+","+t[1]})).join(" ")):c.b[e]&&r.setAttribute(c.b[e],t)}))},e}(l),_=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="polyline",e.canFill=!0,e.canStroke=!0,e}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{startArrow:!1,endArrow:!1})},e.prototype.onAttrChange=function(e,n,r){t.prototype.onAttrChange.call(this,e,n,r),-1!==["points"].indexOf(e)&&this._resetCache()},e.prototype._resetCache=function(){this.set("totalLength",null),this.set("tCache",null)},e.prototype.createPath=function(t,e){var n=this.attr(),r=this.get("el");Object(h.f)(e||n,(function(t,e){"points"===e&&Object(h.m)(t)&&t.length>=2?r.setAttribute("points",t.map((function(t){return t[0]+","+t[1]})).join(" ")):c.b[e]&&r.setAttribute(c.b[e],t)}))},e.prototype.getTotalLength=function(){var t=this.attr().points,e=this.get("totalLength");return Object(h.s)(e)?(this.set("totalLength",y.d.length(t)),this.get("totalLength")):e},e.prototype.getPoint=function(t){var e,n,r=this.attr().points,i=this.get("tCache");return i||(this._setTcache(),i=this.get("tCache")),Object(h.f)(i,(function(r,i){t>=r[0]&&t<=r[1]&&(e=(t-r[0])/(r[1]-r[0]),n=i)})),y.c.pointAt(r[n][0],r[n][1],r[n+1][0],r[n+1][1],e)},e.prototype._setTcache=function(){var t=this.attr().points;if(t&&0!==t.length){var e=this.getTotalLength();if(!(e<=0)){var n,r,i=0,o=[];Object(h.f)(t,(function(a,s){t[s+1]&&((n=[])[0]=i/e,r=y.c.length(a[0],a[1],t[s+1][0],t[s+1][1]),i+=r,n[1]=i/e,o.push(n))})),this.set("tCache",o)}}},e.prototype.getStartTangent=function(){var t=this.attr().points,e=[];return e.push([t[1][0],t[1][1]]),e.push([t[0][0],t[0][1]]),e},e.prototype.getEndTangent=function(){var t=this.attr().points,e=t.length-1,n=[];return n.push([t[e-1][0],t[e-1][1]]),n.push([t[e][0],t[e][1]]),n},e}(l);var O=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="rect",e.canFill=!0,e.canStroke=!0,e}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x:0,y:0,width:0,height:0,radius:0})},e.prototype.createPath=function(t,e){var n=this,r=this.attr(),i=this.get("el"),o=!1,a=["x","y","width","height","radius"];Object(h.f)(e||r,(function(t,e){-1===a.indexOf(e)||o?-1===a.indexOf(e)&&c.b[e]&&i.setAttribute(c.b[e],t):(i.setAttribute("d",n._assembleRect(r)),o=!0)}))},e.prototype._assembleRect=function(t){var e=t.x,n=t.y,r=t.width,i=t.height,o=t.radius;if(!o)return"M "+e+","+n+" l "+r+",0 l 0,"+i+" l"+-r+" 0 z";var a=function(t){var e=0,n=0,r=0,i=0;return Object(h.m)(t)?1===t.length?e=n=r=i=t[0]:2===t.length?(e=r=t[0],n=i=t[1]):3===t.length?(e=t[0],n=i=t[1],r=t[2]):(e=t[0],n=t[1],r=t[2],i=t[3]):e=n=r=i=t,{r1:e,r2:n,r3:r,r4:i}}(o);return Object(h.m)(o)?1===o.length?a.r1=a.r2=a.r3=a.r4=o[0]:2===o.length?(a.r1=a.r3=o[0],a.r2=a.r4=o[1]):3===o.length?(a.r1=o[0],a.r2=a.r4=o[1],a.r3=o[2]):(a.r1=o[0],a.r2=o[1],a.r3=o[2],a.r4=o[3]):a.r1=a.r2=a.r3=a.r4=o,[["M "+(e+a.r1)+","+n],["l "+(r-a.r1-a.r2)+",0"],["a "+a.r2+","+a.r2+",0,0,1,"+a.r2+","+a.r2],["l 0,"+(i-a.r2-a.r3)],["a "+a.r3+","+a.r3+",0,0,1,"+-a.r3+","+a.r3],["l "+(a.r3+a.r4-r)+",0"],["a "+a.r4+","+a.r4+",0,0,1,"+-a.r4+","+-a.r4],["l 0,"+(a.r4+a.r1-i)],["a "+a.r1+","+a.r1+",0,0,1,"+a.r1+","+-a.r1],["z"]].join(" ")},e}(l),k=n(139),M={top:"before-edge",middle:"central",bottom:"after-edge",alphabetic:"baseline",hanging:"hanging"},A={top:"text-before-edge",middle:"central",bottom:"text-after-edge",alphabetic:"alphabetic",hanging:"hanging"},T={left:"left",start:"left",center:"middle",right:"end",end:"end"},C=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="text",e.canFill=!0,e.canStroke=!0,e}return Object(i.b)(e,t),e.prototype.getDefaultAttrs=function(){var e=t.prototype.getDefaultAttrs.call(this);return Object(i.a)(Object(i.a)({},e),{x:0,y:0,text:null,fontSize:12,fontFamily:"sans-serif",fontStyle:"normal",fontWeight:"normal",fontVariant:"normal",textAlign:"start",textBaseline:"bottom"})},e.prototype.createPath=function(t,e){var n=this,r=this.attr(),i=this.get("el");this._setFont(),Object(h.f)(e||r,(function(t,e){"text"===e?n._setText(""+t):"matrix"===e&&t?Object(a.c)(n):c.b[e]&&i.setAttribute(c.b[e],t)})),i.setAttribute("paint-order","stroke"),i.setAttribute("style","stroke-linecap:butt; stroke-linejoin:miter;")},e.prototype._setFont=function(){var t=this.get("el"),e=this.attr(),n=e.textBaseline,r=e.textAlign,i=Object(k.a)();i&&"firefox"===i.name?t.setAttribute("dominant-baseline",A[n]||"alphabetic"):t.setAttribute("alignment-baseline",M[n]||"baseline"),t.setAttribute("text-anchor",T[r]||"left")},e.prototype._setText=function(t){var e=this.get("el"),n=this.attr(),r=n.x,i=n.textBaseline,o=void 0===i?"bottom":i;if(t)if(~t.indexOf("\\n")){var a=t.split("\\n"),s=a.length-1,u="";Object(h.f)(a,(function(t,e){0===e?"alphabetic"===o?u+=\'\'+t+"":"top"===o?u+=\'\'+t+"":"middle"===o?u+=\'\'+t+"":"bottom"===o?u+=\'\'+t+"":"hanging"===o&&(u+=\'\'+t+""):u+=\'\'+t+""})),e.innerHTML=u}else e.innerHTML=t;else e.innerHTML=""},e}(l)},function(t,e,n){"use strict";n.r(e),n.d(e,"create",(function(){return i})),n.d(e,"clone",(function(){return o})),n.d(e,"fromValues",(function(){return a})),n.d(e,"copy",(function(){return s})),n.d(e,"set",(function(){return u})),n.d(e,"add",(function(){return c})),n.d(e,"subtract",(function(){return f})),n.d(e,"multiply",(function(){return l})),n.d(e,"divide",(function(){return h})),n.d(e,"ceil",(function(){return d})),n.d(e,"floor",(function(){return p})),n.d(e,"min",(function(){return g})),n.d(e,"max",(function(){return v})),n.d(e,"round",(function(){return y})),n.d(e,"scale",(function(){return m})),n.d(e,"scaleAndAdd",(function(){return b})),n.d(e,"distance",(function(){return x})),n.d(e,"squaredDistance",(function(){return w})),n.d(e,"length",(function(){return S})),n.d(e,"squaredLength",(function(){return E})),n.d(e,"negate",(function(){return _})),n.d(e,"inverse",(function(){return O})),n.d(e,"normalize",(function(){return k})),n.d(e,"dot",(function(){return M})),n.d(e,"cross",(function(){return A})),n.d(e,"lerp",(function(){return T})),n.d(e,"random",(function(){return C})),n.d(e,"transformMat2",(function(){return I})),n.d(e,"transformMat2d",(function(){return P})),n.d(e,"transformMat3",(function(){return j})),n.d(e,"transformMat4",(function(){return D})),n.d(e,"rotate",(function(){return N})),n.d(e,"angle",(function(){return R})),n.d(e,"zero",(function(){return L})),n.d(e,"str",(function(){return B})),n.d(e,"exactEquals",(function(){return G})),n.d(e,"equals",(function(){return F})),n.d(e,"len",(function(){return z})),n.d(e,"sub",(function(){return V})),n.d(e,"mul",(function(){return W})),n.d(e,"div",(function(){return X})),n.d(e,"dist",(function(){return Y})),n.d(e,"sqrDist",(function(){return H})),n.d(e,"sqrLen",(function(){return q})),n.d(e,"forEach",(function(){return K}));var r=n(12);function i(){var t=new r.a(2);return r.a!=Float32Array&&(t[0]=0,t[1]=0),t}function o(t){var e=new r.a(2);return e[0]=t[0],e[1]=t[1],e}function a(t,e){var n=new r.a(2);return n[0]=t,n[1]=e,n}function s(t,e){return t[0]=e[0],t[1]=e[1],t}function u(t,e,n){return t[0]=e,t[1]=n,t}function c(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t}function f(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t}function l(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t}function h(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t}function d(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t}function p(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t}function g(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t}function v(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}function y(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t}function m(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t}function b(t,e,n,r){return t[0]=e[0]+n[0]*r,t[1]=e[1]+n[1]*r,t}function x(t,e){var n=e[0]-t[0],r=e[1]-t[1];return Math.hypot(n,r)}function w(t,e){var n=e[0]-t[0],r=e[1]-t[1];return n*n+r*r}function S(t){var e=t[0],n=t[1];return Math.hypot(e,n)}function E(t){var e=t[0],n=t[1];return e*e+n*n}function _(t,e){return t[0]=-e[0],t[1]=-e[1],t}function O(t,e){return t[0]=1/e[0],t[1]=1/e[1],t}function k(t,e){var n=e[0],r=e[1],i=n*n+r*r;return i>0&&(i=1/Math.sqrt(i)),t[0]=e[0]*i,t[1]=e[1]*i,t}function M(t,e){return t[0]*e[0]+t[1]*e[1]}function A(t,e,n){var r=e[0]*n[1]-e[1]*n[0];return t[0]=t[1]=0,t[2]=r,t}function T(t,e,n,r){var i=e[0],o=e[1];return t[0]=i+r*(n[0]-i),t[1]=o+r*(n[1]-o),t}function C(t,e){e=e||1;var n=2*r.c()*Math.PI;return t[0]=Math.cos(n)*e,t[1]=Math.sin(n)*e,t}function I(t,e,n){var r=e[0],i=e[1];return t[0]=n[0]*r+n[2]*i,t[1]=n[1]*r+n[3]*i,t}function P(t,e,n){var r=e[0],i=e[1];return t[0]=n[0]*r+n[2]*i+n[4],t[1]=n[1]*r+n[3]*i+n[5],t}function j(t,e,n){var r=e[0],i=e[1];return t[0]=n[0]*r+n[3]*i+n[6],t[1]=n[1]*r+n[4]*i+n[7],t}function D(t,e,n){var r=e[0],i=e[1];return t[0]=n[0]*r+n[4]*i+n[12],t[1]=n[1]*r+n[5]*i+n[13],t}function N(t,e,n,r){var i=e[0]-n[0],o=e[1]-n[1],a=Math.sin(r),s=Math.cos(r);return t[0]=i*s-o*a+n[0],t[1]=i*a+o*s+n[1],t}function R(t,e){var n=t[0],r=t[1],i=e[0],o=e[1],a=Math.sqrt(n*n+r*r)*Math.sqrt(i*i+o*o),s=a&&(n*i+r*o)/a;return Math.acos(Math.min(Math.max(s,-1),1))}function L(t){return t[0]=0,t[1]=0,t}function B(t){return"vec2("+t[0]+", "+t[1]+")"}function G(t,e){return t[0]===e[0]&&t[1]===e[1]}function F(t,e){var n=t[0],i=t[1],o=e[0],a=e[1];return Math.abs(n-o)<=r.b*Math.max(1,Math.abs(n),Math.abs(o))&&Math.abs(i-a)<=r.b*Math.max(1,Math.abs(i),Math.abs(a))}var U,z=S,V=f,W=l,X=h,Y=x,H=w,q=E,K=(U=i(),function(t,e,n,r,i,o){var a,s;for(e||(e=2),n||(n=0),s=r?Math.min(r*e+n,t.length):t.length,a=n;a>16&255,t>>8&255,255&t],this.valpha=1;else{this.valpha=1;var d=Object.keys(t);"alpha"in t&&(d.splice(d.indexOf("alpha"),1),this.valpha="number"==typeof t.alpha?t.alpha:0);var g=d.sort().join("");if(!(g in u))throw new Error("Unable to parse color from object: "+JSON.stringify(t));this.model=u[g];var v=o[this.model].labels,y=[];for(n=0;nn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},isDark:function(){var t=this.rgb().color;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},isLight:function(){return!this.isDark()},negate:function(){for(var t=this.rgb(),e=0;e<3;e++)t.color[e]=255-t.color[e];return t},lighten:function(t){var e=this.hsl();return e.color[2]+=e.color[2]*t,e},darken:function(t){var e=this.hsl();return e.color[2]-=e.color[2]*t,e},saturate:function(t){var e=this.hsl();return e.color[1]+=e.color[1]*t,e},desaturate:function(t){var e=this.hsl();return e.color[1]-=e.color[1]*t,e},whiten:function(t){var e=this.hwb();return e.color[1]+=e.color[1]*t,e},blacken:function(t){var e=this.hwb();return e.color[2]+=e.color[2]*t,e},grayscale:function(){var t=this.rgb().color,e=.3*t[0]+.59*t[1]+.11*t[2];return f.rgb(e,e,e)},fade:function(t){return this.alpha(this.valpha-this.valpha*t)},opaquer:function(t){return this.alpha(this.valpha+this.valpha*t)},rotate:function(t){var e=this.hsl(),n=e.color[0];return n=(n=(n+t)%360)<0?360+n:n,e.color[0]=n,e},mix:function(t,e){if(!t||!t.rgb)throw new Error(\'Argument to "mix" was not a Color instance, but rather an instance of \'+r(t));var n=t.rgb(),i=this.rgb(),o=void 0===e?.5:e,a=2*o-1,s=n.alpha()-i.alpha(),u=((a*s==-1?a:(a+s)/(1+a*s))+1)/2,c=1-u;return f.rgb(u*n.red()+c*i.red(),u*n.green()+c*i.green(),u*n.blue()+c*i.blue(),n.alpha()*o+i.alpha()*(1-o))}},Object.keys(o).forEach((function(t){if(-1===s.indexOf(t)){var e=o[t].channels;f.prototype[t]=function(){if(this.model===t)return new f(this);if(arguments.length)return new f(arguments,t);var n="number"==typeof arguments[e]?e:this.valpha;return new f(d(o[this.model][t].raw(this.color)).concat(n),t)},f[t]=function(n){return"number"==typeof n&&(n=p(a.call(arguments),e)),new f(n,t)}}})),t.exports=f},function(t,e,n){var r=n(59),i=n(43);t.exports=function(t){if(!i(t))return!1;var e=r(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},function(t,e,n){var r=n(102),i=n(103);t.exports=function(t,e,n,o){var a=!n;n||(n={});for(var s=-1,u=e.length;++s1&&(n*=Math.sqrt(v),i*=Math.sqrt(v));var y=n*n*(g*g)+i*i*(p*p),m=y?Math.sqrt((n*n*(i*i)-y)/y):1;u===c&&(m*=-1),isNaN(m)&&(m=0);var b=i?m*n*g/i:0,x=n?m*-i*p/n:0,w=(f+h)/2+Math.cos(s)*b-Math.sin(s)*x,S=(l+d)/2+Math.sin(s)*b+Math.cos(s)*x,E=[(p-b)/n,(g-x)/i],_=[(-1*p-b)/n,(-1*g-x)/i],O=a([1,0],E),k=a(E,_);return o(E,_)<=-1&&(k=Math.PI),o(E,_)>=1&&(k=0),0===c&&k>0&&(k-=2*Math.PI),1===c&&k<0&&(k+=2*Math.PI),{cx:w,cy:S,rx:Object(r.j)(t,[h,d])?0:n,ry:Object(r.j)(t,[h,d])?0:i,startAngle:O,endAngle:O+k,xRotation:s,arcFlag:u,sweepFlag:c}}},function(t,e){function n(e){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?t.exports=n=function(t){return typeof t}:t.exports=n=function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(e)}t.exports=n},function(t,e){t.exports=function(t){return null==t}},function(t,e,n){var r;function i(t){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(o){var a=/^\\s+/,s=/\\s+$/,u=0,c=o.round,f=o.min,l=o.max,h=o.random;function d(t,e){if(e=e||{},(t=t||"")instanceof d)return t;if(!(this instanceof d))return new d(t,e);var n=function(t){var e={r:0,g:0,b:0},n=1,r=null,u=null,c=null,h=!1,d=!1;"string"==typeof t&&(t=function(t){t=t.replace(a,"").replace(s,"").toLowerCase();var e,n=!1;if(I[t])t=I[t],n=!0;else if("transparent"==t)return{r:0,g:0,b:0,a:0,format:"name"};if(e=W.rgb.exec(t))return{r:e[1],g:e[2],b:e[3]};if(e=W.rgba.exec(t))return{r:e[1],g:e[2],b:e[3],a:e[4]};if(e=W.hsl.exec(t))return{h:e[1],s:e[2],l:e[3]};if(e=W.hsla.exec(t))return{h:e[1],s:e[2],l:e[3],a:e[4]};if(e=W.hsv.exec(t))return{h:e[1],s:e[2],v:e[3]};if(e=W.hsva.exec(t))return{h:e[1],s:e[2],v:e[3],a:e[4]};if(e=W.hex8.exec(t))return{r:R(e[1]),g:R(e[2]),b:R(e[3]),a:F(e[4]),format:n?"name":"hex8"};if(e=W.hex6.exec(t))return{r:R(e[1]),g:R(e[2]),b:R(e[3]),format:n?"name":"hex"};if(e=W.hex4.exec(t))return{r:R(e[1]+""+e[1]),g:R(e[2]+""+e[2]),b:R(e[3]+""+e[3]),a:F(e[4]+""+e[4]),format:n?"name":"hex8"};if(e=W.hex3.exec(t))return{r:R(e[1]+""+e[1]),g:R(e[2]+""+e[2]),b:R(e[3]+""+e[3]),format:n?"name":"hex"};return!1}(t));"object"==i(t)&&(X(t.r)&&X(t.g)&&X(t.b)?(p=t.r,g=t.g,v=t.b,e={r:255*D(p,255),g:255*D(g,255),b:255*D(v,255)},h=!0,d="%"===String(t.r).substr(-1)?"prgb":"rgb"):X(t.h)&&X(t.s)&&X(t.v)?(r=B(t.s),u=B(t.v),e=function(t,e,n){t=6*D(t,360),e=D(e,100),n=D(n,100);var r=o.floor(t),i=t-r,a=n*(1-e),s=n*(1-i*e),u=n*(1-(1-i)*e),c=r%6;return{r:255*[n,s,a,a,u,n][c],g:255*[u,n,n,s,a,a][c],b:255*[a,a,u,n,n,s][c]}}(t.h,r,u),h=!0,d="hsv"):X(t.h)&&X(t.s)&&X(t.l)&&(r=B(t.s),c=B(t.l),e=function(t,e,n){var r,i,o;function a(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}if(t=D(t,360),e=D(e,100),n=D(n,100),0===e)r=i=o=n;else{var s=n<.5?n*(1+e):n+e-n*e,u=2*n-s;r=a(u,s,t+1/3),i=a(u,s,t),o=a(u,s,t-1/3)}return{r:255*r,g:255*i,b:255*o}}(t.h,r,c),h=!0,d="hsl"),t.hasOwnProperty("a")&&(n=t.a));var p,g,v;return n=j(n),{ok:h,format:t.format||d,r:f(255,l(e.r,0)),g:f(255,l(e.g,0)),b:f(255,l(e.b,0)),a:n}}(t);this._originalInput=t,this._r=n.r,this._g=n.g,this._b=n.b,this._a=n.a,this._roundA=c(100*this._a)/100,this._format=e.format||n.format,this._gradientType=e.gradientType,this._r<1&&(this._r=c(this._r)),this._g<1&&(this._g=c(this._g)),this._b<1&&(this._b=c(this._b)),this._ok=n.ok,this._tc_id=u++}function p(t,e,n){t=D(t,255),e=D(e,255),n=D(n,255);var r,i,o=l(t,e,n),a=f(t,e,n),s=(o+a)/2;if(o==a)r=i=0;else{var u=o-a;switch(i=s>.5?u/(2-o-a):u/(o+a),o){case t:r=(e-n)/u+(e>1)+720)%360;--e;)r.h=(r.h+i)%360,o.push(d(r));return o}function C(t,e){e=e||6;for(var n=d(t).toHsv(),r=n.h,i=n.s,o=n.v,a=[],s=1/e;e--;)a.push(d({h:r,s:i,v:o})),o=(o+s)%1;return a}d.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t,e,n,r=this.toRgb();return t=r.r/255,e=r.g/255,n=r.b/255,.2126*(t<=.03928?t/12.92:o.pow((t+.055)/1.055,2.4))+.7152*(e<=.03928?e/12.92:o.pow((e+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:o.pow((n+.055)/1.055,2.4))},setAlpha:function(t){return this._a=j(t),this._roundA=c(100*this._a)/100,this},toHsv:function(){var t=g(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=g(this._r,this._g,this._b),e=c(360*t.h),n=c(100*t.s),r=c(100*t.v);return 1==this._a?"hsv("+e+", "+n+"%, "+r+"%)":"hsva("+e+", "+n+"%, "+r+"%, "+this._roundA+")"},toHsl:function(){var t=p(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=p(this._r,this._g,this._b),e=c(360*t.h),n=c(100*t.s),r=c(100*t.l);return 1==this._a?"hsl("+e+", "+n+"%, "+r+"%)":"hsla("+e+", "+n+"%, "+r+"%, "+this._roundA+")"},toHex:function(t){return v(this._r,this._g,this._b,t)},toHexString:function(t){return"#"+this.toHex(t)},toHex8:function(t){return function(t,e,n,r,i){var o=[L(c(t).toString(16)),L(c(e).toString(16)),L(c(n).toString(16)),L(G(r))];if(i&&o[0].charAt(0)==o[0].charAt(1)&&o[1].charAt(0)==o[1].charAt(1)&&o[2].charAt(0)==o[2].charAt(1)&&o[3].charAt(0)==o[3].charAt(1))return o[0].charAt(0)+o[1].charAt(0)+o[2].charAt(0)+o[3].charAt(0);return o.join("")}(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return"#"+this.toHex8(t)},toRgb:function(){return{r:c(this._r),g:c(this._g),b:c(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+c(this._r)+", "+c(this._g)+", "+c(this._b)+")":"rgba("+c(this._r)+", "+c(this._g)+", "+c(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:c(100*D(this._r,255))+"%",g:c(100*D(this._g,255))+"%",b:c(100*D(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+c(100*D(this._r,255))+"%, "+c(100*D(this._g,255))+"%, "+c(100*D(this._b,255))+"%)":"rgba("+c(100*D(this._r,255))+"%, "+c(100*D(this._g,255))+"%, "+c(100*D(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(P[v(this._r,this._g,this._b,!0)]||!1)},toFilter:function(t){var e="#"+y(this._r,this._g,this._b,this._a),n=e,r=this._gradientType?"GradientType = 1, ":"";if(t){var i=d(t);n="#"+y(i._r,i._g,i._b,i._a)}return"progid:DXImageTransform.Microsoft.gradient("+r+"startColorstr="+e+",endColorstr="+n+")"},toString:function(t){var e=!!t;t=t||this._format;var n=!1,r=this._a<1&&this._a>=0;return e||!r||"hex"!==t&&"hex6"!==t&&"hex3"!==t&&"hex4"!==t&&"hex8"!==t&&"name"!==t?("rgb"===t&&(n=this.toRgbString()),"prgb"===t&&(n=this.toPercentageRgbString()),"hex"!==t&&"hex6"!==t||(n=this.toHexString()),"hex3"===t&&(n=this.toHexString(!0)),"hex4"===t&&(n=this.toHex8String(!0)),"hex8"===t&&(n=this.toHex8String()),"name"===t&&(n=this.toName()),"hsl"===t&&(n=this.toHslString()),"hsv"===t&&(n=this.toHsvString()),n||this.toHexString()):"name"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return d(this.toString())},_applyModification:function(t,e){var n=t.apply(null,[this].concat([].slice.call(e)));return this._r=n._r,this._g=n._g,this._b=n._b,this.setAlpha(n._a),this},lighten:function(){return this._applyModification(w,arguments)},brighten:function(){return this._applyModification(S,arguments)},darken:function(){return this._applyModification(E,arguments)},desaturate:function(){return this._applyModification(m,arguments)},saturate:function(){return this._applyModification(b,arguments)},greyscale:function(){return this._applyModification(x,arguments)},spin:function(){return this._applyModification(_,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(T,arguments)},complement:function(){return this._applyCombination(O,arguments)},monochromatic:function(){return this._applyCombination(C,arguments)},splitcomplement:function(){return this._applyCombination(A,arguments)},triad:function(){return this._applyCombination(k,arguments)},tetrad:function(){return this._applyCombination(M,arguments)}},d.fromRatio=function(t,e){if("object"==i(t)){var n={};for(var r in t)t.hasOwnProperty(r)&&(n[r]="a"===r?t[r]:B(t[r]));t=n}return d(t,e)},d.equals=function(t,e){return!(!t||!e)&&d(t).toRgbString()==d(e).toRgbString()},d.random=function(){return d.fromRatio({r:h(),g:h(),b:h()})},d.mix=function(t,e,n){n=0===n?0:n||50;var r=d(t).toRgb(),i=d(e).toRgb(),o=n/100;return d({r:(i.r-r.r)*o+r.r,g:(i.g-r.g)*o+r.g,b:(i.b-r.b)*o+r.b,a:(i.a-r.a)*o+r.a})},d.readability=function(t,e){var n=d(t),r=d(e);return(o.max(n.getLuminance(),r.getLuminance())+.05)/(o.min(n.getLuminance(),r.getLuminance())+.05)},d.isReadable=function(t,e,n){var r,i,o=d.readability(t,e);switch(i=!1,(r=function(t){var e,n;e=((t=t||{level:"AA",size:"small"}).level||"AA").toUpperCase(),n=(t.size||"small").toLowerCase(),"AA"!==e&&"AAA"!==e&&(e="AA");"small"!==n&&"large"!==n&&(n="small");return{level:e,size:n}}(n)).level+r.size){case"AAsmall":case"AAAlarge":i=o>=4.5;break;case"AAlarge":i=o>=3;break;case"AAAsmall":i=o>=7}return i},d.mostReadable=function(t,e,n){var r,i,o,a,s=null,u=0;i=(n=n||{}).includeFallbackColors,o=n.level,a=n.size;for(var c=0;cu&&(u=r,s=d(e[c]));return d.isReadable(t,s,{level:o,size:a})||!i?s:(n.includeFallbackColors=!1,d.mostReadable(t,["#fff","#000"],n))};var I=d.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},P=d.hexNames=function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=n);return e}(I);function j(t){return t=parseFloat(t),(isNaN(t)||t<0||t>1)&&(t=1),t}function D(t,e){(function(t){return"string"==typeof t&&-1!=t.indexOf(".")&&1===parseFloat(t)})(t)&&(t="100%");var n=function(t){return"string"==typeof t&&-1!=t.indexOf("%")}(t);return t=f(e,l(0,parseFloat(t))),n&&(t=parseInt(t*e,10)/100),o.abs(t-e)<1e-6?1:t%e/parseFloat(e)}function N(t){return f(1,l(0,t))}function R(t){return parseInt(t,16)}function L(t){return 1==t.length?"0"+t:""+t}function B(t){return t<=1&&(t=100*t+"%"),t}function G(t){return o.round(255*parseFloat(t)).toString(16)}function F(t){return R(t)/255}var U,z,V,W=(z="[\\\\s|\\\\(]+("+(U="(?:[-\\\\+]?\\\\d*\\\\.\\\\d+%?)|(?:[-\\\\+]?\\\\d+%?)")+")[,|\\\\s]+("+U+")[,|\\\\s]+("+U+")\\\\s*\\\\)?",V="[\\\\s|\\\\(]+("+U+")[,|\\\\s]+("+U+")[,|\\\\s]+("+U+")[,|\\\\s]+("+U+")\\\\s*\\\\)?",{CSS_UNIT:new RegExp(U),rgb:new RegExp("rgb"+z),rgba:new RegExp("rgba"+V),hsl:new RegExp("hsl"+z),hsla:new RegExp("hsla"+V),hsv:new RegExp("hsv"+z),hsva:new RegExp("hsva"+V),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function X(t){return!!W.CSS_UNIT.exec(t)}t.exports?t.exports=d:void 0===(r=function(){return d}.call(e,n,e,t))||(t.exports=r)}(Math)},function(t,e,n){t.exports={EPSILON:n(253),create:n(254),clone:n(497),fromValues:n(498),copy:n(499),set:n(255),equals:n(500),exactEquals:n(501),add:n(256),subtract:n(167),sub:n(502),multiply:n(257),mul:n(503),divide:n(258),div:n(504),inverse:n(505),min:n(506),max:n(507),rotate:n(508),floor:n(509),ceil:n(510),round:n(511),scale:n(512),scaleAndAdd:n(513),distance:n(259),dist:n(514),squaredDistance:n(260),sqrDist:n(515),length:n(261),len:n(516),squaredLength:n(262),sqrLen:n(517),negate:n(518),normalize:n(263),dot:n(264),cross:n(519),lerp:n(520),random:n(521),transformMat2:n(522),transformMat2d:n(523),transformMat3:n(524),transformMat4:n(525),forEach:n(526),limit:n(527)}},function(t,e,n){var r=n(98),i=n(296),o=n(297),a=n(298),s=n(299),u=n(300);function c(t){var e=this.__data__=new r(t);this.size=e.size}c.prototype.clear=i,c.prototype.delete=o,c.prototype.get=a,c.prototype.has=s,c.prototype.set=u,t.exports=c},function(t,e,n){var r=n(291),i=n(292),o=n(293),a=n(294),s=n(295);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t0&&void 0!==arguments[0]?arguments[0]:{vertexCount:3},e=t.vertexCount,n=Object(E.createEntity)();return this.geometry.create(n,{vertexCount:e})}},{key:"createInstancedBufferGeometry",value:function(t){var e=t.maxInstancedCount,n=t.vertexCount,r=Object(E.createEntity)();return this.geometry.create(r,{maxInstancedCount:e,vertexCount:n})}}]),t}(),u=w()(s.prototype,"geometry",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=w()(s.prototype,"engine",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a=s))||a)},function(t,e,n){"use strict";n.d(e,"a",(function(){return w}));var r=n(4),i=n.n(r),o=n(6),a=n.n(o),s=n(7),u=n.n(s),c=n(22),f=n.n(c),l=n(23),h=n.n(l),d=n(24),p=n.n(d),g=n(17),v=n.n(g),y=n(3);function m(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function b(t){for(var e=1;e=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,o=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw o}}}}function D(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n0)return I.b.OUTSIDE;A.e.dot(u,t.getPositiveFarPoint(n[i]))+c>0&&(r|=a)}}return r}}]),t}(),l=M()(f.prototype,"mesh",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=M()(f.prototype,"cullable",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=M()(f.prototype,"geometry",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=M()(f.prototype,"hierarchy",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=M()(f.prototype,"transform",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=f))||c)},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(6),i=n.n(r),o=n(7),a=n.n(o),s=n(2),u=function(){function t(e,n){i()(this,t),this.distance=void 0,this.normal=void 0,this.pnVertexFlag=void 0,this.distance=e||0,this.normal=n||s.e.fromValues(0,1,0),this.updatePNVertexFlag()}return a()(t,[{key:"updatePNVertexFlag",value:function(){this.pnVertexFlag=(Number(this.normal[0]>=0)<<8)+(Number(this.normal[1]>=0)<<4)+Number(this.normal[2]>=0)}},{key:"distanceToPoint",value:function(t){return s.e.dot(t,this.normal)-this.distance}},{key:"normalize",value:function(){var t=1/s.e.len(this.normal);s.e.scale(this.normal,this.normal,t),this.distance*=t}},{key:"intersectsLine",value:function(t,e,n){var r=this.distanceToPoint(t),i=r/(r-this.distanceToPoint(e)),o=i>=0&&i<=1;return o&&n&&s.e.lerp(n,t,e,i),o}}]),t}()},function(t,e,n){"use strict";n.d(e,"a",(function(){return P}));var r,i,o,a,s,u,c,f,l,h,d,p,g=n(9),v=n.n(g),y=n(14),m=n.n(y),b=n(10),x=n.n(b),w=n(6),S=n.n(w),E=n(7),_=n.n(E),O=n(11),k=n.n(O),M=(n(28),n(5)),A=n(13),T=n(84),C=n(70),I=n(50),P=(r=Object(M.injectable)(),i=Object(M.inject)(A.a.Systems),o=Object(M.named)(A.a.FrameGraphSystem),a=Object(M.inject)(A.a.RenderPassFactory),s=Object(M.inject)(A.a.ConfigService),u=Object(M.inject)(A.a.ResourcePool),r((f=function(){function t(){S()(this,t),x()(this,"frameGraphSystem",l,this),x()(this,"renderPassFactory",h,this),x()(this,"configService",d,this),x()(this,"resourcePool",p,this)}var e;return _()(t,[{key:"execute",value:(e=m()(v.a.mark((function t(e){var n,r,i,o,a,s,u,c;return v.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:n=this.renderPassFactory(I.a.IDENTIFIER),r=n.setup,i=n.execute,this.frameGraphSystem.addPass(I.a.IDENTIFIER,r,i),o=this.renderPassFactory(T.a.IDENTIFIER),a=o.setup,s=o.execute,u=o.tearDown,c=this.frameGraphSystem.addPass(T.a.IDENTIFIER,a,s,u),this.frameGraphSystem.present(c.data.output);case 5:case"end":return t.stop()}}),t,this)}))),function(t){return e.apply(this,arguments)})},{key:"tearDown",value:function(){this.resourcePool.clean()}},{key:"pick",value:function(t,e){return this.renderPassFactory(C.a.IDENTIFIER).pick(t,e)}}]),t}(),l=k()(f.prototype,"frameGraphSystem",[i,o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=k()(f.prototype,"renderPassFactory",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=k()(f.prototype,"configService",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=k()(f.prototype,"resourcePool",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=f))||c)},function(t,e,n){"use strict";n.d(e,"a",(function(){return p}));var r=n(6),i=n.n(r),o=n(22),a=n.n(o),s=n(23),u=n.n(s),c=n(24),f=n.n(c),l=n(17),h=n.n(l);function d(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,r=h()(t);if(e){var i=h()(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return f()(this,n)}}var p=function(t){u()(n,t);var e=d(n);function n(t){var r;return i()(this,n),(r=e.call(this,t)).parentID=void 0,Object.assign(a()(r),t),r}return n}(n(3).Component)},function(t,e,n){"use strict";n.d(e,"a",(function(){return M}));var r,i,o,a,s,u,c,f,l,h=n(9),d=n.n(h),p=n(14),g=n.n(p),v=n(10),y=n.n(v),m=n(6),b=n.n(m),x=n(7),w=n.n(x),S=n(11),E=n.n(S),_=(n(28),n(2)),O=n(5),k=n(13),M=(r=Object(O.injectable)(),i=Object(O.inject)(k.a.HierarchyComponentManager),o=Object(O.inject)(k.a.TransformComponentManager),a=Object(O.inject)(k.a.MeshComponentManager),r((u=function(){function t(){b()(this,t),y()(this,"hierarchy",c,this),y()(this,"transform",f,this),y()(this,"mesh",l,this)}var e;return w()(t,[{key:"execute",value:(e=g()(d.a.mark((function t(){return d.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:this.runTransformUpdateSystem(),this.runHierarchyUpdateSystem();case 2:case"end":return t.stop()}}),t,this)}))),function(){return e.apply(this,arguments)})},{key:"tearDown",value:function(){this.hierarchy.clear(),this.transform.clear()}},{key:"getHierarchyComponentManager",value:function(){return this.hierarchy}},{key:"getTransformComponentManager",value:function(){return this.transform}},{key:"runTransformUpdateSystem",value:function(){var t=this;this.transform.forEach((function(e,n){(n.isDirty()||n.isLocalDirty())&&(t.setMeshAABBDirty(t.mesh.getComponentByEntity(e)),n.updateTransform())}))}},{key:"runHierarchyUpdateSystem",value:function(){var t=this;this.hierarchy.forEach((function(e,n){var r=t.transform.getComponentByEntity(e),i=t.transform.getComponentByEntity(n.parentID);null!==r&&null!==i&&r.updateTransformWithParent(i)}))}},{key:"attach",value:function(t,e,n){this.hierarchy.contains(t)&&this.detach(t),this.hierarchy.create(t,{parentID:e});var r=this.mesh.getComponentByEntity(e);if(this.setMeshAABBDirty(r),r&&-1===r.children.indexOf(t)&&r.children.push(t),this.hierarchy.getCount()>1)for(var i=this.hierarchy.getCount()-1;i>0;--i)for(var o=this.hierarchy.getEntity(i),a=0;a0&&void 0!==arguments[0])||arguments[0];t?this.dirtyFlag|=n.DIRTY:this.dirtyFlag&=~n.DIRTY}},{key:"isLocalDirty",value:function(){return this.localDirtyFlag}},{key:"setLocalDirty",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];t?(this.localDirtyFlag|=n.DIRTY,this.setDirty(!0)):this.localDirtyFlag&=~n.DIRTY}},{key:"updateTransform",value:function(){this.isLocalDirty()&&this.getLocalTransform(),this.isDirty()&&null===this.parent&&(g.b.copy(this.worldTransform,this.getLocalTransform()),this.setDirty(!1))}},{key:"updateTransformWithParent",value:function(t){g.b.multiply(this.worldTransform,t.worldTransform,this.getLocalTransform())}},{key:"applyTransform",value:function(){this.setDirty(),g.b.getScaling(this.localScale,this.worldTransform),g.b.getTranslation(this.localPosition,this.worldTransform),g.b.getRotation(this.localRotation,this.worldTransform)}},{key:"clearTransform",value:function(){this.setDirty(),this.localPosition=g.e.fromValues(0,0,0),this.localRotation=g.c.fromValues(0,0,0,1),this.localScale=g.e.fromValues(1,1,1)}},{key:"scaleLocal",value:function(t){return this.setLocalDirty(),g.e.multiply(this.localScale,this.localScale,t),this}},{key:"getLocalPosition",value:function(){return this.localPosition}},{key:"getLocalRotation",value:function(){return this.localRotation}},{key:"getLocalScale",value:function(){return this.localScale}},{key:"getLocalTransform",value:function(){return this.localDirtyFlag&&(g.b.fromRotationTranslationScale(this.localTransform,this.localRotation,this.localPosition,this.localScale),this.setLocalDirty(!1)),this.localTransform}},{key:"getWorldTransform",value:function(){return this.isLocalDirty()||this.isDirty()?(this.parent&&this.parent.getWorldTransform(),this.updateTransform(),this.worldTransform):this.worldTransform}},{key:"getPosition",value:function(){return g.b.getTranslation(this.position,this.worldTransform),this.position}},{key:"getRotation",value:function(){return g.b.getRotation(this.rotation,this.worldTransform),this.rotation}},{key:"getScale",value:function(){return g.b.getScaling(this.scaling,this.worldTransform),this.scaling}}]),n}(n(35).a);y.DIRTY=1},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r,i=n(6),o=n.n(i),a=n(7),s=n.n(a),u=n(5),c=Object(u.injectable)()(r=function(){function t(){o()(this,t),this.config=void 0}return s()(t,[{key:"get",value:function(){return this.config}},{key:"set",value:function(t){this.config=t}}]),t}())||r},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r,i=n(6),o=n.n(i),a=n(7),s=n.n(a),u=n(5),c=Object(u.injectable)()(r=function(){function t(){o()(this,t)}return s()(t,[{key:"listen",value:function(t){}},{key:"on",value:function(t,e){}},{key:"connect",value:function(){}},{key:"disconnect",value:function(){}},{key:"destroy",value:function(){}}]),t}())||r},function(t,e,n){"use strict";n.d(e,"a",(function(){return B}));var r=n(62),i=n.n(r),o=n(9),a=n.n(o),s=n(14),u=n.n(s),c=n(10),f=n.n(c),l=n(6),h=n.n(l),d=n(7),p=n.n(d),g=n(11),v=n.n(g),y=(n(28),n(5)),m=n(13),b=function t(){h()(this,t),this.index=void 0},x=function t(){h()(this,t),this.name=void 0,this.data=void 0,this.execute=void 0,this.tearDown=void 0},w=function(){function t(){h()(this,t),this.name=void 0,this.refCount=0,this.hasSideEffect=!1,this.devirtualize=[],this.destroy=[],this.reads=[],this.writes=[]}return p()(t,[{key:"read",value:function(t){return this.reads.find((function(e){return e.index===t.index}))||this.reads.push(t),t}},{key:"sample",value:function(t){return this.read(t),t}},{key:"write",value:function(t,e){if(this.writes.find((function(t){return t.index===e.index})))return e;var n=t.getResourceNode(e);n.resource.version++,n.resource.imported&&(this.hasSideEffect=!0);var r=t.createResourceNode(n.resource);return t.getResourceNode(r).writer=this,this.writes.push(r),r}}]),t}(),S=n(23),E=n.n(S),_=n(24),O=n.n(_),k=n(17),M=n.n(k);function A(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,r=M()(t);if(e){var i=M()(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return O()(this,n)}}var T,C,I,P,j,D=function(t){E()(n,t);var e=A(n);function n(){var t;h()(this,n);for(var r=arguments.length,i=new Array(r),o=0;o=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,o=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw o}}}}function L(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n1&&(a=i[1].trim()),n){case"bool":a="true"===a;break;case"float":case"int":a=Number(a);break;case"vec2":case"vec3":case"vec4":case"ivec2":case"ivec3":case"ivec4":case"mat2":case"mat3":case"mat4":a=a?a.replace("[","").replace("]","").split(",").reduce((function(t,e){return t.push(Number(e.trim())),t}),[]):new Array(function(t){var e=0;switch(t){case"vec2":case"ivec2":e=2;break;case"vec3":case"ivec3":e=3;break;case"vec4":case"ivec4":case"mat2":e=4;break;case"mat3":e=9;break;case"mat4":e=16}return e}(n)).fill(0)}return e[o]=a,"uniform ".concat(n," ").concat(o,";\\n")})),uniforms:e}}function g(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function v(t){for(var e=1;e 0.0 ) p = vec2(p.x-k*p.y,-k*p.x-p.y)/2.0;\\n p.x -= clamp( p.x, -2.0, 0.0 );\\n return -length(p)*sign(p.y);\\n}\\n\\nfloat sdBox(vec2 p, vec2 b) {\\n vec2 d = abs(p)-b;\\n return length(max(d,vec2(0))) + min(max(d.x,d.y),0.0);\\n}\\n\\nfloat sdPentagon(vec2 p, float r) {\\n vec3 k = vec3(0.809016994,0.587785252,0.726542528);\\n p.x = abs(p.x);\\n p -= 2.0*min(dot(vec2(-k.x,k.y),p),0.0)*vec2(-k.x,k.y);\\n p -= 2.0*min(dot(vec2( k.x,k.y),p),0.0)*vec2( k.x,k.y);\\n p -= vec2(clamp(p.x,-r*k.z,r*k.z),r);\\n return length(p)*sign(p.y);\\n}\\n\\nfloat sdHexagon(vec2 p, float r) {\\n vec3 k = vec3(-0.866025404,0.5,0.577350269);\\n p = abs(p);\\n p -= 2.0*min(dot(k.xy,p),0.0)*k.xy;\\n p -= vec2(clamp(p.x, -k.z*r, k.z*r), r);\\n return length(p)*sign(p.y);\\n}\\n\\nfloat sdOctogon(vec2 p, float r) {\\n vec3 k = vec3(-0.9238795325, 0.3826834323, 0.4142135623 );\\n p = abs(p);\\n p -= 2.0*min(dot(vec2( k.x,k.y),p),0.0)*vec2( k.x,k.y);\\n p -= 2.0*min(dot(vec2(-k.x,k.y),p),0.0)*vec2(-k.x,k.y);\\n p -= vec2(clamp(p.x, -k.z*r, k.z*r), r);\\n return length(p)*sign(p.y);\\n}\\n\\nfloat sdHexagram(vec2 p, float r) {\\n vec4 k=vec4(-0.5,0.8660254038,0.5773502692,1.7320508076);\\n p = abs(p);\\n p -= 2.0*min(dot(k.xy,p),0.0)*k.xy;\\n p -= 2.0*min(dot(k.yx,p),0.0)*k.yx;\\n p -= vec2(clamp(p.x,r*k.z,r*k.w),r);\\n return length(p)*sign(p.y);\\n}\\n\\nfloat sdRhombus(vec2 p, vec2 b) {\\n vec2 q = abs(p);\\n float h = clamp((-2.0*ndot(q,b)+ndot(b,b))/dot(b,b),-1.0,1.0);\\n float d = length( q - 0.5*b*vec2(1.0-h,1.0+h) );\\n return d * sign( q.x*b.y + q.y*b.x - b.x*b.y );\\n}\\n\\nfloat sdVesica(vec2 p, float r, float d) {\\n p = abs(p);\\n float b = sqrt(r*r-d*d); // can delay this sqrt\\n return ((p.y-b)*d>p.x*b)\\n ? length(p-vec2(0.0,b))\\n : length(p-vec2(-d,0.0))-r;\\n}"})}},{key:"registerModule",value:function(t,e){if(!this.rawContentCache[t]){var n=e.vs,r=void 0===n?"":n,i=e.fs,o=void 0===i?"":i,a=e.uniforms,s=p(r),u=s.content,c=s.uniforms,f=p(o),l=f.content,h=f.uniforms;this.rawContentCache[t]={fs:l,uniforms:v(v(v({},c),h),a),vs:u}}}},{key:"destroy",value:function(){this.moduleCache={},this.rawContentCache={}}},{key:"getModule",value:function(t){var e=this;if(this.moduleCache[t])return this.moduleCache[t];var n=this.rawContentCache[t].vs||"",r=this.rawContentCache[t].fs||"",i=this.processModule(n,[],"vs"),o=i.content,a=i.includeList,s=this.processModule(r,[],"fs"),u=s.content,c=s.includeList,l=u,h=f()(a.concat(c).concat(t)).reduce((function(t,n){return v(v({},t),e.rawContentCache[n].uniforms)}),{});return y.test(u)||(l="#ifdef GL_FRAGMENT_PRECISION_HIGH\\n precision highp float;\\n #else\\n precision mediump float;\\n#endif\\n"+u),this.moduleCache[t]={fs:l.trim(),uniforms:h,vs:o.trim()},this.moduleCache[t]}},{key:"processModule",value:function(t,e,n){var r=this;return{content:t.replace(m,(function(t,i){var o=i.split(" ")[0].replace(/"/g,"");if(e.indexOf(o)>-1)return"";var a=r.rawContentCache[o][n];return e.push(o),r.processModule(a||"",e,n).content})),includeList:e}}}]),t}())||h},function(t,e,n){"use strict";var r=function(){function t(){this._events={}}return t.prototype.on=function(t,e,n){return this._events[t]||(this._events[t]=[]),this._events[t].push({callback:e,once:!!n}),this},t.prototype.once=function(t,e){return this.on(t,e,!0),this},t.prototype.emit=function(t){for(var e=this,n=[],r=1;r0)}));return s.length>0?(Object(o.a)(s,(function(t){var e=t.getBBox();i.push(e.minX,e.maxX),a.push(e.minY,e.maxY)})),t=Math.min.apply(null,i),e=Math.max.apply(null,i),n=Math.min.apply(null,a),r=Math.max.apply(null,a)):(t=0,e=0,n=0,r=0),{x:t,y:n,minX:t,minY:n,maxX:e,maxY:r,width:e-t,height:r-n}},e.prototype.getCanvasBBox=function(){var t=1/0,e=-1/0,n=1/0,r=-1/0,i=[],a=[],s=this.getChildren().filter((function(t){return t.get("visible")&&(!t.isGroup()||t.isGroup()&&t.getChildren().length>0)}));return s.length>0?(Object(o.a)(s,(function(t){var e=t.getCanvasBBox();i.push(e.minX,e.maxX),a.push(e.minY,e.maxY)})),t=Math.min.apply(null,i),e=Math.max.apply(null,i),n=Math.min.apply(null,a),r=Math.max.apply(null,a)):(t=0,e=0,n=0,r=0),{x:t,y:n,minX:t,minY:n,maxX:e,maxY:r,width:e-t,height:r-n}},e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.children=[],e},e.prototype.onAttrChange=function(e,n,r){if(t.prototype.onAttrChange.call(this,e,n,r),"matrix"===e){var i=this.getTotalMatrix();this._applyChildrenMarix(i)}},e.prototype.applyMatrix=function(e){var n=this.getTotalMatrix();t.prototype.applyMatrix.call(this,e);var r=this.getTotalMatrix();r!==n&&this._applyChildrenMarix(r)},e.prototype._applyChildrenMarix=function(t){var e=this.getChildren();Object(o.a)(e,(function(e){e.applyMatrix(t)}))},e.prototype.addShape=function(){for(var t=[],e=0;e=0;a--){var s=t[a];if(Object(o.b)(s)&&(s.isGroup()?i=s.getShape(e,n,r):s.isHit(e,n)&&(i=s)),i)break}return i},e.prototype.add=function(t){var e=this.getCanvas(),n=this.getChildren(),r=this.get("timeline"),i=t.getParent();i&&function(t,e,n){void 0===n&&(n=!0),n?e.destroy():(e.set("parent",null),e.set("canvas",null)),Object(o.j)(t.getChildren(),e)}(i,t,!1),t.set("parent",this),e&&function t(e,n){if(e.set("canvas",n),e.isGroup()){var r=e.get("children");r.length&&r.forEach((function(e){t(e,n)}))}}(t,e),r&&function t(e,n){if(e.set("timeline",n),e.isGroup()){var r=e.get("children");r.length&&r.forEach((function(e){t(e,n)}))}}(t,r),n.push(t),t.onCanvasChange("add"),this._applyElementMatrix(t)},e.prototype._applyElementMatrix=function(t){var e=this.getTotalMatrix();e&&t.applyMatrix(e)},e.prototype.getChildren=function(){return this.get("children")},e.prototype.sort=function(){var t,e=this.getChildren();Object(o.a)(e,(function(t,e){return t._INDEX=e,t})),e.sort((t=function(t,e){return t.get("zIndex")-e.get("zIndex")},function(e,n){var r=t(e,n);return 0===r?e._INDEX-n._INDEX:r})),this.onCanvasChange("sort")},e.prototype.clear=function(){if(this.set("clearing",!0),!this.destroyed){for(var t=this.getChildren(),e=t.length-1;e>=0;e--)t[e].destroy();this.set("children",[]),this.onCanvasChange("clear"),this.set("clearing",!1)}},e.prototype.destroy=function(){this.get("destroyed")||(this.clear(),t.prototype.destroy.call(this))},e.prototype.getFirst=function(){return this.getChildByIndex(0)},e.prototype.getLast=function(){var t=this.getChildren();return this.getChildByIndex(t.length-1)},e.prototype.getChildByIndex=function(t){return this.getChildren()[t]},e.prototype.getCount=function(){return this.getChildren().length},e.prototype.contain=function(t){return this.getChildren().indexOf(t)>-1},e.prototype.removeChild=function(t,e){void 0===e&&(e=!0),this.contain(t)&&t.remove(e)},e.prototype.findAll=function(t){var e=[],n=this.getChildren();return Object(o.a)(n,(function(n){t(n)&&e.push(n),n.isGroup()&&(e=e.concat(n.findAll(t)))})),e},e.prototype.find=function(t){var e=null,n=this.getChildren();return Object(o.a)(n,(function(n){if(t(n)?e=n:n.isGroup()&&(e=n.find(t)),e)return!1})),e},e.prototype.findById=function(t){return this.find((function(e){return e.get("id")===t}))},e.prototype.findByClassName=function(t){return this.find((function(e){return e.get("className")===t}))},e.prototype.findAllByName=function(t){return this.findAll((function(e){return e.get("name")===t}))},e}(i.a);e.a=s},function(t,e,n){"use strict";var r=n(1),i=n(0),o=n(18),a=n(19),s=n(39),u=n(117),c=o.a.transform,f=["zIndex","capture","visible","type"],l=["repeat"];function h(t,e){var n={},r=e.attrs;for(var i in t)n[i]=r[i];return n}function d(t,e){var n={},r=e.attr();return Object(i.f)(t,(function(t,e){-1!==l.indexOf(e)||Object(i.q)(r[e],t)||(n[e]=t)})),n}function p(t,e){if(e.onFrame)return t;var n=e.startTime,r=e.delay,o=e.duration,a=Object.prototype.hasOwnProperty;return Object(i.f)(t,(function(t){n+rt.delay&&Object(i.f)(e.toAttrs,(function(e,n){a.call(t.toAttrs,n)&&(delete t.toAttrs[n],delete t.fromAttrs[n])}))})),t}var g=function(t){function e(e){var n=t.call(this,e)||this;n.attrs={};var r=n.getDefaultAttrs();return Object(i.A)(r,e.attrs),n.attrs=r,n.initAttrs(r),n.initAnimate(),n}return Object(r.b)(e,t),e.prototype.getDefaultCfg=function(){return{visible:!0,capture:!0,zIndex:0}},e.prototype.getDefaultAttrs=function(){return{matrix:this.getDefaultMatrix(),opacity:1}},e.prototype.onCanvasChange=function(t){},e.prototype.initAttrs=function(t){},e.prototype.initAnimate=function(){this.set("animable",!0),this.set("animating",!1)},e.prototype.isGroup=function(){return!1},e.prototype.getParent=function(){return this.get("parent")},e.prototype.getCanvas=function(){return this.get("canvas")},e.prototype.attr=function(){for(var t,e=[],n=0;n0?o=p(o,E):r.addAnimator(this),o.push(E),this.set("animations",o),this.set("_pause",{isPaused:!1})}},e.prototype.stopAnimate=function(t){var e=this;void 0===t&&(t=!0);var n=this.get("animations");Object(i.f)(n,(function(n){t&&(n.onFrame?e.attr(n.onFrame(1)):e.attr(n.toAttrs)),n.callback&&n.callback()})),this.set("animating",!1),this.set("animations",[])},e.prototype.pauseAnimate=function(){var t=this.get("timeline"),e=this.get("animations"),n=t.getTime();return Object(i.f)(e,(function(t){t._paused=!0,t._pauseTime=n,t.pauseCallback&&t.pauseCallback()})),this.set("_pause",{isPaused:!0,pauseTime:n}),this},e.prototype.resumeAnimate=function(){var t=this.get("timeline").getTime(),e=this.get("animations"),n=this.get("_pause").pauseTime;return Object(i.f)(e,(function(e){e.startTime=e.startTime+(t-n),e._paused=!1,e._pauseTime=null,e.resumeCallback&&e.resumeCallback()})),this.set("_pause",{isPaused:!1}),this.set("animations",e),this},e.prototype.emitDelegation=function(t,e){var n,r=this,o=e.propagationPath;this.getEvents();"mouseenter"===t?n=e.fromShape:"mouseleave"===t&&(n=e.toShape);for(var s=function(t){var s=o[t],c=s.get("name");if(c){if((s.isGroup()||s.isCanvas&&s.isCanvas())&&n&&Object(a.g)(s,n))return"break";Object(i.m)(c)?Object(i.f)(c,(function(t){r.emitDelegateEvent(s,t,e)})):u.emitDelegateEvent(s,c,e)}},u=this,c=0;c=0&&s<.5*Math.PI?(r={x:f.minX,y:f.minY},o={x:f.maxX,y:f.maxY}):.5*Math.PI<=s&&sa){var s=o;o=a,a=s}return o+""+a+""+(i.isUndefined(r)?"\\0":r)}function c(t,e,n,r){var i=""+e,o=""+n;if(!t&&i>o){var a=i;i=o,o=a}var s={v:i,w:o};return r&&(s.name=r),s}function f(t,e){return u(t,e.v,e.w,e.name)}o.prototype._nodeCount=0,o.prototype._edgeCount=0,o.prototype.isDirected=function(){return this._isDirected},o.prototype.isMultigraph=function(){return this._isMultigraph},o.prototype.isCompound=function(){return this._isCompound},o.prototype.setGraph=function(t){return this._label=t,this},o.prototype.graph=function(){return this._label},o.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},o.prototype.nodeCount=function(){return this._nodeCount},o.prototype.nodes=function(){return i.keys(this._nodes)},o.prototype.sources=function(){var t=this;return i.filter(this.nodes(),(function(e){return i.isEmpty(t._in[e])}))},o.prototype.sinks=function(){var t=this;return i.filter(this.nodes(),(function(e){return i.isEmpty(t._out[e])}))},o.prototype.setNodes=function(t,e){var n=arguments,r=this;return i.each(t,(function(t){n.length>1?r.setNode(t,e):r.setNode(t)})),this},o.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\\0",this._children[t]={},this._children["\\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},o.prototype.node=function(t){return this._nodes[t]},o.prototype.hasNode=function(t){return i.has(this._nodes,t)},o.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){e.setParent(t)})),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},o.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\\0";else{for(var n=e+="";!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},o.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},o.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\\0"!==e)return e}},o.prototype.children=function(t){if(i.isUndefined(t)&&(t="\\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\\0"===t)return this.nodes();if(this.hasNode(t))return[]}},o.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},o.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},o.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},o.prototype.isLeaf=function(t){return 0===(this.isDirected()?this.successors(t):this.neighbors(t)).length},o.prototype.filterNodes=function(t){var e=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});e.setGraph(this.graph());var n=this;i.each(this._nodes,(function(n,r){t(r)&&e.setNode(r,n)})),i.each(this._edgeObjs,(function(t){e.hasNode(t.v)&&e.hasNode(t.w)&&e.setEdge(t,n.edge(t))}));var r={};return this._isCompound&&i.each(e.nodes(),(function(t){e.setParent(t,function t(i){var o=n.parent(i);return void 0===o||e.hasNode(o)?(r[i]=o,o):o in r?r[o]:t(o)}(t))})),e},o.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},o.prototype.edgeCount=function(){return this._edgeCount},o.prototype.edges=function(){return i.values(this._edgeObjs)},o.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},o.prototype.setEdge=function(){var t,e,n,o,s=!1,f=arguments[0];"object"===r(f)&&null!==f&&"v"in f?(t=f.v,e=f.w,n=f.name,2===arguments.length&&(o=arguments[1],s=!0)):(t=f,e=arguments[1],n=arguments[3],arguments.length>2&&(o=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=u(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=o),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?o:this._defaultEdgeLabelFn(t,e,n);var h=c(this._isDirected,t,e,n);return t=h.v,e=h.w,Object.freeze(h),this._edgeObjs[l]=h,a(this._preds[e],t),a(this._sucs[t],e),this._in[e][l]=h,this._out[t][l]=h,this._edgeCount++,this},o.prototype.edge=function(t,e,n){var r=1===arguments.length?f(this._isDirected,arguments[0]):u(this._isDirected,t,e,n);return this._edgeLabels[r]},o.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?f(this._isDirected,arguments[0]):u(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},o.prototype.removeEdge=function(t,e,n){var r=1===arguments.length?f(this._isDirected,arguments[0]):u(this._isDirected,t,e,n),i=this._edgeObjs[r];return i&&(t=i.v,e=i.w,delete this._edgeLabels[r],delete this._edgeObjs[r],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][r],delete this._out[t][r],this._edgeCount--),this},o.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},o.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},o.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},function(t,e,n){var r=n(65)(n(45),"Map");t.exports=r},function(t,e,n){var r=n(307),i=n(314),o=n(316),a=n(317),s=n(318);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){(function(t){function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var i=n(178),o="object"==r(e)&&e&&!e.nodeType&&e,a=o&&"object"==r(t)&&t&&!t.nodeType&&t,s=a&&a.exports===o&&i.process,u=function(){try{var t=a&&a.require&&a.require("util").types;return t||s&&s.binding&&s.binding("util")}catch(t){}}();t.exports=u}).call(this,n(72)(t))},function(t,e,n){var r=n(106),i=n(324),o=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return i(t);var e=[];for(var n in Object(t))o.call(t,n)&&"constructor"!=n&&e.push(n);return e}},function(t,e,n){var r=n(186),i=n(187),o=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,s=a?function(t){return null==t?[]:(t=Object(t),r(a(t),(function(e){return o.call(t,e)})))}:i;t.exports=s},function(t,e){t.exports=function(t,e){for(var n=-1,r=e.length,i=t.length;++n0&&o(f)?n>1?t(f,n-1,o,a,s):r(s,f):a||(s[s.length]=f)}return s}},function(t,e,n){var r=n(77);t.exports=function(t,e,n){for(var i=-1,o=t.length;++i-1}},function(t,e,n){"use strict";e.a=function(t){var e=a(t);return null!==t&&"object"===e||"function"===e}},function(t,e,n){"use strict";var r=n(2),i=n(1);e.a=function(t,e){if(!Object(i.a)(t))return t;var n=[];return Object(r.a)(t,(function(t,r){e(t,r)&&n.push(t)})),n}},function(t,e,n){"use strict";e.a=function(t){return"object"===a(t)&&null!==t}},function(t,e,n){"use strict";function r(t,e){for(var n in e)e.hasOwnProperty(n)&&"constructor"!==n&&void 0!==e[n]&&(t[n]=e[n])}e.a=function(t,e,n,i){return e&&r(t,e),n&&r(t,n),i&&r(t,i),t}},function(t,e,n){var r=n(30),i=["LR","RL","TB","BT","H","V"],o=["LR","RL","H"],a=i[0];t.exports=function(t,e,n){var s=e.direction||a;if(e.isHorizontal=function(t){return o.indexOf(t)>-1}(s),s&&-1===i.indexOf(s))throw new TypeError("Invalid direction: "+s);if(s===i[0])n(t,e);else if(s===i[1])n(t,e),t.right2left();else if(s===i[2])n(t,e);else if(s===i[3])n(t,e),t.bottom2top();else if(s===i[4]||s===i[5]){var u=r(t,e),c=u.left,f=u.right;n(c,e),n(f,e),e.isHorizontal?c.right2left():c.bottom2top(),f.translate(c.x-f.x,c.y-f.y),t.x=c.x,t.y=f.y;var l=t.getBoundingBox();e.isHorizontal?l.top<0&&t.translate(0,-l.top):l.left<0&&t.translate(-l.left,0)}var h=e.fixedRoot;return void 0===h&&(h=!0),h&&t.translate(-(t.x+t.width/2+t.hgap),-(t.y+t.height/2+t.vgap)),t}},function(t,e,n){var r=n(7),i={getId:function(t){return t.id||t.name},getHGap:function(t){return t.hgap||18},getVGap:function(t){return t.vgap||18},getChildren:function(t){return t.children},getHeight:function(t){return t.height||36},getWidth:function(t){var e=t.label||" ";return t.width||18*e.split("").length}};function o(t,e){var n=this;if(n.vgap=n.hgap=0,t instanceof o)return t;n.data=t;var r=e.getHGap(t),i=e.getVGap(t);return n.width=e.getWidth(t),n.height=e.getHeight(t),n.id=e.getId(t),n.x=n.y=0,n.depth=0,n.children||(n.children=[]),n.addGap(r,i),n}r.assign(o.prototype,{isRoot:function(){return 0===this.depth},isLeaf:function(){return 0===this.children.length},addGap:function(t,e){this.hgap+=t,this.vgap+=e,this.width+=2*t,this.height+=2*e},eachNode:function(t){for(var e,n=[this];e=n.shift();)t(e),n=e.children.concat(n)},DFTraverse:function(t){this.eachNode(t)},BFTraverse:function(t){for(var e,n=[this];e=n.shift();)t(e),n=n.concat(e.children)},getBoundingBox:function(){var t={left:Number.MAX_VALUE,top:Number.MAX_VALUE,width:0,height:0};return this.eachNode((function(e){t.left=Math.min(t.left,e.x),t.top=Math.min(t.top,e.y),t.width=Math.max(t.width,e.x+e.width),t.height=Math.max(t.height,e.y+e.height)})),t},translate:function(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this.eachNode((function(n){n.x+=t,n.y+=e}))},right2left:function(){var t=this.getBoundingBox();this.eachNode((function(e){e.x=e.x-2*(e.x-t.left)-e.width})),this.translate(t.width,0)},bottom2top:function(){var t=this.getBoundingBox();this.eachNode((function(e){e.y=e.y-2*(e.y-t.top)-e.height})),this.translate(0,t.height)}}),t.exports=function(t,e,n){void 0===e&&(e={});var a,s=new o(t,e=r.assign({},i,e)),u=[s];if(!n&&!t.collapsed)for(;a=u.shift();)if(!a.data.collapsed){var c=e.getChildren(a.data),f=c?c.length:0;if(a.children=new Array(f),c&&f)for(var l=0;l-1;)i.call(t,s,1);return t}},function(t,e,n){"use strict";var r=n(2),i=n(0),o=n(9);e.a=function(t,e,n){if(!Object(i.a)(t)&&!Object(o.a)(t))return t;var a=n;return Object(r.a)(t,(function(t,n){a=e(a,t,n)})),a}},function(t,e,n){"use strict";var r=n(1),i=n(21);e.a=function(t,e){var n=[];if(!Object(r.a)(t))return n;for(var o=-1,a=[],s=t.length;++oe[r])return 1;if(t[r]n?n:t}},function(t,e,n){"use strict";e.a=function(t,e){var n=e.toString(),r=n.indexOf(".");if(-1===r)return Math.round(t);var i=n.substr(r+1).length;return i>20&&(i=20),parseFloat(t.toFixed(i))}},function(t,e,n){"use strict";var r=n(5);e.a=function(t){return Object(r.a)(t)&&t%1!=0}},function(t,e,n){"use strict";var r=n(5);e.a=function(t){return Object(r.a)(t)&&t%2==0}},function(t,e,n){"use strict";var r=n(5),i=Number.isInteger?Number.isInteger:function(t){return Object(r.a)(t)&&t%1==0};e.a=i},function(t,e,n){"use strict";var r=n(5);e.a=function(t){return Object(r.a)(t)&&t<0}},function(t,e,n){"use strict";e.a=function(t,e,n){return void 0===n&&(n=1e-5),Math.abs(t-e)0}},function(t,e,n){"use strict";var r=n(2),i=n(0),o=n(3);e.a=function(t,e){if(Object(i.a)(t)){var n,a,s=t[0];return n=Object(o.a)(e)?e(t[0]):t[0][e],Object(r.a)(t,(function(t){(a=Object(o.a)(e)?e(t):t[e])>n&&(s=t,n=a)})),s}}},function(t,e,n){"use strict";var r=n(2),i=n(0),o=n(3);e.a=function(t,e){if(Object(i.a)(t)){var n,a,s=t[0];return n=Object(o.a)(e)?e(t[0]):t[0][e],Object(r.a)(t,(function(t){(a=Object(o.a)(e)?e(t):t[e])e?(r&&(clearTimeout(r),r=null),s=c,a=t.apply(i,o),r||(i=o=null)):r||!1===n.trailing||(r=setTimeout(u,f)),a};return c.cancel=function(){clearTimeout(r),s=0,r=i=o=null},c}},function(t,e,n){"use strict";var r=n(1);e.a=function(t){return Object(r.a)(t)?Array.prototype.slice.call(t):[]}},function(t,e,n){"use strict";var r={};e.a=function(t){return r[t=t||"g"]?r[t]+=1:r[t]=1,t+r[t]}},function(t,e,n){"use strict";e.a=function(){}},function(t,e,n){"use strict";e.a=function(t){return t}},function(t,e,n){"use strict";e.a=function(t){return Object(r.a)(t)?0:Object(i.a)(t)?t.length:Object.keys(t).length};var r=n(6),i=n(1)},function(t,e,n){"use strict";var r=function(){function t(){this.map={}}return t.prototype.has=function(t){return void 0!==this.map[t]},t.prototype.get=function(t,e){var n=this.map[t];return void 0===n?e:n},t.prototype.set=function(t,e){this.map[t]=e},t.prototype.clear=function(){this.map={}},t.prototype.delete=function(t){delete this.map[t]},t.prototype.size=function(){return Object.keys(this.map).length},t}();e.a=r},function(t,e){function n(t,e,n,r){void 0===r&&(r=[]);var i=this;i.w=t||0,i.h=e||0,i.y=n||0,i.x=0,i.c=r||[],i.cs=r.length,i.prelim=0,i.mod=0,i.shift=0,i.change=0,i.tl=null,i.tr=null,i.el=null,i.er=null,i.msel=0,i.mser=0}function r(t,e){var n=function t(e,n){var r=n?e.y:e.x;return e.children.forEach((function(e){r=Math.min(t(e,n),r)})),r}(t,e);!function t(e,n,r){r?e.y+=n:e.x+=n,e.children.forEach((function(e){t(e,n,r)}))}(t,-n,e)}n.fromNode=function(t,e){if(!t)return null;var r=[];return t.children.forEach((function(t){r.push(n.fromNode(t,e))})),e?new n(t.height,t.width,t.x,r):new n(t.width,t.height,t.y,r)},t.exports=function(t,e){void 0===e&&(e={});var i=e.isHorizontal;function o(t){0===t.cs?(t.el=t,t.er=t,t.msel=t.mser=0):(t.el=t.c[0].el,t.msel=t.c[0].msel,t.er=t.c[t.cs-1].er,t.mser=t.c[t.cs-1].mser)}function a(t,e,n){for(var r=t.c[e-1],i=r.mod,o=t.c[e],a=o.mod;null!==r&&null!==o;){f(r)>n.low&&(n=n.nxt);var l=i+r.prelim+r.w-(a+o.prelim);l>0&&(a+=l,s(t,e,n.index,l));var h=f(r),d=f(o);h<=d&&null!==(r=c(r))&&(i+=r.mod),h>=d&&null!==(o=u(o))&&(a+=o.mod)}!r&&o?function(t,e,n,r){var i=t.c[0].el;i.tl=n;var o=r-n.mod-t.c[0].msel;i.mod+=o,i.prelim-=o,t.c[0].el=t.c[e].el,t.c[0].msel=t.c[e].msel}(t,e,o,a):r&&!o&&function(t,e,n,r){var i=t.c[e].er;i.tr=n;var o=r-n.mod-t.c[e].mser;i.mod+=o,i.prelim-=o,t.c[e].er=t.c[e-1].er,t.c[e].mser=t.c[e-1].mser}(t,e,r,i)}function s(t,e,n,r){t.c[e].mod+=r,t.c[e].msel+=r,t.c[e].mser+=r,function(t,e,n,r){if(n!==e-1){var i=e-n;t.c[n+1].shift+=r/i,t.c[e].shift-=r/i,t.c[e].change-=r-r/i}}(t,e,n,r)}function u(t){return 0===t.cs?t.tl:t.c[0]}function c(t){return 0===t.cs?t.tr:t.c[t.cs-1]}function f(t){return t.y+t.h}function l(t,e,n){for(;null!==n&&t>=n.low;)n=n.nxt;return{low:t,index:e,nxt:n}}!function t(e,n,r){void 0===r&&(r=0),n?(e.x=r,r+=e.width):(e.y=r,r+=e.height),e.children.forEach((function(e){t(e,n,r)}))}(t,i);var h=n.fromNode(t,i);return function t(e){if(0!==e.cs){t(e.c[0]);for(var n=l(f(e.c[0].el),0,null),r=1;ra&&(a=e.depth);var n=e.children,r=n.length,o=new i(e.height,[]);return n.forEach((function(e,n){var i=t(e);o.children.push(i),0===n&&(o.leftChild=i),n===r-1&&(o.rightChild=i)})),o.originNode=e,o.isLeaf=e.isLeaf(),o}(t);return function t(e){if(e.isLeaf||0===e.children.length)e.drawingDepth=a;else{var n=e.children.map((function(e){return t(e)})),r=Math.min.apply(null,n);e.drawingDepth=r-1}return e.drawingDepth}(s),function t(r){r.x=r.drawingDepth*e.rankSep,r.isLeaf?(r.y=0,n&&(r.y=n.y+n.height+e.nodeSep,r.originNode.parent!==n.originNode.parent&&(r.y+=e.subTreeSep)),n=r):(r.children.forEach((function(e){t(e)})),r.y=(r.leftChild.y+r.rightChild.y)/2)}(s),function t(e,n,r){r?(n.x=e.x,n.y=e.y):(n.x=e.y,n.y=e.x),e.children.forEach((function(e,i){t(e,n.children[i],r)}))}(s,t,e.isHorizontal),t}},function(t,e,n){var r=n(11),i=n(117),o=n(30),a=n(7),s=["LR","RL","H"],u=s[0],c=function(t){var e,n;function r(){return t.apply(this,arguments)||this}return n=t,(e=r).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n,r.prototype.execute=function(){var t=this.options,e=this.rootNode;t.isHorizontal=!0;var n=t.indent,r=void 0===n?20:n,a=t.dropCap,c=void 0===a||a,f=t.direction||u;if(f&&-1===s.indexOf(f))throw new TypeError("Invalid direction: "+f);if(f===s[0])i(e,r,c);else if(f===s[1])i(e,r,c),e.right2left();else if(f===s[2]){var l=o(e,t),h=l.left,d=l.right;i(h,r,c),h.right2left(),i(d,r,c);var p=h.getBoundingBox();d.translate(p.width,0),e.x=d.x-e.width/2}return e},r}(r),f={};t.exports=function(t,e){return e=a.assign({},f,e),new c(t,e).execute()}},function(t,e){t.exports=function(t,e,n){var r=null;t.eachNode((function(t){!function(t,e,n,r){if(!r)try{if(t.id===t.parent.children[0].id)return t.x+=n*t.depth,void(t.y=e?e.y:0)}catch(t){}t.x+=n*t.depth,t.y=e?e.y+e.height:0}(t,r,e,n),r=t}))}},function(t,e,n){var r=n(11),i=n(119),o=n(17),a=n(7),s=function(t){var e,n;function r(){return t.apply(this,arguments)||this}return n=t,(e=r).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n,r.prototype.execute=function(){return o(this.rootNode,this.options,i)},r}(r),u={};t.exports=function(t,e){return e=a.assign({},u,e),new s(t,e).execute()}},function(t,e,n){var r=n(7),i={getSubTreeSep:function(){return 0}};t.exports=function(t,e){void 0===e&&(e={}),e=r.assign({},i,e),t.parent={x:0,width:0,height:0,y:0},t.BFTraverse((function(t){t.x=t.parent.x+t.parent.width})),t.parent=null,function t(e,n){var r=0;return e.children.length?e.children.forEach((function(e){r+=t(e,n)})):r=e.height,e._subTreeSep=n.getSubTreeSep(e.data),e.totalHeight=Math.max(e.height,r)+2*e._subTreeSep,e.totalHeight}(t,e),t.startY=0,t.y=t.totalHeight/2-t.height/2,t.eachNode((function(t){var e=t.children,n=e.length;if(n){var r=e[0];if(r.startY=t.startY+t._subTreeSep,1===n)r.y=t.y+t.height/2-r.height/2;else{r.y=r.startY+r.totalHeight/2-r.height/2;for(var i=1;ie.height)e.y=i.y+a/2-e.height/2;else if(1!==n.length||e.height>s){var u=e.y+(e.height-a)/2-i.y;n.forEach((function(t){t.translate(0,u)}))}else e.y=(i.y+i.height/2+o.y+o.height/2)/2-e.height/2}}(t)}}])},"object"===a(e)&&"object"===a(t)?t.exports=o():(r=[],void 0===(i="function"==typeof(n=o)?n.apply(e,r):n)||(t.exports=i))}).call(this,n(72)(t))},function(t,e){},function(t,e){},function(t,e){var n,r,i=t.exports={};function o(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function s(t){if(n===setTimeout)return setTimeout(t,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:o}catch(t){n=o}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(t){r=a}}();var u,c=[],f=!1,l=-1;function h(){f&&u&&(f=!1,u.length?c=u.concat(c):l=-1,c.length&&d())}function d(){if(!f){var t=s(h);f=!0;for(var e=c.length;e;){for(u=c,c=[];++l1)for(var n=1;n=t&&n.minY<=e&&n.maxY>=e},e.prototype.afterAttrsChange=function(e){t.prototype.afterAttrsChange.call(this,e),this.clearCacheBBox()},e.prototype.getBBox=function(){var t=this.cfg.bbox;return t||(t=this.calculateBBox(),this.set("bbox",t)),t},e.prototype.getCanvasBBox=function(){var t=this.cfg.canvasBBox;return t||(t=this.calculateCanvasBBox(),this.set("canvasBBox",t)),t},e.prototype.applyMatrix=function(e){t.prototype.applyMatrix.call(this,e),this.set("canvasBBox",null)},e.prototype.calculateCanvasBBox=function(){var t=this.getBBox(),e=this.getTotalMatrix(),n=t.minX,r=t.minY,i=t.maxX,a=t.maxY;if(e){var s=Object(o.c)(e,[t.minX,t.minY]),u=Object(o.c)(e,[t.maxX,t.minY]),c=Object(o.c)(e,[t.minX,t.maxY]),f=Object(o.c)(e,[t.maxX,t.maxY]);n=Math.min(s[0],u[0],c[0],f[0]),i=Math.max(s[0],u[0],c[0],f[0]),r=Math.min(s[1],u[1],c[1],f[1]),a=Math.max(s[1],u[1],c[1],f[1])}var l=this.attrs;if(l.shadowColor){var h=l.shadowBlur,d=void 0===h?0:h,p=l.shadowOffsetX,g=void 0===p?0:p,v=l.shadowOffsetY,y=void 0===v?0:v,m=n-d+g,b=i+d+g,x=r-d+y,w=a+d+y;n=Math.min(n,m),i=Math.max(i,b),r=Math.min(r,x),a=Math.max(a,w)}return{x:n,y:r,minX:n,minY:r,maxX:i,maxY:a,width:i-n,height:a-r}},e.prototype.clearCacheBBox=function(){this.set("bbox",null),this.set("canvasBBox",null)},e.prototype.isClipShape=function(){return this.get("isClipShape")},e.prototype.isInShape=function(t,e){return!1},e.prototype.isOnlyHitBox=function(){return!1},e.prototype.isHit=function(t,e){var n=this.get("startArrowShape"),r=this.get("endArrowShape"),i=[t,e,1],o=(i=this.invertFromMatrix(i))[0],a=i[1],s=this._isInBBox(o,a);if(this.isOnlyHitBox())return s;if(s&&!this.isClipped(o,a)){if(this.isInShape(o,a))return!0;if(n&&n.isHit(o,a))return!0;if(r&&r.isHit(o,a))return!0}return!1},e}(i.a);e.a=a},function(t,e,n){var r=n(286),i={};for(var o in r)r.hasOwnProperty(o)&&(i[r[o]]=o);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var s in a)if(a.hasOwnProperty(s)){if(!("channels"in a[s]))throw new Error("missing channels property: "+s);if(!("labels"in a[s]))throw new Error("missing channel labels property: "+s);if(a[s].labels.length!==a[s].channels)throw new Error("channel and label counts mismatch: "+s);var u=a[s].channels,c=a[s].labels;delete a[s].channels,delete a[s].labels,Object.defineProperty(a[s],"channels",{value:u}),Object.defineProperty(a[s],"labels",{value:c})}a.rgb.hsl=function(t){var e,n,r=t[0]/255,i=t[1]/255,o=t[2]/255,a=Math.min(r,i,o),s=Math.max(r,i,o),u=s-a;return s===a?e=0:r===s?e=(i-o)/u:i===s?e=2+(o-r)/u:o===s&&(e=4+(r-i)/u),(e=Math.min(60*e,360))<0&&(e+=360),n=(a+s)/2,[e,100*(s===a?0:n<=.5?u/(s+a):u/(2-s-a)),100*n]},a.rgb.hsv=function(t){var e,n,r,i,o,a=t[0]/255,s=t[1]/255,u=t[2]/255,c=Math.max(a,s,u),f=c-Math.min(a,s,u),l=function(t){return(c-t)/6/f+.5};return 0===f?i=o=0:(o=f/c,e=l(a),n=l(s),r=l(u),a===c?i=r-n:s===c?i=1/3+e-r:u===c&&(i=2/3+n-e),i<0?i+=1:i>1&&(i-=1)),[360*i,100*o,100*c]},a.rgb.hwb=function(t){var e=t[0],n=t[1],r=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,r))),100*(r=1-1/255*Math.max(e,Math.max(n,r)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,r=t[1]/255,i=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-r,1-i)))/(1-e)||0),100*((1-r-e)/(1-e)||0),100*((1-i-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var e=i[t];if(e)return e;var n,o,a,s=1/0;for(var u in r)if(r.hasOwnProperty(u)){var c=r[u],f=(o=t,a=c,Math.pow(o[0]-a[0],2)+Math.pow(o[1]-a[1],2)+Math.pow(o[2]-a[2],2));f.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(r=r>.04045?Math.pow((r+.055)/1.055,2.4):r/12.92)),100*(.2126*e+.7152*n+.0722*r),100*(.0193*e+.1192*n+.9505*r)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],r=e[1],i=e[2];return r/=100,i/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116)-16,500*(n-r),200*(r-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.hsl.rgb=function(t){var e,n,r,i,o,a=t[0]/360,s=t[1]/100,u=t[2]/100;if(0===s)return[o=255*u,o,o];e=2*u-(n=u<.5?u*(1+s):u+s-u*s),i=[0,0,0];for(var c=0;c<3;c++)(r=a+1/3*-(c-1))<0&&r++,r>1&&r--,o=6*r<1?e+6*(n-e)*r:2*r<1?n:3*r<2?e+(n-e)*(2/3-r)*6:e,i[c]=255*o;return i},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,r=t[2]/100,i=n,o=Math.max(r,.01);return n*=(r*=2)<=1?r:2-r,i*=o<=1?o:2-o,[e,100*(0===r?2*i/(o+i):2*n/(r+n)),100*((r+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,r=t[2]/100,i=Math.floor(e)%6,o=e-Math.floor(e),a=255*r*(1-n),s=255*r*(1-n*o),u=255*r*(1-n*(1-o));switch(r*=255,i){case 0:return[r,u,a];case 1:return[s,r,a];case 2:return[a,r,u];case 3:return[a,s,r];case 4:return[u,a,r];case 5:return[r,a,s]}},a.hsv.hsl=function(t){var e,n,r,i=t[0],o=t[1]/100,a=t[2]/100,s=Math.max(a,.01);return r=(2-o)*a,n=o*s,[i,100*(n=(n/=(e=(2-o)*s)<=1?e:2-e)||0),100*(r/=2)]},a.hwb.rgb=function(t){var e,n,r,i,o,a,s,u=t[0]/360,c=t[1]/100,f=t[2]/100,l=c+f;switch(l>1&&(c/=l,f/=l),r=6*u-(e=Math.floor(6*u)),0!=(1&e)&&(r=1-r),i=c+r*((n=1-f)-c),e){default:case 6:case 0:o=n,a=i,s=c;break;case 1:o=i,a=n,s=c;break;case 2:o=c,a=n,s=i;break;case 3:o=c,a=i,s=n;break;case 4:o=i,a=c,s=n;break;case 5:o=n,a=c,s=i}return[255*o,255*a,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,r=t[2]/100,i=t[3]/100;return[255*(1-Math.min(1,e*(1-i)+i)),255*(1-Math.min(1,n*(1-i)+i)),255*(1-Math.min(1,r*(1-i)+i))]},a.xyz.rgb=function(t){var e,n,r,i=t[0]/100,o=t[1]/100,a=t[2]/100;return n=-.9689*i+1.8758*o+.0415*a,r=.0557*i+-.204*o+1.057*a,e=(e=3.2406*i+-1.5372*o+-.4986*a)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,r=r>.0031308?1.055*Math.pow(r,1/2.4)-.055:12.92*r,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(r=Math.min(Math.max(0,r),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],r=t[2];return n/=100,r/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.lab.xyz=function(t){var e,n,r,i=t[0];e=t[1]/500+(n=(i+16)/116),r=n-t[2]/200;var o=Math.pow(n,3),a=Math.pow(e,3),s=Math.pow(r,3);return n=o>.008856?o:(n-16/116)/7.787,e=a>.008856?a:(e-16/116)/7.787,r=s>.008856?s:(r-16/116)/7.787,[e*=95.047,n*=100,r*=108.883]},a.lab.lch=function(t){var e,n=t[0],r=t[1],i=t[2];return(e=360*Math.atan2(i,r)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(r*r+i*i),e]},a.lch.lab=function(t){var e,n=t[0],r=t[1];return e=t[2]/360*2*Math.PI,[n,r*Math.cos(e),r*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],r=t[2],i=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(i=Math.round(i/50)))return 30;var o=30+(Math.round(r/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===i&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],r=t[2];return e===n&&n===r?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(r/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map((function(t){return t+t})).join(""));var r=parseInt(n,16);return[r>>16&255,r>>8&255,255&r]},a.rgb.hcg=function(t){var e,n=t[0]/255,r=t[1]/255,i=t[2]/255,o=Math.max(Math.max(n,r),i),a=Math.min(Math.min(n,r),i),s=o-a;return e=s<=0?0:o===n?(r-i)/s%6:o===r?2+(i-n)/s:4+(n-r)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?a/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,r=1,i=0;return(r=n<.5?2*e*n:2*e*(1-n))<1&&(i=(n-.5*r)/(1-r)),[t[0],100*r,100*i]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,r=e*n,i=0;return r<1&&(i=(n-r)/(1-r)),[t[0],100*r,100*i]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,r=t[2]/100;if(0===n)return[255*r,255*r,255*r];var i,o=[0,0,0],a=e%1*6,s=a%1,u=1-s;switch(Math.floor(a)){case 0:o[0]=1,o[1]=s,o[2]=0;break;case 1:o[0]=u,o[1]=1,o[2]=0;break;case 2:o[0]=0,o[1]=1,o[2]=s;break;case 3:o[0]=0,o[1]=u,o[2]=1;break;case 4:o[0]=s,o[1]=0,o[2]=1;break;default:o[0]=1,o[1]=0,o[2]=u}return i=(1-n)*r,[255*(n*o[0]+i),255*(n*o[1]+i),255*(n*o[2]+i)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),r=0;return n>0&&(r=e/n),[t[0],100*r,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,r=0;return n>0&&n<.5?r=e/(2*n):n>=.5&&n<1&&(r=e/(2*(1-n))),[t[0],100*r,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,r=n-e,i=0;return r<1&&(i=(n-r)/(1-r)),[t[0],100*r,100*i]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}},function(t,e,n){var r=n(97),i=n(145),o=n(102),a=n(319),s=n(325),u=n(184),c=n(185),f=n(328),l=n(329),h=n(189),d=n(330),p=n(76),g=n(334),v=n(335),y=n(194),m=n(29),b=n(75),x=n(339),w=n(43),S=n(341),E=n(60),_=n(66),O={};O["[object Arguments]"]=O["[object Array]"]=O["[object ArrayBuffer]"]=O["[object DataView]"]=O["[object Boolean]"]=O["[object Date]"]=O["[object Float32Array]"]=O["[object Float64Array]"]=O["[object Int8Array]"]=O["[object Int16Array]"]=O["[object Int32Array]"]=O["[object Map]"]=O["[object Number]"]=O["[object Object]"]=O["[object RegExp]"]=O["[object Set]"]=O["[object String]"]=O["[object Symbol]"]=O["[object Uint8Array]"]=O["[object Uint8ClampedArray]"]=O["[object Uint16Array]"]=O["[object Uint32Array]"]=!0,O["[object Error]"]=O["[object Function]"]=O["[object WeakMap]"]=!1,t.exports=function t(e,n,k,M,A,T){var C,I=1&n,P=2&n,j=4&n;if(k&&(C=A?k(e,M,A,T):k(e)),void 0!==C)return C;if(!w(e))return e;var D=m(e);if(D){if(C=g(e),!I)return c(e,C)}else{var N=p(e),R="[object Function]"==N||"[object GeneratorFunction]"==N;if(b(e))return u(e,I);if("[object Object]"==N||"[object Arguments]"==N||R&&!A){if(C=P||R?{}:y(e),!I)return P?l(e,s(C,e)):f(e,a(C,e))}else{if(!O[N])return A?e:{};C=v(e,N,I)}}T||(T=new r);var L=T.get(e);if(L)return L;T.set(e,C),S(e)?e.forEach((function(r){C.add(t(r,n,k,r,e,T))})):x(e)&&e.forEach((function(r,i){C.set(i,t(r,n,k,i,e,T))}));var B=D?void 0:(j?P?d:h:P?_:E)(e);return i(B||e,(function(r,i){B&&(r=e[i=r]),o(C,i,t(r,n,k,i,e,T))})),C}},function(t,e,n){(function(e){function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var r="object"==(void 0===e?"undefined":n(e))&&e&&e.Object===Object&&e;t.exports=r}).call(this,n(179))},function(t,e){function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"===("undefined"==typeof window?"undefined":n(window))&&(r=window)}t.exports=r},function(t,e){var n=Function.prototype.toString;t.exports=function(t){if(null!=t){try{return n.call(t)}catch(t){}try{return t+""}catch(t){}}return""}},function(t,e,n){var r=n(65),i=function(){try{var t=r(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();t.exports=i},function(t,e,n){var r=n(320),i=n(88),o=n(29),a=n(75),s=n(104),u=n(32),c=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=o(t),f=!n&&i(t),l=!n&&!f&&a(t),h=!n&&!f&&!l&&u(t),d=n||f||l||h,p=d?r(t.length,String):[],g=p.length;for(var v in t)!e&&!c.call(t,v)||d&&("length"==v||l&&("offset"==v||"parent"==v)||h&&("buffer"==v||"byteLength"==v||"byteOffset"==v)||s(v,g))||p.push(v);return p}},function(t,e){t.exports=function(t,e){return function(n){return t(e(n))}}},function(t,e,n){(function(t){function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var i=n(45),o="object"==r(e)&&e&&!e.nodeType&&e,a=o&&"object"==r(t)&&t&&!t.nodeType&&t,s=a&&a.exports===o?i.Buffer:void 0,u=s?s.allocUnsafe:void 0;t.exports=function(t,e){if(e)return t.slice();var n=t.length,r=u?u(n):new t.constructor(n);return t.copy(r),r}}).call(this,n(72)(t))},function(t,e){t.exports=function(t,e){var n=-1,r=t.length;for(e||(e=Array(r));++nf))return!1;var h=u.get(t),d=u.get(e);if(h&&d)return h==e&&d==t;var p=-1,g=!0,v=2&n?new r:void 0;for(u.set(t,e),u.set(e,t);++p=200){var g=e?null:s(t);if(g)return u(g);h=!1,f=a,p=new r}else p=e?[]:d;t:for(;++c0&&(o=u.removeMin(),(a=s[o]).distance!==Number.POSITIVE_INFINITY);)r(o).forEach(c);return s}(t,String(e),n||o,r||function(e){return t.outEdges(e)})};var o=r.constant(1)},function(t,e,n){var r=n(42);function i(){this._arr=[],this._keyIndices={}}t.exports=i,i.prototype.size=function(){return this._arr.length},i.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},i.prototype.has=function(t){return r.has(this._keyIndices,t)},i.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},i.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},i.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!r.has(n,t)){var i=this._arr,o=i.length;return n[t]=o,i.push({key:t,priority:e}),this._decrease(o),!0}return!1},i.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},i.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},i.prototype._heapify=function(t){var e=this._arr,n=2*t,r=n+1,i=t;n>1].priority=0&&t=this._keys.length?(this._index=-1,this._keys=e,this._values=e):this._index++,{value:n,done:!1}}return{value:void 0,done:!0}},t.prototype.throw=function(t){throw this._index>=0&&(this._index=-1,this._keys=e,this._values=e),t},t.prototype.return=function(t){return this._index>=0&&(this._index=-1,this._keys=e,this._values=e),{value:t,done:!0}},t}();return function(){function e(){this._keys=[],this._values=[],this._cacheKey=t,this._cacheIndex=-2}return Object.defineProperty(e.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),e.prototype.has=function(t){return this._find(t,!1)>=0},e.prototype.get=function(t){var e=this._find(t,!1);return e>=0?this._values[e]:void 0},e.prototype.set=function(t,e){var n=this._find(t,!0);return this._values[n]=e,this},e.prototype.delete=function(e){var n=this._find(e,!1);if(n>=0){for(var r=this._keys.length,i=n+1;i=0;--n){var r=(0,t[n])(e);if(!S(r)&&!E(r)){if(!T(r))throw new TypeError;e=r}}return e}(t,e)}if(!M(t))throw new TypeError;if(!_(e))throw new TypeError;if(!_(r)&&!S(r)&&!E(r))throw new TypeError;return E(r)&&(r=void 0),function(t,e,n,r){for(var i=t.length-1;i>=0;--i){var o=(0,t[i])(e,n,r);if(!S(o)&&!E(o)){if(!_(o))throw new TypeError;r=o}}return r}(t,e,n=k(n),r)})),e("metadata",(function(t,e){return function(n,r){if(!_(n))throw new TypeError;if(!S(r)&&!function(t){switch(w(t)){case 3:case 4:return!0;default:return!1}}(r))throw new TypeError;b(t,e,n,r)}})),e("defineMetadata",(function(t,e,n,r){if(!_(n))throw new TypeError;return S(r)||(r=k(r)),b(t,e,n,r)})),e("hasMetadata",(function(t,e,n){if(!_(e))throw new TypeError;return S(n)||(n=k(n)),function t(e,n,r){if(y(e,n,r))return!0;var i=j(n);return!E(i)&&t(e,i,r)}(t,e,n)})),e("hasOwnMetadata",(function(t,e,n){if(!_(e))throw new TypeError;return S(n)||(n=k(n)),y(t,e,n)})),e("getMetadata",(function(t,e,n){if(!_(e))throw new TypeError;return S(n)||(n=k(n)),function t(e,n,r){if(y(e,n,r))return m(e,n,r);var i=j(n);return E(i)?void 0:t(e,i,r)}(t,e,n)})),e("getOwnMetadata",(function(t,e,n){if(!_(e))throw new TypeError;return S(n)||(n=k(n)),m(t,e,n)})),e("getMetadataKeys",(function(t,e){if(!_(t))throw new TypeError;return S(e)||(e=k(e)),function t(e,n){var r=x(e,n),i=j(e);if(null===i)return r;var o=t(i,n);if(o.length<=0)return r;if(r.length<=0)return o;for(var a=new p,s=[],u=0,c=r;u0)return!0;var i=g.get(e);return i.delete(n),i.size>0||g.delete(e),!0}))}(a)}()}(r||(r={}))}).call(this,n(173),n(179))},function(t,e,n){var r=n(234);t.exports=function(t,e){if(t){if("string"==typeof t)return r(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}}},function(t,e){t.exports=function(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);no[0]&&(o[0]=s),u>o[1]&&(o[1]=u),c>o[2]&&(o[2]=c)}return e.setMinMax(n,o),e}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));var r="undefined"!=typeof navigator&&/Version\\/[\\d\\.]+.*Safari/.test(navigator.userAgent)},function(t,e,n){"use strict";var r=n(249);n.o(r,"AABB")&&n.d(e,"AABB",(function(){return r.AABB})),n.o(r,"Frustum")&&n.d(e,"Frustum",(function(){return r.Frustum}));n(270);var i=n(251);n.o(i,"AABB")&&n.d(e,"AABB",(function(){return i.AABB})),n.o(i,"Frustum")&&n.d(e,"Frustum",(function(){return i.Frustum}))},function(t,e,n){"use strict";n(132);var r=n(250);n.o(r,"AABB")&&n.d(e,"AABB",(function(){return r.AABB})),n.o(r,"Frustum")&&n.d(e,"Frustum",(function(){return r.Frustum}))},function(t,e){},function(t,e,n){"use strict";var r=n(252);n.o(r,"AABB")&&n.d(e,"AABB",(function(){return r.AABB})),n.o(r,"Frustum")&&n.d(e,"Frustum",(function(){return r.Frustum}));n(135)},function(t,e){},function(t,e){t.exports=1e-6},function(t,e){t.exports=function(){var t=new Float32Array(2);return t[0]=0,t[1]=0,t}},function(t,e){t.exports=function(t,e,n){return t[0]=e,t[1]=n,t}},function(t,e){t.exports=function(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t}},function(t,e){t.exports=function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t}},function(t,e){t.exports=function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t}},function(t,e){t.exports=function(t,e){var n=e[0]-t[0],r=e[1]-t[1];return Math.sqrt(n*n+r*r)}},function(t,e){t.exports=function(t,e){var n=e[0]-t[0],r=e[1]-t[1];return n*n+r*r}},function(t,e){t.exports=function(t){var e=t[0],n=t[1];return Math.sqrt(e*e+n*n)}},function(t,e){t.exports=function(t){var e=t[0],n=t[1];return e*e+n*n}},function(t,e){t.exports=function(t,e){var n=e[0],r=e[1],i=n*n+r*r;i>0&&(i=1/Math.sqrt(i),t[0]=e[0]*i,t[1]=e[1]*i);return t}},function(t,e){t.exports=function(t,e){return t[0]*e[0]+t[1]*e[1]}},function(t,e,n){"use strict";var r={};n.r(r),n.d(r,"easeLinear",(function(){return M})),n.d(r,"easeQuad",(function(){return C})),n.d(r,"easeQuadIn",(function(){return A})),n.d(r,"easeQuadOut",(function(){return T})),n.d(r,"easeQuadInOut",(function(){return C})),n.d(r,"easeCubic",(function(){return j})),n.d(r,"easeCubicIn",(function(){return I})),n.d(r,"easeCubicOut",(function(){return P})),n.d(r,"easeCubicInOut",(function(){return j})),n.d(r,"easePoly",(function(){return R})),n.d(r,"easePolyIn",(function(){return D})),n.d(r,"easePolyOut",(function(){return N})),n.d(r,"easePolyInOut",(function(){return R})),n.d(r,"easeSin",(function(){return U})),n.d(r,"easeSinIn",(function(){return G})),n.d(r,"easeSinOut",(function(){return F})),n.d(r,"easeSinInOut",(function(){return U})),n.d(r,"easeExp",(function(){return X})),n.d(r,"easeExpIn",(function(){return V})),n.d(r,"easeExpOut",(function(){return W})),n.d(r,"easeExpInOut",(function(){return X})),n.d(r,"easeCircle",(function(){return q})),n.d(r,"easeCircleIn",(function(){return Y})),n.d(r,"easeCircleOut",(function(){return H})),n.d(r,"easeCircleInOut",(function(){return q})),n.d(r,"easeBounce",(function(){return Q})),n.d(r,"easeBounceIn",(function(){return Z})),n.d(r,"easeBounceOut",(function(){return Q})),n.d(r,"easeBounceInOut",(function(){return J})),n.d(r,"easeBack",(function(){return et})),n.d(r,"easeBackIn",(function(){return $})),n.d(r,"easeBackOut",(function(){return tt})),n.d(r,"easeBackInOut",(function(){return et})),n.d(r,"easeElastic",(function(){return it})),n.d(r,"easeElasticIn",(function(){return rt})),n.d(r,"easeElasticOut",(function(){return it})),n.d(r,"easeElasticInOut",(function(){return ot}));var i=n(1),o=n(139),a=n(137),s=n(19),u=n(0);function c(t){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var f,l,h=0,d=0,p=0,g=0,v=0,y=0,m="object"===("undefined"==typeof performance?"undefined":c(performance))&&performance.now?performance:Date,b="object"===("undefined"==typeof window?"undefined":c(window))&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function x(){return v||(b(w),v=m.now()+y)}function w(){v=0}function S(){this._call=this._time=this._next=null}function E(t,e,n){var r=new S;return r.restart(t,e,n),r}function _(){v=(g=m.now())+y,h=d=0;try{!function(){x(),++h;for(var t,e=f;e;)(t=v-e._time)>=0&&e._call.call(null,t),e=e._next;--h}()}finally{h=0,function(){var t,e,n=f,r=1/0;for(;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:f=e);l=t,k(r)}(),v=0}}function O(){var t=m.now(),e=t-g;e>1e3&&(y-=e,g=t)}function k(t){h||(d&&(d=clearTimeout(d)),t-v>24?(t<1/0&&(d=setTimeout(_,t-m.now()-y)),p&&(p=clearInterval(p))):(p||(g=m.now(),p=setInterval(O,1e3)),h=1,b(_)))}function M(t){return+t}function A(t){return t*t}function T(t){return t*(2-t)}function C(t){return((t*=2)<=1?t*t:--t*(2-t)+1)/2}function I(t){return t*t*t}function P(t){return--t*t*t+1}function j(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}S.prototype=E.prototype={constructor:S,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?x():+n)+(null==e?0:+e),this._next||l===this||(l?l._next=this:f=this,l=this),this._call=t,this._time=n,k()},stop:function(){this._call&&(this._call=null,this._time=1/0,k())}};var D=function t(e){function n(t){return Math.pow(t,e)}return e=+e,n.exponent=t,n}(3),N=function t(e){function n(t){return 1-Math.pow(1-t,e)}return e=+e,n.exponent=t,n}(3),R=function t(e){function n(t){return((t*=2)<=1?Math.pow(t,e):2-Math.pow(2-t,e))/2}return e=+e,n.exponent=t,n}(3),L=Math.PI,B=L/2;function G(t){return 1==+t?1:1-Math.cos(t*B)}function F(t){return Math.sin(t*B)}function U(t){return(1-Math.cos(L*t))/2}function z(t){return 1.0009775171065494*(Math.pow(2,-10*t)-.0009765625)}function V(t){return z(1-+t)}function W(t){return 1-z(t)}function X(t){return((t*=2)<=1?z(1-t):2-z(t-1))/2}function Y(t){return 1-Math.sqrt(1-t*t)}function H(t){return Math.sqrt(1- --t*t)}function q(t){return((t*=2)<=1?1-Math.sqrt(1-t*t):Math.sqrt(1-(t-=2)*t)+1)/2}var K=7.5625;function Z(t){return 1-Q(1-t)}function Q(t){return(t=+t)<4/11?K*t*t:t<8/11?K*(t-=6/11)*t+3/4:t<10/11?K*(t-=9/11)*t+15/16:K*(t-=21/22)*t+63/64}function J(t){return((t*=2)<=1?1-Q(1-t):Q(t-1)+1)/2}var $=function t(e){function n(t){return(t=+t)*t*(e*(t-1)+t)}return e=+e,n.overshoot=t,n}(1.70158),tt=function t(e){function n(t){return--t*t*((t+1)*e+t)+1}return e=+e,n.overshoot=t,n}(1.70158),et=function t(e){function n(t){return((t*=2)<1?t*t*((e+1)*t-e):(t-=2)*t*((e+1)*t+e)+2)/2}return e=+e,n.overshoot=t,n}(1.70158),nt=2*Math.PI,rt=function t(e,n){var r=Math.asin(1/(e=Math.max(1,e)))*(n/=nt);function i(t){return e*z(- --t)*Math.sin((r-t)/n)}return i.amplitude=function(e){return t(e,n*nt)},i.period=function(n){return t(e,n)},i}(1,.3),it=function t(e,n){var r=Math.asin(1/(e=Math.max(1,e)))*(n/=nt);function i(t){return 1-e*z(t=+t)*Math.sin((t+r)/n)}return i.amplitude=function(e){return t(e,n*nt)},i.period=function(n){return t(e,n)},i}(1,.3),ot=function t(e,n){var r=Math.asin(1/(e=Math.max(1,e)))*(n/=nt);function i(t){return((t=2*t-1)<0?e*z(-t)*Math.sin((r-t)/n):2-e*z(t)*Math.sin((r+t)/n))/2}return i.amplitude=function(e){return t(e,n*nt)},i.period=function(n){return t(e,n)},i}(1,.3),at=function(t,e,n){t.prototype=e.prototype=n,n.constructor=t};function st(t,e){var n=Object.create(t.prototype);for(var r in e)n[r]=e[r];return n}function ut(){}var ct="\\\\s*([+-]?\\\\d+)\\\\s*",ft="\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*",lt="\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*",ht=/^#([0-9a-f]{3,8})$/,dt=new RegExp("^rgb\\\\("+[ct,ct,ct]+"\\\\)$"),pt=new RegExp("^rgb\\\\("+[lt,lt,lt]+"\\\\)$"),gt=new RegExp("^rgba\\\\("+[ct,ct,ct,ft]+"\\\\)$"),vt=new RegExp("^rgba\\\\("+[lt,lt,lt,ft]+"\\\\)$"),yt=new RegExp("^hsl\\\\("+[ft,lt,lt]+"\\\\)$"),mt=new RegExp("^hsla\\\\("+[ft,lt,lt,ft]+"\\\\)$"),bt={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function xt(){return this.rgb().formatHex()}function wt(){return this.rgb().formatRgb()}function St(t){var e,n;return t=(t+"").trim().toLowerCase(),(e=ht.exec(t))?(n=e[1].length,e=parseInt(e[1],16),6===n?Et(e):3===n?new Mt(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?_t(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?_t(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=dt.exec(t))?new Mt(e[1],e[2],e[3],1):(e=pt.exec(t))?new Mt(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=gt.exec(t))?_t(e[1],e[2],e[3],e[4]):(e=vt.exec(t))?_t(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=yt.exec(t))?It(e[1],e[2]/100,e[3]/100,1):(e=mt.exec(t))?It(e[1],e[2]/100,e[3]/100,e[4]):bt.hasOwnProperty(t)?Et(bt[t]):"transparent"===t?new Mt(NaN,NaN,NaN,0):null}function Et(t){return new Mt(t>>16&255,t>>8&255,255&t,1)}function _t(t,e,n,r){return r<=0&&(t=e=n=NaN),new Mt(t,e,n,r)}function Ot(t){return t instanceof ut||(t=St(t)),t?new Mt((t=t.rgb()).r,t.g,t.b,t.opacity):new Mt}function kt(t,e,n,r){return 1===arguments.length?Ot(t):new Mt(t,e,n,null==r?1:r)}function Mt(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function At(){return"#"+Ct(this.r)+Ct(this.g)+Ct(this.b)}function Tt(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function Ct(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function It(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new jt(t,e,n,r)}function Pt(t){if(t instanceof jt)return new jt(t.h,t.s,t.l,t.opacity);if(t instanceof ut||(t=St(t)),!t)return new jt;if(t instanceof jt)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),o=Math.max(e,n,r),a=NaN,s=o-i,u=(o+i)/2;return s?(a=e===o?(n-r)/s+6*(n0&&u<1?0:a,new jt(a,s,u,t.opacity)}function jt(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function Dt(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function Nt(t,e,n,r,i){var o=t*t,a=o*t;return((1-3*t+3*o-a)*e+(4-6*o+3*a)*n+(1+3*t+3*o-3*a)*r+a*i)/6}at(ut,St,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:xt,formatHex:xt,formatHsl:function(){return Pt(this).formatHsl()},formatRgb:wt,toString:wt}),at(Mt,kt,st(ut,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Mt(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Mt(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:At,formatHex:At,formatRgb:Tt,toString:Tt})),at(jt,(function(t,e,n,r){return 1===arguments.length?Pt(t):new jt(t,e,n,null==r?1:r)}),st(ut,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new jt(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new jt(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new Mt(Dt(t>=240?t-240:t+120,i,r),Dt(t,i,r),Dt(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));var Rt=function(t){return function(){return t}};function Lt(t,e){return function(n){return t+n*e}}function Bt(t){return 1==(t=+t)?Gt:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):Rt(isNaN(e)?n:e)}}function Gt(t,e){var n=e-t;return n?Lt(t,n):Rt(isNaN(t)?e:t)}var Ft=function t(e){var n=Bt(e);function r(t,e){var r=n((t=kt(t)).r,(e=kt(e)).r),i=n(t.g,e.g),o=n(t.b,e.b),a=Gt(t.opacity,e.opacity);return function(e){return t.r=r(e),t.g=i(e),t.b=o(e),t.opacity=a(e),t+""}}return r.gamma=t,r}(1);function Ut(t){return function(e){var n,r,i=e.length,o=new Array(i),a=new Array(i),s=new Array(i);for(n=0;n=1?(n=1,e-1):Math.floor(n*e),i=t[r],o=t[r+1],a=r>0?t[r-1]:2*i-o,s=ro&&(i=e.slice(o,i),s[a]?s[a]+=i:s[++a]=i),(n=n[0])===(r=r[0])?s[a]?s[a]+=r:s[++a]=r:(s[++a]=null,u.push({i:a,x:Yt(n,r)})),o=Zt.lastIndex;return od.length?(h=te.parsePathString(o[l]),d=te.parsePathString(i[l]),d=te.fillPathByDiff(d,h),d=te.formatPath(d,h),e.fromAttrs.path=d,e.toAttrs.path=h):e.pathFormatted||(h=te.parsePathString(o[l]),d=te.parsePathString(i[l]),d=te.formatPath(d,h),e.fromAttrs.path=d,e.toAttrs.path=h,e.pathFormatted=!0),r[l]=[];for(var p=0;p0){for(var o=r.animators.length-1;o>=0;o--)if((t=r.animators[o]).destroyed)r.removeAnimator(o);else{if(!t.isAnimatePaused())for(var a=(e=t.get("animations")).length-1;a>=0;a--)n=e[a],ne(t,n,i)&&(e.splice(a,1),!1,n.callback&&n.callback());0===e.length&&r.removeAnimator(o)}r.canvas.get("autoDraw")||r.canvas.draw()}}))},t.prototype.addAnimator=function(t){this.animators.push(t)},t.prototype.removeAnimator=function(t){this.animators.splice(t,1)},t.prototype.isAnimating=function(){return!!this.animators.length},t.prototype.stop=function(){this.timer&&this.timer.stop()},t.prototype.stopAllAnimations=function(t){void 0===t&&(t=!0),this.animators.forEach((function(e){e.stopAnimate(t)})),this.animators=[],this.canvas.draw()},t.prototype.getTime=function(){return this.current},t}(),ie=n(116),oe=["mousedown","mouseup","dblclick","mouseout","mouseover","mousemove","mouseleave","mouseenter","touchstart","touchmove","touchend","dragenter","dragover","dragleave","drop","contextmenu","mousewheel"];function ae(t,e,n){n.name=e,n.target=t,n.currentTarget=t,n.delegateTarget=t,t.emit(e,n)}function se(t,e,n){if(n.bubbles){var r=void 0,i=!1;if("mouseenter"===e?(r=n.fromShape,i=!0):"mouseleave"===e&&(i=!0,r=n.toShape),t.isCanvas()&&i)return;if(r&&Object(s.g)(t,r))return void(n.bubbles=!1);n.name=e,n.currentTarget=t,n.delegateTarget=t,t.emit(e,n)}}var ue=function(){function t(t){var e=this;this.draggingShape=null,this.dragging=!1,this.currentShape=null,this.mousedownShape=null,this.mousedownPoint=null,this._eventCallback=function(t){var n=t.type;e._triggerEvent(n,t)},this._onDocumentMove=function(t){if(e.canvas.get("el")!==t.target&&(e.dragging||e.currentShape)){var n=e._getPointInfo(t);e.dragging&&e._emitEvent("drag",t,n,e.draggingShape)}},this._onDocumentMouseUp=function(t){if(e.canvas.get("el")!==t.target&&e.dragging){var n=e._getPointInfo(t);e.draggingShape&&e._emitEvent("drop",t,n,null),e._emitEvent("dragend",t,n,e.draggingShape),e._afterDrag(e.draggingShape,n,t)}},this.canvas=t.canvas}return t.prototype.init=function(){this._bindEvents()},t.prototype._bindEvents=function(){var t=this,e=this.canvas.get("el");Object(s.a)(oe,(function(n){e.addEventListener(n,t._eventCallback)})),document&&(document.addEventListener("mousemove",this._onDocumentMove),document.addEventListener("mouseup",this._onDocumentMouseUp))},t.prototype._clearEvents=function(){var t=this,e=this.canvas.get("el");Object(s.a)(oe,(function(n){e.removeEventListener(n,t._eventCallback)})),document&&(document.removeEventListener("mousemove",this._onDocumentMove),document.removeEventListener("mouseup",this._onDocumentMouseUp))},t.prototype._getEventObj=function(t,e,n,r,i,o){var a=new ie.a(t,e);return a.fromShape=i,a.toShape=o,a.x=n.x,a.y=n.y,a.clientX=n.clientX,a.clientY=n.clientY,a.propagationPath.push(r),a},t.prototype._getShape=function(t,e){return this.canvas.getShape(t.x,t.y,e)},t.prototype._getPointInfo=function(t){var e=this.canvas,n=e.getClientByEvent(t),r=e.getPointByEvent(t);return{x:r.x,y:r.y,clientX:n.x,clientY:n.y}},t.prototype._triggerEvent=function(t,e){var n=this._getPointInfo(e),r=this._getShape(n,e),i=this["_on"+t],o=!1;if(i)i.call(this,n,r,e);else{var a=this.currentShape;"mouseenter"===t||"dragenter"===t||"mouseover"===t?(this._emitEvent(t,e,n,null,null,r),r&&this._emitEvent(t,e,n,r,null,r),"mouseenter"===t&&this.draggingShape&&this._emitEvent("dragenter",e,n,null)):"mouseleave"===t||"dragleave"===t||"mouseout"===t?(o=!0,a&&this._emitEvent(t,e,n,a,a,null),this._emitEvent(t,e,n,null,a,null),"mouseleave"===t&&this.draggingShape&&this._emitEvent("dragleave",e,n,null)):this._emitEvent(t,e,n,r,null,null)}if(o||(this.currentShape=r),r&&!r.get("destroyed")){var s=this.canvas;s.get("el").style.cursor=r.attr("cursor")||s.get("cursor")}},t.prototype._onmousedown=function(t,e,n){0===n.button&&(this.mousedownShape=e,this.mousedownPoint=t,this.mousedownTimeStamp=n.timeStamp),this._emitEvent("mousedown",n,t,e,null,null)},t.prototype._emitMouseoverEvents=function(t,e,n,r){var i=this.canvas.get("el");n!==r&&(n&&(this._emitEvent("mouseout",t,e,n,n,r),this._emitEvent("mouseleave",t,e,n,n,r),r&&!r.get("destroyed")||(i.style.cursor=this.canvas.get("cursor"))),r&&(this._emitEvent("mouseover",t,e,r,n,r),this._emitEvent("mouseenter",t,e,r,n,r)))},t.prototype._emitDragoverEvents=function(t,e,n,r,i){r?(r!==n&&(n&&this._emitEvent("dragleave",t,e,n,n,r),this._emitEvent("dragenter",t,e,r,n,r)),i||this._emitEvent("dragover",t,e,r)):n&&this._emitEvent("dragleave",t,e,n,n,r),i&&this._emitEvent("dragover",t,e,r)},t.prototype._afterDrag=function(t,e,n){t&&(t.set("capture",!0),this.draggingShape=null),this.dragging=!1;var r=this._getShape(e,n);r!==t&&this._emitMouseoverEvents(n,e,t,r),this.currentShape=r},t.prototype._onmouseup=function(t,e,n){if(0===n.button){var r=this.draggingShape;this.dragging?(r&&this._emitEvent("drop",n,t,e),this._emitEvent("dragend",n,t,r),this._afterDrag(r,t,n)):(this._emitEvent("mouseup",n,t,e),e===this.mousedownShape&&this._emitEvent("click",n,t,e),this.mousedownShape=null,this.mousedownPoint=null)}},t.prototype._ondragover=function(t,e,n){n.preventDefault();var r=this.currentShape;this._emitDragoverEvents(n,t,r,e,!0)},t.prototype._onmousemove=function(t,e,n){var r=this.canvas,i=this.currentShape,o=this.draggingShape;if(this.dragging)o&&this._emitDragoverEvents(n,t,i,e,!1),this._emitEvent("drag",n,t,o);else{var a=this.mousedownPoint;if(a){var s=this.mousedownShape,u=n.timeStamp-this.mousedownTimeStamp,c=a.clientX-t.clientX,f=a.clientY-t.clientY;u>120||c*c+f*f>40?s&&s.get("draggable")?((o=this.mousedownShape).set("capture",!1),this.draggingShape=o,this.dragging=!0,this._emitEvent("dragstart",n,t,o),this.mousedownShape=null,this.mousedownPoint=null):!s&&r.get("draggable")?(this.dragging=!0,this._emitEvent("dragstart",n,t,null),this.mousedownShape=null,this.mousedownPoint=null):(this._emitMouseoverEvents(n,t,i,e),this._emitEvent("mousemove",n,t,e)):(this._emitMouseoverEvents(n,t,i,e),this._emitEvent("mousemove",n,t,e))}else this._emitMouseoverEvents(n,t,i,e),this._emitEvent("mousemove",n,t,e)}},t.prototype._emitEvent=function(t,e,n,r,i,o){var a=this._getEventObj(t,e,n,r,i,o);if(r){a.shape=r,ae(r,t,a);for(var s=r.getParent();s;)s.emitDelegation(t,a),a.propagationStopped||se(s,t,a),a.propagationPath.push(s),s=s.getParent()}else{ae(this.canvas,t,a)}},t.prototype.destroy=function(){this._clearEvents(),this.canvas=null,this.currentShape=null,this.draggingShape=null,this.mousedownPoint=null,this.mousedownShape=null,this.mousedownTimeStamp=null},t}(),ce=Object(o.a)(),fe=ce&&"firefox"===ce.name,le=function(t){function e(e){var n=t.call(this,e)||this;return n.initContainer(),n.initDom(),n.initEvents(),n.initTimeline(),n}return Object(i.b)(e,t),e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.cursor="default",e.supportCSSTransform=!1,e},e.prototype.initContainer=function(){var t=this.get("container");Object(s.h)(t)&&(t=document.getElementById(t),this.set("container",t))},e.prototype.initDom=function(){var t=this.createDom();this.set("el",t),this.get("container").appendChild(t),this.setDOMSize(this.get("width"),this.get("height"))},e.prototype.initEvents=function(){var t=new ue({canvas:this});t.init(),this.set("eventController",t)},e.prototype.initTimeline=function(){var t=new re(this);this.set("timeline",t)},e.prototype.setDOMSize=function(t,e){var n=this.get("el");s.c&&(n.style.width=t+"px",n.style.height=e+"px")},e.prototype.changeSize=function(t,e){this.setDOMSize(t,e),this.set("width",t),this.set("height",e),this.onCanvasChange("changeSize")},e.prototype.getRenderer=function(){return this.get("renderer")},e.prototype.getCursor=function(){return this.get("cursor")},e.prototype.setCursor=function(t){this.set("cursor",t);var e=this.get("el");s.c&&e&&(e.style.cursor=t)},e.prototype.getPointByEvent=function(t){if(this.get("supportCSSTransform")){if(fe&&!Object(s.e)(t.layerX)&&t.layerX!==t.offsetX)return{x:t.layerX,y:t.layerY};if(!Object(s.e)(t.offsetX))return{x:t.offsetX,y:t.offsetY}}var e=this.getClientByEvent(t),n=e.x,r=e.y;return this.getPointByClient(n,r)},e.prototype.getClientByEvent=function(t){var e=t;return t.touches&&(e="touchend"===t.type?t.changedTouches[0]:t.touches[0]),{x:e.clientX,y:e.clientY}},e.prototype.getPointByClient=function(t,e){var n=this.get("el").getBoundingClientRect();return{x:t-n.left,y:e-n.top}},e.prototype.getClientByPoint=function(t,e){var n=this.get("el").getBoundingClientRect();return{x:t+n.left,y:e+n.top}},e.prototype.draw=function(){},e.prototype.removeDom=function(){var t=this.get("el");t.parentNode.removeChild(t)},e.prototype.clearEvents=function(){this.get("eventController").destroy()},e.prototype.isCanvas=function(){return!0},e.prototype.getParent=function(){return null},e.prototype.destroy=function(){var e=this.get("timeline");this.get("destroyed")||(this.clear(),e&&e.stop(),this.clearEvents(),this.removeDom(),t.prototype.destroy.call(this))},e}(a.a);e.a=le},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=new Map;function i(t,e){r.set(t,e)}function o(t){return r.get(t)}var a=function(t){var e=t.attr();return{x:e.x,y:e.y,width:e.width,height:e.height}},s=function(t){var e=t.attr(),n=e.x,r=e.y,i=e.r;return{x:n-i,y:r-i,width:2*i,height:2*i}},u=n(20);function c(t,e){return t&&e?{minX:Math.min(t.minX,e.minX),minY:Math.min(t.minY,e.minY),maxX:Math.max(t.maxX,e.maxX),maxY:Math.max(t.maxY,e.maxY)}:t||e}function f(t,e){var n=t.get("startArrowShape"),r=t.get("endArrowShape");return n&&(e=c(e,n.getCanvasBBox())),r&&(e=c(e,r.getCanvasBBox())),e}var l=n(69),h=n(38),d=n(0);function p(t,e){var n=t.prePoint,r=t.currentPoint,i=t.nextPoint,o=Math.pow(r[0]-n[0],2)+Math.pow(r[1]-n[1],2),a=Math.pow(r[0]-i[0],2)+Math.pow(r[1]-i[1],2),s=Math.pow(n[0]-i[0],2)+Math.pow(n[1]-i[1],2),u=Math.acos((o+a-s)/(2*Math.sqrt(o)*Math.sqrt(a)));if(!u||0===Math.sin(u)||Object(d.u)(u,0))return{xExtra:0,yExtra:0};var c=Math.abs(Math.atan2(i[1]-r[1],i[0]-r[0])),f=Math.abs(Math.atan2(i[0]-r[0],i[1]-r[1]));return c=c>Math.PI/2?Math.PI-c:c,f=f>Math.PI/2?Math.PI-f:f,{xExtra:Math.cos(u/2-c)*(e/2*(1/Math.sin(u/2)))-e/2||0,yExtra:Math.cos(f-u/2)*(e/2*(1/Math.sin(u/2)))-e/2||0}}i("rect",a),i("image",a),i("circle",s),i("marker",s),i("polyline",(function(t){for(var e=t.attr().points,n=[],r=[],i=0;i\'})),n}var v=function(){function t(t){this.cfg={};var e=null,n=Object(l.H)("gradient_");return"l"===t.toLowerCase()[0]?function(t,e){var n,r,i=h.exec(t),o=Object(l.B)(Object(l.G)(parseFloat(i[1])),2*Math.PI),a=i[2];o>=0&&o<.5*Math.PI?(n={x:0,y:0},r={x:1,y:1}):.5*Math.PI<=o&&o\';e.innerHTML=n},t}(),x=function(){function t(t,e){this.cfg={};var n=Object(u.b)("marker"),r=Object(l.H)("marker_");n.setAttribute("id",r);var i=Object(u.b)("path");i.setAttribute("stroke",t.stroke||"none"),i.setAttribute("fill",t.fill||"none"),n.appendChild(i),n.setAttribute("overflow","visible"),n.setAttribute("orient","auto-start-reverse"),this.el=n,this.child=i,this.id=r;var o=t["marker-start"===e?"startArrow":"endArrow"];return this.stroke=t.stroke||"#000",!0===o?this._setDefaultPath(e,i):(this.cfg=o,this._setMarker(t.lineWidth,i)),this}return t.prototype.match=function(){return!1},t.prototype._setDefaultPath=function(t,e){var n=this.el;e.setAttribute("d","M0,0 L"+10*Math.cos(Math.PI/6)+",5 L0,10"),n.setAttribute("refX",""+10*Math.cos(Math.PI/6)),n.setAttribute("refY","5")},t.prototype._setMarker=function(t,e){var n=this.el,r=this.cfg.path,i=this.cfg.d;Object(l.m)(r)&&(r=r.map((function(t){return t.join(" ")})).join("")),e.setAttribute("d",r),n.appendChild(e),i&&n.setAttribute("refX",""+i/t)},t.prototype.update=function(t){var e=this.child;e.attr?e.attr("fill",t):e.setAttribute("fill",t)},t}(),w=function(){function t(t){this.type="clip",this.cfg={};var e=Object(u.b)("clipPath");this.el=e,this.id=Object(l.H)("clip_"),e.id=this.id;var n=t.cfg.el;return e.appendChild(n),this.cfg=t,this}return t.prototype.match=function(){return!1},t.prototype.remove=function(){var t=this.el;t.parentNode.removeChild(t)},t}(),S=/^p\\s*\\(\\s*([axyn])\\s*\\)\\s*(.*)/i,E=function(){function t(t){this.cfg={};var e=Object(u.b)("pattern");e.setAttribute("patternUnits","userSpaceOnUse");var n=Object(u.b)("image");e.appendChild(n);var r=Object(l.H)("pattern_");e.id=r,this.el=e,this.id=r,this.cfg=t;var i=S.exec(t)[2];n.setAttribute("href",i);var o=new Image;function a(){e.setAttribute("width",""+o.width),e.setAttribute("height",""+o.height)}return i.match(/^data:/i)||(o.crossOrigin="Anonymous"),o.src=i,o.complete?a():(o.onload=a,o.src=o.src),this}return t.prototype.match=function(t,e){return this.cfg===e},t}(),_=function(){function t(t){var e=Object(u.b)("defs"),n=Object(l.H)("defs_");e.id=n,t.appendChild(e),this.children=[],this.defaultArrow={},this.el=e,this.canvas=t}return t.prototype.find=function(t,e){for(var n=this.children,r=null,i=0;i=u.minX&&e<=u.maxX&&n>=u.minY&&n<=u.maxY}var s=n(57),u=n(78),c=n(16),f=n(30),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(r.b)(e,t),e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.renderer="canvas",e.autoDraw=!0,e.localRefresh=!0,e.refreshElements=[],e.clipView=!0,e.quickHit=!1,e},e.prototype.onCanvasChange=function(t){"attr"!==t&&"sort"!==t&&"changeSize"!==t||(this.set("refreshElements",[this]),this.draw())},e.prototype.getShapeBase=function(){return s},e.prototype.getGroupBase=function(){return u.a},e.prototype.getPixelRatio=function(){var t=this.get("pixelRatio")||Object(c.d)();return t>=1?Math.ceil(t):1},e.prototype.getViewRange=function(){return{minX:0,minY:0,maxX:this.cfg.width,maxY:this.cfg.height}},e.prototype.createDom=function(){var t=document.createElement("canvas"),e=t.getContext("2d");return this.set("context",e),t},e.prototype.setDOMSize=function(e,n){t.prototype.setDOMSize.call(this,e,n);var r=this.get("context"),i=this.get("el"),o=this.getPixelRatio();i.width=o*e,i.height=o*n,o>1&&r.scale(o,o)},e.prototype.clear=function(){t.prototype.clear.call(this),this._clearFrame();var e=this.get("context"),n=this.get("el");e.clearRect(0,0,n.width,n.height)},e.prototype.getShape=function(e,n){return this.get("quickHit")?function t(e,n,r){if(!a(e,n,r))return null;for(var i=null,s=e.getChildren(),u=s.length-1;u>=0;u--){var c=s[u];if(c.isGroup())i=t(c,n,r);else if(a(c,n,r)){var f=c,l=o(c,n,r),h=l[0],d=l[1];f.isInShape(h,d)&&(i=c)}if(i)break}return i}(this,e,n):t.prototype.getShape.call(this,e,n,null)},e.prototype._getRefreshRegion=function(){var t,e=this.get("refreshElements"),n=this.getViewRange();e.length&&e[0]===this?t=n:(t=Object(f.f)(e))&&(t.minX=Math.floor(t.minX),t.minY=Math.floor(t.minY),t.maxX=Math.ceil(t.maxX),t.maxY=Math.ceil(t.maxY),t.maxY+=1,this.get("clipView")&&(t=Object(f.g)(t,n)));return t},e.prototype.refreshElement=function(t){this.get("refreshElements").push(t)},e.prototype._clearFrame=function(){var t=this.get("drawFrame");t&&(Object(c.a)(t),this.set("drawFrame",null),this.set("refreshElements",[]))},e.prototype.draw=function(){var t=this.get("drawFrame");this.get("autoDraw")&&t||this._startDraw()},e.prototype._drawAll=function(){var t=this.get("context"),e=this.get("el"),n=this.getChildren();t.clearRect(0,0,e.width,e.height),Object(f.a)(t,this),Object(f.d)(t,n),this.set("refreshElements",[])},e.prototype._drawRegion=function(){var t=this.get("context"),e=this.get("refreshElements"),n=this.getChildren(),r=this._getRefreshRegion();r?(t.clearRect(r.minX,r.minY,r.maxX-r.minX,r.maxY-r.minY),t.save(),t.beginPath(),t.rect(r.minX,r.minY,r.maxX-r.minX,r.maxY-r.minY),t.clip(),Object(f.a)(t,this),Object(f.b)(this,n,r),Object(f.d)(t,n,r),t.restore()):e.length&&Object(f.c)(e),Object(c.c)(e,(function(t){t.get("hasChanged")&&t.set("hasChanged",!1)})),this.set("refreshElements",[])},e.prototype._startDraw=function(){var t=this,e=this.get("drawFrame");e||(e=Object(c.n)((function(){t.get("localRefresh")?t._drawRegion():t._drawAll(),t.set("drawFrame",null)})),this.set("drawFrame",e))},e.prototype.skipDraw=function(){},e}(i.AbstractCanvas);e.a=l},function(t,e,n){"use strict";var r;!function(t){t.PANSTART="PANSTART",t.PANEND="PANEND",t.PANMOVE="PANMOVE",t.PINCH="PINCH",t.KEYDOWN="KEYDOWN",t.KEYUP="KEYUP",t.HOVER="HOVER"}(r||(r={}));n(133)},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(493);e.default=function(t,e){return void 0===e&&(e=!0),{lazyInject:r.makePropertyInjectDecorator(t,e),lazyInjectNamed:r.makePropertyInjectNamedDecorator(t,e),lazyInjectTagged:r.makePropertyInjectTaggedDecorator(t,e),lazyMultiInject:r.makePropertyMultiInjectDecorator(t,e)}}},function(t,e,n){var r=n(217);t.exports=function(t){return t&&t.length?r(t):[]}},function(t,e,n){var r,i,o;function a(t){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}o=function(){"use strict";var t=function(t){return t instanceof Uint8Array||t instanceof Uint16Array||t instanceof Uint32Array||t instanceof Int8Array||t instanceof Int16Array||t instanceof Int32Array||t instanceof Float32Array||t instanceof Float64Array||t instanceof Uint8ClampedArray},e=function(t,e){for(var n=Object.keys(e),r=0;r=0&&(0|t)===t||n("invalid parameter type, ("+t+")"+i(e)+". must be a nonnegative integer")},oneOf:s,shaderError:function(t,e,n,i,o){if(!t.getShaderParameter(e,t.COMPILE_STATUS)){var a=t.getShaderInfoLog(e),s=i===t.FRAGMENT_SHADER?"fragment":"vertex";m(n,"string",s+" shader source must be a string",o);var u=g(n,o),f=function(t){var e=[];return t.split("\\n").forEach((function(t){if(!(t.length<5)){var n=/^ERROR:\\s+(\\d+):(\\d+):\\s*(.*)$/.exec(t);n?e.push(new h(0|n[1],0|n[2],n[3].trim())):t.length>0&&e.push(new h("unknown",0,t))}})),e}(a);!function(t,e){e.forEach((function(e){var n=t[e.file];if(n){var r=n.index[e.line];if(r)return r.errors.push(e),void(n.hasErrors=!0)}t.unknown.hasErrors=!0,t.unknown.lines[0].errors.push(e)}))}(u,f),Object.keys(u).forEach((function(t){var e=u[t];if(e.hasErrors){var n=[""],r=[""];i("file number "+t+": "+e.name+"\\n","color:red;text-decoration:underline;font-weight:bold"),e.lines.forEach((function(t){if(t.errors.length>0){i(c(t.number,4)+"| ","background-color:yellow; font-weight:bold"),i(t.line+"\\n","color:red; background-color:yellow; font-weight:bold");var e=0;t.errors.forEach((function(n){var r=n.message,o=/^\\s*\'(.*)\'\\s*:\\s*(.*)$/.exec(r);if(o){var a=o[1];switch(r=o[2],a){case"assign":a="="}e=Math.max(t.line.indexOf(a,e),0)}else e=0;i(c("| ",6)),i(c("^^^",e+3)+"\\n","font-weight:bold"),i(c("| ",6)),i(r+"\\n","font-weight:bold")})),i(c("| ",6)+"\\n")}else i(c(t.number,4)+"| "),i(t.line+"\\n","color:red")})),"undefined"==typeof document||window.chrome?console.log(n.join("")):(r[0]=n.join("%c"),console.log.apply(console,r))}function i(t,e){n.push(t),r.push(e||"")}})),r.raise("Error compiling "+s+" shader, "+u[0].name)}},linkError:function(t,e,n,i,o){if(!t.getProgramParameter(e,t.LINK_STATUS)){var a=t.getProgramInfoLog(e),s=g(n,o),u=\'Error linking program with vertex shader, "\'+g(i,o)[0].name+\'", and fragment shader "\'+s[0].name+\'"\';"undefined"!=typeof document?console.log("%c"+u+"\\n%c"+a,"color:red;text-decoration:underline;font-weight:bold","color:red"):console.log(u+"\\n"+a),r.raise(u)}},callSite:p,saveCommandRef:v,saveDrawInfo:function(t,e,n,r){function i(t){return t?r.id(t):0}function o(t,e){Object.keys(e).forEach((function(e){t[r.id(e)]=!0}))}v(t),t._fragId=i(t.static.frag),t._vertId=i(t.static.vert);var a=t._uniformSet={};o(a,e.static),o(a,e.dynamic);var s=t._attributeSet={};o(s,n.static),o(s,n.dynamic),t._hasCount="count"in t.static||"count"in t.dynamic||"elements"in t.static||"elements"in t.dynamic},framebufferFormat:function(t,e,n){t.texture?s(t.texture._texture.internalformat,e,"unsupported texture format for attachment"):s(t.renderbuffer._renderbuffer.format,n,"unsupported renderbuffer format for attachment")},guessCommand:d,texture2D:function(t,e,n){var i,o=e.width,a=e.height,s=e.channels;r(o>0&&o<=n.maxTextureSize&&a>0&&a<=n.maxTextureSize,"invalid texture shape"),33071===t.wrapS&&33071===t.wrapT||r(w(o)&&w(a),"incompatible wrap mode for texture, both width and height must be power of 2"),1===e.mipmask?1!==o&&1!==a&&r(9984!==t.minFilter&&9986!==t.minFilter&&9985!==t.minFilter&&9987!==t.minFilter,"min filter requires mipmap"):(r(w(o)&&w(a),"texture must be a square power of 2 to support mipmapping"),r(e.mipmask===(o<<1)-1,"missing or incomplete mipmap data")),5126===e.type&&(n.extensions.indexOf("oes_texture_float_linear")<0&&r(9728===t.minFilter&&9728===t.magFilter,"filter not supported, must enable oes_texture_float_linear"),r(!t.genMipmaps,"mipmap generation not supported with float textures"));var u=e.images;for(i=0;i<16;++i)if(u[i]){var c=o>>i,f=a>>i;r(e.mipmask&1<0&&o<=i.maxTextureSize&&a>0&&a<=i.maxTextureSize,"invalid texture shape"),r(o===a,"cube map must be square"),r(33071===e.wrapS&&33071===e.wrapT,"wrap mode not supported by cube map");for(var u=0;u>l,p=a>>l;r(c.mipmask&1<1&&n===r&&(\'"\'===n||"\'"===n))return[\'"\'+O(e.substr(1,e.length-2))+\'"\'];var i=/\\[(false|true|null|\\d+|\'[^\']*\'|"[^"]*")\\]/.exec(e);if(i)return t(e.substr(0,i.index)).concat(t(i[1])).concat(t(e.substr(i.index+i[0].length)));var o=e.split(".");if(1===o.length)return[\'"\'+O(e)+\'"\'];for(var a=[],s=0;s0,"invalid pixel ratio"))):S.raise("invalid arguments to regl"),n&&("canvas"===n.nodeName.toLowerCase()?i=n:r=n),!o){if(!i){S("undefined"!=typeof document,"must manually specify webgl context outside of DOM environments");var v=function(t,n,r){var i,o=document.createElement("canvas");function a(){var n=window.innerWidth,i=window.innerHeight;if(t!==document.body){var a=t.getBoundingClientRect();n=a.right-a.left,i=a.bottom-a.top}o.width=r*n,o.height=r*i,e(o.style,{width:n+"px",height:i+"px"})}return e(o.style,{border:0,margin:0,padding:0,top:0,left:0}),t.appendChild(o),t===document.body&&(o.style.position="absolute",e(t.style,{margin:0,padding:0})),t!==document.body&&"function"==typeof ResizeObserver?(i=new ResizeObserver((function(){setTimeout(a)}))).observe(t):window.addEventListener("resize",a,!1),a(),{canvas:o,onDestroy:function(){i?i.disconnect():window.removeEventListener("resize",a),t.removeChild(o)}}}(r||document.body,0,h);if(!v)return null;i=v.canvas,g=v.onDestroy}void 0===c.premultipliedAlpha&&(c.premultipliedAlpha=!0),o=function(t,e){function n(n){try{return t.getContext(n,e)}catch(t){return null}}return n("webgl")||n("experimental-webgl")||n("webgl-experimental")}(i,c)}return o?{gl:o,canvas:i,container:r,extensions:f,optionalExtensions:l,pixelRatio:h,profile:d,onDone:p,onDestroy:g}:(g(),p("webgl not supported, try upgrading your browser or graphics drivers http://get.webgl.org"),null)}function j(t,e){for(var n=Array(t),r=0;r65535)<<4,e|=n=((t>>>=e)>255)<<3,e|=n=((t>>>=n)>15)<<2,(e|=n=((t>>>=n)>3)<<1)|(t>>>=n)>>1}function N(){var t=j(8,(function(){return[]}));function e(e){var n=function(t){for(var e=16;e<=1<<28;e*=16)if(t<=e)return e;return 0}(e),r=t[D(n)>>2];return r.length>0?r.pop():new ArrayBuffer(n)}function n(e){t[D(e.byteLength)>>2].push(e)}return{alloc:e,free:n,allocType:function(t,n){var r=null;switch(t){case 5120:r=new Int8Array(e(n),0,n);break;case 5121:r=new Uint8Array(e(n),0,n);break;case 5122:r=new Int16Array(e(2*n),0,n);break;case 5123:r=new Uint16Array(e(2*n),0,n);break;case 5124:r=new Int32Array(e(4*n),0,n);break;case 5125:r=new Uint32Array(e(4*n),0,n);break;case 5126:r=new Float32Array(e(4*n),0,n);break;default:return null}return r.length!==n?r.subarray(0,n):r},freeType:function(t){n(t.buffer)}}}var R=N();function L(e){return!!e&&"object"===a(e)&&Array.isArray(e.shape)&&Array.isArray(e.stride)&&"number"==typeof e.offset&&e.shape.length===e.stride.length&&(Array.isArray(e.data)||t(e.data))}R.zero=N();var B=function(t){return Object.keys(t).map((function(e){return t[e]}))},G={shape:function(t){for(var e=[],n=t;n.length;n=n[0])e.push(n.length);return e},flatten:function(t,e,n,r){var i=1;if(e.length)for(var o=0;o>>31<<15,o=(r<<1>>>24)-127,a=r>>13&1023;if(o<-24)e[n]=i;else if(o<-14){var s=-14-o;e[n]=i+(a+1024>>s)}else e[n]=o>15?i+31744:i+(o+15<<10)+a}return e}function tt(e){return Array.isArray(e)||t(e)}var et=function(t){return!(t&t-1||!t)},nt=[9984,9986,9985,9987],rt=[0,6409,6410,6407,6408],it={};function ot(t){return"[object "+t+"]"}it[6409]=it[6406]=it[6402]=1,it[34041]=it[6410]=2,it[6407]=it[35904]=3,it[6408]=it[35906]=4;var at=ot("HTMLCanvasElement"),st=ot("OffscreenCanvas"),ut=ot("CanvasRenderingContext2D"),ct=ot("ImageBitmap"),ft=ot("HTMLImageElement"),lt=ot("HTMLVideoElement"),ht=Object.keys(U).concat([at,st,ut,ct,ft,lt]),dt=[];dt[5121]=1,dt[5126]=4,dt[36193]=2,dt[5123]=2,dt[5125]=4;var pt=[];function gt(t){return Array.isArray(t)&&(0===t.length||"number"==typeof t[0])}function vt(t){return!!Array.isArray(t)&&!(0===t.length||!tt(t[0]))}function yt(t){return Object.prototype.toString.call(t)}function mt(t){return yt(t)===at}function bt(t){return yt(t)===st}function xt(t){if(!t)return!1;var e=yt(t);return ht.indexOf(e)>=0||gt(t)||vt(t)||L(t)}function wt(t){return 0|U[Object.prototype.toString.call(t)]}function St(t,e){return R.allocType(36193===t.type?5126:t.type,e)}function Et(t,e){36193===t.type?(t.data=$(e),R.freeType(e)):t.data=e}function _t(t,e,n,r,i,o){var a;if(a=void 0!==pt[t]?pt[t]:it[t]*dt[e],o&&(a*=6),i){for(var s=0,u=n;u>=1;)s+=a*u*u,u/=2;return s}return a*n*r}function Ot(n,r,i,o,s,u,c){var f={"don\'t care":4352,"dont care":4352,nice:4354,fast:4353},l={repeat:10497,clamp:33071,mirror:33648},h={nearest:9728,linear:9729},d=e({mipmap:9987,"nearest mipmap nearest":9984,"linear mipmap nearest":9985,"nearest mipmap linear":9986,"linear mipmap linear":9987},h),p={none:0,browser:37444},g={uint8:5121,rgba4:32819,rgb565:33635,"rgb5 a1":32820},v={alpha:6406,luminance:6409,"luminance alpha":6410,rgb:6407,rgba:6408,rgba4:32854,"rgb5 a1":32855,rgb565:36194},y={};r.ext_srgb&&(v.srgb=35904,v.srgba=35906),r.oes_texture_float&&(g.float32=g.float=5126),r.oes_texture_half_float&&(g.float16=g["half float"]=36193),r.webgl_depth_texture&&(e(v,{depth:6402,"depth stencil":34041}),e(g,{uint16:5123,uint32:5125,"depth stencil":34042})),r.webgl_compressed_texture_s3tc&&e(y,{"rgb s3tc dxt1":33776,"rgba s3tc dxt1":33777,"rgba s3tc dxt3":33778,"rgba s3tc dxt5":33779}),r.webgl_compressed_texture_atc&&e(y,{"rgb atc":35986,"rgba atc explicit alpha":35987,"rgba atc interpolated alpha":34798}),r.webgl_compressed_texture_pvrtc&&e(y,{"rgb pvrtc 4bppv1":35840,"rgb pvrtc 2bppv1":35841,"rgba pvrtc 4bppv1":35842,"rgba pvrtc 2bppv1":35843}),r.webgl_compressed_texture_etc1&&(y["rgb etc1"]=36196);var m=Array.prototype.slice.call(n.getParameter(34467));Object.keys(y).forEach((function(t){var e=y[t];m.indexOf(e)>=0&&(v[t]=e)}));var b=Object.keys(v);i.textureFormats=b;var x=[];Object.keys(v).forEach((function(t){var e=v[t];x[e]=t}));var w=[];Object.keys(g).forEach((function(t){var e=g[t];w[e]=t}));var E=[];Object.keys(h).forEach((function(t){E[h[t]]=t}));var _=[];Object.keys(d).forEach((function(t){var e=d[t];_[e]=t}));var O=[];Object.keys(l).forEach((function(t){O[l[t]]=t}));var k=b.reduce((function(t,e){var n=v[e];return 6409===n||6406===n||6409===n||6410===n||6402===n||34041===n||r.ext_srgb&&(35904===n||35906===n)?t[n]=n:32855===n||e.indexOf("rgba")>=0?t[n]=6408:t[n]=6407,t}),{});function M(){this.internalformat=6408,this.format=6408,this.type=5121,this.compressed=!1,this.premultiplyAlpha=!1,this.flipY=!1,this.unpackAlignment=1,this.colorSpace=37444,this.width=0,this.height=0,this.channels=0}function A(t,e){t.internalformat=e.internalformat,t.format=e.format,t.type=e.type,t.compressed=e.compressed,t.premultiplyAlpha=e.premultiplyAlpha,t.flipY=e.flipY,t.unpackAlignment=e.unpackAlignment,t.colorSpace=e.colorSpace,t.width=e.width,t.height=e.height,t.channels=e.channels}function T(t,e){if("object"===a(e)&&e){if("premultiplyAlpha"in e&&(S.type(e.premultiplyAlpha,"boolean","invalid premultiplyAlpha"),t.premultiplyAlpha=e.premultiplyAlpha),"flipY"in e&&(S.type(e.flipY,"boolean","invalid texture flip"),t.flipY=e.flipY),"alignment"in e&&(S.oneOf(e.alignment,[1,2,4,8],"invalid texture unpack alignment"),t.unpackAlignment=e.alignment),"colorSpace"in e&&(S.parameter(e.colorSpace,p,"invalid colorSpace"),t.colorSpace=p[e.colorSpace]),"type"in e){var n=e.type;S(r.oes_texture_float||!("float"===n||"float32"===n),"you must enable the OES_texture_float extension in order to use floating point textures."),S(r.oes_texture_half_float||!("half float"===n||"float16"===n),"you must enable the OES_texture_half_float extension in order to use 16-bit floating point textures."),S(r.webgl_depth_texture||!("uint16"===n||"uint32"===n||"depth stencil"===n),"you must enable the WEBGL_depth_texture extension in order to use depth/stencil textures."),S.parameter(n,g,"invalid texture type"),t.type=g[n]}var o=t.width,s=t.height,u=t.channels,c=!1;"shape"in e?(S(Array.isArray(e.shape)&&e.shape.length>=2,"shape must be an array"),o=e.shape[0],s=e.shape[1],3===e.shape.length&&(u=e.shape[2],S(u>0&&u<=4,"invalid number of channels"),c=!0),S(o>=0&&o<=i.maxTextureSize,"invalid width"),S(s>=0&&s<=i.maxTextureSize,"invalid height")):("radius"in e&&(o=s=e.radius,S(o>=0&&o<=i.maxTextureSize,"invalid radius")),"width"in e&&(o=e.width,S(o>=0&&o<=i.maxTextureSize,"invalid width")),"height"in e&&(s=e.height,S(s>=0&&s<=i.maxTextureSize,"invalid height")),"channels"in e&&(u=e.channels,S(u>0&&u<=4,"invalid number of channels"),c=!0)),t.width=0|o,t.height=0|s,t.channels=0|u;var f=!1;if("format"in e){var l=e.format;S(r.webgl_depth_texture||!("depth"===l||"depth stencil"===l),"you must enable the WEBGL_depth_texture extension in order to use depth/stencil textures."),S.parameter(l,v,"invalid texture format");var h=t.internalformat=v[l];t.format=k[h],l in g&&("type"in e||(t.type=g[l])),l in y&&(t.compressed=!0),f=!0}!c&&f?t.channels=it[t.format]:c&&!f?t.channels!==rt[t.format]&&(t.format=t.internalformat=rt[t.channels]):f&&c&&S(t.channels===it[t.format],"number of channels inconsistent with specified format")}}function C(t){n.pixelStorei(37440,t.flipY),n.pixelStorei(37441,t.premultiplyAlpha),n.pixelStorei(37443,t.colorSpace),n.pixelStorei(3317,t.unpackAlignment)}function I(){M.call(this),this.xOffset=0,this.yOffset=0,this.data=null,this.needsFree=!1,this.element=null,this.needsCopy=!1}function P(e,n){var r=null;if(xt(n)?r=n:n&&(S.type(n,"object","invalid pixel data type"),T(e,n),"x"in n&&(e.xOffset=0|n.x),"y"in n&&(e.yOffset=0|n.y),xt(n.data)&&(r=n.data)),S(!e.compressed||r instanceof Uint8Array,"compressed texture data must be stored in a uint8array"),n.copy){S(!r,"can not specify copy and data field for the same texture");var o=s.viewportWidth,a=s.viewportHeight;e.width=e.width||o-e.xOffset,e.height=e.height||a-e.yOffset,e.needsCopy=!0,S(e.xOffset>=0&&e.xOffset=0&&e.yOffset0&&e.width<=o&&e.height>0&&e.height<=a,"copy texture read out of bounds")}else if(r){if(t(r))e.channels=e.channels||4,e.data=r,"type"in n||5121!==e.type||(e.type=wt(r));else if(gt(r))e.channels=e.channels||4,function(t,e){var n=e.length;switch(t.type){case 5121:case 5123:case 5125:case 5126:var r=R.allocType(t.type,n);r.set(e),t.data=r;break;case 36193:t.data=$(e);break;default:S.raise("unsupported texture type, must specify a typed array")}}(e,r),e.alignment=1,e.needsFree=!0;else if(L(r)){var u=r.data;Array.isArray(u)||5121!==e.type||(e.type=wt(u));var c,f,l,h,d,p,g=r.shape,v=r.stride;3===g.length?(l=g[2],p=v[2]):(S(2===g.length,"invalid ndarray pixel data, must be 2 or 3D"),l=1,p=1),c=g[0],f=g[1],h=v[0],d=v[1],e.alignment=1,e.width=c,e.height=f,e.channels=l,e.format=e.internalformat=rt[l],e.needsFree=!0,function(t,e,n,r,i,o){for(var a=t.width,s=t.height,u=t.channels,c=St(t,a*s*u),f=0,l=0;l=0,"oes_texture_float extension not enabled"):36193===e.type&&S(i.extensions.indexOf("oes_texture_half_float")>=0,"oes_texture_half_float extension not enabled")}function j(t,e,r){var i=t.element,a=t.data,s=t.internalformat,u=t.format,c=t.type,f=t.width,l=t.height;C(t),i?n.texImage2D(e,r,u,u,c,i):t.compressed?n.compressedTexImage2D(e,r,s,f,l,0,a):t.needsCopy?(o(),n.copyTexImage2D(e,r,u,t.xOffset,t.yOffset,f,l,0)):n.texImage2D(e,r,u,f,l,0,u,c,a||null)}function D(t,e,r,i,a){var s=t.element,u=t.data,c=t.internalformat,f=t.format,l=t.type,h=t.width,d=t.height;C(t),s?n.texSubImage2D(e,a,r,i,f,l,s):t.compressed?n.compressedTexSubImage2D(e,a,r,i,c,h,d,u):t.needsCopy?(o(),n.copyTexSubImage2D(e,a,r,i,t.xOffset,t.yOffset,h,d)):n.texSubImage2D(e,a,r,i,h,d,f,l,u)}var N=[];function F(){return N.pop()||new I}function U(t){t.needsFree&&R.freeType(t.data),I.call(t),N.push(t)}function z(){M.call(this),this.genMipmaps=!1,this.mipmapHint=4352,this.mipmask=0,this.images=Array(16)}function V(t,e,n){var r=t.images[0]=F();t.mipmask=1,r.width=t.width=e,r.height=t.height=n,r.channels=t.channels=4}function W(t,e){var n=null;if(xt(e))A(n=t.images[0]=F(),t),P(n,e),t.mipmask=1;else if(T(t,e),Array.isArray(e.mipmap))for(var r=e.mipmap,i=0;i>=i,n.height>>=i,P(n,r[i]),t.mipmask|=1<=0&&!("faces"in e)&&(t.genMipmaps=!0)}if("mag"in e){var r=e.mag;S.parameter(r,h),t.magFilter=h[r]}var o=t.wrapS,s=t.wrapT;if("wrap"in e){var u=e.wrap;"string"==typeof u?(S.parameter(u,l),o=s=l[u]):Array.isArray(u)&&(S.parameter(u[0],l),S.parameter(u[1],l),o=l[u[0]],s=l[u[1]])}else{if("wrapS"in e){var c=e.wrapS;S.parameter(c,l),o=l[c]}if("wrapT"in e){var p=e.wrapT;S.parameter(p,l),s=l[p]}}if(t.wrapS=o,t.wrapT=s,"anisotropic"in e){var g=e.anisotropic;S("number"==typeof g&&g>=1&&g<=i.maxAnisotropic,"aniso samples must be between 1 and "),t.anisotropic=e.anisotropic}if("mipmap"in e){var v=!1;switch(a(e.mipmap)){case"string":S.parameter(e.mipmap,f,"invalid mipmap hint"),t.mipmapHint=f[e.mipmap],t.genMipmaps=!0,v=!0;break;case"boolean":v=t.genMipmaps=e.mipmap;break;case"object":S(Array.isArray(e.mipmap),"invalid mipmap type"),t.genMipmaps=!1,v=!0;break;default:S.raise("invalid mipmap type")}v&&!("min"in e)&&(t.minFilter=9984)}}function Q(t,e){n.texParameteri(e,10241,t.minFilter),n.texParameteri(e,10240,t.magFilter),n.texParameteri(e,10242,t.wrapS),n.texParameteri(e,10243,t.wrapT),r.ext_texture_filter_anisotropic&&n.texParameteri(e,34046,t.anisotropic),t.genMipmaps&&(n.hint(33170,t.mipmapHint),n.generateMipmap(e))}var J=0,ot={},at=i.maxTextureUnits,st=Array(at).map((function(){return null}));function ht(t){M.call(this),this.mipmask=0,this.internalformat=6408,this.id=J++,this.refCount=1,this.target=t,this.texture=n.createTexture(),this.unit=-1,this.bindCount=0,this.texInfo=new K,c.profile&&(this.stats={size:0})}function dt(t){n.activeTexture(33984),n.bindTexture(t.target,t.texture)}function pt(){var t=st[0];t?n.bindTexture(t.target,t.texture):n.bindTexture(3553,null)}function Ot(t){var e=t.texture;S(e,"must not double destroy texture");var r=t.unit,i=t.target;r>=0&&(n.activeTexture(33984+r),n.bindTexture(i,null),st[r]=null),n.deleteTexture(e),t.texture=null,t.params=null,t.pixels=null,t.refCount=0,delete ot[t.id],u.textureCount--}return e(ht.prototype,{bind:function(){this.bindCount+=1;var t=this.unit;if(t<0){for(var e=0;e0)continue;r.unit=-1}st[e]=this,t=e;break}t>=at&&S.raise("insufficient number of texture units"),c.profile&&u.maxTextureUnits>u)-a,c.height=c.height||(r.height>>u)-s,S(r.type===c.type&&r.format===c.format&&r.internalformat===c.internalformat,"incompatible format for texture.subimage"),S(a>=0&&s>=0&&a+c.width<=r.width&&s+c.height<=r.height,"texture.subimage write out of bounds"),S(r.mipmask&1<>s;++s){var u=i>>s,f=a>>s;if(!u||!f)break;n.texImage2D(3553,s,r.format,u,f,0,r.format,r.type,null)}return pt(),c.profile&&(r.stats.size=_t(r.internalformat,r.type,i,a,!1,!1)),o},o._reglType="texture2d",o._texture=r,c.profile&&(o.stats=r.stats),o.destroy=function(){r.decRef()},o},createCube:function(t,e,r,o,s,f){var l=new ht(34067);ot[l.id]=l,u.cubeCount++;var h=new Array(6);function d(t,e,n,r,o,s){var u,f=l.texInfo;for(K.call(f),u=0;u<6;++u)h[u]=H();if("number"!=typeof t&&t)if("object"===a(t))if(e)W(h[0],t),W(h[1],e),W(h[2],n),W(h[3],r),W(h[4],o),W(h[5],s);else if(Z(f,t),T(l,t),"faces"in t){var p=t.faces;for(S(Array.isArray(p)&&6===p.length,"cube faces must be a length 6 array"),u=0;u<6;++u)S("object"===a(p[u])&&!!p[u],"invalid input for cube map face"),A(h[u],l),W(h[u],p[u])}else for(u=0;u<6;++u)W(h[u],t);else S.raise("invalid arguments to cube map");else{var g=0|t||1;for(u=0;u<6;++u)V(h[u],g,g)}for(A(l,h[0]),i.npotTextureCube||S(et(l.width)&&et(l.height),"your browser does not support non power or two texture dimensions"),f.genMipmaps?l.mipmask=(h[0].width<<1)-1:l.mipmask=h[0].mipmask,S.textureCube(l,f,h,i),l.internalformat=h[0].internalformat,d.width=h[0].width,d.height=h[0].height,dt(l),u=0;u<6;++u)X(h[u],34069+u);for(Q(f,34067),pt(),c.profile&&(l.stats.size=_t(l.internalformat,l.type,d.width,d.height,f.genMipmaps,!0)),d.format=x[l.internalformat],d.type=w[l.type],d.mag=E[f.magFilter],d.min=_[f.minFilter],d.wrapS=O[f.wrapS],d.wrapT=O[f.wrapT],u=0;u<6;++u)q(h[u]);return d}return d(t,e,r,o,s,f),d.subimage=function(t,e,n,r,i){S(!!e,"must specify image data"),S("number"==typeof t&&t===(0|t)&&t>=0&&t<6,"invalid face");var o=0|n,a=0|r,s=0|i,u=F();return A(u,l),u.width=0,u.height=0,P(u,e),u.width=u.width||(l.width>>s)-o,u.height=u.height||(l.height>>s)-a,S(l.type===u.type&&l.format===u.format&&l.internalformat===u.internalformat,"incompatible format for texture.subimage"),S(o>=0&&a>=0&&o+u.width<=l.width&&a+u.height<=l.height,"texture.subimage write out of bounds"),S(l.mipmask&1<>i;++i)n.texImage2D(34069+r,i,l.format,e>>i,e>>i,0,l.format,l.type,null);return pt(),c.profile&&(l.stats.size=_t(l.internalformat,l.type,d.width,d.height,!1,!0)),d}},d._reglType="textureCube",d._texture=l,c.profile&&(d.stats=l.stats),d.destroy=function(){l.decRef()},d},clear:function(){for(var t=0;t>e,t.height>>e,0,t.internalformat,t.type,null);else for(var r=0;r<6;++r)n.texImage2D(34069+r,e,t.internalformat,t.width>>e,t.height>>e,0,t.internalformat,t.type,null);Q(t.texInfo,t.target)}))},refresh:function(){for(var t=0;t=0&&f=0&&l0&&h+f<=i.framebufferWidth,"invalid width for read pixels"),S(d>0&&d+l<=i.framebufferHeight,"invalid height for read pixels"),r();var g=h*d*4;return p||(5121===c?p=new Uint8Array(g):5126===c&&(p=p||new Float32Array(g))),S.isTypedArray(p,"data buffer for regl.read() must be a typedarray"),S(p.byteLength>=g,"data buffer for regl.read() too small"),e.pixelStorei(3333,4),e.readPixels(f,l,h,d,6408,c,p),p}return function(t){return t&&"framebuffer"in t?function(t){var e;return n.setFBO({framebuffer:t.framebuffer},(function(){e=u(t)})),e}(t):u(t)}}function Nt(t){return Array.prototype.slice.call(t)}function Rt(t){return Nt(t).join("")}Pt[36053]="complete",Pt[36054]="incomplete attachment",Pt[36057]="incomplete dimensions",Pt[36055]="incomplete, missing attachment",Pt[36061]="unsupported";var Lt="xyzw".split(""),Bt="profile",Gt="framebuffer",Ft="vert",Ut="frag",zt="elements",Vt="primitive",Wt="count",Xt="offset",Yt="instances",Ht="vao",qt=Gt+"Width",Kt=Gt+"Height",Zt=["blend.func","blend.equation","stencil.func","stencil.opFront","stencil.opBack","sample.coverage","viewport","scissor.box","polygonOffset.offset"],Qt={0:0,1:1,zero:0,one:1,"src color":768,"one minus src color":769,"src alpha":770,"one minus src alpha":771,"dst color":774,"one minus dst color":775,"dst alpha":772,"one minus dst alpha":773,"constant color":32769,"one minus constant color":32770,"constant alpha":32771,"one minus constant alpha":32772,"src alpha saturate":776},Jt=["constant color, constant alpha","one minus constant color, constant alpha","constant color, one minus constant alpha","one minus constant color, one minus constant alpha","constant alpha, constant color","constant alpha, one minus constant color","one minus constant alpha, constant color","one minus constant alpha, one minus constant color"],$t={never:512,less:513,"<":513,equal:514,"=":514,"==":514,"===":514,lequal:515,"<=":515,greater:516,">":516,notequal:517,"!=":517,"!==":517,gequal:518,">=":518,always:519},te={0:0,zero:0,keep:7680,replace:7681,increment:7682,decrement:7683,"increment wrap":34055,"decrement wrap":34056,invert:5386},ee={frag:35632,vert:35633},ne={cw:2304,ccw:2305};function re(e){return Array.isArray(e)||t(e)||L(e)}function ie(t){return t.sort((function(t,e){return"viewport"===t?-1:"viewport"===e?1:t=1,r>=2,e)}if(4===n){var i=t.data;return new oe(i.thisDep,i.contextDep,i.propDep,e)}if(5===n)return new oe(!1,!1,!1,e);if(6===n){for(var o=!1,a=!1,s=!1,u=0;u=1&&(a=!0),f>=2&&(s=!0)}else 4===c.type&&(o=o||c.data.thisDep,a=a||c.data.contextDep,s=s||c.data.propDep)}return new oe(o,a,s,e)}return new oe(3===n,2===n,1===n,e)}var ce=new oe(!1,!1,!1,(function(){}));function fe(t,n,r,i,o,s,u,c,f,l,h,d,p,g,v){var y=l.Record,m={add:32774,subtract:32778,"reverse subtract":32779};r.ext_blend_minmax&&(m.min=32775,m.max=32776);var b=r.angle_instanced_arrays,x=r.webgl_draw_buffers,w={dirty:!0,profile:v.profile},E={},_=[],O={},k={};function A(t){return t.replace(".","_")}function T(t,e,n){var r=A(t);_.push(t),E[r]=w[r]=!!n,O[r]=e}function C(t,e,n){var r=A(t);_.push(t),Array.isArray(n)?(w[r]=n.slice(),E[r]=n.slice()):w[r]=E[r]=n,k[r]=e}T("dither",3024),T("blend.enable",3042),C("blend.color","blendColor",[0,0,0,0]),C("blend.equation","blendEquationSeparate",[32774,32774]),C("blend.func","blendFuncSeparate",[1,0,1,0]),T("depth.enable",2929,!0),C("depth.func","depthFunc",513),C("depth.range","depthRange",[0,1]),C("depth.mask","depthMask",!0),C("colorMask","colorMask",[!0,!0,!0,!0]),T("cull.enable",2884),C("cull.face","cullFace",1029),C("frontFace","frontFace",2305),C("lineWidth","lineWidth",1),T("polygonOffset.enable",32823),C("polygonOffset.offset","polygonOffset",[0,0]),T("sample.alpha",32926),T("sample.enable",32928),C("sample.coverage","sampleCoverage",[1,!1]),T("stencil.enable",2960),C("stencil.mask","stencilMask",-1),C("stencil.func","stencilFunc",[519,0,-1]),C("stencil.opFront","stencilOpSeparate",[1028,7680,7680,7680]),C("stencil.opBack","stencilOpSeparate",[1029,7680,7680,7680]),T("scissor.enable",3089),C("scissor.box","scissor",[0,0,t.drawingBufferWidth,t.drawingBufferHeight]),C("viewport","viewport",[0,0,t.drawingBufferWidth,t.drawingBufferHeight]);var I={gl:t,context:p,strings:n,next:E,current:w,draw:d,elements:s,buffer:o,shader:h,attributes:l.state,vao:l,uniforms:f,framebuffer:c,extensions:r,timer:g,isBufferArgs:re},P={primTypes:Z,compareFuncs:$t,blendFuncs:Qt,blendEquations:m,stencilOps:te,glTypes:z,orientationType:ne};S.optional((function(){I.isArrayLike=tt})),x&&(P.backBuffer=[1029],P.drawBuffer=j(i.maxDrawbuffers,(function(t){return 0===t?[0]:j(t,(function(t){return 36064+t}))})));var D=0;function N(){var t=function(){var t=0,n=[],r=[];function i(){var n=[],r=[];return e((function(){n.push.apply(n,Nt(arguments))}),{def:function(){var e="v"+t++;return r.push(e),arguments.length>0&&(n.push(e,"="),n.push.apply(n,Nt(arguments)),n.push(";")),e},toString:function(){return Rt([r.length>0?"var "+r.join(",")+";":"",Rt(n)])}})}function o(){var t=i(),n=i(),r=t.toString,o=n.toString;function a(e,r){n(e,r,"=",t.def(e,r),";")}return e((function(){t.apply(t,Nt(arguments))}),{def:t.def,entry:t,exit:n,save:a,set:function(e,n,r){a(e,n),t(e,n,"=",r,";")},toString:function(){return r()+o()}})}var a=i(),s={};return{global:a,link:function(e){for(var i=0;i=0,\'unknown parameter "\'+e+\'"\',d.commandStr)}))}e(p),e(g)}));var v=function(t,e){var n=t.static;if("string"==typeof n[Ut]&&"string"==typeof n[Ft]){if(Object.keys(e.dynamic).length>0)return null;var r=e.static,i=Object.keys(r);if(i.length>0&&"number"==typeof r[i[0]]){for(var o=[],a=0;a=0,"invalid "+t,n.commandStr)):u=!1,"height"in o?(s=0|o.height,S.command(s>=0,"invalid "+t,n.commandStr)):u=!1,new oe(!u&&e&&e.thisDep,!u&&e&&e.contextDep,!u&&e&&e.propDep,(function(t,e){var n=t.shared.context,r=a;"width"in o||(r=e.def(n,".",qt,"-",c));var i=s;return"height"in o||(i=e.def(n,".",Kt,"-",f)),[c,f,r,i]}))}if(t in i){var l=i[t],h=ue(l,(function(e,n){var r=e.invoke(n,l);S.optional((function(){e.assert(n,r+"&&typeof "+r+\'==="object"\',"invalid "+t)}));var i=e.shared.context,o=n.def(r,".x|0"),a=n.def(r,".y|0"),s=n.def(\'"width" in \',r,"?",r,".width|0:","(",i,".",qt,"-",o,")"),u=n.def(\'"height" in \',r,"?",r,".height|0:","(",i,".",Kt,"-",a,")");return S.optional((function(){e.assert(n,s+">=0&&"+u+">=0","invalid "+t)})),[o,a,s,u]}));return e&&(h.thisDep=h.thisDep||e.thisDep,h.contextDep=h.contextDep||e.contextDep,h.propDep=h.propDep||e.propDep),h}return e?new oe(e.thisDep,e.contextDep,e.propDep,(function(t,e){var n=t.shared.context;return[0,0,e.def(n,".",qt),e.def(n,".",Kt)]})):null}var a=o("viewport");if(a){var s=a;a=new oe(a.thisDep,a.contextDep,a.propDep,(function(t,e){var n=s.append(t,e),r=t.shared.context;return e.set(r,".viewportWidth",n[2]),e.set(r,".viewportHeight",n[3]),n}))}return{viewport:a,scissor_box:o("scissor.box")}}(t,x,d),E=function(t,e){var n=t.static,r=t.dynamic,i=function(){if(zt in n){var t=n[zt];re(t)?t=s.getElements(s.create(t,!0)):t&&(t=s.getElements(t),S.command(t,"invalid elements",e.commandStr));var i=se((function(e,n){if(t){var r=e.link(t);return e.ELEMENTS=r,r}return e.ELEMENTS=null,null}));return i.value=t,i}if(zt in r){var o=r[zt];return ue(o,(function(t,e){var n=t.shared,r=n.isBufferArgs,i=n.elements,a=t.invoke(e,o),s=e.def("null"),u=e.def(r,"(",a,")"),c=t.cond(u).then(s,"=",i,".createStream(",a,");").else(s,"=",i,".getElements(",a,");");return S.optional((function(){t.assert(c.else,"!"+a+"||"+s,"invalid elements")})),e.entry(c),e.exit(t.cond(u).then(i,".destroyStream(",s,");")),t.ELEMENTS=s,s}))}return null}();function o(t,o){if(t in n){var a=0|n[t];return S.command(!o||a>=0,"invalid "+t,e.commandStr),se((function(t,e){return o&&(t.OFFSET=a),a}))}if(t in r){var s=r[t];return ue(s,(function(e,n){var r=e.invoke(n,s);return o&&(e.OFFSET=r,S.optional((function(){e.assert(n,r+">=0","invalid "+t)}))),r}))}return o&&i?se((function(t,e){return t.OFFSET="0",0})):null}var a=o(Xt,!0);return{elements:i,primitive:function(){if(Vt in n){var t=n[Vt];return S.commandParameter(t,Z,"invalid primitve",e.commandStr),se((function(e,n){return Z[t]}))}if(Vt in r){var o=r[Vt];return ue(o,(function(t,e){var n=t.constants.primTypes,r=t.invoke(e,o);return S.optional((function(){t.assert(e,r+" in "+n,"invalid primitive, must be one of "+Object.keys(Z))})),e.def(n,"[",r,"]")}))}return i?ae(i)?i.value?se((function(t,e){return e.def(t.ELEMENTS,".primType")})):se((function(){return 4})):new oe(i.thisDep,i.contextDep,i.propDep,(function(t,e){var n=t.ELEMENTS;return e.def(n,"?",n,".primType:",4)})):null}(),count:function(){if(Wt in n){var t=0|n[Wt];return S.command("number"==typeof t&&t>=0,"invalid vertex count",e.commandStr),se((function(){return t}))}if(Wt in r){var o=r[Wt];return ue(o,(function(t,e){var n=t.invoke(e,o);return S.optional((function(){t.assert(e,"typeof "+n+\'==="number"&&\'+n+">=0&&"+n+"===("+n+"|0)","invalid vertex count")})),n}))}if(i){if(ae(i)){if(i)return a?new oe(a.thisDep,a.contextDep,a.propDep,(function(t,e){var n=e.def(t.ELEMENTS,".vertCount-",t.OFFSET);return S.optional((function(){t.assert(e,n+">=0","invalid vertex offset/element buffer too small")})),n})):se((function(t,e){return e.def(t.ELEMENTS,".vertCount")}));var s=se((function(){return-1}));return S.optional((function(){s.MISSING=!0})),s}var u=new oe(i.thisDep||a.thisDep,i.contextDep||a.contextDep,i.propDep||a.propDep,(function(t,e){var n=t.ELEMENTS;return t.OFFSET?e.def(n,"?",n,".vertCount-",t.OFFSET,":-1"):e.def(n,"?",n,".vertCount:-1")}));return S.optional((function(){u.DYNAMIC=!0})),u}return null}(),instances:o(Yt,!1),offset:a}}(t,d),O=function(t,e){var n=t.static,r=t.dynamic,o={};return _.forEach((function(t){var s=A(t);function u(e,i){if(t in n){var a=e(n[t]);o[s]=se((function(){return a}))}else if(t in r){var u=r[t];o[s]=ue(u,(function(t,e){return i(t,e,t.invoke(e,u))}))}}switch(t){case"cull.enable":case"blend.enable":case"dither":case"stencil.enable":case"depth.enable":case"scissor.enable":case"polygonOffset.enable":case"sample.alpha":case"sample.enable":case"depth.mask":return u((function(n){return S.commandType(n,"boolean",t,e.commandStr),n}),(function(e,n,r){return S.optional((function(){e.assert(n,"typeof "+r+\'==="boolean"\',"invalid flag "+t,e.commandStr)})),r}));case"depth.func":return u((function(n){return S.commandParameter(n,$t,"invalid "+t,e.commandStr),$t[n]}),(function(e,n,r){var i=e.constants.compareFuncs;return S.optional((function(){e.assert(n,r+" in "+i,"invalid "+t+", must be one of "+Object.keys($t))})),n.def(i,"[",r,"]")}));case"depth.range":return u((function(t){return S.command(tt(t)&&2===t.length&&"number"==typeof t[0]&&"number"==typeof t[1]&&t[0]<=t[1],"depth range is 2d array",e.commandStr),t}),(function(t,e,n){return S.optional((function(){t.assert(e,t.shared.isArrayLike+"("+n+")&&"+n+".length===2&&typeof "+n+\'[0]==="number"&&typeof \'+n+\'[1]==="number"&&\'+n+"[0]<="+n+"[1]","depth range must be a 2d array")})),[e.def("+",n,"[0]"),e.def("+",n,"[1]")]}));case"blend.func":return u((function(t){S.commandType(t,"object","blend.func",e.commandStr);var n="srcRGB"in t?t.srcRGB:t.src,r="srcAlpha"in t?t.srcAlpha:t.src,i="dstRGB"in t?t.dstRGB:t.dst,o="dstAlpha"in t?t.dstAlpha:t.dst;return S.commandParameter(n,Qt,s+".srcRGB",e.commandStr),S.commandParameter(r,Qt,s+".srcAlpha",e.commandStr),S.commandParameter(i,Qt,s+".dstRGB",e.commandStr),S.commandParameter(o,Qt,s+".dstAlpha",e.commandStr),S.command(-1===Jt.indexOf(n+", "+i),"unallowed blending combination (srcRGB, dstRGB) = ("+n+", "+i+")",e.commandStr),[Qt[n],Qt[i],Qt[r],Qt[o]]}),(function(e,n,r){var i=e.constants.blendFuncs;function o(o,a){var s=n.def(\'"\',o,a,\'" in \',r,"?",r,".",o,a,":",r,".",o);return S.optional((function(){e.assert(n,s+" in "+i,"invalid "+t+"."+o+a+", must be one of "+Object.keys(Qt))})),s}S.optional((function(){e.assert(n,r+"&&typeof "+r+\'==="object"\',"invalid blend func, must be an object")}));var a=o("src","RGB"),s=o("dst","RGB");S.optional((function(){var t=e.constants.invalidBlendCombinations;e.assert(n,t+".indexOf("+a+\'+", "+\'+s+") === -1 ","unallowed blending combination for (srcRGB, dstRGB)")}));var u=n.def(i,"[",a,"]"),c=n.def(i,"[",o("src","Alpha"),"]");return[u,n.def(i,"[",s,"]"),c,n.def(i,"[",o("dst","Alpha"),"]")]}));case"blend.equation":return u((function(n){return"string"==typeof n?(S.commandParameter(n,m,"invalid "+t,e.commandStr),[m[n],m[n]]):"object"===a(n)?(S.commandParameter(n.rgb,m,t+".rgb",e.commandStr),S.commandParameter(n.alpha,m,t+".alpha",e.commandStr),[m[n.rgb],m[n.alpha]]):void S.commandRaise("invalid blend.equation",e.commandStr)}),(function(e,n,r){var i=e.constants.blendEquations,o=n.def(),a=n.def(),s=e.cond("typeof ",r,\'==="string"\');return S.optional((function(){function n(t,n,r){e.assert(t,r+" in "+i,"invalid "+n+", must be one of "+Object.keys(m))}n(s.then,t,r),e.assert(s.else,r+"&&typeof "+r+\'==="object"\',"invalid "+t),n(s.else,t+".rgb",r+".rgb"),n(s.else,t+".alpha",r+".alpha")})),s.then(o,"=",a,"=",i,"[",r,"];"),s.else(o,"=",i,"[",r,".rgb];",a,"=",i,"[",r,".alpha];"),n(s),[o,a]}));case"blend.color":return u((function(t){return S.command(tt(t)&&4===t.length,"blend.color must be a 4d array",e.commandStr),j(4,(function(e){return+t[e]}))}),(function(t,e,n){return S.optional((function(){t.assert(e,t.shared.isArrayLike+"("+n+")&&"+n+".length===4","blend.color must be a 4d array")})),j(4,(function(t){return e.def("+",n,"[",t,"]")}))}));case"stencil.mask":return u((function(t){return S.commandType(t,"number",s,e.commandStr),0|t}),(function(t,e,n){return S.optional((function(){t.assert(e,"typeof "+n+\'==="number"\',"invalid stencil.mask")})),e.def(n,"|0")}));case"stencil.func":return u((function(n){S.commandType(n,"object",s,e.commandStr);var r=n.cmp||"keep",i=n.ref||0,o="mask"in n?n.mask:-1;return S.commandParameter(r,$t,t+".cmp",e.commandStr),S.commandType(i,"number",t+".ref",e.commandStr),S.commandType(o,"number",t+".mask",e.commandStr),[$t[r],i,o]}),(function(t,e,n){var r=t.constants.compareFuncs;return S.optional((function(){function i(){t.assert(e,Array.prototype.join.call(arguments,""),"invalid stencil.func")}i(n+"&&typeof ",n,\'==="object"\'),i(\'!("cmp" in \',n,")||(",n,".cmp in ",r,")")})),[e.def(\'"cmp" in \',n,"?",r,"[",n,".cmp]",":",7680),e.def(n,".ref|0"),e.def(\'"mask" in \',n,"?",n,".mask|0:-1")]}));case"stencil.opFront":case"stencil.opBack":return u((function(n){S.commandType(n,"object",s,e.commandStr);var r=n.fail||"keep",i=n.zfail||"keep",o=n.zpass||"keep";return S.commandParameter(r,te,t+".fail",e.commandStr),S.commandParameter(i,te,t+".zfail",e.commandStr),S.commandParameter(o,te,t+".zpass",e.commandStr),["stencil.opBack"===t?1029:1028,te[r],te[i],te[o]]}),(function(e,n,r){var i=e.constants.stencilOps;function o(o){return S.optional((function(){e.assert(n,\'!("\'+o+\'" in \'+r+")||("+r+"."+o+" in "+i+")","invalid "+t+"."+o+", must be one of "+Object.keys(te))})),n.def(\'"\',o,\'" in \',r,"?",i,"[",r,".",o,"]:",7680)}return S.optional((function(){e.assert(n,r+"&&typeof "+r+\'==="object"\',"invalid "+t)})),["stencil.opBack"===t?1029:1028,o("fail"),o("zfail"),o("zpass")]}));case"polygonOffset.offset":return u((function(t){S.commandType(t,"object",s,e.commandStr);var n=0|t.factor,r=0|t.units;return S.commandType(n,"number",s+".factor",e.commandStr),S.commandType(r,"number",s+".units",e.commandStr),[n,r]}),(function(e,n,r){return S.optional((function(){e.assert(n,r+"&&typeof "+r+\'==="object"\',"invalid "+t)})),[n.def(r,".factor|0"),n.def(r,".units|0")]}));case"cull.face":return u((function(t){var n=0;return"front"===t?n=1028:"back"===t&&(n=1029),S.command(!!n,s,e.commandStr),n}),(function(t,e,n){return S.optional((function(){t.assert(e,n+\'==="front"||\'+n+\'==="back"\',"invalid cull.face")})),e.def(n,\'==="front"?\',1028,":",1029)}));case"lineWidth":return u((function(t){return S.command("number"==typeof t&&t>=i.lineWidthDims[0]&&t<=i.lineWidthDims[1],"invalid line width, must be a positive number between "+i.lineWidthDims[0]+" and "+i.lineWidthDims[1],e.commandStr),t}),(function(t,e,n){return S.optional((function(){t.assert(e,"typeof "+n+\'==="number"&&\'+n+">="+i.lineWidthDims[0]+"&&"+n+"<="+i.lineWidthDims[1],"invalid line width")})),n}));case"frontFace":return u((function(t){return S.commandParameter(t,ne,s,e.commandStr),ne[t]}),(function(t,e,n){return S.optional((function(){t.assert(e,n+\'==="cw"||\'+n+\'==="ccw"\',"invalid frontFace, must be one of cw,ccw")})),e.def(n+\'==="cw"?2304:2305\')}));case"colorMask":return u((function(t){return S.command(tt(t)&&4===t.length,"color.mask must be length 4 array",e.commandStr),t.map((function(t){return!!t}))}),(function(t,e,n){return S.optional((function(){t.assert(e,t.shared.isArrayLike+"("+n+")&&"+n+".length===4","invalid color.mask")})),j(4,(function(t){return"!!"+n+"["+t+"]"}))}));case"sample.coverage":return u((function(t){S.command("object"===a(t)&&t,s,e.commandStr);var n="value"in t?t.value:1,r=!!t.invert;return S.command("number"==typeof n&&n>=0&&n<=1,"sample.coverage.value must be a number between 0 and 1",e.commandStr),[n,r]}),(function(t,e,n){return S.optional((function(){t.assert(e,n+"&&typeof "+n+\'==="object"\',"invalid sample.coverage")})),[e.def(\'"value" in \',n,"?+",n,".value:1"),e.def("!!",n,".invert")]}))}})),o}(t,d),k=function(t,e,r){var i=t.static,o=t.dynamic;function a(t){if(t in i){var e=n.id(i[t]);S.optional((function(){h.shader(ee[t],e,S.guessCommand())}));var r=se((function(){return e}));return r.id=e,r}if(t in o){var a=o[t];return ue(a,(function(e,n){var r=e.invoke(n,a),i=n.def(e.shared.strings,".id(",r,")");return S.optional((function(){n(e.shared.shader,".shader(",ee[t],",",i,",",e.command,");")})),i}))}return null}var s,u=a(Ut),c=a(Ft),f=null;return ae(u)&&ae(c)?(f=h.program(c.id,u.id,null,r),s=se((function(t,e){return t.link(f)}))):s=new oe(u&&u.thisDep||c&&c.thisDep,u&&u.contextDep||c&&c.contextDep,u&&u.propDep||c&&c.propDep,(function(t,e){var n,r=t.shared.shader;n=u?u.append(t,e):e.def(r,".",Ut);var i=r+".program("+(c?c.append(t,e):e.def(r,".",Ft))+","+n;return S.optional((function(){i+=","+t.command})),e.def(i+")")})),{frag:u,vert:c,progVar:s,program:f}}(t,0,v);function M(t){var e=w[t];e&&(O[t]=e)}M("viewport"),M(A("scissor.box"));var T=Object.keys(O).length>0,C={framebuffer:x,draw:E,shader:k,state:O,dirty:T,scopeVAO:null,drawVAO:null,useVAO:!1,attributes:{}};if(C.profile=function(t){var e,n=t.static,r=t.dynamic;if(Bt in n){var i=!!n[Bt];(e=se((function(t,e){return i}))).enable=i}else if(Bt in r){var o=r[Bt];e=ue(o,(function(t,e){return t.invoke(e,o)}))}return e}(t),C.uniforms=function(t,e){var n=t.static,r=t.dynamic,i={};return Object.keys(n).forEach((function(t){var r,o=n[t];if("number"==typeof o||"boolean"==typeof o)r=se((function(){return o}));else if("function"==typeof o){var a=o._reglType;"texture2d"===a||"textureCube"===a?r=se((function(t){return t.link(o)})):"framebuffer"===a||"framebufferCube"===a?(S.command(o.color.length>0,\'missing color attachment for framebuffer sent to uniform "\'+t+\'"\',e.commandStr),r=se((function(t){return t.link(o.color[0])}))):S.commandRaise(\'invalid data for uniform "\'+t+\'"\',e.commandStr)}else tt(o)?r=se((function(e){return e.global.def("[",j(o.length,(function(n){return S.command("number"==typeof o[n]||"boolean"==typeof o[n],"invalid uniform "+t,e.commandStr),o[n]})),"]")})):S.commandRaise(\'invalid or missing data for uniform "\'+t+\'"\',e.commandStr);r.value=o,i[t]=r})),Object.keys(r).forEach((function(t){var e=r[t];i[t]=ue(e,(function(t,n){return t.invoke(n,e)}))})),i}(u,d),C.drawVAO=C.scopeVAO=function(t,e){var n=t.static,r=t.dynamic;if(Ht in n){var i=n[Ht];return null!==i&&null===l.getVAO(i)&&(i=l.createVAO(i)),se((function(t){return t.link(l.getVAO(i))}))}if(Ht in r){var o=r[Ht];return ue(o,(function(t,e){var n=t.invoke(e,o);return e.def(t.shared.vao+".getVAO("+n+")")}))}return null}(t),!C.drawVAO&&k.program&&!v&&r.angle_instanced_arrays){var I=!0,P=k.program.attributes.map((function(t){var n=e.static[t];return I=I&&!!n,n}));if(I&&P.length>0){var D=l.getVAO(l.createVAO(P));C.drawVAO=new oe(null,null,null,(function(t,e){return t.link(D)})),C.useVAO=!0}}return v?C.useVAO=!0:C.attributes=function(t,e){var r=t.static,i=t.dynamic,s={};return Object.keys(r).forEach((function(t){var i=r[t],u=n.id(t),c=new y;if(re(i))c.state=1,c.buffer=o.getBuffer(o.create(i,34962,!1,!0)),c.type=0;else{var f=o.getBuffer(i);if(f)c.state=1,c.buffer=f,c.type=0;else if(S.command("object"===a(i)&&i,"invalid data for attribute "+t,e.commandStr),"constant"in i){var l=i.constant;c.buffer="null",c.state=2,"number"==typeof l?c.x=l:(S.command(tt(l)&&l.length>0&&l.length<=4,"invalid constant for attribute "+t,e.commandStr),Lt.forEach((function(t,e){e=0,\'invalid offset for attribute "\'+t+\'"\',e.commandStr);var d=0|i.stride;S.command(d>=0&&d<256,\'invalid stride for attribute "\'+t+\'", must be integer betweeen [0, 255]\',e.commandStr);var p=0|i.size;S.command(!("size"in i)||p>0&&p<=4,\'invalid size for attribute "\'+t+\'", must be 1,2,3,4\',e.commandStr);var g=!!i.normalized,v=0;"type"in i&&(S.commandParameter(i.type,z,"invalid type for attribute "+t,e.commandStr),v=z[i.type]);var m=0|i.divisor;"divisor"in i&&(S.command(0===m||b,\'cannot specify divisor for attribute "\'+t+\'", instancing not supported\',e.commandStr),S.command(m>=0,\'invalid divisor for attribute "\'+t+\'"\',e.commandStr)),S.optional((function(){var n=e.commandStr,r=["buffer","offset","divisor","normalized","type","size","stride"];Object.keys(i).forEach((function(e){S.command(r.indexOf(e)>=0,\'unknown parameter "\'+e+\'" for attribute pointer "\'+t+\'" (valid parameters are \'+r+")",n)}))})),c.buffer=f,c.state=1,c.size=p,c.normalized=g,c.type=v||f.dtype,c.offset=h,c.stride=d,c.divisor=m}}s[t]=se((function(t,e){var n=t.attribCache;if(u in n)return n[u];var r={isStream:!1};return Object.keys(c).forEach((function(t){r[t]=c[t]})),c.buffer&&(r.buffer=t.link(c.buffer),r.type=r.type||r.buffer+".dtype"),n[u]=r,r}))})),Object.keys(i).forEach((function(t){var e=i[t];s[t]=ue(e,(function(n,r){var i=n.invoke(r,e),o=n.shared,a=n.constants,s=o.isBufferArgs,u=o.buffer;S.optional((function(){n.assert(r,i+"&&(typeof "+i+\'==="object"||typeof \'+i+\'==="function")&&(\'+s+"("+i+")||"+u+".getBuffer("+i+")||"+u+".getBuffer("+i+".buffer)||"+s+"("+i+\'.buffer)||("constant" in \'+i+"&&(typeof "+i+\'.constant==="number"||\'+o.isArrayLike+"("+i+".constant))))",\'invalid dynamic attribute "\'+t+\'"\')}));var c={isStream:r.def(!1)},f=new y;f.state=1,Object.keys(f).forEach((function(t){c[t]=r.def(""+f[t])}));var l=c.buffer,h=c.type;function d(t){r(c[t],"=",i,".",t,"|0;")}return r("if(",s,"(",i,")){",c.isStream,"=true;",l,"=",u,".createStream(",34962,",",i,");",h,"=",l,".dtype;","}else{",l,"=",u,".getBuffer(",i,");","if(",l,"){",h,"=",l,".dtype;",\'}else if("constant" in \',i,"){",c.state,"=",2,";","if(typeof "+i+\'.constant === "number"){\',c[Lt[0]],"=",i,".constant;",Lt.slice(1).map((function(t){return c[t]})).join("="),"=0;","}else{",Lt.map((function(t,e){return c[t]+"="+i+".constant.length>"+e+"?"+i+".constant["+e+"]:0;"})).join(""),"}}else{","if(",s,"(",i,".buffer)){",l,"=",u,".createStream(",34962,",",i,".buffer);","}else{",l,"=",u,".getBuffer(",i,".buffer);","}",h,\'="type" in \',i,"?",a.glTypes,"[",i,".type]:",l,".dtype;",c.normalized,"=!!",i,".normalized;"),d("size"),d("offset"),d("stride"),d("divisor"),r("}}"),r.exit("if(",c.isStream,"){",u,".destroyStream(",l,");","}"),c}))})),s}(e,d),C.context=function(t){var e=t.static,n=t.dynamic,r={};return Object.keys(e).forEach((function(t){var n=e[t];r[t]=se((function(t,e){return"number"==typeof n||"boolean"==typeof n?""+n:t.link(n)}))})),Object.keys(n).forEach((function(t){var e=n[t];r[t]=ue(e,(function(t,n){return t.invoke(n,e)}))})),r}(f),C}function L(t,e,n){var r=t.shared.context,i=t.scope();Object.keys(n).forEach((function(o){e.save(r,"."+o);var a=n[o].append(t,e);Array.isArray(a)?i(r,".",o,"=[",a.join(),"];"):i(r,".",o,"=",a,";")})),e(i)}function B(t,e,n,r){var i,o=t.shared,a=o.gl,s=o.framebuffer;x&&(i=e.def(o.extensions,".webgl_draw_buffers"));var u,c=t.constants,f=c.drawBuffer,l=c.backBuffer;u=n?n.append(t,e):e.def(s,".next"),r||e("if(",u,"!==",s,".cur){"),e("if(",u,"){",a,".bindFramebuffer(",36160,",",u,".framebuffer);"),x&&e(i,".drawBuffersWEBGL(",f,"[",u,".colorAttachments.length]);"),e("}else{",a,".bindFramebuffer(",36160,",null);"),x&&e(i,".drawBuffersWEBGL(",l,");"),e("}",s,".cur=",u,";"),r||e("}")}function G(t,e,n){var r=t.shared,i=r.gl,o=t.current,a=t.next,s=r.current,u=r.next,c=t.cond(s,".dirty");_.forEach((function(e){var r,f,l=A(e);if(!(l in n.state))if(l in a){r=a[l],f=o[l];var h=j(w[l].length,(function(t){return c.def(r,"[",t,"]")}));c(t.cond(h.map((function(t,e){return t+"!=="+f+"["+e+"]"})).join("||")).then(i,".",k[l],"(",h,");",h.map((function(t,e){return f+"["+e+"]="+t})).join(";"),";"))}else{r=c.def(u,".",l);var d=t.cond(r,"!==",s,".",l);c(d),l in O?d(t.cond(r).then(i,".enable(",O[l],");").else(i,".disable(",O[l],");"),s,".",l,"=",r,";"):d(i,".",k[l],"(",r,");",s,".",l,"=",r,";")}})),0===Object.keys(n.state).length&&c(s,".dirty=false;"),e(c)}function F(t,e,n,r){var i=t.shared,o=t.current,a=i.current,s=i.gl;ie(Object.keys(n)).forEach((function(i){var u=n[i];if(!r||r(u)){var c=u.append(t,e);if(O[i]){var f=O[i];ae(u)?e(s,c?".enable(":".disable(",f,");"):e(t.cond(c).then(s,".enable(",f,");").else(s,".disable(",f,");")),e(a,".",i,"=",c,";")}else if(tt(c)){var l=o[i];e(s,".",k[i],"(",c,");",c.map((function(t,e){return l+"["+e+"]="+t})).join(";"),";")}else e(s,".",k[i],"(",c,");",a,".",i,"=",c,";")}}))}function U(t,e){b&&(t.instancing=e.def(t.shared.extensions,".angle_instanced_arrays"))}function V(t,e,n,r,i){var o,a,s,u=t.shared,c=t.stats,f=u.current,l=u.timer,h=n.profile;function d(){return"undefined"==typeof performance?"Date.now()":"performance.now()"}function p(t){t(o=e.def(),"=",d(),";"),"string"==typeof i?t(c,".count+=",i,";"):t(c,".count++;"),g&&(r?t(a=e.def(),"=",l,".getNumPendingQueries();"):t(l,".beginQuery(",c,");"))}function v(t){t(c,".cpuTime+=",d(),"-",o,";"),g&&(r?t(l,".pushScopeStats(",a,",",l,".getNumPendingQueries(),",c,");"):t(l,".endQuery();"))}function y(t){var n=e.def(f,".profile");e(f,".profile=",t,";"),e.exit(f,".profile=",n,";")}if(h){if(ae(h))return void(h.enable?(p(e),v(e.exit),y("true")):y("false"));y(s=h.append(t,e))}else s=e.def(f,".profile");var m=t.block();p(m),e("if(",s,"){",m,"}");var b=t.block();v(b),e.exit("if(",s,"){",b,"}")}function W(t,e,n,r,i){var o=t.shared;r.forEach((function(r){var a,s=r.name,u=n.attributes[s];if(u){if(!i(u))return;a=u.append(t,e)}else{if(!i(ce))return;var c=t.scopeAttrib(s);S.optional((function(){t.assert(e,c+".state","missing attribute "+s)})),a={},Object.keys(new y).forEach((function(t){a[t]=e.def(c,".",t)}))}!function(n,r,i){var a=o.gl,s=e.def(n,".location"),u=e.def(o.attributes,"[",s,"]"),c=i.state,f=i.buffer,l=[i.x,i.y,i.z,i.w],h=["buffer","normalized","offset","stride"];function d(){e("if(!",u,".buffer){",a,".enableVertexAttribArray(",s,");}");var n,o=i.type;if(n=i.size?e.def(i.size,"||",r):r,e("if(",u,".type!==",o,"||",u,".size!==",n,"||",h.map((function(t){return u+"."+t+"!=="+i[t]})).join("||"),"){",a,".bindBuffer(",34962,",",f,".buffer);",a,".vertexAttribPointer(",[s,n,o,i.normalized,i.stride,i.offset],");",u,".type=",o,";",u,".size=",n,";",h.map((function(t){return u+"."+t+"="+i[t]+";"})).join(""),"}"),b){var c=i.divisor;e("if(",u,".divisor!==",c,"){",t.instancing,".vertexAttribDivisorANGLE(",[s,c],");",u,".divisor=",c,";}")}}function p(){e("if(",u,".buffer){",a,".disableVertexAttribArray(",s,");",u,".buffer=null;","}if(",Lt.map((function(t,e){return u+"."+t+"!=="+l[e]})).join("||"),"){",a,".vertexAttrib4f(",s,",",l,");",Lt.map((function(t,e){return u+"."+t+"="+l[e]+";"})).join(""),"}")}1===c?d():2===c?p():(e("if(",c,"===",1,"){"),d(),e("}else{"),p(),e("}"))}(t.link(r),function(t){switch(t){case 35664:case 35667:case 35671:return 2;case 35665:case 35668:case 35672:return 3;case 35666:case 35669:case 35673:return 4;default:return 1}}(r.info.type),a)}))}function X(t,e,r,i,o){for(var a,s=t.shared,u=s.gl,c=0;c1?e(j(x,(function(t){return Array.isArray(f)?f[t]:f+"["+t+"]"}))):(S(!Array.isArray(f),"uniform value must not be an array"),e(f));e(");")}}function Y(t,e,n,r){var i=t.shared,o=i.gl,a=i.draw,s=r.draw,u=function(){var i,u=s.elements,c=e;return u?((u.contextDep&&r.contextDynamic||u.propDep)&&(c=n),i=u.append(t,c)):i=c.def(a,".",zt),i&&c("if("+i+")"+o+".bindBuffer(34963,"+i+".buffer.buffer);"),i}();function c(i){var o=s[i];return o?o.contextDep&&r.contextDynamic||o.propDep?o.append(t,n):o.append(t,e):e.def(a,".",i)}var f,l,h=c(Vt),d=c(Xt),p=function(){var i,o=s.count,u=e;return o?((o.contextDep&&r.contextDynamic||o.propDep)&&(u=n),i=o.append(t,u),S.optional((function(){o.MISSING&&t.assert(e,"false","missing vertex count"),o.DYNAMIC&&t.assert(u,i+">=0","missing vertex count")}))):(i=u.def(a,".",Wt),S.optional((function(){t.assert(u,i+">=0","missing vertex count")}))),i}();if("number"==typeof p){if(0===p)return}else n("if(",p,"){"),n.exit("}");b&&(f=c(Yt),l=t.instancing);var g=u+".type",v=s.elements&&ae(s.elements);function y(){function t(){n(l,".drawElementsInstancedANGLE(",[h,p,g,d+"<<(("+g+"-5121)>>1)",f],");")}function e(){n(l,".drawArraysInstancedANGLE(",[h,d,p,f],");")}u?v?t():(n("if(",u,"){"),t(),n("}else{"),e(),n("}")):e()}function m(){function t(){n(o+".drawElements("+[h,p,g,d+"<<(("+g+"-5121)>>1)"]+");")}function e(){n(o+".drawArrays("+[h,d,p]+");")}u?v?t():(n("if(",u,"){"),t(),n("}else{"),e(),n("}")):e()}b&&("number"!=typeof f||f>=0)?"string"==typeof f?(n("if(",f,">0){"),y(),n("}else if(",f,"<0){"),m(),n("}")):y():m()}function H(t,e,n,r,i){var o=N(),a=o.proc("body",i);return S.optional((function(){o.commandStr=e.commandStr,o.command=o.link(e.commandStr)})),b&&(o.instancing=a.def(o.shared.extensions,".angle_instanced_arrays")),t(o,a,n,r),o.compile().body}function q(t,e,n,r){U(t,e),n.useVAO?n.drawVAO?e(t.shared.vao,".setVAO(",n.drawVAO.append(t,e),");"):e(t.shared.vao,".setVAO(",t.shared.vao,".targetVAO);"):(e(t.shared.vao,".setVAO(null);"),W(t,e,n,r.attributes,(function(){return!0}))),X(t,e,n,r.uniforms,(function(){return!0})),Y(t,e,e,n)}function K(t,e,n,r){function i(){return!0}t.batchId="a1",U(t,e),W(t,e,n,r.attributes,i),X(t,e,n,r.uniforms,i),Y(t,e,e,n)}function Q(t,e,n,r){U(t,e);var i=n.contextDep,o=e.def(),a=e.def();t.shared.props=a,t.batchId=o;var s=t.scope(),u=t.scope();function c(t){return t.contextDep&&i||t.propDep}function f(t){return!c(t)}if(e(s.entry,"for(",o,"=0;",o,"<","a1",";++",o,"){",a,"=","a0","[",o,"];",u,"}",s.exit),n.needsContext&&L(t,u,n.context),n.needsFramebuffer&&B(t,u,n.framebuffer),F(t,u,n.state,c),n.profile&&c(n.profile)&&V(t,u,n,!1,!0),r)n.useVAO?n.drawVAO?c(n.drawVAO)?u(t.shared.vao,".setVAO(",n.drawVAO.append(t,u),");"):s(t.shared.vao,".setVAO(",n.drawVAO.append(t,s),");"):s(t.shared.vao,".setVAO(",t.shared.vao,".targetVAO);"):(s(t.shared.vao,".setVAO(null);"),W(t,s,n,r.attributes,f),W(t,u,n,r.attributes,c)),X(t,s,n,r.uniforms,f),X(t,u,n,r.uniforms,c),Y(t,s,u,n);else{var l=t.global.def("{}"),h=n.shader.progVar.append(t,u),d=u.def(h,".id"),p=u.def(l,"[",d,"]");u(t.shared.gl,".useProgram(",h,".program);","if(!",p,"){",p,"=",l,"[",d,"]=",t.link((function(e){return H(K,t,n,e,2)})),"(",h,");}",p,".call(this,a0[",o,"],",o,");")}}function J(t,e,n){var r=e.static[n];if(r&&function(t){if("object"===a(t)&&!tt(t)){for(var e=Object.keys(t),n=0;n0&&n(t.shared.current,".dirty=true;")}(s,u),function(t,e){var r=t.proc("scope",3);t.batchId="a2";var i=t.shared,o=i.current;function a(n){var o=e.shader[n];o&&r.set(i.shader,"."+n,o.append(t,r))}L(t,r,e.context),e.framebuffer&&e.framebuffer.append(t,r),ie(Object.keys(e.state)).forEach((function(n){var o=e.state[n].append(t,r);tt(o)?o.forEach((function(e,i){r.set(t.next[n],"["+i+"]",e)})):r.set(i.next,"."+n,o)})),V(t,r,e,!0,!0),[zt,Xt,Wt,Yt,Vt].forEach((function(n){var o=e.draw[n];o&&r.set(i.draw,"."+n,""+o.append(t,r))})),Object.keys(e.uniforms).forEach((function(o){var a=e.uniforms[o].append(t,r);Array.isArray(a)&&(a="["+a.join()+"]"),r.set(i.uniforms,"["+n.id(o)+"]",a)})),Object.keys(e.attributes).forEach((function(n){var i=e.attributes[n].append(t,r),o=t.scopeAttrib(n);Object.keys(new y).forEach((function(t){r.set(o,"."+t,i[t])}))})),e.scopeVAO&&r.set(i.vao,".targetVAO",e.scopeVAO.append(t,r)),a(Ft),a(Ut),Object.keys(e.state).length>0&&(r(o,".dirty=true;"),r.exit(o,".dirty=true;")),r("a1(",t.shared.context,",a0,",t.batchId,");")}(s,u),function(t,e){var n=t.proc("batch",2);t.batchId="0",U(t,n);var r=!1,i=!0;Object.keys(e.context).forEach((function(t){r=r||e.context[t].propDep})),r||(L(t,n,e.context),i=!1);var o=e.framebuffer,a=!1;function s(t){return t.contextDep&&r||t.propDep}o?(o.propDep?r=a=!0:o.contextDep&&r&&(a=!0),a||B(t,n,o)):B(t,n,null),e.state.viewport&&e.state.viewport.propDep&&(r=!0),G(t,n,e),F(t,n,e.state,(function(t){return!s(t)})),e.profile&&s(e.profile)||V(t,n,e,!1,"a1"),e.contextDep=r,e.needsContext=i,e.needsFramebuffer=a;var u=e.shader.progVar;if(u.contextDep&&r||u.propDep)Q(t,n,e,null);else{var c=u.append(t,n);if(n(t.shared.gl,".useProgram(",c,".program);"),e.shader.program)Q(t,n,e,e.shader.program);else{n(t.shared.vao,".setVAO(null);");var f=t.global.def("{}"),l=n.def(c,".id"),h=n.def(f,"[",l,"]");n(t.cond(h).then(h,".call(this,a0,a1);").else(h,"=",f,"[",l,"]=",t.link((function(n){return H(Q,t,e,n,2)})),"(",c,");",h,".call(this,a0,a1);"))}}Object.keys(e.state).length>0&&n(t.shared.current,".dirty=true;")}(s,u),e(s.compile(),{destroy:function(){u.shader.program.destroy()}})}}}var le=function(t,e){if(!e.ext_disjoint_timer_query)return null;var n=[];function r(t){n.push(t)}var i=[];function o(){this.startQueryIndex=-1,this.endQueryIndex=-1,this.sum=0,this.stats=null}var a=[];function s(t){a.push(t)}var u=[];function c(t,e,n){var r=a.pop()||new o;r.startQueryIndex=t,r.endQueryIndex=e,r.sum=0,r.stats=n,u.push(r)}var f=[],l=[];return{beginQuery:function(t){var r=n.pop()||e.ext_disjoint_timer_query.createQueryEXT();e.ext_disjoint_timer_query.beginQueryEXT(35007,r),i.push(r),c(i.length-1,i.length,t)},endQuery:function(){e.ext_disjoint_timer_query.endQueryEXT(35007)},pushScopeStats:c,update:function(){var t,n,o=i.length;if(0!==o){l.length=Math.max(l.length,o+1),f.length=Math.max(f.length,o+1),f[0]=0,l[0]=0;var a=0;for(t=0,n=0;n0)if(Array.isArray(n[0])){s=X(n);for(var f=1,l=1;l0)if("number"==typeof e[0]){var o=R.allocType(h.dtype,e.length);q(o,e),p(o,i),R.freeType(o)}else if(Array.isArray(e[0])||t(e[0])){r=X(e);var a=W(e,r,h.dtype);p(a,i),R.freeType(a)}else S.raise("invalid buffer data")}else if(L(e)){r=e.shape;var s=e.stride,u=0,c=0,f=0,l=0;1===r.length?(u=r[0],c=1,f=s[0],l=0):2===r.length?(u=r[0],c=r[1],f=s[0],l=s[1]):S.raise("invalid shape");var g=Array.isArray(e.data)?h.dtype:H(e.data),v=R.allocType(g,u*c);K(v,e.data,u,c,f,l,e.offset),p(v,i),R.freeType(v)}else S.raise("invalid data for buffer subdata");return d},r.profile&&(d.stats=h.stats),d.destroy=function(){l(h)},d},createStream:function(t,e){var n=u.pop();return n||(n=new s(t)),n.bind(),f(n,e,35040,0,1,!1),n},destroyStream:function(t){u.push(t)},clear:function(){B(a).forEach(l),u.forEach(l)},getBuffer:function(t){return t&&t._buffer instanceof s?t._buffer:null},restore:function(){B(a).forEach((function(t){t.buffer=e.createBuffer(),e.bindBuffer(t.type,t.buffer),e.bufferData(t.type,t.persistentData||t.byteLength,t.usage)}))},_initBuffer:f}}(i,h,r,(function(t){return w.destroyBuffer(t)})),w=function(e,n,r,i,o){for(var a=r.maxAttributes,s=new Array(a),u=0;u0,"must specify at least one attribute");var i={},u=r.attributes;u.length=e.length;for(var c=0;c=d.byteLength?f.subdata(d):(f.destroy(),r.buffers[c]=null)),r.buffers[c]||(f=r.buffers[c]=o.create(l,34962,!1,!0)),h.buffer=o.getBuffer(f),h.size=0|h.buffer.dimension,h.normalized=!1,h.type=h.buffer.dtype,h.offset=0,h.stride=0,h.divisor=0,h.state=1,i[c]=1):o.getBuffer(l)?(h.buffer=o.getBuffer(l),h.size=0|h.buffer.dimension,h.normalized=!1,h.type=h.buffer.dtype,h.offset=0,h.stride=0,h.divisor=0,h.state=1):o.getBuffer(l.buffer)?(h.buffer=o.getBuffer(l.buffer),h.size=0|(+l.size||h.buffer.dimension),h.normalized=!!l.normalized||!1,"type"in l?(S.parameter(l.type,z,"invalid buffer type"),h.type=z[l.type]):h.type=h.buffer.dtype,h.offset=0|(l.offset||0),h.stride=0|(l.stride||0),h.divisor=0|(l.divisor||0),h.state=1,S(h.size>=1&&h.size<=4,"size must be between 1 and 4"),S(h.offset>=0,"invalid offset"),S(h.stride>=0&&h.stride<=255,"stride must be between 0 and 255"),S(h.divisor>=0,"divisor must be positive"),S(!h.divisor||!!n.angle_instanced_arrays,"ANGLE_instanced_arrays must be enabled to use divisor")):"x"in l?(S(c>0,"first attribute must not be a constant"),h.x=+l.x||0,h.y=+l.y||0,h.z=+l.z||0,h.w=+l.w||0,h.state=2):S(!1,"invalid attribute spec for location "+c)}for(var p=0;p>=1:5125===l&&(d>>=2)),i.vertCount=d;var p=s;if(s<0){p=4;var g=i.buffer.dimension;1===g&&(p=0),2===g&&(p=1),3===g&&(p=4)}i.primType=p}function l(t){i.elementsCount--,S(null!==t.buffer,"must not double destroy elements"),delete o[t.id],t.buffer.destroy(),t.buffer=null}return{create:function(e,n){var o=r.create(null,34963,!0),a=new u(o._buffer);function c(e){if(e)if("number"==typeof e)o(e),a.primType=4,a.vertCount=0|e,a.type=5121;else{var n=null,r=35044,i=-1,u=-1,l=0,h=0;Array.isArray(e)||t(e)||L(e)?n=e:(S.type(e,"object","invalid arguments for elements"),"data"in e&&(n=e.data,S(Array.isArray(n)||t(n)||L(n),"invalid data for element buffer")),"usage"in e&&(S.parameter(e.usage,V,"invalid element buffer usage"),r=V[e.usage]),"primitive"in e&&(S.parameter(e.primitive,Z,"invalid element buffer primitive"),i=Z[e.primitive]),"count"in e&&(S("number"==typeof e.count&&e.count>=0,"invalid vertex count for elements"),u=0|e.count),"type"in e&&(S.parameter(e.type,s,"invalid buffer type"),h=s[e.type]),"length"in e?l=0|e.length:(l=u,5123===h||5122===h?l*=2:5125!==h&&5124!==h||(l*=4))),f(a,n,r,i,u,l,h)}else o(),a.primType=4,a.vertCount=0,a.type=5121;return c}return i.elementsCount++,c(e),c._reglType="elements",c._elements=a,c.subdata=function(t,e){return o.subdata(t,e),c},c.destroy=function(){l(a)},c},createStream:function(t){var e=c.pop();return e||(e=new u(r.create(null,34963,!0,!1)._buffer)),f(e,t,35040,-1,-1,0,0),e},destroyStream:function(t){c.push(t)},getElements:function(t){return"function"==typeof t&&t._elements instanceof u?t._elements:null},clear:function(){B(o).forEach(l)}}}(i,d,x,h),_=function(t,n,r,i){var o={},a={};function s(t,e,n,r){this.name=t,this.id=e,this.location=n,this.info=r}function u(t,e){for(var n=0;n1)for(var y=0;yt&&(t=e.stats.uniformsCount)})),t},r.getMaxAttributesCount=function(){var t=0;return l.forEach((function(e){e.stats.attributesCount>t&&(t=e.stats.attributesCount)})),t}),{clear:function(){var e=t.deleteShader.bind(t);B(o).forEach(e),o={},B(a).forEach(e),a={},l.forEach((function(e){t.deleteProgram(e.program)})),l.length=0,f={},r.shaderCount=0},program:function(n,i,s,u){S.command(n>=0,"missing vertex shader",s),S.command(i>=0,"missing fragment shader",s);var c=f[i];c||(c=f[i]={});var h=c[n];if(h&&(h.refCount++,!u))return h;var g=new d(i,n);return r.shaderCount++,p(g,s,u),h||(c[n]=g),l.push(g),e(g,{destroy:function(){if(g.refCount--,g.refCount<=0){t.deleteProgram(g.program);var e=l.indexOf(g);l.splice(e,1),r.shaderCount--}c[g.vertId].refCount<=0&&(t.deleteShader(a[g.vertId]),delete a[g.vertId],delete f[g.fragId][g.vertId]),Object.keys(f[g.fragId]).length||(t.deleteShader(o[g.fragId]),delete o[g.fragId],delete f[g.fragId])}})},restore:function(){o={},a={};for(var t=0;t=2,"invalid renderbuffer shape"),u=0|p[0],c=0|p[1]}else"radius"in d&&(u=c=0|d.radius),"width"in d&&(u=0|d.width),"height"in d&&(c=0|d.height);"format"in d&&(S.parameter(d.format,o,"invalid renderbuffer format"),f=o[d.format])}else"number"==typeof e?(u=0|e,c="number"==typeof r?0|r:u):e?S.raise("invalid arguments to renderbuffer constructor"):u=c=1;if(S(u>0&&c>0&&u<=n.maxRenderbufferSize&&c<=n.maxRenderbufferSize,"invalid renderbuffer size"),u!==l.width||c!==l.height||f!==l.format)return h.width=l.width=u,h.height=l.height=c,l.format=f,t.bindRenderbuffer(36161,l.renderbuffer),t.renderbufferStorage(36161,f,u,c),S(0===t.getError(),"invalid render buffer format"),i.profile&&(l.stats.size=Mt(l.format,l.width,l.height)),h.format=s[l.format],h}return c[l.id]=l,r.renderbufferCount++,h(e,u),h.resize=function(e,r){var o=0|e,a=0|r||o;return o===l.width&&a===l.height||(S(o>0&&a>0&&o<=n.maxRenderbufferSize&&a<=n.maxRenderbufferSize,"invalid renderbuffer size"),h.width=l.width=o,h.height=l.height=a,t.bindRenderbuffer(36161,l.renderbuffer),t.renderbufferStorage(36161,l.format,o,a),S(0===t.getError(),"invalid render buffer format"),i.profile&&(l.stats.size=Mt(l.format,l.width,l.height))),h},h._reglType="renderbuffer",h._renderbuffer=l,i.profile&&(h.stats=l.stats),h.destroy=function(){l.decRef()},h},clear:function(){B(c).forEach(l)},restore:function(){B(c).forEach((function(e){e.renderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,e.renderbuffer),t.renderbufferStorage(36161,e.format,e.width,e.height)})),t.bindRenderbuffer(36161,null)}}}(i,d,b,h,r),C=function(t,n,r,i,o,s){var u={cur:null,next:null,dirty:!1,setFBO:null},c=["rgba"],f=["rgba4","rgb565","rgb5 a1"];n.ext_srgb&&f.push("srgba"),n.ext_color_buffer_half_float&&f.push("rgba16f","rgb16f"),n.webgl_color_buffer_float&&f.push("rgba32f");var l=["uint8"];function h(t,e,n){this.target=t,this.texture=e,this.renderbuffer=n;var r=0,i=0;e?(r=e.width,i=e.height):n&&(r=n.width,i=n.height),this.width=r,this.height=i}function d(t){t&&(t.texture&&t.texture._texture.decRef(),t.renderbuffer&&t.renderbuffer._renderbuffer.decRef())}function p(t,e,n){if(t)if(t.texture){var r=t.texture._texture,i=Math.max(1,r.width),o=Math.max(1,r.height);S(i===e&&o===n,"inconsistent width/height for supplied texture"),r.refCount+=1}else{var a=t.renderbuffer._renderbuffer;S(a.width===e&&a.height===n,"inconsistent width/height for renderbuffer"),a.refCount+=1}}function g(e,n){n&&(n.texture?t.framebufferTexture2D(36160,e,n.target,n.texture._texture.texture,0):t.framebufferRenderbuffer(36160,e,36161,n.renderbuffer._renderbuffer.renderbuffer))}function v(t){var e=3553,n=null,r=null,i=t;"object"===a(t)&&(i=t.data,"target"in t&&(e=0|t.target)),S.type(i,"function","invalid attachment data");var o=i._reglType;return"texture2d"===o?(n=i,S(3553===e)):"textureCube"===o?(n=i,S(e>=34069&&e<34075,"invalid cube map target")):"renderbuffer"===o?(r=i,e=36161):S.raise("invalid regl object for attachment"),new h(e,n,r)}function y(t,e,n,r,a){if(n){var s=i.create2D({width:t,height:e,format:r,type:a});return s._texture.refCount=0,new h(3553,s,null)}var u=o.create({width:t,height:e,format:r});return u._renderbuffer.refCount=0,new h(36161,null,u)}function m(t){return t&&(t.texture||t.renderbuffer)}function b(t,e,n){t&&(t.texture?t.texture.resize(e,n):t.renderbuffer&&t.renderbuffer.resize(e,n),t.width=e,t.height=n)}n.oes_texture_half_float&&l.push("half float","float16"),n.oes_texture_float&&l.push("float","float32");var x=0,w={};function E(){this.id=x++,w[this.id]=this,this.framebuffer=t.createFramebuffer(),this.width=0,this.height=0,this.colorAttachments=[],this.depthAttachment=null,this.stencilAttachment=null,this.depthStencilAttachment=null}function _(t){t.colorAttachments.forEach(d),d(t.depthAttachment),d(t.stencilAttachment),d(t.depthStencilAttachment)}function O(e){var n=e.framebuffer;S(n,"must not double destroy framebuffer"),t.deleteFramebuffer(n),e.framebuffer=null,s.framebufferCount--,delete w[e.id]}function k(e){var n;t.bindFramebuffer(36160,e.framebuffer);var i=e.colorAttachments;for(n=0;n=2,"invalid shape for framebuffer"),s=P[0],h=P[1]}else"radius"in I&&(s=h=I.radius),"width"in I&&(s=I.width),"height"in I&&(h=I.height);("color"in I||"colors"in I)&&(b=I.color||I.colors,Array.isArray(b)&&S(1===b.length||n.webgl_draw_buffers,"multiple render targets not supported")),b||("colorCount"in I&&(O=0|I.colorCount,S(O>0,"invalid color buffer count")),"colorTexture"in I&&(x=!!I.colorTexture,w="rgba4"),"colorType"in I&&(E=I.colorType,x?(S(n.oes_texture_float||!("float"===E||"float32"===E),"you must enable OES_texture_float in order to use floating point framebuffer objects"),S(n.oes_texture_half_float||!("half float"===E||"float16"===E),"you must enable OES_texture_half_float in order to use 16-bit floating point framebuffer objects")):"half float"===E||"float16"===E?(S(n.ext_color_buffer_half_float,"you must enable EXT_color_buffer_half_float to use 16-bit render buffers"),w="rgba16f"):"float"!==E&&"float32"!==E||(S(n.webgl_color_buffer_float,"you must enable WEBGL_color_buffer_float in order to use 32-bit floating point renderbuffers"),w="rgba32f"),S.oneOf(E,l,"invalid color type")),"colorFormat"in I&&(w=I.colorFormat,c.indexOf(w)>=0?x=!0:f.indexOf(w)>=0?x=!1:x?S.oneOf(I.colorFormat,c,"invalid color format for texture"):S.oneOf(I.colorFormat,f,"invalid color format for renderbuffer"))),("depthTexture"in I||"depthStencilTexture"in I)&&(C=!(!I.depthTexture&&!I.depthStencilTexture),S(!C||n.webgl_depth_texture,"webgl_depth_texture extension not supported")),"depth"in I&&("boolean"==typeof I.depth?d=I.depth:(M=I.depth,g=!1)),"stencil"in I&&("boolean"==typeof I.stencil?g=I.stencil:(A=I.stencil,d=!1)),"depthStencil"in I&&("boolean"==typeof I.depthStencil?d=g=I.depthStencil:(T=I.depthStencil,d=!1,g=!1))}else s=h=1;var j=null,D=null,N=null,R=null;if(Array.isArray(b))j=b.map(v);else if(b)j=[v(b)];else for(j=new Array(O),i=0;i=0||j[i].renderbuffer&&It.indexOf(j[i].renderbuffer._renderbuffer.format)>=0,"framebuffer color attachment "+i+" is invalid"),j[i]&&j[i].texture){var B=Tt[j[i].texture._texture.format]*Ct[j[i].texture._texture.type];null===L?L=B:S(L===B,"all color attachments much have the same number of bits per pixel.")}return p(D,s,h),S(!D||D.texture&&6402===D.texture._texture.format||D.renderbuffer&&33189===D.renderbuffer._renderbuffer.format,"invalid depth attachment for framebuffer object"),p(N,s,h),S(!N||N.renderbuffer&&36168===N.renderbuffer._renderbuffer.format,"invalid stencil attachment for framebuffer object"),p(R,s,h),S(!R||R.texture&&34041===R.texture._texture.format||R.renderbuffer&&34041===R.renderbuffer._renderbuffer.format,"invalid depth-stencil attachment for framebuffer object"),_(o),o.width=s,o.height=h,o.colorAttachments=j,o.depthAttachment=D,o.stencilAttachment=N,o.depthStencilAttachment=R,a.color=j.map(m),a.depth=m(D),a.stencil=m(N),a.depthStencil=m(R),a.width=o.width,a.height=o.height,k(o),a}return s.framebufferCount++,a(t,i),e(a,{resize:function(t,e){S(u.next!==o,"can not resize a framebuffer which is currently in use");var n=Math.max(0|t,1),r=Math.max(0|e||n,1);if(n===o.width&&r===o.height)return a;for(var i=o.colorAttachments,s=0;s=2,"invalid shape for framebuffer"),S(m[0]===m[1],"cube framebuffer must be square"),h=m[0]}else"radius"in y&&(h=0|y.radius),"width"in y?(h=0|y.width,"height"in y&&S(y.height===h,"must be square")):"height"in y&&(h=0|y.height);("color"in y||"colors"in y)&&(d=y.color||y.colors,Array.isArray(d)&&S(1===d.length||n.webgl_draw_buffers,"multiple render targets not supported")),d||("colorCount"in y&&(v=0|y.colorCount,S(v>0,"invalid color buffer count")),"colorType"in y&&(S.oneOf(y.colorType,l,"invalid color type"),g=y.colorType),"colorFormat"in y&&(p=y.colorFormat,S.oneOf(y.colorFormat,c,"invalid color format for texture"))),"depth"in y&&(f.depth=y.depth),"stencil"in y&&(f.stencil=y.stencil),"depthStencil"in y&&(f.depthStencil=y.depthStencil)}else h=1;if(d)if(Array.isArray(d))for(s=[],r=0;r0&&(f.depth=o[0].depth,f.stencil=o[0].stencil,f.depthStencil=o[0].depthStencil),o[r]?o[r](f):o[r]=M(f)}return e(a,{width:h,height:h,color:s})}return a(t),e(a,{faces:o,resize:function(t){var e,n=0|t;if(S(n>0&&n<=r.maxCubeMapSize,"invalid radius for cube fbo"),n===a.width)return a;var i=a.color;for(e=0;e=0;--t){var e=G[t];e&&e(m,null,0)}i.flush(),p&&p.update()}function tt(){!J&&G.length>0&&(J=A.next($))}function et(){J&&(A.cancel($),J=null)}function nt(t){t.preventDefault(),s=!0,et(),F.forEach((function(t){t()}))}function rt(t){i.getError(),s=!1,u.restore(),_.restore(),x.restore(),O.restore(),k.restore(),C.restore(),w.restore(),p&&p.restore(),I.procs.refresh(),tt(),U.forEach((function(t){t()}))}function it(t){function n(t,e){var n={},r={};return Object.keys(t).forEach((function(i){var o=t[i];if(M.isDynamic(o))r[i]=M.unbox(o,i);else{if(e&&Array.isArray(o))for(var a=0;a0)return l.call(this,function(t){for(;d.length=0,"cannot cancel a frame twice"),G[e]=function t(){var e=he(G,t);G[e]=G[G.length-1],G.length-=1,G.length<=0&&et()}}}}function ut(){var t=D.viewport,e=D.scissor_box;t[0]=t[1]=e[0]=e[1]=0,m.viewportWidth=m.framebufferWidth=m.drawingBufferWidth=t[2]=e[2]=i.drawingBufferWidth,m.viewportHeight=m.framebufferHeight=m.drawingBufferHeight=t[3]=e[3]=i.drawingBufferHeight}function ct(){m.tick+=1,m.time=lt(),ut(),I.procs.poll()}function ft(){O.refresh(),ut(),I.procs.refresh(),p&&p.update()}function lt(){return(T()-g)/1e3}ft();var ht=e(it,{clear:function(t){if(S("object"===a(t)&&t,"regl.clear() takes an object as input"),"framebuffer"in t)if(t.framebuffer&&"framebufferCube"===t.framebuffer_reglType)for(var n=0;n<6;++n)ot(e({framebuffer:t.framebuffer.faces[n]},t),at);else ot(t,at);else at(0,t)},prop:M.define.bind(null,1),context:M.define.bind(null,2),this:M.define.bind(null,3),draw:it({}),buffer:function(t){return x.create(t,34962,!1,!1)},elements:function(t){return E.create(t,!1)},texture:O.create2D,cube:O.createCube,renderbuffer:k.create,framebuffer:C.create,framebufferCube:C.createCube,vao:w.createVAO,attributes:o,frame:st,on:function(t,e){var n;switch(S.type(e,"function","listener callback must be a function"),t){case"frame":return st(e);case"lost":n=F;break;case"restore":n=U;break;case"destroy":n=Q;break;default:S.raise("invalid event, must be one of frame,lost,restore,destroy")}return n.push(e),{cancel:function(){for(var t=0;t=0},read:j,destroy:function(){G.length=0,et(),N&&(N.removeEventListener("webglcontextlost",nt),N.removeEventListener("webglcontextrestored",rt)),_.clear(),C.clear(),k.clear(),O.clear(),E.clear(),x.clear(),w.clear(),p&&p.clear(),Q.forEach((function(t){t()}))},_gl:i,_refresh:ft,poll:function(){ct(),p&&p.update()},now:lt,stats:h});return r.onDone(null,ht),ht}},"object"===a(e)&&void 0!==t?t.exports=o():void 0===(i="function"==typeof(r=o)?r.call(e,n,e,t):r)||(t.exports=i)},,,,,,,,function(t,e,n){var r=n(282),i=n(283),o={};for(var a in r)r.hasOwnProperty(a)&&(o[r[a]]=a);var s=t.exports={to:{},get:{}};function u(t,e,n){return Math.min(Math.max(e,t),n)}function c(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}s.get=function(t){var e,n;switch(t.substring(0,3).toLowerCase()){case"hsl":e=s.get.hsl(t),n="hsl";break;case"hwb":e=s.get.hwb(t),n="hwb";break;default:e=s.get.rgb(t),n="rgb"}return e?{model:n,value:e}:null},s.get.rgb=function(t){if(!t)return null;var e,n,i,o=[0,0,0,1];if(e=t.match(/^#([a-f0-9]{6})([a-f0-9]{2})?$/i)){for(i=e[2],e=e[1],n=0;n<3;n++){var a=2*n;o[n]=parseInt(e.slice(a,a+2),16)}i&&(o[3]=parseInt(i,16)/255)}else if(e=t.match(/^#([a-f0-9]{3,4})$/i)){for(i=(e=e[1])[3],n=0;n<3;n++)o[n]=parseInt(e[n]+e[n],16);i&&(o[3]=parseInt(i+i,16)/255)}else if(e=t.match(/^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/)){for(n=0;n<3;n++)o[n]=parseInt(e[n+1],0);e[4]&&(o[3]=parseFloat(e[4]))}else{if(!(e=t.match(/^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/)))return(e=t.match(/(\\D+)/))?"transparent"===e[1]?[0,0,0,0]:(o=r[e[1]])?(o[3]=1,o):null:null;for(n=0;n<3;n++)o[n]=Math.round(2.55*parseFloat(e[n+1]));e[4]&&(o[3]=parseFloat(e[4]))}for(n=0;n<3;n++)o[n]=u(o[n],0,255);return o[3]=u(o[3],0,1),o},s.get.hsl=function(t){if(!t)return null;var e=t.match(/^hsla?\\(\\s*([+-]?(?:\\d*\\.)?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/);if(e){var n=parseFloat(e[4]);return[(parseFloat(e[1])+360)%360,u(parseFloat(e[2]),0,100),u(parseFloat(e[3]),0,100),u(isNaN(n)?1:n,0,1)]}return null},s.get.hwb=function(t){if(!t)return null;var e=t.match(/^hwb\\(\\s*([+-]?\\d*[\\.]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/);if(e){var n=parseFloat(e[4]);return[(parseFloat(e[1])%360+360)%360,u(parseFloat(e[2]),0,100),u(parseFloat(e[3]),0,100),u(isNaN(n)?1:n,0,1)]}return null},s.to.hex=function(){var t=i(arguments);return"#"+c(t[0])+c(t[1])+c(t[2])+(t[3]<1?c(Math.round(255*t[3])):"")},s.to.rgb=function(){var t=i(arguments);return t.length<4||1===t[3]?"rgb("+Math.round(t[0])+", "+Math.round(t[1])+", "+Math.round(t[2])+")":"rgba("+Math.round(t[0])+", "+Math.round(t[1])+", "+Math.round(t[2])+", "+t[3]+")"},s.to.rgb.percent=function(){var t=i(arguments),e=Math.round(t[0]/255*100),n=Math.round(t[1]/255*100),r=Math.round(t[2]/255*100);return t.length<4||1===t[3]?"rgb("+e+"%, "+n+"%, "+r+"%)":"rgba("+e+"%, "+n+"%, "+r+"%, "+t[3]+")"},s.to.hsl=function(){var t=i(arguments);return t.length<4||1===t[3]?"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)":"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+t[3]+")"},s.to.hwb=function(){var t=i(arguments),e="";return t.length>=4&&1!==t[3]&&(e=", "+t[3]),"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+e+")"},s.to.keyword=function(t){return o[t.slice(0,3)]}},function(t,e,n){"use strict";t.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},function(t,e,n){"use strict";var r=n(284),i=Array.prototype.concat,o=Array.prototype.slice,a=t.exports=function(t){for(var e=[],n=0,a=t.length;n=0&&(t.splice instanceof Function||Object.getOwnPropertyDescriptor(t,t.length-1)&&"String"!==t.constructor.name))}},function(t,e,n){function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var i=n(176),o=n(287),a={};Object.keys(i).forEach((function(t){a[t]={},Object.defineProperty(a[t],"channels",{value:i[t].channels}),Object.defineProperty(a[t],"labels",{value:i[t].labels});var e=o(t);Object.keys(e).forEach((function(n){var i=e[n];a[t][n]=function(t){var e=function(e){if(null==e)return e;arguments.length>1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"===r(n))for(var i=n.length,o=0;o1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)}))})),t.exports=a},function(t,e,n){"use strict";t.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},function(t,e,n){var r=n(176);function i(t){var e=function(){for(var t={},e=Object.keys(r),n=e.length,i=0;i-1}},function(t,e,n){var r=n(99);t.exports=function(t,e){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this}},function(t,e,n){var r=n(98);t.exports=function(){this.__data__=new r,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(98),i=n(143),o=n(144);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!i||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new o(a)}return n.set(t,e),this.size=n.size,this}},function(t,e,n){var r=n(86),i=n(304),o=n(43),a=n(180),s=/^\\[object .+?Constructor\\]$/,u=Function.prototype,c=Object.prototype,f=u.toString,l=c.hasOwnProperty,h=RegExp("^"+f.call(l).replace(/[\\\\^$.*+?()[\\]{}|]/g,"\\\\$&").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!o(t)||i(t))&&(r(t)?h:s).test(a(t))}},function(t,e,n){var r=n(74),i=Object.prototype,o=i.hasOwnProperty,a=i.toString,s=r?r.toStringTag:void 0;t.exports=function(t){var e=o.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(t){}var i=a.call(t);return r&&(e?t[s]=n:delete t[s]),i}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var r,i=n(305),o=(r=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!o&&o in t}},function(t,e,n){var r=n(45)["__core-js_shared__"];t.exports=r},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var r=n(308),i=n(98),o=n(143);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(o||i),string:new r}}},function(t,e,n){var r=n(309),i=n(310),o=n(311),a=n(312),s=n(313);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},function(t,e,n){var r=n(382);t.exports=function(t,e){return!!(null==t?0:t.length)&&r(t,e,0)>-1}},function(t,e,n){var r=n(218),i=n(383),o=n(384);t.exports=function(t,e,n){return e==e?o(t,e,n):r(t,i,n)}},function(t,e){t.exports=function(t){return t!=t}},function(t,e){t.exports=function(t,e,n){for(var r=n-1,i=t.length;++r1||1===e.length&&t.hasEdge(e[0],e[0])}))}},function(t,e,n){var r=n(42);t.exports=function(t,e,n){return function(t,e,n){var r={},i=t.nodes();return i.forEach((function(t){r[t]={},r[t][t]={distance:0},i.forEach((function(e){t!==e&&(r[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var i=n.v===t?n.w:n.v,o=e(n);r[t][i]={distance:o,predecessor:t}}))})),i.forEach((function(t){var e=r[t];i.forEach((function(n){var o=r[n];i.forEach((function(n){var r=o[t],i=e[n],a=o[n],s=r.distance+i.distance;s0;){if(n=u.removeMin(),r.has(s,n))a.setEdge(n,s[n]);else{if(f)throw new Error("Input graph is not connected: "+t);f=!0}t.nodeEdges(n).forEach(c)}return a}},function(t,e,n){"use strict";var r=n(27),i=n(439),o=n(442),a=n(443),s=n(37).normalizeRanks,u=n(445),c=n(37).removeEmptyRanks,f=n(446),l=n(447),h=n(448),d=n(449),p=n(458),g=n(37),v=n(44).Graph;t.exports=function(t,e){var n=e&&e.debugTiming?g.time:g.notime;n("layout",(function(){var e=n(" buildLayoutGraph",(function(){return function(t){var e=new v({multigraph:!0,compound:!0}),n=k(t.graph());return e.setGraph(r.merge({},m,O(n,y),r.pick(n,b))),r.forEach(t.nodes(),(function(n){var i=k(t.node(n));e.setNode(n,r.defaults(O(i,x),w)),e.setParent(n,t.parent(n))})),r.forEach(t.edges(),(function(n){var i=k(t.edge(n));e.setEdge(n,r.merge({},E,O(i,S),r.pick(i,_)))})),e}(t)}));n(" runLayout",(function(){!function(t,e){e(" makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,r.forEach(t.edges(),(function(n){var r=t.edge(n);r.minlen*=2,"c"!==r.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?r.width+=r.labeloffset:r.height+=r.labeloffset)}))}(t)})),e(" removeSelfEdges",(function(){!function(t){r.forEach(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e(" acyclic",(function(){i.run(t)})),e(" nestingGraph.run",(function(){f.run(t)})),e(" rank",(function(){a(g.asNonCompoundGraph(t))})),e(" injectEdgeLabelProxies",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var r=t.node(e.v),i={rank:(t.node(e.w).rank-r.rank)/2+r.rank,e:e};g.addDummyNode(t,"edge-proxy",i,"_ep")}}))}(t)})),e(" removeEmptyRanks",(function(){c(t)})),e(" nestingGraph.cleanup",(function(){f.cleanup(t)})),e(" normalizeRanks",(function(){s(t)})),e(" assignRankMinMax",(function(){!function(t){var e=0;r.forEach(t.nodes(),(function(n){var i=t.node(n);i.borderTop&&(i.minRank=t.node(i.borderTop).rank,i.maxRank=t.node(i.borderBottom).rank,e=r.max(e,i.maxRank))})),t.graph().maxRank=e}(t)})),e(" removeEdgeLabelProxies",(function(){!function(t){r.forEach(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e(" normalize.run",(function(){o.run(t)})),e(" parentDummyChains",(function(){u(t)})),e(" addBorderSegments",(function(){l(t)})),e(" order",(function(){d(t)})),e(" insertSelfEdges",(function(){!function(t){var e=g.buildLayerMatrix(t);r.forEach(e,(function(e){var n=0;r.forEach(e,(function(e,i){var o=t.node(e);o.order=i+n,r.forEach(o.selfEdges,(function(e){g.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:i+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e(" adjustCoordinateSystem",(function(){h.adjust(t)})),e(" position",(function(){p(t)})),e(" positionSelfEdges",(function(){!function(t){r.forEach(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var r=t.node(n.e.v),i=r.x+r.width/2,o=r.y,a=n.x-i,s=r.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:i+2*a/3,y:o-s},{x:i+5*a/6,y:o-s},{x:i+a,y:o},{x:i+5*a/6,y:o+s},{x:i+2*a/3,y:o+s}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e(" removeBorderNodes",(function(){!function(t){r.forEach(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),i=t.node(n.borderTop),o=t.node(n.borderBottom),a=t.node(r.last(n.borderLeft)),s=t.node(r.last(n.borderRight));n.width=Math.abs(s.x-a.x),n.height=Math.abs(o.y-i.y),n.x=a.x+n.width/2,n.y=i.y+n.height/2}})),r.forEach(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e(" normalize.undo",(function(){o.undo(t)})),e(" fixupEdgeLabelCoords",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);if(r.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e(" undoCoordinateSystem",(function(){h.undo(t)})),e(" translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,i=Number.POSITIVE_INFINITY,o=0,a=t.graph(),s=a.marginx||0,u=a.marginy||0;function c(t){var r=t.x,a=t.y,s=t.width,u=t.height;e=Math.min(e,r-s/2),n=Math.max(n,r+s/2),i=Math.min(i,a-u/2),o=Math.max(o,a+u/2)}r.forEach(t.nodes(),(function(e){c(t.node(e))})),r.forEach(t.edges(),(function(e){var n=t.edge(e);r.has(n,"x")&&c(n)})),e-=s,i-=u,r.forEach(t.nodes(),(function(n){var r=t.node(n);r.x-=e,r.y-=i})),r.forEach(t.edges(),(function(n){var o=t.edge(n);r.forEach(o.points,(function(t){t.x-=e,t.y-=i})),r.has(o,"x")&&(o.x-=e),r.has(o,"y")&&(o.y-=i)})),a.width=n-e+s,a.height=o-i+u}(t)})),e(" assignNodeIntersects",(function(){!function(t){r.forEach(t.edges(),(function(e){var n,r,i=t.edge(e),o=t.node(e.v),a=t.node(e.w);i.points?(n=i.points[0],r=i.points[i.points.length-1]):(i.points=[],n=a,r=o),i.points.unshift(g.intersectRect(o,n)),i.points.push(g.intersectRect(a,r))}))}(t)})),e(" reversePoints",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e(" acyclic.undo",(function(){i.undo(t)}))}(e,n)})),n(" updateInputGraph",(function(){!function(t,e){r.forEach(t.nodes(),(function(n){var r=t.node(n),i=e.node(n);r&&(r.x=i.x,r.y=i.y,e.children(n).length&&(r.width=i.width,r.height=i.height))})),r.forEach(t.edges(),(function(n){var i=t.edge(n),o=e.edge(n);i.points=o.points,r.has(o,"x")&&(i.x=o.x,i.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var y=["nodesep","edgesep","ranksep","marginx","marginy"],m={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},b=["acyclicer","ranker","rankdir","align"],x=["width","height"],w={width:0,height:0},S=["minlen","weight","width","height","labeloffset"],E={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},_=["labelpos"];function O(t,e){return r.mapValues(r.pick(t,e),Number)}function k(t){var e={};return r.forEach(t,(function(t,n){e[n.toLowerCase()]=t})),e}},function(t,e,n){var r=n(177);t.exports=function(t){return r(t,5)}},function(t,e,n){var r=n(112),i=n(73),o=n(113),a=n(66),s=Object.prototype,u=s.hasOwnProperty,c=r((function(t,e){t=Object(t);var n=-1,r=e.length,c=r>2?e[2]:void 0;for(c&&o(e[0],e[1],c)&&(r=1);++n-1?s[u?e[c]:c]:void 0}}},function(t,e,n){var r=n(218),i=n(55),o=n(406),a=Math.max;t.exports=function(t,e,n){var s=null==t?0:t.length;if(!s)return-1;var u=null==n?0:o(n);return u<0&&(u=a(s+u,0)),r(t,i(e,3),u)}},function(t,e,n){var r=n(226);t.exports=function(t){var e=r(t),n=e%1;return e==e?n?e-n:e:0}},function(t,e,n){var r=n(408),i=n(43),o=n(77),a=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,u=/^0o[0-7]+$/i,c=parseInt;t.exports=function(t){if("number"==typeof t)return t;if(o(t))return NaN;if(i(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=i(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=r(t);var n=s.test(t);return n||u.test(t)?c(t.slice(2),n?2:8):a.test(t)?NaN:+t}},function(t,e,n){var r=n(409),i=/^\\s+/;t.exports=function(t){return t?t.slice(0,r(t)+1).replace(i,""):t}},function(t,e){var n=/\\s/;t.exports=function(t){for(var e=t.length;e--&&n.test(t.charAt(e)););return e}},function(t,e,n){var r=n(154),i=n(198),o=n(66);t.exports=function(t,e){return null==t?t:r(t,i(e),o)}},function(t,e){t.exports=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}},function(t,e,n){var r=n(103),i=n(153),o=n(55);t.exports=function(t,e){var n={};return e=o(e,3),i(t,(function(t,i,o){r(n,i,e(t,i,o))})),n}},function(t,e,n){var r=n(158),i=n(414),o=n(67);t.exports=function(t){return t&&t.length?r(t,o,i):void 0}},function(t,e){t.exports=function(t,e){return t>e}},function(t,e,n){var r=n(416),i=n(419)((function(t,e,n){r(t,e,n)}));t.exports=i},function(t,e,n){var r=n(97),i=n(228),o=n(154),a=n(417),s=n(43),u=n(66),c=n(229);t.exports=function t(e,n,f,l,h){e!==n&&o(n,(function(o,u){if(h||(h=new r),s(o))a(e,n,u,f,t,l,h);else{var d=l?l(c(e,u),o,u+"",e,n,h):void 0;void 0===d&&(d=o),i(e,u,d)}}),u)}},function(t,e,n){var r=n(228),i=n(184),o=n(193),a=n(185),s=n(194),u=n(88),c=n(29),f=n(219),l=n(75),h=n(86),d=n(43),p=n(168),g=n(32),v=n(229),y=n(418);t.exports=function(t,e,n,m,b,x,w){var S=v(t,n),E=v(e,n),_=w.get(E);if(_)r(t,n,_);else{var O=x?x(S,E,n+"",t,e,w):void 0,k=void 0===O;if(k){var M=c(E),A=!M&&l(E),T=!M&&!A&&g(E);O=E,M||A||T?c(S)?O=S:f(S)?O=a(S):A?(k=!1,O=i(E,!0)):T?(k=!1,O=o(E,!0)):O=[]:p(E)||u(E)?(O=S,u(S)?O=y(S):d(S)&&!h(S)||(O=s(E))):k=!1}k&&(w.set(E,O),b(O,E,m,x,w),w.delete(E)),r(t,n,O)}}},function(t,e,n){var r=n(87),i=n(66);t.exports=function(t){return r(t,i(t))}},function(t,e,n){var r=n(112),i=n(113);t.exports=function(t){return r((function(e,n){var r=-1,o=n.length,a=o>1?n[o-1]:void 0,s=o>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(o--,a):void 0,s&&i(n[0],n[1],s)&&(a=o<3?void 0:a,o=1),e=Object(e);++r1&&a(t,e[0],e[1])?e=[]:n>2&&a(e[0],e[1],e[2])&&(e=[e[0]]),i(t,r(e,1),[])}));t.exports=s},function(t,e,n){var r=n(111),i=n(109),o=n(55),a=n(213),s=n(433),u=n(105),c=n(434),f=n(67),l=n(29);t.exports=function(t,e,n){e=e.length?r(e,(function(t){return l(t)?function(e){return i(e,1===t.length?t[0]:t)}:t})):[f];var h=-1;e=r(e,u(o));var d=a(t,(function(t,n,i){return{criteria:r(e,(function(e){return e(t)})),index:++h,value:t}}));return s(d,(function(t,e){return c(t,e,n)}))}},function(t,e){t.exports=function(t,e){var n=t.length;for(t.sort(e);n--;)t[n]=t[n].value;return t}},function(t,e,n){var r=n(435);t.exports=function(t,e,n){for(var i=-1,o=t.criteria,a=e.criteria,s=o.length,u=n.length;++i=u?c:c*("desc"==n[i]?-1:1)}return t.index-e.index}},function(t,e,n){var r=n(77);t.exports=function(t,e){if(t!==e){var n=void 0!==t,i=null===t,o=t==t,a=r(t),s=void 0!==e,u=null===e,c=e==e,f=r(e);if(!u&&!f&&!a&&t>e||a&&s&&c&&!u&&!f||i&&s&&c||!n&&c||!o)return 1;if(!i&&!a&&!f&&t0;--u)if(r=e[u].dequeue()){i=i.concat(s(t,e,n,r,!0));break}}return i}(n.graph,n.buckets,n.zeroIdx);return r.flatten(r.map(c,(function(e){return t.outEdges(e.v,e.w)})),!0)};var a=r.constant(1);function s(t,e,n,i,o){var a=o?[]:void 0;return r.forEach(t.inEdges(i.v),(function(r){var i=t.edge(r),s=t.node(r.v);o&&a.push({v:r.v,w:r.w}),s.out-=i,u(e,n,s)})),r.forEach(t.outEdges(i.v),(function(r){var i=t.edge(r),o=r.w,a=t.node(o);a.in-=i,u(e,n,a)})),t.removeNode(i.v),a}function u(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},function(t,e){function n(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function i(t,e){if("_next"!==t&&"_prev"!==t)return e}t.exports=n,n.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},n.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},n.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,i)),n=n._prev;return"["+t.join(", ")+"]"}},function(t,e,n){"use strict";var r=n(27),i=n(37);t.exports={run:function(t){t.graph().dummyChains=[],r.forEach(t.edges(),(function(e){!function(t,e){var n,r,o,a=e.v,s=t.node(a).rank,u=e.w,c=t.node(u).rank,f=e.name,l=t.edge(e),h=l.labelRank;if(c===s+1)return;for(t.removeEdge(e),o=0,++s;su.lim&&(c=u,f=!0);var l=r.filter(e.edges(),(function(e){return f===m(t,t.node(e.v),c)&&f!==m(t,t.node(e.w),c)}));return r.minBy(l,(function(t){return o(e,t)}))}function y(t,e,n,i){var o=n.v,a=n.w;t.removeEdge(o,a),t.setEdge(i.v,i.w,{}),d(t),l(t,e),function(t,e){var n=r.find(t.nodes(),(function(t){return!e.node(t).parent})),i=s(t,n);i=i.slice(1),r.forEach(i,(function(n){var r=t.node(n).parent,i=e.edge(n,r),o=!1;i||(i=e.edge(r,n),o=!0),e.node(n).rank=e.node(r).rank+(o?i.minlen:-i.minlen)}))}(t,e)}function m(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}t.exports=f,f.initLowLimValues=d,f.initCutValues=l,f.calcCutValue=h,f.leaveEdge=g,f.enterEdge=v,f.exchangeEdges=y},function(t,e,n){var r=n(27);t.exports=function(t){var e=function(t){var e={},n=0;function i(o){var a=n;r.forEach(t.children(o),i),e[o]={low:a,lim:n++}}return r.forEach(t.children(),i),e}(t);r.forEach(t.graph().dummyChains,(function(n){for(var r=t.node(n),i=r.edgeObj,o=function(t,e,n,r){var i,o,a=[],s=[],u=Math.min(e[n].low,e[r].low),c=Math.max(e[n].lim,e[r].lim);i=n;do{i=t.parent(i),a.push(i)}while(i&&(e[i].low>u||c>e[i].lim));o=i,i=r;for(;(i=t.parent(i))!==o;)s.push(i);return{path:a.concat(s.reverse()),lca:o}}(t,e,i.v,i.w),a=o.path,s=o.lca,u=0,c=a[u],f=!0;n!==i.w;){if(r=t.node(n),f){for(;(c=a[u])!==s&&t.node(c).maxRank=2),s=f.buildLayerMatrix(t);var v=o(t,s);v0;)e%2&&(n+=u[e+1]),u[e=e-1>>1]+=t.weight;c+=t.weight*n}))),c}t.exports=function(t,e){for(var n=0,r=1;r=t.barycenter)&&function(t,e){var n=0,r=0;t.weight&&(n+=t.barycenter*t.weight,r+=t.weight);e.weight&&(n+=e.barycenter*e.weight,r+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/r,t.weight=r,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function i(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),r.forEach(o.in.reverse(),n(o)),r.forEach(o.out,i(o))}return r.map(r.filter(e,(function(t){return!t.merged})),(function(t){return r.pick(t,["vs","i","barycenter","weight"])}))}(r.filter(n,(function(t){return!t.indegree})))}},function(t,e,n){var r=n(27),i=n(37);function o(t,e,n){for(var i;e.length&&(i=r.last(e)).i<=n;)e.pop(),t.push(i.vs),n++;return n}t.exports=function(t,e){var n=i.partition(t,(function(t){return r.has(t,"barycenter")})),a=n.lhs,s=r.sortBy(n.rhs,(function(t){return-t.i})),u=[],c=0,f=0,l=0;a.sort((h=!!e,function(t,e){return t.barycentere.barycenter?1:h?e.i-t.i:t.i-e.i})),l=o(u,s,l),r.forEach(a,(function(t){l+=t.vs.length,u.push(t.vs),c+=t.barycenter*t.weight,f+=t.weight,l=o(u,s,l)}));var h;var d={vs:r.flatten(u,!0)};f&&(d.barycenter=c/f,d.weight=f);return d}},function(t,e,n){var r=n(27),i=n(44).Graph;t.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=r.uniqueId("_root")););return e}(t),a=new i({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return r.forEach(t.nodes(),(function(i){var s=t.node(i),u=t.parent(i);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(a.setNode(i),a.setParent(i,u||o),r.forEach(t[n](i),(function(e){var n=e.v===i?e.w:e.v,o=a.edge(n,i),s=r.isUndefined(o)?0:o.weight;a.setEdge(n,i,{weight:t.edge(e).weight+s})})),r.has(s,"minRank")&&a.setNode(i,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))})),a}},function(t,e,n){var r=n(27);t.exports=function(t,e,n){var i,o={};r.forEach(n,(function(n){for(var r,a,s=t.parent(n);s;){if((r=t.parent(s))?(a=o[r],o[r]=s):(a=i,i=s),a&&a!==s)return void e.setEdge(a,s);s=r}}))}},function(t,e,n){"use strict";var r=n(27),i=n(37),o=n(459).positionX;t.exports=function(t){(function(t){var e=i.buildLayerMatrix(t),n=t.graph().ranksep,o=0;r.forEach(e,(function(e){var i=r.max(r.map(e,(function(e){return t.node(e).height})));r.forEach(e,(function(e){t.node(e).y=o+i/2})),o+=i+n}))})(t=i.asNonCompoundGraph(t)),r.forEach(o(t),(function(e,n){t.node(n).x=e}))}},function(t,e,n){"use strict";var r=n(27),i=n(44).Graph,o=n(37);function a(t,e){var n={};return r.reduce(e,(function(e,i){var o=0,a=0,s=e.length,c=r.last(i);return r.forEach(i,(function(e,f){var l=function(t,e){if(t.node(e).dummy)return r.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),h=l?t.node(l).order:s;(l||e===c)&&(r.forEach(i.slice(a,f+1),(function(e){r.forEach(t.predecessors(e),(function(r){var i=t.node(r),a=i.order;!(as)&&u(n,e,c)}))}))}return r.reduce(e,(function(e,n){var o,a=-1,s=0;return r.forEach(n,(function(r,u){if("border"===t.node(r).dummy){var c=t.predecessors(r);c.length&&(o=t.node(c[0]).order,i(n,s,u,a,o),s=u,a=o)}i(n,s,n.length,o,e.length)})),n})),n}function u(t,e,n){if(e>n){var r=e;e=n,n=r}var i=t[e];i||(t[e]=i={}),i[n]=!0}function c(t,e,n){if(e>n){var i=e;e=n,n=i}return r.has(t[e],n)}function f(t,e,n,i){var o={},a={},s={};return r.forEach(e,(function(t){r.forEach(t,(function(t,e){o[t]=t,a[t]=t,s[t]=e}))})),r.forEach(e,(function(t){var e=-1;r.forEach(t,(function(t){var u=i(t);if(u.length)for(var f=((u=r.sortBy(u,(function(t){return s[t]}))).length-1)/2,l=Math.floor(f),h=Math.ceil(f);l<=h;++l){var d=u[l];a[t]===t&&e=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),u=r.call(o,"finallyLoc");if(s&&u){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),E(n),l}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;E(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:O(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),l}},t}("object"===e(t)?t.exports:{});try{regeneratorRuntime=n}catch(t){Function("r","regeneratorRuntime = r")(n)}}).call(this,n(72)(t))},function(t,e){t.exports=function(t){if(Array.isArray(t))return t}},function(t,e){t.exports=function(t,e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t)){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=t[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!e||n.length!==e);r=!0);}catch(t){i=!0,o=t}finally{try{r||null==s.return||s.return()}finally{if(i)throw o}}return n}}},function(t,e){t.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}},function(t,e,n){"use strict";function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var i=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(i,o){function a(t){try{u(r.next(t))}catch(t){o(t)}}function s(t){try{u(r.throw(t))}catch(t){o(t)}}function u(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,s)}u((r=r.apply(t,e||[])).next())}))},o=this&&this.__generator||function(t,e){var n,r,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,r=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!(i=a.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0?p.length:n.length),v=function t(e,n){for(var i=e.getPropertiesMetadata(n),o=[],s=Object.keys(i),u=0,f=s;u0?c:t(e,r)}return 0}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QueryableString=void 0;var r=function(){function t(t){this.str=t}return t.prototype.startsWith=function(t){return 0===this.str.indexOf(t)},t.prototype.endsWith=function(t){var e,n=t.split("").reverse().join("");return e=this.str.split("").reverse().join(""),this.startsWith.call({str:e},n)},t.prototype.contains=function(t){return-1!==this.str.indexOf(t)},t.prototype.equals=function(t){return this.str===t},t.prototype.value=function(){return this.str},t}();e.QueryableString=r},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Request=void 0;var r=n(68),i=function(){function t(t,e,n,i,o){this.id=r.id(),this.serviceIdentifier=t,this.parentContext=e,this.parentRequest=n,this.target=o,this.childRequests=[],this.bindings=Array.isArray(i)?i:[i],this.requestScope=null===n?new Map:null}return t.prototype.addChildRequest=function(e,n,r){var i=new t(e,this.parentContext,this,n,r);return this.childRequests.push(i),i},t}();e.Request=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.resolve=void 0;var r=n(41),i=n(56),o=n(236),a=n(90),s=n(476),u=function(t,e,n){try{return n()}catch(n){throw o.isStackOverflowExeption(n)?new Error(r.CIRCULAR_DEPENDENCY_IN_FACTORY(t,e.toString())):n}};e.resolve=function(t){return function t(e){return function(n){n.parentContext.setCurrentRequest(n);var o=n.bindings,c=n.childRequests,f=n.target&&n.target.isArray(),l=!(n.parentRequest&&n.parentRequest.target&&n.target&&n.parentRequest.target.matchesArray(n.target.serviceIdentifier));if(f&&l)return c.map((function(n){return t(e)(n)}));var h=null;if(!n.target.isOptional()||0!==o.length){var d=o[0],p=d.scope===i.BindingScopeEnum.Singleton,g=d.scope===i.BindingScopeEnum.Request;if(p&&d.activated)return d.cache;if(g&&null!==e&&e.has(d.id))return e.get(d.id);if(d.type===i.BindingTypeEnum.ConstantValue)h=d.cache;else if(d.type===i.BindingTypeEnum.Function)h=d.cache;else if(d.type===i.BindingTypeEnum.Constructor)h=d.implementationType;else if(d.type===i.BindingTypeEnum.DynamicValue&&null!==d.dynamicValue)h=u("toDynamicValue",d.serviceIdentifier,(function(){return d.dynamicValue(n.parentContext)}));else if(d.type===i.BindingTypeEnum.Factory&&null!==d.factory)h=u("toFactory",d.serviceIdentifier,(function(){return d.factory(n.parentContext)}));else if(d.type===i.BindingTypeEnum.Provider&&null!==d.provider)h=u("toProvider",d.serviceIdentifier,(function(){return d.provider(n.parentContext)}));else{if(d.type!==i.BindingTypeEnum.Instance||null===d.implementationType){var v=a.getServiceIdentifierAsString(n.serviceIdentifier);throw new Error(r.INVALID_BINDING_TYPE+" "+v)}h=s.resolveInstance(d.implementationType,c,t(e))}return"function"==typeof d.onActivation&&(h=d.onActivation(n.parentContext,h)),p&&(d.cache=h,d.activated=!0),g&&null!==e&&!e.has(d.id)&&e.set(d.id,h),h}}}(t.plan.rootRequest.requestScope)(t.plan.rootRequest)}},function(t,e,n){"use strict";var r=this&&this.__spreadArrays||function(){for(var t=0,e=0,n=arguments.length;e0){var f=e.filter((function(t){return null!==t.target&&t.target.type===o.TargetTypeEnum.ConstructorArgument})).map(n);u=f,c=function(t,e,n){var r=e.filter((function(t){return null!==t.target&&t.target.type===o.TargetTypeEnum.ClassProperty})),i=r.map(n);return r.forEach((function(e,n){var r;r=e.target.name.value();var o=i[n];t[r]=o})),t}(c=new((s=t).bind.apply(s,r([void 0],u))),e,n)}else c=new t;return function(t,e){if(Reflect.hasMetadata(a.POST_CONSTRUCT,t)){var n=Reflect.getMetadata(a.POST_CONSTRUCT,t);try{e[n.value]()}catch(e){throw new Error(i.POST_CONSTRUCT_ERROR(t.name,e.message))}}}(t,c),c}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BindingToSyntax=void 0;var r=n(41),i=n(56),o=n(478),a=n(239),s=function(){function t(t){this._binding=t}return t.prototype.to=function(t){return this._binding.type=i.BindingTypeEnum.Instance,this._binding.implementationType=t,new o.BindingInWhenOnSyntax(this._binding)},t.prototype.toSelf=function(){if("function"!=typeof this._binding.serviceIdentifier)throw new Error(""+r.INVALID_TO_SELF_VALUE);var t=this._binding.serviceIdentifier;return this.to(t)},t.prototype.toConstantValue=function(t){return this._binding.type=i.BindingTypeEnum.ConstantValue,this._binding.cache=t,this._binding.dynamicValue=null,this._binding.implementationType=null,new a.BindingWhenOnSyntax(this._binding)},t.prototype.toDynamicValue=function(t){return this._binding.type=i.BindingTypeEnum.DynamicValue,this._binding.cache=null,this._binding.dynamicValue=t,this._binding.implementationType=null,new o.BindingInWhenOnSyntax(this._binding)},t.prototype.toConstructor=function(t){return this._binding.type=i.BindingTypeEnum.Constructor,this._binding.implementationType=t,new a.BindingWhenOnSyntax(this._binding)},t.prototype.toFactory=function(t){return this._binding.type=i.BindingTypeEnum.Factory,this._binding.factory=t,new a.BindingWhenOnSyntax(this._binding)},t.prototype.toFunction=function(t){if("function"!=typeof t)throw new Error(r.INVALID_FUNCTION_BINDING);var e=this.toConstantValue(t);return this._binding.type=i.BindingTypeEnum.Function,e},t.prototype.toAutoFactory=function(t){return this._binding.type=i.BindingTypeEnum.Factory,this._binding.factory=function(e){return function(){return e.container.get(t)}},new a.BindingWhenOnSyntax(this._binding)},t.prototype.toProvider=function(t){return this._binding.type=i.BindingTypeEnum.Provider,this._binding.provider=t,new a.BindingWhenOnSyntax(this._binding)},t.prototype.toService=function(t){this.toDynamicValue((function(e){return e.container.get(t)}))},t}();e.BindingToSyntax=s},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BindingInWhenOnSyntax=void 0;var r=n(479),i=n(159),o=n(160),a=function(){function t(t){this._binding=t,this._bindingWhenSyntax=new o.BindingWhenSyntax(this._binding),this._bindingOnSyntax=new i.BindingOnSyntax(this._binding),this._bindingInSyntax=new r.BindingInSyntax(t)}return t.prototype.inRequestScope=function(){return this._bindingInSyntax.inRequestScope()},t.prototype.inSingletonScope=function(){return this._bindingInSyntax.inSingletonScope()},t.prototype.inTransientScope=function(){return this._bindingInSyntax.inTransientScope()},t.prototype.when=function(t){return this._bindingWhenSyntax.when(t)},t.prototype.whenTargetNamed=function(t){return this._bindingWhenSyntax.whenTargetNamed(t)},t.prototype.whenTargetIsDefault=function(){return this._bindingWhenSyntax.whenTargetIsDefault()},t.prototype.whenTargetTagged=function(t,e){return this._bindingWhenSyntax.whenTargetTagged(t,e)},t.prototype.whenInjectedInto=function(t){return this._bindingWhenSyntax.whenInjectedInto(t)},t.prototype.whenParentNamed=function(t){return this._bindingWhenSyntax.whenParentNamed(t)},t.prototype.whenParentTagged=function(t,e){return this._bindingWhenSyntax.whenParentTagged(t,e)},t.prototype.whenAnyAncestorIs=function(t){return this._bindingWhenSyntax.whenAnyAncestorIs(t)},t.prototype.whenNoAncestorIs=function(t){return this._bindingWhenSyntax.whenNoAncestorIs(t)},t.prototype.whenAnyAncestorNamed=function(t){return this._bindingWhenSyntax.whenAnyAncestorNamed(t)},t.prototype.whenAnyAncestorTagged=function(t,e){return this._bindingWhenSyntax.whenAnyAncestorTagged(t,e)},t.prototype.whenNoAncestorNamed=function(t){return this._bindingWhenSyntax.whenNoAncestorNamed(t)},t.prototype.whenNoAncestorTagged=function(t,e){return this._bindingWhenSyntax.whenNoAncestorTagged(t,e)},t.prototype.whenAnyAncestorMatches=function(t){return this._bindingWhenSyntax.whenAnyAncestorMatches(t)},t.prototype.whenNoAncestorMatches=function(t){return this._bindingWhenSyntax.whenNoAncestorMatches(t)},t.prototype.onActivation=function(t){return this._bindingOnSyntax.onActivation(t)},t}();e.BindingInWhenOnSyntax=a},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BindingInSyntax=void 0;var r=n(56),i=n(239),o=function(){function t(t){this._binding=t}return t.prototype.inRequestScope=function(){return this._binding.scope=r.BindingScopeEnum.Request,new i.BindingWhenOnSyntax(this._binding)},t.prototype.inSingletonScope=function(){return this._binding.scope=r.BindingScopeEnum.Singleton,new i.BindingWhenOnSyntax(this._binding)},t.prototype.inTransientScope=function(){return this._binding.scope=r.BindingScopeEnum.Transient,new i.BindingWhenOnSyntax(this._binding)},t}();e.BindingInSyntax=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContainerSnapshot=void 0;var r=function(){function t(){}return t.of=function(e,n){var r=new t;return r.bindings=e,r.middleware=n,r},t}();e.ContainerSnapshot=r},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Lookup=void 0;var r=n(41),i=function(){function t(){this._map=new Map}return t.prototype.getMap=function(){return this._map},t.prototype.add=function(t,e){if(null==t)throw new Error(r.NULL_ARGUMENT);if(null==e)throw new Error(r.NULL_ARGUMENT);var n=this._map.get(t);void 0!==n?(n.push(e),this._map.set(t,n)):this._map.set(t,[e])},t.prototype.get=function(t){if(null==t)throw new Error(r.NULL_ARGUMENT);var e=this._map.get(t);if(void 0!==e)return e;throw new Error(r.KEY_NOT_FOUND)},t.prototype.remove=function(t){if(null==t)throw new Error(r.NULL_ARGUMENT);if(!this._map.delete(t))throw new Error(r.KEY_NOT_FOUND)},t.prototype.removeByCondition=function(t){var e=this;this._map.forEach((function(n,r){var i=n.filter((function(e){return!t(e)}));i.length>0?e._map.set(r,i):e._map.delete(r)}))},t.prototype.hasKey=function(t){if(null==t)throw new Error(r.NULL_ARGUMENT);return this._map.has(t)},t.prototype.clone=function(){var e=new t;return this._map.forEach((function(t,n){t.forEach((function(t){return e.add(n,t.clone())}))})),e},t.prototype.traverse=function(t){this._map.forEach((function(e,n){t(n,e)}))},t}();e.Lookup=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AsyncContainerModule=e.ContainerModule=void 0;var r=n(68),i=function(t){this.id=r.id(),this.registry=t};e.ContainerModule=i;var o=function(t){this.id=r.id(),this.registry=t};e.AsyncContainerModule=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.injectable=void 0;var r=n(41),i=n(31);e.injectable=function(){return function(t){if(Reflect.hasOwnMetadata(i.PARAM_TYPES,t))throw new Error(r.DUPLICATED_INJECTABLE_DECORATOR);var e=Reflect.getMetadata(i.DESIGN_PARAM_TYPES,t)||[];return Reflect.defineMetadata(i.PARAM_TYPES,e,t),t}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.tagged=void 0;var r=n(47),i=n(61);e.tagged=function(t,e){return function(n,o,a){var s=new r.Metadata(t,e);"number"==typeof a?i.tagParameter(n,o,a,s):i.tagProperty(n,o,s)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.named=void 0;var r=n(31),i=n(47),o=n(61);e.named=function(t){return function(e,n,a){var s=new i.Metadata(r.NAMED_TAG,t);"number"==typeof a?o.tagParameter(e,n,a,s):o.tagProperty(e,n,s)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.optional=void 0;var r=n(31),i=n(47),o=n(61);e.optional=function(){return function(t,e,n){var a=new i.Metadata(r.OPTIONAL_TAG,!0);"number"==typeof n?o.tagParameter(t,e,n,a):o.tagProperty(t,e,a)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.unmanaged=void 0;var r=n(31),i=n(47),o=n(61);e.unmanaged=function(){return function(t,e,n){var a=new i.Metadata(r.UNMANAGED_TAG,!0);o.tagParameter(t,e,n,a)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.multiInject=void 0;var r=n(31),i=n(47),o=n(61);e.multiInject=function(t){return function(e,n,a){var s=new i.Metadata(r.MULTI_INJECT_TAG,t);"number"==typeof a?o.tagParameter(e,n,a,s):o.tagProperty(e,n,s)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.targetName=void 0;var r=n(31),i=n(47),o=n(61);e.targetName=function(t){return function(e,n,a){var s=new i.Metadata(r.NAME_TAG,t);o.tagParameter(e,n,a,s)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.postConstruct=void 0;var r=n(41),i=n(31),o=n(47);e.postConstruct=function(){return function(t,e,n){var a=new o.Metadata(i.POST_CONSTRUCT,e);if(Reflect.hasOwnMetadata(i.POST_CONSTRUCT,t.constructor))throw new Error(r.MULTIPLE_POST_CONSTRUCT_METHODS);Reflect.defineMetadata(i.POST_CONSTRUCT,a,t.constructor)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.multiBindToService=void 0,e.multiBindToService=function(t){return function(e){return function(){for(var n=[],r=0;rn*n){var i=Math.sqrt(r);t[0]=e[0]/i*n,t[1]=e[1]/i*n}else t[0]=e[0],t[1]=e[1];return t}},function(t,e,n){"use strict";n.r(e),n.d(e,"G6GraphEvent",(function(){return yt})),n.d(e,"G6Event",(function(){return Ye})),n.d(e,"Node",(function(){return oe})),n.d(e,"Edge",(function(){return ie})),n.d(e,"Combo",(function(){return ae})),n.d(e,"Hull",(function(){return Ie})),n.d(e,"registerNode",(function(){return tn})),n.d(e,"registerCombo",(function(){return nn})),n.d(e,"AbstractGraph",(function(){return je})),n.d(e,"registerEdge",(function(){return en})),n.d(e,"registerBehavior",(function(){return rn})),n.d(e,"AbstractLayout",(function(){return Je})),n.d(e,"AbstractEvent",(function(){return $e})),n.d(e,"BaseGlobal",(function(){return on})),n.d(e,"Graph",(function(){return nd})),n.d(e,"TreeGraph",(function(){return vd})),n.d(e,"Util",(function(){return dd})),n.d(e,"Layout",(function(){return Nh})),n.d(e,"registerLayout",(function(){return Lh})),n.d(e,"Global",(function(){return Dn})),n.d(e,"Minimap",(function(){return iy})),n.d(e,"Grid",(function(){return oy})),n.d(e,"Bundling",(function(){return ay})),n.d(e,"Menu",(function(){return sy})),n.d(e,"Fisheye",(function(){return uy})),n.d(e,"Algorithm",(function(){return b})),n.d(e,"ToolBar",(function(){return cy})),n.d(e,"Tooltip",(function(){return fy})),n.d(e,"TimeBar",(function(){return ly})),n.d(e,"ImageMinimap",(function(){return hy})),n.d(e,"EdgeFilterLens",(function(){return dy})),n.d(e,"Arrow",(function(){return He})),n.d(e,"Marker",(function(){return qe})),n.d(e,"Shape",(function(){return Ke})),n.d(e,"version",(function(){return gy}));var r={};n.r(r),n.d(r,"compare",(function(){return w})),n.d(r,"getLineIntersect",(function(){return E})),n.d(r,"getRectIntersectByPoint",(function(){return _})),n.d(r,"getCircleIntersectByPoint",(function(){return O})),n.d(r,"getEllipseIntersectByPoint",(function(){return k})),n.d(r,"applyMatrix",(function(){return M})),n.d(r,"invertMatrix",(function(){return A})),n.d(r,"getCircleCenterByPoints",(function(){return T})),n.d(r,"distance",(function(){return C})),n.d(r,"scaleMatrix",(function(){return I})),n.d(r,"floydWarshall",(function(){return P})),n.d(r,"getAdjMatrix",(function(){return j})),n.d(r,"translate",(function(){return D})),n.d(r,"move",(function(){return N})),n.d(r,"scale",(function(){return R})),n.d(r,"rotate",(function(){return L})),n.d(r,"getDegree",(function(){return B})),n.d(r,"isPointInPolygon",(function(){return W})),n.d(r,"intersectBBox",(function(){return X})),n.d(r,"isPolygonsIntersect",(function(){return Y})),n.d(r,"Line",(function(){return H})),n.d(r,"getBBoxBoundLine",(function(){return q})),n.d(r,"itemIntersectByLine",(function(){return Z})),n.d(r,"fractionToLine",(function(){return Q})),n.d(r,"getPointsCenter",(function(){return J})),n.d(r,"squareDist",(function(){return $})),n.d(r,"pointLineSquareDist",(function(){return tt})),n.d(r,"isPointsOverlap",(function(){return et})),n.d(r,"pointRectSquareDist",(function(){return nt}));var i={};n.r(i),n.d(i,"uniqueId",(function(){return mt})),n.d(i,"formatPadding",(function(){return bt})),n.d(i,"cloneEvent",(function(){return xt})),n.d(i,"isViewportChanged",(function(){return wt})),n.d(i,"isNaN",(function(){return St})),n.d(i,"calculationItemsBBox",(function(){return Et})),n.d(i,"processParallelEdges",(function(){return _t}));var o={};n.r(o),n.d(o,"getBBox",(function(){return Pt})),n.d(o,"getLoopCfgs",(function(){return jt})),n.d(o,"getLabelPosition",(function(){return Dt})),n.d(o,"traverseTree",(function(){return Rt})),n.d(o,"traverseTreeUp",(function(){return Lt})),n.d(o,"getLetterWidth",(function(){return Bt})),n.d(o,"getTextSize",(function(){return Gt})),n.d(o,"plainCombosToTrees",(function(){return Ft})),n.d(o,"reconstructTree",(function(){return Ut})),n.d(o,"getComboBBox",(function(){return zt})),n.d(o,"shouldRefreshEdge",(function(){return Vt})),n.d(o,"cloneBesidesImg",(function(){return Wt}));var a={};n.r(a),n.d(a,"getSpline",(function(){return he})),n.d(a,"getControlPoint",(function(){return de})),n.d(a,"pointsToPolygon",(function(){return pe})),n.d(a,"pathToPoints",(function(){return ge})),n.d(a,"getClosedSpline",(function(){return ve})),n.d(a,"roundedHull",(function(){return xe})),n.d(a,"paddedHull",(function(){return we}));var s={};n.r(s),n.d(s,"leftTranslate",(function(){return cn})),n.d(s,"leftRotate",(function(){return fn})),n.d(s,"leftScale",(function(){return ln})),n.d(s,"transform",(function(){return hn})),n.d(s,"direction",(function(){return dn})),n.d(s,"angleTo",(function(){return pn})),n.d(s,"vertical",(function(){return gn}));var u={};n.r(u),n.d(u,"mixColor",(function(){return Cn})),n.d(u,"getColorsWithSubjectColor",(function(){return In})),n.d(u,"getColorSetsBySubjectColors",(function(){return Pn}));var c={};n.r(c),n.d(c,"gpuDetector",(function(){return Xh}));var f={};n.r(f),n.d(f,"proccessToFunc",(function(){return ad})),n.d(f,"buildTextureData",(function(){return sd})),n.d(f,"buildTextureDataWithOneEdgeAttr",(function(){return ud})),n.d(f,"buildTextureDataWithTwoEdgeAttr",(function(){return cd})),n.d(f,"attributesToTextureData",(function(){return fd})),n.d(f,"arrayToTextureData",(function(){return ld})),n.d(f,"radialLayout",(function(){return hd}));var l={};n.r(l),n.d(l,"default",(function(){return yp})),n.d(l,"assign",(function(){return Qd})),n.d(l,"format",(function(){return gp})),n.d(l,"parse",(function(){return vp})),n.d(l,"defaultI18n",(function(){return ep})),n.d(l,"setGlobalDateI18n",(function(){return rp})),n.d(l,"setGlobalDateMasks",(function(){return pp}));var h=n(0),d={getDefaultCfg:function(){return{}},getEvents:function(){return{}},updateCfg:function(t){return Object.assign(this,t),!0},shouldBegin:function(){return!0},shouldUpdate:function(){return!0},shouldEnd:function(){return!0},bind:function(t){var e=this,n=this.events;this.graph=t,"drag-canvas"!==this.type&&"brush-select"!==this.type&&"lasso-select"!==this.type||t.get("canvas").set("draggable",!0),Object(h.f)(n,(function(e,n){t.on(n,e)})),document.addEventListener("visibilitychange",(function(){e.keydown=!1}))},unbind:function(t){var e=this.events;"drag-canvas"!==this.type&&"brush-select"!==this.type&&"lasso-select"!==this.type||t.get("canvas").set("draggable",!1),Object(h.f)(e,(function(e,n){t.off(n,e)}))},get:function(t){return this[t]},set:function(t,e){return this[t]=e,this}},p=function(){function t(){}return t.registerBehavior=function(e,n){if(!n)throw new Error("please specify handler for this behavior: "+e);var r=Object(h.c)(d);Object.assign(r,n);var i=function(t){var e=this;Object.assign(this,this.getDefaultCfg(),t);var n=this.getEvents();this.events=null;var r={};n&&(Object(h.f)(n,(function(t,n){r[n]=Object(h.J)(e,t)})),this.events=r)};i.prototype=r,t.types[e]=i},t.hasBehavior=function(e){return!!t.types[e]},t.getBehavior=function(e){return t.types[e]},t.types={},t}(),g=p,v=n(1),y=n(136),m=n(18),b=n(51),x=m.a.transform,w=function(t){return function(e,n){return e[t]-n[t]}},S=function(t,e,n){return t>=e&&t<=n},E=function(t,e,n,r){var i=n.x-t.x,o=n.y-t.y,a=e.x-t.x,s=e.y-t.y,u=r.x-n.x,c=r.y-n.y,f=a*c-s*u,l=1/f,h=null;if(f*f>1e-4*(a*a+s*s)*(u*u+c*c)){var d=(i*c-o*u)*l,p=(i*s-o*a)*l;S(d,0,1)&&S(p,0,1)&&(h={x:t.x+d*a,y:t.y+d*s})}return h},_=function(t,e){var n=t.x,r=t.y,i=t.width,o=t.height,a=[],s={x:n+i/2,y:r+o/2};a.push({x:n,y:r}),a.push({x:n+i,y:r}),a.push({x:n+i,y:r+o}),a.push({x:n,y:r+o}),a.push({x:n,y:r});for(var u=null,c=1;ce[r][o]+e[o][i]&&(e[r][i]=e[r][o]+e[o][i]);return e},j=function(t,e){var n=t.nodes,r=t.edges,i=[],o={};if(!n)throw new Error("invalid nodes data!");return n&&n.forEach((function(t,e){o[t.id]=e;i.push([])})),r&&r.forEach((function(t){var n=t.source,r=t.target,a=o[n],s=o[r];i[a][s]=1,e||(i[s][a]=1)})),i},D=function(t,e){t.translate(e.x,e.y)},N=function(t,e){var n=t.getMatrix();n||(n=[1,0,0,0,1,0,0,0,1]);var r=t.getCanvasBBox(),i=e.x-r.minX,o=e.y-r.minY,a=x(n,[["t",i,o]]);t.setMatrix(a)},R=function(t,e){var n=t.getMatrix();n||(n=[1,0,0,0,1,0,0,0,1]);var r=e;Object(h.m)(e)||(r=[e,e]),Object(h.m)(e)&&1===e.length&&(r=[e[0],e[0]]),n=x(n,[["s",r[0],r[1]]]),t.setMatrix(n)},L=function(t,e){var n=t.getMatrix();n||(n=[1,0,0,0,1,0,0,0,1]),n=x(n,[["r",e]]),t.setMatrix(n)},B=function(t,e,n){for(var r=[],i=0;i0!=o(u[1]-n)>0&&o(e-(n-s[1])*(s[0]-u[0])/(s[1]-u[1])-s[0])<0&&(r=!r)}return r},X=function(t,e){return!(e.minX>t.maxX||e.maxXt.maxY||e.maxY1){var a=t[0],s=t[n-1];e.push({from:{x:s[0],y:s[1]},to:{x:a[0],y:a[1]}})}return e};if(t.length<2||e.length<2)return!1;var i=n(t),o=n(e);if(!X(i,o))return!1;var a=!1;if(Object(h.f)(e,(function(e){if(W(t,e[0],e[1]))return a=!0,!1})),a)return!0;if(Object(h.f)(t,(function(t){if(W(e,t[0],t[1]))return a=!0,!1})),a)return!0;var s=r(t),u=r(e),c=!1;return Object(h.f)(u,(function(t){if(function(t,e){var n=!1;return Object(h.f)(t,(function(t){if(E(t.from,t.to,e.from,e.to))return n=!0,!1})),n}(s,t))return c=!0,!1})),c},H=function(){function t(t,e,n,r){this.x1=t,this.y1=e,this.x2=n,this.y2=r}return t.prototype.getBBox=function(){var t=Math.min(this.x1,this.x2),e=Math.min(this.y1,this.y2),n=Math.max(this.x1,this.x2),r=Math.max(this.y1,this.y2);return{x:t,y:e,minX:t,minY:e,maxX:n,maxY:r,width:n-t,height:r-e}},t}(),q=function(t,e){return{top:[t.minX,t.minY,t.maxX,t.minY],left:[t.minX,t.minY,t.minX,t.maxY],bottom:[t.minX,t.maxY,t.maxX,t.maxY],right:[t.maxX,t.minY,t.maxX,t.maxY]}[e]},K=function(t,e){var n=(e.x2-e.x1)*(t.y1-e.y1)-(e.y2-e.y1)*(t.x1-e.x1),r=(t.x2-t.x1)*(t.y1-e.y1)-(t.y2-t.y1)*(t.x1-e.x1),i=(e.y2-e.y1)*(t.x2-t.x1)-(e.x2-e.x1)*(t.y2-t.y1);if(i){var o=n/i,a=r/i;if(o>=0&&o<=1&&a>=0&&a<=1)return o}return Number.POSITIVE_INFINITY},Z=function(t,e){for(var n=["top","left","bottom","right"],r=t.getBBox(),i=0,o=[],a=0;a<4;a++){var s=q(r,n[a]),u=s[0],c=s[1],f=s[2],l=s[3];o[a]=E({x:e.x1,y:e.y1},{x:e.x2,y:e.y2},{x:u,y:c},{x:f,y:l}),o[a]&&(i+=1)}return[o,i]},Q=function(t,e){for(var n=["top","left","bottom","right"],r=t.getBBox(),i=Number.POSITIVE_INFINITY,o=0,a=0;a<4;a++){var s=q(r,n[a]),u=s[0],c=s[1],f=s[2],l=s[3],h=K(e,new H(u,c,f,l));(h=Math.abs(h-.5))>=0&&h<=1&&(o+=1,i=h0){for(var r=0,i=t;re.x+e.width,i=t.y>e.y+e.height,o=t.y]*>/,V={tr:document.createElement("tbody"),tbody:F,thead:F,tfoot:F,td:U,th:U,"*":document.createElement("div")});var e=z.test(t)&&RegExp.$1;e&&e in V||(e="*");var n=V[e];t=t.replace(/(^\\s*)|(\\s*$)/g,""),n.innerHTML=""+t;var r=n.childNodes[0];return n.removeChild(r),r}function vt(t,e){if(t)for(var n in e)e.hasOwnProperty(n)&&(t.style[n]=e[n]);return t}var yt=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.item=n.item,r.canvasX=n.canvasX,r.canvasY=n.canvasY,r.wheelDelta=n.wheelDelta,r.detail=n.detail,r}return Object(v.b)(e,t),e}(n(21).Event),mt=function(t){return t+"-"+Math.random()+Date.now()},bt=function(t){var e=0,n=0,r=0,i=0;if(Object(h.t)(t))e=n=r=i=t;else if(Object(h.x)(t)){e=n=r=i=parseInt(t,10)}else Object(h.m)(t)&&(e=t[0],r=Object(h.s)(t[1])?t[0]:t[1],i=Object(h.s)(t[2])?t[0]:t[2],n=Object(h.s)(t[3])?r:t[3]);return[e,r,i,n]},xt=function(t){var e=new yt(t.type,t);return e.clientX=t.clientX,e.clientY=t.clientY,e.x=t.x,e.y=t.y,e.target=t.target,e.currentTarget=t.currentTarget,e.bubbles=!0,e.item=t.item,e},wt=function(t){if(!t)return!1;for(var e=[1,0,0,0,1,0,0,0,1],n=0;n<9;n++)if(t[n]!==e[n])return!0;return!1},St=function(t){return Number.isNaN(Number(t))},Et=function(t){for(var e=1/0,n=-1/0,r=1/0,i=-1/0,o=0;on&&(n=c),f>i&&(i=f)}return{x:Math.floor(e),y:Math.floor(r),width:Math.ceil(n)-Math.floor(e),height:Math.ceil(i)-Math.floor(r),minX:e,minY:r,maxX:n,maxY:i}},_t=function(t,e,n,r,i){void 0===e&&(e=15),void 0===n&&(n="quadratic");for(var o=t.length,a=2*e,s=["top","top-right","right","bottom-right","bottom","bottom-left","left","top-left"],u={},c=[],f={},l=0;lf&&(l=f),t.zoom(l,a)}},t.prototype.getFormatPadding=function(){var t=this.graph.get("fitViewPadding");return bt(t)},t.prototype.focusPoint=function(t,e,n){var r=this,i=this.getViewCenter(),o=this.getPointByCanvas(i.x,i.y),a=this.graph.get("group").getMatrix();if(a||(a=[1,0,0,0,1,0,0,0,1]),e){var s=(o.x-t.x)*a[0],u=(o.y-t.y)*a[4],c=0,f=0,l=0,h=0;this.graph.get("canvas").animate((function(t){l=s*t,h=u*t,r.graph.translate(l-c,h-f),c=l,f=h}),Object(v.a)({},n))}else this.graph.translate((o.x-t.x)*a[0],(o.y-t.y)*a[4])},t.prototype.getPointByCanvas=function(t,e){var n=this.graph.get("group").getMatrix();return n||(n=[1,0,0,0,1,0,0,0,1]),A({x:t,y:e},n)},t.prototype.getPointByClient=function(t,e){var n=this.graph.get("canvas").getPointByClient(t,e);return this.getPointByCanvas(n.x,n.y)},t.prototype.getClientByPoint=function(t,e){var n=this.graph.get("canvas"),r=this.getCanvasByPoint(t,e),i=n.getClientByPoint(r.x,r.y);return{x:i.x,y:i.y}},t.prototype.getCanvasByPoint=function(t,e){var n=this.graph.get("group").getMatrix();return n||(n=[1,0,0,0,1,0,0,0,1]),M({x:t,y:e},n)},t.prototype.focus=function(t,e,n){Object(h.x)(t)&&(t=this.graph.findById(t));var r=t.get("group").getMatrix();r||(r=[1,0,0,0,1,0,0,0,1]),t&&this.focusPoint({x:r[6],y:r[7]},e,n)},t.prototype.changeSize=function(t,e){var n=this.graph;if(!Object(h.t)(t)||!Object(h.t)(e))throw Error("invalid canvas width & height, please make sure width & height type is number");n.set({width:t,height:e}),n.get("canvas").changeSize(t,e),n.get("plugins").forEach((function(r){if(r.get("gridContainer")){var i=n.get("minZoom");vt(r.get("container"),{width:t+"px",height:e+"px"}),vt(r.get("gridContainer"),{width:t/i+"px",height:e/i+"px",left:0,top:0})}}))},t.prototype.destroy=function(){this.graph=null,this.destroyed=!1},t}(),kt={" ":.3329986572265625,a:.5589996337890625,A:.6569992065429687,b:.58599853515625,B:.6769989013671875,c:.5469985961914062,C:.7279998779296875,d:.58599853515625,D:.705999755859375,e:.554998779296875,E:.63699951171875,f:.37299957275390627,F:.5769989013671875,g:.5909988403320312,G:.7479995727539063,h:.555999755859375,H:.7199996948242188,i:.255999755859375,I:.23699951171875,j:.26699981689453123,J:.5169998168945312,k:.5289993286132812,K:.6899993896484375,l:.23499908447265624,L:.5879989624023437,m:.854998779296875,M:.8819992065429687,n:.5589996337890625,N:.7189987182617188,o:.58599853515625,O:.7669998168945312,p:.58599853515625,P:.6419998168945312,q:.58599853515625,Q:.7669998168945312,r:.3649993896484375,R:.6759994506835938,s:.504998779296875,S:.6319992065429687,t:.354998779296875,T:.6189987182617187,u:.5599990844726562,U:.7139999389648437,v:.48199920654296874,V:.6389999389648438,w:.754998779296875,W:.929998779296875,x:.5089996337890625,X:.63699951171875,y:.4959991455078125,Y:.66199951171875,z:.48699951171875,Z:.6239990234375,0:.6,1:.40099945068359377,2:.6,3:.6,4:.6,5:.6,6:.6,7:.5469985961914062,8:.6,9:.6,"[":.3329986572265625,"]":.3329986572265625,",":.26399993896484375,".":.26399993896484375,";":.26399993896484375,":":.26399993896484375,"{":.3329986572265625,"}":.3329986572265625,"\\\\":.5,"|":.19499969482421875,"=":.604998779296875,"+":.604998779296875,"-":.604998779296875,_:.5,"`":.3329986572265625," ~":.8329986572265625,"!":.3329986572265625,"@":.8579986572265625,"#":.6,$:.6,"%":.9699996948242188,"^":.517999267578125,"&":.7259994506835937,"*":.505999755859375,"(":.3329986572265625,")":.3329986572265625,"<":.604998779296875,">":.604998779296875,"/":.5,"?":.53699951171875},Mt=Math.PI,At=Math.sin,Tt=Math.cos,Ct=At(Mt/8),It=Tt(Mt/8),Pt=function(t,e){var n=t.getBBox(),r={x:n.minX,y:n.minY},i={x:n.maxX,y:n.maxY};if(e){var o=e.getMatrix();o||(o=[1,0,0,0,1,0,0,0,1]),r=M(r,o),i=M(i,o)}var a=r.x,s=r.y,u=i.x,c=i.y;return{x:a,y:s,minX:a,minY:s,maxX:u,maxY:c,width:u-a,height:c-s}},jt=function(t){var e=t.sourceNode||t.targetNode,n=e.get("group").getMatrix();n||(n=[1,0,0,0,1,0,0,0,1]);var r=e.getKeyShape().getBBox(),i=t.loopCfg||{},o=i.dist||2*Math.max(r.width,r.height),a=i.position||ht.defaultLoopPosition,s=[n[6],n[7]],u=[t.startPoint.x,t.startPoint.y],c=[t.endPoint.x,t.endPoint.y],f=r.height/2,l=r.height/2,h=f*Ct,d=f*It,p=l*Ct,g=l*It;if(u[0]===c[0]&&u[1]===c[1]){switch(a){case"top":u=[s[0]-h,s[1]-d],c=[s[0]+p,s[1]-g];break;case"top-right":f=r.height/2,l=r.width/2,u=[s[0]+(h=f*Ct),s[1]-(d=f*It)],c=[s[0]+(g=l*It),s[1]-(p=l*Ct)];break;case"right":f=r.width/2,l=r.width/2,u=[s[0]+(d=f*It),s[1]-(h=f*Ct)],c=[s[0]+(g=l*It),s[1]+(p=l*Ct)];break;case"bottom-right":f=r.width/2,l=r.height/2,u=[s[0]+(d=f*It),s[1]+(h=f*Ct)],c=[s[0]+(p=l*Ct),s[1]+(g=l*It)];break;case"bottom":f=r.height/2,l=r.height/2,u=[s[0]+(h=f*Ct),s[1]+(d=f*It)],c=[s[0]-(p=l*Ct),s[1]+(g=l*It)];break;case"bottom-left":f=r.height/2,l=r.width/2,u=[s[0]-(h=f*Ct),s[1]+(d=f*It)],c=[s[0]-(g=l*It),s[1]+(p=l*Ct)];break;case"left":f=r.width/2,l=r.width/2,u=[s[0]-(d=f*It),s[1]+(h=f*Ct)],c=[s[0]-(g=l*It),s[1]-(p=l*Ct)];break;case"top-left":f=r.width/2,l=r.height/2,u=[s[0]-(d=f*It),s[1]-(h=f*Ct)],c=[s[0]-(p=l*Ct),s[1]-(g=l*It)];break;default:f=r.width/2,l=r.width/2,u=[s[0]-(h=f*Ct),s[1]-(d=f*It)],c=[s[0]+(p=l*Ct),s[1]-(g=l*It)]}if(!1===i.clockwise){var v=[u[0],u[1]];u=[c[0],c[1]],c=[v[0],v[1]]}}var y=[u[0]-s[0],u[1]-s[1]],b=(f+o)/f,x=(l+o)/l;!1===i.clockwise&&(b=(l+o)/l,x=(f+o)/f);var w=m.c.scale([0,0],y,b),S=[s[0]+w[0],s[1]+w[1]],E=[c[0]-s[0],c[1]-s[1]],_=m.c.scale([0,0],E,x),O=[s[0]+_[0],s[1]+_[1]];return t.startPoint={x:u[0],y:u[1]},t.endPoint={x:c[0],y:c[1]},t.controlPoints=[{x:S[0],y:S[1]},{x:O[0],y:O[1]}],t},Dt=function(t,e,n,r,i){var o=[],a=t.getPoint(e);if(null===a)return{x:0,y:0,angle:0};if(e<1e-4)o=t.getStartTangent().reverse();else if(e>.9999)o=t.getEndTangent();else{var s=t.getPoint(e+1e-4);o.push([a.x,a.y]),o.push([s.x,s.y])}var u=Math.atan2(o[1][1]-o[0][1],o[1][0]-o[0][0]);if(u<0&&(u+=2*Mt),n&&(a.x+=Tt(u)*n,a.y+=At(u)*n),r){var c=u-Mt/2;u>.5*Mt&&u<1.5*Mt&&(c-=Mt),a.x+=Tt(c)*r,a.y+=At(c)*r}var f={x:a.x,y:a.y,angle:u};return i?(u>.5*Mt&&u<1.5*Mt&&(u-=Mt),Object(v.a)({rotate:u},f)):f},Nt=function t(e,n){if(!1===n(e))return!1;if(e&&e.children)for(var r=e.children.length-1;r>=0;r--)if(!t(e.children[r],n))return!1;return!0},Rt=function(t,e){"function"==typeof e&&Nt(t,e)},Lt=function(t,e){"function"==typeof e&&function t(e,n){if(e&&e.children)for(var r=e.children.length-1;r>=0;r--)if(!t(e.children[r],n))return;return!1!==n(e)}(t,e)},Bt=function(t,e){return e*(kt[t]||1)},Gt=function(t,e){var n=0,r=new RegExp("[一-é¾¥]+");return t.split("").forEach((function(t){r.test(t)?n+=e:n+=Bt(t,e)})),[n,e]},Ft=function(t,e){var n=[],r={},i={};t.forEach((function(t){i[t.id]=t})),t.forEach((function(t,e){var o=Object(h.c)(t);o.itemType="combo",o.children=void 0,o.parentId===o.id?(console.warn("The parentId for combo "+o.id+" can not be the same as the combo\'s id"),delete o.parentId):o.parentId&&!i[o.parentId]&&(console.warn("The parent combo for combo "+o.id+" does not exist!"),delete o.parentId);var a=r[o.id];if(a){if(o.children=a.children,r[o.id]=o,!(a=o).parentId)return void n.push(a);var s=r[a.parentId];if(s)s.children?s.children.push(o):s.children=[o];else{var u={id:a.parentId,children:[a]};r[a.parentId]=u,r[o.id]=o}}else if(Object(h.x)(t.parentId)){var c=r[t.parentId];if(c)c.children?c.children.push(o):c.children=[o],r[o.id]=o;else{var f={id:t.parentId,children:[o]};r[f.id]=f,r[o.id]=o}}else n.push(o),r[o.id]=o}));var o={};(e||[]).forEach((function(t){o[t.id]=t;var e=r[t.comboId];if(e){var n={id:t.id,comboId:t.comboId};e.children?e.children.push(n):e.children=[n],n.itemType="node",r[t.id]=n}}));var a=0;return n.forEach((function(t){t.depth=a+10,Nt(t,(function(t){var e,n=r[t.id].itemType;e="node"===n?r[t.comboId]:r[t.parentId],t.depth=e&&"node"===n?a+1:a+10,a-1&&i.splice(u,1),a||(r={id:e,itemType:"node",comboId:n},o[e]={children:void 0}),e){var c=!1;if(n){var f=0;(t||[]).forEach((function(t){c||Rt(t,(function(t){return n!==t.id||(c=!0,t.children?t.children.push(r):t.children=[r],f=t.depth,"node"===r.itemType?r.depth=f+2:r.depth=f+1,!1)}))}))}else n&&c||"node"===r.itemType||t.push(r);var l=r.depth;Rt(r,(function(t){return"node"===t.itemType?l+=2:l+=1,t.depth=l,!0}))}return t},zt=function(t,e){var n={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,x:void 0,y:void 0,width:void 0,height:void 0,centerX:void 0,centerY:void 0};return t&&0!==t.length?(t.forEach((function(t){var r=e.findById(t.id);if(r&&r.isVisible()){r.set("bboxCanvasCache",void 0);var i=r.getCanvasBBox();i.x&&n.minX>i.minX&&(n.minX=i.minX),i.y&&n.minY>i.minY&&(n.minY=i.minY),i.x&&n.maxXr.width&&(r.width=f.width+f.x),f.height+f.y>r.height&&(r.height=f.height+f.y)}}}return t.bbox=function(t,e,n){var r,i,o=t.attrs,a=void 0===o?{}:o,s={x:e.x||0,y:e.y||0,width:n.width||0,height:n.height||0};switch(t.type){case"maker":case"circle":a.r&&(i=2*a.r,r=2*a.r);break;case"text":a.text&&(i=Gt(a.text,a.fontSize||12)[0],r=16,s.y+=r,s.height=r,s.width=i,t.attrs=Object(v.a)({fontSize:12,fill:"#000"},a));break;default:a.width&&(i=a.width),a.height&&(r=a.height)}return r>=0&&(s.height=r),i>=0&&(s.width=i),a.marginTop&&(s.y+=a.marginTop),a.marginLeft&&(s.x+=a.marginLeft),s}(t,e,r),t.attrs=Object(v.a)(Object(v.a)({},t.attrs),t.bbox),t}function qt(t){var e={},n=function(e){var n=function(t){return function(e){for(var n=t.length,r=[],i=0,o="";i0||(null===(i=n.children)||void 0===i?void 0:i.length)>0)for(var f=Math.max(null===(o=e.children)||void 0===o?void 0:o.length,null===(a=n.children)||void 0===a?void 0:a.length),l=n.children||[],h=e.children||[],d=0;d-1)return;n.push(i)}else s>-1&&n.splice(s,1)}else if(Object(h.x)(e)){var u=n.filter((function(t){return t.includes(o)}));u.length>0&&this.clearStates(u),(a=a.filter((function(t){return!t.includes(o)}))).push(i),this.set("states",a)}if(r){var c=this.get("model").type;r.setState(c,t,e,this)}},t.prototype.clearStates=function(t){var e=this,n=e.getStates(),r=e.get("shapeFactory"),i=e.get("model").type;t||(t=n),Object(h.x)(t)&&(t=[t]);var o=n.filter((function(e){return-1===t.indexOf(e)}));e.set("states",o),t.forEach((function(t){r.setState(i,t,!1,e)}))},t.prototype.getContainer=function(){return this.get("group")},t.prototype.getKeyShape=function(){return this.get("keyShape")},t.prototype.getModel=function(){return this.get("model")},t.prototype.getType=function(){return this.get("type")},t.prototype.getID=function(){return this.get("id")},t.prototype.isItem=function(){return!0},t.prototype.getStates=function(){return this.get("states")},t.prototype.hasState=function(t){return this.getStates().indexOf(t)>=0},t.prototype.refresh=function(){var t=this.get("model");this.updatePosition(t),this.updateShape(),this.afterUpdate(),this.clearCache()},t.prototype.isOnlyMove=function(t){return!1},t.prototype.update=function(t,e){void 0===e&&(e=!1);var n=this.get("model"),r=n.visible,i=t.visible;r!==i&&void 0!==i&&this.changeVisibility(i);var o=n.x,a=n.y;t.x=isNaN(t.x)?n.x:t.x,t.y=isNaN(t.y)?n.y:t.y;var s=this.get("styles");if(t.stateStyles){var u=t.stateStyles;Object(h.A)(s,u),delete t.stateStyles}Object.assign(n,t),e?this.updatePosition(t):(o===t.x&&a===t.y||this.updatePosition(t),this.updateShape()),this.afterUpdate(),this.clearCache()},t.prototype.updateShape=function(){var t=this.get("shapeFactory"),e=this.get("model"),n=e.type;if(t.shouldUpdate(n)&&n===this.get("currentShape")){var r=this.getShapeCfg(e);t.baseUpdate(n,r,this)}else this.draw();this.setOriginStyle(e),this.restoreStates(t,n)},t.prototype.updatePosition=function(t){var e=this.get("model"),n=Object(h.s)(t.x)?e.x:t.x,r=Object(h.s)(t.y)?e.y:t.y,i=this.get("group");Object(h.s)(n)||Object(h.s)(r)||(i.resetMatrix(),D(i,{x:n,y:r}),e.x=n,e.y=r,this.clearCache())},t.prototype.getBBox=function(){var t=this.get("bboxCache");return t||(t=this.calculateBBox(),this.set("bboxCache",t)),t},t.prototype.getCanvasBBox=function(){var t=this.get("bboxCanvasCache");return t||(t=this.calculateCanvasBBox(),this.set("bboxCanvasCache",t)),t},t.prototype.toFront=function(){this.get("group").toFront()},t.prototype.toBack=function(){this.get("group").toBack()},t.prototype.show=function(){this.changeVisibility(!0)},t.prototype.hide=function(){this.changeVisibility(!1)},t.prototype.changeVisibility=function(t){var e=this.get("group");t?e.show():e.hide(),this.set("visible",t)},t.prototype.isVisible=function(){return this.get("visible")},t.prototype.enableCapture=function(t){var e=this.get("group");e&&e.set("capture",t)},t.prototype.destroy=function(){if(!this.destroyed){var t=this.get("animate"),e=this.get("group");t&&e.stopAnimate(),this.clearCache(),e.remove(),this._cfg=null,this.destroyed=!0}},t}(),re={source:"start",target:"end"},ie=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(v.b)(e,t),e.prototype.getDefaultCfg=function(){return{type:"edge",sourceNode:null,targetNode:null,startPoint:null,endPoint:null,linkCenter:!1}},e.prototype.setEnd=function(t,e){var n=re[t]+"Point",r=t+"Node",i=this.get(r);i&&!i.destroyed&&i.removeEdge(this),Object(h.w)(e)?(this.set(n,e),this.set(r,null)):(e.addEdge(this),this.set(r,e),this.set(n,null))},e.prototype.getLinkPoint=function(t,e,n){var r=re[t]+"Point",i=t+"Node",o=this.get(r);if(!o){var a=this.get(i),s=t+"Anchor",u=this.getPrePoint(t,n),c=e[s];Object(h.s)(c)||(o=a.getLinkPointByAnchor(c)),o=o||a.getLinkPoint(u),Object(h.s)(o.index)||this.set(t+"AnchorIndex",o.index)}return o},e.prototype.getPrePoint=function(t,e){if(e&&e.length)return e["source"===t?0:e.length-1];var n="source"===t?"target":"source";return this.getEndPoint(n)},e.prototype.getEndPoint=function(t){var e=t+"Node",n=re[t]+"Point",r=this.get(e);return r?r.get("model"):this.get(n)},e.prototype.getControlPointsByCenter=function(t){var e=this.getEndPoint("source"),n=this.getEndPoint("target"),r=this.get("shapeFactory"),i=t.type;return r.getControlPoints(i,{startPoint:e,endPoint:n})},e.prototype.getEndCenter=function(t){var e=t+"Node",n=re[t]+"Point",r=this.get(e);if(r){var i=r.getBBox();return{x:i.centerX,y:i.centerY}}return this.get(n)},e.prototype.init=function(){t.prototype.init.call(this),this.setSource(this.get("source")),this.setTarget(this.get("target"))},e.prototype.getShapeCfg=function(e){var n=this.get("linkCenter"),r=t.prototype.getShapeCfg.call(this,e);if(n)r.startPoint=this.getEndCenter("source"),r.endPoint=this.getEndCenter("target");else{var i=r.controlPoints||this.getControlPointsByCenter(r);r.startPoint=this.getLinkPoint("source",e,i),r.endPoint=this.getLinkPoint("target",e,i)}return r.sourceNode=this.get("sourceNode"),r.targetNode=this.get("targetNode"),r},e.prototype.getModel=function(){var t=this.get("model"),e=this.get("sourceNode"),n=this.get("targetNode");return e?delete t.sourceNode:t.source=this.get("startPoint"),n?delete t.targetNode:t.target=this.get("endPoint"),Object(h.x)(t.source)||Object(h.w)(t.source)||(t.source=t.source.getID()),Object(h.x)(t.target)||Object(h.w)(t.target)||(t.target=t.target.getID()),t},e.prototype.setSource=function(t){this.setEnd("source",t),this.set("source",t)},e.prototype.setTarget=function(t){this.setEnd("target",t),this.set("target",t)},e.prototype.getSource=function(){return this.get("source")},e.prototype.getTarget=function(){return this.get("target")},e.prototype.updatePosition=function(){},e.prototype.update=function(t,e){void 0===e&&(e=!1);var n=this.get("model"),r=n.visible,i=t.visible;r!==i&&void 0!==i&&this.changeVisibility(i);var o=this.get("styles");if(t.stateStyles){var a=t.stateStyles;Object(h.A)(o,a),delete t.stateStyles}Object.assign(n,t),this.updateShape(),this.afterUpdate(),this.clearCache()},e.prototype.destroy=function(){var e=this.get("sourceNode"),n=this.get("targetNode");e&&!e.destroyed&&e.removeEdge(this),n&&!n.destroyed&&n.removeEdge(this),t.prototype.destroy.call(this)},e}(ne),oe=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(v.b)(e,t),e.prototype.getNearestPoint=function(t,e){for(var n=0,r=t[0],i=C(t[0],e),o=0;o-1&&e.splice(n,1)},e.prototype.clearCache=function(){this.set("bboxCache",null),this.set("anchorPointsCache",null)},e.prototype.isOnlyMove=function(t){if(!t)return!1;var e=!Object(h.s)(t.x),n=!Object(h.s)(t.y),r=Object.keys(t);return 1===r.length&&(e||n)||2===r.length&&e&&n},e}(ne),ae=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(v.b)(e,t),e.prototype.getDefaultCfg=function(){return{type:"combo",nodes:[],edges:[],combos:[]}},e.prototype.getShapeCfg=function(t){var e=this.get("styles"),n=this.get("bbox");if(e&&n){var r=t,i={r:Math.hypot(n.height,n.width)/2||ht.defaultCombo.size[0]/2,width:n.width||ht.defaultCombo.size[0],height:n.height||ht.defaultCombo.size[1]};r.style=Object(v.a)(Object(v.a)(Object(v.a)({},e),t.style),i);var o=t.padding||ht.defaultCombo.padding;return Object(h.t)(o)?(i.r+=o,i.width+=2*o,i.height+=2*o):(i.r+=o[0],i.width+=o[1]+o[3]||2*o[1],i.height+=o[0]+o[2]||2*o[0]),this.set("sizeCache",i),r}return t},e.prototype.calculateCanvasBBox=function(){if(!this.destroyed){var t=this.get("keyShape"),e=this.get("group"),n=Pt(t,e);n.centerX=(n.minX+n.maxX)/2,n.centerY=(n.minY+n.maxY)/2;var r=this.get("sizeCache"),i=this.get("bboxCache")||{},o=i.x,a=i.x;if(r)"circle"===t.get("type")?(n.width=2*r.r,n.height=2*r.r):(n.width=r.width,n.height=r.height),n.minX=n.centerX-n.width/2,n.minY=n.centerY-n.height/2,n.maxX=n.centerX+n.width/2,n.maxY=n.centerY+n.height/2;else n.width=n.maxX-n.minX,n.height=n.maxY-n.minY,n.centerX=(n.minX+n.maxX)/2,n.centerY=(n.minY+n.maxY)/2;return n.x=n.minX,n.y=n.minY,n.x===o&&n.y===a||this.set("anchorPointsCache",null),n}},e.prototype.getChildren=function(){return{nodes:this.getNodes(),combos:this.getCombos()}},e.prototype.getNodes=function(){return this.get("nodes")},e.prototype.getCombos=function(){return this.get("combos")},e.prototype.addChild=function(t){switch(t.getType()){case"node":this.addNode(t);break;case"combo":this.addCombo(t);break;default:return console.warn("Only node or combo items are allowed to be added into a combo"),!1}return!0},e.prototype.addCombo=function(t){return this.get("combos").push(t),!0},e.prototype.addNode=function(t){return this.get("nodes").push(t),!0},e.prototype.removeChild=function(t){switch(t.getType()){case"node":this.removeNode(t);break;case"combo":this.removeCombo(t);break;default:return console.warn("Only node or combo items are allowed to be added into a combo"),!1}return!0},e.prototype.removeCombo=function(t){if(t){var e=this.getCombos(),n=e.indexOf(t);return n>-1&&(e.splice(n,1),!0)}},e.prototype.removeNode=function(t){if(t){var e=this.getNodes(),n=e.indexOf(t);return n>-1&&(e.splice(n,1),!0)}},e.prototype.isOnlyMove=function(t){return!1},e.prototype.getBBox=function(){return this.set("bboxCanvasCache",null),this.calculateCanvasBBox()},e.prototype.clearCache=function(){this.set("bboxCache",null),this.set("bboxCanvasCache",null),this.set("anchorPointsCache",null)},e.prototype.destroy=function(){if(!this.destroyed){var t=this.get("animate"),e=this.get("group");t&&e.stopAnimate(),this.clearCache(),this.set("sizeCache",null),this.set("bbox",null),e.remove(),this._cfg=null,this.destroyed=!0}},e}(oe),se=function(){function t(t){this.graph=t,this.destroyed=!1}return t.prototype.addItem=function(t,e){var n=this,r=this.graph,i="vedge"===t?"edge":t,o=r.get(i+"Group")||r.get("group"),a=Object(h.I)(i),s=null,u=r.get(i+Object(h.I)("stateStyles"))||{},c=r.get("default"+a);e.stateStyles&&(u=e.stateStyles),c&&Object(h.f)(c,(function(t,n){Object(h.v)(t)&&!Object(h.m)(t)?e[n]=Object(h.e)({},t,e[n]):Object(h.m)(t)?e[n]=e[n]||Object(h.c)(c[n]):e[n]=e[n]||c[n]}));var f=r.get(i+"Mapper");if(f){var l=f(e);l.stateStyles&&(u=l.stateStyles,delete l.stateStyles),Object(h.f)(l,(function(t,n){Object(h.v)(t)&&!Object(h.m)(t)?e[n]=Object(h.e)({},e[n],t):e[n]=l[n]||e[n]}))}if(r.emit("beforeadditem",{type:t,model:e}),"edge"===t||"vedge"===t){var d=void 0,p=void 0;if(d=e.source,p=e.target,d&&Object(h.x)(d)&&(d=r.findById(d)),p&&Object(h.x)(p)&&(p=r.findById(p)),!d||!p)return void console.warn("The source or target node of edge "+e.id+" does not exist!");d.getType&&"combo"===d.getType()&&(e.isComboEdge=!0),p.getType&&"combo"===p.getType()&&(e.isComboEdge=!0),s=new ie({model:e,source:d,target:p,styles:u,linkCenter:r.get("linkCenter"),group:o.addGroup()})}else if("node"===t)s=new oe({model:e,styles:u,group:o.addGroup()});else if("combo"===t){var g=e.children,v=zt(g,r);e.x=v.x||e.x||100*Math.random(),e.y=v.y||e.y||100*Math.random();var y=o.addGroup();y.setZIndex(e.depth);var m=(s=new ae({model:e,styles:u,bbox:v,group:y})).getModel();(g||[]).forEach((function(t){var e=r.findById(t.id);s.addChild(e),t.depth=m.depth+2})),e.collapsed&&setTimeout((function(){r.collapseCombo(s),n.updateCombo(s,[])}),250)}if(s)return r.get(t+"s").push(s),r.get("itemMap")[s.get("id")]=s,r.emit("afteradditem",{item:s,model:e}),s},t.prototype.updateItem=function(t,e){var n,r,i=this.graph;if(Object(h.x)(t)&&(t=i.findById(t)),t&&!t.destroyed){var o="";t.getType&&(o=t.getType());var a=i.get(o+"Mapper"),s=t.getModel(),u=t.isOnlyMove(e);if(a){var c=a(Object(h.e)({},s,e)),f=Object(h.e)({},s,c,e);c.stateStyles&&(t.set("styles",f.stateStyles),delete f.stateStyles),Object(h.f)(f,(function(t,n){e[n]=t}))}else Object(h.f)(e,(function(t,n){s[n]&&Object(h.v)(t)&&!Object(h.m)(t)&&(e[n]=Object(v.a)(Object(v.a)({},s[n]),e[n]))}));if(i.emit("beforeupdateitem",{item:t,cfg:e}),"edge"===o){if(e.source){var l=e.source;Object(h.x)(l)&&(l=i.findById(l)),t.setSource(l)}if(e.target){var d=e.target;Object(h.x)(d)&&(d=i.findById(d)),t.setTarget(d)}t.update(e)}if("node"===o||"combo"===o){t.update(e,u);var p=t.getEdges(),g=Vt(e);if(g&&"node"===o)Object(h.f)(p,(function(t){t.refresh()}));else if(g&&"combo"===o){var y=t.get("shapeFactory"),m=s.type||"circle";(void 0===s.animate||void 0===e.animate?null===(r=null===(n=y[m])||void 0===n?void 0:n.options)||void 0===r?void 0:r.animate:s.animate||e.animate)?setTimeout((function(){if(t&&!t.destroyed){var e=t.getKeyShape();e&&!e.destroyed&&Object(h.f)(p,(function(t){t&&!t.destroyed&&t.refresh()}))}}),201):Object(h.f)(p,(function(t){t.refresh()}))}}i.emit("afterupdateitem",{item:t,cfg:e})}},t.prototype.updateCombo=function(t,e){var n,r,i=this.graph;if(Object(h.x)(t)&&(t=i.findById(t)),t&&!t.destroyed){var o=zt(e,i);t.set("bbox",o),t.update({x:o.x,y:o.y});var a=t.getEdges()||[],s=a.length,u=t.getModel(),c=t.get("shapeFactory"),f=u.type||"circle";if(void 0===u.animate?null===(r=null===(n=c[f])||void 0===n?void 0:n.options)||void 0===r?void 0:r.animate:u.animate)setTimeout((function(){if(t&&!t.destroyed){var e=t.getKeyShape();if(e&&!e.destroyed)for(var n=0;n-1&&o.splice(a,1),"edge"===i){var s=n.get("v"+i+"s"),u=s.indexOf(t);u>-1&&s.splice(u,1)}var c=t.get("id");delete n.get("itemMap")[c];var f=n.get("comboTrees"),l=t.get("id");if("node"===i){var d=t.getModel().comboId;if(f){var p=f,g=!1;f.forEach((function(t){g||Rt(t,(function(t){if(t.id===l&&p){var e=p.indexOf(t);return p.splice(e,1),g=!0,!1}return p=t.children,!0}))}))}for(var v=(x=t.getEdges()).length-1;v>=0;v--)n.removeItem(x[v],!1);d&&n.updateCombo(d)}else if("combo"===i){var y,m=t.getModel().parentId,b=!1;(f||[]).forEach((function(t){b||Rt(t,(function(t){return t.id!==l||(y=t,b=!0,!1)}))})),y.removed=!0,y&&y.children&&y.children.forEach((function(t){e.removeItem(t.id)}));var x;for(v=(x=t.getEdges()).length;v>=0;v--)n.removeItem(x[v],!1);m&&n.updateCombo(m)}t.destroy(),n.emit("afterremoveitem",{item:r})}},t.prototype.setItemState=function(t,e,n){var r=this.graph,i=e;Object(h.x)(n)&&(i=e+":"+n),t.hasState(i)===n&&n||Object(h.x)(n)&&t.hasState(i)||(r.emit("beforeitemstatechange",{item:t,state:i,enabled:n}),t.setState(e,n),r.autoPaint(),r.emit("afteritemstatechange",{item:t,state:i,enabled:n}))},t.prototype.priorityState=function(t,e){var n=this.graph,r=t;Object(h.x)(t)&&(r=n.findById(t)),this.setItemState(r,e,!1),this.setItemState(r,e,!0)},t.prototype.clearItemStates=function(t,e){var n=this.graph;Object(h.x)(t)&&(t=n.findById(t)),n.emit("beforeitemstatesclear",{item:t,states:e}),t.clearStates(e),n.emit("afteritemstatesclear",{item:t,states:e})},t.prototype.refreshItem=function(t){var e=this.graph;Object(h.x)(t)&&(t=e.findById(t)),e.emit("beforeitemrefresh",{item:t}),t.refresh(),e.emit("afteritemrefresh",{item:t})},t.prototype.addCombos=function(t,e){var n=this,r=this.graph;(t||[]).forEach((function(t){Lt(t,(function(t){var r;return e.forEach((function(e){e.id===t.id&&(e.children=t.children,e.depth=t.depth,r=e)})),r&&n.addItem("combo",r),!0}))}));var i=r.get("comboGroup");i&&i.sort()},t.prototype.changeItemVisibility=function(t,e){var n=this,r=this.graph;if(Object(h.x)(t)&&(t=r.findById(t)),t){if(r.emit("beforeitemvisibilitychange",{item:t,visible:e}),t.changeVisibility(e),t.getType&&"node"===t.getType()){var i=t.getEdges();Object(h.f)(i,(function(t){(!e||t.get("source").isVisible()&&t.get("target").isVisible())&&n.changeItemVisibility(t,e)}))}else if(t.getType&&"combo"===t.getType()){var o=r.get("comboTrees"),a=t.get("id"),s=[],u=!1;(o||[]).forEach((function(t){u||t.children&&0!==t.children.length&&Rt(t,(function(t){return t.id!==a||(s=t.children,u=!0,!1)}))})),s&&s.forEach((function(t){var i=r.findById(t.id);n.changeItemVisibility(i,e)}));i=t.getEdges();Object(h.f)(i,(function(t){(!e||t.get("source").isVisible()&&t.get("target").isVisible())&&n.changeItemVisibility(t,e)}))}return r.emit("afteritemvisibilitychange",{item:t,visible:e}),t}console.warn("The item to be shown or hidden does not exist!")},t.prototype.destroy=function(){this.graph=null,this.destroyed=!0},t}(),ue=null,ce=function(){function t(t){this.graph=t,this.cachedStates={enabled:{},disabled:{}},this.destroyed=!1}return t.checkCache=function(t,e,n){if(n[e]){var r=n[e].indexOf(t);r>=0&&n[e].splice(r,1)}},t.cacheState=function(t,e,n){n[e]||(n[e]=[]),n[e].push(t)},t.prototype.updateState=function(e,n,r){var i=this,o=t.checkCache,a=t.cacheState;if(!e.destroyed){var s=this.cachedStates,u=s.enabled,c=s.disabled;r?(o(e,n,c),a(e,n,u)):(o(e,n,u),a(e,n,c)),ue&&clearTimeout(ue),ue=setTimeout((function(){ue=null,i.updateGraphStates()}),16)}},t.prototype.updateStates=function(t,e,n){var r=this;Object(h.x)(e)?this.updateState(t,e,n):e.forEach((function(e){r.updateState(t,e,n)}))},t.prototype.updateGraphStates=function(){var t=this.graph.get("states"),e=this.cachedStates;Object(h.f)(e.disabled,(function(e,n){t[n]&&(t[n]=t[n].filter((function(t){return e.indexOf(t)<0&&!e.destroyed})))})),Object(h.f)(e.enabled,(function(e,n){if(t[n]){var r={};t[n].forEach((function(t){t.destroyed||(r[t.get("id")]=!0)})),e.forEach((function(e){if(!e.destroyed){var i=e.get("id");r[i]||(r[i]=!0,t[n].push(e))}}))}else t[n]=e})),this.graph.emit("graphstatechange",{states:t}),this.cachedStates={enabled:{},disabled:{}}},t.prototype.destroy=function(){this.graph=null,this.cachedStates=null,ue&&clearTimeout(ue),ue=null,this.destroyed=!0},t}(),fe=n(38),le=function(t,e){return t&&e?t.replace(/\\\\?\\{([^{}]+)\\}/g,(function(t,n){if("\\\\"===t.charAt(0))return t.slice(1);var r=e[n];return 0===r&&(r="0"),r||""})):t},he=function(t){var e=[];if(t.length<2)throw new Error("point length must largn than 2, now it\'s "+t.length);for(var n=0,r=t;n0?s-1:o-1,c=m.c.normalize([0,0],m.c.add([0,0],a[u].v,m.c.scale([0,0],a[s].v,-1)));a[s].p=m.c.add([0,0],a[s].p,m.c.scale([0,0],c,e))}return a.map((function(t){var e=t.p;return{x:e[0],y:e[1]}}))}var Se=function(t,e,n){return(t.y-n.y)*(e.x-n.x)-(t.x-n.x)*(e.y-n.y)},Ee=function(t){var e=t.map((function(t){return{x:t.getModel().x,y:t.getModel().y}}));if(e.sort((function(t,e){return t.x===e.x?t.y-e.y:t.x-e.x})),1===e.length)return e;for(var n=[],r=0;r=2&&Se(n[n.length-2],n[n.length-1],e[r])<=0;)n.pop();n.push(e[r])}var i=[];for(r=e.length-1;r>=0;r--){for(;i.length>=2&&Se(i[i.length-2],i[i.length-1],e[r])<=0;)i.pop();i.push(e[r])}return i.pop(),n.pop(),n.concat(i)},_e={maxRoutingIterations:100,maxMarchingIterations:100,pixelGroupSize:2,edgeR0:10,edgeR1:10,nodeR0:5,nodeR1:10,morphBuffer:5,threshold:.001,skip:16,nodeInfluenceFactor:1,edgeInfluenceFactor:1,negativeNodeInfluenceFactor:-.5};function Oe(t,e,n){var r=!1,i=function(t,n){return e.cells[t+n*e.width]},o=function(t,e){var r=0;return i(t-1,e-1)>=n&&(r+=1),i(t,e-1)>n&&(r+=2),i(t-1,e)>n&&(r+=4),i(t,e)>n&&(r+=8),r},a=function(n,r){for(var i,a,s=n,u=r,c=0;c-1){if(t[0].x===s&&t[0].y===u)return!0}else t.push({x:s,y:u});var f=o(s,u);switch(f){case-1:return console.warn("Marched out of bounds"),!0;case 0:case 3:case 2:case 7:s++;break;case 12:case 14:case 4:s--;break;case 6:0===i&&(-1===a?s-=1:s+=1);break;case 1:case 13:case 5:u--;break;case 9:1===i&&(0===a?u-=1:u+=1);break;case 10:case 8:case 11:u++;break;default:return console.warn("Marching squares invalid state: "+f),!0}}};this.march=function(){for(var t=0;tn&&15!==o(t,s)&&(r=a(t,s));return r}}var ke=function(t,e){var n=Number.POSITIVE_INFINITY,r=null;return t.forEach((function(t){var i=Q(t,e);i>=0&&i0?t+1:t}),0);s*Math.pow(c+1,2)0;){var r=t.pop();if(0===t.length){n.push(r);break}var i=t.pop(),o=new H(r.x1,r.y1,i.x2,i.y2);ke(e,o)?(n.push(r),t.push(i)):t.push(o)}return n}(function(t,e,n,r){var i=[],o=[];o.push(t);for(var a=!0,s=0,u=function(t,e){var n=!1;return e.forEach((function(e){n||(et(t,{x:e.x1,y:e.y1})||et(t,{x:e.x2,y:e.y2}))&&(n=!0)})),n},c=function(t,e){for(var n=0,r=e;n=1;)h=Ce(n,f/=1.5,l,s),d=u(h,o)||u(h,i),p=c(h,e);!h||d||s&&p||(o.push(new H(t.x1,t.y1,h.x,h.y)),o.push(new H(h.x,h.y,t.x2,t.y2)),a=!0)};h(!0),a||h(!1)}}a||i.push(t),s+=1};!a&&o.length;)f()}for(;o.length;)i.push(o.pop());return i}(new H(t.getModel().x,t.getModel().y,o.getModel().x,o.getModel().y),e,r,i))}var Ae=function(t,e,n){var r=Object.assign(_e,n),i=J(t.map((function(t){return{x:t.getModel().x,y:t.getModel().y}})));t=t.sort((function(t,e){return $({x:t.getModel().x,y:t.getModel().y},i)-$({x:e.getModel().x,y:e.getModel().y},i)}));var o=[],a=[];t.forEach((function(t){Me(t,e,o,r.maxRoutingIterations,r.morphBuffer).forEach((function(t){a.push(t)})),o.push(t)}));for(var s,u,c,f,l,h=function(t,e,n){var r={minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,width:0,height:0,x:0,y:0},i=[];t.forEach((function(t){i.push(t.getBBox())})),e.forEach((function(t){i.push(t.getBBox())}));for(var o=0,a=i;or.maxX?s.maxX:r.maxX)+n,r.maxY=(s.maxY>r.maxY?s.maxY:r.maxY)+n}return r.width=r.maxX-r.minX,r.height=r.maxY-r.minY,r.x=r.minX,r.y=r.minY,r}(t,a,r.nodeR0),d=(s=h.width,u=h.height,c=r.pixelGroupSize,f=Math.ceil(s/c),l=Math.ceil(u/c),{cells:new Float32Array(Math.max(0,f*l)).fill(0),width:f,height:l}),p=[],g=[],v=0;v1)for(m=Math.floor(y.length/r.skip);m<3&&r.skip>1;)r.skip-=1,m=Math.floor(y.length/r.skip);for(var b=0,x=0;x0))break;r.nonMemberInfluenceFactor*=.8}}return g};function Te(t,e,n,r,i,o){function a(t,e){var n=Math.floor((t-e)/o.pixelGroupSize);return n<0?0:n}function s(t,e){return t*o.pixelGroupSize+e}var u=(o.nodeR0-o.nodeR1)*(o.nodeR0-o.nodeR1),c=(o.edgeR0-o.edgeR1)*(o.edgeR0-o.edgeR1),f=function(t,e){return[Math.min(a(t.minX,e+r.minX),i.width),Math.min(a(t.minY,e+r.minY),i.height),Math.min(a(t.maxX,-e+r.minX),i.width),Math.min(a(t.maxY,-e+r.minY),i.height)]},l=function(t,e){for(var n=t.getBBox(),a=f(n,o.nodeR1),u=a[0],c=a[1],l=a[2],h=a[3],d=c;du.y?r?c.topLeft:c.bottomRight:r?c.topRight:c.bottomLeft:a.ys.x?r?c.topLeft:c.bottomRight:r?c.bottomLeft:c.topRight:o.x0?this.cfg.padding+t:10+t,this.cfg.bubbleCfg={nodeR0:this.padding-t,nodeR1:this.padding-t,morphBuffer:this.padding-t}},t.prototype.setType=function(){this.type=this.cfg.type,this.members.length<3&&(this.type="round-convex"),"round-convex"!==this.type&&"smooth-convex"!==this.type&&"bubble"!==this.type&&(console.warn("The hull type should be either round-convex, smooth-convex or bubble, round-convex is used by default."),this.type="round-convex")},t.prototype.calcPath=function(t,e){var n,r,i;switch(this.type){case"round-convex":i=xe((n=Ee(t)).map((function(t){return[t.x,t.y]})),this.padding),r=Object(fe.b)(i);break;case"smooth-convex":2===(n=Ee(t)).length?(i=xe(n.map((function(t){return[t.x,t.y]})),this.padding),r=Object(fe.b)(i)):n.length>2&&(i=we(n.map((function(t){return[t.x,t.y]})),this.padding),r=ve(i));break;case"bubble":r=(n=Ae(t,e,this.cfg.bubbleCfg)).length>=2&&ve(n)}return r},t.prototype.render=function(){this.group.addShape("path",{attrs:Object(v.a)({path:this.path},this.cfg.style),id:this.id,name:this.cfg.id}),this.group.toBack()},t.prototype.addMember=function(t){if(t){Object(h.x)(t)&&(t=this.graph.findById(t)),this.members.push(t);var e=this.nonMembers.indexOf(t);return e>-1&&this.nonMembers.splice(e,1),this.updateData(this.members,this.nonMembers),!0}},t.prototype.addNonMember=function(t){if(t){Object(h.x)(t)&&(t=this.graph.findById(t)),this.nonMembers.push(t);var e=this.members.indexOf(t);return e>-1&&this.members.splice(e,1),this.updateData(this.members,this.nonMembers),!0}},t.prototype.removeMember=function(t){if(t){Object(h.x)(t)&&(t=this.graph.findById(t));var e=this.members.indexOf(t);return e>-1&&(this.members.splice(e,1),this.updateData(this.members,this.nonMembers),!0)}},t.prototype.removeNonMember=function(t){if(t){Object(h.x)(t)&&(t=this.graph.findById(t));var e=this.nonMembers.indexOf(t);return e>-1&&(this.nonMembers.splice(e,1),this.updateData(this.members,this.nonMembers),!0)}},t.prototype.updateData=function(t,e){var n=this;this.group.findById(this.id).remove(),t&&(this.members=t.map((function(t){return Object(h.x)(t)?n.graph.findById(t):t}))),e&&(this.nonMembers=e.map((function(t){return Object(h.x)(t)?n.graph.findById(t):t}))),this.path=this.calcPath(this.members,this.nonMembers),this.render()},t.prototype.updateStyle=function(t){this.group.findById(this.id).attr(Object(v.a)({},t))},t.prototype.updateCfg=function(t){var e=this;this.cfg=Object(h.e)(this.cfg,t),this.id=this.cfg.id,this.group=this.cfg.group,t.members&&(this.members=this.cfg.members.map((function(t){return Object(h.x)(t)?e.graph.findById(t):t}))),t.nonMembers&&(this.nonMembers=this.cfg.nonMembers.map((function(t){return Object(h.x)(t)?e.graph.findById(t):t}))),this.setPadding(),this.setType(),this.path=this.calcPath(this.members,this.nonMembers),this.render()},t.prototype.contain=function(t){var e,n,r=this,i=(e=Object(h.x)(t)?this.graph.findById(t):t).getKeyShape();if("path"===e.get("type"))n=ge(i.attr("path"));else{var o=i.getCanvasBBox();n=[[o.minX,o.minY],[o.maxX,o.minY],[o.maxX,o.maxY],[o.minX,o.maxY]]}return n=n.map((function(t){var e=r.graph.getPointByCanvas(t[0],t[1]);return[e.x,e.y]})),Y(n,ge(this.path))},t.prototype.destroy=function(){this.group.remove(),this.cfg=null},t}(),Pe=m.a.transform,je=function(t){function e(e){var n=t.call(this)||this;return n.cfg=Object(h.e)(n.getDefaultCfg(),e),n.init(),n.animating=!1,n.destroyed=!1,n.cfg.enabledStack&&(n.undoStack=new b.Stack(n.cfg.maxStep),n.redoStack=new b.Stack(n.cfg.maxStep)),n}return Object(v.b)(e,t),e.prototype.init=function(){this.initCanvas();var t=new Ot(this),e=new dt(this),n=new se(this),r=new ce(this);this.set({viewController:t,modeController:e,itemController:n,stateController:r}),this.initLayoutController(),this.initEventController(),this.initGroups(),this.initPlugins()},e.prototype.initGroups=function(){var t=this.get("canvas"),e=this.get("canvas").get("el").id,n=t.addGroup({id:e+"-root",className:ht.rootContainerClassName});if(this.get("groupByTypes")){var r=n.addGroup({id:e+"-edge",className:ht.edgeContainerClassName}),i=n.addGroup({id:e+"-node",className:ht.nodeContainerClassName}),o=n.addGroup({id:e+"-combo",className:ht.comboContainerClassName});o.toBack(),this.set({nodeGroup:i,edgeGroup:r,comboGroup:o})}var a=n.addGroup({id:e+"-delegate",className:ht.delegateContainerClassName});this.set({delegateGroup:a}),this.set("group",n)},e.prototype.getDefaultCfg=function(){return{container:void 0,width:void 0,height:void 0,renderer:"canvas",modes:{},plugins:[],data:{},fitViewPadding:10,minZoom:.2,maxZoom:10,event:!0,groupByTypes:!0,directed:!1,autoPaint:!0,nodes:[],edges:[],combos:[],vedges:[],itemMap:{},linkCenter:!1,defaultNode:{},defaultEdge:{},nodeStateStyles:{},edgeStateStyles:{},states:{},animate:!1,animateCfg:{onFrame:void 0,duration:500,easing:"easeLinear"},callback:void 0,enabledStack:!1,maxStep:10,tooltips:[]}},e.prototype.set=function(t,e){return Object(h.w)(t)?this.cfg=Object(v.a)(Object(v.a)({},this.cfg),t):this.cfg[t]=e,this},e.prototype.get=function(t){return this.cfg[t]},e.prototype.getGroup=function(){return this.get("group")},e.prototype.getContainer=function(){return this.get("container")},e.prototype.getMinZoom=function(){return this.get("minZoom")},e.prototype.setMinZoom=function(t){return this.set("minZoom",t)},e.prototype.getMaxZoom=function(){return this.get("maxZoom")},e.prototype.setMaxZoom=function(t){return this.set("maxZoom",t)},e.prototype.getWidth=function(){return this.get("width")},e.prototype.getHeight=function(){return this.get("height")},e.prototype.clearItemStates=function(t,e){Object(h.x)(t)&&(t=this.findById(t));var n=this.get("itemController");e||(e=t.get("states")),n.clearItemStates(t,e),this.get("stateController").updateStates(t,e,!1)},e.prototype.node=function(t){"function"==typeof t&&this.set("nodeMapper",t)},e.prototype.edge=function(t){"function"==typeof t&&this.set("edgeMapper",t)},e.prototype.combo=function(t){"function"==typeof t&&this.set("comboMapper",t)},e.prototype.findById=function(t){return this.get("itemMap")[t]},e.prototype.find=function(t,e){var n,r=this.get(t+"s");return Object(h.f)(r,(function(t,r){if(e(t,r))return n=t})),n},e.prototype.findAll=function(t,e){var n=[];return Object(h.f)(this.get(t+"s"),(function(t,r){e(t,r)&&n.push(t)})),n},e.prototype.findAllByState=function(t,e){return this.findAll(t,(function(t){return t.hasState(e)}))},e.prototype.translate=function(t,e){var n=this.get("group"),r=Object(h.c)(n.getMatrix());r||(r=[1,0,0,0,1,0,0,0,1]),r=Pe(r,[["t",t,e]]),n.setMatrix(r),this.emit("viewportchange",{action:"translate",matrix:n.getMatrix()}),this.autoPaint()},e.prototype.moveTo=function(t,e){var n=this.get("group");N(n,{x:t,y:e}),this.emit("viewportchange",{action:"move",matrix:n.getMatrix()})},e.prototype.fitView=function(t){t&&this.set("fitViewPadding",t),this.get("viewController").fitView(),this.autoPaint()},e.prototype.fitCenter=function(){this.get("viewController").fitCenter(),this.autoPaint()},e.prototype.addBehaviors=function(t,e){return this.get("modeController").manipulateBehaviors(t,e,!0),this},e.prototype.removeBehaviors=function(t,e){return this.get("modeController").manipulateBehaviors(t,e,!1),this},e.prototype.updateBehavior=function(t,e,n){return this.get("modeController").updateBehavior(t,e,n),this},e.prototype.zoom=function(t,e){var n=this.get("group"),r=Object(h.c)(n.getMatrix()),i=this.get("minZoom"),o=this.get("maxZoom");r||(r=[1,0,0,0,1,0,0,0,1]),r=Pe(r,e?[["t",-e.x,-e.y],["s",t,t],["t",e.x,e.y]]:[["s",t,t]]),i&&r[0]o||(n.setMatrix(r),this.emit("viewportchange",{action:"zoom",matrix:r}),this.autoPaint())},e.prototype.zoomTo=function(t,e){var n=t/this.getZoom();this.zoom(n,e)},e.prototype.focusItem=function(t,e,n){var r=this.get("viewController"),i=!1;e?i=!0:void 0===e&&(i=this.get("animate"));var o={};n?o=n:void 0===n&&(o=this.get("animateCfg")),r.focus(t,i,o),this.autoPaint()},e.prototype.autoPaint=function(){this.get("autoPaint")&&this.paint()},e.prototype.paint=function(){this.emit("beforepaint"),this.get("canvas").draw(),this.emit("afterpaint")},e.prototype.getPointByClient=function(t,e){return this.get("viewController").getPointByClient(t,e)},e.prototype.getClientByPoint=function(t,e){return this.get("viewController").getClientByPoint(t,e)},e.prototype.getPointByCanvas=function(t,e){return this.get("viewController").getPointByCanvas(t,e)},e.prototype.getCanvasByPoint=function(t,e){return this.get("viewController").getCanvasByPoint(t,e)},e.prototype.showItem=function(t,e){void 0===e&&(e=!0);var n=this.get("itemController").changeItemVisibility(t,!0);if(e&&this.get("enabledStack")){var r=n.getID(),i={},o={};switch(n.getType()){case"node":i.nodes=[{id:r,visible:!1}],o.nodes=[{id:r,visible:!0}];break;case"edge":i.nodes=[{id:r,visible:!1}],o.edges=[{id:r,visible:!0}];break;case"combo":i.nodes=[{id:r,visible:!1}],o.combos=[{id:r,visible:!0}]}this.pushStack("visible",{before:i,after:o})}},e.prototype.hideItem=function(t,e){void 0===e&&(e=!0);var n=this.get("itemController").changeItemVisibility(t,!1);if(e&&this.get("enabledStack")){var r=n.getID(),i={},o={};switch(n.getType()){case"node":i.nodes=[{id:r,visible:!0}],o.nodes=[{id:r,visible:!1}];break;case"edge":i.nodes=[{id:r,visible:!0}],o.edges=[{id:r,visible:!1}];break;case"combo":i.nodes=[{id:r,visible:!0}],o.combos=[{id:r,visible:!1}]}this.pushStack("visible",{before:i,after:o})}},e.prototype.refreshItem=function(t){this.get("itemController").refreshItem(t)},e.prototype.setAutoPaint=function(t){this.set("autoPaint",t),this.get("canvas").set("autoDraw",t)},e.prototype.remove=function(t,e){void 0===e&&(e=!0),this.removeItem(t,e)},e.prototype.removeItem=function(t,e){void 0===e&&(e=!0);var n=t;if(Object(h.x)(t)&&(n=this.findById(t)),!n&&Object(h.x)(t))console.warn("The item to be removed does not exist!");else if(n){var r="";if(n.getType&&(r=n.getType()),e&&this.get("enabledStack")){var i=Object(v.a)(Object(v.a)({},n.getModel()),{itemType:r}),o={};switch(r){case"node":o.nodes=[i],o.edges=[];for(var a=n.getEdges(),s=a.length-1;s>=0;s--)o.edges.push(Object(v.a)(Object(v.a)({},a[s].getModel()),{itemType:"edge"}));break;case"edge":o.edges=[i];break;case"combo":o.combos=[i]}this.pushStack("delete",{before:o,after:{}})}if("node"===r)n.getModel().comboId&&this.updateComboTree(n);if(this.get("itemController").removeItem(n),"combo"===r){var u=Ut(this.get("comboTrees"));this.set("comboTrees",u)}}},e.prototype.addItem=function(t,e,n,r){void 0===n&&(n=!0),void 0===r&&(r=!0);var i=this.get("comboSorted");this.set("comboSorted",i&&!r);var o=this.get("itemController");if(!e.id||!this.findById(e.id)){var a,s=this.get("comboTrees");if(s||(s=[]),"combo"===t){var u=this.get("itemMap"),c=!1;if(s.forEach((function(n){c||Lt(n,(function(n){if(e.parentId===n.id){c=!0;var r=Object(v.a)({id:e.id,depth:n.depth+2},e);n.children?n.children.push(r):n.children=[r],e.depth=r.depth,a=o.addItem(t,e)}var i=u[n.id];return c&&i&&i.getType&&"combo"===i.getType()&&o.updateCombo(i,n.children),!0}))})),!c){var f=Object(v.a)({id:e.id,depth:0},e);e.depth=f.depth,s.push(f),a=o.addItem(t,e)}this.set("comboTrees",s)}else if("node"===t&&Object(h.x)(e.comboId)&&s){var l;if((l=this.findById(e.comboId))&&l.getType&&"combo"!==l.getType())return void console.warn("\'"+e.comboId+"\' is a not id of a combo in the graph, the node will be added without combo.");a=o.addItem(t,e);var d=this.get("itemMap"),p=!1,g=!1;(s||[]).forEach((function(t){g||p||Lt(t,(function(t){if(t.id===e.id)return g=!0,!1;if(e.comboId===t.id&&!g){p=!0;var n=Object(h.c)(e);n.itemType="node",t.children?t.children.push(n):t.children=[n],e.depth=t.depth+1}return p&&d[t.id].getType&&"combo"===d[t.id].getType()&&o.updateCombo(d[t.id],t.children),!0}))}))}else a=o.addItem(t,e);if("node"===t&&e.comboId||"combo"===t&&e.parentId)(l=this.findById(e.comboId||e.parentId))&&l.addChild(a);var y=this.get("combos");if(y&&y.length>0&&this.sortCombos(),this.autoPaint(),n&&this.get("enabledStack")){var m=Object(v.a)(Object(v.a)({},a.getModel()),{itemType:t}),b={};switch(t){case"node":b.nodes=[m];break;case"edge":b.edges=[m];break;case"combo":b.combos=[m]}this.pushStack("add",{before:{},after:b})}return a}console.warn("This item exists already. Be sure the id %c"+e.id+"%c is unique.","font-size: 20px; color: red;","")},e.prototype.add=function(t,e,n,r){return void 0===n&&(n=!0),void 0===r&&(r=!0),this.addItem(t,e,n,r)},e.prototype.updateItem=function(t,e,n){var r=this;void 0===n&&(n=!0);var i,o=this.get("itemController");i=Object(h.x)(t)?this.findById(t):t;var a=Object(h.c)(i.getModel()),s="";i.getType&&(s=i.getType());var u=Object(v.d)(i.getStates());if("combo"===s&&Object(h.f)(u,(function(t){return r.setItemState(i,t,!1)})),o.updateItem(i,e),"combo"===s&&Object(h.f)(u,(function(t){return r.setItemState(i,t,!0)})),n&&this.get("enabledStack")){var c={nodes:[],edges:[],combos:[]},f={nodes:[],edges:[],combos:[]},l=Object(v.a)({id:a.id},e);switch(s){case"node":c.nodes.push(a),f.nodes.push(l);break;case"edge":c.edges.push(a),f.edges.push(l);break;case"combo":c.combos.push(a),f.combos.push(l)}"node"===s&&c.nodes.push(a),this.pushStack("update",{before:c,after:f})}},e.prototype.update=function(t,e,n){void 0===n&&(n=!0),this.updateItem(t,e,n)},e.prototype.setItemState=function(t,e,n){Object(h.x)(t)&&(t=this.findById(t)),this.get("itemController").setItemState(t,e,n);var r=this.get("stateController");Object(h.x)(n)?r.updateState(t,e+":"+n,!0):r.updateState(t,e,n)},e.prototype.priorityState=function(t,e){this.get("itemController").priorityState(t,e)},e.prototype.data=function(t){this.set("data",t)},e.prototype.render=function(){var t=this;this.set("comboSorted",!1);var e=this.get("data");if(this.get("enabledStack")&&this.clearStack(),!e)throw new Error("data must be defined first");var n=e.nodes,r=void 0===n?[]:n,i=e.edges,o=void 0===i?[]:i,a=e.combos,s=void 0===a?[]:a;if(this.clear(),this.emit("beforerender"),Object(h.f)(r,(function(e){t.add("node",e,!1,!1)})),s&&0!==s.length){var u=Ft(s,r);this.set("comboTrees",u),t.addCombos(s)}Object(h.f)(o,(function(e){t.add("edge",e,!1,!1)}));var c=t.get("animate");(t.get("fitView")||t.get("fitCenter"))&&t.set("animate",!1);var f=t.get("layoutController");if(f){if(f.layout((function(){t.get("fitView")?t.fitView():t.get("fitCenter")&&t.fitCenter();t.autoPaint(),t.emit("afterrender"),(t.get("fitView")||t.get("fitCenter"))&&t.set("animate",c)})),this.destroyed)return}else t.get("fitView")&&t.fitView(),t.get("fitCenter")&&t.fitCenter(),t.emit("afterrender"),t.set("animate",c);this.get("groupByTypes")||(s&&0!==s.length?this.sortCombos():e.nodes&&e.edges&&e.nodes.length=0;f--)c[f].destroyed&&c.splice(f,1);s&&(n.addCombos(s),this.get("groupByTypes")||this.sortCombos()),this.diffItems("edge",a,t.edges),Object(h.f)(o,(function(t,e){(!t.getType||"node"!==t.getType()&&"combo"!==t.getType())&&a.edges.indexOf(t)<0&&(delete o[e],n.remove(t,!1))})),this.set({nodes:a.nodes,edges:a.edges});var l=this.get("layoutController");return l&&(l.changeData(),n.get("animate")&&!l.getLayoutType()?n.positionsAnimate():n.autoPaint()),setTimeout((function(){r.set("localRefresh",i)}),16),this},e.prototype.addCombos=function(t){var e=this.get("comboTrees");this.get("itemController").addCombos(e,t)},e.prototype.createCombo=function(t,e){var n=this;this.set("comboSorted",!1);var r,i="";if(t){if(Object(h.x)(t))i=t,r={id:t};else{if(!(i=t.id))return void console.warn("Create combo failed. Please assign a unique string id for the adding combo.");r=t}var o=e.map((function(t){var e=n.findById(t),r="";e.getType&&(r=e.getType());var o={id:e.getID(),itemType:r};return"combo"===r?o.parentId=i:"node"===r&&(o.comboId=i),o}));r.children=o,this.addItem("combo",r,!1),this.set("comboSorted",!1);var a=this.get("comboTrees");(a||[]).forEach((function(t){Lt(t,(function(t){return t.id!==i||(t.itemType="combo",t.children=o,!1)}))})),a&&this.sortCombos()}},e.prototype.uncombo=function(t){var e=this,n=t;if(Object(h.x)(t)&&(n=this.findById(t)),!n||n.getType&&"combo"!==n.getType())console.warn("The item is not a combo!");else{var r=n.getModel().parentId,i=this.get("comboTrees");i||(i=[]);var o,a=this.get("itemMap"),s=n.get("id"),u=[],c=this.get("combos"),f=this.findById(r);if(i.forEach((function(i){o||Lt(i,(function(i){if(i.id===s){o=i,n.getEdges().forEach((function(t){e.removeItem(t,!1)}));var l=c.indexOf(t);c.splice(l,1),delete a[s],n.destroy()}return!r||!o||i.id!==r||(f.removeCombo(n),-1!==(l=(u=i.children).indexOf(o))&&u.splice(l,1),o.children.forEach((function(t){var n=e.findById(t.id),i=n.getModel();n.getType&&"combo"===n.getType()?(t.parentId=r,delete t.comboId,i.parentId=r,delete i.comboId):n.getType&&"node"===n.getType()&&(t.comboId=r,i.comboId=r),f.addChild(n),u.push(t)})),!1)}))})),!r&&o){var l=i.indexOf(o);i.splice(l,1),o.children.forEach((function(t){t.parentId=void 0,e.findById(t.id).getModel().parentId=void 0,"node"!==t.itemType&&i.push(t)}))}}},e.prototype.updateCombos=function(){var t=this,e=this.get("comboTrees"),n=this.get("itemController"),r=this.get("itemMap");(e||[]).forEach((function(e){Lt(e,(function(e){if(!e)return!0;var i=r[e.id];if(i&&i.getType&&"combo"===i.getType()){var o=Object(v.d)(i.getStates());Object(h.f)(o,(function(e){return t.setItemState(i,e,!1)})),n.updateCombo(i,e.children),Object(h.f)(o,(function(e){return t.setItemState(i,e,!0)}))}return!0}))})),this.sortCombos()},e.prototype.updateCombo=function(t){var e,n=this,r=t;if(Object(h.x)(t)&&(r=this.findById(t)),!r||r.getType&&"combo"!==r.getType())console.warn("The item to be updated is not a combo!");else{e=r.get("id");var i=this.get("comboTrees"),o=this.get("itemController"),a=this.get("itemMap");(i||[]).forEach((function(t){Lt(t,(function(t){if(!t)return!0;var r=a[t.id];if(e===t.id&&r&&r.getType&&"combo"===r.getType()){var i=Object(v.d)(r.getStates());Object(h.f)(i,(function(t){r.getStateStyle(t)&&n.setItemState(r,t,!1)})),o.updateCombo(r,t.children),Object(h.f)(i,(function(t){r.getStateStyle(t)&&n.setItemState(r,t,!0)})),e&&(e=t.parentId)}return!0}))}))}},e.prototype.updateComboTree=function(t,e,n){void 0===n&&(n=!0);var r;this.set("comboSorted",!1);var i,o=(r=Object(h.x)(t)?this.findById(t):t).getModel(),a=o.comboId||o.parentId,s="";if(r.getType&&(s=r.getType()),e&&"combo"===s){var u,c=this.get("comboTrees"),f=!0;if((c||[]).forEach((function(t){u||Rt(t,(function(t){if(!u)return t.id===r.getID()&&(u=t),!0}))})),Rt(u,(function(t){return t.id!==e||(f=!1,!1)})),!f)return void console.warn("Failed to update the combo tree! The parentId points to a descendant of the combo!")}if(n&&this.get("enabledStack")){var l={},d={};"combo"===s?(l.combos=[{id:o.id,parentId:o.parentId}],d.combos=[{id:o.id,parentId:e}]):"node"===s&&(l.nodes=[{id:o.id,parentId:o.comboId}],d.nodes=[{id:o.id,parentId:e}]),this.pushStack("updateComboTree",{before:l,after:d})}if(o.parentId||o.comboId){var p=this.findById(o.parentId||o.comboId);p&&p.removeChild(r)}("combo"===s?o.parentId=e:"node"===s&&(o.comboId=e),e)&&((i=this.findById(e))&&i.addChild(r));a&&((i=this.findById(a))&&i.removeChild(r));var g=Ut(this.get("comboTrees"),o.id,e);this.set("comboTrees",g),this.updateCombos()},e.prototype.save=function(){var t=[],e=[],n=[];return Object(h.f)(this.get("nodes"),(function(e){t.push(e.getModel())})),Object(h.f)(this.get("edges"),(function(t){e.push(t.getModel())})),Object(h.f)(this.get("combos"),(function(t){n.push(t.getModel())})),{nodes:t,edges:e,combos:n}},e.prototype.changeSize=function(t,e){return this.get("viewController").changeSize(t,e),this},e.prototype.refresh=function(){if(this.emit("beforegraphrefresh"),this.get("animate"))this.positionsAnimate();else{var t=this.get("nodes"),e=this.get("edges"),n=this.get("edges");Object(h.f)(t,(function(t){t.refresh()})),Object(h.f)(e,(function(t){t.refresh()})),Object(h.f)(n,(function(t){t.refresh()}))}this.emit("aftergraphrefresh"),this.autoPaint()},e.prototype.getNodes=function(){return this.get("nodes")},e.prototype.getEdges=function(){return this.get("edges")},e.prototype.getCombos=function(){return this.get("combos")},e.prototype.getComboChildren=function(t){if(Object(h.x)(t)&&(t=this.findById(t)),t&&(!t.getType||"combo"===t.getType()))return t.getChildren();console.warn("The combo does not exist!")},e.prototype.positionsAnimate=function(){var t=this;t.emit("beforeanimate");var e=t.get("animateCfg"),n=e.onFrame,r=t.getNodes(),i=r.map((function(t){var e=t.getModel();return{id:e.id,x:e.x,y:e.y}}));t.isAnimating()&&t.stopAnimate(),t.get("canvas").animate((function(e){Object(h.f)(i,(function(r){var i=t.findById(r.id);if(i&&!i.destroyed){var o=i.get("originAttrs"),a=i.get("model");if(!o){var s=i.getContainer().getMatrix();s||(s=[1,0,0,0,1,0,0,0,1]),o={x:s[6],y:s[7]},i.set("originAttrs",o)}if(n){var u=n(i,e,r,o);i.set("model",Object.assign(a,u))}else a.x=o.x+(r.x-o.x)*e,a.y=o.y+(r.y-o.y)*e}})),t.refreshPositions()}),{duration:e.duration,easing:e.easing,callback:function(){Object(h.f)(r,(function(t){t.set("originAttrs",null)})),e.callback&&e.callback(),t.emit("afteranimate"),t.animating=!1}})},e.prototype.refreshPositions=function(){this.emit("beforegraphrefreshposition");var t,e=this.get("nodes"),n=this.get("edges"),r=this.get("vedges"),i=this.get("combos"),o={};Object(h.f)(e,(function(e){t=e.getModel();var n=e.get("originAttrs");n&&t.x===n.x&&t.y===n.y||(e.updatePosition({x:t.x,y:t.y}),o[t.id]=!0,t.comboId&&(o[t.comboId]=!0))})),i&&0!==i.length&&this.updateCombos(),Object(h.f)(n,(function(t){var e=t.getSource().getModel(),n=t.getTarget().getModel();(o[e.id]||o[n.id]||t.getModel().isComboEdge)&&t.refresh()})),Object(h.f)(r,(function(t){t.refresh()})),this.emit("aftergraphrefreshposition"),this.autoPaint()},e.prototype.stopAnimate=function(){this.get("canvas").stopAnimate()},e.prototype.isAnimating=function(){return this.animating},e.prototype.getZoom=function(){var t=this.get("group").getMatrix();return t?t[0]:1},e.prototype.getCurrentMode=function(){return this.get("modeController").getMode()},e.prototype.setMode=function(t){return this.get("modeController").setMode(t),this},e.prototype.clear=function(){return this.get("canvas").clear(),this.initGroups(),this.set({itemMap:{},nodes:[],edges:[],groups:[],combos:[],comboTrees:[]}),this.emit("afterrender"),this},e.prototype.updateLayout=function(t){var e,n=this.get("layoutController");Object(h.x)(t)?t={type:e=t}:e=t.type;var r=this.get("layout"),i=r?r.type:void 0;if(e&&i!==e||void 0!==t.gpuEnabled&&t.gpuEnabled!==r.gpuEnabled)e||(e=i),this.set("layout",t),n.changeLayout(e);else{var o={};Object.assign(o,r,t),o.type=i||"random",this.set("layout",o),n.updateLayoutCfg(o)}},e.prototype.destroyLayout=function(){this.get("layoutController").destroyLayout()},e.prototype.layout=function(){var t=this.get("layoutController"),e=this.get("layout");e&&t&&(e.workerEnabled?t.layout():t.layoutMethod?t.relayout(!0):t.layout())},e.prototype.collapseCombo=function(t){var e=this;if(Object(h.x)(t)&&(t=this.findById(t)),t){this.emit("beforecollapseexpandcombo",{action:"expand",item:t});var n=t.getModel();this.get("itemController").collapseCombo(t),n.collapsed=!0;var r=this.getEdges().concat(this.get("vedges")),i=[],o=[],a=this.get("comboTrees"),s=!1,u={};(a||[]).forEach((function(t){u[t.id]=t})),(a||[]).forEach((function(t){s||Rt(t,(function(t){if(s&&u[t.id])return!1;if(n.parentId===t.id?(u={},t.children.forEach((function(t){u[t.id]=t}))):n.id===t.id&&(s=!0),s){var r=e.findById(t.id);r&&r.getType&&"combo"===r.getType()&&(i=i.concat(r.getNodes()),o=o.concat(r.getCombos()))}return!0}))}));var c={},f=[];r.forEach((function(t){if(!t.isVisible()||t.getModel().isVEdge){var r=t.getSource(),a=t.getTarget();if((i.includes(r)||o.includes(r))&&!i.includes(a)&&!o.includes(a)||r.getModel().id===n.id){if((h=t.getModel()).isVEdge)return void e.removeItem(t,!1);for(var s=a.getModel();!a.isVisible();){if(!(a=e.findById(s.parentId||s.comboId))||!s.parentId&&!s.comboId)return;s=a.getModel()}var u=s.id;if(c[n.id+"-"+u])return void(c[n.id+"-"+u]+=h.size||1);var l=e.addItem("vedge",{source:n.id,target:u,isVEdge:!0},!1);c[n.id+"-"+u]=h.size||1,f.push(l)}else if(!i.includes(r)&&!o.includes(r)&&(i.includes(a)||o.includes(a))||a.getModel().id===n.id){var h;if((h=t.getModel()).isVEdge)return void e.removeItem(t,!1);for(var d=r.getModel();!r.isVisible();){if(!(r=e.findById(d.parentId||d.comboId))||!d.parentId&&!d.comboId)return;d=r.getModel()}var p=d.id;if(c[p+"-"+n.id])return void(c[p+"-"+n.id]+=h.size||1);l=e.addItem("vedge",{target:n.id,source:p,isVEdge:!0},!1);c[p+"-"+n.id]=h.size||1,f.push(l)}}})),f.forEach((function(t){var n=t.getModel();e.updateItem(t,{size:c[n.source+"-"+n.target]},!1)})),this.emit("aftercollapseexpandcombo",{action:"collapse",item:t})}else console.warn("The combo to be collapsed does not exist!")},e.prototype.expandCombo=function(t){var e=this;if(Object(h.x)(t)&&(t=this.findById(t)),!t||t.getType&&"combo"!==t.getType())console.warn("The combo to be collapsed does not exist!");else{this.emit("beforecollapseexpandcombo",{action:"expand",item:t});var n=t.getModel();this.get("itemController").expandCombo(t),n.collapsed=!1;var r=this.getEdges().concat(this.get("vedges")),i=[],o=[],a=this.get("comboTrees"),s=!1,u={};(a||[]).forEach((function(t){u[t.id]=t})),(a||[]).forEach((function(t){s||Rt(t,(function(t){if(s&&u[t.id])return!1;if(n.parentId===t.id?(u={},t.children.forEach((function(t){u[t.id]=t}))):n.id===t.id&&(s=!0),s){var r=e.findById(t.id);r&&r.getType&&"combo"===r.getType()&&(i=i.concat(r.getNodes()),o=o.concat(r.getCombos()))}return!0}))}));var c={},f={};r.forEach((function(t){if(!t.isVisible()||t.getModel().isVEdge){var r=t.getSource(),a=t.getTarget(),s=r.get("id"),u=a.get("id");if((i.includes(r)||o.includes(r))&&!i.includes(a)&&!o.includes(a)||s===n.id){if(t.getModel().isVEdge)return void e.removeItem(t,!1);for(var l=a.getModel();!a.isVisible();){if(!(a=e.findById(l.comboId||l.parentId))||!l.parentId&&!l.comboId)return;l=a.getModel()}u=l.id;for(var h=r.getModel();!r.isVisible();){if(!(r=e.findById(h.comboId||h.parentId))||!h.parentId&&!h.comboId)return;if(h.comboId===n.id||h.parentId===n.id)break;h=r.getModel()}if(s=h.id,u){if(c[p=s+"-"+u])return c[p]+=t.getModel().size||1,void e.updateItem(f[p],{size:c[p]},!1);var d=e.addItem("vedge",{source:s,target:u,isVEdge:!0},!1);c[p]=t.getModel().size||1,f[p]=d}}else if(!i.includes(r)&&!o.includes(r)&&(i.includes(a)||o.includes(a))||u===n.id){if(t.getModel().isVEdge)return void e.removeItem(t,!1);for(h=r.getModel();!r.isVisible();){if(!(r=e.findById(h.comboId||h.parentId))||!h.parentId&&!h.comboId)return;h=r.getModel()}s=h.id;for(l=a.getModel();!a.isVisible();){if(!(a=e.findById(l.comboId||l.parentId))||!l.parentId&&!l.comboId)return;if(l.comboId===n.id||l.parentId===n.id)break;l=a.getModel()}if(u=l.id,s){var p;if(c[p=s+"-"+u])return c[p]+=t.getModel().size||1,void e.updateItem(f[p],{size:c[p]},!1);d=e.addItem("vedge",{target:u,source:s,isVEdge:!0},!1);c[p]=t.getModel().size||1,f[p]=d}}else(i.includes(r)||o.includes(r))&&(i.includes(a)||o.includes(a))&&r.isVisible()&&a.isVisible()&&t.show()}})),this.emit("aftercollapseexpandcombo",{action:"expand",item:t})}},e.prototype.collapseExpandCombo=function(t){if(Object(h.x)(t)&&(t=this.findById(t)),!t.getType||"combo"===t.getType()){for(var e=t.getModel(),n=this.findById(e.parentId);n;){var r=n.getModel();if(r.collapsed)return console.warn("Fail to expand the combo since it\'s ancestor combo is collapsed."),void(n=void 0);n=this.findById(r.parentId)}e.collapsed?this.expandCombo(t):this.collapseCombo(t),this.updateCombo(t)}},e.prototype.sortCombos=function(){var t=this;if(!this.get("comboSorted")){this.set("comboSorted",!0);var e=[],n={};(this.get("comboTrees")||[]).forEach((function(t){Rt(t,(function(t){return e[t.depth]?e[t.depth].push(t.id):e[t.depth]=[t.id],n[t.id]=t.depth,!0}))})),(this.getEdges().concat(this.get("vedges"))||[]).forEach((function(t){var r=t.getModel(),i=n[r.source]||0,o=n[r.target]||0,a=Math.max(i,o);e[a]?e[a].push(r.id):e[a]=[r.id]})),e.forEach((function(e){if(e&&e.length)for(var n=e.length-1;n>=0;n--){var r=t.findById(e[n]);r&&r.toFront()}}))}},e.prototype.getNeighbors=function(t,e){var n=t;return Object(h.x)(t)&&(n=this.findById(t)),n.getNeighbors(e)},e.prototype.getNodeDegree=function(t,e){void 0===e&&(e=void 0);var n=t;Object(h.x)(t)&&(n=this.findById(t));var r=this.get("degrees");r||(r=Object(b.getDegree)(this.get("data"))),this.set("degees",r);var i,o=r[n.getID()];switch(e){case"in":i=o.inDegree;break;case"out":i=o.outDegree;break;case"all":i=o;break;default:i=o.degree}return i},e.prototype.getUndoStack=function(){return this.undoStack},e.prototype.getRedoStack=function(){return this.redoStack},e.prototype.getStackData=function(){return this.get("enabledStack")?{undoStack:this.undoStack.toArray(),redoStack:this.redoStack.toArray()}:null},e.prototype.clearStack=function(){this.get("enabledStack")&&(this.undoStack.clear(),this.redoStack.clear())},e.prototype.pushStack=function(t,e,n){if(void 0===t&&(t="update"),void 0===n&&(n="undo"),this.get("enabledStack")){var r=e?Object(h.c)(e):{before:{},after:Object(h.c)(this.save())};"redo"===n?this.redoStack.push({action:t,data:r}):this.undoStack.push({action:t,data:r}),this.emit("stackchange",{undoStack:this.undoStack,redoStack:this.redoStack})}else console.warn("请先启用 undo & redo 功能,在实例化 Graph 时候配置 enabledStack: true !")},e.prototype.getAdjMatrix=function(t,e){void 0===t&&(t=!0),void 0===e&&(e=this.get("directed"));var n=this.get("adjMatrix");return n&&t||(n=Object(b.getAdjMatrix)(this.save(),e),this.set("adjMatrix",n)),n},e.prototype.getShortestPathMatrix=function(t,e){void 0===t&&(t=!0),void 0===e&&(e=this.get("directed"));var n=this.get("adjMatrix"),r=this.get("shortestPathMatrix");return n&&t||(n=Object(b.getAdjMatrix)(this.save(),e),this.set("adjMatrix",n)),r&&t||(r=Object(b.floydWarshall)(this.save(),e),this.set("shortestPathMatrix",r)),r},e.prototype.on=function(e,n,r){return t.prototype.on.call(this,e,n,r)},e.prototype.destroy=function(){this.clear(),this.clearStack(),this.get("itemController").destroy(),this.get("modeController").destroy(),this.get("viewController").destroy(),this.get("stateController").destroy(),this.get("canvas").destroy(),this.cfg=null,this.destroyed=!0,this.redoStack=null,this.undoStack=null},e.prototype.createHull=function(t){if(t.members&&!(t.members.length<1)){var e=this.get("hullGroup"),n=this.get("hullMap");if(n||(n={},this.set("hullMap",n)),e||((e=this.get("group").addGroup({id:"hullGroup"})).toBack(),this.set("hullGroup",e)),n[t.id])return console.warn("Existed hull id."),n[t.id];var r=e.addGroup({id:t.id+"-container"}),i=new Ie(this,Object(v.a)(Object(v.a)({},t),{group:r}));return n[i.id]=i,i}console.warn("Create hull failed! The members is empty.")},e.prototype.getHulls=function(){return this.get("hullMap")},e.prototype.getHullById=function(t){return this.get("hullMap")[t]},e.prototype.removeHull=function(t){var e;e=Object(h.x)(t)?this.getHullById(t):t,delete this.get("hullMap")[e.id],e.destroy()},e.prototype.removeHulls=function(){var t=this.getHulls();t&&Object.keys(t).length&&(t.forEach((function(t){t.destroy()})),this.set("hullMap",{}))},e}(y.a);function De(t){return(De="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var Ne=m.a.transform,Re=["startArrow","endArrow"],Le={lineWidth:1,stroke:void 0,fill:void 0,lineAppendWidth:1,opacity:void 0,strokeOpacity:void 0,fillOpacity:void 0,x:0,y:0,r:10,width:20,height:20,shadowColor:void 0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0},Be={edge:{lineWidth:1,stroke:"#000",lineDash:void 0,startArrow:!1,endArrow:!1,opacity:void 0,strokeOpacity:void 0,fillOpacity:void 0,shadowColor:void 0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0},node:Le,combo:Le},Ge={options:{},itemType:"",type:"",getCustomConfig:function(t){return{}},getOptions:function(t){return Object(h.e)({labelCfg:{style:{fontFamily:"undefined"!=typeof window&&window.getComputedStyle(document.body,null).getPropertyValue("font-family")||"Arial, sans-serif"}},descriptionCfg:{style:{fontFamily:"undefined"!=typeof window&&window.getComputedStyle(document.body,null).getPropertyValue("font-family")||"Arial, sans-serif"}}},this.options,this.getCustomConfig(t)||{},t)},draw:function(t,e){var n=this.drawShape(t,e);(n.set("className",this.itemType+"-shape"),t.label)&&this.drawLabel(t,e).set("className",this.itemType+"-label");return n},afterDraw:function(t,e,n){},drawShape:function(t,e){return null},drawLabel:function(t,e){var n=this.getOptions(t).labelCfg||{},r=this.getLabelStyle(t,n,e),i=r.rotate;delete r.rotate;var o=e.addShape("text",{attrs:r,draggable:!0,className:"text-shape",name:"text-shape"});if(i){var a=o.getBBox(),s=o.getMatrix();if(s||(s=[1,0,0,0,1,0,0,0,1]),r.rotateCenter)switch(r.rotateCenter){case"center":s=Ne(s,[["t",-a.width/2,-a.height/2],["r",i],["t",a.width/2,a.height/2]]);break;case"lefttop":s=Ne(s,[["t",-r.x,-r.y],["r",i],["t",r.x,r.y]]);break;case"leftcenter":s=Ne(s,[["t",-r.x,-r.y-a.height/2],["r",i],["t",r.x,r.y+a.height/2]]);break;default:s=Ne(s,[["t",-a.width/2,-a.height/2],["r",i],["t",a.width/2,a.height/2]])}else s=Ne(s,[["t",-r.x,-r.y-a.height/2],["r",i],["t",r.x,r.y+a.height/2]]);o.setMatrix(s)}if(r.background){var u=this.drawLabelBg(t,e,o),c=this.itemType+"-label-bg";u.set("classname",c),o.toFront()}return o},drawLabelBg:function(t,e,n){var r=this.options.labelCfg,i=Object(h.A)({},r,t.labelCfg),o=this.getLabelBgStyleByPosition(n,t,i,e);return e.addShape("rect",{name:"text-bg-shape",attrs:o})},getLabelStyleByPosition:function(t,e,n){return{text:t.label}},getLabelBgStyleByPosition:function(t,e,n,r){return{}},getLabelStyle:function(t,e,n){var r=this.getLabelStyleByPosition(t,e,n),i=this.itemType+"Label",o=ht[i]?ht[i].style:null;return Object(v.a)(Object(v.a)(Object(v.a)({},o),r),e.style)},getShapeStyle:function(t){return t.style},update:function(t,e){this.updateShapeStyle(t,e),this.updateLabel(t,e)},updateShapeStyle:function(t,e){var n=e.getContainer(),r=e.getKeyShape(),i=Object(h.A)({},r.attr(),t.style),o=function(t){var e,o=i[t];if(Object(h.w)(o)){var a=n.find((function(e){return e.get("name")===t}));a&&a.attr(o)}else r.attr(((e={})[t]=o,e))};for(var a in i)o(a)},updateLabel:function(t,e){var n=e.getContainer(),r=this.getOptions({}).labelCfg,i=this.itemType+"-label",o=n.find((function(t){return t.get("className")===i})),a=this.itemType+"-label-bg",s=n.find((function(t){return t.get("classname")===a}));if(t.label||""===t.label)if(o){var u={};e.getModel&&(u=e.getModel().labelCfg);var c=Object(h.e)({},r,u,t.labelCfg),f=this.getLabelStyleByPosition(t,c,n),l=t.labelCfg?t.labelCfg.style:void 0,d=c.style&&c.style.background,p=Object(v.a)(Object(v.a)(Object(v.a)({},o.attr()),f),l),g=p.rotate;if(delete p.rotate,g){var y=[1,0,0,0,1,0,0,0,1];y=Ne(y,[["t",-p.x,-p.y],["r",g],["t",p.x,p.y]]),o.resetMatrix(),o.attr(Object(v.a)(Object(v.a)({},p),{matrix:y}))}else o.resetMatrix(),o.attr(p);if(s)if(p.background){var m=this.getLabelBgStyleByPosition(o,t,c,n),b=Object(v.a)(Object(v.a)({},m),d);if(s.resetMatrix(),g){var x=[1,0,0,0,1,0,0,0,1];x=Ne(x,[["t",-b.x,-b.y],["r",g],["t",b.x,b.y]]),b.matrix=x}s.attr(b)}else n.removeChild(s);else p.background&&((s=this.drawLabelBg(t,n,o)).set("classname",a),o.toFront())}else{this.drawLabel(t,n).set("className",i)}},afterUpdate:function(t,e){},setState:function(t,e,n){var r,i,o=n.get("keyShape");if(o){var a=n.getType(),s=Object(h.n)(e)?t:t+":"+e,u=this.getStateStyle(s,n),c=n.getStateStyle(s);if(c||u){var f=Object(h.A)({},c||u),l=n.getContainer(),d={x:1,y:1,cx:1,cy:1};if("combo"===a&&(d.r=1,d.width=1,d.height=1),e){var p=function(t){var e,n=f[t];if(Object(h.w)(n)&&!Re.includes(t)){var r=l.find((function(e){return e.get("name")===t}));r&&r.attr(n)}else o.attr(((e={})[t]=n,e))};for(var g in f)p(g)}else{var v=Wt(n.getCurrentStatesStyle()),y=n.getModel(),m=Object(h.A)({},y.style,Wt(n.getOriginStyle())),b=o.get("name"),x=o.attr(),w={};Object.keys(x).forEach((function(t){if("img"!==t){var e=x[t];e&&"object"===De(e)?w[t]=Object(h.c)(e):w[t]=e}}));var S={},E=function(t){var e=f[t];if(Object(h.w)(e)&&!Re.includes(t)){var n=l.find((function(e){return e.get("name")===t}));if(n){var r=Object(h.c)(n.attr());Object(h.f)(e,(function(e,i){if(t===b&&w[i]&&!d[i]){delete w[i];var s=m[t][i]||Be[a][i];o.attr(i,s)}else if(r[i]||0===r[i]){delete r[i];var u=m[t][i]||Be[a][i];n.attr(i,u)}})),S[t]=r}}else if(w[t]&&!d[t]){delete w[t];var i=m[t]||(m[b]?m[b][t]:void 0)||Be[a][t];o.attr(t,i)}};for(var _ in f)E(_);for(var g in b?S[b]=w:Object(h.A)(S,w),v)if(!d[g]){var O=v[g];Object(h.w)(O)&&!Re.includes(g)||(b?(Object(h.A)(m[b],((i={})[g]=O,i)),delete m[g]):Object(h.A)(m,((r={})[g]=O,r)),delete v[g])}var k={};Object(h.e)(k,m,S,v);var M=!1,A=function(t){var e,n,r=k[t];if(Object(h.w)(r)&&!Re.includes(t)){var i=l.find((function(e){return e.get("name")===t}));i&&(t===b&&("combo"===a&&(delete r.r,delete r.width,delete r.height),M=!0),i.attr(r))}else if(!M){var s=r||Be[a][t];"combo"===a?b||o.attr(((e={})[t]=s,e)):o.attr(((n={})[t]=s,n))}};for(var T in k)A(T)}}}},getStateStyle:function(t,e){var n=e.getModel(),r=e.getType(),i=this.getOptions(n),o=i.stateStyles,a=i.style,s=void 0===a?{}:a,u=n.stateStyles?n.stateStyles[t]:o&&o[t];return"combo"===r?Object(h.c)(u):Object(h.A)({},s,u)},getControlPoints:function(t){return t.controlPoints},getAnchorPoints:function(t){return this.getOptions(t).anchorPoints}},Fe={itemType:"node",shapeType:"single-node",labelPosition:"center",offset:ht.nodeLabel.offset,getSize:function(t){var e=t.size||this.getOptions({}).size||ht.defaultNode.size;return Object(h.m)(e)&&1===e.length&&(e=[e[0],e[0]]),Object(h.m)(e)||(e=[e,e]),e},getLabelStyleByPosition:function(t,e){var n=e.position||this.labelPosition;if("center"===n)return{x:0,y:0,text:t.label};var r=e.offset;Object(h.s)(r)&&(r=this.offset);var i,o=this.getSize(t),a=o[0],s=o[1];switch(n){case"top":i={x:0,y:0-s/2-r,textBaseline:"bottom"};break;case"bottom":i={x:0,y:s/2+r,textBaseline:"top"};break;case"left":i={x:0-a/2-r,y:0,textAlign:"right"};break;default:i={x:a/2+r,y:0,textAlign:"left"}}return i.text=t.label,i},getLabelBgStyleByPosition:function(t,e,n,r){if(!t)return{};var i=t.getBBox(),o=n.style&&n.style.background;if(!o)return{};var a,s=bt(o.padding),u=i.width+s[1]+s[3],c=i.height+s[0]+s[2],f=n.offset;return Object(h.s)(f)&&(f=this.offset),a={x:i.minX-s[3],y:i.minY-s[0]},a=Object(v.a)(Object(v.a)(Object(v.a)({},a),o),{width:u,height:c})},drawShape:function(t,e){var n=this.shapeType,r=this.getShapeStyle(t);return e.addShape(n,{attrs:r,draggable:!0,name:"node-shape"})},updateLinkPoints:function(t,e){var n,r=this.getOptions(t).linkPoints,i=e.find((function(t){return"link-point-left"===t.get("className")})),o=e.find((function(t){return"link-point-right"===t.get("className")})),a=e.find((function(t){return"link-point-top"===t.get("className")})),s=e.find((function(t){return"link-point-bottom"===t.get("className")}));i&&(n=i.attr()),o&&!n&&(n=o.attr()),a&&!n&&(n=a.attr()),s&&!n&&(n=s.attr()),n||(n=r);var u=Object(h.A)({},n,t.linkPoints),c=u.fill,f=u.stroke,l=u.lineWidth,d=u.size/2;d||(d=u.r);var p=t.linkPoints?t.linkPoints:{left:void 0,right:void 0,top:void 0,bottom:void 0},g=p.left,y=p.right,m=p.top,b=p.bottom,x=this.getSize(t),w=x[0],S=x[1],E={r:d,fill:c,stroke:f,lineWidth:l};i?g||void 0===g?i.attr(Object(v.a)(Object(v.a)({},E),{x:-w/2,y:0})):i.remove():g&&e.addShape("circle",{attrs:Object(v.a)(Object(v.a)({},E),{x:-w/2,y:0}),className:"link-point-left",name:"link-point-left",isAnchorPoint:!0}),o?(y||void 0===y||o.remove(),o.attr(Object(v.a)(Object(v.a)({},E),{x:w/2,y:0}))):y&&e.addShape("circle",{attrs:Object(v.a)(Object(v.a)({},E),{x:w/2,y:0}),className:"link-point-right",name:"link-point-right",isAnchorPoint:!0}),a?(m||void 0===m||a.remove(),a.attr(Object(v.a)(Object(v.a)({},E),{x:0,y:-S/2}))):m&&e.addShape("circle",{attrs:Object(v.a)(Object(v.a)({},E),{x:0,y:-S/2}),className:"link-point-top",name:"link-point-top",isAnchorPoint:!0}),s?b||void 0===b?s.attr(Object(v.a)(Object(v.a)({},E),{x:0,y:S/2})):s.remove():b&&e.addShape("circle",{attrs:Object(v.a)(Object(v.a)({},E),{x:0,y:S/2}),className:"link-point-bottom",name:"link-point-bottom",isAnchorPoint:!0})},updateShape:function(t,e,n,r){e.get("keyShape").attr(Object(v.a)({},n)),this.updateLabel(t,e),r&&this.updateIcon(t,e)},updateIcon:function(t,e){var n=this,r=e.getContainer(),i=this.getOptions(t).icon,o=(t.icon?t.icon:{show:void 0}).show,a=r.find((function(t){return t.get("className")===n.type+"-icon"}));if(a)if(o||void 0===o){var s=Object(h.A)({},a.attr(),i),u=s.width,c=s.height;a.attr(Object(v.a)(Object(v.a)({},s),{x:-u/2,y:-c/2}))}else a.remove();else if(o){u=i.width,c=i.height;r.addShape("image",{attrs:Object(v.a)(Object(v.a)({},i),{x:-u/2,y:-c/2}),className:this.type+"-icon",name:this.type+"-icon"});var f=r.find((function(t){return"node-label"===t.get("className")}));f&&f.toFront()}}},Ue=Object(v.a)(Object(v.a)({},Ge),Fe);te.registerNode("single-node",Ue);var ze={itemType:"edge",labelPosition:"center",refX:0,refY:0,labelAutoRotate:!1,options:{size:ht.defaultEdge.size,style:{x:0,y:0,stroke:ht.defaultEdge.style.stroke,lineAppendWidth:ht.defaultEdge.style.lineAppendWidth},labelCfg:{style:{fill:ht.edgeLabel.style.fill,fontSize:ht.edgeLabel.style.fontSize}},stateStyles:Object(v.a)({},ht.edgeStateStyles)},getPath:function(t){var e=[];return Object(h.f)(t,(function(t,n){0===n?e.push(["M",t.x,t.y]):e.push(["L",t.x,t.y])})),e},getShapeStyle:function(t){var e=this.options.style,n={stroke:t.color},r=Object(h.A)({},e,n,t.style),i=t.size||ht.defaultEdge.size,o=(t=this.getPathPoints(t)).startPoint,a=t.endPoint,s=this.getControlPoints(t),u=[o];s&&(u=u.concat(s)),u.push(a);var c=this.getPath(u);return Object(h.A)({},ht.defaultEdge.style,{stroke:ht.defaultEdge.color,lineWidth:i,path:c},r)},updateShapeStyle:function(t,e){var n=e.getContainer(),r={stroke:t.color},i=n.find((function(t){return"edge-shape"===t.get("className")}))||e.getKeyShape(),o=t.size,a=(t=this.getPathPoints(t)).startPoint,s=t.endPoint,u=this.getControlPoints(t),c=[a];u&&(c=c.concat(u)),c.push(s);var f=i.attr(),l=Object(h.A)({},r,f,t.style),d=t.sourceNode,p=t.targetNode,g={radius:l.radius};u||(g={source:d,target:p,offset:l.offset,radius:l.radius}),f.endArrow&&!1===l.endArrow&&(t.style.endArrow={path:""}),f.startArrow&&!1===l.startArrow&&(t.style.startArrow={path:""});var v=this.getPath(c,g),y=Object(h.A)(r,i.attr(),{lineWidth:o,path:v},t.style);i&&i.attr(y)},getLabelStyleByPosition:function(t,e,n){var r,i=e.position||this.labelPosition,o={},a=n&&n.find((function(t){return"edge-shape"===t.get("className")}));r="start"===i?0:"end"===i?1:.5;var s=e.refX||this.refX,u=e.refY||this.refY;if(t.startPoint.x===t.endPoint.x&&t.startPoint.y===t.endPoint.y)return o.x=t.startPoint.x+s,o.y=t.startPoint.y+u,o.text=t.label,o;var c=Object(h.s)(e.autoRotate)?this.labelAutoRotate:e.autoRotate,f=Dt(a,r,s,u,c);return o.x=f.x,o.y=f.y,o.rotate=f.rotate,o.textAlign=this._getTextAlign(i,f.angle),o.text=t.label,o},getLabelBgStyleByPosition:function(t,e,n,r){if(!t)return{};var i=t.getBBox(),o=n.style&&n.style.background;if(!o)return{};var a,s=o.padding,u=i.width+s[1]+s[3],c=i.height+s[0]+s[2],f=n.position||this.labelPosition,l=Object(v.a)(Object(v.a)({},o),{width:u,height:c,x:i.minX-s[2],y:i.minY-s[0],rotate:0}),d=Object(h.s)(n.autoRotate)?this.labelAutoRotate:n.autoRotate,p=r&&r.find((function(t){return"edge-shape"===t.get("className")}));a="start"===f?0:"end"===f?1:.5;var g=n.refX||this.refX,y=n.refY||this.refY;if(e.startPoint.x===e.endPoint.x&&e.startPoint.y===e.endPoint.y)return l.x=e.startPoint.x+g-u/2,l.y=e.startPoint.y+y-c/2,l;var m=Dt(p,a,g-u/2,y+c/2,d),b=m.angle;return b>.5*Math.PI&&b<1.5*Math.PI&&(m=Dt(p,a,g+u/2,y+c/2,d)),d&&(l.x=m.x,l.y=m.y),l.rotate=m.rotate,l},_getTextAlign:function(t,e){var n="center";return e?(e%=2*Math.PI,"center"!==t&&(n=e>=0&&e<=Math.PI/2||e>=1.5*Math.PI&&e<2*Math.PI?t:function(t){var e=t;return"start"===t?e="end":"end"===t&&(e="start"),e}(t)),n):t},getControlPoints:function(t){return t.controlPoints},getPathPoints:function(t){return t},drawShape:function(t,e){var n=this.getShapeStyle(t);return e.addShape("path",{className:"edge-shape",name:"edge-shape",attrs:n})},drawLabel:function(t,e){var n=this.options.labelCfg,r=Object(h.e)({fontFamily:"undefined"!=typeof window&&window.getComputedStyle(document.body,null).getPropertyValue("font-family")||"Arial, sans-serif"},n,t.labelCfg),i=this.getLabelStyle(t,r,e),o=i.rotate;delete i.rotate;var a=e.addShape("text",{attrs:i,name:"text-shape"});if(o&&a.rotateAtStart(o),i.background){var s=this.drawLabelBg(t,e,a),u=this.itemType+"-label-bg";s.set("classname",u),a.toFront()}return a},drawLabelBg:function(t,e,n){var r=this.options.labelCfg,i=Object(h.e)({},r,t.labelCfg),o=this.getLabelStyle(t,i,e).rotate,a=this.getLabelBgStyleByPosition(n,t,i,e);delete a.rotate;var s=e.addShape("rect",{name:"text-bg-shape",attrs:a});return o&&s.rotateAtStart(o),s}},Ve=Object(v.a)(Object(v.a)({},Ge),ze);te.registerEdge("single-edge",Ve),te.registerEdge("line",{getControlPoints:function(){}},"single-edge"),te.registerEdge("spline",{getPath:function(t){return he(t)}},"single-edge"),te.registerEdge("arc",{curveOffset:20,clockwise:1,getControlPoints:function(t){var e,n,r=t.startPoint,i=t.endPoint,o=(r.x+i.x)/2,a=(r.y+i.y)/2;if(void 0!==t.controlPoints){if(n=t.controlPoints[0],e=T(r,n,i),r.x<=i.x&&r.y>i.y?this.clockwise=e.x>n.x?0:1:r.x<=i.x&&r.yn.x?1:0:r.x>i.x&&r.y<=i.y?this.clockwise=e.y=0;return n?i?2*Math.PI-r:r:i?r:2*Math.PI-r}function gn(t,e,n){return n?(t[0]=e[1],t[1]=-1*e[0]):(t[0]=-1*e[1],t[1]=e[0]),t}var vn=n(85),yn=n.n(vn),mn=n(95),bn=n.n(mn),xn=[{index:7,opacity:.15},{index:6,opacity:.25},{index:5,opacity:.3},{index:5,opacity:.45},{index:5,opacity:.65},{index:5,opacity:.85},{index:4,opacity:.9},{index:3,opacity:.95},{index:2,opacity:.97},{index:1,opacity:.98}];function wn(t,e,n){var r;return(r=Math.round(t.h)>=60&&Math.round(t.h)<=240?n?Math.round(t.h)-2*e:Math.round(t.h)+2*e:n?Math.round(t.h)+2*e:Math.round(t.h)-2*e)<0?r+=360:r>=360&&(r-=360),r}function Sn(t,e,n){return 0===t.h&&0===t.s?t.s:((r=n?t.s-.16*e:4===e?t.s+.16:t.s+.05*e)>1&&(r=1),n&&5===e&&r>.1&&(r=.1),r<.06&&(r=.06),Number(r.toFixed(2)));var r}function En(t,e,n){var r;return(r=n?t.v+.05*e:t.v-.15*e)>1&&(r=1),Number(r.toFixed(2))}function _n(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=bn()(t),i=5;i>0;i-=1){var o=r.toHsv(),a=bn()({h:wn(o,i,!0),s:Sn(o,i,!0),v:En(o,i,!0)}).toHexString();n.push(a)}n.push(r.toHexString());for(var s=1;s<=4;s+=1){var u=r.toHsv(),c=bn()({h:wn(u,s),s:Sn(u,s),v:En(u,s)}).toHexString();n.push(c)}return"dark"===e.theme?xn.map((function(t){var r=t.index,i=t.opacity;return bn.a.mix(e.backgroundColor||"#141414",n[r],100*i).toHexString()})):n}var On={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1890FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},kn={},Mn={};Object.keys(On).forEach((function(t){kn[t]=_n(On[t]),kn[t].primary=kn[t][5],Mn[t]=_n(On[t],{theme:"dark",backgroundColor:"#141414"}),Mn[t].primary=Mn[t][5]}));kn.red,kn.volcano,kn.gold,kn.orange,kn.yellow,kn.lime,kn.green,kn.cyan,kn.blue,kn.geekblue,kn.purple,kn.magenta,kn.grey;var An,Tn,Cn=function(t,e,n){var r=yn()(t),i=yn()(e);return yn()([(1-n)*r.red()+n*i.red(),(1-n)*r.green()+n*i.green(),(1-n)*r.blue()+n*i.blue()]).rgb()},In=function(t,e,n,r){return void 0===e&&(e="#fff"),void 0===n&&(n="default"),void 0===r&&(r="rgb(150, 150, 150)"),"default"===n?function(t,e,n){void 0===e&&(e="#fff"),void 0===n&&(n="rgb(150, 150, 150)");var r=Cn(e,t,.05).rgb().toString(),i=Cn(e,t,.1).rgb().toString(),o=Cn(e,t,.2).rgb().toString(),a=Cn(e,t,.4).rgb().toString(),s=Cn(e,n,.02).rgb().toString(),u=Cn(e,n,.05).rgb().toString(),c=Cn(e,n,.1).rgb().toString(),f=Cn(e,n,.2).rgb().toString(),l=Cn(e,n,.3).rgb().toString(),h=_n(t,{theme:"default",backgroundColor:e}),d=yn()(t).hex().toLowerCase(),p=h.indexOf(d),g=t;return-1!==p&&(g=h[p+1]),{mainStroke:t,mainFill:i,activeStroke:t,activeFill:r,inactiveStroke:a,inactiveFill:r,selectedStroke:t,selectedFill:e,highlightStroke:g,highlightFill:o,disableStroke:l,disableFill:u,edgeMainStroke:l,edgeActiveStroke:t,edgeInactiveStroke:f,edgeSelectedStroke:t,edgeHighlightStroke:t,edgeDisableStroke:c,comboMainStroke:l,comboMainFill:s,comboActiveStroke:t,comboActiveFill:r,comboInactiveStroke:l,comboInactiveFill:s,comboSelectedStroke:t,comboSelectedFill:s,comboHighlightStroke:g,comboHighlightFill:s,comboDisableStroke:f,comboDisableFill:u}}(t,e,"rgb(150, 150, 150)"):function(t,e,n){void 0===e&&(e="#fff"),void 0===n&&(n="#777");var r=Cn(e,t,.2).rgb().toString(),i=Cn(e,t,.3).rgb().toString(),o=Cn(e,t,.6).rgb().toString(),a=Cn(e,t,.8).rgb().toString(),s=Cn(e,n,.2).rgb().toString(),u=Cn(e,n,.25).rgb().toString(),c=Cn(e,n,.3).rgb().toString(),f=Cn(e,n,.4).rgb().toString(),l=Cn(e,n,.5).rgb().toString(),h=_n(t,{theme:"dark",backgroundColor:e}),d=yn()(t).hex().toLowerCase(),p=h.indexOf(d),g=t;return-1!==p&&(g=h[p+1]),{mainStroke:a,mainFill:r,activeStroke:t,activeFill:i,inactiveStroke:a,inactiveFill:r,selectedStroke:t,selectedFill:r,highlightStroke:t,highlightFill:o,disableStroke:l,disableFill:u,edgeMainStroke:n,edgeActiveStroke:t,edgeInactiveStroke:n,edgeSelectedStroke:t,edgeHighlightStroke:t,edgeDisableStroke:c,comboMainStroke:f,comboMainFill:u,comboActiveStroke:t,comboActiveFill:s,comboInactiveStroke:f,comboInactiveFill:u,comboSelectedStroke:t,comboSelectedFill:s,comboHighlightStroke:g,comboHighlightFill:u,comboDisableStroke:f,comboDisableFill:s}}(t,e,"#777")},Pn=function(t,e,n,r){void 0===e&&(e="#fff"),void 0===n&&(n="default"),void 0===r&&(r="rgb(150, 150, 150)");var i=[];return t.forEach((function(t){i.push(In(t,e,n,r))})),i},jn=In("rgb(95, 149, 255)","rgb(255, 255, 255)"),Dn={version:"0.0.20",rootContainerClassName:"root-container",nodeContainerClassName:"node-container",edgeContainerClassName:"edge-container",comboContainerClassName:"combo-container",delegateContainerClassName:"delegate-container",defaultLoopPosition:"top",nodeLabel:{style:{fill:"#000",fontSize:12,textAlign:"center",textBaseline:"middle"},offset:4},defaultNode:{type:"circle",style:{lineWidth:1,stroke:jn.mainStroke,fill:jn.mainFill},size:20,color:jn.mainStroke,linkPoints:{size:8,lineWidth:1,fill:jn.activeFill,stroke:jn.activeStroke}},nodeStateStyles:{active:{fill:jn.activeFill,stroke:jn.activeStroke,lineWidth:2,shadowColor:jn.mainStroke,shadowBlur:10},selected:{fill:jn.selectedFill,stroke:jn.selectedStroke,lineWidth:4,shadowColor:jn.selectedStroke,shadowBlur:10,"text-shape":{fontWeight:500}},highlight:{fill:jn.highlightFill,stroke:jn.highlightStroke,lineWidth:2,"text-shape":{fontWeight:500}},inactive:{fill:jn.inactiveFill,stroke:jn.inactiveStroke,lineWidth:1},disable:{fill:jn.disableFill,stroke:jn.disableStroke,lineWidth:1}},edgeLabel:{style:{fill:"rgb(0, 0, 0)",textAlign:"center",textBaseline:"middle",fontSize:12}},defaultEdge:{type:"line",size:1,style:{stroke:jn.edgeMainStroke,lineAppendWidth:2},color:jn.edgeMainStroke},edgeStateStyles:{active:{stroke:jn.edgeActiveStroke,lineWidth:1},selected:{stroke:jn.edgeSelectedStroke,lineWidth:2,shadowColor:jn.edgeSelectedStroke,shadowBlur:10,"text-shape":{fontWeight:500}},highlight:{stroke:jn.edgeHighlightStroke,lineWidth:2,"text-shape":{fontWeight:500}},inactive:{stroke:jn.edgeInactiveStroke,lineWidth:1},disable:{stroke:jn.edgeDisableStroke,lineWidth:1}},comboLabel:{style:{fill:"rgb(0, 0, 0)",textBaseline:"middle",fontSize:12},refY:10,refX:10},defaultCombo:{type:"circle",style:{fill:jn.comboMainFill,lineWidth:1,stroke:jn.comboMainStroke,r:5,width:20,height:10},size:[20,5],color:jn.comboMainStroke,padding:[25,20,15,20]},comboStateStyles:{active:{stroke:jn.comboActiveStroke,lineWidth:1,fill:jn.comboActiveFill},selected:{stroke:jn.comboSelectedStroke,lineWidth:2,fill:jn.comboSelectedFill,shadowColor:jn.comboSelectedStroke,shadowBlur:10,"text-shape":{fontWeight:500}},highlight:{stroke:jn.comboHighlightStroke,lineWidth:2,fill:jn.comboHighlightFill,"text-shape":{fontWeight:500}},inactive:{stroke:jn.comboInactiveStroke,fill:jn.comboInactiveFill,lineWidth:1},disable:{stroke:jn.comboDisableStroke,fill:jn.comboDisableFill,lineWidth:1}},delegateStyle:{fill:"#F3F9FF",fillOpacity:.5,stroke:"#1890FF",strokeOpacity:.9,lineDash:[5,5]},textWaterMarkerConfig:{width:150,height:100,compatible:!1,text:{x:0,y:60,lineHeight:20,rotate:20,fontSize:14,fontFamily:"Microsoft YaHei",fill:"rgba(0, 0, 0, 0.1)",baseline:"Middle"}},imageWaterMarkerConfig:{width:150,height:130,compatible:!1,image:{x:0,y:0,width:30,height:20,rotate:0}},waterMarkerImage:"https://gw.alipayobjects.com/os/s/prod/antv/assets/image/logo-with-text-73b8a.svg"},Nn=Qe.cloneEvent,Rn=Qe.isViewportChanged,Ln=function(t){function e(e){var n=t.call(this,e)||this;return n.extendEvents=[],n.dragging=!1,n.preItem=null,n.graph=e,n.destroyed=!1,n.initEvents(),n}return Object(v.b)(e,t),e.prototype.initEvents=function(){var t=this.graph,e=this.extendEvents,n=void 0===e?[]:e,r=t.get("canvas"),i=r.get("el"),o=Object(h.J)(this,"onCanvasEvents"),a=Object(h.J)(this,"onExtendEvents"),s=Object(h.J)(this,"onWheelEvent");r.off("*").on("*",o),this.canvasHandler=o,n.push(pt(i,"DOMMouseScroll",s)),n.push(pt(i,"mousewheel",s)),"undefined"!=typeof window&&(n.push(pt(window,"keydown",a)),n.push(pt(window,"keyup",a)),n.push(pt(window,"focus",a)))},e.getItemRoot=function(t){for(;t&&!t.get("item");)t=t.get("parent");return t},e.prototype.onCanvasEvents=function(t){var n=this.graph,r=n.get("canvas"),i=t.target,o=t.type;t.canvasX=t.x,t.canvasY=t.y;var a={x:t.canvasX,y:t.canvasY},s=n.get("group").getMatrix();if(s||(s=[1,0,0,0,1,0,0,0,1]),Rn(s)&&(a=n.getPointByClient(t.clientX,t.clientY)),t.x=a.x,t.y=a.y,t.currentTarget=n,i===r)return"mousemove"===o&&this.handleMouseMove(t,"canvas"),t.target=r,t.item=null,n.emit(o,t),void n.emit("canvas:"+o,t);var u=e.getItemRoot(i);if(u){var c=u.get("item");if(!c.destroyed){var f=c.getType();if(t.target=i,t.item=c,t.canvasX===t.x&&t.canvasY===t.y){var l=n.getCanvasByPoint(t.x,t.y);t.canvasX=l.x,t.canvasY=l.y}n.emit(o,t),t.name&&!t.name.includes(":")?n.emit(f+":"+o,t):n.emit(t.name,t),"dragstart"===o&&(this.dragging=!0),"dragend"===o&&(this.dragging=!1),"mousemove"===o&&this.handleMouseMove(t,f)}}else n.emit(o,t)},e.prototype.onExtendEvents=function(t){this.graph.emit(t.type,t)},e.prototype.onWheelEvent=function(t){Object(h.s)(t.wheelDelta)&&(t.wheelDelta=-t.detail),this.graph.emit("wheel",t)},e.prototype.handleMouseMove=function(t,e){var n=this.graph,r=this.preItem,i=n.get("canvas"),o=t.target===i?null:t.item;t=Nn(t),r&&r!==o&&!r.destroyed&&(t.item=r,this.emitCustomEvent(r.getType(),"mouseleave",t),this.dragging&&this.emitCustomEvent(r.getType(),"dragleave",t)),o&&r!==o&&(t.item=o,this.emitCustomEvent(e,"mouseenter",t),this.dragging&&this.emitCustomEvent(e,"dragenter",t)),this.preItem=o},e.prototype.emitCustomEvent=function(t,e,n){n.type=e,this.graph.emit(t+":"+e,n)},e.prototype.destroy=function(){var t=this.graph,e=this.canvasHandler,n=this.extendEvents;t.get("canvas").off("*",e),Object(h.f)(n,(function(t){t.remove()})),this.dragging=!1,this.preItem=null,this.extendEvents.length=0,this.canvasHandler=null,this.destroyed=!0},e}($e),Bn=function(t){return"string"==typeof t},Gn=/-(\\w)/g,Fn=(An=function(t){return t.replace(Gn,(function(t,e){return e?e.toUpperCase():""}))},Tn=Object.create(null),Array.isArray),Un=function(t){return"number"==typeof t},zn=function(t){return Number.isNaN(Number(t))},Vn=function(t,e,n){for(var r=[],i=0;ie[a][o]+e[o][s]&&(e[a][s]=e[a][o]+e[o][s]);return e},Xn=function(t,e){var n=t.nodes,r=t.edges,i=[],o={};if(!n)throw new Error("invalid nodes data!");return n&&n.forEach((function(t,e){o[t.id]=e;i.push([])})),r&&r.forEach((function(t){var n=t.source,r=t.target,a=o[n],s=o[r];i[a][s]=1,e||(i[s][a]=1)})),i},Yn=function(t,e){"function"==typeof e&&function t(e,n){if(e&&e.children)for(var r=e.children.length-1;r>=0;r--)if(!t(e.children[r],n))return;return!!n(e)}(t,e)};function Hn(t){return(Hn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var qn=function t(e){if(null===e)return e;if(e instanceof Date)return new Date(e.getTime());if(e instanceof Array){var n=[];return e.forEach((function(t){n.push(t)})),n.map((function(e){return t(e)}))}if("object"===Hn(e)&&e!=={}){var r=Object.assign({},e);return Object.keys(r).forEach((function(e){r[e]=t(r[e])})),r}return e},Kn=function(t){return"function"==typeof t};function Zn(t,e){for(var n=0;nt.cells){var f=t.small(),l=t.large();(f-1)*l>=t.cells?t.small(f-1):(l-1)*f>=t.cells&&t.large(l-1)}else for(;t.cols*t.rows=t.cells?t.large(d+1):t.small(h+1)}t.cellWidth=t.width/t.cols,t.cellHeight=t.height/t.rows,t.condense&&(t.cellWidth=0,t.cellHeight=0),t.preventOverlap&&o.forEach((function(e){var n,r;e.x&&e.y||(e.x=0,e.y=0),Fn(e.size)?(n=e.size[0],r=e.size[1]):Un(e.size)&&(n=e.size,r=e.size),void 0!==n&&void 0!==r||(Fn(t.nodeSize)?(n=t.nodeSize[0],r=t.nodeSize[1]):Un(t.nodeSize)?(n=t.nodeSize,r=t.nodeSize):(n=30,r=30));var i=t.preventOverlapPadding,o=n+i,a=r+i;t.cellWidth=Math.max(t.cellWidth,o),t.cellHeight=Math.max(t.cellHeight,a)})),t.cellUsed={},t.row=0,t.col=0,t.id2manPos={};for(var p=0;p=t&&(this.col=0,this.row++)}},{key:"getPos",value:function(t){var e,n,r=this.begin,i=this.cellWidth,o=this.cellHeight,a=this.id2manPos[t.id];if(a)e=a.col*i+i/2+r[0],n=a.row*o+o/2+r[1];else{for(;this.used(this.row,this.col);)this.moveToNextCell();e=this.col*i+i/2+r[0],n=this.row*o+o/2+r[1],this.use(this.row,this.col),this.moveToNextCell()}t.x=e,t.y=n}},{key:"getType",value:function(){return"grid"}}])&&$n(e.prototype,n),r&&$n(e,r),o}(Qn);function or(t){return(or="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function ar(t,e){for(var n=0;na[1]?a[0]:a[1])+s(t)}:function(t){return a+s(t)}:function(t){return t.size?Fn(t.size)?(t.size[0]>t.size[1]?t.size[0]:t.size[1])+s(t):t.size+s(t):10+s(t)}}t.nodeSize=o;var c=t.edges;t.degrees=Vn(e.length,t.nodeIdxMap,c),t.getMass||(t.getMass=function(e){return t.degrees[t.nodeIdxMap[e.id]]}),t.run()}else t.onLayoutEnd&&t.onLayoutEnd()}},{key:"run",value:function(){var t=this,e=t.nodes,n=t.edges,r=t.maxIteration;if("undefined"!=typeof window){var i=0;this.timeInterval=window.setInterval((function(){var o=[],a=[];if(e){e.forEach((function(t,e){o[2*e]=0,o[2*e+1]=0,a[2*e]=0,a[2*e+1]=0})),t.calRepulsive(o,e),n&&t.calAttractive(o,n),t.calGravity(o,e);var s=Math.max(.02,t.interval-.002*i);t.updateVelocity(o,a,s,e);var u=[];e.forEach((function(t){u.push({x:t.x,y:t.y})})),t.updatePosition(a,s,e),t.tick&&t.tick();var c=0;e.forEach((function(t,e){var n=t.x-u[e].x,r=t.y-u[e].y;c+=Math.sqrt(n*n+r*r)})),(c/=e.length)r&&(window.clearInterval(t.timeInterval),t.onLayoutEnd&&t.onLayoutEnd())}}),0)}}},{key:"calRepulsive",value:function(t,e){var n=this.getMass,r=this.nodeStrength,i=this.factor,o=this.coulombDisScale,a=this.preventOverlap,s=this.nodeSize;e.forEach((function(u,c){var f=n?n(u):1;e.forEach((function(e,l){if(!(c>=l)){var h=u.x-e.x,d=u.y-e.y,p=Math.sqrt(h*h+d*d)+.01,g=(p+.1)*o,v=h/p,y=d/p,m=(r(u)+r(e))/2*i/(g*g),b=n?n(e):1;if(t[2*c]+=v*m/f,t[2*c+1]+=y*m/f,t[2*l]-=v*m/b,t[2*l+1]-=y*m/b,a&&p<(s(u)+s(e))/2){var x=(r(u)+r(e))/2/(p*p);t[2*c]+=v*x/f,t[2*c+1]+=y*x/f,t[2*l]-=v*x/b,t[2*l+1]-=y*x/b}}}))}))}},{key:"calAttractive",value:function(t,e){var n=this.nodeMap,r=this.nodeIdxMap,i=this.linkDistance,o=this.edgeStrength,a=this.getMass;e.forEach((function(e,s){var u=n[e.source],c=n[e.target],f=c.x-u.x,l=c.y-u.y,h=Math.sqrt(f*f+l*l)+.01,d=f/h,p=l/h,g=((i(e)||1)-h)*o(e),v=r[e.source],y=r[e.target],m=a?a(u):1,b=a?a(c):1;t[2*v]-=d*g/m,t[2*v+1]-=p*g/m,t[2*y]+=d*g/b,t[2*y+1]+=p*g/b}))}},{key:"calGravity",value:function(t,e){for(var n=this.center,r=this.gravity,i=this.degrees,o=e.length,a=0;ai.maxSpeed){var c=i.maxSpeed/u;a*=c,s*=c}e[2*r]=a,e[2*r+1]=s}))}},{key:"updatePosition",value:function(t,e,n){n.forEach((function(n,r){var i=t[2*r]*e,o=t[2*r+1]*e;n.x+=i,n.y+=o}))}},{key:"stop",value:function(){this.timeInterval&&"undefined"!=typeof window&&window.clearInterval(this.timeInterval)}},{key:"destroy",value:function(){this.stop(),this.tick=null,this.nodes=null,this.edges=null,this.destroyed=!0}},{key:"getType",value:function(){return"gForce"}}])&&dr(e.prototype,n),r&&dr(e,r),o}(Qn);function xr(t,e,n,r){if(isNaN(e)||isNaN(n))return t;var i,o,a,s,u,c,f,l,h,d=t._root,p={data:r},g=t._x0,v=t._y0,y=t._x1,m=t._y1;if(!d)return t._root=p,t;for(;d.length;)if((c=e>=(o=(g+y)/2))?g=o:y=o,(f=n>=(a=(v+m)/2))?v=a:m=a,i=d,!(d=d[l=f<<1|c]))return i[l]=p,t;if(s=+t._x.call(null,d.data),u=+t._y.call(null,d.data),e===s&&n===u)return p.next=d,i?i[l]=p:t._root=p,t;do{i=i?i[l]=new Array(4):t._root=new Array(4),(c=e>=(o=(g+y)/2))?g=o:y=o,(f=n>=(a=(v+m)/2))?v=a:m=a}while((l=f<<1|c)==(h=(u>=a)<<1|s>=o));return i[h]=d,i[l]=p,t}var wr=function(t,e,n,r,i){this.node=t,this.x0=e,this.y0=n,this.x1=r,this.y1=i};function Sr(t){return t[0]}function Er(t){return t[1]}function _r(t,e,n){var r=new Or(null==e?Sr:e,null==n?Er:n,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function Or(t,e,n,r,i,o){this._x=t,this._y=e,this._x0=n,this._y0=r,this._x1=i,this._y1=o,this._root=void 0}function kr(t){for(var e={data:t.data},n=e;t=t.next;)n=n.next={data:t.data};return e}var Mr=_r.prototype=Or.prototype;Mr.copy=function(){var t,e,n=new Or(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return n;if(!r.length)return n._root=kr(r),n;for(t=[{source:r,target:n._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(e=r.source[i])&&(e.length?t.push({source:e,target:r.target[i]=new Array(4)}):r.target[i]=kr(e));return n},Mr.add=function(t){var e=+this._x.call(null,t),n=+this._y.call(null,t);return xr(this.cover(e,n),e,n,t)},Mr.addAll=function(t){var e,n,r,i,o=t.length,a=new Array(o),s=new Array(o),u=1/0,c=1/0,f=-1/0,l=-1/0;for(n=0;nf&&(f=r),il&&(l=i));if(u>f||c>l)return this;for(this.cover(u,c).cover(f,l),n=0;nt||t>=i||r>e||e>=o;)switch(s=(eh||(o=u.y0)>d||(a=u.x1)=y)<<1|t>=v)&&(u=p[p.length-1],p[p.length-1]=p[p.length-1-c],p[p.length-1-c]=u)}else{var m=t-+this._x.call(null,g.data),b=e-+this._y.call(null,g.data),x=m*m+b*b;if(x=(s=(p+v)/2))?p=s:v=s,(f=a>=(u=(g+y)/2))?g=u:y=u,e=d,!(d=d[l=f<<1|c]))return this;if(!d.length)break;(e[l+1&3]||e[l+2&3]||e[l+3&3])&&(n=e,h=l)}for(;d.data!==t;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):e?(i?e[l]=i:delete e[l],(d=e[0]||e[1]||e[2]||e[3])&&d===(e[3]||e[2]||e[1]||e[0])&&!d.length&&(n?n[h]=d:this._root=d),this):(this._root=i,this)},Mr.removeAll=function(t){for(var e=0,n=t.length;e=0&&(n=t.slice(r+1),t=t.slice(0,r)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))}function Dr(t,e){for(var n,r=0,i=t.length;r0)for(var n,r,i=new Array(n),o=0;o=0&&e._call.call(null,t),e=e._next;--Fr}()}finally{Fr=0,function(){var t,e,n=Br,r=1/0;for(;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Br=e);Gr=t,ti(r)}(),Wr=0}}function $r(){var t=Yr.now(),e=t-Vr;e>1e3&&(Xr-=e,Vr=t)}function ti(t){Fr||(Ur&&(Ur=clearTimeout(Ur)),t-Wr>24?(t<1/0&&(Ur=setTimeout(Jr,t-Yr.now()-Xr)),zr&&(zr=clearInterval(zr))):(zr||(Vr=Yr.now(),zr=setInterval($r,1e3)),Fr=1,Hr(Jr)))}Zr.prototype=Qr.prototype={constructor:Zr,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?qr():+n)+(null==e?0:+e),this._next||Gr===this||(Gr?Gr._next=this:Br=this,Gr=this),this._call=t,this._time=n,ti()},stop:function(){this._call&&(this._call=null,this._time=1/0,ti())}};function ei(t){return t.x}function ni(t){return t.y}var ri=Math.PI*(3-Math.sqrt(5)),ii=function(t){var e,n,r=1,i=.001,o=1-Math.pow(i,1/300),a=0,s=.6,u=new Map,c=Qr(h),f=Rr("tick","end"),l=(n=1,function(){return(n=(1664525*n+1013904223)%4294967296)/4294967296});function h(){d(),f.call("tick",e),r1?(null==n?u.delete(t):u.set(t,g(n)),e):u.get(t)},find:function(e,n,r){var i,o,a,s,u,c=0,f=t.length;for(null==r?r=1/0:r*=r,c=0;c1?(f.on(t,n),e):f.on(t)}}},oi=function(){var t,e,n,r,i,o=Ar(-30),a=1,s=1/0,u=.81;function c(n){var i,o=t.length,a=_r(t,ei,ni).visitAfter(l);for(r=n,i=0;i=s)){(t.data!==e||t.next)&&(0===l&&(p+=(l=Tr(n))*l),0===h&&(p+=(h=Tr(n))*h),pc+p||of+p||au.index){var g=c-s.x-s.vx,v=f-s.y-s.vy,y=g*g+v*v;yt.r&&(t.r=t[e].r)}function u(){if(e){var r,i,o=e.length;for(n=new Array(o),r=0;rt.length)&&(e=t.length);for(var n=0,r=new Array(e);n-1||(e[r]=t[r])})),e})),this.ticking=!1}},{key:"execute",value:function(t){var e=this,n=e.nodes,r=e.edges;if(!e.ticking){var i=e.forceSimulation,o=e.alphaMin,a=e.alphaDecay,s=e.alpha;if(i){if(t)if(e.clustering&&e.clusterForce&&(e.clusterForce.nodes(n),e.clusterForce.links(r)),i.nodes(n),r&&e.edgeForce)e.edgeForce.links(r);else if(r&&!e.edgeForce){var u=ci().id((function(t){return t.id})).links(r);e.edgeStrength&&u.strength(e.edgeStrength),e.linkDistance&&u.distance(e.linkDistance),e.edgeForce=u,i.force("link",u)}e.preventOverlap&&e.overlapProcess(i),i.alpha(s).restart(),this.ticking=!0}else try{var c=oi();if(e.nodeStrength&&c.strength(e.nodeStrength),i=ii().nodes(n),e.clustering){var f=gi();f.centerX(e.center[0]).centerY(e.center[1]).template("force").strength(e.clusterFociStrength),r&&f.links(r),n&&f.nodes(n),f.forceLinkDistance(e.clusterEdgeDistance).forceLinkStrength(e.clusterEdgeStrength).forceCharge(e.clusterNodeStrength).forceNodeSize(e.clusterNodeSize),e.clusterForce=f,i.force("group",f)}if(i.force("center",function(t,e){var n,r=1;function i(){var i,o,a=n.length,s=0,u=0;for(i=0;ir[1]?r[0]:r[1])/2;e=function(t){return a+n(t)}}else if(Un(r)){var s=r/2;e=function(t){return s+n(t)}}else e=function(){return 10};else e=function(t){return t.size?Fn(t.size)?(t.size[0]>t.size[1]?t.size[0]:t.size[1])/2+n(t):t.size/2+n(t):10+n(t)};t.force("collisionForce",hi(e).strength(o))}},{key:"updateCfg",value:function(t){this.ticking&&(this.forceSimulation.stop(),this.ticking=!1),this.forceSimulation=null,Object.assign(this,t)}},{key:"destroy",value:function(){this.ticking&&(this.forceSimulation.stop(),this.ticking=!1),this.nodes=null,this.edges=null,this.destroyed=!0}}])&&Ei(e.prototype,n),r&&Ei(e,r),o}(Qn);function Ti(){return"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope}function Ci(t){return(Ci="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function Ii(t,e){for(var n=0;nr?1:0}var Gi=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&Pi(t,e)}(o,t);var e,n,r,i=ji(o);function o(t){var e;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,o),(e=i.call(this)).radius=null,e.startRadius=null,e.endRadius=null,e.startAngle=0,e.endAngle=2*Math.PI,e.clockwise=!0,e.divisions=1,e.ordering=null,e.angleRatio=1,e.nodes=[],e.edges=[],e.nodeMap={},e.degrees=[],e.width=300,e.height=300,e.updateCfg(t),e}return e=o,(n=[{key:"getDefaultCfg",value:function(){return{radius:null,startRadius:null,endRadius:null,startAngle:0,endAngle:2*Math.PI,clockwise:!0,divisions:1,ordering:null,angleRatio:1}}},{key:"execute",value:function(){var t=this.nodes,e=this.edges,n=t.length;if(0!==n){this.width||"undefined"==typeof window||(this.width=window.innerWidth),this.height||"undefined"==typeof window||(this.height=window.innerHeight),this.center||(this.center=[this.width/2,this.height/2]);var r=this.center;if(1===n)return t[0].x=r[0],t[0].y=r[1],void(this.onLayoutEnd&&this.onLayoutEnd());var i=this.radius,o=this.startRadius,a=this.endRadius,s=this.divisions,u=this.startAngle,c=this.endAngle,f=(c-u)/n,l={};t.forEach((function(t,e){l[t.id]=e})),this.nodeMap=l;var h=Vn(t.length,l,e);this.degrees=h,i||o||a?!o&&a?o=a:o&&!a&&(a=o):i=this.height>this.width?this.width/2:this.height/2;var d=f*this.angleRatio,p=this.ordering,g=[];g="topology"===p?this.topologyOrdering():"topology-directed"===p?this.topologyOrdering(!0):"degree"===p?this.degreeOrdering():t;for(var v=this.clockwise,y=Math.ceil(n/s),m=0;m0&&void 0!==arguments[0]&&arguments[0],e=this,n=e.degrees,r=e.edges,i=e.nodes,o=qn(i),a=e.nodeMap,s=[o[0]],u=[i[0]],c=[],f=i.length;c[0]=!0,Ri(o,r,a,t);var l=0;return o.forEach((function(t,e){if(0!==e)if(e!==f-1&&n[e]===n[e+1]&&!Li(s[l],t,r)||c[e]){for(var h=s[l].children,d=!1,p=0;pi?1:0})).forEach((function(t,e){t.x=u+e*c}))}else e.onLayoutEnd&&e.onLayoutEnd()}))}},{key:"getType",value:function(){return"dagre"}}])&&Vi(e.prototype,n),r&&Vi(e,r),o}(Qn);function Ki(t,e,n){return t||(Un(e)?function(){return e}:function(){return n})}var Zi=Object.prototype.toString;function Qi(t){return Zi.call(t).endsWith("Array]")}var Ji=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!Qi(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");var n=e.fromIndex,r=void 0===n?0:n,i=e.toIndex,o=void 0===i?t.length:i;if(r<0||r>=t.length||!Number.isInteger(r))throw new Error("fromIndex must be a positive integer smaller than length");if(o<=r||o>t.length||!Number.isInteger(o))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var a=t[r],s=r+1;sa&&(a=t[s]);return a};var $i=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!Qi(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");var n=e.fromIndex,r=void 0===n?0:n,i=e.toIndex,o=void 0===i?t.length:i;if(r<0||r>=t.length||!Number.isInteger(r))throw new Error("fromIndex must be a positive integer smaller than length");if(o<=r||o>t.length||!Number.isInteger(o))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var a=t[r],s=r+1;s1&&void 0!==arguments[1]?arguments[1]:{};if(!Qi(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");if(void 0!==n.output){if(!Qi(n.output))throw new TypeError("output option must be an array if specified");e=n.output}else e=new Array(t.length);var r=$i(t),i=Ji(t);if(r===i)throw new RangeError("minimum and maximum input values are equal. Cannot rescale a constant array");var o=n.min,a=void 0===o?n.autoMinMax?r:0:o,s=n.max,u=void 0===s?n.autoMinMax?i:1:s;if(a>=u)throw new RangeError("min option must be smaller than max option");for(var c=(u-a)/(i-r),f=0;f1&&void 0!==arguments[1]?arguments[1]:{},n=e.maxRows,r=void 0===n?15:n,i=e.maxColumns,o=void 0===i?10:i,a=e.maxNumSize,s=void 0===a?8:a;return"".concat(t.constructor.name," {\\n").concat(eo,"[\\n").concat(no).concat(io(t,r,o,s),"\\n").concat(eo,"]\\n").concat(eo,"rows: ").concat(t.rows,"\\n").concat(eo,"columns: ").concat(t.columns,"\\n}")}function io(t,e,n,r){for(var i=t.rows,o=t.columns,a=Math.min(i,e),s=Math.min(o,n),u=[],c=0;cr)throw new RangeError("Row index out of range")}function uo(t,e,n){var r=n?t.columns:t.columns-1;if(e<0||e>r)throw new RangeError("Column index out of range")}function co(t,e){if(e.to1DArray&&(e=e.to1DArray()),e.length!==t.columns)throw new RangeError("vector size must be the same as the number of columns");return e}function fo(t,e){if(e.to1DArray&&(e=e.to1DArray()),e.length!==t.rows)throw new RangeError("vector size must be the same as the number of rows");return e}function lo(t,e){if("object"!==ao(e))throw new TypeError("unexpected type for row indices");if(e.some((function(e){return e<0||e>=t.rows})))throw new RangeError("row indices are out of range");return Array.isArray(e)||(e=Array.from(e)),e}function ho(t,e){if("object"!==ao(e))throw new TypeError("unexpected type for column indices");if(e.some((function(e){return e<0||e>=t.columns})))throw new RangeError("column indices are out of range");return Array.isArray(e)||(e=Array.from(e)),e}function po(t,e,n,r,i){if(5!==arguments.length)throw new RangeError("expected 4 arguments");if(vo("startRow",e),vo("endRow",n),vo("startColumn",r),vo("endColumn",i),e>n||r>i||e<0||e>=t.rows||n<0||n>=t.rows||r<0||r>=t.columns||i<0||i>=t.columns)throw new RangeError("Submatrix indices are out of range")}function go(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[],r=0;rn?(i=!0,n=e):(r=!1,i=!0);t++}return r}},{key:"isReducedEchelonForm",value:function(){for(var t=0,e=0,n=-1,r=!0,i=!1;tn?(i=!0,n=e):(r=!1,i=!0);for(var o=e+1;ot.get(r,n)&&(r=i);if(0===t.get(r,n))n++;else{t.swapRows(e,r);for(var o=t.get(e,n),a=n;a=0;)if(0===t.maxRow(r))r--;else{for(var i=0,o=!1;i0&&void 0!==arguments[0]?arguments[0]:{};if("object"!==Do(t))throw new TypeError("options must be an object");var e=t.rows,n=void 0===e?1:e,r=t.columns,i=void 0===r?1:r;if(!Number.isInteger(n)||n<=0)throw new TypeError("rows must be a positive integer");if(!Number.isInteger(i)||i<=0)throw new TypeError("columns must be a positive integer");for(var o=new zo(this.rows*n,this.columns*i),a=0;at&&(t=this.get(e,n));return t}},{key:"maxIndex",value:function(){yo(this);for(var t=this.get(0,0),e=[0,0],n=0;nt&&(t=this.get(n,r),e[0]=n,e[1]=r);return e}},{key:"min",value:function(){if(this.isEmpty())return NaN;for(var t=this.get(0,0),e=0;ee&&(e=this.get(t,n));return e}},{key:"maxRowIndex",value:function(t){so(this,t),yo(this);for(var e=this.get(t,0),n=[t,0],r=1;re&&(e=this.get(t,r),n[1]=r);return n}},{key:"minRow",value:function(t){if(so(this,t),this.isEmpty())return NaN;for(var e=this.get(t,0),n=1;ne&&(e=this.get(n,t));return e}},{key:"maxColumnIndex",value:function(t){uo(this,t),yo(this);for(var e=this.get(0,t),n=[0,t],r=1;re&&(e=this.get(r,t),n[0]=r);return n}},{key:"minColumn",value:function(t){if(uo(this,t),this.isEmpty())return NaN;for(var e=this.get(0,t),n=1;n0&&void 0!==arguments[0]?arguments[0]:"frobenius",e=0;if("max"===t)return this.max();if("frobenius"===t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};if("object"!==Do(t))throw new TypeError("options must be an object");var e=t.min,n=void 0===e?0:e,r=t.max,i=void 0===r?1:r;if(!Number.isFinite(n))throw new TypeError("min must be a number");if(!Number.isFinite(i))throw new TypeError("max must be a number");if(n>=i)throw new RangeError("min must be smaller than max");for(var o=new zo(this.rows,this.columns),a=0;a0&&to(s,{min:n,max:i,output:s}),o.setRow(a,s)}return o}},{key:"scaleColumns",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if("object"!==Do(t))throw new TypeError("options must be an object");var e=t.min,n=void 0===e?0:e,r=t.max,i=void 0===r?1:r;if(!Number.isFinite(n))throw new TypeError("min must be a number");if(!Number.isFinite(i))throw new TypeError("max must be a number");if(n>=i)throw new RangeError("min must be smaller than max");for(var o=new zo(this.rows,this.columns),a=0;a0&&void 0!==arguments[0]?arguments[0]:Go,e=0;e0&&void 0!==arguments[0]?arguments[0]:Go,e=0;en||e<0||e>=this.columns||n<0||n>=this.columns)throw new RangeError("Argument out of range");for(var r=new zo(t.length,n-e+1),i=0;i=this.rows)throw new RangeError("Row index out of range: ".concat(t[i]));r.set(i,o-e,this.get(t[i],o))}return r}},{key:"subMatrixColumn",value:function(t,e,n){if(void 0===e&&(e=0),void 0===n&&(n=this.rows-1),e>n||e<0||e>=this.rows||n<0||n>=this.rows)throw new RangeError("Argument out of range");for(var r=new zo(n-e+1,t.length),i=0;i=this.columns)throw new RangeError("Column index out of range: ".concat(t[i]));r.set(o-e,i,this.get(o,t[i]))}return r}},{key:"setSubMatrix",value:function(t,e,n){if((t=zo.checkMatrix(t)).isEmpty())return this;po(this,e,e+t.rows-1,n,n+t.columns-1);for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{};if("object"===Do(t)&&(e=t,t=void 0),"object"!==Do(e))throw new TypeError("options must be an object");var n=e,r=n.unbiased,i=void 0===r||r,o=n.mean,a=void 0===o?this.mean(t):o;if("boolean"!=typeof i)throw new TypeError("unbiased must be a boolean");switch(t){case"row":if(!Array.isArray(a))throw new TypeError("mean must be an array");return mo(this,i,a);case"column":if(!Array.isArray(a))throw new TypeError("mean must be an array");return bo(this,i,a);case void 0:if("number"!=typeof a)throw new TypeError("mean must be a number");return xo(this,i,a);default:throw new Error("invalid option: ".concat(t))}}},{key:"standardDeviation",value:function(t,e){"object"===Do(t)&&(e=t,t=void 0);var n=this.variance(t,e);if(void 0===t)return Math.sqrt(n);for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{};if("object"===Do(t)&&(e=t,t=void 0),"object"!==Do(e))throw new TypeError("options must be an object");var n=e,r=n.center,i=void 0===r?this.mean(t):r;switch(t){case"row":if(!Array.isArray(i))throw new TypeError("center must be an array");return wo(this,i),this;case"column":if(!Array.isArray(i))throw new TypeError("center must be an array");return So(this,i),this;case void 0:if("number"!=typeof i)throw new TypeError("center must be a number");return Eo(this,i),this;default:throw new Error("invalid option: ".concat(t))}}},{key:"scale",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("object"===Do(t)&&(e=t,t=void 0),"object"!==Do(e))throw new TypeError("options must be an object");var n=e.scale;switch(t){case"row":if(void 0===n)n=_o(this);else if(!Array.isArray(n))throw new TypeError("scale must be an array");return Oo(this,n),this;case"column":if(void 0===n)n=ko(this);else if(!Array.isArray(n))throw new TypeError("scale must be an array");return Mo(this,n),this;case void 0:if(void 0===n)n=Ao(this);else if("number"!=typeof n)throw new TypeError("scale must be a number");return To(this,n),this;default:throw new Error("invalid option: ".concat(t))}}},{key:"toString",value:function(t){return ro(this,t)}}],[{key:"from1DArray",value:function(t,e,n){if(t*e!==n.length)throw new RangeError("data length does not match given dimensions");for(var r=new zo(t,e),i=0;i2&&void 0!==arguments[2]?arguments[2]:{};if("object"!==Do(n))throw new TypeError("options must be an object");for(var r=n.random,i=void 0===r?Math.random:r,o=new zo(t,e),a=0;a2&&void 0!==arguments[2]?arguments[2]:{};if("object"!==Do(n))throw new TypeError("options must be an object");var r=n.min,i=void 0===r?0:r,o=n.max,a=void 0===o?1e3:o,s=n.random,u=void 0===s?Math.random:s;if(!Number.isInteger(i))throw new TypeError("min must be an integer");if(!Number.isInteger(a))throw new TypeError("max must be an integer");if(i>=a)throw new RangeError("min must be smaller than max");for(var c=a-i,f=new zo(t,e),l=0;l=0){if(i.data=[],!(Number.isInteger(r)&&r>=0))throw new TypeError("nColumns must be a positive integer");for(var o=0;o>t);return this},Fo.prototype.signPropagatingRightShiftM=function(t){if(t=Uo.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(var e=0;e>t.get(e,n));return this},Fo.signPropagatingRightShift=function(t,e){return new Uo(t).signPropagatingRightShift(e)},Fo.prototype.rightShift=function(t){return"number"==typeof t?this.rightShiftS(t):this.rightShiftM(t)},Fo.prototype.rightShiftS=function(t){for(var e=0;e>>t);return this},Fo.prototype.rightShiftM=function(t){if(t=Uo.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(var e=0;e>>t.get(e,n));return this},Fo.rightShift=function(t,e){return new Uo(t).rightShift(e)},Fo.prototype.zeroFillRightShift=Fo.prototype.rightShift,Fo.prototype.zeroFillRightShiftS=Fo.prototype.rightShiftS,Fo.prototype.zeroFillRightShiftM=Fo.prototype.rightShiftM,Fo.zeroFillRightShift=Fo.rightShift,Fo.prototype.not=function(){for(var t=0;tMath.abs(e)?(n=e/t,Math.abs(t)*Math.sqrt(1+n*n)):0!==e?(n=t/e,Math.abs(e)*Math.sqrt(1+n*n)):0}function Qo(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function Jo(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if(Qo(this,t),(e=Ko.checkMatrix(e)).isEmpty())throw new Error("Matrix must be non-empty");var r,i=e.rows,o=e.columns,a=n.computeLeftSingularVectors,s=void 0===a||a,u=n.computeRightSingularVectors,c=void 0===u||u,f=n.autoTranspose,l=void 0!==f&&f,h=Boolean(s),d=Boolean(c),p=!1;if(i=0;q--)if(0!==m[q]){for(var K=q+1;K=0;nt--){if(nt0;){var ft=void 0,lt=void 0;for(ft=X-2;ft>=-1&&-1!==ft;ft--){var ht=Number.MIN_VALUE+ct*Math.abs(m[ft]+Math.abs(m[ft+1]));if(Math.abs(w[ft])<=ht||Number.isNaN(w[ft])){w[ft]=0;break}}if(ft===X-2)lt=4;else{var dt=void 0;for(dt=X-1;dt>=ft&&dt!==ft;dt--){var pt=(dt!==X?Math.abs(w[dt]):0)+(dt!==ft+1?Math.abs(w[dt-1]):0);if(Math.abs(m[dt])<=ct*pt){m[dt]=0;break}}dt===ft?lt=3:dt===X-1?lt=1:(lt=2,ft=dt)}switch(ft++,lt){case 1:var gt=w[X-2];w[X-2]=0;for(var vt=X-2;vt>=ft;vt--){var yt=Zo(m[vt],gt),mt=m[vt]/yt,bt=gt/yt;if(m[vt]=yt,vt!==ft&&(gt=-bt*w[vt-1],w[vt-1]=mt*w[vt-1]),d)for(var xt=0;xt=m[ft+1]);){var Xt=m[ft];if(m[ft]=m[ft+1],m[ft+1]=Xt,d&&fte&&i.set(o,a,t.get(o,a)/this.s[a]);for(var s=this.U,u=s.rows,c=s.columns,f=new zo(n,u),l=0;lt&&e++;return e}},{key:"diagonal",get:function(){return Array.from(this.s)}},{key:"threshold",get:function(){return Number.EPSILON/2*Math.max(this.m,this.n)*this.s[0]}},{key:"leftSingularVectors",get:function(){return this.U}},{key:"rightSingularVectors",get:function(){return this.V}},{key:"diagonalMatrix",get:function(){return zo.diag(this.s)}}])&&Jo(e.prototype,n),r&&Jo(e,r),t}();function ta(t,e){for(var n=0;nu?1:-1;c=.01*h,f=.01*h}if(lMath.PI/2&&(f-=Math.PI/2,s*=-1,u*=-1);var l=Math.cos(f)*c;e.x=s*l,e.y=u*l}));var a=this.radii;t.forEach((function(s,u){if(u!==i){var c=Math.sqrt(e[u].x*e[u].x+e[u].y*e[u].y);if(c>0&&u!==i){var f=Math.min(o*(n/800),c);if(s[0]+=e[u].x/c*f,s[1]+=e[u].y/c*f,r){var l=s[0]-t[i][0],h=s[1]-t[i][1],d=Math.sqrt(l*l+h*h);l=l/d*a[u],h=h/d*a[u],s[0]=t[i][0]+l,s[1]=t[i][1]+h}}}}))}}])&&na(e.prototype,n),r&&na(e,r),t}();function ia(t){return(ia="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function oa(t){return function(t){if(Array.isArray(t))return aa(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||function(t,e){if(!t)return;if("string"==typeof t)return aa(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return aa(t,e)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function aa(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);nr[0]?r[0]:v-r[0],b=y-r[1]>r[1]?r[1]:y-r[1];0===m&&(m=v/2),0===b&&(b=y/2);var x=b>m?m:b,w=Math.max.apply(Math,oa(g)),S=[];g.forEach((function(e,n){t.unitRadius||(t.unitRadius=x/w),S[n]=e*t.unitRadius})),t.radii=S;var E=t.eIdealDisMatrix();t.eIdealDistances=E;var _=function(t){for(var e=t.length,n=t[0].length,r=[],i=0;iA[1]?A[0]:A[1])+C(t)}:function(t){return A+C(t)}:function(t){return t.size?Fn(t.size)?(t.size[0]>t.size[1]?t.size[0]:t.size[1])+C(t):t.size+C(t):10+C(t)};var P={nodes:e,nodeSizeFunc:k,adjMatrix:h,positions:O,radii:S,height:y,width:v,strictRadial:T,focusID:l,iterations:t.maxPreventOverlapIteration||200,k:O.length/4.5},j=new ra(P);O=j.layout()}return O.forEach((function(t,n){e[n].x=t[0]+r[0],e[n].y=t[1]+r[1]})),t.onLayoutEnd&&t.onLayoutEnd(),{nodes:e,edges:n}}t.onLayoutEnd&&t.onLayoutEnd()}},{key:"run",value:function(){for(var t=this.maxIteration,e=this.positions||[],n=this.weights||[],r=this.eIdealDistances||[],i=this.radii||[],o=0;o<=t;o++){var a=o/t;this.oneIteration(a,e,i,r,n)}}},{key:"oneIteration",value:function(t,e,n,r,i){var o=1-t,a=this.focusIndex;e.forEach((function(s,u){var c=ha(s,[0,0]),f=0===c?0:1/c;if(u!==a){var l=0,h=0,d=0;e.forEach((function(t,e){if(u!==e){var n=ha(s,t),o=0===n?0:1/n,a=r[e][u];d+=i[u][e],l+=i[u][e]*(t[0]+a*(s[0]-t[0])*o),h+=i[u][e]*(t[1]+a*(s[1]-t[1])*o)}}));var p=0===n[u]?0:1/n[u];d*=o,d+=t*p*p,l*=o,l+=t*p*s[0]*f,s[0]=l/d,h*=o,h+=t*p*s[1]*f,s[1]=h/d}}))}},{key:"eIdealDisMatrix",value:function(){var t=this,e=t.nodes;if(!e)return[];var n=t.distances,r=t.linkDistance,i=t.radii||[],o=t.unitRadius||50,a=[];return n&&n.forEach((function(n,s){var u=[];n.forEach((function(n,a){if(s===a)u.push(0);else if(i[s]===i[a])if("data"===t.sortBy)u.push(n*(Math.abs(s-a)*t.sortStrength)/(i[s]/o));else if(t.sortBy){var c=e[s][t.sortBy]||0,f=e[a][t.sortBy]||0;Bn(c)&&(c=c.charCodeAt(0)),Bn(f)&&(f=f.charCodeAt(0)),u.push(n*(Math.abs(c-f)*t.sortStrength)/(i[s]/o))}else u.push(n*r/(i[s]/o));else{var l=(r+o)/2;u.push(n*l)}})),a.push(u)})),a}},{key:"handleInfinity",value:function(t,e,n){for(var r=t.length,i=0;in?t[e][r]:n);return n}},{key:"getType",value:function(){return"radial"}}])&&sa(e.prototype,n),r&&sa(e,r),o}(Qn);function pa(t){return(pa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function ga(t,e){return(ga=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function va(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,r=ba(t);if(e){var i=ba(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return ya(this,n)}}function ya(t,e){return!e||"object"!==pa(e)&&"function"!=typeof e?ma(t):e}function ma(t){if(void 0===t)throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");return t}function ba(t){return(ba=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}var xa=new Map,wa=function(t,e){if(xa.get(t)&&console.warn("The layout with the name ".concat(t," exists already, it will be overridden")),null!==(r=e)&&"object"===Hn(r)){var n=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&ga(t,e)}(r,t);var n=va(r);function r(t){var i;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,r);var o=ma(i=n.call(this)),a={},s=o.getDefaultCfg();return Object.assign(a,s,e,t),Object.keys(a).forEach((function(t){var e=a[t];o[t]=e})),i}return r}(Qn);xa.set(t,n)}else xa.set(t,e);var r},Sa=function(t){return xa.has(t)?xa.get(t):null};function Ea(t){return(Ea="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function _a(t,e){for(var n=0;n0){var n=Math.abs(l[0][t.sortBy]-e[t.sortBy]);t.maxLevelDiff&&n>=t.maxLevelDiff&&(l=[],f.push(l))}l.push(e)}));var h=o+t.minNodeSpacing;if(!t.preventOverlap){var d=f.length>0&&f[0].length>1,p=(Math.min(t.width,t.height)/2-h)/(f.length+(d?1:0));h=Math.min(h,p)}var g=0;if(f.forEach((function(e){var n=t.sweep;void 0===n&&(n=2*Math.PI-2*Math.PI/e.length);var r=e.dTheta=n/Math.max(1,e.length-1);if(e.length>1&&t.preventOverlap){var i=Math.cos(r)-Math.cos(0),o=Math.sin(r)-Math.sin(0),a=Math.sqrt(h*h/(i*i+o*o));g=Math.max(a,g)}e.r=g,g+=h})),t.equidistant){for(var v=0,y=0,m=0;m0){var r=Math.min(a*(f/800),n);t.x+=o[e].x/n*r,t.y+=o[e].y/n*r}}}))},g=0;go?1:-1;a=.01*c,s=.01*c}var f=n/u;e[i].x+=a*f,e[i].y+=s*f}}))}))}},{key:"calAttractive",value:function(t,e,n){var r=this;t.forEach((function(t){if(t.source&&t.target){var i=r.nodeIdxMap[t.source],o=r.nodeIdxMap[t.target];if(i!==o){var a=r.nodeMap[t.source],s=r.nodeMap[t.target];if(Un(s.x)&&Un(a.x)&&Un(s.y)&&Un(a.y)){var u=s.x-a.x,c=s.y-a.y,f=Math.sqrt(u*u+c*c),l=f*f/n;e[o].x-=u/f*l,e[o].y-=c/f*l,e[i].x+=u/f*l,e[i].y+=c/f*l}}}}))}},{key:"getType",value:function(){return"fruchterman"}}])&&Ba(e.prototype,n),r&&Ba(e,r),o}(Qn),Wa=n(10),Xa=n.n(Wa),Ya=n(6),Ha=n.n(Ya),qa=n(7),Ka=n.n(qa),Za=n(11),Qa=n.n(Za),Ja=(n(28),n(3)),$a=n(5),ts=n(49),es=n.n(ts);function ns(t){return void 0===t?0:t>360||t<-360?t%360:t}function rs(t,e,n){return es()(t)?un.e.fromValues(t,e,n):3===t.length?un.e.clone(t):un.e.fromValues(t[0],t[1],t[2])}var is,os,as,ss,us,cs,fs,ls,hs,ds,ps=function(){function t(e,n){Ha()(this,t),this.name=void 0,this.matrix=void 0,this.right=void 0,this.up=void 0,this.forward=void 0,this.position=void 0,this.focalPoint=void 0,this.distanceVector=void 0,this.distance=void 0,this.dollyingStep=void 0,this.azimuth=0,this.elevation=0,this.roll=0,this.relAzimuth=0,this.relElevation=0,this.relRoll=0,this.name=e,this.matrix=un.b.clone(n.matrix),this.right=un.e.clone(n.right),this.up=un.e.clone(n.up),this.forward=un.e.clone(n.forward),this.position=un.e.clone(n.position),this.focalPoint=un.e.clone(n.focalPoint),this.distanceVector=un.e.clone(n.distanceVector),this.azimuth=n.azimuth,this.elevation=n.elevation,this.roll=n.roll,this.relAzimuth=n.relAzimuth,this.relElevation=n.relElevation,this.relRoll=n.relRoll,this.dollyingStep=n.dollyingStep,this.distance=n.distance}return Ka()(t,[{key:"getPosition",value:function(){return this.position}},{key:"getFocalPoint",value:function(){return this.focalPoint}},{key:"getRoll",value:function(){return this.roll}},{key:"retrieve",value:function(t){t.matrix=un.b.copy(t.matrix,this.matrix),t.right=un.e.copy(t.right,this.right),t.up=un.e.copy(t.up,this.up),t.forward=un.e.copy(t.forward,this.forward),t.position=un.e.copy(t.position,this.position),t.focalPoint=un.e.copy(t.focalPoint,this.focalPoint),t.distanceVector=un.e.copy(t.distanceVector,this.distanceVector),t.azimuth=this.azimuth,t.elevation=this.elevation,t.roll=this.roll,t.relAzimuth=this.relAzimuth,t.relElevation=this.relElevation,t.relRoll=this.relRoll,t.dollyingStep=this.dollyingStep,t.distance=this.distance}}]),t}();!function(t){t.ORBITING="ORBITING",t.EXPLORING="EXPLORING",t.TRACKING="TRACKING"}(ls||(ls={})),function(t){t.DEFAULT="DEFAULT",t.ROTATIONAL="ROTATIONAL",t.TRANSLATIONAL="TRANSLATIONAL",t.CINEMATIC="CINEMATIC"}(hs||(hs={})),function(t){t.ORTHOGRAPHIC="ORTHOGRAPHIC",t.PERSPECTIVE="PERSPECTIVE"}(ds||(ds={}));var gs,vs,ys,ms,bs,xs,ws,Ss,Es,_s,Os,ks,Ms,As,Ts=Math.PI/180,Cs=180/Math.PI,Is=(is=Object($a.injectable)(),os=Object($a.inject)(Ja.IDENTIFIER.InteractorService),is((fs=cs=function(){function t(){Ha()(this,t),this.matrix=un.b.create(),this.right=un.e.fromValues(1,0,0),this.up=un.e.fromValues(0,1,0),this.forward=un.e.fromValues(0,0,1),this.position=un.e.fromValues(0,0,1),this.focalPoint=un.e.fromValues(0,0,0),this.distanceVector=un.e.fromValues(0,0,0),this.distance=1,this.azimuth=0,this.elevation=0,this.roll=0,this.relAzimuth=0,this.relElevation=0,this.relRoll=0,this.dollyingStep=0,this.maxDistance=1/0,this.minDistance=-1/0,this.rotateWorld=!1,Xa()(this,"interactor",us,this),this.fov=30,this.near=.1,this.far=1e4,this.aspect=1,this.left=void 0,this.rright=void 0,this.top=void 0,this.bottom=void 0,this.zoom=1,this.perspective=un.b.create(),this.view=void 0,this.following=void 0,this.type=ls.EXPLORING,this.trackingMode=hs.DEFAULT,this.projectionMode=ds.PERSPECTIVE,this.frustum=new Ja.Frustum,this.landmarks=[],this.landmarkAnimationID=void 0}return Ka()(t,[{key:"clone",value:function(){var e=new t;return e.setType(this.type,void 0),e.interactor=this.interactor,e}},{key:"getProjectionMode",value:function(){return this.projectionMode}},{key:"getPerspective",value:function(){return this.perspective}},{key:"getFrustum",value:function(){return this.frustum}},{key:"getPosition",value:function(){return this.position}},{key:"setType",value:function(t,e){return this.type=t,this.type===ls.EXPLORING?this.setWorldRotation(!0):this.setWorldRotation(!1),this._getAngles(),this.type===ls.TRACKING&&void 0!==e&&this.setTrackingMode(e),this}},{key:"setProjectionMode",value:function(t){return this.projectionMode=t,this}},{key:"setTrackingMode",value:function(t){if(this.type!==ls.TRACKING)throw new Error("Impossible to set a tracking mode if the camera is not of tracking type");return this.trackingMode=t,this}},{key:"setWorldRotation",value:function(t){this.rotateWorld=t,this._getAngles()}},{key:"getViewTransform",value:function(){return un.b.invert(un.b.create(),this.matrix)}},{key:"getWorldTransform",value:function(){return this.matrix}},{key:"setMatrix",value:function(t){return this.matrix=t,this._update(),this}},{key:"setAspect",value:function(t){return this.setPerspective(this.near,this.far,this.fov,t),this}},{key:"setViewOffset",value:function(t,e,n,r,i,o){return this.aspect=t/e,void 0===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=r,this.view.width=i,this.view.height=o,this.projectionMode===ds.PERSPECTIVE?this.setPerspective(this.near,this.far,this.fov,this.aspect):this.setOrthographic(this.left,this.rright,this.top,this.bottom,this.near,this.far),this}},{key:"clearViewOffset",value:function(){return void 0!==this.view&&(this.view.enabled=!1),this.projectionMode===ds.PERSPECTIVE?this.setPerspective(this.near,this.far,this.fov,this.aspect):this.setOrthographic(this.left,this.rright,this.top,this.bottom,this.near,this.far),this}},{key:"setPerspective",value:function(t,e,n,r){return this.projectionMode=ds.PERSPECTIVE,this.fov=n,this.near=t,this.far=e,this.aspect=r,un.b.perspective(this.perspective,this.fov*Ts,this.aspect,this.near,this.far),this}},{key:"setOrthographic",value:function(t,e,n,r,i,o){this.projectionMode=ds.ORTHOGRAPHIC,this.rright=e,this.left=t,this.top=n,this.bottom=r,this.near=i,this.far=o;var a=(this.rright-this.left)/(2*this.zoom),s=(this.top-this.bottom)/(2*this.zoom),u=(this.rright+this.left)/2,c=(this.top+this.bottom)/2,f=u-a,l=u+a,h=c+s,d=c-s;if(void 0!==this.view&&this.view.enabled){var p=(this.rright-this.left)/this.view.fullWidth/this.zoom,g=(this.top-this.bottom)/this.view.fullHeight/this.zoom;l=(f+=p*this.view.offsetX)+p*this.view.width,d=(h-=g*this.view.offsetY)-g*this.view.height}return un.b.ortho(this.perspective,f,l,h,d,i,o),this}},{key:"setPosition",value:function(t,e,n){return this._setPosition(t,e,n),this.setFocalPoint(this.focalPoint),this}},{key:"setFocalPoint",value:function(t,e,n){var r=un.e.fromValues(0,1,0);if(this.focalPoint=rs(t,e,n),this.trackingMode===hs.CINEMATIC){var i=un.e.subtract(un.e.create(),this.focalPoint,this.position);t=i[0],e=i[1],n=i[2];var o=un.e.length(i),a=Math.asin(e/o)*Cs,s=90+Math.atan2(n,t)*Cs,u=un.b.create();un.b.rotateY(u,u,s*Ts),un.b.rotateX(u,u,a*Ts),r=un.e.transformMat4(un.e.create(),[0,1,0],u)}return un.b.invert(this.matrix,un.b.lookAt(un.b.create(),this.position,this.focalPoint,r)),this._getAxes(),this._getDistance(),this._getAngles(),this}},{key:"setDistance",value:function(t){if(!(this.distance===t||t<0)){this.distance=t,this.distance<2e-4&&(this.distance=2e-4),this.dollyingStep=this.distance/100;var e=un.e.create();t=this.distance;var n=this.forward,r=this.focalPoint;return e[0]=t*n[0]+r[0],e[1]=t*n[1]+r[1],e[2]=t*n[2]+r[2],this._setPosition(e),this}}},{key:"setMaxDistance",value:function(t){return this.maxDistance=t,this}},{key:"setMinDistance",value:function(t){return this.minDistance=t,this}},{key:"changeAzimuth",value:function(t){return this.setAzimuth(this.azimuth+t),this}},{key:"changeElevation",value:function(t){return this.setElevation(this.elevation+t),this}},{key:"changeRoll",value:function(t){return this.setRoll(this.roll+t),this}},{key:"setAzimuth",value:function(t){return this.azimuth=ns(t),this.computeMatrix(),this._getAxes(),this.type===ls.ORBITING||this.type===ls.EXPLORING?this._getPosition():this.type===ls.TRACKING&&this._getFocalPoint(),this}},{key:"getAzimuth",value:function(){return this.azimuth}},{key:"setElevation",value:function(t){return this.elevation=ns(t),this.computeMatrix(),this._getAxes(),this.type===ls.ORBITING||this.type===ls.EXPLORING?this._getPosition():this.type===ls.TRACKING&&this._getFocalPoint(),this}},{key:"setRoll",value:function(t){return this.roll=ns(t),this.computeMatrix(),this._getAxes(),this.type===ls.ORBITING||this.type===ls.EXPLORING?this._getPosition():this.type===ls.TRACKING&&this._getFocalPoint(),this}},{key:"rotate",value:function(t,e,n){if(this.type===ls.EXPLORING){t=ns(t),e=ns(e),n=ns(n);var r=un.c.setAxisAngle(un.c.create(),[1,0,0],(this.rotateWorld?1:-1)*e*Ts),i=un.c.setAxisAngle(un.c.create(),[0,1,0],(this.rotateWorld?1:-1)*t*Ts),o=un.c.setAxisAngle(un.c.create(),[0,0,1],n*Ts),a=un.c.multiply(un.c.create(),i,r);a=un.c.multiply(un.c.create(),a,o);var s=un.b.fromQuat(un.b.create(),a);un.b.translate(this.matrix,this.matrix,[0,0,-this.distance]),un.b.multiply(this.matrix,this.matrix,s),un.b.translate(this.matrix,this.matrix,[0,0,this.distance])}else{if(Math.abs(this.elevation+e)>90)return;this.relElevation=ns(e),this.relAzimuth=ns(t),this.relRoll=ns(n),this.elevation+=this.relElevation,this.azimuth+=this.relAzimuth,this.roll+=this.relRoll,this.computeMatrix()}return this._getAxes(),this.type===ls.ORBITING||this.type===ls.EXPLORING?this._getPosition():this.type===ls.TRACKING&&this._getFocalPoint(),this._update(),this}},{key:"pan",value:function(t,e){var n=rs(t,e,0),r=un.e.clone(this.position);return un.e.add(r,r,un.e.scale(un.e.create(),this.right,n[0])),un.e.add(r,r,un.e.scale(un.e.create(),this.up,n[1])),this._setPosition(r),this}},{key:"dolly",value:function(t){var e=this.forward,n=un.e.clone(this.position),r=this.dollyingStep,i=this.distance+t*this.dollyingStep;return r=Math.max(Math.min(i,this.maxDistance),this.minDistance)-this.distance,n[0]+=r*e[0],n[1]+=r*e[1],n[2]+=r*e[2],this._setPosition(n),this.type===ls.ORBITING||this.type===ls.EXPLORING?this._getDistance():this.type===ls.TRACKING&&un.e.add(this.focalPoint,n,this.distanceVector),this}},{key:"createLandmark",value:function(t,e){var n=this.clone();n.setPosition(e.position),n.setFocalPoint(e.focalPoint),void 0!==e.roll&&n.setRoll(e.roll);var r=new ps(t,n);return this.landmarks.push(r),r}},{key:"setLandmark",value:function(t){var e=new ps(t,this);return this.landmarks.push(e),this}},{key:"gotoLandmark",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3,r=this.landmarks.find((function(e){return e.name===t}));if(r){if(0===n)return void r.retrieve(this);void 0!==this.landmarkAnimationID&&window.cancelAnimationFrame(this.landmarkAnimationID),this.interactor.disconnect();var i,o=r.getPosition(),a=r.getFocalPoint(),s=r.getRoll(),u=function t(r){void 0===i&&(i=r);var u,c=r-i,f=(1-Math.cos(c/n*Math.PI))/2,l=un.e.create(),h=un.e.create();if(un.e.lerp(l,e.focalPoint,a,f),un.e.lerp(h,e.position,o,f),u=e.roll*(1-f)+s*f,e.setFocalPoint(l),e.setPosition(h),e.setRoll(u),e.computeMatrix(),!(un.e.dist(l,a)+un.e.dist(h,o)>.01))return e.setFocalPoint(l),e.setPosition(h),e.setRoll(u),e.computeMatrix(),void e.interactor.connect();c0&&void 0!==i[0]?i[0]:1,!this.dirty){t.next=6;break}return this.compiledBundle.context&&(e>1?this.compiledBundle.context.maxIteration=e:this.compiledBundle.context.maxIteration++),t.next=5,this.compile();case 5:this.dirty=!1;case 6:for(this.engine.beginFrame(),this.engine.clear({}),this.compiledBundle.context&&this.compiledBundle.context.uniforms.filter((function(t){return t.isReferer})).forEach((function(t){var e=t.data,n=t.name;r.model.confirmInput(e.model,n)})),n=0;n16)throw new Error("invalid data type ".concat(n));i[e]=function(){return t.data}}}));var o=this.getOuputDataTexture(),a=o.textureWidth,s=o.texelCount;i.u_OutputTextureSize=[a,a],i.u_OutputTexelCount=s,this.context.output.textureSize=[a,a];var u={attributes:{a_Position:[[-1,1,0],[-1,-1,0],[1,1,0],[1,-1,0]],a_TexCoord:[[0,1],[0,0],[1,1],[1,0]]},frag:"#ifdef GL_FRAGMENT_PRECISION_HIGH\\n precision highp float;\\n#else\\n precision mediump float;\\n#endif\\n".concat(this.context.shader),uniforms:i,vert:"attribute vec3 a_Position;\\nattribute vec2 a_TexCoord;\\n\\nvarying vec2 v_TexCoord;\\n\\nvoid main() {\\n gl_Position = vec4(a_Position, 1.0);\\n v_TexCoord = a_TexCoord;\\n}",primitive:"triangle strip",count:4};this.computeCommand=this.reGl(u)}var e;return Ka()(t,[{key:"run",value:function(){var t=this;this.context.maxIteration>1&&this.context.needPingpong&&(this.compiledPingpong=!0),(this.compiledPingpong||this.dynamicPingpong)&&this.swap(),this.texFBO=this.reGl.framebuffer({color:this.getOuputDataTexture().texture}),this.texFBO.use((function(){t.computeCommand()}))}},{key:"readData",value:(e=Rs()(Ds.a.mark((function t(){var e,n,r,i,o,a,s,u,c=this;return Ds.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.reGl({framebuffer:this.texFBO})((function(){e=c.reGl.read()})),!e){t.next=6;break}if(n=this.getOuputDataTexture(),r=n.originalDataLength,i=n.elementsPerTexel,o=n.typedArrayConstructor,a=void 0===o?Float32Array:o,s=[],4!==i)for(u=0;u0){var i=4-r;if(n>1&&n<=i)2===n&&(3===i&&(a+=4,s.push(0)),s.push.apply(s,Zu()(t.data)),u.uniformGPUBufferLayout.push({name:t.name,offset:a}));else{for(var o=0;o2&&void 0!==arguments[2]?arguments[2]:0,r=this.vertexBuffers[t];r&&r.subData({data:e,offset:n})}},{key:"updateUniform",value:function(t,e){var n=this.uniformGPUBufferLayout.find((function(e){return e.name===t}));n&&this.uniformBuffer.subData({data:Number.isFinite(e)?new Float32Array([e]):new Float32Array(e),offset:n.offset})}},{key:"confirmInput",value:function(t,e){var n=this.vertexBuffers[e],r=t.outputBuffer;if(n&&r&&n!==r){var i=this.engine.device.createCommandEncoder(),o=t.context.output,a=o.length*o.typedArrayConstructor.BYTES_PER_ELEMENT;i.copyBufferToBuffer(r.get(),0,n.get(),0,a),(Ja.isSafari?this.engine.device.getQueue():this.engine.device.defaultQueue).submit([i.finish()])}}},{key:"compileShaderToSpirV",value:function(t,e,n){return this.compileRawShaderToSpirV(n+t,e)}},{key:"compileRawShaderToSpirV",value:function(t,e){return this.engine.glslang.compileGLSL(t,e)}},{key:"compileComputePipelineStageDescriptor",value:(e=Rs()(Ds.a.mark((function t(e){var n;return Ds.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n=e,this.engine.options.useWGSL){t.next=6;break}return t.next=5,this.compileShaderToSpirV(e,"compute","#version 450\\n");case 5:n=t.sent;case 6:return t.abrupt("return",{computeStage:{module:this.engine.device.createShaderModule({code:n,isWHLSL:Ja.isSafari}),entryPoint:"main"}});case 7:case"end":return t.stop()}}),t,this)}))),function(t){return e.apply(this,arguments)})}]),t}(),Ic=function(){function t(e,n){Ha()(this,t),this.engine=e,this.options=n,this.indexCount=void 0,this.buffer=void 0;var r=n,i=r.data,o=(r.usage,r.type,r.count);this.indexCount=o||0,this.buffer=new Mc(e,{data:i instanceof Array?new Uint16Array(i):i,usage:Vs.BufferUsage.Index|Vs.BufferUsage.CopyDst})}return Ka()(t,[{key:"get",value:function(){return this.buffer}},{key:"subData",value:function(t){this.buffer.subData(t)}},{key:"destroy",value:function(){this.buffer.destroy()}}]),t}(),Pc=function(){function t(e,n){Ha()(this,t),this.engine=e,this.options=n,this.colorTexture=void 0,this.depthTexture=void 0,this.width=0,this.height=0;var r=n,i=(r.width,r.height,r.color),o=(r.colors,r.depth);r.stencil;i&&(this.colorTexture=i),o&&(this.depthTexture=o)}return Ka()(t,[{key:"get",value:function(){var t,e;return{color:null===(t=this.colorTexture)||void 0===t?void 0:t.get(),depth:null===(e=this.depthTexture)||void 0===e?void 0:e.get()}}},{key:"destroy",value:function(){var t,e;null===(t=this.colorTexture)||void 0===t||t.destroy(),null===(e=this.depthTexture)||void 0===e||e.destroy()}},{key:"resize",value:function(t){var e,n,r=t.width,i=t.height;r===this.width&&i===this.height||(null===(e=this.colorTexture)||void 0===e||e.resize({width:r,height:i}),null===(n=this.depthTexture)||void 0===n||n.resize({width:r,height:i}));this.width=r,this.height=i}}]),t}(),jc=(bc={},Bs()(bc,Ja.gl.POINTS,Vs.PrimitiveTopology.PointList),Bs()(bc,Ja.gl.LINES,Vs.PrimitiveTopology.LineList),Bs()(bc,Ja.gl.LINE_LOOP,Vs.PrimitiveTopology.LineList),Bs()(bc,Ja.gl.LINE_STRIP,Vs.PrimitiveTopology.LineStrip),Bs()(bc,Ja.gl.TRIANGLES,Vs.PrimitiveTopology.TriangleList),Bs()(bc,Ja.gl.TRIANGLE_FAN,Vs.PrimitiveTopology.TriangleList),Bs()(bc,Ja.gl.TRIANGLE_STRIP,Vs.PrimitiveTopology.TriangleStrip),bc),Dc=(xc={},Bs()(xc,Ja.gl.NEVER,Vs.CompareFunction.Never),Bs()(xc,Ja.gl.ALWAYS,Vs.CompareFunction.Always),Bs()(xc,Ja.gl.LESS,Vs.CompareFunction.Less),Bs()(xc,Ja.gl.LEQUAL,Vs.CompareFunction.LessEqual),Bs()(xc,Ja.gl.GREATER,Vs.CompareFunction.Greater),Bs()(xc,Ja.gl.GEQUAL,Vs.CompareFunction.GreaterEqual),Bs()(xc,Ja.gl.EQUAL,Vs.CompareFunction.Equal),Bs()(xc,Ja.gl.NOTEQUAL,Vs.CompareFunction.NotEqual),xc),Nc=(wc={},Bs()(wc,Ja.gl.FUNC_ADD,Vs.BlendOperation.Add),Bs()(wc,Ja.gl.MIN_EXT,Vs.BlendOperation.Min),Bs()(wc,Ja.gl.MAX_EXT,Vs.BlendOperation.Max),Bs()(wc,Ja.gl.FUNC_SUBTRACT,Vs.BlendOperation.Subtract),Bs()(wc,Ja.gl.FUNC_REVERSE_SUBTRACT,Vs.BlendOperation.ReverseSubtract),wc),Rc=(Sc={},Bs()(Sc,Ja.gl.ZERO,Vs.BlendFactor.Zero),Bs()(Sc,Ja.gl.ONE,Vs.BlendFactor.One),Bs()(Sc,Ja.gl.SRC_COLOR,Vs.BlendFactor.SrcColor),Bs()(Sc,Ja.gl.ONE_MINUS_SRC_COLOR,Vs.BlendFactor.OneMinusSrcColor),Bs()(Sc,Ja.gl.SRC_ALPHA,Vs.BlendFactor.SrcAlpha),Bs()(Sc,Ja.gl.ONE_MINUS_SRC_ALPHA,Vs.BlendFactor.OneMinusSrcAlpha),Bs()(Sc,Ja.gl.DST_COLOR,Vs.BlendFactor.DstColor),Bs()(Sc,Ja.gl.ONE_MINUS_DST_COLOR,Vs.BlendFactor.OneMinusDstColor),Bs()(Sc,Ja.gl.DST_ALPHA,Vs.BlendFactor.DstAlpha),Bs()(Sc,Ja.gl.ONE_MINUS_DST_ALPHA,Vs.BlendFactor.OneMinusDstAlpha),Bs()(Sc,Ja.gl.CONSTANT_COLOR,Vs.BlendFactor.BlendColor),Bs()(Sc,Ja.gl.ONE_MINUS_CONSTANT_COLOR,Vs.BlendFactor.OneMinusBlendColor),Bs()(Sc,Ja.gl.SRC_ALPHA_SATURATE,Vs.BlendFactor.SrcAlphaSaturated),Sc),Lc=(Ec={},Bs()(Ec,Ja.gl.ALPHA,"r8unorm"),Bs()(Ec,Ja.gl.RGBA,"rgba8unorm"),Bs()(Ec,Ja.gl.DEPTH_COMPONENT,"depth32float"),Bs()(Ec,Ja.gl.DEPTH_STENCIL,"depth24plus-stencil8"),Ec),Bc=(_c={},Bs()(_c,Ja.gl.NEAREST,"nearest"),Bs()(_c,Ja.gl.LINEAR,"linear"),_c),Gc=(Oc={},Bs()(Oc,Ja.gl.REPEAT,"repeat"),Bs()(Oc,Ja.gl.CLAMP_TO_EDGE,"clamp-to-edge"),Bs()(Oc,Ja.gl.MIRRORED_REPEAT,"mirror-repeat"),Oc);function Fc(t){var e=t.cull;return e&&e.enable?e.face?e.face===Ja.gl.FRONT?Vs.CullMode.Front:Vs.CullMode.Back:void 0:Vs.CullMode.None}function Uc(t){var e=t.depth,n=(t.stencil,{compare:Vs.CompareFunction.Always,depthFailOp:Vs.StencilOperation.Keep,failOp:Vs.StencilOperation.Keep,passOp:Vs.StencilOperation.Keep});return{depthWriteEnabled:e&&e.enable,depthCompare:Dc[(null==e?void 0:e.func)||Ja.gl.ALWAYS],format:Vs.TextureFormat.Depth24PlusStencil8,stencilFront:n,stencilBack:n,stencilReadMask:4294967295,stencilWriteMask:4294967295}}function zc(t,e){var n=t.blend;return[{format:e,alphaBlend:{srcFactor:Rc[n&&n.func&&n.func.srcAlpha||Ja.gl.ONE],dstFactor:Rc[n&&n.func&&n.func.dstAlpha||Ja.gl.ZERO],operation:Nc[n&&n.equation&&n.equation.alpha||Ja.gl.FUNC_ADD]},colorBlend:{srcFactor:Rc[n&&n.func&&n.func.srcRGB||Ja.gl.ONE],dstFactor:Rc[n&&n.func&&n.func.dstRGB||Ja.gl.ZERO],operation:Nc[n&&n.equation&&n.equation.rgb||Ja.gl.FUNC_ADD]},writeMask:Vs.ColorWrite.All}]}function Vc(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function Wc(t){for(var e=1;e1?n-1:0),i=1;i3&&void 0!==arguments[3]&&arguments[3],s=null===(r=t.get().color)||void 0===r?void 0:r.texture;s&&(o=s.createView(this.currentRenderTargetViewDescriptor));var u,c=null===(i=t.get().depth)||void 0===i?void 0:i.texture;c&&(u=c.createView());var f=this.renderTargetEncoder.beginRenderPass({colorAttachments:[{attachment:o,loadValue:null!==e?e:Vs.LoadOp.Load,storeOp:Vs.StoreOp.Store}],depthStencilAttachment:c&&u?{attachment:u,depthLoadValue:n?this.clearDepthValue:Vs.LoadOp.Load,depthStoreOp:Vs.StoreOp.Store,stencilLoadValue:a?this.clearStencilValue:Vs.LoadOp.Load,stencilStoreOp:Vs.StoreOp.Store}:void 0});this.currentRenderPass=f,this.cachedViewport&&this.viewport(this.cachedViewport)}},{key:"endMainRenderPass",value:function(){this.currentRenderPass===this.mainRenderPass&&null!==this.currentRenderPass&&(this.currentRenderPass.endPass(),this.resetCachedViewport(),this.currentRenderPass=null,this.mainRenderPass=null)}},{key:"endComputePass",value:function(){this.currentComputePass&&(this.currentComputePass.endPass(),this.currentComputePass=null)}},{key:"endRenderTargetRenderPass",value:function(){this.currentRenderPass&&(this.currentRenderPass.endPass(),this.resetCachedViewport())}},{key:"resetCachedViewport",value:function(){this.cachedViewport={x:0,y:0,width:0,height:0}}},{key:"unbindFramebuffer",value:function(t){this.currentRenderPass&&this.currentRenderPass!==this.mainRenderPass&&this.endRenderTargetRenderPass(),this.transientViewport.x=1/0,this.currentRenderTarget=null,this.currentRenderPass=this.mainRenderPass}}]),t}())||Yc,Qc=n(62),Jc=n.n(Qc),$c=n(23),tf=n.n($c),ef=n(24),nf=n.n(ef),rf=n(17),of=n.n(rf);function af(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,r=of()(t);if(e){var i=of()(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return nf()(this,n)}}var sf,uf=Object($a.injectable)()(Hc=function(t){tf()(n,t);var e=af(n);function n(){return Ha()(this,n),e.apply(this,arguments)}return Ka()(n,[{key:"onEntityCreated",value:function(){var t=this.config,e=t.widthSegments,n=void 0===e?1:e,r=t.heightSegments,i=void 0===r?1:r,o=t.depthSegments,a=void 0===o?1:o,s=t.halfExtents,u=void 0===s?un.e.fromValues(.5,.5,.5):s,c=n,f=i,l=a,h=Jc()(u,3),d=h[0],p=h[1],g=h[2],v=[un.e.fromValues(-d,-p,g),un.e.fromValues(d,-p,g),un.e.fromValues(d,p,g),un.e.fromValues(-d,p,g),un.e.fromValues(d,-p,-g),un.e.fromValues(-d,-p,-g),un.e.fromValues(-d,p,-g),un.e.fromValues(d,p,-g)],y=[[0,1,3],[4,5,7],[3,2,6],[1,0,4],[1,4,2],[5,0,6]],m=[[0,0,1],[0,0,-1],[0,1,0],[0,-1,0],[1,0,0],[-1,0,0]],b=1,x=2,w=3,S=4,E=5,_=[],O=[],k=[],M=[],A=[],T=0,C=function(t,e,n){var r,i,o,a;for(o=0;o<=e;o++)for(a=0;a<=n;a++){var s=un.e.create(),u=un.e.create(),c=un.e.create(),f=un.e.create();un.e.lerp(s,v[y[t][0]],v[y[t][1]],o/e),un.e.lerp(u,v[y[t][0]],v[y[t][2]],a/n),un.e.sub(c,u,v[y[t][0]]),un.e.add(f,s,c),r=o/e,i=a/n,_.push(f[0],f[1],f[2]),O.push(m[t][0],m[t][1],m[t][2]),k.push(r,i),r=.875*(r/=3)+4/64,i=.875*(i/=3)+4/64,r+=t%3/3,i+=Math.floor(t/3)/3,M.push(r,i),o 0.1) {\\n // gl_FragColor = mix(gl_FragColor, u_GridColor, v0);\\n // }\\n // else {\\n gl_FragColor = mix(gl_FragColor, u_GridColor2, v1);\\n // }\\n }\\n\\n // float shadowFactor = calcShadow(u_ShadowMap, v_PositionFromLight, l, n);\\n // vec3 diffuseColor = u_LightColor * NdotL * shadowFactor;\\n\\n // gl_FragColor.rgb *= diffuseColor;\\n}"});var t=this.shaderModuleService.getModule("grid"),e=t.vs,n=t.fs,r=t.uniforms,i=this.materialSystem.createShaderMaterial({vertexShader:e,fragmentShader:n});this.setMaterial(i);var o=this.geometrySystem.createBufferGeometry({vertexCount:4});this.setGeometry(o),i.setCull({enable:!1,face:Ja.gl.BACK}).setDepth({enable:!0,func:Ja.gl.LESS}),i.setUniform(r),this.setAttributes({gridColor:this.config.gridColor,gridSize:this.config.gridSize}),o.setIndex([0,3,2,2,1,0]),o.setAttribute("a_Position",Float32Array.from([-4,-1,-4,4,-1,-4,4,-1,4,-4,-1,4]),{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,offset:0,format:"float2"}]})}}]),n}(Cu),Nf=Qa()(Df.prototype,"materialSystem",[Af,Tf],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Rf=Qa()(Df.prototype,"geometrySystem",[Cf,If],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Lf=Qa()(Df.prototype,"shaderModuleService",[Pf],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),jf=Df))||jf),Uf=n(96),zf=n(64);function Vf(t,e,n,r,i){Wf(e,r,-i),Wf(e,r,i),t.push(n),t.push(n)}function Wf(t,e,n){t.push([[e[0],e[1]],n])}var Xf,Yf,Hf,qf,Kf,Zf,Qf,Jf,$f,tl,el;function nl(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,r=of()(t);if(e){var i=of()(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return nf()(this,n)}}var rl,il,ol,al,sl,ul,cl,fl,ll,hl,dl,pl=(Xf=Object($a.injectable)(),Yf=Object($a.inject)(Ja.IDENTIFIER.Systems),Hf=Object($a.named)(Ja.IDENTIFIER.MaterialSystem),qf=Object($a.inject)(Ja.IDENTIFIER.Systems),Kf=Object($a.named)(Ja.IDENTIFIER.GeometrySystem),Zf=Object($a.inject)(Ja.IDENTIFIER.ShaderModuleService),Xf((Jf=function(t){tf()(n,t);var e=nl(n);function n(){var t;Ha()(this,n);for(var r=arguments.length,i=new Array(r),o=0;o3;if(!isFinite(S)){Object(zf.normal)(c,r),Vf(d,h,x,c,1),p.push(1===s?[m,m+2,m+3]:[m+2,m+1,m+3]),l+=2,s=E;continue}_?(S=3,g.push(y/v),Wf(h,c,-E),d.push(x),Wf(h,a,S*E),d.push(x),p.push(s!==-E?[m,m+2,m+3]:[m+2,m+1,m+3]),p.push([m+2,m+3,m+4]),Object(zf.normal)(f,i),Object(Uf.copy)(c,f),Wf(h,c,-E),d.push(x),l+=3):(Vf(d,h,x,a,S),p.push(1===s?[m,m+2,m+3]:[m+2,m+1,m+3]),E=-1,Object(Uf.copy)(c,a),l+=2),s=E}else Object(zf.normal)(c,r),Vf(d,h,x,c,1),p.push(1===s?[m,m+2,m+3]:[m+2,m+1,m+3]),l+=2}return{normals:h,attrIndex:p,attrPos:d,attrCounters:g}}(this.config.points,!1),s=a.normals,u=a.attrIndex,c=a.attrPos,f=a.attrCounters,l=c.length;this.vertexCount=l;var h=this.geometrySystem.createBufferGeometry({vertexCount:l});this.setMaterial(o),this.setGeometry(h),o.setCull({enable:!1,face:Ja.gl.BACK}).setUniform(i),this.setAttributes({dashArray:this.config.dashArray,dashOffset:this.config.dashOffset,dashRatio:this.config.dashRatio,thickness:this.config.thickness});var d=[],p=[];s.forEach((function(t){var e=t[0],n=t[1];d.push([e[0],e[1]]),p.push(n)})),h.setIndex(u.reduce((function(t,e){return[].concat(Zu()(t),Zu()(e))}),[])),h.setAttribute("a_pos",Float32Array.from(c.reduce((function(t,e){return[].concat(Zu()(t),Zu()(e))}),[])),{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,offset:0,format:"float2"}]});var g=new Array(l).fill(void 0).map((function(){return Zu()(t.config.color)})).reduce((function(t,e){return[].concat(Zu()(t),Zu()(e))}),[]);h.setAttribute("a_color",Float32Array.from(g),{arrayStride:16,stepMode:"vertex",attributes:[{shaderLocation:1,offset:0,format:"float4"}]}),h.setAttribute("a_line_miter",Float32Array.from(p),{arrayStride:4,stepMode:"vertex",attributes:[{shaderLocation:2,offset:0,format:"float"}]}),h.setAttribute("a_line_normal",Float32Array.from(d.reduce((function(t,e){return[].concat(Zu()(t),Zu()(e))}),[])),{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:3,offset:0,format:"float2"}]}),h.setAttribute("a_counters",Float32Array.from(f),{arrayStride:4,stepMode:"vertex",attributes:[{shaderLocation:4,offset:0,format:"float"}]})}}]),n}(Cu),$f=Qa()(Jf.prototype,"materialSystem",[Yf,Hf],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),tl=Qa()(Jf.prototype,"geometrySystem",[qf,Kf],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),el=Qa()(Jf.prototype,"shaderModuleService",[Zf],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Qf=Jf))||Qf);function gl(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function vl(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,r=of()(t);if(e){var i=of()(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return nf()(this,n)}}var yl,ml,bl,xl,wl,Sl,El,_l,Ol,kl=["circle","triangle","square","pentagon","hexagon","octogon","hexagram","rhombus","vesica"],Ml=(rl=Object($a.injectable)(),il=Object($a.inject)(Ja.IDENTIFIER.Systems),ol=Object($a.named)(Ja.IDENTIFIER.MaterialSystem),al=Object($a.inject)(Ja.IDENTIFIER.Systems),sl=Object($a.named)(Ja.IDENTIFIER.GeometrySystem),ul=Object($a.inject)(Ja.IDENTIFIER.ShaderModuleService),rl((fl=function(t){tf()(n,t);var e=vl(n);function n(){var t;Ha()(this,n);for(var r=arguments.length,i=new Array(r),o=0;o>8&255,s+1>>8>>8&255])),e.instancedShapes.push(kl.indexOf(t.shape||"circle")),(i=e.instancedColors).push.apply(i,Zu()(t.color||[1,0,0,1])),(o=e.instancedOffsets).push.apply(o,Zu()(t.position||[0,0])),(a=e.instancedSizes).push.apply(a,Zu()(t.size||[.2,.2]))}},{key:"buildAttributes",value:function(){var t=this,e={positions:[1,1,1,-1,-1,-1,-1,1],instancedOffsets:[],instancedColors:[],instancedSizes:[],instancedShapes:[],instancedPickingColors:[]};return Array.isArray(this.config)?this.config.forEach((function(n,r){t.buildAttribute(n,e,r)})):this.buildAttribute(this.config,e,0),e}}]),n}(Cu),ll=Qa()(fl.prototype,"materialSystem",[il,ol],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),hl=Qa()(fl.prototype,"geometrySystem",[al,sl],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),dl=Qa()(fl.prototype,"shaderModuleService",[ul],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),cl=fl))||cl);function Al(t,e){var n;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return Tl(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Tl(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,o=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw o}}}}function Tl(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n0&&void 0!==arguments[0]?arguments[0]:{},n=Object(Ja.createWorldContainer)(),r=navigator.gpu?Zc:pc;n.isBound(Ja.IDENTIFIER.RenderEngine)||n.bind(Ja.IDENTIFIER.RenderEngine).to(r).inSingletonScope(),n.bind(Gl).toSelf(),n.bind(Au).toSelf(),n.bind(Cu).toSelf(),n.bind(nh).toSelf(),n.bind(Is).toSelf(),n.bind(Fl).toSelf(),n.bind(t).toSelf(),n.bind(Ul).toSelf(),n.bind(eh).toSelf(),n.bind(Ja.IDENTIFIER.Geometry).to(uf).whenTargetNamed(Ps.BOX),n.bind(Ja.IDENTIFIER.Geometry).to(Ef).whenTargetNamed(Ps.SPHERE),n.bind(Ja.IDENTIFIER.Geometry).to(pf).whenTargetNamed(Ps.PLANE),n.bind(Ja.IDENTIFIER.Geometry).to(lf).whenTargetNamed(Ps.MERGED),n.bind(Ja.IDENTIFIER.Material).to(Bf).whenTargetNamed(Tu.BASIC),n.bind(Ja.IDENTIFIER.Renderable).to(Ml).whenTargetNamed(Cu.POINT),n.bind(Ja.IDENTIFIER.Renderable).to(pl).whenTargetNamed(Cu.LINE),n.bind(Ja.IDENTIFIER.Renderable).to(Ff).whenTargetNamed(Cu.GRID);var i=n.get(t);return i.setContainer(n),i.setConfig(e),i}}]),t}(),th=Qa()($l.prototype,"configService",[Ql],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Jl=$l))||Jl),ah=function(t,e){return t?Un(t)?function(){return t}:t:function(){return e||1}},sh=function(t,e){var n=[],r=[],i={},o=0;for(o=0;o = vec4(0.0);\\\\n\\\\n[[builtin global_invocation_id]] var globalInvocationID : vec3;\\\\n# [[builtin work_group_size]] var workGroupSize : vec3;\\\\n# [[builtin work_group_id]] var workGroupID : vec3;\\\\n[[builtin local_invocation_id]] var localInvocationID : vec3;\\\\n# [[builtin num_work_groups]] var numWorkGroups : vec3;\\\\n[[builtin local_invocation_idx]] var localInvocationIndex : u32;\\\\n\\\\ntype GWebGPUParams = [[block]] struct {\\\\n [[offset 0]] u_K : f32;\\\\n [[offset 4]] u_K2 : f32;\\\\n [[offset 8]] u_Center : vec2;\\\\n [[offset 16]] u_Gravity : f32;\\\\n [[offset 20]] u_ClusterGravity : f32;\\\\n [[offset 24]] u_Speed : f32;\\\\n [[offset 28]] u_MaxDisplace : f32;\\\\n [[offset 32]] u_Clustering : f32;\\\\n};\\\\n[[binding 0, set 0]] var gWebGPUUniformParams : GWebGPUParams;\\\\ntype GWebGPUBuffer0 = [[block]] struct {\\\\n [[offset 0]] u_Data : [[stride 16]] array>;\\\\n};\\\\n[[binding 1, set 0]] var gWebGPUBuffer0 : GWebGPUBuffer0;\\\\ntype GWebGPUBuffer1 = [[block]] struct {\\\\n [[offset 0]] u_AttributeArray : [[stride 16]] array>;\\\\n};\\\\n[[binding 2, set 0]] var gWebGPUBuffer1 : GWebGPUBuffer1;\\\\ntype GWebGPUBuffer2 = [[block]] struct {\\\\n [[offset 0]] u_ClusterCenters : [[stride 16]] array>;\\\\n};\\\\n[[binding 3, set 0]] var gWebGPUBuffer2 : GWebGPUBuffer2;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nfn calcRepulsive(i : i32, currentNode : vec4) -> vec2 {var dx : f32 = 0.0;\\\\nvar dy : f32 = 0.0;\\\\nfor (var j : i32 = 0; j < __DefineValuePlaceholder__VERTEX_COUNT; j = j + 1) {if (i != j) {var nextNode : vec4 = gWebGPUBuffer0.u_Data[j];\\\\nvar xDist : f32 = currentNode.x - nextNode.x;\\\\nvar yDist : f32 = currentNode.y - nextNode.y;\\\\nvar dist : f32 = ((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nvar param : f32 = gWebGPUUniformParams.u_K2 / dist;\\\\nif (dist > 0.0) {dx = dx + param * xDist;\\\\ndy = dy + param * yDist;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {var sign : f32 = select(1.0, -1.0, i < j);\\\\ndx = dx + param * std::sign;\\\\ndy = dy + param * std::sign;}}}}\\\\nreturn vec2(dx, dy);}\\\\nfn calcGravity(currentNode : vec4, nodeAttributes : vec4) -> vec2 {var dx : f32 = 0.0;\\\\nvar dy : f32 = 0.0;\\\\nvar vx : f32 = currentNode.x - gWebGPUUniformParams.u_Center.x;\\\\nvar vy : f32 = currentNode.y - gWebGPUUniformParams.u_Center.y;\\\\nvar gf : f32 = (0.01 * gWebGPUUniformParams.u_K) * gWebGPUUniformParams.u_Gravity;\\\\ndx = gf * vx;\\\\ndy = gf * vy;\\\\nif (gWebGPUUniformParams.u_Clustering == 1.0) {var clusterIdx : i32 = i32(nodeAttributes.x);\\\\nvar center : vec4 = gWebGPUBuffer2.u_ClusterCenters[clusterIdx];\\\\nvar cvx : f32 = currentNode.x - center.x;\\\\nvar cvy : f32 = currentNode.y - center.y;\\\\nvar dist : f32 = std::sqrt((cvx * cvx) + (cvy * cvy)) + 0.01;\\\\nvar parma : f32 = (gWebGPUUniformParams.u_K * gWebGPUUniformParams.u_ClusterGravity) / dist;\\\\ndx = dx + parma * cvx;\\\\ndy = dy + parma * cvy;}\\\\nreturn vec2(dx, dy);}\\\\nfn calcAttractive(i : i32, currentNode : vec4) -> vec2 {var dx : f32 = 0.0;\\\\nvar dy : f32 = 0.0;\\\\nvar arr_offset : i32 = i32(std::floor(currentNode.z + 0.5));\\\\nvar length : i32 = i32(std::floor(currentNode.w + 0.5));\\\\nvar node_buffer : vec4;\\\\nfor (var p : i32 = 0; p < __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX; p = p + 1) {if (p >= length) {break;}\\\\nvar arr_idx : i32 = arr_offset + i32(p);\\\\nvar buf_offset : i32 = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = gWebGPUBuffer0.u_Data[i32(arr_idx / 4)];}\\\\nvar float_j : f32 = select(node_buffer.x, select(node_buffer.y, select(node_buffer.z, node_buffer.w, buf_offset == 2), buf_offset == 1), buf_offset == 0);\\\\nvar nextNode : vec4 = gWebGPUBuffer0.u_Data[i32(float_j)];\\\\nvar xDist : f32 = currentNode.x - nextNode.x;\\\\nvar yDist : f32 = currentNode.y - nextNode.y;\\\\nvar dist : f32 = std::sqrt((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nvar attractiveF : f32 = dist / gWebGPUUniformParams.u_K;\\\\nif (dist > 0.0) {dx = dx - xDist * attractiveF;\\\\ndy = dy - yDist * attractiveF;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {var sign : f32 = select(1.0, -1.0, i < i32(float_j));\\\\ndx = dx - std::sign * attractiveF;\\\\ndy = dy - std::sign * attractiveF;}}}\\\\nreturn vec2(dx, dy);}\\\\nfn main() -> void {var i : i32 = globalInvocationID.x;\\\\nvar currentNode : vec4 = gWebGPUBuffer0.u_Data[i];\\\\nvar dx : f32 = 0.0;\\\\nvar dy : f32 = 0.0;\\\\nif (i >= __DefineValuePlaceholder__VERTEX_COUNT) {gWebGPUBuffer0.u_Data[i] = currentNode;\\\\nreturn ;}\\\\nvar repulsive : vec2 = calcRepulsive(i, currentNode);\\\\ndx = dx + repulsive.x;\\\\ndy = dy + repulsive.y;\\\\nvar attractive : vec2 = calcAttractive(i, currentNode);\\\\ndx = dx + attractive.x;\\\\ndy = dy + attractive.y;\\\\nvar nodeAttributes : vec4 = gWebGPUBuffer1.u_AttributeArray[i];\\\\nvar gravity : vec2 = calcGravity(currentNode, nodeAttributes);\\\\ndx = dx - gravity.x;\\\\ndy = dy - gravity.y;\\\\ndx = dx * gWebGPUUniformParams.u_Speed;\\\\ndy = dy * gWebGPUUniformParams.u_Speed;\\\\nvar distLength : f32 = std::sqrt((dx * dx) + (dy * dy));\\\\nif (distLength > 0.0) {var limitedDist : f32 = std::min(gWebGPUUniformParams.u_MaxDisplace * gWebGPUUniformParams.u_Speed, distLength);\\\\ngWebGPUBuffer0.u_Data[i] = vec4(currentNode.x + ((dx / distLength) * limitedDist), currentNode.y + ((dy / distLength) * limitedDist), currentNode.z, currentNode.w);}\\\\nreturn;}\\\\n\\\\nentry_point compute as \\\\"main\\\\" = main;\\\\n","GLSL450":"\\\\n\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\nivec3 globalInvocationID = ivec3(gl_GlobalInvocationID);\\\\nivec3 workGroupSize = ivec3(1,1,1);\\\\nivec3 workGroupID = ivec3(gl_WorkGroupID);\\\\nivec3 localInvocationID = ivec3(gl_LocalInvocationID);\\\\nivec3 numWorkGroups = ivec3(gl_NumWorkGroups);\\\\nint localInvocationIndex = int(gl_LocalInvocationIndex);\\\\n\\\\nlayout(std140, set = 0, binding = 0) uniform GWebGPUParams {\\\\n float u_K;\\\\n float u_K2;\\\\n vec2 u_Center;\\\\n float u_Gravity;\\\\n float u_ClusterGravity;\\\\n float u_Speed;\\\\n float u_MaxDisplace;\\\\n float u_Clustering;\\\\n} gWebGPUUniformParams;\\\\nlayout(std430, set = 0, binding = 1) buffer GWebGPUBuffer0 {\\\\n vec4 u_Data[];\\\\n} gWebGPUBuffer0;\\\\n\\\\nlayout(std430, set = 0, binding = 2) buffer readonly GWebGPUBuffer1 {\\\\n vec4 u_AttributeArray[];\\\\n} gWebGPUBuffer1;\\\\n\\\\nlayout(std430, set = 0, binding = 3) buffer readonly GWebGPUBuffer2 {\\\\n vec4 u_ClusterCenters[];\\\\n} gWebGPUBuffer2;\\\\n\\\\n\\\\n\\\\n#define MAX_EDGE_PER_VERTEX __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\nlayout (\\\\n local_size_x = 1,\\\\n local_size_y = 1,\\\\n local_size_z = 1\\\\n) in;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nvec2 calcRepulsive(int i, vec4 currentNode) {float dx = 0.0;\\\\nfloat dy = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {if (i != j) {vec4 nextNode = gWebGPUBuffer0.u_Data[j];\\\\nfloat xDist = currentNode.x - nextNode.x;\\\\nfloat yDist = currentNode.y - nextNode.y;\\\\nfloat dist = ((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nfloat param = gWebGPUUniformParams.u_K2 / dist;\\\\nif (dist > 0.0) {dx += param * xDist;\\\\ndy += param * yDist;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {float sign = (i < j) ? (1.0) : (-1.0);\\\\ndx += param * sign;\\\\ndy += param * sign;}}}}\\\\nreturn vec2(dx, dy);}\\\\nvec2 calcGravity(vec4 currentNode, vec4 nodeAttributes) {float dx = 0.0;\\\\nfloat dy = 0.0;\\\\nfloat vx = currentNode.x - gWebGPUUniformParams.u_Center.x;\\\\nfloat vy = currentNode.y - gWebGPUUniformParams.u_Center.y;\\\\nfloat gf = (0.01 * gWebGPUUniformParams.u_K) * gWebGPUUniformParams.u_Gravity;\\\\ndx = gf * vx;\\\\ndy = gf * vy;\\\\nif (gWebGPUUniformParams.u_Clustering == 1.0) {int clusterIdx = int(nodeAttributes.x);\\\\nvec4 center = gWebGPUBuffer2.u_ClusterCenters[clusterIdx];\\\\nfloat cvx = currentNode.x - center.x;\\\\nfloat cvy = currentNode.y - center.y;\\\\nfloat dist = sqrt((cvx * cvx) + (cvy * cvy)) + 0.01;\\\\nfloat parma = (gWebGPUUniformParams.u_K * gWebGPUUniformParams.u_ClusterGravity) / dist;\\\\ndx += parma * cvx;\\\\ndy += parma * cvy;}\\\\nreturn vec2(dx, dy);}\\\\nvec2 calcAttractive(int i, vec4 currentNode) {float dx = 0.0;\\\\nfloat dy = 0.0;\\\\nint arr_offset = int(floor(currentNode.z + 0.5));\\\\nint length = int(floor(currentNode.w + 0.5));\\\\nvec4 node_buffer;\\\\nfor (int p = 0; p < MAX_EDGE_PER_VERTEX; p++) {if (p >= length) {break;}\\\\nint arr_idx = arr_offset + int(p);\\\\nint buf_offset = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = gWebGPUBuffer0.u_Data[int(arr_idx / 4)];}\\\\nfloat float_j = (buf_offset == 0) ? (node_buffer.x) : ((buf_offset == 1) ? (node_buffer.y) : ((buf_offset == 2) ? (node_buffer.z) : (node_buffer.w)));\\\\nvec4 nextNode = gWebGPUBuffer0.u_Data[int(float_j)];\\\\nfloat xDist = currentNode.x - nextNode.x;\\\\nfloat yDist = currentNode.y - nextNode.y;\\\\nfloat dist = sqrt((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nfloat attractiveF = dist / gWebGPUUniformParams.u_K;\\\\nif (dist > 0.0) {dx -= xDist * attractiveF;\\\\ndy -= yDist * attractiveF;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {float sign = (i < int(float_j)) ? (1.0) : (-1.0);\\\\ndx -= sign * attractiveF;\\\\ndy -= sign * attractiveF;}}}\\\\nreturn vec2(dx, dy);}\\\\nvoid main() {int i = globalInvocationID.x;\\\\nvec4 currentNode = gWebGPUBuffer0.u_Data[i];\\\\nfloat dx = 0.0;\\\\nfloat dy = 0.0;\\\\nif (i >= VERTEX_COUNT) {gWebGPUBuffer0.u_Data[i] = currentNode;\\\\nreturn ;}\\\\nvec2 repulsive = calcRepulsive(i, currentNode);\\\\ndx += repulsive.x;\\\\ndy += repulsive.y;\\\\nvec2 attractive = calcAttractive(i, currentNode);\\\\ndx += attractive.x;\\\\ndy += attractive.y;\\\\nvec4 nodeAttributes = gWebGPUBuffer1.u_AttributeArray[i];\\\\nvec2 gravity = calcGravity(currentNode, nodeAttributes);\\\\ndx -= gravity.x;\\\\ndy -= gravity.y;\\\\ndx *= gWebGPUUniformParams.u_Speed;\\\\ndy *= gWebGPUUniformParams.u_Speed;\\\\nfloat distLength = sqrt((dx * dx) + (dy * dy));\\\\nif (distLength > 0.0) {float limitedDist = min(gWebGPUUniformParams.u_MaxDisplace * gWebGPUUniformParams.u_Speed, distLength);\\\\ngWebGPUBuffer0.u_Data[i] = vec4(currentNode.x + ((dx / distLength) * limitedDist), currentNode.y + ((dy / distLength) * limitedDist), currentNode.z, currentNode.w);}}\\\\n","GLSL100":"\\\\n\\\\nfloat epsilon = 0.00001;\\\\nvec2 addrTranslation_1Dto2D(float address1D, vec2 texSize) {\\\\n vec2 conv_const = vec2(1.0 / texSize.x, 1.0 / (texSize.x * texSize.y));\\\\n vec2 normAddr2D = float(address1D) * conv_const;\\\\n return vec2(fract(normAddr2D.x + epsilon), normAddr2D.y);\\\\n}\\\\n\\\\nvoid barrier() {}\\\\n \\\\n\\\\nuniform vec2 u_OutputTextureSize;\\\\nuniform int u_OutputTexelCount;\\\\nvarying vec2 v_TexCoord;\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\n#define MAX_EDGE_PER_VERTEX __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n\\\\nuniform sampler2D u_Data;\\\\nuniform vec2 u_DataSize;\\\\nvec4 getDatau_Data(vec2 address2D) {\\\\n return vec4(texture2D(u_Data, address2D).rgba);\\\\n}\\\\nvec4 getDatau_Data(float address1D) {\\\\n return getDatau_Data(addrTranslation_1Dto2D(address1D, u_DataSize));\\\\n}\\\\nvec4 getDatau_Data(int address1D) {\\\\n return getDatau_Data(float(address1D));\\\\n}\\\\nuniform float u_K;\\\\nuniform float u_K2;\\\\nuniform vec2 u_Center;\\\\nuniform float u_Gravity;\\\\nuniform float u_ClusterGravity;\\\\nuniform float u_Speed;\\\\nuniform float u_MaxDisplace;\\\\nuniform float u_Clustering;\\\\nuniform sampler2D u_AttributeArray;\\\\nuniform vec2 u_AttributeArraySize;\\\\nvec4 getDatau_AttributeArray(vec2 address2D) {\\\\n return vec4(texture2D(u_AttributeArray, address2D).rgba);\\\\n}\\\\nvec4 getDatau_AttributeArray(float address1D) {\\\\n return getDatau_AttributeArray(addrTranslation_1Dto2D(address1D, u_AttributeArraySize));\\\\n}\\\\nvec4 getDatau_AttributeArray(int address1D) {\\\\n return getDatau_AttributeArray(float(address1D));\\\\n}\\\\nuniform sampler2D u_ClusterCenters;\\\\nuniform vec2 u_ClusterCentersSize;\\\\nvec4 getDatau_ClusterCenters(vec2 address2D) {\\\\n return vec4(texture2D(u_ClusterCenters, address2D).rgba);\\\\n}\\\\nvec4 getDatau_ClusterCenters(float address1D) {\\\\n return getDatau_ClusterCenters(addrTranslation_1Dto2D(address1D, u_ClusterCentersSize));\\\\n}\\\\nvec4 getDatau_ClusterCenters(int address1D) {\\\\n return getDatau_ClusterCenters(float(address1D));\\\\n}\\\\nvec2 calcRepulsive(int i, vec4 currentNode) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat dx = 0.0;\\\\nfloat dy = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {if (i != j) {vec4 nextNode = getDatau_Data(j);\\\\nfloat xDist = currentNode.x - nextNode.x;\\\\nfloat yDist = currentNode.y - nextNode.y;\\\\nfloat dist = ((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nfloat param = u_K2 / dist;\\\\nif (dist > 0.0) {dx += param * xDist;\\\\ndy += param * yDist;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {float sign = (i < j) ? (1.0) : (-1.0);\\\\ndx += param * sign;\\\\ndy += param * sign;}}}}\\\\nreturn vec2(dx, dy);}\\\\nvec2 calcGravity(vec4 currentNode, vec4 nodeAttributes) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat dx = 0.0;\\\\nfloat dy = 0.0;\\\\nfloat vx = currentNode.x - u_Center.x;\\\\nfloat vy = currentNode.y - u_Center.y;\\\\nfloat gf = (0.01 * u_K) * u_Gravity;\\\\ndx = gf * vx;\\\\ndy = gf * vy;\\\\nif (u_Clustering == 1.0) {int clusterIdx = int(nodeAttributes.x);\\\\nvec4 center = getDatau_ClusterCenters(clusterIdx);\\\\nfloat cvx = currentNode.x - center.x;\\\\nfloat cvy = currentNode.y - center.y;\\\\nfloat dist = sqrt((cvx * cvx) + (cvy * cvy)) + 0.01;\\\\nfloat parma = (u_K * u_ClusterGravity) / dist;\\\\ndx += parma * cvx;\\\\ndy += parma * cvy;}\\\\nreturn vec2(dx, dy);}\\\\nvec2 calcAttractive(int i, vec4 currentNode) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat dx = 0.0;\\\\nfloat dy = 0.0;\\\\nint arr_offset = int(floor(currentNode.z + 0.5));\\\\nint length = int(floor(currentNode.w + 0.5));\\\\nvec4 node_buffer;\\\\nfor (int p = 0; p < MAX_EDGE_PER_VERTEX; p++) {if (p >= length) {break;}\\\\nint arr_idx = arr_offset + int(p);\\\\nint buf_offset = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = getDatau_Data(int(arr_idx / 4));}\\\\nfloat float_j = (buf_offset == 0) ? (node_buffer.x) : ((buf_offset == 1) ? (node_buffer.y) : ((buf_offset == 2) ? (node_buffer.z) : (node_buffer.w)));\\\\nvec4 nextNode = getDatau_Data(int(float_j));\\\\nfloat xDist = currentNode.x - nextNode.x;\\\\nfloat yDist = currentNode.y - nextNode.y;\\\\nfloat dist = sqrt((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nfloat attractiveF = dist / u_K;\\\\nif (dist > 0.0) {dx -= xDist * attractiveF;\\\\ndy -= yDist * attractiveF;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {float sign = (i < int(float_j)) ? (1.0) : (-1.0);\\\\ndx -= sign * attractiveF;\\\\ndy -= sign * attractiveF;}}}\\\\nreturn vec2(dx, dy);}\\\\nvoid main() {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nint i = globalInvocationID.x;\\\\nvec4 currentNode = getDatau_Data(i);\\\\nfloat dx = 0.0;\\\\nfloat dy = 0.0;\\\\nif (i >= VERTEX_COUNT) {gl_FragColor = vec4(currentNode);\\\\nreturn ;}\\\\nvec2 repulsive = calcRepulsive(i, currentNode);\\\\ndx += repulsive.x;\\\\ndy += repulsive.y;\\\\nvec2 attractive = calcAttractive(i, currentNode);\\\\ndx += attractive.x;\\\\ndy += attractive.y;\\\\nvec4 nodeAttributes = getDatau_AttributeArray(i);\\\\nvec2 gravity = calcGravity(currentNode, nodeAttributes);\\\\ndx -= gravity.x;\\\\ndy -= gravity.y;\\\\ndx *= u_Speed;\\\\ndy *= u_Speed;\\\\nfloat distLength = sqrt((dx * dx) + (dy * dy));\\\\nif (distLength > 0.0) {float limitedDist = min(u_MaxDisplace * u_Speed, distLength);\\\\ngl_FragColor = vec4(vec4(currentNode.x + ((dx / distLength) * limitedDist), currentNode.y + ((dy / distLength) * limitedDist), currentNode.z, currentNode.w));}if (gWebGPUDebug) {\\\\n gl_FragColor = gWebGPUDebugOutput;\\\\n}}\\\\n"},"context":{"name":"","dispatch":[1,1,1],"threadGroupSize":[1,1,1],"maxIteration":1,"defines":[{"name":"MAX_EDGE_PER_VERTEX","type":"Float","runtime":true},{"name":"VERTEX_COUNT","type":"Float","runtime":true}],"uniforms":[{"name":"u_Data","type":"vec4[]","storageClass":"StorageBuffer","readonly":false,"writeonly":false,"size":[1,1]},{"name":"u_K","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_K2","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_Center","type":"vec2","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_Gravity","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_ClusterGravity","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_Speed","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_MaxDisplace","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_Clustering","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_AttributeArray","type":"vec4[]","storageClass":"StorageBuffer","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_ClusterCenters","type":"vec4[]","storageClass":"StorageBuffer","readonly":true,"writeonly":false,"size":[1,1]}],"globalDeclarations":[],"output":{"name":"u_Data","size":[1,1],"length":1},"needPingpong":true}}\').setDispatch([y,1,1]).setBinding({u_Data:x,u_K:l,u_K2:f,u_Gravity:r.gravity,u_ClusterGravity:r.clusterGravity||r.gravity||1,u_Speed:h,u_MaxDisplace:c,u_Clustering:d?1:0,u_Center:s,u_AttributeArray:g,u_ClusterCenters:_,MAX_EDGE_PER_VERTEX:b,VERTEX_COUNT:y}),d&&(M=S.createKernel(\'{"shaders":{"WGSL":"import \\\\"GLSL.std.450\\\\" as std;\\\\n\\\\n\\\\n# var gWebGPUDebug : bool = false;\\\\n# var gWebGPUDebugOutput : vec4 = vec4(0.0);\\\\n\\\\n[[builtin global_invocation_id]] var globalInvocationID : vec3;\\\\n# [[builtin work_group_size]] var workGroupSize : vec3;\\\\n# [[builtin work_group_id]] var workGroupID : vec3;\\\\n[[builtin local_invocation_id]] var localInvocationID : vec3;\\\\n# [[builtin num_work_groups]] var numWorkGroups : vec3;\\\\n[[builtin local_invocation_idx]] var localInvocationIndex : u32;\\\\n\\\\n\\\\ntype GWebGPUBuffer0 = [[block]] struct {\\\\n [[offset 0]] u_Data : [[stride 16]] array>;\\\\n};\\\\n[[binding 0, set 0]] var gWebGPUBuffer0 : GWebGPUBuffer0;\\\\ntype GWebGPUBuffer1 = [[block]] struct {\\\\n [[offset 0]] u_NodeAttributes : [[stride 16]] array>;\\\\n};\\\\n[[binding 1, set 0]] var gWebGPUBuffer1 : GWebGPUBuffer1;\\\\ntype GWebGPUBuffer2 = [[block]] struct {\\\\n [[offset 0]] u_ClusterCenters : [[stride 16]] array>;\\\\n};\\\\n[[binding 2, set 0]] var gWebGPUBuffer2 : GWebGPUBuffer2;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nfn main() -> void {var i : i32 = globalInvocationID.x;\\\\nvar center : vec4 = gWebGPUBuffer2.u_ClusterCenters[i];\\\\nvar sumx : f32 = 0.0;\\\\nvar sumy : f32 = 0.0;\\\\nvar count : f32 = 0.0;\\\\nfor (var j : i32 = 0; j < __DefineValuePlaceholder__VERTEX_COUNT; j = j + 1) {var attributes : vec4 = gWebGPUBuffer1.u_NodeAttributes[j];\\\\nvar clusterIdx : i32 = i32(attributes.x);\\\\nvar vertex : vec4 = gWebGPUBuffer0.u_Data[j];\\\\nif (clusterIdx == i) {sumx = sumx + vertex.x;\\\\nsumy = sumy + vertex.y;\\\\ncount = count + 1.0;}}\\\\ngWebGPUBuffer2.u_ClusterCenters[i] = vec4(sumx / count, sumy / count, count, i);\\\\nreturn;}\\\\n\\\\nentry_point compute as \\\\"main\\\\" = main;\\\\n","GLSL450":"\\\\n\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\nivec3 globalInvocationID = ivec3(gl_GlobalInvocationID);\\\\nivec3 workGroupSize = ivec3(1,1,1);\\\\nivec3 workGroupID = ivec3(gl_WorkGroupID);\\\\nivec3 localInvocationID = ivec3(gl_LocalInvocationID);\\\\nivec3 numWorkGroups = ivec3(gl_NumWorkGroups);\\\\nint localInvocationIndex = int(gl_LocalInvocationIndex);\\\\n\\\\n\\\\nlayout(std430, set = 0, binding = 0) buffer readonly GWebGPUBuffer0 {\\\\n vec4 u_Data[];\\\\n} gWebGPUBuffer0;\\\\n\\\\nlayout(std430, set = 0, binding = 1) buffer readonly GWebGPUBuffer1 {\\\\n vec4 u_NodeAttributes[];\\\\n} gWebGPUBuffer1;\\\\n\\\\nlayout(std430, set = 0, binding = 2) buffer GWebGPUBuffer2 {\\\\n vec4 u_ClusterCenters[];\\\\n} gWebGPUBuffer2;\\\\n\\\\n\\\\n\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n#define CLUSTER_COUNT __DefineValuePlaceholder__CLUSTER_COUNT\\\\nlayout (\\\\n local_size_x = 1,\\\\n local_size_y = 1,\\\\n local_size_z = 1\\\\n) in;\\\\n\\\\n\\\\n\\\\nvoid main() {int i = globalInvocationID.x;\\\\nvec4 center = gWebGPUBuffer2.u_ClusterCenters[i];\\\\nfloat sumx = 0.0;\\\\nfloat sumy = 0.0;\\\\nfloat count = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {vec4 attributes = gWebGPUBuffer1.u_NodeAttributes[j];\\\\nint clusterIdx = int(attributes.x);\\\\nvec4 vertex = gWebGPUBuffer0.u_Data[j];\\\\nif (clusterIdx == i) {sumx += vertex.x;\\\\nsumy += vertex.y;\\\\ncount += 1.0;}}\\\\ngWebGPUBuffer2.u_ClusterCenters[i] = vec4(sumx / count, sumy / count, count, i);}\\\\n","GLSL100":"\\\\n\\\\nfloat epsilon = 0.00001;\\\\nvec2 addrTranslation_1Dto2D(float address1D, vec2 texSize) {\\\\n vec2 conv_const = vec2(1.0 / texSize.x, 1.0 / (texSize.x * texSize.y));\\\\n vec2 normAddr2D = float(address1D) * conv_const;\\\\n return vec2(fract(normAddr2D.x + epsilon), normAddr2D.y);\\\\n}\\\\n\\\\nvoid barrier() {}\\\\n \\\\n\\\\nuniform vec2 u_OutputTextureSize;\\\\nuniform int u_OutputTexelCount;\\\\nvarying vec2 v_TexCoord;\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n#define CLUSTER_COUNT __DefineValuePlaceholder__CLUSTER_COUNT\\\\n\\\\nuniform sampler2D u_Data;\\\\nuniform vec2 u_DataSize;\\\\nvec4 getDatau_Data(vec2 address2D) {\\\\n return vec4(texture2D(u_Data, address2D).rgba);\\\\n}\\\\nvec4 getDatau_Data(float address1D) {\\\\n return getDatau_Data(addrTranslation_1Dto2D(address1D, u_DataSize));\\\\n}\\\\nvec4 getDatau_Data(int address1D) {\\\\n return getDatau_Data(float(address1D));\\\\n}\\\\nuniform sampler2D u_NodeAttributes;\\\\nuniform vec2 u_NodeAttributesSize;\\\\nvec4 getDatau_NodeAttributes(vec2 address2D) {\\\\n return vec4(texture2D(u_NodeAttributes, address2D).rgba);\\\\n}\\\\nvec4 getDatau_NodeAttributes(float address1D) {\\\\n return getDatau_NodeAttributes(addrTranslation_1Dto2D(address1D, u_NodeAttributesSize));\\\\n}\\\\nvec4 getDatau_NodeAttributes(int address1D) {\\\\n return getDatau_NodeAttributes(float(address1D));\\\\n}\\\\nuniform sampler2D u_ClusterCenters;\\\\nuniform vec2 u_ClusterCentersSize;\\\\nvec4 getDatau_ClusterCenters(vec2 address2D) {\\\\n return vec4(texture2D(u_ClusterCenters, address2D).rgba);\\\\n}\\\\nvec4 getDatau_ClusterCenters(float address1D) {\\\\n return getDatau_ClusterCenters(addrTranslation_1Dto2D(address1D, u_ClusterCentersSize));\\\\n}\\\\nvec4 getDatau_ClusterCenters(int address1D) {\\\\n return getDatau_ClusterCenters(float(address1D));\\\\n}\\\\nvoid main() {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nint i = globalInvocationID.x;\\\\nvec4 center = getDatau_ClusterCenters(i);\\\\nfloat sumx = 0.0;\\\\nfloat sumy = 0.0;\\\\nfloat count = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {vec4 attributes = getDatau_NodeAttributes(j);\\\\nint clusterIdx = int(attributes.x);\\\\nvec4 vertex = getDatau_Data(j);\\\\nif (clusterIdx == i) {sumx += vertex.x;\\\\nsumy += vertex.y;\\\\ncount += 1.0;}}\\\\ngl_FragColor = vec4(vec4(sumx / count, sumy / count, count, i));if (gWebGPUDebug) {\\\\n gl_FragColor = gWebGPUDebugOutput;\\\\n}}\\\\n"},"context":{"name":"","dispatch":[1,1,1],"threadGroupSize":[1,1,1],"maxIteration":1,"defines":[{"name":"VERTEX_COUNT","type":"Float","runtime":true},{"name":"CLUSTER_COUNT","type":"Float","runtime":true}],"uniforms":[{"name":"u_Data","type":"vec4[]","storageClass":"StorageBuffer","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_NodeAttributes","type":"vec4[]","storageClass":"StorageBuffer","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_ClusterCenters","type":"vec4[]","storageClass":"StorageBuffer","readonly":false,"writeonly":false,"size":[1,1]}],"globalDeclarations":[],"output":{"name":"u_ClusterCenters","size":[1,1],"length":1},"needPingpong":true}}\').setDispatch([v,1,1]).setBinding({u_Data:x,u_NodeAttributes:g,u_ClusterCenters:_,VERTEX_COUNT:y,CLUSTER_COUNT:v})),A=function(){return yh(T,void 0,void 0,regeneratorRuntime.mark((function n(){var r,o;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:r=0;case 1:if(!(r = vec4(0.0);\\\\n\\\\n[[builtin global_invocation_id]] var globalInvocationID : vec3;\\\\n# [[builtin work_group_size]] var workGroupSize : vec3;\\\\n# [[builtin work_group_id]] var workGroupID : vec3;\\\\n[[builtin local_invocation_id]] var localInvocationID : vec3;\\\\n# [[builtin num_work_groups]] var numWorkGroups : vec3;\\\\n[[builtin local_invocation_idx]] var localInvocationIndex : u32;\\\\n\\\\ntype GWebGPUParams = [[block]] struct {\\\\n [[offset 0]] u_damping : f32;\\\\n [[offset 4]] u_maxSpeed : f32;\\\\n [[offset 8]] u_minMovement : f32;\\\\n \\\\n [[offset 12]] u_coulombDisScale : f32;\\\\n [[offset 16]] u_factor : f32;\\\\n \\\\n \\\\n [[offset 20]] u_interval : f32;\\\\n};\\\\n[[binding 0, set 0]] var gWebGPUUniformParams : GWebGPUParams;\\\\ntype GWebGPUBuffer0 = [[block]] struct {\\\\n [[offset 0]] u_Data : [[stride 16]] array>;\\\\n};\\\\n[[binding 1, set 0]] var gWebGPUBuffer0 : GWebGPUBuffer0;\\\\ntype GWebGPUBuffer1 = [[block]] struct {\\\\n [[offset 0]] u_AveMovement : [[stride 16]] array>;\\\\n};\\\\n[[binding 2, set 0]] var gWebGPUBuffer1 : GWebGPUBuffer1;\\\\ntype GWebGPUBuffer2 = [[block]] struct {\\\\n [[offset 0]] u_NodeAttributeArray1 : [[stride 16]] array>;\\\\n};\\\\n[[binding 3, set 0]] var gWebGPUBuffer2 : GWebGPUBuffer2;\\\\ntype GWebGPUBuffer3 = [[block]] struct {\\\\n [[offset 0]] u_NodeAttributeArray2 : [[stride 16]] array>;\\\\n};\\\\n[[binding 4, set 0]] var gWebGPUBuffer3 : GWebGPUBuffer3;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nfn unpack_float(packedValue : f32) -> vec2 {var packedIntValue : i32 = i32(packedValue);\\\\nvar v0 : i32 = packedIntValue / 1048576;\\\\nreturn vec2(v0, packedIntValue - (v0 * 1048576));}\\\\nfn calcRepulsive(i : i32, currentNode : vec4) -> vec2 {var ax : f32 = 0.0;\\\\nvar ay : f32 = 0.0;\\\\nfor (var j : i32 = 0; j < __DefineValuePlaceholder__VERTEX_COUNT; j = j + 1) {if (i != j) {var nextNode : vec4 = gWebGPUBuffer0.u_Data[j];\\\\nvar vx : f32 = currentNode.x - nextNode.x;\\\\nvar vy : f32 = currentNode.y - nextNode.y;\\\\nvar dist : f32 = std::sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nvar n_dist : f32 = dist * gWebGPUUniformParams.u_coulombDisScale;\\\\nvar direx : f32 = vx / dist;\\\\nvar direy : f32 = vy / dist;\\\\nvar attributesi : vec4 = gWebGPUBuffer2.u_NodeAttributeArray1[i];\\\\nvar attributesj : vec4 = gWebGPUBuffer2.u_NodeAttributeArray1[j];\\\\nvar massi : f32 = attributesi.x;\\\\nvar nodeStrengthi : f32 = attributesi.z;\\\\nvar nodeStrengthj : f32 = attributesj.z;\\\\nvar nodeStrength : f32 = (nodeStrengthi + nodeStrengthj) / 2.0;\\\\nvar param : f32 = (1000.0 * gWebGPUUniformParams.u_factor) / (n_dist * n_dist);\\\\nax = ax + direx * param;\\\\nay = ay + direy * param;}}\\\\nreturn vec2(ax, ay);}\\\\nfn calcGravity(i : i32, currentNode : vec4, attributes2 : vec4) -> vec2 {var vx : f32 = currentNode.x - attributes2.x;\\\\nvar vy : f32 = currentNode.y - attributes2.y;\\\\nvar ax : f32 = vx * attributes2.w;\\\\nvar ay : f32 = vy * attributes2.w;\\\\nreturn vec2(ax, ay);}\\\\nfn calcAttractive(i : i32, currentNode : vec4, attributes1 : vec4) -> vec2 {var mass : f32 = attributes1.x;\\\\nvar ax : f32 = 0.0;\\\\nvar ay : f32 = 0.0;\\\\nvar compressed : vec2 = unpack_float(currentNode.z);\\\\nvar length : i32 = compressed.x;\\\\nvar arr_offset : i32 = compressed.y;\\\\nvar node_buffer : vec4;\\\\nfor (var p : i32 = 0; p < __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX; p = p + 1) {if (p >= length) {break;}\\\\nvar arr_idx : i32 = arr_offset + (4 * p);\\\\nvar buf_offset : i32 = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = gWebGPUBuffer0.u_Data[i32(arr_idx / 4)];}\\\\nvar float_j : f32 = node_buffer.x;\\\\nvar nextNode : vec4 = gWebGPUBuffer0.u_Data[i32(float_j)];\\\\nvar vx : f32 = nextNode.x - currentNode.x;\\\\nvar vy : f32 = nextNode.y - currentNode.y;\\\\nvar dist : f32 = std::sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nvar direx : f32 = vx / dist;\\\\nvar direy : f32 = vy / dist;\\\\nvar edgeLength : f32 = node_buffer.y;\\\\nvar edgeStrength : f32 = node_buffer.z;\\\\nvar diff : f32 = edgeLength - dist;\\\\nvar param : f32 = (diff * edgeStrength) / mass;\\\\nax = ax - direx * param;\\\\nay = ay - direy * param;}\\\\nreturn vec2(ax, ay);}\\\\nfn main() -> void {var i : i32 = globalInvocationID.x;\\\\nvar currentNode : vec4 = gWebGPUBuffer0.u_Data[i];\\\\nvar movement : vec4 = gWebGPUBuffer1.u_AveMovement[0];\\\\nvar ax : f32 = 0.0;\\\\nvar ay : f32 = 0.0;\\\\nif ((i >= __DefineValuePlaceholder__VERTEX_COUNT) || (movement.x < gWebGPUUniformParams.u_minMovement)) {gWebGPUBuffer0.u_Data[i] = currentNode;\\\\nreturn ;}\\\\nvar nodeAttributes1 : vec4 = gWebGPUBuffer2.u_NodeAttributeArray1[i];\\\\nvar nodeAttributes2 : vec4 = gWebGPUBuffer3.u_NodeAttributeArray2[i];\\\\nvar repulsive : vec2 = calcRepulsive(i, currentNode);\\\\nax = ax + repulsive.x;\\\\nay = ay + repulsive.y;\\\\nvar attractive : vec2 = calcAttractive(i, currentNode, nodeAttributes1);\\\\nax = ax + attractive.x;\\\\nay = ay + attractive.y;\\\\nvar gravity : vec2 = calcGravity(i, currentNode, nodeAttributes2);\\\\nax = ax - gravity.x;\\\\nay = ay - gravity.y;\\\\nvar param : f32 = gWebGPUUniformParams.u_interval * gWebGPUUniformParams.u_damping;\\\\nvar vx : f32 = ax * param;\\\\nvar vy : f32 = ay * param;\\\\nvar vlength : f32 = std::sqrt((vx * vx) + (vy * vy)) + 0.0001;\\\\nif (vlength > gWebGPUUniformParams.u_maxSpeed) {var param2 : f32 = gWebGPUUniformParams.u_maxSpeed / vlength;\\\\nvx = param2 * vx;\\\\nvy = param2 * vy;}\\\\nvar distx : f32 = vx * gWebGPUUniformParams.u_interval;\\\\nvar disty : f32 = vy * gWebGPUUniformParams.u_interval;\\\\nvar distLength : f32 = std::sqrt((distx * distx) + (disty * disty));\\\\ngWebGPUBuffer0.u_Data[i] = vec4(currentNode.x + distx, currentNode.y + disty, currentNode.z, distLength);\\\\nreturn;}\\\\n\\\\nentry_point compute as \\\\"main\\\\" = main;\\\\n","GLSL450":"\\\\n\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\nivec3 globalInvocationID = ivec3(gl_GlobalInvocationID);\\\\nivec3 workGroupSize = ivec3(1,1,1);\\\\nivec3 workGroupID = ivec3(gl_WorkGroupID);\\\\nivec3 localInvocationID = ivec3(gl_LocalInvocationID);\\\\nivec3 numWorkGroups = ivec3(gl_NumWorkGroups);\\\\nint localInvocationIndex = int(gl_LocalInvocationIndex);\\\\n\\\\nlayout(std140, set = 0, binding = 0) uniform GWebGPUParams {\\\\n float u_damping;\\\\n float u_maxSpeed;\\\\n float u_minMovement;\\\\n \\\\n float u_coulombDisScale;\\\\n float u_factor;\\\\n \\\\n \\\\n float u_interval;\\\\n} gWebGPUUniformParams;\\\\nlayout(std430, set = 0, binding = 1) buffer GWebGPUBuffer0 {\\\\n vec4 u_Data[];\\\\n} gWebGPUBuffer0;\\\\n\\\\nlayout(std430, set = 0, binding = 2) buffer readonly GWebGPUBuffer1 {\\\\n vec4 u_AveMovement[];\\\\n} gWebGPUBuffer1;\\\\n\\\\nlayout(std430, set = 0, binding = 3) buffer readonly GWebGPUBuffer2 {\\\\n vec4 u_NodeAttributeArray1[];\\\\n} gWebGPUBuffer2;\\\\n\\\\nlayout(std430, set = 0, binding = 4) buffer readonly GWebGPUBuffer3 {\\\\n vec4 u_NodeAttributeArray2[];\\\\n} gWebGPUBuffer3;\\\\n\\\\n\\\\n\\\\n#define MAX_EDGE_PER_VERTEX __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n#define SHIFT_20 1048576.0\\\\nlayout (\\\\n local_size_x = 1,\\\\n local_size_y = 1,\\\\n local_size_z = 1\\\\n) in;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nivec2 unpack_float(float packedValue) {int packedIntValue = int(packedValue);\\\\nint v0 = packedIntValue / int(SHIFT_20);\\\\nreturn ivec2(v0, packedIntValue - (v0 * int(SHIFT_20)));}\\\\nvec2 calcRepulsive(int i, vec4 currentNode) {float ax = 0.0;\\\\nfloat ay = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {if (i != j) {vec4 nextNode = gWebGPUBuffer0.u_Data[j];\\\\nfloat vx = currentNode.x - nextNode.x;\\\\nfloat vy = currentNode.y - nextNode.y;\\\\nfloat dist = sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nfloat n_dist = dist * gWebGPUUniformParams.u_coulombDisScale;\\\\nfloat direx = vx / dist;\\\\nfloat direy = vy / dist;\\\\nvec4 attributesi = gWebGPUBuffer2.u_NodeAttributeArray1[i];\\\\nvec4 attributesj = gWebGPUBuffer2.u_NodeAttributeArray1[j];\\\\nfloat massi = attributesi.x;\\\\nfloat nodeStrengthi = attributesi.z;\\\\nfloat nodeStrengthj = attributesj.z;\\\\nfloat nodeStrength = (nodeStrengthi + nodeStrengthj) / 2.0;\\\\nfloat param = (1000.0 * gWebGPUUniformParams.u_factor) / (n_dist * n_dist);\\\\nax += direx * param;\\\\nay += direy * param;}}\\\\nreturn vec2(ax, ay);}\\\\nvec2 calcGravity(int i, vec4 currentNode, vec4 attributes2) {float vx = currentNode.x - attributes2.x;\\\\nfloat vy = currentNode.y - attributes2.y;\\\\nfloat ax = vx * attributes2.w;\\\\nfloat ay = vy * attributes2.w;\\\\nreturn vec2(ax, ay);}\\\\nvec2 calcAttractive(int i, vec4 currentNode, vec4 attributes1) {float mass = attributes1.x;\\\\nfloat ax = 0.0;\\\\nfloat ay = 0.0;\\\\nivec2 compressed = unpack_float(currentNode.z);\\\\nint length = compressed.x;\\\\nint arr_offset = compressed.y;\\\\nvec4 node_buffer;\\\\nfor (int p = 0; p < MAX_EDGE_PER_VERTEX; p++) {if (p >= length) {break;}\\\\nint arr_idx = arr_offset + (4 * p);\\\\nint buf_offset = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = gWebGPUBuffer0.u_Data[int(arr_idx / 4)];}\\\\nfloat float_j = node_buffer.x;\\\\nvec4 nextNode = gWebGPUBuffer0.u_Data[int(float_j)];\\\\nfloat vx = nextNode.x - currentNode.x;\\\\nfloat vy = nextNode.y - currentNode.y;\\\\nfloat dist = sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nfloat direx = vx / dist;\\\\nfloat direy = vy / dist;\\\\nfloat edgeLength = node_buffer.y;\\\\nfloat edgeStrength = node_buffer.z;\\\\nfloat diff = edgeLength - dist;\\\\nfloat param = (diff * edgeStrength) / mass;\\\\nax -= direx * param;\\\\nay -= direy * param;}\\\\nreturn vec2(ax, ay);}\\\\nvoid main() {int i = globalInvocationID.x;\\\\nvec4 currentNode = gWebGPUBuffer0.u_Data[i];\\\\nvec4 movement = gWebGPUBuffer1.u_AveMovement[0];\\\\nfloat ax = 0.0;\\\\nfloat ay = 0.0;\\\\nif ((i >= VERTEX_COUNT) || (movement.x < gWebGPUUniformParams.u_minMovement)) {gWebGPUBuffer0.u_Data[i] = currentNode;\\\\nreturn ;}\\\\nvec4 nodeAttributes1 = gWebGPUBuffer2.u_NodeAttributeArray1[i];\\\\nvec4 nodeAttributes2 = gWebGPUBuffer3.u_NodeAttributeArray2[i];\\\\nvec2 repulsive = calcRepulsive(i, currentNode);\\\\nax += repulsive.x;\\\\nay += repulsive.y;\\\\nvec2 attractive = calcAttractive(i, currentNode, nodeAttributes1);\\\\nax += attractive.x;\\\\nay += attractive.y;\\\\nvec2 gravity = calcGravity(i, currentNode, nodeAttributes2);\\\\nax -= gravity.x;\\\\nay -= gravity.y;\\\\nfloat param = gWebGPUUniformParams.u_interval * gWebGPUUniformParams.u_damping;\\\\nfloat vx = ax * param;\\\\nfloat vy = ay * param;\\\\nfloat vlength = sqrt((vx * vx) + (vy * vy)) + 0.0001;\\\\nif (vlength > gWebGPUUniformParams.u_maxSpeed) {float param2 = gWebGPUUniformParams.u_maxSpeed / vlength;\\\\nvx = param2 * vx;\\\\nvy = param2 * vy;}\\\\nfloat distx = vx * gWebGPUUniformParams.u_interval;\\\\nfloat disty = vy * gWebGPUUniformParams.u_interval;\\\\nfloat distLength = sqrt((distx * distx) + (disty * disty));\\\\ngWebGPUBuffer0.u_Data[i] = vec4(currentNode.x + distx, currentNode.y + disty, currentNode.z, distLength);}\\\\n","GLSL100":"\\\\n\\\\nfloat epsilon = 0.00001;\\\\nvec2 addrTranslation_1Dto2D(float address1D, vec2 texSize) {\\\\n vec2 conv_const = vec2(1.0 / texSize.x, 1.0 / (texSize.x * texSize.y));\\\\n vec2 normAddr2D = float(address1D) * conv_const;\\\\n return vec2(fract(normAddr2D.x + epsilon), normAddr2D.y);\\\\n}\\\\n\\\\nvoid barrier() {}\\\\n \\\\n\\\\nuniform vec2 u_OutputTextureSize;\\\\nuniform int u_OutputTexelCount;\\\\nvarying vec2 v_TexCoord;\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\n#define MAX_EDGE_PER_VERTEX __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n#define SHIFT_20 1048576.0\\\\n\\\\nuniform sampler2D u_Data;\\\\nuniform vec2 u_DataSize;\\\\nvec4 getDatau_Data(vec2 address2D) {\\\\n return vec4(texture2D(u_Data, address2D).rgba);\\\\n}\\\\nvec4 getDatau_Data(float address1D) {\\\\n return getDatau_Data(addrTranslation_1Dto2D(address1D, u_DataSize));\\\\n}\\\\nvec4 getDatau_Data(int address1D) {\\\\n return getDatau_Data(float(address1D));\\\\n}\\\\nuniform float u_damping;\\\\nuniform float u_maxSpeed;\\\\nuniform float u_minMovement;\\\\nuniform sampler2D u_AveMovement;\\\\nuniform vec2 u_AveMovementSize;\\\\nvec4 getDatau_AveMovement(vec2 address2D) {\\\\n return vec4(texture2D(u_AveMovement, address2D).rgba);\\\\n}\\\\nvec4 getDatau_AveMovement(float address1D) {\\\\n return getDatau_AveMovement(addrTranslation_1Dto2D(address1D, u_AveMovementSize));\\\\n}\\\\nvec4 getDatau_AveMovement(int address1D) {\\\\n return getDatau_AveMovement(float(address1D));\\\\n}\\\\nuniform float u_coulombDisScale;\\\\nuniform float u_factor;\\\\nuniform sampler2D u_NodeAttributeArray1;\\\\nuniform vec2 u_NodeAttributeArray1Size;\\\\nvec4 getDatau_NodeAttributeArray1(vec2 address2D) {\\\\n return vec4(texture2D(u_NodeAttributeArray1, address2D).rgba);\\\\n}\\\\nvec4 getDatau_NodeAttributeArray1(float address1D) {\\\\n return getDatau_NodeAttributeArray1(addrTranslation_1Dto2D(address1D, u_NodeAttributeArray1Size));\\\\n}\\\\nvec4 getDatau_NodeAttributeArray1(int address1D) {\\\\n return getDatau_NodeAttributeArray1(float(address1D));\\\\n}\\\\nuniform sampler2D u_NodeAttributeArray2;\\\\nuniform vec2 u_NodeAttributeArray2Size;\\\\nvec4 getDatau_NodeAttributeArray2(vec2 address2D) {\\\\n return vec4(texture2D(u_NodeAttributeArray2, address2D).rgba);\\\\n}\\\\nvec4 getDatau_NodeAttributeArray2(float address1D) {\\\\n return getDatau_NodeAttributeArray2(addrTranslation_1Dto2D(address1D, u_NodeAttributeArray2Size));\\\\n}\\\\nvec4 getDatau_NodeAttributeArray2(int address1D) {\\\\n return getDatau_NodeAttributeArray2(float(address1D));\\\\n}\\\\nuniform float u_interval;\\\\nivec2 unpack_float(float packedValue) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nint packedIntValue = int(packedValue);\\\\nint v0 = packedIntValue / int(SHIFT_20);\\\\nreturn ivec2(v0, packedIntValue - (v0 * int(SHIFT_20)));}\\\\nvec2 calcRepulsive(int i, vec4 currentNode) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat ax = 0.0;\\\\nfloat ay = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {if (i != j) {vec4 nextNode = getDatau_Data(j);\\\\nfloat vx = currentNode.x - nextNode.x;\\\\nfloat vy = currentNode.y - nextNode.y;\\\\nfloat dist = sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nfloat n_dist = dist * u_coulombDisScale;\\\\nfloat direx = vx / dist;\\\\nfloat direy = vy / dist;\\\\nvec4 attributesi = getDatau_NodeAttributeArray1(i);\\\\nvec4 attributesj = getDatau_NodeAttributeArray1(j);\\\\nfloat massi = attributesi.x;\\\\nfloat nodeStrengthi = attributesi.z;\\\\nfloat nodeStrengthj = attributesj.z;\\\\nfloat nodeStrength = (nodeStrengthi + nodeStrengthj) / 2.0;\\\\nfloat param = (1000.0 * u_factor) / (n_dist * n_dist);\\\\nax += direx * param;\\\\nay += direy * param;}}\\\\nreturn vec2(ax, ay);}\\\\nvec2 calcGravity(int i, vec4 currentNode, vec4 attributes2) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat vx = currentNode.x - attributes2.x;\\\\nfloat vy = currentNode.y - attributes2.y;\\\\nfloat ax = vx * attributes2.w;\\\\nfloat ay = vy * attributes2.w;\\\\nreturn vec2(ax, ay);}\\\\nvec2 calcAttractive(int i, vec4 currentNode, vec4 attributes1) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat mass = attributes1.x;\\\\nfloat ax = 0.0;\\\\nfloat ay = 0.0;\\\\nivec2 compressed = unpack_float(currentNode.z);\\\\nint length = compressed.x;\\\\nint arr_offset = compressed.y;\\\\nvec4 node_buffer;\\\\nfor (int p = 0; p < MAX_EDGE_PER_VERTEX; p++) {if (p >= length) {break;}\\\\nint arr_idx = arr_offset + (4 * p);\\\\nint buf_offset = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = getDatau_Data(int(arr_idx / 4));}\\\\nfloat float_j = node_buffer.x;\\\\nvec4 nextNode = getDatau_Data(int(float_j));\\\\nfloat vx = nextNode.x - currentNode.x;\\\\nfloat vy = nextNode.y - currentNode.y;\\\\nfloat dist = sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nfloat direx = vx / dist;\\\\nfloat direy = vy / dist;\\\\nfloat edgeLength = node_buffer.y;\\\\nfloat edgeStrength = node_buffer.z;\\\\nfloat diff = edgeLength - dist;\\\\nfloat param = (diff * edgeStrength) / mass;\\\\nax -= direx * param;\\\\nay -= direy * param;}\\\\nreturn vec2(ax, ay);}\\\\nvoid main() {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nint i = globalInvocationID.x;\\\\nvec4 currentNode = getDatau_Data(i);\\\\nvec4 movement = getDatau_AveMovement(0.0);\\\\nfloat ax = 0.0;\\\\nfloat ay = 0.0;\\\\nif ((i >= VERTEX_COUNT) || (movement.x < u_minMovement)) {gl_FragColor = vec4(currentNode);\\\\nreturn ;}\\\\nvec4 nodeAttributes1 = getDatau_NodeAttributeArray1(i);\\\\nvec4 nodeAttributes2 = getDatau_NodeAttributeArray2(i);\\\\nvec2 repulsive = calcRepulsive(i, currentNode);\\\\nax += repulsive.x;\\\\nay += repulsive.y;\\\\nvec2 attractive = calcAttractive(i, currentNode, nodeAttributes1);\\\\nax += attractive.x;\\\\nay += attractive.y;\\\\nvec2 gravity = calcGravity(i, currentNode, nodeAttributes2);\\\\nax -= gravity.x;\\\\nay -= gravity.y;\\\\nfloat param = u_interval * u_damping;\\\\nfloat vx = ax * param;\\\\nfloat vy = ay * param;\\\\nfloat vlength = sqrt((vx * vx) + (vy * vy)) + 0.0001;\\\\nif (vlength > u_maxSpeed) {float param2 = u_maxSpeed / vlength;\\\\nvx = param2 * vx;\\\\nvy = param2 * vy;}\\\\nfloat distx = vx * u_interval;\\\\nfloat disty = vy * u_interval;\\\\nfloat distLength = sqrt((distx * distx) + (disty * disty));\\\\ngl_FragColor = vec4(vec4(currentNode.x + distx, currentNode.y + disty, currentNode.z, distLength));if (gWebGPUDebug) {\\\\n gl_FragColor = gWebGPUDebugOutput;\\\\n}}\\\\n"},"context":{"name":"","dispatch":[1,1,1],"threadGroupSize":[1,1,1],"maxIteration":1,"defines":[{"name":"MAX_EDGE_PER_VERTEX","type":"Float","runtime":true},{"name":"VERTEX_COUNT","type":"Float","runtime":true},{"name":"SHIFT_20","type":"Float","value":1048576,"runtime":false}],"uniforms":[{"name":"u_Data","type":"vec4[]","storageClass":"StorageBuffer","readonly":false,"writeonly":false,"size":[1,1]},{"name":"u_damping","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_maxSpeed","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_minMovement","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_AveMovement","type":"vec4[]","storageClass":"StorageBuffer","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_coulombDisScale","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_factor","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_NodeAttributeArray1","type":"vec4[]","storageClass":"StorageBuffer","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_NodeAttributeArray2","type":"vec4[]","storageClass":"StorageBuffer","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_interval","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]}],"globalDeclarations":[],"output":{"name":"u_Data","size":[1,1],"length":1},"needPingpong":true}}\').setDispatch([s,1,1]).setBinding({u_Data:f,u_damping:r.damping,u_maxSpeed:r.maxSpeed,u_minMovement:r.minMovement,u_coulombDisScale:r.coulombDisScale,u_factor:r.factor,u_NodeAttributeArray1:m,u_NodeAttributeArray2:b,MAX_EDGE_PER_VERTEX:c,VERTEX_COUNT:s,u_AveMovement:E,u_interval:r.interval}),k=w.createKernel(\'{"shaders":{"WGSL":"import \\\\"GLSL.std.450\\\\" as std;\\\\n\\\\n\\\\n# var gWebGPUDebug : bool = false;\\\\n# var gWebGPUDebugOutput : vec4 = vec4(0.0);\\\\n\\\\n[[builtin global_invocation_id]] var globalInvocationID : vec3;\\\\n# [[builtin work_group_size]] var workGroupSize : vec3;\\\\n# [[builtin work_group_id]] var workGroupID : vec3;\\\\n[[builtin local_invocation_id]] var localInvocationID : vec3;\\\\n# [[builtin num_work_groups]] var numWorkGroups : vec3;\\\\n[[builtin local_invocation_idx]] var localInvocationIndex : u32;\\\\n\\\\ntype GWebGPUParams = [[block]] struct {\\\\n [[offset 0]] u_iter : f32;\\\\n};\\\\n[[binding 0, set 0]] var gWebGPUUniformParams : GWebGPUParams;\\\\ntype GWebGPUBuffer0 = [[block]] struct {\\\\n [[offset 0]] u_Data : [[stride 16]] array>;\\\\n};\\\\n[[binding 1, set 0]] var gWebGPUBuffer0 : GWebGPUBuffer0;\\\\ntype GWebGPUBuffer1 = [[block]] struct {\\\\n [[offset 0]] u_AveMovement : [[stride 16]] array>;\\\\n};\\\\n[[binding 2, set 0]] var gWebGPUBuffer1 : GWebGPUBuffer1;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nfn main() -> void {var movement : f32 = 0.0;\\\\nfor (var j : i32 = 0; j < __DefineValuePlaceholder__VERTEX_COUNT; j = j + 1) {var vertex : vec4 = gWebGPUBuffer0.u_Data[j];\\\\nmovement = movement + vertex.w;}\\\\nmovement = movement / f32(__DefineValuePlaceholder__VERTEX_COUNT);\\\\ngWebGPUBuffer1.u_AveMovement[0] = vec4(movement, 0.0, 0.0, 0.0);\\\\nreturn;}\\\\n\\\\nentry_point compute as \\\\"main\\\\" = main;\\\\n","GLSL450":"\\\\n\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\nivec3 globalInvocationID = ivec3(gl_GlobalInvocationID);\\\\nivec3 workGroupSize = ivec3(1,1,1);\\\\nivec3 workGroupID = ivec3(gl_WorkGroupID);\\\\nivec3 localInvocationID = ivec3(gl_LocalInvocationID);\\\\nivec3 numWorkGroups = ivec3(gl_NumWorkGroups);\\\\nint localInvocationIndex = int(gl_LocalInvocationIndex);\\\\n\\\\nlayout(std140, set = 0, binding = 0) uniform GWebGPUParams {\\\\n float u_iter;\\\\n} gWebGPUUniformParams;\\\\nlayout(std430, set = 0, binding = 1) buffer readonly GWebGPUBuffer0 {\\\\n vec4 u_Data[];\\\\n} gWebGPUBuffer0;\\\\n\\\\nlayout(std430, set = 0, binding = 2) buffer GWebGPUBuffer1 {\\\\n vec4 u_AveMovement[];\\\\n} gWebGPUBuffer1;\\\\n\\\\n\\\\n\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\nlayout (\\\\n local_size_x = 1,\\\\n local_size_y = 1,\\\\n local_size_z = 1\\\\n) in;\\\\n\\\\n\\\\n\\\\nvoid main() {float movement = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {vec4 vertex = gWebGPUBuffer0.u_Data[j];\\\\nmovement += vertex.w;}\\\\nmovement = movement / float(VERTEX_COUNT);\\\\ngWebGPUBuffer1.u_AveMovement[0] = vec4(movement, 0.0, 0.0, 0.0);}\\\\n","GLSL100":"\\\\n\\\\nfloat epsilon = 0.00001;\\\\nvec2 addrTranslation_1Dto2D(float address1D, vec2 texSize) {\\\\n vec2 conv_const = vec2(1.0 / texSize.x, 1.0 / (texSize.x * texSize.y));\\\\n vec2 normAddr2D = float(address1D) * conv_const;\\\\n return vec2(fract(normAddr2D.x + epsilon), normAddr2D.y);\\\\n}\\\\n\\\\nvoid barrier() {}\\\\n \\\\n\\\\nuniform vec2 u_OutputTextureSize;\\\\nuniform int u_OutputTexelCount;\\\\nvarying vec2 v_TexCoord;\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n\\\\nuniform sampler2D u_Data;\\\\nuniform vec2 u_DataSize;\\\\nvec4 getDatau_Data(vec2 address2D) {\\\\n return vec4(texture2D(u_Data, address2D).rgba);\\\\n}\\\\nvec4 getDatau_Data(float address1D) {\\\\n return getDatau_Data(addrTranslation_1Dto2D(address1D, u_DataSize));\\\\n}\\\\nvec4 getDatau_Data(int address1D) {\\\\n return getDatau_Data(float(address1D));\\\\n}\\\\nuniform float u_iter;\\\\nuniform sampler2D u_AveMovement;\\\\nuniform vec2 u_AveMovementSize;\\\\nvec4 getDatau_AveMovement(vec2 address2D) {\\\\n return vec4(texture2D(u_AveMovement, address2D).rgba);\\\\n}\\\\nvec4 getDatau_AveMovement(float address1D) {\\\\n return getDatau_AveMovement(addrTranslation_1Dto2D(address1D, u_AveMovementSize));\\\\n}\\\\nvec4 getDatau_AveMovement(int address1D) {\\\\n return getDatau_AveMovement(float(address1D));\\\\n}\\\\nvoid main() {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat movement = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {vec4 vertex = getDatau_Data(j);\\\\nmovement += vertex.w;}\\\\nmovement = movement / float(VERTEX_COUNT);\\\\ngl_FragColor = vec4(vec4(movement, 0.0, 0.0, 0.0));if (gWebGPUDebug) {\\\\n gl_FragColor = gWebGPUDebugOutput;\\\\n}}\\\\n"},"context":{"name":"","dispatch":[1,1,1],"threadGroupSize":[1,1,1],"maxIteration":1,"defines":[{"name":"VERTEX_COUNT","type":"Float","runtime":true}],"uniforms":[{"name":"u_Data","type":"vec4[]","storageClass":"StorageBuffer","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_iter","type":"Float","storageClass":"Uniform","readonly":true,"writeonly":false,"size":[1,1]},{"name":"u_AveMovement","type":"vec4[]","storageClass":"StorageBuffer","readonly":false,"writeonly":false,"size":[1,1]}],"globalDeclarations":[],"output":{"name":"u_AveMovement","size":[1,1],"length":1},"needPingpong":true}}\').setDispatch([1,1,1]).setBinding({u_Data:f,VERTEX_COUNT:s,u_AveMovement:[0,0,0,0]}),M=function(){return Oh(A,void 0,void 0,regeneratorRuntime.mark((function n(){var o,s,u;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:o=0;case 1:if(!(op[1]?p[0]:p[1])/2;h=function(t){return v}}else{var y=p/2;h=function(t){return y}}else h=function(t){return t.size?Fn(t.size)?(t.size[0]>t.size[1]?t.size[0]:t.size[1])/2:t.size/2:10};this.nodeSize=h;var m,b=this.comboSpacing;m=Un(b)?function(){return b}:Kn(b)?b:function(){return 0},this.comboSpacing=m;var x,w=this.comboPadding;x=Un(w)?function(){return w}:Fn(w)?function(){return Math.max.apply(null,w)}:Kn(w)?w:function(){return 0},this.comboPadding=x;var S,E=this.linkDistance;E||(E=10),S=Un(E)?function(t){return E}:E,this.linkDistance=S;var _,O=this.edgeStrength;O||(O=1),_=Un(O)?function(t){return O}:O,this.edgeStrength=_;var k,M=this.nodeStrength;M||(M=30),k=Un(M)?function(t){return M}:M,this.nodeStrength=k}},{key:"initPos",value:function(t){this.nodes.forEach((function(e,n){var r=e.comboId,i=t[r];r&&i?(e.x=i.cx+100/(n+1),e.y=i.cy+100/(n+1)):(e.x=100/(n+1),e.y=100/(n+1))}))}},{key:"getComboMap",value:function(){var t=this,e=t.nodeMap,n=t.indexMap,r=t.comboTrees,i=t.oriComboMap,o={};return(r||[]).forEach((function(r){var a=[];Yn(r,(function(r){if("node"===r.itemType)return!0;if(!i[r.id])return!0;if(void 0===o[r.id]){var s={id:r.id,name:r.id,cx:0,cy:0,count:0,depth:t.oriComboMap[r.id].depth,children:[]};o[r.id]=s}var u=r.children;u&&u.forEach((function(t){if(!o[t.id]&&!e[t.id])return!0;a.push(t)}));var c=o[r.id];if(c.cx=0,c.cy=0,0===a.length){c.empty=!0;var f=i[r.id],l=Object.keys(e).length,h="".concat(r.id,"-visual-child-").concat(l),d={id:h,x:f.x,y:f.y,depth:c.depth+1,itemType:"node"};t.nodes.push(d),e[h]=d,n[h]=l,c.cx=f.x,c.cy=f.y,a.push(d)}return a.forEach((function(t){if(c.count++,"node"!==t.itemType){var n=o[t.id];return Un(n.cx)&&(c.cx+=n.cx),void(Un(n.cy)&&(c.cy+=n.cy))}var r=e[t.id];r&&(Un(r.x)&&(c.cx+=r.x),Un(r.y)&&(c.cy+=r.y))})),c.cx/=c.count,c.cy/=c.count,c.children=a,!0}))})),o}},{key:"applyComboCenterForce",value:function(t){var e=this.gravity,n=this.comboGravity||e,r=this.alpha,i=this.comboTrees,o=this.indexMap,a=this.nodeMap,s=this.comboMap;(i||[]).forEach((function(e){Yn(e,(function(e){if("node"===e.itemType)return!0;if(!s[e.id])return!0;var i=s[e.id],u=(i.depth+1)/10*.5,c=i.cx,f=i.cy;return i.cx=0,i.cy=0,i.children.forEach((function(e){if("node"!==e.itemType){var l=s[e.id];return l&&Un(l.cx)&&(i.cx+=l.cx),void(l&&Un(l.cy)&&(i.cy+=l.cy))}var h=a[e.id],d=h.x-c||.005,p=h.y-f||.005,g=Math.sqrt(d*d+p*p),v=o[h.id],y=n*r/g*u;t[v].x-=d*y,t[v].y-=p*y,Un(h.x)&&(i.cx+=h.x),Un(h.y)&&(i.cy+=h.y)})),i.cx/=i.count,i.cy/=i.count,!0}))}))}},{key:"applyCalculate",value:function(t){var e=this.comboMap,n=this.nodes,r={};n.forEach((function(t,e){n.forEach((function(n,i){if(!(eo&&(u.minX=o),u.minY>a&&(u.minY=a),u.maxX1&&a.forEach((function(n,s){if("node"===n.itemType)return!1;var u=e[n.id];u&&a.forEach((function(a,c){if(s<=c)return!1;if("node"===a.itemType)return!1;var f=e[a.id];if(!f)return!1;var l=u.cx-f.cx||.005,h=u.cy-f.cy||.005,d=l*l+h*h,p=u.r,g=f.r,v=p+g,y=g*g,m=p*p;if(di)){var y=e["".concat(d.id,"-").concat(n.id)],m=y.vx,b=y.vy,x=Math.log(Math.abs(n.depth-d.depth)/10)+1||1;x=x<1?1:x,n.comboId!==d.comboId&&(x+=1);var w=x?Math.pow(l,x):1,S=o(n)*a/g*w;if(t[p].x+=m*S,t[p].y+=b*S,pWebGL.
\',\'Find out how to get it here.\'].join("\\n"):[\'Your browser does not seem to support WebGL.
\',\'Find out how to get it here.\'].join("\\n")),t},addGetWebGLMessage:function(e){var n=void 0!==(e=e||{}).parent?e.parent:document.body,r=void 0!==e.id?e.id:"oldie",i=t().getWebGLErrorMessage();i.id=r,n.appendChild(i)}}};function Yh(t){return(Yh="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var Hh=function(t){return setTimeout(t,16)},qh=function(t){return clearTimeout(t)},Kh=function(t){return("undefined"!=typeof window&&(window.requestAnimationFrame||window.webkitRequestAnimationFrame)||Hh)(t)},Zh=function(t){return("undefined"!=typeof window&&(window.cancelAnimationFrame||window.webkitCancelAnimationFrame)||qh)(t)},Qh=["fruchterman","gForce"],Jh=function(t){function e(e){var n=t.call(this,e)||this;return n.graph=e,n.layoutCfg=e.get("layout")||{},n.layoutType=n.layoutCfg.type,n.worker=null,n.workerData={},n.initLayout(),n}return Object(v.b)(e,t),e.prototype.initLayout=function(){},e.prototype.getWorker=function(){return this.worker||("undefined"==typeof Worker?(console.warn("Web worker is not supported in current browser."),this.worker=null):this.worker=Bh),this.worker},e.prototype.stopWorker=function(){var t=this.workerData;this.worker&&(this.worker.terminate(),this.worker=null,t.requestId&&(Zh(t.requestId),t.requestId=null),t.requestId2&&(Zh(t.requestId2),t.requestId2=null))},e.prototype.layout=function(t){var e=this,n=this.graph;this.data=this.setDataFromGraph();var r=this.data.nodes;if(!r)return!1;var i=n.get("width"),o=n.get("height"),a={};Object.assign(a,{width:i,height:o,center:[i/2,o/2]},this.layoutCfg),this.layoutCfg=a;var s=!!this.layoutType,u=this.layoutMethod;u&&u.destroy(),n.emit("beforelayout");this.initPositions(a.center,r);var c=this.layoutType,f=!1;if(c&&"gpu"===c.split("-")[1]&&(c=c.split("-")[0],a.gpuEnabled=!0),c&&a.gpuEnabled){var l=!0;Xh().webgl||(console.warn("Your browser does not support webGL or GPGPU. The layout will run in CPU."),l=!1),this.hasGPUVersion(c)||(console.warn("The \'"+c+"\' layout does not support GPU calculation for now, it will run in CPU."),l=!1),l&&(c+="-gpu",f=!0)}if(this.isGPU=f,this.stopWorker(),a.workerEnabled&&this.layoutWithWorker(this.data,t))return!0;var h=a.onLayoutEnd;if(a.layoutEndFormatted||(a.layoutEndFormatted=!0,a.onLayoutEnd=function(){h&&h(),n.emit("afterlayout"),e.refreshLayout(),t&&t()}),"force"===c||"g6force"===c||"gForce"===c){var d=a.onTick,p=function(){d&&d(),n.refreshPositions()};a.tick=p}else"comboForce"===this.layoutType&&(a.comboTrees=n.get("comboTrees"));if(void 0!==c){try{u=new Nh[c](a)}catch(t){return console.warn("The layout method: \'"+c+"\' does not exist! Please specify it first."),!1}if(u.enableTick){var g=a.onTick;p=function(){g&&g(),n.refreshPositions()};u.tick=p}u.init(this.data),s&&(n.emit("beginlayout"),u.execute(),u.isCustomLayout&&a.onLayoutEnd&&a.onLayoutEnd()),this.layoutMethod=u}else a.onLayoutEnd&&a.onLayoutEnd();return!1},e.prototype.layoutWithWorker=function(t,e){var n=this,r=t.nodes,i=t.edges,o=this.layoutCfg,a=this.graph,s=this.isGPU,u=this.getWorker(),c=this.workerData;if(!u)return!1;c.requestId=null,c.requestId2=null,c.currentTick=null,c.currentTickData=null,a.emit("beforelayout");var f=document.createElement("canvas"),l=s&&"undefined"!=typeof window&&window.navigator&&!navigator.gpu&&"OffscreenCanvas"in window&&"transferControlToOffscreen"in f,h=function(t,e){var n={};if(t&&"object"===Yh(t))return Object.keys(t).forEach((function(r){t.hasOwnProperty(r)&&e(t[r])&&(n[r]=t[r])})),n;return t}(o,(function(t){return"function"!=typeof t}));if(l){var d=f.transferControlToOffscreen();h.type=h.type+"-gpu",u.postMessage({type:Vh,nodes:r,edges:i,layoutCfg:h,canvas:d},[d])}else u.postMessage({type:Gh,nodes:r,edges:i,layoutCfg:h});return u.onmessage=function(r){n.handleWorkerMessage(r,t,e)},!0},e.prototype.handleWorkerMessage=function(t,e,n){var r=this.graph,i=this.workerData,o=this.layoutCfg,a=t.data,s=a.type,u=function(){o.onTick&&o.onTick()},c=function(){o.onLayoutEnd&&o.onLayoutEnd(),r.emit("afterlayout")};switch(s){case zh:i.currentTick=a.currentTick,i.currentTickData=a,i.requestId||(i.requestId=Kh((function(){$h(e,a),r.refreshPositions(),u(),1===a.currentTick&&n&&n(),a.currentTick===a.totalTicks?c():i.currentTick===a.totalTicks&&(i.requestId2=Kh((function(){$h(e,i.currentTickData),r.refreshPositions(),i.requestId2=null,u(),c()}))),i.requestId=null})));break;case Fh:null==i.currentTick&&($h(e,a),this.refreshLayout(),n&&n(),r.emit("afterlayout"));break;case Wh:null==i.currentTick&&(!function(t,e){for(var n=t.nodes,r=e.vertexEdgeData,i=n.length,o=0;o\'),u=n?n.backgroundColor:void 0,c=n?n.padding:void 0;c?Object(h.t)(c)&&(c=[c,c,c,c]):c=[0,0,0,0];var f=i+c[0]+c[2],l=o+c[1]+c[3],d={container:s,height:f,width:l,quickHit:!0},p="svg"===a?new sn.Canvas(d):new an.Canvas(d),g=this.get("group").clone(),v=Object(h.c)(g.getMatrix());v||(v=[1,0,0,0,1,0,0,0,1]);var y=(r.maxX+r.minX)/2,m=(r.maxY+r.minY)/2;v=ed(v,[["t",-y,-m],["t",o/2+c[3],i/2+c[0]]]),g.resetMatrix(),g.setMatrix(v),p.add(g);var b=p.get("el"),x="";e||(e="image/png"),setTimeout((function(){if("svg"===a){var n=b.cloneNode(!0),r=document.implementation.createDocumentType("svg","-//W3C//DTD SVG 1.1//EN","http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"),i=document.implementation.createDocument("http://www.w3.org/2000/svg","svg",r);i.replaceChild(n,i.documentElement);var o=(new XMLSerializer).serializeToString(i);x="data:image/svg+xml;charset=utf8,"+encodeURIComponent(o)}else{var s=void 0,c=b.getContext("2d"),h=void 0;if(u){var d="undefined"!=typeof window?window.devicePixelRatio:1;s=c.getImageData(0,0,l*d,f*d),h=c.globalCompositeOperation,c.globalCompositeOperation="destination-over",c.fillStyle=u,c.fillRect(0,0,l,f)}x=b.toDataURL(e),u&&(c.clearRect(0,0,l,f),c.putImageData(s,0,0),c.globalCompositeOperation=h)}t&&t(x)}),16)},e.prototype.downloadFullImage=function(t,e,n){var r=this,i=this.get("group").getCanvasBBox(),o=i.height,a=i.width,s=this.get("renderer"),u=gt(\'\'),c=n?n.backgroundColor:void 0,f=n?n.padding:void 0;f?Object(h.t)(f)&&(f=[f,f,f,f]):f=[0,0,0,0];var l=o+f[0]+f[2],d=a+f[1]+f[3],p={container:u,height:l,width:d},g="svg"===s?new sn.Canvas(p):new an.Canvas(p),v=this.get("group").clone(),y=Object(h.c)(v.getMatrix());y||(y=[1,0,0,0,1,0,0,0,1]);var m=(i.maxX+i.minX)/2,b=(i.maxY+i.minY)/2;y=ed(y,[["t",-m,-b],["t",a/2+f[3],o/2+f[0]]]),v.resetMatrix(),v.setMatrix(y),g.add(v);var x=g.get("el");e||(e="image/png"),setTimeout((function(){var n="";if("svg"===s){var i=x.cloneNode(!0),o=document.implementation.createDocumentType("svg","-//W3C//DTD SVG 1.1//EN","http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"),a=document.implementation.createDocument("http://www.w3.org/2000/svg","svg",o);a.replaceChild(i,a.documentElement);var u=(new XMLSerializer).serializeToString(a);n="data:image/svg+xml;charset=utf8,"+encodeURIComponent(u)}else{var f=void 0,h=x.getContext("2d"),p=void 0;if(c){var g="undefined"!=typeof window?window.devicePixelRatio:1;f=h.getImageData(0,0,d*g,l*g),p=h.globalCompositeOperation,h.globalCompositeOperation="destination-over",h.fillStyle=c,h.fillRect(0,0,d,l)}n=x.toDataURL(e),c&&(h.clearRect(0,0,d,l),h.putImageData(f,0,0),h.globalCompositeOperation=p)}var v=document.createElement("a"),y=(t||"graph")+("svg"===s?".svg":"."+e.split("/")[1]);r.dataURLToImage(n,s,v,y);var m=document.createEvent("MouseEvents");m.initEvent("click",!1,!1),v.dispatchEvent(m)}),16)},e.prototype.downloadImage=function(t,e,n){var r=this,i=this;i.isAnimating()&&i.stopAnimate();var o=i.get("canvas").getRenderer();e||(e="image/png");var a=(t||"graph")+("svg"===o?".svg":e.split("/")[1]),s=document.createElement("a");setTimeout((function(){var t=i.toDataURL(e,n);r.dataURLToImage(t,o,s,a);var u=document.createEvent("MouseEvents");u.initEvent("click",!1,!1),s.dispatchEvent(u)}),16)},e.prototype.dataURLToImage=function(t,e,n,r){if("undefined"!=typeof window)if(window.Blob&&window.URL&&"svg"!==e){var i=t.split(","),o="";if(i&&i.length>0){var a=i[0].match(/:(.*?);/);a&&a.length>=2&&(o=a[1])}for(var s=atob(i[1]),u=s.length,c=new Uint8Array(u);u--;)c[u]=s.charCodeAt(u);var f=new Blob([c],{type:o});window.navigator.msSaveBlob?window.navigator.msSaveBlob(f,r):n.addEventListener("click",(function(){n.download=r,n.href=window.URL.createObjectURL(f)}))}else n.addEventListener("click",(function(){n.download=r,n.href=t}))},e.prototype.addPlugin=function(t){t.destroyed||(this.get("plugins").push(t),t.initPlugin(this))},e.prototype.removePlugin=function(t){var e=this.get("plugins"),n=e.indexOf(t);n>=0&&(t.destroyPlugin(),e.splice(n,1))},e.prototype.setImageWaterMarker=function(t,e){void 0===t&&(t=Dn.waterMarkerImage);var n=this.get("container");Object(h.x)(n)&&(n=document.getElementById(n)),n.style.position||(n.style.position="relative");var r=this.get("graphWaterMarker"),i=Object(h.e)({},Dn.imageWaterMarkerConfig,e),o=i.width,a=i.height,s=i.compatible,u=i.image;if(!r){var c={container:n,width:o,height:a,capture:!1},f=this.get("pixelRatio");f&&(c.pixelRatio=f),r=new an.Canvas(c),this.set("graphWaterMarker",r)}r.get("el").style.display="none";var l=r.get("context"),d=u.rotate,p=u.x,g=u.y;l.rotate(-d*Math.PI/180);var v=new Image;v.crossOrigin="anonymous",v.src=t,v.onload=function(){if(l.drawImage(v,p,g,u.width,u.height),l.rotate(d*Math.PI/180),s)n.style.cssText="background-image: url("+r.get("el").toDataURL("image/png")+");background-repeat:repeat;";else{var t=document.querySelector(".g6-graph-watermarker");t||((t=document.createElement("div")).className="g6-graph-watermarker"),t.className="g6-graph-watermarker",r.destroyed||(t.style.cssText="background-image: url("+r.get("el").toDataURL("image/png")+");background-repeat:repeat;position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none;z-index:-1;",n.appendChild(t))}}},e.prototype.setTextWaterMarker=function(t,e){var n=this.get("container");Object(h.x)(n)&&(n=document.getElementById(n)),n.style.position||(n.style.position="relative");var r=this.get("graphWaterMarker"),i=Object(h.e)({},Dn.textWaterMarkerConfig,e),o=i.width,a=i.height,s=i.compatible,u=i.text;if(!r){var c={container:n,width:o,height:a,capture:!1},f=this.get("pixelRatio");f&&(c.pixelRatio=f),r=new an.Canvas(c),this.set("graphWaterMarker",r)}r.get("el").style.display="none";var l=r.get("context"),d=u.rotate,p=u.fill,g=u.fontFamily,v=u.fontSize,y=u.baseline,m=u.x,b=u.y,x=u.lineHeight;l.rotate(-d*Math.PI/180),l.font=v+"px "+g,l.fillStyle=p,l.textBaseline=y;for(var w=t.length-1;w>=0;w--)l.fillText(t[w],m,b+w*x);if(l.rotate(d*Math.PI/180),s)n.style.cssText="background-image: url("+r.get("el").toDataURL("image/png")+");background-repeat:repeat;";else{var S=document.querySelector(".g6-graph-watermarker");S||((S=document.createElement("div")).className="g6-graph-watermarker"),S.style.cssText="background-image: url("+r.get("el").toDataURL("image/png")+");background-repeat:repeat;position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none;z-index:99;",n.appendChild(S)}},e.prototype.destroy=function(){Object(h.f)(this.get("plugins"),(function(t){t.destroyPlugin()}));var e=this.get("tooltips");if(e)for(var n=0;n=0&&(o="x",i="y");var a=0;od(t,(function(t){return a++,t.x>r.x&&(r.x=t.x),t.xr.y&&(r.y=t.y),t.y0)for(var c=u.length-1;c>=0;c--){var f=u[c].getModel();-1===e.indexOfChild(t.children||[],f.id)&&(i.innerRemoveChild(f.id,{x:t.x,y:t.y},r),u.splice(c,1))}o.get("originAttrs")&&(a=o.get("originAttrs").x,s=o.get("originAttrs").y);var l=o.getModel();r&&o.set("originAttrs",{x:l.x,y:l.y}),o.set("model",t.data),a===t.x&&s===t.y||o.updatePosition({x:t.x,y:t.y})}else i.innerAddChild(t,n,r)},e.prototype.innerRemoveChild=function(t,e,n){var r=this,i=r.findById(t);if(i)if(Object(h.f)(i.get("children"),(function(t){r.innerRemoveChild(t.getModel().id,e,n)})),n){var o=i.getModel();i.set("to",e),i.set("originAttrs",{x:o.x,y:o.y}),r.get("removeList").push(i)}else r.removeItem(i)},e.prototype.changeData=function(t){var e=this;this.getNodes().map((function(t){return e.clearItemStates(t)})),this.getEdges().map((function(t){return e.clearItemStates(t)})),t?(e.data(t),e.render()):e.layout(this.get("fitView"))},e.prototype.changeLayout=function(t){console.warn("Please call updateLayout instead of changeLayout. changeLayout will be discarded soon");this.updateLayout(t)},e.prototype.updateLayout=function(t){t?(this.set("layout",t),this.set("layoutMethod",this.getLayout()),this.layout()):console.warn("layout cannot be null")},e.prototype.refreshLayout=function(t){console.warn("Please call layout instead of refreshLayout. refreshLayout will be discarded soon");this.layout(t)},e.prototype.layout=function(t){var e=this.get("data"),n=this.get("layoutMethod")(e,this.get("layout")),r=this.get("animate");(this.emit("beforerefreshlayout",{data:e,layoutData:n}),this.emit("beforelayout"),this.innerUpdateChild(n,void 0,r),t)&&this.get("viewController").fitView();r?this.layoutAnimate(n):(this.refresh(),this.paint()),this.emit("afterrefreshlayout",{data:e,layoutData:n}),this.emit("afterlayout")},e.prototype.addChild=function(t,e){this.emit("beforeaddchild",{model:t,parent:e}),Object(h.x)(e)||(e=e.get("id"));var n=this.findDataById(e);n&&(n.children||(n.children=[]),n.children.push(t),this.changeData())},e.prototype.updateChildren=function(t,e){e&&this.findById(e)?(this.findDataById(e).children=t,this.changeData()):console.warn("Update children failed! There is no node with id \'"+e+"\'")},e.prototype.updateChild=function(t,n){if(n&&this.findById(n)){var r=this.findDataById(n),i=this.findById(t.id);if(r.children||(r.children=[]),i){var o=e.indexOfChild(r.children,t.id);r.children[o]=t}else r.children.push(t);this.changeData()}else this.changeData(t)},e.prototype.removeChild=function(t){var n=this.findById(t);if(n){var r=n.get("parent");if(r&&!r.destroyed){var i=this.findDataById(r.get("id")),o=i&&i.children||[],a=n.getModel(),s=e.indexOfChild(o,a.id);o.splice(s,1)}this.changeData()}},e.prototype.findDataById=function(t,e){var n=this;if(e||(e=n.get("data")),t===e.id)return e;var r=null;return Object(h.f)(e.children||[],(function(e){return e.id===t?(r=e,!1):!(r=n.findDataById(t,e))&&void 0})),r},e.prototype.layoutAnimate=function(t,e){var n=this,r=this.get("animateCfg");n.emit("beforeanimate",{data:t}),n.getEdges().forEach((function(t){var e=t.get("model");e.sourceAnchor||(e.sourceAnchor=t.get("sourceAnchorIndex"))})),this.get("canvas").animate((function(r){gd(t,(function(i){var o=n.findById(i.id);if(o){var a=o.get("originAttrs"),s=o.get("model");if(a||(a={x:s.x,y:s.y},o.set("originAttrs",a)),e){var u=e(o,r,a,t);o.set("model",Object.assign(s,u))}else s.x=a.x+(i.x-a.x)*r,s.y=a.y+(i.y-a.y)*r}return!0})),Object(h.f)(n.get("removeList"),(function(t){var e=t.getModel(),n=t.get("originAttrs"),i=t.get("to");e.x=n.x+(i.x-n.x)*r,e.y=n.y+(i.y-n.y)*r})),n.refreshPositions()}),{duration:r.duration,easing:r.ease,callback:function(){Object(h.f)(n.getNodes(),(function(t){t.set("originAttrs",null)})),Object(h.f)(n.get("removeList"),(function(t){n.removeItem(t)})),n.set("removeList",[]),r.callback&&r.callback(),n.emit("afteranimate",{data:t})},delay:r.delay})},e.prototype.stopLayoutAnimate=function(){this.get("canvas").stopAnimate(),this.emit("layoutanimateend",{data:this.get("data")}),this.layoutAnimating=!1},e.prototype.isLayoutAnimating=function(){return this.layoutAnimating},e.prototype.render=function(){if(!this.get("data"))throw new Error("data must be defined first");this.clear(),this.emit("beforerender"),this.layout(this.get("fitView")),this.emit("afterrender")},e.prototype.save=function(){return this.get("data")},e}(nd),yd=function(){function t(t){this._cfgs=Object(h.e)(this.getDefaultCfgs(),t),this._events={},this.destroyed=!1}return t.prototype.getDefaultCfgs=function(){return{}},t.prototype.initPlugin=function(t){var e=this;e.set("graph",t);var n=e.getEvents(),r={};Object(h.f)(n,(function(n,i){var o=Object(h.J)(e,n);r[i]=o,t.on(i,o)})),this._events=r,this.init()},t.prototype.getEvents=function(){return{}},t.prototype.get=function(t){return this._cfgs[t]},t.prototype.set=function(t,e){this._cfgs[t]=e},t.prototype.destroy=function(){},t.prototype.destroyPlugin=function(){this.destroy();var t=this.get("graph"),e=this._events;Object(h.f)(e,(function(e,n){t.off(n,e)})),this._events=null,this._cfgs=null,this.destroyed=!0},t}(),md=(td=function(t,e){return(td=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}td(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),bd="url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHBhdHRlcm4gaWQ9ImdyaWQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZD0iTSAwIDEwIEwgNDAgMTAgTSAxMCAwIEwgMTAgNDAgTSAwIDIwIEwgNDAgMjAgTSAyMCAwIEwgMjAgNDAgTSAwIDMwIEwgNDAgMzAgTSAzMCAwIEwgMzAgNDAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2UwZTBlMCIgb3BhY2l0eT0iMC4yIiBzdHJva2Utd2lkdGg9IjEiLz48cGF0aCBkPSJNIDQwIDAgTCAwIDAgMCA0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTBlMGUwIiBzdHJva2Utd2lkdGg9IjEiLz48L3BhdHRlcm4+PC9kZWZzPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JpZCkiLz48L3N2Zz4=)",xd=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return md(e,t),e.prototype.getDefaultCfgs=function(){return{img:bd}},e.prototype.init=function(){var t=this.get("graph"),e=t.get("minZoom"),n=t.get("container"),r=t.get("canvas").get("el"),i=t.get("width"),o=t.get("height"),a=this.get("img")||bd,s=gt("
"),u=gt("
");s.appendChild(u),vt(s,{width:i+"px",height:o+"px",left:n.offsetLeft+"px",top:n.offsetTop+"px"}),vt(u,{width:i/e+"px",height:o/e+"px",left:"0px",top:"0px"}),n.insertBefore(s,r),this.set("container",s),this.set("gridContainer",u)},e.prototype.getEvents=function(){return{viewportchange:"updateGrid"}},e.prototype.updateGrid=function(t){var e=this.get("gridContainer"),n=t.matrix;n||(n=[1,0,0,0,1,0,0,0,1]),vt(e,{transform:"matrix("+n[0]+", "+n[1]+", "+n[3]+", "+n[4]+", 0, 0)"})},e.prototype.getContainer=function(){return this.get("container")},e.prototype.destroy=function(){var t=this.get("graph").get("container"),e=this.get("container");t.removeChild(e)},e}(yd),wd=n(83),Sd=n.n(wd),Ed=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Sd()("\\n .g6-component-contextmenu {\\n border: 1px solid #e2e2e2;\\n border-radius: 4px;\\n font-size: 12px;\\n color: #545454;\\n background-color: rgba(255, 255, 255, 0.9);\\n padding: 10px 8px;\\n box-shadow: rgb(174, 174, 174) 0px 0px 10px;\\n }\\n .g6-contextmenu-ul {\\n padding: 0;\\n margin: 0;\\n list-style: none;\\n }\\n\\n");var _d=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Ed(e,t),e.prototype.getDefaultCfgs=function(){return{offsetX:6,offsetY:6,handleMenuClick:void 0,getContent:function(t){return"\\n
    \\n
  • 菜单项1
  • \\n
  • 菜单项2
  • \\n
\\n "},shouldBegin:function(t){return!0},onHide:function(){return!0},itemTypes:["node","edge","combo"]}},e.prototype.getEvents=function(){return{contextmenu:"onMenuShow"}},e.prototype.init=function(){var t=gt("
");vt(t,{top:"0px",position:"absolute",visibility:"hidden"});var e=this.get("container");e||(e=this.get("graph").get("container")),Object(h.x)(e)&&(e=document.getElementById(e)),e.appendChild(t),this.set("menu",t)},e.prototype.onMenuShow=function(t){var e=this;t.preventDefault(),t.stopPropagation();var n=this.get("itemTypes");if(t.item){if(t.item&&t.item.getType&&-1===n.indexOf(t.item.getType()))return void e.onMenuHide()}else if(-1===n.indexOf("canvas"))return;if(this.get("shouldBegin")(t)){var r=this.get("menu"),i=this.get("getContent"),o=this.get("graph"),a=i(t,o);Object(h.x)(a)?r.innerHTML=a:r.innerHTML=a.outerHTML,this.removeMenuEventListener();var s=this.get("handleMenuClick");if(s){var u=function(e){s(e.target,t.item,o)};this.set("handleMenuClickWrapper",u),r.addEventListener("click",u)}var c=o.get("width"),f=o.get("height"),l=r.getBoundingClientRect(),d=this.get("offsetX")||0,p=this.get("offsetY")||0,g=o.getContainer().offsetTop,v=o.getContainer().offsetLeft,y=t.canvasX+v+d,m=t.canvasY+g+p;y+l.width>c&&(y=t.canvasX-l.width-d+v),m+l.height>f&&(m=t.canvasY-l.height-p+g),vt(r,{top:m+"px",left:y+"px",visibility:"visible"});var b=function(t){e.onMenuHide()};document.body.addEventListener("click",b),this.set("handler",b)}},e.prototype.removeMenuEventListener=function(){var t=this.get("handleMenuClickWrapper"),e=this.get("handler");t&&(this.get("menu").removeEventListener("click",t),this.set("handleMenuClickWrapper",null));e&&document.body.removeEventListener("click",e)},e.prototype.onMenuHide=function(){var t=this.get("menu");t&&vt(t,{visibility:"hidden"}),this.removeMenuEventListener()},e.prototype.destroy=function(){var t=this.get("menu");if(this.removeMenuEventListener(),t){var e=this.get("container");e||(e=this.get("graph").get("container")),Object(h.x)(e)&&(e=document.getElementById(e)),e.removeChild(t)}},e}(yd),Od=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),kd=function(){return(kd=Object.assign||function(t){for(var e,n=1,r=arguments.length;n\\n "),a=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,s=0,u=0,c=!1,f=0,l=0,d=0,p=0,g=0,v=0;o.addEventListener("dragstart",(function(i){var a,h;if(i.dataTransfer){var y=new Image;y.src="data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' %3E%3Cpath /%3E%3C/svg%3E",null===(h=(a=i.dataTransfer).setDragImage)||void 0===h||h.call(a,y,0,0);try{i.dataTransfer.setData("text/html","view-port-minimap")}catch(t){i.dataTransfer.setData("text","view-port-minimap")}}if(e.refresh=!1,i.target===o){var m=o.style;f=parseInt(m.left,10),l=parseInt(m.top,10),d=parseInt(m.width,10),p=parseInt(m.height,10),d>n[0]||p>n[1]||(v=r.getZoom(),g=t.get("ratio"),c=!0,s=i.clientX,u=i.clientY)}}),!1),o.addEventListener(a?"dragover":"drag",(function(t){if(c&&!Object(h.s)(t.clientX)&&!Object(h.s)(t.clientY)){var e=s-t.clientX,i=u-t.clientY;(f-e<0||f-e+d>=n[0])&&(e=0),(l-i<0||l-i+p>=n[1])&&(i=0),vt(o,{left:(f-=e)+"px",top:(l-=i)+"px"}),r.translate(e*v/g,i*v/g),s=t.clientX,u=t.clientY}}),!1),o.addEventListener("dragend",(function(){c=!1,e.refresh=!0}),!1),this.set("viewport",o),i.appendChild(o)}},e.prototype.updateViewport=function(){if(!this.destroyed){var t=this.get("ratio"),e=(this.get("dx"),this.get("dy"),this.get("totaldx")),n=this.get("totaldy"),r=this.get("graph"),i=this.get("size"),o=r.get("width"),a=r.get("height"),s=r.getPointByCanvas(0,0),u=r.getPointByCanvas(o,a),c=this.get("viewport");c||this.initViewport();r.getZoom();var f=(u.x-s.x)*t,l=(u.y-s.y)*t,h=s.x*t+e,d=s.y*t+n,p=h+f,g=d+l;h<0&&(f+=h,h=0),p>i[0]&&(f-=p-i[0]),d<0&&(l+=d,d=0),g>i[1]&&(l-=g-i[1]),this.set("ratio",t),vt(c,{left:h+"px",top:d+"px",width:f+"px",height:l+"px"})}},e.prototype.updateGraphShapes=function(){var t=this._cfgs.graph,e=this.get("canvas"),n=t.get("group");if(!n.destroyed){var r=n.clone();r.resetMatrix(),e.clear(),e.add(r),"svg"===t.get("renderer")&&this.updateVisible(r)}},e.prototype.updateVisible=function(t){var e=this;if(t.isGroup()||t.get("visible")){var n=t.get("children");if(!n||!n.length)return;n.forEach((function(t){t.get("visible")||t.hide(),e.updateVisible(t)}))}else t.hide()},e.prototype.updateKeyShapes=function(){var t=this,e=this._cfgs.graph;Object(h.f)(e.getEdges(),(function(e){t.updateOneEdgeKeyShape(e)})),Object(h.f)(e.getNodes(),(function(e){t.updateOneNodeKeyShape(e)})),this.clearDestroyedShapes()},e.prototype.updateOneNodeKeyShape=function(t){var e=this.get("canvas"),n=e.get("children")[0]||e.addGroup(),r=this.get("itemMap")||{},i=r[t.get("id")],o=t.getBBox(),a=t.get("keyShape").clone(),s=a.attr(),u={x:o.centerX,y:o.centerY};i?u=Object.assign(s,u):(i=a,n.add(i));var c=i.get("type");"rect"!==c&&"image"!==c||(u.x=o.minX,u.y=o.minY),i.attr(u),t.isVisible()||i.hide(),i.exist=!0,r[t.get("id")]=i,this.set("itemMap",r)},e.prototype.updateDelegateShapes=function(){var t=this,e=this._cfgs.graph;Object(h.f)(e.getEdges(),(function(e){t.updateOneEdgeKeyShape(e)})),Object(h.f)(e.getNodes(),(function(e){t.updateOneNodeDelegateShape(e)})),this.clearDestroyedShapes()},e.prototype.clearDestroyedShapes=function(){var t=this.get("itemMap")||{},e=Object.keys(t);if(e&&0!==e.length)for(var n=e.length-1;n>=0;n--){var r=t[e[n]],i=r.exist;r.exist=!1,i||(r.remove(),delete t[e[n]])}},e.prototype.updateOneEdgeKeyShape=function(t){var e=this.get("canvas"),n=e.get("children")[0]||e.addGroup(),r=this.get("itemMap")||{},i=r[t.get("id")];if(i){var o=t.get("keyShape").attr("path");i.attr("path",o)}else i=t.get("keyShape").clone(),n.add(i),i.toBack();t.isVisible()||i.hide(),i.exist=!0,r[t.get("id")]=i,this.set("itemMap",r)},e.prototype.updateOneNodeDelegateShape=function(t){var e=this.get("canvas"),n=e.get("children")[0]||e.addGroup(),r=this.get("delegateStyle"),i=this.get("itemMap")||{},o=i[t.get("id")],a=t.getBBox();if(o){var s={x:a.minX,y:a.minY,width:a.width,height:a.height};o.attr(s)}else o=n.addShape("rect",{attrs:kd({x:a.minX,y:a.minY,width:a.width,height:a.height},r),name:"minimap-node-shape"});t.isVisible()||o.hide(),o.exist=!0,i[t.get("id")]=o,this.set("itemMap",i)},e.prototype.init=function(){this.initContainer(),this.get("graph").on("afterupdateitem",this.handleUpdateCanvas),this.get("graph").on("afteritemstatechange",this.handleUpdateCanvas),this.get("graph").on("afteradditem",this.handleUpdateCanvas),this.get("graph").on("afterremoveitem",this.handleUpdateCanvas),this.get("graph").on("afterrender",this.handleUpdateCanvas),this.get("graph").on("afterlayout",this.handleUpdateCanvas)},e.prototype.initContainer=function(){var t=this.get("graph"),e=this.get("size"),n=this.get("className"),r=this.get("container"),i=gt("
");Object(h.x)(r)&&(r=document.getElementById(r)),r?r.appendChild(i):t.get("container").appendChild(i),this.set("container",i);var o,a=gt(\'
\');i.appendChild(a),o="svg"===t.get("renderer")?new sn.Canvas({container:a,width:e[0],height:e[1]}):new an.Canvas({container:a,width:e[0],height:e[1]}),this.set("canvas",o),this.updateCanvas()},e.prototype.updateCanvas=function(){if(this.get("refresh")){var t=this.get("graph");if(!t.get("destroyed")){this.get("viewportChange")&&(this.set("viewportChange",!1),this.updateViewport());var e=this.get("size"),n=this.get("canvas"),r=this.get("type"),i=this.get("padding");if(!n.destroyed){switch(r){case"default":this.updateGraphShapes();break;case"keyShape":this.updateKeyShapes();break;case"delegate":this.updateDelegateShapes()}var o=n.get("children")[0];if(o){o.resetMatrix();var a=o.getCanvasBBox(),s=t.get("canvas").getCanvasBBox(),u=s.width,c=s.height;Number.isFinite(a.width)&&(u=Md(a.width,u),c=Md(a.height,c)),u+=2*i,c+=2*i;var f=Math.min(e[0]/u,e[1]/c),l=[1,0,0,0,1,0,0,0,1],h=0,d=0;Number.isFinite(a.minX)&&(h=-a.minX),Number.isFinite(a.minY)&&(d=-a.minY);var p=(e[0]-(u-2*i)*f)/2,g=(e[1]-(c-2*i)*f)/2;l=Ad(l,[["t",h,d],["s",f,f],["t",p,g]]),o.setMatrix(l),this.set("ratio",f),this.set("totaldx",p+h*f),this.set("totaldy",g+d*f),this.set("dx",p),this.set("dy",g),this.updateViewport()}}}}},e.prototype.getCanvas=function(){return this.get("canvas")},e.prototype.getViewport=function(){return this.get("viewport")},e.prototype.getContainer=function(){return this.get("container")},e.prototype.destroy=function(){this.get("canvas").destroy();var t=this.get("container");t.parentNode.removeChild(t)},e}(yd),Cd=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();function Id(t,e,n){var r=t.x-e.x,i=t.y-e.y;return!n||Math.abs(r)>n||Math.abs(i)>n?Math.sqrt(r*r+i*i):n}function Pd(t,e){var n=(e.source.y-e.target.y)/(e.source.x-e.target.x),r=(n*n*e.source.x+n*(t.y-e.source.y)+t.x)/(n*n+1);return{x:r,y:n*(r-e.source.x)+e.source.y}}var jd=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Cd(e,t),e.prototype.getDefaultCfgs=function(){return{edgeBundles:[],edgePoints:[],K:.1,lambda:.1,divisions:1,divRate:2,cycles:6,iterations:90,iterRate:.6666667,bundleThreshold:.6,eps:1e-6,onLayoutEnd:function(){},onTick:function(){}}},e.prototype.init=function(){var t=this.get("graph"),e=this.get("onTick");this.set("tick",(function(){e&&e(),t.refreshPositions()}))},e.prototype.bundling=function(t){var e=this;if(e.set("data",t),!e.isTicking()){var n=t.edges||[],r=t.nodes||[],i={},o=!1;if(r.forEach((function(t){null!==t.x&&null!==!t.y&&void 0!==t.x&&void 0!==!t.y||(o=!0),i[t.id]=t})),o)throw new Error("please layout the graph or assign x and y for nodes first");e.set("nodeIdMap",i);var a=e.get("divisions"),s=e.get("divRate"),u=e.divideEdges(a);e.set("edgePoints",u);var c=e.getEdgeBundles();e.set("edgeBundles",c);for(var f=e.get("cycles"),l=e.get("iterations"),h=e.get("iterRate"),d=e.get("lambda"),p=0;pc;){var r=c/n,a={x:i[o][e-1].x,y:i[o][e-1].y};a.x+=r*(t.x-i[o][e-1].x),a.y+=r*(t.y-i[o][e-1].y),f.push(a),n-=c,c=u}c-=n}})),f.push({x:s.x,y:s.y}),i[o]=f}})),i},e.prototype.getEdgeLength=function(t){var e=0;return t.forEach((function(n,r){0!==r&&(e+=Id(n,t[r-1]))})),e},e.prototype.getEdgeBundles=function(){var t=this,e=t.get("data").edges||[],n=t.get("bundleThreshold"),r=t.get("nodeIdMap"),i=t.get("edgeBundles");return i||(i=[]),e.forEach((function(t,e){i[e]&&void 0!==i[e]||(i[e]=[])})),e.forEach((function(o,a){var s=r[o.source],u=r[o.target];e.forEach((function(e,o){if(!(o<=a)){var c=r[e.source],f=r[e.target];t.getBundleScore({source:s,target:u},{source:c,target:f})>=n&&(i[a].push(o),i[o].push(a))}}))})),i},e.prototype.getBundleScore=function(t,e){return t.vx=t.target.x-t.source.x,t.vy=t.target.y-t.source.y,e.vx=e.target.x-e.source.x,e.vy=e.target.y-e.source.y,t.length=Id({x:t.source.x,y:t.source.y},{x:t.target.x,y:t.target.y}),e.length=Id({x:e.source.x,y:e.source.y},{x:e.target.x,y:e.target.y}),this.getAngleScore(t,e)*this.getScaleScore(t,e)*this.getPositionScore(t,e)*this.getVisibilityScore(t,e)},e.prototype.getAngleScore=function(t,e){return function(t,e){return t.x*e.x+t.y*e.y}({x:t.vx,y:t.vy},{x:e.vx,y:e.vy})/(t.length*e.length)},e.prototype.getScaleScore=function(t,e){var n=(t.length+e.length)/2;return 2/(n/Math.min(t.length,e.length)+Math.max(t.length,e.length)/n)},e.prototype.getPositionScore=function(t,e){var n=(t.length+e.length)/2;return n/(n+Id({x:(t.source.x+t.target.x)/2,y:(t.source.y+t.target.y)/2},{x:(e.source.x+e.target.x)/2,y:(e.source.y+e.target.y)/2}))},e.prototype.getVisibilityScore=function(t,e){var n=this.getEdgeVisibility(t,e),r=this.getEdgeVisibility(e,t);return nn||Math.abs(o.y)>n){var s=1/Id(i[r][t],i[e][t]);a.x+=o.x*s,a.y+=o.y*s}})),a},e.prototype.isTicking=function(){return this.get("ticking")},e.prototype.getSimulation=function(){return this.get("forceSimulation")},e.prototype.destroy=function(){this.get("ticking")&&this.getSimulation().stop(),t.prototype.destroy.call(this)},e}(yd),Dd=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),Nd=function(){return(Nd=Object.assign||function(t){for(var e,n=1,r=arguments.length;n(o||n.get("height"))&&e>1||s<(a||.05*n.get("height"))&&e<1)&&(e=1),s*=e,this.set("r",s),this.set("r2",s*s);var u=this.get("d");this.set("molecularParam",(u+1)*s),this.set("delegateCenterDiff",void 0),this.magnify(t,i)}},e.prototype.scaleRByDrag=function(t){if(t){var e,n=this.get("dragPrePos"),r=this.get("graph"),i=r.getPointByClient(t.clientX,t.clientY);e=t.x-n.x<0?.95:1/.95;var o=this.get("maxR"),a=this.get("minR"),s=this.get("r");(s>(o||r.get("height"))&&e>1||s<(a||.05*r.get("height"))&&e<1)&&(e=1),s*=e,this.set("r",s),this.set("r2",s*s);var u=this.get("d");this.set("molecularParam",(u+1)*s),this.magnify(t,i),this.set("dragPrePos",{x:t.x,y:t.y})}},e.prototype.scaleDByWheel=function(t){if(t||t.originalEvent){t.preventDefault&&t.preventDefault();var e=0;e=t.originalEvent.wheelDelta<0?-.1:.1;var n=this.get("d")+e,r=this.get("maxD"),i=this.get("minD");if(ni){this.set("d",n);var o=this.get("r");this.set("molecularParam",(n+1)*o);var a=this.get("delegate"),s=a?{x:a.attr("x"),y:a.attr("y")}:void 0;this.set("delegateCenterDiff",void 0),this.magnify(t,s)}}},e.prototype.scaleDByDrag=function(t){var e=this.get("dragPrePos"),n=t.x-e.x>0?.1:-.1,r=this.get("d")+n,i=this.get("maxD"),o=this.get("minD");if(ro){this.set("d",r);var a=this.get("r");this.set("molecularParam",(r+1)*a),this.magnify(t)}this.set("dragPrePos",{x:t.x,y:t.y})},e.prototype.magnify=function(t,e){this.restoreCache();var n=this.get("graph"),r=this.get("cachedMagnifiedModels"),i=this.get("cachedOriginPositions"),o=this.get("showLabel"),a=this.get("r"),s=this.get("r2"),u=this.get("d"),c=this.get("molecularParam"),f=n.getNodes(),l=f.length,h=e?{x:e.x,y:e.y}:{x:t.x,y:t.y};!this.get("dragging")||"mousemove"!==this.get("trigger")&&"click"!==this.get("trigger")||(h=this.get("cacheCenter"));var d=this.get("delegateCenterDiff");d&&(h.x+=d.x,h.y+=d.y),this.updateDelegate(h,a);for(var p=0;p\\n
  • \\n \\n \\n \\n
  • \\n
  • \\n \\n \\n \\n
  • \\n
  • \\n \\n \\n \\n
  • \\n
  • \\n \\n \\n \\n
  • \\n
  • \\n \\n \\n \\n
  • \\n
  • \\n \\n \\n \\n
  • \\n \\n \'},zoomSensitivity:2}},e.prototype.init=function(){var t=this,e=this.get("graph"),n=this.get("getContent")(e),r=n;Object(h.x)(n)&&(r=gt(n));var i=this.get("className");r.setAttribute("class",i||"g6-component-toolbar");var o=this.get("container");o||(o=this.get("graph").get("container")),Object(h.x)(o)&&(o=document.getElementById(o)),o.appendChild(r),this.set("toolBar",r);var a=this.get("handleClick");r.addEventListener("click",(function(n){var r=function(t){if(!t)return[];if(t.composedPath)return t.composedPath();for(var e=[],n=t.target;n;){if(e.push(n),"HTML"===n.tagName)return e.push(document,window),e;n=n.parentElement}return e}(n).filter((function(t){return"LI"===t.nodeName}));if(0!==r.length){var i=r[0].getAttribute("code");i&&(a?a(i,e):t.handleDefaultOperator(i,e))}}));var s=this.get("position");s&&vt(r,{top:s.y+"px",left:s.x+"px"}),this.bindUndoRedo()},e.prototype.bindUndoRedo=function(){var t=this.get("graph"),e=document.querySelector(\'.g6-component-toolbar li[code="undo"]\'),n=document.querySelector(\'.g6-component-toolbar li[code="undo"] svg\'),r=document.querySelector(\'.g6-component-toolbar li[code="redo"]\'),i=document.querySelector(\'.g6-component-toolbar li[code="redo"] svg\');e&&n&&r&&i&&t.on("stackchange",(function(t){var o=t.undoStack,a=t.redoStack,s=o.length,u=a.length;1===s?(e.setAttribute("style","cursor: not-allowed"),n.setAttribute("style","opacity: 0.4")):(e.removeAttribute("style"),n.removeAttribute("style")),0===u?(r.setAttribute("style","cursor: not-allowed"),i.setAttribute("style","opacity: 0.4")):(r.removeAttribute("style"),i.removeAttribute("style"))}))},e.prototype.undo=function(){var t=this.get("graph"),e=t.getUndoStack();if(e&&0!==e.length){var n=e.pop();if(n){var r=n.action;t.pushStack(r,Object(h.c)(n.data),"redo");var i=n.data.before;if("add"===r&&(i=n.data.after),!i)return;switch(r){case"visible":Object.keys(i).forEach((function(e){var n=i[e];n&&n.forEach((function(e){var n=t.findById(e.id);e.visible?t.showItem(n,!1):t.hideItem(n,!1)}))}));break;case"render":case"update":Object.keys(i).forEach((function(e){var n=i[e];n&&n.forEach((function(e){t.updateItem(e.id,e,!1)}))}));break;case"changedata":t.changeData(i,!1);break;case"delete":Object.keys(i).forEach((function(e){var n=i[e];n&&n.forEach((function(e){var n=e.itemType;delete e.itemType,t.addItem(n,e,!1)}))}));break;case"add":Object.keys(i).forEach((function(e){var n=i[e];n&&n.forEach((function(e){t.removeItem(e.id,!1)}))}));break;case"updateComboTree":Object.keys(i).forEach((function(e){var n=i[e];n&&n.forEach((function(e){t.updateComboTree(e.id,e.parentId,!1)}))}))}}}},e.prototype.redo=function(){var t=this.get("graph"),e=t.getRedoStack();if(e&&0!==e.length){var n=e.pop();if(n){var r=n.action,i=n.data.after;if(t.pushStack(r,Object(h.c)(n.data)),"delete"===r&&(i=n.data.before),!i)return;switch(r){case"visible":Object.keys(i).forEach((function(e){var n=i[e];n&&n.forEach((function(e){var n=t.findById(e.id);e.visible?t.showItem(n,!1):t.hideItem(n,!1)}))}));break;case"render":case"update":Object.keys(i).forEach((function(e){var n=i[e];n&&n.forEach((function(e){t.updateItem(e.id,e,!1)}))}));break;case"changedata":t.changeData(i,!1);break;case"delete":i.edges&&i.edges.forEach((function(e){t.removeItem(e.id,!1)})),i.nodes&&i.nodes.forEach((function(e){t.removeItem(e.id,!1)})),i.combos&&i.combos.forEach((function(e){t.removeItem(e.id,!1)}));break;case"add":Object.keys(i).forEach((function(e){var n=i[e];n&&n.forEach((function(e){var n=e.itemType;delete e.itemType,t.addItem(n,e,!1)}))}));break;case"updateComboTree":Object.keys(i).forEach((function(e){var n=i[e];n&&n.forEach((function(e){t.updateComboTree(e.id,e.parentId,!1)}))}))}}}},e.prototype.handleDefaultOperator=function(t,e){var n=e.getZoom();switch(t){case"redo":this.redo();break;case"undo":this.undo();break;case"zoomOut":var r=1/(1-.05*this.get("zoomSensitivity"));if(r*n>(this.get("maxZoom")||e.get("maxZoom")))return;e.zoomTo(n*r);break;case"zoomIn":var i=1-.05*this.get("zoomSensitivity");if(i*n<(this.get("minZoom")||e.get("minZoom")))return;e.zoomTo(n*i);break;case"realZoom":e.zoomTo(1);break;case"autoZoom":e.fitView([20,20])}},e.prototype.destroy=function(){var t=this.get("toolBar");if(t){var e=this.get("container");e||(e=this.get("graph").get("container")),Object(h.x)(e)&&(e=document.getElementById(e)),e.removeChild(t)}var n=this.get("handleClick");n&&t.removeEventListener("click",n)},e}(yd),Fd=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Sd()("\\n .g6-component-tooltip {\\n border: 1px solid #e2e2e2;\\n border-radius: 4px;\\n font-size: 12px;\\n color: #545454;\\n background-color: rgba(255, 255, 255, 0.9);\\n padding: 10px 8px;\\n box-shadow: rgb(174, 174, 174) 0px 0px 10px;\\n }\\n .tooltip-type {\\n padding: 0;\\n margin: 0;\\n }\\n .tooltip-id {\\n color: #531dab;\\n }\\n");var Ud=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Fd(e,t),e.prototype.getDefaultCfgs=function(){return{offsetX:6,offsetY:6,getContent:function(t){return"\\n

    类型:"+t.item.getType()+"

    \\n ID:"+t.item.getID()+"\\n "},shouldBegin:function(t){return!0},itemTypes:["node","edge","combo"]}},e.prototype.getEvents=function(){return{"node:mouseenter":"onMouseEnter","node:mouseleave":"onMouseLeave","node:mousemove":"onMouseMove","edge:mouseenter":"onMouseEnter","edge:mouseleave":"onMouseLeave","edge:mousemove":"onMouseMove","combo:mouseenter":"onMouseEnter","combo:mouseleave":"onMouseLeave","combo:mousemove":"onMouseMove",afterremoveitem:"onMouseLeave",contextmenu:"onMouseLeave","node:drag":"onMouseLeave"}},e.prototype.init=function(){var t=gt("
    "),e=this.get("container");e||(e=this.get("graph").get("container")),Object(h.x)(e)&&(e=document.getElementById(e)),vt(t,{position:"absolute",visibility:"hidden"}),e.appendChild(t),this.set("tooltip",t)},e.prototype.onMouseEnter=function(t){var e=this.get("itemTypes");if(!t.item||!t.item.getType||-1!==e.indexOf(t.item.getType())){var n=t.item,r=this.get("graph");this.currentTarget=n,this.showTooltip(t),r.emit("tooltipchange",{item:t.item,action:"show"})}},e.prototype.onMouseMove=function(t){var e=this.get("itemTypes");t.item&&t.item.getType&&-1===e.indexOf(t.item.getType())||this.currentTarget&&t.item===this.currentTarget&&this.showTooltip(t)},e.prototype.onMouseLeave=function(){this.hideTooltip(),this.get("graph").emit("tooltipchange",{item:this.currentTarget,action:"hide"}),this.currentTarget=null},e.prototype.showTooltip=function(t){if(t.item){var e=this.get("itemTypes");if(!t.item.getType||-1!==e.indexOf(t.item.getType())){var n=this.get("tooltip"),r=this.get("getContent")(t);Object(h.x)(r)?n.innerHTML=r:n.innerHTML=r.outerHTML,this.updatePosition(t)}}},e.prototype.hideTooltip=function(){var t=this.get("tooltip");t&&vt(t,{visibility:"hidden"})},e.prototype.updatePosition=function(t){var e=this.get("shouldBegin"),n=this.get("tooltip");if(e(t)){var r=this.get("graph"),i=r.get("width"),o=r.get("height"),a=this.get("offsetX")||0,s=this.get("offsetY")||0,u=r.getPointByClient(t.clientX,t.clientY),c=r.getCanvasByPoint(u.x,u.y),f=c.x,l=c.y;f+=a,l+=s;var h=n.getBoundingClientRect();f+h.width>i&&(f=f-h.width-a),l+h.height>o&&(l=l-h.height-s),vt(n,{left:f+"px",top:l+"px",visibility:"visible"})}else vt(n,{visibility:"hidden"})},e.prototype.hide=function(){this.onMouseLeave()},e.prototype.destroy=function(){var t=this.get("tooltip");if(t){var e=this.get("container");e||(e=this.get("graph").get("container")),Object(h.x)(e)&&(e=document.getElementById(e)),e.removeChild(t)}},e}(yd),zd={};function Vd(t,e){zd[t]=e}var Wd=function(){function t(t){this.type="base",this.isCategory=!1,this.isLinear=!1,this.isContinuous=!1,this.isIdentity=!1,this.values=[],this.range=[0,1],this.ticks=[],this.__cfg__=t,this.initCfg(),this.init()}return t.prototype.translate=function(t){return t},t.prototype.change=function(t){Object(h.a)(this.__cfg__,t),this.init()},t.prototype.clone=function(){return this.constructor(this.__cfg__)},t.prototype.getTicks=function(){var t=this;return Object(h.z)(this.ticks,(function(e,n){return Object(h.v)(e)?e:{text:t.getText(e,n),tickValue:e,value:t.scale(e)}}))},t.prototype.getText=function(t,e){var n=this.formatter,r=n?n(t,e):t;return Object(h.s)(r)||!Object(h.r)(r.toString)?"":r.toString()},t.prototype.getConfig=function(t){return this.__cfg__[t]},t.prototype.init=function(){Object(h.a)(this,this.__cfg__),this.setDomain(),Object(h.p)(this.getConfig("ticks"))&&(this.ticks=this.calculateTicks())},t.prototype.initCfg=function(){},t.prototype.setDomain=function(){},t.prototype.calculateTicks=function(){var t=this.tickMethod,e=[];if(Object(h.x)(t)){var n=zd[t];if(!n)throw new Error("There is no method to to calculate ticks!");e=n(this)}else Object(h.r)(t)&&(e=t(this));return e},t.prototype.rangeMin=function(){return Object(h.k)(this.range)},t.prototype.rangeMax=function(){return Object(h.y)(this.range)},t.prototype.calcPercent=function(t,e,n){return Object(h.t)(t)?(t-e)/(n-e):NaN},t.prototype.calcValue=function(t,e,n){return e+t*(n-e)},t}(),Xd=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="cat",e.isCategory=!0,e}return Object(v.b)(e,t),e.prototype.buildIndexMap=function(){if(!this.translateIndexMap){this.translateIndexMap=new Map;for(var t=0;tthis.max?NaN:this.values[r]},e.prototype.getText=function(e){for(var n=[],r=1;r1?t-1:t}this.translateIndexMap&&(this.translateIndexMap=void 0)},e}(Wd),Yd=/d{1,4}|M{1,4}|YY(?:YY)?|S{1,3}|Do|ZZ|Z|([HhMsDm])\\1?|[aA]|"[^"]*"|\'[^\']*\'/g,Hd="[^\\\\s]+",qd=/\\[([^]*?)\\]/gm;function Kd(t,e){for(var n=[],r=0,i=t.length;r-1?r:null}};function Qd(t){for(var e=[],n=1;n3?0:(t-t%10!=10?1:0)*t%10]}},np=Qd({},ep),rp=function(t){return np=Qd(np,t)},ip=function(t){return t.replace(/[|\\\\{()[^$+*?.-]/g,"\\\\$&")},op=function(t,e){for(void 0===e&&(e=2),t=String(t);t.length0?"-":"+")+op(100*Math.floor(Math.abs(e)/60)+Math.abs(e)%60,4)},Z:function(t){var e=t.getTimezoneOffset();return(e>0?"-":"+")+op(Math.floor(Math.abs(e)/60),2)+":"+op(Math.abs(e)%60,2)}},sp=function(t){return+t-1},up=[null,"[1-9]\\\\d?"],cp=[null,Hd],fp=["isPm",Hd,function(t,e){var n=t.toLowerCase();return n===e.amPm[0]?0:n===e.amPm[1]?1:null}],lp=["timezoneOffset","[^\\\\s]*?[\\\\+\\\\-]\\\\d\\\\d:?\\\\d\\\\d|[^\\\\s]*?Z?",function(t){var e=(t+"").match(/([+-]|\\d\\d)/gi);if(e){var n=60*+e[1]+parseInt(e[2],10);return"+"===e[0]?n:-n}return 0}],hp={D:["day","[1-9]\\\\d?"],DD:["day","\\\\d\\\\d"],Do:["day","[1-9]\\\\d?"+Hd,function(t){return parseInt(t,10)}],M:["month","[1-9]\\\\d?",sp],MM:["month","\\\\d\\\\d",sp],YY:["year","\\\\d\\\\d",function(t){var e=+(""+(new Date).getFullYear()).substr(0,2);return+(""+(+t>68?e-1:e)+t)}],h:["hour","[1-9]\\\\d?",void 0,"isPm"],hh:["hour","\\\\d\\\\d",void 0,"isPm"],H:["hour","[1-9]\\\\d?"],HH:["hour","\\\\d\\\\d"],m:["minute","[1-9]\\\\d?"],mm:["minute","\\\\d\\\\d"],s:["second","[1-9]\\\\d?"],ss:["second","\\\\d\\\\d"],YYYY:["year","\\\\d{4}"],S:["millisecond","\\\\d",function(t){return 100*+t}],SS:["millisecond","\\\\d\\\\d",function(t){return 10*+t}],SSS:["millisecond","\\\\d{3}"],d:up,dd:up,ddd:cp,dddd:cp,MMM:["month",Hd,Zd("monthNamesShort")],MMMM:["month",Hd,Zd("monthNames")],a:fp,A:fp,ZZ:lp,Z:lp},dp={default:"ddd MMM DD YYYY HH:mm:ss",shortDate:"M/D/YY",mediumDate:"MMM D, YYYY",longDate:"MMMM D, YYYY",fullDate:"dddd, MMMM D, YYYY",isoDate:"YYYY-MM-DD",isoDateTime:"YYYY-MM-DDTHH:mm:ssZ",shortTime:"HH:mm",mediumTime:"HH:mm:ss",longTime:"HH:mm:ss.SSS"},pp=function(t){return Qd(dp,t)},gp=function(t,e,n){if(void 0===e&&(e=dp.default),void 0===n&&(n={}),"number"==typeof t&&(t=new Date(t)),"[object Date]"!==Object.prototype.toString.call(t)||isNaN(t.getTime()))throw new Error("Invalid Date pass to format");var r=[];e=(e=dp[e]||e).replace(qd,(function(t,e){return r.push(e),"@@@"}));var i=Qd(Qd({},np),n);return(e=e.replace(Yd,(function(e){return ap[e](t,i)}))).replace(/@@@/g,(function(){return r.shift()}))};function vp(t,e,n){if(void 0===n&&(n={}),"string"!=typeof e)throw new Error("Invalid format in fecha parse");if(e=dp[e]||e,t.length>1e3)return null;var r={year:(new Date).getFullYear(),month:0,day:1,hour:0,minute:0,second:0,millisecond:0,isPm:null,timezoneOffset:null},i=[],o=[],a=e.replace(qd,(function(t,e){return o.push(ip(e)),"@@@"})),s={},u={};a=ip(a).replace(Yd,(function(t){var e=hp[t],n=e[0],r=e[1],o=e[3];if(s[n])throw new Error("Invalid format. "+n+" specified twice in format");return s[n]=!0,o&&(u[o]=!0),i.push(e),"("+r+")"})),Object.keys(u).forEach((function(t){if(!s[t])throw new Error("Invalid format. "+t+" is required in specified format")})),a=a.replace(/@@@/g,(function(){return o.shift()}));var c=t.match(new RegExp(a,"i"));if(!c)return null;for(var f=Qd(Qd({},np),n),l=1;l0?new Date(t).getTime():new Date(t.replace(/-/gi,"/")).getTime()),Object(h.o)(t)&&(t=t.getTime()),t}var xp=36e5,wp=24*xp,Sp=31*wp,Ep=[["HH:mm:ss",1e3],["HH:mm:ss",1e4],["HH:mm:ss",3e4],["HH:mm",6e4],["HH:mm",6e5],["HH:mm",18e5],["HH",xp],["HH",6*xp],["HH",12*xp],["YYYY-MM-DD",wp],["YYYY-MM-DD",4*wp],["YYYY-WW",7*wp],["YYYY-MM",Sp],["YYYY-MM",4*Sp],["YYYY-MM",6*Sp],["YYYY",380*wp]];function _p(t,e,n){var r,i=(r=function(t){return t[1]},function(t,e,n,i){for(var o=Object(h.s)(n)?0:n,a=Object(h.s)(i)?t.length:i;o>>1;r(t[s])>e?a=s:o=s+1}return o})(Ep,(e-t)/n)-1,o=Ep[i];return i<0?o=Ep[0]:i>=Ep.length&&(o=Object(h.y)(Ep)),o}var Op=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="timeCat",e}return Object(v.b)(e,t),e.prototype.translate=function(t){t=bp(t);var e=this.values.indexOf(t);return-1===e&&(e=Object(h.t)(t)&&t-1){var r=this.values[n],i=this.formatter;return r=i?i(r,e):mp(r,this.mask)}return t},e.prototype.initCfg=function(){this.tickMethod="time-cat",this.mask="YYYY-MM-DD",this.tickCount=7},e.prototype.setDomain=function(){var e=this.values;Object(h.f)(e,(function(t,n){e[n]=bp(t)})),e.sort((function(t,e){return t-e})),t.prototype.setDomain.call(this)},e}(Xd),kp=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.isContinuous=!0,e}return Object(v.b)(e,t),e.prototype.scale=function(t){if(Object(h.s)(t))return NaN;var e=this.rangeMin(),n=this.rangeMax();return this.max===this.min?e:e+this.getScalePercent(t)*(n-e)},e.prototype.init=function(){t.prototype.init.call(this);var e=this.ticks,n=Object(h.k)(e),r=Object(h.y)(e);nthis.max&&(this.max=r),Object(h.s)(this.minLimit)||(this.min=n),Object(h.s)(this.maxLimit)||(this.max=r)},e.prototype.setDomain=function(){var t=Object(h.j)(this.values),e=t.min,n=t.max;Object(h.s)(this.min)&&(this.min=e),Object(h.s)(this.max)&&(this.max=n),this.min>this.max&&(this.min=e,this.max=n)},e.prototype.calculateTicks=function(){var e=this,n=t.prototype.calculateTicks.call(this);return this.nice||(n=Object(h.g)(n,(function(t){return t>=e.min&&t<=e.max}))),n},e.prototype.getScalePercent=function(t){var e=this.max,n=this.min;return(t-n)/(e-n)},e.prototype.getInvertPercent=function(t){return(t-this.rangeMin())/(this.rangeMax()-this.rangeMin())},e}(Wd),Mp=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="linear",e.isLinear=!0,e}return Object(v.b)(e,t),e.prototype.invert=function(t){var e=this.getInvertPercent(t);return this.min+e*(this.max-this.min)},e.prototype.initCfg=function(){this.tickMethod="wilkinson-extended",this.nice=!1},e}(kp);function Ap(t,e){var n=Math.E;return e>=0?Math.pow(n,Math.log(e)/t):-1*Math.pow(n,Math.log(-e)/t)}function Tp(t,e){return 1===t?1:Math.log(e)/Math.log(t)}function Cp(t,e,n){Object(h.s)(n)&&(n=Math.max.apply(null,t));var r=n;return Object(h.f)(t,(function(t){t>0&&t1&&(r=1),r}var Ip=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="log",e}return Object(v.b)(e,t),e.prototype.invert=function(t){var e,n=this.base,r=Tp(n,this.max),i=this.rangeMin(),o=this.rangeMax()-i,a=this.positiveMin;if(a){if(0===t)return 0;var s=1/(r-(e=Tp(n,a/n)))*o;if(t=0?1:-1;return Math.pow(o,n)*a},e.prototype.initCfg=function(){this.tickMethod="pow",this.exponent=2,this.tickCount=5,this.nice=!0},e.prototype.getScalePercent=function(t){var e=this.max,n=this.min;if(e===n)return 0;var r=this.exponent;return(Ap(r,t)-Ap(r,n))/(Ap(r,e)-Ap(r,n))},e}(kp),jp=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="time",e}return Object(v.b)(e,t),e.prototype.getText=function(t,e){var n=this.translate(t),r=this.formatter;return r?r(n,e):mp(n,this.mask)},e.prototype.scale=function(e){var n=e;return(Object(h.x)(n)||Object(h.o)(n))&&(n=this.translate(n)),t.prototype.scale.call(this,n)},e.prototype.translate=function(t){return bp(t)},e.prototype.initCfg=function(){this.tickMethod="time-pretty",this.mask="YYYY-MM-DD",this.tickCount=7,this.nice=!1},e.prototype.setDomain=function(){var t=this.values,e=this.getConfig("min"),n=this.getConfig("max");if(Object(h.s)(e)&&Object(h.t)(e)||(this.min=this.translate(this.min)),Object(h.s)(n)&&Object(h.t)(n)||(this.max=this.translate(this.max)),t&&t.length){var r=[],i=1/0,o=i,a=0;Object(h.f)(t,(function(t){var e=bp(t);if(isNaN(e))throw new TypeError("Invalid Time: "+t+" in time scale!");i>e?(o=i,i=e):o>e&&(o=e),a1&&(this.minTickInterval=o-i),Object(h.s)(e)&&(this.min=i),Object(h.s)(n)&&(this.max=a)}},e}(Mp),Dp=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="quantize",e}return Object(v.b)(e,t),e.prototype.invert=function(t){var e=this.ticks,n=e.length,r=this.getInvertPercent(t),i=Math.floor(r*(n-1));if(i>=n-1)return Object(h.y)(e);if(i<0)return Object(h.k)(e);var o=e[i],a=i/(n-1);return o+(r-a)/((i+1)/(n-1)-a)*(e[i+1]-o)},e.prototype.initCfg=function(){this.tickMethod="r-pretty",this.tickCount=5,this.nice=!0},e.prototype.calculateTicks=function(){var e=t.prototype.calculateTicks.call(this);return this.nice||(Object(h.y)(e)!==this.max&&e.push(this.max),Object(h.k)(e)!==this.min&&e.unshift(this.min)),e},e.prototype.getScalePercent=function(t){var e=this.ticks;if(tObject(h.y)(e))return 1;var n=0;return Object(h.f)(e,(function(e,r){if(!(t>=e))return!1;n=r})),n/(e.length-1)},e}(kp),Np=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="quantile",e}return Object(v.b)(e,t),e.prototype.initCfg=function(){this.tickMethod="quantile",this.tickCount=5,this.nice=!0},e}(Dp),Rp={};function Lp(t,e){if(function(t){return Rp[t]}(t))throw new Error("type \'"+t+"\' existed.");Rp[t]=e}var Bp=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="identity",e.isIdentity=!0,e}return Object(v.b)(e,t),e.prototype.calculateTicks=function(){return this.values},e.prototype.scale=function(t){return this.values[0]!==t&&Object(h.t)(t)?t:this.range[0]},e.prototype.invert=function(t){var e=this.range;return te[1]?NaN:this.values[0]},e}(Wd),Gp=[1,5,2,2.5,4,3],Fp=100*Number.EPSILON;function Up(t,e,n,r,i,o){var a=Object(h.E)(e),s=Object(h.l)(e,t),u=0,c=function(t,e){return(t%e+e)%e}(r,o);return(c=0&&(u=1),1-s/(a-1)-n+u}function zp(t,e,n){var r=Object(h.E)(e);return 1-Object(h.l)(e,t)/(r-1)-n+1}function Vp(t,e,n,r,i,o){var a=(t-1)/(o-i),s=(e-1)/(Math.max(o,r)-Math.min(n,i));return 2-Math.max(a/s,s/a)}function Wp(t,e){return t>=e?2-(t-1)/(e-1):1}function Xp(t,e,n,r){var i=e-t;return 1-.5*(Math.pow(e-r,2)+Math.pow(t-n,2))/Math.pow(.1*i,2)}function Yp(t,e,n){var r=e-t;if(n>r){var i=(n-r)/2;return 1-Math.pow(i,2)/Math.pow(.1*r,2)}return 1}function Hp(t,e,n,r,i,o){if(void 0===n&&(n=5),void 0===r&&(r=!0),void 0===i&&(i=Gp),void 0===o&&(o=[.25,.2,.5,.05]),"number"!=typeof t||"number"!=typeof e||!n)return{min:0,max:0,ticks:[]};if(e-t<1e-15||1===n)return{min:t,max:e,ticks:[t]};for(var a={score:-2,lmin:0,lmax:0,lstep:0},s=1;s<1/0;){for(var u=0,c=i;ux)v+=1;else{for(var w=b;w<=x;w+=1){var S=w*(y/s),E=S+y*(d-1),_=y,O=Up(f,i,s,S,E,_),k=Xp(t,e,S,E),M=Vp(d,n,t,e,S,E),A=o[0]*O+o[1]*k+o[2]*M+1*o[3];A>a.score&&(!r||S<=t&&E>=e)&&(a.lmin=S,a.lmax=E,a.lstep=_,a.score=A)}v+=1}}d+=1}}s+=1}for(var T=Number.isInteger(a.lstep)?0:Math.ceil(Math.abs(Math.log10(a.lstep))),C=[],I=a.lmin;I<=a.lmax;I+=a.lstep)C.push(I);var P=T?Object(h.z)(C,(function(t){return Number.parseFloat(t.toFixed(T))})):C;return{min:Math.min(t,Object(h.k)(P)),max:Math.max(e,Object(h.y)(P)),ticks:P}}function qp(t){var e=t.values,n=t.tickInterval,r=t.tickCount,i=e;if(Object(h.t)(n))return Object(h.g)(i,(function(t,e){return e%n==0}));var o=t.min,a=t.max;if(Object(h.s)(o)&&(o=0),Object(h.s)(a)&&(a=e.length-1),Object(h.t)(r)&&r=o&&t<=a})).map((function(t){return e[t]}))}return e.slice(o,a+1)}var Kp=Math.sqrt(50),Zp=Math.sqrt(10),Qp=Math.sqrt(2),Jp=function(){function t(){this._domain=[0,1]}return t.prototype.domain=function(t){return t?(this._domain=Array.from(t,Number),this):this._domain.slice()},t.prototype.nice=function(t){var e,n;void 0===t&&(t=5);var r,i=this._domain.slice(),o=0,a=this._domain.length-1,s=this._domain[o],u=this._domain[a];return u0?r=$p(s=Math.floor(s/r)*r,u=Math.ceil(u/r)*r,t):r<0&&(r=$p(s=Math.ceil(s*r)/r,u=Math.floor(u*r)/r,t)),r>0?(i[o]=Math.floor(s/r)*r,i[a]=Math.ceil(u/r)*r,this.domain(i)):r<0&&(i[o]=Math.ceil(s*r)/r,i[a]=Math.floor(u*r)/r,this.domain(i)),this},t.prototype.ticks=function(t){return void 0===t&&(t=5),function(t,e,n){var r,i,o,a,s=-1;if(n=+n,(t=+t)===(e=+e)&&n>0)return[t];(r=e0)for(t=Math.ceil(t/a),e=Math.floor(e/a),o=new Array(i=Math.ceil(e-t+1));++s=0?(o>=Kp?10:o>=Zp?5:o>=Qp?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(o>=Kp?10:o>=Zp?5:o>=Qp?2:1)}function tg(t,e,n){return("ceil"===n?Math.ceil(t/e):"floor"===n?Math.floor(t/e):Math.round(t/e))*e}function eg(t,e,n){var r=tg(t,n,"floor"),i=tg(e,n,"ceil");r=Object(h.h)(r,n),i=Object(h.h)(i,n);for(var o=[],a=r;a<=i;a+=n){var s=Object(h.h)(a,n);o.push(s)}return{min:r,max:i,ticks:o}}function ng(t,e,n){var r,i=t.minLimit,o=t.maxLimit,a=t.min,s=t.max,u=t.tickCount,c=void 0===u?5:u,f=Object(h.s)(i)?Object(h.s)(e)?a:e:i,l=Object(h.s)(o)?Object(h.s)(n)?s:n:o;if(f>l&&(l=(r=[f,l])[0],f=r[1]),c<=2)return[f,l];for(var d=(l-f)/(c-1),p=[],g=0;g1&&(i*=Math.ceil(a)),r&&i31536e6)for(var u=og(n),c=Math.ceil(o/31536e6),f=s;f<=u+c;f+=c)a.push(ag(f));else if(o>Sp){var l=Math.ceil(o/Sp),h=sg(e),d=function(t,e){var n=og(t),r=og(e),i=sg(t);return 12*(r-n)+(sg(e)-i)%12}(e,n);for(f=0;f<=d+l;f+=l)a.push(ug(s,f+h))}else if(o>wp){var p=(b=new Date(e)).getFullYear(),g=b.getMonth(),v=b.getDate(),y=Math.ceil(o/wp),m=function(t,e){return Math.ceil((e-t)/wp)}(e,n);for(f=0;fxp){p=(b=new Date(e)).getFullYear(),g=b.getMonth(),y=b.getDate();var b,x=b.getHours(),w=Math.ceil(o/xp),S=function(t,e){return Math.ceil((e-t)/xp)}(e,n);for(f=0;f<=S+w;f+=w)a.push(new Date(p,g,y,x+f).getTime())}else if(o>6e4){var E=function(t,e){return Math.ceil((e-t)/6e4)}(e,n),_=Math.ceil(o/6e4);for(f=0;f<=E+_;f+=_)a.push(e+6e4*f)}else{var O=o;O<1e3&&(O=1e3);var k=1e3*Math.floor(e/1e3),M=Math.ceil((n-e)/1e3),A=Math.ceil(O/1e3);for(f=0;f=512&&console.warn("Notice: current ticks length("+a.length+\') >= 512, may cause performance issues, even out of memory. Because of the configure "tickInterval"(in milliseconds, current is \'+o+") is too small, increase the value to solve the problem!"),a})),Vd("log",(function(t){var e,n=t.base,r=t.tickCount,i=t.min,o=t.max,a=t.values,s=Tp(n,o);if(i>0)e=Math.floor(Tp(n,i));else{var u=Cp(a,n,o);e=Math.floor(Tp(n,u))}for(var c=s-e,f=Math.ceil(c/r),l=[],h=e;h=0?1:-1;return Math.pow(t,e)*n}))})),Vd("quantile",(function(t){var e=t.tickCount,n=t.values;if(!n||!n.length)return[];for(var r=n.slice().sort((function(t,e){return t-e})),i=[],o=0;op?(i.show(),o.show(),p=a.minX+a.width+10):(i.hide(),o.hide()),i})),this.controllerBtnGroup=new Cg(Ig({group:this.group,x:this.x,y:this.y+n+25,width:e,height:40},this.controllerCfg)),this.updateUI(),o.move(this.x,this.y),this.bindEvents()},t.prototype.bindEvents=function(){var t=this,e=this.group.find((function(t){return"minHandlerShape"===t.get("name")}));e&&(e.on("minHandlerShape-handler:mousedown",this.onMouseDown(this.minHandlerShape)),e.on("minHandlerShape-handler:touchstart",this.onMouseDown(this.minHandlerShape)));var n=this.group.find((function(t){return"maxHandlerShape"===t.get("name")}));n&&(n.on("maxHandlerShape-handler:mousedown",this.onMouseDown(this.maxHandlerShape)),n.on("maxHandlerShape-handler:touchstart",this.onMouseDown(this.maxHandlerShape))),this.foregroundShape.on("mousedown",this.onMouseDown(this.foregroundShape)),this.foregroundShape.on("touchstart",this.onMouseDown(this.foregroundShape)),this.group.on("playPauseBtn:click",(function(){t.isPlay=!t.isPlay,t.currentHandler=t.maxHandlerShape,t.changePlayStatus()})),this.group.on("nextStepBtn:click",(function(){t.currentHandler=t.maxHandlerShape,t.updateStartEnd(.01),t.updateUI()})),this.group.on("preStepBtn:click",(function(){t.currentHandler=t.maxHandlerShape,t.updateStartEnd(-.01),t.updateUI()})),this.group.on("timebarConfigChanged",(function(e){var n=e.type,r=e.speed;t.currentSpeed=r,t.currentMode=n,"single"===n?(t.minHandlerShape.hide(),t.foregroundShape.hide(),t.minTextShape.hide()):"range"===n&&(t.minHandlerShape.show(),t.foregroundShape.show(),t.minTextShape.show())}))},t.prototype.adjustTickIndex=function(t){for(var e=0;e1&&(this.end=1);var e=this.start*this.width,n=this.end*this.width;this.foregroundShape.attr("x",e),this.foregroundShape.attr("width",n-e);var r=Object(h.i)(this.handlerStyle,"width",2);this.setText(this.minText,this.maxText);var i=this.dodgeText([e,n]),o=i[0],a=i[1];this.minHandlerShape.setX(e-r/2),Object(h.f)(o,(function(e,n){return t.minTextShape.attr(n,e)})),this.maxHandlerShape.setX(n-r/2),Object(h.f)(a,(function(e,n){return t.maxTextShape.attr(n,e)})),"range"===this.currentMode?this.graph.emit("valueChange",{value:[this.start,this.end].sort()}):"single"===this.currentMode&&this.graph.emit("valueChange",{value:[this.end,this.end]})},t.prototype.dodgeText=function(t){var e,n,r=Object(h.i)(this.handlerStyle,"width",2),i=this.minTextShape,o=this.maxTextShape,a=t[0],s=t[1],u=!1;a>s&&(a=(e=[s,a])[0],s=e[1],i=(n=[o,i])[0],o=n[1],u=!0);var c=i.getBBox(),f=o.getBBox(),l=null,d=null;return"trend"===this.timeBarType?(l=c.width>a-2?{x:a+r/2+2,textAlign:"left"}:{x:a-r/2-2,textAlign:"right"},d=f.width>this.width-s-2?{x:s-r/2-2,textAlign:"right"}:{x:s+r/2+2,textAlign:"left"}):"simple"===this.timeBarType&&(l=c.width>a-2?{x:a+r/2+2,textAlign:"center"}:{x:a-r/2-2,textAlign:"center"},d=f.width>this.width-s-2?{x:s-r/2-2,textAlign:"center"}:{x:s+r/2+2,textAlign:"center"}),u?[d,l]:[l,d]},t.prototype.startPlay=function(){var t=this;return"undefined"!=typeof window?window.requestAnimationFrame((function(){var e=t,n=e.ticks,r=e.width,i=t.currentSpeed,o=r/n.length/(1e3*(10-i)/60),a=t.adjustOffsetRange(o/t.width);t.updateStartEnd(a),t.updateUI(),t.isPlay&&(t.playHandler=t.startPlay())})):void 0},t.prototype.changePlayStatus=function(t){void 0===t&&(t=!0),this.controllerBtnGroup.playButton.update({isPlay:this.isPlay}),this.isPlay?(this.playHandler=this.startPlay(),this.graph.emit("timelinestart",null)):this.playHandler&&("undefined"!=typeof window&&window.cancelAnimationFrame(this.playHandler),t&&this.graph.emit("timelineend",null))},t.prototype.destory=function(){this.graph.off("valueChange");var t=this.group,e=t.find((function(t){return"minHandlerShape"===t.get("name")}));e&&(e.off("minHandlerShape-handler:mousedown"),e.off("minHandlerShape-handler:touchstart"),e.destroy());var n=t.find((function(t){return"maxHandlerShape"===t.get("name")}));n&&(n.off("maxHandlerShape-handler:mousedown"),n.off("maxHandlerShape-handler:touchstart"),n.destroy()),this.foregroundShape.off("mousedown"),this.foregroundShape.off("touchstart"),this.foregroundShape.destroy(),t.off("playPauseBtn:click"),t.off("nextStepBtn:click"),t.off("preStepBtn:click"),t.off("timebarConfigChanged"),t.destroy(),this.trendComponent&&this.trendComponent.destory()},t}(),Bg=function(){function t(t){var e=t.x,n=void 0===e?0:e,r=t.y,i=void 0===r?0:r,o=t.container,a=t.text,s=t.padding,u=void 0===s?[4,4,4,4]:s,c=t.className,f=void 0===c?"g6-component-timebar-tooltip":c,l=t.backgroundColor,h=void 0===l?"#000":l,d=t.textColor,p=void 0===d?"#fff":d,g=t.opacity,v=void 0===g?.8:g,y=t.fontSize,m=void 0===y?12:y;this.container=o,this.className=f,this.backgroundColor=h,this.textColor=p,this.x=n,this.y=i,this.text=a,this.padding=u,this.opacity=v,this.fontSize=m,this.render()}return t.prototype.render=function(){var t=this.className,e=(this.x,this.y,this.backgroundColor),n=this.textColor,r=this.text,i=this.padding,o=this.opacity,a=this.fontSize,s=this.container,u=gt("
    \');Object(h.x)(s)&&(s=document.getElementById(s)),s.appendChild(u),this.parentHeight=s.offsetHeight,this.parentWidth=s.offsetWidth,vt(u,{visibility:"hidden",top:0,left:0});var c=gt("\\n
    ");c.innerHTML=r,u.appendChild(c),this.backgroundDOM=c;var f=gt("
    ");u.appendChild(f),this.arrowDOM=f,this.container=u},t.prototype.show=function(t){var e=t.text,n=t.x;t.y,t.clientX,t.clientY;this.backgroundDOM.innerHTML=e;var r=this.backgroundDOM.offsetWidth,i=this.backgroundDOM.offsetHeight,o=this.arrowDOM.offsetWidth,a=this.arrowDOM.offsetHeight;vt(this.container,{top:-i-a+"px",left:n+"px",visibility:"visible"}),vt(this.backgroundDOM,{marginLeft:-r/2+"px"}),vt(this.arrowDOM,{marginLeft:-o/2+"px",top:i+"px"});var s=n-r/2,u=n+r/2;s<0?vt(this.backgroundDOM,{marginLeft:-r/2-s+"px"}):u>this.parentWidth&&vt(this.backgroundDOM,{marginLeft:-r/2-u+this.parentWidth+12+"px"})},t.prototype.hide=function(){vt(this.container,{top:0,left:0,visibility:"hidden"})},t}(),Gg=function(){return(Gg=Object.assign||function(t){for(var e,n=1,r=arguments.length;n=b&&r<=x?c:f,a=v.addShape("rect",{attrs:Gg({x:i+r*(g+2),y:i,width:g,height:d},o),draggable:!0,name:"tick-rect-"+r}),s=v.addShape("rect",{attrs:{x:i+r*g+2*(2*r-1)/2,y:i,width:0===r||r===p-1?g+1:g+2,height:d,fill:"#fff",opacity:0},draggable:!0,name:"pick-rect-"+r});s.toFront();var l,w=a.getBBox(),S=(w.minX+w.maxX)/2;if(y.push({rect:a,pickRect:s,value:e.date,x:S,y:w.minY}),u?(l=u(e),!Object(h.x)(l)&&l&&(l=e.date)):r%Math.round(p/10)==0&&(l=e.date),l){m.push(l);var E=w.maxY+2*i;v.addShape("line",{attrs:{stroke:"#BFBFBF",x1:S,y1:E,x2:S,y2:E+4}});var _=E+4+i,O=v.addShape("text",{attrs:{fill:"#8c8c8c",stroke:"#fff",lineWidth:1,x:S,y:_,textAlign:"center",text:l,textBaseline:"top",fontSize:10,fontFamily:t.fontFamily||"Arial, sans-serif"},capture:!1}),k=O.getBBox();k.maxX>n?O.attr("textAlign","right"):k.minX<0&&O.attr("textAlign","left")}})),this.tickRects=y;var w=this.group;this.currentSpeed=1,this.controllerBtnGroup=new Cg({group:w,x:this.x,y:this.y+r+5,width:n,height:40,hiddleToggle:!0,speed:this.currentSpeed,fontFamily:this.fontFamily||"Arial, sans-serif"})},t.prototype.initEvent=function(){var t=this,e=this.sliceGroup;e.on("click",(function(e){var n=e.target;if("rect"===n.get("type")&&n.get("name")){var r=parseInt(n.get("name").split("-")[2],10);if(!isNaN(r)){var i=t.tickRects,o=t.unselectedTickStyle;i.forEach((function(t){t.rect.attr(o)}));var a=t.selectedTickStyle;i[r].rect.attr(a),t.startTickRectId=r,t.endTickRectId=r;var s=r/i.length;t.graph.emit("valueChange",{value:[s,s]})}}})),e.on("dragstart",(function(e){var n=t.tickRects,r=t.unselectedTickStyle;n.forEach((function(t){t.rect.attr(r)}));var i=e.target,o=parseInt(i.get("name").split("-")[2],10),a=t.selectedTickStyle;n[o].rect.attr(a),t.startTickRectId=o;var s=o/n.length;t.graph.emit("valueChange",{value:[s,s]}),t.dragging=!0})),e.on("dragover",(function(e){if(t.dragging&&"rect"===e.target.get("type")){for(var n=parseInt(e.target.get("name").split("-")[2],10),r=t.startTickRectId,i=t.tickRects,o=t.selectedTickStyle,a=t.unselectedTickStyle,s=0;s=r&&s<=n?o:a;i[s].rect.attr(u)}var c=i.length;t.endTickRectId=n;var f=r/c,l=n/c;t.graph.emit("valueChange",{value:[f,l]})}})),e.on("drop",(function(e){if(t.dragging&&(t.dragging=!1,"rect"===e.target.get("type"))){var n=t.startTickRectId,r=parseInt(e.target.get("name").split("-")[2],10);if(!(r0?this.endTickRectId++:(e[this.endTickRectId].rect.attr(r),this.endTickRectId--),o!==this.startTickRectId)this.endTickRectId"),{position:"relative"}),u.appendChild(t),this.set("timeBarContainer",t),e="SVG"===n.get("renderer")?new sn.Canvas({container:t,width:i,height:o}):new an.Canvas({container:t,width:i,height:o}),this.set("canvas",e)},e.prototype.init=function(){this.initContainer();var t=this.get("canvas").addGroup({name:"timebar-group"});this.set("timeBarGroup",t),this.renderTrend(),this.initEvent();var e="undefined"!=typeof window&&window.getComputedStyle(document.body,null).getPropertyValue("font-family")||"Arial, sans-serif";this.set("fontFamily",e)},e.prototype.renderTrend=function(){var t=this._cfgs,e=t.width,n=t.x,r=t.y,i=t.padding,o=t.type,a=t.trend,s=t.slider,u=t.controllerCfg,c=t.textStyle,f=a.data,l=Xg(a,["data"]),h=e-2*i,d="trend"===o?26:8,p=this.get("graph"),g=this.get("timeBarGroup"),v=this.get("canvas"),y=null;if("trend"===o||"simple"===o)y=new Lg(Wg(Wg({graph:p,canvas:v,group:g,type:o,x:n+i,y:"trend"===o?r+i:r+i+15,width:h,height:d,padding:i,trendCfg:Wg(Wg({},l),{data:f.map((function(t){return t.value}))})},s),{ticks:f.map((function(t){return t.date})),handlerStyle:Wg(Wg({},s.handlerStyle),{height:s.height||d}),controllerCfg:u,textStyle:c}));else if("tick"===o){var m=this._cfgs.tick;y=new zg(Wg({graph:p,canvas:v,group:g,x:n+i,y:r+i},m))}this.set("timebar",y)},e.prototype.filterData=function(t){var e=t.value,n=null,r=this._cfgs.type;if("trend"===r||"simple"===r?n=this._cfgs.trend.data:"tick"===r&&(n=this._cfgs.tick.data),n&&0!==n.length){var i=this.get("rangeChange"),o=this.get("graph"),a=Math.round(n.length*e[0]),s=Math.round(n.length*e[1]);s=s>=n.length?n.length-1:s;var u=n[a].date,c=n[s].date;if("tick"!==r)this.get("timebar").setText(u,c);if(i)i(o,u,c);else{var f=o.save();(!this.cacheGraphData||this.cacheGraphData.nodes&&0===this.cacheGraphData.nodes.length)&&(this.cacheGraphData=f);var l=this.cacheGraphData.nodes.filter((function(t){return t.date>=u&&t.date<=c})),h=l.map((function(t){return t.id})),d=this.cacheGraphData.edges.filter((function(t){return h.includes(t.source)&&h.includes(t.target)}));o.changeData({nodes:l,edges:d})}}else console.warn("请配置 TimeBar 组件的数据")},e.prototype.initEvent=function(){var t=this,e=0,n=0,r=this._cfgs.type;r&&"trend"!==r&&"simple"!==r?"tick"===r&&(e=this._cfgs.tick.start,n=this._cfgs.tick.end):(e=this._cfgs.slider.start,n=this._cfgs.slider.end);var i=this.get("graph");i.on("afterrender",(function(){t.filterData({value:[e,n]})})),i.on("valueChange",(function(e){t.filterData(e)}))},e.prototype.destroy=function(){var e=this.get("timebar");e&&e.destory&&e.destory(),t.prototype.destroy.call(this);var n=this.get("timeBarContainer");if(n){var r=this.get("container");r||(r=this.get("graph").get("container")),Object(h.x)(r)&&(r=document.getElementById(r)),r.removeChild(n)}},e}(yd),Hg=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),qg=Qe.applyMatrix;var Kg=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Hg(e,t),e.prototype.getDefaultCfgs=function(){return{container:null,className:"g6-minimap",viewportClassName:"g6-minimap-viewport",width:200,delegateStyle:{fill:"#40a9ff",stroke:"#096dd9"},refresh:!0}},e.prototype.getEvents=function(){return{beforepaint:"updateViewport",beforeanimate:"disableRefresh",afteranimate:"enableRefresh",viewportchange:"disableOneRefresh"}},e.prototype.disableRefresh=function(){this.set("refresh",!1)},e.prototype.enableRefresh=function(){this.set("refresh",!0),this.updateCanvas()},e.prototype.disableOneRefresh=function(){this.set("viewportChange",!0)},e.prototype.initViewport=function(){var t=this,e=this._cfgs,n=e.graph;if(!this.destroyed){var r=this.get("container");Object(h.x)(r)&&(r=document.getElementById(r));var i=gt("
    \\n
    "),o=0,a=0,s=!1,u=0,c=0,f=0,l=0,d=0,p=0;r.addEventListener("mousedown",(function(r){if(e.refresh=!1,r.target===i){var u=i.style;f=parseInt(u.width,10),l=parseInt(u.height,10);var c=t.get("width"),h=t.get("height");f>c||l>h||(p=n.getZoom(),d=t.get("ratio"),s=!0,o=r.clientX,a=r.clientY)}}),!1),r.addEventListener("mousemove",(function(e){if(s&&!Object(h.s)(e.clientX)&&!Object(h.s)(e.clientY)){var r=t.get("width"),g=t.get("height"),v=i.style;u=parseInt(v.left,10),c=parseInt(v.top,10),f=parseInt(v.width,10),l=parseInt(v.height,10);var y=o-e.clientX,m=a-e.clientY;u-y<0?y=u:u-y+f>=r&&(y=0),c-m<0?m=c:c-m+l>=g&&(m=0),vt(i,{left:(u-=y)+"px",top:(c-=m)+"px"}),n.translate(y*p/d,m*p/d),o=e.clientX,a=e.clientY}}),!1),r.addEventListener("mouseleave",(function(){s=!1,e.refresh=!0}),!1),r.addEventListener("mouseup",(function(){s=!1,e.refresh=!0}),!1),this.set("viewport",i),r.appendChild(i)}},e.prototype.updateViewport=function(){if(!this.destroyed){var t=this.get("ratio"),e=this.get("width"),n=this.get("height"),r=this.get("graph"),i=r.get("width"),o=i/r.get("height"),a=r.getGroup(),s=a.getCanvasBBox(),u=[(s.minX+s.maxX)/2,(s.minY+s.maxY)/2],c=[s.maxX-s.minX,s.maxY-s.minY],f={centerX:u[0],centerY:u[1],width:0,height:0,minX:0,minY:0};s[0]/s[1]>o?(f.width=c[0],f.height=f.width/o):(f.height=c[1],f.width=f.height*o),f.minX=u[0]-f.width/2,f.minY=u[1]-f.height/2;var l=a.getMatrix();l||(l=[1,0,0,0,1,0,0,0,1]);var h=un.a.invert([1,0,0,0,1,0,0,0,1],l),d=qg({x:f.minX,y:f.minY},h),p=r.getCanvasByPoint(d.x,d.y),g=this.get("viewport");g||this.initViewport();var v=i/f.width,y=v*e,m=v*n,b=e*-p.x/f.width,x=n*-p.y/f.height,w=b+y,S=x+m;b<0&&(y+=b,b=0),w>e&&(y-=w-e),x<0&&(m+=x,x=0),S>n&&(m-=S-n),this.set("ratio",t),vt(g,{left:b+"px",top:x+"px",width:y+"px",height:m+"px"})}},e.prototype.init=function(){this.initContainer()},e.prototype.initContainer=function(){var t=this.get("graph"),e=t.get("width"),n=t.get("height")/e,r=this.get("className"),i=this.get("container"),o=this.get("width"),a=this.get("height");o||a||(o=200),o?(a=n*o,this.set("height",a)):(o=1/n*a,this.set("width",o));var s=gt("
    ");Object(h.x)(i)&&(i=document.getElementById(i)),i?i.appendChild(s):t.get("container").appendChild(s),this.set("container",s);var u=gt(\'
    \');s.appendChild(u);var c=gt(\'\');u.appendChild(c),this.set("containerDOM",u),this.set("containerSpan",c);var f=gt(\'\');this.set("imgDOM",f),this.updateImgSize(),c.appendChild(f),this.updateCanvas()},e.prototype.updateImgSize=function(){var t=this.get("imgDOM"),e=this.get("width"),n=this.get("height");t.onload=function(){var r=function(t,e){var n,r;if(t.naturalWidth)n=t.naturalWidth,r=t.naturalHeight;else{var i=new Image;i.src=t.src,i.onload=function(){e&&e(i.width,i.height)}}return[n,r]}(t);r[0]>r[1]?t.width=e:t.height=n}},e.prototype.updateCanvas=function(){if(this.get("refresh")){var t=this.get("graph");if(!t.get("destroyed")){this.get("viewportChange")&&(this.set("viewportChange",!1),this.updateViewport());var e=this.get("width")/t.get("canvas").getCanvasBBox().width;this.set("ratio",e),this.updateViewport()}}},e.prototype.getViewport=function(){return this.get("viewport")},e.prototype.getContainer=function(){return this.get("container")},e.prototype.updateGraphImg=function(t){this.get("imgDOM").remove(),this.set("graphImg",t);var e=gt(\'\');this.set("imgDOM",e),e.src=t,this.updateImgSize(),this.get("containerSpan").appendChild(e),this.updateCanvas()},e.prototype.destroy=function(){var t=this.get("container");t.parentNode.removeChild(t)},e}(yd),Zg=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),Qg=function(){return(Qg=Object.assign||function(t){for(var e,n=1,r=arguments.length;n(i||n.get("height"))&&e>1||a<(o||.05*n.get("height"))&&e<1)&&(e=1),a*=e,this.set("r",a),this.filter(t)}},e.prototype.filter=function(t){var e=this.get("graph"),n=e.getNodes(),r={},i=this.get("r"),o=this.get("type"),a={x:t.x,y:t.y};this.updateDelegate(a,i);var s=this.get("shouldShow"),u=this.get("vShapes");u&&u.forEach((function(t){t.remove(),t.destroy()})),u=[],n.forEach((function(t){var e=t.getModel(),n=e.x,o=e.y;Jg({x:n,y:o},a)r/e.height}(e,t);if(0===r){var i=t.centerX,o=t.centerY;return n.ye.x?i=t.maxX:n.xt.centerX?t.maxX:t.minX,y:e.y}:{x:e.x,y:e.y>t.centerY?t.maxY:t.minY}},cv=function(t,e){var n=Math.min(t.minX,e.minX),r=Math.min(t.minY,e.minY),i=Math.max(t.maxX,e.maxX),o=Math.max(t.maxY,e.maxY);return{centerX:(n+i)/2,centerY:(r+o)/2,minX:n,minY:r,maxX:i,maxY:o,height:o-r,width:i-n}},fv=function(t){var e=t.minX,n=t.minY,r=t.maxX,i=t.maxY;return[{x:e,y:n},{x:r,y:n},{x:r,y:i},{x:e,y:i}]},lv=function(t,e){var n=t.x,r=t.y;return ne.maxX||re.maxY},hv=function(t,e){return Math.abs(t.x-e.x)+Math.abs(t.y-e.y)},dv=function(t,e,n,r,i){return hv(t,e)+hv(t,n)+function(t,e){var n=0;return e.forEach((function(e){e&&(t.x===e.x&&(n+=-2),t.y===e.y&&(n+=-2))})),n}(t,[e,n,r,i])},pv=function(t,e,n,r){var i=n.x-t.x,o=n.y-t.y,a=r.x-t.x,s=r.y-t.y,u=n.x-e.x,c=n.y-e.y,f=r.x-e.x,l=r.y-e.y;return(i*s-o*a)*(u*l-c*f)<=0&&(i*c-o*u)*(a*l-s*f)<=0},gv=function(t,e,n){if(0===n.width&&0===n.height)return!1;var r=fv(n),i=r[0],o=r[1],a=r[2],s=r[3];return pv(t,e,i,o)||pv(t,e,i,s)||pv(t,e,o,a)||pv(t,e,a,s)},vv=function(t,e,n,r,i,o,a){var s=[],u=[e],c={},f={},l={};f[e.id]=0,l[e.id]=dv(e,n,e);var h={};t.forEach((function(t){h[t.id]=t}));for(var d=function(){var d,p,g,v,y=1/0;if(u.forEach((function(t){l[t.id]-1&&p.splice(v,1),s.push(d),function(t,e,n,r){var i=[];return t.forEach((function(t){t!==e&&(t.x!==e.x&&t.y!==e.y||gv(t,e,n)||gv(t,e,r)||i.push(t))})),iv(i)}(t,d,r,i).forEach((function(t){if(-1===s.indexOf(t)){-1===u.indexOf(t)&&u.push(t);var r=l[d.id]+hv(d,t);f[t.id]&&r>=f[t.id]||(c[t.id]=d.id,f[t.id]=r,l[t.id]=f[t.id]+dv(t,n,e,o,a))}}))};u.length;){var p=d();if("object"===ev(p))return p.value}return[e,n]},yv=function(t,e){var n=[],r=t[0];return n.push("M"+r.x+" "+r.y),t.forEach((function(r,i){var o=t[i+1],a=t[i+2];if(o&&a)if(function(t,e,n){return!(t.x===e.x&&e.x===n.x||t.y===e.y&&e.y===n.y)}(r,o,a)){var s=function(t,e,n,r){var i=hv(t,e),o=hv(n,e);return it.maxX?[]:[{x:e,y:t.minY},{x:e,y:t.maxY}]}(t,e.x).concat(function(t,e){return et.maxY?[]:[{x:t.minX,y:e},{x:t.maxX,y:e}]}(t,e.y))}(t,g).filter((function(t){return lv(t,s)&&lv(t,u)})))})),[{x:c.x,y:f.y},{x:f.x,y:c.y}].forEach((function(t){lv(t,s)&&lv(t,u)&&p.push(t)})),p.unshift(c),p.push(f),p=iv(p);var v=vv(p,c,f,o,a,t,e);return v.unshift(t),v.push(e),ov(v)};function bv(t){return(bv="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var xv={offset:20,maxAllowedDirectionChange:90,maximumLoops:2e3,gridSize:10,directions:[{stepX:1,stepY:0},{stepX:-1,stepY:0},{stepX:0,stepY:1},{stepX:0,stepY:-1}],get penalties(){return{0:0,45:this.gridSize/2,90:this.gridSize/2}},distFunc:function(t,e){return Math.abs(t.x-e.x)+Math.abs(t.y-e.y)},fallbackRoute:function(t,e,n,r,i){return ov(mv(t,e,n,r,i.offset))}},wv=function(t,e){var n=Math.floor(Math.abs(t/e));return n<0?0:(t<0?-1:1)*n},Sv=function(t,e){var n=e.x-t.x,r=e.y-t.y;return n||r?(360+180*Math.atan2(r,n)/Math.PI)%360:0},Ev=function(t,e){var n=Math.abs(t-e);return n>180?360-n:n},_v=function(t,e,n){for(var r=1/0,i=0,o=e.length;iu.minX&&e.xu.minY&&e.y-1)return{value:function(n){var r=[e],i={x:parseFloat(n.split("|||")[0]),y:parseFloat(n.split("|||")[1]),id:n};for(b(i,u)&&r.unshift({x:i.x===u.x?e.x:i.x*o.gridSize,y:i.y===u.y?e.y:i.y*o.gridSize});p[n]&&p[n]!==n;){var a={x:parseFloat(n.split("|||")[0]),y:parseFloat(n.split("|||")[1]),id:n},c=p[n],f={x:parseFloat(c.split("|||")[0]),y:parseFloat(c.split("|||")[1]),id:c};b(f,a)&&r.unshift({x:f.x===a.x?r[0].x:f.x*o.gridSize,y:f.y===a.y?r[0].y:f.y*o.gridSize}),n=c}var l=parseFloat(n.split("|||")[0]),h=parseFloat(n.split("|||")[1]);return r[0].x=l===s.x?t.x:r[0].x,r[0].y=h===s.y?t.y:r[0].y,r.unshift(t),r}(n.id)};delete l[n.id],d[n.id]=!0;for(var c=0;co.maxAllowedDirectionChange||a[y.id])){l[y.id]||(l[y.id]=y);var w=o.distFunc(n,y)+(isNaN(o.penalties[m])?o.gridSize:o.penalties[m]),S=g[n.id]+w;g[y.id]&&S>=g[y.id]||(p[y.id]=n.id,g[y.id]=S,v[y.id]=S+_v(y,f,o.distFunc))}}}x-=1};Object.keys(l).length>0&&x>0;){var S=w();if("object"===bv(S))return S.value;if("break"===S)break}return o.fallbackRoute(t,e,n,r,o)};en("polyline",{options:{color:on.defaultEdge.color,size:on.defaultEdge.size,style:{radius:0,offset:15,x:0,y:0,stroke:on.defaultEdge.style.stroke,lineAppendWidth:on.defaultEdge.style.lineAppendWidth},labelCfg:{style:{fill:on.edgeLabel.style.fill,fontSize:on.edgeLabel.style.fontSize}},routeCfg:{obstacles:[],maxAllowedDirectionChange:90,maximumLoops:500,gridSize:10},stateStyles:Object(v.a)({},on.edgeStateStyles)},shapeType:"polyline",labelPosition:"center",drawShape:function(t,e){var n=this.getShapeStyle(t);return 0===n.radius&&delete n.radius,e.addShape("path",{className:"edge-shape",name:"edge-shape",attrs:n})},getShapeStyle:function(t){var e=this.options.style,n={stroke:t.color},r=Object(h.A)({},e,n,t.style);t=this.getPathPoints(t),this.radius=r.radius,this.offset=r.offset;var i=t.startPoint,o=t.endPoint,a=this.getControlPoints(t),s=[i];a&&(s=s.concat(a)),s.push(o);var u=t.sourceNode,c=t.targetNode,f=r.radius,l=this.options.routeCfg;l||(l={}),l.offset=r.offset;var d=this.getPath(s,u,c,f,l);return(Object(h.m)(d)&&d.length<=1||Object(h.x)(d)&&-1===d.indexOf("L"))&&(d="M0 0, L0 0"),(isNaN(i.x)||isNaN(i.y)||isNaN(o.x)||isNaN(o.y))&&(d="M0 0, L0 0"),Object(h.A)({},on.defaultEdge.style,r,{lineWidth:t.size,path:d})},updateShapeStyle:function(t,e){var n=e.getContainer(),r={stroke:t.color},i=n.find((function(t){return"edge-shape"===t.get("className")}))||e.getKeyShape(),o=t.size,a=(t=this.getPathPoints(t)).startPoint,s=t.endPoint,u=this.getControlPoints(t),c=[a];u&&(c=c.concat(u)),c.push(s);var f=i.attr(),l=Object(h.A)({},r,f,t.style),d=t.sourceNode,p=t.targetNode,g=l.radius,v=this.options.routeCfg;v||(v={}),v.offset=l.offset;var y=this.getPath(c,d,p,g,v);(Object(h.m)(y)&&y.length<=1||Object(h.x)(y)&&-1===y.indexOf("L"))&&(y="M0 0, L0 0"),(isNaN(a.x)||isNaN(a.y)||isNaN(s.x)||isNaN(s.y))&&(y="M0 0, L0 0"),f.endArrow&&!1===l.endArrow&&(t.style.endArrow={path:""}),f.startArrow&&!1===l.startArrow&&(t.style.startArrow={path:""});var m=Object(h.A)(r,i.attr(),{lineWidth:o,path:y},t.style);i&&i.attr(m)},getPath:function(t,e,n,r,i){var o;if(!i.offset||t.length>2){if(r)return yv(t,r);var a=[];return Object(h.f)(t,(function(t,e){0===e?a.push(["M",t.x,t.y]):a.push(["L",t.x,t.y])})),a}return r?(o=kv(t[0],t[t.length-1],e,n,i),yv(o,r)):(o=kv(t[0],t[t.length-1],e,n,i),Qe.pointsToPolygon(o))}},"single-edge");var Mv=dd.cloneEvent,Av=dd.isNaN,Tv=Math.abs,Cv=["shift","ctrl","alt","control"],Iv={getDefaultCfg:function(){return{direction:"both",enableOptimize:!1,scalableRange:0,allowDragOnItem:!1}},getEvents:function(){return{dragstart:"onMouseDown",drag:"onMouseMove",dragend:"onMouseUp","canvas:click":"onMouseUp",keyup:"onKeyUp",focus:"onKeyUp",keydown:"onKeyDown",touchstart:"onTouchStart",touchmove:"onTouchMove",touchend:"onMouseUp"}},updateViewport:function(t){var e=this.origin,n=+t.clientX,r=+t.clientY;if(!Av(n)&&!Av(r)){var i=n-e.x,o=r-e.y;"x"===this.get("direction")?o=0:"y"===this.get("direction")&&(i=0),this.origin={x:n,y:r};var a=this.graph.get("width"),s=this.graph.get("height"),u=this.graph.get("canvas").getCanvasBBox();(u.minX<=a+this.scalableRange&&u.minX+i>a+this.scalableRange||u.maxX+this.scalableRange>=0&&u.maxX+this.scalableRange+i<0)&&(i=0),(u.minY<=s+this.scalableRange&&u.minY+o>s+this.scalableRange||u.maxY+this.scalableRange>=0&&u.maxY+this.scalableRange+o<0)&&(o=0),this.graph.translate(i,o)}},onTouchStart:function(t){var e=t.originalEvent.touches,n=e[0],r=e[1];n&&r||(t.preventDefault(),this.onMouseDown(t))},onMouseDown:function(t){var e=t.originalEvent;if((!e||t.name===Ye.TOUCHSTART||0===e.button)&&(t.name===Ye.TOUCHSTART||"undefined"==typeof window||!window.event||window.event.buttons||window.event.button)&&this.shouldBegin.call(this,t)&&!this.keydown){var n=t.target,r=n&&n.isCanvas&&n.isCanvas();if((this.allowDragOnItem||r)&&(this.origin={x:t.clientX,y:t.clientY},this.dragging=!1,this.enableOptimize)){for(var i=this.graph,o=i.getEdges(),a=0,s=o.length;a-1?this.keydown=!0:this.keydown=!1)},onKeyUp:function(){this.keydown=!1,this.origin=null,this.dragging=!1,this.dragbegin=!1}},Pv={getDefaultCfg:function(){return{updateEdge:!0,delegateStyle:{},enableDelegate:!1,onlyChangeComboSize:!1,comboActiveState:"",selectedState:"selected"}},getEvents:function(){return{"node:dragstart":"onDragStart","node:drag":"onDrag","node:dragend":"onDragEnd","combo:dragenter":"onDragEnter","combo:dragleave":"onDragLeave","combo:drop":"onDropCombo","node:drop":"onDropNode","canvas:drop":"onDropCanvas"}},validationCombo:function(t){return!(!this.origin||!t||t.destroyed)&&"combo"===t.getType()},onDragStart:function(t){var e=this;if(this.shouldBegin.call(this,t)){var n=t.item;if(n&&!n.destroyed&&!n.hasLocked()){n.getContainer().set("capture",!1);var r=t.target;if(r)if(r.get("isAnchorPoint"))return;var i=this.graph;this.targets=[],this.targetCombo=null;var o=i.findAllByState("node",this.selectedState),a=n.get("id");0===o.filter((function(t){var e=t.get("id");return a===e})).length?this.targets.push(n):o.length>1?o.forEach((function(t){t.hasLocked()||e.targets.push(t)})):this.targets.push(n);var s=[];this.targets.forEach((function(t){s.push(Object(h.c)(t.getModel()))})),this.set("beforeDragNodes",s),this.origin={x:t.x,y:t.y},this.point={},this.originPoint={}}}},onDrag:function(t){var e=this;this.origin&&this.shouldUpdate(this,t)&&(this.get("enableDelegate")?this.updateDelegate(t):this.targets.map((function(n){e.update(n,t)})))},onDragEnd:function(t){if(this.origin&&this.shouldEnd.call(this,t)){var e=t.item;if(e)e.getContainer().set("capture",!0);this.delegateRect&&(this.delegateRect.remove(),this.delegateRect=null),this.updatePositions(t);var n=this.graph;if(n.get("enabledStack")){var r={before:{nodes:this.get("beforeDragNodes"),edges:[],combos:[]},after:{nodes:[],edges:[],combos:[]}};this.targets.forEach((function(t){r.after.nodes.push(t.getModel())})),n.pushStack("update",Object(h.c)(r))}n.emit("dragnodeend",{items:this.targets,targetItem:null}),this.point={},this.origin=null,this.originPoint={},this.targets.length=0,this.targetCombo=null}},onDropCombo:function(t){var e=t.item;if(this.validationCombo(e)){this.updatePositions(t);var n=this.graph;if(this.comboActiveState&&n.setItemState(e,this.comboActiveState,!1),this.targetCombo=e,this.onlyChangeComboSize)n.updateCombos();else{var r=e.getModel();this.targets.map((function(t){t.getModel().comboId!==r.id&&n.updateComboTree(t,r.id)})),n.updateCombo(e)}n.emit("dragnodeend",{items:this.targets,targetItem:this.targetCombo})}},onDropCanvas:function(t){var e=this.graph;this.targets&&0!==this.targets.length&&(this.updatePositions(t),this.onlyChangeComboSize?e.updateCombos():this.targets.map((function(t){t.getModel().comboId&&e.updateComboTree(t)})))},onDropNode:function(t){if(this.targets&&0!==this.targets.length){var e=t.item;this.updatePositions(t);var n=this.graph,r=e.getModel().comboId;if(r){var i=n.findById(r);this.comboActiveState&&n.setItemState(i,this.comboActiveState,!1),this.targets.map((function(t){var e=t.getModel();r!==e.comboId&&n.updateComboTree(t,r)})),n.updateCombo(i)}else this.targets.map((function(t){t.getModel().comboId&&n.updateComboTree(t)}));n.emit("dragnodeend",{items:this.targets,targetItem:e})}},onDragEnter:function(t){var e=t.item;if(this.validationCombo(e)){var n=this.graph;this.comboActiveState&&n.setItemState(e,this.comboActiveState,!0)}},onDragLeave:function(t){var e=t.item;if(this.validationCombo(e)){var n=this.graph;this.comboActiveState&&n.setItemState(e,this.comboActiveState,!1)}},updatePositions:function(t){var e=this;this.targets&&0!==this.targets.length&&this.get("enableDelegate")&&this.targets.map((function(n){return e.update(n,t)}))},update:function(t,e){var n=this.origin,r=t.get("model"),i=t.get("id");this.point[i]||(this.point[i]={x:r.x||0,y:r.y||0});var o={x:e.x-n.x+this.point[i].x,y:e.y-n.y+this.point[i].y};this.get("updateEdge")?this.graph.updateItem(t,o,!1):t.updatePosition(o)},updateDelegate:function(t){this.graph;if(this.delegateRect){var e=t.x-this.origin.x+this.originPoint.minX,n=t.y-this.origin.y+this.originPoint.minY;this.delegateRect.attr({x:e,y:n})}else{var r=this.graph.get("group"),i=Object(h.e)({},Dn.delegateStyle,this.delegateStyle),o=this.calculationGroupPosition(t),a=o.x,s=o.y,u=o.width,c=o.height,f=o.minX,l=o.minY;this.originPoint={x:a,y:s,width:u,height:c,minX:f,minY:l},this.delegateRect=r.addShape("rect",{attrs:Object(v.a)({width:u,height:c,x:a,y:s},i),name:"rect-delegate-shape"}),this.delegate=this.delegateRect,this.delegateRect.set("capture",!1)}},calculationGroupPosition:function(t){var e=this.graph.findAllByState("node",this.selectedState);0===e.length&&e.push(t.item);for(var n=1/0,r=-1/0,i=1/0,o=-1/0,a=0;ar&&(r=f),l>o&&(o=l)}return{x:Math.floor(n),y:Math.floor(i),width:Math.ceil(r)-Math.floor(n),height:Math.ceil(o)-Math.floor(i),minX:n,minY:i}}},jv=Math.min,Dv=Math.max,Nv=Math.abs,Rv=["drag","shift","ctrl","alt","control"],Lv={getDefaultCfg:function(){return{brushStyle:{fill:"#EEF6FF",fillOpacity:.4,stroke:"#DDEEFE",lineWidth:1},onSelect:function(){},onDeselect:function(){},selectedState:"selected",trigger:"shift",includeEdges:!0,selectedEdges:[],selectedNodes:[]}},getEvents:function(){return Rv.indexOf(this.trigger.toLowerCase())>-1||(this.trigger="shift",console.warn("Behavior brush-select 的 trigger 参数不合法,请输入 \'drag\'、\'shift\'、\'ctrl\' 或 \'alt\'")),"drag"===this.trigger?{dragstart:"onMouseDown",drag:"onMouseMove",dragend:"onMouseUp","canvas:click":"clearStates"}:{dragstart:"onMouseDown",drag:"onMouseMove",dragend:"onMouseUp","canvas:click":"clearStates",keyup:"onKeyUp",keydown:"onKeyDown"}},onMouseDown:function(t){var e=t.item,n=this.brush;e||("drag"===this.trigger||this.keydown)&&(this.selectedNodes&&0!==this.selectedNodes.length&&this.clearStates(),n||(n=this.createBrush()),this.originPoint={x:t.canvasX,y:t.canvasY},n.attr({width:0,height:0}),n.show(),this.dragging=!0)},onMouseMove:function(t){this.dragging&&("drag"===this.trigger||this.keydown)&&this.updateBrush(t)},onMouseUp:function(t){this.graph;(this.brush||this.dragging)&&("drag"===this.trigger||this.keydown)&&(this.brush.remove(!0),this.brush=null,this.getSelectedNodes(t),this.dragging=!1)},clearStates:function(){var t=this.graph,e=this.selectedState,n=t.findAllByState("node",e),r=t.findAllByState("edge",e);n.forEach((function(n){return t.setItemState(n,e,!1)})),r.forEach((function(n){return t.setItemState(n,e,!1)})),this.selectedNodes=[],this.selectedEdges=[],this.onDeselect&&this.onDeselect(this.selectedNodes,this.selectedEdges),t.emit("nodeselectchange",{selectedItems:{nodes:[],edges:[]},select:!1})},getSelectedNodes:function(t){var e=this,n=this.graph,r=this.originPoint,i=this.shouldUpdate,o=this.selectedState,a={x:t.x,y:t.y},s=n.getPointByCanvas(r.x,r.y),u=jv(a.x,s.x),c=Dv(a.x,s.x),f=jv(a.y,s.y),l=Dv(a.y,s.y),h=[],d=[];n.getNodes().forEach((function(t){var e=t.getBBox();if(e.centerX>=u&&e.centerX<=c&&e.centerY>=f&&e.centerY<=l&&i(t,"select")){h.push(t);var r=t.getModel();d.push(r.id),n.setItemState(t,o,!0)}}));var p=[];this.includeEdges&&h.forEach((function(t){t.getOutEdges().forEach((function(t){var r=t.getModel(),o=r.source,a=r.target;d.includes(o)&&d.includes(a)&&i(t,"select")&&(p.push(t),n.setItemState(t,e.selectedState,!0))}))})),this.selectedEdges=p,this.selectedNodes=h,this.onSelect&&this.onSelect(h,p),n.emit("nodeselectchange",{selectedItems:{nodes:h,edges:p},select:!0})},createBrush:function(){var t=this.graph.get("canvas").addShape("rect",{attrs:this.brushStyle,capture:!1,name:"brush-shape"});return this.brush=t,this.delegate=t,t},updateBrush:function(t){var e=this.originPoint;this.brush.attr({width:Nv(t.canvasX-e.x),height:Nv(t.canvasY-e.y),x:jv(t.canvasX,e.x),y:jv(t.canvasY,e.y)})},onKeyDown:function(t){var e=t.key;if(e){var n=this.trigger.toLowerCase(),r=e.toLowerCase();this.keydown=r===n||"control"===r&&"ctrl"===n||"ctrl"===r&&"control"===n}},onKeyUp:function(){this.brush&&(this.brush.remove(!0),this.brush=null,this.dragging=!1),this.keydown=!1}},Bv=["shift","ctrl","alt","control"],Gv={getDefaultCfg:function(){return{multiple:!0,trigger:"shift",selectedState:"selected"}},getEvents:function(){return Bv.indexOf(this.trigger.toLowerCase())>-1||(this.trigger="shift",console.warn("Behavior brush-select 的 trigger 参数不合法,请输入 \'drag\'、\'shift\'、\'ctrl\' 或 \'alt\'")),this.multiple?{"node:click":"onClick","combo:click":"onClick","canvas:click":"onCanvasClick",keyup:"onKeyUp",keydown:"onKeyDown"}:{"node:click":"onClick","combo:click":"onClick","canvas:click":"onCanvasClick"}},onClick:function(t){var e=this,n=t.item;if(n&&!n.destroyed){var r=n.getType(),i=e.graph,o=e.keydown,a=e.multiple,s=e.shouldUpdate;if(e.shouldBegin.call(e,t)){if(!o||!a){var u=i.findAllByState(r,e.selectedState);Object(h.f)(u,(function(t){t!==n&&i.setItemState(t,e.selectedState,!1)}))}if(n.hasState(e.selectedState)){s.call(e,t)&&i.setItemState(n,e.selectedState,!1);var c=i.findAllByState("node",e.selectedState),f=i.findAllByState("combo",e.selectedState);i.emit("nodeselectchange",{target:n,selectedItems:{nodes:c,combos:f},select:!1})}else{s.call(e,t)&&i.setItemState(n,e.selectedState,!0);c=i.findAllByState("node",e.selectedState),f=i.findAllByState("combo",e.selectedState);i.emit("nodeselectchange",{target:n,selectedItems:{nodes:c,combos:f},select:!0})}}}},onCanvasClick:function(){var t=this,e=this.graph,n=e.findAllByState("node",this.selectedState);Object(h.f)(n,(function(n){e.setItemState(n,t.selectedState,!1)}));var r=e.findAllByState("combo",this.selectedState);Object(h.f)(r,(function(n){e.setItemState(n,t.selectedState,!1)})),e.emit("nodeselectchange",{selectedItems:{nodes:[],edges:[],combos:[]},select:!1})},onKeyDown:function(t){var e=t.key;e&&(e.toLowerCase()===this.trigger.toLowerCase()||"control"===e.toLowerCase()?this.keydown=!0:this.keydown=!1)},onKeyUp:function(){this.keydown=!1}},Fv=s.transform,Uv={getDefaultCfg:function(){return{sensitivity:2,minZoom:void 0,maxZoom:void 0,enableOptimize:!1,optimizeZoom:.1,fixSelectedItems:{fixAll:!1,fixLineWidth:!1,fixLabel:!1,fixState:"selected"}}},getEvents:function(){var t=this.fixSelectedItems;return t.fixState||(t.fixState="selected"),t.fixAll&&(t.fixLineWidth=!0,t.fixLabel=!0),{wheel:"onWheel",touchstart:"onTouchStart",touchmove:"onTouchMove",touchend:"onTouchEnd"}},onTouchStart:function(t){var e=t.originalEvent.touches,n=e[0],r=e[1];t.preventDefault(),r&&(this.shouldBegin&&!this.shouldBegin.call(this,t)||(this.startPoint={pageX:n.pageX,pageY:n.pageY},this.moveable=!0,r&&(this.endPoint={pageX:r.pageX,pageY:r.pageY}),this.originScale=this.graph.getZoom()||this.currentScale||1))},onTouchMove:function(t){if(this.moveable){t.preventDefault();var e=t.originalEvent.touches,n=e[0],r=e[1];if(r){this.endPoint||(this.endPoint={pageX:r.pageX,pageY:r.pageY});var i=function(t,e){return Math.hypot(e.x-t.x,e.y-t.y)},o=i({x:n.pageX,y:n.pageY},{x:r.pageX,y:r.pageY})/i({x:this.startPoint.pageX,y:this.startPoint.pageY},{x:this.endPoint.pageX,y:this.endPoint.pageY}),a=this.originScale*o;this.currentScale=a;var s=this.get("minZoom")||this.graph.get("minZoom");if(!(a>(this.get("maxZoom")||this.graph.get("maxZoom"))||a(this.get("maxZoom")||n.get("maxZoom"))||in/2?u-=f.width:u+=this.offset,c>r/2?c-=f.height:c+=this.offset;var l=u+"px",h=c+"px";vt(this.container,{left:l,top:h,visibility:"visible"})}else vt(i,{visibility:"hidden"})},createTooltip:function(t){var e=t.get("el");e.style.position="relative";var n=gt(\'
    \');return e.parentNode.appendChild(n),vt(n,{position:"absolute",visibility:"visible"}),this.width=t.get("width"),this.height=t.get("height"),this.container=n,this.graph.get("tooltips").push(n),n}},Vv=Object(v.a)({getDefaultCfg:function(){return{item:"node",offset:12,formatText:function(t){return t.label}}},getEvents:function(){return{"node:mouseenter":"onMouseEnter","node:mouseleave":"onMouseLeave","node:mousemove":"onMouseMove",afterremoveitem:"onMouseLeave"}}},zv),Wv=Object(v.a)({getDefaultCfg:function(){return{item:"edge",offset:12,formatText:function(t){return"source: "+t.source+" target: "+t.target}}},getEvents:function(){return{"edge:mouseenter":"onMouseEnter","edge:mouseleave":"onMouseLeave","edge:mousemove":"onMouseMove",afterremoveitem:"onMouseLeave"}}},zv),Xv=["click","dblclick"],Yv={getDefaultCfg:function(){return{trigger:"click",onChange:function(){}}},getEvents:function(){var t,e;return Xv.includes(this.trigger)?e=this.trigger:(e="click",console.warn("Behavior collapse-expand 的 trigger 参数不合法,请输入 \'click\' 或 \'dblclick\'")),(t={})["node:"+e]="onNodeClick",t.touchstart="onNodeClick",t},onNodeClick:function(t){var e=t.item;if(e){var n=this.graph.findDataById(e.get("id"));if(n){var r=n.children;if(r&&0!==r.length){var i=!n.collapsed;this.shouldBegin(t,i)&&(n.collapsed=i,e.getModel().collapsed=i,this.graph.emit("itemcollapsed",{item:t.item,collapsed:i}),this.shouldUpdate(t,i)&&(this.onChange(e,i),this.graph.layout()))}}}}},Hv=dd.calculationItemsBBox,qv={getDefaultCfg:function(){return{enableDelegate:!1,delegateStyle:{},onlyChangeComboSize:!1,activeState:"",selectedState:"selected"}},getEvents:function(){return{"combo:dragstart":"onDragStart","combo:drag":"onDrag","combo:dragend":"onDragEnd","combo:drop":"onDrop","node:drop":"onNodeDrop","combo:dragenter":"onDragEnter","combo:dragleave":"onDragLeave"}},validationCombo:function(t){var e=t.item;return!(!e||e.destroyed)&&(!!this.shouldUpdate(this,t)&&"combo"===e.getType())},onDragStart:function(t){var e=this,n=this.graph,r=t.item;if(this.validationCombo(t)){this.targets=[];var i=n.findAllByState("combo",this.selectedState),o=r.get("id");0===i.filter((function(t){var e=t.get("id");return o===e})).length?this.targets.push(r):this.targets=i,this.activeState&&this.targets.map((function(t){var r=t.getModel();if(r.parentId){var i=n.findById(r.parentId);i&&n.setItemState(i,e.activeState,!0)}})),this.point={},this.originPoint={},this.origin={x:t.x,y:t.y},this.currentItemChildCombos=[],function t(e,n){if(!1!==n(e)&&e){var r=e.get("combos");if(0===r.length)return!1;Object(h.f)(r,(function(e){t(e,n)}))}}(r,(function(t){if(t.destroyed)return!1;var n=t.getModel();return e.currentItemChildCombos.push(n.id),!0}))}},onDrag:function(t){var e=this;if(this.origin&&this.validationCombo(t))if(this.enableDelegate)this.updateDelegate(t);else{if(this.activeState){var n=this.graph,r=t.item,i=r.getModel(),o=n.getCombos(),a=r.getBBox(),s=a.centerX,u=a.centerY,c=a.width;o.filter((function(t){var n=t.getModel();return i.parentId,n.id!==i.id&&!e.currentItemChildCombos.includes(n.id)})).map((function(t){var r=t.getBBox(),i=r.centerX,o=r.centerY,a=r.width,f=s-i,l=u-o,h=2*Math.sqrt(f*f+l*l);c+a-h>.8*c?n.setItemState(t,e.activeState,!0):n.setItemState(t,e.activeState,!1)}))}Object(h.f)(this.targets,(function(n){e.updateCombo(n,t)}))}},updatePositions:function(t){var e=this;this.enableDelegate&&Object(h.f)(this.targets,(function(n){e.updateCombo(n,t)}))},onDrop:function(t){var e=this,n=t.item;if(n&&this.targets&&!n.destroyed){this.updatePositions(t);var r=this.graph,i=n.getModel();this.targets.map((function(t){t.getModel().parentId!==i.id?(e.activeState&&r.setItemState(n,e.activeState,!1),e.onlyChangeComboSize?r.updateCombo(t):r.updateComboTree(t,i.id)):r.updateCombo(n)})),this.end(n,t),this.endComparison=!0}},onNodeDrop:function(t){var e=this;if(this.targets&&0!==this.targets.length){this.updatePositions(t);var n,r=this.graph,i=t.item.getModel().comboId;if(i){if(this.activeState){var o=r.findById(i);r.setItemState(o,this.activeState,!1)}this.targets.map((function(t){e.onlyChangeComboSize?r.updateCombo(t):i!==t.getID()&&(n=r.findById(i),i!==t.getModel().parentId&&r.updateComboTree(t,i))}))}else this.targets.map((function(t){e.onlyChangeComboSize?r.updateCombo(t):t.getModel().comboId&&r.updateComboTree(t)}));this.endComparison=!0,this.end(n,t)}},onDragEnter:function(t){if(this.origin&&this.validationCombo(t)){var e=t.item,n=this.graph;this.activeState&&n.setItemState(e,this.activeState,!0)}},onDragLeave:function(t){if(this.origin&&this.validationCombo(t)){var e=t.item,n=this.graph;this.activeState&&n.setItemState(e,this.activeState,!1)}},onDragEnd:function(t){if(this.targets&&0!==this.targets.length){var e=t.item;this.updatePositions(t);var n=this.getParentCombo(e.getModel().parentId),r=this.graph;n&&this.activeState&&r.setItemState(n,this.activeState,!1),this.end(void 0,t)}},end:function(t,e){var n=this;if(this.origin){var r=this.graph;if(this.delegateShape)r.get("delegateGroup").clear(),this.delegateShape=null;t&&this.activeState&&r.setItemState(t,this.activeState,!1),t||this.targets.map((function(t){n.onlyChangeComboSize?r.updateCombo(t):r.updateComboTree(t)})),this.point=[],this.origin=null,this.originPoint=null,this.targets.length=0}},traverse:function(t,e){var n=this;if(!1!==e(t)&&t){var r=t.get("combos");Object(h.f)(r,(function(t){n.traverse(t,e)}));var i=t.get("nodes");Object(h.f)(i,(function(t){n.traverse(t,e)}))}},updateCombo:function(t,e){var n=this;this.traverse(t,(function(t){return!t.destroyed&&(n.updateSignleItem(t,e),!0)}))},updateSignleItem:function(t,e){var n=this.origin,r=this.graph,i=t.getModel(),o=t.get("id");this.point[o]||(this.point[o]={x:i.x,y:i.y});var a=e.x-n.x+this.point[o].x,s=e.y-n.y+this.point[o].y;r.updateItem(t,{x:a,y:s})},getParentCombo:function(t){var e=this.graph;if(t){var n=e.findById(t);if(n)return n}},updateDelegate:function(t){var e=this.graph;if(this.delegateShape){var n=t.x-this.origin.x+this.originPoint.minX,r=t.y-this.origin.y+this.originPoint.minY;this.delegateShape.attr({x:n,y:r})}else{var i=e.get("delegateGroup"),o=null,a=(o=this.targets.length>1?Hv(this.targets):this.targets[0].getBBox()).x,s=o.y,u=o.width,c=o.height,f=o.minX,l=o.minY;this.originPoint={x:a,y:s,width:u,height:c,minX:f,minY:l};var h=Object(v.a)(Object(v.a)({},Dn.delegateStyle),this.delegateStyle);this.delegateShape=i.addShape("rect",{attrs:Object(v.a)({width:o.width,height:o.height,x:o.x,y:o.y},h),name:"combo-delegate-shape"}),this.delegate=this.delegateShape}}},Kv=["click","dblclick"],Zv={getDefaultCfg:function(){return{trigger:"dblclick",relayout:!0}},getEvents:function(){var t,e;return Kv.includes(this.trigger)?e=this.trigger:(e="dblclick",console.warn("Behavior collapse-expand-group 的 trigger 参数不合法,请输入 \'click\' 或 \'dblclick\'")),(t={})["combo:"+e]="onComboClick",t},onComboClick:function(t){var e=t.item,n=this.graph,r=this.relayout;if(e&&!e.destroyed&&"combo"===e.getType()){var i=e.getModel().id;i&&(n.collapseExpandCombo(i),r&&n.get("layout")?n.layout():n.refreshPositions())}}},Qv=dd.isPolygonsIntersect,Jv=dd.pathToPoints,$v=["drag","shift","ctrl","alt","control"],ty=["click","drag"],ey=["shift","ctrl","control","alt","meta",void 0],ny=["shift","ctrl","alt","control"],ry={"drag-canvas":Iv,"zoom-canvas":Uv,"drag-node":Pv,"activate-relations":{getDefaultCfg:function(){return{trigger:"mouseenter",activeState:"active",inactiveState:"inactive",resetSelected:!1,shouldUpdate:function(){return!0}}},getEvents:function(){return"mouseenter"===this.get("trigger")?{"node:mouseenter":"setAllItemStates","node:mouseleave":"clearActiveState"}:{"node:click":"setAllItemStates","canvas:click":"clearAllItemStates"}},setAllItemStates:function(t){var e=t.item,n=this.graph;if(this.item=e,this.shouldUpdate(t.item,{event:t,action:"activate"})){for(var r=this.activeState,i=this.inactiveState,o=n.getNodes(),a=n.getEdges(),s=o.length,u=a.length,c=0;c-1||(this.trigger="shift",console.warn("Behavior lasso-select 的 trigger 参数不合法,请输入 \'drag\'、\'shift\'、\'ctrl\' 或 \'alt\'")),"drag"===this.trigger?{dragstart:"onDragStart",drag:"onDragMove",dragend:"onDragEnd","canvas:click":"clearStates"}:{dragstart:"onDragStart",drag:"onDragMove",dragend:"onDragEnd",keyup:"onKeyUp",keydown:"onKeyDown","canvas:click":"clearStates"}},onDragStart:function(t){var e=this.lasso;t.item||("drag"===this.trigger||this.keydown)&&(this.selectedNodes&&0!==this.selectedNodes.length&&this.clearStates(),e||(e=this.createLasso()),this.dragging=!0,this.originPoint={x:t.x,y:t.y},this.points.push(this.originPoint),e.show())},onDragMove:function(t){this.dragging&&("drag"===this.trigger||this.keydown)&&(this.points.push({x:t.x,y:t.y}),this.updateLasso(t))},onDragEnd:function(t){(this.lasso||this.dragging)&&("drag"===this.trigger||this.keydown)&&(this.points.push(this.originPoint),this.getSelectedItems(),this.lasso.remove(!0),this.lasso=null,this.points=[],this.dragging=!1)},getLassoPath:function(){var t=this.points,e=[];return t.length&&(t.forEach((function(t,n){0===n?e.push(["M",t.x,t.y]):e.push(["L",t.x,t.y])})),e.push(["L",t[0].x,t[0].y])),e},clearStates:function(){var t=this.graph,e=this.selectedState,n=t.findAllByState("node",e),r=t.findAllByState("edge",e);n.forEach((function(n){return t.setItemState(n,e,!1)})),r.forEach((function(n){return t.setItemState(n,e,!1)})),this.onDeselect&&this.onDeselect(this.selectedNodes,this.selectedEdges),this.selectedNodes=[],this.selectedEdges=[],t.emit("nodeselectchange",{selectedItems:{nodes:[],edges:[]},select:!1})},getSelectedItems:function(){var t=this,e=this.graph,n=this.shouldUpdate,r=this.points.map((function(t){return[e.getCanvasByPoint(t.x,t.y).x,e.getCanvasByPoint(t.x,t.y).y]})),i=this.selectedState,o=[],a=[];e.getNodes().forEach((function(t){if(function(t,e){var n,r=t.getKeyShape();if("path"===t.get("type"))n=Jv(r.attr("path"));else{var i=r.getCanvasBBox();n=[[i.minX,i.minY],[i.maxX,i.minY],[i.maxX,i.maxY],[i.minX,i.maxY]]}return Qv(e,n)}(t,r)&&n(t,"select")){o.push(t);var s=t.getModel();a.push(s.id),e.setItemState(t,i,!0)}}));var s=[];this.includeEdges&&o.forEach((function(r){r.getOutEdges().forEach((function(r){var i=r.getModel(),o=i.source,u=i.target;a.includes(o)&&a.includes(u)&&n(r,"select")&&(s.push(r),e.setItemState(r,t.selectedState,!0))}))})),this.selectedEdges=s,this.selectedNodes=o,this.onSelect&&this.onSelect(o,s),e.emit("nodeselectchange",{selectedItems:{nodes:o,edges:s},select:!0})},createLasso:function(){var t=this.graph.get("delegateGroup").addShape("path",{attrs:Object(v.a)({path:[]},this.delegateStyle),capture:!1,name:"lasso-shape"});return this.lasso=t,this.delegate=t,this.points=[],t},updateLasso:function(t){this.lasso.attr({path:this.getLassoPath()})},onKeyDown:function(t){var e=t.key;e&&(e.toLowerCase()===this.trigger.toLowerCase()?this.keydown=!0:this.keydown=!1)},onKeyUp:function(){this.lasso&&(this.lasso.remove(!0),this.lasso=null,this.points=[],this.dragging=!1),this.keydown=!1}},tooltip:Vv,"edge-tooltip":Wv,"collapse-expand":Yv,"drag-combo":qv,"collapse-expand-combo":Zv,"create-edge":{getDefaultCfg:function(){return{trigger:"click",key:void 0,edgeConfig:{},getEdgeConfig:void 0}},getEvents:function(){var t;return ty.indexOf(this.trigger.toLowerCase())>-1||(this.trigger="click",console.warn("Behavior create-edge 的 trigger 参数不合法,请输入 \'click\',\'drag\'")),this.key&&-1===ey.indexOf(this.key.toLowerCase())&&(this.trigger=void 0,console.warn("Behavior create-edge 的 key 参数不合法,请输入 \'shift\',\'ctrl\',\'alt\',\'control\',或 undefined")),"drag"===this.trigger?t={"node:dragstart":"onClick","combo:dragstart":"onClick",drag:"updateEndPoint","node:drop":"onClick","combo:drop":"onClick",dragend:"onDragEnd"}:"click"===this.trigger&&(t={"node:click":"onClick",mousemove:"updateEndPoint","edge:click":"cancelCreating","canvas:click":"cancelCreating","combo:click":"onClick"}),this.key&&(t.keydown="onKeyDown",t.keyup="onKeyUp"),t},onDragEnd:function(t){if(!this.key||this.keydown){var e=t.item;e&&e.getID()!==this.source&&"node"===e.getType()||this.cancelCreating({item:this.edge,x:t.x,y:t.y})}},onClick:function(t){if(!this.key||this.keydown){var e=t.item,n=this.graph,r=e.getModel(),i=this.getEdgeConfig;if(this.addingEdge&&this.edge){if(!this.shouldEnd.call(this,t))return;var o=void 0;o=i&&Object(h.r)(i)?i({source:this.source,target:r.id}):this.edgeConfig;var a=Object(v.a)({target:r.id},o);this.source===r.id&&(a.type="loop"),n.emit("beforecreateedge",{}),n.updateItem(this.edge,a),n.emit("aftercreateedge",{edge:this.edge}),this.edge.getKeyShape().set("capture",!0),this.edge=null,this.addingEdge=!1}else{if(!this.shouldBegin.call(this,t))return;o=void 0;o=i&&Object(h.r)(i)?i({source:r.id,target:r.id}):this.edgeConfig,this.edge=n.addItem("edge",Object(v.a)({source:r.id,target:r.id},o),!1),this.source=r.id,this.addingEdge=!0,this.edge.getKeyShape().set("capture",!1)}}},updateEndPoint:function(t){if(!this.key||this.keydown){var e={x:t.x,y:t.y};this.graph.findById(this.source)?this.addingEdge&&this.edge&&this.graph.updateItem(this.edge,{target:e},!1):this.addingEdge=!1}},cancelCreating:function(t){if(!this.key||this.keydown){var e=this.graph,n=t.item;if(this.addingEdge&&t.target&&t.target.isCanvas&&t.target.isCanvas())return e.removeItem(this.edge,!1),this.edge=null,void(this.addingEdge=!1);this.addingEdge&&this.edge===n&&(e.removeItem(this.edge,!1),this.edge=null,this.addingEdge=!1)}},onKeyDown:function(t){var e=t.key;e&&(e.toLowerCase()===this.key.toLowerCase()?this.keydown=!0:this.keydown=!1)},onKeyUp:function(){this.addingEdge&&this.edge&&(this.graph.removeItem(this.edge,!1),this.addingEdge=!1,this.edge=null),this.keydown=!1}},"shortcuts-call":{getDefaultCfg:function(){return{trigger:"ctrl",combinedKey:"1",functionName:"fitView",functionParams:[]}},getEvents:function(){return ny.indexOf(this.trigger.toLowerCase())>-1||(this.trigger="ctrl",console.warn("Behavior shortcuts-fit-view 的 trigger 参数 \'"+this.trigger+"\' 不合法,请输入 \'drag\'、\'shift\'、\'ctrl\' 或 \'alt\'")),this.combinedKey===this.trigger&&(this.combinedKey=void 0),{keyup:"onKeyUp",keydown:"onKeyDown"}},onKeyDown:function(t){var e=t.key;if(e){var n=this.trigger.toLowerCase(),r=e.toLowerCase();this.triggerKeydown||(this.triggerKeydown=r===n||"control"===r&&"ctrl"===n||"ctrl"===r&&"control"===n);var i=this.graph;if(!i[this.functionName])return console.warn("Behavior shortcuts-fit-view 的 functionName 参数 \'"+this.functionName+"\' 不合法,它不是 Graph 的一个函数名"),{};if(!this.triggerKeydown||this.combinedKey){var o=this.combinedKey.toLowerCase();this.triggerKeydown&&(r===o||"control"===r&&"ctrl"===o||"ctrl"===r&&"control"===o)&&(this.functionParams&&this.functionParams.length?i[this.functionName].apply(i,this.functionParams):i[this.functionName]())}else this.functionParams&&this.functionParams.length?i[this.functionName].apply(i,this.functionParams):i[this.functionName]()}},onKeyUp:function(){this.brush&&(this.brush.remove(!0),this.brush=null,this.dragging=!1),this.triggerKeydown=!1}}};Object(h.f)(ry,(function(t,e){rn(e,t)}));var iy=tv.Minimap,oy=tv.Grid,ay=tv.Bundling,sy=tv.Menu,uy=tv.Fisheye,cy=tv.ToolBar,fy=tv.Tooltip,ly=tv.TimeBar,hy=tv.ImageMinimap,dy=tv.EdgeFilterLens,py={version:Dn.version,Graph:nd,TreeGraph:vd,Util:dd,Layout:Nh,registerLayout:Lh,Global:Dn,registerBehavior:rn,registerCombo:nn,registerEdge:en,registerNode:tn,Minimap:tv.Minimap,Grid:tv.Grid,Bundling:tv.Bundling,Menu:tv.Menu,ToolBar:tv.ToolBar,Tooltip:tv.Tooltip,TimeBar:ly,Fisheye:uy,ImageMinimap:hy,EdgeFilterLens:dy,Algorithm:b,Arrow:He,Marker:qe,Shape:Ke};py.version="4.1.12";e.default=py;var gy="4.1.12"}]).default}));\r\n//# sourceMappingURL=g6.min.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvTGliL2c2LmpzPzA3MDciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxLQUFpRCxvQkFBb0IsU0FBbUcsQ0FBQyxrQkFBa0IsbUJBQW1CLFNBQVMsY0FBYyw0QkFBNEIsWUFBWSxxQkFBcUIsMkRBQTJELHVDQUF1QyxxQ0FBcUMsb0JBQW9CLEVBQUUsaUJBQWlCLDRGQUE0RixlQUFlLHdDQUF3QyxTQUFTLEVBQUUsbUJBQW1CLDhCQUE4QixxREFBcUQsMEJBQTBCLDZDQUE2QyxzQkFBc0IsNkRBQTZELFlBQVksZUFBZSxTQUFTLGlCQUFpQixpQ0FBaUMsaUJBQWlCLFlBQVksVUFBVSxzQkFBc0IsbUJBQW1CLGlEQUFpRCxtQkFBbUIsa0JBQWtCLGFBQWEsc0JBQXNCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFNBQVMseUJBQXlCLFVBQVUseUJBQXlCLFVBQVUsR0FBRyxrQkFBa0IsMERBQTBELGlCQUFpQixrQkFBa0IsaUJBQWlCLFdBQVcsS0FBSyxXQUFXLGtCQUFrQixTQUFTLEtBQUssMEJBQTBCLG9DQUFvQyxlQUFlLHVCQUF1QixlQUFlLGVB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LHFDQUFxQyxHQUFHLFNBQVMsMENBQTBDLHFDQUFxQyx5Q0FBeUMsOEZBQThGLEdBQUcsMEdBQTBHLGVBQWUsZ0JBQWdCLFdBQVcsRUFBRSx3QkFBd0IsdURBQXVELG1CQUFtQixRQUFRLG1EQUFtRCxFQUFFLHFEQUFxRCx5QkFBeUIsaUJBQWlCLHlCQUF5QixFQUFFLHVCQUF1QixZQUFZLGtGQUFrRixvQkFBb0IscUdBQXFHLDZHQUE2Ryx5QkFBeUIsT0FBTyx3Q0FBd0MsdUJBQXVCLHNCQUFzQixNQUFNLHVZQUF1WSw4SUFBOEksNkJBQTZCLHdJQUF3SSx3REFBd0QsdUJBQXVCLDRCQUE0QixhQUFhLHVFQUF1RSwyQkFBMkIsR0FBRyxxQkFBcUIsNEJBQTRCLDhEQUE4RCwrQkFBK0IsdUNBQXVDLGFBQWEsdUJBQXVCLCtCQUErQixrQkFBa0IsbUJBQW1CLFlBQVksSUFBSSxnRUFBZ0Usc0RBQXNELGVBQWUsOEVBQThFLEtBQUsseUNBQXlDLFNBQVMsdUJBQXVCLHdCQUF3QiwwREFBMEQsd0JBQXdCLHdGQUF3Riw0QkFBNEIsNEJBQTRCLE9BQU8sYUFBYSw4RkFBOEYsU0FBUyx5QkFBeUIsNEJBQTRCLDRCQUE0QiwwQkFBMEIsK0lBQStJLGdHQUFnRyx1QkFBdUIsWUFBWSw4RUFBOEUsb0JBQW9CLHFIQUFxSCxtQkFBbUIseUJBQXlCLE9BQU8seUVBQXlFLHNCQUFzQixnUkFBZ1IscUNBQXFDLHVCQUF1QixZQUFZLE1BQU0sbURBQW1ELHVHQUF1RyxpQkFBaUIsOEtBQThLLDJDQUEyQyxxQ0FBcUMsK01BQStNLCtIQUErSCxvQkFBb0IsK0ZBQStGLDhCQUE4QixRQUFRLEdBQUcsMkpBQTJKLHFXQUFxVyxvQkFBb0IsYUFBYSxnQkFBZ0IsV0FBVztBQUNucWk3QiIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5HNj1lKCk6dC5HNj1lKCl9KHRoaXMsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBpPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLG4pLGkubD0hMCxpLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUscil7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIGkgaW4gdCluLmQocixpLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsaSkpO3JldHVybiByfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9NTI4KX0oW2Z1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImpcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdn0pKSxuLmQoZSxcImtcIiwoZnVuY3Rpb24oKXtyZXR1cm4gYn0pKSxuLmQoZSxcInlcIiwoZnVuY3Rpb24oKXtyZXR1cm4geH0pKSxuLmQoZSxcImdcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKSxuLmQoZSxcIkpcIiwoZnVuY3Rpb24oKXtyZXR1cm4gd30pKSxuLmQoZSxcImhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gU30pKSxuLmQoZSxcInVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gX30pKSxuLmQoZSxcIkJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gT30pKSxuLmQoZSxcIkdcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTX0pKSxuLmQoZSxcIklcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVH0pKSxuLmQoZSxcIm1cIiwoZnVuY3Rpb24oKXtyZXR1cm4gY30pKSxuLmQoZSxcIm5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gUH0pKSxuLmQoZSxcIm9cIiwoZnVuY3Rpb24oKXtyZXR1cm4gan0pKSxuLmQoZSxcInJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gc30pKSxuLmQoZSxcInNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSxuLmQoZSxcInRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRX0pKSxuLmQoZSxcInZcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbH0pKSxuLmQoZSxcIndcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZ30pKSxuLmQoZSxcInhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbX0pKSxuLmQoZSxcIkRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUn0pKSxuLmQoZSxcImJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTH0pKSxuLmQoZSxcImNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVX0pKSxuLmQoZSxcImRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gen0pKSxuLmQoZSxcImVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gV30pKSxuLmQoZSxcImZcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaH0pKSxuLmQoZSxcImxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gWH0pKSxuLmQoZSxcInBcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSH0pKSxuLmQoZSxcInFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcX0pKSxuLmQoZSxcInpcIiwoZnVuY3Rpb24oKXtyZXR1cm4gS30pKSxuLmQoZSxcIkFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gR30pKSxuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gR30pKSxuLmQoZSxcImlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gWn0pKSxuLmQoZSxcIkZcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUX0pKSxuLmQoZSxcIkhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gJH0pKSxuLmQoZSxcIkNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdHR9KSksbi5kKGUsXCJFXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGV0fSkpO3ZhciByPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dCYmXCJmdW5jdGlvblwiIT10eXBlb2YgdCYmaXNGaW5pdGUodC5sZW5ndGgpfSxpPWZ1bmN0aW9uKHQsZSl7aWYoIXIodCkpcmV0dXJuIHQ7Zm9yKHZhciBuPVtdLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG89dFtpXTtlKG8saSkmJm4ucHVzaChvKX1yZXR1cm4gbn0sbz17fS50b1N0cmluZyxhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8uY2FsbCh0KT09PVwiW29iamVjdCBcIitlK1wiXVwifSxzPWZ1bmN0aW9uKHQpe3JldHVybiBhKHQsXCJGdW5jdGlvblwiKX0sdT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dH0sYz1mdW5jdGlvbih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheT9BcnJheS5pc0FycmF5KHQpOmEodCxcIkFycmF5XCIpfTtmdW5jdGlvbiBmKHQpe3JldHVybihmPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX12YXIgbD1mdW5jdGlvbih0KXt2YXIgZT1mKHQpO3JldHVybiBudWxsIT09dCYmXCJvYmplY3RcIj09PWV8fFwiZnVuY3Rpb25cIj09PWV9O3ZhciBoPWZ1bmN0aW9uKHQsZSl7aWYodClpZihjKHQpKWZvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyJiYhMSE9PWUodFtuXSxuKTtuKyspO2Vsc2UgaWYobCh0KSlmb3IodmFyIGkgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGkpJiYhMT09PWUodFtpXSxpKSlicmVha307T2JqZWN0LmtleXM7ZnVuY3Rpb24gZCh0KXtyZXR1cm4oZD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9dmFyIHA9ZnVuY3Rpb24odCl7cmV0dXJuXCJvYmplY3RcIj09PWQodCkmJm51bGwhPT10fSxnPWZ1bmN0aW9uKHQpe2lmKCFwKHQpfHwhYSh0LFwiT2JqZWN0XCIpKXJldHVybiExO2lmKG51bGw9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpcmV0dXJuITA7Zm9yKHZhciBlPXQ7bnVsbCE9PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTspZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih0KT09PWV9O3ZhciB2PWZ1bmN0aW9uKHQpe3ZhciBlPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4haXNOYU4odCl9KSk7aWYoIWUubGVuZ3RoKXJldHVybnttaW46MCxtYXg6MH07aWYoYyh0WzBdKSl7Zm9yKHZhciBuPVtdLHI9MDtyPHQubGVuZ3RoO3IrKyluPW4uY29uY2F0KHRbcl0pO2U9bn12YXIgaT1mdW5jdGlvbih0KXtpZihjKHQpKXt2YXIgZT10WzBdO3JldHVybiBoKHQsKGZ1bmN0aW9uKHQpe3Q+ZSYmKGU9dCl9KSksZX19KGUpO3JldHVybnttaW46ZnVuY3Rpb24odCl7aWYoYyh0KSl7dmFyIGU9dFswXTtyZXR1cm4gaCh0LChmdW5jdGlvbih0KXt0PGUmJihlPXQpfSkpLGV9fShlKSxtYXg6aX19LHk9QXJyYXkucHJvdG90eXBlLG09KHkuc3BsaWNlLHkuaW5kZXhPZixBcnJheS5wcm90b3R5cGUuc3BsaWNlLGZ1bmN0aW9uKHQpe3JldHVybiBhKHQsXCJTdHJpbmdcIil9KTtmdW5jdGlvbiBiKHQpe2lmKHIodCkpcmV0dXJuIHRbMF19ZnVuY3Rpb24geCh0KXtpZihyKHQpKXtyZXR1cm4gdFt0Lmxlbmd0aC0xXX19T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgdz1mdW5jdGlvbih0LGUpe2lmKHRbXCJfd3JhcF9cIitlXSlyZXR1cm4gdFtcIl93cmFwX1wiK2VdO3ZhciBuPWZ1bmN0aW9uKG4pe3RbZV0obil9O3JldHVybiB0W1wiX3dyYXBfXCIrZV09bixufTt2YXIgUz1mdW5jdGlvbih0LGUpe3ZhciBuPWUudG9TdHJpbmcoKSxyPW4uaW5kZXhPZihcIi5cIik7aWYoLTE9PT1yKXJldHVybiBNYXRoLnJvdW5kKHQpO3ZhciBpPW4uc3Vic3RyKHIrMSkubGVuZ3RoO3JldHVybiBpPjIwJiYoaT0yMCkscGFyc2VGbG9hdCh0LnRvRml4ZWQoaSkpfSxFPWZ1bmN0aW9uKHQpe3JldHVybiBhKHQsXCJOdW1iZXJcIil9O051bWJlci5pc0ludGVnZXImJk51bWJlci5pc0ludGVnZXI7ZnVuY3Rpb24gXyh0LGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPTFlLTUpLE1hdGguYWJzKHQtZSk8bn12YXIgTz1mdW5jdGlvbih0LGUpe3JldHVybih0JWUrZSklZX0saz0oTWF0aC5QSSxwYXJzZUludCxNYXRoLlBJLzE4MCksTT1mdW5jdGlvbih0KXtyZXR1cm4gayp0fSxBPShPYmplY3QudmFsdWVzLGZ1bmN0aW9uKHQpe3JldHVybiB1KHQpP1wiXCI6dC50b1N0cmluZygpfSk7dmFyIFQ9ZnVuY3Rpb24odCl7dmFyIGU9QSh0KTtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnN1YnN0cmluZygxKX0sQz17fS50b1N0cmluZyxJPWZ1bmN0aW9uKHQpe3JldHVybiBDLmNhbGwodCkucmVwbGFjZSgvXlxcW29iamVjdCAvLFwiXCIpLnJlcGxhY2UoL10kLyxcIlwiKX0sUD1mdW5jdGlvbih0KXtyZXR1cm4gYSh0LFwiQm9vbGVhblwiKX0saj1mdW5jdGlvbih0KXtyZXR1cm4gYSh0LFwiRGF0ZVwiKX0sRD1PYmplY3QucHJvdG90eXBlLE49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4gdD09PShcImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8RCl9O2Z1bmN0aW9uIFIodCl7cmV0dXJuKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24odCl7cmV0dXJuIHNldFRpbWVvdXQodCwxNil9KSh0KX1mdW5jdGlvbiBMKHQpeyh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNDYW5jZWxBbmltYXRpb25GcmFtZXx8Y2xlYXJUaW1lb3V0KSh0KX1mdW5jdGlvbiBCKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmXCJjb25zdHJ1Y3RvclwiIT09biYmdm9pZCAwIT09ZVtuXSYmKHRbbl09ZVtuXSl9ZnVuY3Rpb24gRyh0LGUsbixyKXtyZXR1cm4gZSYmQih0LGUpLG4mJkIodCxuKSxyJiZCKHQsciksdH1mdW5jdGlvbiBGKHQpe3JldHVybihGPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX12YXIgVT1mdW5jdGlvbiB0KGUpe2lmKFwib2JqZWN0XCIhPT1GKGUpfHxudWxsPT09ZSlyZXR1cm4gZTt2YXIgbjtpZihjKGUpKXtuPVtdO2Zvcih2YXIgcj0wLGk9ZS5sZW5ndGg7cjxpO3IrKylcIm9iamVjdFwiPT09RihlW3JdKSYmbnVsbCE9ZVtyXT9uW3JdPXQoZVtyXSk6bltyXT1lW3JdfWVsc2UgZm9yKHZhciBvIGluIG49e30sZSlcIm9iamVjdFwiPT09RihlW29dKSYmbnVsbCE9ZVtvXT9uW29dPXQoZVtvXSk6bltvXT1lW29dO3JldHVybiBufTt2YXIgej1mdW5jdGlvbih0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxvPWFyZ3VtZW50cyxhPWZ1bmN0aW9uKCl7cj1udWxsLG58fHQuYXBwbHkoaSxvKX0scz1uJiYhcjtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGEsZSkscyYmdC5hcHBseShpLG8pfX07ZnVuY3Rpb24gVih0LGUsbixyKXtmb3IodmFyIGkgaW4gbj1ufHwwLHI9cnx8NSxlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBvPWVbaV07bnVsbCE9PW8mJmcobyk/KGcodFtpXSl8fCh0W2ldPXt9KSxuPHI/Vih0W2ldLG8sbisxLHIpOnRbaV09ZVtpXSk6YyhvKT8odFtpXT1bXSx0W2ldPXRbaV0uY29uY2F0KG8pKTp2b2lkIDAhPT1vJiYodFtpXT1vKX19dmFyIFc9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKz0xKVYodCxlW3JdKTtyZXR1cm4gdH0sWD1mdW5jdGlvbih0LGUpe2lmKCFyKHQpKXJldHVybi0xO3ZhciBuPUFycmF5LnByb3RvdHlwZS5pbmRleE9mO2lmKG4pcmV0dXJuIG4uY2FsbCh0LGUpO2Zvcih2YXIgaT0tMSxvPTA7bzx0Lmxlbmd0aDtvKyspaWYodFtvXT09PWUpe2k9bzticmVha31yZXR1cm4gaX0sWT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBIPWZ1bmN0aW9uKHQpe2lmKHUodCkpcmV0dXJuITA7aWYocih0KSlyZXR1cm4hdC5sZW5ndGg7dmFyIGU9SSh0KTtpZihcIk1hcFwiPT09ZXx8XCJTZXRcIj09PWUpcmV0dXJuIXQuc2l6ZTtpZihOKHQpKXJldHVybiFPYmplY3Qua2V5cyh0KS5sZW5ndGg7Zm9yKHZhciBuIGluIHQpaWYoWS5jYWxsKHQsbikpcmV0dXJuITE7cmV0dXJuITB9LHE9ZnVuY3Rpb24gdChlLG4pe2lmKGU9PT1uKXJldHVybiEwO2lmKCFlfHwhbilyZXR1cm4hMTtpZihtKGUpfHxtKG4pKXJldHVybiExO2lmKHIoZSl8fHIobikpe2lmKGUubGVuZ3RoIT09bi5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBpPSEwLG89MDtvPGUubGVuZ3RoJiYoaT10KGVbb10sbltvXSkpO28rKyk7cmV0dXJuIGl9aWYocChlKXx8cChuKSl7dmFyIGE9T2JqZWN0LmtleXMoZSkscz1PYmplY3Qua2V5cyhuKTtpZihhLmxlbmd0aCE9PXMubGVuZ3RoKXJldHVybiExO2ZvcihpPSEwLG89MDtvPGEubGVuZ3RoJiYoaT10KGVbYVtvXV0sblthW29dXSkpO28rKyk7cmV0dXJuIGl9cmV0dXJuITF9LEs9ZnVuY3Rpb24odCxlKXtpZighcih0KSlyZXR1cm4gdDtmb3IodmFyIG49W10saT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz10W2ldO24ucHVzaChlKG8saSkpfXJldHVybiBufSxaPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MCxpPW0oZSk/ZS5zcGxpdChcIi5cIik6ZTt0JiZyPGkubGVuZ3RoOyl0PXRbaVtyKytdXTtyZXR1cm4gdm9pZCAwPT09dHx8cjxpLmxlbmd0aD9uOnR9LFE9KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZnVuY3Rpb24odCl7cmV0dXJuIHIodCk/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCk6W119KSxKPXt9LCQ9ZnVuY3Rpb24odCl7cmV0dXJuIEpbdD10fHxcImdcIl0/Slt0XSs9MTpKW3RdPTEsdCtKW3RdfSx0dD1mdW5jdGlvbigpe307ZnVuY3Rpb24gZXQodCl7cmV0dXJuIHUodCk/MDpyKHQpP3QubGVuZ3RoOk9iamVjdC5rZXlzKHQpLmxlbmd0aH0hZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5tYXA9e319dC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLm1hcFt0XX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5tYXBbdF07cmV0dXJuIHZvaWQgMD09PW4/ZTpufSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLm1hcFt0XT1lfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMubWFwPXt9fSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7ZGVsZXRlIHRoaXMubWFwW3RdfSx0LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubWFwKS5sZW5ndGh9fSgpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJiXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSksbi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSksbi5kKGUsXCJjXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSksbi5kKGUsXCJkXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSk7XHJcbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbnZhciByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHI9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJih0W25dPWVbbl0pfSkodCxlKX07ZnVuY3Rpb24gaSh0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiK1N0cmluZyhlKStcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9cih0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX12YXIgbz1mdW5jdGlvbigpe3JldHVybihvPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBpIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07ZnVuY3Rpb24gYSh0LGUpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpJiZlLmluZGV4T2Yocik8MCYmKG5bcl09dFtyXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2k8ci5sZW5ndGg7aSsrKWUuaW5kZXhPZihyW2ldKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxyW2ldKSYmKG5bcltpXV09dFtyW2ldXSl9cmV0dXJuIG59T2JqZWN0LmNyZWF0ZTtmdW5jdGlvbiBzKCl7Zm9yKHZhciB0PTAsZT0wLG49YXJndW1lbnRzLmxlbmd0aDtlPG47ZSsrKXQrPWFyZ3VtZW50c1tlXS5sZW5ndGg7dmFyIHI9QXJyYXkodCksaT0wO2ZvcihlPTA7ZTxuO2UrKylmb3IodmFyIG89YXJndW1lbnRzW2VdLGE9MCxzPW8ubGVuZ3RoO2E8czthKyssaSsrKXJbaV09b1thXTtyZXR1cm4gcn1PYmplY3QuY3JlYXRlfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSksbi5kKGUsXCJiXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSksbi5kKGUsXCJjXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSksbi5kKGUsXCJkXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHBufSkpLG4uZChlLFwiZVwiLChmdW5jdGlvbigpe3JldHVybiBqdH0pKSxuLmQoZSxcImZcIiwoZnVuY3Rpb24oKXtyZXR1cm4gb30pKTt2YXIgcj17fTtuLnIociksbi5kKHIsXCJjcmVhdGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSxuLmQocixcImZyb21NYXQ0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSksbi5kKHIsXCJjbG9uZVwiLChmdW5jdGlvbigpe3JldHVybiBmfSkpLG4uZChyLFwiY29weVwiLChmdW5jdGlvbigpe3JldHVybiBsfSkpLG4uZChyLFwiZnJvbVZhbHVlc1wiLChmdW5jdGlvbigpe3JldHVybiBofSkpLG4uZChyLFwic2V0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGR9KSksbi5kKHIsXCJpZGVudGl0eVwiLChmdW5jdGlvbigpe3JldHVybiBwfSkpLG4uZChyLFwidHJhbnNwb3NlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGd9KSksbi5kKHIsXCJpbnZlcnRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdn0pKSxuLmQocixcImFkam9pbnRcIiwoZnVuY3Rpb24oKXtyZXR1cm4geX0pKSxuLmQocixcImRldGVybWluYW50XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG19KSksbi5kKHIsXCJtdWx0aXBseVwiLChmdW5jdGlvbigpe3JldHVybiBifSkpLG4uZChyLFwidHJhbnNsYXRlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSksbi5kKHIsXCJyb3RhdGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gd30pKSxuLmQocixcInNjYWxlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFN9KSksbi5kKHIsXCJmcm9tVHJhbnNsYXRpb25cIiwoZnVuY3Rpb24oKXtyZXR1cm4gRX0pKSxuLmQocixcImZyb21Sb3RhdGlvblwiLChmdW5jdGlvbigpe3JldHVybiBffSkpLG4uZChyLFwiZnJvbVNjYWxpbmdcIiwoZnVuY3Rpb24oKXtyZXR1cm4gT30pKSxuLmQocixcImZyb21NYXQyZFwiLChmdW5jdGlvbigpe3JldHVybiBrfSkpLG4uZChyLFwiZnJvbVF1YXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTX0pKSxuLmQocixcIm5vcm1hbEZyb21NYXQ0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEF9KSksbi5kKHIsXCJwcm9qZWN0aW9uXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSksbi5kKHIsXCJzdHJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQ30pKSxuLmQocixcImZyb2JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSX0pKSxuLmQocixcImFkZFwiLChmdW5jdGlvbigpe3JldHVybiBQfSkpLG4uZChyLFwic3VidHJhY3RcIiwoZnVuY3Rpb24oKXtyZXR1cm4gan0pKSxuLmQocixcIm11bHRpcGx5U2NhbGFyXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIER9KSksbi5kKHIsXCJtdWx0aXBseVNjYWxhckFuZEFkZFwiLChmdW5jdGlvbigpe3JldHVybiBOfSkpLG4uZChyLFwiZXhhY3RFcXVhbHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUn0pKSxuLmQocixcImVxdWFsc1wiLChmdW5jdGlvbigpe3JldHVybiBMfSkpLG4uZChyLFwibXVsXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSksbi5kKHIsXCJzdWJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gR30pKTt2YXIgaT17fTtuLnIoaSksbi5kKGksXCJjcmVhdGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRn0pKSxuLmQoaSxcImNsb25lXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFV9KSksbi5kKGksXCJjb3B5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHp9KSksbi5kKGksXCJmcm9tVmFsdWVzXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFZ9KSksbi5kKGksXCJzZXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gV30pKSxuLmQoaSxcImlkZW50aXR5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFh9KSksbi5kKGksXCJ0cmFuc3Bvc2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gWX0pKSxuLmQoaSxcImludmVydFwiLChmdW5jdGlvbigpe3JldHVybiBIfSkpLG4uZChpLFwiYWRqb2ludFwiLChmdW5jdGlvbigpe3JldHVybiBxfSkpLG4uZChpLFwiZGV0ZXJtaW5hbnRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gS30pKSxuLmQoaSxcIm11bHRpcGx5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFp9KSksbi5kKGksXCJ0cmFuc2xhdGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUX0pKSxuLmQoaSxcInNjYWxlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEp9KSksbi5kKGksXCJyb3RhdGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gJH0pKSxuLmQoaSxcInJvdGF0ZVhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdHR9KSksbi5kKGksXCJyb3RhdGVZXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGV0fSkpLG4uZChpLFwicm90YXRlWlwiLChmdW5jdGlvbigpe3JldHVybiBudH0pKSxuLmQoaSxcImZyb21UcmFuc2xhdGlvblwiLChmdW5jdGlvbigpe3JldHVybiBydH0pKSxuLmQoaSxcImZyb21TY2FsaW5nXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGl0fSkpLG4uZChpLFwiZnJvbVJvdGF0aW9uXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG90fSkpLG4uZChpLFwiZnJvbVhSb3RhdGlvblwiLChmdW5jdGlvbigpe3JldHVybiBhdH0pKSxuLmQoaSxcImZyb21ZUm90YXRpb25cIiwoZnVuY3Rpb24oKXtyZXR1cm4gc3R9KSksbi5kKGksXCJmcm9tWlJvdGF0aW9uXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHV0fSkpLG4uZChpLFwiZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25cIiwoZnVuY3Rpb24oKXtyZXR1cm4gY3R9KSksbi5kKGksXCJmcm9tUXVhdDJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZnR9KSksbi5kKGksXCJnZXRUcmFuc2xhdGlvblwiLChmdW5jdGlvbigpe3JldHVybiBsdH0pKSxuLmQoaSxcImdldFNjYWxpbmdcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaHR9KSksbi5kKGksXCJnZXRSb3RhdGlvblwiLChmdW5jdGlvbigpe3JldHVybiBkdH0pKSxuLmQoaSxcImZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcHR9KSksbi5kKGksXCJmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlT3JpZ2luXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGd0fSkpLG4uZChpLFwiZnJvbVF1YXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdnR9KSksbi5kKGksXCJmcnVzdHVtXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHl0fSkpLG4uZChpLFwicGVyc3BlY3RpdmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbXR9KSksbi5kKGksXCJwZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlld1wiLChmdW5jdGlvbigpe3JldHVybiBidH0pKSxuLmQoaSxcIm9ydGhvXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHh0fSkpLG4uZChpLFwibG9va0F0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHd0fSkpLG4uZChpLFwidGFyZ2V0VG9cIiwoZnVuY3Rpb24oKXtyZXR1cm4gU3R9KSksbi5kKGksXCJzdHJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRXR9KSksbi5kKGksXCJmcm9iXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIF90fSkpLG4uZChpLFwiYWRkXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE90fSkpLG4uZChpLFwic3VidHJhY3RcIiwoZnVuY3Rpb24oKXtyZXR1cm4ga3R9KSksbi5kKGksXCJtdWx0aXBseVNjYWxhclwiLChmdW5jdGlvbigpe3JldHVybiBNdH0pKSxuLmQoaSxcIm11bHRpcGx5U2NhbGFyQW5kQWRkXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEF0fSkpLG4uZChpLFwiZXhhY3RFcXVhbHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVHR9KSksbi5kKGksXCJlcXVhbHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQ3R9KSksbi5kKGksXCJtdWxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSXR9KSksbi5kKGksXCJzdWJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUHR9KSk7dmFyIG89e307bi5yKG8pLG4uZChvLFwiY3JlYXRlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIER0fSkpLG4uZChvLFwiY2xvbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTnR9KSksbi5kKG8sXCJmcm9tVmFsdWVzXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFJ0fSkpLG4uZChvLFwiY29weVwiLChmdW5jdGlvbigpe3JldHVybiBMdH0pKSxuLmQobyxcInNldFwiLChmdW5jdGlvbigpe3JldHVybiBCdH0pKSxuLmQobyxcImFkZFwiLChmdW5jdGlvbigpe3JldHVybiBHdH0pKSxuLmQobyxcInN1YnRyYWN0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEZ0fSkpLG4uZChvLFwibXVsdGlwbHlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVXR9KSksbi5kKG8sXCJkaXZpZGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4genR9KSksbi5kKG8sXCJjZWlsXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFZ0fSkpLG4uZChvLFwiZmxvb3JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gV3R9KSksbi5kKG8sXCJtaW5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gWHR9KSksbi5kKG8sXCJtYXhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gWXR9KSksbi5kKG8sXCJyb3VuZFwiLChmdW5jdGlvbigpe3JldHVybiBIdH0pKSxuLmQobyxcInNjYWxlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHF0fSkpLG4uZChvLFwic2NhbGVBbmRBZGRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gS3R9KSksbi5kKG8sXCJkaXN0YW5jZVwiLChmdW5jdGlvbigpe3JldHVybiBadH0pKSxuLmQobyxcInNxdWFyZWREaXN0YW5jZVwiLChmdW5jdGlvbigpe3JldHVybiBRdH0pKSxuLmQobyxcImxlbmd0aFwiLChmdW5jdGlvbigpe3JldHVybiBKdH0pKSxuLmQobyxcInNxdWFyZWRMZW5ndGhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gJHR9KSksbi5kKG8sXCJuZWdhdGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdGV9KSksbi5kKG8sXCJpbnZlcnNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGVlfSkpLG4uZChvLFwibm9ybWFsaXplXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG5lfSkpLG4uZChvLFwiZG90XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJlfSkpLG4uZChvLFwiY3Jvc3NcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaWV9KSksbi5kKG8sXCJsZXJwXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG9lfSkpLG4uZChvLFwicmFuZG9tXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGFlfSkpLG4uZChvLFwidHJhbnNmb3JtTWF0NFwiLChmdW5jdGlvbigpe3JldHVybiBzZX0pKSxuLmQobyxcInRyYW5zZm9ybVF1YXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdWV9KSksbi5kKG8sXCJ6ZXJvXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGNlfSkpLG4uZChvLFwic3RyXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZlfSkpLG4uZChvLFwiZXhhY3RFcXVhbHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbGV9KSksbi5kKG8sXCJlcXVhbHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaGV9KSksbi5kKG8sXCJzdWJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcGV9KSksbi5kKG8sXCJtdWxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZ2V9KSksbi5kKG8sXCJkaXZcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdmV9KSksbi5kKG8sXCJkaXN0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHllfSkpLG4uZChvLFwic3FyRGlzdFwiLChmdW5jdGlvbigpe3JldHVybiBtZX0pKSxuLmQobyxcImxlblwiLChmdW5jdGlvbigpe3JldHVybiBiZX0pKSxuLmQobyxcInNxckxlblwiLChmdW5jdGlvbigpe3JldHVybiB4ZX0pKSxuLmQobyxcImZvckVhY2hcIiwoZnVuY3Rpb24oKXtyZXR1cm4gd2V9KSk7dmFyIGE9e307bi5yKGEpLG4uZChhLFwiY3JlYXRlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFNlfSkpLG4uZChhLFwiaWRlbnRpdHlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRWV9KSksbi5kKGEsXCJzZXRBeGlzQW5nbGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gX2V9KSksbi5kKGEsXCJnZXRBeGlzQW5nbGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gT2V9KSksbi5kKGEsXCJnZXRBbmdsZVwiLChmdW5jdGlvbigpe3JldHVybiBrZX0pKSxuLmQoYSxcIm11bHRpcGx5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE1lfSkpLG4uZChhLFwicm90YXRlWFwiLChmdW5jdGlvbigpe3JldHVybiBBZX0pKSxuLmQoYSxcInJvdGF0ZVlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVGV9KSksbi5kKGEsXCJyb3RhdGVaXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIENlfSkpLG4uZChhLFwiY2FsY3VsYXRlV1wiLChmdW5jdGlvbigpe3JldHVybiBJZX0pKSxuLmQoYSxcImV4cFwiLChmdW5jdGlvbigpe3JldHVybiBQZX0pKSxuLmQoYSxcImxuXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGplfSkpLG4uZChhLFwicG93XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIERlfSkpLG4uZChhLFwic2xlcnBcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTmV9KSksbi5kKGEsXCJyYW5kb21cIiwoZnVuY3Rpb24oKXtyZXR1cm4gUmV9KSksbi5kKGEsXCJpbnZlcnRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTGV9KSksbi5kKGEsXCJjb25qdWdhdGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQmV9KSksbi5kKGEsXCJmcm9tTWF0M1wiLChmdW5jdGlvbigpe3JldHVybiBHZX0pKSxuLmQoYSxcImZyb21FdWxlclwiLChmdW5jdGlvbigpe3JldHVybiBGZX0pKSxuLmQoYSxcInN0clwiLChmdW5jdGlvbigpe3JldHVybiBVZX0pKSxuLmQoYSxcImNsb25lXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHFlfSkpLG4uZChhLFwiZnJvbVZhbHVlc1wiLChmdW5jdGlvbigpe3JldHVybiBLZX0pKSxuLmQoYSxcImNvcHlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gWmV9KSksbi5kKGEsXCJzZXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUWV9KSksbi5kKGEsXCJhZGRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSmV9KSksbi5kKGEsXCJtdWxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gJGV9KSksbi5kKGEsXCJzY2FsZVwiLChmdW5jdGlvbigpe3JldHVybiB0bn0pKSxuLmQoYSxcImRvdFwiLChmdW5jdGlvbigpe3JldHVybiBlbn0pKSxuLmQoYSxcImxlcnBcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbm59KSksbi5kKGEsXCJsZW5ndGhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcm59KSksbi5kKGEsXCJsZW5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gb259KSksbi5kKGEsXCJzcXVhcmVkTGVuZ3RoXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGFufSkpLG4uZChhLFwic3FyTGVuXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHNufSkpLG4uZChhLFwibm9ybWFsaXplXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHVufSkpLG4uZChhLFwiZXhhY3RFcXVhbHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gY259KSksbi5kKGEsXCJlcXVhbHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZm59KSksbi5kKGEsXCJyb3RhdGlvblRvXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGxufSkpLG4uZChhLFwic3FsZXJwXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGhufSkpLG4uZChhLFwic2V0QXhlc1wiLChmdW5jdGlvbigpe3JldHVybiBkbn0pKTt2YXIgcz1uKDEyKTtmdW5jdGlvbiB1KCl7dmFyIHQ9bmV3IHMuYSg5KTtyZXR1cm4gcy5hIT1GbG9hdDMyQXJyYXkmJih0WzFdPTAsdFsyXT0wLHRbM109MCx0WzVdPTAsdFs2XT0wLHRbN109MCksdFswXT0xLHRbNF09MSx0WzhdPTEsdH1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVs0XSx0WzRdPWVbNV0sdFs1XT1lWzZdLHRbNl09ZVs4XSx0WzddPWVbOV0sdFs4XT1lWzEwXSx0fWZ1bmN0aW9uIGYodCl7dmFyIGU9bmV3IHMuYSg5KTtyZXR1cm4gZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzNdLGVbNF09dFs0XSxlWzVdPXRbNV0sZVs2XT10WzZdLGVbN109dFs3XSxlWzhdPXRbOF0sZX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0sdFs1XT1lWzVdLHRbNl09ZVs2XSx0WzddPWVbN10sdFs4XT1lWzhdLHR9ZnVuY3Rpb24gaCh0LGUsbixyLGksbyxhLHUsYyl7dmFyIGY9bmV3IHMuYSg5KTtyZXR1cm4gZlswXT10LGZbMV09ZSxmWzJdPW4sZlszXT1yLGZbNF09aSxmWzVdPW8sZls2XT1hLGZbN109dSxmWzhdPWMsZn1mdW5jdGlvbiBkKHQsZSxuLHIsaSxvLGEscyx1LGMpe3JldHVybiB0WzBdPWUsdFsxXT1uLHRbMl09cix0WzNdPWksdFs0XT1vLHRbNV09YSx0WzZdPXMsdFs3XT11LHRbOF09Yyx0fWZ1bmN0aW9uIHAodCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTEsdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHR9ZnVuY3Rpb24gZyh0LGUpe2lmKHQ9PT1lKXt2YXIgbj1lWzFdLHI9ZVsyXSxpPWVbNV07dFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPW4sdFs1XT1lWzddLHRbNl09cix0WzddPWl9ZWxzZSB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XTtyZXR1cm4gdH1mdW5jdGlvbiB2KHQsZSl7dmFyIG49ZVswXSxyPWVbMV0saT1lWzJdLG89ZVszXSxhPWVbNF0scz1lWzVdLHU9ZVs2XSxjPWVbN10sZj1lWzhdLGw9ZiphLXMqYyxoPS1mKm8rcyp1LGQ9YypvLWEqdSxwPW4qbCtyKmgraSpkO3JldHVybiBwPyhwPTEvcCx0WzBdPWwqcCx0WzFdPSgtZipyK2kqYykqcCx0WzJdPShzKnItaSphKSpwLHRbM109aCpwLHRbNF09KGYqbi1pKnUpKnAsdFs1XT0oLXMqbitpKm8pKnAsdFs2XT1kKnAsdFs3XT0oLWMqbityKnUpKnAsdFs4XT0oYSpuLXIqbykqcCx0KTpudWxsfWZ1bmN0aW9uIHkodCxlKXt2YXIgbj1lWzBdLHI9ZVsxXSxpPWVbMl0sbz1lWzNdLGE9ZVs0XSxzPWVbNV0sdT1lWzZdLGM9ZVs3XSxmPWVbOF07cmV0dXJuIHRbMF09YSpmLXMqYyx0WzFdPWkqYy1yKmYsdFsyXT1yKnMtaSphLHRbM109cyp1LW8qZix0WzRdPW4qZi1pKnUsdFs1XT1pKm8tbipzLHRbNl09bypjLWEqdSx0WzddPXIqdS1uKmMsdFs4XT1uKmEtcipvLHR9ZnVuY3Rpb24gbSh0KXt2YXIgZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdLG89dFs0XSxhPXRbNV0scz10WzZdLHU9dFs3XSxjPXRbOF07cmV0dXJuIGUqKGMqby1hKnUpK24qKC1jKmkrYSpzKStyKih1KmktbypzKX1mdW5jdGlvbiBiKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPWVbMl0sYT1lWzNdLHM9ZVs0XSx1PWVbNV0sYz1lWzZdLGY9ZVs3XSxsPWVbOF0saD1uWzBdLGQ9blsxXSxwPW5bMl0sZz1uWzNdLHY9bls0XSx5PW5bNV0sbT1uWzZdLGI9bls3XSx4PW5bOF07cmV0dXJuIHRbMF09aCpyK2QqYStwKmMsdFsxXT1oKmkrZCpzK3AqZix0WzJdPWgqbytkKnUrcCpsLHRbM109ZypyK3YqYSt5KmMsdFs0XT1nKmkrdipzK3kqZix0WzVdPWcqbyt2KnUreSpsLHRbNl09bSpyK2IqYSt4KmMsdFs3XT1tKmkrYipzK3gqZix0WzhdPW0qbytiKnUreCpsLHR9ZnVuY3Rpb24geCh0LGUsbil7dmFyIHI9ZVswXSxpPWVbMV0sbz1lWzJdLGE9ZVszXSxzPWVbNF0sdT1lWzVdLGM9ZVs2XSxmPWVbN10sbD1lWzhdLGg9blswXSxkPW5bMV07cmV0dXJuIHRbMF09cix0WzFdPWksdFsyXT1vLHRbM109YSx0WzRdPXMsdFs1XT11LHRbNl09aCpyK2QqYStjLHRbN109aCppK2QqcytmLHRbOF09aCpvK2QqdStsLHR9ZnVuY3Rpb24gdyh0LGUsbil7dmFyIHI9ZVswXSxpPWVbMV0sbz1lWzJdLGE9ZVszXSxzPWVbNF0sdT1lWzVdLGM9ZVs2XSxmPWVbN10sbD1lWzhdLGg9TWF0aC5zaW4obiksZD1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1kKnIraCphLHRbMV09ZCppK2gqcyx0WzJdPWQqbytoKnUsdFszXT1kKmEtaCpyLHRbNF09ZCpzLWgqaSx0WzVdPWQqdS1oKm8sdFs2XT1jLHRbN109Zix0WzhdPWwsdH1mdW5jdGlvbiBTKHQsZSxuKXt2YXIgcj1uWzBdLGk9blsxXTtyZXR1cm4gdFswXT1yKmVbMF0sdFsxXT1yKmVbMV0sdFsyXT1yKmVbMl0sdFszXT1pKmVbM10sdFs0XT1pKmVbNF0sdFs1XT1pKmVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzhdPWVbOF0sdH1mdW5jdGlvbiBFKHQsZSl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTEsdFs1XT0wLHRbNl09ZVswXSx0WzddPWVbMV0sdFs4XT0xLHR9ZnVuY3Rpb24gXyh0LGUpe3ZhciBuPU1hdGguc2luKGUpLHI9TWF0aC5jb3MoZSk7cmV0dXJuIHRbMF09cix0WzFdPW4sdFsyXT0wLHRbM109LW4sdFs0XT1yLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09MSx0fWZ1bmN0aW9uIE8odCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09ZVsxXSx0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdH1mdW5jdGlvbiBrKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT0wLHRbM109ZVsyXSx0WzRdPWVbM10sdFs1XT0wLHRbNl09ZVs0XSx0WzddPWVbNV0sdFs4XT0xLHR9ZnVuY3Rpb24gTSh0LGUpe3ZhciBuPWVbMF0scj1lWzFdLGk9ZVsyXSxvPWVbM10sYT1uK24scz1yK3IsdT1pK2ksYz1uKmEsZj1yKmEsbD1yKnMsaD1pKmEsZD1pKnMscD1pKnUsZz1vKmEsdj1vKnMseT1vKnU7cmV0dXJuIHRbMF09MS1sLXAsdFszXT1mLXksdFs2XT1oK3YsdFsxXT1mK3ksdFs0XT0xLWMtcCx0WzddPWQtZyx0WzJdPWgtdix0WzVdPWQrZyx0WzhdPTEtYy1sLHR9ZnVuY3Rpb24gQSh0LGUpe3ZhciBuPWVbMF0scj1lWzFdLGk9ZVsyXSxvPWVbM10sYT1lWzRdLHM9ZVs1XSx1PWVbNl0sYz1lWzddLGY9ZVs4XSxsPWVbOV0saD1lWzEwXSxkPWVbMTFdLHA9ZVsxMl0sZz1lWzEzXSx2PWVbMTRdLHk9ZVsxNV0sbT1uKnMtciphLGI9bip1LWkqYSx4PW4qYy1vKmEsdz1yKnUtaSpzLFM9cipjLW8qcyxFPWkqYy1vKnUsXz1mKmctbCpwLE89Zip2LWgqcCxrPWYqeS1kKnAsTT1sKnYtaCpnLEE9bCp5LWQqZyxUPWgqeS1kKnYsQz1tKlQtYipBK3gqTSt3KmstUypPK0UqXztyZXR1cm4gQz8oQz0xL0MsdFswXT0ocypULXUqQStjKk0pKkMsdFsxXT0odSprLWEqVC1jKk8pKkMsdFsyXT0oYSpBLXMqaytjKl8pKkMsdFszXT0oaSpBLXIqVC1vKk0pKkMsdFs0XT0obipULWkqaytvKk8pKkMsdFs1XT0ociprLW4qQS1vKl8pKkMsdFs2XT0oZypFLXYqUyt5KncpKkMsdFs3XT0odip4LXAqRS15KmIpKkMsdFs4XT0ocCpTLWcqeCt5Km0pKkMsdCk6bnVsbH1mdW5jdGlvbiBUKHQsZSxuKXtyZXR1cm4gdFswXT0yL2UsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0tMi9uLHRbNV09MCx0WzZdPS0xLHRbN109MSx0WzhdPTEsdH1mdW5jdGlvbiBDKHQpe3JldHVyblwibWF0MyhcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiLCBcIit0WzRdK1wiLCBcIit0WzVdK1wiLCBcIit0WzZdK1wiLCBcIit0WzddK1wiLCBcIit0WzhdK1wiKVwifWZ1bmN0aW9uIEkodCl7cmV0dXJuIE1hdGguaHlwb3QodFswXSx0WzFdLHRbMl0sdFszXSx0WzRdLHRbNV0sdFs2XSx0WzddLHRbOF0pfWZ1bmN0aW9uIFAodCxlLG4pe3JldHVybiB0WzBdPWVbMF0rblswXSx0WzFdPWVbMV0rblsxXSx0WzJdPWVbMl0rblsyXSx0WzNdPWVbM10rblszXSx0WzRdPWVbNF0rbls0XSx0WzVdPWVbNV0rbls1XSx0WzZdPWVbNl0rbls2XSx0WzddPWVbN10rbls3XSx0WzhdPWVbOF0rbls4XSx0fWZ1bmN0aW9uIGoodCxlLG4pe3JldHVybiB0WzBdPWVbMF0tblswXSx0WzFdPWVbMV0tblsxXSx0WzJdPWVbMl0tblsyXSx0WzNdPWVbM10tblszXSx0WzRdPWVbNF0tbls0XSx0WzVdPWVbNV0tbls1XSx0WzZdPWVbNl0tbls2XSx0WzddPWVbN10tbls3XSx0WzhdPWVbOF0tbls4XSx0fWZ1bmN0aW9uIEQodCxlLG4pe3JldHVybiB0WzBdPWVbMF0qbix0WzFdPWVbMV0qbix0WzJdPWVbMl0qbix0WzNdPWVbM10qbix0WzRdPWVbNF0qbix0WzVdPWVbNV0qbix0WzZdPWVbNl0qbix0WzddPWVbN10qbix0WzhdPWVbOF0qbix0fWZ1bmN0aW9uIE4odCxlLG4scil7cmV0dXJuIHRbMF09ZVswXStuWzBdKnIsdFsxXT1lWzFdK25bMV0qcix0WzJdPWVbMl0rblsyXSpyLHRbM109ZVszXStuWzNdKnIsdFs0XT1lWzRdK25bNF0qcix0WzVdPWVbNV0rbls1XSpyLHRbNl09ZVs2XStuWzZdKnIsdFs3XT1lWzddK25bN10qcix0WzhdPWVbOF0rbls4XSpyLHR9ZnVuY3Rpb24gUih0LGUpe3JldHVybiB0WzBdPT09ZVswXSYmdFsxXT09PWVbMV0mJnRbMl09PT1lWzJdJiZ0WzNdPT09ZVszXSYmdFs0XT09PWVbNF0mJnRbNV09PT1lWzVdJiZ0WzZdPT09ZVs2XSYmdFs3XT09PWVbN10mJnRbOF09PT1lWzhdfWZ1bmN0aW9uIEwodCxlKXt2YXIgbj10WzBdLHI9dFsxXSxpPXRbMl0sbz10WzNdLGE9dFs0XSx1PXRbNV0sYz10WzZdLGY9dFs3XSxsPXRbOF0saD1lWzBdLGQ9ZVsxXSxwPWVbMl0sZz1lWzNdLHY9ZVs0XSx5PWVbNV0sbT1lWzZdLGI9ZVs3XSx4PWVbOF07cmV0dXJuIE1hdGguYWJzKG4taCk8PXMuYipNYXRoLm1heCgxLE1hdGguYWJzKG4pLE1hdGguYWJzKGgpKSYmTWF0aC5hYnMoci1kKTw9cy5iKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMoZCkpJiZNYXRoLmFicyhpLXApPD1zLmIqTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhwKSkmJk1hdGguYWJzKG8tZyk8PXMuYipNYXRoLm1heCgxLE1hdGguYWJzKG8pLE1hdGguYWJzKGcpKSYmTWF0aC5hYnMoYS12KTw9cy5iKk1hdGgubWF4KDEsTWF0aC5hYnMoYSksTWF0aC5hYnModikpJiZNYXRoLmFicyh1LXkpPD1zLmIqTWF0aC5tYXgoMSxNYXRoLmFicyh1KSxNYXRoLmFicyh5KSkmJk1hdGguYWJzKGMtbSk8PXMuYipNYXRoLm1heCgxLE1hdGguYWJzKGMpLE1hdGguYWJzKG0pKSYmTWF0aC5hYnMoZi1iKTw9cy5iKk1hdGgubWF4KDEsTWF0aC5hYnMoZiksTWF0aC5hYnMoYikpJiZNYXRoLmFicyhsLXgpPD1zLmIqTWF0aC5tYXgoMSxNYXRoLmFicyhsKSxNYXRoLmFicyh4KSl9dmFyIEI9YixHPWo7ZnVuY3Rpb24gRigpe3ZhciB0PW5ldyBzLmEoMTYpO3JldHVybiBzLmEhPUZsb2F0MzJBcnJheSYmKHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCksdFswXT0xLHRbNV09MSx0WzEwXT0xLHRbMTVdPTEsdH1mdW5jdGlvbiBVKHQpe3ZhciBlPW5ldyBzLmEoMTYpO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sZVs0XT10WzRdLGVbNV09dFs1XSxlWzZdPXRbNl0sZVs3XT10WzddLGVbOF09dFs4XSxlWzldPXRbOV0sZVsxMF09dFsxMF0sZVsxMV09dFsxMV0sZVsxMl09dFsxMl0sZVsxM109dFsxM10sZVsxNF09dFsxNF0sZVsxNV09dFsxNV0sZX1mdW5jdGlvbiB6KHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0sdFs1XT1lWzVdLHRbNl09ZVs2XSx0WzddPWVbN10sdFs4XT1lWzhdLHRbOV09ZVs5XSx0WzEwXT1lWzEwXSx0WzExXT1lWzExXSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSx0fWZ1bmN0aW9uIFYodCxlLG4scixpLG8sYSx1LGMsZixsLGgsZCxwLGcsdil7dmFyIHk9bmV3IHMuYSgxNik7cmV0dXJuIHlbMF09dCx5WzFdPWUseVsyXT1uLHlbM109cix5WzRdPWkseVs1XT1vLHlbNl09YSx5WzddPXUseVs4XT1jLHlbOV09Zix5WzEwXT1sLHlbMTFdPWgseVsxMl09ZCx5WzEzXT1wLHlbMTRdPWcseVsxNV09dix5fWZ1bmN0aW9uIFcodCxlLG4scixpLG8sYSxzLHUsYyxmLGwsaCxkLHAsZyx2KXtyZXR1cm4gdFswXT1lLHRbMV09bix0WzJdPXIsdFszXT1pLHRbNF09byx0WzVdPWEsdFs2XT1zLHRbN109dSx0WzhdPWMsdFs5XT1mLHRbMTBdPWwsdFsxMV09aCx0WzEyXT1kLHRbMTNdPXAsdFsxNF09Zyx0WzE1XT12LHR9ZnVuY3Rpb24gWCh0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9ZnVuY3Rpb24gWSh0LGUpe2lmKHQ9PT1lKXt2YXIgbj1lWzFdLHI9ZVsyXSxpPWVbM10sbz1lWzZdLGE9ZVs3XSxzPWVbMTFdO3RbMV09ZVs0XSx0WzJdPWVbOF0sdFszXT1lWzEyXSx0WzRdPW4sdFs2XT1lWzldLHRbN109ZVsxM10sdFs4XT1yLHRbOV09byx0WzExXT1lWzE0XSx0WzEyXT1pLHRbMTNdPWEsdFsxNF09c31lbHNlIHRbMF09ZVswXSx0WzFdPWVbNF0sdFsyXT1lWzhdLHRbM109ZVsxMl0sdFs0XT1lWzFdLHRbNV09ZVs1XSx0WzZdPWVbOV0sdFs3XT1lWzEzXSx0WzhdPWVbMl0sdFs5XT1lWzZdLHRbMTBdPWVbMTBdLHRbMTFdPWVbMTRdLHRbMTJdPWVbM10sdFsxM109ZVs3XSx0WzE0XT1lWzExXSx0WzE1XT1lWzE1XTtyZXR1cm4gdH1mdW5jdGlvbiBIKHQsZSl7dmFyIG49ZVswXSxyPWVbMV0saT1lWzJdLG89ZVszXSxhPWVbNF0scz1lWzVdLHU9ZVs2XSxjPWVbN10sZj1lWzhdLGw9ZVs5XSxoPWVbMTBdLGQ9ZVsxMV0scD1lWzEyXSxnPWVbMTNdLHY9ZVsxNF0seT1lWzE1XSxtPW4qcy1yKmEsYj1uKnUtaSphLHg9bipjLW8qYSx3PXIqdS1pKnMsUz1yKmMtbypzLEU9aSpjLW8qdSxfPWYqZy1sKnAsTz1mKnYtaCpwLGs9Zip5LWQqcCxNPWwqdi1oKmcsQT1sKnktZCpnLFQ9aCp5LWQqdixDPW0qVC1iKkEreCpNK3cqay1TKk8rRSpfO3JldHVybiBDPyhDPTEvQyx0WzBdPShzKlQtdSpBK2MqTSkqQyx0WzFdPShpKkEtcipULW8qTSkqQyx0WzJdPShnKkUtdipTK3kqdykqQyx0WzNdPShoKlMtbCpFLWQqdykqQyx0WzRdPSh1KmstYSpULWMqTykqQyx0WzVdPShuKlQtaSprK28qTykqQyx0WzZdPSh2KngtcCpFLXkqYikqQyx0WzddPShmKkUtaCp4K2QqYikqQyx0WzhdPShhKkEtcyprK2MqXykqQyx0WzldPShyKmstbipBLW8qXykqQyx0WzEwXT0ocCpTLWcqeCt5Km0pKkMsdFsxMV09KGwqeC1mKlMtZCptKSpDLHRbMTJdPShzKk8tYSpNLXUqXykqQyx0WzEzXT0obipNLXIqTytpKl8pKkMsdFsxNF09KGcqYi1wKnctdiptKSpDLHRbMTVdPShmKnctbCpiK2gqbSkqQyx0KTpudWxsfWZ1bmN0aW9uIHEodCxlKXt2YXIgbj1lWzBdLHI9ZVsxXSxpPWVbMl0sbz1lWzNdLGE9ZVs0XSxzPWVbNV0sdT1lWzZdLGM9ZVs3XSxmPWVbOF0sbD1lWzldLGg9ZVsxMF0sZD1lWzExXSxwPWVbMTJdLGc9ZVsxM10sdj1lWzE0XSx5PWVbMTVdO3JldHVybiB0WzBdPXMqKGgqeS1kKnYpLWwqKHUqeS1jKnYpK2cqKHUqZC1jKmgpLHRbMV09LShyKihoKnktZCp2KS1sKihpKnktbyp2KStnKihpKmQtbypoKSksdFsyXT1yKih1KnktYyp2KS1zKihpKnktbyp2KStnKihpKmMtbyp1KSx0WzNdPS0ocioodSpkLWMqaCktcyooaSpkLW8qaCkrbCooaSpjLW8qdSkpLHRbNF09LShhKihoKnktZCp2KS1mKih1KnktYyp2KStwKih1KmQtYypoKSksdFs1XT1uKihoKnktZCp2KS1mKihpKnktbyp2KStwKihpKmQtbypoKSx0WzZdPS0obioodSp5LWMqdiktYSooaSp5LW8qdikrcCooaSpjLW8qdSkpLHRbN109bioodSpkLWMqaCktYSooaSpkLW8qaCkrZiooaSpjLW8qdSksdFs4XT1hKihsKnktZCpnKS1mKihzKnktYypnKStwKihzKmQtYypsKSx0WzldPS0obioobCp5LWQqZyktZioocip5LW8qZykrcCoocipkLW8qbCkpLHRbMTBdPW4qKHMqeS1jKmcpLWEqKHIqeS1vKmcpK3AqKHIqYy1vKnMpLHRbMTFdPS0obioocypkLWMqbCktYSoocipkLW8qbCkrZioocipjLW8qcykpLHRbMTJdPS0oYSoobCp2LWgqZyktZioocyp2LXUqZykrcCoocypoLXUqbCkpLHRbMTNdPW4qKGwqdi1oKmcpLWYqKHIqdi1pKmcpK3AqKHIqaC1pKmwpLHRbMTRdPS0obioocyp2LXUqZyktYSoocip2LWkqZykrcCoocip1LWkqcykpLHRbMTVdPW4qKHMqaC11KmwpLWEqKHIqaC1pKmwpK2YqKHIqdS1pKnMpLHR9ZnVuY3Rpb24gSyh0KXt2YXIgZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdLG89dFs0XSxhPXRbNV0scz10WzZdLHU9dFs3XSxjPXRbOF0sZj10WzldLGw9dFsxMF0saD10WzExXSxkPXRbMTJdLHA9dFsxM10sZz10WzE0XSx2PXRbMTVdO3JldHVybihlKmEtbipvKSoobCp2LWgqZyktKGUqcy1yKm8pKihmKnYtaCpwKSsoZSp1LWkqbykqKGYqZy1sKnApKyhuKnMtciphKSooYyp2LWgqZCktKG4qdS1pKmEpKihjKmctbCpkKSsocip1LWkqcykqKGMqcC1mKmQpfWZ1bmN0aW9uIFoodCxlLG4pe3ZhciByPWVbMF0saT1lWzFdLG89ZVsyXSxhPWVbM10scz1lWzRdLHU9ZVs1XSxjPWVbNl0sZj1lWzddLGw9ZVs4XSxoPWVbOV0sZD1lWzEwXSxwPWVbMTFdLGc9ZVsxMl0sdj1lWzEzXSx5PWVbMTRdLG09ZVsxNV0sYj1uWzBdLHg9blsxXSx3PW5bMl0sUz1uWzNdO3JldHVybiB0WzBdPWIqcit4KnMrdypsK1MqZyx0WzFdPWIqaSt4KnUrdypoK1Mqdix0WzJdPWIqbyt4KmMrdypkK1MqeSx0WzNdPWIqYSt4KmYrdypwK1MqbSxiPW5bNF0seD1uWzVdLHc9bls2XSxTPW5bN10sdFs0XT1iKnIreCpzK3cqbCtTKmcsdFs1XT1iKmkreCp1K3cqaCtTKnYsdFs2XT1iKm8reCpjK3cqZCtTKnksdFs3XT1iKmEreCpmK3cqcCtTKm0sYj1uWzhdLHg9bls5XSx3PW5bMTBdLFM9blsxMV0sdFs4XT1iKnIreCpzK3cqbCtTKmcsdFs5XT1iKmkreCp1K3cqaCtTKnYsdFsxMF09YipvK3gqYyt3KmQrUyp5LHRbMTFdPWIqYSt4KmYrdypwK1MqbSxiPW5bMTJdLHg9blsxM10sdz1uWzE0XSxTPW5bMTVdLHRbMTJdPWIqcit4KnMrdypsK1MqZyx0WzEzXT1iKmkreCp1K3cqaCtTKnYsdFsxNF09YipvK3gqYyt3KmQrUyp5LHRbMTVdPWIqYSt4KmYrdypwK1MqbSx0fWZ1bmN0aW9uIFEodCxlLG4pe3ZhciByLGksbyxhLHMsdSxjLGYsbCxoLGQscCxnPW5bMF0sdj1uWzFdLHk9blsyXTtyZXR1cm4gZT09PXQ/KHRbMTJdPWVbMF0qZytlWzRdKnYrZVs4XSp5K2VbMTJdLHRbMTNdPWVbMV0qZytlWzVdKnYrZVs5XSp5K2VbMTNdLHRbMTRdPWVbMl0qZytlWzZdKnYrZVsxMF0qeStlWzE0XSx0WzE1XT1lWzNdKmcrZVs3XSp2K2VbMTFdKnkrZVsxNV0pOihyPWVbMF0saT1lWzFdLG89ZVsyXSxhPWVbM10scz1lWzRdLHU9ZVs1XSxjPWVbNl0sZj1lWzddLGw9ZVs4XSxoPWVbOV0sZD1lWzEwXSxwPWVbMTFdLHRbMF09cix0WzFdPWksdFsyXT1vLHRbM109YSx0WzRdPXMsdFs1XT11LHRbNl09Yyx0WzddPWYsdFs4XT1sLHRbOV09aCx0WzEwXT1kLHRbMTFdPXAsdFsxMl09cipnK3MqditsKnkrZVsxMl0sdFsxM109aSpnK3UqditoKnkrZVsxM10sdFsxNF09bypnK2MqditkKnkrZVsxNF0sdFsxNV09YSpnK2YqditwKnkrZVsxNV0pLHR9ZnVuY3Rpb24gSih0LGUsbil7dmFyIHI9blswXSxpPW5bMV0sbz1uWzJdO3JldHVybiB0WzBdPWVbMF0qcix0WzFdPWVbMV0qcix0WzJdPWVbMl0qcix0WzNdPWVbM10qcix0WzRdPWVbNF0qaSx0WzVdPWVbNV0qaSx0WzZdPWVbNl0qaSx0WzddPWVbN10qaSx0WzhdPWVbOF0qbyx0WzldPWVbOV0qbyx0WzEwXT1lWzEwXSpvLHRbMTFdPWVbMTFdKm8sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0sdH1mdW5jdGlvbiAkKHQsZSxuLHIpe3ZhciBpLG8sYSx1LGMsZixsLGgsZCxwLGcsdix5LG0sYix4LHcsUyxFLF8sTyxrLE0sQSxUPXJbMF0sQz1yWzFdLEk9clsyXSxQPU1hdGguaHlwb3QoVCxDLEkpO3JldHVybiBQPHMuYj9udWxsOihUKj1QPTEvUCxDKj1QLEkqPVAsaT1NYXRoLnNpbihuKSxhPTEtKG89TWF0aC5jb3MobikpLHU9ZVswXSxjPWVbMV0sZj1lWzJdLGw9ZVszXSxoPWVbNF0sZD1lWzVdLHA9ZVs2XSxnPWVbN10sdj1lWzhdLHk9ZVs5XSxtPWVbMTBdLGI9ZVsxMV0seD1UKlQqYStvLHc9QypUKmErSSppLFM9SSpUKmEtQyppLEU9VCpDKmEtSSppLF89QypDKmErbyxPPUkqQyphK1QqaSxrPVQqSSphK0MqaSxNPUMqSSphLVQqaSxBPUkqSSphK28sdFswXT11KngraCp3K3YqUyx0WzFdPWMqeCtkKncreSpTLHRbMl09Zip4K3AqdyttKlMsdFszXT1sKngrZyp3K2IqUyx0WzRdPXUqRStoKl8rdipPLHRbNV09YypFK2QqXyt5Kk8sdFs2XT1mKkUrcCpfK20qTyx0WzddPWwqRStnKl8rYipPLHRbOF09dSprK2gqTSt2KkEsdFs5XT1jKmsrZCpNK3kqQSx0WzEwXT1mKmsrcCpNK20qQSx0WzExXT1sKmsrZypNK2IqQSxlIT09dCYmKHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0KX1mdW5jdGlvbiB0dCh0LGUsbil7dmFyIHI9TWF0aC5zaW4obiksaT1NYXRoLmNvcyhuKSxvPWVbNF0sYT1lWzVdLHM9ZVs2XSx1PWVbN10sYz1lWzhdLGY9ZVs5XSxsPWVbMTBdLGg9ZVsxMV07cmV0dXJuIGUhPT10JiYodFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0WzRdPW8qaStjKnIsdFs1XT1hKmkrZipyLHRbNl09cyppK2wqcix0WzddPXUqaStoKnIsdFs4XT1jKmktbypyLHRbOV09ZippLWEqcix0WzEwXT1sKmktcypyLHRbMTFdPWgqaS11KnIsdH1mdW5jdGlvbiBldCh0LGUsbil7dmFyIHI9TWF0aC5zaW4obiksaT1NYXRoLmNvcyhuKSxvPWVbMF0sYT1lWzFdLHM9ZVsyXSx1PWVbM10sYz1lWzhdLGY9ZVs5XSxsPWVbMTBdLGg9ZVsxMV07cmV0dXJuIGUhPT10JiYodFs0XT1lWzRdLHRbNV09ZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0WzBdPW8qaS1jKnIsdFsxXT1hKmktZipyLHRbMl09cyppLWwqcix0WzNdPXUqaS1oKnIsdFs4XT1vKnIrYyppLHRbOV09YSpyK2YqaSx0WzEwXT1zKnIrbCppLHRbMTFdPXUqcitoKmksdH1mdW5jdGlvbiBudCh0LGUsbil7dmFyIHI9TWF0aC5zaW4obiksaT1NYXRoLmNvcyhuKSxvPWVbMF0sYT1lWzFdLHM9ZVsyXSx1PWVbM10sYz1lWzRdLGY9ZVs1XSxsPWVbNl0saD1lWzddO3JldHVybiBlIT09dCYmKHRbOF09ZVs4XSx0WzldPWVbOV0sdFsxMF09ZVsxMF0sdFsxMV09ZVsxMV0sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0pLHRbMF09byppK2Mqcix0WzFdPWEqaStmKnIsdFsyXT1zKmkrbCpyLHRbM109dSppK2gqcix0WzRdPWMqaS1vKnIsdFs1XT1mKmktYSpyLHRbNl09bCppLXMqcix0WzddPWgqaS11KnIsdH1mdW5jdGlvbiBydCh0LGUpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09MSx0WzExXT0wLHRbMTJdPWVbMF0sdFsxM109ZVsxXSx0WzE0XT1lWzJdLHRbMTVdPTEsdH1mdW5jdGlvbiBpdCh0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09ZVsxXSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09ZVsyXSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH1mdW5jdGlvbiBvdCh0LGUsbil7dmFyIHIsaSxvLGE9blswXSx1PW5bMV0sYz1uWzJdLGY9TWF0aC5oeXBvdChhLHUsYyk7cmV0dXJuIGY8cy5iP251bGw6KGEqPWY9MS9mLHUqPWYsYyo9ZixyPU1hdGguc2luKGUpLG89MS0oaT1NYXRoLmNvcyhlKSksdFswXT1hKmEqbytpLHRbMV09dSphKm8rYypyLHRbMl09YyphKm8tdSpyLHRbM109MCx0WzRdPWEqdSpvLWMqcix0WzVdPXUqdSpvK2ksdFs2XT1jKnUqbythKnIsdFs3XT0wLHRbOF09YSpjKm8rdSpyLHRbOV09dSpjKm8tYSpyLHRbMTBdPWMqYypvK2ksdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHQpfWZ1bmN0aW9uIGF0KHQsZSl7dmFyIG49TWF0aC5zaW4oZSkscj1NYXRoLmNvcyhlKTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPXIsdFs2XT1uLHRbN109MCx0WzhdPTAsdFs5XT0tbix0WzEwXT1yLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fWZ1bmN0aW9uIHN0KHQsZSl7dmFyIG49TWF0aC5zaW4oZSkscj1NYXRoLmNvcyhlKTtyZXR1cm4gdFswXT1yLHRbMV09MCx0WzJdPS1uLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT1uLHRbOV09MCx0WzEwXT1yLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fWZ1bmN0aW9uIHV0KHQsZSl7dmFyIG49TWF0aC5zaW4oZSkscj1NYXRoLmNvcyhlKTtyZXR1cm4gdFswXT1yLHRbMV09bix0WzJdPTAsdFszXT0wLHRbNF09LW4sdFs1XT1yLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fWZ1bmN0aW9uIGN0KHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPWVbMl0sYT1lWzNdLHM9cityLHU9aStpLGM9bytvLGY9cipzLGw9cip1LGg9cipjLGQ9aSp1LHA9aSpjLGc9bypjLHY9YSpzLHk9YSp1LG09YSpjO3JldHVybiB0WzBdPTEtKGQrZyksdFsxXT1sK20sdFsyXT1oLXksdFszXT0wLHRbNF09bC1tLHRbNV09MS0oZitnKSx0WzZdPXArdix0WzddPTAsdFs4XT1oK3ksdFs5XT1wLXYsdFsxMF09MS0oZitkKSx0WzExXT0wLHRbMTJdPW5bMF0sdFsxM109blsxXSx0WzE0XT1uWzJdLHRbMTVdPTEsdH1mdW5jdGlvbiBmdCh0LGUpe3ZhciBuPW5ldyBzLmEoMykscj0tZVswXSxpPS1lWzFdLG89LWVbMl0sYT1lWzNdLHU9ZVs0XSxjPWVbNV0sZj1lWzZdLGw9ZVs3XSxoPXIqcitpKmkrbypvK2EqYTtyZXR1cm4gaD4wPyhuWzBdPTIqKHUqYStsKnIrYypvLWYqaSkvaCxuWzFdPTIqKGMqYStsKmkrZipyLXUqbykvaCxuWzJdPTIqKGYqYStsKm8rdSppLWMqcikvaCk6KG5bMF09MioodSphK2wqcitjKm8tZippKSxuWzFdPTIqKGMqYStsKmkrZipyLXUqbyksblsyXT0yKihmKmErbCpvK3UqaS1jKnIpKSxjdCh0LGUsbiksdH1mdW5jdGlvbiBsdCh0LGUpe3JldHVybiB0WzBdPWVbMTJdLHRbMV09ZVsxM10sdFsyXT1lWzE0XSx0fWZ1bmN0aW9uIGh0KHQsZSl7dmFyIG49ZVswXSxyPWVbMV0saT1lWzJdLG89ZVs0XSxhPWVbNV0scz1lWzZdLHU9ZVs4XSxjPWVbOV0sZj1lWzEwXTtyZXR1cm4gdFswXT1NYXRoLmh5cG90KG4scixpKSx0WzFdPU1hdGguaHlwb3QobyxhLHMpLHRbMl09TWF0aC5oeXBvdCh1LGMsZiksdH1mdW5jdGlvbiBkdCh0LGUpe3ZhciBuPW5ldyBzLmEoMyk7aHQobixlKTt2YXIgcj0xL25bMF0saT0xL25bMV0sbz0xL25bMl0sYT1lWzBdKnIsdT1lWzFdKmksYz1lWzJdKm8sZj1lWzRdKnIsbD1lWzVdKmksaD1lWzZdKm8sZD1lWzhdKnIscD1lWzldKmksZz1lWzEwXSpvLHY9YStsK2cseT0wO3JldHVybiB2PjA/KHk9MipNYXRoLnNxcnQodisxKSx0WzNdPS4yNSp5LHRbMF09KGgtcCkveSx0WzFdPShkLWMpL3ksdFsyXT0odS1mKS95KTphPmwmJmE+Zz8oeT0yKk1hdGguc3FydCgxK2EtbC1nKSx0WzNdPShoLXApL3ksdFswXT0uMjUqeSx0WzFdPSh1K2YpL3ksdFsyXT0oZCtjKS95KTpsPmc/KHk9MipNYXRoLnNxcnQoMStsLWEtZyksdFszXT0oZC1jKS95LHRbMF09KHUrZikveSx0WzFdPS4yNSp5LHRbMl09KGgrcCkveSk6KHk9MipNYXRoLnNxcnQoMStnLWEtbCksdFszXT0odS1mKS95LHRbMF09KGQrYykveSx0WzFdPShoK3ApL3ksdFsyXT0uMjUqeSksdH1mdW5jdGlvbiBwdCh0LGUsbixyKXt2YXIgaT1lWzBdLG89ZVsxXSxhPWVbMl0scz1lWzNdLHU9aStpLGM9bytvLGY9YSthLGw9aSp1LGg9aSpjLGQ9aSpmLHA9bypjLGc9bypmLHY9YSpmLHk9cyp1LG09cypjLGI9cypmLHg9clswXSx3PXJbMV0sUz1yWzJdO3JldHVybiB0WzBdPSgxLShwK3YpKSp4LHRbMV09KGgrYikqeCx0WzJdPShkLW0pKngsdFszXT0wLHRbNF09KGgtYikqdyx0WzVdPSgxLShsK3YpKSp3LHRbNl09KGcreSkqdyx0WzddPTAsdFs4XT0oZCttKSpTLHRbOV09KGcteSkqUyx0WzEwXT0oMS0obCtwKSkqUyx0WzExXT0wLHRbMTJdPW5bMF0sdFsxM109blsxXSx0WzE0XT1uWzJdLHRbMTVdPTEsdH1mdW5jdGlvbiBndCh0LGUsbixyLGkpe3ZhciBvPWVbMF0sYT1lWzFdLHM9ZVsyXSx1PWVbM10sYz1vK28sZj1hK2EsbD1zK3MsaD1vKmMsZD1vKmYscD1vKmwsZz1hKmYsdj1hKmwseT1zKmwsbT11KmMsYj11KmYseD11Kmwsdz1yWzBdLFM9clsxXSxFPXJbMl0sXz1pWzBdLE89aVsxXSxrPWlbMl0sTT0oMS0oZyt5KSkqdyxBPShkK3gpKncsVD0ocC1iKSp3LEM9KGQteCkqUyxJPSgxLShoK3kpKSpTLFA9KHYrbSkqUyxqPShwK2IpKkUsRD0odi1tKSpFLE49KDEtKGgrZykpKkU7cmV0dXJuIHRbMF09TSx0WzFdPUEsdFsyXT1ULHRbM109MCx0WzRdPUMsdFs1XT1JLHRbNl09UCx0WzddPTAsdFs4XT1qLHRbOV09RCx0WzEwXT1OLHRbMTFdPTAsdFsxMl09blswXStfLShNKl8rQypPK2oqayksdFsxM109blsxXStPLShBKl8rSSpPK0QqayksdFsxNF09blsyXStrLShUKl8rUCpPK04qayksdFsxNV09MSx0fWZ1bmN0aW9uIHZ0KHQsZSl7dmFyIG49ZVswXSxyPWVbMV0saT1lWzJdLG89ZVszXSxhPW4rbixzPXIrcix1PWkraSxjPW4qYSxmPXIqYSxsPXIqcyxoPWkqYSxkPWkqcyxwPWkqdSxnPW8qYSx2PW8qcyx5PW8qdTtyZXR1cm4gdFswXT0xLWwtcCx0WzFdPWYreSx0WzJdPWgtdix0WzNdPTAsdFs0XT1mLXksdFs1XT0xLWMtcCx0WzZdPWQrZyx0WzddPTAsdFs4XT1oK3YsdFs5XT1kLWcsdFsxMF09MS1jLWwsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9ZnVuY3Rpb24geXQodCxlLG4scixpLG8sYSl7dmFyIHM9MS8obi1lKSx1PTEvKGktciksYz0xLyhvLWEpO3JldHVybiB0WzBdPTIqbypzLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTIqbyp1LHRbNl09MCx0WzddPTAsdFs4XT0obitlKSpzLHRbOV09KGkrcikqdSx0WzEwXT0oYStvKSpjLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT1hKm8qMipjLHRbMTVdPTAsdH1mdW5jdGlvbiBtdCh0LGUsbixyLGkpe3ZhciBvLGE9MS9NYXRoLnRhbihlLzIpO3JldHVybiB0WzBdPWEvbix0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1hLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzExXT0tMSx0WzEyXT0wLHRbMTNdPTAsdFsxNV09MCxudWxsIT1pJiZpIT09MS8wPyhvPTEvKHItaSksdFsxMF09KGkrcikqbyx0WzE0XT0yKmkqcipvKToodFsxMF09LTEsdFsxNF09LTIqciksdH1mdW5jdGlvbiBidCh0LGUsbixyKXt2YXIgaT1NYXRoLnRhbihlLnVwRGVncmVlcypNYXRoLlBJLzE4MCksbz1NYXRoLnRhbihlLmRvd25EZWdyZWVzKk1hdGguUEkvMTgwKSxhPU1hdGgudGFuKGUubGVmdERlZ3JlZXMqTWF0aC5QSS8xODApLHM9TWF0aC50YW4oZS5yaWdodERlZ3JlZXMqTWF0aC5QSS8xODApLHU9Mi8oYStzKSxjPTIvKGkrbyk7cmV0dXJuIHRbMF09dSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1jLHRbNl09MCx0WzddPTAsdFs4XT0tKGEtcykqdSouNSx0WzldPShpLW8pKmMqLjUsdFsxMF09ci8obi1yKSx0WzExXT0tMSx0WzEyXT0wLHRbMTNdPTAsdFsxNF09cipuLyhuLXIpLHRbMTVdPTAsdH1mdW5jdGlvbiB4dCh0LGUsbixyLGksbyxhKXt2YXIgcz0xLyhlLW4pLHU9MS8oci1pKSxjPTEvKG8tYSk7cmV0dXJuIHRbMF09LTIqcyx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0tMip1LHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0yKmMsdFsxMV09MCx0WzEyXT0oZStuKSpzLHRbMTNdPShpK3IpKnUsdFsxNF09KGErbykqYyx0WzE1XT0xLHR9ZnVuY3Rpb24gd3QodCxlLG4scil7dmFyIGksbyxhLHUsYyxmLGwsaCxkLHAsZz1lWzBdLHY9ZVsxXSx5PWVbMl0sbT1yWzBdLGI9clsxXSx4PXJbMl0sdz1uWzBdLFM9blsxXSxFPW5bMl07cmV0dXJuIE1hdGguYWJzKGctdyk8cy5iJiZNYXRoLmFicyh2LVMpPHMuYiYmTWF0aC5hYnMoeS1FKTxzLmI/WCh0KToobD1nLXcsaD12LVMsZD15LUUsaT1iKihkKj1wPTEvTWF0aC5oeXBvdChsLGgsZCkpLXgqKGgqPXApLG89eCoobCo9cCktbSpkLGE9bSpoLWIqbCwocD1NYXRoLmh5cG90KGksbyxhKSk/KGkqPXA9MS9wLG8qPXAsYSo9cCk6KGk9MCxvPTAsYT0wKSx1PWgqYS1kKm8sYz1kKmktbCphLGY9bCpvLWgqaSwocD1NYXRoLmh5cG90KHUsYyxmKSk/KHUqPXA9MS9wLGMqPXAsZio9cCk6KHU9MCxjPTAsZj0wKSx0WzBdPWksdFsxXT11LHRbMl09bCx0WzNdPTAsdFs0XT1vLHRbNV09Yyx0WzZdPWgsdFs3XT0wLHRbOF09YSx0WzldPWYsdFsxMF09ZCx0WzExXT0wLHRbMTJdPS0oaSpnK28qdithKnkpLHRbMTNdPS0odSpnK2MqditmKnkpLHRbMTRdPS0obCpnK2gqditkKnkpLHRbMTVdPTEsdCl9ZnVuY3Rpb24gU3QodCxlLG4scil7dmFyIGk9ZVswXSxvPWVbMV0sYT1lWzJdLHM9clswXSx1PXJbMV0sYz1yWzJdLGY9aS1uWzBdLGw9by1uWzFdLGg9YS1uWzJdLGQ9ZipmK2wqbCtoKmg7ZD4wJiYoZio9ZD0xL01hdGguc3FydChkKSxsKj1kLGgqPWQpO3ZhciBwPXUqaC1jKmwsZz1jKmYtcypoLHY9cypsLXUqZjtyZXR1cm4oZD1wKnArZypnK3Yqdik+MCYmKHAqPWQ9MS9NYXRoLnNxcnQoZCksZyo9ZCx2Kj1kKSx0WzBdPXAsdFsxXT1nLHRbMl09dix0WzNdPTAsdFs0XT1sKnYtaCpnLHRbNV09aCpwLWYqdix0WzZdPWYqZy1sKnAsdFs3XT0wLHRbOF09Zix0WzldPWwsdFsxMF09aCx0WzExXT0wLHRbMTJdPWksdFsxM109byx0WzE0XT1hLHRbMTVdPTEsdH1mdW5jdGlvbiBFdCh0KXtyZXR1cm5cIm1hdDQoXCIrdFswXStcIiwgXCIrdFsxXStcIiwgXCIrdFsyXStcIiwgXCIrdFszXStcIiwgXCIrdFs0XStcIiwgXCIrdFs1XStcIiwgXCIrdFs2XStcIiwgXCIrdFs3XStcIiwgXCIrdFs4XStcIiwgXCIrdFs5XStcIiwgXCIrdFsxMF0rXCIsIFwiK3RbMTFdK1wiLCBcIit0WzEyXStcIiwgXCIrdFsxM10rXCIsIFwiK3RbMTRdK1wiLCBcIit0WzE1XStcIilcIn1mdW5jdGlvbiBfdCh0KXtyZXR1cm4gTWF0aC5oeXBvdCh0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSx0WzZdLHRbN10sdFs4XSx0WzldLHRbMTBdLHRbMTFdLHRbMTJdLHRbMTNdLHRbMTRdLHRbMTVdKX1mdW5jdGlvbiBPdCh0LGUsbil7cmV0dXJuIHRbMF09ZVswXStuWzBdLHRbMV09ZVsxXStuWzFdLHRbMl09ZVsyXStuWzJdLHRbM109ZVszXStuWzNdLHRbNF09ZVs0XStuWzRdLHRbNV09ZVs1XStuWzVdLHRbNl09ZVs2XStuWzZdLHRbN109ZVs3XStuWzddLHRbOF09ZVs4XStuWzhdLHRbOV09ZVs5XStuWzldLHRbMTBdPWVbMTBdK25bMTBdLHRbMTFdPWVbMTFdK25bMTFdLHRbMTJdPWVbMTJdK25bMTJdLHRbMTNdPWVbMTNdK25bMTNdLHRbMTRdPWVbMTRdK25bMTRdLHRbMTVdPWVbMTVdK25bMTVdLHR9ZnVuY3Rpb24ga3QodCxlLG4pe3JldHVybiB0WzBdPWVbMF0tblswXSx0WzFdPWVbMV0tblsxXSx0WzJdPWVbMl0tblsyXSx0WzNdPWVbM10tblszXSx0WzRdPWVbNF0tbls0XSx0WzVdPWVbNV0tbls1XSx0WzZdPWVbNl0tbls2XSx0WzddPWVbN10tbls3XSx0WzhdPWVbOF0tbls4XSx0WzldPWVbOV0tbls5XSx0WzEwXT1lWzEwXS1uWzEwXSx0WzExXT1lWzExXS1uWzExXSx0WzEyXT1lWzEyXS1uWzEyXSx0WzEzXT1lWzEzXS1uWzEzXSx0WzE0XT1lWzE0XS1uWzE0XSx0WzE1XT1lWzE1XS1uWzE1XSx0fWZ1bmN0aW9uIE10KHQsZSxuKXtyZXR1cm4gdFswXT1lWzBdKm4sdFsxXT1lWzFdKm4sdFsyXT1lWzJdKm4sdFszXT1lWzNdKm4sdFs0XT1lWzRdKm4sdFs1XT1lWzVdKm4sdFs2XT1lWzZdKm4sdFs3XT1lWzddKm4sdFs4XT1lWzhdKm4sdFs5XT1lWzldKm4sdFsxMF09ZVsxMF0qbix0WzExXT1lWzExXSpuLHRbMTJdPWVbMTJdKm4sdFsxM109ZVsxM10qbix0WzE0XT1lWzE0XSpuLHRbMTVdPWVbMTVdKm4sdH1mdW5jdGlvbiBBdCh0LGUsbixyKXtyZXR1cm4gdFswXT1lWzBdK25bMF0qcix0WzFdPWVbMV0rblsxXSpyLHRbMl09ZVsyXStuWzJdKnIsdFszXT1lWzNdK25bM10qcix0WzRdPWVbNF0rbls0XSpyLHRbNV09ZVs1XStuWzVdKnIsdFs2XT1lWzZdK25bNl0qcix0WzddPWVbN10rbls3XSpyLHRbOF09ZVs4XStuWzhdKnIsdFs5XT1lWzldK25bOV0qcix0WzEwXT1lWzEwXStuWzEwXSpyLHRbMTFdPWVbMTFdK25bMTFdKnIsdFsxMl09ZVsxMl0rblsxMl0qcix0WzEzXT1lWzEzXStuWzEzXSpyLHRbMTRdPWVbMTRdK25bMTRdKnIsdFsxNV09ZVsxNV0rblsxNV0qcix0fWZ1bmN0aW9uIFR0KHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXSYmdFsyXT09PWVbMl0mJnRbM109PT1lWzNdJiZ0WzRdPT09ZVs0XSYmdFs1XT09PWVbNV0mJnRbNl09PT1lWzZdJiZ0WzddPT09ZVs3XSYmdFs4XT09PWVbOF0mJnRbOV09PT1lWzldJiZ0WzEwXT09PWVbMTBdJiZ0WzExXT09PWVbMTFdJiZ0WzEyXT09PWVbMTJdJiZ0WzEzXT09PWVbMTNdJiZ0WzE0XT09PWVbMTRdJiZ0WzE1XT09PWVbMTVdfWZ1bmN0aW9uIEN0KHQsZSl7dmFyIG49dFswXSxyPXRbMV0saT10WzJdLG89dFszXSxhPXRbNF0sdT10WzVdLGM9dFs2XSxmPXRbN10sbD10WzhdLGg9dFs5XSxkPXRbMTBdLHA9dFsxMV0sZz10WzEyXSx2PXRbMTNdLHk9dFsxNF0sbT10WzE1XSxiPWVbMF0seD1lWzFdLHc9ZVsyXSxTPWVbM10sRT1lWzRdLF89ZVs1XSxPPWVbNl0saz1lWzddLE09ZVs4XSxBPWVbOV0sVD1lWzEwXSxDPWVbMTFdLEk9ZVsxMl0sUD1lWzEzXSxqPWVbMTRdLEQ9ZVsxNV07cmV0dXJuIE1hdGguYWJzKG4tYik8PXMuYipNYXRoLm1heCgxLE1hdGguYWJzKG4pLE1hdGguYWJzKGIpKSYmTWF0aC5hYnMoci14KTw9cy5iKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMoeCkpJiZNYXRoLmFicyhpLXcpPD1zLmIqTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyh3KSkmJk1hdGguYWJzKG8tUyk8PXMuYipNYXRoLm1heCgxLE1hdGguYWJzKG8pLE1hdGguYWJzKFMpKSYmTWF0aC5hYnMoYS1FKTw9cy5iKk1hdGgubWF4KDEsTWF0aC5hYnMoYSksTWF0aC5hYnMoRSkpJiZNYXRoLmFicyh1LV8pPD1zLmIqTWF0aC5tYXgoMSxNYXRoLmFicyh1KSxNYXRoLmFicyhfKSkmJk1hdGguYWJzKGMtTyk8PXMuYipNYXRoLm1heCgxLE1hdGguYWJzKGMpLE1hdGguYWJzKE8pKSYmTWF0aC5hYnMoZi1rKTw9cy5iKk1hdGgubWF4KDEsTWF0aC5hYnMoZiksTWF0aC5hYnMoaykpJiZNYXRoLmFicyhsLU0pPD1zLmIqTWF0aC5tYXgoMSxNYXRoLmFicyhsKSxNYXRoLmFicyhNKSkmJk1hdGguYWJzKGgtQSk8PXMuYipNYXRoLm1heCgxLE1hdGguYWJzKGgpLE1hdGguYWJzKEEpKSYmTWF0aC5hYnMoZC1UKTw9cy5iKk1hdGgubWF4KDEsTWF0aC5hYnMoZCksTWF0aC5hYnMoVCkpJiZNYXRoLmFicyhwLUMpPD1zLmIqTWF0aC5tYXgoMSxNYXRoLmFicyhwKSxNYXRoLmFicyhDKSkmJk1hdGguYWJzKGctSSk8PXMuYipNYXRoLm1heCgxLE1hdGguYWJzKGcpLE1hdGguYWJzKEkpKSYmTWF0aC5hYnModi1QKTw9cy5iKk1hdGgubWF4KDEsTWF0aC5hYnModiksTWF0aC5hYnMoUCkpJiZNYXRoLmFicyh5LWopPD1zLmIqTWF0aC5tYXgoMSxNYXRoLmFicyh5KSxNYXRoLmFicyhqKSkmJk1hdGguYWJzKG0tRCk8PXMuYipNYXRoLm1heCgxLE1hdGguYWJzKG0pLE1hdGguYWJzKEQpKX12YXIgSXQ9WixQdD1rdCxqdD1uKDQwKTtmdW5jdGlvbiBEdCgpe3ZhciB0PW5ldyBzLmEoNCk7cmV0dXJuIHMuYSE9RmxvYXQzMkFycmF5JiYodFswXT0wLHRbMV09MCx0WzJdPTAsdFszXT0wKSx0fWZ1bmN0aW9uIE50KHQpe3ZhciBlPW5ldyBzLmEoNCk7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlfWZ1bmN0aW9uIFJ0KHQsZSxuLHIpe3ZhciBpPW5ldyBzLmEoNCk7cmV0dXJuIGlbMF09dCxpWzFdPWUsaVsyXT1uLGlbM109cixpfWZ1bmN0aW9uIEx0KHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0fWZ1bmN0aW9uIEJ0KHQsZSxuLHIsaSl7cmV0dXJuIHRbMF09ZSx0WzFdPW4sdFsyXT1yLHRbM109aSx0fWZ1bmN0aW9uIEd0KHQsZSxuKXtyZXR1cm4gdFswXT1lWzBdK25bMF0sdFsxXT1lWzFdK25bMV0sdFsyXT1lWzJdK25bMl0sdFszXT1lWzNdK25bM10sdH1mdW5jdGlvbiBGdCh0LGUsbil7cmV0dXJuIHRbMF09ZVswXS1uWzBdLHRbMV09ZVsxXS1uWzFdLHRbMl09ZVsyXS1uWzJdLHRbM109ZVszXS1uWzNdLHR9ZnVuY3Rpb24gVXQodCxlLG4pe3JldHVybiB0WzBdPWVbMF0qblswXSx0WzFdPWVbMV0qblsxXSx0WzJdPWVbMl0qblsyXSx0WzNdPWVbM10qblszXSx0fWZ1bmN0aW9uIHp0KHQsZSxuKXtyZXR1cm4gdFswXT1lWzBdL25bMF0sdFsxXT1lWzFdL25bMV0sdFsyXT1lWzJdL25bMl0sdFszXT1lWzNdL25bM10sdH1mdW5jdGlvbiBWdCh0LGUpe3JldHVybiB0WzBdPU1hdGguY2VpbChlWzBdKSx0WzFdPU1hdGguY2VpbChlWzFdKSx0WzJdPU1hdGguY2VpbChlWzJdKSx0WzNdPU1hdGguY2VpbChlWzNdKSx0fWZ1bmN0aW9uIFd0KHQsZSl7cmV0dXJuIHRbMF09TWF0aC5mbG9vcihlWzBdKSx0WzFdPU1hdGguZmxvb3IoZVsxXSksdFsyXT1NYXRoLmZsb29yKGVbMl0pLHRbM109TWF0aC5mbG9vcihlWzNdKSx0fWZ1bmN0aW9uIFh0KHQsZSxuKXtyZXR1cm4gdFswXT1NYXRoLm1pbihlWzBdLG5bMF0pLHRbMV09TWF0aC5taW4oZVsxXSxuWzFdKSx0WzJdPU1hdGgubWluKGVbMl0sblsyXSksdFszXT1NYXRoLm1pbihlWzNdLG5bM10pLHR9ZnVuY3Rpb24gWXQodCxlLG4pe3JldHVybiB0WzBdPU1hdGgubWF4KGVbMF0sblswXSksdFsxXT1NYXRoLm1heChlWzFdLG5bMV0pLHRbMl09TWF0aC5tYXgoZVsyXSxuWzJdKSx0WzNdPU1hdGgubWF4KGVbM10sblszXSksdH1mdW5jdGlvbiBIdCh0LGUpe3JldHVybiB0WzBdPU1hdGgucm91bmQoZVswXSksdFsxXT1NYXRoLnJvdW5kKGVbMV0pLHRbMl09TWF0aC5yb3VuZChlWzJdKSx0WzNdPU1hdGgucm91bmQoZVszXSksdH1mdW5jdGlvbiBxdCh0LGUsbil7cmV0dXJuIHRbMF09ZVswXSpuLHRbMV09ZVsxXSpuLHRbMl09ZVsyXSpuLHRbM109ZVszXSpuLHR9ZnVuY3Rpb24gS3QodCxlLG4scil7cmV0dXJuIHRbMF09ZVswXStuWzBdKnIsdFsxXT1lWzFdK25bMV0qcix0WzJdPWVbMl0rblsyXSpyLHRbM109ZVszXStuWzNdKnIsdH1mdW5jdGlvbiBadCh0LGUpe3ZhciBuPWVbMF0tdFswXSxyPWVbMV0tdFsxXSxpPWVbMl0tdFsyXSxvPWVbM10tdFszXTtyZXR1cm4gTWF0aC5oeXBvdChuLHIsaSxvKX1mdW5jdGlvbiBRdCh0LGUpe3ZhciBuPWVbMF0tdFswXSxyPWVbMV0tdFsxXSxpPWVbMl0tdFsyXSxvPWVbM10tdFszXTtyZXR1cm4gbipuK3IqcitpKmkrbypvfWZ1bmN0aW9uIEp0KHQpe3ZhciBlPXRbMF0sbj10WzFdLHI9dFsyXSxpPXRbM107cmV0dXJuIE1hdGguaHlwb3QoZSxuLHIsaSl9ZnVuY3Rpb24gJHQodCl7dmFyIGU9dFswXSxuPXRbMV0scj10WzJdLGk9dFszXTtyZXR1cm4gZSplK24qbityKnIraSppfWZ1bmN0aW9uIHRlKHQsZSl7cmV0dXJuIHRbMF09LWVbMF0sdFsxXT0tZVsxXSx0WzJdPS1lWzJdLHRbM109LWVbM10sdH1mdW5jdGlvbiBlZSh0LGUpe3JldHVybiB0WzBdPTEvZVswXSx0WzFdPTEvZVsxXSx0WzJdPTEvZVsyXSx0WzNdPTEvZVszXSx0fWZ1bmN0aW9uIG5lKHQsZSl7dmFyIG49ZVswXSxyPWVbMV0saT1lWzJdLG89ZVszXSxhPW4qbityKnIraSppK28qbztyZXR1cm4gYT4wJiYoYT0xL01hdGguc3FydChhKSksdFswXT1uKmEsdFsxXT1yKmEsdFsyXT1pKmEsdFszXT1vKmEsdH1mdW5jdGlvbiByZSh0LGUpe3JldHVybiB0WzBdKmVbMF0rdFsxXSplWzFdK3RbMl0qZVsyXSt0WzNdKmVbM119ZnVuY3Rpb24gaWUodCxlLG4scil7dmFyIGk9blswXSpyWzFdLW5bMV0qclswXSxvPW5bMF0qclsyXS1uWzJdKnJbMF0sYT1uWzBdKnJbM10tblszXSpyWzBdLHM9blsxXSpyWzJdLW5bMl0qclsxXSx1PW5bMV0qclszXS1uWzNdKnJbMV0sYz1uWzJdKnJbM10tblszXSpyWzJdLGY9ZVswXSxsPWVbMV0saD1lWzJdLGQ9ZVszXTtyZXR1cm4gdFswXT1sKmMtaCp1K2Qqcyx0WzFdPS1mKmMraCphLWQqbyx0WzJdPWYqdS1sKmErZCppLHRbM109LWYqcytsKm8taCppLHR9ZnVuY3Rpb24gb2UodCxlLG4scil7dmFyIGk9ZVswXSxvPWVbMV0sYT1lWzJdLHM9ZVszXTtyZXR1cm4gdFswXT1pK3IqKG5bMF0taSksdFsxXT1vK3IqKG5bMV0tbyksdFsyXT1hK3IqKG5bMl0tYSksdFszXT1zK3IqKG5bM10tcyksdH1mdW5jdGlvbiBhZSh0LGUpe3ZhciBuLHIsaSxvLGEsdTtlPWV8fDE7ZG97YT0obj0yKnMuYygpLTEpKm4rKHI9MipzLmMoKS0xKSpyfXdoaWxlKGE+PTEpO2Rve3U9KGk9MipzLmMoKS0xKSppKyhvPTIqcy5jKCktMSkqb313aGlsZSh1Pj0xKTt2YXIgYz1NYXRoLnNxcnQoKDEtYSkvdSk7cmV0dXJuIHRbMF09ZSpuLHRbMV09ZSpyLHRbMl09ZSppKmMsdFszXT1lKm8qYyx0fWZ1bmN0aW9uIHNlKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPWVbMl0sYT1lWzNdO3JldHVybiB0WzBdPW5bMF0qcituWzRdKmkrbls4XSpvK25bMTJdKmEsdFsxXT1uWzFdKnIrbls1XSppK25bOV0qbytuWzEzXSphLHRbMl09blsyXSpyK25bNl0qaStuWzEwXSpvK25bMTRdKmEsdFszXT1uWzNdKnIrbls3XSppK25bMTFdKm8rblsxNV0qYSx0fWZ1bmN0aW9uIHVlKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPWVbMl0sYT1uWzBdLHM9blsxXSx1PW5bMl0sYz1uWzNdLGY9YypyK3Mqby11KmksbD1jKmkrdSpyLWEqbyxoPWMqbythKmktcypyLGQ9LWEqci1zKmktdSpvO3JldHVybiB0WzBdPWYqYytkKi1hK2wqLXUtaCotcyx0WzFdPWwqYytkKi1zK2gqLWEtZiotdSx0WzJdPWgqYytkKi11K2YqLXMtbCotYSx0WzNdPWVbM10sdH1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gdFswXT0wLHRbMV09MCx0WzJdPTAsdFszXT0wLHR9ZnVuY3Rpb24gZmUodCl7cmV0dXJuXCJ2ZWM0KFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIsIFwiK3RbMl0rXCIsIFwiK3RbM10rXCIpXCJ9ZnVuY3Rpb24gbGUodCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdJiZ0WzJdPT09ZVsyXSYmdFszXT09PWVbM119ZnVuY3Rpb24gaGUodCxlKXt2YXIgbj10WzBdLHI9dFsxXSxpPXRbMl0sbz10WzNdLGE9ZVswXSx1PWVbMV0sYz1lWzJdLGY9ZVszXTtyZXR1cm4gTWF0aC5hYnMobi1hKTw9cy5iKk1hdGgubWF4KDEsTWF0aC5hYnMobiksTWF0aC5hYnMoYSkpJiZNYXRoLmFicyhyLXUpPD1zLmIqTWF0aC5tYXgoMSxNYXRoLmFicyhyKSxNYXRoLmFicyh1KSkmJk1hdGguYWJzKGktYyk8PXMuYipNYXRoLm1heCgxLE1hdGguYWJzKGkpLE1hdGguYWJzKGMpKSYmTWF0aC5hYnMoby1mKTw9cy5iKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnMoZikpfXZhciBkZSxwZT1GdCxnZT1VdCx2ZT16dCx5ZT1adCxtZT1RdCxiZT1KdCx4ZT0kdCx3ZT0oZGU9RHQoKSxmdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGEscztmb3IoZXx8KGU9NCksbnx8KG49MCkscz1yP01hdGgubWluKHIqZStuLHQubGVuZ3RoKTp0Lmxlbmd0aCxhPW47YTxzO2ErPWUpZGVbMF09dFthXSxkZVsxXT10W2ErMV0sZGVbMl09dFthKzJdLGRlWzNdPXRbYSszXSxpKGRlLGRlLG8pLHRbYV09ZGVbMF0sdFthKzFdPWRlWzFdLHRbYSsyXT1kZVsyXSx0W2ErM109ZGVbM107cmV0dXJuIHR9KTtmdW5jdGlvbiBTZSgpe3ZhciB0PW5ldyBzLmEoNCk7cmV0dXJuIHMuYSE9RmxvYXQzMkFycmF5JiYodFswXT0wLHRbMV09MCx0WzJdPTApLHRbM109MSx0fWZ1bmN0aW9uIEVlKHQpe3JldHVybiB0WzBdPTAsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH1mdW5jdGlvbiBfZSh0LGUsbil7bio9LjU7dmFyIHI9TWF0aC5zaW4obik7cmV0dXJuIHRbMF09ciplWzBdLHRbMV09ciplWzFdLHRbMl09ciplWzJdLHRbM109TWF0aC5jb3MobiksdH1mdW5jdGlvbiBPZSh0LGUpe3ZhciBuPTIqTWF0aC5hY29zKGVbM10pLHI9TWF0aC5zaW4obi8yKTtyZXR1cm4gcj5zLmI/KHRbMF09ZVswXS9yLHRbMV09ZVsxXS9yLHRbMl09ZVsyXS9yKToodFswXT0xLHRbMV09MCx0WzJdPTApLG59ZnVuY3Rpb24ga2UodCxlKXt2YXIgbj1lbih0LGUpO3JldHVybiBNYXRoLmFjb3MoMipuKm4tMSl9ZnVuY3Rpb24gTWUodCxlLG4pe3ZhciByPWVbMF0saT1lWzFdLG89ZVsyXSxhPWVbM10scz1uWzBdLHU9blsxXSxjPW5bMl0sZj1uWzNdO3JldHVybiB0WzBdPXIqZithKnMraSpjLW8qdSx0WzFdPWkqZithKnUrbypzLXIqYyx0WzJdPW8qZithKmMrcip1LWkqcyx0WzNdPWEqZi1yKnMtaSp1LW8qYyx0fWZ1bmN0aW9uIEFlKHQsZSxuKXtuKj0uNTt2YXIgcj1lWzBdLGk9ZVsxXSxvPWVbMl0sYT1lWzNdLHM9TWF0aC5zaW4obiksdT1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1yKnUrYSpzLHRbMV09aSp1K28qcyx0WzJdPW8qdS1pKnMsdFszXT1hKnUtcipzLHR9ZnVuY3Rpb24gVGUodCxlLG4pe24qPS41O3ZhciByPWVbMF0saT1lWzFdLG89ZVsyXSxhPWVbM10scz1NYXRoLnNpbihuKSx1PU1hdGguY29zKG4pO3JldHVybiB0WzBdPXIqdS1vKnMsdFsxXT1pKnUrYSpzLHRbMl09byp1K3Iqcyx0WzNdPWEqdS1pKnMsdH1mdW5jdGlvbiBDZSh0LGUsbil7bio9LjU7dmFyIHI9ZVswXSxpPWVbMV0sbz1lWzJdLGE9ZVszXSxzPU1hdGguc2luKG4pLHU9TWF0aC5jb3Mobik7cmV0dXJuIHRbMF09cip1K2kqcyx0WzFdPWkqdS1yKnMsdFsyXT1vKnUrYSpzLHRbM109YSp1LW8qcyx0fWZ1bmN0aW9uIEllKHQsZSl7dmFyIG49ZVswXSxyPWVbMV0saT1lWzJdO3JldHVybiB0WzBdPW4sdFsxXT1yLHRbMl09aSx0WzNdPU1hdGguc3FydChNYXRoLmFicygxLW4qbi1yKnItaSppKSksdH1mdW5jdGlvbiBQZSh0LGUpe3ZhciBuPWVbMF0scj1lWzFdLGk9ZVsyXSxvPWVbM10sYT1NYXRoLnNxcnQobipuK3IqcitpKmkpLHM9TWF0aC5leHAobyksdT1hPjA/cypNYXRoLnNpbihhKS9hOjA7cmV0dXJuIHRbMF09bip1LHRbMV09cip1LHRbMl09aSp1LHRbM109cypNYXRoLmNvcyhhKSx0fWZ1bmN0aW9uIGplKHQsZSl7dmFyIG49ZVswXSxyPWVbMV0saT1lWzJdLG89ZVszXSxhPU1hdGguc3FydChuKm4rcipyK2kqaSkscz1hPjA/TWF0aC5hdGFuMihhLG8pL2E6MDtyZXR1cm4gdFswXT1uKnMsdFsxXT1yKnMsdFsyXT1pKnMsdFszXT0uNSpNYXRoLmxvZyhuKm4rcipyK2kqaStvKm8pLHR9ZnVuY3Rpb24gRGUodCxlLG4pe3JldHVybiBqZSh0LGUpLHRuKHQsdCxuKSxQZSh0LHQpLHR9ZnVuY3Rpb24gTmUodCxlLG4scil7dmFyIGksbyxhLHUsYyxmPWVbMF0sbD1lWzFdLGg9ZVsyXSxkPWVbM10scD1uWzBdLGc9blsxXSx2PW5bMl0seT1uWzNdO3JldHVybihvPWYqcCtsKmcraCp2K2QqeSk8MCYmKG89LW8scD0tcCxnPS1nLHY9LXYseT0teSksMS1vPnMuYj8oaT1NYXRoLmFjb3MobyksYT1NYXRoLnNpbihpKSx1PU1hdGguc2luKCgxLXIpKmkpL2EsYz1NYXRoLnNpbihyKmkpL2EpOih1PTEtcixjPXIpLHRbMF09dSpmK2MqcCx0WzFdPXUqbCtjKmcsdFsyXT11KmgrYyp2LHRbM109dSpkK2MqeSx0fWZ1bmN0aW9uIFJlKHQpe3ZhciBlPXMuYygpLG49cy5jKCkscj1zLmMoKSxpPU1hdGguc3FydCgxLWUpLG89TWF0aC5zcXJ0KGUpO3JldHVybiB0WzBdPWkqTWF0aC5zaW4oMipNYXRoLlBJKm4pLHRbMV09aSpNYXRoLmNvcygyKk1hdGguUEkqbiksdFsyXT1vKk1hdGguc2luKDIqTWF0aC5QSSpyKSx0WzNdPW8qTWF0aC5jb3MoMipNYXRoLlBJKnIpLHR9ZnVuY3Rpb24gTGUodCxlKXt2YXIgbj1lWzBdLHI9ZVsxXSxpPWVbMl0sbz1lWzNdLGE9bipuK3IqcitpKmkrbypvLHM9YT8xL2E6MDtyZXR1cm4gdFswXT0tbipzLHRbMV09LXIqcyx0WzJdPS1pKnMsdFszXT1vKnMsdH1mdW5jdGlvbiBCZSh0LGUpe3JldHVybiB0WzBdPS1lWzBdLHRbMV09LWVbMV0sdFsyXT0tZVsyXSx0WzNdPWVbM10sdH1mdW5jdGlvbiBHZSh0LGUpe3ZhciBuLHI9ZVswXStlWzRdK2VbOF07aWYocj4wKW49TWF0aC5zcXJ0KHIrMSksdFszXT0uNSpuLG49LjUvbix0WzBdPShlWzVdLWVbN10pKm4sdFsxXT0oZVs2XS1lWzJdKSpuLHRbMl09KGVbMV0tZVszXSkqbjtlbHNle3ZhciBpPTA7ZVs0XT5lWzBdJiYoaT0xKSxlWzhdPmVbMyppK2ldJiYoaT0yKTt2YXIgbz0oaSsxKSUzLGE9KGkrMiklMztuPU1hdGguc3FydChlWzMqaStpXS1lWzMqbytvXS1lWzMqYSthXSsxKSx0W2ldPS41Km4sbj0uNS9uLHRbM109KGVbMypvK2FdLWVbMyphK29dKSpuLHRbb109KGVbMypvK2ldK2VbMyppK29dKSpuLHRbYV09KGVbMyphK2ldK2VbMyppK2FdKSpufXJldHVybiB0fWZ1bmN0aW9uIEZlKHQsZSxuLHIpe3ZhciBpPS41Kk1hdGguUEkvMTgwO2UqPWksbio9aSxyKj1pO3ZhciBvPU1hdGguc2luKGUpLGE9TWF0aC5jb3MoZSkscz1NYXRoLnNpbihuKSx1PU1hdGguY29zKG4pLGM9TWF0aC5zaW4ociksZj1NYXRoLmNvcyhyKTtyZXR1cm4gdFswXT1vKnUqZi1hKnMqYyx0WzFdPWEqcypmK28qdSpjLHRbMl09YSp1KmMtbypzKmYsdFszXT1hKnUqZitvKnMqYyx0fWZ1bmN0aW9uIFVlKHQpe3JldHVyblwicXVhdChcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiKVwifXZhciB6ZSxWZSxXZSxYZSxZZSxIZSxxZT1OdCxLZT1SdCxaZT1MdCxRZT1CdCxKZT1HdCwkZT1NZSx0bj1xdCxlbj1yZSxubj1vZSxybj1KdCxvbj1ybixhbj0kdCxzbj1hbix1bj1uZSxjbj1sZSxmbj1oZSxsbj0oemU9anQuY3JlYXRlKCksVmU9anQuZnJvbVZhbHVlcygxLDAsMCksV2U9anQuZnJvbVZhbHVlcygwLDEsMCksZnVuY3Rpb24odCxlLG4pe3ZhciByPWp0LmRvdChlLG4pO3JldHVybiByPC0uOTk5OTk5PyhqdC5jcm9zcyh6ZSxWZSxlKSxqdC5sZW4oemUpPDFlLTYmJmp0LmNyb3NzKHplLFdlLGUpLGp0Lm5vcm1hbGl6ZSh6ZSx6ZSksX2UodCx6ZSxNYXRoLlBJKSx0KTpyPi45OTk5OTk/KHRbMF09MCx0WzFdPTAsdFsyXT0wLHRbM109MSx0KTooanQuY3Jvc3MoemUsZSxuKSx0WzBdPXplWzBdLHRbMV09emVbMV0sdFsyXT16ZVsyXSx0WzNdPTErcix1bih0LHQpKX0pLGhuPShYZT1TZSgpLFllPVNlKCksZnVuY3Rpb24odCxlLG4scixpLG8pe3JldHVybiBOZShYZSxlLGksbyksTmUoWWUsbixyLG8pLE5lKHQsWGUsWWUsMipvKigxLW8pKSx0fSksZG49KEhlPXUoKSxmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gSGVbMF09blswXSxIZVszXT1uWzFdLEhlWzZdPW5bMl0sSGVbMV09clswXSxIZVs0XT1yWzFdLEhlWzddPXJbMl0sSGVbMl09LWVbMF0sSGVbNV09LWVbMV0sSGVbOF09LWVbMl0sdW4odCxHZSh0LEhlKSl9KSxwbj1uKDgyKX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiQVNUX1RPS0VOX1RZUEVTXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSksbi5kKGUsXCJTVE9SQUdFX0NMQVNTXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGR9KSksbi5kKGUsXCJUYXJnZXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcH0pKSxuLmQoZSxcIkRlZmluZVZhbHVlUGxhY2Vob2xkZXJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdn0pKTtuKDIzMik7dmFyIHI9bigzNSk7bi5kKGUsXCJDb21wb25lbnRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gci5hfSkpO24oMTM0KSxuKDEyMCksbigxMjEpLG4oMjQxKSxuKDEyMiksbigxMjMpLG4oMTI0KSxuKDI0MiksbigxMjUpLG4oMTI2KSxuKDEyOCksbigxMjkpLG4oMTMwKSxuKDEzMSk7dmFyIGk9bigzNik7bi5kKGUsXCJnbFwiLChmdW5jdGlvbigpe3JldHVybiBpLmF9KSk7bigxNjEpLG4oMTYyKSxuKDI0MyksbigxNjMpLG4oMTY0KSxuKDExNSksbigxNjUpLG4oNDgpLG4oMTY2KSxuKDI0NCksbig3MCk7dmFyIG89bigxMTkpO24uZChlLFwiY3JlYXRlRW50aXR5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG8uYn0pKTt2YXIgYT1uKDEzKTtuLmQoZSxcIklERU5USUZJRVJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gYS5hfSkpO3ZhciBzPW4oOTEpO24uZChlLFwiY3JlYXRlV29ybGRDb250YWluZXJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcy5hfSkpO24oMjQ1KTt2YXIgdT1uKDI0Nik7bi5kKGUsXCJnZW5lcmF0ZUFBQkJGcm9tVmVydGljZXNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdS5hfSkpO3ZhciBjPW4oMjQ3KTtuLmQoZSxcImlzU2FmYXJpXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGMuYX0pKTt2YXIgZj1uKDI0OCk7bi5vKGYsXCJBQUJCXCIpJiZuLmQoZSxcIkFBQkJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZi5BQUJCfSkpLG4ubyhmLFwiRnJ1c3R1bVwiKSYmbi5kKGUsXCJGcnVzdHVtXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGYuRnJ1c3R1bX0pKTt2YXIgbCxoLGQscCxnPW4oMjY4KTtuLmQoZSxcIkFBQkJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZy5hfSkpLG4uZChlLFwiRnJ1c3R1bVwiLChmdW5jdGlvbigpe3JldHVybiBnLmJ9KSksZnVuY3Rpb24odCl7dC5Wb2lkPVwiVm9pZFwiLHQuQm9vbGVhbj1cIkJvb2xlYW5cIix0LkZsb2F0PVwiRmxvYXRcIix0LlVpbnQzMj1cIlVpbnQzMlwiLHQuSW50MzI9XCJJbnQzMlwiLHQuVmVjdG9yPVwiVmVjdG9yXCIsdC5WZWN0b3IyRmxvYXQ9XCJ2ZWMyPGYzMj5cIix0LlZlY3RvcjNGbG9hdD1cInZlYzM8ZjMyPlwiLHQuVmVjdG9yNEZsb2F0PVwidmVjNDxmMzI+XCIsdC5WZWN0b3IyQm9vbGVhbj1cInZlYzI8Ym9vbD5cIix0LlZlY3RvcjNCb29sZWFuPVwidmVjMzxib29sPlwiLHQuVmVjdG9yNEJvb2xlYW49XCJ2ZWM0PGJvb2w+XCIsdC5WZWN0b3IyVWludD1cInZlYzI8dTMyPlwiLHQuVmVjdG9yM1VpbnQ9XCJ2ZWMzPHUzMj5cIix0LlZlY3RvcjRVaW50PVwidmVjNDx1MzI+XCIsdC5WZWN0b3IySW50PVwidmVjMjxpMzI+XCIsdC5WZWN0b3IzSW50PVwidmVjMzxpMzI+XCIsdC5WZWN0b3I0SW50PVwidmVjNDxpMzI+XCIsdC5NYXRyaXg9XCJNYXRyaXhcIix0Lk1hdHJpeDN4M0Zsb2F0PVwibWF0M3gzPGYzMj5cIix0Lk1hdHJpeDR4NEZsb2F0PVwibWF0NHg0PGkzMj5cIix0LlN0cnVjdD1cIlN0cnVjdFwiLHQuRmxvYXRBcnJheT1cIkZsb2F0W11cIix0LlZlY3RvcjRGbG9hdEFycmF5PVwidmVjNDxmMzI+W11cIn0obHx8KGw9e30pKSxmdW5jdGlvbih0KXt0LlByb2dyYW09XCJQcm9ncmFtXCIsdC5JZGVudGlmaWVyPVwiSWRlbnRpZmllclwiLHQuVmFyaWFibGVEZWNsYXJhdGlvbj1cIlZhcmlhYmxlRGVjbGFyYXRpb25cIix0LkJsb2NrU3RhdGVtZW50PVwiQmxvY2tTdGF0ZW1lbnRcIix0LlJldHVyblN0YXRlbWVudD1cIlJldHVyblN0YXRlbWVudFwiLHQuRnVuY3Rpb25EZWNsYXJhdGlvbj1cIkZ1bmN0aW9uRGVjbGFyYXRpb25cIix0LlZhcmlhYmxlRGVjbGFyYXRvcj1cIlZhcmlhYmxlRGVjbGFyYXRvclwiLHQuQXNzaWdubWVudEV4cHJlc3Npb249XCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLHQuTG9naWNhbEV4cHJlc3Npb249XCJMb2dpY2FsRXhwcmVzc2lvblwiLHQuQmluYXJ5RXhwcmVzc2lvbj1cIkJpbmFyeUV4cHJlc3Npb25cIix0LkFycmF5RXhwcmVzc2lvbj1cIkFycmF5RXhwcmVzc2lvblwiLHQuVW5hcnlFeHByZXNzaW9uPVwiVW5hcnlFeHByZXNzaW9uXCIsdC5VcGRhdGVFeHByZXNzaW9uPVwiVXBkYXRlRXhwcmVzc2lvblwiLHQuRnVuY3Rpb25FeHByZXNzaW9uPVwiRnVuY3Rpb25FeHByZXNzaW9uXCIsdC5NZW1iZXJFeHByZXNzaW9uPVwiTWVtYmVyRXhwcmVzc2lvblwiLHQuQ29uZGl0aW9uYWxFeHByZXNzaW9uPVwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIsdC5FeHByZXNzaW9uU3RhdGVtZW50PVwiRXhwcmVzc2lvblN0YXRlbWVudFwiLHQuQ2FsbEV4cHJlc3Npb249XCJDYWxsRXhwcmVzc2lvblwiLHQuTnVtVGhyZWFkU3RhdGVtZW50PVwiTnVtVGhyZWFkU3RhdGVtZW50XCIsdC5TdG9yYWdlU3RhdGVtZW50PVwiU3RvcmFnZVN0YXRlbWVudFwiLHQuRG9XaGlsZVN0YXRlbWVudD1cIkRvV2hpbGVTdGF0ZW1lbnRcIix0LldoaWxlU3RhdGVtZW50PVwiV2hpbGVTdGF0ZW1lbnRcIix0LkZvclN0YXRlbWVudD1cIkZvclN0YXRlbWVudFwiLHQuQnJlYWtTdGF0ZW1lbnQ9XCJCcmVha1N0YXRlbWVudFwiLHQuQ29udGludWVTdGF0ZW1lbnQ9XCJDb250aW51ZVN0YXRlbWVudFwiLHQuSWZTdGF0ZW1lbnQ9XCJJZlN0YXRlbWVudFwiLHQuSW1wb3J0ZWRGdW5jdGlvblN0YXRlbWVudD1cIkltcG9ydGVkRnVuY3Rpb25TdGF0ZW1lbnRcIn0oaHx8KGg9e30pKSxmdW5jdGlvbih0KXt0LklucHV0PVwiSW5wdXRcIix0Lk91dHB1dD1cIk91dHB1dFwiLHQuVW5pZm9ybT1cIlVuaWZvcm1cIix0Lldvcmtncm91cD1cIldvcmtncm91cFwiLHQuVW5pZm9ybUNvbnN0YW50PVwiVW5pZm9ybUNvbnN0YW50XCIsdC5JbWFnZT1cIkltYWdlXCIsdC5TdG9yYWdlQnVmZmVyPVwiU3RvcmFnZUJ1ZmZlclwiLHQuUHJpdmF0ZT1cIlByaXZhdGVcIix0LkZ1bmN0aW9uPVwiRnVuY3Rpb25cIn0oZHx8KGQ9e30pKSxmdW5jdGlvbih0KXt0LkdMU0wxMDA9XCJHTFNMMTAwXCIsdC5HTFNMNDUwPVwiR0xTTDQ1MFwiLHQuV0dTTD1cIldHU0xcIn0ocHx8KHA9e30pKTt2YXIgdj1cIl9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fXCJ9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLk1FVEFEQVRBX0tFWT12b2lkIDA7dmFyIHI9bigzMSk7ZS5NRVRBREFUQV9LRVk9cjt2YXIgaT1uKDQ2Nik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJDb250YWluZXJcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5Db250YWluZXJ9fSk7dmFyIG89big1Nik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJCaW5kaW5nU2NvcGVFbnVtXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uQmluZGluZ1Njb3BlRW51bX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIkJpbmRpbmdUeXBlRW51bVwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvLkJpbmRpbmdUeXBlRW51bX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIlRhcmdldFR5cGVFbnVtXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uVGFyZ2V0VHlwZUVudW19fSk7dmFyIGE9big0ODIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiQXN5bmNDb250YWluZXJNb2R1bGVcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5Bc3luY0NvbnRhaW5lck1vZHVsZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIkNvbnRhaW5lck1vZHVsZVwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhLkNvbnRhaW5lck1vZHVsZX19KTt2YXIgcz1uKDQ4Myk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJpbmplY3RhYmxlXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHMuaW5qZWN0YWJsZX19KTt2YXIgdT1uKDQ4NCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJ0YWdnZWRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdS50YWdnZWR9fSk7dmFyIGM9big0ODUpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibmFtZWRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5uYW1lZH19KTt2YXIgZj1uKDIzNyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJpbmplY3RcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZi5pbmplY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJMYXp5U2VydmljZUlkZW50aWZlclwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBmLkxhenlTZXJ2aWNlSWRlbnRpZmVyfX0pO3ZhciBsPW4oNDg2KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm9wdGlvbmFsXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGwub3B0aW9uYWx9fSk7dmFyIGg9big0ODcpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwidW5tYW5hZ2VkXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgudW5tYW5hZ2VkfX0pO3ZhciBkPW4oNDg4KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm11bHRpSW5qZWN0XCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGQubXVsdGlJbmplY3R9fSk7dmFyIHA9big0ODkpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwidGFyZ2V0TmFtZVwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBwLnRhcmdldE5hbWV9fSk7dmFyIGc9big0OTApO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwicG9zdENvbnN0cnVjdFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBnLnBvc3RDb25zdHJ1Y3R9fSk7dmFyIHY9bigyMzUpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiTWV0YWRhdGFSZWFkZXJcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdi5NZXRhZGF0YVJlYWRlcn19KTt2YXIgeT1uKDY4KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImlkXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuaWR9fSk7dmFyIG09big2MSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWNvcmF0ZVwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLmRlY29yYXRlfX0pO3ZhciBiPW4oMjQwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInRyYXZlcnNlQW5jZXJzdG9yc1wiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBiLnRyYXZlcnNlQW5jZXJzdG9yc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInRhZ2dlZENvbnN0cmFpbnRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYi50YWdnZWRDb25zdHJhaW50fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibmFtZWRDb25zdHJhaW50XCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGIubmFtZWRDb25zdHJhaW50fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwidHlwZUNvbnN0cmFpbnRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYi50eXBlQ29uc3RyYWludH19KTt2YXIgeD1uKDkwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmdcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geC5nZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nfX0pO3ZhciB3PW4oNDkxKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm11bHRpQmluZFRvU2VydmljZVwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB3Lm11bHRpQmluZFRvU2VydmljZX19KX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX10LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlJiZuKHQucHJvdG90eXBlLGUpLHImJm4odCxyKSx0fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGZ1bmN0aW9uKHQpe3QuVGV4dHVyZUNvbXByZXNzaW9uQkM9XCJ0ZXh0dXJlLWNvbXByZXNzaW9uLWJjXCJ9KGUuRXh0ZW5zaW9uTmFtZXx8KGUuRXh0ZW5zaW9uTmFtZT17fSkpLGZ1bmN0aW9uKHQpe3QuQ2xhbXBUb0VkZ2U9XCJjbGFtcC10by1lZGdlXCIsdC5SZXBlYXQ9XCJyZXBlYXRcIix0Lk1pcnJvclJlcGVhdD1cIm1pcnJvci1yZXBlYXRcIn0oZS5BZGRyZXNzTW9kZXx8KGUuQWRkcmVzc01vZGU9e30pKSxmdW5jdGlvbih0KXt0LlVuaWZvcm1CdWZmZXI9XCJ1bmlmb3JtLWJ1ZmZlclwiLHQuU3RvcmFnZUJ1ZmZlcj1cInN0b3JhZ2UtYnVmZmVyXCIsdC5SZWFkb25seVN0b3JhZ2VCdWZmZXI9XCJyZWFkb25seS1zdG9yYWdlLWJ1ZmZlclwiLHQuU2FtcGxlcj1cInNhbXBsZXJcIix0LkNvbXBhcmlzb25TYW1wbGVyPVwiY29tcGFyaXNvbi1zYW1wbGVyXCIsdC5TYW1wbGVkVGV4dHVyZT1cInNhbXBsZWQtdGV4dHVyZVwiLHQuUmVhZG9ubHlTdG9yYWdlVGV4dHVyZT1cInJlYWRvbmx5LXN0b3JhZ2UtdGV4dHVyZVwiLHQuV3JpdGVvbmx5U3RvcmFnZVRleHR1cmU9XCJ3cml0ZW9ubHktc3RvcmFnZS10ZXh0dXJlXCJ9KGUuQmluZGluZ1R5cGV8fChlLkJpbmRpbmdUeXBlPXt9KSksZnVuY3Rpb24odCl7dC5aZXJvPVwiemVyb1wiLHQuT25lPVwib25lXCIsdC5TcmNDb2xvcj1cInNyYy1jb2xvclwiLHQuT25lTWludXNTcmNDb2xvcj1cIm9uZS1taW51cy1zcmMtY29sb3JcIix0LlNyY0FscGhhPVwic3JjLWFscGhhXCIsdC5PbmVNaW51c1NyY0FscGhhPVwib25lLW1pbnVzLXNyYy1hbHBoYVwiLHQuRHN0Q29sb3I9XCJkc3QtY29sb3JcIix0Lk9uZU1pbnVzRHN0Q29sb3I9XCJvbmUtbWludXMtZHN0LWNvbG9yXCIsdC5Ec3RBbHBoYT1cImRzdC1hbHBoYVwiLHQuT25lTWludXNEc3RBbHBoYT1cIm9uZS1taW51cy1kc3QtYWxwaGFcIix0LlNyY0FscGhhU2F0dXJhdGVkPVwic3JjLWFscGhhLXNhdHVyYXRlZFwiLHQuQmxlbmRDb2xvcj1cImJsZW5kLWNvbG9yXCIsdC5PbmVNaW51c0JsZW5kQ29sb3I9XCJvbmUtbWludXMtYmxlbmQtY29sb3JcIn0oZS5CbGVuZEZhY3Rvcnx8KGUuQmxlbmRGYWN0b3I9e30pKSxmdW5jdGlvbih0KXt0LkFkZD1cImFkZFwiLHQuU3VidHJhY3Q9XCJzdWJ0cmFjdFwiLHQuUmV2ZXJzZVN1YnRyYWN0PVwicmV2ZXJzZS1zdWJ0cmFjdFwiLHQuTWluPVwibWluXCIsdC5NYXg9XCJtYXhcIn0oZS5CbGVuZE9wZXJhdGlvbnx8KGUuQmxlbmRPcGVyYXRpb249e30pKSxmdW5jdGlvbih0KXt0Lk5ldmVyPVwibmV2ZXJcIix0Lkxlc3M9XCJsZXNzXCIsdC5FcXVhbD1cImVxdWFsXCIsdC5MZXNzRXF1YWw9XCJsZXNzLWVxdWFsXCIsdC5HcmVhdGVyPVwiZ3JlYXRlclwiLHQuTm90RXF1YWw9XCJub3QtZXF1YWxcIix0LkdyZWF0ZXJFcXVhbD1cImdyZWF0ZXItZXF1YWxcIix0LkFsd2F5cz1cImFsd2F5c1wifShlLkNvbXBhcmVGdW5jdGlvbnx8KGUuQ29tcGFyZUZ1bmN0aW9uPXt9KSksZnVuY3Rpb24odCl7dC5Ob25lPVwibm9uZVwiLHQuRnJvbnQ9XCJmcm9udFwiLHQuQmFjaz1cImJhY2tcIn0oZS5DdWxsTW9kZXx8KGUuQ3VsbE1vZGU9e30pKSxmdW5jdGlvbih0KXt0Lk5lYXJlc3Q9XCJuZWFyZXN0XCIsdC5MaW5lYXI9XCJsaW5lYXJcIn0oZS5GaWx0ZXJNb2RlfHwoZS5GaWx0ZXJNb2RlPXt9KSksZnVuY3Rpb24odCl7dC5DQ1c9XCJjY3dcIix0LkNXPVwiY3dcIn0oZS5Gcm9udEZhY2V8fChlLkZyb250RmFjZT17fSkpLGZ1bmN0aW9uKHQpe3QuVWludDE2PVwidWludDE2XCIsdC5VaW50MzI9XCJ1aW50MzJcIn0oZS5JbmRleEZvcm1hdHx8KGUuSW5kZXhGb3JtYXQ9e30pKSxmdW5jdGlvbih0KXt0LlZlcnRleD1cInZlcnRleFwiLHQuSW5zdGFuY2U9XCJpbnN0YW5jZVwifShlLklucHV0U3RlcE1vZGV8fChlLklucHV0U3RlcE1vZGU9e30pKSxmdW5jdGlvbih0KXt0LkxvYWQ9XCJsb2FkXCJ9KGUuTG9hZE9wfHwoZS5Mb2FkT3A9e30pKSxmdW5jdGlvbih0KXt0LlBvaW50TGlzdD1cInBvaW50LWxpc3RcIix0LkxpbmVMaXN0PVwibGluZS1saXN0XCIsdC5MaW5lU3RyaXA9XCJsaW5lLXN0cmlwXCIsdC5UcmlhbmdsZUxpc3Q9XCJ0cmlhbmdsZS1saXN0XCIsdC5UcmlhbmdsZVN0cmlwPVwidHJpYW5nbGUtc3RyaXBcIn0oZS5QcmltaXRpdmVUb3BvbG9neXx8KGUuUHJpbWl0aXZlVG9wb2xvZ3k9e30pKSxmdW5jdGlvbih0KXt0LktlZXA9XCJrZWVwXCIsdC5aZXJvPVwiemVyb1wiLHQuUmVwbGFjZT1cInJlcGxhY2VcIix0LkludmVydD1cImludmVydFwiLHQuSW5jcmVtZW50Q2xhbXA9XCJpbmNyZW1lbnQtY2xhbXBcIix0LkRlY3JlbWVudENsYW1wPVwiZGVjcmVtZW50LWNsYW1wXCIsdC5JbmNyZW1lbnRXcmFwPVwiaW5jcmVtZW50LXdyYXBcIix0LkRlY3JlbWVudFdyYXA9XCJkZWNyZW1lbnQtd3JhcFwifShlLlN0ZW5jaWxPcGVyYXRpb258fChlLlN0ZW5jaWxPcGVyYXRpb249e30pKSxmdW5jdGlvbih0KXt0LlN0b3JlPVwic3RvcmVcIix0LkNsZWFyPVwiY2xlYXJcIn0oZS5TdG9yZU9wfHwoZS5TdG9yZU9wPXt9KSksZnVuY3Rpb24odCl7dC5FMWQ9XCIxZFwiLHQuRTJkPVwiMmRcIix0LkUzZD1cIjNkXCJ9KGUuVGV4dHVyZURpbWVuc2lvbnx8KGUuVGV4dHVyZURpbWVuc2lvbj17fSkpLGZ1bmN0aW9uKHQpe3QuUjhVbm9ybT1cInI4dW5vcm1cIix0LlI4U25vcm09XCJyOHNub3JtXCIsdC5SOFVpbnQ9XCJyOHVpbnRcIix0LlI4U2ludD1cInI4c2ludFwiLHQuUjE2VWludD1cInIxNnVpbnRcIix0LlIxNlNpbnQ9XCJyMTZzaW50XCIsdC5SMTZGbG9hdD1cInIxNmZsb2F0XCIsdC5SRzhVbm9ybT1cInJnOHVub3JtXCIsdC5SRzhTbm9ybT1cInJnOHNub3JtXCIsdC5SRzhVaW50PVwicmc4dWludFwiLHQuUkc4U2ludD1cInJnOHNpbnRcIix0LlIzMlVpbnQ9XCJyMzJ1aW50XCIsdC5SMzJTaW50PVwicjMyc2ludFwiLHQuUjMyRmxvYXQ9XCJyMzJmbG9hdFwiLHQuUkcxNlVpbnQ9XCJyZzE2dWludFwiLHQuUkcxNlNpbnQ9XCJyZzE2c2ludFwiLHQuUkcxNkZsb2F0PVwicmcxNmZsb2F0XCIsdC5SR0JBOFVub3JtPVwicmdiYTh1bm9ybVwiLHQuUkdCQThVbm9ybVNSR0I9XCJyZ2JhOHVub3JtLXNyZ2JcIix0LlJHQkE4U25vcm09XCJyZ2JhOHNub3JtXCIsdC5SR0JBOFVpbnQ9XCJyZ2JhOHVpbnRcIix0LlJHQkE4U2ludD1cInJnYmE4c2ludFwiLHQuQkdSQThVbm9ybT1cImJncmE4dW5vcm1cIix0LkJHUkE4VW5vcm1TUkdCPVwiYmdyYTh1bm9ybS1zcmdiXCIsdC5SR0IxMEEyVW5vcm09XCJyZ2IxMGEydW5vcm1cIix0LlJHMTFCMTBGbG9hdD1cInJnMTFiMTBmbG9hdFwiLHQuUkczMlVpbnQ9XCJyZzMydWludFwiLHQuUkczMlNpbnQ9XCJyZzMyc2ludFwiLHQuUkczMkZsb2F0PVwicmczMmZsb2F0XCIsdC5SR0JBMTZVaW50PVwicmdiYTE2dWludFwiLHQuUkdCQTE2U2ludD1cInJnYmExNnNpbnRcIix0LlJHQkExNkZsb2F0PVwicmdiYTE2ZmxvYXRcIix0LlJHQkEzMlVpbnQ9XCJyZ2JhMzJ1aW50XCIsdC5SR0JBMzJTaW50PVwicmdiYTMyc2ludFwiLHQuUkdCQTMyRmxvYXQ9XCJyZ2JhMzJmbG9hdFwiLHQuRGVwdGgzMkZsb2F0PVwiZGVwdGgzMmZsb2F0XCIsdC5EZXB0aDI0UGx1cz1cImRlcHRoMjRwbHVzXCIsdC5EZXB0aDI0UGx1c1N0ZW5jaWw4PVwiZGVwdGgyNHBsdXMtc3RlbmNpbDhcIn0oZS5UZXh0dXJlRm9ybWF0fHwoZS5UZXh0dXJlRm9ybWF0PXt9KSksZnVuY3Rpb24odCl7dC5GbG9hdD1cImZsb2F0XCIsdC5TaW50PVwic2ludFwiLHQuVWludD1cInVpbnRcIn0oZS5UZXh0dXJlQ29tcG9uZW50VHlwZXx8KGUuVGV4dHVyZUNvbXBvbmVudFR5cGU9e30pKSxmdW5jdGlvbih0KXt0LkUxZD1cIjFkXCIsdC5FMmQ9XCIyZFwiLHQuRTJkQXJyYXk9XCIyZC1hcnJheVwiLHQuQ3ViZT1cImN1YmVcIix0LkN1YmVBcnJheT1cImN1YmUtYXJyYXlcIix0LkUzZD1cIjNkXCJ9KGUuVGV4dHVyZVZpZXdEaW1lbnNpb258fChlLlRleHR1cmVWaWV3RGltZW5zaW9uPXt9KSksZnVuY3Rpb24odCl7dC5VY2hhcjI9XCJ1Y2hhcjJcIix0LlVjaGFyND1cInVjaGFyNFwiLHQuQ2hhcjI9XCJjaGFyMlwiLHQuQ2hhcjQ9XCJjaGFyNFwiLHQuVWNoYXIyTm9ybT1cInVjaGFyMm5vcm1cIix0LlVjaGFyNE5vcm09XCJ1Y2hhcjRub3JtXCIsdC5DaGFyMk5vcm09XCJjaGFyMm5vcm1cIix0LkNoYXI0Tm9ybT1cImNoYXI0bm9ybVwiLHQuVXNob3J0Mj1cInVzaG9ydDJcIix0LlVzaG9ydDQ9XCJ1c2hvcnQ0XCIsdC5TaG9ydDI9XCJzaG9ydDJcIix0LlNob3J0ND1cInNob3J0NFwiLHQuVXNob3J0Mk5vcm09XCJ1c2hvcnQybm9ybVwiLHQuVXNob3J0NE5vcm09XCJ1c2hvcnQ0bm9ybVwiLHQuU2hvcnQyTm9ybT1cInNob3J0Mm5vcm1cIix0LlNob3J0NE5vcm09XCJzaG9ydDRub3JtXCIsdC5IYWxmMj1cImhhbGYyXCIsdC5IYWxmND1cImhhbGY0XCIsdC5GbG9hdD1cImZsb2F0XCIsdC5GbG9hdDI9XCJmbG9hdDJcIix0LkZsb2F0Mz1cImZsb2F0M1wiLHQuRmxvYXQ0PVwiZmxvYXQ0XCIsdC5VaW50PVwidWludFwiLHQuVWludDI9XCJ1aW50MlwiLHQuVWludDM9XCJ1aW50M1wiLHQuVWludDQ9XCJ1aW50NFwiLHQuSW50PVwiaW50XCIsdC5JbnQyPVwiaW50MlwiLHQuSW50Mz1cImludDNcIix0LkludDQ9XCJpbnQ0XCJ9KGUuVmVydGV4Rm9ybWF0fHwoZS5WZXJ0ZXhGb3JtYXQ9e30pKSxmdW5jdGlvbih0KXt0LkFsbD1cImFsbFwiLHQuU3RlbmNpbE9ubHk9XCJzdGVuY2lsLW9ubHlcIix0LkRlcHRoT25seT1cImRlcHRoLW9ubHlcIn0oZS5UZXh0dXJlQXNwZWN0fHwoZS5UZXh0dXJlQXNwZWN0PXt9KSksZnVuY3Rpb24odCl7dC5FcnJvcj1cImVycm9yXCIsdC5XYXJuaW5nPVwid2FybmluZ1wiLHQuSW5mbz1cImluZm9cIn0oZS5Db21waWxhdGlvbk1lc3NhZ2VUeXBlfHwoZS5Db21waWxhdGlvbk1lc3NhZ2VUeXBlPXt9KSksZnVuY3Rpb24odCl7dC5PY2NsdXNpb249XCJvY2NsdXNpb25cIn0oZS5RdWVyeVR5cGV8fChlLlF1ZXJ5VHlwZT17fSkpLGZ1bmN0aW9uKHQpe3RbdC5NYXBSZWFkPTFdPVwiTWFwUmVhZFwiLHRbdC5NYXBXcml0ZT0yXT1cIk1hcFdyaXRlXCIsdFt0LkNvcHlTcmM9NF09XCJDb3B5U3JjXCIsdFt0LkNvcHlEc3Q9OF09XCJDb3B5RHN0XCIsdFt0LkluZGV4PTE2XT1cIkluZGV4XCIsdFt0LlZlcnRleD0zMl09XCJWZXJ0ZXhcIix0W3QuVW5pZm9ybT02NF09XCJVbmlmb3JtXCIsdFt0LlN0b3JhZ2U9MTI4XT1cIlN0b3JhZ2VcIix0W3QuSW5kaXJlY3Q9MjU2XT1cIkluZGlyZWN0XCIsdFt0LlF1ZXJ5UmVzb2x2ZT01MTJdPVwiUXVlcnlSZXNvbHZlXCJ9KGUuQnVmZmVyVXNhZ2V8fChlLkJ1ZmZlclVzYWdlPXt9KSksZnVuY3Rpb24odCl7dFt0LlJlZD0xXT1cIlJlZFwiLHRbdC5HcmVlbj0yXT1cIkdyZWVuXCIsdFt0LkJsdWU9NF09XCJCbHVlXCIsdFt0LkFscGhhPThdPVwiQWxwaGFcIix0W3QuQWxsPTE1XT1cIkFsbFwifShlLkNvbG9yV3JpdGV8fChlLkNvbG9yV3JpdGU9e30pKSxmdW5jdGlvbih0KXt0W3QuVmVydGV4PTFdPVwiVmVydGV4XCIsdFt0LkZyYWdtZW50PTJdPVwiRnJhZ21lbnRcIix0W3QuQ29tcHV0ZT00XT1cIkNvbXB1dGVcIn0oZS5TaGFkZXJTdGFnZXx8KGUuU2hhZGVyU3RhZ2U9e30pKSxmdW5jdGlvbih0KXt0W3QuQ29weVNyYz0xXT1cIkNvcHlTcmNcIix0W3QuQ29weURzdD0yXT1cIkNvcHlEc3RcIix0W3QuU2FtcGxlZD00XT1cIlNhbXBsZWRcIix0W3QuU3RvcmFnZT04XT1cIlN0b3JhZ2VcIix0W3QuT3V0cHV0QXR0YWNobWVudD0xNl09XCJPdXRwdXRBdHRhY2htZW50XCJ9KGUuVGV4dHVyZVVzYWdlfHwoZS5UZXh0dXJlVXNhZ2U9e30pKSxmdW5jdGlvbih0KXt0W3QuUmVhZD0xXT1cIlJlYWRcIix0W3QuV3JpdGU9Ml09XCJXcml0ZVwifShlLk1hcE1vZGV8fChlLk1hcE1vZGU9e30pKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDQ2Mil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLHIpe24mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6bi5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTpuLmNvbmZpZ3VyYWJsZSx3cml0YWJsZTpuLndyaXRhYmxlLHZhbHVlOm4uaW5pdGlhbGl6ZXI/bi5pbml0aWFsaXplci5jYWxsKHIpOnZvaWQgMH0pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz17fTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaCgoZnVuY3Rpb24odCl7b1t0XT1yW3RdfSkpLG8uZW51bWVyYWJsZT0hIW8uZW51bWVyYWJsZSxvLmNvbmZpZ3VyYWJsZT0hIW8uY29uZmlndXJhYmxlLChcInZhbHVlXCJpbiBvfHxvLmluaXRpYWxpemVyKSYmKG8ud3JpdGFibGU9ITApLG89bi5zbGljZSgpLnJldmVyc2UoKS5yZWR1Y2UoKGZ1bmN0aW9uKG4scil7cmV0dXJuIHIodCxlLG4pfHxufSksbyksaSYmdm9pZCAwIT09by5pbml0aWFsaXplciYmKG8udmFsdWU9by5pbml0aWFsaXplcj9vLmluaXRpYWxpemVyLmNhbGwoaSk6dm9pZCAwLG8uaW5pdGlhbGl6ZXI9dm9pZCAwKSx2b2lkIDA9PT1vLmluaXRpYWxpemVyJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxvKSxvPW51bGwpLG99fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJiXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSksbi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSksbi5kKGUsXCJjXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSk7dmFyIHI9MWUtNixpPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBGbG9hdDMyQXJyYXk/RmxvYXQzMkFycmF5OkFycmF5LG89TWF0aC5yYW5kb207TWF0aC5QSTtNYXRoLmh5cG90fHwoTWF0aC5oeXBvdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9YXJndW1lbnRzLmxlbmd0aDtlLS07KXQrPWFyZ3VtZW50c1tlXSphcmd1bWVudHNbZV07cmV0dXJuIE1hdGguc3FydCh0KX0pfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSk7dmFyIHI9e0hpZXJhcmNoeUNvbXBvbmVudE1hbmFnZXI6U3ltYm9sKFwiSGllcmFyY2h5Q29tcG9uZW50TWFuYWdlclwiKSxUcmFuc2Zvcm1Db21wb25lbnRNYW5hZ2VyOlN5bWJvbChcIlRyYW5zZm9ybUNvbXBvbmVudE1hbmFnZXJcIiksTmFtZUNvbXBvbmVudE1hbmFnZXI6U3ltYm9sKFwiTmFtZUNvbXBvbmVudE1hbmFnZXJcIiksU2NlbmVHcmFwaFN5c3RlbTpTeW1ib2woXCJTY2VuZUdyYXBoU3lzdGVtXCIpLEZyYW1lR3JhcGhTeXN0ZW06U3ltYm9sKFwiRnJhbWVHcmFwaFN5c3RlbVwiKSxSZXNvdXJjZVBvb2w6U3ltYm9sKFwiUmVzb3VyY2VQb29sXCIpLFJlc291cmNlSGFuZGxlQ29tcG9uZW50TWFuYWdlcjpTeW1ib2woXCJSZXNvdXJjZUhhbmRsZUNvbXBvbmVudE1hbmFnZXJcIiksUGFzc05vZGVDb21wb25lbnRNYW5hZ2VyOlN5bWJvbChcIlBhc3NOb2RlQ29tcG9uZW50TWFuYWdlclwiKSxSZW5kZXJlclN5c3RlbTpTeW1ib2woXCJSZW5kZXJlclN5c3RlbVwiKSxSZW5kZXJQYXNzOlN5bWJvbChcIlJlbmRlclBhc3NcIiksUmVuZGVyUGFzc0ZhY3Rvcnk6U3ltYm9sKFwiRmFjdG9yeTxJUmVuZGVyUGFzcz5cIiksUmVuZGVyYWJsZTpTeW1ib2woXCJGYWN0b3J5PElSZW5kZXJQYXNzPlwiKSxNZXNoU3lzdGVtOlN5bWJvbChcIk1lc2hTeXN0ZW1cIiksTWVzaENvbXBvbmVudE1hbmFnZXI6U3ltYm9sKFwiTWVzaENvbXBvbmVudE1hbmFnZXJcIiksQ3VsbGFibGVDb21wb25lbnRNYW5hZ2VyOlN5bWJvbChcIkN1bGxhYmxlQ29tcG9uZW50TWFuYWdlclwiKSxHZW9tZXRyeTpTeW1ib2woXCJHZW9tZXRyeVwiKSxHZW9tZXRyeVN5c3RlbTpTeW1ib2woXCJHZW9tZXRyeVN5c3RlbVwiKSxHZW9tZXRyeUNvbXBvbmVudE1hbmFnZXI6U3ltYm9sKFwiR2VvbWV0cnlDb21wb25lbnRNYW5hZ2VyXCIpLE1hdGVyaWFsOlN5bWJvbChcIk1hdGVyaWFsXCIpLE1hdGVyaWFsU3lzdGVtOlN5bWJvbChcIk1hdGVyaWFsU3lzdGVtXCIpLE1hdGVyaWFsQ29tcG9uZW50TWFuYWdlcjpTeW1ib2woXCJNYXRlcmlhbENvbXBvbmVudE1hbmFnZXJcIiksRm9yd2FyZFJlbmRlclBhdGg6U3ltYm9sKFwiRm9yd2FyZFJlbmRlclBhdGhcIiksQ29tcHV0ZVN5c3RlbTpTeW1ib2woXCJDb21wdXRlU3lzdGVtXCIpLENvbXB1dGVDb21wb25lbnRNYW5hZ2VyOlN5bWJvbChcIkNvbXB1dGVDb21wb25lbnRNYW5hZ2VyXCIpLENvbXB1dGVTdHJhdGVneTpTeW1ib2woXCJDb21wdXRlU3RyYXRlZ3lcIiksU3lzdGVtczpTeW1ib2woXCJTeXN0ZW1zXCIpLFdvcmxkOlN5bWJvbChcIldvcmxkXCIpLFJlbmRlckVuZ2luZTpTeW1ib2woXCJSZW5kZXJFbmdpbmVcIiksV2ViR1BVRW5naW5lOlN5bWJvbChcIldlYkdQVUVuZ2luZVwiKSxXZWJHTEVuZ2luZTpTeW1ib2woXCJXZWJHTEVuZ2luZVwiKSxTaGFkZXJNb2R1bGVTZXJ2aWNlOlN5bWJvbChcIlNoYWRlck1vZHVsZVNlcnZpY2VcIiksQ29uZmlnU2VydmljZTpTeW1ib2woXCJDb25maWdTZXJ2aWNlXCIpLEludGVyYWN0b3JTZXJ2aWNlOlN5bWJvbChcIkludGVyYWN0b3JTZXJ2aWNlXCIpLElFdmVudEVtaXR0ZXI6U3ltYm9sKFwiSUV2ZW50RW1pdHRlclwiKSxMaWdodDpTeW1ib2woXCJMaWdodFwiKX19LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbih0LGUsbixyLGksbyxhKXt0cnl7dmFyIHM9dFtvXShhKSx1PXMudmFsdWV9Y2F0Y2godCl7cmV0dXJuIHZvaWQgbih0KX1zLmRvbmU/ZSh1KTpQcm9taXNlLnJlc29sdmUodSkudGhlbihyLGkpfXQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLHI9YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxvKXt2YXIgYT10LmFwcGx5KGUscik7ZnVuY3Rpb24gcyh0KXtuKGEsaSxvLHMsdSxcIm5leHRcIix0KX1mdW5jdGlvbiB1KHQpe24oYSxpLG8scyx1LFwidGhyb3dcIix0KX1zKHZvaWQgMCl9KSl9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiByfSkpLG4uZChlLFwiYlwiLChmdW5jdGlvbigpe3JldHVybiBpfSkpO3ZhciByPXtyZWN0OlwicGF0aFwiLGNpcmNsZTpcImNpcmNsZVwiLGxpbmU6XCJsaW5lXCIscGF0aDpcInBhdGhcIixtYXJrZXI6XCJwYXRoXCIsdGV4dDpcInRleHRcIixwb2x5bGluZTpcInBvbHlsaW5lXCIscG9seWdvbjpcInBvbHlnb25cIixpbWFnZTpcImltYWdlXCIsZWxsaXBzZTpcImVsbGlwc2VcIixkb206XCJmb3JlaWduT2JqZWN0XCJ9LGk9e29wYWNpdHk6XCJvcGFjaXR5XCIsZmlsbFN0eWxlOlwiZmlsbFwiLGZpbGw6XCJmaWxsXCIsZmlsbE9wYWNpdHk6XCJmaWxsLW9wYWNpdHlcIixzdHJva2VTdHlsZTpcInN0cm9rZVwiLHN0cm9rZU9wYWNpdHk6XCJzdHJva2Utb3BhY2l0eVwiLHN0cm9rZTpcInN0cm9rZVwiLHg6XCJ4XCIseTpcInlcIixyOlwiclwiLHJ4OlwicnhcIixyeTpcInJ5XCIsd2lkdGg6XCJ3aWR0aFwiLGhlaWdodDpcImhlaWdodFwiLHgxOlwieDFcIix4MjpcIngyXCIseTE6XCJ5MVwiLHkyOlwieTJcIixsaW5lQ2FwOlwic3Ryb2tlLWxpbmVjYXBcIixsaW5lSm9pbjpcInN0cm9rZS1saW5lam9pblwiLGxpbmVXaWR0aDpcInN0cm9rZS13aWR0aFwiLGxpbmVEYXNoOlwic3Ryb2tlLWRhc2hhcnJheVwiLGxpbmVEYXNoT2Zmc2V0Olwic3Ryb2tlLWRhc2hvZmZzZXRcIixtaXRlckxpbWl0Olwic3Ryb2tlLW1pdGVybGltaXRcIixmb250OlwiZm9udFwiLGZvbnRTaXplOlwiZm9udC1zaXplXCIsZm9udFN0eWxlOlwiZm9udC1zdHlsZVwiLGZvbnRWYXJpYW50OlwiZm9udC12YXJpYW50XCIsZm9udFdlaWdodDpcImZvbnQtd2VpZ2h0XCIsZm9udEZhbWlseTpcImZvbnQtZmFtaWx5XCIsc3RhcnRBcnJvdzpcIm1hcmtlci1zdGFydFwiLGVuZEFycm93OlwibWFya2VyLWVuZFwiLHBhdGg6XCJkXCIsY2xhc3M6XCJjbGFzc1wiLGlkOlwiaWRcIixzdHlsZTpcInN0eWxlXCIscHJlc2VydmVBc3BlY3RSYXRpbzpcInByZXNlcnZlQXNwZWN0UmF0aW9cIn19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKSxuLmQoZSxcImJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gb30pKSxuLmQoZSxcImVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKSxuLmQoZSxcImZcIiwoZnVuY3Rpb24oKXtyZXR1cm4gc30pKSxuLmQoZSxcImxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSxuLmQoZSxcImpcIiwoZnVuY3Rpb24oKXtyZXR1cm4gY30pKTt2YXIgcj1uKDApO2Z1bmN0aW9uIGkoKXtyZXR1cm4gd2luZG93P3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOjF9ZnVuY3Rpb24gbyh0LGUsbixyKXt2YXIgaT10LW4sbz1lLXI7cmV0dXJuIE1hdGguc3FydChpKmkrbypvKX1mdW5jdGlvbiBhKHQsZSxuLHIsaSxvKXtyZXR1cm4gaT49dCYmaTw9dCtuJiZvPj1lJiZvPD1lK3J9ZnVuY3Rpb24gcyh0LGUpe3JldHVybiEoZS5taW5YPnQubWF4WHx8ZS5tYXhYPHQubWluWHx8ZS5taW5ZPnQubWF4WXx8ZS5tYXhZPHQubWluWSl9ZnVuY3Rpb24gdSh0LGUpe3JldHVybiB0JiZlP3ttaW5YOk1hdGgubWluKHQubWluWCxlLm1pblgpLG1pblk6TWF0aC5taW4odC5taW5ZLGUubWluWSksbWF4WDpNYXRoLm1heCh0Lm1heFgsZS5tYXhYKSxtYXhZOk1hdGgubWF4KHQubWF4WSxlLm1heFkpfTp0fHxlfWZ1bmN0aW9uIGModCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdfW4uZChlLFwiaVwiLChmdW5jdGlvbigpe3JldHVybiByLnN9KSksbi5kKGUsXCJrXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHIueH0pKSxuLmQoZSxcImhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gci5yfSkpLG4uZChlLFwiZ1wiLChmdW5jdGlvbigpe3JldHVybiByLm19KSksbi5kKGUsXCJjXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHIuZn0pKSxuLmQoZSxcIm9cIiwoZnVuY3Rpb24oKXtyZXR1cm4gci5HfSkpLG4uZChlLFwibVwiLChmdW5jdGlvbigpe3JldHVybiByLkJ9KSksbi5kKGUsXCJuXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHIuRH0pKSxuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gci5ifSkpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHQuZXhwb3J0cz1uPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9LG4oZSl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaS5hfSkpLG4uZChlLFwiY1wiLChmdW5jdGlvbigpe3JldHVybiBpLmR9KSksbi5kKGUsXCJkXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGkuZX0pKSxuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcn0pKTt2YXIgcj17fTtuLnIociksbi5kKHIsXCJsZWZ0VHJhbnNsYXRlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSksbi5kKHIsXCJsZWZ0Um90YXRlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSksbi5kKHIsXCJsZWZ0U2NhbGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gc30pKSxuLmQocixcInRyYW5zZm9ybVwiLChmdW5jdGlvbigpe3JldHVybiB1fSkpLG4uZChyLFwiZGlyZWN0aW9uXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSksbi5kKHIsXCJhbmdsZVRvXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSksbi5kKHIsXCJ2ZXJ0aWNhbFwiLChmdW5jdGlvbigpe3JldHVybiBsfSkpO3ZhciBpPW4oMik7ZnVuY3Rpb24gbyh0LGUsbil7dmFyIHI9WzAsMCwwLDAsMCwwLDAsMCwwXTtyZXR1cm4gaS5hLmZyb21UcmFuc2xhdGlvbihyLG4pLGkuYS5tdWx0aXBseSh0LHIsZSl9ZnVuY3Rpb24gYSh0LGUsbil7dmFyIHI9WzAsMCwwLDAsMCwwLDAsMCwwXTtyZXR1cm4gaS5hLmZyb21Sb3RhdGlvbihyLG4pLGkuYS5tdWx0aXBseSh0LHIsZSl9ZnVuY3Rpb24gcyh0LGUsbil7dmFyIHI9WzAsMCwwLDAsMCwwLDAsMCwwXTtyZXR1cm4gaS5hLmZyb21TY2FsaW5nKHIsbiksaS5hLm11bHRpcGx5KHQscixlKX1mdW5jdGlvbiB1KHQsZSl7Zm9yKHZhciBuLHIsdSxjPXQ/W10uY29uY2F0KHQpOlsxLDAsMCwwLDEsMCwwLDAsMV0sZj0wLGw9ZS5sZW5ndGg7ZjxsO2YrKyl7dmFyIGg9ZVtmXTtzd2l0Y2goaFswXSl7Y2FzZVwidFwiOm8oYyxjLFtoWzFdLGhbMl1dKTticmVhaztjYXNlXCJzXCI6cyhjLGMsW2hbMV0saFsyXV0pO2JyZWFrO2Nhc2VcInJcIjphKGMsYyxoWzFdKTticmVhaztjYXNlXCJtXCI6bj1jLHI9Yyx1PWhbMV0saS5hLm11bHRpcGx5KG4sdSxyKX19cmV0dXJuIGN9ZnVuY3Rpb24gYyh0LGUpe3JldHVybiB0WzBdKmVbMV0tZVswXSp0WzFdfWZ1bmN0aW9uIGYodCxlLG4pe3ZhciByPWkuZC5hbmdsZSh0LGUpLG89Yyh0LGUpPj0wO3JldHVybiBuP28/MipNYXRoLlBJLXI6cjpvP3I6MipNYXRoLlBJLXJ9ZnVuY3Rpb24gbCh0LGUsbil7cmV0dXJuIG4/KHRbMF09ZVsxXSx0WzFdPS0xKmVbMF0pOih0WzBdPS0xKmVbMV0sdFsxXT1lWzBdKSx0fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwialwiLChmdW5jdGlvbigpe3JldHVybiBpfSkpLG4uZChlLFwiY1wiLChmdW5jdGlvbigpe3JldHVybiBvfSkpLG4uZChlLFwiZ1wiLChmdW5jdGlvbigpe3JldHVybiBhfSkpLG4uZChlLFwiYlwiLChmdW5jdGlvbigpe3JldHVybiBzfSkpO3ZhciByPW4oMCk7ZnVuY3Rpb24gaSh0LGUpe3ZhciBuPXQuaW5kZXhPZihlKTstMSE9PW4mJnQuc3BsaWNlKG4sMSl9bi5kKGUsXCJlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHIuc30pKSxuLmQoZSxcImRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gci5yfSkpLG4uZChlLFwiaFwiLChmdW5jdGlvbigpe3JldHVybiByLnh9KSksbi5kKGUsXCJmXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHIudn0pKSxuLmQoZSxcImlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gci5BfSkpLG4uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiByLmZ9KSksbi5kKGUsXCJrXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHIuSX0pKTt2YXIgbz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ2b2lkIDAhPT13aW5kb3cuZG9jdW1lbnQ7ZnVuY3Rpb24gYSh0LGUpe2lmKHQuaXNDYW52YXMoKSlyZXR1cm4hMDtmb3IodmFyIG49ZS5nZXRQYXJlbnQoKSxyPSExO247KXtpZihuPT09dCl7cj0hMDticmVha31uPW4uZ2V0UGFyZW50KCl9cmV0dXJuIHJ9ZnVuY3Rpb24gcyh0KXtyZXR1cm4gdC5jZmcudmlzaWJsZSYmdC5jZmcuY2FwdHVyZX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbX0pKSxuLmQoZSxcImJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gX30pKSxuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSX0pKSxuLmQoZSxcImNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaH0pKSxuLmQoZSxcImRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTH0pKSxuLmQoZSxcImZcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcn0pKTt2YXIgcj17fTtmdW5jdGlvbiBpKHQpe3JldHVybiBNYXRoLm1pbi5hcHBseShudWxsLHQpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwsdCl9ZnVuY3Rpb24gYSh0LGUsbixyKXt2YXIgaT10LW4sbz1lLXI7cmV0dXJuIE1hdGguc3FydChpKmkrbypvKX1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIE1hdGguYWJzKHQtZSk8LjAwMX1mdW5jdGlvbiB1KHQsZSl7dmFyIG49aSh0KSxyPWkoZSk7cmV0dXJue3g6bix5OnIsd2lkdGg6byh0KS1uLGhlaWdodDpvKGUpLXJ9fWZ1bmN0aW9uIGModCxlLG4scil7cmV0dXJue21pblg6aShbdCxuXSksbWF4WDpvKFt0LG5dKSxtaW5ZOmkoW2Uscl0pLG1heFk6byhbZSxyXSl9fWZ1bmN0aW9uIGYodCl7cmV0dXJuKHQrMipNYXRoLlBJKSUoMipNYXRoLlBJKX1uLnIociksbi5kKHIsXCJkaXN0YW5jZVwiLChmdW5jdGlvbigpe3JldHVybiBhfSkpLG4uZChyLFwiaXNOdW1iZXJFcXVhbFwiLChmdW5jdGlvbigpe3JldHVybiBzfSkpLG4uZChyLFwiZ2V0QkJveEJ5QXJyYXlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSxuLmQocixcImdldEJCb3hSYW5nZVwiLChmdW5jdGlvbigpe3JldHVybiBjfSkpLG4uZChyLFwicGlNb2RcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZn0pKTt2YXIgbD1uKDgyKSxoPXtib3g6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHUoW3Qsbl0sW2Uscl0pfSxsZW5ndGg6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGEodCxlLG4scil9LHBvaW50QXQ6ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm57eDooMS1pKSp0K2kqbix5OigxLWkpKmUraSpyfX0scG9pbnREaXN0YW5jZTpmdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIHM9KG4tdCkqKGktdCkrKHItZSkqKG8tZSk7cmV0dXJuIHM8MD9hKHQsZSxpLG8pOnM+KG4tdCkqKG4tdCkrKHItZSkqKHItZSk/YShuLHIsaSxvKTp0aGlzLnBvaW50VG9MaW5lKHQsZSxuLHIsaSxvKX0scG9pbnRUb0xpbmU6ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBhPVtuLXQsci1lXTtpZihsLmV4YWN0RXF1YWxzKGEsWzAsMF0pKXJldHVybiBNYXRoLnNxcnQoKGktdCkqKGktdCkrKG8tZSkqKG8tZSkpO3ZhciBzPVstYVsxXSxhWzBdXTtsLm5vcm1hbGl6ZShzLHMpO3ZhciB1PVtpLXQsby1lXTtyZXR1cm4gTWF0aC5hYnMobC5kb3QodSxzKSl9LHRhbmdlbnRBbmdsZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gTWF0aC5hdGFuMihyLWUsbi10KX19O2Z1bmN0aW9uIGQodCxlLG4scixpLG8pe3ZhciBzLHU9MS8wLGM9W24scl0sZj0yMDtvJiZvPjIwMCYmKGY9by8xMCk7Zm9yKHZhciBsPTEvZixoPWwvMTAsZD0wO2Q8PWY7ZCsrKXt2YXIgcD1kKmwsZz1baS5hcHBseShudWxsLHQuY29uY2F0KFtwXSkpLGkuYXBwbHkobnVsbCxlLmNvbmNhdChbcF0pKV07KGI9YShjWzBdLGNbMV0sZ1swXSxnWzFdKSk8dSYmKHM9cCx1PWIpfWlmKDA9PT1zKXJldHVybnt4OnRbMF0seTplWzBdfTtpZigxPT09cyl7dmFyIHY9dC5sZW5ndGg7cmV0dXJue3g6dFt2LTFdLHk6ZVt2LTFdfX11PTEvMDtmb3IoZD0wO2Q8MzImJiEoaDwxZS00KTtkKyspe3ZhciB5PXMtaCxtPXMraCxiPShnPVtpLmFwcGx5KG51bGwsdC5jb25jYXQoW3ldKSksaS5hcHBseShudWxsLGUuY29uY2F0KFt5XSkpXSxhKGNbMF0sY1sxXSxnWzBdLGdbMV0pKTtpZih5Pj0wJiZiPHUpcz15LHU9YjtlbHNle3ZhciB4PVtpLmFwcGx5KG51bGwsdC5jb25jYXQoW21dKSksaS5hcHBseShudWxsLGUuY29uY2F0KFttXSkpXSx3PWEoY1swXSxjWzFdLHhbMF0seFsxXSk7bTw9MSYmdzx1PyhzPW0sdT13KTpoKj0uNX19cmV0dXJue3g6aS5hcHBseShudWxsLHQuY29uY2F0KFtzXSkpLHk6aS5hcHBseShudWxsLGUuY29uY2F0KFtzXSkpfX1mdW5jdGlvbiBwKHQsZSxuLHIpe3ZhciBpPTEtcjtyZXR1cm4gaSppKnQrMipyKmkqZStyKnIqbn1mdW5jdGlvbiBnKHQsZSxuKXt2YXIgcj10K24tMiplO2lmKHMociwwKSlyZXR1cm5bLjVdO3ZhciBpPSh0LWUpL3I7cmV0dXJuIGk8PTEmJmk+PTA/W2ldOltdfWZ1bmN0aW9uIHYodCxlLG4scil7cmV0dXJuIDIqKDEtcikqKGUtdCkrMipyKihuLWUpfWZ1bmN0aW9uIHkodCxlLG4scixpLG8sYSl7dmFyIHM9cCh0LG4saSxhKSx1PXAoZSxyLG8sYSksYz1oLnBvaW50QXQodCxlLG4scixhKSxmPWgucG9pbnRBdChuLHIsaSxvLGEpO3JldHVybltbdCxlLGMueCxjLnkscyx1XSxbcyx1LGYueCxmLnksaSxvXV19dmFyIG09e2JveDpmdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGE9Zyh0LG4saSlbMF0scz1nKGUscixvKVswXSxjPVt0LGldLGY9W2Usb107cmV0dXJuIHZvaWQgMCE9PWEmJmMucHVzaChwKHQsbixpLGEpKSx2b2lkIDAhPT1zJiZmLnB1c2gocChlLHIsbyxzKSksdShjLGYpfSxsZW5ndGg6ZnVuY3Rpb24odCxlLG4scixpLG8pe3JldHVybiBmdW5jdGlvbiB0KGUsbixyLGksbyxzLHUpe2lmKDA9PT11KXJldHVybihhKGUsbixyLGkpK2EocixpLG8scykrYShlLG4sbyxzKSkvMjt2YXIgYz15KGUsbixyLGksbyxzLC41KSxmPWNbMF0sbD1jWzFdO3JldHVybiBmLnB1c2godS0xKSxsLnB1c2godS0xKSx0LmFwcGx5KG51bGwsZikrdC5hcHBseShudWxsLGwpfSh0LGUsbixyLGksbywzKX0sbmVhcmVzdFBvaW50OmZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEscyl7cmV0dXJuIGQoW3QsbixpXSxbZSxyLG9dLGEscyxwKX0scG9pbnREaXN0YW5jZTpmdW5jdGlvbih0LGUsbixyLGksbyxzLHUpe3ZhciBjPXRoaXMubmVhcmVzdFBvaW50KHQsZSxuLHIsaSxvLHMsdSk7cmV0dXJuIGEoYy54LGMueSxzLHUpfSxpbnRlcnBvbGF0aW9uQXQ6cCxwb2ludEF0OmZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEpe3JldHVybnt4OnAodCxuLGksYSkseTpwKGUscixvLGEpfX0sZGl2aWRlOmZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEpe3JldHVybiB5KHQsZSxuLHIsaSxvLGEpfSx0YW5nZW50QW5nbGU6ZnVuY3Rpb24odCxlLG4scixpLG8sYSl7dmFyIHM9dih0LG4saSxhKSx1PXYoZSxyLG8sYSk7cmV0dXJuIGYoTWF0aC5hdGFuMih1LHMpKX19O2Z1bmN0aW9uIGIodCxlLG4scixpKXt2YXIgbz0xLWk7cmV0dXJuIG8qbypvKnQrMyplKmkqbypvKzMqbippKmkqbytyKmkqaSppfWZ1bmN0aW9uIHgodCxlLG4scixpKXt2YXIgbz0xLWk7cmV0dXJuIDMqKG8qbyooZS10KSsyKm8qaSoobi1lKStpKmkqKHItbikpfWZ1bmN0aW9uIHcodCxlLG4scil7dmFyIGksbyxhLHU9LTMqdCs5KmUtOSpuKzMqcixjPTYqdC0xMiplKzYqbixmPTMqZS0zKnQsbD1bXTtpZihzKHUsMCkpcyhjLDApfHwoaT0tZi9jKT49MCYmaTw9MSYmbC5wdXNoKGkpO2Vsc2V7dmFyIGg9YypjLTQqdSpmO3MoaCwwKT9sLnB1c2goLWMvKDIqdSkpOmg+MCYmKG89KC1jLShhPU1hdGguc3FydChoKSkpLygyKnUpLChpPSgtYythKS8oMip1KSk+PTAmJmk8PTEmJmwucHVzaChpKSxvPj0wJiZvPD0xJiZsLnB1c2gobykpfXJldHVybiBsfWZ1bmN0aW9uIFModCxlLG4scixpLG8sYSxzLHUpe3ZhciBjPWIodCxuLGksYSx1KSxmPWIoZSxyLG8scyx1KSxsPWgucG9pbnRBdCh0LGUsbixyLHUpLGQ9aC5wb2ludEF0KG4scixpLG8sdSkscD1oLnBvaW50QXQoaSxvLGEscyx1KSxnPWgucG9pbnRBdChsLngsbC55LGQueCxkLnksdSksdj1oLnBvaW50QXQoZC54LGQueSxwLngscC55LHUpO3JldHVybltbdCxlLGwueCxsLnksZy54LGcueSxjLGZdLFtjLGYsdi54LHYueSxwLngscC55LGEsc11dfWZ1bmN0aW9uIEUodCxlLG4scixpLG8scyx1LGMpe2lmKDA9PT1jKXJldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGgsaT0wO2k8cjtpKyspe24rPWEodFtpXSxlW2ldLHRbKGkrMSklcl0sZVsoaSsxKSVyXSl9cmV0dXJuIG4vMn0oW3QsbixpLHNdLFtlLHIsbyx1XSk7dmFyIGY9Uyh0LGUsbixyLGksbyxzLHUsLjUpLGw9ZlswXSxoPWZbMV07cmV0dXJuIGwucHVzaChjLTEpLGgucHVzaChjLTEpLEUuYXBwbHkobnVsbCxsKStFLmFwcGx5KG51bGwsaCl9dmFyIF89e2V4dHJlbWE6dyxib3g6ZnVuY3Rpb24odCxlLG4scixpLG8sYSxzKXtmb3IodmFyIGM9W3QsYV0sZj1bZSxzXSxsPXcodCxuLGksYSksaD13KGUscixvLHMpLGQ9MDtkPGwubGVuZ3RoO2QrKyljLnB1c2goYih0LG4saSxhLGxbZF0pKTtmb3IoZD0wO2Q8aC5sZW5ndGg7ZCsrKWYucHVzaChiKGUscixvLHMsaFtkXSkpO3JldHVybiB1KGMsZil9LGxlbmd0aDpmdW5jdGlvbih0LGUsbixyLGksbyxhLHMpe3JldHVybiBFKHQsZSxuLHIsaSxvLGEscywzKX0sbmVhcmVzdFBvaW50OmZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEscyx1LGMsZil7cmV0dXJuIGQoW3QsbixpLGFdLFtlLHIsbyxzXSx1LGMsYixmKX0scG9pbnREaXN0YW5jZTpmdW5jdGlvbih0LGUsbixyLGksbyxzLHUsYyxmLGwpe3ZhciBoPXRoaXMubmVhcmVzdFBvaW50KHQsZSxuLHIsaSxvLHMsdSxjLGYsbCk7cmV0dXJuIGEoaC54LGgueSxjLGYpfSxpbnRlcnBvbGF0aW9uQXQ6Yixwb2ludEF0OmZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEscyx1KXtyZXR1cm57eDpiKHQsbixpLGEsdSkseTpiKGUscixvLHMsdSl9fSxkaXZpZGU6ZnVuY3Rpb24odCxlLG4scixpLG8sYSxzLHUpe3JldHVybiBTKHQsZSxuLHIsaSxvLGEscyx1KX0sdGFuZ2VudEFuZ2xlOmZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEscyx1KXt2YXIgYz14KHQsbixpLGEsdSksbD14KGUscixvLHMsdSk7cmV0dXJuIGYoTWF0aC5hdGFuMihsLGMpKX19O2Z1bmN0aW9uIE8odCxlKXt2YXIgbj1NYXRoLmFicyh0KTtyZXR1cm4gZT4wP246LTEqbn12YXIgaz1mdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGE9bixzPXI7aWYoMD09PWF8fDA9PT1zKXJldHVybnt4OnQseTplfTtmb3IodmFyIHUsYyxmPWktdCxsPW8tZSxoPU1hdGguYWJzKGYpLGQ9TWF0aC5hYnMobCkscD1hKmEsZz1zKnMsdj1NYXRoLlBJLzQseT0wO3k8NDt5Kyspe3U9YSpNYXRoLmNvcyh2KSxjPXMqTWF0aC5zaW4odik7dmFyIG09KHAtZykqTWF0aC5wb3coTWF0aC5jb3ModiksMykvYSxiPShnLXApKk1hdGgucG93KE1hdGguc2luKHYpLDMpL3MseD11LW0sdz1jLWIsUz1oLW0sRT1kLWIsXz1NYXRoLmh5cG90KHcseCksaz1NYXRoLmh5cG90KEUsUyk7dis9XypNYXRoLmFzaW4oKHgqRS13KlMpLyhfKmspKS9NYXRoLnNxcnQocCtnLXUqdS1jKmMpLHY9TWF0aC5taW4oTWF0aC5QSS8yLE1hdGgubWF4KDAsdikpfXJldHVybnt4OnQrTyh1LGYpLHk6ZStPKGMsbCl9fTtmdW5jdGlvbiBNKHQsZSxuLHIsaSxvKXtyZXR1cm4gbipNYXRoLmNvcyhpKSpNYXRoLmNvcyhvKS1yKk1hdGguc2luKGkpKk1hdGguc2luKG8pK3R9ZnVuY3Rpb24gQSh0LGUsbixyLGksbyl7cmV0dXJuIG4qTWF0aC5zaW4oaSkqTWF0aC5jb3MobykrcipNYXRoLmNvcyhpKSpNYXRoLnNpbihvKStlfWZ1bmN0aW9uIFQodCxlLG4pe3JldHVybnt4OnQqTWF0aC5jb3MobikseTplKk1hdGguc2luKG4pfX1mdW5jdGlvbiBDKHQsZSxuKXt2YXIgcj1NYXRoLmNvcyhuKSxpPU1hdGguc2luKG4pO3JldHVyblt0KnItZSppLHQqaStlKnJdfXZhciBJPXtib3g6ZnVuY3Rpb24odCxlLG4scixpLG8sYSl7Zm9yKHZhciBzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hdGFuKC1lL3QqTWF0aC50YW4obikpfShuLHIsaSksdT0xLzAsYz0tMS8wLGY9W28sYV0sbD0yKi1NYXRoLlBJO2w8PTIqTWF0aC5QSTtsKz1NYXRoLlBJKXt2YXIgaD1zK2w7bzxhP288aCYmaDxhJiZmLnB1c2goaCk6YTxoJiZoPG8mJmYucHVzaChoKX1mb3IobD0wO2w8Zi5sZW5ndGg7bCsrKXt2YXIgZD1NKHQsMCxuLHIsaSxmW2xdKTtkPHUmJih1PWQpLGQ+YyYmKGM9ZCl9dmFyIHA9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLmF0YW4oZS8odCpNYXRoLnRhbihuKSkpfShuLHIsaSksZz0xLzAsdj0tMS8wLHk9W28sYV07Zm9yKGw9MiotTWF0aC5QSTtsPD0yKk1hdGguUEk7bCs9TWF0aC5QSSl7dmFyIG09cCtsO288YT9vPG0mJm08YSYmeS5wdXNoKG0pOmE8bSYmbTxvJiZ5LnB1c2gobSl9Zm9yKGw9MDtsPHkubGVuZ3RoO2wrKyl7dmFyIGI9QSgwLGUsbixyLGkseVtsXSk7YjxnJiYoZz1iKSxiPnYmJih2PWIpfXJldHVybnt4OnUseTpnLHdpZHRoOmMtdSxoZWlnaHQ6di1nfX0sbGVuZ3RoOmZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEpe30sbmVhcmVzdFBvaW50OmZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEscyx1KXt2YXIgYz1DKHMtdCx1LWUsLWkpLGY9Y1swXSxsPWNbMV0saD1rKDAsMCxuLHIsZixsKSxkPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihNYXRoLmF0YW4yKHIqdCxuKmUpKzIqTWF0aC5QSSklKDIqTWF0aC5QSSl9KG4scixoLngsaC55KTtkPG8/aD1UKG4scixvKTpkPmEmJihoPVQobixyLGEpKTt2YXIgcD1DKGgueCxoLnksaSk7cmV0dXJue3g6cFswXSt0LHk6cFsxXStlfX0scG9pbnREaXN0YW5jZTpmdW5jdGlvbih0LGUsbixyLGksbyxzLHUsYyl7dmFyIGY9dGhpcy5uZWFyZXN0UG9pbnQodCxlLG4scix1LGMpO3JldHVybiBhKGYueCxmLnksdSxjKX0scG9pbnRBdDpmdW5jdGlvbih0LGUsbixyLGksbyxhLHMpe3ZhciB1PShhLW8pKnMrbztyZXR1cm57eDpNKHQsMCxuLHIsaSx1KSx5OkEoMCxlLG4scixpLHUpfX0sdGFuZ2VudEFuZ2xlOmZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEscyl7dmFyIHU9KGEtbykqcytvLGM9ZnVuY3Rpb24odCxlLG4scixpLG8sYSxzKXtyZXR1cm4tMSpuKk1hdGguY29zKGkpKk1hdGguc2luKHMpLXIqTWF0aC5zaW4oaSkqTWF0aC5jb3Mocyl9KDAsMCxuLHIsaSwwLDAsdSksbD1mdW5jdGlvbih0LGUsbixyLGksbyxhLHMpe3JldHVybi0xKm4qTWF0aC5zaW4oaSkqTWF0aC5zaW4ocykrcipNYXRoLmNvcyhpKSpNYXRoLmNvcyhzKX0oMCwwLG4scixpLDAsMCx1KTtyZXR1cm4gZihNYXRoLmF0YW4yKGwsYykpfX07ZnVuY3Rpb24gUCh0KXtmb3IodmFyIGU9MCxuPVtdLHI9MDtyPHQubGVuZ3RoLTE7cisrKXt2YXIgaT10W3JdLG89dFtyKzFdLHM9YShpWzBdLGlbMV0sb1swXSxvWzFdKSx1PXtmcm9tOmksdG86byxsZW5ndGg6c307bi5wdXNoKHUpLGUrPXN9cmV0dXJue3NlZ21lbnRzOm4sdG90YWxMZW5ndGg6ZX19ZnVuY3Rpb24gaih0KXtpZih0Lmxlbmd0aDwyKXJldHVybiAwO2Zvcih2YXIgZT0wLG49MDtuPHQubGVuZ3RoLTE7bisrKXt2YXIgcj10W25dLGk9dFtuKzFdO2UrPWEoclswXSxyWzFdLGlbMF0saVsxXSl9cmV0dXJuIGV9ZnVuY3Rpb24gRCh0LGUpe2lmKGU+MXx8ZTwwfHx0Lmxlbmd0aDwyKXJldHVybiBudWxsO3ZhciBuPVAodCkscj1uLnNlZ21lbnRzLGk9bi50b3RhbExlbmd0aDtpZigwPT09aSlyZXR1cm57eDp0WzBdWzBdLHk6dFswXVsxXX07Zm9yKHZhciBvPTAsYT1udWxsLHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIHU9cltzXSxjPXUuZnJvbSxmPXUudG8sbD11Lmxlbmd0aC9pO2lmKGU+PW8mJmU8PW8rbCl7dmFyIGQ9KGUtbykvbDthPWgucG9pbnRBdChjWzBdLGNbMV0sZlswXSxmWzFdLGQpO2JyZWFrfW8rPWx9cmV0dXJuIGF9ZnVuY3Rpb24gTih0LGUpe2lmKGU+MXx8ZTwwfHx0Lmxlbmd0aDwyKXJldHVybiAwO2Zvcih2YXIgbj1QKHQpLHI9bi5zZWdtZW50cyxpPW4udG90YWxMZW5ndGgsbz0wLGE9MCxzPTA7czxyLmxlbmd0aDtzKyspe3ZhciB1PXJbc10sYz11LmZyb20sZj11LnRvLGw9dS5sZW5ndGgvaTtpZihlPj1vJiZlPD1vK2wpe2E9TWF0aC5hdGFuMihmWzFdLWNbMV0sZlswXS1jWzBdKTticmVha31vKz1sfXJldHVybiBhfWZ1bmN0aW9uIFIodCxlLG4pe2Zvcih2YXIgcj0xLzAsaT0wO2k8dC5sZW5ndGgtMTtpKyspe3ZhciBvPXRbaV0sYT10W2krMV0scz1oLnBvaW50RGlzdGFuY2Uob1swXSxvWzFdLGFbMF0sYVsxXSxlLG4pO3M8ciYmKHI9cyl9cmV0dXJuIHJ9dmFyIEw9e2JveDpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj1bXSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBpPXRbcl07ZS5wdXNoKGlbMF0pLG4ucHVzaChpWzFdKX1yZXR1cm4gdShlLG4pfSxsZW5ndGg6ZnVuY3Rpb24odCl7cmV0dXJuIGoodCl9LHBvaW50QXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gRCh0LGUpfSxwb2ludERpc3RhbmNlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUih0LGUsbil9LHRhbmdlbnRBbmdsZTpmdW5jdGlvbih0LGUpe3JldHVybiBOKHQsZSl9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oNTIpO24uZChlLFwiUGF0aFV0aWxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcn0pKTtuKDE3MSksbigxNzIpO3ZhciBpPW4oMTE2KTtuLmQoZSxcIkV2ZW50XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGkuYX0pKTtuKDExNyk7dmFyIG89bigyNjUpO24uZChlLFwiQWJzdHJhY3RDYW52YXNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gby5hfSkpO3ZhciBhPW4oMTc0KTtuLmQoZSxcIkFic3RyYWN0R3JvdXBcIiwoZnVuY3Rpb24oKXtyZXR1cm4gYS5hfSkpO3ZhciBzPW4oMTc1KTtuLmQoZSxcIkFic3RyYWN0U2hhcGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcy5hfSkpO3ZhciB1PW4oMjY2KTtuLmQoZSxcImdldEJCb3hNZXRob2RcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdS5hfSkpO3ZhciBjPW4oNjkpO24uZChlLFwiZ2V0VGV4dEhlaWdodFwiLChmdW5jdGlvbigpe3JldHVybiBjLmJ9KSksbi5kKGUsXCJhc3NlbWJsZUZvbnRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gYy5hfSkpO3ZhciBmPW4oMTkpO24uZChlLFwiaXNBbGxvd0NhcHR1cmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZi5ifSkpO3ZhciBsPW4oMzkpO24uZChlLFwibXVsdGlwbHlWZWMyXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGwuY30pKSxuLmQoZSxcImludmVydFwiLChmdW5jdGlvbigpe3JldHVybiBsLmF9KSk7dmFyIGg9bigxMTgpO24uZChlLFwiZ2V0T2ZmU2NyZWVuQ29udGV4dFwiLChmdW5jdGlvbigpe3JldHVybiBoLmF9KSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDkyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJnIodCxlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkzKSxpPW4oMjIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiFlfHxcIm9iamVjdFwiIT09cihlKSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZT9pKHQpOmV9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJiXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSksbi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSksbi5kKGUsXCJkXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSksbi5kKGUsXCJjXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSk7dmFyIHI9bigwKSxpPW4oMTUpO2Z1bmN0aW9uIG8odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsdCl9ZnVuY3Rpb24gYSh0KXt2YXIgZT1pLmFbdC50eXBlXSxuPXQuZ2V0UGFyZW50KCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKFwidGhlIHR5cGUgXCIrdC50eXBlK1wiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgc3ZnXCIpO3ZhciByPW8oZSk7aWYodC5nZXQoXCJpZFwiKSYmKHIuaWQ9dC5nZXQoXCJpZFwiKSksdC5zZXQoXCJlbFwiLHIpLHQuc2V0KFwiYXR0cnNcIix7fSksbil7dmFyIGE9bi5nZXQoXCJlbFwiKTthfHwoYT1uLmNyZWF0ZURvbSgpLG4uc2V0KFwiZWxcIixhKSksYS5hcHBlbmRDaGlsZChyKX1yZXR1cm4gcn1mdW5jdGlvbiBzKHQsZSl7dmFyIG49dC5nZXQoXCJlbFwiKSxpPU9iamVjdChyLkYpKG4uY2hpbGRyZW4pLnNvcnQoZSksbz1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aS5mb3JFYWNoKChmdW5jdGlvbih0KXtvLmFwcGVuZENoaWxkKHQpfSkpLG4uYXBwZW5kQ2hpbGQobyl9ZnVuY3Rpb24gdSh0LGUpe3ZhciBuPXQucGFyZW50Tm9kZSxyPUFycmF5LmZyb20obi5jaGlsZE5vZGVzKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5ub2RlVHlwZSYmXCJkZWZzXCIhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9KSksaT1yW2VdLG89ci5pbmRleE9mKHQpO2lmKGkpe2lmKG8+ZSluLmluc2VydEJlZm9yZSh0LGkpO2Vsc2UgaWYobzxlKXt2YXIgYT1yW2UrMV07YT9uLmluc2VydEJlZm9yZSh0LGEpOm4uYXBwZW5kQ2hpbGQodCl9fWVsc2Ugbi5hcHBlbmRDaGlsZCh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ5NCksaT1uKDQ5NSksbz1uKDIzMyksYT1uKDQ5Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByKHQpfHxpKHQpfHxvKHQpfHxhKCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI7dHJ5e3I9e2Nsb25lRGVlcDpuKDQwMSksY29uc3RhbnQ6bigxNTIpLGRlZmF1bHRzOm4oNDAyKSxlYWNoOm4oMTk2KSxmaWx0ZXI6bigxOTkpLGZpbmQ6big0MDMpLGZsYXR0ZW46bigyMjcpLGZvckVhY2g6bigxOTcpLGZvckluOm4oNDEwKSxoYXM6bigyMTApLGlzVW5kZWZpbmVkOm4oMjExKSxsYXN0Om4oNDExKSxtYXA6bigyMTIpLG1hcFZhbHVlczpuKDQxMiksbWF4Om4oNDEzKSxtZXJnZTpuKDQxNSksbWluOm4oNDIwKSxtaW5CeTpuKDQyMSksbm93Om4oNDIyKSxwaWNrOm4oNDIzKSxyYW5nZTpuKDQyOCkscmVkdWNlOm4oMjE0KSxzb3J0Qnk6big0MzEpLHVuaXF1ZUlkOm4oNDM2KSx2YWx1ZXM6bigyMjApLHppcE9iamVjdDpuKDQzNyl9fWNhdGNoKHQpe31yfHwocj13aW5kb3cuXyksdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKFwiRGVjb3JhdGluZyBjbGFzcyBwcm9wZXJ0eSBmYWlsZWQuIFBsZWFzZSBlbnN1cmUgdGhhdCBwcm9wb3NhbC1jbGFzcy1wcm9wZXJ0aWVzIGlzIGVuYWJsZWQgYW5kIHJ1bnMgYWZ0ZXIgdGhlIGRlY29yYXRvcnMgdHJhbnNmb3JtLlwiKX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49QXJyYXkuaXNBcnJheTt0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiBjfSkpLG4uZChlLFwiZFwiLChmdW5jdGlvbigpe3JldHVybiBmfSkpLG4uZChlLFwiYlwiLChmdW5jdGlvbigpe3JldHVybiBsfSkpLG4uZChlLFwiY1wiLChmdW5jdGlvbigpe3JldHVybiBofSkpLG4uZChlLFwiZVwiLChmdW5jdGlvbigpe3JldHVybiBnfSkpLG4uZChlLFwiaFwiLChmdW5jdGlvbigpe3JldHVybiB2fSkpLG4uZChlLFwiZlwiLChmdW5jdGlvbigpe3JldHVybiB5fSkpLG4uZChlLFwiZ1wiLChmdW5jdGlvbigpe3JldHVybiBtfSkpO3ZhciByPW4oMCksaT1uKDE0MCksbz1uKDkyKSxhPW4oMTYpLHM9bigzMyksdT17ZmlsbDpcImZpbGxTdHlsZVwiLHN0cm9rZTpcInN0cm9rZVN0eWxlXCIsb3BhY2l0eTpcImdsb2JhbEFscGhhXCJ9O2Z1bmN0aW9uIGModCxlKXt2YXIgbj1lLmF0dHIoKTtmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXSxzPXVbb10/dVtvXTpvO1wibWF0cml4XCI9PT1zJiZhP3QudHJhbnNmb3JtKGFbMF0sYVsxXSxhWzNdLGFbNF0sYVs2XSxhWzddKTpcImxpbmVEYXNoXCI9PT1zJiZ0LnNldExpbmVEYXNoP09iamVjdChyLm0pKGEpJiZ0LnNldExpbmVEYXNoKGEpOihcInN0cm9rZVN0eWxlXCI9PT1zfHxcImZpbGxTdHlsZVwiPT09cz9hPU9iamVjdChpLmIpKHQsZSxhKTpcImdsb2JhbEFscGhhXCI9PT1zJiYoYSo9dC5nbG9iYWxBbHBoYSksdFtzXT1hKX19ZnVuY3Rpb24gZih0LGUsbil7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aS5jZmcudmlzaWJsZT9pLmRyYXcodCxuKTppLnNraXBEcmF3KCl9fWZ1bmN0aW9uIGwodCxlLG4pe3ZhciBpPXQuZ2V0KFwicmVmcmVzaEVsZW1lbnRzXCIpO09iamVjdChyLmYpKGksKGZ1bmN0aW9uKGUpe2lmKGUhPT10KWZvcih2YXIgbj1lLmNmZy5wYXJlbnQ7biYmbiE9PXQmJiFuLmNmZy5yZWZyZXNoOyluLmNmZy5yZWZyZXNoPSEwLG49bi5jZmcucGFyZW50fSkpLGlbMF09PT10P2QoZSxuKTpmdW5jdGlvbiB0KGUsbil7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aWYoaS5jZmcudmlzaWJsZSlpZihpLmNmZy5oYXNDaGFuZ2VkKWkuY2ZnLnJlZnJlc2g9ITAsaS5pc0dyb3VwKCkmJmQoaS5jZmcuY2hpbGRyZW4sbik7ZWxzZSBpZihpLmNmZy5yZWZyZXNoKWkuaXNHcm91cCgpJiZ0KGkuY2ZnLmNoaWxkcmVuLG4pO2Vsc2V7dmFyIG89cChpLG4pO2kuY2ZnLnJlZnJlc2g9byxvJiZpLmlzR3JvdXAoKSYmdChpLmNmZy5jaGlsZHJlbixuKX19fShlLG4pfWZ1bmN0aW9uIGgodCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV07bi5jZmcuaGFzQ2hhbmdlZD0hMSxuLmlzR3JvdXAoKSYmIW4uZGVzdHJveWVkJiZoKG4uY2ZnLmNoaWxkcmVuKX19ZnVuY3Rpb24gZCh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuY2ZnLnJlZnJlc2g9ITAsci5pc0dyb3VwKCkmJmQoci5nZXQoXCJjaGlsZHJlblwiKSxlKX19ZnVuY3Rpb24gcCh0LGUpe3ZhciBuPXQuY2ZnLmNhY2hlQ2FudmFzQkJveDtyZXR1cm4gdC5jZmcuaXNJblZpZXcmJm4mJk9iamVjdChhLmYpKG4sZSl9ZnVuY3Rpb24gZyh0LGUsbixyKXt2YXIgaT1uLnBhdGgsYT1uLnN0YXJ0QXJyb3csdT1uLmVuZEFycm93O2lmKGkpe3ZhciBjPVswLDBdLGY9WzAsMF0sbD17ZHg6MCxkeTowfTtlLmJlZ2luUGF0aCgpO2Zvcih2YXIgaD0wO2g8aS5sZW5ndGg7aCsrKXt2YXIgZD1pW2hdLHA9ZFswXTtpZigwPT09aCYmYSYmYS5kKXt2YXIgZz10LmdldFN0YXJ0VGFuZ2VudCgpO2w9cy5jKGdbMF1bMF0sZ1swXVsxXSxnWzFdWzBdLGdbMV1bMV0sYS5kKX1lbHNlIGlmKGg9PT1pLmxlbmd0aC0yJiZcIlpcIj09PWlbaCsxXVswXSYmdSYmdS5kKXtpZihcIlpcIj09PWlbaCsxXVswXSl7Zz10LmdldEVuZFRhbmdlbnQoKTtsPXMuYyhnWzBdWzBdLGdbMF1bMV0sZ1sxXVswXSxnWzFdWzFdLHUuZCl9fWVsc2UgaWYoaD09PWkubGVuZ3RoLTEmJnUmJnUuZCYmXCJaXCIhPT1pWzBdKXtnPXQuZ2V0RW5kVGFuZ2VudCgpO2w9cy5jKGdbMF1bMF0sZ1swXVsxXSxnWzFdWzBdLGdbMV1bMV0sdS5kKX12YXIgdj1sLmR4LHk9bC5keTtzd2l0Y2gocCl7Y2FzZVwiTVwiOmUubW92ZVRvKGRbMV0tdixkWzJdLXkpLGY9W2RbMV0sZFsyXV07YnJlYWs7Y2FzZVwiTFwiOmUubGluZVRvKGRbMV0tdixkWzJdLXkpO2JyZWFrO2Nhc2VcIlFcIjplLnF1YWRyYXRpY0N1cnZlVG8oZFsxXSxkWzJdLGRbM10tdixkWzRdLXkpO2JyZWFrO2Nhc2VcIkNcIjplLmJlemllckN1cnZlVG8oZFsxXSxkWzJdLGRbM10sZFs0XSxkWzVdLXYsZFs2XS15KTticmVhaztjYXNlXCJBXCI6dmFyIG09dm9pZCAwO3I/KG09cltoXSl8fChtPU9iamVjdChvLmEpKGMsZCkscltoXT1tKTptPU9iamVjdChvLmEpKGMsZCk7dmFyIGI9bS5jeCx4PW0uY3ksdz1tLnJ4LFM9bS5yeSxFPW0uc3RhcnRBbmdsZSxfPW0uZW5kQW5nbGUsTz1tLnhSb3RhdGlvbixrPW0uc3dlZXBGbGFnO2lmKGUuZWxsaXBzZSllLmVsbGlwc2UoYix4LHcsUyxPLEUsXywxLWspO2Vsc2V7dmFyIE09dz5TP3c6UyxBPXc+Uz8xOncvUyxUPXc+Uz9TL3c6MTtlLnRyYW5zbGF0ZShiLHgpLGUucm90YXRlKE8pLGUuc2NhbGUoQSxUKSxlLmFyYygwLDAsTSxFLF8sMS1rKSxlLnNjYWxlKDEvQSwxL1QpLGUucm90YXRlKC1PKSxlLnRyYW5zbGF0ZSgtYiwteCl9YnJlYWs7Y2FzZVwiWlwiOmUuY2xvc2VQYXRoKCl9aWYoXCJaXCI9PT1wKWM9ZjtlbHNle3ZhciBDPWQubGVuZ3RoO2M9W2RbQy0yXSxkW0MtMV1dfX19fWZ1bmN0aW9uIHYodCxlKXt2YXIgbj10LmdldChcImNhbnZhc1wiKTtuJiYoXCJyZW1vdmVcIj09PWUmJih0Ll9jYWNoZUNhbnZhc0JCb3g9dC5nZXQoXCJjYWNoZUNhbnZhc0JCb3hcIikpLHQuZ2V0KFwiaGFzQ2hhbmdlZFwiKXx8KHQuc2V0KFwiaGFzQ2hhbmdlZFwiLCEwKSx0LmNmZy5wYXJlbnQmJnQuY2ZnLnBhcmVudC5nZXQoXCJoYXNDaGFuZ2VkXCIpfHwobi5yZWZyZXNoRWxlbWVudCh0LGUsbiksbi5nZXQoXCJhdXRvRHJhd1wiKSYmbi5kcmF3KCkpKSl9ZnVuY3Rpb24geSh0KXtpZighdC5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGU9W10sbj1bXSxpPVtdLG89W107cmV0dXJuIE9iamVjdChyLmYpKHQsKGZ1bmN0aW9uKHQpe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKHQuZGVzdHJveWVkKWU9dC5fY2FjaGVDYW52YXNCQm94O2Vsc2V7dmFyIG49dC5nZXQoXCJjYWNoZUNhbnZhc0JCb3hcIikscj1uJiYhKCFuLndpZHRofHwhbi5oZWlnaHQpLGk9dC5nZXRDYW52YXNCQm94KCksbz1pJiYhKCFpLndpZHRofHwhaS5oZWlnaHQpO3ImJm8/ZT1PYmplY3QoYS5sKShuLGkpOnI/ZT1uOm8mJihlPWkpfXJldHVybiBlfSh0KTtyJiYoZS5wdXNoKHIubWluWCksbi5wdXNoKHIubWluWSksaS5wdXNoKHIubWF4WCksby5wdXNoKHIubWF4WSkpfSkpLHttaW5YOk1hdGgubWluLmFwcGx5KG51bGwsZSksbWluWTpNYXRoLm1pbi5hcHBseShudWxsLG4pLG1heFg6TWF0aC5tYXguYXBwbHkobnVsbCxpKSxtYXhZOk1hdGgubWF4LmFwcGx5KG51bGwsbyl9fWZ1bmN0aW9uIG0odCxlKXtyZXR1cm4gdCYmZSYmT2JqZWN0KGEuZikodCxlKT97bWluWDpNYXRoLm1heCh0Lm1pblgsZS5taW5YKSxtaW5ZOk1hdGgubWF4KHQubWluWSxlLm1pblkpLG1heFg6TWF0aC5taW4odC5tYXhYLGUubWF4WCksbWF4WTpNYXRoLm1pbih0Lm1heFksZS5tYXhZKX06bnVsbH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLlBPU1RfQ09OU1RSVUNUPWUuREVTSUdOX1BBUkFNX1RZUEVTPWUuUEFSQU1fVFlQRVM9ZS5UQUdHRURfUFJPUD1lLlRBR0dFRD1lLk1VTFRJX0lOSkVDVF9UQUc9ZS5JTkpFQ1RfVEFHPWUuT1BUSU9OQUxfVEFHPWUuVU5NQU5BR0VEX1RBRz1lLk5BTUVfVEFHPWUuTkFNRURfVEFHPXZvaWQgMCxlLk5BTUVEX1RBRz1cIm5hbWVkXCIsZS5OQU1FX1RBRz1cIm5hbWVcIixlLlVOTUFOQUdFRF9UQUc9XCJ1bm1hbmFnZWRcIixlLk9QVElPTkFMX1RBRz1cIm9wdGlvbmFsXCIsZS5JTkpFQ1RfVEFHPVwiaW5qZWN0XCIsZS5NVUxUSV9JTkpFQ1RfVEFHPVwibXVsdGlfaW5qZWN0XCIsZS5UQUdHRUQ9XCJpbnZlcnNpZnk6dGFnZ2VkXCIsZS5UQUdHRURfUFJPUD1cImludmVyc2lmeTp0YWdnZWRfcHJvcHNcIixlLlBBUkFNX1RZUEVTPVwiaW52ZXJzaWZ5OnBhcmFtdHlwZXNcIixlLkRFU0lHTl9QQVJBTV9UWVBFUz1cImRlc2lnbjpwYXJhbXR5cGVzXCIsZS5QT1NUX0NPTlNUUlVDVD1cInBvc3RfY29uc3RydWN0XCJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyMyksaT1uKDEwNSksbz1uKDE0NyksYT1vJiZvLmlzVHlwZWRBcnJheSxzPWE/aShhKTpyO3QuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJjXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSksbi5kKGUsXCJiXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGR9KSksbi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSk7dmFyIHI9bigxKSxpPW4oNTcpO2Z1bmN0aW9uIG8odCl7cmV0dXJuKG89XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfXZhciBhPU1hdGguc2luLHM9TWF0aC5jb3MsdT1NYXRoLmF0YW4yLGM9TWF0aC5QSTtmdW5jdGlvbiBmKHQsZSxuLHIsbyxmLGwpe3ZhciBoPWUuc3Ryb2tlLGQ9ZS5saW5lV2lkdGgscD11KHItZixuLW8pLGc9bmV3IGkuUGF0aCh7dHlwZTpcInBhdGhcIixjYW52YXM6dC5nZXQoXCJjYW52YXNcIiksaXNBcnJvd1NoYXBlOiEwLGF0dHJzOntwYXRoOlwiTVwiKzEwKnMoYy82KStcIixcIisxMCphKGMvNikrXCIgTDAsMCBMXCIrMTAqcyhjLzYpK1wiLC1cIisxMCphKGMvNiksc3Ryb2tlOmgsbGluZVdpZHRoOmR9fSk7Zy50cmFuc2xhdGUobyxmKSxnLnJvdGF0ZUF0UG9pbnQobyxmLHApLHQuc2V0KGw/XCJzdGFydEFycm93U2hhcGVcIjpcImVuZEFycm93U2hhcGVcIixnKX1mdW5jdGlvbiBsKHQsZSxuLG8sYyxmLGwpe3ZhciBoPWUuc3RhcnRBcnJvdyxkPWUuZW5kQXJyb3cscD1lLnN0cm9rZSxnPWUubGluZVdpZHRoLHY9bD9oOmQseT12LmQsbT12LmZpbGwsYj12LnN0cm9rZSx4PXYubGluZVdpZHRoLHc9T2JqZWN0KHIuYykodixbXCJkXCIsXCJmaWxsXCIsXCJzdHJva2VcIixcImxpbmVXaWR0aFwiXSksUz11KG8tZixuLWMpO3kmJihjLT1zKFMpKnksZi09YShTKSp5KTt2YXIgRT1uZXcgaS5QYXRoKHt0eXBlOlwicGF0aFwiLGNhbnZhczp0LmdldChcImNhbnZhc1wiKSxpc0Fycm93U2hhcGU6ITAsYXR0cnM6T2JqZWN0KHIuYSkoT2JqZWN0KHIuYSkoe30sdykse3N0cm9rZTpifHxwLGxpbmVXaWR0aDp4fHxnLGZpbGw6bX0pfSk7RS50cmFuc2xhdGUoYyxmKSxFLnJvdGF0ZUF0UG9pbnQoYyxmLFMpLHQuc2V0KGw/XCJzdGFydEFycm93U2hhcGVcIjpcImVuZEFycm93U2hhcGVcIixFKX1mdW5jdGlvbiBoKHQsZSxuLHIsaSl7dmFyIG89dShyLWUsbi10KTtyZXR1cm57ZHg6cyhvKSppLGR5OmEobykqaX19ZnVuY3Rpb24gZCh0LGUsbixyLGksYSl7XCJvYmplY3RcIj09PW8oZS5zdGFydEFycm93KT9sKHQsZSxuLHIsaSxhLCEwKTplLnN0YXJ0QXJyb3c/Zih0LGUsbixyLGksYSwhMCk6dC5zZXQoXCJzdGFydEFycm93U2hhcGVcIixudWxsKX1mdW5jdGlvbiBwKHQsZSxuLHIsaSxhKXtcIm9iamVjdFwiPT09byhlLmVuZEFycm93KT9sKHQsZSxuLHIsaSxhLCExKTplLmVuZEFycm93P2YodCxlLG4scixpLGEsITEpOnQuc2V0KFwic3RhcnRBcnJvd1NoYXBlXCIsbnVsbCl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJiXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSksbi5kKGUsXCJjXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSksbi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSk7dmFyIHI9bigyNSk7ZnVuY3Rpb24gaSh0LGUpe3ZhciBuPXQuY2ZnLmVsLHI9dC5hdHRyKCksaT17ZHg6ci5zaGFkb3dPZmZzZXRYLGR5OnIuc2hhZG93T2Zmc2V0WSxibHVyOnIuc2hhZG93Qmx1cixjb2xvcjpyLnNoYWRvd0NvbG9yfTtpZihpLmR4fHxpLmR5fHxpLmJsdXJ8fGkuY29sb3Ipe3ZhciBvPWUuZmluZChcImZpbHRlclwiLGkpO298fChvPWUuYWRkU2hhZG93KGkpKSxuLnNldEF0dHJpYnV0ZShcImZpbHRlclwiLFwidXJsKCNcIitvK1wiKVwiKX1lbHNlIG4ucmVtb3ZlQXR0cmlidXRlKFwiZmlsdGVyXCIpfWZ1bmN0aW9uIG8odCl7dmFyIGU9dC5hdHRyKCkubWF0cml4O2lmKGUpe2Zvcih2YXIgbj10LmNmZy5lbCxyPVtdLGk9MDtpPDk7aSs9MylyLnB1c2goZVtpXStcIixcIitlW2krMV0pOy0xPT09KHI9ci5qb2luKFwiLFwiKSkuaW5kZXhPZihcIk5hTlwiKT9uLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLFwibWF0cml4KFwiK3IrXCIpXCIpOmNvbnNvbGUud2FybihcImludmFsaWQgbWF0cml4OlwiLGUpfX1mdW5jdGlvbiBhKHQsZSl7dmFyIG49dC5nZXRDbGlwKCksaT10LmdldChcImVsXCIpO2lmKG4pe2lmKG4mJiFpLmhhc0F0dHJpYnV0ZShcImNsaXAtcGF0aFwiKSl7T2JqZWN0KHIuYSkobiksbi5jcmVhdGVQYXRoKGUpO3ZhciBvPWUuYWRkQ2xpcChuKTtpLnNldEF0dHJpYnV0ZShcImNsaXAtcGF0aFwiLFwidXJsKCNcIitvK1wiKVwiKX19ZWxzZSBpLnJlbW92ZUF0dHJpYnV0ZShcImNsaXAtcGF0aFwiKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaH0pKSxuLmQoZSxcImJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZH0pKTt2YXIgcj1uKDkpLGk9bi5uKHIpLG89bigxNCksYT1uLm4obykscz1uKDcpLHU9bi5uKHMpLGM9big2KSxmPW4ubihjKSxsPW4oMTE5KSxoPWZ1bmN0aW9uIHQoZSl7ZigpKHRoaXMsdCl9LGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe2YoKSh0aGlzLHQpLHRoaXMuY2xheno9dm9pZCAwLHRoaXMuY29tcG9uZW50cz1bXSx0aGlzLmVudGl0aWVzPVtdLHRoaXMubG9va3VwPXt9LHRoaXMuY2xheno9ZX12YXIgZTtyZXR1cm4gdSgpKHQsW3trZXk6XCJjbGVhclwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jb21wb25lbnRzPVtdLHRoaXMuZW50aXRpZXM9W10sdGhpcy5sb29rdXA9e319fSx7a2V5OlwiY29udGFpbnNcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sb29rdXBbdF0+LTF9fSx7a2V5OlwiY3JlYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLmxvb2t1cFt0XT10aGlzLmNvbXBvbmVudHMubGVuZ3RoO3ZhciBuPW5ldyB0aGlzLmNsYXp6KGV8fHt9KTtyZXR1cm4gdGhpcy5jb21wb25lbnRzLnB1c2gobiksdGhpcy5lbnRpdGllcy5wdXNoKHQpLG59fSx7a2V5OlwicmVtb3ZlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sb29rdXBbdF07ZT4tMSYmZTx0aGlzLmNvbXBvbmVudHMubGVuZ3RoLTEmJih0aGlzLmNvbXBvbmVudHNbZV09dGhpcy5jb21wb25lbnRzW3RoaXMuY29tcG9uZW50cy5sZW5ndGgtMV0sdGhpcy5lbnRpdGllc1tlXT10aGlzLmVudGl0aWVzW3RoaXMuZW50aXRpZXMubGVuZ3RoLTFdLHRoaXMubG9va3VwW3RoaXMuZW50aXRpZXNbZV1dPWUpLHRoaXMuY29tcG9uZW50cy5wb3AoKSx0aGlzLmVudGl0aWVzLnBvcCgpLGRlbGV0ZSB0aGlzLmxvb2t1cFt0XX19LHtrZXk6XCJyZW1vdmVLZWVwU29ydGVkXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sb29rdXBbdF07aWYoZT4tMSl7dmFyIG49dGhpcy5lbnRpdGllc1tlXTtpZihlPHRoaXMuY29tcG9uZW50cy5sZW5ndGgtMSl7Zm9yKHZhciByPWUrMTtyPHRoaXMuY29tcG9uZW50cy5sZW5ndGg7KytyKXRoaXMuY29tcG9uZW50c1tyLTFdPXRoaXMuY29tcG9uZW50c1tyXTtmb3IodmFyIGk9ZSsxO2k8dGhpcy5lbnRpdGllcy5sZW5ndGg7KytpKXRoaXMuZW50aXRpZXNbaS0xXT10aGlzLmVudGl0aWVzW2ldLHRoaXMubG9va3VwW3RoaXMuZW50aXRpZXNbaS0xXV09aS0xfXRoaXMuY29tcG9uZW50cy5wb3AoKSx0aGlzLmVudGl0aWVzLnBvcCgpLGRlbGV0ZSB0aGlzLmxvb2t1cFtuXX19fSx7a2V5OlwibW92ZUl0ZW1cIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHQhPT1lKXtmb3IodmFyIG49dGhpcy5jb21wb25lbnRzW3RdLHI9dGhpcy5lbnRpdGllc1t0XSxpPXQ8ZT8xOi0xLG89dDtvIT09ZTtvKz1pKXt2YXIgYT1vK2k7dGhpcy5jb21wb25lbnRzW29dPXRoaXMuY29tcG9uZW50c1thXSx0aGlzLmVudGl0aWVzW29dPXRoaXMuZW50aXRpZXNbYV0sdGhpcy5sb29rdXBbdGhpcy5lbnRpdGllc1tvXV09b310aGlzLmNvbXBvbmVudHNbZV09bix0aGlzLmVudGl0aWVzW2VdPXIsdGhpcy5sb29rdXBbcl09ZX19fSx7a2V5OlwiZ2V0RW50aXR5XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW50aXRpZXNbdF19fSx7a2V5OlwiZ2V0Q29tcG9uZW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcG9uZW50c1t0XX19LHtrZXk6XCJnZXRDb21wb25lbnRCeUVudGl0eVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubG9va3VwW3RdO3JldHVybiBlPi0xP3RoaXMuY29tcG9uZW50c1tlXTpudWxsfX0se2tleTpcImdldENvdW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRzLmxlbmd0aH19LHtrZXk6XCJnZXRFbnRpdHlCeUNvbXBvbmVudEluZGV4XCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj1PYmplY3Qua2V5cyh0aGlzLmxvb2t1cCk7ZTxuLmxlbmd0aDtlKyspe3ZhciByPW5bZV0saT1OdW1iZXIocik7aWYodGhpcy5sb29rdXBbaV09PT10KXJldHVybiBpfXJldHVybiBsLmF9fSx7a2V5OlwiZmluZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5nZXRDb3VudCgpO2UrKyl7dmFyIG49dGhpcy5nZXRDb21wb25lbnQoZSk7aWYodChuLGUpKXJldHVybiBufXJldHVybiBudWxsfX0se2tleTpcImZpbmRJbmRleFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5nZXRDb3VudCgpO2UrKyl7aWYodCh0aGlzLmdldENvbXBvbmVudChlKSxlKSlyZXR1cm4gZX1yZXR1cm4tMX19LHtrZXk6XCJmb3JFYWNoXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj1PYmplY3Qua2V5cyh0aGlzLmxvb2t1cCk7ZTxuLmxlbmd0aDtlKyspe3ZhciByPW5bZV0saT1OdW1iZXIociksbz10aGlzLmxvb2t1cFtpXTt0KGksdGhpcy5nZXRDb21wb25lbnQobykpfX19LHtrZXk6XCJmb3JFYWNoQXN5bmNcIix2YWx1ZTooZT1hKCkoaS5hLm1hcmsoKGZ1bmN0aW9uIHQoZSl7dmFyIG4scixvLGEscztyZXR1cm4gaS5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOm49MCxyPU9iamVjdC5rZXlzKHRoaXMubG9va3VwKTtjYXNlIDE6aWYoIShuPHIubGVuZ3RoKSl7dC5uZXh0PTEwO2JyZWFrfXJldHVybiBvPXJbbl0sYT1OdW1iZXIobykscz10aGlzLmxvb2t1cFthXSx0Lm5leHQ9NyxlKGEsdGhpcy5nZXRDb21wb25lbnQocykpO2Nhc2UgNzpuKyssdC5uZXh0PTE7YnJlYWs7Y2FzZSAxMDpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSksZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6XCJtYXBcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9T2JqZWN0LmtleXModGhpcy5sb29rdXApO248ci5sZW5ndGg7bisrKXt2YXIgaT1yW25dLG89TnVtYmVyKGkpLGE9dGhpcy5sb29rdXBbb107ZS5wdXNoKHQobyx0aGlzLmdldENvbXBvbmVudChhKSkpfXJldHVybiBlfX1dKSx0fSgpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSksZnVuY3Rpb24odCl7dFt0LkRFUFRIX0JVRkZFUl9CSVQ9MjU2XT1cIkRFUFRIX0JVRkZFUl9CSVRcIix0W3QuU1RFTkNJTF9CVUZGRVJfQklUPTEwMjRdPVwiU1RFTkNJTF9CVUZGRVJfQklUXCIsdFt0LkNPTE9SX0JVRkZFUl9CSVQ9MTYzODRdPVwiQ09MT1JfQlVGRkVSX0JJVFwiLHRbdC5QT0lOVFM9MF09XCJQT0lOVFNcIix0W3QuTElORVM9MV09XCJMSU5FU1wiLHRbdC5MSU5FX0xPT1A9Ml09XCJMSU5FX0xPT1BcIix0W3QuTElORV9TVFJJUD0zXT1cIkxJTkVfU1RSSVBcIix0W3QuVFJJQU5HTEVTPTRdPVwiVFJJQU5HTEVTXCIsdFt0LlRSSUFOR0xFX1NUUklQPTVdPVwiVFJJQU5HTEVfU1RSSVBcIix0W3QuVFJJQU5HTEVfRkFOPTZdPVwiVFJJQU5HTEVfRkFOXCIsdFt0LlpFUk89MF09XCJaRVJPXCIsdFt0Lk9ORT0xXT1cIk9ORVwiLHRbdC5TUkNfQ09MT1I9NzY4XT1cIlNSQ19DT0xPUlwiLHRbdC5PTkVfTUlOVVNfU1JDX0NPTE9SPTc2OV09XCJPTkVfTUlOVVNfU1JDX0NPTE9SXCIsdFt0LlNSQ19BTFBIQT03NzBdPVwiU1JDX0FMUEhBXCIsdFt0Lk9ORV9NSU5VU19TUkNfQUxQSEE9NzcxXT1cIk9ORV9NSU5VU19TUkNfQUxQSEFcIix0W3QuRFNUX0FMUEhBPTc3Ml09XCJEU1RfQUxQSEFcIix0W3QuT05FX01JTlVTX0RTVF9BTFBIQT03NzNdPVwiT05FX01JTlVTX0RTVF9BTFBIQVwiLHRbdC5EU1RfQ09MT1I9Nzc0XT1cIkRTVF9DT0xPUlwiLHRbdC5PTkVfTUlOVVNfRFNUX0NPTE9SPTc3NV09XCJPTkVfTUlOVVNfRFNUX0NPTE9SXCIsdFt0LlNSQ19BTFBIQV9TQVRVUkFURT03NzZdPVwiU1JDX0FMUEhBX1NBVFVSQVRFXCIsdFt0LkZVTkNfQUREPTMyNzc0XT1cIkZVTkNfQUREXCIsdFt0LkJMRU5EX0VRVUFUSU9OPTMyNzc3XT1cIkJMRU5EX0VRVUFUSU9OXCIsdFt0LkJMRU5EX0VRVUFUSU9OX1JHQj0zMjc3N109XCJCTEVORF9FUVVBVElPTl9SR0JcIix0W3QuQkxFTkRfRVFVQVRJT05fQUxQSEE9MzQ4NzddPVwiQkxFTkRfRVFVQVRJT05fQUxQSEFcIix0W3QuRlVOQ19TVUJUUkFDVD0zMjc3OF09XCJGVU5DX1NVQlRSQUNUXCIsdFt0LkZVTkNfUkVWRVJTRV9TVUJUUkFDVD0zMjc3OV09XCJGVU5DX1JFVkVSU0VfU1VCVFJBQ1RcIix0W3QuTUFYX0VYVD0zMjc3Nl09XCJNQVhfRVhUXCIsdFt0Lk1JTl9FWFQ9MzI3NzVdPVwiTUlOX0VYVFwiLHRbdC5CTEVORF9EU1RfUkdCPTMyOTY4XT1cIkJMRU5EX0RTVF9SR0JcIix0W3QuQkxFTkRfU1JDX1JHQj0zMjk2OV09XCJCTEVORF9TUkNfUkdCXCIsdFt0LkJMRU5EX0RTVF9BTFBIQT0zMjk3MF09XCJCTEVORF9EU1RfQUxQSEFcIix0W3QuQkxFTkRfU1JDX0FMUEhBPTMyOTcxXT1cIkJMRU5EX1NSQ19BTFBIQVwiLHRbdC5DT05TVEFOVF9DT0xPUj0zMjc2OV09XCJDT05TVEFOVF9DT0xPUlwiLHRbdC5PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1I9MzI3NzBdPVwiT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SXCIsdFt0LkNPTlNUQU5UX0FMUEhBPTMyNzcxXT1cIkNPTlNUQU5UX0FMUEhBXCIsdFt0Lk9ORV9NSU5VU19DT05TVEFOVF9BTFBIQT0zMjc3Ml09XCJPTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEFcIix0W3QuQkxFTkRfQ09MT1I9MzI3NzNdPVwiQkxFTkRfQ09MT1JcIix0W3QuQVJSQVlfQlVGRkVSPTM0OTYyXT1cIkFSUkFZX0JVRkZFUlwiLHRbdC5FTEVNRU5UX0FSUkFZX0JVRkZFUj0zNDk2M109XCJFTEVNRU5UX0FSUkFZX0JVRkZFUlwiLHRbdC5BUlJBWV9CVUZGRVJfQklORElORz0zNDk2NF09XCJBUlJBWV9CVUZGRVJfQklORElOR1wiLHRbdC5FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HPTM0OTY1XT1cIkVMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkdcIix0W3QuU1RSRUFNX0RSQVc9MzUwNDBdPVwiU1RSRUFNX0RSQVdcIix0W3QuU1RBVElDX0RSQVc9MzUwNDRdPVwiU1RBVElDX0RSQVdcIix0W3QuRFlOQU1JQ19EUkFXPTM1MDQ4XT1cIkRZTkFNSUNfRFJBV1wiLHRbdC5CVUZGRVJfU0laRT0zNDY2MF09XCJCVUZGRVJfU0laRVwiLHRbdC5CVUZGRVJfVVNBR0U9MzQ2NjFdPVwiQlVGRkVSX1VTQUdFXCIsdFt0LkNVUlJFTlRfVkVSVEVYX0FUVFJJQj0zNDM0Ml09XCJDVVJSRU5UX1ZFUlRFWF9BVFRSSUJcIix0W3QuRlJPTlQ9MTAyOF09XCJGUk9OVFwiLHRbdC5CQUNLPTEwMjldPVwiQkFDS1wiLHRbdC5GUk9OVF9BTkRfQkFDSz0xMDMyXT1cIkZST05UX0FORF9CQUNLXCIsdFt0LkNVTExfRkFDRT0yODg0XT1cIkNVTExfRkFDRVwiLHRbdC5CTEVORD0zMDQyXT1cIkJMRU5EXCIsdFt0LkRJVEhFUj0zMDI0XT1cIkRJVEhFUlwiLHRbdC5TVEVOQ0lMX1RFU1Q9Mjk2MF09XCJTVEVOQ0lMX1RFU1RcIix0W3QuREVQVEhfVEVTVD0yOTI5XT1cIkRFUFRIX1RFU1RcIix0W3QuU0NJU1NPUl9URVNUPTMwODldPVwiU0NJU1NPUl9URVNUXCIsdFt0LlBPTFlHT05fT0ZGU0VUX0ZJTEw9MzI4MjNdPVwiUE9MWUdPTl9PRkZTRVRfRklMTFwiLHRbdC5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0U9MzI5MjZdPVwiU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFXCIsdFt0LlNBTVBMRV9DT1ZFUkFHRT0zMjkyOF09XCJTQU1QTEVfQ09WRVJBR0VcIix0W3QuTk9fRVJST1I9MF09XCJOT19FUlJPUlwiLHRbdC5JTlZBTElEX0VOVU09MTI4MF09XCJJTlZBTElEX0VOVU1cIix0W3QuSU5WQUxJRF9WQUxVRT0xMjgxXT1cIklOVkFMSURfVkFMVUVcIix0W3QuSU5WQUxJRF9PUEVSQVRJT049MTI4Ml09XCJJTlZBTElEX09QRVJBVElPTlwiLHRbdC5PVVRfT0ZfTUVNT1JZPTEyODVdPVwiT1VUX09GX01FTU9SWVwiLHRbdC5DVz0yMzA0XT1cIkNXXCIsdFt0LkNDVz0yMzA1XT1cIkNDV1wiLHRbdC5MSU5FX1dJRFRIPTI4NDldPVwiTElORV9XSURUSFwiLHRbdC5BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U9MzM5MDFdPVwiQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFXCIsdFt0LkFMSUFTRURfTElORV9XSURUSF9SQU5HRT0zMzkwMl09XCJBTElBU0VEX0xJTkVfV0lEVEhfUkFOR0VcIix0W3QuQ1VMTF9GQUNFX01PREU9Mjg4NV09XCJDVUxMX0ZBQ0VfTU9ERVwiLHRbdC5GUk9OVF9GQUNFPTI4ODZdPVwiRlJPTlRfRkFDRVwiLHRbdC5ERVBUSF9SQU5HRT0yOTI4XT1cIkRFUFRIX1JBTkdFXCIsdFt0LkRFUFRIX1dSSVRFTUFTSz0yOTMwXT1cIkRFUFRIX1dSSVRFTUFTS1wiLHRbdC5ERVBUSF9DTEVBUl9WQUxVRT0yOTMxXT1cIkRFUFRIX0NMRUFSX1ZBTFVFXCIsdFt0LkRFUFRIX0ZVTkM9MjkzMl09XCJERVBUSF9GVU5DXCIsdFt0LlNURU5DSUxfQ0xFQVJfVkFMVUU9Mjk2MV09XCJTVEVOQ0lMX0NMRUFSX1ZBTFVFXCIsdFt0LlNURU5DSUxfRlVOQz0yOTYyXT1cIlNURU5DSUxfRlVOQ1wiLHRbdC5TVEVOQ0lMX0ZBSUw9Mjk2NF09XCJTVEVOQ0lMX0ZBSUxcIix0W3QuU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUw9Mjk2NV09XCJTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTFwiLHRbdC5TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUz0yOTY2XT1cIlNURU5DSUxfUEFTU19ERVBUSF9QQVNTXCIsdFt0LlNURU5DSUxfUkVGPTI5NjddPVwiU1RFTkNJTF9SRUZcIix0W3QuU1RFTkNJTF9WQUxVRV9NQVNLPTI5NjNdPVwiU1RFTkNJTF9WQUxVRV9NQVNLXCIsdFt0LlNURU5DSUxfV1JJVEVNQVNLPTI5NjhdPVwiU1RFTkNJTF9XUklURU1BU0tcIix0W3QuU1RFTkNJTF9CQUNLX0ZVTkM9MzQ4MTZdPVwiU1RFTkNJTF9CQUNLX0ZVTkNcIix0W3QuU1RFTkNJTF9CQUNLX0ZBSUw9MzQ4MTddPVwiU1RFTkNJTF9CQUNLX0ZBSUxcIix0W3QuU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTD0zNDgxOF09XCJTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMXCIsdFt0LlNURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1M9MzQ4MTldPVwiU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTU1wiLHRbdC5TVEVOQ0lMX0JBQ0tfUkVGPTM2MDAzXT1cIlNURU5DSUxfQkFDS19SRUZcIix0W3QuU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0s9MzYwMDRdPVwiU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0tcIix0W3QuU1RFTkNJTF9CQUNLX1dSSVRFTUFTSz0zNjAwNV09XCJTVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLXCIsdFt0LlZJRVdQT1JUPTI5NzhdPVwiVklFV1BPUlRcIix0W3QuU0NJU1NPUl9CT1g9MzA4OF09XCJTQ0lTU09SX0JPWFwiLHRbdC5DT0xPUl9DTEVBUl9WQUxVRT0zMTA2XT1cIkNPTE9SX0NMRUFSX1ZBTFVFXCIsdFt0LkNPTE9SX1dSSVRFTUFTSz0zMTA3XT1cIkNPTE9SX1dSSVRFTUFTS1wiLHRbdC5VTlBBQ0tfQUxJR05NRU5UPTMzMTddPVwiVU5QQUNLX0FMSUdOTUVOVFwiLHRbdC5QQUNLX0FMSUdOTUVOVD0zMzMzXT1cIlBBQ0tfQUxJR05NRU5UXCIsdFt0Lk1BWF9URVhUVVJFX1NJWkU9MzM3OV09XCJNQVhfVEVYVFVSRV9TSVpFXCIsdFt0Lk1BWF9WSUVXUE9SVF9ESU1TPTMzODZdPVwiTUFYX1ZJRVdQT1JUX0RJTVNcIix0W3QuU1VCUElYRUxfQklUUz0zNDA4XT1cIlNVQlBJWEVMX0JJVFNcIix0W3QuUkVEX0JJVFM9MzQxMF09XCJSRURfQklUU1wiLHRbdC5HUkVFTl9CSVRTPTM0MTFdPVwiR1JFRU5fQklUU1wiLHRbdC5CTFVFX0JJVFM9MzQxMl09XCJCTFVFX0JJVFNcIix0W3QuQUxQSEFfQklUUz0zNDEzXT1cIkFMUEhBX0JJVFNcIix0W3QuREVQVEhfQklUUz0zNDE0XT1cIkRFUFRIX0JJVFNcIix0W3QuU1RFTkNJTF9CSVRTPTM0MTVdPVwiU1RFTkNJTF9CSVRTXCIsdFt0LlBPTFlHT05fT0ZGU0VUX1VOSVRTPTEwNzUyXT1cIlBPTFlHT05fT0ZGU0VUX1VOSVRTXCIsdFt0LlBPTFlHT05fT0ZGU0VUX0ZBQ1RPUj0zMjgyNF09XCJQT0xZR09OX09GRlNFVF9GQUNUT1JcIix0W3QuVEVYVFVSRV9CSU5ESU5HXzJEPTMyODczXT1cIlRFWFRVUkVfQklORElOR18yRFwiLHRbdC5TQU1QTEVfQlVGRkVSUz0zMjkzNl09XCJTQU1QTEVfQlVGRkVSU1wiLHRbdC5TQU1QTEVTPTMyOTM3XT1cIlNBTVBMRVNcIix0W3QuU0FNUExFX0NPVkVSQUdFX1ZBTFVFPTMyOTM4XT1cIlNBTVBMRV9DT1ZFUkFHRV9WQUxVRVwiLHRbdC5TQU1QTEVfQ09WRVJBR0VfSU5WRVJUPTMyOTM5XT1cIlNBTVBMRV9DT1ZFUkFHRV9JTlZFUlRcIix0W3QuQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM9MzQ0NjddPVwiQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFNcIix0W3QuRE9OVF9DQVJFPTQzNTJdPVwiRE9OVF9DQVJFXCIsdFt0LkZBU1RFU1Q9NDM1M109XCJGQVNURVNUXCIsdFt0Lk5JQ0VTVD00MzU0XT1cIk5JQ0VTVFwiLHRbdC5HRU5FUkFURV9NSVBNQVBfSElOVD0zMzE3MF09XCJHRU5FUkFURV9NSVBNQVBfSElOVFwiLHRbdC5CWVRFPTUxMjBdPVwiQllURVwiLHRbdC5VTlNJR05FRF9CWVRFPTUxMjFdPVwiVU5TSUdORURfQllURVwiLHRbdC5TSE9SVD01MTIyXT1cIlNIT1JUXCIsdFt0LlVOU0lHTkVEX1NIT1JUPTUxMjNdPVwiVU5TSUdORURfU0hPUlRcIix0W3QuSU5UPTUxMjRdPVwiSU5UXCIsdFt0LlVOU0lHTkVEX0lOVD01MTI1XT1cIlVOU0lHTkVEX0lOVFwiLHRbdC5GTE9BVD01MTI2XT1cIkZMT0FUXCIsdFt0LkRFUFRIX0NPTVBPTkVOVD02NDAyXT1cIkRFUFRIX0NPTVBPTkVOVFwiLHRbdC5BTFBIQT02NDA2XT1cIkFMUEhBXCIsdFt0LlJHQj02NDA3XT1cIlJHQlwiLHRbdC5SR0JBPTY0MDhdPVwiUkdCQVwiLHRbdC5MVU1JTkFOQ0U9NjQwOV09XCJMVU1JTkFOQ0VcIix0W3QuTFVNSU5BTkNFX0FMUEhBPTY0MTBdPVwiTFVNSU5BTkNFX0FMUEhBXCIsdFt0LlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ9MzI4MTldPVwiVU5TSUdORURfU0hPUlRfNF80XzRfNFwiLHRbdC5VTlNJR05FRF9TSE9SVF81XzVfNV8xPTMyODIwXT1cIlVOU0lHTkVEX1NIT1JUXzVfNV81XzFcIix0W3QuVU5TSUdORURfU0hPUlRfNV82XzU9MzM2MzVdPVwiVU5TSUdORURfU0hPUlRfNV82XzVcIix0W3QuRlJBR01FTlRfU0hBREVSPTM1NjMyXT1cIkZSQUdNRU5UX1NIQURFUlwiLHRbdC5WRVJURVhfU0hBREVSPTM1NjMzXT1cIlZFUlRFWF9TSEFERVJcIix0W3QuTUFYX1ZFUlRFWF9BVFRSSUJTPTM0OTIxXT1cIk1BWF9WRVJURVhfQVRUUklCU1wiLHRbdC5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUz0zNjM0N109XCJNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SU1wiLHRbdC5NQVhfVkFSWUlOR19WRUNUT1JTPTM2MzQ4XT1cIk1BWF9WQVJZSU5HX1ZFQ1RPUlNcIix0W3QuTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFM9MzU2NjFdPVwiTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNcIix0W3QuTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTPTM1NjYwXT1cIk1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUU1wiLHRbdC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUz0zNDkzMF09XCJNQVhfVEVYVFVSRV9JTUFHRV9VTklUU1wiLHRbdC5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTPTM2MzQ5XT1cIk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlNcIix0W3QuU0hBREVSX1RZUEU9MzU2NjNdPVwiU0hBREVSX1RZUEVcIix0W3QuREVMRVRFX1NUQVRVUz0zNTcxMl09XCJERUxFVEVfU1RBVFVTXCIsdFt0LkxJTktfU1RBVFVTPTM1NzE0XT1cIkxJTktfU1RBVFVTXCIsdFt0LlZBTElEQVRFX1NUQVRVUz0zNTcxNV09XCJWQUxJREFURV9TVEFUVVNcIix0W3QuQVRUQUNIRURfU0hBREVSUz0zNTcxN109XCJBVFRBQ0hFRF9TSEFERVJTXCIsdFt0LkFDVElWRV9VTklGT1JNUz0zNTcxOF09XCJBQ1RJVkVfVU5JRk9STVNcIix0W3QuQUNUSVZFX0FUVFJJQlVURVM9MzU3MjFdPVwiQUNUSVZFX0FUVFJJQlVURVNcIix0W3QuU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OPTM1NzI0XT1cIlNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTlwiLHRbdC5DVVJSRU5UX1BST0dSQU09MzU3MjVdPVwiQ1VSUkVOVF9QUk9HUkFNXCIsdFt0Lk5FVkVSPTUxMl09XCJORVZFUlwiLHRbdC5MRVNTPTUxM109XCJMRVNTXCIsdFt0LkVRVUFMPTUxNF09XCJFUVVBTFwiLHRbdC5MRVFVQUw9NTE1XT1cIkxFUVVBTFwiLHRbdC5HUkVBVEVSPTUxNl09XCJHUkVBVEVSXCIsdFt0Lk5PVEVRVUFMPTUxN109XCJOT1RFUVVBTFwiLHRbdC5HRVFVQUw9NTE4XT1cIkdFUVVBTFwiLHRbdC5BTFdBWVM9NTE5XT1cIkFMV0FZU1wiLHRbdC5LRUVQPTc2ODBdPVwiS0VFUFwiLHRbdC5SRVBMQUNFPTc2ODFdPVwiUkVQTEFDRVwiLHRbdC5JTkNSPTc2ODJdPVwiSU5DUlwiLHRbdC5ERUNSPTc2ODNdPVwiREVDUlwiLHRbdC5JTlZFUlQ9NTM4Nl09XCJJTlZFUlRcIix0W3QuSU5DUl9XUkFQPTM0MDU1XT1cIklOQ1JfV1JBUFwiLHRbdC5ERUNSX1dSQVA9MzQwNTZdPVwiREVDUl9XUkFQXCIsdFt0LlZFTkRPUj03OTM2XT1cIlZFTkRPUlwiLHRbdC5SRU5ERVJFUj03OTM3XT1cIlJFTkRFUkVSXCIsdFt0LlZFUlNJT049NzkzOF09XCJWRVJTSU9OXCIsdFt0Lk5FQVJFU1Q9OTcyOF09XCJORUFSRVNUXCIsdFt0LkxJTkVBUj05NzI5XT1cIkxJTkVBUlwiLHRbdC5ORUFSRVNUX01JUE1BUF9ORUFSRVNUPTk5ODRdPVwiTkVBUkVTVF9NSVBNQVBfTkVBUkVTVFwiLHRbdC5MSU5FQVJfTUlQTUFQX05FQVJFU1Q9OTk4NV09XCJMSU5FQVJfTUlQTUFQX05FQVJFU1RcIix0W3QuTkVBUkVTVF9NSVBNQVBfTElORUFSPTk5ODZdPVwiTkVBUkVTVF9NSVBNQVBfTElORUFSXCIsdFt0LkxJTkVBUl9NSVBNQVBfTElORUFSPTk5ODddPVwiTElORUFSX01JUE1BUF9MSU5FQVJcIix0W3QuVEVYVFVSRV9NQUdfRklMVEVSPTEwMjQwXT1cIlRFWFRVUkVfTUFHX0ZJTFRFUlwiLHRbdC5URVhUVVJFX01JTl9GSUxURVI9MTAyNDFdPVwiVEVYVFVSRV9NSU5fRklMVEVSXCIsdFt0LlRFWFRVUkVfV1JBUF9TPTEwMjQyXT1cIlRFWFRVUkVfV1JBUF9TXCIsdFt0LlRFWFRVUkVfV1JBUF9UPTEwMjQzXT1cIlRFWFRVUkVfV1JBUF9UXCIsdFt0LlRFWFRVUkVfMkQ9MzU1M109XCJURVhUVVJFXzJEXCIsdFt0LlRFWFRVUkU9NTg5MF09XCJURVhUVVJFXCIsdFt0LlRFWFRVUkVfQ1VCRV9NQVA9MzQwNjddPVwiVEVYVFVSRV9DVUJFX01BUFwiLHRbdC5URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVA9MzQwNjhdPVwiVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQXCIsdFt0LlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWD0zNDA2OV09XCJURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hcIix0W3QuVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YPTM0MDcwXT1cIlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWFwiLHRbdC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1k9MzQwNzFdPVwiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZXCIsdFt0LlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWT0zNDA3Ml09XCJURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lcIix0W3QuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aPTM0MDczXT1cIlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWlwiLHRbdC5URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1o9MzQwNzRdPVwiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aXCIsdFt0Lk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkU9MzQwNzZdPVwiTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRVwiLHRbdC5URVhUVVJFMD0zMzk4NF09XCJURVhUVVJFMFwiLHRbdC5URVhUVVJFMT0zMzk4NV09XCJURVhUVVJFMVwiLHRbdC5URVhUVVJFMj0zMzk4Nl09XCJURVhUVVJFMlwiLHRbdC5URVhUVVJFMz0zMzk4N109XCJURVhUVVJFM1wiLHRbdC5URVhUVVJFND0zMzk4OF09XCJURVhUVVJFNFwiLHRbdC5URVhUVVJFNT0zMzk4OV09XCJURVhUVVJFNVwiLHRbdC5URVhUVVJFNj0zMzk5MF09XCJURVhUVVJFNlwiLHRbdC5URVhUVVJFNz0zMzk5MV09XCJURVhUVVJFN1wiLHRbdC5URVhUVVJFOD0zMzk5Ml09XCJURVhUVVJFOFwiLHRbdC5URVhUVVJFOT0zMzk5M109XCJURVhUVVJFOVwiLHRbdC5URVhUVVJFMTA9MzM5OTRdPVwiVEVYVFVSRTEwXCIsdFt0LlRFWFRVUkUxMT0zMzk5NV09XCJURVhUVVJFMTFcIix0W3QuVEVYVFVSRTEyPTMzOTk2XT1cIlRFWFRVUkUxMlwiLHRbdC5URVhUVVJFMTM9MzM5OTddPVwiVEVYVFVSRTEzXCIsdFt0LlRFWFRVUkUxND0zMzk5OF09XCJURVhUVVJFMTRcIix0W3QuVEVYVFVSRTE1PTMzOTk5XT1cIlRFWFRVUkUxNVwiLHRbdC5URVhUVVJFMTY9MzRlM109XCJURVhUVVJFMTZcIix0W3QuVEVYVFVSRTE3PTM0MDAxXT1cIlRFWFRVUkUxN1wiLHRbdC5URVhUVVJFMTg9MzQwMDJdPVwiVEVYVFVSRTE4XCIsdFt0LlRFWFRVUkUxOT0zNDAwM109XCJURVhUVVJFMTlcIix0W3QuVEVYVFVSRTIwPTM0MDA0XT1cIlRFWFRVUkUyMFwiLHRbdC5URVhUVVJFMjE9MzQwMDVdPVwiVEVYVFVSRTIxXCIsdFt0LlRFWFRVUkUyMj0zNDAwNl09XCJURVhUVVJFMjJcIix0W3QuVEVYVFVSRTIzPTM0MDA3XT1cIlRFWFRVUkUyM1wiLHRbdC5URVhUVVJFMjQ9MzQwMDhdPVwiVEVYVFVSRTI0XCIsdFt0LlRFWFRVUkUyNT0zNDAwOV09XCJURVhUVVJFMjVcIix0W3QuVEVYVFVSRTI2PTM0MDEwXT1cIlRFWFRVUkUyNlwiLHRbdC5URVhUVVJFMjc9MzQwMTFdPVwiVEVYVFVSRTI3XCIsdFt0LlRFWFRVUkUyOD0zNDAxMl09XCJURVhUVVJFMjhcIix0W3QuVEVYVFVSRTI5PTM0MDEzXT1cIlRFWFRVUkUyOVwiLHRbdC5URVhUVVJFMzA9MzQwMTRdPVwiVEVYVFVSRTMwXCIsdFt0LlRFWFRVUkUzMT0zNDAxNV09XCJURVhUVVJFMzFcIix0W3QuQUNUSVZFX1RFWFRVUkU9MzQwMTZdPVwiQUNUSVZFX1RFWFRVUkVcIix0W3QuUkVQRUFUPTEwNDk3XT1cIlJFUEVBVFwiLHRbdC5DTEFNUF9UT19FREdFPTMzMDcxXT1cIkNMQU1QX1RPX0VER0VcIix0W3QuTUlSUk9SRURfUkVQRUFUPTMzNjQ4XT1cIk1JUlJPUkVEX1JFUEVBVFwiLHRbdC5GTE9BVF9WRUMyPTM1NjY0XT1cIkZMT0FUX1ZFQzJcIix0W3QuRkxPQVRfVkVDMz0zNTY2NV09XCJGTE9BVF9WRUMzXCIsdFt0LkZMT0FUX1ZFQzQ9MzU2NjZdPVwiRkxPQVRfVkVDNFwiLHRbdC5JTlRfVkVDMj0zNTY2N109XCJJTlRfVkVDMlwiLHRbdC5JTlRfVkVDMz0zNTY2OF09XCJJTlRfVkVDM1wiLHRbdC5JTlRfVkVDND0zNTY2OV09XCJJTlRfVkVDNFwiLHRbdC5CT09MPTM1NjcwXT1cIkJPT0xcIix0W3QuQk9PTF9WRUMyPTM1NjcxXT1cIkJPT0xfVkVDMlwiLHRbdC5CT09MX1ZFQzM9MzU2NzJdPVwiQk9PTF9WRUMzXCIsdFt0LkJPT0xfVkVDND0zNTY3M109XCJCT09MX1ZFQzRcIix0W3QuRkxPQVRfTUFUMj0zNTY3NF09XCJGTE9BVF9NQVQyXCIsdFt0LkZMT0FUX01BVDM9MzU2NzVdPVwiRkxPQVRfTUFUM1wiLHRbdC5GTE9BVF9NQVQ0PTM1Njc2XT1cIkZMT0FUX01BVDRcIix0W3QuU0FNUExFUl8yRD0zNTY3OF09XCJTQU1QTEVSXzJEXCIsdFt0LlNBTVBMRVJfQ1VCRT0zNTY4MF09XCJTQU1QTEVSX0NVQkVcIix0W3QuVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEPTM0MzM4XT1cIlZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRFwiLHRbdC5WRVJURVhfQVRUUklCX0FSUkFZX1NJWkU9MzQzMzldPVwiVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFXCIsdFt0LlZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFPTM0MzQwXT1cIlZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFXCIsdFt0LlZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRT0zNDM0MV09XCJWRVJURVhfQVRUUklCX0FSUkFZX1RZUEVcIix0W3QuVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEPTM0OTIyXT1cIlZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRFwiLHRbdC5WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVI9MzQzNzNdPVwiVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSXCIsdFt0LlZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkc9MzQ5NzVdPVwiVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElOR1wiLHRbdC5DT01QSUxFX1NUQVRVUz0zNTcxM109XCJDT01QSUxFX1NUQVRVU1wiLHRbdC5MT1dfRkxPQVQ9MzYzMzZdPVwiTE9XX0ZMT0FUXCIsdFt0Lk1FRElVTV9GTE9BVD0zNjMzN109XCJNRURJVU1fRkxPQVRcIix0W3QuSElHSF9GTE9BVD0zNjMzOF09XCJISUdIX0ZMT0FUXCIsdFt0LkxPV19JTlQ9MzYzMzldPVwiTE9XX0lOVFwiLHRbdC5NRURJVU1fSU5UPTM2MzQwXT1cIk1FRElVTV9JTlRcIix0W3QuSElHSF9JTlQ9MzYzNDFdPVwiSElHSF9JTlRcIix0W3QuRlJBTUVCVUZGRVI9MzYxNjBdPVwiRlJBTUVCVUZGRVJcIix0W3QuUkVOREVSQlVGRkVSPTM2MTYxXT1cIlJFTkRFUkJVRkZFUlwiLHRbdC5SR0JBND0zMjg1NF09XCJSR0JBNFwiLHRbdC5SR0I1X0ExPTMyODU1XT1cIlJHQjVfQTFcIix0W3QuUkdCNTY1PTM2MTk0XT1cIlJHQjU2NVwiLHRbdC5ERVBUSF9DT01QT05FTlQxNj0zMzE4OV09XCJERVBUSF9DT01QT05FTlQxNlwiLHRbdC5TVEVOQ0lMX0lOREVYPTY0MDFdPVwiU1RFTkNJTF9JTkRFWFwiLHRbdC5TVEVOQ0lMX0lOREVYOD0zNjE2OF09XCJTVEVOQ0lMX0lOREVYOFwiLHRbdC5ERVBUSF9TVEVOQ0lMPTM0MDQxXT1cIkRFUFRIX1NURU5DSUxcIix0W3QuUkVOREVSQlVGRkVSX1dJRFRIPTM2MTYyXT1cIlJFTkRFUkJVRkZFUl9XSURUSFwiLHRbdC5SRU5ERVJCVUZGRVJfSEVJR0hUPTM2MTYzXT1cIlJFTkRFUkJVRkZFUl9IRUlHSFRcIix0W3QuUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVD0zNjE2NF09XCJSRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUXCIsdFt0LlJFTkRFUkJVRkZFUl9SRURfU0laRT0zNjE3Nl09XCJSRU5ERVJCVUZGRVJfUkVEX1NJWkVcIix0W3QuUkVOREVSQlVGRkVSX0dSRUVOX1NJWkU9MzYxNzddPVwiUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVcIix0W3QuUkVOREVSQlVGRkVSX0JMVUVfU0laRT0zNjE3OF09XCJSRU5ERVJCVUZGRVJfQkxVRV9TSVpFXCIsdFt0LlJFTkRFUkJVRkZFUl9BTFBIQV9TSVpFPTM2MTc5XT1cIlJFTkRFUkJVRkZFUl9BTFBIQV9TSVpFXCIsdFt0LlJFTkRFUkJVRkZFUl9ERVBUSF9TSVpFPTM2MTgwXT1cIlJFTkRFUkJVRkZFUl9ERVBUSF9TSVpFXCIsdFt0LlJFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkU9MzYxODFdPVwiUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRVwiLHRbdC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFPTM2MDQ4XT1cIkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVcIix0W3QuRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRT0zNjA0OV09XCJGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FXCIsdFt0LkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTD0zNjA1MF09XCJGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxcIix0W3QuRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U9MzYwNTFdPVwiRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VcIix0W3QuQ09MT1JfQVRUQUNITUVOVDA9MzYwNjRdPVwiQ09MT1JfQVRUQUNITUVOVDBcIix0W3QuREVQVEhfQVRUQUNITUVOVD0zNjA5Nl09XCJERVBUSF9BVFRBQ0hNRU5UXCIsdFt0LlNURU5DSUxfQVRUQUNITUVOVD0zNjEyOF09XCJTVEVOQ0lMX0FUVEFDSE1FTlRcIix0W3QuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UPTMzMzA2XT1cIkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVFwiLHRbdC5OT05FPTBdPVwiTk9ORVwiLHRbdC5GUkFNRUJVRkZFUl9DT01QTEVURT0zNjA1M109XCJGUkFNRUJVRkZFUl9DT01QTEVURVwiLHRbdC5GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ9MzYwNTRdPVwiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UXCIsdFt0LkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UPTM2MDU1XT1cIkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UXCIsdFt0LkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OUz0zNjA1N109XCJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNcIix0W3QuRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQ9MzYwNjFdPVwiRlJBTUVCVUZGRVJfVU5TVVBQT1JURURcIix0W3QuRlJBTUVCVUZGRVJfQklORElORz0zNjAwNl09XCJGUkFNRUJVRkZFUl9CSU5ESU5HXCIsdFt0LlJFTkRFUkJVRkZFUl9CSU5ESU5HPTM2MDA3XT1cIlJFTkRFUkJVRkZFUl9CSU5ESU5HXCIsdFt0Lk1BWF9SRU5ERVJCVUZGRVJfU0laRT0zNDAyNF09XCJNQVhfUkVOREVSQlVGRkVSX1NJWkVcIix0W3QuSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT049MTI4Nl09XCJJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTlwiLHRbdC5VTlBBQ0tfRkxJUF9ZX1dFQkdMPTM3NDQwXT1cIlVOUEFDS19GTElQX1lfV0VCR0xcIix0W3QuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMPTM3NDQxXT1cIlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTFwiLHRbdC5DT05URVhUX0xPU1RfV0VCR0w9Mzc0NDJdPVwiQ09OVEVYVF9MT1NUX1dFQkdMXCIsdFt0LlVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0w9Mzc0NDNdPVwiVU5QQUNLX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTl9XRUJHTFwiLHRbdC5CUk9XU0VSX0RFRkFVTFRfV0VCR0w9Mzc0NDRdPVwiQlJPV1NFUl9ERUZBVUxUX1dFQkdMXCIsdFt0LkNPUFlfU1JDPTFdPVwiQ09QWV9TUkNcIix0W3QuQ09QWV9EU1Q9Ml09XCJDT1BZX0RTVFwiLHRbdC5TQU1QTEVEPTRdPVwiU0FNUExFRFwiLHRbdC5TVE9SQUdFPThdPVwiU1RPUkFHRVwiLHRbdC5SRU5ERVJfQVRUQUNITUVOVD0xNl09XCJSRU5ERVJfQVRUQUNITUVOVFwifShyfHwocj17fSkpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyNyksaT1uKDQ0KS5HcmFwaDtmdW5jdGlvbiBvKHQsZSxuLGkpe3ZhciBvO2Rve289ci51bmlxdWVJZChpKX13aGlsZSh0Lmhhc05vZGUobykpO3JldHVybiBuLmR1bW15PWUsdC5zZXROb2RlKG8sbiksb31mdW5jdGlvbiBhKHQpe3JldHVybiByLm1heChyLm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQubm9kZShlKS5yYW5rO2lmKCFyLmlzVW5kZWZpbmVkKG4pKXJldHVybiBufSkpKX10LmV4cG9ydHM9e2FkZER1bW15Tm9kZTpvLHNpbXBsaWZ5OmZ1bmN0aW9uKHQpe3ZhciBlPShuZXcgaSkuc2V0R3JhcGgodC5ncmFwaCgpKTtyZXR1cm4gci5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24obil7ZS5zZXROb2RlKG4sdC5ub2RlKG4pKX0pKSxyLmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihuKXt2YXIgcj1lLmVkZ2Uobi52LG4udyl8fHt3ZWlnaHQ6MCxtaW5sZW46MX0saT10LmVkZ2Uobik7ZS5zZXRFZGdlKG4udixuLncse3dlaWdodDpyLndlaWdodCtpLndlaWdodCxtaW5sZW46TWF0aC5tYXgoci5taW5sZW4saS5taW5sZW4pfSl9KSksZX0sYXNOb25Db21wb3VuZEdyYXBoOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBpKHttdWx0aWdyYXBoOnQuaXNNdWx0aWdyYXBoKCl9KS5zZXRHcmFwaCh0LmdyYXBoKCkpO3JldHVybiByLmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihuKXt0LmNoaWxkcmVuKG4pLmxlbmd0aHx8ZS5zZXROb2RlKG4sdC5ub2RlKG4pKX0pKSxyLmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihuKXtlLnNldEVkZ2Uobix0LmVkZ2UobikpfSkpLGV9LHN1Y2Nlc3NvcldlaWdodHM6ZnVuY3Rpb24odCl7dmFyIGU9ci5tYXAodC5ub2RlcygpLChmdW5jdGlvbihlKXt2YXIgbj17fTtyZXR1cm4gci5mb3JFYWNoKHQub3V0RWRnZXMoZSksKGZ1bmN0aW9uKGUpe25bZS53XT0obltlLnddfHwwKSt0LmVkZ2UoZSkud2VpZ2h0fSkpLG59KSk7cmV0dXJuIHIuemlwT2JqZWN0KHQubm9kZXMoKSxlKX0scHJlZGVjZXNzb3JXZWlnaHRzOmZ1bmN0aW9uKHQpe3ZhciBlPXIubWFwKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49e307cmV0dXJuIHIuZm9yRWFjaCh0LmluRWRnZXMoZSksKGZ1bmN0aW9uKGUpe25bZS52XT0obltlLnZdfHwwKSt0LmVkZ2UoZSkud2VpZ2h0fSkpLG59KSk7cmV0dXJuIHIuemlwT2JqZWN0KHQubm9kZXMoKSxlKX0saW50ZXJzZWN0UmVjdDpmdW5jdGlvbih0LGUpe3ZhciBuLHIsaT10Lngsbz10LnksYT1lLngtaSxzPWUueS1vLHU9dC53aWR0aC8yLGM9dC5oZWlnaHQvMjtpZighYSYmIXMpdGhyb3cgbmV3IEVycm9yKFwiTm90IHBvc3NpYmxlIHRvIGZpbmQgaW50ZXJzZWN0aW9uIGluc2lkZSBvZiB0aGUgcmVjdGFuZ2xlXCIpO01hdGguYWJzKHMpKnU+TWF0aC5hYnMoYSkqYz8oczwwJiYoYz0tYyksbj1jKmEvcyxyPWMpOihhPDAmJih1PS11KSxuPXUscj11KnMvYSk7cmV0dXJue3g6aStuLHk6bytyfX0sYnVpbGRMYXllck1hdHJpeDpmdW5jdGlvbih0KXt2YXIgZT1yLm1hcChyLnJhbmdlKGEodCkrMSksKGZ1bmN0aW9uKCl7cmV0dXJuW119KSk7cmV0dXJuIHIuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPXQubm9kZShuKSxvPWkucmFuaztyLmlzVW5kZWZpbmVkKG8pfHwoZVtvXVtpLm9yZGVyXT1uKX0pKSxlfSxub3JtYWxpemVSYW5rczpmdW5jdGlvbih0KXt2YXIgZT1yLm1pbihyLm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkucmFua30pKSk7ci5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24obil7dmFyIGk9dC5ub2RlKG4pO3IuaGFzKGksXCJyYW5rXCIpJiYoaS5yYW5rLT1lKX0pKX0scmVtb3ZlRW1wdHlSYW5rczpmdW5jdGlvbih0KXt2YXIgZT1yLm1pbihyLm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkucmFua30pKSksbj1bXTtyLmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihyKXt2YXIgaT10Lm5vZGUocikucmFuay1lO25baV18fChuW2ldPVtdKSxuW2ldLnB1c2gocil9KSk7dmFyIGk9MCxvPXQuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtyLmZvckVhY2gobiwoZnVuY3Rpb24oZSxuKXtyLmlzVW5kZWZpbmVkKGUpJiZuJW8hPTA/LS1pOmkmJnIuZm9yRWFjaChlLChmdW5jdGlvbihlKXt0Lm5vZGUoZSkucmFuays9aX0pKX0pKX0sYWRkQm9yZGVyTm9kZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT17d2lkdGg6MCxoZWlnaHQ6MH07YXJndW1lbnRzLmxlbmd0aD49NCYmKGkucmFuaz1uLGkub3JkZXI9cik7cmV0dXJuIG8odCxcImJvcmRlclwiLGksZSl9LG1heFJhbms6YSxwYXJ0aXRpb246ZnVuY3Rpb24odCxlKXt2YXIgbj17bGhzOltdLHJoczpbXX07cmV0dXJuIHIuZm9yRWFjaCh0LChmdW5jdGlvbih0KXtlKHQpP24ubGhzLnB1c2godCk6bi5yaHMucHVzaCh0KX0pKSxufSx0aW1lOmZ1bmN0aW9uKHQsZSl7dmFyIG49ci5ub3coKTt0cnl7cmV0dXJuIGUoKX1maW5hbGx5e2NvbnNvbGUubG9nKHQrXCIgdGltZTogXCIrKHIubm93KCktbikrXCJtc1wiKX19LG5vdGltZTpmdW5jdGlvbih0LGUpe3JldHVybiBlKCl9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiBzfSkpLG4uZChlLFwiYlwiLChmdW5jdGlvbigpe3JldHVybiBsfSkpLG4uZChlLFwiY1wiLChmdW5jdGlvbigpe3JldHVybiBwfSkpLG4uZChlLFwiZFwiLChmdW5jdGlvbigpe3JldHVybiB3fSkpO3ZhciByPW4oMCksaT0vW01MSFZRVENTQVpdKFteTUxIVlFUQ1NBWl0qKS9naSxvPS9bXlxcc1xcLF0rL2dpO3ZhciBhPWZ1bmN0aW9uKHQpe3ZhciBlPXR8fFtdO3JldHVybiBPYmplY3Qoci5tKShlKT9lOk9iamVjdChyLngpKGUpPyhlPWUubWF0Y2goaSksT2JqZWN0KHIuZikoZSwoZnVuY3Rpb24odCxuKXtpZigodD10Lm1hdGNoKG8pKVswXS5sZW5ndGg+MSl7dmFyIGk9dFswXS5jaGFyQXQoMCk7dC5zcGxpY2UoMSwwLHRbMF0uc3Vic3RyKDEpKSx0WzBdPWl9T2JqZWN0KHIuZikodCwoZnVuY3Rpb24oZSxuKXtpc05hTihlKXx8KHRbbl09K2UpfSkpLGVbbl09dH0pKSxlKTp2b2lkIDB9O2Z1bmN0aW9uIHModCxlKXtmb3IodmFyIG49W10scj0wLGk9dC5sZW5ndGg7aS0yKiFlPnI7cis9Mil7dmFyIG89W3t4Oit0W3ItMl0seTordFtyLTFdfSx7eDordFtyXSx5Oit0W3IrMV19LHt4Oit0W3IrMl0seTordFtyKzNdfSx7eDordFtyKzRdLHk6K3Rbcis1XX1dO2U/cj9pLTQ9PT1yP29bM109e3g6K3RbMF0seTordFsxXX06aS0yPT09ciYmKG9bMl09e3g6K3RbMF0seTordFsxXX0sb1szXT17eDordFsyXSx5Oit0WzNdfSk6b1swXT17eDordFtpLTJdLHk6K3RbaS0xXX06aS00PT09cj9vWzNdPW9bMl06cnx8KG9bMF09e3g6K3Rbcl0seTordFtyKzFdfSksbi5wdXNoKFtcIkNcIiwoLW9bMF0ueCs2Km9bMV0ueCtvWzJdLngpLzYsKC1vWzBdLnkrNipvWzFdLnkrb1syXS55KS82LChvWzFdLngrNipvWzJdLngtb1szXS54KS82LChvWzFdLnkrNipvWzJdLnktb1szXS55KS82LG9bMl0ueCxvWzJdLnldKX1yZXR1cm4gbn12YXIgdT1cIlxcdFxcblxcdlxcZlxcciDDgiDDocWh4oKsw6Egxb3DouKCrOKCrMOi4oKswoHDouKCrOKAmsOi4oKsxpLDouKCrOKAnsOi4oKs4oCmw6LigqzigKDDouKCrOKAocOi4oKsy4bDouKCrOKAsMOi4oKsxaDDouKCrMKvw6LCgcW4w6PigqzigqxcXHUyMDI4XFx1MjAyOVwiLGM9bmV3IFJlZ0V4cChcIihbYS16XSlbXCIrdStcIixdKigoLT9cXFxcZCpcXFxcLj9cXFxcZCooPzplW1xcXFwtK10/XFxcXGQrKT9bXCIrdStcIl0qLD9bXCIrdStcIl0qKSspXCIsXCJpZ1wiKSxmPW5ldyBSZWdFeHAoXCIoLT9cXFxcZCpcXFxcLj9cXFxcZCooPzplW1xcXFwtK10/XFxcXGQrKT8pW1wiK3UrXCJdKiw/W1wiK3UrXCJdKlwiLFwiaWdcIik7ZnVuY3Rpb24gbCh0KXtpZighdClyZXR1cm4gbnVsbDtpZihPYmplY3Qoci5tKSh0KSlyZXR1cm4gdDt2YXIgZT17YTo3LGM6NixvOjIsaDoxLGw6MixtOjIscjo0LHE6NCxzOjQsdDoyLHY6MSx1OjMsejowfSxuPVtdO3JldHVybiBTdHJpbmcodCkucmVwbGFjZShjLChmdW5jdGlvbih0LHIsaSl7dmFyIG89W10sYT1yLnRvTG93ZXJDYXNlKCk7aWYoaS5yZXBsYWNlKGYsKGZ1bmN0aW9uKHQsZSl7ZSYmby5wdXNoKCtlKX0pKSxcIm1cIj09PWEmJm8ubGVuZ3RoPjImJihuLnB1c2goW3JdLmNvbmNhdChvLnNwbGljZSgwLDIpKSksYT1cImxcIixyPVwibVwiPT09cj9cImxcIjpcIkxcIiksXCJvXCI9PT1hJiYxPT09by5sZW5ndGgmJm4ucHVzaChbcixvWzBdXSksXCJyXCI9PT1hKW4ucHVzaChbcl0uY29uY2F0KG8pKTtlbHNlIGZvcig7by5sZW5ndGg+PWVbYV0mJihuLnB1c2goW3JdLmNvbmNhdChvLnNwbGljZSgwLGVbYV0pKSksZVthXSk7KTtyZXR1cm5cIlwifSkpLG59dmFyIGg9L1thLXpdLztmdW5jdGlvbiBkKHQsZSl7cmV0dXJuW2VbMF0rKGVbMF0tdFswXSksZVsxXSsoZVsxXS10WzFdKV19ZnVuY3Rpb24gcCh0KXt2YXIgZT1sKHQpO2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJuW1tcIk1cIiwwLDBdXTtmb3IodmFyIG49ITEscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdWzBdO2lmKGgudGVzdChpKXx8W1wiVlwiLFwiSFwiLFwiVFwiLFwiU1wiXS5pbmRleE9mKGkpPj0wKXtuPSEwO2JyZWFrfX1pZighbilyZXR1cm4gZTt2YXIgbz1bXSxhPTAscz0wLHU9MCxjPTAsZj0wLHA9ZVswXTtcIk1cIiE9PXBbMF0mJlwibVwiIT09cFswXXx8KHU9YT0rcFsxXSxjPXM9K3BbMl0sZisrLG9bMF09W1wiTVwiLGEsc10pO3I9Zjtmb3IodmFyIGc9ZS5sZW5ndGg7cjxnO3IrKyl7dmFyIHY9ZVtyXSx5PW9bci0xXSxtPVtdLGI9KGk9dlswXSkudG9VcHBlckNhc2UoKTtpZihpIT09Yilzd2l0Y2gobVswXT1iLGIpe2Nhc2VcIkFcIjptWzFdPXZbMV0sbVsyXT12WzJdLG1bM109dlszXSxtWzRdPXZbNF0sbVs1XT12WzVdLG1bNl09K3ZbNl0rYSxtWzddPSt2WzddK3M7YnJlYWs7Y2FzZVwiVlwiOm1bMV09K3ZbMV0rczticmVhaztjYXNlXCJIXCI6bVsxXT0rdlsxXSthO2JyZWFrO2Nhc2VcIk1cIjp1PSt2WzFdK2EsYz0rdlsyXStzO2JyZWFrO2RlZmF1bHQ6Zm9yKHZhciB4PTEsdz12Lmxlbmd0aDt4PHc7eCsrKW1beF09K3ZbeF0rKHglMj9hOnMpfWVsc2UgbT1lW3JdO3N3aXRjaChiKXtjYXNlXCJaXCI6YT0rdSxzPStjO2JyZWFrO2Nhc2VcIkhcIjptPVtcIkxcIixhPW1bMV0sc107YnJlYWs7Y2FzZVwiVlwiOm09W1wiTFwiLGEscz1tWzFdXTticmVhaztjYXNlXCJUXCI6YT1tWzFdLHM9bVsyXTt2YXIgUz1kKFt5WzFdLHlbMl1dLFt5WzNdLHlbNF1dKTttPVtcIlFcIixTWzBdLFNbMV0sYSxzXTticmVhaztjYXNlXCJTXCI6YT1tW20ubGVuZ3RoLTJdLHM9bVttLmxlbmd0aC0xXTt2YXIgRT15Lmxlbmd0aCxfPWQoW3lbRS00XSx5W0UtM11dLFt5W0UtMl0seVtFLTFdXSk7bT1bXCJDXCIsX1swXSxfWzFdLG1bMV0sbVsyXSxhLHNdO2JyZWFrO2Nhc2VcIk1cIjp1PW1bbS5sZW5ndGgtMl0sYz1tW20ubGVuZ3RoLTFdO2JyZWFrO2RlZmF1bHQ6YT1tW20ubGVuZ3RoLTJdLHM9bVttLmxlbmd0aC0xXX1vLnB1c2gobSl9cmV0dXJuIG99ZnVuY3Rpb24gZyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pfWZ1bmN0aW9uIHYodCxlKXtyZXR1cm4gZyh0KSpnKGUpPyh0WzBdKmVbMF0rdFsxXSplWzFdKS8oZyh0KSpnKGUpKToxfWZ1bmN0aW9uIHkodCxlKXtyZXR1cm4odFswXSplWzFdPHRbMV0qZVswXT8tMToxKSpNYXRoLmFjb3Modih0LGUpKX1mdW5jdGlvbiBtKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX1mdW5jdGlvbiBiKHQsZSl7dmFyIG49ZVsxXSxpPWVbMl0sbz1PYmplY3Qoci5CKShPYmplY3Qoci5HKShlWzNdKSwyKk1hdGguUEkpLGE9ZVs0XSxzPWVbNV0sdT10WzBdLGM9dFsxXSxmPWVbNl0sbD1lWzddLGg9TWF0aC5jb3MobykqKHUtZikvMitNYXRoLnNpbihvKSooYy1sKS8yLGQ9LTEqTWF0aC5zaW4obykqKHUtZikvMitNYXRoLmNvcyhvKSooYy1sKS8yLHA9aCpoLyhuKm4pK2QqZC8oaSppKTtwPjEmJihuKj1NYXRoLnNxcnQocCksaSo9TWF0aC5zcXJ0KHApKTt2YXIgZz1uKm4qKGQqZCkraSppKihoKmgpLGI9Zz9NYXRoLnNxcnQoKG4qbiooaSppKS1nKS9nKToxO2E9PT1zJiYoYio9LTEpLGlzTmFOKGIpJiYoYj0wKTt2YXIgeD1pP2IqbipkL2k6MCx3PW4/YiotaSpoL246MCxTPSh1K2YpLzIrTWF0aC5jb3MobykqeC1NYXRoLnNpbihvKSp3LEU9KGMrbCkvMitNYXRoLnNpbihvKSp4K01hdGguY29zKG8pKncsXz1bKGgteCkvbiwoZC13KS9pXSxPPVsoLTEqaC14KS9uLCgtMSpkLXcpL2ldLGs9eShbMSwwXSxfKSxNPXkoXyxPKTtyZXR1cm4gdihfLE8pPD0tMSYmKE09TWF0aC5QSSksdihfLE8pPj0xJiYoTT0wKSwwPT09cyYmTT4wJiYoTS09MipNYXRoLlBJKSwxPT09cyYmTTwwJiYoTSs9MipNYXRoLlBJKSx7Y3g6UyxjeTpFLHJ4Om0odCxbZixsXSk/MDpuLHJ5Om0odCxbZixsXSk/MDppLHN0YXJ0QW5nbGU6ayxlbmRBbmdsZTprK00seFJvdGF0aW9uOm8sYXJjRmxhZzphLHN3ZWVwRmxhZzpzfX1mdW5jdGlvbiB4KHQsZSl7cmV0dXJuW2VbMF0rKGVbMF0tdFswXSksZVsxXSsoZVsxXS10WzFdKV19ZnVuY3Rpb24gdyh0KXtmb3IodmFyIGU9W10sbj1udWxsLHI9bnVsbCxpPW51bGwsbz0wLHM9KHQ9YSh0KSkubGVuZ3RoLHU9MDt1PHM7dSsrKXt2YXIgYz10W3VdO3I9dFt1KzFdO3ZhciBmPWNbMF0sbD17Y29tbWFuZDpmLHByZVBvaW50Om4scGFyYW1zOmMsc3RhcnRUYW5nZW50Om51bGwsZW5kVGFuZ2VudDpudWxsfTtzd2l0Y2goZil7Y2FzZVwiTVwiOmk9W2NbMV0sY1syXV0sbz11O2JyZWFrO2Nhc2VcIkFcIjp2YXIgaD1iKG4sYyk7bC5hcmNQYXJhbXM9aH1pZihcIlpcIj09PWYpbj1pLHI9dFtvKzFdO2Vsc2V7dmFyIGQ9Yy5sZW5ndGg7bj1bY1tkLTJdLGNbZC0xXV19ciYmXCJaXCI9PT1yWzBdJiYocj10W29dLGVbb10mJihlW29dLnByZVBvaW50PW4pKSxsLmN1cnJlbnRQb2ludD1uLGVbb10mJm0obixlW29dLmN1cnJlbnRQb2ludCkmJihlW29dLnByZVBvaW50PWwucHJlUG9pbnQpO3ZhciBwPXI/W3Jbci5sZW5ndGgtMl0scltyLmxlbmd0aC0xXV06bnVsbDtsLm5leHRQb2ludD1wO3ZhciBnPWwucHJlUG9pbnQ7aWYoW1wiTFwiLFwiSFwiLFwiVlwiXS5pbmNsdWRlcyhmKSlsLnN0YXJ0VGFuZ2VudD1bZ1swXS1uWzBdLGdbMV0tblsxXV0sbC5lbmRUYW5nZW50PVtuWzBdLWdbMF0sblsxXS1nWzFdXTtlbHNlIGlmKFwiUVwiPT09Zil7dmFyIHY9W2NbMV0sY1syXV07bC5zdGFydFRhbmdlbnQ9W2dbMF0tdlswXSxnWzFdLXZbMV1dLGwuZW5kVGFuZ2VudD1bblswXS12WzBdLG5bMV0tdlsxXV19ZWxzZSBpZihcIlRcIj09PWYpe3Y9eCgoUz1lW3UtMV0pLmN1cnJlbnRQb2ludCxnKTtcIlFcIj09PVMuY29tbWFuZD8obC5jb21tYW5kPVwiUVwiLGwuc3RhcnRUYW5nZW50PVtnWzBdLXZbMF0sZ1sxXS12WzFdXSxsLmVuZFRhbmdlbnQ9W25bMF0tdlswXSxuWzFdLXZbMV1dKToobC5jb21tYW5kPVwiVExcIixsLnN0YXJ0VGFuZ2VudD1bZ1swXS1uWzBdLGdbMV0tblsxXV0sbC5lbmRUYW5nZW50PVtuWzBdLWdbMF0sblsxXS1nWzFdXSl9ZWxzZSBpZihcIkNcIj09PWYpe3ZhciB5PVtjWzFdLGNbMl1dLHc9W2NbM10sY1s0XV07bC5zdGFydFRhbmdlbnQ9W2dbMF0teVswXSxnWzFdLXlbMV1dLGwuZW5kVGFuZ2VudD1bblswXS13WzBdLG5bMV0td1sxXV19ZWxzZSBpZihcIlNcIj09PWYpe3ZhciBTO3k9eCgoUz1lW3UtMV0pLmN1cnJlbnRQb2ludCxnKSx3PVtjWzFdLGNbMl1dO1wiQ1wiPT09Uy5jb21tYW5kPyhsLmNvbW1hbmQ9XCJDXCIsbC5zdGFydFRhbmdlbnQ9W2dbMF0teVswXSxnWzFdLXlbMV1dLGwuZW5kVGFuZ2VudD1bblswXS13WzBdLG5bMV0td1sxXV0pOihsLmNvbW1hbmQ9XCJTUVwiLGwuc3RhcnRUYW5nZW50PVtnWzBdLXdbMF0sZ1sxXS13WzFdXSxsLmVuZFRhbmdlbnQ9W25bMF0td1swXSxuWzFdLXdbMV1dKX1lbHNlIGlmKFwiQVwiPT09Zil7dmFyIEU9LjAwMSxfPWwuYXJjUGFyYW1zfHx7fSxPPV8uY3gsaz12b2lkIDA9PT1PPzA6TyxNPV8uY3ksQT12b2lkIDA9PT1NPzA6TSxUPV8ucngsQz12b2lkIDA9PT1UPzA6VCxJPV8ucnksUD12b2lkIDA9PT1JPzA6SSxqPV8uc3dlZXBGbGFnLEQ9dm9pZCAwPT09aj8wOmosTj1fLnN0YXJ0QW5nbGUsUj12b2lkIDA9PT1OPzA6TixMPV8uZW5kQW5nbGUsQj12b2lkIDA9PT1MPzA6TDswPT09RCYmKEUqPS0xKTt2YXIgRz1DKk1hdGguY29zKFItRSkrayxGPVAqTWF0aC5zaW4oUi1FKStBO2wuc3RhcnRUYW5nZW50PVtHLWlbMF0sRi1pWzFdXTt2YXIgVT1DKk1hdGguY29zKFIrQitFKStrLHo9UCpNYXRoLnNpbihSK0ItRSkrQTtsLmVuZFRhbmdlbnQ9W2dbMF0tVSxnWzFdLXpdfWUucHVzaChsKX1yZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKHQsZSl7dmFyIG49W10scj10WzBdLGk9dFsxXSxvPXRbMl0sYT10WzNdLHM9dFs0XSx1PXRbNV0sYz10WzZdLGY9dFs3XSxsPXRbOF0saD1lWzBdLGQ9ZVsxXSxwPWVbMl0sZz1lWzNdLHY9ZVs0XSx5PWVbNV0sbT1lWzZdLGI9ZVs3XSx4PWVbOF07cmV0dXJuIG5bMF09aCpyK2QqYStwKmMsblsxXT1oKmkrZCpzK3AqZixuWzJdPWgqbytkKnUrcCpsLG5bM109ZypyK3YqYSt5KmMsbls0XT1nKmkrdipzK3kqZixuWzVdPWcqbyt2KnUreSpsLG5bNl09bSpyK2IqYSt4KmMsbls3XT1tKmkrYipzK3gqZixuWzhdPW0qbytiKnUreCpsLG59ZnVuY3Rpb24gaSh0LGUpe3ZhciBuPVtdLHI9ZVswXSxpPWVbMV07cmV0dXJuIG5bMF09dFswXSpyK3RbM10qaSt0WzZdLG5bMV09dFsxXSpyK3RbNF0qaSt0WzddLG59ZnVuY3Rpb24gbyh0KXt2YXIgZT1bXSxuPXRbMF0scj10WzFdLGk9dFsyXSxvPXRbM10sYT10WzRdLHM9dFs1XSx1PXRbNl0sYz10WzddLGY9dFs4XSxsPWYqYS1zKmMsaD0tZipvK3MqdSxkPWMqby1hKnUscD1uKmwrcipoK2kqZDtyZXR1cm4gcD8ocD0xL3AsZVswXT1sKnAsZVsxXT0oLWYqcitpKmMpKnAsZVsyXT0ocypyLWkqYSkqcCxlWzNdPWgqcCxlWzRdPShmKm4taSp1KSpwLGVbNV09KC1zKm4raSpvKSpwLGVbNl09ZCpwLGVbN109KC1jKm4rcip1KSpwLGVbOF09KGEqbi1yKm8pKnAsZSk6bnVsbH1uLmQoZSxcImJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcn0pKSxuLmQoZSxcImNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKSxuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gb30pKX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKSxuLmQoZSxcImNyZWF0ZVwiLChmdW5jdGlvbigpe3JldHVybiBpfSkpLG4uZChlLFwiY2xvbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gb30pKSxuLmQoZSxcImxlbmd0aFwiLChmdW5jdGlvbigpe3JldHVybiBhfSkpLG4uZChlLFwiZnJvbVZhbHVlc1wiLChmdW5jdGlvbigpe3JldHVybiBzfSkpLG4uZChlLFwiY29weVwiLChmdW5jdGlvbigpe3JldHVybiB1fSkpLG4uZChlLFwic2V0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSksbi5kKGUsXCJhZGRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZn0pKSxuLmQoZSxcInN1YnRyYWN0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSksbi5kKGUsXCJtdWx0aXBseVwiLChmdW5jdGlvbigpe3JldHVybiBofSkpLG4uZChlLFwiZGl2aWRlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGR9KSksbi5kKGUsXCJjZWlsXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSksbi5kKGUsXCJmbG9vclwiLChmdW5jdGlvbigpe3JldHVybiBnfSkpLG4uZChlLFwibWluXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KSksbi5kKGUsXCJtYXhcIiwoZnVuY3Rpb24oKXtyZXR1cm4geX0pKSxuLmQoZSxcInJvdW5kXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG19KSksbi5kKGUsXCJzY2FsZVwiLChmdW5jdGlvbigpe3JldHVybiBifSkpLG4uZChlLFwic2NhbGVBbmRBZGRcIiwoZnVuY3Rpb24oKXtyZXR1cm4geH0pKSxuLmQoZSxcImRpc3RhbmNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHd9KSksbi5kKGUsXCJzcXVhcmVkRGlzdGFuY2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gU30pKSxuLmQoZSxcInNxdWFyZWRMZW5ndGhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRX0pKSxuLmQoZSxcIm5lZ2F0ZVwiLChmdW5jdGlvbigpe3JldHVybiBffSkpLG4uZChlLFwiaW52ZXJzZVwiLChmdW5jdGlvbigpe3JldHVybiBPfSkpLG4uZChlLFwibm9ybWFsaXplXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGt9KSksbi5kKGUsXCJkb3RcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTX0pKSxuLmQoZSxcImNyb3NzXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEF9KSksbi5kKGUsXCJsZXJwXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSksbi5kKGUsXCJoZXJtaXRlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEN9KSksbi5kKGUsXCJiZXppZXJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSX0pKSxuLmQoZSxcInJhbmRvbVwiLChmdW5jdGlvbigpe3JldHVybiBQfSkpLG4uZChlLFwidHJhbnNmb3JtTWF0NFwiLChmdW5jdGlvbigpe3JldHVybiBqfSkpLG4uZChlLFwidHJhbnNmb3JtTWF0M1wiLChmdW5jdGlvbigpe3JldHVybiBEfSkpLG4uZChlLFwidHJhbnNmb3JtUXVhdFwiLChmdW5jdGlvbigpe3JldHVybiBOfSkpLG4uZChlLFwicm90YXRlWFwiLChmdW5jdGlvbigpe3JldHVybiBSfSkpLG4uZChlLFwicm90YXRlWVwiLChmdW5jdGlvbigpe3JldHVybiBMfSkpLG4uZChlLFwicm90YXRlWlwiLChmdW5jdGlvbigpe3JldHVybiBCfSkpLG4uZChlLFwiYW5nbGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gR30pKSxuLmQoZSxcInplcm9cIiwoZnVuY3Rpb24oKXtyZXR1cm4gRn0pKSxuLmQoZSxcInN0clwiLChmdW5jdGlvbigpe3JldHVybiBVfSkpLG4uZChlLFwiZXhhY3RFcXVhbHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gen0pKSxuLmQoZSxcImVxdWFsc1wiLChmdW5jdGlvbigpe3JldHVybiBWfSkpLG4uZChlLFwic3ViXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFh9KSksbi5kKGUsXCJtdWxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gWX0pKSxuLmQoZSxcImRpdlwiLChmdW5jdGlvbigpe3JldHVybiBIfSkpLG4uZChlLFwiZGlzdFwiLChmdW5jdGlvbigpe3JldHVybiBxfSkpLG4uZChlLFwic3FyRGlzdFwiLChmdW5jdGlvbigpe3JldHVybiBLfSkpLG4uZChlLFwibGVuXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFp9KSksbi5kKGUsXCJzcXJMZW5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gUX0pKSxuLmQoZSxcImZvckVhY2hcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSn0pKTt2YXIgcj1uKDEyKTtmdW5jdGlvbiBpKCl7dmFyIHQ9bmV3IHIuYSgzKTtyZXR1cm4gci5hIT1GbG9hdDMyQXJyYXkmJih0WzBdPTAsdFsxXT0wLHRbMl09MCksdH1mdW5jdGlvbiBvKHQpe3ZhciBlPW5ldyByLmEoMyk7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGV9ZnVuY3Rpb24gYSh0KXt2YXIgZT10WzBdLG49dFsxXSxyPXRbMl07cmV0dXJuIE1hdGguaHlwb3QoZSxuLHIpfWZ1bmN0aW9uIHModCxlLG4pe3ZhciBpPW5ldyByLmEoMyk7cmV0dXJuIGlbMF09dCxpWzFdPWUsaVsyXT1uLGl9ZnVuY3Rpb24gdSh0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0fWZ1bmN0aW9uIGModCxlLG4scil7cmV0dXJuIHRbMF09ZSx0WzFdPW4sdFsyXT1yLHR9ZnVuY3Rpb24gZih0LGUsbil7cmV0dXJuIHRbMF09ZVswXStuWzBdLHRbMV09ZVsxXStuWzFdLHRbMl09ZVsyXStuWzJdLHR9ZnVuY3Rpb24gbCh0LGUsbil7cmV0dXJuIHRbMF09ZVswXS1uWzBdLHRbMV09ZVsxXS1uWzFdLHRbMl09ZVsyXS1uWzJdLHR9ZnVuY3Rpb24gaCh0LGUsbil7cmV0dXJuIHRbMF09ZVswXSpuWzBdLHRbMV09ZVsxXSpuWzFdLHRbMl09ZVsyXSpuWzJdLHR9ZnVuY3Rpb24gZCh0LGUsbil7cmV0dXJuIHRbMF09ZVswXS9uWzBdLHRbMV09ZVsxXS9uWzFdLHRbMl09ZVsyXS9uWzJdLHR9ZnVuY3Rpb24gcCh0LGUpe3JldHVybiB0WzBdPU1hdGguY2VpbChlWzBdKSx0WzFdPU1hdGguY2VpbChlWzFdKSx0WzJdPU1hdGguY2VpbChlWzJdKSx0fWZ1bmN0aW9uIGcodCxlKXtyZXR1cm4gdFswXT1NYXRoLmZsb29yKGVbMF0pLHRbMV09TWF0aC5mbG9vcihlWzFdKSx0WzJdPU1hdGguZmxvb3IoZVsyXSksdH1mdW5jdGlvbiB2KHQsZSxuKXtyZXR1cm4gdFswXT1NYXRoLm1pbihlWzBdLG5bMF0pLHRbMV09TWF0aC5taW4oZVsxXSxuWzFdKSx0WzJdPU1hdGgubWluKGVbMl0sblsyXSksdH1mdW5jdGlvbiB5KHQsZSxuKXtyZXR1cm4gdFswXT1NYXRoLm1heChlWzBdLG5bMF0pLHRbMV09TWF0aC5tYXgoZVsxXSxuWzFdKSx0WzJdPU1hdGgubWF4KGVbMl0sblsyXSksdH1mdW5jdGlvbiBtKHQsZSl7cmV0dXJuIHRbMF09TWF0aC5yb3VuZChlWzBdKSx0WzFdPU1hdGgucm91bmQoZVsxXSksdFsyXT1NYXRoLnJvdW5kKGVbMl0pLHR9ZnVuY3Rpb24gYih0LGUsbil7cmV0dXJuIHRbMF09ZVswXSpuLHRbMV09ZVsxXSpuLHRbMl09ZVsyXSpuLHR9ZnVuY3Rpb24geCh0LGUsbixyKXtyZXR1cm4gdFswXT1lWzBdK25bMF0qcix0WzFdPWVbMV0rblsxXSpyLHRbMl09ZVsyXStuWzJdKnIsdH1mdW5jdGlvbiB3KHQsZSl7dmFyIG49ZVswXS10WzBdLHI9ZVsxXS10WzFdLGk9ZVsyXS10WzJdO3JldHVybiBNYXRoLmh5cG90KG4scixpKX1mdW5jdGlvbiBTKHQsZSl7dmFyIG49ZVswXS10WzBdLHI9ZVsxXS10WzFdLGk9ZVsyXS10WzJdO3JldHVybiBuKm4rcipyK2kqaX1mdW5jdGlvbiBFKHQpe3ZhciBlPXRbMF0sbj10WzFdLHI9dFsyXTtyZXR1cm4gZSplK24qbityKnJ9ZnVuY3Rpb24gXyh0LGUpe3JldHVybiB0WzBdPS1lWzBdLHRbMV09LWVbMV0sdFsyXT0tZVsyXSx0fWZ1bmN0aW9uIE8odCxlKXtyZXR1cm4gdFswXT0xL2VbMF0sdFsxXT0xL2VbMV0sdFsyXT0xL2VbMl0sdH1mdW5jdGlvbiBrKHQsZSl7dmFyIG49ZVswXSxyPWVbMV0saT1lWzJdLG89bipuK3IqcitpKmk7cmV0dXJuIG8+MCYmKG89MS9NYXRoLnNxcnQobykpLHRbMF09ZVswXSpvLHRbMV09ZVsxXSpvLHRbMl09ZVsyXSpvLHR9ZnVuY3Rpb24gTSh0LGUpe3JldHVybiB0WzBdKmVbMF0rdFsxXSplWzFdK3RbMl0qZVsyXX1mdW5jdGlvbiBBKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPWVbMl0sYT1uWzBdLHM9blsxXSx1PW5bMl07cmV0dXJuIHRbMF09aSp1LW8qcyx0WzFdPW8qYS1yKnUsdFsyXT1yKnMtaSphLHR9ZnVuY3Rpb24gVCh0LGUsbixyKXt2YXIgaT1lWzBdLG89ZVsxXSxhPWVbMl07cmV0dXJuIHRbMF09aStyKihuWzBdLWkpLHRbMV09bytyKihuWzFdLW8pLHRbMl09YStyKihuWzJdLWEpLHR9ZnVuY3Rpb24gQyh0LGUsbixyLGksbyl7dmFyIGE9bypvLHM9YSooMipvLTMpKzEsdT1hKihvLTIpK28sYz1hKihvLTEpLGY9YSooMy0yKm8pO3JldHVybiB0WzBdPWVbMF0qcytuWzBdKnUrclswXSpjK2lbMF0qZix0WzFdPWVbMV0qcytuWzFdKnUrclsxXSpjK2lbMV0qZix0WzJdPWVbMl0qcytuWzJdKnUrclsyXSpjK2lbMl0qZix0fWZ1bmN0aW9uIEkodCxlLG4scixpLG8pe3ZhciBhPTEtbyxzPWEqYSx1PW8qbyxjPXMqYSxmPTMqbypzLGw9Myp1KmEsaD11Km87cmV0dXJuIHRbMF09ZVswXSpjK25bMF0qZityWzBdKmwraVswXSpoLHRbMV09ZVsxXSpjK25bMV0qZityWzFdKmwraVsxXSpoLHRbMl09ZVsyXSpjK25bMl0qZityWzJdKmwraVsyXSpoLHR9ZnVuY3Rpb24gUCh0LGUpe2U9ZXx8MTt2YXIgbj0yKnIuYygpKk1hdGguUEksaT0yKnIuYygpLTEsbz1NYXRoLnNxcnQoMS1pKmkpKmU7cmV0dXJuIHRbMF09TWF0aC5jb3Mobikqbyx0WzFdPU1hdGguc2luKG4pKm8sdFsyXT1pKmUsdH1mdW5jdGlvbiBqKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPWVbMl0sYT1uWzNdKnIrbls3XSppK25bMTFdKm8rblsxNV07cmV0dXJuIGE9YXx8MSx0WzBdPShuWzBdKnIrbls0XSppK25bOF0qbytuWzEyXSkvYSx0WzFdPShuWzFdKnIrbls1XSppK25bOV0qbytuWzEzXSkvYSx0WzJdPShuWzJdKnIrbls2XSppK25bMTBdKm8rblsxNF0pL2EsdH1mdW5jdGlvbiBEKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPWVbMl07cmV0dXJuIHRbMF09cipuWzBdK2kqblszXStvKm5bNl0sdFsxXT1yKm5bMV0raSpuWzRdK28qbls3XSx0WzJdPXIqblsyXStpKm5bNV0rbypuWzhdLHR9ZnVuY3Rpb24gTih0LGUsbil7dmFyIHI9blswXSxpPW5bMV0sbz1uWzJdLGE9blszXSxzPWVbMF0sdT1lWzFdLGM9ZVsyXSxmPWkqYy1vKnUsbD1vKnMtcipjLGg9cip1LWkqcyxkPWkqaC1vKmwscD1vKmYtcipoLGc9cipsLWkqZix2PTIqYTtyZXR1cm4gZio9dixsKj12LGgqPXYsZCo9MixwKj0yLGcqPTIsdFswXT1zK2YrZCx0WzFdPXUrbCtwLHRbMl09YytoK2csdH1mdW5jdGlvbiBSKHQsZSxuLHIpe3ZhciBpPVtdLG89W107cmV0dXJuIGlbMF09ZVswXS1uWzBdLGlbMV09ZVsxXS1uWzFdLGlbMl09ZVsyXS1uWzJdLG9bMF09aVswXSxvWzFdPWlbMV0qTWF0aC5jb3MociktaVsyXSpNYXRoLnNpbihyKSxvWzJdPWlbMV0qTWF0aC5zaW4ocikraVsyXSpNYXRoLmNvcyhyKSx0WzBdPW9bMF0rblswXSx0WzFdPW9bMV0rblsxXSx0WzJdPW9bMl0rblsyXSx0fWZ1bmN0aW9uIEwodCxlLG4scil7dmFyIGk9W10sbz1bXTtyZXR1cm4gaVswXT1lWzBdLW5bMF0saVsxXT1lWzFdLW5bMV0saVsyXT1lWzJdLW5bMl0sb1swXT1pWzJdKk1hdGguc2luKHIpK2lbMF0qTWF0aC5jb3Mociksb1sxXT1pWzFdLG9bMl09aVsyXSpNYXRoLmNvcyhyKS1pWzBdKk1hdGguc2luKHIpLHRbMF09b1swXStuWzBdLHRbMV09b1sxXStuWzFdLHRbMl09b1syXStuWzJdLHR9ZnVuY3Rpb24gQih0LGUsbixyKXt2YXIgaT1bXSxvPVtdO3JldHVybiBpWzBdPWVbMF0tblswXSxpWzFdPWVbMV0tblsxXSxpWzJdPWVbMl0tblsyXSxvWzBdPWlbMF0qTWF0aC5jb3MociktaVsxXSpNYXRoLnNpbihyKSxvWzFdPWlbMF0qTWF0aC5zaW4ocikraVsxXSpNYXRoLmNvcyhyKSxvWzJdPWlbMl0sdFswXT1vWzBdK25bMF0sdFsxXT1vWzFdK25bMV0sdFsyXT1vWzJdK25bMl0sdH1mdW5jdGlvbiBHKHQsZSl7dmFyIG49dFswXSxyPXRbMV0saT10WzJdLG89ZVswXSxhPWVbMV0scz1lWzJdLHU9TWF0aC5zcXJ0KG4qbityKnIraSppKSpNYXRoLnNxcnQobypvK2EqYStzKnMpLGM9dSYmTSh0LGUpL3U7cmV0dXJuIE1hdGguYWNvcyhNYXRoLm1pbihNYXRoLm1heChjLC0xKSwxKSl9ZnVuY3Rpb24gRih0KXtyZXR1cm4gdFswXT0wLHRbMV09MCx0WzJdPTAsdH1mdW5jdGlvbiBVKHQpe3JldHVyblwidmVjMyhcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiKVwifWZ1bmN0aW9uIHoodCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdJiZ0WzJdPT09ZVsyXX1mdW5jdGlvbiBWKHQsZSl7dmFyIG49dFswXSxpPXRbMV0sbz10WzJdLGE9ZVswXSxzPWVbMV0sdT1lWzJdO3JldHVybiBNYXRoLmFicyhuLWEpPD1yLmIqTWF0aC5tYXgoMSxNYXRoLmFicyhuKSxNYXRoLmFicyhhKSkmJk1hdGguYWJzKGktcyk8PXIuYipNYXRoLm1heCgxLE1hdGguYWJzKGkpLE1hdGguYWJzKHMpKSYmTWF0aC5hYnMoby11KTw9ci5iKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnModSkpfXZhciBXLFg9bCxZPWgsSD1kLHE9dyxLPVMsWj1hLFE9RSxKPShXPWkoKSxmdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGEscztmb3IoZXx8KGU9Myksbnx8KG49MCkscz1yP01hdGgubWluKHIqZStuLHQubGVuZ3RoKTp0Lmxlbmd0aCxhPW47YTxzO2ErPWUpV1swXT10W2FdLFdbMV09dFthKzFdLFdbMl09dFthKzJdLGkoVyxXLG8pLHRbYV09V1swXSx0W2ErMV09V1sxXSx0W2ErMl09V1syXTtyZXR1cm4gdH0pfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5TVEFDS19PVkVSRkxPVz1lLkNJUkNVTEFSX0RFUEVOREVOQ1lfSU5fRkFDVE9SWT1lLlBPU1RfQ09OU1RSVUNUX0VSUk9SPWUuTVVMVElQTEVfUE9TVF9DT05TVFJVQ1RfTUVUSE9EUz1lLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfU0tJUF9CQVNFX0NIRUNLPWUuQ09OVEFJTkVSX09QVElPTlNfSU5WQUxJRF9BVVRPX0JJTkRfSU5KRUNUQUJMRT1lLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfREVGQVVMVF9TQ09QRT1lLkNPTlRBSU5FUl9PUFRJT05TX01VU1RfQkVfQU5fT0JKRUNUPWUuQVJHVU1FTlRTX0xFTkdUSF9NSVNNQVRDSD1lLklOVkFMSURfREVDT1JBVE9SX09QRVJBVElPTj1lLklOVkFMSURfVE9fU0VMRl9WQUxVRT1lLklOVkFMSURfRlVOQ1RJT05fQklORElORz1lLklOVkFMSURfTUlERExFV0FSRV9SRVRVUk49ZS5OT19NT1JFX1NOQVBTSE9UU19BVkFJTEFCTEU9ZS5JTlZBTElEX0JJTkRJTkdfVFlQRT1lLk5PVF9JTVBMRU1FTlRFRD1lLkNJUkNVTEFSX0RFUEVOREVOQ1k9ZS5VTkRFRklORURfSU5KRUNUX0FOTk9UQVRJT049ZS5NSVNTSU5HX0lOSkVDVF9BTk5PVEFUSU9OPWUuTUlTU0lOR19JTkpFQ1RBQkxFX0FOTk9UQVRJT049ZS5OT1RfUkVHSVNURVJFRD1lLkNBTk5PVF9VTkJJTkQ9ZS5BTUJJR1VPVVNfTUFUQ0g9ZS5LRVlfTk9UX0ZPVU5EPWUuTlVMTF9BUkdVTUVOVD1lLkRVUExJQ0FURURfTUVUQURBVEE9ZS5EVVBMSUNBVEVEX0lOSkVDVEFCTEVfREVDT1JBVE9SPXZvaWQgMCxlLkRVUExJQ0FURURfSU5KRUNUQUJMRV9ERUNPUkFUT1I9XCJDYW5ub3QgYXBwbHkgQGluamVjdGFibGUgZGVjb3JhdG9yIG11bHRpcGxlIHRpbWVzLlwiLGUuRFVQTElDQVRFRF9NRVRBREFUQT1cIk1ldGFkYXRhIGtleSB3YXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIHBhcmFtZXRlcjpcIixlLk5VTExfQVJHVU1FTlQ9XCJOVUxMIGFyZ3VtZW50XCIsZS5LRVlfTk9UX0ZPVU5EPVwiS2V5IE5vdCBGb3VuZFwiLGUuQU1CSUdVT1VTX01BVENIPVwiQW1iaWd1b3VzIG1hdGNoIGZvdW5kIGZvciBzZXJ2aWNlSWRlbnRpZmllcjpcIixlLkNBTk5PVF9VTkJJTkQ9XCJDb3VsZCBub3QgdW5iaW5kIHNlcnZpY2VJZGVudGlmaWVyOlwiLGUuTk9UX1JFR0lTVEVSRUQ9XCJObyBtYXRjaGluZyBiaW5kaW5ncyBmb3VuZCBmb3Igc2VydmljZUlkZW50aWZpZXI6XCIsZS5NSVNTSU5HX0lOSkVDVEFCTEVfQU5OT1RBVElPTj1cIk1pc3NpbmcgcmVxdWlyZWQgQGluamVjdGFibGUgYW5ub3RhdGlvbiBpbjpcIixlLk1JU1NJTkdfSU5KRUNUX0FOTk9UQVRJT049XCJNaXNzaW5nIHJlcXVpcmVkIEBpbmplY3Qgb3IgQG11bHRpSW5qZWN0IGFubm90YXRpb24gaW46XCIsZS5VTkRFRklORURfSU5KRUNUX0FOTk9UQVRJT049ZnVuY3Rpb24odCl7cmV0dXJuXCJAaW5qZWN0IGNhbGxlZCB3aXRoIHVuZGVmaW5lZCB0aGlzIGNvdWxkIG1lYW4gdGhhdCB0aGUgY2xhc3MgXCIrdCtcIiBoYXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHByb2JsZW0uIFlvdSBjYW4gdXNlIGEgTGF6eVNlcnZpY2VJZGVudGlmZXIgdG8gIG92ZXJjb21lIHRoaXMgbGltaXRhdGlvbi5cIn0sZS5DSVJDVUxBUl9ERVBFTkRFTkNZPVwiQ2lyY3VsYXIgZGVwZW5kZW5jeSBmb3VuZDpcIixlLk5PVF9JTVBMRU1FTlRFRD1cIlNvcnJ5LCB0aGlzIGZlYXR1cmUgaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkIHlldC5cIixlLklOVkFMSURfQklORElOR19UWVBFPVwiSW52YWxpZCBiaW5kaW5nIHR5cGU6XCIsZS5OT19NT1JFX1NOQVBTSE9UU19BVkFJTEFCTEU9XCJObyBzbmFwc2hvdCBhdmFpbGFibGUgdG8gcmVzdG9yZS5cIixlLklOVkFMSURfTUlERExFV0FSRV9SRVRVUk49XCJJbnZhbGlkIHJldHVybiB0eXBlIGluIG1pZGRsZXdhcmUuIE1pZGRsZXdhcmUgbXVzdCByZXR1cm4hXCIsZS5JTlZBTElEX0ZVTkNUSU9OX0JJTkRJTkc9XCJWYWx1ZSBwcm92aWRlZCB0byBmdW5jdGlvbiBiaW5kaW5nIG11c3QgYmUgYSBmdW5jdGlvbiFcIixlLklOVkFMSURfVE9fU0VMRl9WQUxVRT1cIlRoZSB0b1NlbGYgZnVuY3Rpb24gY2FuIG9ubHkgYmUgYXBwbGllZCB3aGVuIGEgY29uc3RydWN0b3IgaXMgdXNlZCBhcyBzZXJ2aWNlIGlkZW50aWZpZXJcIixlLklOVkFMSURfREVDT1JBVE9SX09QRVJBVElPTj1cIlRoZSBAaW5qZWN0IEBtdWx0aUluamVjdCBAdGFnZ2VkIGFuZCBAbmFtZWQgZGVjb3JhdG9ycyBtdXN0IGJlIGFwcGxpZWQgdG8gdGhlIHBhcmFtZXRlcnMgb2YgYSBjbGFzcyBjb25zdHJ1Y3RvciBvciBhIGNsYXNzIHByb3BlcnR5LlwiLGUuQVJHVU1FTlRTX0xFTkdUSF9NSVNNQVRDSD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm5cIlRoZSBudW1iZXIgb2YgY29uc3RydWN0b3IgYXJndW1lbnRzIGluIHRoZSBkZXJpdmVkIGNsYXNzIFwiK3RbMF0rXCIgbXVzdCBiZSA+PSB0aGFuIHRoZSBudW1iZXIgb2YgY29uc3RydWN0b3IgYXJndW1lbnRzIG9mIGl0cyBiYXNlIGNsYXNzLlwifSxlLkNPTlRBSU5FUl9PUFRJT05TX01VU1RfQkVfQU5fT0JKRUNUPVwiSW52YWxpZCBDb250YWluZXIgY29uc3RydWN0b3IgYXJndW1lbnQuIENvbnRhaW5lciBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0LlwiLGUuQ09OVEFJTkVSX09QVElPTlNfSU5WQUxJRF9ERUZBVUxUX1NDT1BFPVwiSW52YWxpZCBDb250YWluZXIgb3B0aW9uLiBEZWZhdWx0IHNjb3BlIG11c3QgYmUgYSBzdHJpbmcgKCdzaW5nbGV0b24nIG9yICd0cmFuc2llbnQnKS5cIixlLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfQVVUT19CSU5EX0lOSkVDVEFCTEU9XCJJbnZhbGlkIENvbnRhaW5lciBvcHRpb24uIEF1dG8gYmluZCBpbmplY3RhYmxlIG11c3QgYmUgYSBib29sZWFuXCIsZS5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX1NLSVBfQkFTRV9DSEVDSz1cIkludmFsaWQgQ29udGFpbmVyIG9wdGlvbi4gU2tpcCBiYXNlIGNoZWNrIG11c3QgYmUgYSBib29sZWFuXCIsZS5NVUxUSVBMRV9QT1NUX0NPTlNUUlVDVF9NRVRIT0RTPVwiQ2Fubm90IGFwcGx5IEBwb3N0Q29uc3RydWN0IGRlY29yYXRvciBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBjbGFzc1wiLGUuUE9TVF9DT05TVFJVQ1RfRVJST1I9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuXCJAcG9zdENvbnN0cnVjdCBlcnJvciBpbiBjbGFzcyBcIit0WzBdK1wiOiBcIit0WzFdfSxlLkNJUkNVTEFSX0RFUEVOREVOQ1lfSU5fRkFDVE9SWT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm5cIkl0IGxvb2tzIGxpa2UgdGhlcmUgaXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGluIG9uZSBvZiB0aGUgJ1wiK3RbMF0rXCInIGJpbmRpbmdzLiBQbGVhc2UgaW52ZXN0aWdhdGUgYmluZGluZ3Mgd2l0aHNlcnZpY2UgaWRlbnRpZmllciAnXCIrdFsxXStcIicuXCJ9LGUuU1RBQ0tfT1ZFUkZMT1c9XCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwifSxmdW5jdGlvbih0LGUsbil7dmFyIHI7dHJ5e3I9e2Nsb25lOm4oMjkwKSxjb25zdGFudDpuKDE1MiksZWFjaDpuKDE5NiksZmlsdGVyOm4oMTk5KSxoYXM6bigyMTApLGlzQXJyYXk6bigyOSksaXNFbXB0eTpuKDM2NiksaXNGdW5jdGlvbjpuKDg2KSxpc1VuZGVmaW5lZDpuKDIxMSksa2V5czpuKDYwKSxtYXA6bigyMTIpLHJlZHVjZTpuKDIxNCksc2l6ZTpuKDM2OSksdHJhbnNmb3JtOm4oMzc1KSx1bmlvbjpuKDM3NiksdmFsdWVzOm4oMjIwKX19Y2F0Y2godCl7fXJ8fChyPXdpbmRvdy5fKSx0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQpe3JldHVybihuPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX10LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9bih0KTtyZXR1cm4gbnVsbCE9dCYmKFwib2JqZWN0XCI9PWV8fFwiZnVuY3Rpb25cIj09ZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI7dHJ5e3I9bigyODgpfWNhdGNoKHQpe31yfHwocj13aW5kb3cuZ3JhcGhsaWIpLHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4ocj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9dmFyIGk9bigxNzgpLG89XCJvYmplY3RcIj09KFwidW5kZWZpbmVkXCI9PXR5cGVvZiBzZWxmP1widW5kZWZpbmVkXCI6cihzZWxmKSkmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGE9aXx8b3x8RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO3QuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKG49XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfXQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmXCJvYmplY3RcIj09bih0KX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLk1ldGFkYXRhPXZvaWQgMDt2YXIgcj1uKDMxKSxpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMua2V5PXQsdGhpcy52YWx1ZT1lfXJldHVybiB0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmtleT09PXIuTkFNRURfVEFHP1wibmFtZWQ6IFwiK3RoaXMudmFsdWUudG9TdHJpbmcoKStcIiBcIjpcInRhZ2dlZDogeyBrZXk6XCIrdGhpcy5rZXkudG9TdHJpbmcoKStcIiwgdmFsdWU6IFwiK3RoaXMudmFsdWUrXCIgfVwifSx0fSgpO2UuTWV0YWRhdGE9aX0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDU5KSxpPW4oNDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdHx8aSh0KSYmXCJbb2JqZWN0IE51bWJlcl1cIj09cih0KX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gWH0pKTt2YXIgcixpLG8sYSxzLHUsYyxmLGwsaCxkLHAsZyx2LHksbSxiLHgsdyxTLEUsXyxPLGssTT1uKDkpLEE9bi5uKE0pLFQ9bigxNCksQz1uLm4oVCksST1uKDEwKSxQPW4ubihJKSxqPW4oNiksRD1uLm4oaiksTj1uKDcpLFI9bi5uKE4pLEw9bigxMSksQj1uLm4oTCksRz0obigyOCksbigyKSksRj1uKDUpLFU9bigxMyksej1uKDM2KTtmdW5jdGlvbiBWKHQsZSl7dmFyIG47aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFN5bWJvbHx8bnVsbD09dFtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybjtpZihcInN0cmluZ1wiPT10eXBlb2YgdClyZXR1cm4gVyh0LGUpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTtcIk9iamVjdFwiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZihcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4pcmV0dXJuIEFycmF5LmZyb20odCk7aWYoXCJBcmd1bWVudHNcIj09PW58fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKXJldHVybiBXKHQsZSl9KHQpKXx8ZSYmdCYmXCJudW1iZXJcIj09dHlwZW9mIHQubGVuZ3RoKXtuJiYodD1uKTt2YXIgcj0wLGk9ZnVuY3Rpb24oKXt9O3JldHVybntzOmksbjpmdW5jdGlvbigpe3JldHVybiByPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtyKytdfX0sZTpmdW5jdGlvbih0KXt0aHJvdyB0fSxmOml9fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX12YXIgbyxhPSEwLHM9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPXRbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7cz0hMCxvPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IG99fX19ZnVuY3Rpb24gVyh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfXZhciBYPShyPU9iamVjdChGLmluamVjdGFibGUpKCksaT1PYmplY3QoRi5pbmplY3QpKFUuYS5NZXNoQ29tcG9uZW50TWFuYWdlciksbz1PYmplY3QoRi5pbmplY3QpKFUuYS5HZW9tZXRyeUNvbXBvbmVudE1hbmFnZXIpLGE9T2JqZWN0KEYuaW5qZWN0KShVLmEuTWF0ZXJpYWxDb21wb25lbnRNYW5hZ2VyKSxzPU9iamVjdChGLmluamVjdCkoVS5hLkN1bGxhYmxlQ29tcG9uZW50TWFuYWdlciksdT1PYmplY3QoRi5pbmplY3QpKFUuYS5UcmFuc2Zvcm1Db21wb25lbnRNYW5hZ2VyKSxjPU9iamVjdChGLmluamVjdCkoVS5hLkhpZXJhcmNoeUNvbXBvbmVudE1hbmFnZXIpLGY9T2JqZWN0KEYuaW5qZWN0KShVLmEuU3lzdGVtcyksbD1PYmplY3QoRi5uYW1lZCkoVS5hLkZyYW1lR3JhcGhTeXN0ZW0pLGg9T2JqZWN0KEYuaW5qZWN0KShVLmEuUmVuZGVyRW5naW5lKSxkPU9iamVjdChGLmluamVjdCkoVS5hLlJlc291cmNlUG9vbCkscigoaz1PPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBlPXRoaXM7RCgpKHRoaXMsdCksUCgpKHRoaXMsXCJtZXNoXCIsdix0aGlzKSxQKCkodGhpcyxcImdlb21ldHJ5XCIseSx0aGlzKSxQKCkodGhpcyxcIm1hdGVyaWFsXCIsbSx0aGlzKSxQKCkodGhpcyxcImN1bGxhYmxlXCIsYix0aGlzKSxQKCkodGhpcyxcInRyYW5zZm9ybVwiLHgsdGhpcyksUCgpKHRoaXMsXCJoaWVyYXJjaHlcIix3LHRoaXMpLFAoKSh0aGlzLFwiZnJhbWVHcmFwaFN5c3RlbVwiLFMsdGhpcyksUCgpKHRoaXMsXCJlbmdpbmVcIixFLHRoaXMpLFAoKSh0aGlzLFwicmVzb3VyY2VQb29sXCIsXyx0aGlzKSx0aGlzLm1vZGVsQ2FjaGU9e30sdGhpcy5zZXR1cD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jcmVhdGVSZW5kZXJUYXJnZXQoZSxcImNvbG9yIGJ1ZmZlclwiLHt3aWR0aDoxLGhlaWdodDoxLHVzYWdlOnouYS5SRU5ERVJfQVRUQUNITUVOVHx6LmEuU0FNUExFRHx6LmEuQ09QWV9TUkN9KTtuLmRhdGE9e291dHB1dDplLndyaXRlKHQscil9fSx0aGlzLmV4ZWN1dGU9ZnVuY3Rpb24oKXt2YXIgdD1DKCkoQS5hLm1hcmsoKGZ1bmN0aW9uIHQobixyLGkpe3ZhciBvLGEscyx1LGMsZjtyZXR1cm4gQS5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOm89bi5nZXRSZXNvdXJjZU5vZGUoci5kYXRhLm91dHB1dCksYT1lLnJlc291cmNlUG9vbC5nZXRPckNyZWF0ZVJlc291cmNlKG8ucmVzb3VyY2UpLHM9VihpKSx0LnByZXY9MyxzLnMoKTtjYXNlIDU6aWYoKHU9cy5uKCkpLmRvbmUpe3QubmV4dD0xMTticmVha31yZXR1cm4gYz11LnZhbHVlLHQubmV4dD05LGUuaW5pdFZpZXcoYyk7Y2FzZSA5OnQubmV4dD01O2JyZWFrO2Nhc2UgMTE6dC5uZXh0PTE2O2JyZWFrO2Nhc2UgMTM6dC5wcmV2PTEzLHQudDA9dC5jYXRjaCgzKSxzLmUodC50MCk7Y2FzZSAxNjpyZXR1cm4gdC5wcmV2PTE2LHMuZigpLHQuZmluaXNoKDE2KTtjYXNlIDE5OmY9ZS5lbmdpbmUuZ2V0Q2FudmFzKCksYS5yZXNpemUoe3dpZHRoOmYud2lkdGgsaGVpZ2h0OmYuaGVpZ2h0fSksZS5lbmdpbmUuc2V0U2Npc3Nvcih7ZW5hYmxlOiExfSksZS5lbmdpbmUuY2xlYXIoe2ZyYW1lYnVmZmVyOmEsY29sb3I6aVswXS5nZXRDbGVhckNvbG9yKCksZGVwdGg6MX0pLGUuZW5naW5lLnVzZUZyYW1lYnVmZmVyKGEsKGZ1bmN0aW9uKCl7dmFyIHQsbj1WKGkpO3RyeXtmb3Iobi5zKCk7ISh0PW4ubigpKS5kb25lOyl7dmFyIHI9dC52YWx1ZTtlLnJlbmRlclZpZXcocil9fWNhdGNoKHQpe24uZSh0KX1maW5hbGx5e24uZigpfX0pKTtjYXNlIDI0OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LG51bGwsW1szLDEzLDE2LDE5XV0pfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCl9dmFyIGUsbjtyZXR1cm4gUigpKHQsW3trZXk6XCJyZW5kZXJWaWV3XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRTY2VuZSgpLG49dC5nZXRDYW1lcmEoKSxyPW4uZ2V0Vmlld1RyYW5zZm9ybSgpLGk9Ry5iLm11bHRpcGx5KEcuYi5jcmVhdGUoKSxuLmdldFBlcnNwZWN0aXZlKCkscik7bi5nZXRGcnVzdHVtKCkuZXh0cmFjdEZyb21WUE1hdHJpeChpKTt2YXIgbz10LmdldFZpZXdwb3J0KCksYT1vLngscz1vLnksdT1vLndpZHRoLGM9by5oZWlnaHQ7dGhpcy5lbmdpbmUudmlld3BvcnQoe3g6YSx5OnMsd2lkdGg6dSxoZWlnaHQ6Y30pO3ZhciBmLGw9VihlLmdldEVudGl0aWVzKCkpO3RyeXtmb3IobC5zKCk7IShmPWwubigpKS5kb25lOyl7dmFyIGg9Zi52YWx1ZTt0aGlzLnJlbmRlck1lc2goaCx7Y2FtZXJhOm4sdmlldzp0LHZpZXdNYXRyaXg6cn0pfX1jYXRjaCh0KXtsLmUodCl9ZmluYWxseXtsLmYoKX19fSx7a2V5OlwicmVuZGVyTWVzaFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jYW1lcmEscj1lLnZpZXcsaT1lLnZpZXdNYXRyaXgsbz10aGlzLm1lc2guZ2V0Q29tcG9uZW50QnlFbnRpdHkodCk7aWYobyYmby52aXNpYmxlKXt2YXIgYT1vLm1hdGVyaWFsLHM9by5nZW9tZXRyeTtpZihzJiYhcy5kaXJ0eSYmYSl7dmFyIHU9dGhpcy50cmFuc2Zvcm0uZ2V0Q29tcG9uZW50QnlFbnRpdHkodCksYz1HLmIubXVsdGlwbHkoRy5iLmNyZWF0ZSgpLGksdS53b3JsZFRyYW5zZm9ybSksZj1yLmdldFZpZXdwb3J0KCksbD1mLndpZHRoLGg9Zi5oZWlnaHQ7YS5zZXRVbmlmb3JtKHtwcm9qZWN0aW9uTWF0cml4Om4uZ2V0UGVyc3BlY3RpdmUoKSxtb2RlbFZpZXdNYXRyaXg6Yyxtb2RlbE1hdHJpeDp1LndvcmxkVHJhbnNmb3JtLHZpZXdNYXRyaXg6aSxjYW1lcmFQb3NpdGlvbjpuLmdldFBvc2l0aW9uKCksdV92aWV3cG9ydDpbbCxoXX0pLG8ubW9kZWwmJihvLm1vZGVsLmRyYXcoe3VuaWZvcm1zOmEudW5pZm9ybXMucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0W2UubmFtZV09ZS5kYXRhLHR9KSx7fSl9KSxhLnVuaWZvcm1zLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZGlydHk9ITF9KSksYS5kaXJ0eT0hMSl9fX19LHtrZXk6XCJpbml0TWVzaFwiLHZhbHVlOihuPUMoKShBLmEubWFyaygoZnVuY3Rpb24gdChlLG4pe3ZhciByLGksbyxhLHMsdSxjLGY7cmV0dXJuIEEuYS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDppZihyPXRoaXMubWVzaC5nZXRDb21wb25lbnRCeUVudGl0eShlKSl7dC5uZXh0PTM7YnJlYWt9cmV0dXJuIHQuYWJydXB0KFwicmV0dXJuXCIpO2Nhc2UgMzppZihpPXIubWF0ZXJpYWwsKG89ci5nZW9tZXRyeSkmJiFvLmRpcnR5JiZpKXt0Lm5leHQ9NzticmVha31yZXR1cm4gdC5hYnJ1cHQoXCJyZXR1cm5cIik7Y2FzZSA3OmlmKHIubW9kZWwpe3QubmV4dD0yNDticmVha31pZihhPVwibS1cIi5jb25jYXQoaS5lbnRpdHksXCItZy1cIikuY29uY2F0KG8uZW50aXR5KSwhdGhpcy5tb2RlbENhY2hlW2FdKXt0Lm5leHQ9MTI7YnJlYWt9cmV0dXJuIHIubW9kZWw9dGhpcy5tb2RlbENhY2hlW2FdLHQuYWJydXB0KFwicmV0dXJuXCIpO2Nhc2UgMTI6cmV0dXJuIGkuc2V0VW5pZm9ybSh7cHJvamVjdGlvbk1hdHJpeDoxLG1vZGVsVmlld01hdHJpeDoxLG1vZGVsTWF0cml4OjEsdmlld01hdHJpeDoxLGNhbWVyYVBvc2l0aW9uOjEsdV92aWV3cG9ydDoxfSkscz10aGlzLmVuZ2luZSx1PXMuY3JlYXRlTW9kZWwsYz1zLmNyZWF0ZUF0dHJpYnV0ZSxmPXt2czppLnZlcnRleFNoYWRlckdMU0wsZnM6aS5mcmFnbWVudFNoYWRlckdMU0wsZGVmaW5lczppLmRlZmluZXMsYXR0cmlidXRlczpvLmF0dHJpYnV0ZXMucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlLmRhdGEmJmUuYnVmZmVyJiYodFtlLm5hbWVdPWMoe2J1ZmZlcjplLmJ1ZmZlcixhdHRyaWJ1dGVzOmUuYXR0cmlidXRlcyxhcnJheVN0cmlkZTplLmFycmF5U3RyaWRlLHN0ZXBNb2RlOmUuc3RlcE1vZGUsZGl2aXNvcjpcInZlcnRleFwiPT09ZS5zdGVwTW9kZT8wOjF9KSksdH0pLHt9KSx1bmlmb3JtczppLnVuaWZvcm1zLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFtlLm5hbWVdPWUuZGF0YSx0fSkse30pLHNjaXNzb3I6e2VuYWJsZTohMCxib3g6ZnVuY3Rpb24oKXtyZXR1cm4gbi5nZXRWaWV3cG9ydCgpfX19LGkuY3VsbCYmKGYuY3VsbD1pLmN1bGwpLGkuZGVwdGgmJihmLmRlcHRoPWkuZGVwdGgpLGkuYmxlbmQmJihmLmJsZW5kPWkuYmxlbmQpLG8uaW5kaWNlc0J1ZmZlciYmKGYuZWxlbWVudHM9by5pbmRpY2VzQnVmZmVyKSxvLm1heEluc3RhbmNlZENvdW50JiYoZi5pbnN0YW5jZXM9by5tYXhJbnN0YW5jZWRDb3VudCxmLmNvdW50PW8udmVydGV4Q291bnR8fDMpLHQubmV4dD0yMix1KGYpO2Nhc2UgMjI6ci5tb2RlbD10LnNlbnQsdGhpcy5tb2RlbENhY2hlW2FdPXIubW9kZWw7Y2FzZSAyNDpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSksZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleTpcImluaXRWaWV3XCIsdmFsdWU6KGU9QygpKEEuYS5tYXJrKChmdW5jdGlvbiB0KGUpe3ZhciBuLHIsaSxvO3JldHVybiBBLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6bj1lLmdldFNjZW5lKCkscj1WKG4uZ2V0RW50aXRpZXMoKSksdC5wcmV2PTIsci5zKCk7Y2FzZSA0OmlmKChpPXIubigpKS5kb25lKXt0Lm5leHQ9MTA7YnJlYWt9cmV0dXJuIG89aS52YWx1ZSx0Lm5leHQ9OCx0aGlzLmluaXRNZXNoKG8sZSk7Y2FzZSA4OnQubmV4dD00O2JyZWFrO2Nhc2UgMTA6dC5uZXh0PTE1O2JyZWFrO2Nhc2UgMTI6dC5wcmV2PTEyLHQudDA9dC5jYXRjaCgyKSxyLmUodC50MCk7Y2FzZSAxNTpyZXR1cm4gdC5wcmV2PTE1LHIuZigpLHQuZmluaXNoKDE1KTtjYXNlIDE4OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMsW1syLDEyLDE1LDE4XV0pfSkpKSxmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX1dKSx0fSgpLE8uSURFTlRJRklFUj1cIlJlbmRlciBQYXNzXCIsZz1rLHY9QigpKGcucHJvdG90eXBlLFwibWVzaFwiLFtpXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLHk9QigpKGcucHJvdG90eXBlLFwiZ2VvbWV0cnlcIixbb10se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxtPUIoKShnLnByb3RvdHlwZSxcIm1hdGVyaWFsXCIsW2FdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksYj1CKCkoZy5wcm90b3R5cGUsXCJjdWxsYWJsZVwiLFtzXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLHg9QigpKGcucHJvdG90eXBlLFwidHJhbnNmb3JtXCIsW3VdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksdz1CKCkoZy5wcm90b3R5cGUsXCJoaWVyYXJjaHlcIixbY10se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxTPUIoKShnLnByb3RvdHlwZSxcImZyYW1lR3JhcGhTeXN0ZW1cIixbZixsXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLEU9QigpKGcucHJvdG90eXBlLFwiZW5naW5lXCIsW2hdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksXz1CKCkoZy5wcm90b3R5cGUsXCJyZXNvdXJjZVBvb2xcIixbZF0se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxwPWcpKXx8cCl9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24odCl7dmFyIG4scixpLG87ZnVuY3Rpb24gYSh0LGUpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fSh0KXx8ZnVuY3Rpb24odCxlKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpKXJldHVybjt2YXIgbj1bXSxyPSEwLGk9ITEsbz12b2lkIDA7dHJ5e2Zvcih2YXIgYSxzPXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEocj0oYT1zLm5leHQoKSkuZG9uZSkmJihuLnB1c2goYS52YWx1ZSksIWV8fG4ubGVuZ3RoIT09ZSk7cj0hMCk7fWNhdGNoKHQpe2k9ITAsbz10fWZpbmFsbHl7dHJ5e3J8fG51bGw9PXMucmV0dXJufHxzLnJldHVybigpfWZpbmFsbHl7aWYoaSl0aHJvdyBvfX1yZXR1cm4gbn0odCxlKXx8ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpcmV0dXJuIHModCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PW4mJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PW58fFwiU2V0XCI9PT1uKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKFwiQXJndW1lbnRzXCI9PT1ufHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gcyh0LGUpfSh0LGUpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gcyh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIHUodCl7cmV0dXJuKHU9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfW89ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBlLG4scj17NTk6ZnVuY3Rpb24odCxlLG4pe24uZChlLHtkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuIEh9fSk7dmFyIHI9ZnVuY3Rpb24odCxlKXt2YXIgbj10Lm5vZGVzLHI9dC5lZGdlcyxpPVtdLG89e307aWYoIW4pdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBub2RlcyBkYXRhIVwiKTtyZXR1cm4gbiYmbi5mb3JFYWNoKChmdW5jdGlvbih0LGUpe29bdC5pZF09ZSxpLnB1c2goW10pfSkpLHImJnIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC5zb3VyY2Uscj10LnRhcmdldCxhPW9bbl0scz1vW3JdOyFhJiYwIT09YXx8IXMmJjAhPT1zfHwoaVthXVtzXT0xLGV8fChpW3NdW2FdPTEpKX0pKSxpfSxpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZvaWQgMD09PWUmJihlPW51bGwpLHRoaXMudmFsdWU9dCx0aGlzLm5leHQ9ZX1yZXR1cm4gdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dCh0aGlzLnZhbHVlKTpcIlwiK3RoaXMudmFsdWV9LHR9KCksYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9aSksdGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5jb21wYXJlPXR9cmV0dXJuIHQucHJvdG90eXBlLnByZXBlbmQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IG8odCx0aGlzLmhlYWQpO3JldHVybiB0aGlzLmhlYWQ9ZSx0aGlzLnRhaWx8fCh0aGlzLnRhaWw9ZSksdGhpc30sdC5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBvKHQpO3JldHVybiB0aGlzLmhlYWQ/KHRoaXMudGFpbC5uZXh0PWUsdGhpcy50YWlsPWUsdGhpcyk6KHRoaXMuaGVhZD1lLHRoaXMudGFpbD1lLHRoaXMpfSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7aWYoIXRoaXMuaGVhZClyZXR1cm4gbnVsbDtmb3IodmFyIGU9bnVsbDt0aGlzLmhlYWQmJnRoaXMuY29tcGFyZSh0aGlzLmhlYWQudmFsdWUsdCk7KWU9dGhpcy5oZWFkLHRoaXMuaGVhZD10aGlzLmhlYWQubmV4dDt2YXIgbj10aGlzLmhlYWQ7aWYobnVsbCE9PW4pZm9yKDtuLm5leHQ7KXRoaXMuY29tcGFyZShuLm5leHQudmFsdWUsdCk/KGU9bi5uZXh0LG4ubmV4dD1uLm5leHQubmV4dCk6bj1uLm5leHQ7cmV0dXJuIHRoaXMuY29tcGFyZSh0aGlzLnRhaWwudmFsdWUsdCkmJih0aGlzLnRhaWw9biksZX0sdC5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0KXt2YXIgZT10LnZhbHVlLG49dm9pZCAwPT09ZT92b2lkIDA6ZSxyPXQuY2FsbGJhY2ssaT12b2lkIDA9PT1yP3ZvaWQgMDpyO2lmKCF0aGlzLmhlYWQpcmV0dXJuIG51bGw7Zm9yKHZhciBvPXRoaXMuaGVhZDtvOyl7aWYoaSYmaShvLnZhbHVlKSlyZXR1cm4gbztpZih2b2lkIDAhPT1uJiZ0aGlzLmNvbXBhcmUoby52YWx1ZSxuKSlyZXR1cm4gbztvPW8ubmV4dH1yZXR1cm4gbnVsbH0sdC5wcm90b3R5cGUuZGVsZXRlVGFpbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudGFpbDtpZih0aGlzLmhlYWQ9PT10aGlzLnRhaWwpcmV0dXJuIHRoaXMuaGVhZD1udWxsLHRoaXMudGFpbD1udWxsLHQ7Zm9yKHZhciBlPXRoaXMuaGVhZDtlLm5leHQ7KWUubmV4dC5uZXh0P2U9ZS5uZXh0OmUubmV4dD1udWxsO3JldHVybiB0aGlzLnRhaWw9ZSx0fSx0LnByb3RvdHlwZS5kZWxldGVIZWFkPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaGVhZClyZXR1cm4gbnVsbDt2YXIgdD10aGlzLmhlYWQ7cmV0dXJuIHRoaXMuaGVhZC5uZXh0P3RoaXMuaGVhZD10aGlzLmhlYWQubmV4dDoodGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwpLHR9LHQucHJvdG90eXBlLmZyb21BcnJheT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGVuZCh0KX0pKSx0aGlzfSx0LnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9dGhpcy5oZWFkO2U7KXQucHVzaChlKSxlPWUubmV4dDtyZXR1cm4gdH0sdC5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmhlYWQsZT1udWxsLG49bnVsbDt0OyluPXQubmV4dCx0Lm5leHQ9ZSxlPXQsdD1uO3RoaXMudGFpbD10aGlzLmhlYWQsdGhpcy5oZWFkPWV9LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD12b2lkIDApLHRoaXMudG9BcnJheSgpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcodCl9KSkudG9TdHJpbmcoKX0sdH0oKSxzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMubGlua2VkTGlzdD1uZXcgYX1yZXR1cm4gdC5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiF0aGlzLmxpbmtlZExpc3QuaGVhZH0sdC5wcm90b3R5cGUucGVlaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxpbmtlZExpc3QuaGVhZD90aGlzLmxpbmtlZExpc3QuaGVhZC52YWx1ZTpudWxsfSx0LnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uKHQpe3RoaXMubGlua2VkTGlzdC5hcHBlbmQodCl9LHQucHJvdG90eXBlLmRlcXVldWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxpbmtlZExpc3QuZGVsZXRlSGVhZCgpO3JldHVybiB0P3QudmFsdWU6bnVsbH0sdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGlua2VkTGlzdC50b1N0cmluZyh0KX0sdH0oKSxjPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1lJiYoZT1bXSk7dmFyIHI9ZS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNvdXJjZT09PXR8fGUudGFyZ2V0PT09dH0pKTtyZXR1cm5cInRhcmdldFwiPT09bj9yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc291cmNlPT09dH0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRhcmdldH0pKTpcInNvdXJjZVwiPT09bj9yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFyZ2V0PT09dH0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNvdXJjZX0pKTpyLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc291cmNlPT09dD9lLnRhcmdldDplLnNvdXJjZX0pKX0sZj1mdW5jdGlvbih0LGUpe3JldHVybiBlLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc291cmNlPT09dHx8ZS50YXJnZXQ9PT10fSkpfSxsPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0wKSx0K1wiLVwiKyhcIlwiK01hdGgucmFuZG9tKCkpLnNwbGl0KFwiLlwiKVsxXS5zdWJzdHIoMCw1KSsoXCJcIitNYXRoLnJhbmRvbSgpKS5zcGxpdChcIi5cIilbMV0uc3Vic3RyKDAsNSl9LGg9ZnVuY3Rpb24odCl7dmFyIGU9e30sbj10Lm5vZGVzLHI9dm9pZCAwPT09bj9bXTpuLGk9dC5lZGdlcyxvPXZvaWQgMD09PWk/W106aTtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3QuaWRdPXtkZWdyZWU6MCxpbkRlZ3JlZTowLG91dERlZ3JlZTowfX0pKSxvLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdC5zb3VyY2VdLmRlZ3JlZSsrLGVbdC5zb3VyY2VdLm91dERlZ3JlZSsrLGVbdC50YXJnZXRdLmRlZ3JlZSsrLGVbdC50YXJnZXRdLmluRGVncmVlKyt9KSksZX0sZD1oO2Z1bmN0aW9uIHAodCxlLG4peyFmdW5jdGlvbiB0KGUsbixyLGkpe2kuZW50ZXIoe2N1cnJlbnQ6bixwcmV2aW91czpyfSk7dmFyIG89ZS5lZGdlcztjKG4sdm9pZCAwPT09bz9bXTpvLFwidGFyZ2V0XCIpLmZvckVhY2goKGZ1bmN0aW9uKG8pe2kuYWxsb3dUcmF2ZXJzYWwoe3ByZXZpb3VzOnIsY3VycmVudDpuLG5leHQ6b30pJiZ0KGUsbyxuLGkpfSkpLGkubGVhdmUoe2N1cnJlbnQ6bixwcmV2aW91czpyfSl9KHQsZSxcIlwiLGZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PXt9KTt2YXIgZSxuPXQscj1mdW5jdGlvbigpe30saT0oZT17fSxmdW5jdGlvbih0KXt2YXIgbj10Lm5leHQ7cmV0dXJuIWVbbl0mJihlW25dPSEwLCEwKX0pO3JldHVybiBuLmFsbG93VHJhdmVyc2FsPXQuYWxsb3dUcmF2ZXJzYWx8fGksbi5lbnRlcj10LmVudGVyfHxyLG4ubGVhdmU9dC5sZWF2ZXx8cixufShuKSl9ZnVuY3Rpb24gZygpe2Zvcih2YXIgdD0wLGU9MCxuPWFyZ3VtZW50cy5sZW5ndGg7ZTxuO2UrKyl0Kz1hcmd1bWVudHNbZV0ubGVuZ3RoO3ZhciByPUFycmF5KHQpLGk9MDtmb3IoZT0wO2U8bjtlKyspZm9yKHZhciBvPWFyZ3VtZW50c1tlXSxhPTAscz1vLmxlbmd0aDthPHM7YSsrLGkrKylyW2ldPW9bYV07cmV0dXJuIHJ9T2JqZWN0LmNyZWF0ZSxPYmplY3QuY3JlYXRlO3ZhciB2PXt9LnRvU3RyaW5nLHk9ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXk/QXJyYXkuaXNBcnJheSh0KTpmdW5jdGlvbih0LGUpe3JldHVybiB2LmNhbGwodCk9PT1cIltvYmplY3QgXCIrZStcIl1cIn0odCxcIkFycmF5XCIpfTtPYmplY3Qua2V5czt2YXIgbT1BcnJheS5wcm90b3R5cGU7bS5zcGxpY2UsbS5pbmRleE9mLEFycmF5LnByb3RvdHlwZS5zcGxpY2UsT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxOdW1iZXIuaXNJbnRlZ2VyJiZOdW1iZXIuaXNJbnRlZ2VyLE1hdGguUEkscGFyc2VJbnQsTWF0aC5QSSxPYmplY3QudmFsdWVzLE9iamVjdC5wcm90b3R5cGUsT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMubWFwPXt9fXQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXBbdF19LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMubWFwW3RdO3JldHVybiB2b2lkIDA9PT1uP2U6bn0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tYXBbdF09ZX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLm1hcD17fX0sdC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLm1hcFt0XX0sdC5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLm1hcCkubGVuZ3RofX0oKTt2YXIgYj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10Lm5vZGVzLG89dm9pZCAwPT09aT9bXTppLGE9dC5lZGdlcyxzPXZvaWQgMD09PWE/W106YSx1PVtdLGM9e30sbD17fSxoPXt9O28uZm9yRWFjaCgoZnVuY3Rpb24odCxuKXt2YXIgcj10LmlkO3UucHVzaChyKSxsW3JdPTEvMCxyPT09ZSYmKGxbcl09MCl9KSk7Zm9yKHZhciBkPW8ubGVuZ3RoLHA9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcixpPTEvMCxvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciBhPWVbb10uaWQ7IW5bYV0mJnRbYV08PWkmJihpPXRbYV0scj1lW29dKX1yZXR1cm4gcn0obCxvLGMpLGk9ZS5pZDtpZihjW2ldPSEwLGxbaV09PT0xLzApcmV0dXJuXCJjb250aW51ZVwiOyhuP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5zb3VyY2U9PT10fSkpfShpLHMpOmYoaSxzKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC50YXJnZXQsbz10LnNvdXJjZSxhPW49PT1pP286bixzPXImJnRbcl0/dFtyXToxO2xbYV0+bFtlLmlkXStzPyhsW2FdPWxbZS5pZF0rcyxoW2FdPVtlLmlkXSk6bFthXT09PWxbZS5pZF0rcyYmaFthXS5wdXNoKGUuaWQpfSkpfSxnPTA7ZzxkO2crKylwKCk7aFtlXT1bZV07dmFyIHY9e307Zm9yKHZhciB5IGluIGwpbFt5XSE9PTEvMCYmeChlLHksaCx2KTt2YXIgbT17fTtmb3IodmFyIHkgaW4gdiltW3ldPXZbeV1bMF07cmV0dXJue2xlbmd0aDpsLHBhdGg6bSxhbGxQYXRoczp2fX07ZnVuY3Rpb24geCh0LGUsbixyKXtpZih0PT09ZSlyZXR1cm5bdF07aWYocltlXSlyZXR1cm4gcltlXTtmb3IodmFyIGk9W10sbz0wLGE9bltlXTtvPGEubGVuZ3RoO28rKyl7dmFyIHM9eCh0LGFbb10sbixyKTtpZighcylyZXR1cm47Zm9yKHZhciB1PTAsYz1zO3U8Yy5sZW5ndGg7dSsrKXt2YXIgZj1jW3VdO3koZik/aS5wdXNoKGcoZixbZV0pKTppLnB1c2goW2YsZV0pfX1yZXR1cm4gcltlXT1pLHJbZV19dmFyIHc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49cih0LGUpLGk9W10sbz1uLmxlbmd0aCxhPTA7YTxvO2ErPTEpe2lbYV09W107Zm9yKHZhciBzPTA7czxvO3MrPTEpYT09PXM/aVthXVtzXT0wOjAhPT1uW2FdW3NdJiZuW2FdW3NdP2lbYV1bc109blthXVtzXTppW2FdW3NdPTEvMH1mb3IodmFyIHU9MDt1PG87dSs9MSlmb3IoYT0wO2E8bzthKz0xKWZvcihzPTA7czxvO3MrPTEpaVthXVtzXT5pW2FdW3VdK2lbdV1bc10mJihpW2FdW3NdPWlbYV1bdV0raVt1XVtzXSk7cmV0dXJuIGl9LFM9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPWUubGVuZ3RoLG89MipyLGE9MCxzPTA7czxpO3MrKylmb3IodmFyIHU9dFtzXS5jbHVzdGVySWQsYz0wO2M8aTtjKyspdT09PXRbY10uY2x1c3RlcklkJiYoYSs9KGVbc11bY118fDApLShuW3NdfHwwKSoobltjXXx8MCkvbyk7cmV0dXJuIGEqKDEvbyl9LEU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuY291bnQ9dC5sZW5ndGgsdGhpcy5wYXJlbnQ9e307Zm9yKHZhciBlPTAsbj10O2U8bi5sZW5ndGg7ZSsrKXt2YXIgcj1uW2VdO3RoaXMucGFyZW50W3JdPXJ9fXJldHVybiB0LnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe2Zvcig7dGhpcy5wYXJlbnRbdF0hPT10Oyl0PXRoaXMucGFyZW50W3RdO3JldHVybiB0fSx0LnByb3RvdHlwZS51bmlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZmluZCh0KSxyPXRoaXMuZmluZChlKTtuIT09ciYmKG48cj8odGhpcy5wYXJlbnRbZV0hPT1lJiZ0aGlzLnVuaW9uKHRoaXMucGFyZW50W2VdLHQpLHRoaXMucGFyZW50W2VdPXRoaXMucGFyZW50W3RdKToodGhpcy5wYXJlbnRbdF0hPT10JiZ0aGlzLnVuaW9uKHRoaXMucGFyZW50W3RdLGUpLHRoaXMucGFyZW50W3RdPXRoaXMucGFyZW50W2VdKSl9LHQucHJvdG90eXBlLmNvbm5lY3RlZD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmZpbmQodCk9PT10aGlzLmZpbmQoZSl9LHR9KCksXz1mdW5jdGlvbih0LGUpe3JldHVybiB0LWV9LE89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PV8pLHRoaXMuY29tcGFyZUZuPXQsdGhpcy5saXN0PVtdfXJldHVybiB0LnByb3RvdHlwZS5nZXRMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiAyKnQrMX0sdC5wcm90b3R5cGUuZ2V0UmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIDIqdCsyfSx0LnByb3RvdHlwZS5nZXRQYXJlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10P251bGw6TWF0aC5mbG9vcigodC0xKS8yKX0sdC5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxpc3QubGVuZ3RoPD0wfSx0LnByb3RvdHlwZS50b3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dm9pZCAwOnRoaXMubGlzdFswXX0sdC5wcm90b3R5cGUuZGVsTWluPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50b3AoKSxlPXRoaXMubGlzdC5wb3AoKTtyZXR1cm4gdGhpcy5saXN0Lmxlbmd0aD4wJiYodGhpcy5saXN0WzBdPWUsdGhpcy5tb3ZlRG93bigwKSksdH0sdC5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQpe2lmKG51bGwhPT10KXt0aGlzLmxpc3QucHVzaCh0KTt2YXIgZT10aGlzLmxpc3QubGVuZ3RoLTE7cmV0dXJuIHRoaXMubW92ZVVwKGUpLCEwfXJldHVybiExfSx0LnByb3RvdHlwZS5tb3ZlVXA9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZ2V0UGFyZW50KHQpO3QmJnQ+MCYmdGhpcy5jb21wYXJlRm4odGhpcy5saXN0W2VdLHRoaXMubGlzdFt0XSk+MDspe3ZhciBuPXRoaXMubGlzdFtlXTt0aGlzLmxpc3RbZV09dGhpcy5saXN0W3RdLHRoaXMubGlzdFt0XT1uLHQ9ZSxlPXRoaXMuZ2V0UGFyZW50KHQpfX0sdC5wcm90b3R5cGUubW92ZURvd249ZnVuY3Rpb24odCl7dmFyIGUsbj10LHI9dGhpcy5nZXRMZWZ0KHQpLGk9dGhpcy5nZXRSaWdodCh0KSxvPXRoaXMubGlzdC5sZW5ndGg7bnVsbCE9PXImJnI8byYmdGhpcy5jb21wYXJlRm4odGhpcy5saXN0W25dLHRoaXMubGlzdFtyXSk+MD9uPXI6bnVsbCE9PWkmJmk8byYmdGhpcy5jb21wYXJlRm4odGhpcy5saXN0W25dLHRoaXMubGlzdFtpXSk+MCYmKG49aSksdCE9PW4mJihlPVt0aGlzLmxpc3Rbbl0sdGhpcy5saXN0W3RdXSx0aGlzLmxpc3RbdF09ZVswXSx0aGlzLmxpc3Rbbl09ZVsxXSx0aGlzLm1vdmVEb3duKG4pKX0sdH0oKSxrPWZ1bmN0aW9uKHQsZSl7dmFyIG49W10scj10Lm5vZGVzLGk9dm9pZCAwPT09cj9bXTpyLG89dC5lZGdlcyxhPXZvaWQgMD09PW8/W106bztpZigwPT09aS5sZW5ndGgpcmV0dXJuIG47dmFyIHM9aVswXSx1PW5ldyBTZXQ7dS5hZGQocyk7dmFyIGM9bmV3IE8oKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGU/dC53ZWlnaHQtbi53ZWlnaHQ6MH0pKTtmb3IoZihzLmlkLGEpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2MuaW5zZXJ0KHQpfSkpOyFjLmlzRW1wdHkoKTspe3ZhciBsPWMuZGVsTWluKCksaD1sLnNvdXJjZSxkPWwudGFyZ2V0O3UuaGFzKGgpJiZ1LmhhcyhkKXx8KG4ucHVzaChsKSx1LmhhcyhoKXx8KHUuYWRkKGgpLGYoaCxhKS5mb3JFYWNoKChmdW5jdGlvbih0KXtjLmluc2VydCh0KX0pKSksdS5oYXMoZCl8fCh1LmFkZChkKSxmKGQsYSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7Yy5pbnNlcnQodCl9KSkpKX1yZXR1cm4gbn0sTT1mdW5jdGlvbih0LGUpe3ZhciBuPVtdLHI9dC5ub2RlcyxpPXZvaWQgMD09PXI/W106cixvPXQuZWRnZXMsYT12b2lkIDA9PT1vP1tdOm87aWYoMD09PWkubGVuZ3RoKXJldHVybiBuO3ZhciBzPWEubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKTtlJiZzLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQud2VpZ2h0LWUud2VpZ2h0fSkpO2Zvcih2YXIgdT1uZXcgRShpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuaWR9KSkpO3MubGVuZ3RoPjA7KXt2YXIgYz1zLnNoaWZ0KCksZj1jLnNvdXJjZSxsPWMudGFyZ2V0O3UuY29ubmVjdGVkKGYsbCl8fChuLnB1c2goYyksdS51bmlvbihmLGwpKX1yZXR1cm4gbn0sQT1cIi0xXCIsVD1mdW5jdGlvbih0LGUsbixyKXt2b2lkIDA9PT10JiYodD0tMSksdm9pZCAwPT09ZSYmKGU9LTEpLHZvaWQgMD09PW4mJihuPS0xKSx2b2lkIDA9PT1yJiYocj1cIi0xXCIpLHRoaXMuaWQ9dCx0aGlzLmZyb209ZSx0aGlzLnRvPW4sdGhpcy5sYWJlbD1yfSxDPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZvaWQgMD09PXQmJih0PS0xKSx2b2lkIDA9PT1lJiYoZT1BKSx0aGlzLmlkPXQsdGhpcy5sYWJlbD1lLHRoaXMuZWRnZXM9W10sdGhpcy5lZGdlTWFwPXt9fXJldHVybiB0LnByb3RvdHlwZS5hZGRFZGdlPWZ1bmN0aW9uKHQpe3RoaXMuZWRnZXMucHVzaCh0KSx0aGlzLmVkZ2VNYXBbdC5pZF09dH0sdH0oKSxJPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dm9pZCAwPT09dCYmKHQ9LTEpLHZvaWQgMD09PWUmJihlPSEwKSx2b2lkIDA9PT1uJiYobj0hMSksdGhpcy5pZD10LHRoaXMuZWRnZUlkQXV0b0luY3JlYXNlPWUsdGhpcy5lZGdlcz1bXSx0aGlzLm5vZGVzPVtdLHRoaXMubm9kZU1hcD17fSx0aGlzLmVkZ2VNYXA9e30sdGhpcy5ub2RlTGFiZWxNYXA9e30sdGhpcy5lZGdlTGFiZWxNYXA9e30sdGhpcy5jb3VudGVyPTAsdGhpcy5kaXJlY3RlZD1ufXJldHVybiB0LnByb3RvdHlwZS5nZXROb2RlTnVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZXMubGVuZ3RofSx0LnByb3RvdHlwZS5hZGROb2RlPWZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMubm9kZU1hcFt0XSl7dmFyIG49bmV3IEModCxlKTt0aGlzLm5vZGVzLnB1c2gobiksdGhpcy5ub2RlTWFwW3RdPW4sdGhpcy5ub2RlTGFiZWxNYXBbZV18fCh0aGlzLm5vZGVMYWJlbE1hcFtlXT1bXSksdGhpcy5ub2RlTGFiZWxNYXBbZV0ucHVzaCh0KX19LHQucHJvdG90eXBlLmFkZEVkZ2U9ZnVuY3Rpb24odCxlLG4scil7aWYoKHRoaXMuZWRnZUlkQXV0b0luY3JlYXNlfHx2b2lkIDA9PT10KSYmKHQ9dGhpcy5jb3VudGVyKyspLCEodGhpcy5ub2RlTWFwW2VdJiZ0aGlzLm5vZGVNYXBbbl0mJnRoaXMubm9kZU1hcFtuXS5lZGdlTWFwW3RdKSl7dmFyIGk9bmV3IFQodCxlLG4scik7aWYodGhpcy5lZGdlcy5wdXNoKGkpLHRoaXMuZWRnZU1hcFt0XT1pLHRoaXMubm9kZU1hcFtlXS5hZGRFZGdlKGkpLHRoaXMuZWRnZUxhYmVsTWFwW3JdfHwodGhpcy5lZGdlTGFiZWxNYXBbcl09W10pLHRoaXMuZWRnZUxhYmVsTWFwW3JdLnB1c2goaSksIXRoaXMuZGlyZWN0ZWQpe3ZhciBvPW5ldyBUKHQsbixlLHIpO3RoaXMubm9kZU1hcFtuXS5hZGRFZGdlKG8pLHRoaXMuZWRnZUxhYmVsTWFwW3JdLnB1c2gobyl9fX0sdH0oKSxQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyLGkpe3RoaXMuZnJvbU5vZGU9dCx0aGlzLnRvTm9kZT1lLHRoaXMubm9kZUVkZ2VOb2RlTGFiZWw9e25vZGVMYWJlbDE6bnx8QSxlZGdlTGFiZWw6cnx8XCItMVwiLG5vZGVMYWJlbDI6aXx8QX19cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsVG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZnJvbU5vZGU9PT10LmZvcm1Ob2RlJiZ0aGlzLnRvTm9kZT09PXQudG9Ob2RlJiZ0aGlzLm5vZGVFZGdlTm9kZUxhYmVsPT09dC5ub2RlRWRnZU5vZGVMYWJlbH0sdC5wcm90b3R5cGUubm90RXF1YWxUbz1mdW5jdGlvbih0KXtyZXR1cm4hdGhpcy5lcXVhbFRvKHQpfSx0fSgpLGo9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5ybXBhdGg9W10sdGhpcy5kZnNFZGdlTGlzdD1bXX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxUbz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmRmc0VkZ2VMaXN0Lmxlbmd0aDtpZihlIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjxlO24rKylpZih0aGlzLmRmc0VkZ2VMaXN0W25dIT09dFtuXSlyZXR1cm4hMTtyZXR1cm4hMH0sdC5wcm90b3R5cGUubm90RXF1YWxUbz1mdW5jdGlvbih0KXtyZXR1cm4hdGhpcy5lcXVhbFRvKHQpfSx0LnByb3RvdHlwZS5wdXNoQmFjaz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB0aGlzLmRmc0VkZ2VMaXN0LnB1c2gobmV3IFAodCxlLG4scixpKSksdGhpcy5kZnNFZGdlTGlzdH0sdC5wcm90b3R5cGUudG9HcmFwaD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PXQmJih0PS0xKSx2b2lkIDA9PT1lJiYoZT0hMSk7dmFyIG49bmV3IEkodCwhMCxlKTtyZXR1cm4gdGhpcy5kZnNFZGdlTGlzdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LmZyb21Ob2RlLHI9dC50b05vZGUsaT10Lm5vZGVFZGdlTm9kZUxhYmVsLG89aS5ub2RlTGFiZWwxLGE9aS5lZGdlTGFiZWwscz1pLm5vZGVMYWJlbDI7byE9PUEmJm4uYWRkTm9kZShlLG8pLHMhPT1BJiZuLmFkZE5vZGUocixzKSxuLmFkZEVkZ2Uodm9pZCAwLGUscixhKX0pKSxufSx0LnByb3RvdHlwZS5idWlsZFJtcGF0aD1mdW5jdGlvbigpe3RoaXMucm1wYXRoPVtdO2Zvcih2YXIgdD12b2lkIDAsZT10aGlzLmRmc0VkZ2VMaXN0Lmxlbmd0aC0xO2U+PTA7ZS0tKXt2YXIgbj10aGlzLmRmc0VkZ2VMaXN0W2VdLHI9bi5mcm9tTm9kZSxpPW4udG9Ob2RlO3I8aSYmKHZvaWQgMD09PXR8fGk9PT10KSYmKHRoaXMucm1wYXRoLnB1c2goZSksdD1yKX1yZXR1cm4gdGhpcy5ybXBhdGh9LHQucHJvdG90eXBlLmdldE5vZGVOdW09ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gdGhpcy5kZnNFZGdlTGlzdC5mb3JFYWNoKChmdW5jdGlvbihlKXt0W2UuZnJvbU5vZGVdfHwodFtlLmZyb21Ob2RlXT0hMCksdFtlLnRvTm9kZV18fCh0W2UudG9Ob2RlXT0hMCl9KSksT2JqZWN0LmtleXModCkubGVuZ3RofSx0fSgpLEQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe2lmKHRoaXMuaGlzPXt9LHRoaXMubm9kZXNVc2VkPXt9LHRoaXMuZWRnZXNVc2VkPXt9LHRoaXMuZWRnZXM9W10sdCl7Zm9yKDt0Oyl7dmFyIGU9dC5lZGdlO3RoaXMuZWRnZXMucHVzaChlKSx0aGlzLm5vZGVzVXNlZFtlLmZyb21dPTEsdGhpcy5ub2Rlc1VzZWRbZS50b109MSx0aGlzLmVkZ2VzVXNlZFtlLmlkXT0xLHQ9dC5wcmVOb2RlfXRoaXMuZWRnZXM9dGhpcy5lZGdlcy5yZXZlcnNlKCl9fXJldHVybiB0LnByb3RvdHlwZS5oYXNOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dGhpcy5ub2Rlc1VzZWRbdC5pZF19LHQucHJvdG90eXBlLmhhc0VkZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10aGlzLmVkZ2VzVXNlZFt0LmlkXX0sdH0oKSxOPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgZT10LmdyYXBocyxuPXQubWluU3VwcG9ydCxyPXZvaWQgMD09PW4/MjpuLGk9dC5taW5Ob2RlTnVtLG89dm9pZCAwPT09aT8xOmksYT10Lm1heE5vZGVOdW0scz12b2lkIDA9PT1hPzQ6YSx1PXQudG9wLGM9dm9pZCAwPT09dT8xMDp1LGY9dC5kaXJlY3RlZCxsPXZvaWQgMCE9PWYmJmYsaD10LnZlcmJvc2UsZD12b2lkIDAhPT1oJiZoO3RoaXMuZ3JhcGhzPWUsdGhpcy5kZnNDb2RlPW5ldyBqLHRoaXMuc3VwcG9ydD0wLHRoaXMuZnJlcXVlbnRTaXplMVN1YmdyYXBocz1bXSx0aGlzLmZyZXF1ZW50U3ViZ3JhcGhzPVtdLHRoaXMubWluU3VwcG9ydD1yLHRoaXMudG9wPWMsdGhpcy5kaXJlY3RlZD1sLHRoaXMuY291bnRlcj0wLHRoaXMubWF4Tm9kZU51bT1zLHRoaXMubWluTm9kZU51bT1vLHRoaXMudmVyYm9zZT1kLHRoaXMubWF4Tm9kZU51bTx0aGlzLm1pbk5vZGVOdW0mJih0aGlzLm1heE5vZGVOdW09dGhpcy5taW5Ob2RlTnVtKSx0aGlzLnJlcG9ydERGPVtdfXJldHVybiB0LnByb3RvdHlwZS5maW5kRm9yd2FyZFJvb3RFZGdlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1bXSxpPXQubm9kZU1hcDtyZXR1cm4gZS5lZGdlcy5mb3JFYWNoKChmdW5jdGlvbih0KXsobi5kaXJlY3RlZHx8ZS5sYWJlbDw9aVt0LnRvXS5sYWJlbCkmJnIucHVzaCh0KX0pKSxyfSx0LnByb3RvdHlwZS5maW5kQmFja3dhcmRFZGdlPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCF0aGlzLmRpcmVjdGVkJiZlPT09bilyZXR1cm4gbnVsbDtmb3IodmFyIGk9dC5ub2RlTWFwLG89aVtuLnRvXS5lZGdlcyxhPW8ubGVuZ3RoLHM9MDtzPGE7cysrKXt2YXIgdT1vW3NdO2lmKCFyLmhhc0VkZ2UodSkmJnUudG89PT1lLmZyb20paWYodGhpcy5kaXJlY3RlZCl7aWYoaVtlLmZyb21dLmxhYmVsPGlbbi50b10ubGFiZWx8fGlbZS5mcm9tXS5sYWJlbD09PWlbbi50b10ubGFiZWwmJmUubGFiZWw8PXUubGFiZWwpcmV0dXJuIHV9ZWxzZSBpZihlLmxhYmVsPHUubGFiZWx8fGUubGFiZWw9PT11LmxhYmVsJiZpW2UudG9dLmxhYmVsPD1pW24udG9dLmxhYmVsKXJldHVybiB1fXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5maW5kRm9yd2FyZFB1cmVFZGdlcz1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9W10sbz1lLnRvLGE9dC5ub2RlTWFwW29dLmVkZ2VzLHM9YS5sZW5ndGgsdT0wO3U8czt1Kyspe3ZhciBjPWFbdV0sZj10Lm5vZGVNYXBbYy50b107bjw9Zi5sYWJlbCYmIXIuaGFzTm9kZShmKSYmaS5wdXNoKGMpfXJldHVybiBpfSx0LnByb3RvdHlwZS5maW5kRm9yd2FyZFJtcGF0aEVkZ2VzPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT1bXSxvPXQubm9kZU1hcCxhPW9bZS50b10ubGFiZWwscz1vW2UuZnJvbV0uZWRnZXMsdT1zLmxlbmd0aCxjPTA7Yzx1O2MrKyl7dmFyIGY9c1tjXSxsPW9bZi50b10ubGFiZWw7ZS50bz09PWYudG98fG4+bHx8ci5oYXNOb2RlKG9bZi50b10pfHwoZS5sYWJlbDxmLmxhYmVsfHxlLmxhYmVsPT09Zi5sYWJlbCYmYTw9bCkmJmkucHVzaChmKX1yZXR1cm4gaX0sdC5wcm90b3R5cGUuZ2V0U3VwcG9ydD1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3QuZ3JhcGhJZF18fChlW3QuZ3JhcGhJZF09ITApfSkpLE9iamVjdC5rZXlzKGUpLmxlbmd0aH0sdC5wcm90b3R5cGUuZmluZE1pbkxhYmVsPWZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHI9dFtuXSxpPXIubm9kZUxhYmVsMSxvPXIuZWRnZUxhYmVsLGE9ci5ub2RlTGFiZWwyO2U/KGk8ZS5ub2RlTGFiZWwxfHxpPT09ZS5ub2RlTGFiZWwxJiZvPGUuZWRnZUxhYmVsfHxpPT09ZS5ub2RlTGFiZWwxJiZvPT09ZS5lZGdlTGFiZWwmJmE8ZS5ub2RlTGFiZWwyKSYmKGU9e25vZGVMYWJlbDE6aSxlZGdlTGFiZWw6byxub2RlTGFiZWwyOmF9KTplPXtub2RlTGFiZWwxOmksZWRnZUxhYmVsOm8sbm9kZUxhYmVsMjphfX0pKSxlfSx0LnByb3RvdHlwZS5pc01pbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLmRmc0NvZGU7aWYodGhpcy52ZXJib3NlJiZjb25zb2xlLmxvZyhcImlzTWluIGNoZWNraW5nXCIsZSksMT09PWUuZGZzRWRnZUxpc3QubGVuZ3RoKXJldHVybiEwO3ZhciBuPXRoaXMuZGlyZWN0ZWQscj1lLnRvR3JhcGgoLTEsbiksaT1yLm5vZGVNYXAsbz1uZXcgaixhPXt9O3Iubm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5maW5kRm9yd2FyZFJvb3RFZGdlcyhyLGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPWlbdC50b10sbz1lLmxhYmVsK1wiLVwiK3QubGFiZWwrXCItXCIrbi5sYWJlbDthW29dfHwoYVtvXT17cHJvamVjdGVkOltdLG5vZGVMYWJlbDE6ZS5sYWJlbCxlZGdlTGFiZWw6dC5sYWJlbCxub2RlTGFiZWwyOm4ubGFiZWx9KTt2YXIgcz17Z3JhcGhJZDpyLmlkLGVkZ2U6dCxwcmVOb2RlOm51bGx9O2Fbb10ucHJvamVjdGVkLnB1c2gocyl9KSl9KSk7dmFyIHM9dGhpcy5maW5kTWluTGFiZWwoYSk7by5kZnNFZGdlTGlzdC5wdXNoKG5ldyBQKDAsMSxzLm5vZGVMYWJlbDEscy5lZGdlTGFiZWwscy5ub2RlTGFiZWwyKSk7dmFyIHU9cy5ub2RlTGFiZWwxK1wiLVwiK3MuZWRnZUxhYmVsK1wiLVwiK3Mubm9kZUxhYmVsMjtyZXR1cm4gZnVuY3Rpb24gYShzKXtmb3IodmFyIHU9by5idWlsZFJtcGF0aCgpLGM9by5kZnNFZGdlTGlzdFswXS5ub2RlRWRnZU5vZGVMYWJlbC5ub2RlTGFiZWwxLGY9by5kZnNFZGdlTGlzdFt1WzBdXS50b05vZGUsbD17fSxoPSExLGQ9MCxwPW4/LTE6MCxnPWZ1bmN0aW9uKGUpe2lmKGgpcmV0dXJuXCJicmVha1wiO3MuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIGk9bmV3IEQobiksYT10LmZpbmRCYWNrd2FyZEVkZ2UocixpLmVkZ2VzW3VbZV1dLGkuZWRnZXNbdVswXV0saSk7YSYmKGxbYS5sYWJlbF18fChsW2EubGFiZWxdPXtwcm9qZWN0ZWQ6W10sZWRnZUxhYmVsOmEubGFiZWx9KSxsW2EubGFiZWxdLnByb2plY3RlZC5wdXNoKHtncmFwaElkOnIuaWQsZWRnZTpsLHByZU5vZGU6bn0pLGQ9by5kZnNFZGdlTGlzdFt1W2VdXS5mcm9tTm9kZSxoPSEwKX0pKX0sdj11Lmxlbmd0aC0xO3Y+cCYmXCJicmVha1wiIT09Zyh2KTt2LS0pO2lmKGgpe3ZhciB5PXQuZmluZE1pbkxhYmVsKGwpO28uZGZzRWRnZUxpc3QucHVzaChuZXcgUChmLGQsQSx5LmVkZ2VMYWJlbCxBKSk7dmFyIG09by5kZnNFZGdlTGlzdC5sZW5ndGgtMTtyZXR1cm4gdC5kZnNDb2RlLmRmc0VkZ2VMaXN0W21dPT09by5kZnNFZGdlTGlzdFttXSYmYShsW3kuZWRnZUxhYmVsXS5wcm9qZWN0ZWQpfXZhciBiPXt9O2g9ITE7dmFyIHg9MDtzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBEKGUpLG89dC5maW5kRm9yd2FyZFB1cmVFZGdlcyhyLG4uZWRnZXNbdVswXV0sYyxuKTtvLmxlbmd0aD4wJiYoaD0hMCx4PWYsby5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LmxhYmVsK1wiLVwiK2lbdC50b10ubGFiZWw7YltuXXx8KGJbbl09e3Byb2plY3RlZDpbXSxlZGdlTGFiZWw6dC5sYWJlbCxub2RlTGFiZWwyOmlbdC50b10ubGFiZWx9KSxiW25dLnByb2plY3RlZC5wdXNoKHtncmFwaElkOnIuaWQsZWRnZTp0LHByZU5vZGU6ZX0pfSkpKX0pKTt2YXIgdz11Lmxlbmd0aCxTPWZ1bmN0aW9uKGUpe2lmKGgpcmV0dXJuXCJicmVha1wiO3ZhciBuPXVbZV07cy5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgYT1uZXcgRChlKSxzPXQuZmluZEZvcndhcmRSbXBhdGhFZGdlcyhyLGEuZWRnZXNbbl0sYyxhKTtzLmxlbmd0aD4wJiYoaD0hMCx4PW8uZGZzRWRnZUxpc3Rbbl0uZnJvbU5vZGUscy5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LmxhYmVsK1wiLVwiK2lbdC50b10ubGFiZWw7YltuXXx8KGJbbl09e3Byb2plY3RlZDpbXSxlZGdlTGFiZWw6dC5sYWJlbCxub2RlTGFiZWwyOmlbdC50b10ubGFiZWx9KSxiW25dLnByb2plY3RlZC5wdXNoKHtncmFwaElkOnIuaWQsZWRnZTp0LHByZU5vZGU6ZX0pfSkpKX0pKX07Zm9yKHY9MDt2PHcmJlwiYnJlYWtcIiE9PVModik7disrKTtpZighaClyZXR1cm4hMDt2YXIgRT10LmZpbmRNaW5MYWJlbChiKTtvLmRmc0VkZ2VMaXN0LnB1c2gobmV3IFAoeCxmKzEsQSxFLmVkZ2VMYWJlbCxFLm5vZGVMYWJlbDIpKTt2YXIgXz1vLmRmc0VkZ2VMaXN0Lmxlbmd0aC0xO3JldHVybiBlLmRmc0VkZ2VMaXN0W19dPT09by5kZnNFZGdlTGlzdFtfXSYmYShiW0UuZWRnZUxhYmVsK1wiLVwiK0Uubm9kZUxhYmVsMl0ucHJvamVjdGVkKX0oYVt1XS5wcm9qZWN0ZWQpfSx0LnByb3RvdHlwZS5yZXBvcnQ9ZnVuY3Rpb24oKXtpZighKHRoaXMuZGZzQ29kZS5nZXROb2RlTnVtKCk8dGhpcy5taW5Ob2RlTnVtKSl7dGhpcy5jb3VudGVyKys7dmFyIHQ9dGhpcy5kZnNDb2RlLnRvR3JhcGgodGhpcy5jb3VudGVyLHRoaXMuZGlyZWN0ZWQpO3RoaXMuZnJlcXVlbnRTdWJncmFwaHMucHVzaChmdW5jdGlvbiB0KGUpe2lmKFwib2JqZWN0XCIhPXUoZSl8fG51bGw9PT1lKXJldHVybiBlO3ZhciBuO2lmKHkoZSkpe249W107Zm9yKHZhciByPTAsaT1lLmxlbmd0aDtyPGk7cisrKVwib2JqZWN0XCI9PXUoZVtyXSkmJm51bGwhPWVbcl0/bltyXT10KGVbcl0pOm5bcl09ZVtyXX1lbHNlIGZvcih2YXIgbyBpbiBuPXt9LGUpXCJvYmplY3RcIj09dShlW29dKSYmbnVsbCE9ZVtvXT9uW29dPXQoZVtvXSk6bltvXT1lW29dO3JldHVybiBufSh0KSl9fSx0LnByb3RvdHlwZS5zdWJHcmFwaE1pbmluZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKCEodGhpcy5nZXRTdXBwb3J0KHQpPHRoaXMubWluU3VwcG9ydCkmJnRoaXMuaXNNaW4oKSl7dGhpcy5yZXBvcnQoKTt2YXIgbj10aGlzLmRmc0NvZGUuZ2V0Tm9kZU51bSgpLHI9dGhpcy5kZnNDb2RlLmJ1aWxkUm1wYXRoKCksaT10aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3RbclswXV0udG9Ob2RlLG89dGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0WzBdLm5vZGVFZGdlTm9kZUxhYmVsLm5vZGVMYWJlbDEsYT17fSxzPXt9O3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHZhciB1PWUuZ3JhcGhzW3QuZ3JhcGhJZF0sYz11Lm5vZGVNYXAsZj1uZXcgRCh0KSxsPXIubGVuZ3RoLTE7bD49MDtsLS0pe3ZhciBoPWUuZmluZEJhY2t3YXJkRWRnZSh1LGYuZWRnZXNbcltsXV0sZi5lZGdlc1tyWzBdXSxmKTtpZihoKXt2YXIgZD1lLmRmc0NvZGUuZGZzRWRnZUxpc3RbcltsXV0uZnJvbU5vZGUrXCItXCIraC5sYWJlbDtzW2RdfHwoc1tkXT17cHJvamVjdGVkOltdLHRvTm9kZUlkOmUuZGZzQ29kZS5kZnNFZGdlTGlzdFtyW2xdXS5mcm9tTm9kZSxlZGdlTGFiZWw6aC5sYWJlbH0pLHNbZF0ucHJvamVjdGVkLnB1c2goe2dyYXBoSWQ6dC5ncmFwaElkLGVkZ2U6aCxwcmVOb2RlOnR9KX19aWYoIShuPj1lLm1heE5vZGVOdW0pKXtlLmZpbmRGb3J3YXJkUHVyZUVkZ2VzKHUsZi5lZGdlc1tyWzBdXSxvLGYpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWkrXCItXCIrZS5sYWJlbCtcIi1cIitjW2UudG9dLmxhYmVsO2Fbbl18fChhW25dPXtwcm9qZWN0ZWQ6W10sZnJvbU5vZGVJZDppLGVkZ2VMYWJlbDplLmxhYmVsLG5vZGVMYWJlbDI6Y1tlLnRvXS5sYWJlbH0pLGFbbl0ucHJvamVjdGVkLnB1c2goe2dyYXBoSWQ6dC5ncmFwaElkLGVkZ2U6ZSxwcmVOb2RlOnR9KX0pKTt2YXIgcD1mdW5jdGlvbihuKXtlLmZpbmRGb3J3YXJkUm1wYXRoRWRnZXModSxmLmVkZ2VzW3Jbbl1dLG8sZikuZm9yRWFjaCgoZnVuY3Rpb24oaSl7dmFyIG89ZS5kZnNDb2RlLmRmc0VkZ2VMaXN0W3Jbbl1dLmZyb21Ob2RlK1wiLVwiK2kubGFiZWwrXCItXCIrY1tpLnRvXS5sYWJlbDthW29dfHwoYVtvXT17cHJvamVjdGVkOltdLGZyb21Ob2RlSWQ6ZS5kZnNDb2RlLmRmc0VkZ2VMaXN0W3Jbbl1dLmZyb21Ob2RlLGVkZ2VMYWJlbDppLmxhYmVsLG5vZGVMYWJlbDI6Y1tpLnRvXS5sYWJlbH0pLGFbb10ucHJvamVjdGVkLnB1c2goe2dyYXBoSWQ6dC5ncmFwaElkLGVkZ2U6aSxwcmVOb2RlOnR9KX0pKX07Zm9yKGw9MDtsPHIubGVuZ3RoO2wrKylwKGwpfX0pKSxPYmplY3Qua2V5cyhzKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj1zW3RdLHI9bi50b05vZGVJZCxvPW4uZWRnZUxhYmVsO2UuZGZzQ29kZS5kZnNFZGdlTGlzdC5wdXNoKG5ldyBQKGkscixcIi0xXCIsbyxcIi0xXCIpKSxlLnN1YkdyYXBoTWluaW5nKHNbdF0ucHJvamVjdGVkKSxlLmRmc0NvZGUuZGZzRWRnZUxpc3QucG9wKCl9KSksT2JqZWN0LmtleXMoYSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49YVt0XSxyPW4uZnJvbU5vZGVJZCxvPW4uZWRnZUxhYmVsLHM9bi5ub2RlTGFiZWwyO2UuZGZzQ29kZS5kZnNFZGdlTGlzdC5wdXNoKG5ldyBQKHIsaSsxLEEsbyxzKSksZS5zdWJHcmFwaE1pbmluZyhhW3RdLnByb2plY3RlZCksZS5kZnNDb2RlLmRmc0VkZ2VMaXN0LnBvcCgpfSkpfX0sdC5wcm90b3R5cGUuZ2VuZXJhdGUxRWRnZUZyZXF1ZW50U3ViR3JhcGhzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ncmFwaHMsZT10aGlzLmRpcmVjdGVkLG49dGhpcy5taW5TdXBwb3J0LHI9dGhpcy5mcmVxdWVudFNpemUxU3ViZ3JhcGhzLGk9e30sbz17fSxhPXt9LHM9e307cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPXRbbl0sdT1yLm5vZGVNYXA7ci5ub2Rlcy5mb3JFYWNoKChmdW5jdGlvbih0LHIpe3ZhciBjPXQubGFiZWwsZj1uK1wiLVwiK2M7aWYoIWFbZl0pe3ZhciBsPWlbY118fDA7bCsrLGlbY109bH1hW2ZdPXtncmFwaEtleTpuLGxhYmVsOmN9LHQuZWRnZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9YyxpPXVbdC50b10ubGFiZWw7aWYoIWUmJnI+aSl7dmFyIGE9aTtpPXIscj1hfXZhciBmPXQubGFiZWwsbD1uK1wiLVwiK3IrXCItXCIrZitcIi1cIitpLGg9citcIi1cIitmK1wiLVwiK2k7aWYoIW9baF0pe3ZhciBkPW9baF18fDA7ZCsrLG9baF09ZH1zW2xdPXtncmFwaElkOm4sbm9kZUxhYmVsMTpyLGVkZ2VMYWJlbDpmLG5vZGVMYWJlbDI6aX19KSl9KSl9KSksT2JqZWN0LmtleXMoaSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIShpW3RdPG4pKXt2YXIgZT17bm9kZXM6W10sZWRnZXM6W119O2Uubm9kZXMucHVzaCh7aWQ6XCIwXCIsbGFiZWw6dH0pLHIucHVzaChlKX19KSkscn0sdC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZih0aGlzLmZyZXF1ZW50U2l6ZTFTdWJncmFwaHM9dGhpcy5nZW5lcmF0ZTFFZGdlRnJlcXVlbnRTdWJHcmFwaHMoKSwhKHRoaXMubWF4Tm9kZU51bTwyKSl7dmFyIGU9dGhpcy5ncmFwaHMsbj0odGhpcy5kaXJlY3RlZCx7fSk7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIGk9ZVtyXSxvPWkubm9kZU1hcDtpLm5vZGVzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuZmluZEZvcndhcmRSb290RWRnZXMoaSxlKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgaT1vW3QudG9dLGE9ZS5sYWJlbCtcIi1cIit0LmxhYmVsK1wiLVwiK2kubGFiZWw7blthXXx8KG5bYV09e3Byb2plY3RlZDpbXSxub2RlTGFiZWwxOmUubGFiZWwsZWRnZUxhYmVsOnQubGFiZWwsbm9kZUxhYmVsMjppLmxhYmVsfSk7dmFyIHM9e2dyYXBoSWQ6cixlZGdlOnQscHJlTm9kZTpudWxsfTtuW2FdLnByb2plY3RlZC5wdXNoKHMpfSkpfSkpfSkpLE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciByPW5bZV0saT1yLnByb2plY3RlZCxvPXIubm9kZUxhYmVsMSxhPXIuZWRnZUxhYmVsLHM9ci5ub2RlTGFiZWwyO3QuZGZzQ29kZS5kZnNFZGdlTGlzdC5wdXNoKG5ldyBQKDAsMSxvLGEscykpLHQuc3ViR3JhcGhNaW5pbmcoaSksdC5kZnNDb2RlLmRmc0VkZ2VMaXN0LnBvcCgpfSkpfX0sdH0oKSxSPVwiY2x1c3RlclwiLEw9ZnVuY3Rpb24odCxlLG4scil7dm9pZCAwPT09biYmKG49XCJjbHVzdGVyXCIpLHZvaWQgMD09PXImJihyPTIpO3ZhciBpPVtdLG89dC5ub2RlcztyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe2kucHVzaChCKG8sdCxlLG4scikpfSkpLGl9LEI9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1bbl0sYT1bXSxzPXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUsdSl7aWYoZTw9aSYmbiE9PXUpe28ucHVzaCh1KSxhLnB1c2godFt1XSk7dmFyIGM9dFt1XVtyXTtzW2NdPyhzW2NdLmNvdW50Kyssc1tjXS5kaXN0cy5wdXNoKGUpKTpzW2NdPXtjb3VudDoxLGRpc3RzOltlXX19fSkpLE9iamVjdC5rZXlzKHMpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3NbdF0uZGlzdHM9c1t0XS5kaXN0cy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSl9KSkse25vZGVJZHg6bixub2RlSWQ6dFtuXS5pZCxub2RlSWR4czpvLG5laWdoYm9yczphLG5laWdoYm9yTnVtOm8ubGVuZ3RoLTEsbm9kZUxhYmVsQ291bnRNYXA6c319LEc9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi5ub2RlcztyZXR1cm4gcnx8KHI9e30pLE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG8pe3ZhciBhLHM7aWYoIXJ8fCFyW29dKXtyW29dPXtub2RlczpbXSxlZGdlczpbXX07dmFyIHU9dFtvXSxjPW51bGw9PT0oYT1lW3Uuc3RhcnRdKXx8dm9pZCAwPT09YT92b2lkIDA6YS5ub2RlSWR4cyxmPW51bGw9PT0ocz1lW3UuZW5kXSl8fHZvaWQgMD09PXM/dm9pZCAwOnMubm9kZUlkeHM7aWYoYyYmZil7dmFyIGw9bmV3IFNldChmKSxoPWMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbC5oYXModCl9KSk7aWYoaCYmaC5sZW5ndGgpe2Zvcih2YXIgZD17fSxwPWgubGVuZ3RoLGc9MDtnPHA7ZysrKXt2YXIgdj1pW2hbZ11dO3Jbb10ubm9kZXMucHVzaCh2KSxkW3YuaWRdPSEwfW4uZWRnZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZFt0LnNvdXJjZV0mJmRbdC50YXJnZXRdJiZyW29dLmVkZ2VzLnB1c2godCl9KSl9fX19KSkscn0sRj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT17fTt0Lm5vZGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lbdC5pZF09dH0pKTt2YXIgbz0wO3JldHVybiB0LmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBhPWlbdC5zb3VyY2VdW25dLHM9aVt0LnRhcmdldF1bbl0sdT1lLm5vZGVzWzBdW25dLGM9ZS5ub2Rlc1sxXVtuXSxmPWUuZWRnZXNbMF1bcl07dFtyXT09PWYmJihhPT09dSYmcz09PWN8fGE9PT1jJiZzPT09dSkmJm8rK30pKSxvfSxVPWZ1bmN0aW9uKHQsZSl7dmFyIG49e30scj17fTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LGkpe25bdC5pZF09e2lkeDppLG5vZGU6dCxkZWdyZWU6MH07dmFyIG89dFtlXTtyW29dfHwocltvXT1bXSkscltvXS5wdXNoKHQpfSkpLHtub2RlTWFwOm4sbm9kZUxhYmVsTWFwOnJ9fSx6PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj17fSxpPXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQsbyl7cltcIlwiK2xdPXtpZHg6byxlZGdlOnR9O3ZhciBhPXRbZV07aVthXXx8KGlbYV09W10pLGlbYV0ucHVzaCh0KTt2YXIgcz1uW3Quc291cmNlXTtzJiZzLmRlZ3JlZSsrO3ZhciB1PW5bdC50YXJnZXRdO3UmJnUuZGVncmVlKyt9KSkse2VkZ2VNYXA6cixlZGdlTGFiZWxNYXA6aX19LFY9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUubGVuZ3RoLGk9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSxvKXtmb3IodmFyIGE9bj8wOm8rMSxzPXRbb10uaWQsdT1hO3U8cjt1KyspaWYobyE9PXUpe3ZhciBjPXRbdV0uaWQsZj1lW3VdO2lbcytcIi1cIitjXT1mLG58fChpW2MrXCItXCIrc109Zil9fSkpLGl9LFc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PTEwKSx0aGlzLmxpbmtlZExpc3Q9bmV3IGEsdGhpcy5tYXhTdGVwPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcImxlbmd0aFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saW5rZWRMaXN0LnRvQXJyYXkoKS5sZW5ndGh9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiF0aGlzLmxpbmtlZExpc3QuaGVhZH0sdC5wcm90b3R5cGUuaXNNYXhTdGFjaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvQXJyYXkoKS5sZW5ndGg+PXRoaXMubWF4U3RlcH0sdC5wcm90b3R5cGUucGVlaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMubGlua2VkTGlzdC5oZWFkLnZhbHVlfSx0LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3RoaXMubGlua2VkTGlzdC5wcmVwZW5kKHQpLHRoaXMubGVuZ3RoPnRoaXMubWF4U3RlcCYmdGhpcy5saW5rZWRMaXN0LmRlbGV0ZVRhaWwoKX0sdC5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5saW5rZWRMaXN0LmRlbGV0ZUhlYWQoKTtyZXR1cm4gdD90LnZhbHVlOm51bGx9LHQucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saW5rZWRMaXN0LnRvQXJyYXkoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlfSkpfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe2Zvcig7IXRoaXMuaXNFbXB0eSgpOyl0aGlzLnBvcCgpfSx0fSgpLFg9XCJTVUNDRVNTXCIsWT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10scj0wO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspZVtyXT1hcmd1bWVudHNbcl07cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLGkpe24uZSgxKS50aGVuKG4uYmluZChuLDEpKS50aGVuKChmdW5jdGlvbihuKXt2YXIgbz1uZXcgbi5kZWZhdWx0O28ucG9zdE1lc3NhZ2Uoe3R5cGU6dCxkYXRhOmV9KSxvLm9ubWVzc2FnZT1mdW5jdGlvbih0KXt2YXIgZT10LmRhdGEsbj1lLmRhdGEsYT1lLnR5cGU7WD09PWE/cihuKTppKCksby50ZXJtaW5hdGUoKX19KSl9KSl9fSxIPXtnZXRBZGpNYXRyaXg6cixicmVhZHRoRmlyc3RTZWFyY2g6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PXt9KTt2YXIgZSxuPXQscj1mdW5jdGlvbigpe30saT0oZT17fSxmdW5jdGlvbih0KXt2YXIgbj10Lm5leHQ7cmV0dXJuIWVbbl0mJihlW25dPSEwLCEwKX0pO3JldHVybiBuLmFsbG93VHJhdmVyc2FsPXQuYWxsb3dUcmF2ZXJzYWx8fGksbi5lbnRlcj10LmVudGVyfHxyLG4ubGVhdmU9dC5sZWF2ZXx8cixufShuKSxpPW5ldyBzLG89dC5lZGdlcyxhPXZvaWQgMD09PW8/W106bztpLmVucXVldWUoZSk7Zm9yKHZhciB1PVwiXCIsZj1mdW5jdGlvbigpe3ZhciB0PWkuZGVxdWV1ZSgpO3IuZW50ZXIoe2N1cnJlbnQ6dCxwcmV2aW91czp1fSksYyh0LGEsXCJ0YXJnZXRcIikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ci5hbGxvd1RyYXZlcnNhbCh7cHJldmlvdXM6dSxjdXJyZW50OnQsbmV4dDplfSkmJmkuZW5xdWV1ZShlKX0pKSxyLmxlYXZlKHtjdXJyZW50OnQscHJldmlvdXM6dX0pLHU9dH07IWkuaXNFbXB0eSgpOylmKCl9LGNvbm5lY3RlZENvbXBvbmVudDpmdW5jdGlvbih0LGUpe3JldHVybiBlP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lm5vZGVzLG49dm9pZCAwPT09ZT9bXTplLHI9dC5lZGdlcyxpPXZvaWQgMD09PXI/W106cixvPVtdLGE9e30scz17fSx1PXt9LGY9W10sbD0wLGg9ZnVuY3Rpb24gdChlKXtzW2UuaWRdPWwsdVtlLmlkXT1sLGwrPTEsby5wdXNoKGUpLGFbZS5pZF09ITA7Zm9yKHZhciByPWMoZS5pZCxpLFwidGFyZ2V0XCIpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5pZH0pKS5pbmRleE9mKHQpPi0xfSkpLGg9ZnVuY3Rpb24oaSl7dmFyIG89cltpXTtpZihzW29dfHwwPT09c1tvXSlhW29dJiYodVtlLmlkXT1NYXRoLm1pbih1W2UuaWRdLHNbb10pKTtlbHNle3ZhciBjPW4uZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5pZD09PW99KSk7Yy5sZW5ndGg+MCYmdChjWzBdKSx1W2UuaWRdPU1hdGgubWluKHVbZS5pZF0sdVtvXSl9fSxkPTA7ZDxyLmxlbmd0aDtkKyspaChkKTtpZih1W2UuaWRdPT09c1tlLmlkXSl7Zm9yKHZhciBwPVtdO28ubGVuZ3RoPjA7KXt2YXIgZz1vLnBvcCgpO2lmKGFbZy5pZF09ITEscC5wdXNoKGcpLGc9PT1lKWJyZWFrfXAubGVuZ3RoPjAmJmYucHVzaChwKX19LGQ9MCxwPW47ZDxwLmxlbmd0aDtkKyspe3ZhciBnPXBbZF07c1tnLmlkXXx8MD09PXNbZy5pZF18fGgoZyl9cmV0dXJuIGZ9KHQpOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lm5vZGVzLG49dm9pZCAwPT09ZT9bXTplLHI9dC5lZGdlcyxpPXZvaWQgMD09PXI/W106cixvPVtdLGE9e30scz1bXSx1PWZ1bmN0aW9uIHQoZSl7cy5wdXNoKGUpLGFbZS5pZF09ITA7Zm9yKHZhciByPWMoZS5pZCxpKSxvPWZ1bmN0aW9uKGUpe3ZhciBpPXJbZV07aWYoIWFbaV0pe3ZhciBvPW4uZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5pZD09PWl9KSk7by5sZW5ndGg+MCYmdChvWzBdKX19LHU9MDt1PHIubGVuZ3RoOysrdSlvKHUpfSxmPTA7ZjxuLmxlbmd0aDtmKyspe3ZhciBsPW5bZl07aWYoIWFbbC5pZF0pe3UobCk7Zm9yKHZhciBoPVtdO3MubGVuZ3RoPjA7KWgucHVzaChzLnBvcCgpKTtvLnB1c2goaCl9fXJldHVybiBvfSh0KX0sZ2V0RGVncmVlOmQsZ2V0SW5EZWdyZWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaCh0KVtlXT9oKHQpW2VdLmluRGVncmVlOjB9LGdldE91dERlZ3JlZTpmdW5jdGlvbih0LGUpe3JldHVybiBoKHQpW2VdP2godClbZV0ub3V0RGVncmVlOjB9LGRldGVjdEN5Y2xlOmZ1bmN0aW9uKHQpe3ZhciBlPW51bGwsbj10Lm5vZGVzLHI9e30saT17fSxvPXt9LGE9e307KHZvaWQgMD09PW4/W106bikuZm9yRWFjaCgoZnVuY3Rpb24odCl7aVt0LmlkXT10fSkpO2Zvcih2YXIgcz17ZW50ZXI6ZnVuY3Rpb24odCl7dmFyIG49dC5jdXJyZW50LGE9dC5wcmV2aW91cztpZihvW25dKXtlPXt9O2Zvcih2YXIgcz1uLHU9YTt1IT09bjspZVtzXT11LHM9dSx1PXJbdV07ZVtzXT11fWVsc2Ugb1tuXT1uLGRlbGV0ZSBpW25dLHJbbl09YX0sbGVhdmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5jdXJyZW50O2FbZV09ZSxkZWxldGUgb1tlXX0sYWxsb3dUcmF2ZXJzYWw6ZnVuY3Rpb24odCl7dmFyIG49dC5uZXh0O3JldHVybiFlJiYhYVtuXX19O09iamVjdC5rZXlzKGkpLmxlbmd0aDspcCh0LE9iamVjdC5rZXlzKGkpWzBdLHMpO3JldHVybiBlfSxkZXB0aEZpcnN0U2VhcmNoOnAsZGlqa3N0cmE6YixmaW5kQWxsUGF0aDpmdW5jdGlvbih0LGUsbixyKXt2YXIgaTtpZihlPT09bilyZXR1cm5bW2VdXTt2YXIgbz10LmVkZ2VzLGE9dm9pZCAwPT09bz9bXTpvLHM9W2VdLHU9KChpPXt9KVtlXT0hMCxpKSxmPVtdLGw9W10saD1yP2MoZSxhLFwidGFyZ2V0XCIpOmMoZSxhKTtmb3IoZi5wdXNoKGgpO3MubGVuZ3RoPjAmJmYubGVuZ3RoPjA7KXt2YXIgZD1mW2YubGVuZ3RoLTFdO2lmKGQubGVuZ3RoKXt2YXIgcD1kLnNoaWZ0KCk7aWYocCYmKHMucHVzaChwKSx1W3BdPSEwLGg9cj9jKHAsYSxcInRhcmdldFwiKTpjKHAsYSksZi5wdXNoKGguZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hdVt0XX0pKSkpLHNbcy5sZW5ndGgtMV09PT1uKXt2YXIgZz1zLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSk7bC5wdXNoKGcpLHY9cy5wb3AoKSx1W3ZdPSExLGYucG9wKCl9fWVsc2V7dmFyIHY9cy5wb3AoKTt1W3ZdPSExLGYucG9wKCl9fXJldHVybiBsfSxmaW5kU2hvcnRlc3RQYXRoOmZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89Yih0LGUscixpKSxhPW8ubGVuZ3RoLHM9by5wYXRoLHU9by5hbGxQYXRocztyZXR1cm57bGVuZ3RoOmFbbl0scGF0aDpzW25dLGFsbFBhdGg6dVtuXX19LGZsb3lkV2Fyc2hhbGw6dyxsYWJlbFByb3BhZ2F0aW9uOmZ1bmN0aW9uKHQsZSxuLGkpe3ZvaWQgMD09PWUmJihlPSExKSx2b2lkIDA9PT1uJiYobj1cIndlaWdodFwiKSx2b2lkIDA9PT1pJiYoaT0xZTMpO3ZhciBvPXQubm9kZXMsYT12b2lkIDA9PT1vP1tdOm8scz10LmVkZ2VzLHU9dm9pZCAwPT09cz9bXTpzLGM9e30sZj17fTthLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIG49bCgpO3QuY2x1c3RlcklkPW4sY1tuXT17aWQ6bixub2RlczpbdF19LGZbdC5pZF09e25vZGU6dCxpZHg6ZX19KSk7dmFyIGg9cih0LGUpLGQ9W10scD17fTtoLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPWFbZV0uaWQ7cFtyXT17fSx0LmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7aWYodCl7bis9dDt2YXIgaT1hW2VdLmlkO3Bbcl1baV09dH19KSksZC5wdXNoKG4pfSkpO2Zvcih2YXIgZz0wLHY9ZnVuY3Rpb24oKXt2YXIgdD0hMTtpZihhLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPXt9O09iamVjdC5rZXlzKHBbZS5pZF0pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPXBbZS5pZF1bdF0saT1mW3RdLm5vZGUuY2x1c3RlcklkO25baV18fChuW2ldPTApLG5baV0rPXJ9KSk7dmFyIHI9LTEvMCxpPVtdO2lmKE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3I8blt0XT8ocj1uW3RdLGk9W3RdKTpyPT09blt0XSYmaS5wdXNoKHQpfSkpLDEhPT1pLmxlbmd0aHx8aVswXSE9PWUuY2x1c3RlcklkKXt2YXIgbz1pLmluZGV4T2YoZS5jbHVzdGVySWQpO2lmKG8+PTAmJmkuc3BsaWNlKG8sMSksaSYmaS5sZW5ndGgpe3Q9ITA7dmFyIGE9Y1tlLmNsdXN0ZXJJZF0scz1hLm5vZGVzLmluZGV4T2YoZSk7YS5ub2Rlcy5zcGxpY2UocywxKTt2YXIgdT1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqaS5sZW5ndGgpLGw9Y1tpW3VdXTtsLm5vZGVzLnB1c2goZSksZS5jbHVzdGVySWQ9bC5pZH19fSkpLCF0KXJldHVyblwiYnJlYWtcIjtnKyt9O2c8aSYmXCJicmVha1wiIT09digpOyk7T2JqZWN0LmtleXMoYykuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9Y1t0XTtlLm5vZGVzJiZlLm5vZGVzLmxlbmd0aHx8ZGVsZXRlIGNbdF19KSk7dmFyIHk9W10sbT17fTt1LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQuc291cmNlLHI9dC50YXJnZXQsaT10W25dfHwxLG89ZltlXS5ub2RlLmNsdXN0ZXJJZCxhPWZbcl0ubm9kZS5jbHVzdGVySWQscz1vK1wiLS0tXCIrYTtpZihtW3NdKW1bc10ud2VpZ2h0Kz1pLG1bc10uY291bnQrKztlbHNle3ZhciB1PXtzb3VyY2U6byx0YXJnZXQ6YSx3ZWlnaHQ6aSxjb3VudDoxfTttW3NdPXUseS5wdXNoKHUpfX0pKTt2YXIgYj1bXTtyZXR1cm4gT2JqZWN0LmtleXMoYykuZm9yRWFjaCgoZnVuY3Rpb24odCl7Yi5wdXNoKGNbdF0pfSkpLHtjbHVzdGVyczpiLGNsdXN0ZXJFZGdlczp5fX0sbG91dmFpbjpmdW5jdGlvbih0LGUsbixpKXt2b2lkIDA9PT1lJiYoZT0hMSksdm9pZCAwPT09biYmKG49XCJ3ZWlnaHRcIiksdm9pZCAwPT09aSYmKGk9MWUtNCk7dmFyIG89dC5ub2RlcyxhPXZvaWQgMD09PW8/W106byxzPXQuZWRnZXMsdT12b2lkIDA9PT1zP1tdOnMsYz17fSxmPXt9O2EuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgbj1sKCk7dC5jbHVzdGVySWQ9bixjW25dPXtpZDpuLG5vZGVzOlt0XX0sZlt0LmlkXT17bm9kZTp0LGlkeDplfX0pKTt2YXIgaD1yKHQsZSksZD1bXSxwPXt9LGc9MDtoLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPWFbZV0uaWQ7cFtyXT17fSx0LmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7aWYodCl7bis9dDt2YXIgaT1hW2VdLmlkO3Bbcl1baV09dCxnKz10fX0pKSxkLnB1c2gobil9KSksZy89Mjtmb3IodmFyIHY9MS8wLHk9MS8wLG09MDt2PVMoYSxoLGQsZyksIShNYXRoLmFicyh2LXkpPGl8fG0+MTAwKTspeT12LG0rKyxPYmplY3Qua2V5cyhjKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT0wO3UuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIGk9ci5zb3VyY2Usbz1yLnRhcmdldCxhPWZbaV0ubm9kZS5jbHVzdGVySWQscz1mW29dLm5vZGUuY2x1c3RlcklkOyhhPT09dCYmcyE9PXR8fHM9PT10JiZhIT09dCkmJihlKz1yW25dfHwxKX0pKSxjW3RdLnN1bVRvdD1lfSkpLGEuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgcixpPWNbdC5jbHVzdGVySWRdLG89MCxhPWRbZV0vKDIqZykscz0wO2kubm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49Zlt0LmlkXS5pZHg7cys9aFtlXVtuXXx8MH0pKTt2YXIgbD1zLWkuc3VtVG90KmEsdj1wW3QuaWRdO2lmKE9iamVjdC5rZXlzKHYpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPWZbbl0ubm9kZS5jbHVzdGVySWQ7aWYoaSE9PXQuY2x1c3RlcklkKXt2YXIgcz1jW2ldLHU9cy5ub2RlcztpZih1JiZ1Lmxlbmd0aCl7dmFyIGQ9MDt1LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPWZbdC5pZF0uaWR4O2QrPWhbZV1bbl18fDB9KSk7dmFyIHA9ZC1zLnN1bVRvdCphLWw7cD5vJiYobz1wLHI9cyl9fX0pKSxvPjApe3Iubm9kZXMucHVzaCh0KTt2YXIgeT10LmNsdXN0ZXJJZDt0LmNsdXN0ZXJJZD1yLmlkO3ZhciBtPWkubm9kZXMuaW5kZXhPZih0KTtpLm5vZGVzLnNwbGljZShtLDEpO3ZhciBiPTAseD0wO3UuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5zb3VyY2UsaT10LnRhcmdldCxvPWZbZV0ubm9kZS5jbHVzdGVySWQsYT1mW2ldLm5vZGUuY2x1c3RlcklkOyhvPT09ci5pZCYmYSE9PXIuaWR8fGE9PT1yLmlkJiZvIT09ci5pZCkmJihiKz10W25dfHwxKSwobz09PXkmJmEhPT15fHxhPT09eSYmbyE9PXkpJiYoeCs9dFtuXXx8MSl9KSksci5zdW1Ub3Q9YixpLnN1bVRvdD14fX0pKTtPYmplY3Qua2V5cyhjKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1jW3RdO2Uubm9kZXMmJmUubm9kZXMubGVuZ3RofHxkZWxldGUgY1t0XX0pKTt2YXIgYj1bXSx4PXt9O3UuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5zb3VyY2Uscj10LnRhcmdldCxpPXRbbl18fDEsbz1mW2VdLm5vZGUuY2x1c3RlcklkLGE9ZltyXS5ub2RlLmNsdXN0ZXJJZCxzPW8rXCItLS1cIithO2lmKHhbc10peFtzXS53ZWlnaHQrPWkseFtzXS5jb3VudCsrO2Vsc2V7dmFyIHU9e3NvdXJjZTpvLHRhcmdldDphLHdlaWdodDppLGNvdW50OjF9O3hbc109dSxiLnB1c2godSl9fSkpO3ZhciB3PVtdO3JldHVybiBPYmplY3Qua2V5cyhjKS5mb3JFYWNoKChmdW5jdGlvbih0KXt3LnB1c2goY1t0XSl9KSkse2NsdXN0ZXJzOncsY2x1c3RlckVkZ2VzOmJ9fSxtaW5pbXVtU3Bhbm5pbmdUcmVlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj97cHJpbTprLGtydXNrYWw6TX1bbl0odCxlKTpNKHQsZSl9LHBhZ2VSYW5rOmZ1bmN0aW9uKHQsZSxuKXtcIm51bWJlclwiIT10eXBlb2YgZSYmKGU9MWUtNiksXCJudW1iZXJcIiE9dHlwZW9mIG4mJihuPS44NSk7Zm9yKHZhciByLGk9MSxvPTAsYT0xZTMscz10Lm5vZGVzLHU9dm9pZCAwPT09cz9bXTpzLGY9dC5lZGdlcyxsPXZvaWQgMD09PWY/W106ZixoPXUubGVuZ3RoLHA9e30sZz17fSx2PTA7djxoOysrdilwW209KEU9dVt2XSkuaWRdPTEvaCxnW21dPTEvaDtmb3IodmFyIHk9ZCh0KTthPjAmJmk+ZTspe2ZvcihvPTAsdj0wO3Y8aDsrK3Ype3ZhciBtPShFPXVbdl0pLmlkO2lmKHI9MCwwPT09eVtFLmlkXS5pbkRlZ3JlZSlwW21dPTA7ZWxzZXtmb3IodmFyIGI9YyhtLGwsXCJzb3VyY2VcIikseD0wO3g8Yi5sZW5ndGg7Kyt4KXt2YXIgdz1iW3hdLFM9eVt3XS5vdXREZWdyZWU7Uz4wJiYocis9Z1t3XS9TKX1wW21dPW4qcixvKz1wW21dfX1mb3Iobz0oMS1vKS9oLGk9MCx2PTA7djxoOysrdil7dmFyIEU7cj1wW209KEU9dVt2XSkuaWRdK28saSs9TWF0aC5hYnMoci1nW21dKSxnW21dPXJ9YS09MX1yZXR1cm4gZ30sZ2V0TmVpZ2hib3JzOmMsU3RhY2s6VyxHQURESTpmdW5jdGlvbih0LGUsbixyLGksbyxhKXtpZih2b2lkIDA9PT1uJiYobj0hMSksdm9pZCAwPT09byYmKG89XCJjbHVzdGVyXCIpLHZvaWQgMD09PWEmJihhPVwiY2x1c3RlclwiKSx0JiZ0Lm5vZGVzKXt2YXIgcz10Lm5vZGVzLmxlbmd0aDtpZihzKXt2YXIgYz13KHQsbiksZj13KGUsbiksbD1WKHQubm9kZXMsYyxuKSxoPVYoZS5ub2RlcyxmLG4pLGQ9VSh0Lm5vZGVzLG8pLHA9ZC5ub2RlTWFwLHY9ZC5ub2RlTGFiZWxNYXAseT1VKGUubm9kZXMsbyksbT15Lm5vZGVNYXAseD15Lm5vZGVMYWJlbE1hcDt6KHQuZWRnZXMsYSxwKTt2YXIgUz16KGUuZWRnZXMsYSxtKS5lZGdlTGFiZWxNYXA7aXx8KGk9TWF0aC5tYXguYXBwbHkoTWF0aCxnKGZbMF0sWzJdKSkpLHJ8fChyPWkpO3ZhciBFPUwodCxjLG8sciksXz1MKGUsZixvLHIpLE89ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1NYXRoLmNlaWwobi9lKSxhPXt9LHM9MDtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2Zvcih2YXIgdT0wLGM9MCxmPXQubm9kZUlkeHMsbD10Lm5laWdoYm9yTnVtLTE7dTxvOyl7Zm9yKHZhciBoPWZbMStNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbCldLGQ9MDsoYVtyK1wiLVwiK2hdfHxhW2grXCItXCIrcl0pJiYoaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZSksISgrK2Q+MiplKSk7KTtpZihkPDIqZSYmKGFbcitcIi1cIitoXT17c3RhcnQ6cixlbmQ6aCxkaXN0YW5jZTppW3JdW2hdfSx1KyssKytzPj1uKSlyZXR1cm4gYTtpZigrK2M+MiplKWJyZWFrfXU8byYmKG89KG8rKG8tdSkpLyhlLXItMSkpfSkpLGF9KDAscyxNYXRoLm1pbigxMDAscyoocy0xKS8yKSxfLGMpLGs9RyhPLEUsdCksTT1mdW5jdGlvbih0KXt2YXIgZT10LmRpcmVjdGVkLG49dm9pZCAwIT09ZSYmZSxyPXQubm9kZUxhYmVsUHJvcCxpPXZvaWQgMD09PXI/UjpyLG89dC5lZGdlTGFiZWxQcm9wLGE9dm9pZCAwPT09bz9SOm8scz1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT17fTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24obyxhKXt2YXIgcz10W29dLHU9bmV3IEkoYSwhMCxlKSxjPXt9O3Mubm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt1LmFkZE5vZGUoZSx0W25dKSxjW3QuaWRdPWV9KSkscy5lZGdlcy5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3ZhciBuPWNbdC5zb3VyY2VdLGk9Y1t0LnRhcmdldF07dS5hZGRFZGdlKC0xLG4saSx0W3JdKX0pKSx1JiZ1LmdldE5vZGVOdW0oKSYmKGlbdS5pZF09dSl9KSksaX0odC5ncmFwaHMsbixpLGEpLHU9bmV3IE4oe2dyYXBoczpzLG1pblN1cHBvcnQ6dC5taW5TdXBwb3J0LG1heE5vZGVOdW06dC5tYXhOb2RlTnVtLG1pbk5vZGVOdW06dC5taW5Ob2RlTnVtLHRvcDp0LnRvcCx2ZXJib3NlOnQudmVyYm9zZSxkaXJlY3RlZDpufSk7cmV0dXJuIHUucnVuKCksZnVuY3Rpb24odCxlLG4pe3ZhciByPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBpPXtub2RlczpbXSxlZGdlczpbXX07dC5ub2Rlcy5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbjtpLm5vZGVzLnB1c2goKChuPXtpZDpcIlwiK3QuaWR9KVtlXT10LmxhYmVsLG4pKX0pKSx0LmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlO2kuZWRnZXMucHVzaCgoKGU9e3NvdXJjZTpcIlwiK3QuZnJvbSx0YXJnZXQ6XCJcIit0LnRvfSlbbl09dC5sYWJlbCxlKSl9KSksci5wdXNoKGkpfSkpLHJ9KHUuZnJlcXVlbnRTdWJncmFwaHMsaSxhKX0oe2dyYXBoczprLG5vZGVMYWJlbFByb3A6byxlZGdlTGFiZWxQcm9wOmEsbWluU3VwcG9ydDoxLG1pbk5vZGVOdW06MSxtYXhOb2RlTnVtOjQsZGlyZWN0ZWQ6bn0pLnNsaWNlKDAsMTApLEE9TS5sZW5ndGgsVD1bXTtNLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7VFtlXT17fSxPYmplY3Qua2V5cyhrKS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgcj1rW25dLGk9RihyLHQsbyxhKTtUW2VdW25dPWl9KSl9KSk7dmFyIEM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0xLzAsaT0wLG89ZnVuY3Rpb24oZSl7dmFyIG49dFtlXSxvPU9iamVjdC5rZXlzKG4pLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pKSxhPVtdO28uZm9yRWFjaCgoZnVuY3Rpb24odCxlKXthW2UlMTBdfHwoYVtlJTEwXT17Z3JhcGhzOltdLHRvdGFsQ291bnQ6MCxhdmVDb3VudDowfSksYVtlJTEwXS5ncmFwaHMucHVzaCh0KSxhW2UlMTBdLnRvdGFsQ291bnQrPW5bdF19KSk7dmFyIHM9MCx1PVtdO2EuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC50b3RhbENvdW50L3QuZ3JhcGhzLmxlbmd0aDt0LmF2ZUNvdW50PWUsdS5wdXNoKGUpO3ZhciByPTAsaT10Lmxlbmd0aDt0LmdyYXBocy5mb3JFYWNoKChmdW5jdGlvbihlLGkpe3ZhciBvPW5bZV07dC5ncmFwaHMuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtpIT09ZSYmKHIrPU1hdGguYWJzKG8tblt0XSkpfSkpfSkpLHMrPXIvPWkqKGktMSkvMn0pKSxzLz1hLmxlbmd0aDt2YXIgYz0wO3UuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt1LmZvckVhY2goKGZ1bmN0aW9uKG4scil7ZSE9PXImJihjKz1NYXRoLmFicyh0LW4pKX0pKSxjLz11Lmxlbmd0aCoodS5sZW5ndGgtMSkvMn0pKTt2YXIgZj1jLXM7cjxmJiYocj1mLGk9ZSl9LGE9MDthPGU7YSsrKW8oYSk7cmV0dXJue3N0cnVjdHVyZTpuW2ldLHN0cnVjdHVyZUNvdW50TWFwOnRbaV19fShULEEsTSksUD1DLnN0cnVjdHVyZSxqPUMuc3RydWN0dXJlQ291bnRNYXAsRD1lLm5vZGVzWzBdLFc9RFtvXSxYPXZbV10sWT17fSxIPXt9LHE9e30sSz17fSxaPXt9O09iamVjdC5rZXlzKHgpLmZvckVhY2goKGZ1bmN0aW9uKG4scil7WltuXT1bXTt2YXIgaT0tMS8wLHM9eFtuXSx1PXt9O3MuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9aFtELmlkK1wiLVwiK3QuaWRdO2UmJlpbbl0ucHVzaChlKSxpPGUmJihpPWUpLHVbRC5pZCtcIi1cIit0LmlkXT17c3RhcnQ6MCxlbmQ6bVt0LmlkXS5pZHgsZGlzdGFuY2U6ZX19KSksWltuXT1aW25dLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pKSxIPUcodSxfLGUsSCk7dmFyIGM9W107aWYoT2JqZWN0LmtleXModSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYocVt0XSljLnB1c2gocVt0XSk7ZWxzZXt2YXIgZT1IW3RdO3FbdF09RihlLFAsbyxhKSxjLnB1c2gocVt0XSl9fSkpLGM9Yy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSksS1tELmlkK1wiLVwiK25dPWMsbiE9PVcpZm9yKHZhciBmPWZ1bmN0aW9uKGUpe3ZhciByPVhbZV0saT1FW3Bbci5pZF0uaWR4XSxzPWkubm9kZUxhYmVsQ291bnRNYXBbbl0sdT14W25dLmxlbmd0aDtpZighc3x8cy5jb3VudDx1KXJldHVybiBYLnNwbGljZShlLDEpLFwiY29udGludWVcIjtmb3IodmFyIGY9ITEsaD0wO2g8dTtoKyspaWYocy5kaXN0c1toXT5aW25dW2hdKXtmPSEwO2JyZWFrfWlmKGYpcmV0dXJuIFguc3BsaWNlKGUsMSksXCJjb250aW51ZVwiO3ZhciBkPXt9O2kubmVpZ2hib3JzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWxbci5pZCtcIi1cIit0LmlkXTtkW3IuaWQrXCItXCIrdC5pZF09e3N0YXJ0OnBbci5pZF0uaWR4LGVuZDpwW3QuaWRdLmlkeCxkaXN0YW5jZTplfX0pKSxrPUcoZCxFLHQsayk7dmFyIGc9W107T2JqZWN0LmtleXMoZCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoalt0XSlnLnB1c2goalt0XSk7ZWxzZXt2YXIgZT1rW3RdO2pbdF09RihlLFAsbyxhKSxnLnB1c2goalt0XSl9fSkpLGc9Zy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSk7dmFyIHY9ITE7Zm9yKGg9MDtoPHU7aCsrKWlmKGdbaF08Y1toXSl7dj0hMDticmVha31yZXR1cm4gdj8oWC5zcGxpY2UoZSwxKSxcImNvbnRpbnVlXCIpOnZvaWQgMH0sZD1YLmxlbmd0aC0xO2Q+PTA7ZC0tKWYoZCl9KSk7dmFyIFE9W107WC5mb3JFYWNoKChmdW5jdGlvbihuKXtmb3IodmFyIHI9cFtuLmlkXS5pZHgscz1CKHQubm9kZXMsY1tyXSxyLG8saSkubmVpZ2hib3JzLGY9cy5sZW5ndGgsaD0hMSxkPWZ1bmN0aW9uKHIpe2lmKHMubGVuZ3RoKzE8ZS5ub2Rlcy5sZW5ndGgpcmV0dXJuIGg9ITAse3ZhbHVlOnZvaWQgMH07dmFyIGk9c1tyXSx1PWlbb107aWYoIXhbdV18fCF4W3VdLmxlbmd0aClyZXR1cm4gcy5zcGxpY2UociwxKSxcImNvbnRpbnVlXCI7dmFyIGM9bi5pZCtcIi1cIitpLmlkO2lmKCFaW3VdfHwhWlt1XS5sZW5ndGgpcmV0dXJuIHMuc3BsaWNlKHIsMSksXCJjb250aW51ZVwiO3ZhciBmPWxbY107aWYoZj5aW3VdW1pbdV0ubGVuZ3RoLTFdKXJldHVybiBzLnNwbGljZShyLDEpLFwiY29udGludWVcIjt2YXIgZD1qW2NdP2pbY106ZnVuY3Rpb24odCxlLG4scixpLG8sYSxzLHUsYyxmKXt2YXIgbCxoPWUuaWQrXCItXCIrbi5pZDtpZihjJiZjW2hdKXJldHVybiBjW2hdO3ZhciBkPWY/ZltoXTp2b2lkIDA7aWYoIWQpe3ZhciBwPSgobD17fSlbaF09e3N0YXJ0OnJbZS5pZF0uaWR4LGVuZDpyW24uaWRdLmlkeCxkaXN0YW5jZTppfSxsKTtkPShmPUcocCxvLHQsZikpW2hdfXJldHVybiBGKGQsYSxzLHUpfSh0LG4saSxwLGYsRSxQLG8sYSxqLGspLGc9RC5pZCtcIi1cIit1O2lmKGQ8S1tnXVtLW2ddLmxlbmd0aC0xXSlyZXR1cm4gcy5zcGxpY2UociwxKSxcImNvbnRpbnVlXCI7dmFyIHY9WVt1XTtyZXR1cm4gdm9pZCAwPT09diYmKHY9MS8wLHhbdV0uZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9bVt0LmlkXS5kZWdyZWU7dj5lJiYodj1lKX0pKSxZW3VdPXYpLHBbaS5pZF0uZGVncmVlPHY/KHMuc3BsaWNlKHIsMSksXCJjb250aW51ZVwiKTp2b2lkIDB9LGc9Zi0xO2c+PTA7Zy0tKXt2YXIgdj1kKGcpO2lmKFwib2JqZWN0XCI9PXUodikpcmV0dXJuIHYudmFsdWV9aHx8US5wdXNoKHtub2Rlczpbbl0uY29uY2F0KHMpfSl9KSk7dmFyIEo9YihlLEQuaWQsITEpLmxlbmd0aCwkPXt9O24/KE9iamVjdC5rZXlzKEopLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPW1bdF0ubm9kZVtvXTskW2VdPyRbZV0ucHVzaChKW3RdKTokW2VdPVtKW3RdXX0pKSxPYmplY3Qua2V5cygkKS5mb3JFYWNoKChmdW5jdGlvbih0KXskW3RdLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pKX0pKSk6JD1aO2Zvcih2YXIgdHQ9ZnVuY3Rpb24ocil7dmFyIGk9UVtyXSxzPWkubm9kZXNbMF0sdT17fSxjPXt9O2kubm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtjW3QuaWRdPXtpZHg6ZSxub2RlOnQsZGVncmVlOjB9O3ZhciBuPXRbb107dVtuXT91W25dKys6dVtuXT0xfSkpO3ZhciBmPVtdLGw9e307dC5lZGdlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtjW3Quc291cmNlXSYmY1t0LnRhcmdldF0mJihmLnB1c2godCksbFt0W2FdXT9sW3RbYV1dKys6bFt0W2FdXT0xLGNbdC5zb3VyY2VdLmRlZ3JlZSsrLGNbdC50YXJnZXRdLmRlZ3JlZSsrKX0pKTtmb3IodmFyIGg9T2JqZWN0LmtleXMoUykubGVuZ3RoLGQ9ITEsZz0wO2c8aDtnKyspe3ZhciB2PU9iamVjdC5rZXlzKFMpW2ddO2lmKCFsW3ZdfHxsW3ZdPFNbdl0ubGVuZ3RoKXtkPSEwO2JyZWFrfX1pZihkKXJldHVybiBRLnNwbGljZShyLDEpLFwiY29udGludWVcIjt2YXIgeT1mLmxlbmd0aDtpZih5PGUuZWRnZXMubGVuZ3RoKXJldHVybiBRLnNwbGljZShyLDEpLFwiYnJlYWtcIjt2YXIgdz0hMSxFPWZ1bmN0aW9uKHQpe3ZhciBlPWZbdF0scj1lW2FdLGk9U1tyXTtpZighaXx8IWkubGVuZ3RoKXJldHVybiBsW3JdLS0saSYmbFtyXTxpLmxlbmd0aD8odz0hMCxcImJyZWFrXCIpOihmLnNwbGljZSh0LDEpLGNbZS5zb3VyY2VdLmRlZ3JlZS0tLGNbZS50YXJnZXRdLmRlZ3JlZS0tLFwiY29udGludWVcIik7dmFyIHM9Y1tlLnNvdXJjZV0ubm9kZVtvXSx1PWNbZS50YXJnZXRdLm5vZGVbb10saD0hMTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1tW3Quc291cmNlXS5ub2RlLHI9bVt0LnRhcmdldF0ubm9kZTtlW29dPT09cyYmcltvXT09PXUmJihoPSEwKSxufHxlW29dIT09dXx8cltvXSE9PXN8fChoPSEwKX0pKSxoP3ZvaWQgMDoobFtyXS0tLGkmJmxbcl08aS5sZW5ndGg/KHc9ITAsXCJicmVha1wiKTooZi5zcGxpY2UodCwxKSxjW2Uuc291cmNlXS5kZWdyZWUtLSxjW2UudGFyZ2V0XS5kZWdyZWUtLSxcImNvbnRpbnVlXCIpKX07Zm9yKGc9eS0xO2c+PTAmJlwiYnJlYWtcIiE9PUUoZyk7Zy0tKTtpZih3KXJldHVybiBRLnNwbGljZShyLDEpLFwiY29udGludWVcIjtpLmVkZ2VzPWY7dmFyIF89YihpLGkubm9kZXNbMF0uaWQsITEpLmxlbmd0aDtpZihPYmplY3Qua2V5cyhfKS5yZXZlcnNlKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodCE9PWkubm9kZXNbMF0uaWQmJiF3KXtpZihfW3RdPT09MS8wKXt2YXIgZT1jW3RdLm5vZGVbb107aWYodVtlXS0tLHVbZV08eFtlXS5sZW5ndGgpcmV0dXJuIHZvaWQodz0hMCk7dmFyIG49aS5ub2Rlcy5pbmRleE9mKGNbdF0ubm9kZSk7cmV0dXJuIGkubm9kZXMuc3BsaWNlKG4sMSksdm9pZChjW3RdPXZvaWQgMCl9dmFyIHI9cFt0XS5ub2RlW29dO2lmKCEkW3JdfHwhJFtyXS5sZW5ndGh8fF9bdF0+JFtyXVskW3JdLmxlbmd0aC0xXSl7aWYoZT1jW3RdLm5vZGVbb10sdVtlXS0tLHVbZV08eFtlXS5sZW5ndGgpcmV0dXJuIHZvaWQodz0hMCk7bj1pLm5vZGVzLmluZGV4T2YoY1t0XS5ub2RlKSxpLm5vZGVzLnNwbGljZShuLDEpLGNbdF09dm9pZCAwfX19KSksdylyZXR1cm4gUS5zcGxpY2UociwxKSxcImNvbnRpbnVlXCI7Zm9yKHZhciBPPSEwLGs9MDtPJiYhdzspe2lmKE89ITEsY1tzLmlkXS5kZWdyZWU8bVtELmlkXS5kZWdyZWUpe3c9ITA7YnJlYWt9aWYodVtzW29dXTx4W3Nbb11dLmxlbmd0aCl7dz0hMDticmVha31mb3IodmFyIE09aS5ub2Rlcy5sZW5ndGgtMTtNPj0wO00tLSl7dmFyIEE9aS5ub2Rlc1tNXSxUPWNbQS5pZF0uZGVncmVlLEM9QVtvXTtpZihUPFlbQ10pe2lmKHVbQVtvXV0tLSx1W0Fbb11dPHhbQVtvXV0ubGVuZ3RoKXt3PSEwO2JyZWFrfWkubm9kZXMuc3BsaWNlKE0sMSksY1tBLmlkXT12b2lkIDAsTz0hMH19aWYod3x8IU8mJjAhPT1rKWJyZWFrO2Zvcih2YXIgST0oeT1mLmxlbmd0aCktMTtJPj0wO0ktLSl7dmFyIFA9ZltJXTtpZighY1tQLnNvdXJjZV18fCFjW1AudGFyZ2V0XSl7Zi5zcGxpY2UoSSwxKTt2YXIgaj1QW2FdO2lmKGxbal0tLSxjW1Auc291cmNlXSYmY1tQLnNvdXJjZV0uZGVncmVlLS0sY1tQLnRhcmdldF0mJmNbUC50YXJnZXRdLmRlZ3JlZS0tLFNbal0mJmxbal08U1tqXS5sZW5ndGgpe3c9ITA7YnJlYWt9Tz0hMH19aysrfXJldHVybiB3fHx3fHxpLm5vZGVzLmxlbmd0aDxlLm5vZGVzLmxlbmd0aHx8Zi5sZW5ndGg8ZS5lZGdlcy5sZW5ndGg/KFEuc3BsaWNlKHIsMSksXCJjb250aW51ZVwiKTp2b2lkIDB9LGV0PVEubGVuZ3RoLTE7ZXQ+PTAmJlwiYnJlYWtcIiE9PXR0KGV0KTtldC0tKTt2YXIgbnQ9US5sZW5ndGgscnQ9ZnVuY3Rpb24odCl7dmFyIGU9UVt0XSxuPXt9O2UuZWRnZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5zb3VyY2UrXCItXCIrdC50YXJnZXQrXCItXCIrdC5sYWJlbDtuW2VdP25bZV0rKzpuW2VdPTF9KSk7Zm9yKHZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPVFbdF0scj17fTtlLmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQuc291cmNlK1wiLVwiK3QudGFyZ2V0K1wiLVwiK3QubGFiZWw7cltlXT9yW2VdKys6cltlXT0xfSkpO3ZhciBpPSEwO09iamVjdC5rZXlzKHIpLmxlbmd0aCE9PU9iamVjdC5rZXlzKG4pLmxlbmd0aD9pPSExOk9iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbdF0hPT1uW3RdJiYoaT0hMSl9KSksaSYmUS5zcGxpY2UodCwxKX0saT1udC0xO2k+dDtpLS0pcihpKTtudD1RLmxlbmd0aH07Zm9yKGV0PTA7ZXQ8PW50LTE7ZXQrKylydChldCk7cmV0dXJuIFF9fX0sZ2V0QWRqTWF0cml4QXN5bmM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gWShcImdldEFkak1hdHJpeFwiKS5hcHBseSh2b2lkIDAsW3QsZV0pfSxjb25uZWN0ZWRDb21wb25lbnRBc3luYzpmdW5jdGlvbih0LGUpe3JldHVybiBZKFwiY29ubmVjdGVkQ29tcG9uZW50XCIpLmFwcGx5KHZvaWQgMCxbdCxlXSl9LGdldERlZ3JlZUFzeW5jOmZ1bmN0aW9uKHQpe3JldHVybiBZKFwiZ2V0RGVncmVlXCIpKHQpfSxnZXRJbkRlZ3JlZUFzeW5jOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFkoXCJnZXRJbkRlZ3JlZVwiKSh0LGUpfSxnZXRPdXREZWdyZWVBc3luYzpmdW5jdGlvbih0LGUpe3JldHVybiBZKFwiZ2V0T3V0RGVncmVlXCIpKHQsZSl9LGRldGVjdEN5Y2xlQXN5bmM6ZnVuY3Rpb24odCl7cmV0dXJuIFkoXCJkZXRlY3RDeWNsZVwiKSh0KX0sZGlqa3N0cmFBc3luYzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gWShcImRpamtzdHJhXCIpLmFwcGx5KHZvaWQgMCxbdCxlLG4scl0pfSxmaW5kQWxsUGF0aEFzeW5jOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBZKFwiZmluZEFsbFBhdGhcIikuYXBwbHkodm9pZCAwLFt0LGUsbixyXSl9LGZpbmRTaG9ydGVzdFBhdGhBc3luYzpmdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBZKFwiZmluZFNob3J0ZXN0UGF0aFwiKS5hcHBseSh2b2lkIDAsW3QsZSxuLHIsaV0pfSxmbG95ZFdhcnNoYWxsQXN5bmM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gWShcImZsb3lkV2Fyc2hhbGxcIikuYXBwbHkodm9pZCAwLFt0LGVdKX0sbGFiZWxQcm9wYWdhdGlvbkFzeW5jOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBZKFwibGFiZWxQcm9wYWdhdGlvblwiKSh0LGUsbixyKX0sbG91dmFpbkFzeW5jOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBZKFwibG91dmFpblwiKSh0LGUsbixyKX0sbWluaW11bVNwYW5uaW5nVHJlZUFzeW5jOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gWShcIm1pbmltdW1TcGFubmluZ1RyZWVcIikuYXBwbHkodm9pZCAwLFt0LGUsbl0pfSxwYWdlUmFua0FzeW5jOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gWShcInBhZ2VSYW5rXCIpLmFwcGx5KHZvaWQgMCxbdCxlLG5dKX0sZ2V0TmVpZ2hib3JzQXN5bmM6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBZKFwiZ2V0TmVpZ2hib3JzXCIpLmFwcGx5KHZvaWQgMCxbdCxlLG5dKX0sR0FERElBc3luYzpmdW5jdGlvbih0LGUsbixyLGksbyxhKXtyZXR1cm4gdm9pZCAwPT09biYmKG49ITEpLHZvaWQgMD09PW8mJihvPVwiY2x1c3RlclwiKSx2b2lkIDA9PT1hJiYoYT1cImNsdXN0ZXJcIiksWShcIkdBRERJXCIpLmFwcGx5KHZvaWQgMCxbdCxlLG4scixpLG8sYV0pfX19fSxpPXt9O2Z1bmN0aW9uIG8odCl7aWYoaVt0XSlyZXR1cm4gaVt0XS5leHBvcnRzO3ZhciBlPWlbdF09e2V4cG9ydHM6e319O3JldHVybiByW3RdKGUsZS5leHBvcnRzLG8pLGUuZXhwb3J0c31yZXR1cm4gby5tPXIsby5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBvLmQoZSx7YTplfSksZX0sby5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpby5vKGUsbikmJiFvLm8odCxuKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7ZW51bWVyYWJsZTohMCxnZXQ6ZVtuXX0pfSxvLmY9e30sby5lPWZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhvLmYpLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gby5mW25dKHQsZSksZX0pLFtdKSl9LG8udT1mdW5jdGlvbih0KXtyZXR1cm4gdCtcIi5taW4uanNcIn0sby5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxlPXt9LG49XCJBbGdvcml0aG06XCIsby5sPWZ1bmN0aW9uKHQscixpLGEpe2lmKGVbdF0pZVt0XS5wdXNoKHIpO2Vsc2V7dmFyIHMsdTtpZih2b2lkIDAhPT1pKWZvcih2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKSxmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBsPWNbZl07aWYobC5nZXRBdHRyaWJ1dGUoXCJzcmNcIik9PXR8fGwuZ2V0QXR0cmlidXRlKFwiZGF0YS13ZWJwYWNrXCIpPT1uK2kpe3M9bDticmVha319c3x8KHU9ITAsKHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkuY2hhcnNldD1cInV0Zi04XCIscy50aW1lb3V0PTEyMCxvLm5jJiZzLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsby5uYykscy5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIixuK2kpLHMuc3JjPXQpLGVbdF09W3JdO3ZhciBoPWZ1bmN0aW9uKG4scil7cy5vbmVycm9yPXMub25sb2FkPW51bGwsY2xlYXJUaW1lb3V0KGQpO3ZhciBpPWVbdF07aWYoZGVsZXRlIGVbdF0scy5wYXJlbnROb2RlJiZzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyksaSYmaS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdChyKX0pKSxuKXJldHVybiBuKHIpfSxkPXNldFRpbWVvdXQoaC5iaW5kKG51bGwsdm9pZCAwLHt0eXBlOlwidGltZW91dFwiLHRhcmdldDpzfSksMTJlNCk7cy5vbmVycm9yPWguYmluZChudWxsLHMub25lcnJvcikscy5vbmxvYWQ9aC5iaW5kKG51bGwscy5vbmxvYWQpLHUmJmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyl9fSxvLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sby5wPVwiLi9kaXN0XCIsZnVuY3Rpb24oKXt2YXIgZT17ODI2OjB9O28uZi5qPWZ1bmN0aW9uKHQsbil7dmFyIHI9by5vKGUsdCk/ZVt0XTp2b2lkIDA7aWYoMCE9PXIpaWYociluLnB1c2goclsyXSk7ZWxzZXt2YXIgaT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24obixpKXtyPWVbdF09W24saV19KSk7bi5wdXNoKHJbMl09aSk7dmFyIGE9by5wK28udSh0KSxzPW5ldyBFcnJvcjtvLmwoYSwoZnVuY3Rpb24obil7aWYoby5vKGUsdCkmJigwIT09KHI9ZVt0XSkmJihlW3RdPXZvaWQgMCkscikpe3ZhciBpPW4mJihcImxvYWRcIj09PW4udHlwZT9cIm1pc3NpbmdcIjpuLnR5cGUpLGE9biYmbi50YXJnZXQmJm4udGFyZ2V0LnNyYztzLm1lc3NhZ2U9XCJMb2FkaW5nIGNodW5rIFwiK3QrXCIgZmFpbGVkLlxcbihcIitpK1wiOiBcIithK1wiKVwiLHMubmFtZT1cIkNodW5rTG9hZEVycm9yXCIscy50eXBlPWkscy5yZXF1ZXN0PWEsclsxXShzKX19KSxcImNodW5rLVwiK3QsdCl9fTt2YXIgbj1mdW5jdGlvbih0LG4pe2Zvcih2YXIgcixpLHM9YShuLDMpLHU9c1swXSxjPXNbMV0sZj1zWzJdLGw9MCxoPVtdO2w8dS5sZW5ndGg7bCsrKWk9dVtsXSxvLm8oZSxpKSYmZVtpXSYmaC5wdXNoKGVbaV1bMF0pLGVbaV09MDtmb3IociBpbiBjKW8ubyhjLHIpJiYoby5tW3JdPWNbcl0pO2ZvcihmJiZmKG8pLHQmJnQobik7aC5sZW5ndGg7KWguc2hpZnQoKSgpfSxyPXQud2VicGFja0NodW5rQWxnb3JpdGhtPXQud2VicGFja0NodW5rQWxnb3JpdGhtfHxbXTtyLmZvckVhY2gobi5iaW5kKG51bGwsMCkpLHIucHVzaD1uLmJpbmQobnVsbCxyLnB1c2guYmluZChyKSl9KCksbyg1OSl9KCkuZGVmYXVsdH0sXCJvYmplY3RcIj09dShlKSYmXCJvYmplY3RcIj09dSh0KT90LmV4cG9ydHM9bygpOihyPVtdLHZvaWQgMD09PShpPVwiZnVuY3Rpb25cIj09dHlwZW9mKG49byk/bi5hcHBseShlLHIpOm4pfHwodC5leHBvcnRzPWkpKX0pLmNhbGwodGhpcyxuKDcyKSh0KSl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJjYXRtdWxsUm9tVG9CZXppZXJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSxuLmQoZSxcImZpbGxQYXRoXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEN9KSksbi5kKGUsXCJmaWxsUGF0aEJ5RGlmZlwiLChmdW5jdGlvbigpe3JldHVybiBqfSkpLG4uZChlLFwiZm9ybWF0UGF0aFwiLChmdW5jdGlvbigpe3JldHVybiBSfSkpLG4uZChlLFwiaW50ZXJzZWN0aW9uXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE19KSksbi5kKGUsXCJwYXJzZVBhdGhBcnJheVwiLChmdW5jdGlvbigpe3JldHVybiB2fSkpLG4uZChlLFwicGFyc2VQYXRoU3RyaW5nXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSksbi5kKGUsXCJwYXRoVG9BYnNvbHV0ZVwiLChmdW5jdGlvbigpe3JldHVybiBmfSkpLG4uZChlLFwicGF0aFRvQ3VydmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcH0pKSxuLmQoZSxcInJlY3RQYXRoXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFN9KSk7dmFyIHI9bigwKSxpPVwiXFx0XFxuXFx2XFxmXFxyIMOCIMOhxaHigqzDoSDFvcOi4oKs4oKsw6LigqzCgcOi4oKs4oCaw6LigqzGksOi4oKs4oCew6LigqzigKbDouKCrOKAoMOi4oKs4oChw6LigqzLhsOi4oKs4oCww6LigqzFoMOi4oKswq/DosKBxbjDo+KCrOKCrFxcdTIwMjhcXHUyMDI5XCIsbz1uZXcgUmVnRXhwKFwiKFthLXpdKVtcIitpK1wiLF0qKCgtP1xcXFxkKlxcXFwuP1xcXFxkKig/OmVbXFxcXC0rXT9cXFxcZCspP1tcIitpK1wiXSosP1tcIitpK1wiXSopKylcIixcImlnXCIpLGE9bmV3IFJlZ0V4cChcIigtP1xcXFxkKlxcXFwuP1xcXFxkKig/OmVbXFxcXC0rXT9cXFxcZCspPylbXCIraStcIl0qLD9bXCIraStcIl0qXCIsXCJpZ1wiKSxzPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO2lmKE9iamVjdChyLm0pKHQpKXJldHVybiB0O3ZhciBlPXthOjcsYzo2LG86MixoOjEsbDoyLG06MixyOjQscTo0LHM6NCx0OjIsdjoxLHU6Myx6OjB9LG49W107cmV0dXJuIFN0cmluZyh0KS5yZXBsYWNlKG8sKGZ1bmN0aW9uKHIsaSxvKXt2YXIgcz1bXSx1PWkudG9Mb3dlckNhc2UoKTtpZihvLnJlcGxhY2UoYSwoZnVuY3Rpb24odCxlKXtlJiZzLnB1c2goK2UpfSkpLFwibVwiPT09dSYmcy5sZW5ndGg+MiYmKG4ucHVzaChbaV0uY29uY2F0KHMuc3BsaWNlKDAsMikpKSx1PVwibFwiLGk9XCJtXCI9PT1pP1wibFwiOlwiTFwiKSxcIm9cIj09PXUmJjE9PT1zLmxlbmd0aCYmbi5wdXNoKFtpLHNbMF1dKSxcInJcIj09PXUpbi5wdXNoKFtpXS5jb25jYXQocykpO2Vsc2UgZm9yKDtzLmxlbmd0aD49ZVt1XSYmKG4ucHVzaChbaV0uY29uY2F0KHMuc3BsaWNlKDAsZVt1XSkpKSxlW3VdKTspO3JldHVybiB0fSkpLG59LHU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0wLGk9dC5sZW5ndGg7aS0yKiFlPnI7cis9Mil7dmFyIG89W3t4Oit0W3ItMl0seTordFtyLTFdfSx7eDordFtyXSx5Oit0W3IrMV19LHt4Oit0W3IrMl0seTordFtyKzNdfSx7eDordFtyKzRdLHk6K3Rbcis1XX1dO2U/cj9pLTQ9PT1yP29bM109e3g6K3RbMF0seTordFsxXX06aS0yPT09ciYmKG9bMl09e3g6K3RbMF0seTordFsxXX0sb1szXT17eDordFsyXSx5Oit0WzNdfSk6b1swXT17eDordFtpLTJdLHk6K3RbaS0xXX06aS00PT09cj9vWzNdPW9bMl06cnx8KG9bMF09e3g6K3Rbcl0seTordFtyKzFdfSksbi5wdXNoKFtcIkNcIiwoLW9bMF0ueCs2Km9bMV0ueCtvWzJdLngpLzYsKC1vWzBdLnkrNipvWzFdLnkrb1syXS55KS82LChvWzFdLngrNipvWzJdLngtb1szXS54KS82LChvWzFdLnkrNipvWzJdLnktb1szXS55KS82LG9bMl0ueCxvWzJdLnldKX1yZXR1cm4gbn0sYz1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPVtdO2lmKG51bGw9PT1pJiZudWxsPT09ciYmKHI9biksdD0rdCxlPStlLG49K24scj0rcixudWxsIT09aSl7dmFyIGE9TWF0aC5QSS8xODAscz10K24qTWF0aC5jb3MoLXIqYSksdT10K24qTWF0aC5jb3MoLWkqYSk7bz1bW1wiTVwiLHMsZStuKk1hdGguc2luKC1yKmEpXSxbXCJBXCIsbixuLDAsKyhpLXI+MTgwKSwwLHUsZStuKk1hdGguc2luKC1pKmEpXV19ZWxzZSBvPVtbXCJNXCIsdCxlXSxbXCJtXCIsMCwtcl0sW1wiYVwiLG4sciwwLDEsMSwwLDIqcl0sW1wiYVwiLG4sciwwLDEsMSwwLC0yKnJdLFtcInpcIl1dO3JldHVybiBvfSxmPWZ1bmN0aW9uKHQpe2lmKCEodD1zKHQpKXx8IXQubGVuZ3RoKXJldHVybltbXCJNXCIsMCwwXV07dmFyIGUsbixyPVtdLGk9MCxvPTAsYT0wLGY9MCxsPTA7XCJNXCI9PT10WzBdWzBdJiYoYT1pPSt0WzBdWzFdLGY9bz0rdFswXVsyXSxsKyssclswXT1bXCJNXCIsaSxvXSk7Zm9yKHZhciBoPTM9PT10Lmxlbmd0aCYmXCJNXCI9PT10WzBdWzBdJiZcIlJcIj09PXRbMV1bMF0udG9VcHBlckNhc2UoKSYmXCJaXCI9PT10WzJdWzBdLnRvVXBwZXJDYXNlKCksZD12b2lkIDAscD12b2lkIDAsZz1sLHY9dC5sZW5ndGg7Zzx2O2crKyl7aWYoci5wdXNoKGQ9W10pLChlPShwPXRbZ10pWzBdKSE9PWUudG9VcHBlckNhc2UoKSlzd2l0Y2goZFswXT1lLnRvVXBwZXJDYXNlKCksZFswXSl7Y2FzZVwiQVwiOmRbMV09cFsxXSxkWzJdPXBbMl0sZFszXT1wWzNdLGRbNF09cFs0XSxkWzVdPXBbNV0sZFs2XT0rcFs2XStpLGRbN109K3BbN10rbzticmVhaztjYXNlXCJWXCI6ZFsxXT0rcFsxXStvO2JyZWFrO2Nhc2VcIkhcIjpkWzFdPStwWzFdK2k7YnJlYWs7Y2FzZVwiUlwiOmZvcih2YXIgeT0yLG09KG49W2ksb10uY29uY2F0KHAuc2xpY2UoMSkpKS5sZW5ndGg7eTxtO3krKyluW3ldPStuW3ldK2ksblsrK3ldPStuW3ldK287ci5wb3AoKSxyPXIuY29uY2F0KHUobixoKSk7YnJlYWs7Y2FzZVwiT1wiOnIucG9wKCksKG49YyhpLG8scFsxXSxwWzJdKSkucHVzaChuWzBdKSxyPXIuY29uY2F0KG4pO2JyZWFrO2Nhc2VcIlVcIjpyLnBvcCgpLHI9ci5jb25jYXQoYyhpLG8scFsxXSxwWzJdLHBbM10pKSxkPVtcIlVcIl0uY29uY2F0KHJbci5sZW5ndGgtMV0uc2xpY2UoLTIpKTticmVhaztjYXNlXCJNXCI6YT0rcFsxXStpLGY9K3BbMl0rbzticmVhaztkZWZhdWx0OmZvcih5PTEsbT1wLmxlbmd0aDt5PG07eSsrKWRbeV09K3BbeV0rKHklMj9pOm8pfWVsc2UgaWYoXCJSXCI9PT1lKW49W2ksb10uY29uY2F0KHAuc2xpY2UoMSkpLHIucG9wKCkscj1yLmNvbmNhdCh1KG4saCkpLGQ9W1wiUlwiXS5jb25jYXQocC5zbGljZSgtMikpO2Vsc2UgaWYoXCJPXCI9PT1lKXIucG9wKCksKG49YyhpLG8scFsxXSxwWzJdKSkucHVzaChuWzBdKSxyPXIuY29uY2F0KG4pO2Vsc2UgaWYoXCJVXCI9PT1lKXIucG9wKCkscj1yLmNvbmNhdChjKGksbyxwWzFdLHBbMl0scFszXSkpLGQ9W1wiVVwiXS5jb25jYXQocltyLmxlbmd0aC0xXS5zbGljZSgtMikpO2Vsc2UgZm9yKHZhciBiPTAseD1wLmxlbmd0aDtiPHg7YisrKWRbYl09cFtiXTtpZihcIk9cIiE9PShlPWUudG9VcHBlckNhc2UoKSkpc3dpdGNoKGRbMF0pe2Nhc2VcIlpcIjppPSthLG89K2Y7YnJlYWs7Y2FzZVwiSFwiOmk9ZFsxXTticmVhaztjYXNlXCJWXCI6bz1kWzFdO2JyZWFrO2Nhc2VcIk1cIjphPWRbZC5sZW5ndGgtMl0sZj1kW2QubGVuZ3RoLTFdO2JyZWFrO2RlZmF1bHQ6aT1kW2QubGVuZ3RoLTJdLG89ZFtkLmxlbmd0aC0xXX19cmV0dXJuIHJ9LGw9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuW3QsZSxuLHIsbixyXX0saD1mdW5jdGlvbih0LGUsbixyLGksbyl7cmV0dXJuWzEvMyp0KzIvMypuLDEvMyplKzIvMypyLDEvMyppKzIvMypuLDEvMypvKzIvMypyLGksb119LGQ9ZnVuY3Rpb24gdChlLG4scixpLG8sYSxzLHUsYyxmKXtyPT09aSYmKHIrPTEpO3ZhciBsLGgsZCxwLGcsdj0xMjAqTWF0aC5QSS8xODAseT1NYXRoLlBJLzE4MCooK298fDApLG09W10sYj1mdW5jdGlvbih0LGUsbil7cmV0dXJue3g6dCpNYXRoLmNvcyhuKS1lKk1hdGguc2luKG4pLHk6dCpNYXRoLnNpbihuKStlKk1hdGguY29zKG4pfX07aWYoZiloPWZbMF0sZD1mWzFdLHA9ZlsyXSxnPWZbM107ZWxzZXtlPShsPWIoZSxuLC15KSkueCxuPWwueSx1PShsPWIodSxjLC15KSkueCxjPWwueSxlPT09dSYmbj09PWMmJih1Kz0xLGMrPTEpO3ZhciB4PShlLXUpLzIsdz0obi1jKS8yLFM9eCp4LyhyKnIpK3cqdy8oaSppKTtTPjEmJihyKj1TPU1hdGguc3FydChTKSxpKj1TKTt2YXIgRT1yKnIsXz1pKmksTz0oYT09PXM/LTE6MSkqTWF0aC5zcXJ0KE1hdGguYWJzKChFKl8tRSp3KnctXyp4KngpLyhFKncqdytfKngqeCkpKTtwPU8qcip3L2krKGUrdSkvMixnPU8qLWkqeC9yKyhuK2MpLzIsaD1NYXRoLmFzaW4oKChuLWcpL2kpLnRvRml4ZWQoOSkpLGQ9TWF0aC5hc2luKCgoYy1nKS9pKS50b0ZpeGVkKDkpKSxoPWU8cD9NYXRoLlBJLWg6aCxkPXU8cD9NYXRoLlBJLWQ6ZCxoPDAmJihoPTIqTWF0aC5QSStoKSxkPDAmJihkPTIqTWF0aC5QSStkKSxzJiZoPmQmJihoLT0yKk1hdGguUEkpLCFzJiZkPmgmJihkLT0yKk1hdGguUEkpfXZhciBrPWQtaDtpZihNYXRoLmFicyhrKT52KXt2YXIgTT1kLEE9dSxUPWM7ZD1oK3YqKHMmJmQ+aD8xOi0xKSxtPXQodT1wK3IqTWF0aC5jb3MoZCksYz1nK2kqTWF0aC5zaW4oZCkscixpLG8sMCxzLEEsVCxbZCxNLHAsZ10pfWs9ZC1oO3ZhciBDPU1hdGguY29zKGgpLEk9TWF0aC5zaW4oaCksUD1NYXRoLmNvcyhkKSxqPU1hdGguc2luKGQpLEQ9TWF0aC50YW4oay80KSxOPTQvMypyKkQsUj00LzMqaSpELEw9W2Usbl0sQj1bZStOKkksbi1SKkNdLEc9W3UrTipqLGMtUipQXSxGPVt1LGNdO2lmKEJbMF09MipMWzBdLUJbMF0sQlsxXT0yKkxbMV0tQlsxXSxmKXJldHVybltCLEcsRl0uY29uY2F0KG0pO2Zvcih2YXIgVT1bXSx6PTAsVj0obT1bQixHLEZdLmNvbmNhdChtKS5qb2luKCkuc3BsaXQoXCIsXCIpKS5sZW5ndGg7ejxWO3orKylVW3pdPXolMj9iKG1bei0xXSxtW3pdLHkpLnk6YihtW3pdLG1beisxXSx5KS54O3JldHVybiBVfSxwPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1mKHQpLGk9ZSYmZihlKSxvPXt4OjAseTowLGJ4OjAsYnk6MCxYOjAsWTowLHF4Om51bGwscXk6bnVsbH0sYT17eDowLHk6MCxieDowLGJ5OjAsWDowLFk6MCxxeDpudWxsLHF5Om51bGx9LHM9W10sdT1bXSxjPVwiXCIscD1cIlwiLGc9ZnVuY3Rpb24odCxlLG4pe3ZhciByLGk7aWYoIXQpcmV0dXJuW1wiQ1wiLGUueCxlLnksZS54LGUueSxlLngsZS55XTtzd2l0Y2goISh0WzBdaW57VDoxLFE6MX0pJiYoZS5xeD1lLnF5PW51bGwpLHRbMF0pe2Nhc2VcIk1cIjplLlg9dFsxXSxlLlk9dFsyXTticmVhaztjYXNlXCJBXCI6dD1bXCJDXCJdLmNvbmNhdChkLmFwcGx5KDAsW2UueCxlLnldLmNvbmNhdCh0LnNsaWNlKDEpKSkpO2JyZWFrO2Nhc2VcIlNcIjpcIkNcIj09PW58fFwiU1wiPT09bj8ocj0yKmUueC1lLmJ4LGk9MiplLnktZS5ieSk6KHI9ZS54LGk9ZS55KSx0PVtcIkNcIixyLGldLmNvbmNhdCh0LnNsaWNlKDEpKTticmVhaztjYXNlXCJUXCI6XCJRXCI9PT1ufHxcIlRcIj09PW4/KGUucXg9MiplLngtZS5xeCxlLnF5PTIqZS55LWUucXkpOihlLnF4PWUueCxlLnF5PWUueSksdD1bXCJDXCJdLmNvbmNhdChoKGUueCxlLnksZS5xeCxlLnF5LHRbMV0sdFsyXSkpO2JyZWFrO2Nhc2VcIlFcIjplLnF4PXRbMV0sZS5xeT10WzJdLHQ9W1wiQ1wiXS5jb25jYXQoaChlLngsZS55LHRbMV0sdFsyXSx0WzNdLHRbNF0pKTticmVhaztjYXNlXCJMXCI6dD1bXCJDXCJdLmNvbmNhdChsKGUueCxlLnksdFsxXSx0WzJdKSk7YnJlYWs7Y2FzZVwiSFwiOnQ9W1wiQ1wiXS5jb25jYXQobChlLngsZS55LHRbMV0sZS55KSk7YnJlYWs7Y2FzZVwiVlwiOnQ9W1wiQ1wiXS5jb25jYXQobChlLngsZS55LGUueCx0WzFdKSk7YnJlYWs7Y2FzZVwiWlwiOnQ9W1wiQ1wiXS5jb25jYXQobChlLngsZS55LGUuWCxlLlkpKX1yZXR1cm4gdH0sdj1mdW5jdGlvbih0LGUpe2lmKHRbZV0ubGVuZ3RoPjcpe3RbZV0uc2hpZnQoKTtmb3IodmFyIG89dFtlXTtvLmxlbmd0aDspc1tlXT1cIkFcIixpJiYodVtlXT1cIkFcIiksdC5zcGxpY2UoZSsrLDAsW1wiQ1wiXS5jb25jYXQoby5zcGxpY2UoMCw2KSkpO3Quc3BsaWNlKGUsMSksbj1NYXRoLm1heChyLmxlbmd0aCxpJiZpLmxlbmd0aHx8MCl9fSx5PWZ1bmN0aW9uKHQsZSxvLGEscyl7dCYmZSYmXCJNXCI9PT10W3NdWzBdJiZcIk1cIiE9PWVbc11bMF0mJihlLnNwbGljZShzLDAsW1wiTVwiLGEueCxhLnldKSxvLmJ4PTAsby5ieT0wLG8ueD10W3NdWzFdLG8ueT10W3NdWzJdLG49TWF0aC5tYXgoci5sZW5ndGgsaSYmaS5sZW5ndGh8fDApKX07bj1NYXRoLm1heChyLmxlbmd0aCxpJiZpLmxlbmd0aHx8MCk7Zm9yKHZhciBtPTA7bTxuO20rKyl7clttXSYmKGM9clttXVswXSksXCJDXCIhPT1jJiYoc1ttXT1jLG0mJihwPXNbbS0xXSkpLHJbbV09ZyhyW21dLG8scCksXCJBXCIhPT1zW21dJiZcIkNcIj09PWMmJihzW21dPVwiQ1wiKSx2KHIsbSksaSYmKGlbbV0mJihjPWlbbV1bMF0pLFwiQ1wiIT09YyYmKHVbbV09YyxtJiYocD11W20tMV0pKSxpW21dPWcoaVttXSxhLHApLFwiQVwiIT09dVttXSYmXCJDXCI9PT1jJiYodVttXT1cIkNcIiksdihpLG0pKSx5KHIsaSxvLGEsbSkseShpLHIsYSxvLG0pO3ZhciBiPXJbbV0seD1pJiZpW21dLHc9Yi5sZW5ndGgsUz1pJiZ4Lmxlbmd0aDtvLng9Ylt3LTJdLG8ueT1iW3ctMV0sby5ieD1wYXJzZUZsb2F0KGJbdy00XSl8fG8ueCxvLmJ5PXBhcnNlRmxvYXQoYlt3LTNdKXx8by55LGEuYng9aSYmKHBhcnNlRmxvYXQoeFtTLTRdKXx8YS54KSxhLmJ5PWkmJihwYXJzZUZsb2F0KHhbUy0zXSl8fGEueSksYS54PWkmJnhbUy0yXSxhLnk9aSYmeFtTLTFdfXJldHVybiBpP1tyLGldOnJ9LGc9Lyw/KFthLXpdKSw/L2dpLHY9ZnVuY3Rpb24odCl7cmV0dXJuIHQuam9pbihcIixcIikucmVwbGFjZShnLFwiJDFcIil9LHk9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gdCoodCooLTMqZSs5Km4tOSpyKzMqaSkrNiplLTEyKm4rNipyKS0zKmUrMypufSxtPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEscyx1KXtudWxsPT09dSYmKHU9MSk7Zm9yKHZhciBjPSh1PXU+MT8xOnU8MD8wOnUpLzIsZj1bLS4xMjUyLC4xMjUyLC0uMzY3OCwuMzY3OCwtLjU4NzMsLjU4NzMsLS43Njk5LC43Njk5LC0uOTA0MSwuOTA0MSwtLjk4MTYsLjk4MTZdLGw9Wy4yNDkxLC4yNDkxLC4yMzM1LC4yMzM1LC4yMDMyLC4yMDMyLC4xNjAxLC4xNjAxLC4xMDY5LC4xMDY5LC4wNDcyLC4wNDcyXSxoPTAsZD0wO2Q8MTI7ZCsrKXt2YXIgcD1jKmZbZF0rYyxnPXkocCx0LG4saSxhKSx2PXkocCxlLHIsbyxzKSxtPWcqZyt2KnY7aCs9bFtkXSpNYXRoLnNxcnQobSl9cmV0dXJuIGMqaH0sYj1mdW5jdGlvbih0LGUsbixyLGksbyxhLHMpe2Zvcih2YXIgdSxjLGYsbCxoPVtdLGQ9W1tdLFtdXSxwPTA7cDwyOysrcClpZigwPT09cD8oYz02KnQtMTIqbis2KmksdT0tMyp0Kzkqbi05KmkrMyphLGY9MypuLTMqdCk6KGM9NiplLTEyKnIrNipvLHU9LTMqZSs5KnItOSpvKzMqcyxmPTMqci0zKmUpLE1hdGguYWJzKHUpPDFlLTEyKXtpZihNYXRoLmFicyhjKTwxZS0xMiljb250aW51ZTsobD0tZi9jKT4wJiZsPDEmJmgucHVzaChsKX1lbHNle3ZhciBnPWMqYy00KmYqdSx2PU1hdGguc3FydChnKTtpZighKGc8MCkpe3ZhciB5PSgtYyt2KS8oMip1KTt5PjAmJnk8MSYmaC5wdXNoKHkpO3ZhciBtPSgtYy12KS8oMip1KTttPjAmJm08MSYmaC5wdXNoKG0pfX1mb3IodmFyIGIseD1oLmxlbmd0aCx3PXg7eC0tOyliPTEtKGw9aFt4XSksZFswXVt4XT1iKmIqYip0KzMqYipiKmwqbiszKmIqbCpsKmkrbCpsKmwqYSxkWzFdW3hdPWIqYipiKmUrMypiKmIqbCpyKzMqYipsKmwqbytsKmwqbCpzO3JldHVybiBkWzBdW3ddPXQsZFsxXVt3XT1lLGRbMF1bdysxXT1hLGRbMV1bdysxXT1zLGRbMF0ubGVuZ3RoPWRbMV0ubGVuZ3RoPXcrMix7bWluOnt4Ok1hdGgubWluLmFwcGx5KDAsZFswXSkseTpNYXRoLm1pbi5hcHBseSgwLGRbMV0pfSxtYXg6e3g6TWF0aC5tYXguYXBwbHkoMCxkWzBdKSx5Ok1hdGgubWF4LmFwcGx5KDAsZFsxXSl9fX0seD1mdW5jdGlvbih0LGUsbixyLGksbyxhLHMpe2lmKCEoTWF0aC5tYXgodCxuKTxNYXRoLm1pbihpLGEpfHxNYXRoLm1pbih0LG4pPk1hdGgubWF4KGksYSl8fE1hdGgubWF4KGUscik8TWF0aC5taW4obyxzKXx8TWF0aC5taW4oZSxyKT5NYXRoLm1heChvLHMpKSl7dmFyIHU9KHQtbikqKG8tcyktKGUtcikqKGktYSk7aWYodSl7dmFyIGM9KCh0KnItZSpuKSooaS1hKS0odC1uKSooaSpzLW8qYSkpL3UsZj0oKHQqci1lKm4pKihvLXMpLShlLXIpKihpKnMtbyphKSkvdSxsPStjLnRvRml4ZWQoMiksaD0rZi50b0ZpeGVkKDIpO2lmKCEobDwrTWF0aC5taW4odCxuKS50b0ZpeGVkKDIpfHxsPitNYXRoLm1heCh0LG4pLnRvRml4ZWQoMil8fGw8K01hdGgubWluKGksYSkudG9GaXhlZCgyKXx8bD4rTWF0aC5tYXgoaSxhKS50b0ZpeGVkKDIpfHxoPCtNYXRoLm1pbihlLHIpLnRvRml4ZWQoMil8fGg+K01hdGgubWF4KGUscikudG9GaXhlZCgyKXx8aDwrTWF0aC5taW4obyxzKS50b0ZpeGVkKDIpfHxoPitNYXRoLm1heChvLHMpLnRvRml4ZWQoMikpKXJldHVybnt4OmMseTpmfX19fSx3PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZT49dC54JiZlPD10LngrdC53aWR0aCYmbj49dC55JiZuPD10LnkrdC5oZWlnaHR9LFM9ZnVuY3Rpb24odCxlLG4scixpKXtpZihpKXJldHVybltbXCJNXCIsK3QrICtpLGVdLFtcImxcIixuLTIqaSwwXSxbXCJhXCIsaSxpLDAsMCwxLGksaV0sW1wibFwiLDAsci0yKmldLFtcImFcIixpLGksMCwwLDEsLWksaV0sW1wibFwiLDIqaS1uLDBdLFtcImFcIixpLGksMCwwLDEsLWksLWldLFtcImxcIiwwLDIqaS1yXSxbXCJhXCIsaSxpLDAsMCwxLGksLWldLFtcInpcIl1dO3ZhciBvPVtbXCJNXCIsdCxlXSxbXCJsXCIsbiwwXSxbXCJsXCIsMCxyXSxbXCJsXCIsLW4sMF0sW1wielwiXV07cmV0dXJuIG8ucGFyc2VQYXRoQXJyYXk9dixvfSxFPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBudWxsPT09dCYmKHQ9ZT1uPXI9MCksbnVsbD09PWUmJihlPXQueSxuPXQud2lkdGgscj10LmhlaWdodCx0PXQueCkse3g6dCx5OmUsd2lkdGg6bix3Om4saGVpZ2h0OnIsaDpyLHgyOnQrbix5MjplK3IsY3g6dCtuLzIsY3k6ZStyLzIscjE6TWF0aC5taW4obixyKS8yLHIyOk1hdGgubWF4KG4scikvMixyMDpNYXRoLnNxcnQobipuK3IqcikvMixwYXRoOlModCxlLG4sciksdmI6W3QsZSxuLHJdLmpvaW4oXCIgXCIpfX0sXz1mdW5jdGlvbih0LGUsbixpLG8sYSxzLHUpe09iamVjdChyLm0pKHQpfHwodD1bdCxlLG4saSxvLGEscyx1XSk7dmFyIGM9Yi5hcHBseShudWxsLHQpO3JldHVybiBFKGMubWluLngsYy5taW4ueSxjLm1heC54LWMubWluLngsYy5tYXgueS1jLm1pbi55KX0sTz1mdW5jdGlvbih0LGUsbixyLGksbyxhLHMsdSl7dmFyIGM9MS11LGY9TWF0aC5wb3coYywzKSxsPU1hdGgucG93KGMsMiksaD11KnUsZD1oKnUscD10KzIqdSoobi10KStoKihpLTIqbit0KSxnPWUrMip1KihyLWUpK2gqKG8tMipyK2UpLHY9bisyKnUqKGktbikraCooYS0yKmkrbikseT1yKzIqdSooby1yKStoKihzLTIqbytyKTtyZXR1cm57eDpmKnQrMypsKnUqbiszKmMqdSp1KmkrZCphLHk6ZiplKzMqbCp1KnIrMypjKnUqdSpvK2QqcyxtOnt4OnAseTpnfSxuOnt4OnYseTp5fSxzdGFydDp7eDpjKnQrdSpuLHk6YyplK3Uqcn0sZW5kOnt4OmMqaSt1KmEseTpjKm8rdSpzfSxhbHBoYTo5MC0xODAqTWF0aC5hdGFuMihwLXYsZy15KS9NYXRoLlBJfX0saz1mdW5jdGlvbih0LGUsbil7aWYoIWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9RSh0KSxlPUUoZSksdyhlLHQueCx0LnkpfHx3KGUsdC54Mix0LnkpfHx3KGUsdC54LHQueTIpfHx3KGUsdC54Mix0LnkyKXx8dyh0LGUueCxlLnkpfHx3KHQsZS54MixlLnkpfHx3KHQsZS54LGUueTIpfHx3KHQsZS54MixlLnkyKXx8KHQueDxlLngyJiZ0Lng+ZS54fHxlLng8dC54MiYmZS54PnQueCkmJih0Lnk8ZS55MiYmdC55PmUueXx8ZS55PHQueTImJmUueT50LnkpfShfKHQpLF8oZSkpKXJldHVybiBuPzA6W107Zm9yKHZhciByPX5+KG0uYXBwbHkoMCx0KS84KSxpPX5+KG0uYXBwbHkoMCxlKS84KSxvPVtdLGE9W10scz17fSx1PW4/MDpbXSxjPTA7YzxyKzE7YysrKXt2YXIgZj1PLmFwcGx5KDAsdC5jb25jYXQoYy9yKSk7by5wdXNoKHt4OmYueCx5OmYueSx0OmMvcn0pfWZvcihjPTA7YzxpKzE7YysrKXtmPU8uYXBwbHkoMCxlLmNvbmNhdChjL2kpKTthLnB1c2goe3g6Zi54LHk6Zi55LHQ6Yy9pfSl9Zm9yKGM9MDtjPHI7YysrKWZvcih2YXIgbD0wO2w8aTtsKyspe3ZhciBoPW9bY10sZD1vW2MrMV0scD1hW2xdLGc9YVtsKzFdLHY9TWF0aC5hYnMoZC54LWgueCk8LjAwMT9cInlcIjpcInhcIix5PU1hdGguYWJzKGcueC1wLngpPC4wMDE/XCJ5XCI6XCJ4XCIsYj14KGgueCxoLnksZC54LGQueSxwLngscC55LGcueCxnLnkpO2lmKGIpe2lmKHNbYi54LnRvRml4ZWQoNCldPT09Yi55LnRvRml4ZWQoNCkpY29udGludWU7c1tiLngudG9GaXhlZCg0KV09Yi55LnRvRml4ZWQoNCk7dmFyIFM9aC50K01hdGguYWJzKChiW3ZdLWhbdl0pLyhkW3ZdLWhbdl0pKSooZC50LWgudCksaz1wLnQrTWF0aC5hYnMoKGJbeV0tcFt5XSkvKGdbeV0tcFt5XSkpKihnLnQtcC50KTtTPj0wJiZTPD0xJiZrPj0wJiZrPD0xJiYobj91Kz0xOnUucHVzaCh7eDpiLngseTpiLnksdDE6Uyx0MjprfSkpfX1yZXR1cm4gdX0sTT1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLGEscyx1LGMsZixsLGg7dD1wKHQpLGU9cChlKTtmb3IodmFyIGQ9bj8wOltdLGc9MCx2PXQubGVuZ3RoO2c8djtnKyspe3ZhciB5PXRbZ107aWYoXCJNXCI9PT15WzBdKXI9cz15WzFdLGk9dT15WzJdO2Vsc2V7XCJDXCI9PT15WzBdPyhsPVtyLGldLmNvbmNhdCh5LnNsaWNlKDEpKSxyPWxbNl0saT1sWzddKToobD1bcixpLHIsaSxzLHUscyx1XSxyPXMsaT11KTtmb3IodmFyIG09MCxiPWUubGVuZ3RoO208YjttKyspe3ZhciB4PWVbbV07aWYoXCJNXCI9PT14WzBdKW89Yz14WzFdLGE9Zj14WzJdO2Vsc2V7XCJDXCI9PT14WzBdPyhoPVtvLGFdLmNvbmNhdCh4LnNsaWNlKDEpKSxvPWhbNl0sYT1oWzddKTooaD1bbyxhLG8sYSxjLGYsYyxmXSxvPWMsYT1mKTt2YXIgdz1rKGwsaCxuKTtpZihuKWQrPXc7ZWxzZXtmb3IodmFyIFM9MCxFPXcubGVuZ3RoO1M8RTtTKyspd1tTXS5zZWdtZW50MT1nLHdbU10uc2VnbWVudDI9bSx3W1NdLmJlejE9bCx3W1NdLmJlejI9aDtkPWQuY29uY2F0KHcpfX19fX1yZXR1cm4gZH0odCxlKX07ZnVuY3Rpb24gQSh0LGUpe3ZhciBuPVtdLHI9W107cmV0dXJuIHQubGVuZ3RoJiZmdW5jdGlvbiB0KGUsaSl7aWYoMT09PWUubGVuZ3RoKW4ucHVzaChlWzBdKSxyLnB1c2goZVswXSk7ZWxzZXtmb3IodmFyIG89W10sYT0wO2E8ZS5sZW5ndGgtMTthKyspMD09PWEmJm4ucHVzaChlWzBdKSxhPT09ZS5sZW5ndGgtMiYmci5wdXNoKGVbYSsxXSksb1thXT1bKDEtaSkqZVthXVswXStpKmVbYSsxXVswXSwoMS1pKSplW2FdWzFdK2kqZVthKzFdWzFdXTt0KG8saSl9fSh0LGUpLHtsZWZ0Om4scmlnaHQ6ci5yZXZlcnNlKCl9fXZhciBUPWZ1bmN0aW9uKHQsZSxuKXtpZigxPT09bilyZXR1cm5bW10uY29uY2F0KHQpXTt2YXIgcj1bXTtpZihcIkxcIj09PWVbMF18fFwiQ1wiPT09ZVswXXx8XCJRXCI9PT1lWzBdKXI9ci5jb25jYXQoZnVuY3Rpb24odCxlLG4pe3ZhciByPVtbdFsxXSx0WzJdXV07bj1ufHwyO3ZhciBpPVtdO1wiQVwiPT09ZVswXT8oci5wdXNoKGVbNl0pLHIucHVzaChlWzddKSk6XCJDXCI9PT1lWzBdPyhyLnB1c2goW2VbMV0sZVsyXV0pLHIucHVzaChbZVszXSxlWzRdXSksci5wdXNoKFtlWzVdLGVbNl1dKSk6XCJTXCI9PT1lWzBdfHxcIlFcIj09PWVbMF0/KHIucHVzaChbZVsxXSxlWzJdXSksci5wdXNoKFtlWzNdLGVbNF1dKSk6ci5wdXNoKFtlWzFdLGVbMl1dKTtmb3IodmFyIG89cixhPTEvbixzPTA7czxuLTE7cysrKXt2YXIgdT1BKG8sYS8oMS1hKnMpKTtpLnB1c2godS5sZWZ0KSxvPXUucmlnaHR9cmV0dXJuIGkucHVzaChvKSxpLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ9PT10Lmxlbmd0aCYmKGUucHVzaChcIkNcIiksZT1lLmNvbmNhdCh0WzJdKSksdC5sZW5ndGg+PTMmJigzPT09dC5sZW5ndGgmJmUucHVzaChcIlFcIiksZT1lLmNvbmNhdCh0WzFdKSksMj09PXQubGVuZ3RoJiZlLnB1c2goXCJMXCIpLGU9ZS5jb25jYXQodFt0Lmxlbmd0aC0xXSl9KSl9KHQsZSxuKSk7ZWxzZXt2YXIgaT1bXS5jb25jYXQodCk7XCJNXCI9PT1pWzBdJiYoaVswXT1cIkxcIik7Zm9yKHZhciBvPTA7bzw9bi0xO28rKylyLnB1c2goaSl9cmV0dXJuIHJ9LEM9ZnVuY3Rpb24odCxlKXtpZigxPT09dC5sZW5ndGgpcmV0dXJuIHQ7dmFyIG49dC5sZW5ndGgtMSxyPWUubGVuZ3RoLTEsaT1uL3Isbz1bXTtpZigxPT09dC5sZW5ndGgmJlwiTVwiPT09dFswXVswXSl7Zm9yKHZhciBhPTA7YTxyLW47YSsrKXQucHVzaCh0WzBdKTtyZXR1cm4gdH1mb3IoYT0wO2E8cjthKyspe3ZhciBzPU1hdGguZmxvb3IoaSphKTtvW3NdPShvW3NdfHwwKSsxfXZhciB1PW8ucmVkdWNlKChmdW5jdGlvbihlLHIsaSl7cmV0dXJuIGk9PT1uP2UuY29uY2F0KHRbbl0pOmUuY29uY2F0KFQodFtpXSx0W2krMV0scikpfSksW10pO3JldHVybiB1LnVuc2hpZnQodFswXSksXCJaXCIhPT1lW3JdJiZcInpcIiE9PWVbcl18fHUucHVzaChcIlpcIiksdX0sST1mdW5jdGlvbih0LGUpe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7dmFyIG49ITA7cmV0dXJuIE9iamVjdChyLmYpKHQsKGZ1bmN0aW9uKHQscil7aWYodCE9PWVbcl0pcmV0dXJuIG49ITEsITF9KSksbn07ZnVuY3Rpb24gUCh0LGUsbil7dmFyIHI9bnVsbCxpPW47cmV0dXJuIGU8aSYmKGk9ZSxyPVwiYWRkXCIpLHQ8aSYmKGk9dCxyPVwiZGVsXCIpLHt0eXBlOnIsbWluOml9fXZhciBqPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk9dC5sZW5ndGgsbz1lLmxlbmd0aCxhPTA7aWYoMD09PWl8fDA9PT1vKXJldHVybiBudWxsO2Zvcih2YXIgcz1bXSx1PTA7dTw9aTt1Kyspc1t1XT1bXSxzW3VdWzBdPXttaW46dX07Zm9yKHZhciBjPTA7Yzw9bztjKyspc1swXVtjXT17bWluOmN9O2Zvcih1PTE7dTw9aTt1Kyspe249dFt1LTFdO2ZvcihjPTE7Yzw9bztjKyspe3I9ZVtjLTFdLGE9SShuLHIpPzA6MTt2YXIgZj1zW3UtMV1bY10ubWluKzEsbD1zW3VdW2MtMV0ubWluKzEsaD1zW3UtMV1bYy0xXS5taW4rYTtzW3VdW2NdPVAoZixsLGgpfX1yZXR1cm4gc30odCxlKSxyPXQubGVuZ3RoLGk9ZS5sZW5ndGgsbz1bXSxhPTEscz0xO2lmKG5bcl1baV0ubWluIT09cil7Zm9yKHZhciB1PTE7dTw9cjt1Kyspe3ZhciBjPW5bdV1bdV0ubWluO3M9dTtmb3IodmFyIGY9YTtmPD1pO2YrKyluW3VdW2ZdLm1pbjxjJiYoYz1uW3VdW2ZdLm1pbixzPWYpO2E9cyxuW3VdW2FdLnR5cGUmJm8ucHVzaCh7aW5kZXg6dS0xLHR5cGU6blt1XVthXS50eXBlfSl9Zm9yKHU9by5sZW5ndGgtMTt1Pj0wO3UtLSlhPW9bdV0uaW5kZXgsXCJhZGRcIj09PW9bdV0udHlwZT90LnNwbGljZShhLDAsW10uY29uY2F0KHRbYV0pKTp0LnNwbGljZShhLDEpfXZhciBsPWktKHI9dC5sZW5ndGgpO2lmKHI8aSlmb3IodT0wO3U8bDt1KyspXCJ6XCI9PT10W3ItMV1bMF18fFwiWlwiPT09dFtyLTFdWzBdP3Quc3BsaWNlKHItMiwwLHRbci0yXSk6dC5wdXNoKHRbci0xXSkscis9MTtyZXR1cm4gdH07ZnVuY3Rpb24gRCh0LGUsbil7Zm9yKHZhciByLGk9W10uY29uY2F0KHQpLG89MS8obisxKSxhPU4oZSlbMF0scz0xO3M8PW47cysrKW8qPXMsMD09PShyPU1hdGguZmxvb3IodC5sZW5ndGgqbykpP2kudW5zaGlmdChbYVswXSpvK3Rbcl1bMF0qKDEtbyksYVsxXSpvK3Rbcl1bMV0qKDEtbyldKTppLnNwbGljZShyLDAsW2FbMF0qbyt0W3JdWzBdKigxLW8pLGFbMV0qbyt0W3JdWzFdKigxLW8pXSk7cmV0dXJuIGl9ZnVuY3Rpb24gTih0KXt2YXIgZT1bXTtzd2l0Y2godFswXSl7Y2FzZVwiTVwiOmNhc2VcIkxcIjplLnB1c2goW3RbMV0sdFsyXV0pO2JyZWFrO2Nhc2VcIkFcIjplLnB1c2goW3RbNl0sdFs3XV0pO2JyZWFrO2Nhc2VcIlFcIjplLnB1c2goW3RbM10sdFs0XV0pLGUucHVzaChbdFsxXSx0WzJdXSk7YnJlYWs7Y2FzZVwiVFwiOmUucHVzaChbdFsxXSx0WzJdXSk7YnJlYWs7Y2FzZVwiQ1wiOmUucHVzaChbdFs1XSx0WzZdXSksZS5wdXNoKFt0WzFdLHRbMl1dKSxlLnB1c2goW3RbM10sdFs0XV0pO2JyZWFrO2Nhc2VcIlNcIjplLnB1c2goW3RbM10sdFs0XV0pLGUucHVzaChbdFsxXSx0WzJdXSk7YnJlYWs7Y2FzZVwiSFwiOmNhc2VcIlZcIjplLnB1c2goW3RbMV0sdFsxXV0pfXJldHVybiBlfXZhciBSPWZ1bmN0aW9uKHQsZSl7aWYodC5sZW5ndGg8PTEpcmV0dXJuIHQ7Zm9yKHZhciBuLHI9MDtyPGUubGVuZ3RoO3IrKylpZih0W3JdWzBdIT09ZVtyXVswXSlzd2l0Y2gobj1OKHRbcl0pLGVbcl1bMF0pe2Nhc2VcIk1cIjp0W3JdPVtcIk1cIl0uY29uY2F0KG5bMF0pO2JyZWFrO2Nhc2VcIkxcIjp0W3JdPVtcIkxcIl0uY29uY2F0KG5bMF0pO2JyZWFrO2Nhc2VcIkFcIjp0W3JdPVtdLmNvbmNhdChlW3JdKSx0W3JdWzZdPW5bMF1bMF0sdFtyXVs3XT1uWzBdWzFdO2JyZWFrO2Nhc2VcIlFcIjppZihuLmxlbmd0aDwyKXtpZighKHI+MCkpe3Rbcl09ZVtyXTticmVha31uPUQobix0W3ItMV0sMSl9dFtyXT1bXCJRXCJdLmNvbmNhdChuLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb25jYXQoZSl9KSxbXSkpO2JyZWFrO2Nhc2VcIlRcIjp0W3JdPVtcIlRcIl0uY29uY2F0KG5bMF0pO2JyZWFrO2Nhc2VcIkNcIjppZihuLmxlbmd0aDwzKXtpZighKHI+MCkpe3Rbcl09ZVtyXTticmVha31uPUQobix0W3ItMV0sMil9dFtyXT1bXCJDXCJdLmNvbmNhdChuLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb25jYXQoZSl9KSxbXSkpO2JyZWFrO2Nhc2VcIlNcIjppZihuLmxlbmd0aDwyKXtpZighKHI+MCkpe3Rbcl09ZVtyXTticmVha31uPUQobix0W3ItMV0sMSl9dFtyXT1bXCJTXCJdLmNvbmNhdChuLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb25jYXQoZSl9KSxbXSkpO2JyZWFrO2RlZmF1bHQ6dFtyXT1lW3JdfXJldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24oNTcpLG4oMjEpO3ZhciByPW4oMjY5KTtuLmQoZSxcIkNhbnZhc1wiLChmdW5jdGlvbigpe3JldHVybiByLmF9KSk7big3OCksbig5Mil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg2KSxpPW4oMTQ2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJmkodC5sZW5ndGgpJiYhcih0KX19LGZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQpe3JldHVybihyPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX12YXIgaT1uKDM0Niksbz1uKDM1NiksYT1uKDY3KSxzPW4oMjkpLHU9bigzNjMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3Q6bnVsbD09dD9hOlwib2JqZWN0XCI9PXIodCk/cyh0KT9vKHRbMF0sdFsxXSk6aSh0KTp1KHQpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuVGFyZ2V0VHlwZUVudW09ZS5CaW5kaW5nVHlwZUVudW09ZS5CaW5kaW5nU2NvcGVFbnVtPXZvaWQgMDtlLkJpbmRpbmdTY29wZUVudW09e1JlcXVlc3Q6XCJSZXF1ZXN0XCIsU2luZ2xldG9uOlwiU2luZ2xldG9uXCIsVHJhbnNpZW50OlwiVHJhbnNpZW50XCJ9O2UuQmluZGluZ1R5cGVFbnVtPXtDb25zdGFudFZhbHVlOlwiQ29uc3RhbnRWYWx1ZVwiLENvbnN0cnVjdG9yOlwiQ29uc3RydWN0b3JcIixEeW5hbWljVmFsdWU6XCJEeW5hbWljVmFsdWVcIixGYWN0b3J5OlwiRmFjdG9yeVwiLEZ1bmN0aW9uOlwiRnVuY3Rpb25cIixJbnN0YW5jZTpcIkluc3RhbmNlXCIsSW52YWxpZDpcIkludmFsaWRcIixQcm92aWRlcjpcIlByb3ZpZGVyXCJ9O2UuVGFyZ2V0VHlwZUVudW09e0NsYXNzUHJvcGVydHk6XCJDbGFzc1Byb3BlcnR5XCIsQ29uc3RydWN0b3JBcmd1bWVudDpcIkNvbnN0cnVjdG9yQXJndW1lbnRcIixWYXJpYWJsZTpcIlZhcmlhYmxlXCJ9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpLG4uZChlLFwiQmFzZVwiLChmdW5jdGlvbigpe3JldHVybiBjfSkpLG4uZChlLFwiQ2lyY2xlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSksbi5kKGUsXCJFbGxpcHNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSksbi5kKGUsXCJJbWFnZVwiLChmdW5jdGlvbigpe3JldHVybiBwfSkpLG4uZChlLFwiTGluZVwiLChmdW5jdGlvbigpe3JldHVybiBtfSkpLG4uZChlLFwiTWFya2VyXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFN9KSksbi5kKGUsXCJQYXRoXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGp9KSksbi5kKGUsXCJQb2x5Z29uXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE59KSksbi5kKGUsXCJQb2x5bGluZVwiLChmdW5jdGlvbigpe3JldHVybiBSfSkpLG4uZChlLFwiUmVjdFwiLChmdW5jdGlvbigpe3JldHVybiBCfSkpLG4uZChlLFwiVGV4dFwiLChmdW5jdGlvbigpe3JldHVybiBHfSkpO3ZhciByPXt9O24ucihyKSxuLmQocixcIkJhc2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gY30pKSxuLmQocixcIkNpcmNsZVwiLChmdW5jdGlvbigpe3JldHVybiBmfSkpLG4uZChyLFwiRWxsaXBzZVwiLChmdW5jdGlvbigpe3JldHVybiBofSkpLG4uZChyLFwiSW1hZ2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcH0pKSxuLmQocixcIkxpbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbX0pKSxuLmQocixcIk1hcmtlclwiLChmdW5jdGlvbigpe3JldHVybiBTfSkpLG4uZChyLFwiUGF0aFwiLChmdW5jdGlvbigpe3JldHVybiBqfSkpLG4uZChyLFwiUG9seWdvblwiLChmdW5jdGlvbigpe3JldHVybiBOfSkpLG4uZChyLFwiUG9seWxpbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUn0pKSxuLmQocixcIlJlY3RcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQn0pKSxuLmQocixcIlRleHRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gR30pKTt2YXIgaT1uKDEpLG89bigyMSksYT1uKDE2KSxzPW4oMzApLHU9big3OCksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnM9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0KGkuYSkoT2JqZWN0KGkuYSkoe30sZSkse2xpbmVXaWR0aDoxLGxpbmVBcHBlbmRXaWR0aDowLHN0cm9rZU9wYWNpdHk6MSxmaWxsT3BhY2l0eToxfSl9LGUucHJvdG90eXBlLmdldFNoYXBlQmFzZT1mdW5jdGlvbigpe3JldHVybiByfSxlLnByb3RvdHlwZS5nZXRHcm91cEJhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdS5hfSxlLnByb3RvdHlwZS5vbkNhbnZhc0NoYW5nZT1mdW5jdGlvbih0KXtPYmplY3Qocy5oKSh0aGlzLHQpfSxlLnByb3RvdHlwZS5jYWxjdWxhdGVCQm94PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJ0eXBlXCIpLGU9dGhpcy5nZXRIaXRMaW5lV2lkdGgoKSxuPU9iamVjdChvLmdldEJCb3hNZXRob2QpKHQpKHRoaXMpLHI9ZS8yLGk9bi54LXIsYT1uLnktcixzPW4ueCtuLndpZHRoK3IsdT1uLnkrbi5oZWlnaHQrcjtyZXR1cm57eDppLG1pblg6aSx5OmEsbWluWTphLHdpZHRoOm4ud2lkdGgrZSxoZWlnaHQ6bi5oZWlnaHQrZSxtYXhYOnMsbWF4WTp1fX0sZS5wcm90b3R5cGUuaXNGaWxsPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmF0dHJzLmZpbGx8fHRoaXMuaXNDbGlwU2hhcGUoKX0sZS5wcm90b3R5cGUuaXNTdHJva2U9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuYXR0cnMuc3Ryb2tlfSxlLnByb3RvdHlwZS5fYXBwbHlDbGlwPWZ1bmN0aW9uKHQsZSl7ZSYmKHQuc2F2ZSgpLE9iamVjdChzLmEpKHQsZSksZS5jcmVhdGVQYXRoKHQpLHQucmVzdG9yZSgpLHQuY2xpcCgpLGUuX2FmdGVyRHJhdygpKX0sZS5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY2ZnLmNsaXBTaGFwZTtpZihlKXtpZighMT09PXRoaXMuY2ZnLnJlZnJlc2gpcmV0dXJuIHZvaWQgdGhpcy5zZXQoXCJoYXNDaGFuZ2VkXCIsITEpO3ZhciByPXRoaXMuZ2V0Q2FudmFzQkJveCgpO2lmKCFPYmplY3QoYS5mKShlLHIpKXJldHVybiB0aGlzLnNldChcImhhc0NoYW5nZWRcIiwhMSksdm9pZCh0aGlzLmNmZy5pc0luVmlldyYmdGhpcy5fYWZ0ZXJEcmF3KCkpfXQuc2F2ZSgpLE9iamVjdChzLmEpKHQsdGhpcyksdGhpcy5fYXBwbHlDbGlwKHQsbiksdGhpcy5kcmF3UGF0aCh0KSx0LnJlc3RvcmUoKSx0aGlzLl9hZnRlckRyYXcoKX0sZS5wcm90b3R5cGUuZ2V0Q2FudmFzVmlld0JveD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY2ZnLmNhbnZhcztyZXR1cm4gdD90LmdldFZpZXdSYW5nZSgpOm51bGx9LGUucHJvdG90eXBlLmNhY2hlQ2FudmFzQkJveD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Q2FudmFzVmlld0JveCgpO2lmKHQpe3ZhciBlPXRoaXMuZ2V0Q2FudmFzQkJveCgpLG49T2JqZWN0KGEuZikoZSx0KTt0aGlzLnNldChcImlzSW5WaWV3XCIsbiksbj90aGlzLnNldChcImNhY2hlQ2FudmFzQkJveFwiLGUpOnRoaXMuc2V0KFwiY2FjaGVDYW52YXNCQm94XCIsbnVsbCl9fSxlLnByb3RvdHlwZS5fYWZ0ZXJEcmF3PWZ1bmN0aW9uKCl7dGhpcy5jYWNoZUNhbnZhc0JCb3goKSx0aGlzLnNldChcImhhc0NoYW5nZWRcIiwhMSksdGhpcy5zZXQoXCJyZWZyZXNoXCIsbnVsbCl9LGUucHJvdG90eXBlLnNraXBEcmF3PWZ1bmN0aW9uKCl7dGhpcy5zZXQoXCJjYWNoZUNhbnZhc0JCb3hcIixudWxsKSx0aGlzLnNldChcImlzSW5WaWV3XCIsbnVsbCksdGhpcy5zZXQoXCJoYXNDaGFuZ2VkXCIsITEpfSxlLnByb3RvdHlwZS5kcmF3UGF0aD1mdW5jdGlvbih0KXt0aGlzLmNyZWF0ZVBhdGgodCksdGhpcy5zdHJva2VBbmRGaWxsKHQpLHRoaXMuYWZ0ZXJEcmF3UGF0aCh0KX0sZS5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0KXt0LmZpbGwoKX0sZS5wcm90b3R5cGUuc3Ryb2tlPWZ1bmN0aW9uKHQpe3Quc3Ryb2tlKCl9LGUucHJvdG90eXBlLnN0cm9rZUFuZEZpbGw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRycyxuPWUubGluZVdpZHRoLHI9ZS5vcGFjaXR5LGk9ZS5zdHJva2VPcGFjaXR5LG89ZS5maWxsT3BhY2l0eTt0aGlzLmlzRmlsbCgpJiYoT2JqZWN0KGEuaSkobyl8fDE9PT1vP3RoaXMuZmlsbCh0KToodC5nbG9iYWxBbHBoYT1vLHRoaXMuZmlsbCh0KSx0Lmdsb2JhbEFscGhhPXIpKSx0aGlzLmlzU3Ryb2tlKCkmJm4+MCYmKE9iamVjdChhLmkpKGkpfHwxPT09aXx8KHQuZ2xvYmFsQWxwaGE9aSksdGhpcy5zdHJva2UodCkpLHRoaXMuYWZ0ZXJEcmF3UGF0aCh0KX0sZS5wcm90b3R5cGUuY3JlYXRlUGF0aD1mdW5jdGlvbih0KXt9LGUucHJvdG90eXBlLmFmdGVyRHJhd1BhdGg9ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5pc0luU2hhcGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmlzU3Ryb2tlKCkscj10aGlzLmlzRmlsbCgpLGk9dGhpcy5nZXRIaXRMaW5lV2lkdGgoKTtyZXR1cm4gdGhpcy5pc0luU3Ryb2tlT3JQYXRoKHQsZSxuLHIsaSl9LGUucHJvdG90eXBlLmlzSW5TdHJva2VPclBhdGg9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4hMX0sZS5wcm90b3R5cGUuZ2V0SGl0TGluZVdpZHRoPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNTdHJva2UoKSlyZXR1cm4gMDt2YXIgdD10aGlzLmF0dHJzO3JldHVybiB0LmxpbmVXaWR0aCt0LmxpbmVBcHBlbmRXaWR0aH0sZX0oby5BYnN0cmFjdFNoYXBlKSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3QoaS5iKShlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRBdHRycz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO3JldHVybiBPYmplY3QoaS5hKShPYmplY3QoaS5hKSh7fSxlKSx7eDowLHk6MCxyOjB9KX0sZS5wcm90b3R5cGUuaXNJblN0cm9rZU9yUGF0aD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXRoaXMuYXR0cigpLHM9by54LHU9by55LGM9by5yLGY9aS8yLGw9T2JqZWN0KGEuYikocyx1LHQsZSk7cmV0dXJuIHImJm4/bDw9YytmOnI/bDw9YzohIW4mJihsPj1jLWYmJmw8PWMrZil9LGUucHJvdG90eXBlLmNyZWF0ZVBhdGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRyKCksbj1lLngscj1lLnksaT1lLnI7dC5iZWdpblBhdGgoKSx0LmFyYyhuLHIsaSwwLDIqTWF0aC5QSSwhMSksdC5jbG9zZVBhdGgoKX0sZX0oYyk7ZnVuY3Rpb24gbCh0LGUsbixyKXtyZXR1cm4gdC8obipuKStlLyhyKnIpfXZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3QoaS5iKShlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRBdHRycz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO3JldHVybiBPYmplY3QoaS5hKShPYmplY3QoaS5hKSh7fSxlKSx7eDowLHk6MCxyeDowLHJ5OjB9KX0sZS5wcm90b3R5cGUuaXNJblN0cm9rZU9yUGF0aD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXRoaXMuYXR0cigpLGE9aS8yLHM9by54LHU9by55LGM9by5yeCxmPW8ucnksaD0odC1zKSoodC1zKSxkPShlLXUpKihlLXUpO3JldHVybiByJiZuP2woaCxkLGMrYSxmK2EpPD0xOnI/bChoLGQsYyxmKTw9MTohIW4mJihsKGgsZCxjLWEsZi1hKT49MSYmbChoLGQsYythLGYrYSk8PTEpfSxlLnByb3RvdHlwZS5jcmVhdGVQYXRoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYXR0cigpLG49ZS54LHI9ZS55LGk9ZS5yeCxvPWUucnk7aWYodC5iZWdpblBhdGgoKSx0LmVsbGlwc2UpdC5lbGxpcHNlKG4scixpLG8sMCwwLDIqTWF0aC5QSSwhMSk7ZWxzZXt2YXIgYT1pPm8/aTpvLHM9aT5vPzE6aS9vLHU9aT5vP28vaToxO3Quc2F2ZSgpLHQudHJhbnNsYXRlKG4sciksdC5zY2FsZShzLHUpLHQuYXJjKDAsMCxhLDAsMipNYXRoLlBJKSx0LnJlc3RvcmUoKSx0LmNsb3NlUGF0aCgpfX0sZX0oYyk7ZnVuY3Rpb24gZCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZPYmplY3QoYS5rKSh0Lm5vZGVOYW1lKSYmXCJDQU5WQVNcIj09PXQubm9kZU5hbWUudG9VcHBlckNhc2UoKX12YXIgcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnM9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0KGkuYSkoT2JqZWN0KGkuYSkoe30sZSkse3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH0pfSxlLnByb3RvdHlwZS5pbml0QXR0cnM9ZnVuY3Rpb24odCl7dGhpcy5fc2V0SW1hZ2UodC5pbWcpfSxlLnByb3RvdHlwZS5pc1N0cm9rZT1mdW5jdGlvbigpe3JldHVybiExfSxlLnByb3RvdHlwZS5pc09ubHlIaXRCb3g9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuX2FmdGVyTG9hZGluZz1mdW5jdGlvbigpe2lmKCEwPT09dGhpcy5nZXQoXCJ0b0RyYXdcIikpe3ZhciB0PXRoaXMuZ2V0KFwiY2FudmFzXCIpO3Q/dC5kcmF3KCk6dGhpcy5jcmVhdGVQYXRoKHRoaXMuZ2V0KFwiY29udGV4dFwiKSl9fSxlLnByb3RvdHlwZS5fc2V0SW1hZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuYXR0cnM7aWYoT2JqZWN0KGEuaykodCkpe3ZhciByPW5ldyBJbWFnZTtyLm9ubG9hZD1mdW5jdGlvbigpe2lmKGUuZGVzdHJveWVkKXJldHVybiExO2UuYXR0cihcImltZ1wiLHIpLGUuc2V0KFwibG9hZGluZ1wiLCExKSxlLl9hZnRlckxvYWRpbmcoKTt2YXIgdD1lLmdldChcImNhbGxiYWNrXCIpO3QmJnQuY2FsbChlKX0sci5jcm9zc09yaWdpbj1cIkFub255bW91c1wiLHIuc3JjPXQsdGhpcy5zZXQoXCJsb2FkaW5nXCIsITApfWVsc2UgdCBpbnN0YW5jZW9mIEltYWdlPyhuLndpZHRofHwobi53aWR0aD10LndpZHRoKSxuLmhlaWdodHx8KG4uaGVpZ2h0PXQuaGVpZ2h0KSk6ZCh0KSYmKG4ud2lkdGh8fChuLndpZHRoPU51bWJlcih0LmdldEF0dHJpYnV0ZShcIndpZHRoXCIpKSksbi5oZWlnaHR8fChuLmhlaWdodCxOdW1iZXIodC5nZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIikpKSl9LGUucHJvdG90eXBlLm9uQXR0ckNoYW5nZT1mdW5jdGlvbihlLG4scil7dC5wcm90b3R5cGUub25BdHRyQ2hhbmdlLmNhbGwodGhpcyxlLG4sciksXCJpbWdcIj09PWUmJnRoaXMuX3NldEltYWdlKG4pfSxlLnByb3RvdHlwZS5jcmVhdGVQYXRoPWZ1bmN0aW9uKHQpe2lmKHRoaXMuZ2V0KFwibG9hZGluZ1wiKSlyZXR1cm4gdGhpcy5zZXQoXCJ0b0RyYXdcIiwhMCksdm9pZCB0aGlzLnNldChcImNvbnRleHRcIix0KTt2YXIgZT10aGlzLmF0dHIoKSxuPWUueCxyPWUueSxpPWUud2lkdGgsbz1lLmhlaWdodCxzPWUuc3gsdT1lLnN5LGM9ZS5zd2lkdGgsZj1lLnNoZWlnaHQsbD1lLmltZzsobCBpbnN0YW5jZW9mIEltYWdlfHxkKGwpKSYmKE9iamVjdChhLmkpKHMpfHxPYmplY3QoYS5pKSh1KXx8T2JqZWN0KGEuaSkoYyl8fE9iamVjdChhLmkpKGYpP3QuZHJhd0ltYWdlKGwsbixyLGksbyk6dC5kcmF3SW1hZ2UobCxzLHUsYyxmLG4scixpLG8pKX0sZX0oYyksZz1uKDIwKTtmdW5jdGlvbiB2KHQsZSxuLHIsaSxvLGEpe3ZhciBzPU1hdGgubWluKHQsbiksdT1NYXRoLm1heCh0LG4pLGM9TWF0aC5taW4oZSxyKSxmPU1hdGgubWF4KGUsciksbD1pLzI7cmV0dXJuIG8+PXMtbCYmbzw9dStsJiZhPj1jLWwmJmE8PWYrbCYmZy5jLnBvaW50VG9MaW5lKHQsZSxuLHIsbyxhKTw9aS8yfXZhciB5PW4oMzMpLG09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIE9iamVjdChpLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdChpLmEpKE9iamVjdChpLmEpKHt9LGUpLHt4MTowLHkxOjAseDI6MCx5MjowLHN0YXJ0QXJyb3c6ITEsZW5kQXJyb3c6ITF9KX0sZS5wcm90b3R5cGUuaW5pdEF0dHJzPWZ1bmN0aW9uKHQpe3RoaXMuc2V0QXJyb3coKX0sZS5wcm90b3R5cGUub25BdHRyQ2hhbmdlPWZ1bmN0aW9uKGUsbixyKXt0LnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UuY2FsbCh0aGlzLGUsbixyKSx0aGlzLnNldEFycm93KCl9LGUucHJvdG90eXBlLnNldEFycm93PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hdHRyKCksZT10LngxLG49dC55MSxyPXQueDIsaT10LnkyLG89dC5zdGFydEFycm93LGE9dC5lbmRBcnJvdztvJiZ5LmIodGhpcyx0LHIsaSxlLG4pLGEmJnkuYSh0aGlzLHQsZSxuLHIsaSl9LGUucHJvdG90eXBlLmlzSW5TdHJva2VPclBhdGg9ZnVuY3Rpb24odCxlLG4scixpKXtpZighbnx8IWkpcmV0dXJuITE7dmFyIG89dGhpcy5hdHRyKCk7cmV0dXJuIHYoby54MSxvLnkxLG8ueDIsby55MixpLHQsZSl9LGUucHJvdG90eXBlLmNyZWF0ZVBhdGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRyKCksbj1lLngxLHI9ZS55MSxpPWUueDIsbz1lLnkyLGE9ZS5zdGFydEFycm93LHM9ZS5lbmRBcnJvdyx1PXtkeDowLGR5OjB9LGM9e2R4OjAsZHk6MH07YSYmYS5kJiYodT15LmMobixyLGksbyxlLnN0YXJ0QXJyb3cuZCkpLHMmJnMuZCYmKGM9eS5jKG4scixpLG8sZS5lbmRBcnJvdy5kKSksdC5iZWdpblBhdGgoKSx0Lm1vdmVUbyhuK3UuZHgscit1LmR5KSx0LmxpbmVUbyhpLWMuZHgsby1jLmR5KX0sZS5wcm90b3R5cGUuYWZ0ZXJEcmF3UGF0aD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcInN0YXJ0QXJyb3dTaGFwZVwiKSxuPXRoaXMuZ2V0KFwiZW5kQXJyb3dTaGFwZVwiKTtlJiZlLmRyYXcodCksbiYmbi5kcmF3KHQpfSxlLnByb3RvdHlwZS5nZXRUb3RhbExlbmd0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cigpLGU9dC54MSxuPXQueTEscj10LngyLGk9dC55MjtyZXR1cm4gZy5jLmxlbmd0aChlLG4scixpKX0sZS5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRyKCksbj1lLngxLHI9ZS55MSxpPWUueDIsbz1lLnkyO3JldHVybiBnLmMucG9pbnRBdChuLHIsaSxvLHQpfSxlfShjKSxiPW4oMCkseD1uKDM4KSx3PXtjaXJjbGU6ZnVuY3Rpb24odCxlLG4pe3JldHVybltbXCJNXCIsdC1uLGVdLFtcIkFcIixuLG4sMCwxLDAsdCtuLGVdLFtcIkFcIixuLG4sMCwxLDAsdC1uLGVdXX0sc3F1YXJlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bW1wiTVwiLHQtbixlLW5dLFtcIkxcIix0K24sZS1uXSxbXCJMXCIsdCtuLGUrbl0sW1wiTFwiLHQtbixlK25dLFtcIlpcIl1dfSxkaWFtb25kOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bW1wiTVwiLHQtbixlXSxbXCJMXCIsdCxlLW5dLFtcIkxcIix0K24sZV0sW1wiTFwiLHQsZStuXSxbXCJaXCJdXX0sdHJpYW5nbGU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4qTWF0aC5zaW4oMS8zKk1hdGguUEkpO3JldHVybltbXCJNXCIsdC1uLGUrcl0sW1wiTFwiLHQsZS1yXSxbXCJMXCIsdCtuLGUrcl0sW1wiWlwiXV19LFwidHJpYW5nbGUtZG93blwiOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKk1hdGguc2luKDEvMypNYXRoLlBJKTtyZXR1cm5bW1wiTVwiLHQtbixlLXJdLFtcIkxcIix0K24sZS1yXSxbXCJMXCIsdCxlK3JdLFtcIlpcIl1dfX0sUz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5pbml0QXR0cnM9ZnVuY3Rpb24odCl7dGhpcy5fcmVzZXRQYXJhbXNDYWNoZSgpfSxlLnByb3RvdHlwZS5fcmVzZXRQYXJhbXNDYWNoZT1mdW5jdGlvbigpe3RoaXMuc2V0KFwicGFyYW1zQ2FjaGVcIix7fSl9LGUucHJvdG90eXBlLm9uQXR0ckNoYW5nZT1mdW5jdGlvbihlLG4scil7dC5wcm90b3R5cGUub25BdHRyQ2hhbmdlLmNhbGwodGhpcyxlLG4sciksLTEhPT1bXCJzeW1ib2xcIixcInhcIixcInlcIixcInJcIixcInJhZGl1c1wiXS5pbmRleE9mKGUpJiZ0aGlzLl9yZXNldFBhcmFtc0NhY2hlKCl9LGUucHJvdG90eXBlLmlzT25seUhpdEJveD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5fZ2V0Uj1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KGIucykodC5yKT90LnJhZGl1czp0LnJ9LGUucHJvdG90eXBlLl9nZXRQYXRoPWZ1bmN0aW9uKCl7dmFyIHQsbixyPXRoaXMuYXR0cigpLGk9ci54LG89ci55LHM9ci5zeW1ib2x8fFwiY2lyY2xlXCIsdT10aGlzLl9nZXRSKHIpO2lmKE9iamVjdChhLmgpKHMpKW49KHQ9cykoaSxvLHUpLG49T2JqZWN0KHguYykobik7ZWxzZXtpZighKHQ9ZS5TeW1ib2xzW3NdKSlyZXR1cm4gY29uc29sZS53YXJuKHMrXCIgbWFya2VyIGlzIG5vdCBzdXBwb3J0ZWQuXCIpLG51bGw7bj10KGksbyx1KX1yZXR1cm4gbn0sZS5wcm90b3R5cGUuY3JlYXRlUGF0aD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9nZXRQYXRoKCksbj10aGlzLmdldChcInBhcmFtc0NhY2hlXCIpO09iamVjdChzLmUpKHRoaXMsdCx7cGF0aDplfSxuKX0sZS5TeW1ib2xzPXcsZX0oYyk7ZnVuY3Rpb24gRSh0LGUsbil7dmFyIHI9T2JqZWN0KG8uZ2V0T2ZmU2NyZWVuQ29udGV4dCkoKTtyZXR1cm4gdC5jcmVhdGVQYXRoKHIpLHIuaXNQb2ludEluUGF0aChlLG4pfWZ1bmN0aW9uIF8odCl7cmV0dXJuIE1hdGguYWJzKHQpPDFlLTY/MDp0PDA/LTE6MX1mdW5jdGlvbiBPKHQsZSxuKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSkmJk1hdGgubWluKHRbMF0sZVswXSk8PW5bMF0mJm5bMF08PU1hdGgubWF4KHRbMF0sZVswXSkmJk1hdGgubWluKHRbMV0sZVsxXSk8PW5bMV0mJm5bMV08PU1hdGgubWF4KHRbMV0sZVsxXSl9ZnVuY3Rpb24gayh0LGUsbil7dmFyIHI9ITEsaT10Lmxlbmd0aDtpZihpPD0yKXJldHVybiExO2Zvcih2YXIgbz0wO288aTtvKyspe3ZhciBhPXRbb10scz10WyhvKzEpJWldO2lmKE8oYSxzLFtlLG5dKSlyZXR1cm4hMDtfKGFbMV0tbik+MCE9XyhzWzFdLW4pPjAmJl8oZS0obi1hWzFdKSooYVswXS1zWzBdKS8oYVsxXS1zWzFdKS1hWzBdKTwwJiYocj0hcil9cmV0dXJuIHJ9dmFyIE09bigxOCksQT1uKDQwKTtmdW5jdGlvbiBUKHQsZSxuLHIsaSxvLHMsdSl7dmFyIGM9KE1hdGguYXRhbjIodS1lLHMtdCkrMipNYXRoLlBJKSUoMipNYXRoLlBJKTtpZihjPHJ8fGM+aSlyZXR1cm4hMTt2YXIgZj17eDp0K24qTWF0aC5jb3MoYykseTplK24qTWF0aC5zaW4oYyl9O3JldHVybiBPYmplY3QoYS5iKShmLngsZi55LHMsdSk8PW8vMn12YXIgQz1NLmEudHJhbnNmb3JtO3ZhciBJPU9iamVjdChpLmEpKHtoYXNBcmM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSExLG49dC5sZW5ndGgscj0wO3I8bjtyKyspe3ZhciBpPXRbcl1bMF07aWYoXCJDXCI9PT1pfHxcIkFcIj09PWl8fFwiUVwiPT09aSl7ZT0hMDticmVha319cmV0dXJuIGV9LGV4dHJhY3RQb2x5Z29uczpmdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgsbj1bXSxyPVtdLGk9W10sbz0wO288ZTtvKyspe3ZhciBhPXRbb10scz1hWzBdO1wiTVwiPT09cz8oaS5sZW5ndGgmJihyLnB1c2goaSksaT1bXSksaS5wdXNoKFthWzFdLGFbMl1dKSk6XCJaXCI9PT1zP2kubGVuZ3RoJiYobi5wdXNoKGkpLGk9W10pOmkucHVzaChbYVsxXSxhWzJdXSl9cmV0dXJuIGkubGVuZ3RoPjAmJnIucHVzaChpKSx7cG9seWdvbnM6bixwb2x5bGluZXM6cn19LGlzUG9pbnRJblN0cm9rZTpmdW5jdGlvbih0LGUsbixyLGkpe2Zvcih2YXIgbz0hMSxzPWUvMix1PTA7dTx0Lmxlbmd0aDt1Kyspe3ZhciBjPXRbdV0sZj1jLmN1cnJlbnRQb2ludCxsPWMucGFyYW1zLGg9Yy5wcmVQb2ludCxkPWMuYm94O2lmKCFkfHxPYmplY3QoYS5lKShkLngtcyxkLnktcyxkLndpZHRoK2UsZC5oZWlnaHQrZSxuLHIpKXtzd2l0Y2goYy5jb21tYW5kKXtjYXNlXCJMXCI6Y2FzZVwiWlwiOm89dihoWzBdLGhbMV0sZlswXSxmWzFdLGUsbixyKTticmVhaztjYXNlXCJRXCI6bz1nLmUucG9pbnREaXN0YW5jZShoWzBdLGhbMV0sbFsxXSxsWzJdLGxbM10sbFs0XSxuLHIpPD1lLzI7YnJlYWs7Y2FzZVwiQ1wiOm89Zy5iLnBvaW50RGlzdGFuY2UoaFswXSxoWzFdLGxbMV0sbFsyXSxsWzNdLGxbNF0sbFs1XSxsWzZdLG4scixpKTw9ZS8yO2JyZWFrO2Nhc2VcIkFcIjp2YXIgcD1jLmFyY1BhcmFtcyx5PXAuY3gsbT1wLmN5LGI9cC5yeCx4PXAucnksdz1wLnN0YXJ0QW5nbGUsUz1wLmVuZEFuZ2xlLEU9cC54Um90YXRpb24sXz1bbixyLDFdLE89Yj54P2I6eCxrPUMobnVsbCxbW1widFwiLC15LC1tXSxbXCJyXCIsLUVdLFtcInNcIiwxLyhiPng/MTpiL3gpLDEvKGI+eD94L2I6MSldXSk7QS50cmFuc2Zvcm1NYXQzKF8sXyxrKSxvPVQoMCwwLE8sdyxTLGUsX1swXSxfWzFdKX1pZihvKWJyZWFrfX1yZXR1cm4gb319LG8uUGF0aFV0aWwpO2Z1bmN0aW9uIFAodCxlLG4pe2Zvcih2YXIgcj0hMSxpPTA7aTx0Lmxlbmd0aDtpKyspe2lmKHI9ayh0W2ldLGUsbikpYnJlYWt9cmV0dXJuIHJ9dmFyIGo9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIE9iamVjdChpLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdChpLmEpKE9iamVjdChpLmEpKHt9LGUpLHtzdGFydEFycm93OiExLGVuZEFycm93OiExfSl9LGUucHJvdG90eXBlLmluaXRBdHRycz1mdW5jdGlvbih0KXt0aGlzLl9zZXRQYXRoQXJyKHQucGF0aCksdGhpcy5zZXRBcnJvdygpfSxlLnByb3RvdHlwZS5vbkF0dHJDaGFuZ2U9ZnVuY3Rpb24oZSxuLHIpe3QucHJvdG90eXBlLm9uQXR0ckNoYW5nZS5jYWxsKHRoaXMsZSxuLHIpLFwicGF0aFwiPT09ZSYmdGhpcy5fc2V0UGF0aEFycihuKSx0aGlzLnNldEFycm93KCl9LGUucHJvdG90eXBlLl9zZXRQYXRoQXJyPWZ1bmN0aW9uKHQpe3RoaXMuYXR0cnMucGF0aD1PYmplY3QoeC5jKSh0KTt2YXIgZT1JLmhhc0FyYyh0KTt0aGlzLnNldChcImhhc0FyY1wiLGUpLHRoaXMuc2V0KFwicGFyYW1zQ2FjaGVcIix7fSksdGhpcy5zZXQoXCJzZWdtZW50c1wiLG51bGwpLHRoaXMuc2V0KFwiY3VydmVcIixudWxsKSx0aGlzLnNldChcInRDYWNoZVwiLG51bGwpLHRoaXMuc2V0KFwidG90YWxMZW5ndGhcIixudWxsKX0sZS5wcm90b3R5cGUuZ2V0U2VnbWVudHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcInNlZ2VtZW50c1wiKTtyZXR1cm4gdHx8KHQ9T2JqZWN0KHguZCkodGhpcy5hdHRyKFwicGF0aFwiKSksdGhpcy5zZXQoXCJzZWdtZW50c1wiLHQpKSx0fSxlLnByb3RvdHlwZS5zZXRBcnJvdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cigpLGU9dC5zdGFydEFycm93LG49dC5lbmRBcnJvdztpZihlKXt2YXIgcj10aGlzLmdldFN0YXJ0VGFuZ2VudCgpO3kuYih0aGlzLHQsclswXVswXSxyWzBdWzFdLHJbMV1bMF0sclsxXVsxXSl9aWYobil7cj10aGlzLmdldEVuZFRhbmdlbnQoKTt5LmEodGhpcyx0LHJbMF1bMF0sclswXVsxXSxyWzFdWzBdLHJbMV1bMV0pfX0sZS5wcm90b3R5cGUuaXNJblN0cm9rZU9yUGF0aD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXRoaXMuZ2V0U2VnbWVudHMoKSxhPXRoaXMuZ2V0KFwiaGFzQXJjXCIpLHM9ITE7aWYobil7dmFyIHU9dGhpcy5nZXRUb3RhbExlbmd0aCgpO3M9SS5pc1BvaW50SW5TdHJva2UobyxpLHQsZSx1KX1pZighcyYmcilpZihhKXM9RSh0aGlzLHQsZSk7ZWxzZXt2YXIgYz10aGlzLmF0dHIoXCJwYXRoXCIpLGY9SS5leHRyYWN0UG9seWdvbnMoYyk7cz1QKGYucG9seWdvbnMsdCxlKXx8UChmLnBvbHlsaW5lcyx0LGUpfXJldHVybiBzfSxlLnByb3RvdHlwZS5jcmVhdGVQYXRoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYXR0cigpLG49dGhpcy5nZXQoXCJwYXJhbXNDYWNoZVwiKTtPYmplY3Qocy5lKSh0aGlzLHQsZSxuKX0sZS5wcm90b3R5cGUuYWZ0ZXJEcmF3UGF0aD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcInN0YXJ0QXJyb3dTaGFwZVwiKSxuPXRoaXMuZ2V0KFwiZW5kQXJyb3dTaGFwZVwiKTtlJiZlLmRyYXcodCksbiYmbi5kcmF3KHQpfSxlLnByb3RvdHlwZS5nZXRUb3RhbExlbmd0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwidG90YWxMZW5ndGhcIik7cmV0dXJuIE9iamVjdChiLnMpKHQpPyh0aGlzLl9jYWxjdWxhdGVDdXJ2ZSgpLHRoaXMuX3NldFRjYWNoZSgpLHRoaXMuZ2V0KFwidG90YWxMZW5ndGhcIikpOnR9LGUucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlLG4scj10aGlzLmdldChcInRDYWNoZVwiKTtyfHwodGhpcy5fY2FsY3VsYXRlQ3VydmUoKSx0aGlzLl9zZXRUY2FjaGUoKSxyPXRoaXMuZ2V0KFwidENhY2hlXCIpKTt2YXIgaT10aGlzLmdldChcImN1cnZlXCIpO2lmKCFyfHwwPT09ci5sZW5ndGgpcmV0dXJuIGk/e3g6aVswXVsxXSx5OmlbMF1bMl19Om51bGw7T2JqZWN0KGIuZikociwoZnVuY3Rpb24ocixpKXt0Pj1yWzBdJiZ0PD1yWzFdJiYoZT0odC1yWzBdKS8oclsxXS1yWzBdKSxuPWkpfSkpO3ZhciBvPWlbbl07aWYoT2JqZWN0KGIucykobyl8fE9iamVjdChiLnMpKG4pKXJldHVybiBudWxsO3ZhciBhPW8ubGVuZ3RoLHM9aVtuKzFdO3JldHVybiBnLmIucG9pbnRBdChvW2EtMl0sb1thLTFdLHNbMV0sc1syXSxzWzNdLHNbNF0sc1s1XSxzWzZdLGUpfSxlLnByb3RvdHlwZS5fY2FsY3VsYXRlQ3VydmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmF0dHIoKS5wYXRoO3RoaXMuc2V0KFwiY3VydmVcIixJLnBhdGhUb0N1cnZlKHQpKX0sZS5wcm90b3R5cGUuX3NldFRjYWNoZT1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9MCxvPTAsYT1bXSxzPXRoaXMuZ2V0KFwiY3VydmVcIik7cyYmKE9iamVjdChiLmYpKHMsKGZ1bmN0aW9uKHQsZSl7bj1zW2UrMV0scj10Lmxlbmd0aCxuJiYoaSs9Zy5iLmxlbmd0aCh0W3ItMl0sdFtyLTFdLG5bMV0sblsyXSxuWzNdLG5bNF0sbls1XSxuWzZdKXx8MCl9KSksdGhpcy5zZXQoXCJ0b3RhbExlbmd0aFwiLGkpLDAhPT1pPyhPYmplY3QoYi5mKShzLChmdW5jdGlvbih1LGMpe249c1tjKzFdLHI9dS5sZW5ndGgsbiYmKCh0PVtdKVswXT1vL2ksZT1nLmIubGVuZ3RoKHVbci0yXSx1W3ItMV0sblsxXSxuWzJdLG5bM10sbls0XSxuWzVdLG5bNl0pLG8rPWV8fDAsdFsxXT1vL2ksYS5wdXNoKHQpKX0pKSx0aGlzLnNldChcInRDYWNoZVwiLGEpKTp0aGlzLnNldChcInRDYWNoZVwiLFtdKSl9LGUucHJvdG90eXBlLmdldFN0YXJ0VGFuZ2VudD1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXRTZWdtZW50cygpO2lmKGUubGVuZ3RoPjEpe3ZhciBuPWVbMF0uY3VycmVudFBvaW50LHI9ZVsxXS5jdXJyZW50UG9pbnQsaT1lWzFdLnN0YXJ0VGFuZ2VudDt0PVtdLGk/KHQucHVzaChbblswXS1pWzBdLG5bMV0taVsxXV0pLHQucHVzaChbblswXSxuWzFdXSkpOih0LnB1c2goW3JbMF0sclsxXV0pLHQucHVzaChbblswXSxuWzFdXSkpfXJldHVybiB0fSxlLnByb3RvdHlwZS5nZXRFbmRUYW5nZW50PWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldFNlZ21lbnRzKCksbj1lLmxlbmd0aDtpZihuPjEpe3ZhciByPWVbbi0yXS5jdXJyZW50UG9pbnQsaT1lW24tMV0uY3VycmVudFBvaW50LG89ZVtuLTFdLmVuZFRhbmdlbnQ7dD1bXSxvPyh0LnB1c2goW2lbMF0tb1swXSxpWzFdLW9bMV1dKSx0LnB1c2goW2lbMF0saVsxXV0pKToodC5wdXNoKFtyWzBdLHJbMV1dKSx0LnB1c2goW2lbMF0saVsxXV0pKX1yZXR1cm4gdH0sZX0oYyk7ZnVuY3Rpb24gRCh0LGUsbixyLGkpe3ZhciBvPXQubGVuZ3RoO2lmKG88MilyZXR1cm4hMTtmb3IodmFyIGE9MDthPG8tMTthKyspe2lmKHYodFthXVswXSx0W2FdWzFdLHRbYSsxXVswXSx0W2ErMV1bMV0sZSxuLHIpKXJldHVybiEwfWlmKGkpe3ZhciBzPXRbMF0sdT10W28tMV07aWYodihzWzBdLHNbMV0sdVswXSx1WzFdLGUsbixyKSlyZXR1cm4hMH1yZXR1cm4hMX12YXIgTj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5pc0luU3Ryb2tlT3JQYXRoPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89dGhpcy5hdHRyKCkucG9pbnRzLGE9ITE7cmV0dXJuIG4mJihhPUQobyxpLHQsZSwhMCkpLCFhJiZyJiYoYT1rKG8sdCxlKSksYX0sZS5wcm90b3R5cGUuY3JlYXRlUGF0aD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmF0dHIoKS5wb2ludHM7aWYoIShlLmxlbmd0aDwyKSl7dC5iZWdpblBhdGgoKTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTswPT09bj90Lm1vdmVUbyhyWzBdLHJbMV0pOnQubGluZVRvKHJbMF0sclsxXSl9dC5jbG9zZVBhdGgoKX19LGV9KGMpLFI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIE9iamVjdChpLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdChpLmEpKE9iamVjdChpLmEpKHt9LGUpLHtzdGFydEFycm93OiExLGVuZEFycm93OiExfSl9LGUucHJvdG90eXBlLmluaXRBdHRycz1mdW5jdGlvbih0KXt0aGlzLnNldEFycm93KCl9LGUucHJvdG90eXBlLm9uQXR0ckNoYW5nZT1mdW5jdGlvbihlLG4scil7dC5wcm90b3R5cGUub25BdHRyQ2hhbmdlLmNhbGwodGhpcyxlLG4sciksdGhpcy5zZXRBcnJvdygpLC0xIT09W1wicG9pbnRzXCJdLmluZGV4T2YoZSkmJnRoaXMuX3Jlc2V0Q2FjaGUoKX0sZS5wcm90b3R5cGUuX3Jlc2V0Q2FjaGU9ZnVuY3Rpb24oKXt0aGlzLnNldChcInRvdGFsTGVuZ3RoXCIsbnVsbCksdGhpcy5zZXQoXCJ0Q2FjaGVcIixudWxsKX0sZS5wcm90b3R5cGUuc2V0QXJyb3c9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmF0dHIoKSxlPXRoaXMuYXR0cnMsbj1lLnBvaW50cyxyPWUuc3RhcnRBcnJvdyxpPWUuZW5kQXJyb3csbz1uLmxlbmd0aCxhPW5bMF1bMF0scz1uWzBdWzFdLHU9bltvLTFdWzBdLGM9bltvLTFdWzFdO3ImJnkuYih0aGlzLHQsblsxXVswXSxuWzFdWzFdLGEscyksaSYmeS5hKHRoaXMsdCxuW28tMl1bMF0sbltvLTJdWzFdLHUsYyl9LGUucHJvdG90eXBlLmlzRmlsbD1mdW5jdGlvbigpe3JldHVybiExfSxlLnByb3RvdHlwZS5pc0luU3Ryb2tlT3JQYXRoPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuISghbnx8IWkpJiZEKHRoaXMuYXR0cigpLnBvaW50cyxpLHQsZSwhMSl9LGUucHJvdG90eXBlLmlzU3Ryb2tlPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmNyZWF0ZVBhdGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRyKCksbj1lLnBvaW50cyxyPWUuc3RhcnRBcnJvdyxpPWUuZW5kQXJyb3csbz1uLmxlbmd0aDtpZighKG4ubGVuZ3RoPDIpKXt2YXIgYSxzPW5bMF1bMF0sdT1uWzBdWzFdLGM9bltvLTFdWzBdLGY9bltvLTFdWzFdO2lmKHImJnIuZClzKz0oYT15LmMocyx1LG5bMV1bMF0sblsxXVsxXSxyLmQpKS5keCx1Kz1hLmR5O2lmKGkmJmkuZCljLT0oYT15LmMobltvLTJdWzBdLG5bby0yXVsxXSxjLGYsaS5kKSkuZHgsZi09YS5keTt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHMsdSk7Zm9yKHZhciBsPTA7bDxvLTE7bCsrKXt2YXIgaD1uW2xdO3QubGluZVRvKGhbMF0saFsxXSl9dC5saW5lVG8oYyxmKX19LGUucHJvdG90eXBlLmFmdGVyRHJhd1BhdGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXQoXCJzdGFydEFycm93U2hhcGVcIiksbj10aGlzLmdldChcImVuZEFycm93U2hhcGVcIik7ZSYmZS5kcmF3KHQpLG4mJm4uZHJhdyh0KX0sZS5wcm90b3R5cGUuZ2V0VG90YWxMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmF0dHIoKS5wb2ludHMsZT10aGlzLmdldChcInRvdGFsTGVuZ3RoXCIpO3JldHVybiBPYmplY3QoYi5zKShlKT8odGhpcy5zZXQoXCJ0b3RhbExlbmd0aFwiLGcuZC5sZW5ndGgodCkpLHRoaXMuZ2V0KFwidG90YWxMZW5ndGhcIikpOmV9LGUucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlLG4scj10aGlzLmF0dHIoKS5wb2ludHMsaT10aGlzLmdldChcInRDYWNoZVwiKTtyZXR1cm4gaXx8KHRoaXMuX3NldFRjYWNoZSgpLGk9dGhpcy5nZXQoXCJ0Q2FjaGVcIikpLE9iamVjdChiLmYpKGksKGZ1bmN0aW9uKHIsaSl7dD49clswXSYmdDw9clsxXSYmKGU9KHQtclswXSkvKHJbMV0tclswXSksbj1pKX0pKSxnLmMucG9pbnRBdChyW25dWzBdLHJbbl1bMV0scltuKzFdWzBdLHJbbisxXVsxXSxlKX0sZS5wcm90b3R5cGUuX3NldFRjYWNoZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cigpLnBvaW50cztpZih0JiYwIT09dC5sZW5ndGgpe3ZhciBlPXRoaXMuZ2V0VG90YWxMZW5ndGgoKTtpZighKGU8PTApKXt2YXIgbixyLGk9MCxvPVtdO09iamVjdChiLmYpKHQsKGZ1bmN0aW9uKGEscyl7dFtzKzFdJiYoKG49W10pWzBdPWkvZSxyPWcuYy5sZW5ndGgoYVswXSxhWzFdLHRbcysxXVswXSx0W3MrMV1bMV0pLGkrPXIsblsxXT1pL2Usby5wdXNoKG4pKX0pKSx0aGlzLnNldChcInRDYWNoZVwiLG8pfX19LGUucHJvdG90eXBlLmdldFN0YXJ0VGFuZ2VudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cigpLnBvaW50cyxlPVtdO3JldHVybiBlLnB1c2goW3RbMV1bMF0sdFsxXVsxXV0pLGUucHVzaChbdFswXVswXSx0WzBdWzFdXSksZX0sZS5wcm90b3R5cGUuZ2V0RW5kVGFuZ2VudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cigpLnBvaW50cyxlPXQubGVuZ3RoLTEsbj1bXTtyZXR1cm4gbi5wdXNoKFt0W2UtMV1bMF0sdFtlLTFdWzFdXSksbi5wdXNoKFt0W2VdWzBdLHRbZV1bMV1dKSxufSxlfShjKSxMPW4oMTQwKTt2YXIgQj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnM9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0KGkuYSkoT2JqZWN0KGkuYSkoe30sZSkse3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MCxyYWRpdXM6MH0pfSxlLnByb3RvdHlwZS5pc0luU3Ryb2tlT3JQYXRoPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89dGhpcy5hdHRyKCkscz1vLngsdT1vLnksYz1vLndpZHRoLGY9by5oZWlnaHQsbD1vLnJhZGl1cztpZihsKXt2YXIgaD0hMTtyZXR1cm4gbiYmKGg9ZnVuY3Rpb24odCxlLG4scixpLG8sYSxzKXtyZXR1cm4gdih0K2ksZSx0K24taSxlLG8sYSxzKXx8dih0K24sZStpLHQrbixlK3ItaSxvLGEscyl8fHYodCtuLWksZStyLHQraSxlK3IsbyxhLHMpfHx2KHQsZStyLWksdCxlK2ksbyxhLHMpfHxUKHQrbi1pLGUraSxpLDEuNSpNYXRoLlBJLDIqTWF0aC5QSSxvLGEscyl8fFQodCtuLWksZStyLWksaSwwLC41Kk1hdGguUEksbyxhLHMpfHxUKHQraSxlK3ItaSxpLC41Kk1hdGguUEksTWF0aC5QSSxvLGEscyl8fFQodCtpLGUraSxpLE1hdGguUEksMS41Kk1hdGguUEksbyxhLHMpfShzLHUsYyxmLGwsaSx0LGUpKSwhaCYmciYmKGg9RSh0aGlzLHQsZSkpLGh9dmFyIGQ9aS8yO3JldHVybiByJiZuP09iamVjdChhLmUpKHMtZCx1LWQsYytkLGYrZCx0LGUpOnI/T2JqZWN0KGEuZSkocyx1LGMsZix0LGUpOm4/ZnVuY3Rpb24odCxlLG4scixpLG8scyl7dmFyIHU9aS8yO3JldHVybiBPYmplY3QoYS5lKSh0LXUsZS11LG4saSxvLHMpfHxPYmplY3QoYS5lKSh0K24tdSxlLXUsaSxyLG8scyl8fE9iamVjdChhLmUpKHQrdSxlK3ItdSxuLGksbyxzKXx8T2JqZWN0KGEuZSkodC11LGUrdSxpLHIsbyxzKX0ocyx1LGMsZixpLHQsZSk6dm9pZCAwfSxlLnByb3RvdHlwZS5jcmVhdGVQYXRoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYXR0cigpLG49ZS54LHI9ZS55LGk9ZS53aWR0aCxvPWUuaGVpZ2h0LGE9ZS5yYWRpdXM7aWYodC5iZWdpblBhdGgoKSwwPT09YSl0LnJlY3QobixyLGksbyk7ZWxzZXt2YXIgcz1PYmplY3QoTC5hKShhKSx1PXNbMF0sYz1zWzFdLGY9c1syXSxsPXNbM107dC5tb3ZlVG8obit1LHIpLHQubGluZVRvKG4raS1jLHIpLDAhPT1jJiZ0LmFyYyhuK2ktYyxyK2MsYywtTWF0aC5QSS8yLDApLHQubGluZVRvKG4raSxyK28tZiksMCE9PWYmJnQuYXJjKG4raS1mLHIrby1mLGYsMCxNYXRoLlBJLzIpLHQubGluZVRvKG4rbCxyK28pLDAhPT1sJiZ0LmFyYyhuK2wscitvLWwsbCxNYXRoLlBJLzIsTWF0aC5QSSksdC5saW5lVG8obixyK3UpLDAhPT11JiZ0LmFyYyhuK3Uscit1LHUsTWF0aC5QSSwxLjUqTWF0aC5QSSksdC5jbG9zZVBhdGgoKX19LGV9KGMpLEc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIE9iamVjdChpLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdChpLmEpKE9iamVjdChpLmEpKHt9LGUpLHt4OjAseTowLHRleHQ6bnVsbCxmb250U2l6ZToxMixmb250RmFtaWx5Olwic2Fucy1zZXJpZlwiLGZvbnRTdHlsZTpcIm5vcm1hbFwiLGZvbnRXZWlnaHQ6XCJub3JtYWxcIixmb250VmFyaWFudDpcIm5vcm1hbFwiLHRleHRBbGlnbjpcInN0YXJ0XCIsdGV4dEJhc2VsaW5lOlwiYm90dG9tXCJ9KX0sZS5wcm90b3R5cGUuaXNPbmx5SGl0Qm94PWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmluaXRBdHRycz1mdW5jdGlvbih0KXt0aGlzLl9hc3NlbWJsZUZvbnQoKSx0LnRleHQmJnRoaXMuX3NldFRleHQodC50ZXh0KX0sZS5wcm90b3R5cGUuX2Fzc2VtYmxlRm9udD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cnM7dC5mb250PU9iamVjdChvLmFzc2VtYmxlRm9udCkodCl9LGUucHJvdG90eXBlLl9zZXRUZXh0PWZ1bmN0aW9uKHQpe3ZhciBlPW51bGw7T2JqZWN0KGEuaykodCkmJi0xIT09dC5pbmRleE9mKFwiXFxuXCIpJiYoZT10LnNwbGl0KFwiXFxuXCIpKSx0aGlzLnNldChcInRleHRBcnJcIixlKX0sZS5wcm90b3R5cGUub25BdHRyQ2hhbmdlPWZ1bmN0aW9uKGUsbixyKXt0LnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UuY2FsbCh0aGlzLGUsbixyKSxlLnN0YXJ0c1dpdGgoXCJmb250XCIpJiZ0aGlzLl9hc3NlbWJsZUZvbnQoKSxcInRleHRcIj09PWUmJnRoaXMuX3NldFRleHQobil9LGUucHJvdG90eXBlLl9nZXRTcGFjZWluZ1k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmF0dHJzLGU9dC5saW5lSGVpZ2h0LG49MSp0LmZvbnRTaXplO3JldHVybiBlP2UtbjouMTQqbn0sZS5wcm90b3R5cGUuX2RyYXdUZXh0QXJyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpPXRoaXMuYXR0cnMscz1pLnRleHRCYXNlbGluZSx1PWkueCxjPWkueSxmPTEqaS5mb250U2l6ZSxsPXRoaXMuX2dldFNwYWNlaW5nWSgpLGg9T2JqZWN0KG8uZ2V0VGV4dEhlaWdodCkoaS50ZXh0LGkuZm9udFNpemUsaS5saW5lSGVpZ2h0KTtPYmplY3QoYS5jKShlLChmdW5jdGlvbihlLGkpe3I9YytpKihsK2YpLWgrZixcIm1pZGRsZVwiPT09cyYmKHIrPWgtZi0oaC1mKS8yKSxcInRvcFwiPT09cyYmKHIrPWgtZiksbj90LmZpbGxUZXh0KGUsdSxyKTp0LnN0cm9rZVRleHQoZSx1LHIpfSkpfSxlLnByb3RvdHlwZS5fZHJhd1RleHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmF0dHIoKSxyPW4ueCxpPW4ueSxvPXRoaXMuZ2V0KFwidGV4dEFyclwiKTtpZihvKXRoaXMuX2RyYXdUZXh0QXJyKHQsbyxlKTtlbHNle3ZhciBhPW4udGV4dDtlP3QuZmlsbFRleHQoYSxyLGkpOnQuc3Ryb2tlVGV4dChhLHIsaSl9fSxlLnByb3RvdHlwZS5zdHJva2VBbmRGaWxsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYXR0cnMsbj1lLmxpbmVXaWR0aCxyPWUub3BhY2l0eSxpPWUuc3Ryb2tlT3BhY2l0eSxvPWUuZmlsbE9wYWNpdHk7dGhpcy5pc1N0cm9rZSgpJiZuPjAmJihPYmplY3QoYS5pKShpKXx8MT09PWl8fCh0Lmdsb2JhbEFscGhhPXIpLHRoaXMuc3Ryb2tlKHQpKSx0aGlzLmlzRmlsbCgpJiYoT2JqZWN0KGEuaSkobyl8fDE9PT1vP3RoaXMuZmlsbCh0KToodC5nbG9iYWxBbHBoYT1vLHRoaXMuZmlsbCh0KSx0Lmdsb2JhbEFscGhhPXIpKSx0aGlzLmFmdGVyRHJhd1BhdGgodCl9LGUucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCl7dGhpcy5fZHJhd1RleHQodCwhMCl9LGUucHJvdG90eXBlLnN0cm9rZT1mdW5jdGlvbih0KXt0aGlzLl9kcmF3VGV4dCh0LCExKX0sZX0oYyl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcn0pKSxuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaH0pKTt2YXIgcixpPW4oNjIpLG89bi5uKGkpLGE9big2KSxzPW4ubihhKSx1PW4oNyksYz1uLm4odSksZj1uKDIpLGw9bigxMjcpOyFmdW5jdGlvbih0KXt0W3QuT1VUU0lERT00Mjk0OTY3Mjk1XT1cIk9VVFNJREVcIix0W3QuSU5TSURFPTBdPVwiSU5TSURFXCIsdFt0LklOREVURVJNSU5BVEU9MjE0NzQ4MzY0N109XCJJTkRFVEVSTUlOQVRFXCJ9KHJ8fChyPXt9KSk7dmFyIGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe2lmKHMoKSh0aGlzLHQpLHRoaXMucGxhbmVzPVtdLGUpdGhpcy5wbGFuZXM9ZTtlbHNlIGZvcih2YXIgbj0wO248NjtuKyspdGhpcy5wbGFuZXMucHVzaChuZXcgbC5hKX1yZXR1cm4gYygpKHQsW3trZXk6XCJleHRyYWN0RnJvbVZQTWF0cml4XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9bygpKHQsMTYpLG49ZVswXSxyPWVbMV0saT1lWzJdLGE9ZVszXSxzPWVbNF0sdT1lWzVdLGM9ZVs2XSxsPWVbN10saD1lWzhdLGQ9ZVs5XSxwPWVbMTBdLGc9ZVsxMV0sdj1lWzEyXSx5PWVbMTNdLG09ZVsxNF0sYj1lWzE1XTtmLmUuc2V0KHRoaXMucGxhbmVzWzBdLm5vcm1hbCxhLW4sbC1zLGctaCksdGhpcy5wbGFuZXNbMF0uZGlzdGFuY2U9LShiLXYpLGYuZS5zZXQodGhpcy5wbGFuZXNbMV0ubm9ybWFsLGErbixsK3MsZytoKSx0aGlzLnBsYW5lc1sxXS5kaXN0YW5jZT0tKGIrdiksZi5lLnNldCh0aGlzLnBsYW5lc1syXS5ub3JtYWwsYStyLGwrdSxnK2QpLHRoaXMucGxhbmVzWzJdLmRpc3RhbmNlPS0oYit5KSxmLmUuc2V0KHRoaXMucGxhbmVzWzNdLm5vcm1hbCxhLXIsbC11LGctZCksdGhpcy5wbGFuZXNbM10uZGlzdGFuY2U9LShiLXkpLGYuZS5zZXQodGhpcy5wbGFuZXNbNF0ubm9ybWFsLGEtaSxsLWMsZy1wKSx0aGlzLnBsYW5lc1s0XS5kaXN0YW5jZT0tKGItbSksZi5lLnNldCh0aGlzLnBsYW5lc1s1XS5ub3JtYWwsYStpLGwrYyxnK3ApLHRoaXMucGxhbmVzWzVdLmRpc3RhbmNlPS0oYittKSx0aGlzLnBsYW5lcy5mb3JFYWNoKChmdW5jdGlvbih0KXt0Lm5vcm1hbGl6ZSgpLHQudXBkYXRlUE5WZXJ0ZXhGbGFnKCl9KSl9fV0pLHR9KCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc0KSxpPW4oMzAyKSxvPW4oMzAzKSxhPXI/ci50b1N0cmluZ1RhZzp2b2lkIDA7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/XCJbb2JqZWN0IFVuZGVmaW5lZF1cIjpcIltvYmplY3QgTnVsbF1cIjphJiZhIGluIE9iamVjdCh0KT9pKHQpOm8odCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxODIpLGk9bigxNDgpLG89big1NCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvKHQpP3IodCk6aSh0KX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLnRhZ1Byb3BlcnR5PWUudGFnUGFyYW1ldGVyPWUuZGVjb3JhdGU9dm9pZCAwO3ZhciByPW4oNDEpLGk9bigzMSk7ZnVuY3Rpb24gbyh0LGUsbixpLG8pe3ZhciBhPXt9LHM9XCJudW1iZXJcIj09dHlwZW9mIG8sdT12b2lkIDAhPT1vJiZzP28udG9TdHJpbmcoKTpuO2lmKHMmJnZvaWQgMCE9PW4pdGhyb3cgbmV3IEVycm9yKHIuSU5WQUxJRF9ERUNPUkFUT1JfT1BFUkFUSU9OKTtSZWZsZWN0Lmhhc093bk1ldGFkYXRhKHQsZSkmJihhPVJlZmxlY3QuZ2V0TWV0YWRhdGEodCxlKSk7dmFyIGM9YVt1XTtpZihBcnJheS5pc0FycmF5KGMpKWZvcih2YXIgZj0wLGw9YztmPGwubGVuZ3RoO2YrKyl7dmFyIGg9bFtmXTtpZihoLmtleT09PWkua2V5KXRocm93IG5ldyBFcnJvcihyLkRVUExJQ0FURURfTUVUQURBVEErXCIgXCIraC5rZXkudG9TdHJpbmcoKSl9ZWxzZSBjPVtdO2MucHVzaChpKSxhW3VdPWMsUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSh0LGEsZSl9ZnVuY3Rpb24gYSh0LGUpe1JlZmxlY3QuZGVjb3JhdGUodCxlKX1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7ZShuLHIsdCl9fWUudGFnUGFyYW1ldGVyPWZ1bmN0aW9uKHQsZSxuLHIpe28oaS5UQUdHRUQsdCxlLHIsbil9LGUudGFnUHJvcGVydHk9ZnVuY3Rpb24odCxlLG4pe28oaS5UQUdHRURfUFJPUCx0LmNvbnN0cnVjdG9yLGUsbil9LGUuZGVjb3JhdGU9ZnVuY3Rpb24odCxlLG4pe1wibnVtYmVyXCI9PXR5cGVvZiBuP2EoW3Mobix0KV0sZSk6XCJzdHJpbmdcIj09dHlwZW9mIG4/UmVmbGVjdC5kZWNvcmF0ZShbdF0sZSxuKTphKFt0XSxlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ2MyksaT1uKDQ2NCksbz1uKDIzMyksYT1uKDQ2NSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCl8fGkodCxlKXx8byh0LGUpfHxhKCl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7big4MSksbigyMSk7dmFyIHI9bigyNjcpO24uZChlLFwiQ2FudmFzXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHIuYX0pKTtuKDc5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjU2KSxpPW4oMjU1KSxvPW4oMjYzKSxhPW4oMTY3KSxzPW4oMjY0KSx1PVswLDBdO3QuZXhwb3J0cy5jb21wdXRlTWl0ZXI9ZnVuY3Rpb24odCxlLG4sYSxjKXtyZXR1cm4gcih0LG4sYSksbyh0LHQpLGkoZSwtdFsxXSx0WzBdKSxpKHUsLW5bMV0sblswXSksYy9zKGUsdSl9LHQuZXhwb3J0cy5ub3JtYWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaSh0LC1lWzFdLGVbMF0pLHR9LHQuZXhwb3J0cy5kaXJlY3Rpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBhKHQsZSxuKSxvKHQsdCksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMwMSksaT1uKDMwNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0LGUpO3JldHVybiByKG4pP246dm9pZCAwfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTgyKSxpPW4oMzI2KSxvPW4oNTQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KT9yKHQsITApOmkodCl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLmlkPXZvaWQgMDt2YXIgcj0wO2UuaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gcisrfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYlwiLChmdW5jdGlvbigpe3JldHVybiBvfSkpLG4uZChlLFwiY1wiLChmdW5jdGlvbigpe3JldHVybiBhfSkpLG4uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiBzfSkpO3ZhciByPW4oMTkpLGk9bigxMTgpO2Z1bmN0aW9uIG8odCxlLG4pe3ZhciBpPTE7cmV0dXJuIE9iamVjdChyLmgpKHQpJiYoaT10LnNwbGl0KFwiXFxuXCIpLmxlbmd0aCksaT4xP2UqaStmdW5jdGlvbih0LGUpe3JldHVybiBlP2UtdDouMTQqdH0oZSxuKSooaS0xKTplfWZ1bmN0aW9uIGEodCxlKXt2YXIgbj1PYmplY3QoaS5hKSgpLG89MDtpZihPYmplY3Qoci5lKSh0KXx8XCJcIj09PXQpcmV0dXJuIG87aWYobi5zYXZlKCksbi5mb250PWUsT2JqZWN0KHIuaCkodCkmJnQuaW5jbHVkZXMoXCJcXG5cIikpe3ZhciBhPXQuc3BsaXQoXCJcXG5cIik7T2JqZWN0KHIuYSkoYSwoZnVuY3Rpb24odCl7dmFyIGU9bi5tZWFzdXJlVGV4dCh0KS53aWR0aDtvPGUmJihvPWUpfSkpfWVsc2Ugbz1uLm1lYXN1cmVUZXh0KHQpLndpZHRoO3JldHVybiBuLnJlc3RvcmUoKSxvfWZ1bmN0aW9uIHModCl7dmFyIGU9dC5mb250U2l6ZSxuPXQuZm9udEZhbWlseSxyPXQuZm9udFdlaWdodDtyZXR1cm5bdC5mb250U3R5bGUsdC5mb250VmFyaWFudCxyLGUrXCJweFwiLG5dLmpvaW4oXCIgXCIpLnRyaW0oKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUn0pKTt2YXIgcixpLG8sYSxzLHUsYyxmLGwsaCxkLHAsZyx2PW4oOSkseT1uLm4odiksbT1uKDE0KSxiPW4ubihtKSx4PW4oMTApLHc9bi5uKHgpLFM9big2KSxFPW4ubihTKSxfPW4oNyksTz1uLm4oXyksaz1uKDExKSxNPW4ubihrKSxBPShuKDI4KSxuKDUpKSxUPW4oMTMpLEM9bigxNDEpLEk9big1MCk7ZnVuY3Rpb24gUCh0LGUpe3ZhciBuO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PXRbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheSh0KXx8KG49ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpcmV0dXJuIGoodCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PW4mJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PW58fFwiU2V0XCI9PT1uKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKFwiQXJndW1lbnRzXCI9PT1ufHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gaih0LGUpfSh0KSl8fGUmJnQmJlwibnVtYmVyXCI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9dmFyIG8sYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj10W1N5bWJvbC5pdGVyYXRvcl0oKX0sbjpmdW5jdGlvbigpe3ZhciB0PW4ubmV4dCgpO3JldHVybiBhPXQuZG9uZSx0fSxlOmZ1bmN0aW9uKHQpe3M9ITAsbz10fSxmOmZ1bmN0aW9uKCl7dHJ5e2F8fG51bGw9PW4ucmV0dXJufHxuLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBvfX19fWZ1bmN0aW9uIGoodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn12YXIgRD0xLE49MixSPShyPU9iamVjdChBLmluamVjdGFibGUpKCksaT1PYmplY3QoQS5pbmplY3QpKFQuYS5SZW5kZXJFbmdpbmUpLG89T2JqZWN0KEEuaW5qZWN0KShULmEuUmVzb3VyY2VQb29sKSxhPU9iamVjdChBLmluamVjdCkoVC5hLlJlbmRlclBhc3NGYWN0b3J5KSxzPU9iamVjdChBLmluamVjdCkoVC5hLk1lc2hDb21wb25lbnRNYW5hZ2VyKSxyKChnPXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9dGhpcztFKCkodGhpcyx0KSx3KCkodGhpcyxcImVuZ2luZVwiLGYsdGhpcyksdygpKHRoaXMsXCJyZXNvdXJjZVBvb2xcIixsLHRoaXMpLHcoKSh0aGlzLFwicmVuZGVyUGFzc0ZhY3RvcnlcIixoLHRoaXMpLHcoKSh0aGlzLFwibWVzaFwiLGQsdGhpcyksdGhpcy5waWNraW5nRkJPPXZvaWQgMCx0aGlzLnZpZXdzPXZvaWQgMCx0aGlzLmhpZ2hsaWdodEVuYWJsZWQ9ITAsdGhpcy5oaWdobGlnaHRDb2xvcj1bMjU1LDAsMCwyNTVdLHRoaXMuYWxyZWFkeUluUmVuZGVyaW5nPSExLHRoaXMuc2V0dXA9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuY3JlYXRlUmVuZGVyVGFyZ2V0KGUsXCJwaWNraW5nIGZib1wiLHt3aWR0aDoxLGhlaWdodDoxfSk7bi5kYXRhPXtvdXRwdXQ6ZS53cml0ZSh0LHIpfSxlLmhhc1NpZGVFZmZlY3Q9ITB9LHRoaXMuZXhlY3V0ZT1mdW5jdGlvbigpe3ZhciB0PWIoKSh5LmEubWFyaygoZnVuY3Rpb24gdChuLHIsaSl7dmFyIG8sYSxzO3JldHVybiB5LmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYoZS52aWV3cz1pLCFlLmFscmVhZHlJblJlbmRlcmluZyl7dC5uZXh0PTM7YnJlYWt9cmV0dXJuIHQuYWJydXB0KFwicmV0dXJuXCIpO2Nhc2UgMzpvPVAoaSk7dHJ5e2ZvcihzPWZ1bmN0aW9uKCl7dmFyIHQ9YS52YWx1ZSxpPXQuZ2V0Vmlld3BvcnQoKSxvPWkud2lkdGgscz1pLmhlaWdodDtlLmFscmVhZHlJblJlbmRlcmluZz0hMDt2YXIgdT1uLmdldFJlc291cmNlTm9kZShyLmRhdGEub3V0cHV0KTtlLnBpY2tpbmdGQk89ZS5yZXNvdXJjZVBvb2wuZ2V0T3JDcmVhdGVSZXNvdXJjZSh1LnJlc291cmNlKSxlLnBpY2tpbmdGQk8ucmVzaXplKHt3aWR0aDpvLGhlaWdodDpzfSksZS5lbmdpbmUudXNlRnJhbWVidWZmZXIoZS5waWNraW5nRkJPLChmdW5jdGlvbigpe2UuZW5naW5lLmNsZWFyKHtmcmFtZWJ1ZmZlcjplLnBpY2tpbmdGQk8sY29sb3I6WzAsMCwwLDBdLHN0ZW5jaWw6MCxkZXB0aDoxfSk7dmFyIG4scj1lLnJlbmRlclBhc3NGYWN0b3J5KEkuYS5JREVOVElGSUVSKSxpPVtdLG89UCh0LmdldFNjZW5lKCkuZ2V0RW50aXRpZXMoKSk7dHJ5e2ZvcihvLnMoKTshKG49by5uKCkpLmRvbmU7KXt2YXIgYT1uLnZhbHVlLHM9ZS5tZXNoLmdldENvbXBvbmVudEJ5RW50aXR5KGEpO3MubWF0ZXJpYWwuc2V0VW5pZm9ybShcInVfUGlja2luZ1N0YWdlXCIsRCksaS5wdXNoKHMpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX1yLnJlbmRlclZpZXcodCksaS5mb3JFYWNoKChmdW5jdGlvbih0KXt0Lm1hdGVyaWFsLnNldFVuaWZvcm0oXCJ1X1BpY2tpbmdTdGFnZVwiLE4pfSkpLGUuYWxyZWFkeUluUmVuZGVyaW5nPSExfSkpfSxvLnMoKTshKGE9by5uKCkpLmRvbmU7KXMoKX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX1jYXNlIDU6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCksdGhpcy5waWNrPWZ1bmN0aW9uKHQsbil7dmFyIHIsaSxvPXQueCxhPXQueSxzPWUuZW5naW5lLHU9cy5yZWFkUGl4ZWxzLGM9cy51c2VGcmFtZWJ1ZmZlcixmPW4uZ2V0Vmlld3BvcnQoKSxsPWYud2lkdGgsaD1mLmhlaWdodCxkPW8qd2luZG93LmRldmljZVBpeGVsUmF0aW8scD1hKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO2lmKCEoZD5sfHxkPDB8fHA+aHx8cDwwKSlyZXR1cm4gYyhlLnBpY2tpbmdGQk8sKGZ1bmN0aW9uKCl7MD09PShyPXUoe3g6TWF0aC5yb3VuZChkKSx5Ok1hdGgucm91bmQoaC0oYSsxKSp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyksd2lkdGg6MSxoZWlnaHQ6MSxkYXRhOm5ldyBVaW50OEFycmF5KDQpLGZyYW1lYnVmZmVyOmUucGlja2luZ0ZCT30pKVswXSYmMD09PXJbMV0mJjA9PT1yWzJdfHwoaT1PYmplY3QoQy5hKShyKSxlLmhpZ2hsaWdodEVuYWJsZWQmJmUuaGlnaGxpZ2h0UGlja2VkRmVhdHVyZShyLG4pKX0pKSxpfX1yZXR1cm4gTygpKHQsW3trZXk6XCJlbmFibGVIaWdobGlnaHRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmhpZ2hsaWdodEVuYWJsZWQ9dH19LHtrZXk6XCJzZXRIaWdobGlnaHRDb2xvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuaGlnaGxpZ2h0Q29sb3I9dH19LHtrZXk6XCJoaWdobGlnaHRQaWNrZWRGZWF0dXJlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih0KXt2YXIgbixyPVAoZS5nZXRTY2VuZSgpLmdldEVudGl0aWVzKCkpO3RyeXtmb3Ioci5zKCk7IShuPXIubigpKS5kb25lOyl7dmFyIGk9bi52YWx1ZSxvPXRoaXMubWVzaC5nZXRDb21wb25lbnRCeUVudGl0eShpKS5tYXRlcmlhbDtvLnNldFVuaWZvcm0oXCJ1X1BpY2tpbmdTdGFnZVwiLE4pLG8uc2V0VW5pZm9ybShcInVfUGlja2luZ0NvbG9yXCIsW3RbMF0sdFsxXSx0WzJdXSksby5zZXRVbmlmb3JtKFwidV9IaWdobGlnaHRDb2xvclwiLHRoaXMuaGlnaGxpZ2h0Q29sb3IpfX1jYXRjaCh0KXtyLmUodCl9ZmluYWxseXtyLmYoKX19fX1dKSx0fSgpLHAuSURFTlRJRklFUj1cIlBpeGVsUGlja2luZyBQYXNzXCIsYz1nLGY9TSgpKGMucHJvdG90eXBlLFwiZW5naW5lXCIsW2ldLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksbD1NKCkoYy5wcm90b3R5cGUsXCJyZXNvdXJjZVBvb2xcIixbb10se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxoPU0oKShjLnByb3RvdHlwZSxcInJlbmRlclBhc3NGYWN0b3J5XCIsW2FdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksZD1NKCkoYy5wcm90b3R5cGUsXCJtZXNoXCIsW3NdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksdT1jKSl8fHUpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSksbi5kKGUsXCJiXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSk7dmFyIHI9bigzNCksaT1uKDI1KTtmdW5jdGlvbiBvKHQsZSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmRyYXcodCl9KSl9ZnVuY3Rpb24gYSh0LGUpe3ZhciBuPXQuZ2V0KFwiY2FudmFzXCIpO2lmKG4mJm4uZ2V0KFwiYXV0b0RyYXdcIikpe3ZhciBvPW4uZ2V0KFwiY29udGV4dFwiKSxhPXQuZ2V0UGFyZW50KCkscz1hP2EuZ2V0Q2hpbGRyZW4oKTpbbl0sdT10LmdldChcImVsXCIpO2lmKFwicmVtb3ZlXCI9PT1lKWlmKHQuZ2V0KFwiaXNDbGlwU2hhcGVcIikpe3ZhciBjPXUmJnUucGFyZW50Tm9kZSxmPWMmJmMucGFyZW50Tm9kZTtjJiZmJiZmLnJlbW92ZUNoaWxkKGMpfWVsc2UgdSYmdS5wYXJlbnROb2RlJiZ1LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodSk7ZWxzZSBpZihcInNob3dcIj09PWUpdS5zZXRBdHRyaWJ1dGUoXCJ2aXNpYmlsaXR5XCIsXCJ2aXNpYmxlXCIpO2Vsc2UgaWYoXCJoaWRlXCI9PT1lKXUuc2V0QXR0cmlidXRlKFwidmlzaWJpbGl0eVwiLFwiaGlkZGVuXCIpO2Vsc2UgaWYoXCJ6SW5kZXhcIj09PWUpT2JqZWN0KGkuYykodSxzLmluZGV4T2YodCkpO2Vsc2UgaWYoXCJzb3J0XCI9PT1lKXt2YXIgbD10LmdldChcImNoaWxkcmVuXCIpO2wmJmwubGVuZ3RoJiZPYmplY3QoaS5kKSh0LChmdW5jdGlvbih0LGUpe3JldHVybiBsLmluZGV4T2YodCktbC5pbmRleE9mKGUpPzE6MH0pKX1lbHNlXCJjbGVhclwiPT09ZT91JiYodS5pbm5lckhUTUw9XCJcIik6XCJtYXRyaXhcIj09PWU/T2JqZWN0KHIuYykodCk6XCJjbGlwXCI9PT1lP09iamVjdChyLmEpKHQsbyk6XCJhdHRyXCI9PT1lfHxcImFkZFwiPT09ZSYmdC5kcmF3KG8pfX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0LndlYnBhY2tQb2x5ZmlsbHx8KHQuZGVwcmVjYXRlPWZ1bmN0aW9uKCl7fSx0LnBhdGhzPVtdLHQuY2hpbGRyZW58fCh0LmNoaWxkcmVuPVtdKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImxvYWRlZFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0Lmx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJpZFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0Lml9fSksdC53ZWJwYWNrUG9seWZpbGw9MSksdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDUpLlN5bWJvbDt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbih0KXtmdW5jdGlvbiByKHQpe3JldHVybihyPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX12YXIgaT1uKDQ1KSxvPW4oMzIyKSxhPVwib2JqZWN0XCI9PXIoZSkmJmUmJiFlLm5vZGVUeXBlJiZlLHM9YSYmXCJvYmplY3RcIj09cih0KSYmdCYmIXQubm9kZVR5cGUmJnQsdT1zJiZzLmV4cG9ydHM9PT1hP2kuQnVmZmVyOnZvaWQgMCxjPSh1P3UuaXNCdWZmZXI6dm9pZCAwKXx8bzt0LmV4cG9ydHM9Y30pLmNhbGwodGhpcyxuKDcyKSh0KSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMzMSksaT1uKDE0Myksbz1uKDMzMiksYT1uKDE5MSkscz1uKDMzMyksdT1uKDU5KSxjPW4oMTgwKSxmPWMociksbD1jKGkpLGg9YyhvKSxkPWMoYSkscD1jKHMpLGc9dTsociYmXCJbb2JqZWN0IERhdGFWaWV3XVwiIT1nKG5ldyByKG5ldyBBcnJheUJ1ZmZlcigxKSkpfHxpJiZcIltvYmplY3QgTWFwXVwiIT1nKG5ldyBpKXx8byYmXCJbb2JqZWN0IFByb21pc2VdXCIhPWcoby5yZXNvbHZlKCkpfHxhJiZcIltvYmplY3QgU2V0XVwiIT1nKG5ldyBhKXx8cyYmXCJbb2JqZWN0IFdlYWtNYXBdXCIhPWcobmV3IHMpKSYmKGc9ZnVuY3Rpb24odCl7dmFyIGU9dSh0KSxuPVwiW29iamVjdCBPYmplY3RdXCI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAscj1uP2Mobik6XCJcIjtpZihyKXN3aXRjaChyKXtjYXNlIGY6cmV0dXJuXCJbb2JqZWN0IERhdGFWaWV3XVwiO2Nhc2UgbDpyZXR1cm5cIltvYmplY3QgTWFwXVwiO2Nhc2UgaDpyZXR1cm5cIltvYmplY3QgUHJvbWlzZV1cIjtjYXNlIGQ6cmV0dXJuXCJbb2JqZWN0IFNldF1cIjtjYXNlIHA6cmV0dXJuXCJbb2JqZWN0IFdlYWtNYXBdXCJ9cmV0dXJuIGV9KSx0LmV4cG9ydHM9Z30sZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIHIodCl7cmV0dXJuKHI9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfXZhciBpPW4oNTkpLG89big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwic3ltYm9sXCI9PXIodCl8fG8odCkmJlwiW29iamVjdCBTeW1ib2xdXCI9PWkodCl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigxKSxpPW4oMjEpLG89big1NyksYT1uKDMwKSxzPW4oMCksdT1uKDE2KSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLm9uQ2FudmFzQ2hhbmdlPWZ1bmN0aW9uKHQpe09iamVjdChhLmgpKHRoaXMsdCl9LGUucHJvdG90eXBlLmdldFNoYXBlQmFzZT1mdW5jdGlvbigpe3JldHVybiBvfSxlLnByb3RvdHlwZS5nZXRHcm91cEJhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5wcm90b3R5cGUuX2FwcGx5Q2xpcD1mdW5jdGlvbih0LGUpe2UmJih0LnNhdmUoKSxPYmplY3QoYS5hKSh0LGUpLGUuY3JlYXRlUGF0aCh0KSx0LnJlc3RvcmUoKSx0LmNsaXAoKSxlLl9hZnRlckRyYXcoKSl9LGUucHJvdG90eXBlLmNhY2hlQ2FudmFzQkJveD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY2ZnLmNoaWxkcmVuLGU9W10sbj1bXTtPYmplY3Qocy5mKSh0LChmdW5jdGlvbih0KXt2YXIgcj10LmNmZy5jYWNoZUNhbnZhc0JCb3g7ciYmdC5jZmcuaXNJblZpZXcmJihlLnB1c2goci5taW5YLHIubWF4WCksbi5wdXNoKHIubWluWSxyLm1heFkpKX0pKTt2YXIgcj1udWxsO2lmKGUubGVuZ3RoKXt2YXIgaT1NYXRoLm1pbi5hcHBseShudWxsLGUpLG89TWF0aC5tYXguYXBwbHkobnVsbCxlKSxhPU1hdGgubWluLmFwcGx5KG51bGwsbiksYz1NYXRoLm1heC5hcHBseShudWxsLG4pO3I9e21pblg6aSxtaW5ZOmEseDppLHk6YSxtYXhYOm8sbWF4WTpjLHdpZHRoOm8taSxoZWlnaHQ6Yy1hfTt2YXIgZj10aGlzLmNmZy5jYW52YXM7aWYoZil7dmFyIGw9Zi5nZXRWaWV3UmFuZ2UoKTt0aGlzLnNldChcImlzSW5WaWV3XCIsT2JqZWN0KHUuZikocixsKSl9fWVsc2UgdGhpcy5zZXQoXCJpc0luVmlld1wiLCExKTt0aGlzLnNldChcImNhY2hlQ2FudmFzQkJveFwiLHIpfSxlLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jZmcuY2hpbGRyZW4scj0hZXx8dGhpcy5jZmcucmVmcmVzaDtuLmxlbmd0aCYmciYmKHQuc2F2ZSgpLE9iamVjdChhLmEpKHQsdGhpcyksdGhpcy5fYXBwbHlDbGlwKHQsdGhpcy5nZXRDbGlwKCkpLE9iamVjdChhLmQpKHQsbixlKSx0LnJlc3RvcmUoKSx0aGlzLmNhY2hlQ2FudmFzQkJveCgpKSx0aGlzLmNmZy5yZWZyZXNoPW51bGwsdGhpcy5zZXQoXCJoYXNDaGFuZ2VkXCIsITEpfSxlLnByb3RvdHlwZS5za2lwRHJhdz1mdW5jdGlvbigpe3RoaXMuc2V0KFwiY2FjaGVDYW52YXNCQm94XCIsbnVsbCksdGhpcy5zZXQoXCJoYXNDaGFuZ2VkXCIsITEpfSxlfShpLkFic3RyYWN0R3JvdXApO2UuYT1jfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigxKSxpPW4oMjEpLG89bigwKSxhPW4oODEpLHM9big3MSksdT1uKDM0KSxjPW4oMTUpLGY9bigyNSksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5pc0VudGl0eUdyb3VwPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmNyZWF0ZURvbT1mdW5jdGlvbigpe3ZhciB0PU9iamVjdChmLmIpKFwiZ1wiKTt0aGlzLnNldChcImVsXCIsdCk7dmFyIGU9dGhpcy5nZXRQYXJlbnQoKTtpZihlKXt2YXIgbj1lLmdldChcImVsXCIpO258fChuPWUuY3JlYXRlRG9tKCksZS5zZXQoXCJlbFwiLG4pKSxuLmFwcGVuZENoaWxkKHQpfXJldHVybiB0fSxlLnByb3RvdHlwZS5hZnRlckF0dHJzQ2hhbmdlPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmFmdGVyQXR0cnNDaGFuZ2UuY2FsbCh0aGlzLGUpO3ZhciBuPXRoaXMuZ2V0KFwiY2FudmFzXCIpO2lmKG4mJm4uZ2V0KFwiYXV0b0RyYXdcIikpe3ZhciByPW4uZ2V0KFwiY29udGV4dFwiKTt0aGlzLmNyZWF0ZVBhdGgocixlKX19LGUucHJvdG90eXBlLm9uQ2FudmFzQ2hhbmdlPWZ1bmN0aW9uKHQpe09iamVjdChzLmIpKHRoaXMsdCl9LGUucHJvdG90eXBlLmdldFNoYXBlQmFzZT1mdW5jdGlvbigpe3JldHVybiBhfSxlLnByb3RvdHlwZS5nZXRHcm91cEJhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldENoaWxkcmVuKCksbj10aGlzLmdldChcImVsXCIpO3RoaXMuZ2V0KFwiZGVzdHJveWVkXCIpP24mJm4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKToobnx8dGhpcy5jcmVhdGVEb20oKSxPYmplY3QodS5hKSh0aGlzLHQpLHRoaXMuY3JlYXRlUGF0aCh0KSxlLmxlbmd0aCYmT2JqZWN0KHMuYSkodCxlKSl9LGUucHJvdG90eXBlLmNyZWF0ZVBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmF0dHIoKSxyPXRoaXMuZ2V0KFwiZWxcIik7T2JqZWN0KG8uZikoZXx8biwoZnVuY3Rpb24odCxlKXtjLmJbZV0mJnIuc2V0QXR0cmlidXRlKGMuYltlXSx0KX0pKSxPYmplY3QodS5jKSh0aGlzKX0sZX0oaS5BYnN0cmFjdEdyb3VwKTtlLmE9bH0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiB1fSkpO3ZhciByPW4oNiksaT1uLm4ociksbz1uKDcpLGE9bi5uKG8pLHM9bigyKSx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe2koKSh0aGlzLHQpLHRoaXMuY2VudGVyPXZvaWQgMCx0aGlzLmhhbGZFeHRlbnRzPXZvaWQgMCx0aGlzLm1pbj1zLmUuY3JlYXRlKCksdGhpcy5tYXg9cy5lLmNyZWF0ZSgpLHRoaXMudXBkYXRlKGUsbil9cmV0dXJuIGEoKSh0LFt7a2V5OlwidXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLmNlbnRlcj10fHxzLmUuY3JlYXRlKCksdGhpcy5oYWxmRXh0ZW50cz1lfHxzLmUuZnJvbVZhbHVlcyguNSwuNSwuNSksdGhpcy5taW49cy5lLnN1Yih0aGlzLm1pbix0aGlzLmNlbnRlcix0aGlzLmhhbGZFeHRlbnRzKSx0aGlzLm1heD1zLmUuYWRkKHRoaXMubWF4LHRoaXMuY2VudGVyLHRoaXMuaGFsZkV4dGVudHMpfX0se2tleTpcInNldE1pbk1heFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cy5lLmFkZCh0aGlzLmNlbnRlcixlLHQpLHMuZS5zY2FsZSh0aGlzLmNlbnRlcix0aGlzLmNlbnRlciwuNSkscy5lLnN1Yih0aGlzLmhhbGZFeHRlbnRzLGUsdCkscy5lLnNjYWxlKHRoaXMuaGFsZkV4dGVudHMsdGhpcy5oYWxmRXh0ZW50cywuNSkscy5lLmNvcHkodGhpcy5taW4sdCkscy5lLmNvcHkodGhpcy5tYXgsZSl9fSx7a2V5OlwiZ2V0TWluXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5taW59fSx7a2V5OlwiZ2V0TWF4XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXh9fSx7a2V5OlwiYWRkXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jZW50ZXIsbj1lWzBdLHI9ZVsxXSxpPWVbMl0sbz10aGlzLmhhbGZFeHRlbnRzLGE9b1swXSxzPW9bMV0sdT1vWzJdLGM9bi1hLGY9bithLGw9ci1zLGg9citzLGQ9aS11LHA9aSt1LGc9dC5jZW50ZXIsdj1nWzBdLHk9Z1sxXSxtPWdbMl0sYj10LmhhbGZFeHRlbnRzLHg9YlswXSx3PWJbMV0sUz1iWzJdLEU9di14LF89dit4LE89eS13LGs9eSt3LE09bS1TLEE9bStTO0U8YyYmKGM9RSksXz5mJiYoZj1fKSxPPGwmJihsPU8pLGs+aCYmKGg9ayksTTxkJiYoZD1NKSxBPnAmJihwPUEpLGVbMF09LjUqKGMrZiksZVsxXT0uNSoobCtoKSxlWzJdPS41KihkK3ApLG9bMF09LjUqKGYtYyksb1sxXT0uNSooaC1sKSxvWzJdPS41KihwLWQpLHRoaXMubWluWzBdPWMsdGhpcy5taW5bMV09bCx0aGlzLm1pblsyXT1kLHRoaXMubWF4WzBdPWYsdGhpcy5tYXhbMV09aCx0aGlzLm1heFsyXT1wfX0se2tleTpcImludGVyc2VjdHNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldE1heCgpLG49dGhpcy5nZXRNaW4oKSxyPXQuZ2V0TWF4KCksaT10LmdldE1pbigpO3JldHVybiBuWzBdPD1yWzBdJiZlWzBdPj1pWzBdJiZuWzFdPD1yWzFdJiZlWzFdPj1pWzFdJiZuWzJdPD1yWzJdJiZlWzJdPj1pWzJdfX0se2tleTpcImNvbnRhaW5zUG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldE1pbigpLG49dGhpcy5nZXRNYXgoKTtyZXR1cm4hKHRbMF08ZVswXXx8dFswXT5uWzBdfHx0WzFdPGVbMV18fHRbMV0+blsxXXx8dFsyXTxlWzJdfHx0WzJdPm5bMl0pfX0se2tleTpcImdldE5lZ2F0aXZlRmFyUG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gMjczPT09dC5wblZlcnRleEZsYWc/cy5lLmNvcHkocy5lLmNyZWF0ZSgpLHRoaXMubWluKToyNzI9PT10LnBuVmVydGV4RmxhZz9zLmUuZnJvbVZhbHVlcyh0aGlzLm1pblswXSx0aGlzLm1pblsxXSx0aGlzLm1heFsyXSk6MjU3PT09dC5wblZlcnRleEZsYWc/cy5lLmZyb21WYWx1ZXModGhpcy5taW5bMF0sdGhpcy5tYXhbMV0sdGhpcy5taW5bMl0pOjI1Nj09PXQucG5WZXJ0ZXhGbGFnP3MuZS5mcm9tVmFsdWVzKHRoaXMubWluWzBdLHRoaXMubWF4WzFdLHRoaXMubWF4WzJdKToxNz09PXQucG5WZXJ0ZXhGbGFnP3MuZS5mcm9tVmFsdWVzKHRoaXMubWF4WzBdLHRoaXMubWluWzFdLHRoaXMubWluWzJdKToxNj09PXQucG5WZXJ0ZXhGbGFnP3MuZS5mcm9tVmFsdWVzKHRoaXMubWF4WzBdLHRoaXMubWluWzFdLHRoaXMubWF4WzJdKToxPT09dC5wblZlcnRleEZsYWc/cy5lLmZyb21WYWx1ZXModGhpcy5tYXhbMF0sdGhpcy5tYXhbMV0sdGhpcy5taW5bMl0pOnMuZS5mcm9tVmFsdWVzKHRoaXMubWF4WzBdLHRoaXMubWF4WzFdLHRoaXMubWF4WzJdKX19LHtrZXk6XCJnZXRQb3NpdGl2ZUZhclBvaW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIDI3Mz09PXQucG5WZXJ0ZXhGbGFnP3MuZS5jb3B5KHMuZS5jcmVhdGUoKSx0aGlzLm1heCk6MjcyPT09dC5wblZlcnRleEZsYWc/cy5lLmZyb21WYWx1ZXModGhpcy5tYXhbMF0sdGhpcy5tYXhbMV0sdGhpcy5taW5bMl0pOjI1Nz09PXQucG5WZXJ0ZXhGbGFnP3MuZS5mcm9tVmFsdWVzKHRoaXMubWF4WzBdLHRoaXMubWluWzFdLHRoaXMubWF4WzJdKToyNTY9PT10LnBuVmVydGV4RmxhZz9zLmUuZnJvbVZhbHVlcyh0aGlzLm1heFswXSx0aGlzLm1pblsxXSx0aGlzLm1pblsyXSk6MTc9PT10LnBuVmVydGV4RmxhZz9zLmUuZnJvbVZhbHVlcyh0aGlzLm1pblswXSx0aGlzLm1heFsxXSx0aGlzLm1heFsyXSk6MTY9PT10LnBuVmVydGV4RmxhZz9zLmUuZnJvbVZhbHVlcyh0aGlzLm1pblswXSx0aGlzLm1heFsxXSx0aGlzLm1pblsyXSk6MT09PXQucG5WZXJ0ZXhGbGFnP3MuZS5mcm9tVmFsdWVzKHRoaXMubWluWzBdLHRoaXMubWluWzFdLHRoaXMubWF4WzJdKTpzLmUuZnJvbVZhbHVlcyh0aGlzLm1pblswXSx0aGlzLm1pblsxXSx0aGlzLm1pblsyXSl9fV0pLHR9KCl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJCYXNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSksbi5kKGUsXCJDaXJjbGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZH0pKSxuLmQoZSxcIkRvbVwiLChmdW5jdGlvbigpe3JldHVybiBwfSkpLG4uZChlLFwiRWxsaXBzZVwiLChmdW5jdGlvbigpe3JldHVybiBnfSkpLG4uZChlLFwiSW1hZ2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdn0pKSxuLmQoZSxcIkxpbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbX0pKSxuLmQoZSxcIk1hcmtlclwiLChmdW5jdGlvbigpe3JldHVybiB3fSkpLG4uZChlLFwiUGF0aFwiLChmdW5jdGlvbigpe3JldHVybiBTfSkpLG4uZChlLFwiUG9seWdvblwiLChmdW5jdGlvbigpe3JldHVybiBFfSkpLG4uZChlLFwiUG9seWxpbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gX30pKSxuLmQoZSxcIlJlY3RcIiwoZnVuY3Rpb24oKXtyZXR1cm4gT30pKSxuLmQoZSxcIlRleHRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQ30pKTt2YXIgcj17fTtuLnIociksbi5kKHIsXCJCYXNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSksbi5kKHIsXCJDaXJjbGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZH0pKSxuLmQocixcIkRvbVwiLChmdW5jdGlvbigpe3JldHVybiBwfSkpLG4uZChyLFwiRWxsaXBzZVwiLChmdW5jdGlvbigpe3JldHVybiBnfSkpLG4uZChyLFwiSW1hZ2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdn0pKSxuLmQocixcIkxpbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbX0pKSxuLmQocixcIk1hcmtlclwiLChmdW5jdGlvbigpe3JldHVybiB3fSkpLG4uZChyLFwiUGF0aFwiLChmdW5jdGlvbigpe3JldHVybiBTfSkpLG4uZChyLFwiUG9seWdvblwiLChmdW5jdGlvbigpe3JldHVybiBFfSkpLG4uZChyLFwiUG9seWxpbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gX30pKSxuLmQocixcIlJlY3RcIiwoZnVuY3Rpb24oKXtyZXR1cm4gT30pKSxuLmQocixcIlRleHRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQ30pKTt2YXIgaT1uKDEpLG89bigyMSksYT1uKDM0KSxzPW4oMjUpLHU9big3MSksYz1uKDE1KSxmPW4oNzkpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPVwic3ZnXCIsZS5jYW5GaWxsPSExLGUuY2FuU3Ryb2tlPSExLGV9cmV0dXJuIE9iamVjdChpLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdChpLmEpKE9iamVjdChpLmEpKHt9LGUpLHtsaW5lV2lkdGg6MSxsaW5lQXBwZW5kV2lkdGg6MCxzdHJva2VPcGFjaXR5OjEsZmlsbE9wYWNpdHk6MX0pfSxlLnByb3RvdHlwZS5hZnRlckF0dHJzQ2hhbmdlPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmFmdGVyQXR0cnNDaGFuZ2UuY2FsbCh0aGlzLGUpO3ZhciBuPXRoaXMuZ2V0KFwiY2FudmFzXCIpO2lmKG4mJm4uZ2V0KFwiYXV0b0RyYXdcIikpe3ZhciByPW4uZ2V0KFwiY29udGV4dFwiKTt0aGlzLmRyYXcocixlKX19LGUucHJvdG90eXBlLmdldFNoYXBlQmFzZT1mdW5jdGlvbigpe3JldHVybiByfSxlLnByb3RvdHlwZS5nZXRHcm91cEJhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gZi5hfSxlLnByb3RvdHlwZS5vbkNhbnZhc0NoYW5nZT1mdW5jdGlvbih0KXtPYmplY3QodS5iKSh0aGlzLHQpfSxlLnByb3RvdHlwZS5jYWxjdWxhdGVCQm94PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJlbFwiKSxlPW51bGw7aWYodCllPXQuZ2V0QkJveCgpO2Vsc2V7dmFyIG49T2JqZWN0KG8uZ2V0QkJveE1ldGhvZCkodGhpcy5nZXQoXCJ0eXBlXCIpKTtuJiYoZT1uKHRoaXMpKX1pZihlKXt2YXIgcj1lLngsaT1lLnksYT1lLndpZHRoLHM9ZS5oZWlnaHQsdT10aGlzLmdldEhpdExpbmVXaWR0aCgpLGM9dS8yLGY9ci1jLGw9aS1jO3JldHVybnt4OmYseTpsLG1pblg6ZixtaW5ZOmwsbWF4WDpyK2ErYyxtYXhZOmkrcytjLHdpZHRoOmErdSxoZWlnaHQ6cyt1fX1yZXR1cm57eDowLHk6MCxtaW5YOjAsbWluWTowLG1heFg6MCxtYXhZOjAsd2lkdGg6MCxoZWlnaHQ6MH19LGUucHJvdG90eXBlLmlzRmlsbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cigpLGU9dC5maWxsLG49dC5maWxsU3R5bGU7cmV0dXJuKGV8fG58fHRoaXMuaXNDbGlwU2hhcGUoKSkmJnRoaXMuY2FuRmlsbH0sZS5wcm90b3R5cGUuaXNTdHJva2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmF0dHIoKSxlPXQuc3Ryb2tlLG49dC5zdHJva2VTdHlsZTtyZXR1cm4oZXx8bikmJnRoaXMuY2FuU3Ryb2tlfSxlLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXQoXCJlbFwiKTt0aGlzLmdldChcImRlc3Ryb3llZFwiKT9uJiZuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik6KG58fE9iamVjdChzLmEpKHRoaXMpLE9iamVjdChhLmEpKHRoaXMsdCksdGhpcy5jcmVhdGVQYXRoKHQsZSksdGhpcy5zaGFkb3codCxlKSx0aGlzLnN0cm9rZUFuZEZpbGwodCxlKSx0aGlzLnRyYW5zZm9ybShlKSl9LGUucHJvdG90eXBlLmNyZWF0ZVBhdGg9ZnVuY3Rpb24odCxlKXt9LGUucHJvdG90eXBlLnN0cm9rZUFuZEZpbGw9ZnVuY3Rpb24odCxlKXt2YXIgbj1lfHx0aGlzLmF0dHIoKSxyPW4uZmlsbCxpPW4uZmlsbFN0eWxlLG89bi5zdHJva2UsYT1uLnN0cm9rZVN0eWxlLHM9bi5maWxsT3BhY2l0eSx1PW4uc3Ryb2tlT3BhY2l0eSxmPW4ubGluZVdpZHRoLGw9dGhpcy5nZXQoXCJlbFwiKTt0aGlzLmNhbkZpbGwmJihlP1wiZmlsbFwiaW4gbj90aGlzLl9zZXRDb2xvcih0LFwiZmlsbFwiLHIpOlwiZmlsbFN0eWxlXCJpbiBuJiZ0aGlzLl9zZXRDb2xvcih0LFwiZmlsbFwiLGkpOnRoaXMuX3NldENvbG9yKHQsXCJmaWxsXCIscnx8aSkscyYmbC5zZXRBdHRyaWJ1dGUoYy5iLmZpbGxPcGFjaXR5LHMpKSx0aGlzLmNhblN0cm9rZSYmZj4wJiYoZT9cInN0cm9rZVwiaW4gbj90aGlzLl9zZXRDb2xvcih0LFwic3Ryb2tlXCIsbyk6XCJzdHJva2VTdHlsZVwiaW4gbiYmdGhpcy5fc2V0Q29sb3IodCxcInN0cm9rZVwiLGEpOnRoaXMuX3NldENvbG9yKHQsXCJzdHJva2VcIixvfHxhKSx1JiZsLnNldEF0dHJpYnV0ZShjLmIuc3Ryb2tlT3BhY2l0eSx1KSxmJiZsLnNldEF0dHJpYnV0ZShjLmIubGluZVdpZHRoLGYpKX0sZS5wcm90b3R5cGUuX3NldENvbG9yPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLmdldChcImVsXCIpO2lmKG4paWYobj1uLnRyaW0oKSwvXltyLFIsTCxsXXsxfVtcXHNdKlxcKC8udGVzdChuKSkoaT10LmZpbmQoXCJncmFkaWVudFwiLG4pKXx8KGk9dC5hZGRHcmFkaWVudChuKSksci5zZXRBdHRyaWJ1dGUoYy5iW2VdLFwidXJsKCNcIitpK1wiKVwiKTtlbHNlIGlmKC9eW3AsUF17MX1bXFxzXSpcXCgvLnRlc3Qobikpe3ZhciBpOyhpPXQuZmluZChcInBhdHRlcm5cIixuKSl8fChpPXQuYWRkUGF0dGVybihuKSksci5zZXRBdHRyaWJ1dGUoYy5iW2VdLFwidXJsKCNcIitpK1wiKVwiKX1lbHNlIHIuc2V0QXR0cmlidXRlKGMuYltlXSxuKTtlbHNlIHIuc2V0QXR0cmlidXRlKGMuYltlXSxcIm5vbmVcIil9LGUucHJvdG90eXBlLnNoYWRvdz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYXR0cigpLHI9ZXx8bixpPXIuc2hhZG93T2Zmc2V0WCxvPXIuc2hhZG93T2Zmc2V0WSxzPXIuc2hhZG93Qmx1cix1PXIuc2hhZG93Q29sb3I7KGl8fG98fHN8fHUpJiZPYmplY3QoYS5iKSh0aGlzLHQpfSxlLnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRyKCk7KHR8fGUpLm1hdHJpeCYmT2JqZWN0KGEuYykodGhpcyl9LGUucHJvdG90eXBlLmlzSW5TaGFwZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmlzUG9pbnRJblBhdGgodCxlKX0sZS5wcm90b3R5cGUuaXNQb2ludEluUGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0KFwiZWxcIikscj10aGlzLmdldChcImNhbnZhc1wiKS5nZXQoXCJlbFwiKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPXQrci5sZWZ0LG89ZStyLnRvcCxhPWRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoaSxvKTtyZXR1cm4hKCFhfHwhYS5pc0VxdWFsTm9kZShuKSl9LGUucHJvdG90eXBlLmdldEhpdExpbmVXaWR0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cnMsZT10LmxpbmVXaWR0aCxuPXQubGluZUFwcGVuZFdpZHRoO3JldHVybiB0aGlzLmlzU3Ryb2tlKCk/ZStuOjB9LGV9KG8uQWJzdHJhY3RTaGFwZSksaD1uKDApLGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPVwiY2lyY2xlXCIsZS5jYW5GaWxsPSEwLGUuY2FuU3Ryb2tlPSEwLGV9cmV0dXJuIE9iamVjdChpLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdChpLmEpKE9iamVjdChpLmEpKHt9LGUpLHt4OjAseTowLHI6MH0pfSxlLnByb3RvdHlwZS5jcmVhdGVQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5hdHRyKCkscj10aGlzLmdldChcImVsXCIpO09iamVjdChoLmYpKGV8fG4sKGZ1bmN0aW9uKHQsZSl7XCJ4XCI9PT1lfHxcInlcIj09PWU/ci5zZXRBdHRyaWJ1dGUoXCJjXCIrZSx0KTpjLmJbZV0mJnIuc2V0QXR0cmlidXRlKGMuYltlXSx0KX0pKX0sZX0obCkscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLnR5cGU9XCJkb21cIixlLmNhbkZpbGw9ITEsZS5jYW5TdHJva2U9ITEsZX1yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5jcmVhdGVQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5hdHRyKCkscj10aGlzLmdldChcImVsXCIpO2lmKE9iamVjdChoLmYpKGV8fG4sKGZ1bmN0aW9uKHQsZSl7Yy5iW2VdJiZyLnNldEF0dHJpYnV0ZShjLmJbZV0sdCl9KSksXCJmdW5jdGlvblwiPT10eXBlb2Ygbi5odG1sKXt2YXIgaT1uLmh0bWwuY2FsbCh0aGlzLG4pO2lmKGkgaW5zdGFuY2VvZiBFbGVtZW50fHxpIGluc3RhbmNlb2YgSFRNTERvY3VtZW50KXtmb3IodmFyIG89ci5jaGlsZE5vZGVzLGE9by5sZW5ndGgtMTthPj0wO2EtLSlyLnJlbW92ZUNoaWxkKG9bYV0pO3IuYXBwZW5kQ2hpbGQoaSl9ZWxzZSByLmlubmVySFRNTD1pfWVsc2Ugci5pbm5lckhUTUw9bi5odG1sfSxlfShsKSxnPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT1cImVsbGlwc2VcIixlLmNhbkZpbGw9ITAsZS5jYW5TdHJva2U9ITAsZX1yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnM9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0KGkuYSkoT2JqZWN0KGkuYSkoe30sZSkse3g6MCx5OjAscng6MCxyeTowfSl9LGUucHJvdG90eXBlLmNyZWF0ZVBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmF0dHIoKSxyPXRoaXMuZ2V0KFwiZWxcIik7T2JqZWN0KGguZikoZXx8biwoZnVuY3Rpb24odCxlKXtcInhcIj09PWV8fFwieVwiPT09ZT9yLnNldEF0dHJpYnV0ZShcImNcIitlLHQpOmMuYltlXSYmci5zZXRBdHRyaWJ1dGUoYy5iW2VdLHQpfSkpfSxlfShsKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT1cImltYWdlXCIsZS5jYW5GaWxsPSExLGUuY2FuU3Ryb2tlPSExLGV9cmV0dXJuIE9iamVjdChpLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdChpLmEpKE9iamVjdChpLmEpKHt9LGUpLHt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9KX0sZS5wcm90b3R5cGUuY3JlYXRlUGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmF0dHIoKSxpPXRoaXMuZ2V0KFwiZWxcIik7T2JqZWN0KGguZikoZXx8ciwoZnVuY3Rpb24odCxlKXtcImltZ1wiPT09ZT9uLl9zZXRJbWFnZShyLmltZyk6Yy5iW2VdJiZpLnNldEF0dHJpYnV0ZShjLmJbZV0sdCl9KSl9LGUucHJvdG90eXBlLnNldEF0dHI9ZnVuY3Rpb24odCxlKXt0aGlzLmF0dHJzW3RdPWUsXCJpbWdcIj09PXQmJnRoaXMuX3NldEltYWdlKGUpfSxlLnByb3RvdHlwZS5fc2V0SW1hZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRyKCksbj10aGlzLmdldChcImVsXCIpO2lmKE9iamVjdChoLngpKHQpKW4uc2V0QXR0cmlidXRlKFwiaHJlZlwiLHQpO2Vsc2UgaWYodCBpbnN0YW5jZW9mIHdpbmRvdy5JbWFnZSllLndpZHRofHwobi5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLHQud2lkdGgpLHRoaXMuYXR0cihcIndpZHRoXCIsdC53aWR0aCkpLGUuaGVpZ2h0fHwobi5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIix0LmhlaWdodCksdGhpcy5hdHRyKFwiaGVpZ2h0XCIsdC5oZWlnaHQpKSxuLnNldEF0dHJpYnV0ZShcImhyZWZcIix0LnNyYyk7ZWxzZSBpZih0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJk9iamVjdChoLngpKHQubm9kZU5hbWUpJiZcIkNBTlZBU1wiPT09dC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKW4uc2V0QXR0cmlidXRlKFwiaHJlZlwiLHQudG9EYXRhVVJMKCkpO2Vsc2UgaWYodCBpbnN0YW5jZW9mIEltYWdlRGF0YSl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtyLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsXCJcIit0LndpZHRoKSxyLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLFwiXCIrdC5oZWlnaHQpLHIuZ2V0Q29udGV4dChcIjJkXCIpLnB1dEltYWdlRGF0YSh0LDAsMCksZS53aWR0aHx8KG4uc2V0QXR0cmlidXRlKFwid2lkdGhcIixcIlwiK3Qud2lkdGgpLHRoaXMuYXR0cihcIndpZHRoXCIsdC53aWR0aCkpLGUuaGVpZ2h0fHwobi5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIixcIlwiK3QuaGVpZ2h0KSx0aGlzLmF0dHIoXCJoZWlnaHRcIix0LmhlaWdodCkpLG4uc2V0QXR0cmlidXRlKFwiaHJlZlwiLHIudG9EYXRhVVJMKCkpfX0sZX0obCkseT1uKDIwKSxtPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT1cImxpbmVcIixlLmNhbkZpbGw9ITEsZS5jYW5TdHJva2U9ITAsZX1yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnM9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0KGkuYSkoT2JqZWN0KGkuYSkoe30sZSkse3gxOjAseTE6MCx4MjowLHkyOjAsc3RhcnRBcnJvdzohMSxlbmRBcnJvdzohMX0pfSxlLnByb3RvdHlwZS5jcmVhdGVQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5hdHRyKCkscj10aGlzLmdldChcImVsXCIpO09iamVjdChoLmYpKGV8fG4sKGZ1bmN0aW9uKGUsaSl7aWYoXCJzdGFydEFycm93XCI9PT1pfHxcImVuZEFycm93XCI9PT1pKWlmKGUpe3ZhciBvPU9iamVjdChoLnYpKGUpP3QuYWRkQXJyb3cobixjLmJbaV0pOnQuZ2V0RGVmYXVsdEFycm93KG4sYy5iW2ldKTtyLnNldEF0dHJpYnV0ZShjLmJbaV0sXCJ1cmwoI1wiK28rXCIpXCIpfWVsc2Ugci5yZW1vdmVBdHRyaWJ1dGUoYy5iW2ldKTtlbHNlIGMuYltpXSYmci5zZXRBdHRyaWJ1dGUoYy5iW2ldLGUpfSkpfSxlLnByb3RvdHlwZS5nZXRUb3RhbExlbmd0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cigpLGU9dC54MSxuPXQueTEscj10LngyLGk9dC55MjtyZXR1cm4geS5jLmxlbmd0aChlLG4scixpKX0sZS5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRyKCksbj1lLngxLHI9ZS55MSxpPWUueDIsbz1lLnkyO3JldHVybiB5LmMucG9pbnRBdChuLHIsaSxvLHQpfSxlfShsKSxiPXtjaXJjbGU6ZnVuY3Rpb24odCxlLG4pe3JldHVybltbXCJNXCIsdCxlXSxbXCJtXCIsLW4sMF0sW1wiYVwiLG4sbiwwLDEsMCwyKm4sMF0sW1wiYVwiLG4sbiwwLDEsMCwyKi1uLDBdXX0sc3F1YXJlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bW1wiTVwiLHQtbixlLW5dLFtcIkxcIix0K24sZS1uXSxbXCJMXCIsdCtuLGUrbl0sW1wiTFwiLHQtbixlK25dLFtcIlpcIl1dfSxkaWFtb25kOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bW1wiTVwiLHQtbixlXSxbXCJMXCIsdCxlLW5dLFtcIkxcIix0K24sZV0sW1wiTFwiLHQsZStuXSxbXCJaXCJdXX0sdHJpYW5nbGU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4qTWF0aC5zaW4oMS8zKk1hdGguUEkpO3JldHVybltbXCJNXCIsdC1uLGUrcl0sW1wiTFwiLHQsZS1yXSxbXCJMXCIsdCtuLGUrcl0sW1wielwiXV19LHRyaWFuZ2xlRG93bjpmdW5jdGlvbih0LGUsbil7dmFyIHI9bipNYXRoLnNpbigxLzMqTWF0aC5QSSk7cmV0dXJuW1tcIk1cIix0LW4sZS1yXSxbXCJMXCIsdCtuLGUtcl0sW1wiTFwiLHQsZStyXSxbXCJaXCJdXX19LHg9e2dldDpmdW5jdGlvbih0KXtyZXR1cm4gYlt0XX0scmVnaXN0ZXI6ZnVuY3Rpb24odCxlKXtiW3RdPWV9LHJlbW92ZTpmdW5jdGlvbih0KXtkZWxldGUgYlt0XX0sZ2V0QWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGJ9fSx3PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT1cIm1hcmtlclwiLGUuY2FuRmlsbD0hMCxlLmNhblN0cm9rZT0hMCxlfXJldHVybiBPYmplY3QoaS5iKShlLHQpLGUucHJvdG90eXBlLmNyZWF0ZVBhdGg9ZnVuY3Rpb24odCl7dGhpcy5nZXQoXCJlbFwiKS5zZXRBdHRyaWJ1dGUoXCJkXCIsdGhpcy5fYXNzZW1ibGVNYXJrZXIoKSl9LGUucHJvdG90eXBlLl9hc3NlbWJsZU1hcmtlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldFBhdGgoKTtyZXR1cm4gT2JqZWN0KGgubSkodCk/dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmpvaW4oXCIgXCIpfSkpLmpvaW4oXCJcIik6dH0sZS5wcm90b3R5cGUuX2dldFBhdGg9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuYXR0cigpLG49ZS54LHI9ZS55LGk9ZS5yfHxlLnJhZGl1cyxvPWUuc3ltYm9sfHxcImNpcmNsZVwiO3JldHVybih0PU9iamVjdChoLnIpKG8pP286eC5nZXQobykpP3QobixyLGkpOihjb25zb2xlLndhcm4odCtcIiBzeW1ib2wgaXMgbm90IGV4aXN0LlwiKSxudWxsKX0sZS5zeW1ib2xzRmFjdG9yeT14LGV9KGwpLFM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPVwicGF0aFwiLGUuY2FuRmlsbD0hMCxlLmNhblN0cm9rZT0hMCxlfXJldHVybiBPYmplY3QoaS5iKShlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRBdHRycz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO3JldHVybiBPYmplY3QoaS5hKShPYmplY3QoaS5hKSh7fSxlKSx7c3RhcnRBcnJvdzohMSxlbmRBcnJvdzohMX0pfSxlLnByb3RvdHlwZS5jcmVhdGVQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuYXR0cigpLGk9dGhpcy5nZXQoXCJlbFwiKTtPYmplY3QoaC5mKShlfHxyLChmdW5jdGlvbihlLG8pe2lmKFwicGF0aFwiPT09byYmT2JqZWN0KGgubSkoZSkpaS5zZXRBdHRyaWJ1dGUoXCJkXCIsbi5fZm9ybWF0UGF0aChlKSk7ZWxzZSBpZihcInN0YXJ0QXJyb3dcIj09PW98fFwiZW5kQXJyb3dcIj09PW8paWYoZSl7dmFyIGE9T2JqZWN0KGgudikoZSk/dC5hZGRBcnJvdyhyLGMuYltvXSk6dC5nZXREZWZhdWx0QXJyb3cocixjLmJbb10pO2kuc2V0QXR0cmlidXRlKGMuYltvXSxcInVybCgjXCIrYStcIilcIil9ZWxzZSBpLnJlbW92ZUF0dHJpYnV0ZShjLmJbb10pO2Vsc2UgYy5iW29dJiZpLnNldEF0dHJpYnV0ZShjLmJbb10sZSl9KSl9LGUucHJvdG90eXBlLl9mb3JtYXRQYXRoPWZ1bmN0aW9uKHQpe3ZhciBlPXQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5qb2luKFwiIFwiKX0pKS5qb2luKFwiXCIpO3JldHVybn5lLmluZGV4T2YoXCJOYU5cIik/XCJcIjplfSxlLnByb3RvdHlwZS5nZXRUb3RhbExlbmd0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwiZWxcIik7cmV0dXJuIHQ/dC5nZXRUb3RhbExlbmd0aCgpOm51bGx9LGUucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0KFwiZWxcIiksbj10aGlzLmdldFRvdGFsTGVuZ3RoKCk7aWYoMD09PW4pcmV0dXJuIG51bGw7dmFyIHI9ZT9lLmdldFBvaW50QXRMZW5ndGgodCpuKTpudWxsO3JldHVybiByP3t4OnIueCx5OnIueX06bnVsbH0sZX0obCksRT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLnR5cGU9XCJwb2x5Z29uXCIsZS5jYW5GaWxsPSEwLGUuY2FuU3Ryb2tlPSEwLGV9cmV0dXJuIE9iamVjdChpLmIpKGUsdCksZS5wcm90b3R5cGUuY3JlYXRlUGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYXR0cigpLHI9dGhpcy5nZXQoXCJlbFwiKTtPYmplY3QoaC5mKShlfHxuLChmdW5jdGlvbih0LGUpe1wicG9pbnRzXCI9PT1lJiZPYmplY3QoaC5tKSh0KSYmdC5sZW5ndGg+PTI/ci5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIix0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0rXCIsXCIrdFsxXX0pKS5qb2luKFwiIFwiKSk6Yy5iW2VdJiZyLnNldEF0dHJpYnV0ZShjLmJbZV0sdCl9KSl9LGV9KGwpLF89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPVwicG9seWxpbmVcIixlLmNhbkZpbGw9ITAsZS5jYW5TdHJva2U9ITAsZX1yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnM9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0KGkuYSkoT2JqZWN0KGkuYSkoe30sZSkse3N0YXJ0QXJyb3c6ITEsZW5kQXJyb3c6ITF9KX0sZS5wcm90b3R5cGUub25BdHRyQ2hhbmdlPWZ1bmN0aW9uKGUsbixyKXt0LnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UuY2FsbCh0aGlzLGUsbixyKSwtMSE9PVtcInBvaW50c1wiXS5pbmRleE9mKGUpJiZ0aGlzLl9yZXNldENhY2hlKCl9LGUucHJvdG90eXBlLl9yZXNldENhY2hlPWZ1bmN0aW9uKCl7dGhpcy5zZXQoXCJ0b3RhbExlbmd0aFwiLG51bGwpLHRoaXMuc2V0KFwidENhY2hlXCIsbnVsbCl9LGUucHJvdG90eXBlLmNyZWF0ZVBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmF0dHIoKSxyPXRoaXMuZ2V0KFwiZWxcIik7T2JqZWN0KGguZikoZXx8biwoZnVuY3Rpb24odCxlKXtcInBvaW50c1wiPT09ZSYmT2JqZWN0KGgubSkodCkmJnQubGVuZ3RoPj0yP3Iuc2V0QXR0cmlidXRlKFwicG9pbnRzXCIsdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdK1wiLFwiK3RbMV19KSkuam9pbihcIiBcIikpOmMuYltlXSYmci5zZXRBdHRyaWJ1dGUoYy5iW2VdLHQpfSkpfSxlLnByb3RvdHlwZS5nZXRUb3RhbExlbmd0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cigpLnBvaW50cyxlPXRoaXMuZ2V0KFwidG90YWxMZW5ndGhcIik7cmV0dXJuIE9iamVjdChoLnMpKGUpPyh0aGlzLnNldChcInRvdGFsTGVuZ3RoXCIseS5kLmxlbmd0aCh0KSksdGhpcy5nZXQoXCJ0b3RhbExlbmd0aFwiKSk6ZX0sZS5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGUsbixyPXRoaXMuYXR0cigpLnBvaW50cyxpPXRoaXMuZ2V0KFwidENhY2hlXCIpO3JldHVybiBpfHwodGhpcy5fc2V0VGNhY2hlKCksaT10aGlzLmdldChcInRDYWNoZVwiKSksT2JqZWN0KGguZikoaSwoZnVuY3Rpb24ocixpKXt0Pj1yWzBdJiZ0PD1yWzFdJiYoZT0odC1yWzBdKS8oclsxXS1yWzBdKSxuPWkpfSkpLHkuYy5wb2ludEF0KHJbbl1bMF0scltuXVsxXSxyW24rMV1bMF0scltuKzFdWzFdLGUpfSxlLnByb3RvdHlwZS5fc2V0VGNhY2hlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hdHRyKCkucG9pbnRzO2lmKHQmJjAhPT10Lmxlbmd0aCl7dmFyIGU9dGhpcy5nZXRUb3RhbExlbmd0aCgpO2lmKCEoZTw9MCkpe3ZhciBuLHIsaT0wLG89W107T2JqZWN0KGguZikodCwoZnVuY3Rpb24oYSxzKXt0W3MrMV0mJigobj1bXSlbMF09aS9lLHI9eS5jLmxlbmd0aChhWzBdLGFbMV0sdFtzKzFdWzBdLHRbcysxXVsxXSksaSs9cixuWzFdPWkvZSxvLnB1c2gobikpfSkpLHRoaXMuc2V0KFwidENhY2hlXCIsbyl9fX0sZS5wcm90b3R5cGUuZ2V0U3RhcnRUYW5nZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hdHRyKCkucG9pbnRzLGU9W107cmV0dXJuIGUucHVzaChbdFsxXVswXSx0WzFdWzFdXSksZS5wdXNoKFt0WzBdWzBdLHRbMF1bMV1dKSxlfSxlLnByb3RvdHlwZS5nZXRFbmRUYW5nZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hdHRyKCkucG9pbnRzLGU9dC5sZW5ndGgtMSxuPVtdO3JldHVybiBuLnB1c2goW3RbZS0xXVswXSx0W2UtMV1bMV1dKSxuLnB1c2goW3RbZV1bMF0sdFtlXVsxXV0pLG59LGV9KGwpO3ZhciBPPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT1cInJlY3RcIixlLmNhbkZpbGw9ITAsZS5jYW5TdHJva2U9ITAsZX1yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnM9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0KGkuYSkoT2JqZWN0KGkuYSkoe30sZSkse3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MCxyYWRpdXM6MH0pfSxlLnByb3RvdHlwZS5jcmVhdGVQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuYXR0cigpLGk9dGhpcy5nZXQoXCJlbFwiKSxvPSExLGE9W1wieFwiLFwieVwiLFwid2lkdGhcIixcImhlaWdodFwiLFwicmFkaXVzXCJdO09iamVjdChoLmYpKGV8fHIsKGZ1bmN0aW9uKHQsZSl7LTE9PT1hLmluZGV4T2YoZSl8fG8/LTE9PT1hLmluZGV4T2YoZSkmJmMuYltlXSYmaS5zZXRBdHRyaWJ1dGUoYy5iW2VdLHQpOihpLnNldEF0dHJpYnV0ZShcImRcIixuLl9hc3NlbWJsZVJlY3QocikpLG89ITApfSkpfSxlLnByb3RvdHlwZS5fYXNzZW1ibGVSZWN0PWZ1bmN0aW9uKHQpe3ZhciBlPXQueCxuPXQueSxyPXQud2lkdGgsaT10LmhlaWdodCxvPXQucmFkaXVzO2lmKCFvKXJldHVyblwiTSBcIitlK1wiLFwiK24rXCIgbCBcIityK1wiLDAgbCAwLFwiK2krXCIgbFwiKy1yK1wiIDAgelwiO3ZhciBhPWZ1bmN0aW9uKHQpe3ZhciBlPTAsbj0wLHI9MCxpPTA7cmV0dXJuIE9iamVjdChoLm0pKHQpPzE9PT10Lmxlbmd0aD9lPW49cj1pPXRbMF06Mj09PXQubGVuZ3RoPyhlPXI9dFswXSxuPWk9dFsxXSk6Mz09PXQubGVuZ3RoPyhlPXRbMF0sbj1pPXRbMV0scj10WzJdKTooZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdKTplPW49cj1pPXQse3IxOmUscjI6bixyMzpyLHI0Oml9fShvKTtyZXR1cm4gT2JqZWN0KGgubSkobyk/MT09PW8ubGVuZ3RoP2EucjE9YS5yMj1hLnIzPWEucjQ9b1swXToyPT09by5sZW5ndGg/KGEucjE9YS5yMz1vWzBdLGEucjI9YS5yND1vWzFdKTozPT09by5sZW5ndGg/KGEucjE9b1swXSxhLnIyPWEucjQ9b1sxXSxhLnIzPW9bMl0pOihhLnIxPW9bMF0sYS5yMj1vWzFdLGEucjM9b1syXSxhLnI0PW9bM10pOmEucjE9YS5yMj1hLnIzPWEucjQ9byxbW1wiTSBcIisoZSthLnIxKStcIixcIituXSxbXCJsIFwiKyhyLWEucjEtYS5yMikrXCIsMFwiXSxbXCJhIFwiK2EucjIrXCIsXCIrYS5yMitcIiwwLDAsMSxcIithLnIyK1wiLFwiK2EucjJdLFtcImwgMCxcIisoaS1hLnIyLWEucjMpXSxbXCJhIFwiK2EucjMrXCIsXCIrYS5yMytcIiwwLDAsMSxcIistYS5yMytcIixcIithLnIzXSxbXCJsIFwiKyhhLnIzK2EucjQtcikrXCIsMFwiXSxbXCJhIFwiK2EucjQrXCIsXCIrYS5yNCtcIiwwLDAsMSxcIistYS5yNCtcIixcIistYS5yNF0sW1wibCAwLFwiKyhhLnI0K2EucjEtaSldLFtcImEgXCIrYS5yMStcIixcIithLnIxK1wiLDAsMCwxLFwiK2EucjErXCIsXCIrLWEucjFdLFtcInpcIl1dLmpvaW4oXCIgXCIpfSxlfShsKSxrPW4oMTM5KSxNPXt0b3A6XCJiZWZvcmUtZWRnZVwiLG1pZGRsZTpcImNlbnRyYWxcIixib3R0b206XCJhZnRlci1lZGdlXCIsYWxwaGFiZXRpYzpcImJhc2VsaW5lXCIsaGFuZ2luZzpcImhhbmdpbmdcIn0sQT17dG9wOlwidGV4dC1iZWZvcmUtZWRnZVwiLG1pZGRsZTpcImNlbnRyYWxcIixib3R0b206XCJ0ZXh0LWFmdGVyLWVkZ2VcIixhbHBoYWJldGljOlwiYWxwaGFiZXRpY1wiLGhhbmdpbmc6XCJoYW5naW5nXCJ9LFQ9e2xlZnQ6XCJsZWZ0XCIsc3RhcnQ6XCJsZWZ0XCIsY2VudGVyOlwibWlkZGxlXCIscmlnaHQ6XCJlbmRcIixlbmQ6XCJlbmRcIn0sQz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLnR5cGU9XCJ0ZXh0XCIsZS5jYW5GaWxsPSEwLGUuY2FuU3Ryb2tlPSEwLGV9cmV0dXJuIE9iamVjdChpLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdChpLmEpKE9iamVjdChpLmEpKHt9LGUpLHt4OjAseTowLHRleHQ6bnVsbCxmb250U2l6ZToxMixmb250RmFtaWx5Olwic2Fucy1zZXJpZlwiLGZvbnRTdHlsZTpcIm5vcm1hbFwiLGZvbnRXZWlnaHQ6XCJub3JtYWxcIixmb250VmFyaWFudDpcIm5vcm1hbFwiLHRleHRBbGlnbjpcInN0YXJ0XCIsdGV4dEJhc2VsaW5lOlwiYm90dG9tXCJ9KX0sZS5wcm90b3R5cGUuY3JlYXRlUGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmF0dHIoKSxpPXRoaXMuZ2V0KFwiZWxcIik7dGhpcy5fc2V0Rm9udCgpLE9iamVjdChoLmYpKGV8fHIsKGZ1bmN0aW9uKHQsZSl7XCJ0ZXh0XCI9PT1lP24uX3NldFRleHQoXCJcIit0KTpcIm1hdHJpeFwiPT09ZSYmdD9PYmplY3QoYS5jKShuKTpjLmJbZV0mJmkuc2V0QXR0cmlidXRlKGMuYltlXSx0KX0pKSxpLnNldEF0dHJpYnV0ZShcInBhaW50LW9yZGVyXCIsXCJzdHJva2VcIiksaS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLFwic3Ryb2tlLWxpbmVjYXA6YnV0dDsgc3Ryb2tlLWxpbmVqb2luOm1pdGVyO1wiKX0sZS5wcm90b3R5cGUuX3NldEZvbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImVsXCIpLGU9dGhpcy5hdHRyKCksbj1lLnRleHRCYXNlbGluZSxyPWUudGV4dEFsaWduLGk9T2JqZWN0KGsuYSkoKTtpJiZcImZpcmVmb3hcIj09PWkubmFtZT90LnNldEF0dHJpYnV0ZShcImRvbWluYW50LWJhc2VsaW5lXCIsQVtuXXx8XCJhbHBoYWJldGljXCIpOnQuc2V0QXR0cmlidXRlKFwiYWxpZ25tZW50LWJhc2VsaW5lXCIsTVtuXXx8XCJiYXNlbGluZVwiKSx0LnNldEF0dHJpYnV0ZShcInRleHQtYW5jaG9yXCIsVFtyXXx8XCJsZWZ0XCIpfSxlLnByb3RvdHlwZS5fc2V0VGV4dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcImVsXCIpLG49dGhpcy5hdHRyKCkscj1uLngsaT1uLnRleHRCYXNlbGluZSxvPXZvaWQgMD09PWk/XCJib3R0b21cIjppO2lmKHQpaWYofnQuaW5kZXhPZihcIlxcblwiKSl7dmFyIGE9dC5zcGxpdChcIlxcblwiKSxzPWEubGVuZ3RoLTEsdT1cIlwiO09iamVjdChoLmYpKGEsKGZ1bmN0aW9uKHQsZSl7MD09PWU/XCJhbHBoYWJldGljXCI9PT1vP3UrPSc8dHNwYW4geD1cIicrcisnXCIgZHk9XCInKy1zKydlbVwiPicrdCtcIjwvdHNwYW4+XCI6XCJ0b3BcIj09PW8/dSs9Jzx0c3BhbiB4PVwiJytyKydcIiBkeT1cIjAuOWVtXCI+Jyt0K1wiPC90c3Bhbj5cIjpcIm1pZGRsZVwiPT09bz91Kz0nPHRzcGFuIHg9XCInK3IrJ1wiIGR5PVwiJystKHMtMSkvMisnZW1cIj4nK3QrXCI8L3RzcGFuPlwiOlwiYm90dG9tXCI9PT1vP3UrPSc8dHNwYW4geD1cIicrcisnXCIgZHk9XCItJysocysuMykrJ2VtXCI+Jyt0K1wiPC90c3Bhbj5cIjpcImhhbmdpbmdcIj09PW8mJih1Kz0nPHRzcGFuIHg9XCInK3IrJ1wiIGR5PVwiJysoLShzLTEpLS4zKSsnZW1cIj4nK3QrXCI8L3RzcGFuPlwiKTp1Kz0nPHRzcGFuIHg9XCInK3IrJ1wiIGR5PVwiMWVtXCI+Jyt0K1wiPC90c3Bhbj5cIn0pKSxlLmlubmVySFRNTD11fWVsc2UgZS5pbm5lckhUTUw9dDtlbHNlIGUuaW5uZXJIVE1MPVwiXCJ9LGV9KGwpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpLG4uZChlLFwiY3JlYXRlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSksbi5kKGUsXCJjbG9uZVwiLChmdW5jdGlvbigpe3JldHVybiBvfSkpLG4uZChlLFwiZnJvbVZhbHVlc1wiLChmdW5jdGlvbigpe3JldHVybiBhfSkpLG4uZChlLFwiY29weVwiLChmdW5jdGlvbigpe3JldHVybiBzfSkpLG4uZChlLFwic2V0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSksbi5kKGUsXCJhZGRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gY30pKSxuLmQoZSxcInN1YnRyYWN0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSksbi5kKGUsXCJtdWx0aXBseVwiLChmdW5jdGlvbigpe3JldHVybiBsfSkpLG4uZChlLFwiZGl2aWRlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSksbi5kKGUsXCJjZWlsXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGR9KSksbi5kKGUsXCJmbG9vclwiLChmdW5jdGlvbigpe3JldHVybiBwfSkpLG4uZChlLFwibWluXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGd9KSksbi5kKGUsXCJtYXhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdn0pKSxuLmQoZSxcInJvdW5kXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHl9KSksbi5kKGUsXCJzY2FsZVwiLChmdW5jdGlvbigpe3JldHVybiBtfSkpLG4uZChlLFwic2NhbGVBbmRBZGRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gYn0pKSxuLmQoZSxcImRpc3RhbmNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSksbi5kKGUsXCJzcXVhcmVkRGlzdGFuY2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gd30pKSxuLmQoZSxcImxlbmd0aFwiLChmdW5jdGlvbigpe3JldHVybiBTfSkpLG4uZChlLFwic3F1YXJlZExlbmd0aFwiLChmdW5jdGlvbigpe3JldHVybiBFfSkpLG4uZChlLFwibmVnYXRlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIF99KSksbi5kKGUsXCJpbnZlcnNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE99KSksbi5kKGUsXCJub3JtYWxpemVcIiwoZnVuY3Rpb24oKXtyZXR1cm4ga30pKSxuLmQoZSxcImRvdFwiLChmdW5jdGlvbigpe3JldHVybiBNfSkpLG4uZChlLFwiY3Jvc3NcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQX0pKSxuLmQoZSxcImxlcnBcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVH0pKSxuLmQoZSxcInJhbmRvbVwiLChmdW5jdGlvbigpe3JldHVybiBDfSkpLG4uZChlLFwidHJhbnNmb3JtTWF0MlwiLChmdW5jdGlvbigpe3JldHVybiBJfSkpLG4uZChlLFwidHJhbnNmb3JtTWF0MmRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUH0pKSxuLmQoZSxcInRyYW5zZm9ybU1hdDNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gan0pKSxuLmQoZSxcInRyYW5zZm9ybU1hdDRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRH0pKSxuLmQoZSxcInJvdGF0ZVwiLChmdW5jdGlvbigpe3JldHVybiBOfSkpLG4uZChlLFwiYW5nbGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUn0pKSxuLmQoZSxcInplcm9cIiwoZnVuY3Rpb24oKXtyZXR1cm4gTH0pKSxuLmQoZSxcInN0clwiLChmdW5jdGlvbigpe3JldHVybiBCfSkpLG4uZChlLFwiZXhhY3RFcXVhbHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gR30pKSxuLmQoZSxcImVxdWFsc1wiLChmdW5jdGlvbigpe3JldHVybiBGfSkpLG4uZChlLFwibGVuXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHp9KSksbi5kKGUsXCJzdWJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVn0pKSxuLmQoZSxcIm11bFwiLChmdW5jdGlvbigpe3JldHVybiBXfSkpLG4uZChlLFwiZGl2XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFh9KSksbi5kKGUsXCJkaXN0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFl9KSksbi5kKGUsXCJzcXJEaXN0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEh9KSksbi5kKGUsXCJzcXJMZW5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gcX0pKSxuLmQoZSxcImZvckVhY2hcIiwoZnVuY3Rpb24oKXtyZXR1cm4gS30pKTt2YXIgcj1uKDEyKTtmdW5jdGlvbiBpKCl7dmFyIHQ9bmV3IHIuYSgyKTtyZXR1cm4gci5hIT1GbG9hdDMyQXJyYXkmJih0WzBdPTAsdFsxXT0wKSx0fWZ1bmN0aW9uIG8odCl7dmFyIGU9bmV3IHIuYSgyKTtyZXR1cm4gZVswXT10WzBdLGVbMV09dFsxXSxlfWZ1bmN0aW9uIGEodCxlKXt2YXIgbj1uZXcgci5hKDIpO3JldHVybiBuWzBdPXQsblsxXT1lLG59ZnVuY3Rpb24gcyh0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHR9ZnVuY3Rpb24gdSh0LGUsbil7cmV0dXJuIHRbMF09ZSx0WzFdPW4sdH1mdW5jdGlvbiBjKHQsZSxuKXtyZXR1cm4gdFswXT1lWzBdK25bMF0sdFsxXT1lWzFdK25bMV0sdH1mdW5jdGlvbiBmKHQsZSxuKXtyZXR1cm4gdFswXT1lWzBdLW5bMF0sdFsxXT1lWzFdLW5bMV0sdH1mdW5jdGlvbiBsKHQsZSxuKXtyZXR1cm4gdFswXT1lWzBdKm5bMF0sdFsxXT1lWzFdKm5bMV0sdH1mdW5jdGlvbiBoKHQsZSxuKXtyZXR1cm4gdFswXT1lWzBdL25bMF0sdFsxXT1lWzFdL25bMV0sdH1mdW5jdGlvbiBkKHQsZSl7cmV0dXJuIHRbMF09TWF0aC5jZWlsKGVbMF0pLHRbMV09TWF0aC5jZWlsKGVbMV0pLHR9ZnVuY3Rpb24gcCh0LGUpe3JldHVybiB0WzBdPU1hdGguZmxvb3IoZVswXSksdFsxXT1NYXRoLmZsb29yKGVbMV0pLHR9ZnVuY3Rpb24gZyh0LGUsbil7cmV0dXJuIHRbMF09TWF0aC5taW4oZVswXSxuWzBdKSx0WzFdPU1hdGgubWluKGVbMV0sblsxXSksdH1mdW5jdGlvbiB2KHQsZSxuKXtyZXR1cm4gdFswXT1NYXRoLm1heChlWzBdLG5bMF0pLHRbMV09TWF0aC5tYXgoZVsxXSxuWzFdKSx0fWZ1bmN0aW9uIHkodCxlKXtyZXR1cm4gdFswXT1NYXRoLnJvdW5kKGVbMF0pLHRbMV09TWF0aC5yb3VuZChlWzFdKSx0fWZ1bmN0aW9uIG0odCxlLG4pe3JldHVybiB0WzBdPWVbMF0qbix0WzFdPWVbMV0qbix0fWZ1bmN0aW9uIGIodCxlLG4scil7cmV0dXJuIHRbMF09ZVswXStuWzBdKnIsdFsxXT1lWzFdK25bMV0qcix0fWZ1bmN0aW9uIHgodCxlKXt2YXIgbj1lWzBdLXRbMF0scj1lWzFdLXRbMV07cmV0dXJuIE1hdGguaHlwb3QobixyKX1mdW5jdGlvbiB3KHQsZSl7dmFyIG49ZVswXS10WzBdLHI9ZVsxXS10WzFdO3JldHVybiBuKm4rcipyfWZ1bmN0aW9uIFModCl7dmFyIGU9dFswXSxuPXRbMV07cmV0dXJuIE1hdGguaHlwb3QoZSxuKX1mdW5jdGlvbiBFKHQpe3ZhciBlPXRbMF0sbj10WzFdO3JldHVybiBlKmUrbipufWZ1bmN0aW9uIF8odCxlKXtyZXR1cm4gdFswXT0tZVswXSx0WzFdPS1lWzFdLHR9ZnVuY3Rpb24gTyh0LGUpe3JldHVybiB0WzBdPTEvZVswXSx0WzFdPTEvZVsxXSx0fWZ1bmN0aW9uIGsodCxlKXt2YXIgbj1lWzBdLHI9ZVsxXSxpPW4qbityKnI7cmV0dXJuIGk+MCYmKGk9MS9NYXRoLnNxcnQoaSkpLHRbMF09ZVswXSppLHRbMV09ZVsxXSppLHR9ZnVuY3Rpb24gTSh0LGUpe3JldHVybiB0WzBdKmVbMF0rdFsxXSplWzFdfWZ1bmN0aW9uIEEodCxlLG4pe3ZhciByPWVbMF0qblsxXS1lWzFdKm5bMF07cmV0dXJuIHRbMF09dFsxXT0wLHRbMl09cix0fWZ1bmN0aW9uIFQodCxlLG4scil7dmFyIGk9ZVswXSxvPWVbMV07cmV0dXJuIHRbMF09aStyKihuWzBdLWkpLHRbMV09bytyKihuWzFdLW8pLHR9ZnVuY3Rpb24gQyh0LGUpe2U9ZXx8MTt2YXIgbj0yKnIuYygpKk1hdGguUEk7cmV0dXJuIHRbMF09TWF0aC5jb3MobikqZSx0WzFdPU1hdGguc2luKG4pKmUsdH1mdW5jdGlvbiBJKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXTtyZXR1cm4gdFswXT1uWzBdKnIrblsyXSppLHRbMV09blsxXSpyK25bM10qaSx0fWZ1bmN0aW9uIFAodCxlLG4pe3ZhciByPWVbMF0saT1lWzFdO3JldHVybiB0WzBdPW5bMF0qcituWzJdKmkrbls0XSx0WzFdPW5bMV0qcituWzNdKmkrbls1XSx0fWZ1bmN0aW9uIGoodCxlLG4pe3ZhciByPWVbMF0saT1lWzFdO3JldHVybiB0WzBdPW5bMF0qcituWzNdKmkrbls2XSx0WzFdPW5bMV0qcituWzRdKmkrbls3XSx0fWZ1bmN0aW9uIEQodCxlLG4pe3ZhciByPWVbMF0saT1lWzFdO3JldHVybiB0WzBdPW5bMF0qcituWzRdKmkrblsxMl0sdFsxXT1uWzFdKnIrbls1XSppK25bMTNdLHR9ZnVuY3Rpb24gTih0LGUsbixyKXt2YXIgaT1lWzBdLW5bMF0sbz1lWzFdLW5bMV0sYT1NYXRoLnNpbihyKSxzPU1hdGguY29zKHIpO3JldHVybiB0WzBdPWkqcy1vKmErblswXSx0WzFdPWkqYStvKnMrblsxXSx0fWZ1bmN0aW9uIFIodCxlKXt2YXIgbj10WzBdLHI9dFsxXSxpPWVbMF0sbz1lWzFdLGE9TWF0aC5zcXJ0KG4qbityKnIpKk1hdGguc3FydChpKmkrbypvKSxzPWEmJihuKmkrcipvKS9hO3JldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgocywtMSksMSkpfWZ1bmN0aW9uIEwodCl7cmV0dXJuIHRbMF09MCx0WzFdPTAsdH1mdW5jdGlvbiBCKHQpe3JldHVyblwidmVjMihcIit0WzBdK1wiLCBcIit0WzFdK1wiKVwifWZ1bmN0aW9uIEcodCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdfWZ1bmN0aW9uIEYodCxlKXt2YXIgbj10WzBdLGk9dFsxXSxvPWVbMF0sYT1lWzFdO3JldHVybiBNYXRoLmFicyhuLW8pPD1yLmIqTWF0aC5tYXgoMSxNYXRoLmFicyhuKSxNYXRoLmFicyhvKSkmJk1hdGguYWJzKGktYSk8PXIuYipNYXRoLm1heCgxLE1hdGguYWJzKGkpLE1hdGguYWJzKGEpKX12YXIgVSx6PVMsVj1mLFc9bCxYPWgsWT14LEg9dyxxPUUsSz0oVT1pKCksZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBhLHM7Zm9yKGV8fChlPTIpLG58fChuPTApLHM9cj9NYXRoLm1pbihyKmUrbix0Lmxlbmd0aCk6dC5sZW5ndGgsYT1uO2E8czthKz1lKVVbMF09dFthXSxVWzFdPXRbYSsxXSxpKFUsVSxvKSx0W2FdPVVbMF0sdFthKzFdPVVbMV07cmV0dXJuIHR9KX0sZnVuY3Rpb24odCxlKXt2YXIgbj1bXSxyPVtdO2Z1bmN0aW9uIGkodCxlKXtpZihlPWV8fHt9LHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKFwiaW5zZXJ0LWNzczogWW91IG5lZWQgdG8gcHJvdmlkZSBhIENTUyBzdHJpbmcuIFVzYWdlOiBpbnNlcnRDc3MoY3NzU3RyaW5nWywgb3B0aW9uc10pLlwiKTt2YXIgaSxvPSEwPT09ZS5wcmVwZW5kP1wicHJlcGVuZFwiOlwiYXBwZW5kXCIsYT12b2lkIDAhPT1lLmNvbnRhaW5lcj9lLmNvbnRhaW5lcjpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiaGVhZFwiKSxzPW4uaW5kZXhPZihhKTtyZXR1cm4tMT09PXMmJihzPW4ucHVzaChhKS0xLHJbc109e30pLHZvaWQgMCE9PXJbc10mJnZvaWQgMCE9PXJbc11bb10/aT1yW3NdW29dOihpPXJbc11bb109ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7cmV0dXJuIHQuc2V0QXR0cmlidXRlKFwidHlwZVwiLFwidGV4dC9jc3NcIiksdH0oKSxcInByZXBlbmRcIj09PW8/YS5pbnNlcnRCZWZvcmUoaSxhLmNoaWxkTm9kZXNbMF0pOmEuYXBwZW5kQ2hpbGQoaSkpLDY1Mjc5PT09dC5jaGFyQ29kZUF0KDApJiYodD10LnN1YnN0cigxLHQubGVuZ3RoKSksaS5zdHlsZVNoZWV0P2kuc3R5bGVTaGVldC5jc3NUZXh0Kz10OmkudGV4dENvbnRlbnQrPXQsaX10LmV4cG9ydHM9aSx0LmV4cG9ydHMuaW5zZXJ0Q3NzPWl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4ga30pKTt2YXIgcixpLG8sYSxzLHUsYyxmLGwsaD1uKDkpLGQ9bi5uKGgpLHA9bigxNCksZz1uLm4ocCksdj1uKDEwKSx5PW4ubih2KSxtPW4oNiksYj1uLm4obSkseD1uKDExKSx3PW4ubih4KSxTPShuKDI4KSxuKDUpKSxFPW4oMTMpLF89bigzNiksTz1uKDUwKSxrPShyPU9iamVjdChTLmluamVjdGFibGUpKCksaT1PYmplY3QoUy5pbmplY3QpKEUuYS5SZW5kZXJFbmdpbmUpLG89T2JqZWN0KFMuaW5qZWN0KShFLmEuUmVzb3VyY2VQb29sKSxyKChsPWY9ZnVuY3Rpb24gdCgpe3ZhciBlPXRoaXM7YigpKHRoaXMsdCkseSgpKHRoaXMsXCJlbmdpbmVcIix1LHRoaXMpLHkoKSh0aGlzLFwicmVzb3VyY2VQb29sXCIsYyx0aGlzKSx0aGlzLm1vZGVsPXZvaWQgMCx0aGlzLnNldHVwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmdldFBhc3MoTy5hLklERU5USUZJRVIpO2lmKHIpe3ZhciBpPXQuY3JlYXRlUmVuZGVyVGFyZ2V0KGUsXCJyZW5kZXIgdG8gc2NyZWVuXCIse3dpZHRoOjEsaGVpZ2h0OjF9KTtuLmRhdGE9e2lucHV0OmUucmVhZChyLmRhdGEub3V0cHV0KSxvdXRwdXQ6ZS53cml0ZSh0LGkpfX19LHRoaXMuZXhlY3V0ZT1mdW5jdGlvbigpe3ZhciB0PWcoKShkLmEubWFyaygoZnVuY3Rpb24gdChuLHIpe3ZhciBpLG8sYSxzLHUsYyxmO3JldHVybiBkLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYoaT1lLmVuZ2luZSxvPWkuY3JlYXRlTW9kZWwsYT1pLmNyZWF0ZUF0dHJpYnV0ZSxzPWkuY3JlYXRlQnVmZmVyLGUubW9kZWwpe3QubmV4dD02O2JyZWFrfXJldHVybiB0Lm5leHQ9NCxvKHt2czplLmVuZ2luZS5zdXBwb3J0V2ViR1BVP1wibGF5b3V0KGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX1Bvc2l0aW9uO1xcbmxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWMyIHZfVVY7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgdl9VViA9IDAuNSAqIChhX1Bvc2l0aW9uICsgMS4wKTtcXG4gIGdsX1Bvc2l0aW9uID0gdmVjNChhX1Bvc2l0aW9uLCAwLiwgMS4pO1xcbn1cIjpcImF0dHJpYnV0ZSB2ZWMyIGFfUG9zaXRpb247XFxuXFxudmFyeWluZyB2ZWMyIHZfVVY7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgdl9VViA9IDAuNSAqIChhX1Bvc2l0aW9uICsgMS4wKTtcXG4gIGdsX1Bvc2l0aW9uID0gdmVjNChhX1Bvc2l0aW9uLCAwLiwgMS4pO1xcbn1cIixmczplLmVuZ2luZS5zdXBwb3J0V2ViR1BVP1wibGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAwKSB1bmlmb3JtIHNhbXBsZXIgdV9UZXh0dXJlU2FtcGxlcjtcXG5sYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDEpIHVuaWZvcm0gdGV4dHVyZTJEIHVfVGV4dHVyZTtcXG5cXG5sYXlvdXQobG9jYXRpb24gPSAwKSBpbiB2ZWMyIHZfVVY7XFxubGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IHZlYzQgb3V0Q29sb3I7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgb3V0Q29sb3IgPSB0ZXh0dXJlKHNhbXBsZXIyRCh1X1RleHR1cmUsIHVfVGV4dHVyZVNhbXBsZXIpLCB2X1VWKTtcXG59XCI6XCJ2YXJ5aW5nIHZlYzIgdl9VVjtcXG5cXG51bmlmb3JtIHNhbXBsZXIyRCB1X1RleHR1cmU7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh0ZXh0dXJlMkQodV9UZXh0dXJlLCB2X1VWKSk7XFxufVwiLGF0dHJpYnV0ZXM6e2FfUG9zaXRpb246YSh7YnVmZmVyOnMoe2RhdGE6Wy00LC00LDQsLTQsMCw0XSx0eXBlOl8uYS5GTE9BVH0pLHNpemU6MixhcnJheVN0cmlkZTo4LHN0ZXBNb2RlOlwidmVydGV4XCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXQyXCJ9XX0pfSx1bmlmb3Jtczp7dV9UZXh0dXJlOm51bGx9LGRlcHRoOntlbmFibGU6ITF9LGNvdW50OjMsYmxlbmQ6e2VuYWJsZTohMH19KTtjYXNlIDQ6dT10LnNlbnQsZS5tb2RlbD11O2Nhc2UgNjpjPW4uZ2V0UmVzb3VyY2VOb2RlKHIuZGF0YS5pbnB1dCksZj1lLnJlc291cmNlUG9vbC5nZXRPckNyZWF0ZVJlc291cmNlKGMucmVzb3VyY2UpLGUuZW5naW5lLnVzZUZyYW1lYnVmZmVyKG51bGwsKGZ1bmN0aW9uKCl7ZS5lbmdpbmUuY2xlYXIoe2ZyYW1lYnVmZmVyOm51bGwsY29sb3I6WzAsMCwwLDBdLGRlcHRoOjEsc3RlbmNpbDowfSksZS5tb2RlbC5kcmF3KHt1bmlmb3Jtczp7dV9UZXh0dXJlOmZ9fSl9KSk7Y2FzZSA5OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSk7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSx0aGlzLnRlYXJEb3duPWZ1bmN0aW9uKCl7ZS5tb2RlbD12b2lkIDB9fSxmLklERU5USUZJRVI9XCJDb3B5IFBhc3NcIixzPWwsdT13KCkocy5wcm90b3R5cGUsXCJlbmdpbmVcIixbaV0se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxjPXcoKShzLnByb3RvdHlwZSxcInJlc291cmNlUG9vbFwiLFtvXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLGE9cykpfHxhKX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHIodCl7cmV0dXJuKHI9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfXZhciBpPW4oMjgxKSxvPW4oMjg1KSxhPVtdLnNsaWNlLHM9W1wia2V5d29yZFwiLFwiZ3JheVwiLFwiaGV4XCJdLHU9e307T2JqZWN0LmtleXMobykuZm9yRWFjaCgoZnVuY3Rpb24odCl7dVthLmNhbGwob1t0XS5sYWJlbHMpLnNvcnQoKS5qb2luKFwiXCIpXT10fSkpO3ZhciBjPXt9O2Z1bmN0aW9uIGYodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBmKSlyZXR1cm4gbmV3IGYodCxlKTtpZihlJiZlIGluIHMmJihlPW51bGwpLGUmJiEoZSBpbiBvKSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG1vZGVsOiBcIitlKTt2YXIgbixyO2lmKG51bGw9PXQpdGhpcy5tb2RlbD1cInJnYlwiLHRoaXMuY29sb3I9WzAsMCwwXSx0aGlzLnZhbHBoYT0xO2Vsc2UgaWYodCBpbnN0YW5jZW9mIGYpdGhpcy5tb2RlbD10Lm1vZGVsLHRoaXMuY29sb3I9dC5jb2xvci5zbGljZSgpLHRoaXMudmFscGhhPXQudmFscGhhO2Vsc2UgaWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe3ZhciBsPWkuZ2V0KHQpO2lmKG51bGw9PT1sKXRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIHN0cmluZzogXCIrdCk7dGhpcy5tb2RlbD1sLm1vZGVsLHI9b1t0aGlzLm1vZGVsXS5jaGFubmVscyx0aGlzLmNvbG9yPWwudmFsdWUuc2xpY2UoMCxyKSx0aGlzLnZhbHBoYT1cIm51bWJlclwiPT10eXBlb2YgbC52YWx1ZVtyXT9sLnZhbHVlW3JdOjF9ZWxzZSBpZih0Lmxlbmd0aCl7dGhpcy5tb2RlbD1lfHxcInJnYlwiLHI9b1t0aGlzLm1vZGVsXS5jaGFubmVsczt2YXIgaD1hLmNhbGwodCwwLHIpO3RoaXMuY29sb3I9cChoLHIpLHRoaXMudmFscGhhPVwibnVtYmVyXCI9PXR5cGVvZiB0W3JdP3Rbcl06MX1lbHNlIGlmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXQmPTE2Nzc3MjE1LHRoaXMubW9kZWw9XCJyZ2JcIix0aGlzLmNvbG9yPVt0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnRdLHRoaXMudmFscGhhPTE7ZWxzZXt0aGlzLnZhbHBoYT0xO3ZhciBkPU9iamVjdC5rZXlzKHQpO1wiYWxwaGFcImluIHQmJihkLnNwbGljZShkLmluZGV4T2YoXCJhbHBoYVwiKSwxKSx0aGlzLnZhbHBoYT1cIm51bWJlclwiPT10eXBlb2YgdC5hbHBoYT90LmFscGhhOjApO3ZhciBnPWQuc29ydCgpLmpvaW4oXCJcIik7aWYoIShnIGluIHUpKXRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIG9iamVjdDogXCIrSlNPTi5zdHJpbmdpZnkodCkpO3RoaXMubW9kZWw9dVtnXTt2YXIgdj1vW3RoaXMubW9kZWxdLmxhYmVscyx5PVtdO2ZvcihuPTA7bjx2Lmxlbmd0aDtuKyspeS5wdXNoKHRbdltuXV0pO3RoaXMuY29sb3I9cCh5KX1pZihjW3RoaXMubW9kZWxdKWZvcihyPW9bdGhpcy5tb2RlbF0uY2hhbm5lbHMsbj0wO248cjtuKyspe3ZhciBtPWNbdGhpcy5tb2RlbF1bbl07bSYmKHRoaXMuY29sb3Jbbl09bSh0aGlzLmNvbG9yW25dKSl9dGhpcy52YWxwaGE9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHRoaXMudmFscGhhKSksT2JqZWN0LmZyZWV6ZSYmT2JqZWN0LmZyZWV6ZSh0aGlzKX1mdW5jdGlvbiBsKHQsZSxuKXtyZXR1cm4odD1BcnJheS5pc0FycmF5KHQpP3Q6W3RdKS5mb3JFYWNoKChmdW5jdGlvbih0KXsoY1t0XXx8KGNbdF09W10pKVtlXT1ufSkpLHQ9dFswXSxmdW5jdGlvbihyKXt2YXIgaTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obiYmKHI9bihyKSksKGk9dGhpc1t0XSgpKS5jb2xvcltlXT1yLGkpOihpPXRoaXNbdF0oKS5jb2xvcltlXSxuJiYoaT1uKGkpKSxpKX19ZnVuY3Rpb24gaCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4odCxlKSl9fWZ1bmN0aW9uIGQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19ZnVuY3Rpb24gcCh0LGUpe2Zvcih2YXIgbj0wO248ZTtuKyspXCJudW1iZXJcIiE9dHlwZW9mIHRbbl0mJih0W25dPTApO3JldHVybiB0fWYucHJvdG90eXBlPXt0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZygpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0aGlzLm1vZGVsXSgpfSxzdHJpbmc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tb2RlbCBpbiBpLnRvP3RoaXM6dGhpcy5yZ2IoKSxuPTE9PT0oZT1lLnJvdW5kKFwibnVtYmVyXCI9PXR5cGVvZiB0P3Q6MSkpLnZhbHBoYT9lLmNvbG9yOmUuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtyZXR1cm4gaS50b1tlLm1vZGVsXShuKX0scGVyY2VudFN0cmluZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnJnYigpLnJvdW5kKFwibnVtYmVyXCI9PXR5cGVvZiB0P3Q6MSksbj0xPT09ZS52YWxwaGE/ZS5jb2xvcjplLmNvbG9yLmNvbmNhdCh0aGlzLnZhbHBoYSk7cmV0dXJuIGkudG8ucmdiLnBlcmNlbnQobil9LGFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLnZhbHBoYT90aGlzLmNvbG9yLnNsaWNlKCk6dGhpcy5jb2xvci5jb25jYXQodGhpcy52YWxwaGEpfSxvYmplY3Q6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9e30sZT1vW3RoaXMubW9kZWxdLmNoYW5uZWxzLG49b1t0aGlzLm1vZGVsXS5sYWJlbHMscj0wO3I8ZTtyKyspdFtuW3JdXT10aGlzLmNvbG9yW3JdO3JldHVybiAxIT09dGhpcy52YWxwaGEmJih0LmFscGhhPXRoaXMudmFscGhhKSx0fSx1bml0QXJyYXk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJnYigpLmNvbG9yO3JldHVybiB0WzBdLz0yNTUsdFsxXS89MjU1LHRbMl0vPTI1NSwxIT09dGhpcy52YWxwaGEmJnQucHVzaCh0aGlzLnZhbHBoYSksdH0sdW5pdE9iamVjdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmdiKCkub2JqZWN0KCk7cmV0dXJuIHQuci89MjU1LHQuZy89MjU1LHQuYi89MjU1LDEhPT10aGlzLnZhbHBoYSYmKHQuYWxwaGE9dGhpcy52YWxwaGEpLHR9LHJvdW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgubWF4KHR8fDAsMCksbmV3IGYodGhpcy5jb2xvci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiBOdW1iZXIodC50b0ZpeGVkKGUpKX0oZSx0KX19KHQpKS5jb25jYXQodGhpcy52YWxwaGEpLHRoaXMubW9kZWwpfSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uZXcgZih0aGlzLmNvbG9yLmNvbmNhdChNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKSx0aGlzLm1vZGVsKTp0aGlzLnZhbHBoYX0scmVkOmwoXCJyZ2JcIiwwLGgoMjU1KSksZ3JlZW46bChcInJnYlwiLDEsaCgyNTUpKSxibHVlOmwoXCJyZ2JcIiwyLGgoMjU1KSksaHVlOmwoW1wiaHNsXCIsXCJoc3ZcIixcImhzbFwiLFwiaHdiXCIsXCJoY2dcIl0sMCwoZnVuY3Rpb24odCl7cmV0dXJuKHQlMzYwKzM2MCklMzYwfSkpLHNhdHVyYXRpb25sOmwoXCJoc2xcIiwxLGgoMTAwKSksbGlnaHRuZXNzOmwoXCJoc2xcIiwyLGgoMTAwKSksc2F0dXJhdGlvbnY6bChcImhzdlwiLDEsaCgxMDApKSx2YWx1ZTpsKFwiaHN2XCIsMixoKDEwMCkpLGNocm9tYTpsKFwiaGNnXCIsMSxoKDEwMCkpLGdyYXk6bChcImhjZ1wiLDIsaCgxMDApKSx3aGl0ZTpsKFwiaHdiXCIsMSxoKDEwMCkpLHdibGFjazpsKFwiaHdiXCIsMixoKDEwMCkpLGN5YW46bChcImNteWtcIiwwLGgoMTAwKSksbWFnZW50YTpsKFwiY215a1wiLDEsaCgxMDApKSx5ZWxsb3c6bChcImNteWtcIiwyLGgoMTAwKSksYmxhY2s6bChcImNteWtcIiwzLGgoMTAwKSkseDpsKFwieHl6XCIsMCxoKDEwMCkpLHk6bChcInh5elwiLDEsaCgxMDApKSx6OmwoXCJ4eXpcIiwyLGgoMTAwKSksbDpsKFwibGFiXCIsMCxoKDEwMCkpLGE6bChcImxhYlwiLDEpLGI6bChcImxhYlwiLDIpLGtleXdvcmQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bmV3IGYodCk6b1t0aGlzLm1vZGVsXS5rZXl3b3JkKHRoaXMuY29sb3IpfSxoZXg6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bmV3IGYodCk6aS50by5oZXgodGhpcy5yZ2IoKS5yb3VuZCgpLmNvbG9yKX0scmdiTnVtYmVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZ2IoKS5jb2xvcjtyZXR1cm4oMjU1JnRbMF0pPDwxNnwoMjU1JnRbMV0pPDw4fDI1NSZ0WzJdfSxsdW1pbm9zaXR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmdiKCkuY29sb3IsZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl0vMjU1O2Vbbl09cjw9LjAzOTI4P3IvMTIuOTI6TWF0aC5wb3coKHIrLjA1NSkvMS4wNTUsMi40KX1yZXR1cm4uMjEyNiplWzBdKy43MTUyKmVbMV0rLjA3MjIqZVsyXX0sY29udHJhc3Q6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sdW1pbm9zaXR5KCksbj10Lmx1bWlub3NpdHkoKTtyZXR1cm4gZT5uPyhlKy4wNSkvKG4rLjA1KToobisuMDUpLyhlKy4wNSl9LGxldmVsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udHJhc3QodCk7cmV0dXJuIGU+PTcuMT9cIkFBQVwiOmU+PTQuNT9cIkFBXCI6XCJcIn0saXNEYXJrOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZ2IoKS5jb2xvcjtyZXR1cm4oMjk5KnRbMF0rNTg3KnRbMV0rMTE0KnRbMl0pLzFlMzwxMjh9LGlzTGlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0RhcmsoKX0sbmVnYXRlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmdiKCksZT0wO2U8MztlKyspdC5jb2xvcltlXT0yNTUtdC5jb2xvcltlXTtyZXR1cm4gdH0sbGlnaHRlbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmhzbCgpO3JldHVybiBlLmNvbG9yWzJdKz1lLmNvbG9yWzJdKnQsZX0sZGFya2VuOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaHNsKCk7cmV0dXJuIGUuY29sb3JbMl0tPWUuY29sb3JbMl0qdCxlfSxzYXR1cmF0ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmhzbCgpO3JldHVybiBlLmNvbG9yWzFdKz1lLmNvbG9yWzFdKnQsZX0sZGVzYXR1cmF0ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmhzbCgpO3JldHVybiBlLmNvbG9yWzFdLT1lLmNvbG9yWzFdKnQsZX0sd2hpdGVuOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaHdiKCk7cmV0dXJuIGUuY29sb3JbMV0rPWUuY29sb3JbMV0qdCxlfSxibGFja2VuOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaHdiKCk7cmV0dXJuIGUuY29sb3JbMl0rPWUuY29sb3JbMl0qdCxlfSxncmF5c2NhbGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJnYigpLmNvbG9yLGU9LjMqdFswXSsuNTkqdFsxXSsuMTEqdFsyXTtyZXR1cm4gZi5yZ2IoZSxlLGUpfSxmYWRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFscGhhKHRoaXMudmFscGhhLXRoaXMudmFscGhhKnQpfSxvcGFxdWVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFscGhhKHRoaXMudmFscGhhK3RoaXMudmFscGhhKnQpfSxyb3RhdGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oc2woKSxuPWUuY29sb3JbMF07cmV0dXJuIG49KG49KG4rdCklMzYwKTwwPzM2MCtuOm4sZS5jb2xvclswXT1uLGV9LG1peDpmdW5jdGlvbih0LGUpe2lmKCF0fHwhdC5yZ2IpdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0byBcIm1peFwiIHdhcyBub3QgYSBDb2xvciBpbnN0YW5jZSwgYnV0IHJhdGhlciBhbiBpbnN0YW5jZSBvZiAnK3IodCkpO3ZhciBuPXQucmdiKCksaT10aGlzLnJnYigpLG89dm9pZCAwPT09ZT8uNTplLGE9MipvLTEscz1uLmFscGhhKCktaS5hbHBoYSgpLHU9KChhKnM9PS0xP2E6KGErcykvKDErYSpzKSkrMSkvMixjPTEtdTtyZXR1cm4gZi5yZ2IodSpuLnJlZCgpK2MqaS5yZWQoKSx1Km4uZ3JlZW4oKStjKmkuZ3JlZW4oKSx1Km4uYmx1ZSgpK2MqaS5ibHVlKCksbi5hbHBoYSgpKm8raS5hbHBoYSgpKigxLW8pKX19LE9iamVjdC5rZXlzKG8pLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKC0xPT09cy5pbmRleE9mKHQpKXt2YXIgZT1vW3RdLmNoYW5uZWxzO2YucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7aWYodGhpcy5tb2RlbD09PXQpcmV0dXJuIG5ldyBmKHRoaXMpO2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG5ldyBmKGFyZ3VtZW50cyx0KTt2YXIgbj1cIm51bWJlclwiPT10eXBlb2YgYXJndW1lbnRzW2VdP2U6dGhpcy52YWxwaGE7cmV0dXJuIG5ldyBmKGQob1t0aGlzLm1vZGVsXVt0XS5yYXcodGhpcy5jb2xvcikpLmNvbmNhdChuKSx0KX0sZlt0XT1mdW5jdGlvbihuKXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgbiYmKG49cChhLmNhbGwoYXJndW1lbnRzKSxlKSksbmV3IGYobix0KX19fSkpLHQuZXhwb3J0cz1mfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1OSksaT1uKDQzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIWkodCkpcmV0dXJuITE7dmFyIGU9cih0KTtyZXR1cm5cIltvYmplY3QgRnVuY3Rpb25dXCI9PWV8fFwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl1cIj09ZXx8XCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dXCI9PWV8fFwiW29iamVjdCBQcm94eV1cIj09ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwMiksaT1uKDEwMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3ZhciBhPSFuO258fChuPXt9KTtmb3IodmFyIHM9LTEsdT1lLmxlbmd0aDsrK3M8dTspe3ZhciBjPWVbc10sZj1vP28obltjXSx0W2NdLGMsbix0KTp2b2lkIDA7dm9pZCAwPT09ZiYmKGY9dFtjXSksYT9pKG4sYyxmKTpyKG4sYyxmKX1yZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyMSksaT1uKDQ2KSxvPU9iamVjdC5wcm90b3R5cGUsYT1vLmhhc093blByb3BlcnR5LHM9by5wcm9wZXJ0eUlzRW51bWVyYWJsZSx1PXIoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9yOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQpJiZhLmNhbGwodCxcImNhbGxlZVwiKSYmIXMuY2FsbCh0LFwiY2FsbGVlXCIpfTt0LmV4cG9ydHM9dX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNzcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihcInN0cmluZ1wiPT10eXBlb2YgdHx8cih0KSlyZXR1cm4gdDt2YXIgZT10K1wiXCI7cmV0dXJuXCIwXCI9PWUmJjEvdD09LTEvMD9cIi0wXCI6ZX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKHQpe3JldHVybihyPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLmNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uPWUubGlzdE1ldGFkYXRhRm9yVGFyZ2V0PWUubGlzdFJlZ2lzdGVyZWRCaW5kaW5nc0ZvclNlcnZpY2VJZGVudGlmaWVyPWUuZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZz1lLmdldEZ1bmN0aW9uTmFtZT12b2lkIDA7dmFyIGk9big0MSk7ZnVuY3Rpb24gbyh0KXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3QubmFtZTpcInN5bWJvbFwiPT09cih0KT90LnRvU3RyaW5nKCk6dH1mdW5jdGlvbiBhKHQpe2lmKHQubmFtZSlyZXR1cm4gdC5uYW1lO3ZhciBlPXQudG9TdHJpbmcoKSxuPWUubWF0Y2goL15mdW5jdGlvblxccyooW15cXHMoXSspLyk7cmV0dXJuIG4/blsxXTpcIkFub255bW91cyBmdW5jdGlvbjogXCIrZX1lLmdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmc9byxlLmxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9XCJcIixpPW4odCxlKTtyZXR1cm4gMCE9PWkubGVuZ3RoJiYocj1cIlxcblJlZ2lzdGVyZWQgYmluZGluZ3M6XCIsaS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1cIk9iamVjdFwiO251bGwhPT10LmltcGxlbWVudGF0aW9uVHlwZSYmKGU9YSh0LmltcGxlbWVudGF0aW9uVHlwZSkpLHI9citcIlxcbiBcIitlLHQuY29uc3RyYWludC5tZXRhRGF0YSYmKHI9citcIiAtIFwiK3QuY29uc3RyYWludC5tZXRhRGF0YSl9KSkpLHJ9LGUuY2lyY3VsYXJEZXBlbmRlbmN5VG9FeGNlcHRpb249ZnVuY3Rpb24gdChlKXtlLmNoaWxkUmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoZnVuY3Rpb24gdChlLG4pe3JldHVybiBudWxsIT09ZS5wYXJlbnRSZXF1ZXN0JiYoZS5wYXJlbnRSZXF1ZXN0LnNlcnZpY2VJZGVudGlmaWVyPT09bnx8dChlLnBhcmVudFJlcXVlc3QsbikpfShlLGUuc2VydmljZUlkZW50aWZpZXIpKXt2YXIgbj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gdChlLG4pe3ZvaWQgMD09PW4mJihuPVtdKTt2YXIgcj1vKGUuc2VydmljZUlkZW50aWZpZXIpO3JldHVybiBuLnB1c2gociksbnVsbCE9PWUucGFyZW50UmVxdWVzdD90KGUucGFyZW50UmVxdWVzdCxuKTpufSh0KS5yZXZlcnNlKCkuam9pbihcIiAtLVxceDNlIFwiKX0oZSk7dGhyb3cgbmV3IEVycm9yKGkuQ0lSQ1VMQVJfREVQRU5ERU5DWStcIiBcIituKX10KGUpfSkpfSxlLmxpc3RNZXRhZGF0YUZvclRhcmdldD1mdW5jdGlvbih0LGUpe2lmKGUuaXNUYWdnZWQoKXx8ZS5pc05hbWVkKCkpe3ZhciBuPVwiXCIscj1lLmdldE5hbWVkVGFnKCksaT1lLmdldEN1c3RvbVRhZ3MoKTtyZXR1cm4gbnVsbCE9PXImJihuKz1yLnRvU3RyaW5nKCkrXCJcXG5cIiksbnVsbCE9PWkmJmkuZm9yRWFjaCgoZnVuY3Rpb24odCl7bis9dC50b1N0cmluZygpK1wiXFxuXCJ9KSksXCIgXCIrdCtcIlxcbiBcIit0K1wiIC0gXCIrbn1yZXR1cm5cIiBcIit0fSxlLmdldEZ1bmN0aW9uTmFtZT1hfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFp9KSk7bigyMzIpO3ZhciByLGksbyxhLHMsdT1uKDUpLGM9bigyNzEpLGY9bi5uKGMpLGw9bigzNSksaD1uKDEwKSxkPW4ubihoKSxwPW4oNiksZz1uLm4ocCksdj1uKDcpLHk9bi5uKHYpLG09bigxMSksYj1uLm4obSkseD0obigyOCksbigxMykpLHc9bigzNiksUz0ocj1PYmplY3QodS5pbmplY3RhYmxlKSgpLGk9T2JqZWN0KHUuaW5qZWN0KSh4LmEuUmVuZGVyRW5naW5lKSxyKChhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2coKSh0aGlzLHQpLGQoKSh0aGlzLFwiZW5naW5lXCIscyx0aGlzKSx0aGlzLnJlc291cmNlUG9vbD17fX1yZXR1cm4geSgpKHQsW3trZXk6XCJnZXRPckNyZWF0ZVJlc291cmNlXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXRoaXMucmVzb3VyY2VQb29sW3QubmFtZV0pe3ZhciBlPXQuZGVzY3JpcHRvcixuPWUud2lkdGgscj1lLmhlaWdodCxpPWUudXNhZ2U7dGhpcy5yZXNvdXJjZVBvb2xbdC5uYW1lXT10aGlzLmVuZ2luZS5jcmVhdGVGcmFtZWJ1ZmZlcih7Y29sb3I6dGhpcy5lbmdpbmUuY3JlYXRlVGV4dHVyZTJEKHt3aWR0aDpuLGhlaWdodDpyLHdyYXBTOncuYS5DTEFNUF9UT19FREdFLHdyYXBUOncuYS5DTEFNUF9UT19FREdFLHVzYWdlOml9KX0pfXJldHVybiB0aGlzLnJlc291cmNlUG9vbFt0Lm5hbWVdfX0se2tleTpcImNsZWFuXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnJlc291cmNlUG9vbD17fX19XSksdH0oKSxzPWIoKShhLnByb3RvdHlwZSxcImVuZ2luZVwiLFtpXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLG89YSkpfHxvKSxFPW4oMTM0KSxfPW4oMTIwKSxPPW4oMTIxKSxrPW4oMTIyKSxNPW4oMTIzKSxBPW4oMTI0KSxUPW4oMTI1KSxDPW4oMTI2KSxJPW4oODQpLFA9big3MCksaj1uKDUwKSxEPW4oMTI4KSxOPW4oMTI5KSxSPW4oMjMpLEw9bi5uKFIpLEI9bigyNCksRz1uLm4oQiksRj1uKDE3KSxVPW4ubihGKTtmdW5jdGlvbiB6KHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9VSgpKHQpO2lmKGUpe3ZhciBpPVUoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gRygpKHRoaXMsbil9fXZhciBWPWZ1bmN0aW9uKHQpe0woKShuLHQpO3ZhciBlPXoobik7ZnVuY3Rpb24gbih0KXt2YXIgcjtyZXR1cm4gZygpKHRoaXMsbiksKHI9ZS5jYWxsKHRoaXMsdCkpLm5hbWU9dm9pZCAwLHIubmFtZT10Lm5hbWV8fFwiXCIscn1yZXR1cm4gbn0obigzKS5Db21wb25lbnQpLFc9bigxMzApLFg9bigxMzEpLFk9bigxMzIpLEg9bigxMzMpLHE9bigxMzUpLEs9bmV3IHUuQ29udGFpbmVyO2YoKShLLCExKTtmdW5jdGlvbiBaKCl7dmFyIHQ9bmV3IHUuQ29udGFpbmVyO3JldHVybiB0LnBhcmVudD1LLHQuYmluZCh4LmEuU3lzdGVtcykudG8oVy5hKS5pblNpbmdsZXRvblNjb3BlKCkud2hlblRhcmdldE5hbWVkKHguYS5TY2VuZUdyYXBoU3lzdGVtKSx0LmJpbmQoeC5hLlN5c3RlbXMpLnRvKEUuYSkuaW5TaW5nbGV0b25TY29wZSgpLndoZW5UYXJnZXROYW1lZCh4LmEuRnJhbWVHcmFwaFN5c3RlbSksdC5iaW5kKHguYS5TeXN0ZW1zKS50byhDLmEpLmluU2luZ2xldG9uU2NvcGUoKS53aGVuVGFyZ2V0TmFtZWQoeC5hLk1lc2hTeXN0ZW0pLHQuYmluZCh4LmEuU3lzdGVtcykudG8oTy5hKS5pblNpbmdsZXRvblNjb3BlKCkud2hlblRhcmdldE5hbWVkKHguYS5HZW9tZXRyeVN5c3RlbSksdC5iaW5kKHguYS5TeXN0ZW1zKS50byhNLmEpLmluU2luZ2xldG9uU2NvcGUoKS53aGVuVGFyZ2V0TmFtZWQoeC5hLk1hdGVyaWFsU3lzdGVtKSx0LmJpbmQoeC5hLlN5c3RlbXMpLnRvKEQuYSkuaW5TaW5nbGV0b25TY29wZSgpLndoZW5UYXJnZXROYW1lZCh4LmEuUmVuZGVyZXJTeXN0ZW0pLHQuYmluZCh4LmEuUmVzb3VyY2VQb29sKS50byhTKS5pblNpbmdsZXRvblNjb3BlKCksdC5iaW5kKHguYS5Db25maWdTZXJ2aWNlKS50byhZLmEpLmluU2luZ2xldG9uU2NvcGUoKSx0LmJpbmQoeC5hLkludGVyYWN0b3JTZXJ2aWNlKS50byhILmEpLmluU2luZ2xldG9uU2NvcGUoKSx0LmJpbmQoeC5hLlJlbmRlclBhc3MpLnRvKGouYSkuaW5TaW5nbGV0b25TY29wZSgpLndoZW5UYXJnZXROYW1lZChqLmEuSURFTlRJRklFUiksdC5iaW5kKHguYS5SZW5kZXJQYXNzKS50byhJLmEpLmluU2luZ2xldG9uU2NvcGUoKS53aGVuVGFyZ2V0TmFtZWQoSS5hLklERU5USUZJRVIpLHQuYmluZCh4LmEuUmVuZGVyUGFzcykudG8oUC5hKS5pblNpbmdsZXRvblNjb3BlKCkud2hlblRhcmdldE5hbWVkKFAuYS5JREVOVElGSUVSKSx0LmJpbmQoeC5hLlJlbmRlclBhc3NGYWN0b3J5KS50b0ZhY3RvcnkoKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5jb250YWluZXIuZ2V0TmFtZWQoeC5hLlJlbmRlclBhc3MsZSl9fSkpLHR9Sy5iaW5kKHguYS5TaGFkZXJNb2R1bGVTZXJ2aWNlKS50byhxLmEpLmluU2luZ2xldG9uU2NvcGUoKSxLLmJpbmQoeC5hLk5hbWVDb21wb25lbnRNYW5hZ2VyKS50b0NvbnN0YW50VmFsdWUobmV3IGwuYihWKSksSy5iaW5kKHguYS5IaWVyYXJjaHlDb21wb25lbnRNYW5hZ2VyKS50b0NvbnN0YW50VmFsdWUobmV3IGwuYihOLmEpKSxLLmJpbmQoeC5hLlRyYW5zZm9ybUNvbXBvbmVudE1hbmFnZXIpLnRvQ29uc3RhbnRWYWx1ZShuZXcgbC5iKFguYSkpLEsuYmluZCh4LmEuTWVzaENvbXBvbmVudE1hbmFnZXIpLnRvQ29uc3RhbnRWYWx1ZShuZXcgbC5iKFQuYSkpLEsuYmluZCh4LmEuQ3VsbGFibGVDb21wb25lbnRNYW5hZ2VyKS50b0NvbnN0YW50VmFsdWUobmV3IGwuYihBLmEpKSxLLmJpbmQoeC5hLkdlb21ldHJ5Q29tcG9uZW50TWFuYWdlcikudG9Db25zdGFudFZhbHVlKG5ldyBsLmIoXy5hKSksSy5iaW5kKHguYS5NYXRlcmlhbENvbXBvbmVudE1hbmFnZXIpLnRvQ29uc3RhbnRWYWx1ZShuZXcgbC5iKGsuYSkpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSk7dmFyIHI9bigxNik7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pfWZ1bmN0aW9uIG8odCxlKXtyZXR1cm4gaSh0KSppKGUpPyh0WzBdKmVbMF0rdFsxXSplWzFdKS8oaSh0KSppKGUpKToxfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4odFswXSplWzFdPHRbMV0qZVswXT8tMToxKSpNYXRoLmFjb3Mobyh0LGUpKX1mdW5jdGlvbiBzKHQsZSl7dmFyIG49ZVsxXSxpPWVbMl0scz1PYmplY3Qoci5tKShPYmplY3Qoci5vKShlWzNdKSwyKk1hdGguUEkpLHU9ZVs0XSxjPWVbNV0sZj10WzBdLGw9dFsxXSxoPWVbNl0sZD1lWzddLHA9TWF0aC5jb3MocykqKGYtaCkvMitNYXRoLnNpbihzKSoobC1kKS8yLGc9LTEqTWF0aC5zaW4ocykqKGYtaCkvMitNYXRoLmNvcyhzKSoobC1kKS8yLHY9cCpwLyhuKm4pK2cqZy8oaSppKTt2PjEmJihuKj1NYXRoLnNxcnQodiksaSo9TWF0aC5zcXJ0KHYpKTt2YXIgeT1uKm4qKGcqZykraSppKihwKnApLG09eT9NYXRoLnNxcnQoKG4qbiooaSppKS15KS95KToxO3U9PT1jJiYobSo9LTEpLGlzTmFOKG0pJiYobT0wKTt2YXIgYj1pP20qbipnL2k6MCx4PW4/bSotaSpwL246MCx3PShmK2gpLzIrTWF0aC5jb3MocykqYi1NYXRoLnNpbihzKSp4LFM9KGwrZCkvMitNYXRoLnNpbihzKSpiK01hdGguY29zKHMpKngsRT1bKHAtYikvbiwoZy14KS9pXSxfPVsoLTEqcC1iKS9uLCgtMSpnLXgpL2ldLE89YShbMSwwXSxFKSxrPWEoRSxfKTtyZXR1cm4gbyhFLF8pPD0tMSYmKGs9TWF0aC5QSSksbyhFLF8pPj0xJiYoaz0wKSwwPT09YyYmaz4wJiYoay09MipNYXRoLlBJKSwxPT09YyYmazwwJiYoays9MipNYXRoLlBJKSx7Y3g6dyxjeTpTLHJ4Ok9iamVjdChyLmopKHQsW2gsZF0pPzA6bixyeTpPYmplY3Qoci5qKSh0LFtoLGRdKT8wOmksc3RhcnRBbmdsZTpPLGVuZEFuZ2xlOk8rayx4Um90YXRpb246cyxhcmNGbGFnOnUsc3dlZXBGbGFnOmN9fX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj90LmV4cG9ydHM9bj1mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OnQuZXhwb3J0cz1uPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9LG4oZSl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByO2Z1bmN0aW9uIGkodCl7cmV0dXJuKGk9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfSFmdW5jdGlvbihvKXt2YXIgYT0vXlxccysvLHM9L1xccyskLyx1PTAsYz1vLnJvdW5kLGY9by5taW4sbD1vLm1heCxoPW8ucmFuZG9tO2Z1bmN0aW9uIGQodCxlKXtpZihlPWV8fHt9LCh0PXR8fFwiXCIpaW5zdGFuY2VvZiBkKXJldHVybiB0O2lmKCEodGhpcyBpbnN0YW5jZW9mIGQpKXJldHVybiBuZXcgZCh0LGUpO3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBlPXtyOjAsZzowLGI6MH0sbj0xLHI9bnVsbCx1PW51bGwsYz1udWxsLGg9ITEsZD0hMTtcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9ZnVuY3Rpb24odCl7dD10LnJlcGxhY2UoYSxcIlwiKS5yZXBsYWNlKHMsXCJcIikudG9Mb3dlckNhc2UoKTt2YXIgZSxuPSExO2lmKElbdF0pdD1JW3RdLG49ITA7ZWxzZSBpZihcInRyYW5zcGFyZW50XCI9PXQpcmV0dXJue3I6MCxnOjAsYjowLGE6MCxmb3JtYXQ6XCJuYW1lXCJ9O2lmKGU9Vy5yZ2IuZXhlYyh0KSlyZXR1cm57cjplWzFdLGc6ZVsyXSxiOmVbM119O2lmKGU9Vy5yZ2JhLmV4ZWModCkpcmV0dXJue3I6ZVsxXSxnOmVbMl0sYjplWzNdLGE6ZVs0XX07aWYoZT1XLmhzbC5leGVjKHQpKXJldHVybntoOmVbMV0sczplWzJdLGw6ZVszXX07aWYoZT1XLmhzbGEuZXhlYyh0KSlyZXR1cm57aDplWzFdLHM6ZVsyXSxsOmVbM10sYTplWzRdfTtpZihlPVcuaHN2LmV4ZWModCkpcmV0dXJue2g6ZVsxXSxzOmVbMl0sdjplWzNdfTtpZihlPVcuaHN2YS5leGVjKHQpKXJldHVybntoOmVbMV0sczplWzJdLHY6ZVszXSxhOmVbNF19O2lmKGU9Vy5oZXg4LmV4ZWModCkpcmV0dXJue3I6UihlWzFdKSxnOlIoZVsyXSksYjpSKGVbM10pLGE6RihlWzRdKSxmb3JtYXQ6bj9cIm5hbWVcIjpcImhleDhcIn07aWYoZT1XLmhleDYuZXhlYyh0KSlyZXR1cm57cjpSKGVbMV0pLGc6UihlWzJdKSxiOlIoZVszXSksZm9ybWF0Om4/XCJuYW1lXCI6XCJoZXhcIn07aWYoZT1XLmhleDQuZXhlYyh0KSlyZXR1cm57cjpSKGVbMV0rXCJcIitlWzFdKSxnOlIoZVsyXStcIlwiK2VbMl0pLGI6UihlWzNdK1wiXCIrZVszXSksYTpGKGVbNF0rXCJcIitlWzRdKSxmb3JtYXQ6bj9cIm5hbWVcIjpcImhleDhcIn07aWYoZT1XLmhleDMuZXhlYyh0KSlyZXR1cm57cjpSKGVbMV0rXCJcIitlWzFdKSxnOlIoZVsyXStcIlwiK2VbMl0pLGI6UihlWzNdK1wiXCIrZVszXSksZm9ybWF0Om4/XCJuYW1lXCI6XCJoZXhcIn07cmV0dXJuITF9KHQpKTtcIm9iamVjdFwiPT1pKHQpJiYoWCh0LnIpJiZYKHQuZykmJlgodC5iKT8ocD10LnIsZz10Lmcsdj10LmIsZT17cjoyNTUqRChwLDI1NSksZzoyNTUqRChnLDI1NSksYjoyNTUqRCh2LDI1NSl9LGg9ITAsZD1cIiVcIj09PVN0cmluZyh0LnIpLnN1YnN0cigtMSk/XCJwcmdiXCI6XCJyZ2JcIik6WCh0LmgpJiZYKHQucykmJlgodC52KT8ocj1CKHQucyksdT1CKHQudiksZT1mdW5jdGlvbih0LGUsbil7dD02KkQodCwzNjApLGU9RChlLDEwMCksbj1EKG4sMTAwKTt2YXIgcj1vLmZsb29yKHQpLGk9dC1yLGE9biooMS1lKSxzPW4qKDEtaSplKSx1PW4qKDEtKDEtaSkqZSksYz1yJTY7cmV0dXJue3I6MjU1KltuLHMsYSxhLHUsbl1bY10sZzoyNTUqW3UsbixuLHMsYSxhXVtjXSxiOjI1NSpbYSxhLHUsbixuLHNdW2NdfX0odC5oLHIsdSksaD0hMCxkPVwiaHN2XCIpOlgodC5oKSYmWCh0LnMpJiZYKHQubCkmJihyPUIodC5zKSxjPUIodC5sKSxlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpLG87ZnVuY3Rpb24gYSh0LGUsbil7cmV0dXJuIG48MCYmKG4rPTEpLG4+MSYmKG4tPTEpLG48MS82P3QrNiooZS10KSpuOm48LjU/ZTpuPDIvMz90KyhlLXQpKigyLzMtbikqNjp0fWlmKHQ9RCh0LDM2MCksZT1EKGUsMTAwKSxuPUQobiwxMDApLDA9PT1lKXI9aT1vPW47ZWxzZXt2YXIgcz1uPC41P24qKDErZSk6bitlLW4qZSx1PTIqbi1zO3I9YSh1LHMsdCsxLzMpLGk9YSh1LHMsdCksbz1hKHUscyx0LTEvMyl9cmV0dXJue3I6MjU1KnIsZzoyNTUqaSxiOjI1NSpvfX0odC5oLHIsYyksaD0hMCxkPVwiaHNsXCIpLHQuaGFzT3duUHJvcGVydHkoXCJhXCIpJiYobj10LmEpKTt2YXIgcCxnLHY7cmV0dXJuIG49aihuKSx7b2s6aCxmb3JtYXQ6dC5mb3JtYXR8fGQscjpmKDI1NSxsKGUuciwwKSksZzpmKDI1NSxsKGUuZywwKSksYjpmKDI1NSxsKGUuYiwwKSksYTpufX0odCk7dGhpcy5fb3JpZ2luYWxJbnB1dD10LHRoaXMuX3I9bi5yLHRoaXMuX2c9bi5nLHRoaXMuX2I9bi5iLHRoaXMuX2E9bi5hLHRoaXMuX3JvdW5kQT1jKDEwMCp0aGlzLl9hKS8xMDAsdGhpcy5fZm9ybWF0PWUuZm9ybWF0fHxuLmZvcm1hdCx0aGlzLl9ncmFkaWVudFR5cGU9ZS5ncmFkaWVudFR5cGUsdGhpcy5fcjwxJiYodGhpcy5fcj1jKHRoaXMuX3IpKSx0aGlzLl9nPDEmJih0aGlzLl9nPWModGhpcy5fZykpLHRoaXMuX2I8MSYmKHRoaXMuX2I9Yyh0aGlzLl9iKSksdGhpcy5fb2s9bi5vayx0aGlzLl90Y19pZD11Kyt9ZnVuY3Rpb24gcCh0LGUsbil7dD1EKHQsMjU1KSxlPUQoZSwyNTUpLG49RChuLDI1NSk7dmFyIHIsaSxvPWwodCxlLG4pLGE9Zih0LGUsbikscz0obythKS8yO2lmKG89PWEpcj1pPTA7ZWxzZXt2YXIgdT1vLWE7c3dpdGNoKGk9cz4uNT91LygyLW8tYSk6dS8obythKSxvKXtjYXNlIHQ6cj0oZS1uKS91KyhlPG4/NjowKTticmVhaztjYXNlIGU6cj0obi10KS91KzI7YnJlYWs7Y2FzZSBuOnI9KHQtZSkvdSs0fXIvPTZ9cmV0dXJue2g6cixzOmksbDpzfX1mdW5jdGlvbiBnKHQsZSxuKXt0PUQodCwyNTUpLGU9RChlLDI1NSksbj1EKG4sMjU1KTt2YXIgcixpLG89bCh0LGUsbiksYT1mKHQsZSxuKSxzPW8sdT1vLWE7aWYoaT0wPT09bz8wOnUvbyxvPT1hKXI9MDtlbHNle3N3aXRjaChvKXtjYXNlIHQ6cj0oZS1uKS91KyhlPG4/NjowKTticmVhaztjYXNlIGU6cj0obi10KS91KzI7YnJlYWs7Y2FzZSBuOnI9KHQtZSkvdSs0fXIvPTZ9cmV0dXJue2g6cixzOmksdjpzfX1mdW5jdGlvbiB2KHQsZSxuLHIpe3ZhciBpPVtMKGModCkudG9TdHJpbmcoMTYpKSxMKGMoZSkudG9TdHJpbmcoMTYpKSxMKGMobikudG9TdHJpbmcoMTYpKV07cmV0dXJuIHImJmlbMF0uY2hhckF0KDApPT1pWzBdLmNoYXJBdCgxKSYmaVsxXS5jaGFyQXQoMCk9PWlbMV0uY2hhckF0KDEpJiZpWzJdLmNoYXJBdCgwKT09aVsyXS5jaGFyQXQoMSk/aVswXS5jaGFyQXQoMCkraVsxXS5jaGFyQXQoMCkraVsyXS5jaGFyQXQoMCk6aS5qb2luKFwiXCIpfWZ1bmN0aW9uIHkodCxlLG4scil7cmV0dXJuW0woRyhyKSksTChjKHQpLnRvU3RyaW5nKDE2KSksTChjKGUpLnRvU3RyaW5nKDE2KSksTChjKG4pLnRvU3RyaW5nKDE2KSldLmpvaW4oXCJcIil9ZnVuY3Rpb24gbSh0LGUpe2U9MD09PWU/MDplfHwxMDt2YXIgbj1kKHQpLnRvSHNsKCk7cmV0dXJuIG4ucy09ZS8xMDAsbi5zPU4obi5zKSxkKG4pfWZ1bmN0aW9uIGIodCxlKXtlPTA9PT1lPzA6ZXx8MTA7dmFyIG49ZCh0KS50b0hzbCgpO3JldHVybiBuLnMrPWUvMTAwLG4ucz1OKG4ucyksZChuKX1mdW5jdGlvbiB4KHQpe3JldHVybiBkKHQpLmRlc2F0dXJhdGUoMTAwKX1mdW5jdGlvbiB3KHQsZSl7ZT0wPT09ZT8wOmV8fDEwO3ZhciBuPWQodCkudG9Ic2woKTtyZXR1cm4gbi5sKz1lLzEwMCxuLmw9TihuLmwpLGQobil9ZnVuY3Rpb24gUyh0LGUpe2U9MD09PWU/MDplfHwxMDt2YXIgbj1kKHQpLnRvUmdiKCk7cmV0dXJuIG4ucj1sKDAsZigyNTUsbi5yLWMoLWUvMTAwKjI1NSkpKSxuLmc9bCgwLGYoMjU1LG4uZy1jKC1lLzEwMCoyNTUpKSksbi5iPWwoMCxmKDI1NSxuLmItYygtZS8xMDAqMjU1KSkpLGQobil9ZnVuY3Rpb24gRSh0LGUpe2U9MD09PWU/MDplfHwxMDt2YXIgbj1kKHQpLnRvSHNsKCk7cmV0dXJuIG4ubC09ZS8xMDAsbi5sPU4obi5sKSxkKG4pfWZ1bmN0aW9uIF8odCxlKXt2YXIgbj1kKHQpLnRvSHNsKCkscj0obi5oK2UpJTM2MDtyZXR1cm4gbi5oPXI8MD8zNjArcjpyLGQobil9ZnVuY3Rpb24gTyh0KXt2YXIgZT1kKHQpLnRvSHNsKCk7cmV0dXJuIGUuaD0oZS5oKzE4MCklMzYwLGQoZSl9ZnVuY3Rpb24gayh0KXt2YXIgZT1kKHQpLnRvSHNsKCksbj1lLmg7cmV0dXJuW2QodCksZCh7aDoobisxMjApJTM2MCxzOmUucyxsOmUubH0pLGQoe2g6KG4rMjQwKSUzNjAsczplLnMsbDplLmx9KV19ZnVuY3Rpb24gTSh0KXt2YXIgZT1kKHQpLnRvSHNsKCksbj1lLmg7cmV0dXJuW2QodCksZCh7aDoobis5MCklMzYwLHM6ZS5zLGw6ZS5sfSksZCh7aDoobisxODApJTM2MCxzOmUucyxsOmUubH0pLGQoe2g6KG4rMjcwKSUzNjAsczplLnMsbDplLmx9KV19ZnVuY3Rpb24gQSh0KXt2YXIgZT1kKHQpLnRvSHNsKCksbj1lLmg7cmV0dXJuW2QodCksZCh7aDoobis3MiklMzYwLHM6ZS5zLGw6ZS5sfSksZCh7aDoobisyMTYpJTM2MCxzOmUucyxsOmUubH0pXX1mdW5jdGlvbiBUKHQsZSxuKXtlPWV8fDYsbj1ufHwzMDt2YXIgcj1kKHQpLnRvSHNsKCksaT0zNjAvbixvPVtkKHQpXTtmb3Ioci5oPShyLmgtKGkqZT4+MSkrNzIwKSUzNjA7LS1lOylyLmg9KHIuaCtpKSUzNjAsby5wdXNoKGQocikpO3JldHVybiBvfWZ1bmN0aW9uIEModCxlKXtlPWV8fDY7Zm9yKHZhciBuPWQodCkudG9Ic3YoKSxyPW4uaCxpPW4ucyxvPW4udixhPVtdLHM9MS9lO2UtLTspYS5wdXNoKGQoe2g6cixzOmksdjpvfSkpLG89KG8rcyklMTtyZXR1cm4gYX1kLnByb3RvdHlwZT17aXNEYXJrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJpZ2h0bmVzcygpPDEyOH0saXNMaWdodDpmdW5jdGlvbigpe3JldHVybiF0aGlzLmlzRGFyaygpfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29rfSxnZXRPcmlnaW5hbElucHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWdpbmFsSW5wdXR9LGdldEZvcm1hdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb3JtYXR9LGdldEFscGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F9LGdldEJyaWdodG5lc3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRvUmdiKCk7cmV0dXJuKDI5OSp0LnIrNTg3KnQuZysxMTQqdC5iKS8xZTN9LGdldEx1bWluYW5jZTpmdW5jdGlvbigpe3ZhciB0LGUsbixyPXRoaXMudG9SZ2IoKTtyZXR1cm4gdD1yLnIvMjU1LGU9ci5nLzI1NSxuPXIuYi8yNTUsLjIxMjYqKHQ8PS4wMzkyOD90LzEyLjkyOm8ucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCkpKy43MTUyKihlPD0uMDM5Mjg/ZS8xMi45MjpvLnBvdygoZSsuMDU1KS8xLjA1NSwyLjQpKSsuMDcyMioobjw9LjAzOTI4P24vMTIuOTI6by5wb3coKG4rLjA1NSkvMS4wNTUsMi40KSl9LHNldEFscGhhOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hPWoodCksdGhpcy5fcm91bmRBPWMoMTAwKnRoaXMuX2EpLzEwMCx0aGlzfSx0b0hzdjpmdW5jdGlvbigpe3ZhciB0PWcodGhpcy5fcix0aGlzLl9nLHRoaXMuX2IpO3JldHVybntoOjM2MCp0Lmgsczp0LnMsdjp0LnYsYTp0aGlzLl9hfX0sdG9Ic3ZTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD1nKHRoaXMuX3IsdGhpcy5fZyx0aGlzLl9iKSxlPWMoMzYwKnQuaCksbj1jKDEwMCp0LnMpLHI9YygxMDAqdC52KTtyZXR1cm4gMT09dGhpcy5fYT9cImhzdihcIitlK1wiLCBcIituK1wiJSwgXCIrcitcIiUpXCI6XCJoc3ZhKFwiK2UrXCIsIFwiK24rXCIlLCBcIityK1wiJSwgXCIrdGhpcy5fcm91bmRBK1wiKVwifSx0b0hzbDpmdW5jdGlvbigpe3ZhciB0PXAodGhpcy5fcix0aGlzLl9nLHRoaXMuX2IpO3JldHVybntoOjM2MCp0Lmgsczp0LnMsbDp0LmwsYTp0aGlzLl9hfX0sdG9Ic2xTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD1wKHRoaXMuX3IsdGhpcy5fZyx0aGlzLl9iKSxlPWMoMzYwKnQuaCksbj1jKDEwMCp0LnMpLHI9YygxMDAqdC5sKTtyZXR1cm4gMT09dGhpcy5fYT9cImhzbChcIitlK1wiLCBcIituK1wiJSwgXCIrcitcIiUpXCI6XCJoc2xhKFwiK2UrXCIsIFwiK24rXCIlLCBcIityK1wiJSwgXCIrdGhpcy5fcm91bmRBK1wiKVwifSx0b0hleDpmdW5jdGlvbih0KXtyZXR1cm4gdih0aGlzLl9yLHRoaXMuX2csdGhpcy5fYix0KX0sdG9IZXhTdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuXCIjXCIrdGhpcy50b0hleCh0KX0sdG9IZXg4OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPVtMKGModCkudG9TdHJpbmcoMTYpKSxMKGMoZSkudG9TdHJpbmcoMTYpKSxMKGMobikudG9TdHJpbmcoMTYpKSxMKEcocikpXTtpZihpJiZvWzBdLmNoYXJBdCgwKT09b1swXS5jaGFyQXQoMSkmJm9bMV0uY2hhckF0KDApPT1vWzFdLmNoYXJBdCgxKSYmb1syXS5jaGFyQXQoMCk9PW9bMl0uY2hhckF0KDEpJiZvWzNdLmNoYXJBdCgwKT09b1szXS5jaGFyQXQoMSkpcmV0dXJuIG9bMF0uY2hhckF0KDApK29bMV0uY2hhckF0KDApK29bMl0uY2hhckF0KDApK29bM10uY2hhckF0KDApO3JldHVybiBvLmpvaW4oXCJcIil9KHRoaXMuX3IsdGhpcy5fZyx0aGlzLl9iLHRoaXMuX2EsdCl9LHRvSGV4OFN0cmluZzpmdW5jdGlvbih0KXtyZXR1cm5cIiNcIit0aGlzLnRvSGV4OCh0KX0sdG9SZ2I6ZnVuY3Rpb24oKXtyZXR1cm57cjpjKHRoaXMuX3IpLGc6Yyh0aGlzLl9nKSxiOmModGhpcy5fYiksYTp0aGlzLl9hfX0sdG9SZ2JTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gMT09dGhpcy5fYT9cInJnYihcIitjKHRoaXMuX3IpK1wiLCBcIitjKHRoaXMuX2cpK1wiLCBcIitjKHRoaXMuX2IpK1wiKVwiOlwicmdiYShcIitjKHRoaXMuX3IpK1wiLCBcIitjKHRoaXMuX2cpK1wiLCBcIitjKHRoaXMuX2IpK1wiLCBcIit0aGlzLl9yb3VuZEErXCIpXCJ9LHRvUGVyY2VudGFnZVJnYjpmdW5jdGlvbigpe3JldHVybntyOmMoMTAwKkQodGhpcy5fciwyNTUpKStcIiVcIixnOmMoMTAwKkQodGhpcy5fZywyNTUpKStcIiVcIixiOmMoMTAwKkQodGhpcy5fYiwyNTUpKStcIiVcIixhOnRoaXMuX2F9fSx0b1BlcmNlbnRhZ2VSZ2JTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gMT09dGhpcy5fYT9cInJnYihcIitjKDEwMCpEKHRoaXMuX3IsMjU1KSkrXCIlLCBcIitjKDEwMCpEKHRoaXMuX2csMjU1KSkrXCIlLCBcIitjKDEwMCpEKHRoaXMuX2IsMjU1KSkrXCIlKVwiOlwicmdiYShcIitjKDEwMCpEKHRoaXMuX3IsMjU1KSkrXCIlLCBcIitjKDEwMCpEKHRoaXMuX2csMjU1KSkrXCIlLCBcIitjKDEwMCpEKHRoaXMuX2IsMjU1KSkrXCIlLCBcIit0aGlzLl9yb3VuZEErXCIpXCJ9LHRvTmFtZTpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fYT9cInRyYW5zcGFyZW50XCI6ISh0aGlzLl9hPDEpJiYoUFt2KHRoaXMuX3IsdGhpcy5fZyx0aGlzLl9iLCEwKV18fCExKX0sdG9GaWx0ZXI6ZnVuY3Rpb24odCl7dmFyIGU9XCIjXCIreSh0aGlzLl9yLHRoaXMuX2csdGhpcy5fYix0aGlzLl9hKSxuPWUscj10aGlzLl9ncmFkaWVudFR5cGU/XCJHcmFkaWVudFR5cGUgPSAxLCBcIjpcIlwiO2lmKHQpe3ZhciBpPWQodCk7bj1cIiNcIit5KGkuX3IsaS5fZyxpLl9iLGkuX2EpfXJldHVyblwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KFwiK3IrXCJzdGFydENvbG9yc3RyPVwiK2UrXCIsZW5kQ29sb3JzdHI9XCIrbitcIilcIn0sdG9TdHJpbmc6ZnVuY3Rpb24odCl7dmFyIGU9ISF0O3Q9dHx8dGhpcy5fZm9ybWF0O3ZhciBuPSExLHI9dGhpcy5fYTwxJiZ0aGlzLl9hPj0wO3JldHVybiBlfHwhcnx8XCJoZXhcIiE9PXQmJlwiaGV4NlwiIT09dCYmXCJoZXgzXCIhPT10JiZcImhleDRcIiE9PXQmJlwiaGV4OFwiIT09dCYmXCJuYW1lXCIhPT10PyhcInJnYlwiPT09dCYmKG49dGhpcy50b1JnYlN0cmluZygpKSxcInByZ2JcIj09PXQmJihuPXRoaXMudG9QZXJjZW50YWdlUmdiU3RyaW5nKCkpLFwiaGV4XCIhPT10JiZcImhleDZcIiE9PXR8fChuPXRoaXMudG9IZXhTdHJpbmcoKSksXCJoZXgzXCI9PT10JiYobj10aGlzLnRvSGV4U3RyaW5nKCEwKSksXCJoZXg0XCI9PT10JiYobj10aGlzLnRvSGV4OFN0cmluZyghMCkpLFwiaGV4OFwiPT09dCYmKG49dGhpcy50b0hleDhTdHJpbmcoKSksXCJuYW1lXCI9PT10JiYobj10aGlzLnRvTmFtZSgpKSxcImhzbFwiPT09dCYmKG49dGhpcy50b0hzbFN0cmluZygpKSxcImhzdlwiPT09dCYmKG49dGhpcy50b0hzdlN0cmluZygpKSxufHx0aGlzLnRvSGV4U3RyaW5nKCkpOlwibmFtZVwiPT09dCYmMD09PXRoaXMuX2E/dGhpcy50b05hbWUoKTp0aGlzLnRvUmdiU3RyaW5nKCl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIGQodGhpcy50b1N0cmluZygpKX0sX2FwcGx5TW9kaWZpY2F0aW9uOmZ1bmN0aW9uKHQsZSl7dmFyIG49dC5hcHBseShudWxsLFt0aGlzXS5jb25jYXQoW10uc2xpY2UuY2FsbChlKSkpO3JldHVybiB0aGlzLl9yPW4uX3IsdGhpcy5fZz1uLl9nLHRoaXMuX2I9bi5fYix0aGlzLnNldEFscGhhKG4uX2EpLHRoaXN9LGxpZ2h0ZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24odyxhcmd1bWVudHMpfSxicmlnaHRlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihTLGFyZ3VtZW50cyl9LGRhcmtlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihFLGFyZ3VtZW50cyl9LGRlc2F0dXJhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24obSxhcmd1bWVudHMpfSxzYXR1cmF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihiLGFyZ3VtZW50cyl9LGdyZXlzY2FsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbih4LGFyZ3VtZW50cyl9LHNwaW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oXyxhcmd1bWVudHMpfSxfYXBwbHlDb21iaW5hdGlvbjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmFwcGx5KG51bGwsW3RoaXNdLmNvbmNhdChbXS5zbGljZS5jYWxsKGUpKSl9LGFuYWxvZ291czpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKFQsYXJndW1lbnRzKX0sY29tcGxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKE8sYXJndW1lbnRzKX0sbW9ub2Nocm9tYXRpYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKEMsYXJndW1lbnRzKX0sc3BsaXRjb21wbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24oQSxhcmd1bWVudHMpfSx0cmlhZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKGssYXJndW1lbnRzKX0sdGV0cmFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24oTSxhcmd1bWVudHMpfX0sZC5mcm9tUmF0aW89ZnVuY3Rpb24odCxlKXtpZihcIm9iamVjdFwiPT1pKHQpKXt2YXIgbj17fTtmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYobltyXT1cImFcIj09PXI/dFtyXTpCKHRbcl0pKTt0PW59cmV0dXJuIGQodCxlKX0sZC5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKCF0fHwhZSkmJmQodCkudG9SZ2JTdHJpbmcoKT09ZChlKS50b1JnYlN0cmluZygpfSxkLnJhbmRvbT1mdW5jdGlvbigpe3JldHVybiBkLmZyb21SYXRpbyh7cjpoKCksZzpoKCksYjpoKCl9KX0sZC5taXg9ZnVuY3Rpb24odCxlLG4pe249MD09PW4/MDpufHw1MDt2YXIgcj1kKHQpLnRvUmdiKCksaT1kKGUpLnRvUmdiKCksbz1uLzEwMDtyZXR1cm4gZCh7cjooaS5yLXIucikqbytyLnIsZzooaS5nLXIuZykqbytyLmcsYjooaS5iLXIuYikqbytyLmIsYTooaS5hLXIuYSkqbytyLmF9KX0sZC5yZWFkYWJpbGl0eT1mdW5jdGlvbih0LGUpe3ZhciBuPWQodCkscj1kKGUpO3JldHVybihvLm1heChuLmdldEx1bWluYW5jZSgpLHIuZ2V0THVtaW5hbmNlKCkpKy4wNSkvKG8ubWluKG4uZ2V0THVtaW5hbmNlKCksci5nZXRMdW1pbmFuY2UoKSkrLjA1KX0sZC5pc1JlYWRhYmxlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpLG89ZC5yZWFkYWJpbGl0eSh0LGUpO3N3aXRjaChpPSExLChyPWZ1bmN0aW9uKHQpe3ZhciBlLG47ZT0oKHQ9dHx8e2xldmVsOlwiQUFcIixzaXplOlwic21hbGxcIn0pLmxldmVsfHxcIkFBXCIpLnRvVXBwZXJDYXNlKCksbj0odC5zaXplfHxcInNtYWxsXCIpLnRvTG93ZXJDYXNlKCksXCJBQVwiIT09ZSYmXCJBQUFcIiE9PWUmJihlPVwiQUFcIik7XCJzbWFsbFwiIT09biYmXCJsYXJnZVwiIT09biYmKG49XCJzbWFsbFwiKTtyZXR1cm57bGV2ZWw6ZSxzaXplOm59fShuKSkubGV2ZWwrci5zaXplKXtjYXNlXCJBQXNtYWxsXCI6Y2FzZVwiQUFBbGFyZ2VcIjppPW8+PTQuNTticmVhaztjYXNlXCJBQWxhcmdlXCI6aT1vPj0zO2JyZWFrO2Nhc2VcIkFBQXNtYWxsXCI6aT1vPj03fXJldHVybiBpfSxkLm1vc3RSZWFkYWJsZT1mdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLGEscz1udWxsLHU9MDtpPShuPW58fHt9KS5pbmNsdWRlRmFsbGJhY2tDb2xvcnMsbz1uLmxldmVsLGE9bi5zaXplO2Zvcih2YXIgYz0wO2M8ZS5sZW5ndGg7YysrKShyPWQucmVhZGFiaWxpdHkodCxlW2NdKSk+dSYmKHU9cixzPWQoZVtjXSkpO3JldHVybiBkLmlzUmVhZGFibGUodCxzLHtsZXZlbDpvLHNpemU6YX0pfHwhaT9zOihuLmluY2x1ZGVGYWxsYmFja0NvbG9ycz0hMSxkLm1vc3RSZWFkYWJsZSh0LFtcIiNmZmZcIixcIiMwMDBcIl0sbikpfTt2YXIgST1kLm5hbWVzPXthbGljZWJsdWU6XCJmMGY4ZmZcIixhbnRpcXVld2hpdGU6XCJmYWViZDdcIixhcXVhOlwiMGZmXCIsYXF1YW1hcmluZTpcIjdmZmZkNFwiLGF6dXJlOlwiZjBmZmZmXCIsYmVpZ2U6XCJmNWY1ZGNcIixiaXNxdWU6XCJmZmU0YzRcIixibGFjazpcIjAwMFwiLGJsYW5jaGVkYWxtb25kOlwiZmZlYmNkXCIsYmx1ZTpcIjAwZlwiLGJsdWV2aW9sZXQ6XCI4YTJiZTJcIixicm93bjpcImE1MmEyYVwiLGJ1cmx5d29vZDpcImRlYjg4N1wiLGJ1cm50c2llbm5hOlwiZWE3ZTVkXCIsY2FkZXRibHVlOlwiNWY5ZWEwXCIsY2hhcnRyZXVzZTpcIjdmZmYwMFwiLGNob2NvbGF0ZTpcImQyNjkxZVwiLGNvcmFsOlwiZmY3ZjUwXCIsY29ybmZsb3dlcmJsdWU6XCI2NDk1ZWRcIixjb3Juc2lsazpcImZmZjhkY1wiLGNyaW1zb246XCJkYzE0M2NcIixjeWFuOlwiMGZmXCIsZGFya2JsdWU6XCIwMDAwOGJcIixkYXJrY3lhbjpcIjAwOGI4YlwiLGRhcmtnb2xkZW5yb2Q6XCJiODg2MGJcIixkYXJrZ3JheTpcImE5YTlhOVwiLGRhcmtncmVlbjpcIjAwNjQwMFwiLGRhcmtncmV5OlwiYTlhOWE5XCIsZGFya2toYWtpOlwiYmRiNzZiXCIsZGFya21hZ2VudGE6XCI4YjAwOGJcIixkYXJrb2xpdmVncmVlbjpcIjU1NmIyZlwiLGRhcmtvcmFuZ2U6XCJmZjhjMDBcIixkYXJrb3JjaGlkOlwiOTkzMmNjXCIsZGFya3JlZDpcIjhiMDAwMFwiLGRhcmtzYWxtb246XCJlOTk2N2FcIixkYXJrc2VhZ3JlZW46XCI4ZmJjOGZcIixkYXJrc2xhdGVibHVlOlwiNDgzZDhiXCIsZGFya3NsYXRlZ3JheTpcIjJmNGY0ZlwiLGRhcmtzbGF0ZWdyZXk6XCIyZjRmNGZcIixkYXJrdHVycXVvaXNlOlwiMDBjZWQxXCIsZGFya3Zpb2xldDpcIjk0MDBkM1wiLGRlZXBwaW5rOlwiZmYxNDkzXCIsZGVlcHNreWJsdWU6XCIwMGJmZmZcIixkaW1ncmF5OlwiNjk2OTY5XCIsZGltZ3JleTpcIjY5Njk2OVwiLGRvZGdlcmJsdWU6XCIxZTkwZmZcIixmaXJlYnJpY2s6XCJiMjIyMjJcIixmbG9yYWx3aGl0ZTpcImZmZmFmMFwiLGZvcmVzdGdyZWVuOlwiMjI4YjIyXCIsZnVjaHNpYTpcImYwZlwiLGdhaW5zYm9ybzpcImRjZGNkY1wiLGdob3N0d2hpdGU6XCJmOGY4ZmZcIixnb2xkOlwiZmZkNzAwXCIsZ29sZGVucm9kOlwiZGFhNTIwXCIsZ3JheTpcIjgwODA4MFwiLGdyZWVuOlwiMDA4MDAwXCIsZ3JlZW55ZWxsb3c6XCJhZGZmMmZcIixncmV5OlwiODA4MDgwXCIsaG9uZXlkZXc6XCJmMGZmZjBcIixob3RwaW5rOlwiZmY2OWI0XCIsaW5kaWFucmVkOlwiY2Q1YzVjXCIsaW5kaWdvOlwiNGIwMDgyXCIsaXZvcnk6XCJmZmZmZjBcIixraGFraTpcImYwZTY4Y1wiLGxhdmVuZGVyOlwiZTZlNmZhXCIsbGF2ZW5kZXJibHVzaDpcImZmZjBmNVwiLGxhd25ncmVlbjpcIjdjZmMwMFwiLGxlbW9uY2hpZmZvbjpcImZmZmFjZFwiLGxpZ2h0Ymx1ZTpcImFkZDhlNlwiLGxpZ2h0Y29yYWw6XCJmMDgwODBcIixsaWdodGN5YW46XCJlMGZmZmZcIixsaWdodGdvbGRlbnJvZHllbGxvdzpcImZhZmFkMlwiLGxpZ2h0Z3JheTpcImQzZDNkM1wiLGxpZ2h0Z3JlZW46XCI5MGVlOTBcIixsaWdodGdyZXk6XCJkM2QzZDNcIixsaWdodHBpbms6XCJmZmI2YzFcIixsaWdodHNhbG1vbjpcImZmYTA3YVwiLGxpZ2h0c2VhZ3JlZW46XCIyMGIyYWFcIixsaWdodHNreWJsdWU6XCI4N2NlZmFcIixsaWdodHNsYXRlZ3JheTpcIjc4OVwiLGxpZ2h0c2xhdGVncmV5OlwiNzg5XCIsbGlnaHRzdGVlbGJsdWU6XCJiMGM0ZGVcIixsaWdodHllbGxvdzpcImZmZmZlMFwiLGxpbWU6XCIwZjBcIixsaW1lZ3JlZW46XCIzMmNkMzJcIixsaW5lbjpcImZhZjBlNlwiLG1hZ2VudGE6XCJmMGZcIixtYXJvb246XCI4MDAwMDBcIixtZWRpdW1hcXVhbWFyaW5lOlwiNjZjZGFhXCIsbWVkaXVtYmx1ZTpcIjAwMDBjZFwiLG1lZGl1bW9yY2hpZDpcImJhNTVkM1wiLG1lZGl1bXB1cnBsZTpcIjkzNzBkYlwiLG1lZGl1bXNlYWdyZWVuOlwiM2NiMzcxXCIsbWVkaXVtc2xhdGVibHVlOlwiN2I2OGVlXCIsbWVkaXVtc3ByaW5nZ3JlZW46XCIwMGZhOWFcIixtZWRpdW10dXJxdW9pc2U6XCI0OGQxY2NcIixtZWRpdW12aW9sZXRyZWQ6XCJjNzE1ODVcIixtaWRuaWdodGJsdWU6XCIxOTE5NzBcIixtaW50Y3JlYW06XCJmNWZmZmFcIixtaXN0eXJvc2U6XCJmZmU0ZTFcIixtb2NjYXNpbjpcImZmZTRiNVwiLG5hdmFqb3doaXRlOlwiZmZkZWFkXCIsbmF2eTpcIjAwMDA4MFwiLG9sZGxhY2U6XCJmZGY1ZTZcIixvbGl2ZTpcIjgwODAwMFwiLG9saXZlZHJhYjpcIjZiOGUyM1wiLG9yYW5nZTpcImZmYTUwMFwiLG9yYW5nZXJlZDpcImZmNDUwMFwiLG9yY2hpZDpcImRhNzBkNlwiLHBhbGVnb2xkZW5yb2Q6XCJlZWU4YWFcIixwYWxlZ3JlZW46XCI5OGZiOThcIixwYWxldHVycXVvaXNlOlwiYWZlZWVlXCIscGFsZXZpb2xldHJlZDpcImRiNzA5M1wiLHBhcGF5YXdoaXA6XCJmZmVmZDVcIixwZWFjaHB1ZmY6XCJmZmRhYjlcIixwZXJ1OlwiY2Q4NTNmXCIscGluazpcImZmYzBjYlwiLHBsdW06XCJkZGEwZGRcIixwb3dkZXJibHVlOlwiYjBlMGU2XCIscHVycGxlOlwiODAwMDgwXCIscmViZWNjYXB1cnBsZTpcIjY2MzM5OVwiLHJlZDpcImYwMFwiLHJvc3licm93bjpcImJjOGY4ZlwiLHJveWFsYmx1ZTpcIjQxNjllMVwiLHNhZGRsZWJyb3duOlwiOGI0NTEzXCIsc2FsbW9uOlwiZmE4MDcyXCIsc2FuZHlicm93bjpcImY0YTQ2MFwiLHNlYWdyZWVuOlwiMmU4YjU3XCIsc2Vhc2hlbGw6XCJmZmY1ZWVcIixzaWVubmE6XCJhMDUyMmRcIixzaWx2ZXI6XCJjMGMwYzBcIixza3libHVlOlwiODdjZWViXCIsc2xhdGVibHVlOlwiNmE1YWNkXCIsc2xhdGVncmF5OlwiNzA4MDkwXCIsc2xhdGVncmV5OlwiNzA4MDkwXCIsc25vdzpcImZmZmFmYVwiLHNwcmluZ2dyZWVuOlwiMDBmZjdmXCIsc3RlZWxibHVlOlwiNDY4MmI0XCIsdGFuOlwiZDJiNDhjXCIsdGVhbDpcIjAwODA4MFwiLHRoaXN0bGU6XCJkOGJmZDhcIix0b21hdG86XCJmZjYzNDdcIix0dXJxdW9pc2U6XCI0MGUwZDBcIix2aW9sZXQ6XCJlZTgyZWVcIix3aGVhdDpcImY1ZGViM1wiLHdoaXRlOlwiZmZmXCIsd2hpdGVzbW9rZTpcImY1ZjVmNVwiLHllbGxvdzpcImZmMFwiLHllbGxvd2dyZWVuOlwiOWFjZDMyXCJ9LFA9ZC5oZXhOYW1lcz1mdW5jdGlvbih0KXt2YXIgZT17fTtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYoZVt0W25dXT1uKTtyZXR1cm4gZX0oSSk7ZnVuY3Rpb24gaih0KXtyZXR1cm4gdD1wYXJzZUZsb2F0KHQpLChpc05hTih0KXx8dDwwfHx0PjEpJiYodD0xKSx0fWZ1bmN0aW9uIEQodCxlKXsoZnVuY3Rpb24odCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQmJi0xIT10LmluZGV4T2YoXCIuXCIpJiYxPT09cGFyc2VGbG9hdCh0KX0pKHQpJiYodD1cIjEwMCVcIik7dmFyIG49ZnVuY3Rpb24odCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQmJi0xIT10LmluZGV4T2YoXCIlXCIpfSh0KTtyZXR1cm4gdD1mKGUsbCgwLHBhcnNlRmxvYXQodCkpKSxuJiYodD1wYXJzZUludCh0KmUsMTApLzEwMCksby5hYnModC1lKTwxZS02PzE6dCVlL3BhcnNlRmxvYXQoZSl9ZnVuY3Rpb24gTih0KXtyZXR1cm4gZigxLGwoMCx0KSl9ZnVuY3Rpb24gUih0KXtyZXR1cm4gcGFyc2VJbnQodCwxNil9ZnVuY3Rpb24gTCh0KXtyZXR1cm4gMT09dC5sZW5ndGg/XCIwXCIrdDpcIlwiK3R9ZnVuY3Rpb24gQih0KXtyZXR1cm4gdDw9MSYmKHQ9MTAwKnQrXCIlXCIpLHR9ZnVuY3Rpb24gRyh0KXtyZXR1cm4gby5yb3VuZCgyNTUqcGFyc2VGbG9hdCh0KSkudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEYodCl7cmV0dXJuIFIodCkvMjU1fXZhciBVLHosVixXPSh6PVwiW1xcXFxzfFxcXFwoXSsoXCIrKFU9XCIoPzpbLVxcXFwrXT9cXFxcZCpcXFxcLlxcXFxkKyU/KXwoPzpbLVxcXFwrXT9cXFxcZCslPylcIikrXCIpWyx8XFxcXHNdKyhcIitVK1wiKVssfFxcXFxzXSsoXCIrVStcIilcXFxccypcXFxcKT9cIixWPVwiW1xcXFxzfFxcXFwoXSsoXCIrVStcIilbLHxcXFxcc10rKFwiK1UrXCIpWyx8XFxcXHNdKyhcIitVK1wiKVssfFxcXFxzXSsoXCIrVStcIilcXFxccypcXFxcKT9cIix7Q1NTX1VOSVQ6bmV3IFJlZ0V4cChVKSxyZ2I6bmV3IFJlZ0V4cChcInJnYlwiK3opLHJnYmE6bmV3IFJlZ0V4cChcInJnYmFcIitWKSxoc2w6bmV3IFJlZ0V4cChcImhzbFwiK3opLGhzbGE6bmV3IFJlZ0V4cChcImhzbGFcIitWKSxoc3Y6bmV3IFJlZ0V4cChcImhzdlwiK3opLGhzdmE6bmV3IFJlZ0V4cChcImhzdmFcIitWKSxoZXgzOi9eIz8oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkkLyxoZXg2Oi9eIz8oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkkLyxoZXg0Oi9eIz8oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pJC8saGV4ODovXiM/KFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KSQvfSk7ZnVuY3Rpb24gWCh0KXtyZXR1cm4hIVcuQ1NTX1VOSVQuZXhlYyh0KX10LmV4cG9ydHM/dC5leHBvcnRzPWQ6dm9pZCAwPT09KHI9ZnVuY3Rpb24oKXtyZXR1cm4gZH0uY2FsbChlLG4sZSx0KSl8fCh0LmV4cG9ydHM9cil9KE1hdGgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPXtFUFNJTE9OOm4oMjUzKSxjcmVhdGU6bigyNTQpLGNsb25lOm4oNDk3KSxmcm9tVmFsdWVzOm4oNDk4KSxjb3B5Om4oNDk5KSxzZXQ6bigyNTUpLGVxdWFsczpuKDUwMCksZXhhY3RFcXVhbHM6big1MDEpLGFkZDpuKDI1Niksc3VidHJhY3Q6bigxNjcpLHN1YjpuKDUwMiksbXVsdGlwbHk6bigyNTcpLG11bDpuKDUwMyksZGl2aWRlOm4oMjU4KSxkaXY6big1MDQpLGludmVyc2U6big1MDUpLG1pbjpuKDUwNiksbWF4Om4oNTA3KSxyb3RhdGU6big1MDgpLGZsb29yOm4oNTA5KSxjZWlsOm4oNTEwKSxyb3VuZDpuKDUxMSksc2NhbGU6big1MTIpLHNjYWxlQW5kQWRkOm4oNTEzKSxkaXN0YW5jZTpuKDI1OSksZGlzdDpuKDUxNCksc3F1YXJlZERpc3RhbmNlOm4oMjYwKSxzcXJEaXN0Om4oNTE1KSxsZW5ndGg6bigyNjEpLGxlbjpuKDUxNiksc3F1YXJlZExlbmd0aDpuKDI2Miksc3FyTGVuOm4oNTE3KSxuZWdhdGU6big1MTgpLG5vcm1hbGl6ZTpuKDI2MyksZG90Om4oMjY0KSxjcm9zczpuKDUxOSksbGVycDpuKDUyMCkscmFuZG9tOm4oNTIxKSx0cmFuc2Zvcm1NYXQyOm4oNTIyKSx0cmFuc2Zvcm1NYXQyZDpuKDUyMyksdHJhbnNmb3JtTWF0MzpuKDUyNCksdHJhbnNmb3JtTWF0NDpuKDUyNSksZm9yRWFjaDpuKDUyNiksbGltaXQ6big1MjcpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOTgpLGk9bigyOTYpLG89bigyOTcpLGE9bigyOTgpLHM9bigyOTkpLHU9bigzMDApO2Z1bmN0aW9uIGModCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgcih0KTt0aGlzLnNpemU9ZS5zaXplfWMucHJvdG90eXBlLmNsZWFyPWksYy5wcm90b3R5cGUuZGVsZXRlPW8sYy5wcm90b3R5cGUuZ2V0PWEsYy5wcm90b3R5cGUuaGFzPXMsYy5wcm90b3R5cGUuc2V0PXUsdC5leHBvcnRzPWN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI5MSksaT1uKDI5Miksbz1uKDI5MyksYT1uKDI5NCkscz1uKDI5NSk7ZnVuY3Rpb24gdSh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX11LnByb3RvdHlwZS5jbGVhcj1yLHUucHJvdG90eXBlLmRlbGV0ZT1pLHUucHJvdG90eXBlLmdldD1vLHUucHJvdG90eXBlLmhhcz1hLHUucHJvdG90eXBlLnNldD1zLHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspaWYocih0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjUpKE9iamVjdCxcImNyZWF0ZVwiKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzE1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiByKGUpP25bXCJzdHJpbmdcIj09dHlwZW9mIGU/XCJzdHJpbmdcIjpcImhhc2hcIl06bi5tYXB9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDMpLGk9big3Myksbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGE9dFtlXTtvLmNhbGwodCxlKSYmaShhLG4pJiYodm9pZCAwIT09bnx8ZSBpbiB0KXx8cih0LGUsbil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxODEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7XCJfX3Byb3RvX19cIj09ZSYmcj9yKHQsZSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH0pOnRbZV09bn19LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4obj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9dmFyIHI9L14oPzowfFsxLTldXFxkKikkLzt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgaT1uKHQpO3JldHVybiEhKGU9bnVsbD09ZT85MDA3MTk5MjU0NzQwOTkxOmUpJiYoXCJudW1iZXJcIj09aXx8XCJzeW1ib2xcIiE9aSYmci50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fX0sZnVuY3Rpb24odCxlKXt2YXIgbj1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxuKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4MykoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1MyksaT1uKDM0NCkocik7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExMCksaT1uKDg5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxvPShlPXIoZSx0KSkubGVuZ3RoO251bGwhPXQmJm48bzspdD10W2koZVtuKytdKV07cmV0dXJuIG4mJm49PW8/dDp2b2lkIDB9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyOSksaT1uKDE1Niksbz1uKDM1OCksYT1uKDIwNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCk/dDppKHQsZSk/W3RdOm8oYSh0KSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KHIpOysrbjxyOylpW25dPWUodFtuXSxuLHQpO3JldHVybiBpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjcpLGk9bigyMTUpLG89bigyMTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBvKGkodCxlLHIpLHQrXCJcIil9fSxmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4ocj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9dmFyIGk9big3Myksbz1uKDU0KSxhPW4oMTA0KSxzPW4oNDMpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYoIXMobikpcmV0dXJuITE7dmFyIHU9cihlKTtyZXR1cm4hIShcIm51bWJlclwiPT11P28obikmJmEoZSxuLmxlbmd0aCk6XCJzdHJpbmdcIj09dSYmZSBpbiBuKSYmaShuW2VdLHQpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMjcpO3QuZXhwb3J0cz17bG9uZ2VzdFBhdGg6ZnVuY3Rpb24odCl7dmFyIGU9e307ci5mb3JFYWNoKHQuc291cmNlcygpLChmdW5jdGlvbiBuKGkpe3ZhciBvPXQubm9kZShpKTtpZihyLmhhcyhlLGkpKXJldHVybiBvLnJhbms7ZVtpXT0hMDt2YXIgYT1yLm1pbihyLm1hcCh0Lm91dEVkZ2VzKGkpLChmdW5jdGlvbihlKXtyZXR1cm4gbihlLncpLXQuZWRnZShlKS5taW5sZW59KSkpO3JldHVybiBhIT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZJiZudWxsIT1hfHwoYT0wKSxvLnJhbms9YX0pKX0sc2xhY2s6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5ub2RlKGUudykucmFuay10Lm5vZGUoZS52KS5yYW5rLXQuZWRnZShlKS5taW5sZW59fX0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLmJ1YmJsZXM9ITAsdGhpcy50YXJnZXQ9bnVsbCx0aGlzLmN1cnJlbnRUYXJnZXQ9bnVsbCx0aGlzLmRlbGVnYXRlVGFyZ2V0PW51bGwsdGhpcy5kZWxlZ2F0ZU9iamVjdD1udWxsLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMSx0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMSx0aGlzLnNoYXBlPW51bGwsdGhpcy5mcm9tU2hhcGU9bnVsbCx0aGlzLnRvU2hhcGU9bnVsbCx0aGlzLnByb3BhZ2F0aW9uUGF0aD1bXSx0aGlzLnR5cGU9dCx0aGlzLm5hbWU9dCx0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnRpbWVTdGFtcD1lLnRpbWVTdGFtcH1yZXR1cm4gdC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITAsdGhpcy5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0JiZ0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKX0sdC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7dGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITB9LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJbRXZlbnQgKHR5cGU9XCIrdGhpcy50eXBlK1wiKV1cIn0sdC5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUucmVzdG9yZT1mdW5jdGlvbigpe30sdH0oKTtlLmE9cn0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMSksaT1uKDEzNiksbz1uKDE5KSxhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO24uZGVzdHJveWVkPSExO3ZhciByPW4uZ2V0RGVmYXVsdENmZygpO3JldHVybiBuLmNmZz1PYmplY3Qoby5pKShyLGUpLG59cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZz1mdW5jdGlvbigpe3JldHVybnt9fSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2ZnW3RdfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLmNmZ1t0XT1lfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5jZmc9e2Rlc3Ryb3llZDohMH0sdGhpcy5vZmYoKSx0aGlzLmRlc3Ryb3llZD0hMH0sZX0oaS5hKTtlLmE9YX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiBpfSkpO3ZhciByPW51bGw7ZnVuY3Rpb24gaSgpe2lmKCFyKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO3Qud2lkdGg9MSx0LmhlaWdodD0xLHI9dC5nZXRDb250ZXh0KFwiMmRcIil9cmV0dXJuIHJ9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSksbi5kKGUsXCJiXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSk7dmFyIHI9LTEsaT0xO2Z1bmN0aW9uIG8oKXtyZXR1cm4gaSsrfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiBFfSkpO3ZhciByPW4oNCksaT1uLm4ociksbz1uKDYpLGE9bi5uKG8pLHM9big3KSx1PW4ubihzKSxjPW4oMjIpLGY9bi5uKGMpLGw9bigyMyksaD1uLm4obCksZD1uKDI0KSxwPW4ubihkKSxnPW4oMTcpLHY9bi5uKGcpLHk9bigzMiksbT1uLm4oeSksYj1uKDIpO2Z1bmN0aW9uIHgodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIHcodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/eChPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2koKSh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6eChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBTKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9digpKHQpO2lmKGUpe3ZhciBpPXYoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gcCgpKHRoaXMsbil9fXZhciBFPWZ1bmN0aW9uKHQpe2goKShuLHQpO3ZhciBlPVMobik7ZnVuY3Rpb24gbih0KXt2YXIgcjtyZXR1cm4gYSgpKHRoaXMsbiksKHI9ZS5jYWxsKHRoaXMsdCkpLmRpcnR5PSEwLHIuYXR0cmlidXRlcz1bXSxyLmluZGljZXM9dm9pZCAwLHIuaW5kaWNlc0J1ZmZlcj12b2lkIDAsci52ZXJ0ZXhDb3VudD0wLHIubWF4SW5zdGFuY2VkQ291bnQ9dm9pZCAwLHIuYWFiYj12b2lkIDAsci5lbnRpdHk9dm9pZCAwLE9iamVjdC5hc3NpZ24oZigpKHIpLHQpLHJ9cmV0dXJuIHUoKShuLFt7a2V5Olwic2V0QXR0cmlidXRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcy5hdHRyaWJ1dGVzLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWU9PT10fSkpO3JldHVybiBpPyhpLmRhdGE9ZSxpLmRpcnR5PSEwKTp0aGlzLmF0dHJpYnV0ZXMucHVzaCh3KHcoe2RpcnR5OiEwLG5hbWU6dCxkYXRhOmV9LG4pLHt9LHtidWZmZXJHZXR0ZXI6cn0pKSx0aGlzLmRpcnR5PSEwLHRoaXN9fSx7a2V5Olwic2V0SW5kZXhcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbmRpY2VzPW5ldyBVaW50MzJBcnJheSh0LmJ1ZmZlcj90LmJ1ZmZlcjp0KSx0aGlzLmRpcnR5PSEwLHRoaXN9fSx7a2V5OlwiYXBwbHlNYXRyaXhcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmF0dHJpYnV0ZXMuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuXCJwb3NpdGlvblwiPT09dC5uYW1lfSkpLG49dGhpcy5hdHRyaWJ1dGVzLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwibm9ybWFsXCI9PT10Lm5hbWV9KSk7aWYoZSYmKGUuZGlydHk9ITAsZS5kYXRhJiZlLmRhdGEubGVuZ3RoKSlmb3IodmFyIHI9MDtyPGUuZGF0YS5sZW5ndGg7cis9Myl7dmFyIGk9Yi5mLmZyb21WYWx1ZXMoZS5kYXRhW3JdLGUuZGF0YVtyKzFdLGUuZGF0YVtyKzJdLDEpO2IuZi50cmFuc2Zvcm1NYXQ0KGksaSx0KSxtKCkoZS5kYXRhKT9lLmRhdGEuc2V0KFtpWzBdLGlbMV0saVsyXV0scik6KGUuZGF0YVtyXT1pWzBdLGUuZGF0YVtyKzFdPWlbMV0sZS5kYXRhW3IrMl09aVsyXSl9aWYobil7dmFyIG89Yi5hLm5vcm1hbEZyb21NYXQ0KGIuYS5jcmVhdGUoKSx0KTtpZihuLmRhdGEmJm4uZGF0YS5sZW5ndGgpZm9yKHZhciBhPTA7YTxuLmRhdGEubGVuZ3RoO2ErPTMpe3ZhciBzPWIuZS5mcm9tVmFsdWVzKG4uZGF0YVthXSxuLmRhdGFbYSsxXSxuLmRhdGFbYSsyXSk7Yi5lLnRyYW5zZm9ybU1hdDMocyxzLG8pLGIuZS5ub3JtYWxpemUocyxzKSxtKCkobi5kYXRhKT9uLmRhdGEuc2V0KFtzWzBdLHNbMV0sc1syXV0sYSk6KG4uZGF0YVthXT1zWzBdLG4uZGF0YVthKzFdPXNbMV0sbi5kYXRhW2ErMl09c1syXSl9fX19XSksbn0obigzKS5Db21wb25lbnQpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGt9KSk7dmFyIHIsaSxvLGEscyx1LGMsZj1uKDkpLGw9bi5uKGYpLGg9bigxNCksZD1uLm4oaCkscD1uKDEwKSxnPW4ubihwKSx2PW4oNikseT1uLm4odiksbT1uKDcpLGI9bi5uKG0pLHg9bigxMSksdz1uLm4oeCksUz0obigyOCksbig1KSksRT1uKDMpLF89bigxMyksTz1uKDM2KSxrPShyPU9iamVjdChTLmluamVjdGFibGUpKCksaT1PYmplY3QoUy5pbmplY3QpKF8uYS5HZW9tZXRyeUNvbXBvbmVudE1hbmFnZXIpLG89T2JqZWN0KFMuaW5qZWN0KShfLmEuUmVuZGVyRW5naW5lKSxyKChzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3koKSh0aGlzLHQpLGcoKSh0aGlzLFwiZ2VvbWV0cnlcIix1LHRoaXMpLGcoKSh0aGlzLFwiZW5naW5lXCIsYyx0aGlzKX12YXIgZTtyZXR1cm4gYigpKHQsW3trZXk6XCJleGVjdXRlXCIsdmFsdWU6KGU9ZCgpKGwuYS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIGU9dGhpcztyZXR1cm4gbC5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnRoaXMuZ2VvbWV0cnkuZm9yRWFjaCgoZnVuY3Rpb24odCxuKXtuLmRpcnR5JiYobi5hdHRyaWJ1dGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuO3QuZGlydHkmJnQuZGF0YSYmKHQuYnVmZmVyP251bGw9PT0obj10LmJ1ZmZlcil8fHZvaWQgMD09PW58fG4uc3ViRGF0YSh7ZGF0YTp0LmRhdGEsb2Zmc2V0OjB9KTp0LmJ1ZmZlcj1lLmVuZ2luZS5jcmVhdGVCdWZmZXIoe2RhdGE6dC5kYXRhLHR5cGU6Ty5hLkZMT0FUfSksdC5kaXJ0eT0hMSl9KSksbi5pbmRpY2VzJiYobi5pbmRpY2VzQnVmZmVyP24uaW5kaWNlc0J1ZmZlci5zdWJEYXRhKHtkYXRhOm4uaW5kaWNlcyxvZmZzZXQ6MH0pOm4uaW5kaWNlc0J1ZmZlcj1lLmVuZ2luZS5jcmVhdGVFbGVtZW50cyh7ZGF0YTpuLmluZGljZXMsY291bnQ6bi5pbmRpY2VzLmxlbmd0aCx0eXBlOk8uYS5VTlNJR05FRF9JTlQsdXNhZ2U6Ty5hLlNUQVRJQ19EUkFXfSkpLG4uZGlydHk9ITEpfSkpO2Nhc2UgMTpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSksZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleTpcInRlYXJEb3duXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmdlb21ldHJ5LmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7ZS5pbmRpY2VzQnVmZmVyJiZlLmluZGljZXNCdWZmZXIuZGVzdHJveSgpLGUuYXR0cmlidXRlcy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmJ1ZmZlciYmdC5idWZmZXIuZGVzdHJveSgpfSkpfSkpLHRoaXMuZ2VvbWV0cnkuY2xlYXIoKX19LHtrZXk6XCJjcmVhdGVCdWZmZXJHZW9tZXRyeVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt2ZXJ0ZXhDb3VudDozfSxlPXQudmVydGV4Q291bnQsbj1PYmplY3QoRS5jcmVhdGVFbnRpdHkpKCk7cmV0dXJuIHRoaXMuZ2VvbWV0cnkuY3JlYXRlKG4se3ZlcnRleENvdW50OmV9KX19LHtrZXk6XCJjcmVhdGVJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWF4SW5zdGFuY2VkQ291bnQsbj10LnZlcnRleENvdW50LHI9T2JqZWN0KEUuY3JlYXRlRW50aXR5KSgpO3JldHVybiB0aGlzLmdlb21ldHJ5LmNyZWF0ZShyLHttYXhJbnN0YW5jZWRDb3VudDplLHZlcnRleENvdW50Om59KX19XSksdH0oKSx1PXcoKShzLnByb3RvdHlwZSxcImdlb21ldHJ5XCIsW2ldLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksYz13KCkocy5wcm90b3R5cGUsXCJlbmdpbmVcIixbb10se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxhPXMpKXx8YSl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gd30pKTt2YXIgcj1uKDQpLGk9bi5uKHIpLG89big2KSxhPW4ubihvKSxzPW4oNyksdT1uLm4ocyksYz1uKDIyKSxmPW4ubihjKSxsPW4oMjMpLGg9bi5uKGwpLGQ9bigyNCkscD1uLm4oZCksZz1uKDE3KSx2PW4ubihnKSx5PW4oMyk7ZnVuY3Rpb24gbSh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gYih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9tKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aSgpKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTptKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIHgodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj12KCkodCk7aWYoZSl7dmFyIGk9digpKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBwKCkodGhpcyxuKX19dmFyIHc9ZnVuY3Rpb24odCl7aCgpKG4sdCk7dmFyIGU9eChuKTtmdW5jdGlvbiBuKHQpe3ZhciByO3JldHVybiBhKCkodGhpcyxuKSwocj1lLmNhbGwodGhpcyx0KSkudmVydGV4U2hhZGVyR0xTTD12b2lkIDAsci5mcmFnbWVudFNoYWRlckdMU0w9dm9pZCAwLHIuZGVmaW5lcz17fSxyLmRpcnR5PSEwLHIudW5pZm9ybXM9W10sci5jdWxsPXtlbmFibGU6ITAsZmFjZTp5LmdsLkJBQ0t9LHIuZGVwdGg9e2VuYWJsZTohMH0sci5ibGVuZD12b2lkIDAsci5lbnRpdHk9dm9pZCAwLHIudHlwZT12b2lkIDAsT2JqZWN0LmFzc2lnbihmKCkociksdCkscn1yZXR1cm4gdSgpKG4sW3trZXk6XCJzZXREZWZpbmVzXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGVmaW5lcz1iKGIoe30sdGhpcy5kZWZpbmVzKSx0KSx0aGlzfX0se2tleTpcInNldEN1bGxcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jdWxsPXQsdGhpc319LHtrZXk6XCJzZXREZXB0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRlcHRoPXQsdGhpc319LHtrZXk6XCJzZXRCbGVuZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmJsZW5kPXQsdGhpc319LHtrZXk6XCJzZXRVbmlmb3JtXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKFwic3RyaW5nXCIhPXR5cGVvZiB0KXJldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gbi5zZXRVbmlmb3JtKGUsdFtlXSl9KSksdGhpczt2YXIgcj10aGlzLnVuaWZvcm1zLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWU9PT10fSkpO3JldHVybiByPyhyLmRpcnR5PSEwLHIuZGF0YT1lKTp0aGlzLnVuaWZvcm1zLnB1c2goe25hbWU6dCxkaXJ0eTohMCxkYXRhOmV9KSx0aGlzLmRpcnR5PSEwLHRoaXN9fV0pLG59KHkuQ29tcG9uZW50KX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiBJfSkpO3ZhciByLGksbyxhLHMsdSxjLGYsbCxoPW4oNCksZD1uLm4oaCkscD1uKDkpLGc9bi5uKHApLHY9bigxNCkseT1uLm4odiksbT1uKDEwKSxiPW4ubihtKSx4PW4oNiksdz1uLm4oeCksUz1uKDcpLEU9bi5uKFMpLF89bigxMSksTz1uLm4oXyksaz0obigyOCksbig1KSksTT1uKDMpLEE9bigxMyk7ZnVuY3Rpb24gVCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gQyh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9UKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZCgpKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpUKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fXZhciBJPShyPU9iamVjdChrLmluamVjdGFibGUpKCksaT1PYmplY3Qoay5pbmplY3QpKEEuYS5NYXRlcmlhbENvbXBvbmVudE1hbmFnZXIpLG89T2JqZWN0KGsuaW5qZWN0KShBLmEuUmVuZGVyRW5naW5lKSxhPU9iamVjdChrLmluamVjdCkoQS5hLlNoYWRlck1vZHVsZVNlcnZpY2UpLHIoKHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dygpKHRoaXMsdCksYigpKHRoaXMsXCJtYXRlcmlhbFwiLGMsdGhpcyksYigpKHRoaXMsXCJlbmdpbmVcIixmLHRoaXMpLGIoKSh0aGlzLFwic2hhZGVyTW9kdWxlXCIsbCx0aGlzKX12YXIgZTtyZXR1cm4gRSgpKHQsW3trZXk6XCJleGVjdXRlXCIsdmFsdWU6KGU9eSgpKGcuYS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIGcuYS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6XCJ0ZWFyRG93blwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5tYXRlcmlhbC5jbGVhcigpfX0se2tleTpcImNyZWF0ZVNoYWRlck1hdGVyaWFsXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0KE0uY3JlYXRlRW50aXR5KSgpLG49dC52ZXJ0ZXhTaGFkZXIscj10LmZyYWdtZW50U2hhZGVyLGk9W107aWYoIXRoaXMuZW5naW5lLnN1cHBvcnRXZWJHUFUpe3ZhciBvPVwibWF0ZXJpYWwtXCIuY29uY2F0KGUpO3RoaXMuc2hhZGVyTW9kdWxlLnJlZ2lzdGVyTW9kdWxlKG8se3ZzOnQudmVydGV4U2hhZGVyLGZzOnQuZnJhZ21lbnRTaGFkZXJ9KTt2YXIgYT10aGlzLnNoYWRlck1vZHVsZS5nZXRNb2R1bGUobyk7bj1hLnZzLHI9YS5mcyxhLnVuaWZvcm1zJiYoaT1PYmplY3Qua2V5cyhhLnVuaWZvcm1zKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntkaXJ0eTohMCxuYW1lOnQsZGF0YTphLnVuaWZvcm1zW3RdfX0pKSl9cmV0dXJuIHRoaXMubWF0ZXJpYWwuY3JlYXRlKGUsQyhDKHt2ZXJ0ZXhTaGFkZXJHTFNMOm4sZnJhZ21lbnRTaGFkZXJHTFNMOnJ9LHQpLHt9LHt1bmlmb3JtczppfSkpfX1dKSx0fSgpLGM9TygpKHUucHJvdG90eXBlLFwibWF0ZXJpYWxcIixbaV0se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxmPU8oKSh1LnByb3RvdHlwZSxcImVuZ2luZVwiLFtvXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLGw9TygpKHUucHJvdG90eXBlLFwic2hhZGVyTW9kdWxlXCIsW2FdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSkscz11KSl8fHMpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KSk7dmFyIHIsaT1uKDYpLG89bi5uKGkpLGE9bigyMikscz1uLm4oYSksdT1uKDIzKSxjPW4ubih1KSxmPW4oMjQpLGw9bi5uKGYpLGg9bigxNyksZD1uLm4oaCkscD1uKDMpO2Z1bmN0aW9uIGcodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1kKCkodCk7aWYoZSl7dmFyIGk9ZCgpKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBsKCkodGhpcyxuKX19IWZ1bmN0aW9uKHQpe3RbdC5TdGFuZGFyZD0wXT1cIlN0YW5kYXJkXCJ9KHJ8fChyPXt9KSk7dmFyIHY9ZnVuY3Rpb24odCl7YygpKG4sdCk7dmFyIGU9ZyhuKTtmdW5jdGlvbiBuKHQpe3ZhciBpO3JldHVybiBvKCkodGhpcyxuKSwoaT1lLmNhbGwodGhpcyx0KSkuc3RyYXRlZ3k9ci5TdGFuZGFyZCxpLnZpc2liaWxpdHlQbGFuZU1hc2s9MCxpLnZpc2libGU9ITEsT2JqZWN0LmFzc2lnbihzKCkoaSksdCksaX1yZXR1cm4gbn0ocC5Db21wb25lbnQpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KSk7dmFyIHI9big2KSxpPW4ubihyKSxvPW4oMjIpLGE9bi5uKG8pLHM9bigyMyksdT1uLm4ocyksYz1uKDI0KSxmPW4ubihjKSxsPW4oMTcpLGg9bi5uKGwpLGQ9bigzKSxwPW4oODApO2Z1bmN0aW9uIGcodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1oKCkodCk7aWYoZSl7dmFyIGk9aCgpKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBmKCkodGhpcyxuKX19dmFyIHY9ZnVuY3Rpb24odCl7dSgpKG4sdCk7dmFyIGU9ZyhuKTtmdW5jdGlvbiBuKHQpe3ZhciByO3JldHVybiBpKCkodGhpcyxuKSwocj1lLmNhbGwodGhpcyx0KSkubWF0ZXJpYWw9dm9pZCAwLHIuZ2VvbWV0cnk9dm9pZCAwLHIuYWFiYj1uZXcgcC5hLHIuYWFiYkRpcnR5PSEwLHIubW9kZWw9dm9pZCAwLHIudmlzaWJsZT0hMCxyLmNoaWxkcmVuPVtdLE9iamVjdC5hc3NpZ24oYSgpKHIpLHQpLHJ9cmV0dXJuIG59KGQuQ29tcG9uZW50KX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiBOfSkpO3ZhciByLGksbyxhLHMsdSxjLGYsbCxoLGQscCxnLHY9big5KSx5PW4ubih2KSxtPW4oMTQpLGI9bi5uKG0pLHg9bigxMCksdz1uLm4oeCksUz1uKDYpLEU9bi5uKFMpLF89big3KSxPPW4ubihfKSxrPW4oMTEpLE09bi5uKGspLEE9KG4oMjgpLG4oMikpLFQ9big1KSxDPW4oMTMpLEk9big1OCksUD1uKDE0MSk7ZnVuY3Rpb24gaih0LGUpe3ZhciBuO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PXRbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheSh0KXx8KG49ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpcmV0dXJuIEQodCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PW4mJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PW58fFwiU2V0XCI9PT1uKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKFwiQXJndW1lbnRzXCI9PT1ufHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gRCh0LGUpfSh0KSl8fGUmJnQmJlwibnVtYmVyXCI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9dmFyIG8sYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj10W1N5bWJvbC5pdGVyYXRvcl0oKX0sbjpmdW5jdGlvbigpe3ZhciB0PW4ubmV4dCgpO3JldHVybiBhPXQuZG9uZSx0fSxlOmZ1bmN0aW9uKHQpe3M9ITAsbz10fSxmOmZ1bmN0aW9uKCl7dHJ5e2F8fG51bGw9PW4ucmV0dXJufHxuLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBvfX19fWZ1bmN0aW9uIEQodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn12YXIgTj0ocj1PYmplY3QoVC5pbmplY3RhYmxlKSgpLGk9T2JqZWN0KFQuaW5qZWN0KShDLmEuTWVzaENvbXBvbmVudE1hbmFnZXIpLG89T2JqZWN0KFQuaW5qZWN0KShDLmEuQ3VsbGFibGVDb21wb25lbnRNYW5hZ2VyKSxhPU9iamVjdChULmluamVjdCkoQy5hLkdlb21ldHJ5Q29tcG9uZW50TWFuYWdlcikscz1PYmplY3QoVC5pbmplY3QpKEMuYS5IaWVyYXJjaHlDb21wb25lbnRNYW5hZ2VyKSx1PU9iamVjdChULmluamVjdCkoQy5hLlRyYW5zZm9ybUNvbXBvbmVudE1hbmFnZXIpLHIoKGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7RSgpKHRoaXMsdCksdygpKHRoaXMsXCJtZXNoXCIsbCx0aGlzKSx3KCkodGhpcyxcImN1bGxhYmxlXCIsaCx0aGlzKSx3KCkodGhpcyxcImdlb21ldHJ5XCIsZCx0aGlzKSx3KCkodGhpcyxcImhpZXJhcmNoeVwiLHAsdGhpcyksdygpKHRoaXMsXCJ0cmFuc2Zvcm1cIixnLHRoaXMpLHRoaXMucGxhbmVzPXZvaWQgMH12YXIgZTtyZXR1cm4gTygpKHQsW3trZXk6XCJzZXRGcnVzdHVtUGxhbmVzXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5wbGFuZXM9dH19LHtrZXk6XCJleGVjdXRlXCIsdmFsdWU6KGU9YigpKHkuYS5tYXJrKChmdW5jdGlvbiB0KGUpe3ZhciBuLHIsaSxvLGEscyx1LGMsZixsLGgsZCxwLGcsdixtLGIseCx3LFMsRTtyZXR1cm4geS5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOm49aihlKTt0cnl7Zm9yKG4ucygpOyEocj1uLm4oKSkuZG9uZTspe2k9ci52YWx1ZSxvPWkuZ2V0U2NlbmUoKSxhPWkuZ2V0Q2FtZXJhKCkscz1qKG8uZ2V0RW50aXRpZXMoKSk7dHJ5e2ZvcihzLnMoKTshKHU9cy5uKCkpLmRvbmU7KWM9dS52YWx1ZSwoZj10aGlzLm1lc2guZ2V0Q29tcG9uZW50QnlFbnRpdHkoYykpJiYobD10aGlzLmhpZXJhcmNoeS5nZXRDb21wb25lbnRCeUVudGl0eShjKSxoPXRoaXMuY3VsbGFibGUuZ2V0Q29tcG9uZW50QnlFbnRpdHkoYyksZD1mLmdlb21ldHJ5LHA9dGhpcy50cmFuc2Zvcm0uZ2V0Q29tcG9uZW50QnlFbnRpdHkoYyksZCYmZC5hYWJiJiZwJiZmLmFhYmJEaXJ0eSYmKGc9cC53b3JsZFRyYW5zZm9ybSx2PWQuYWFiYixtPXYuY2VudGVyLGI9di5oYWxmRXh0ZW50cyx4PUEuZS50cmFuc2Zvcm1NYXQ0KEEuZS5jcmVhdGUoKSxtLGcpLHc9T2JqZWN0KFAuYikoZyxBLmEuY3JlYXRlKCkpLFM9QS5lLnRyYW5zZm9ybU1hdDMoQS5lLmNyZWF0ZSgpLGIsdyksZi5hYWJiLnVwZGF0ZSh4LFMpLGYuYWFiYkRpcnR5PSExKSxoJiZkJiYoRT10aGlzLmN1bGxhYmxlLmdldENvbXBvbmVudEJ5RW50aXR5KChudWxsPT1sP3ZvaWQgMDpsLnBhcmVudElEKXx8LTEpLGgudmlzaWJpbGl0eVBsYW5lTWFzaz10aGlzLmNvbXB1dGVWaXNpYmlsaXR5V2l0aFBsYW5lTWFzayhmLmFhYmIsKG51bGw9PUU/dm9pZCAwOkUudmlzaWJpbGl0eVBsYW5lTWFzayl8fEkuYi5JTkRFVEVSTUlOQVRFLHRoaXMucGxhbmVzfHxhLmdldEZydXN0dW0oKS5wbGFuZXMpLGgudmlzaWJsZT1oLnZpc2liaWxpdHlQbGFuZU1hc2shPT1JLmIuT1VUU0lERSkpfWNhdGNoKHQpe3MuZSh0KX1maW5hbGx5e3MuZigpfX19Y2F0Y2godCl7bi5lKHQpfWZpbmFsbHl7bi5mKCl9Y2FzZSAyOmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKSxmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleTpcInRlYXJEb3duXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmN1bGxhYmxlLmNsZWFyKCksdGhpcy5tZXNoLmNsZWFyKCl9fSx7a2V5OlwiY29tcHV0ZVZpc2liaWxpdHlXaXRoUGxhbmVNYXNrXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe2lmKGU9PT1JLmIuT1VUU0lERXx8ZT09PUkuYi5JTlNJREUpcmV0dXJuIGU7Zm9yKHZhciByPUkuYi5JTlNJREUsaT0wLG89bi5sZW5ndGg7aTxvOysraSl7dmFyIGE9aTwzMT8xPDxpOjA7aWYoIShpPDMxJiYwPT0oZSZhKSkpe3ZhciBzPW5baV0sdT1zLm5vcm1hbCxjPXMuZGlzdGFuY2U7aWYoQS5lLmRvdCh1LHQuZ2V0TmVnYXRpdmVGYXJQb2ludChuW2ldKSkrYz4wKXJldHVybiBJLmIuT1VUU0lERTtBLmUuZG90KHUsdC5nZXRQb3NpdGl2ZUZhclBvaW50KG5baV0pKStjPjAmJihyfD1hKX19cmV0dXJuIHJ9fV0pLHR9KCksbD1NKCkoZi5wcm90b3R5cGUsXCJtZXNoXCIsW2ldLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksaD1NKCkoZi5wcm90b3R5cGUsXCJjdWxsYWJsZVwiLFtvXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLGQ9TSgpKGYucHJvdG90eXBlLFwiZ2VvbWV0cnlcIixbYV0se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxwPU0oKShmLnByb3RvdHlwZSxcImhpZXJhcmNoeVwiLFtzXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLGc9TSgpKGYucHJvdG90eXBlLFwidHJhbnNmb3JtXCIsW3VdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksYz1mKSl8fGMpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSk7dmFyIHI9big2KSxpPW4ubihyKSxvPW4oNyksYT1uLm4obykscz1uKDIpLHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbil7aSgpKHRoaXMsdCksdGhpcy5kaXN0YW5jZT12b2lkIDAsdGhpcy5ub3JtYWw9dm9pZCAwLHRoaXMucG5WZXJ0ZXhGbGFnPXZvaWQgMCx0aGlzLmRpc3RhbmNlPWV8fDAsdGhpcy5ub3JtYWw9bnx8cy5lLmZyb21WYWx1ZXMoMCwxLDApLHRoaXMudXBkYXRlUE5WZXJ0ZXhGbGFnKCl9cmV0dXJuIGEoKSh0LFt7a2V5OlwidXBkYXRlUE5WZXJ0ZXhGbGFnXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnBuVmVydGV4RmxhZz0oTnVtYmVyKHRoaXMubm9ybWFsWzBdPj0wKTw8OCkrKE51bWJlcih0aGlzLm5vcm1hbFsxXT49MCk8PDQpK051bWJlcih0aGlzLm5vcm1hbFsyXT49MCl9fSx7a2V5OlwiZGlzdGFuY2VUb1BvaW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHMuZS5kb3QodCx0aGlzLm5vcm1hbCktdGhpcy5kaXN0YW5jZX19LHtrZXk6XCJub3JtYWxpemVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTEvcy5lLmxlbih0aGlzLm5vcm1hbCk7cy5lLnNjYWxlKHRoaXMubm9ybWFsLHRoaXMubm9ybWFsLHQpLHRoaXMuZGlzdGFuY2UqPXR9fSx7a2V5OlwiaW50ZXJzZWN0c0xpbmVcIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5kaXN0YW5jZVRvUG9pbnQodCksaT1yLyhyLXRoaXMuZGlzdGFuY2VUb1BvaW50KGUpKSxvPWk+PTAmJmk8PTE7cmV0dXJuIG8mJm4mJnMuZS5sZXJwKG4sdCxlLGkpLG99fV0pLHR9KCl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUH0pKTt2YXIgcixpLG8sYSxzLHUsYyxmLGwsaCxkLHAsZz1uKDkpLHY9bi5uKGcpLHk9bigxNCksbT1uLm4oeSksYj1uKDEwKSx4PW4ubihiKSx3PW4oNiksUz1uLm4odyksRT1uKDcpLF89bi5uKEUpLE89bigxMSksaz1uLm4oTyksTT0obigyOCksbig1KSksQT1uKDEzKSxUPW4oODQpLEM9big3MCksST1uKDUwKSxQPShyPU9iamVjdChNLmluamVjdGFibGUpKCksaT1PYmplY3QoTS5pbmplY3QpKEEuYS5TeXN0ZW1zKSxvPU9iamVjdChNLm5hbWVkKShBLmEuRnJhbWVHcmFwaFN5c3RlbSksYT1PYmplY3QoTS5pbmplY3QpKEEuYS5SZW5kZXJQYXNzRmFjdG9yeSkscz1PYmplY3QoTS5pbmplY3QpKEEuYS5Db25maWdTZXJ2aWNlKSx1PU9iamVjdChNLmluamVjdCkoQS5hLlJlc291cmNlUG9vbCkscigoZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtTKCkodGhpcyx0KSx4KCkodGhpcyxcImZyYW1lR3JhcGhTeXN0ZW1cIixsLHRoaXMpLHgoKSh0aGlzLFwicmVuZGVyUGFzc0ZhY3RvcnlcIixoLHRoaXMpLHgoKSh0aGlzLFwiY29uZmlnU2VydmljZVwiLGQsdGhpcykseCgpKHRoaXMsXCJyZXNvdXJjZVBvb2xcIixwLHRoaXMpfXZhciBlO3JldHVybiBfKCkodCxbe2tleTpcImV4ZWN1dGVcIix2YWx1ZTooZT1tKCkodi5hLm1hcmsoKGZ1bmN0aW9uIHQoZSl7dmFyIG4scixpLG8sYSxzLHUsYztyZXR1cm4gdi5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOm49dGhpcy5yZW5kZXJQYXNzRmFjdG9yeShJLmEuSURFTlRJRklFUikscj1uLnNldHVwLGk9bi5leGVjdXRlLHRoaXMuZnJhbWVHcmFwaFN5c3RlbS5hZGRQYXNzKEkuYS5JREVOVElGSUVSLHIsaSksbz10aGlzLnJlbmRlclBhc3NGYWN0b3J5KFQuYS5JREVOVElGSUVSKSxhPW8uc2V0dXAscz1vLmV4ZWN1dGUsdT1vLnRlYXJEb3duLGM9dGhpcy5mcmFtZUdyYXBoU3lzdGVtLmFkZFBhc3MoVC5hLklERU5USUZJRVIsYSxzLHUpLHRoaXMuZnJhbWVHcmFwaFN5c3RlbS5wcmVzZW50KGMuZGF0YS5vdXRwdXQpO2Nhc2UgNTpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSksZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6XCJ0ZWFyRG93blwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5yZXNvdXJjZVBvb2wuY2xlYW4oKX19LHtrZXk6XCJwaWNrXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZW5kZXJQYXNzRmFjdG9yeShDLmEuSURFTlRJRklFUikucGljayh0LGUpfX1dKSx0fSgpLGw9aygpKGYucHJvdG90eXBlLFwiZnJhbWVHcmFwaFN5c3RlbVwiLFtpLG9dLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksaD1rKCkoZi5wcm90b3R5cGUsXCJyZW5kZXJQYXNzRmFjdG9yeVwiLFthXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLGQ9aygpKGYucHJvdG90eXBlLFwiY29uZmlnU2VydmljZVwiLFtzXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLHA9aygpKGYucHJvdG90eXBlLFwicmVzb3VyY2VQb29sXCIsW3VdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksYz1mKSl8fGMpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSk7dmFyIHI9big2KSxpPW4ubihyKSxvPW4oMjIpLGE9bi5uKG8pLHM9bigyMyksdT1uLm4ocyksYz1uKDI0KSxmPW4ubihjKSxsPW4oMTcpLGg9bi5uKGwpO2Z1bmN0aW9uIGQodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1oKCkodCk7aWYoZSl7dmFyIGk9aCgpKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBmKCkodGhpcyxuKX19dmFyIHA9ZnVuY3Rpb24odCl7dSgpKG4sdCk7dmFyIGU9ZChuKTtmdW5jdGlvbiBuKHQpe3ZhciByO3JldHVybiBpKCkodGhpcyxuKSwocj1lLmNhbGwodGhpcyx0KSkucGFyZW50SUQ9dm9pZCAwLE9iamVjdC5hc3NpZ24oYSgpKHIpLHQpLHJ9cmV0dXJuIG59KG4oMykuQ29tcG9uZW50KX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiBNfSkpO3ZhciByLGksbyxhLHMsdSxjLGYsbCxoPW4oOSksZD1uLm4oaCkscD1uKDE0KSxnPW4ubihwKSx2PW4oMTApLHk9bi5uKHYpLG09big2KSxiPW4ubihtKSx4PW4oNyksdz1uLm4oeCksUz1uKDExKSxFPW4ubihTKSxfPShuKDI4KSxuKDIpKSxPPW4oNSksaz1uKDEzKSxNPShyPU9iamVjdChPLmluamVjdGFibGUpKCksaT1PYmplY3QoTy5pbmplY3QpKGsuYS5IaWVyYXJjaHlDb21wb25lbnRNYW5hZ2VyKSxvPU9iamVjdChPLmluamVjdCkoay5hLlRyYW5zZm9ybUNvbXBvbmVudE1hbmFnZXIpLGE9T2JqZWN0KE8uaW5qZWN0KShrLmEuTWVzaENvbXBvbmVudE1hbmFnZXIpLHIoKHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7YigpKHRoaXMsdCkseSgpKHRoaXMsXCJoaWVyYXJjaHlcIixjLHRoaXMpLHkoKSh0aGlzLFwidHJhbnNmb3JtXCIsZix0aGlzKSx5KCkodGhpcyxcIm1lc2hcIixsLHRoaXMpfXZhciBlO3JldHVybiB3KCkodCxbe2tleTpcImV4ZWN1dGVcIix2YWx1ZTooZT1nKCkoZC5hLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gZC5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnRoaXMucnVuVHJhbnNmb3JtVXBkYXRlU3lzdGVtKCksdGhpcy5ydW5IaWVyYXJjaHlVcGRhdGVTeXN0ZW0oKTtjYXNlIDI6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6XCJ0ZWFyRG93blwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5oaWVyYXJjaHkuY2xlYXIoKSx0aGlzLnRyYW5zZm9ybS5jbGVhcigpfX0se2tleTpcImdldEhpZXJhcmNoeUNvbXBvbmVudE1hbmFnZXJcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZXJhcmNoeX19LHtrZXk6XCJnZXRUcmFuc2Zvcm1Db21wb25lbnRNYW5hZ2VyXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm19fSx7a2V5OlwicnVuVHJhbnNmb3JtVXBkYXRlU3lzdGVtXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMudHJhbnNmb3JtLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7KG4uaXNEaXJ0eSgpfHxuLmlzTG9jYWxEaXJ0eSgpKSYmKHQuc2V0TWVzaEFBQkJEaXJ0eSh0Lm1lc2guZ2V0Q29tcG9uZW50QnlFbnRpdHkoZSkpLG4udXBkYXRlVHJhbnNmb3JtKCkpfSkpfX0se2tleTpcInJ1bkhpZXJhcmNoeVVwZGF0ZVN5c3RlbVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmhpZXJhcmNoeS5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3ZhciByPXQudHJhbnNmb3JtLmdldENvbXBvbmVudEJ5RW50aXR5KGUpLGk9dC50cmFuc2Zvcm0uZ2V0Q29tcG9uZW50QnlFbnRpdHkobi5wYXJlbnRJRCk7bnVsbCE9PXImJm51bGwhPT1pJiZyLnVwZGF0ZVRyYW5zZm9ybVdpdGhQYXJlbnQoaSl9KSl9fSx7a2V5OlwiYXR0YWNoXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3RoaXMuaGllcmFyY2h5LmNvbnRhaW5zKHQpJiZ0aGlzLmRldGFjaCh0KSx0aGlzLmhpZXJhcmNoeS5jcmVhdGUodCx7cGFyZW50SUQ6ZX0pO3ZhciByPXRoaXMubWVzaC5nZXRDb21wb25lbnRCeUVudGl0eShlKTtpZih0aGlzLnNldE1lc2hBQUJCRGlydHkociksciYmLTE9PT1yLmNoaWxkcmVuLmluZGV4T2YodCkmJnIuY2hpbGRyZW4ucHVzaCh0KSx0aGlzLmhpZXJhcmNoeS5nZXRDb3VudCgpPjEpZm9yKHZhciBpPXRoaXMuaGllcmFyY2h5LmdldENvdW50KCktMTtpPjA7LS1pKWZvcih2YXIgbz10aGlzLmhpZXJhcmNoeS5nZXRFbnRpdHkoaSksYT0wO2E8aTsrK2Epe2lmKHRoaXMuaGllcmFyY2h5LmdldENvbXBvbmVudChhKS5wYXJlbnRJRD09PW8pe3RoaXMuaGllcmFyY2h5Lm1vdmVJdGVtKGksYSksKytpO2JyZWFrfX10aGlzLmhpZXJhcmNoeS5nZXRDb21wb25lbnRCeUVudGl0eSh0KTt2YXIgcz10aGlzLnRyYW5zZm9ybS5nZXRDb21wb25lbnRCeUVudGl0eShlKTtudWxsPT09cyYmKHM9dGhpcy50cmFuc2Zvcm0uY3JlYXRlKGUpKTt2YXIgdT10aGlzLnRyYW5zZm9ybS5nZXRDb21wb25lbnRCeUVudGl0eSh0KTtudWxsPT09dSYmKHU9dGhpcy50cmFuc2Zvcm0uY3JlYXRlKHQpLHM9dGhpcy50cmFuc2Zvcm0uZ2V0Q29tcG9uZW50QnlFbnRpdHkoZSkpLHUucGFyZW50PXMsIW4mJnMmJih1Lm1hdHJpeFRyYW5zZm9ybShfLmIuaW52ZXJ0KF8uYi5jcmVhdGUoKSxzLndvcmxkVHJhbnNmb3JtKSksdS51cGRhdGVUcmFuc2Zvcm0oKSkscyYmdS51cGRhdGVUcmFuc2Zvcm1XaXRoUGFyZW50KHMpfX0se2tleTpcImRldGFjaFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGllcmFyY2h5LmdldENvbXBvbmVudEJ5RW50aXR5KHQpO2lmKG51bGwhPT1lKXt2YXIgbj10aGlzLnRyYW5zZm9ybS5nZXRDb21wb25lbnRCeUVudGl0eSh0KTtudWxsIT09biYmKG4ucGFyZW50PW51bGwsbi5hcHBseVRyYW5zZm9ybSgpKSx0aGlzLmhpZXJhcmNoeS5yZW1vdmVLZWVwU29ydGVkKHQpO3ZhciByPXRoaXMubWVzaC5nZXRDb21wb25lbnRCeUVudGl0eShlLnBhcmVudElEKTtpZihyKXt2YXIgaT1yLmNoaWxkcmVuLmluZGV4T2YodCk7ci5jaGlsZHJlbi5zcGxpY2UoaSwxKX10aGlzLnNldE1lc2hBQUJCRGlydHkocil9fX0se2tleTpcImRldGFjaENoaWxkcmVuXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZXNoLmdldENvbXBvbmVudEJ5RW50aXR5KHQpO2UmJihlLmNoaWxkcmVuPVtdKTtmb3IodmFyIG49MDtuPHRoaXMuaGllcmFyY2h5LmdldENvdW50KCk7KXt2YXIgcjtpZigobnVsbD09PShyPXRoaXMuaGllcmFyY2h5LmdldENvbXBvbmVudChuKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIucGFyZW50SUQpPT09dCl7dmFyIGk9dGhpcy5oaWVyYXJjaHkuZ2V0RW50aXR5KG4pO3RoaXMuZGV0YWNoKGkpfWVsc2UrK259fX0se2tleTpcInNldE1lc2hBQUJCRGlydHlcIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodC5hYWJiRGlydHk9ITApfX1dKSx0fSgpLGM9RSgpKHUucHJvdG90eXBlLFwiaGllcmFyY2h5XCIsW2ldLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksZj1FKCkodS5wcm90b3R5cGUsXCJ0cmFuc2Zvcm1cIixbb10se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxsPUUoKSh1LnByb3RvdHlwZSxcIm1lc2hcIixbYV0se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxzPXUpKXx8cyl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4geX0pKTt2YXIgcj1uKDYpLGk9bi5uKHIpLG89big3KSxhPW4ubihvKSxzPW4oMjIpLHU9bi5uKHMpLGM9bigyMyksZj1uLm4oYyksbD1uKDI0KSxoPW4ubihsKSxkPW4oMTcpLHA9bi5uKGQpLGc9bigyKTtmdW5jdGlvbiB2KHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9cCgpKHQpO2lmKGUpe3ZhciBpPXAoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaCgpKHRoaXMsbil9fXZhciB5PWZ1bmN0aW9uKHQpe2YoKShuLHQpO3ZhciBlPXYobik7ZnVuY3Rpb24gbih0KXt2YXIgcixvLGEscyxjLGYsbCxoLGQscCx2LHksbSxiLHg7cmV0dXJuIGkoKSh0aGlzLG4pLChyPWUuY2FsbCh0aGlzLHQpKS5kaXJ0eUZsYWc9dm9pZCAwLHIubG9jYWxEaXJ0eUZsYWc9dm9pZCAwLHIucGFyZW50PW51bGwsci5sb2NhbFBvc2l0aW9uPWcuZS5mcm9tVmFsdWVzKDAsMCwwKSxyLmxvY2FsUm90YXRpb249Zy5jLmZyb21WYWx1ZXMoMCwwLDAsMSksci5sb2NhbFNjYWxlPWcuZS5mcm9tVmFsdWVzKDEsMSwxKSxyLmxvY2FsVHJhbnNmb3JtPWcuYi5jcmVhdGUoKSxyLnBvc2l0aW9uPWcuZS5mcm9tVmFsdWVzKDAsMCwwKSxyLnJvdGF0aW9uPWcuYy5mcm9tVmFsdWVzKDAsMCwwLDEpLHIuc2NhbGluZz1nLmUuZnJvbVZhbHVlcygxLDEsMSksci53b3JsZFRyYW5zZm9ybT1nLmIuY3JlYXRlKCksci5tYXRyaXhUcmFuc2Zvcm09KG89Zy5iLmNyZWF0ZSgpLGZ1bmN0aW9uKHQpe2cuYi5tdWx0aXBseShvLHIuZ2V0TG9jYWxUcmFuc2Zvcm0oKSx0KSxnLmIuZ2V0U2NhbGluZyhyLmxvY2FsU2NhbGUsbyksZy5iLmdldFRyYW5zbGF0aW9uKHIubG9jYWxQb3NpdGlvbixvKSxnLmIuZ2V0Um90YXRpb24oci5sb2NhbFJvdGF0aW9uLG8pfSksci5yb3RhdGVSb2xsUGl0Y2hZYXc9KGE9Zy5jLmNyZWF0ZSgpLHM9Zy5jLmNyZWF0ZSgpLGM9Zy5jLmNyZWF0ZSgpLGZ1bmN0aW9uKHQsZSxuKXtyLnNldERpcnR5KCksZy5jLmZyb21FdWxlcihhLHQsMCwwKSxnLmMuZnJvbUV1bGVyKHMsMCxlLDApLGcuYy5mcm9tRXVsZXIoYywwLDAsbiksZy5jLm11bHRpcGx5KHIubG9jYWxSb3RhdGlvbixhLHIubG9jYWxSb3RhdGlvbiksZy5jLm11bHRpcGx5KHIubG9jYWxSb3RhdGlvbixyLmxvY2FsUm90YXRpb24scyksZy5jLm11bHRpcGx5KHIubG9jYWxSb3RhdGlvbixjLHIubG9jYWxSb3RhdGlvbiksZy5jLm5vcm1hbGl6ZShyLmxvY2FsUm90YXRpb24sci5sb2NhbFJvdGF0aW9uKX0pLHIubGVycD0oZj1nLmUuY3JlYXRlKCksbD1nLmMuY3JlYXRlKCksaD1nLmUuY3JlYXRlKCksZD1nLmUuY3JlYXRlKCkscD1nLmMuY3JlYXRlKCksdj1nLmUuY3JlYXRlKCksZnVuY3Rpb24odCxlLG4pe3Iuc2V0RGlydHkoKSxnLmIuZ2V0U2NhbGluZyhmLHQud29ybGRUcmFuc2Zvcm0pLGcuYi5nZXRUcmFuc2xhdGlvbihoLHQud29ybGRUcmFuc2Zvcm0pLGcuYi5nZXRSb3RhdGlvbihsLHQud29ybGRUcmFuc2Zvcm0pLGcuYi5nZXRTY2FsaW5nKGQsZS53b3JsZFRyYW5zZm9ybSksZy5iLmdldFRyYW5zbGF0aW9uKHYsZS53b3JsZFRyYW5zZm9ybSksZy5iLmdldFJvdGF0aW9uKHAsZS53b3JsZFRyYW5zZm9ybSksZy5lLmxlcnAoci5sb2NhbFNjYWxlLGYsZCxuKSxnLmMuc2xlcnAoci5sb2NhbFJvdGF0aW9uLGwscCxuKSxnLmUubGVycChyLmxvY2FsUG9zaXRpb24saCx2LG4pfSksci50cmFuc2xhdGU9KHk9Zy5lLmNyZWF0ZSgpLGZ1bmN0aW9uKHQpe3JldHVybiBnLmUuYWRkKHksci5nZXRQb3NpdGlvbigpLHQpLHIuc2V0UG9zaXRpb24oeSksci5zZXREaXJ0eSghMCksdSgpKHIpfSksci50cmFuc2xhdGVMb2NhbD1mdW5jdGlvbih0KXtyZXR1cm4gZy5lLnRyYW5zZm9ybVF1YXQodCx0LHIubG9jYWxSb3RhdGlvbiksZy5lLmFkZChyLmxvY2FsUG9zaXRpb24sci5sb2NhbFBvc2l0aW9uLHQpLHIuc2V0TG9jYWxEaXJ0eSghMCksdSgpKHIpfSxyLnNldFBvc2l0aW9uPShtPWcuYi5jcmVhdGUoKSxmdW5jdGlvbih0KXtyZXR1cm4gci5wb3NpdGlvbj10LHIuc2V0TG9jYWxEaXJ0eSghMCksbnVsbD09PXIucGFyZW50P2cuZS5jb3B5KHIubG9jYWxQb3NpdGlvbix0KTooZy5iLmNvcHkobSxyLnBhcmVudC53b3JsZFRyYW5zZm9ybSksZy5iLmludmVydChtLG0pLGcuZS50cmFuc2Zvcm1NYXQ0KHIubG9jYWxQb3NpdGlvbix0LG0pKSx1KCkocil9KSxyLnJvdGF0ZT0oYj1nLmMuY3JlYXRlKCksZnVuY3Rpb24odCl7aWYobnVsbD09PXIucGFyZW50KWcuYy5tdWx0aXBseShyLmxvY2FsUm90YXRpb24sci5sb2NhbFJvdGF0aW9uLHQpLGcuYy5ub3JtYWxpemUoci5sb2NhbFJvdGF0aW9uLHIubG9jYWxSb3RhdGlvbik7ZWxzZXt2YXIgZT1yLmdldFJvdGF0aW9uKCksbj1yLnBhcmVudC5nZXRSb3RhdGlvbigpO2cuYy5jb3B5KGIsbiksZy5jLmludmVydChiLGIpLGcuYy5tdWx0aXBseShiLGIsdCksZy5jLm11bHRpcGx5KHIubG9jYWxSb3RhdGlvbix0LGUpLGcuYy5ub3JtYWxpemUoci5sb2NhbFJvdGF0aW9uLHIubG9jYWxSb3RhdGlvbil9cmV0dXJuIHIuc2V0TG9jYWxEaXJ0eSgpLHUoKShyKX0pLHIucm90YXRlTG9jYWw9ZnVuY3Rpb24odCl7cmV0dXJuIGcuYy5tdWx0aXBseShyLmxvY2FsUm90YXRpb24sci5sb2NhbFJvdGF0aW9uLHQpLGcuYy5ub3JtYWxpemUoci5sb2NhbFJvdGF0aW9uLHIubG9jYWxSb3RhdGlvbiksci5zZXRMb2NhbERpcnR5KCEwKSx1KCkocil9LHIuc2V0Um90YXRpb249KHg9Zy5jLmNyZWF0ZSgpLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09ci5wYXJlbnQ/Zy5jLmNvcHkoci5sb2NhbFJvdGF0aW9uLHQpOihnLmMuY29weSh4LHIucGFyZW50LmdldFJvdGF0aW9uKCkpLGcuYy5pbnZlcnQoeCx4KSxnLmMuY29weShyLmxvY2FsUm90YXRpb24seCksZy5jLm11bChyLmxvY2FsUm90YXRpb24sci5sb2NhbFJvdGF0aW9uLHQpKSxyLnNldExvY2FsRGlydHkoITApLHUoKShyKX0pLHJ9cmV0dXJuIGEoKShuLFt7a2V5Olwic2V0TG9jYWxQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe2cuZS5jb3B5KHRoaXMubG9jYWxQb3NpdGlvbix0KSx0aGlzLnNldExvY2FsRGlydHkoITApfX0se2tleTpcInNldExvY2FsU2NhbGVcIix2YWx1ZTpmdW5jdGlvbih0KXtnLmUuY29weSh0aGlzLmxvY2FsU2NhbGUsdCksdGhpcy5zZXRMb2NhbERpcnR5KCEwKX19LHtrZXk6XCJzZXRMb2NhbFJvdGF0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGcuYy5jb3B5KHRoaXMubG9jYWxSb3RhdGlvbix0KSx0aGlzLnNldExvY2FsRGlydHkoITApLHRoaXN9fSx7a2V5OlwiaXNEaXJ0eVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlydHlGbGFnfX0se2tleTpcInNldERpcnR5XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0hKGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdKXx8YXJndW1lbnRzWzBdO3Q/dGhpcy5kaXJ0eUZsYWd8PW4uRElSVFk6dGhpcy5kaXJ0eUZsYWcmPX5uLkRJUlRZfX0se2tleTpcImlzTG9jYWxEaXJ0eVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxEaXJ0eUZsYWd9fSx7a2V5Olwic2V0TG9jYWxEaXJ0eVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9IShhcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSl8fGFyZ3VtZW50c1swXTt0Pyh0aGlzLmxvY2FsRGlydHlGbGFnfD1uLkRJUlRZLHRoaXMuc2V0RGlydHkoITApKTp0aGlzLmxvY2FsRGlydHlGbGFnJj1+bi5ESVJUWX19LHtrZXk6XCJ1cGRhdGVUcmFuc2Zvcm1cIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaXNMb2NhbERpcnR5KCkmJnRoaXMuZ2V0TG9jYWxUcmFuc2Zvcm0oKSx0aGlzLmlzRGlydHkoKSYmbnVsbD09PXRoaXMucGFyZW50JiYoZy5iLmNvcHkodGhpcy53b3JsZFRyYW5zZm9ybSx0aGlzLmdldExvY2FsVHJhbnNmb3JtKCkpLHRoaXMuc2V0RGlydHkoITEpKX19LHtrZXk6XCJ1cGRhdGVUcmFuc2Zvcm1XaXRoUGFyZW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7Zy5iLm11bHRpcGx5KHRoaXMud29ybGRUcmFuc2Zvcm0sdC53b3JsZFRyYW5zZm9ybSx0aGlzLmdldExvY2FsVHJhbnNmb3JtKCkpfX0se2tleTpcImFwcGx5VHJhbnNmb3JtXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNldERpcnR5KCksZy5iLmdldFNjYWxpbmcodGhpcy5sb2NhbFNjYWxlLHRoaXMud29ybGRUcmFuc2Zvcm0pLGcuYi5nZXRUcmFuc2xhdGlvbih0aGlzLmxvY2FsUG9zaXRpb24sdGhpcy53b3JsZFRyYW5zZm9ybSksZy5iLmdldFJvdGF0aW9uKHRoaXMubG9jYWxSb3RhdGlvbix0aGlzLndvcmxkVHJhbnNmb3JtKX19LHtrZXk6XCJjbGVhclRyYW5zZm9ybVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zZXREaXJ0eSgpLHRoaXMubG9jYWxQb3NpdGlvbj1nLmUuZnJvbVZhbHVlcygwLDAsMCksdGhpcy5sb2NhbFJvdGF0aW9uPWcuYy5mcm9tVmFsdWVzKDAsMCwwLDEpLHRoaXMubG9jYWxTY2FsZT1nLmUuZnJvbVZhbHVlcygxLDEsMSl9fSx7a2V5Olwic2NhbGVMb2NhbFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNldExvY2FsRGlydHkoKSxnLmUubXVsdGlwbHkodGhpcy5sb2NhbFNjYWxlLHRoaXMubG9jYWxTY2FsZSx0KSx0aGlzfX0se2tleTpcImdldExvY2FsUG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2FsUG9zaXRpb259fSx7a2V5OlwiZ2V0TG9jYWxSb3RhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxSb3RhdGlvbn19LHtrZXk6XCJnZXRMb2NhbFNjYWxlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhbFNjYWxlfX0se2tleTpcImdldExvY2FsVHJhbnNmb3JtXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhbERpcnR5RmxhZyYmKGcuYi5mcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlKHRoaXMubG9jYWxUcmFuc2Zvcm0sdGhpcy5sb2NhbFJvdGF0aW9uLHRoaXMubG9jYWxQb3NpdGlvbix0aGlzLmxvY2FsU2NhbGUpLHRoaXMuc2V0TG9jYWxEaXJ0eSghMSkpLHRoaXMubG9jYWxUcmFuc2Zvcm19fSx7a2V5OlwiZ2V0V29ybGRUcmFuc2Zvcm1cIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTG9jYWxEaXJ0eSgpfHx0aGlzLmlzRGlydHkoKT8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdldFdvcmxkVHJhbnNmb3JtKCksdGhpcy51cGRhdGVUcmFuc2Zvcm0oKSx0aGlzLndvcmxkVHJhbnNmb3JtKTp0aGlzLndvcmxkVHJhbnNmb3JtfX0se2tleTpcImdldFBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZy5iLmdldFRyYW5zbGF0aW9uKHRoaXMucG9zaXRpb24sdGhpcy53b3JsZFRyYW5zZm9ybSksdGhpcy5wb3NpdGlvbn19LHtrZXk6XCJnZXRSb3RhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGcuYi5nZXRSb3RhdGlvbih0aGlzLnJvdGF0aW9uLHRoaXMud29ybGRUcmFuc2Zvcm0pLHRoaXMucm90YXRpb259fSx7a2V5OlwiZ2V0U2NhbGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBnLmIuZ2V0U2NhbGluZyh0aGlzLnNjYWxpbmcsdGhpcy53b3JsZFRyYW5zZm9ybSksdGhpcy5zY2FsaW5nfX1dKSxufShuKDM1KS5hKTt5LkRJUlRZPTF9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gY30pKTt2YXIgcixpPW4oNiksbz1uLm4oaSksYT1uKDcpLHM9bi5uKGEpLHU9big1KSxjPU9iamVjdCh1LmluamVjdGFibGUpKCkocj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtvKCkodGhpcyx0KSx0aGlzLmNvbmZpZz12b2lkIDB9cmV0dXJuIHMoKSh0LFt7a2V5OlwiZ2V0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25maWd9fSx7a2V5Olwic2V0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5jb25maWc9dH19XSksdH0oKSl8fHJ9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gY30pKTt2YXIgcixpPW4oNiksbz1uLm4oaSksYT1uKDcpLHM9bi5uKGEpLHU9big1KSxjPU9iamVjdCh1LmluamVjdGFibGUpKCkocj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtvKCkodGhpcyx0KX1yZXR1cm4gcygpKHQsW3trZXk6XCJsaXN0ZW5cIix2YWx1ZTpmdW5jdGlvbih0KXt9fSx7a2V5Olwib25cIix2YWx1ZTpmdW5jdGlvbih0LGUpe319LHtrZXk6XCJjb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OlwiZGlzY29ubmVjdFwiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe319XSksdH0oKSl8fHJ9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQn0pKTt2YXIgcj1uKDYyKSxpPW4ubihyKSxvPW4oOSksYT1uLm4obykscz1uKDE0KSx1PW4ubihzKSxjPW4oMTApLGY9bi5uKGMpLGw9big2KSxoPW4ubihsKSxkPW4oNykscD1uLm4oZCksZz1uKDExKSx2PW4ubihnKSx5PShuKDI4KSxuKDUpKSxtPW4oMTMpLGI9ZnVuY3Rpb24gdCgpe2goKSh0aGlzLHQpLHRoaXMuaW5kZXg9dm9pZCAwfSx4PWZ1bmN0aW9uIHQoKXtoKCkodGhpcyx0KSx0aGlzLm5hbWU9dm9pZCAwLHRoaXMuZGF0YT12b2lkIDAsdGhpcy5leGVjdXRlPXZvaWQgMCx0aGlzLnRlYXJEb3duPXZvaWQgMH0sdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtoKCkodGhpcyx0KSx0aGlzLm5hbWU9dm9pZCAwLHRoaXMucmVmQ291bnQ9MCx0aGlzLmhhc1NpZGVFZmZlY3Q9ITEsdGhpcy5kZXZpcnR1YWxpemU9W10sdGhpcy5kZXN0cm95PVtdLHRoaXMucmVhZHM9W10sdGhpcy53cml0ZXM9W119cmV0dXJuIHAoKSh0LFt7a2V5OlwicmVhZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlYWRzLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmluZGV4PT09dC5pbmRleH0pKXx8dGhpcy5yZWFkcy5wdXNoKHQpLHR9fSx7a2V5Olwic2FtcGxlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVhZCh0KSx0fX0se2tleTpcIndyaXRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih0aGlzLndyaXRlcy5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gdC5pbmRleD09PWUuaW5kZXh9KSkpcmV0dXJuIGU7dmFyIG49dC5nZXRSZXNvdXJjZU5vZGUoZSk7bi5yZXNvdXJjZS52ZXJzaW9uKyssbi5yZXNvdXJjZS5pbXBvcnRlZCYmKHRoaXMuaGFzU2lkZUVmZmVjdD0hMCk7dmFyIHI9dC5jcmVhdGVSZXNvdXJjZU5vZGUobi5yZXNvdXJjZSk7cmV0dXJuIHQuZ2V0UmVzb3VyY2VOb2RlKHIpLndyaXRlcj10aGlzLHRoaXMud3JpdGVzLnB1c2gocikscn19XSksdH0oKSxTPW4oMjMpLEU9bi5uKFMpLF89bigyNCksTz1uLm4oXyksaz1uKDE3KSxNPW4ubihrKTtmdW5jdGlvbiBBKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9TSgpKHQpO2lmKGUpe3ZhciBpPU0oKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gTygpKHRoaXMsbil9fXZhciBULEMsSSxQLGosRD1mdW5jdGlvbih0KXtFKCkobix0KTt2YXIgZT1BKG4pO2Z1bmN0aW9uIG4oKXt2YXIgdDtoKCkodGhpcyxuKTtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxpPW5ldyBBcnJheShyKSxvPTA7bzxyO28rKylpW29dPWFyZ3VtZW50c1tvXTtyZXR1cm4odD1lLmNhbGwuYXBwbHkoZSxbdGhpc10uY29uY2F0KGkpKSkudmVyc2lvbj0wLHQucmVmcz0wLHQubmFtZT12b2lkIDAsdC5pbXBvcnRlZD12b2lkIDAsdC5wcmlvcml0eT12b2lkIDAsdC5kaXNjYXJkU3RhcnQ9ITAsdC5kaXNjYXJkRW5kPSExLHQuZGVzY3JpcHRvcj12b2lkIDAsdC5yZXNvdXJjZT12b2lkIDAsdH1yZXR1cm4gcCgpKG4sW3trZXk6XCJwcmVFeGVjdXRlRGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5kaXNjYXJkRW5kPSEwfX0se2tleTpcInBvc3RFeGVjdXRlRGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5pbXBvcnRlZH19LHtrZXk6XCJwb3N0RXhlY3V0ZURldmlydHVhbGl6ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5kaXNjYXJkU3RhcnQ9ITF9fSx7a2V5OlwicHJlRXhlY3V0ZURldmlydHVhbGl6ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5pbXBvcnRlZH19XSksbn0oKGZ1bmN0aW9uIHQoKXtoKCkodGhpcyx0KSx0aGlzLmZpcnN0PXZvaWQgMCx0aGlzLmxhc3Q9dm9pZCAwfSkpLE49ZnVuY3Rpb24gdCgpe2goKSh0aGlzLHQpLHRoaXMucmVzb3VyY2U9dm9pZCAwLHRoaXMud3JpdGVyPXZvaWQgMCx0aGlzLnJlYWRlckNvdW50PTAsdGhpcy52ZXJzaW9uPXZvaWQgMH07ZnVuY3Rpb24gUih0LGUpe3ZhciBuO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PXRbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheSh0KXx8KG49ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpcmV0dXJuIEwodCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PW4mJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PW58fFwiU2V0XCI9PT1uKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKFwiQXJndW1lbnRzXCI9PT1ufHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gTCh0LGUpfSh0KSl8fGUmJnQmJlwibnVtYmVyXCI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9dmFyIG8sYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj10W1N5bWJvbC5pdGVyYXRvcl0oKX0sbjpmdW5jdGlvbigpe3ZhciB0PW4ubmV4dCgpO3JldHVybiBhPXQuZG9uZSx0fSxlOmZ1bmN0aW9uKHQpe3M9ITAsbz10fSxmOmZ1bmN0aW9uKCl7dHJ5e2F8fG51bGw9PW4ucmV0dXJufHxuLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBvfX19fWZ1bmN0aW9uIEwodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn12YXIgQj0oVD1PYmplY3QoeS5pbmplY3RhYmxlKSgpLEM9T2JqZWN0KHkuaW5qZWN0KShtLmEuUmVuZGVyRW5naW5lKSxUKChQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2goKSh0aGlzLHQpLHRoaXMucGFzc05vZGVzPVtdLHRoaXMucmVzb3VyY2VOb2Rlcz1bXSx0aGlzLmZyYW1lR3JhcGhQYXNzZXM9W10sZigpKHRoaXMsXCJlbmdpbmVcIixqLHRoaXMpfXZhciBlLG47cmV0dXJuIHAoKSh0LFt7a2V5OlwiZXhlY3V0ZVwiLHZhbHVlOihuPXUoKShhLmEubWFyaygoZnVuY3Rpb24gdChlKXtyZXR1cm4gYS5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0aGlzLmNvbXBpbGUoKSx0Lm5leHQ9Myx0aGlzLmV4ZWN1dGVQYXNzTm9kZXMoZSk7Y2FzZSAzOmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKSxmdW5jdGlvbih0KXtyZXR1cm4gbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleTpcInRlYXJEb3duXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmZyYW1lR3JhcGhQYXNzZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC50ZWFyRG93biYmdC50ZWFyRG93bigpfSkpLHRoaXMucmVzZXQoKX19LHtrZXk6XCJhZGRQYXNzXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bmV3IHg7aS5leGVjdXRlPW4sciYmKGkudGVhckRvd249ciksaS5uYW1lPXQ7dmFyIG89bmV3IHc7cmV0dXJuIG8ubmFtZT10LHRoaXMucGFzc05vZGVzLnB1c2gobyksdGhpcy5mcmFtZUdyYXBoUGFzc2VzLnB1c2goaSksZSh0aGlzLG8saSksaX19LHtrZXk6XCJnZXRQYXNzXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZnJhbWVHcmFwaFBhc3Nlcy5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lPT09dH0pKX19LHtrZXk6XCJjb21waWxlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMsbj1SKHRoaXMucGFzc05vZGVzKTt0cnl7Zm9yKG4ucygpOyEodD1uLm4oKSkuZG9uZTspe3ZhciByPXQudmFsdWU7ci5yZWZDb3VudD1yLndyaXRlcy5sZW5ndGgrKHIuaGFzU2lkZUVmZmVjdD8xOjApLHIucmVhZHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5yZXNvdXJjZU5vZGVzW3QuaW5kZXhdLnJlYWRlckNvdW50Kyt9KSl9fWNhdGNoKHQpe24uZSh0KX1maW5hbGx5e24uZigpfXZhciBpLG89W10sYT1SKHRoaXMucmVzb3VyY2VOb2Rlcyk7dHJ5e2ZvcihhLnMoKTshKGk9YS5uKCkpLmRvbmU7KXt2YXIgcz1pLnZhbHVlOzA9PT1zLnJlYWRlckNvdW50JiZvLnB1c2gocyl9fWNhdGNoKHQpe2EuZSh0KX1maW5hbGx5e2EuZigpfWZvcig7by5sZW5ndGg7KXt2YXIgdT1vLnBvcCgpLGM9dSYmdS53cml0ZXI7aWYoYyYmMD09LS1jLnJlZkNvdW50KXt2YXIgZixsPVIoYy5yZWFkcyk7dHJ5e2ZvcihsLnMoKTshKGY9bC5uKCkpLmRvbmU7KXt2YXIgaD1mLnZhbHVlLGQ9dGhpcy5yZXNvdXJjZU5vZGVzW2guaW5kZXhdOzA9PS0tZC5yZWFkZXJDb3VudCYmby5wdXNoKGQpfX1jYXRjaCh0KXtsLmUodCl9ZmluYWxseXtsLmYoKX19fXRoaXMucmVzb3VyY2VOb2Rlcy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlc291cmNlLnJlZnMrPXQucmVhZGVyQ291bnR9KSk7dmFyIHAsZz1SKHRoaXMucGFzc05vZGVzKTt0cnl7Zm9yKGcucygpOyEocD1nLm4oKSkuZG9uZTspe3ZhciB2PXAudmFsdWU7aWYodi5yZWZDb3VudCl7dmFyIHksbT1SKHYucmVhZHMpO3RyeXtmb3IobS5zKCk7ISh5PW0ubigpKS5kb25lOyl7dmFyIGI9eS52YWx1ZSx4PXRoaXMucmVzb3VyY2VOb2Rlc1tiLmluZGV4XS5yZXNvdXJjZTt4LmZpcnN0PXguZmlyc3Q/eC5maXJzdDp2LHgubGFzdD12fX1jYXRjaCh0KXttLmUodCl9ZmluYWxseXttLmYoKX12YXIgdyxTPVIodi53cml0ZXMpO3RyeXtmb3IoUy5zKCk7ISh3PVMubigpKS5kb25lOyl7dmFyIEU9dy52YWx1ZSxfPXRoaXMucmVzb3VyY2VOb2Rlc1tFLmluZGV4XS5yZXNvdXJjZTtfLmZpcnN0PV8uZmlyc3Q/Xy5maXJzdDp2LF8ubGFzdD12fX1jYXRjaCh0KXtTLmUodCl9ZmluYWxseXtTLmYoKX19fX1jYXRjaCh0KXtnLmUodCl9ZmluYWxseXtnLmYoKX1mb3IodmFyIE89MDtPPDI7TysrKXt2YXIgayxNPVIodGhpcy5yZXNvdXJjZU5vZGVzKTt0cnl7Zm9yKE0ucygpOyEoaz1NLm4oKSkuZG9uZTspe3ZhciBBPWsudmFsdWUucmVzb3VyY2U7aWYoQS5wcmlvcml0eT09PU8mJkEucmVmcyl7dmFyIFQ9QS5maXJzdCxDPUEubGFzdDtUJiZDJiYoVC5kZXZpcnR1YWxpemUucHVzaChBKSxDLmRlc3Ryb3kucHVzaChBKSl9fX1jYXRjaCh0KXtNLmUodCl9ZmluYWxseXtNLmYoKX19fX0se2tleTpcImV4ZWN1dGVQYXNzTm9kZXNcIix2YWx1ZTooZT11KCkoYS5hLm1hcmsoKGZ1bmN0aW9uIHQoZSl7dmFyIG4scixvLHMsdSxjLGYsbCxoLGQscCxnLHY7cmV0dXJuIGEuYS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpuPVIodGhpcy5wYXNzTm9kZXMuZW50cmllcygpKSx0LnByZXY9MSxuLnMoKTtjYXNlIDM6aWYoKHI9bi5uKCkpLmRvbmUpe3QubmV4dD0xODticmVha31pZihvPWkoKShyLnZhbHVlLDIpLHM9b1swXSwhKHU9b1sxXSkucmVmQ291bnQpe3QubmV4dD0xNjticmVha31jPVIodS5kZXZpcnR1YWxpemUpO3RyeXtmb3IoYy5zKCk7IShmPWMubigpKS5kb25lOylmLnZhbHVlLnByZUV4ZWN1dGVEZXZpcnR1YWxpemUodGhpcy5lbmdpbmUpfWNhdGNoKHQpe2MuZSh0KX1maW5hbGx5e2MuZigpfWw9Uih1LmRlc3Ryb3kpO3RyeXtmb3IobC5zKCk7IShoPWwubigpKS5kb25lOyloLnZhbHVlLnByZUV4ZWN1dGVEZXN0cm95KHRoaXMuZW5naW5lKX1jYXRjaCh0KXtsLmUodCl9ZmluYWxseXtsLmYoKX1yZXR1cm4gdC5uZXh0PTEyLHRoaXMuZnJhbWVHcmFwaFBhc3Nlc1tzXS5leGVjdXRlKHRoaXMsdGhpcy5mcmFtZUdyYXBoUGFzc2VzW3NdLGUpO2Nhc2UgMTI6ZD1SKHUuZGV2aXJ0dWFsaXplKTt0cnl7Zm9yKGQucygpOyEocD1kLm4oKSkuZG9uZTspcC52YWx1ZS5wb3N0RXhlY3V0ZURldmlydHVhbGl6ZSh0aGlzLmVuZ2luZSl9Y2F0Y2godCl7ZC5lKHQpfWZpbmFsbHl7ZC5mKCl9Zz1SKHUuZGVzdHJveSk7dHJ5e2ZvcihnLnMoKTshKHY9Zy5uKCkpLmRvbmU7KXYudmFsdWUucG9zdEV4ZWN1dGVEZXN0cm95KHRoaXMuZW5naW5lKX1jYXRjaCh0KXtnLmUodCl9ZmluYWxseXtnLmYoKX1jYXNlIDE2OnQubmV4dD0zO2JyZWFrO2Nhc2UgMTg6dC5uZXh0PTIzO2JyZWFrO2Nhc2UgMjA6dC5wcmV2PTIwLHQudDA9dC5jYXRjaCgxKSxuLmUodC50MCk7Y2FzZSAyMzpyZXR1cm4gdC5wcmV2PTIzLG4uZigpLHQuZmluaXNoKDIzKTtjYXNlIDI2OnRoaXMucmVzZXQoKTtjYXNlIDI3OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMsW1sxLDIwLDIzLDI2XV0pfSkpKSxmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleTpcInJlc2V0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnBhc3NOb2Rlcz1bXSx0aGlzLnJlc291cmNlTm9kZXM9W10sdGhpcy5mcmFtZUdyYXBoUGFzc2VzPVtdfX0se2tleTpcImdldFJlc291cmNlTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc291cmNlTm9kZXNbdC5pbmRleF19fSx7a2V5OlwiY3JlYXRlUmVzb3VyY2VOb2RlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9bmV3IE47ZS5yZXNvdXJjZT10LGUudmVyc2lvbj10LnZlcnNpb24sdGhpcy5yZXNvdXJjZU5vZGVzLnB1c2goZSk7dmFyIG49bmV3IGI7cmV0dXJuIG4uaW5kZXg9dGhpcy5yZXNvdXJjZU5vZGVzLmxlbmd0aC0xLG59fSx7a2V5OlwiY3JlYXRlVGV4dHVyZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgRDtyZXR1cm4gci5uYW1lPWUsci5kZXNjcmlwdG9yPW4sdGhpcy5jcmVhdGVSZXNvdXJjZU5vZGUocil9fSx7a2V5OlwiY3JlYXRlUmVuZGVyVGFyZ2V0XCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBEO3JldHVybiByLm5hbWU9ZSxyLmRlc2NyaXB0b3I9bix0aGlzLmNyZWF0ZVJlc291cmNlTm9kZShyKX19LHtrZXk6XCJwcmVzZW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5hZGRQYXNzKFwiUHJlc2VudFwiLChmdW5jdGlvbihlLG4pe24ucmVhZCh0KSxuLmhhc1NpZGVFZmZlY3Q9ITB9KSx1KCkoYS5hLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gYS5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSkpfX1dKSx0fSgpLGo9digpKFAucHJvdG90eXBlLFwiZW5naW5lXCIsW0NdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksST1QKSl8fEkpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSk7dmFyIHI9big0KSxpPW4ubihyKSxvPW4oNiksYT1uLm4obykscz1uKDcpLHU9bi5uKHMpLGM9bigyNzIpLGY9bi5uKGMpLGw9big1KTt2YXIgaCxkPS91bmlmb3JtXFxzKyhib29sfGZsb2F0fGludHx2ZWMyfHZlYzN8dmVjNHxpdmVjMnxpdmVjM3xpdmVjNHxtYXQyfG1hdDN8bWF0NHxzYW1wbGVyMkR8c2FtcGxlckN1YmUpXFxzKyhbXFxzXFxTXSo/KTsvZztmdW5jdGlvbiBwKHQpe3ZhciBlPXt9O3JldHVybntjb250ZW50OnQ9dC5yZXBsYWNlKGQsKGZ1bmN0aW9uKHQsbixyKXt2YXIgaT1yLnNwbGl0KFwiOlwiKSxvPWlbMF0udHJpbSgpLGE9XCJcIjtzd2l0Y2goaS5sZW5ndGg+MSYmKGE9aVsxXS50cmltKCkpLG4pe2Nhc2VcImJvb2xcIjphPVwidHJ1ZVwiPT09YTticmVhaztjYXNlXCJmbG9hdFwiOmNhc2VcImludFwiOmE9TnVtYmVyKGEpO2JyZWFrO2Nhc2VcInZlYzJcIjpjYXNlXCJ2ZWMzXCI6Y2FzZVwidmVjNFwiOmNhc2VcIml2ZWMyXCI6Y2FzZVwiaXZlYzNcIjpjYXNlXCJpdmVjNFwiOmNhc2VcIm1hdDJcIjpjYXNlXCJtYXQzXCI6Y2FzZVwibWF0NFwiOmE9YT9hLnJlcGxhY2UoXCJbXCIsXCJcIikucmVwbGFjZShcIl1cIixcIlwiKS5zcGxpdChcIixcIikucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0LnB1c2goTnVtYmVyKGUudHJpbSgpKSksdH0pLFtdKTpuZXcgQXJyYXkoZnVuY3Rpb24odCl7dmFyIGU9MDtzd2l0Y2godCl7Y2FzZVwidmVjMlwiOmNhc2VcIml2ZWMyXCI6ZT0yO2JyZWFrO2Nhc2VcInZlYzNcIjpjYXNlXCJpdmVjM1wiOmU9MzticmVhaztjYXNlXCJ2ZWM0XCI6Y2FzZVwiaXZlYzRcIjpjYXNlXCJtYXQyXCI6ZT00O2JyZWFrO2Nhc2VcIm1hdDNcIjplPTk7YnJlYWs7Y2FzZVwibWF0NFwiOmU9MTZ9cmV0dXJuIGV9KG4pKS5maWxsKDApfXJldHVybiBlW29dPWEsXCJ1bmlmb3JtIFwiLmNvbmNhdChuLFwiIFwiKS5jb25jYXQobyxcIjtcXG5cIil9KSksdW5pZm9ybXM6ZX19ZnVuY3Rpb24gZyh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gdih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9nKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aSgpKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpnKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fXZhciB5PS9wcmVjaXNpb25cXHMrKGhpZ2h8bG93fG1lZGl1bSlwXFxzK2Zsb2F0LyxtPS8jcHJhZ21hIGluY2x1ZGUgKFtcIl4rXCJdP1tcIlxcIFwiW2EtekEtWl8wLTldKC4qKVwiXSo/KS9nLGI9T2JqZWN0KGwuaW5qZWN0YWJsZSkoKShoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2EoKSh0aGlzLHQpLHRoaXMubW9kdWxlQ2FjaGU9e30sdGhpcy5yYXdDb250ZW50Q2FjaGU9e319cmV0dXJuIHUoKSh0LFt7a2V5OlwicmVnaXN0ZXJCdWlsdGluTW9kdWxlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5kZXN0cm95KCksdGhpcy5yZWdpc3Rlck1vZHVsZShcInBpY2tpbmdcIix7dnM6XCJhdHRyaWJ1dGUgdmVjMyBhX1BpY2tpbmdDb2xvcjtcXG52YXJ5aW5nIHZlYzQgdl9QaWNraW5nUmVzdWx0O1xcblxcbnVuaWZvcm0gdmVjMyB1X1BpY2tpbmdDb2xvciA6IFswLCAwLCAwXTtcXG51bmlmb3JtIHZlYzQgdV9IaWdobGlnaHRDb2xvciA6IFswLCAwLCAwLCAwXTtcXG51bmlmb3JtIGZsb2F0IHVfUGlja2luZ1N0YWdlIDogMC4wO1xcbnVuaWZvcm0gZmxvYXQgdV9QaWNraW5nVGhyZXNob2xkIDogMS4wO1xcbnVuaWZvcm0gZmxvYXQgdV9QaWNraW5nQnVmZmVyOiAwLjA7XFxuXFxuI2RlZmluZSBQSUNLSU5HX0VOQ09ERSAxLjBcXG4jZGVmaW5lIFBJQ0tJTkdfSElHSExJR0hUIDIuMFxcbiNkZWZpbmUgQ09MT1JfU0NBTEUgMS4gLyAyNTUuXFxuXFxuYm9vbCBpc1ZlcnRleFBpY2tlZCh2ZWMzIHZlcnRleENvbG9yKSB7XFxuICByZXR1cm5cXG4gICAgYWJzKHZlcnRleENvbG9yLnIgLSB1X1BpY2tpbmdDb2xvci5yKSA8IHVfUGlja2luZ1RocmVzaG9sZCAmJlxcbiAgICBhYnModmVydGV4Q29sb3IuZyAtIHVfUGlja2luZ0NvbG9yLmcpIDwgdV9QaWNraW5nVGhyZXNob2xkICYmXFxuICAgIGFicyh2ZXJ0ZXhDb2xvci5iIC0gdV9QaWNraW5nQ29sb3IuYikgPCB1X1BpY2tpbmdUaHJlc2hvbGQ7XFxufVxcblxcbnZvaWQgc2V0UGlja2luZ0NvbG9yKHZlYzMgcGlja2luZ0NvbG9yKSB7XFxuICAvLyBjb21wYXJlcyBvbmx5IGluIGhpZ2hsaWdodCBzdGFnZVxcbiAgdl9QaWNraW5nUmVzdWx0LmEgPSBmbG9hdCgodV9QaWNraW5nU3RhZ2UgPT0gUElDS0lOR19ISUdITElHSFQpICYmIGlzVmVydGV4UGlja2VkKHBpY2tpbmdDb2xvcikpO1xcblxcbiAgLy8gU3RvcmVzIHRoZSBwaWNraW5nIGNvbG9yIHNvIHRoYXQgdGhlIGZyYWdtZW50IHNoYWRlciBjYW4gcmVuZGVyIGl0IGR1cmluZyBwaWNraW5nXFxuICB2X1BpY2tpbmdSZXN1bHQucmdiID0gcGlja2luZ0NvbG9yICogQ09MT1JfU0NBTEU7XFxufVxcblxcbmZsb2F0IHNldFBpY2tpbmdTaXplKGZsb2F0IHgpIHtcXG4gICByZXR1cm4gdV9QaWNraW5nU3RhZ2UgPT0gUElDS0lOR19FTkNPREUgPyB4ICsgdV9QaWNraW5nQnVmZmVyIDogeDtcXG59XCIsZnM6XCJ2YXJ5aW5nIHZlYzQgdl9QaWNraW5nUmVzdWx0O1xcbnVuaWZvcm0gdmVjNCB1X0hpZ2hsaWdodENvbG9yIDogWzAsIDAsIDAsIDBdO1xcbnVuaWZvcm0gZmxvYXQgdV9QaWNraW5nU3RhZ2UgOiAwLjA7XFxuXFxuI2RlZmluZSBQSUNLSU5HX0VOQ09ERSAxLjBcXG4jZGVmaW5lIFBJQ0tJTkdfSElHSExJR0hUIDIuMFxcbiNkZWZpbmUgQ09MT1JfU0NBTEUgMS4gLyAyNTUuXFxuXFxuLypcXG4gKiBSZXR1cm5zIGhpZ2hsaWdodCBjb2xvciBpZiB0aGlzIGl0ZW0gaXMgc2VsZWN0ZWQuXFxuICovXFxudmVjNCBmaWx0ZXJIaWdobGlnaHRDb2xvcih2ZWM0IGNvbG9yKSB7XFxuICBib29sIHNlbGVjdGVkID0gYm9vbCh2X1BpY2tpbmdSZXN1bHQuYSk7XFxuXFxuICBpZiAoc2VsZWN0ZWQpIHtcXG4gICAgdmVjNCBoaWdoTGlnaHRDb2xvciA9IHVfSGlnaGxpZ2h0Q29sb3IgKiBDT0xPUl9TQ0FMRTtcXG5cXG4gICAgZmxvYXQgaGlnaExpZ2h0QWxwaGEgPSBoaWdoTGlnaHRDb2xvci5hO1xcbiAgICBmbG9hdCBoaWdoTGlnaHRSYXRpbyA9IGhpZ2hMaWdodEFscGhhIC8gKGhpZ2hMaWdodEFscGhhICsgY29sb3IuYSAqICgxLjAgLSBoaWdoTGlnaHRBbHBoYSkpO1xcblxcbiAgICB2ZWMzIHJlc3VsdFJHQiA9IG1peChjb2xvci5yZ2IsIGhpZ2hMaWdodENvbG9yLnJnYiwgaGlnaExpZ2h0UmF0aW8pO1xcbiAgICByZXR1cm4gdmVjNChyZXN1bHRSR0IsIGNvbG9yLmEpO1xcbiAgfSBlbHNlIHtcXG4gICAgcmV0dXJuIGNvbG9yO1xcbiAgfVxcbn1cXG5cXG4vKlxcbiAqIFJldHVybnMgcGlja2luZyBjb2xvciBpZiBwaWNraW5nIGVuYWJsZWQgZWxzZSB1bm1vZGlmaWVkIGFyZ3VtZW50LlxcbiAqL1xcbnZlYzQgZmlsdGVyUGlja2luZ0NvbG9yKHZlYzQgY29sb3IpIHtcXG4gIHZlYzMgcGlja2luZ0NvbG9yID0gdl9QaWNraW5nUmVzdWx0LnJnYjtcXG4gIGlmICh1X1BpY2tpbmdTdGFnZSA9PSBQSUNLSU5HX0VOQ09ERSAmJiBsZW5ndGgocGlja2luZ0NvbG9yKSA8IDAuMDAxKSB7XFxuICAgIGRpc2NhcmQ7XFxuICB9XFxuICByZXR1cm4gdV9QaWNraW5nU3RhZ2UgPT0gUElDS0lOR19FTkNPREUgPyB2ZWM0KHBpY2tpbmdDb2xvciwgc3RlcCgwLjAwMSxjb2xvci5hKSk6IGNvbG9yO1xcbn1cXG5cXG4vKlxcbiAqIFJldHVybnMgcGlja2luZyBjb2xvciBpZiBwaWNraW5nIGlzIGVuYWJsZWQgaWYgbm90XFxuICogaGlnaGxpZ2h0IGNvbG9yIGlmIHRoaXMgaXRlbSBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIHVubW9kaWZpZWQgYXJndW1lbnQuXFxuICovXFxudmVjNCBmaWx0ZXJDb2xvcih2ZWM0IGNvbG9yKSB7XFxuICByZXR1cm4gZmlsdGVyUGlja2luZ0NvbG9yKGZpbHRlckhpZ2hsaWdodENvbG9yKGNvbG9yKSk7XFxufVxcblwifSksdGhpcy5yZWdpc3Rlck1vZHVsZShcInNkZjJkXCIse3ZzOlwiXCIsZnM6XCIvKipcXG4gKiAyRCBzaWduZWQgZGlzdGFuY2UgZmllbGQgZnVuY3Rpb25zXFxuICogQHNlZSBodHRwOi8vd3d3LmlxdWlsZXpsZXMub3JnL3d3dy9hcnRpY2xlcy9kaXN0ZnVuY3Rpb25zMmQvZGlzdGZ1bmN0aW9uczJkLmh0bVxcbiAqL1xcblxcbmZsb2F0IG5kb3QodmVjMiBhLCB2ZWMyIGIgKSB7IHJldHVybiBhLngqYi54IC0gYS55KmIueTsgfVxcblxcbmZsb2F0IHNkQ2lyY2xlKHZlYzIgcCwgZmxvYXQgcikge1xcbiAgcmV0dXJuIGxlbmd0aChwKSAtIHI7XFxufVxcblxcbmZsb2F0IHNkRXF1aWxhdGVyYWxUcmlhbmdsZSh2ZWMyIHApIHtcXG4gIGZsb2F0IGsgPSBzcXJ0KDMuMCk7XFxuICBwLnggPSBhYnMocC54KSAtIDEuMDtcXG4gIHAueSA9IHAueSArIDEuMC9rO1xcbiAgaWYoIHAueCArIGsqcC55ID4gMC4wICkgcCA9IHZlYzIocC54LWsqcC55LC1rKnAueC1wLnkpLzIuMDtcXG4gIHAueCAtPSBjbGFtcCggcC54LCAtMi4wLCAwLjAgKTtcXG4gIHJldHVybiAtbGVuZ3RoKHApKnNpZ24ocC55KTtcXG59XFxuXFxuZmxvYXQgc2RCb3godmVjMiBwLCB2ZWMyIGIpIHtcXG4gIHZlYzIgZCA9IGFicyhwKS1iO1xcbiAgcmV0dXJuIGxlbmd0aChtYXgoZCx2ZWMyKDApKSkgKyBtaW4obWF4KGQueCxkLnkpLDAuMCk7XFxufVxcblxcbmZsb2F0IHNkUGVudGFnb24odmVjMiBwLCBmbG9hdCByKSB7XFxuICB2ZWMzIGsgPSB2ZWMzKDAuODA5MDE2OTk0LDAuNTg3Nzg1MjUyLDAuNzI2NTQyNTI4KTtcXG4gIHAueCA9IGFicyhwLngpO1xcbiAgcCAtPSAyLjAqbWluKGRvdCh2ZWMyKC1rLngsay55KSxwKSwwLjApKnZlYzIoLWsueCxrLnkpO1xcbiAgcCAtPSAyLjAqbWluKGRvdCh2ZWMyKCBrLngsay55KSxwKSwwLjApKnZlYzIoIGsueCxrLnkpO1xcbiAgcCAtPSB2ZWMyKGNsYW1wKHAueCwtciprLnosciprLnopLHIpO1xcbiAgcmV0dXJuIGxlbmd0aChwKSpzaWduKHAueSk7XFxufVxcblxcbmZsb2F0IHNkSGV4YWdvbih2ZWMyIHAsIGZsb2F0IHIpIHtcXG4gIHZlYzMgayA9IHZlYzMoLTAuODY2MDI1NDA0LDAuNSwwLjU3NzM1MDI2OSk7XFxuICBwID0gYWJzKHApO1xcbiAgcCAtPSAyLjAqbWluKGRvdChrLnh5LHApLDAuMCkqay54eTtcXG4gIHAgLT0gdmVjMihjbGFtcChwLngsIC1rLnoqciwgay56KnIpLCByKTtcXG4gIHJldHVybiBsZW5ndGgocCkqc2lnbihwLnkpO1xcbn1cXG5cXG5mbG9hdCBzZE9jdG9nb24odmVjMiBwLCBmbG9hdCByKSB7XFxuICB2ZWMzIGsgPSB2ZWMzKC0wLjkyMzg3OTUzMjUsIDAuMzgyNjgzNDMyMywgMC40MTQyMTM1NjIzICk7XFxuICBwID0gYWJzKHApO1xcbiAgcCAtPSAyLjAqbWluKGRvdCh2ZWMyKCBrLngsay55KSxwKSwwLjApKnZlYzIoIGsueCxrLnkpO1xcbiAgcCAtPSAyLjAqbWluKGRvdCh2ZWMyKC1rLngsay55KSxwKSwwLjApKnZlYzIoLWsueCxrLnkpO1xcbiAgcCAtPSB2ZWMyKGNsYW1wKHAueCwgLWsueipyLCBrLnoqciksIHIpO1xcbiAgcmV0dXJuIGxlbmd0aChwKSpzaWduKHAueSk7XFxufVxcblxcbmZsb2F0IHNkSGV4YWdyYW0odmVjMiBwLCBmbG9hdCByKSB7XFxuICB2ZWM0IGs9dmVjNCgtMC41LDAuODY2MDI1NDAzOCwwLjU3NzM1MDI2OTIsMS43MzIwNTA4MDc2KTtcXG4gIHAgPSBhYnMocCk7XFxuICBwIC09IDIuMCptaW4oZG90KGsueHkscCksMC4wKSprLnh5O1xcbiAgcCAtPSAyLjAqbWluKGRvdChrLnl4LHApLDAuMCkqay55eDtcXG4gIHAgLT0gdmVjMihjbGFtcChwLngsciprLnosciprLncpLHIpO1xcbiAgcmV0dXJuIGxlbmd0aChwKSpzaWduKHAueSk7XFxufVxcblxcbmZsb2F0IHNkUmhvbWJ1cyh2ZWMyIHAsIHZlYzIgYikge1xcbiAgdmVjMiBxID0gYWJzKHApO1xcbiAgZmxvYXQgaCA9IGNsYW1wKCgtMi4wKm5kb3QocSxiKStuZG90KGIsYikpL2RvdChiLGIpLC0xLjAsMS4wKTtcXG4gIGZsb2F0IGQgPSBsZW5ndGgoIHEgLSAwLjUqYip2ZWMyKDEuMC1oLDEuMCtoKSApO1xcbiAgcmV0dXJuIGQgKiBzaWduKCBxLngqYi55ICsgcS55KmIueCAtIGIueCpiLnkgKTtcXG59XFxuXFxuZmxvYXQgc2RWZXNpY2EodmVjMiBwLCBmbG9hdCByLCBmbG9hdCBkKSB7XFxuICBwID0gYWJzKHApO1xcbiAgZmxvYXQgYiA9IHNxcnQocipyLWQqZCk7IC8vIGNhbiBkZWxheSB0aGlzIHNxcnRcXG4gIHJldHVybiAoKHAueS1iKSpkPnAueCpiKVxcbiAgICAgICAgICA/IGxlbmd0aChwLXZlYzIoMC4wLGIpKVxcbiAgICAgICAgICA6IGxlbmd0aChwLXZlYzIoLWQsMC4wKSktcjtcXG59XCJ9KX19LHtrZXk6XCJyZWdpc3Rlck1vZHVsZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMucmF3Q29udGVudENhY2hlW3RdKXt2YXIgbj1lLnZzLHI9dm9pZCAwPT09bj9cIlwiOm4saT1lLmZzLG89dm9pZCAwPT09aT9cIlwiOmksYT1lLnVuaWZvcm1zLHM9cChyKSx1PXMuY29udGVudCxjPXMudW5pZm9ybXMsZj1wKG8pLGw9Zi5jb250ZW50LGg9Zi51bmlmb3Jtczt0aGlzLnJhd0NvbnRlbnRDYWNoZVt0XT17ZnM6bCx1bmlmb3Jtczp2KHYodih7fSxjKSxoKSxhKSx2czp1fX19fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5tb2R1bGVDYWNoZT17fSx0aGlzLnJhd0NvbnRlbnRDYWNoZT17fX19LHtrZXk6XCJnZXRNb2R1bGVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHRoaXMubW9kdWxlQ2FjaGVbdF0pcmV0dXJuIHRoaXMubW9kdWxlQ2FjaGVbdF07dmFyIG49dGhpcy5yYXdDb250ZW50Q2FjaGVbdF0udnN8fFwiXCIscj10aGlzLnJhd0NvbnRlbnRDYWNoZVt0XS5mc3x8XCJcIixpPXRoaXMucHJvY2Vzc01vZHVsZShuLFtdLFwidnNcIiksbz1pLmNvbnRlbnQsYT1pLmluY2x1ZGVMaXN0LHM9dGhpcy5wcm9jZXNzTW9kdWxlKHIsW10sXCJmc1wiKSx1PXMuY29udGVudCxjPXMuaW5jbHVkZUxpc3QsbD11LGg9ZigpKGEuY29uY2F0KGMpLmNvbmNhdCh0KSkucmVkdWNlKChmdW5jdGlvbih0LG4pe3JldHVybiB2KHYoe30sdCksZS5yYXdDb250ZW50Q2FjaGVbbl0udW5pZm9ybXMpfSkse30pO3JldHVybiB5LnRlc3QodSl8fChsPVwiI2lmZGVmIEdMX0ZSQUdNRU5UX1BSRUNJU0lPTl9ISUdIXFxuIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4gI2Vsc2VcXG4gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuI2VuZGlmXFxuXCIrdSksdGhpcy5tb2R1bGVDYWNoZVt0XT17ZnM6bC50cmltKCksdW5pZm9ybXM6aCx2czpvLnRyaW0oKX0sdGhpcy5tb2R1bGVDYWNoZVt0XX19LHtrZXk6XCJwcm9jZXNzTW9kdWxlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7cmV0dXJue2NvbnRlbnQ6dC5yZXBsYWNlKG0sKGZ1bmN0aW9uKHQsaSl7dmFyIG89aS5zcGxpdChcIiBcIilbMF0ucmVwbGFjZSgvXCIvZyxcIlwiKTtpZihlLmluZGV4T2Yobyk+LTEpcmV0dXJuXCJcIjt2YXIgYT1yLnJhd0NvbnRlbnRDYWNoZVtvXVtuXTtyZXR1cm4gZS5wdXNoKG8pLHIucHJvY2Vzc01vZHVsZShhfHxcIlwiLGUsbikuY29udGVudH0pKSxpbmNsdWRlTGlzdDplfX19XSksdH0oKSl8fGh9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9ldmVudHM9e319cmV0dXJuIHQucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5fZXZlbnRzW3RdfHwodGhpcy5fZXZlbnRzW3RdPVtdKSx0aGlzLl9ldmVudHNbdF0ucHVzaCh7Y2FsbGJhY2s6ZSxvbmNlOiEhbn0pLHRoaXN9LHQucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5vbih0LGUsITApLHRoaXN9LHQucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj1bXSxyPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3ZhciBpPXRoaXMuX2V2ZW50c1t0XXx8W10sbz10aGlzLl9ldmVudHNbXCIqXCJdfHxbXSxhPWZ1bmN0aW9uKHIpe2Zvcih2YXIgaT1yLmxlbmd0aCxvPTA7bzxpO28rKylpZihyW29dKXt2YXIgYT1yW29dLHM9YS5jYWxsYmFjazthLm9uY2UmJihyLnNwbGljZShvLDEpLDA9PT1yLmxlbmd0aCYmZGVsZXRlIGUuX2V2ZW50c1t0XSxpLS0sby0tKSxzLmFwcGx5KGUsbil9fTthKGkpLGEobyl9LHQucHJvdG90eXBlLm9mZj1mdW5jdGlvbih0LGUpe2lmKHQpaWYoZSl7Zm9yKHZhciBuPXRoaXMuX2V2ZW50c1t0XXx8W10scj1uLmxlbmd0aCxpPTA7aTxyO2krKyluW2ldLmNhbGxiYWNrPT09ZSYmKG4uc3BsaWNlKGksMSksci0tLGktLSk7MD09PW4ubGVuZ3RoJiZkZWxldGUgdGhpcy5fZXZlbnRzW3RdfWVsc2UgZGVsZXRlIHRoaXMuX2V2ZW50c1t0XTtlbHNlIHRoaXMuX2V2ZW50cz17fTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZ2V0RXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50c30sdH0oKTtlLmE9cn0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMSksaT1uKDEzOCksbz1uKDE5KSxhPXt9O3ZhciBzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLmlzQ2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGUucHJvdG90eXBlLmdldEJCb3g9ZnVuY3Rpb24oKXt2YXIgdD0xLzAsZT0tMS8wLG49MS8wLHI9LTEvMCxpPVtdLGE9W10scz10aGlzLmdldENoaWxkcmVuKCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQoXCJ2aXNpYmxlXCIpJiYoIXQuaXNHcm91cCgpfHx0LmlzR3JvdXAoKSYmdC5nZXRDaGlsZHJlbigpLmxlbmd0aD4wKX0pKTtyZXR1cm4gcy5sZW5ndGg+MD8oT2JqZWN0KG8uYSkocywoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRCQm94KCk7aS5wdXNoKGUubWluWCxlLm1heFgpLGEucHVzaChlLm1pblksZS5tYXhZKX0pKSx0PU1hdGgubWluLmFwcGx5KG51bGwsaSksZT1NYXRoLm1heC5hcHBseShudWxsLGkpLG49TWF0aC5taW4uYXBwbHkobnVsbCxhKSxyPU1hdGgubWF4LmFwcGx5KG51bGwsYSkpOih0PTAsZT0wLG49MCxyPTApLHt4OnQseTpuLG1pblg6dCxtaW5ZOm4sbWF4WDplLG1heFk6cix3aWR0aDplLXQsaGVpZ2h0OnItbn19LGUucHJvdG90eXBlLmdldENhbnZhc0JCb3g9ZnVuY3Rpb24oKXt2YXIgdD0xLzAsZT0tMS8wLG49MS8wLHI9LTEvMCxpPVtdLGE9W10scz10aGlzLmdldENoaWxkcmVuKCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQoXCJ2aXNpYmxlXCIpJiYoIXQuaXNHcm91cCgpfHx0LmlzR3JvdXAoKSYmdC5nZXRDaGlsZHJlbigpLmxlbmd0aD4wKX0pKTtyZXR1cm4gcy5sZW5ndGg+MD8oT2JqZWN0KG8uYSkocywoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRDYW52YXNCQm94KCk7aS5wdXNoKGUubWluWCxlLm1heFgpLGEucHVzaChlLm1pblksZS5tYXhZKX0pKSx0PU1hdGgubWluLmFwcGx5KG51bGwsaSksZT1NYXRoLm1heC5hcHBseShudWxsLGkpLG49TWF0aC5taW4uYXBwbHkobnVsbCxhKSxyPU1hdGgubWF4LmFwcGx5KG51bGwsYSkpOih0PTAsZT0wLG49MCxyPTApLHt4OnQseTpuLG1pblg6dCxtaW5ZOm4sbWF4WDplLG1heFk6cix3aWR0aDplLXQsaGVpZ2h0OnItbn19LGUucHJvdG90eXBlLmdldERlZmF1bHRDZmc9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5nZXREZWZhdWx0Q2ZnLmNhbGwodGhpcyk7cmV0dXJuIGUuY2hpbGRyZW49W10sZX0sZS5wcm90b3R5cGUub25BdHRyQ2hhbmdlPWZ1bmN0aW9uKGUsbixyKXtpZih0LnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UuY2FsbCh0aGlzLGUsbixyKSxcIm1hdHJpeFwiPT09ZSl7dmFyIGk9dGhpcy5nZXRUb3RhbE1hdHJpeCgpO3RoaXMuX2FwcGx5Q2hpbGRyZW5NYXJpeChpKX19LGUucHJvdG90eXBlLmFwcGx5TWF0cml4PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuZ2V0VG90YWxNYXRyaXgoKTt0LnByb3RvdHlwZS5hcHBseU1hdHJpeC5jYWxsKHRoaXMsZSk7dmFyIHI9dGhpcy5nZXRUb3RhbE1hdHJpeCgpO3IhPT1uJiZ0aGlzLl9hcHBseUNoaWxkcmVuTWFyaXgocil9LGUucHJvdG90eXBlLl9hcHBseUNoaWxkcmVuTWFyaXg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRDaGlsZHJlbigpO09iamVjdChvLmEpKGUsKGZ1bmN0aW9uKGUpe2UuYXBwbHlNYXRyaXgodCl9KSl9LGUucHJvdG90eXBlLmFkZFNoYXBlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPXRbMF0scj10WzFdO09iamVjdChvLmYpKG4pP3I9bjpyLnR5cGU9bjt2YXIgaT1hW3IudHlwZV07aXx8KGk9T2JqZWN0KG8uaykoci50eXBlKSxhW3IudHlwZV09aSk7dmFyIHM9dGhpcy5nZXRTaGFwZUJhc2UoKSx1PW5ldyBzW2ldKHIpO3JldHVybiB0aGlzLmFkZCh1KSx1fSxlLnByb3RvdHlwZS5hZGRHcm91cD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbixyPXRbMF0saT10WzFdO2lmKE9iamVjdChvLmQpKHIpKW49bmV3IHIoaXx8e3BhcmVudDp0aGlzfSk7ZWxzZXt2YXIgYT1yfHx7fSxzPXRoaXMuZ2V0R3JvdXBCYXNlKCk7bj1uZXcgcyhhKX1yZXR1cm4gdGhpcy5hZGQobiksbn0sZS5wcm90b3R5cGUuZ2V0Q2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDYW52YXMoKT90aGlzOnRoaXMuZ2V0KFwiY2FudmFzXCIpfSxlLnByb3RvdHlwZS5nZXRTaGFwZT1mdW5jdGlvbih0LGUsbil7aWYoIU9iamVjdChvLmIpKHRoaXMpKXJldHVybiBudWxsO3ZhciByLGk9dGhpcy5nZXRDaGlsZHJlbigpO2lmKHRoaXMuaXNDYW52YXMoKSlyPXRoaXMuX2ZpbmRTaGFwZShpLHQsZSxuKTtlbHNle3ZhciBhPVt0LGUsMV07YT10aGlzLmludmVydEZyb21NYXRyaXgoYSksdGhpcy5pc0NsaXBwZWQoYVswXSxhWzFdKXx8KHI9dGhpcy5fZmluZFNoYXBlKGksYVswXSxhWzFdLG4pKX1yZXR1cm4gcn0sZS5wcm90b3R5cGUuX2ZpbmRTaGFwZT1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9bnVsbCxhPXQubGVuZ3RoLTE7YT49MDthLS0pe3ZhciBzPXRbYV07aWYoT2JqZWN0KG8uYikocykmJihzLmlzR3JvdXAoKT9pPXMuZ2V0U2hhcGUoZSxuLHIpOnMuaXNIaXQoZSxuKSYmKGk9cykpLGkpYnJlYWt9cmV0dXJuIGl9LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldENhbnZhcygpLG49dGhpcy5nZXRDaGlsZHJlbigpLHI9dGhpcy5nZXQoXCJ0aW1lbGluZVwiKSxpPXQuZ2V0UGFyZW50KCk7aSYmZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PW4mJihuPSEwKSxuP2UuZGVzdHJveSgpOihlLnNldChcInBhcmVudFwiLG51bGwpLGUuc2V0KFwiY2FudmFzXCIsbnVsbCkpLE9iamVjdChvLmopKHQuZ2V0Q2hpbGRyZW4oKSxlKX0oaSx0LCExKSx0LnNldChcInBhcmVudFwiLHRoaXMpLGUmJmZ1bmN0aW9uIHQoZSxuKXtpZihlLnNldChcImNhbnZhc1wiLG4pLGUuaXNHcm91cCgpKXt2YXIgcj1lLmdldChcImNoaWxkcmVuXCIpO3IubGVuZ3RoJiZyLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QoZSxuKX0pKX19KHQsZSksciYmZnVuY3Rpb24gdChlLG4pe2lmKGUuc2V0KFwidGltZWxpbmVcIixuKSxlLmlzR3JvdXAoKSl7dmFyIHI9ZS5nZXQoXCJjaGlsZHJlblwiKTtyLmxlbmd0aCYmci5mb3JFYWNoKChmdW5jdGlvbihlKXt0KGUsbil9KSl9fSh0LHIpLG4ucHVzaCh0KSx0Lm9uQ2FudmFzQ2hhbmdlKFwiYWRkXCIpLHRoaXMuX2FwcGx5RWxlbWVudE1hdHJpeCh0KX0sZS5wcm90b3R5cGUuX2FwcGx5RWxlbWVudE1hdHJpeD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFRvdGFsTWF0cml4KCk7ZSYmdC5hcHBseU1hdHJpeChlKX0sZS5wcm90b3R5cGUuZ2V0Q2hpbGRyZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJjaGlsZHJlblwiKX0sZS5wcm90b3R5cGUuc29ydD1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXRDaGlsZHJlbigpO09iamVjdChvLmEpKGUsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX0lOREVYPWUsdH0pKSxlLnNvcnQoKHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5nZXQoXCJ6SW5kZXhcIiktZS5nZXQoXCJ6SW5kZXhcIil9LGZ1bmN0aW9uKGUsbil7dmFyIHI9dChlLG4pO3JldHVybiAwPT09cj9lLl9JTkRFWC1uLl9JTkRFWDpyfSkpLHRoaXMub25DYW52YXNDaGFuZ2UoXCJzb3J0XCIpfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe2lmKHRoaXMuc2V0KFwiY2xlYXJpbmdcIiwhMCksIXRoaXMuZGVzdHJveWVkKXtmb3IodmFyIHQ9dGhpcy5nZXRDaGlsZHJlbigpLGU9dC5sZW5ndGgtMTtlPj0wO2UtLSl0W2VdLmRlc3Ryb3koKTt0aGlzLnNldChcImNoaWxkcmVuXCIsW10pLHRoaXMub25DYW52YXNDaGFuZ2UoXCJjbGVhclwiKSx0aGlzLnNldChcImNsZWFyaW5nXCIsITEpfX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZ2V0KFwiZGVzdHJveWVkXCIpfHwodGhpcy5jbGVhcigpLHQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSl9LGUucHJvdG90eXBlLmdldEZpcnN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRCeUluZGV4KDApfSxlLnByb3RvdHlwZS5nZXRMYXN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRDaGlsZHJlbigpO3JldHVybiB0aGlzLmdldENoaWxkQnlJbmRleCh0Lmxlbmd0aC0xKX0sZS5wcm90b3R5cGUuZ2V0Q2hpbGRCeUluZGV4PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldENoaWxkcmVuKClbdF19LGUucHJvdG90eXBlLmdldENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGh9LGUucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5pbmRleE9mKHQpPi0xfSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPSEwKSx0aGlzLmNvbnRhaW4odCkmJnQucmVtb3ZlKGUpfSxlLnByb3RvdHlwZS5maW5kQWxsPWZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49dGhpcy5nZXRDaGlsZHJlbigpO3JldHVybiBPYmplY3Qoby5hKShuLChmdW5jdGlvbihuKXt0KG4pJiZlLnB1c2gobiksbi5pc0dyb3VwKCkmJihlPWUuY29uY2F0KG4uZmluZEFsbCh0KSkpfSkpLGV9LGUucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbCxuPXRoaXMuZ2V0Q2hpbGRyZW4oKTtyZXR1cm4gT2JqZWN0KG8uYSkobiwoZnVuY3Rpb24obil7aWYodChuKT9lPW46bi5pc0dyb3VwKCkmJihlPW4uZmluZCh0KSksZSlyZXR1cm4hMX0pKSxlfSxlLnByb3RvdHlwZS5maW5kQnlJZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoXCJpZFwiKT09PXR9KSl9LGUucHJvdG90eXBlLmZpbmRCeUNsYXNzTmFtZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoXCJjbGFzc05hbWVcIik9PT10fSkpfSxlLnByb3RvdHlwZS5maW5kQWxsQnlOYW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbmRBbGwoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldChcIm5hbWVcIik9PT10fSkpfSxlfShpLmEpO2UuYT1zfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigxKSxpPW4oMCksbz1uKDE4KSxhPW4oMTkpLHM9bigzOSksdT1uKDExNyksYz1vLmEudHJhbnNmb3JtLGY9W1wiekluZGV4XCIsXCJjYXB0dXJlXCIsXCJ2aXNpYmxlXCIsXCJ0eXBlXCJdLGw9W1wicmVwZWF0XCJdO2Z1bmN0aW9uIGgodCxlKXt2YXIgbj17fSxyPWUuYXR0cnM7Zm9yKHZhciBpIGluIHQpbltpXT1yW2ldO3JldHVybiBufWZ1bmN0aW9uIGQodCxlKXt2YXIgbj17fSxyPWUuYXR0cigpO3JldHVybiBPYmplY3QoaS5mKSh0LChmdW5jdGlvbih0LGUpey0xIT09bC5pbmRleE9mKGUpfHxPYmplY3QoaS5xKShyW2VdLHQpfHwobltlXT10KX0pKSxufWZ1bmN0aW9uIHAodCxlKXtpZihlLm9uRnJhbWUpcmV0dXJuIHQ7dmFyIG49ZS5zdGFydFRpbWUscj1lLmRlbGF5LG89ZS5kdXJhdGlvbixhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7cmV0dXJuIE9iamVjdChpLmYpKHQsKGZ1bmN0aW9uKHQpe24rcjx0LnN0YXJ0VGltZSt0LmRlbGF5K3QuZHVyYXRpb24mJm8+dC5kZWxheSYmT2JqZWN0KGkuZikoZS50b0F0dHJzLChmdW5jdGlvbihlLG4pe2EuY2FsbCh0LnRvQXR0cnMsbikmJihkZWxldGUgdC50b0F0dHJzW25dLGRlbGV0ZSB0LmZyb21BdHRyc1tuXSl9KSl9KSksdH12YXIgZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO24uYXR0cnM9e307dmFyIHI9bi5nZXREZWZhdWx0QXR0cnMoKTtyZXR1cm4gT2JqZWN0KGkuQSkocixlLmF0dHJzKSxuLmF0dHJzPXIsbi5pbml0QXR0cnMociksbi5pbml0QW5pbWF0ZSgpLG59cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZz1mdW5jdGlvbigpe3JldHVybnt2aXNpYmxlOiEwLGNhcHR1cmU6ITAsekluZGV4OjB9fSxlLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnM9ZnVuY3Rpb24oKXtyZXR1cm57bWF0cml4OnRoaXMuZ2V0RGVmYXVsdE1hdHJpeCgpLG9wYWNpdHk6MX19LGUucHJvdG90eXBlLm9uQ2FudmFzQ2hhbmdlPWZ1bmN0aW9uKHQpe30sZS5wcm90b3R5cGUuaW5pdEF0dHJzPWZ1bmN0aW9uKHQpe30sZS5wcm90b3R5cGUuaW5pdEFuaW1hdGU9ZnVuY3Rpb24oKXt0aGlzLnNldChcImFuaW1hYmxlXCIsITApLHRoaXMuc2V0KFwiYW5pbWF0aW5nXCIsITEpfSxlLnByb3RvdHlwZS5pc0dyb3VwPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGUucHJvdG90eXBlLmdldFBhcmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcInBhcmVudFwiKX0sZS5wcm90b3R5cGUuZ2V0Q2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwiY2FudmFzXCIpfSxlLnByb3RvdHlwZS5hdHRyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuXT1hcmd1bWVudHNbbl07dmFyIHI9ZVswXSxvPWVbMV07aWYoIXIpcmV0dXJuIHRoaXMuYXR0cnM7aWYoT2JqZWN0KGkudikocikpe2Zvcih2YXIgYSBpbiByKXRoaXMuc2V0QXR0cihhLHJbYV0pO3JldHVybiB0aGlzLmFmdGVyQXR0cnNDaGFuZ2UociksdGhpc31yZXR1cm4gMj09PWUubGVuZ3RoPyh0aGlzLnNldEF0dHIocixvKSx0aGlzLmFmdGVyQXR0cnNDaGFuZ2UoKCh0PXt9KVtyXT1vLHQpKSx0aGlzKTp0aGlzLmF0dHJzW3JdfSxlLnByb3RvdHlwZS5pc0NsaXBwZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldENsaXAoKTtyZXR1cm4gbiYmIW4uaXNIaXQodCxlKX0sZS5wcm90b3R5cGUuc2V0QXR0cj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYXR0cnNbdF07biE9PWUmJih0aGlzLmF0dHJzW3RdPWUsdGhpcy5vbkF0dHJDaGFuZ2UodCxlLG4pKX0sZS5wcm90b3R5cGUub25BdHRyQ2hhbmdlPWZ1bmN0aW9uKHQsZSxuKXtcIm1hdHJpeFwiPT09dCYmdGhpcy5zZXQoXCJ0b3RhbE1hdHJpeFwiLG51bGwpfSxlLnByb3RvdHlwZS5hZnRlckF0dHJzQ2hhbmdlPWZ1bmN0aW9uKHQpe2lmKHRoaXMuY2ZnLmlzQ2xpcFNoYXBlKXt2YXIgZT10aGlzLmNmZy5hcHBseVRvO2UmJmUub25DYW52YXNDaGFuZ2UoXCJjbGlwXCIpfWVsc2UgdGhpcy5vbkNhbnZhc0NoYW5nZShcImF0dHJcIil9LGUucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXQoXCJ2aXNpYmxlXCIsITApLHRoaXMub25DYW52YXNDaGFuZ2UoXCJzaG93XCIpLHRoaXN9LGUucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXQoXCJ2aXNpYmxlXCIsITEpLHRoaXMub25DYW52YXNDaGFuZ2UoXCJoaWRlXCIpLHRoaXN9LGUucHJvdG90eXBlLnNldFpJbmRleD1mdW5jdGlvbih0KXt0aGlzLnNldChcInpJbmRleFwiLHQpO3ZhciBlPXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIGUmJmUuc29ydCgpLHRoaXN9LGUucHJvdG90eXBlLnRvRnJvbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFBhcmVudCgpO2lmKHQpe3ZhciBlPXQuZ2V0Q2hpbGRyZW4oKSxuPSh0aGlzLmdldChcImVsXCIpLGUuaW5kZXhPZih0aGlzKSk7ZS5zcGxpY2UobiwxKSxlLnB1c2godGhpcyksdGhpcy5vbkNhbnZhc0NoYW5nZShcInpJbmRleFwiKX19LGUucHJvdG90eXBlLnRvQmFjaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0UGFyZW50KCk7aWYodCl7dmFyIGU9dC5nZXRDaGlsZHJlbigpLG49KHRoaXMuZ2V0KFwiZWxcIiksZS5pbmRleE9mKHRoaXMpKTtlLnNwbGljZShuLDEpLGUudW5zaGlmdCh0aGlzKSx0aGlzLm9uQ2FudmFzQ2hhbmdlKFwiekluZGV4XCIpfX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PSEwKTt2YXIgZT10aGlzLmdldFBhcmVudCgpO2U/KE9iamVjdChhLmopKGUuZ2V0Q2hpbGRyZW4oKSx0aGlzKSxlLmdldChcImNsZWFyaW5nXCIpfHx0aGlzLm9uQ2FudmFzQ2hhbmdlKFwicmVtb3ZlXCIpKTp0aGlzLm9uQ2FudmFzQ2hhbmdlKFwicmVtb3ZlXCIpLHQmJnRoaXMuZGVzdHJveSgpfSxlLnByb3RvdHlwZS5yZXNldE1hdHJpeD1mdW5jdGlvbigpe3RoaXMuYXR0cihcIm1hdHJpeFwiLHRoaXMuZ2V0RGVmYXVsdE1hdHJpeCgpKSx0aGlzLm9uQ2FudmFzQ2hhbmdlKFwibWF0cml4XCIpfSxlLnByb3RvdHlwZS5nZXRNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdHRyKFwibWF0cml4XCIpfSxlLnByb3RvdHlwZS5zZXRNYXRyaXg9ZnVuY3Rpb24odCl7dGhpcy5hdHRyKFwibWF0cml4XCIsdCksdGhpcy5vbkNhbnZhc0NoYW5nZShcIm1hdHJpeFwiKX0sZS5wcm90b3R5cGUuZ2V0VG90YWxNYXRyaXg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNmZy50b3RhbE1hdHJpeDtpZighdCl7dmFyIGU9dGhpcy5hdHRyKFwibWF0cml4XCIpLG49dGhpcy5jZmcucGFyZW50TWF0cml4O3Q9biYmZT9PYmplY3Qocy5iKShuLGUpOmV8fG4sdGhpcy5zZXQoXCJ0b3RhbE1hdHJpeFwiLHQpfXJldHVybiB0fSxlLnByb3RvdHlwZS5hcHBseU1hdHJpeD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmF0dHIoXCJtYXRyaXhcIiksbj1udWxsO249dCYmZT9PYmplY3Qocy5iKSh0LGUpOmV8fHQsdGhpcy5zZXQoXCJ0b3RhbE1hdHJpeFwiLG4pLHRoaXMuc2V0KFwicGFyZW50TWF0cml4XCIsdCl9LGUucHJvdG90eXBlLmdldERlZmF1bHRNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUuYXBwbHlUb01hdHJpeD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmF0dHIoXCJtYXRyaXhcIik7cmV0dXJuIGU/T2JqZWN0KHMuYykoZSx0KTp0fSxlLnByb3RvdHlwZS5pbnZlcnRGcm9tTWF0cml4PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYXR0cihcIm1hdHJpeFwiKTtpZihlKXt2YXIgbj1PYmplY3Qocy5hKShlKTtpZihuKXJldHVybiBPYmplY3Qocy5jKShuLHQpfXJldHVybiB0fSxlLnByb3RvdHlwZS5zZXRDbGlwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0Q2FudmFzKCksbj1udWxsO2lmKHQpe3ZhciByPXRoaXMuZ2V0U2hhcGVCYXNlKClbT2JqZWN0KGkuSSkodC50eXBlKV07ciYmKG49bmV3IHIoe3R5cGU6dC50eXBlLGlzQ2xpcFNoYXBlOiEwLGFwcGx5VG86dGhpcyxhdHRyczp0LmF0dHJzLGNhbnZhczplfSkpfXJldHVybiB0aGlzLnNldChcImNsaXBTaGFwZVwiLG4pLHRoaXMub25DYW52YXNDaGFuZ2UoXCJjbGlwXCIpLG59LGUucHJvdG90eXBlLmdldENsaXA9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNmZy5jbGlwU2hhcGU7cmV0dXJuIHR8fG51bGx9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuYXR0cnMsbj17fTtPYmplY3QoaS5mKShlLChmdW5jdGlvbih0LHIpe09iamVjdChpLm0pKGVbcl0pP25bcl09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoO24rKylPYmplY3QoaS5tKSh0W25dKT9lLnB1c2goW10uY29uY2F0KHRbbl0pKTplLnB1c2godFtuXSk7cmV0dXJuIGV9KGVbcl0pOm5bcl09ZVtyXX0pKTt2YXIgcj1uZXcoMCx0aGlzLmNvbnN0cnVjdG9yKSh7YXR0cnM6bn0pO3JldHVybiBPYmplY3QoaS5mKShmLChmdW5jdGlvbihlKXtyLnNldChlLHQuZ2V0KGUpKX0pKSxyfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5kZXN0cm95ZWR8fCh0aGlzLmF0dHJzPXt9LHQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSl9LGUucHJvdG90eXBlLmlzQW5pbWF0ZVBhdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcIl9wYXVzZVwiKS5pc1BhdXNlZH0sZS5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbj10aGlzLmlzQ2FudmFzJiZ0aGlzLmlzQ2FudmFzKCk7aWYobnx8dGhpcy5nZXQoXCJjYW52YXNcIikpe3RoaXMuc2V0KFwiYW5pbWF0aW5nXCIsITApO3ZhciByPXRoaXMuZ2V0KFwidGltZWxpbmVcIik7cnx8KHI9dGhpcy5nZXQoXCJjYW52YXNcIikuZ2V0KFwidGltZWxpbmVcIiksdGhpcy5zZXQoXCJ0aW1lbGluZVwiLHIpKTt2YXIgbz10aGlzLmdldChcImFuaW1hdGlvbnNcIil8fFtdO3IudGltZXJ8fHIuaW5pdFRpbWVyKCk7dmFyIGEscyx1LGMsZixsPXRbMF0sZz10WzFdLHY9dFsyXSx5PXZvaWQgMD09PXY/XCJlYXNlTGluZWFyXCI6dixtPXRbM10sYj12b2lkIDA9PT1tP2kuQzptLHg9dFs0XSx3PXZvaWQgMD09PXg/MDp4O09iamVjdChpLnIpKGwpPyhhPWwsbD17fSk6T2JqZWN0KGkudikobCkmJmwub25GcmFtZSYmKGE9bC5vbkZyYW1lLHM9bC5yZXBlYXQpLE9iamVjdChpLnYpKGcpPyhnPShmPWcpLmR1cmF0aW9uLHk9Zi5lYXNpbmd8fFwiZWFzZUxpbmVhclwiLHc9Zi5kZWxheXx8MCxzPWYucmVwZWF0fHxzfHwhMSxiPWYuY2FsbGJhY2t8fGkuQyx1PWYucGF1c2VDYWxsYmFja3x8aS5DLGM9Zi5yZXN1bWVDYWxsYmFja3x8aS5DKTooT2JqZWN0KGkudCkoYikmJih3PWIsYj1udWxsKSxPYmplY3QoaS5yKSh5KT8oYj15LHk9XCJlYXNlTGluZWFyXCIpOnk9eXx8XCJlYXNlTGluZWFyXCIpO3ZhciBTPWQobCx0aGlzKSxFPXtmcm9tQXR0cnM6aChTLHRoaXMpLHRvQXR0cnM6UyxkdXJhdGlvbjpnLGVhc2luZzp5LHJlcGVhdDpzLGNhbGxiYWNrOmIscGF1c2VDYWxsYmFjazp1LHJlc3VtZUNhbGxiYWNrOmMsZGVsYXk6dyxzdGFydFRpbWU6ci5nZXRUaW1lKCksaWQ6T2JqZWN0KGkuSCkoKSxvbkZyYW1lOmEscGF0aEZvcm1hdHRlZDohMX07by5sZW5ndGg+MD9vPXAobyxFKTpyLmFkZEFuaW1hdG9yKHRoaXMpLG8ucHVzaChFKSx0aGlzLnNldChcImFuaW1hdGlvbnNcIixvKSx0aGlzLnNldChcIl9wYXVzZVwiLHtpc1BhdXNlZDohMX0pfX0sZS5wcm90b3R5cGUuc3RvcEFuaW1hdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt2b2lkIDA9PT10JiYodD0hMCk7dmFyIG49dGhpcy5nZXQoXCJhbmltYXRpb25zXCIpO09iamVjdChpLmYpKG4sKGZ1bmN0aW9uKG4pe3QmJihuLm9uRnJhbWU/ZS5hdHRyKG4ub25GcmFtZSgxKSk6ZS5hdHRyKG4udG9BdHRycykpLG4uY2FsbGJhY2smJm4uY2FsbGJhY2soKX0pKSx0aGlzLnNldChcImFuaW1hdGluZ1wiLCExKSx0aGlzLnNldChcImFuaW1hdGlvbnNcIixbXSl9LGUucHJvdG90eXBlLnBhdXNlQW5pbWF0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwidGltZWxpbmVcIiksZT10aGlzLmdldChcImFuaW1hdGlvbnNcIiksbj10LmdldFRpbWUoKTtyZXR1cm4gT2JqZWN0KGkuZikoZSwoZnVuY3Rpb24odCl7dC5fcGF1c2VkPSEwLHQuX3BhdXNlVGltZT1uLHQucGF1c2VDYWxsYmFjayYmdC5wYXVzZUNhbGxiYWNrKCl9KSksdGhpcy5zZXQoXCJfcGF1c2VcIix7aXNQYXVzZWQ6ITAscGF1c2VUaW1lOm59KSx0aGlzfSxlLnByb3RvdHlwZS5yZXN1bWVBbmltYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJ0aW1lbGluZVwiKS5nZXRUaW1lKCksZT10aGlzLmdldChcImFuaW1hdGlvbnNcIiksbj10aGlzLmdldChcIl9wYXVzZVwiKS5wYXVzZVRpbWU7cmV0dXJuIE9iamVjdChpLmYpKGUsKGZ1bmN0aW9uKGUpe2Uuc3RhcnRUaW1lPWUuc3RhcnRUaW1lKyh0LW4pLGUuX3BhdXNlZD0hMSxlLl9wYXVzZVRpbWU9bnVsbCxlLnJlc3VtZUNhbGxiYWNrJiZlLnJlc3VtZUNhbGxiYWNrKCl9KSksdGhpcy5zZXQoXCJfcGF1c2VcIix7aXNQYXVzZWQ6ITF9KSx0aGlzLnNldChcImFuaW1hdGlvbnNcIixlKSx0aGlzfSxlLnByb3RvdHlwZS5lbWl0RGVsZWdhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dGhpcyxvPWUucHJvcGFnYXRpb25QYXRoO3RoaXMuZ2V0RXZlbnRzKCk7XCJtb3VzZWVudGVyXCI9PT10P249ZS5mcm9tU2hhcGU6XCJtb3VzZWxlYXZlXCI9PT10JiYobj1lLnRvU2hhcGUpO2Zvcih2YXIgcz1mdW5jdGlvbih0KXt2YXIgcz1vW3RdLGM9cy5nZXQoXCJuYW1lXCIpO2lmKGMpe2lmKChzLmlzR3JvdXAoKXx8cy5pc0NhbnZhcyYmcy5pc0NhbnZhcygpKSYmbiYmT2JqZWN0KGEuZykocyxuKSlyZXR1cm5cImJyZWFrXCI7T2JqZWN0KGkubSkoYyk/T2JqZWN0KGkuZikoYywoZnVuY3Rpb24odCl7ci5lbWl0RGVsZWdhdGVFdmVudChzLHQsZSl9KSk6dS5lbWl0RGVsZWdhdGVFdmVudChzLGMsZSl9fSx1PXRoaXMsYz0wO2M8by5sZW5ndGg7YysrKXtpZihcImJyZWFrXCI9PT1zKGMpKWJyZWFrfX0sZS5wcm90b3R5cGUuZW1pdERlbGVnYXRlRXZlbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuZ2V0RXZlbnRzKCksaT1lK1wiOlwiK24udHlwZTsocltpXXx8cltcIipcIl0pJiYobi5uYW1lPWksbi5jdXJyZW50VGFyZ2V0PXQsbi5kZWxlZ2F0ZVRhcmdldD10aGlzLG4uZGVsZWdhdGVPYmplY3Q9dC5nZXQoXCJkZWxlZ2F0ZU9iamVjdFwiKSx0aGlzLmVtaXQoaSxuKSl9LGUucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PWUmJihlPTApO3ZhciBuPXRoaXMuZ2V0TWF0cml4KCkscj1jKG4sW1tcInRcIix0LGVdXSk7cmV0dXJuIHRoaXMuc2V0TWF0cml4KHIpLHRoaXN9LGUucHJvdG90eXBlLm1vdmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmF0dHIoXCJ4XCIpfHwwLHI9dGhpcy5hdHRyKFwieVwiKXx8MDtyZXR1cm4gdGhpcy50cmFuc2xhdGUodC1uLGUtciksdGhpc30sZS5wcm90b3R5cGUubW92ZVRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubW92ZSh0LGUpfSxlLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0TWF0cml4KCkscj1jKG4sW1tcInNcIix0LGV8fHRdXSk7cmV0dXJuIHRoaXMuc2V0TWF0cml4KHIpLHRoaXN9LGUucHJvdG90eXBlLnJvdGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldE1hdHJpeCgpLG49YyhlLFtbXCJyXCIsdF1dKTtyZXR1cm4gdGhpcy5zZXRNYXRyaXgobiksdGhpc30sZS5wcm90b3R5cGUucm90YXRlQXRTdGFydD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmF0dHIoKSxuPWUueCxyPWUueSxpPXRoaXMuZ2V0TWF0cml4KCksbz1jKGksW1tcInRcIiwtbiwtcl0sW1wiclwiLHRdLFtcInRcIixuLHJdXSk7cmV0dXJuIHRoaXMuc2V0TWF0cml4KG8pLHRoaXN9LGUucHJvdG90eXBlLnJvdGF0ZUF0UG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuZ2V0TWF0cml4KCksaT1jKHIsW1tcInRcIiwtdCwtZV0sW1wiclwiLG5dLFtcInRcIix0LGVdXSk7cmV0dXJuIHRoaXMuc2V0TWF0cml4KGkpLHRoaXN9LGV9KHUuYSk7ZS5hPWd9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24odCl7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSk7dmFyIHI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoO2U8bjtlKyspdCs9YXJndW1lbnRzW2VdLmxlbmd0aDt2YXIgcj1BcnJheSh0KSxpPTA7Zm9yKGU9MDtlPG47ZSsrKWZvcih2YXIgbz1hcmd1bWVudHNbZV0sYT0wLHM9by5sZW5ndGg7YTxzO2ErKyxpKyspcltpXT1vW2FdO3JldHVybiByfSxpPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLm5hbWU9dCx0aGlzLnZlcnNpb249ZSx0aGlzLm9zPW4sdGhpcy50eXBlPVwiYnJvd3NlclwifSxvPWZ1bmN0aW9uKGUpe3RoaXMudmVyc2lvbj1lLHRoaXMudHlwZT1cIm5vZGVcIix0aGlzLm5hbWU9XCJub2RlXCIsdGhpcy5vcz10LnBsYXRmb3JtfSxhPWZ1bmN0aW9uKHQsZSxuLHIpe3RoaXMubmFtZT10LHRoaXMudmVyc2lvbj1lLHRoaXMub3M9bix0aGlzLmJvdD1yLHRoaXMudHlwZT1cImJvdC1kZXZpY2VcIn0scz1mdW5jdGlvbigpe3RoaXMudHlwZT1cImJvdFwiLHRoaXMuYm90PSEwLHRoaXMubmFtZT1cImJvdFwiLHRoaXMudmVyc2lvbj1udWxsLHRoaXMub3M9bnVsbH0sdT1mdW5jdGlvbigpe3RoaXMudHlwZT1cInJlYWN0LW5hdGl2ZVwiLHRoaXMubmFtZT1cInJlYWN0LW5hdGl2ZVwiLHRoaXMudmVyc2lvbj1udWxsLHRoaXMub3M9bnVsbH0sYz0vKG51aGt8R29vZ2xlYm90fFlhbW15Ym90fE9wZW5ib3R8U2x1cnB8TVNOQm90fEFza1xcIEplZXZlc1xcL1Rlb21hfGlhX2FyY2hpdmVyKS8sZj1bW1wiYW9sXCIsL0FPTFNoaWVsZFxcLyhbMC05XFwuX10rKS9dLFtcImVkZ2VcIiwvRWRnZVxcLyhbMC05XFwuX10rKS9dLFtcImVkZ2UtaW9zXCIsL0VkZ2lPU1xcLyhbMC05XFwuX10rKS9dLFtcInlhbmRleGJyb3dzZXJcIiwvWWFCcm93c2VyXFwvKFswLTlcXC5fXSspL10sW1wia2FrYW90YWxrXCIsL0tBS0FPVEFMS1xccyhbMC05XFwuXSspL10sW1wic2Ftc3VuZ1wiLC9TYW1zdW5nQnJvd3NlclxcLyhbMC05XFwuXSspL10sW1wic2lsa1wiLC9cXGJTaWxrXFwvKFswLTkuXy1dKylcXGIvXSxbXCJtaXVpXCIsL01pdWlCcm93c2VyXFwvKFswLTlcXC5dKykkL10sW1wiYmVha2VyXCIsL0JlYWtlckJyb3dzZXJcXC8oWzAtOVxcLl0rKS9dLFtcImVkZ2UtY2hyb21pdW1cIiwvRWRnQT9cXC8oWzAtOVxcLl0rKS9dLFtcImNocm9taXVtLXdlYnZpZXdcIiwvKD8hQ2hyb20uKk9QUil3dlxcKS4qQ2hyb20oPzplfGl1bSlcXC8oWzAtOVxcLl0rKSg6P1xcc3wkKS9dLFtcImNocm9tZVwiLC8oPyFDaHJvbS4qT1BSKUNocm9tKD86ZXxpdW0pXFwvKFswLTlcXC5dKykoOj9cXHN8JCkvXSxbXCJwaGFudG9tanNcIiwvUGhhbnRvbUpTXFwvKFswLTlcXC5dKykoOj9cXHN8JCkvXSxbXCJjcmlvc1wiLC9DcmlPU1xcLyhbMC05XFwuXSspKDo/XFxzfCQpL10sW1wiZmlyZWZveFwiLC9GaXJlZm94XFwvKFswLTlcXC5dKykoPzpcXHN8JCkvXSxbXCJmeGlvc1wiLC9GeGlPU1xcLyhbMC05XFwuXSspL10sW1wib3BlcmEtbWluaVwiLC9PcGVyYSBNaW5pLipWZXJzaW9uXFwvKFswLTlcXC5dKykvXSxbXCJvcGVyYVwiLC9PcGVyYVxcLyhbMC05XFwuXSspKD86XFxzfCQpL10sW1wib3BlcmFcIiwvT1BSXFwvKFswLTlcXC5dKykoOj9cXHN8JCkvXSxbXCJpZVwiLC9UcmlkZW50XFwvN1xcLjAuKnJ2XFw6KFswLTlcXC5dKykuKlxcKS4qR2Vja28kL10sW1wiaWVcIiwvTVNJRVxccyhbMC05XFwuXSspOy4qVHJpZGVudFxcL1s0LTddLjAvXSxbXCJpZVwiLC9NU0lFXFxzKDdcXC4wKS9dLFtcImJiMTBcIiwvQkIxMDtcXHNUb3VjaC4qVmVyc2lvblxcLyhbMC05XFwuXSspL10sW1wiYW5kcm9pZFwiLC9BbmRyb2lkXFxzKFswLTlcXC5dKykvXSxbXCJpb3NcIiwvVmVyc2lvblxcLyhbMC05XFwuX10rKS4qTW9iaWxlLipTYWZhcmkuKi9dLFtcInNhZmFyaVwiLC9WZXJzaW9uXFwvKFswLTlcXC5fXSspLipTYWZhcmkvXSxbXCJmYWNlYm9va1wiLC9GQkFWXFwvKFswLTlcXC5dKykvXSxbXCJpbnN0YWdyYW1cIiwvSW5zdGFncmFtXFxzKFswLTlcXC5dKykvXSxbXCJpb3Mtd2Vidmlld1wiLC9BcHBsZVdlYktpdFxcLyhbMC05XFwuXSspLipNb2JpbGUvXSxbXCJpb3Mtd2Vidmlld1wiLC9BcHBsZVdlYktpdFxcLyhbMC05XFwuXSspLipHZWNrb1xcKSQvXSxbXCJzZWFyY2hib3RcIiwvYWxleGF8Ym90fGNyYXdsKGVyfGluZyl8ZmFjZWJvb2tleHRlcm5hbGhpdHxmZWVkYnVybmVyfGdvb2dsZSB3ZWIgcHJldmlld3xuYWdpb3N8cG9zdHJhbmt8cGluZ2RvbXxzbHVycHxzcGlkZXJ8eWFob28hfHlhbmRleC9dXSxsPVtbXCJpT1NcIiwvaVAoaG9uZXxvZHxhZCkvXSxbXCJBbmRyb2lkIE9TXCIsL0FuZHJvaWQvXSxbXCJCbGFja0JlcnJ5IE9TXCIsL0JsYWNrQmVycnl8QkIxMC9dLFtcIldpbmRvd3MgTW9iaWxlXCIsL0lFTW9iaWxlL10sW1wiQW1hem9uIE9TXCIsL0tpbmRsZS9dLFtcIldpbmRvd3MgMy4xMVwiLC9XaW4xNi9dLFtcIldpbmRvd3MgOTVcIiwvKFdpbmRvd3MgOTUpfChXaW45NSl8KFdpbmRvd3NfOTUpL10sW1wiV2luZG93cyA5OFwiLC8oV2luZG93cyA5OCl8KFdpbjk4KS9dLFtcIldpbmRvd3MgMjAwMFwiLC8oV2luZG93cyBOVCA1LjApfChXaW5kb3dzIDIwMDApL10sW1wiV2luZG93cyBYUFwiLC8oV2luZG93cyBOVCA1LjEpfChXaW5kb3dzIFhQKS9dLFtcIldpbmRvd3MgU2VydmVyIDIwMDNcIiwvKFdpbmRvd3MgTlQgNS4yKS9dLFtcIldpbmRvd3MgVmlzdGFcIiwvKFdpbmRvd3MgTlQgNi4wKS9dLFtcIldpbmRvd3MgN1wiLC8oV2luZG93cyBOVCA2LjEpL10sW1wiV2luZG93cyA4XCIsLyhXaW5kb3dzIE5UIDYuMikvXSxbXCJXaW5kb3dzIDguMVwiLC8oV2luZG93cyBOVCA2LjMpL10sW1wiV2luZG93cyAxMFwiLC8oV2luZG93cyBOVCAxMC4wKS9dLFtcIldpbmRvd3MgTUVcIiwvV2luZG93cyBNRS9dLFtcIk9wZW4gQlNEXCIsL09wZW5CU0QvXSxbXCJTdW4gT1NcIiwvU3VuT1MvXSxbXCJDaHJvbWUgT1NcIiwvQ3JPUy9dLFtcIkxpbnV4XCIsLyhMaW51eCl8KFgxMSkvXSxbXCJNYWMgT1NcIiwvKE1hY19Qb3dlclBDKXwoTWFjaW50b3NoKS9dLFtcIlFOWFwiLC9RTlgvXSxbXCJCZU9TXCIsL0JlT1MvXSxbXCJPUy8yXCIsL09TXFwvMi9dXTtmdW5jdGlvbiBoKGUpe3JldHVybiBlP3AoZSk6XCJ1bmRlZmluZWRcIj09dHlwZW9mIGRvY3VtZW50JiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiZcIlJlYWN0TmF0aXZlXCI9PT1uYXZpZ2F0b3IucHJvZHVjdD9uZXcgdTpcInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yP3AobmF2aWdhdG9yLnVzZXJBZ2VudCk6dm9pZCAwIT09dCYmdC52ZXJzaW9uP25ldyBvKHQudmVyc2lvbi5zbGljZSgxKSk6bnVsbH1mdW5jdGlvbiBkKHQpe3JldHVyblwiXCIhPT10JiZmLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXt2YXIgcj1uWzBdLGk9blsxXTtpZihlKXJldHVybiBlO3ZhciBvPWkuZXhlYyh0KTtyZXR1cm4hIW8mJltyLG9dfSksITEpfWZ1bmN0aW9uIHAodCl7dmFyIGU9ZCh0KTtpZighZSlyZXR1cm4gbnVsbDt2YXIgbj1lWzBdLG89ZVsxXTtpZihcInNlYXJjaGJvdFwiPT09bilyZXR1cm4gbmV3IHM7dmFyIHU9b1sxXSYmb1sxXS5zcGxpdCgvWy5fXS8pLnNsaWNlKDAsMyk7dT91Lmxlbmd0aDwzJiYodT1yKHUsZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQ7bisrKWUucHVzaChcIjBcIik7cmV0dXJuIGV9KDMtdS5sZW5ndGgpKSk6dT1bXTt2YXIgZj11LmpvaW4oXCIuXCIpLGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj1sLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj1sW2VdLGk9clswXTtpZihyWzFdLmV4ZWModCkpcmV0dXJuIGl9cmV0dXJuIG51bGx9KHQpLHA9Yy5leGVjKHQpO3JldHVybiBwJiZwWzFdP25ldyBhKG4sZixoLHBbMV0pOm5ldyBpKG4sZixoKX19KS5jYWxsKHRoaXMsbigxNzMpKX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYlwiLChmdW5jdGlvbigpe3JldHVybiBjfSkpLG4uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiBmfSkpO3ZhciByPW4oMTYpLGk9L15sXFxzKlxcKFxccyooW1xcZC5dKylcXHMqXFwpXFxzKiguKikvaSxvPS9eclxccypcXChcXHMqKFtcXGQuXSspXFxzKixcXHMqKFtcXGQuXSspXFxzKixcXHMqKFtcXGQuXSspXFxzKlxcKVxccyooLiopL2ksYT0vXnBcXHMqXFwoXFxzKihbYXh5bl0pXFxzKlxcKVxccyooLiopL2kscz0vW1xcZC5dKzooI1teXFxzXSt8W15cXCldK1xcKSkvZ2k7ZnVuY3Rpb24gdSh0LGUpe3ZhciBuPXQubWF0Y2gocyk7T2JqZWN0KHIuYykobiwoZnVuY3Rpb24odCl7dmFyIG49dC5zcGxpdChcIjpcIik7ZS5hZGRDb2xvclN0b3AoblswXSxuWzFdKX0pKX1mdW5jdGlvbiBjKHQsZSxuKXtpZihPYmplY3Qoci5rKShuKSl7aWYoXCIoXCI9PT1uWzFdfHxcIihcIj09PW5bMl0pe2lmKFwibFwiPT09blswXSlyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3ZhciByLG8sYT1pLmV4ZWMobikscz1wYXJzZUZsb2F0KGFbMV0pJTM2MCooTWF0aC5QSS8xODApLGM9YVsyXSxmPWUuZ2V0QkJveCgpO3M+PTAmJnM8LjUqTWF0aC5QST8ocj17eDpmLm1pblgseTpmLm1pbll9LG89e3g6Zi5tYXhYLHk6Zi5tYXhZfSk6LjUqTWF0aC5QSTw9cyYmczxNYXRoLlBJPyhyPXt4OmYubWF4WCx5OmYubWluWX0sbz17eDpmLm1pblgseTpmLm1heFl9KTpNYXRoLlBJPD1zJiZzPDEuNSpNYXRoLlBJPyhyPXt4OmYubWF4WCx5OmYubWF4WX0sbz17eDpmLm1pblgseTpmLm1pbll9KToocj17eDpmLm1pblgseTpmLm1heFl9LG89e3g6Zi5tYXhYLHk6Zi5taW5ZfSk7dmFyIGw9TWF0aC50YW4ocyksaD1sKmwsZD0oby54LXIueCtsKihvLnktci55KSkvKGgrMSkrci54LHA9bCooby54LXIueCtsKihvLnktci55KSkvKGgrMSkrci55LGc9dC5jcmVhdGVMaW5lYXJHcmFkaWVudChyLngsci55LGQscCk7cmV0dXJuIHUoYyxnKSxnfSh0LGUsbik7aWYoXCJyXCI9PT1uWzBdKXJldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIHI9by5leGVjKG4pLGk9cGFyc2VGbG9hdChyWzFdKSxhPXBhcnNlRmxvYXQoclsyXSksYz1wYXJzZUZsb2F0KHJbM10pLGY9cls0XTtpZigwPT09Yyl7dmFyIGw9Zi5tYXRjaChzKTtyZXR1cm4gbFtsLmxlbmd0aC0xXS5zcGxpdChcIjpcIilbMV19dmFyIGg9ZS5nZXRCQm94KCksZD1oLm1heFgtaC5taW5YLHA9aC5tYXhZLWgubWluWSxnPU1hdGguc3FydChkKmQrcCpwKS8yLHY9dC5jcmVhdGVSYWRpYWxHcmFkaWVudChoLm1pblgrZCppLGgubWluWStwKmEsMCxoLm1pblgrZC8yLGgubWluWStwLzIsYypnKTtyZXR1cm4gdShmLHYpLHZ9KHQsZSxuKTtpZihcInBcIj09PW5bMF0pcmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtpZihlLmdldChcInBhdHRlcm5Tb3VyY2VcIikmJmUuZ2V0KFwicGF0dGVyblNvdXJjZVwiKT09PW4pcmV0dXJuIGUuZ2V0KFwicGF0dGVyblwiKTt2YXIgcixpLG89YS5leGVjKG4pLHM9b1sxXSx1PW9bMl07ZnVuY3Rpb24gYygpe3I9dC5jcmVhdGVQYXR0ZXJuKGkscyksZS5zZXQoXCJwYXR0ZXJuXCIsciksZS5zZXQoXCJwYXR0ZXJuU291cmNlXCIsbil9c3dpdGNoKHMpe2Nhc2VcImFcIjpzPVwicmVwZWF0XCI7YnJlYWs7Y2FzZVwieFwiOnM9XCJyZXBlYXQteFwiO2JyZWFrO2Nhc2VcInlcIjpzPVwicmVwZWF0LXlcIjticmVhaztjYXNlXCJuXCI6cz1cIm5vLXJlcGVhdFwiO2JyZWFrO2RlZmF1bHQ6cz1cIm5vLXJlcGVhdFwifXJldHVybiBpPW5ldyBJbWFnZSx1Lm1hdGNoKC9eZGF0YTovaSl8fChpLmNyb3NzT3JpZ2luPVwiQW5vbnltb3VzXCIpLGkuc3JjPXUsaS5jb21wbGV0ZT9jKCk6KGkub25sb2FkPWMsaS5zcmM9aS5zcmMpLHJ9KHQsZSxuKX1yZXR1cm4gbn19ZnVuY3Rpb24gZih0KXt2YXIgZT0wLG49MCxpPTAsbz0wO3JldHVybiBPYmplY3Qoci5nKSh0KT8xPT09dC5sZW5ndGg/ZT1uPWk9bz10WzBdOjI9PT10Lmxlbmd0aD8oZT1pPXRbMF0sbj1vPXRbMV0pOjM9PT10Lmxlbmd0aD8oZT10WzBdLG49bz10WzFdLGk9dFsyXSk6KGU9dFswXSxuPXRbMV0saT10WzJdLG89dFszXSk6ZT1uPWk9bz10LFtlLG4saSxvXX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gb30pKSxuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKTt2YXIgcj1uKDYyKSxpPW4ubihyKTtuKDIpLG4oNDkpO2Z1bmN0aW9uIG8odCxlKXtyZXR1cm4gZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzRdLGVbNF09dFs1XSxlWzVdPXRbNl0sZVs2XT10WzhdLGVbN109dFs5XSxlWzhdPXRbMTBdLGV9ZnVuY3Rpb24gYSh0KXt2YXIgZT1pKCkodCwzKTtyZXR1cm4gZVswXSsyNTYqZVsxXSs2NTUzNiplWzJdLTF9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4ocj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9dmFyIGk9big0Mik7dC5leHBvcnRzPW87ZnVuY3Rpb24gbyh0KXt0aGlzLl9pc0RpcmVjdGVkPSFpLmhhcyh0LFwiZGlyZWN0ZWRcIil8fHQuZGlyZWN0ZWQsdGhpcy5faXNNdWx0aWdyYXBoPSEhaS5oYXModCxcIm11bHRpZ3JhcGhcIikmJnQubXVsdGlncmFwaCx0aGlzLl9pc0NvbXBvdW5kPSEhaS5oYXModCxcImNvbXBvdW5kXCIpJiZ0LmNvbXBvdW5kLHRoaXMuX2xhYmVsPXZvaWQgMCx0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm49aS5jb25zdGFudCh2b2lkIDApLHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbj1pLmNvbnN0YW50KHZvaWQgMCksdGhpcy5fbm9kZXM9e30sdGhpcy5faXNDb21wb3VuZCYmKHRoaXMuX3BhcmVudD17fSx0aGlzLl9jaGlsZHJlbj17fSx0aGlzLl9jaGlsZHJlbltcIlxcMFwiXT17fSksdGhpcy5faW49e30sdGhpcy5fcHJlZHM9e30sdGhpcy5fb3V0PXt9LHRoaXMuX3N1Y3M9e30sdGhpcy5fZWRnZU9ianM9e30sdGhpcy5fZWRnZUxhYmVscz17fX1mdW5jdGlvbiBhKHQsZSl7dFtlXT90W2VdKys6dFtlXT0xfWZ1bmN0aW9uIHModCxlKXstLXRbZV18fGRlbGV0ZSB0W2VdfWZ1bmN0aW9uIHUodCxlLG4scil7dmFyIG89XCJcIitlLGE9XCJcIituO2lmKCF0JiZvPmEpe3ZhciBzPW87bz1hLGE9c31yZXR1cm4gbytcIlx1MDAwMVwiK2ErXCJcdTAwMDFcIisoaS5pc1VuZGVmaW5lZChyKT9cIlxcMFwiOnIpfWZ1bmN0aW9uIGModCxlLG4scil7dmFyIGk9XCJcIitlLG89XCJcIituO2lmKCF0JiZpPm8pe3ZhciBhPWk7aT1vLG89YX12YXIgcz17djppLHc6b307cmV0dXJuIHImJihzLm5hbWU9ciksc31mdW5jdGlvbiBmKHQsZSl7cmV0dXJuIHUodCxlLnYsZS53LGUubmFtZSl9by5wcm90b3R5cGUuX25vZGVDb3VudD0wLG8ucHJvdG90eXBlLl9lZGdlQ291bnQ9MCxvLnByb3RvdHlwZS5pc0RpcmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWR9LG8ucHJvdG90eXBlLmlzTXVsdGlncmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc011bHRpZ3JhcGh9LG8ucHJvdG90eXBlLmlzQ29tcG91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb21wb3VuZH0sby5wcm90b3R5cGUuc2V0R3JhcGg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xhYmVsPXQsdGhpc30sby5wcm90b3R5cGUuZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9LG8ucHJvdG90eXBlLnNldERlZmF1bHROb2RlTGFiZWw9ZnVuY3Rpb24odCl7cmV0dXJuIGkuaXNGdW5jdGlvbih0KXx8KHQ9aS5jb25zdGFudCh0KSksdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuPXQsdGhpc30sby5wcm90b3R5cGUubm9kZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVDb3VudH0sby5wcm90b3R5cGUubm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gaS5rZXlzKHRoaXMuX25vZGVzKX0sby5wcm90b3R5cGUuc291cmNlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIGkuZmlsdGVyKHRoaXMubm9kZXMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGkuaXNFbXB0eSh0Ll9pbltlXSl9KSl9LG8ucHJvdG90eXBlLnNpbmtzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gaS5maWx0ZXIodGhpcy5ub2RlcygpLChmdW5jdGlvbihlKXtyZXR1cm4gaS5pc0VtcHR5KHQuX291dFtlXSl9KSl9LG8ucHJvdG90eXBlLnNldE5vZGVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLHI9dGhpcztyZXR1cm4gaS5lYWNoKHQsKGZ1bmN0aW9uKHQpe24ubGVuZ3RoPjE/ci5zZXROb2RlKHQsZSk6ci5zZXROb2RlKHQpfSkpLHRoaXN9LG8ucHJvdG90eXBlLnNldE5vZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5oYXModGhpcy5fbm9kZXMsdCk/KGFyZ3VtZW50cy5sZW5ndGg+MSYmKHRoaXMuX25vZGVzW3RdPWUpLHRoaXMpOih0aGlzLl9ub2Rlc1t0XT1hcmd1bWVudHMubGVuZ3RoPjE/ZTp0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odCksdGhpcy5faXNDb21wb3VuZCYmKHRoaXMuX3BhcmVudFt0XT1cIlxcMFwiLHRoaXMuX2NoaWxkcmVuW3RdPXt9LHRoaXMuX2NoaWxkcmVuW1wiXFwwXCJdW3RdPSEwKSx0aGlzLl9pblt0XT17fSx0aGlzLl9wcmVkc1t0XT17fSx0aGlzLl9vdXRbdF09e30sdGhpcy5fc3Vjc1t0XT17fSwrK3RoaXMuX25vZGVDb3VudCx0aGlzKX0sby5wcm90b3R5cGUubm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbm9kZXNbdF19LG8ucHJvdG90eXBlLmhhc05vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIGkuaGFzKHRoaXMuX25vZGVzLHQpfSxvLnByb3RvdHlwZS5yZW1vdmVOb2RlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoaS5oYXModGhpcy5fbm9kZXMsdCkpe3ZhciBuPWZ1bmN0aW9uKHQpe2UucmVtb3ZlRWRnZShlLl9lZGdlT2Jqc1t0XSl9O2RlbGV0ZSB0aGlzLl9ub2Rlc1t0XSx0aGlzLl9pc0NvbXBvdW5kJiYodGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3QodCksZGVsZXRlIHRoaXMuX3BhcmVudFt0XSxpLmVhY2godGhpcy5jaGlsZHJlbih0KSwoZnVuY3Rpb24odCl7ZS5zZXRQYXJlbnQodCl9KSksZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RdKSxpLmVhY2goaS5rZXlzKHRoaXMuX2luW3RdKSxuKSxkZWxldGUgdGhpcy5faW5bdF0sZGVsZXRlIHRoaXMuX3ByZWRzW3RdLGkuZWFjaChpLmtleXModGhpcy5fb3V0W3RdKSxuKSxkZWxldGUgdGhpcy5fb3V0W3RdLGRlbGV0ZSB0aGlzLl9zdWNzW3RdLC0tdGhpcy5fbm9kZUNvdW50fXJldHVybiB0aGlzfSxvLnByb3RvdHlwZS5zZXRQYXJlbnQ9ZnVuY3Rpb24odCxlKXtpZighdGhpcy5faXNDb21wb3VuZCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2V0IHBhcmVudCBpbiBhIG5vbi1jb21wb3VuZCBncmFwaFwiKTtpZihpLmlzVW5kZWZpbmVkKGUpKWU9XCJcXDBcIjtlbHNle2Zvcih2YXIgbj1lKz1cIlwiOyFpLmlzVW5kZWZpbmVkKG4pO249dGhpcy5wYXJlbnQobikpaWYobj09PXQpdGhyb3cgbmV3IEVycm9yKFwiU2V0dGluZyBcIitlK1wiIGFzIHBhcmVudCBvZiBcIit0K1wiIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlXCIpO3RoaXMuc2V0Tm9kZShlKX1yZXR1cm4gdGhpcy5zZXROb2RlKHQpLHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHQpLHRoaXMuX3BhcmVudFt0XT1lLHRoaXMuX2NoaWxkcmVuW2VdW3RdPSEwLHRoaXN9LG8ucHJvdG90eXBlLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdD1mdW5jdGlvbih0KXtkZWxldGUgdGhpcy5fY2hpbGRyZW5bdGhpcy5fcGFyZW50W3RdXVt0XX0sby5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2lzQ29tcG91bmQpe3ZhciBlPXRoaXMuX3BhcmVudFt0XTtpZihcIlxcMFwiIT09ZSlyZXR1cm4gZX19LG8ucHJvdG90eXBlLmNoaWxkcmVuPWZ1bmN0aW9uKHQpe2lmKGkuaXNVbmRlZmluZWQodCkmJih0PVwiXFwwXCIpLHRoaXMuX2lzQ29tcG91bmQpe3ZhciBlPXRoaXMuX2NoaWxkcmVuW3RdO2lmKGUpcmV0dXJuIGkua2V5cyhlKX1lbHNle2lmKFwiXFwwXCI9PT10KXJldHVybiB0aGlzLm5vZGVzKCk7aWYodGhpcy5oYXNOb2RlKHQpKXJldHVybltdfX0sby5wcm90b3R5cGUucHJlZGVjZXNzb3JzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3ByZWRzW3RdO2lmKGUpcmV0dXJuIGkua2V5cyhlKX0sby5wcm90b3R5cGUuc3VjY2Vzc29ycz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zdWNzW3RdO2lmKGUpcmV0dXJuIGkua2V5cyhlKX0sby5wcm90b3R5cGUubmVpZ2hib3JzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHJlZGVjZXNzb3JzKHQpO2lmKGUpcmV0dXJuIGkudW5pb24oZSx0aGlzLnN1Y2Nlc3NvcnModCkpfSxvLnByb3RvdHlwZS5pc0xlYWY9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT0odGhpcy5pc0RpcmVjdGVkKCk/dGhpcy5zdWNjZXNzb3JzKHQpOnRoaXMubmVpZ2hib3JzKHQpKS5sZW5ndGh9LG8ucHJvdG90eXBlLmZpbHRlck5vZGVzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtkaXJlY3RlZDp0aGlzLl9pc0RpcmVjdGVkLG11bHRpZ3JhcGg6dGhpcy5faXNNdWx0aWdyYXBoLGNvbXBvdW5kOnRoaXMuX2lzQ29tcG91bmR9KTtlLnNldEdyYXBoKHRoaXMuZ3JhcGgoKSk7dmFyIG49dGhpcztpLmVhY2godGhpcy5fbm9kZXMsKGZ1bmN0aW9uKG4scil7dChyKSYmZS5zZXROb2RlKHIsbil9KSksaS5lYWNoKHRoaXMuX2VkZ2VPYmpzLChmdW5jdGlvbih0KXtlLmhhc05vZGUodC52KSYmZS5oYXNOb2RlKHQudykmJmUuc2V0RWRnZSh0LG4uZWRnZSh0KSl9KSk7dmFyIHI9e307cmV0dXJuIHRoaXMuX2lzQ29tcG91bmQmJmkuZWFjaChlLm5vZGVzKCksKGZ1bmN0aW9uKHQpe2Uuc2V0UGFyZW50KHQsZnVuY3Rpb24gdChpKXt2YXIgbz1uLnBhcmVudChpKTtyZXR1cm4gdm9pZCAwPT09b3x8ZS5oYXNOb2RlKG8pPyhyW2ldPW8sbyk6byBpbiByP3Jbb106dChvKX0odCkpfSkpLGV9LG8ucHJvdG90eXBlLnNldERlZmF1bHRFZGdlTGFiZWw9ZnVuY3Rpb24odCl7cmV0dXJuIGkuaXNGdW5jdGlvbih0KXx8KHQ9aS5jb25zdGFudCh0KSksdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPXQsdGhpc30sby5wcm90b3R5cGUuZWRnZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VDb3VudH0sby5wcm90b3R5cGUuZWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gaS52YWx1ZXModGhpcy5fZWRnZU9ianMpfSxvLnByb3RvdHlwZS5zZXRQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cztyZXR1cm4gaS5yZWR1Y2UodCwoZnVuY3Rpb24odCxpKXtyZXR1cm4gci5sZW5ndGg+MT9uLnNldEVkZ2UodCxpLGUpOm4uc2V0RWRnZSh0LGkpLGl9KSksdGhpc30sby5wcm90b3R5cGUuc2V0RWRnZT1mdW5jdGlvbigpe3ZhciB0LGUsbixvLHM9ITEsZj1hcmd1bWVudHNbMF07XCJvYmplY3RcIj09PXIoZikmJm51bGwhPT1mJiZcInZcImluIGY/KHQ9Zi52LGU9Zi53LG49Zi5uYW1lLDI9PT1hcmd1bWVudHMubGVuZ3RoJiYobz1hcmd1bWVudHNbMV0scz0hMCkpOih0PWYsZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbM10sYXJndW1lbnRzLmxlbmd0aD4yJiYobz1hcmd1bWVudHNbMl0scz0hMCkpLHQ9XCJcIit0LGU9XCJcIitlLGkuaXNVbmRlZmluZWQobil8fChuPVwiXCIrbik7dmFyIGw9dSh0aGlzLl9pc0RpcmVjdGVkLHQsZSxuKTtpZihpLmhhcyh0aGlzLl9lZGdlTGFiZWxzLGwpKXJldHVybiBzJiYodGhpcy5fZWRnZUxhYmVsc1tsXT1vKSx0aGlzO2lmKCFpLmlzVW5kZWZpbmVkKG4pJiYhdGhpcy5faXNNdWx0aWdyYXBoKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgYSBuYW1lZCBlZGdlIHdoZW4gaXNNdWx0aWdyYXBoID0gZmFsc2VcIik7dGhpcy5zZXROb2RlKHQpLHRoaXMuc2V0Tm9kZShlKSx0aGlzLl9lZGdlTGFiZWxzW2xdPXM/bzp0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4odCxlLG4pO3ZhciBoPWModGhpcy5faXNEaXJlY3RlZCx0LGUsbik7cmV0dXJuIHQ9aC52LGU9aC53LE9iamVjdC5mcmVlemUoaCksdGhpcy5fZWRnZU9ianNbbF09aCxhKHRoaXMuX3ByZWRzW2VdLHQpLGEodGhpcy5fc3Vjc1t0XSxlKSx0aGlzLl9pbltlXVtsXT1oLHRoaXMuX291dFt0XVtsXT1oLHRoaXMuX2VkZ2VDb3VudCsrLHRoaXN9LG8ucHJvdG90eXBlLmVkZ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPTE9PT1hcmd1bWVudHMubGVuZ3RoP2YodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOnUodGhpcy5faXNEaXJlY3RlZCx0LGUsbik7cmV0dXJuIHRoaXMuX2VkZ2VMYWJlbHNbcl19LG8ucHJvdG90eXBlLmhhc0VkZ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPTE9PT1hcmd1bWVudHMubGVuZ3RoP2YodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOnUodGhpcy5faXNEaXJlY3RlZCx0LGUsbik7cmV0dXJuIGkuaGFzKHRoaXMuX2VkZ2VMYWJlbHMscil9LG8ucHJvdG90eXBlLnJlbW92ZUVkZ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPTE9PT1hcmd1bWVudHMubGVuZ3RoP2YodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOnUodGhpcy5faXNEaXJlY3RlZCx0LGUsbiksaT10aGlzLl9lZGdlT2Jqc1tyXTtyZXR1cm4gaSYmKHQ9aS52LGU9aS53LGRlbGV0ZSB0aGlzLl9lZGdlTGFiZWxzW3JdLGRlbGV0ZSB0aGlzLl9lZGdlT2Jqc1tyXSxzKHRoaXMuX3ByZWRzW2VdLHQpLHModGhpcy5fc3Vjc1t0XSxlKSxkZWxldGUgdGhpcy5faW5bZV1bcl0sZGVsZXRlIHRoaXMuX291dFt0XVtyXSx0aGlzLl9lZGdlQ291bnQtLSksdGhpc30sby5wcm90b3R5cGUuaW5FZGdlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2luW3RdO2lmKG4pe3ZhciByPWkudmFsdWVzKG4pO3JldHVybiBlP2kuZmlsdGVyKHIsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnY9PT1lfSkpOnJ9fSxvLnByb3RvdHlwZS5vdXRFZGdlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX291dFt0XTtpZihuKXt2YXIgcj1pLnZhbHVlcyhuKTtyZXR1cm4gZT9pLmZpbHRlcihyLChmdW5jdGlvbih0KXtyZXR1cm4gdC53PT09ZX0pKTpyfX0sby5wcm90b3R5cGUubm9kZUVkZ2VzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5pbkVkZ2VzKHQsZSk7aWYobilyZXR1cm4gbi5jb25jYXQodGhpcy5vdXRFZGdlcyh0LGUpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KShuKDQ1KSxcIk1hcFwiKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzA3KSxpPW4oMzE0KSxvPW4oMzE2KSxhPW4oMzE3KSxzPW4oMzE4KTtmdW5jdGlvbiB1KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fXUucHJvdG90eXBlLmNsZWFyPXIsdS5wcm90b3R5cGUuZGVsZXRlPWksdS5wcm90b3R5cGUuZ2V0PW8sdS5wcm90b3R5cGUuaGFzPWEsdS5wcm90b3R5cGUuc2V0PXMsdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyJiYhMSE9PWUodFtuXSxuLHQpOyk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD05MDA3MTk5MjU0NzQwOTkxfX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbih0KXtmdW5jdGlvbiByKHQpe3JldHVybihyPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX12YXIgaT1uKDE3OCksbz1cIm9iamVjdFwiPT1yKGUpJiZlJiYhZS5ub2RlVHlwZSYmZSxhPW8mJlwib2JqZWN0XCI9PXIodCkmJnQmJiF0Lm5vZGVUeXBlJiZ0LHM9YSYmYS5leHBvcnRzPT09byYmaS5wcm9jZXNzLHU9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9YSYmYS5yZXF1aXJlJiZhLnJlcXVpcmUoXCJ1dGlsXCIpLnR5cGVzO3JldHVybiB0fHxzJiZzLmJpbmRpbmcmJnMuYmluZGluZyhcInV0aWxcIil9Y2F0Y2godCl7fX0oKTt0LmV4cG9ydHM9dX0pLmNhbGwodGhpcyxuKDcyKSh0KSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwNiksaT1uKDMyNCksbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSlyZXR1cm4gaSh0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gT2JqZWN0KHQpKW8uY2FsbCh0LG4pJiZcImNvbnN0cnVjdG9yXCIhPW4mJmUucHVzaChuKTtyZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4NiksaT1uKDE4Nyksbz1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxzPWE/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLHIoYSh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIG8uY2FsbCh0LGUpfSkpKX06aTt0LmV4cG9ydHM9c30sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE5Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyByKGUpLnNldChuZXcgcih0KSksZX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1NCksaT1uKDYwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmcih0LGUsaSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNDMpKCk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtuWysrZV09dH0pKSxufX0sZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIHIodCl7cmV0dXJuKHI9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfXZhciBpPW4oMjkpLG89big3NyksYT0vXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLHM9L15cXHcqJC87dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoaSh0KSlyZXR1cm4hMTt2YXIgbj1yKHQpO3JldHVybiEoXCJudW1iZXJcIiE9biYmXCJzeW1ib2xcIiE9biYmXCJib29sZWFuXCIhPW4mJm51bGwhPXQmJiFvKHQpKXx8KHMudGVzdCh0KXx8IWEudGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUwKSxpPW4oMzc3KTt0LmV4cG9ydHM9ZnVuY3Rpb24gdChlLG4sbyxhLHMpe3ZhciB1PS0xLGM9ZS5sZW5ndGg7Zm9yKG98fChvPWkpLHN8fChzPVtdKTsrK3U8Yzspe3ZhciBmPWVbdV07bj4wJiZvKGYpP24+MT90KGYsbi0xLG8sYSxzKTpyKHMsZik6YXx8KHNbcy5sZW5ndGhdPWYpfXJldHVybiBzfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNzcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGg7KytpPG87KXt2YXIgYT10W2ldLHM9ZShhKTtpZihudWxsIT1zJiYodm9pZCAwPT09dT9zPT1zJiYhcihzKTpuKHMsdSkpKXZhciB1PXMsYz1hfXJldHVybiBjfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuQmluZGluZ09uU3ludGF4PXZvaWQgMDt2YXIgcj1uKDE2MCksaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fYmluZGluZz10fXJldHVybiB0LnByb3RvdHlwZS5vbkFjdGl2YXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmcub25BY3RpdmF0aW9uPXQsbmV3IHIuQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyl9LHR9KCk7ZS5CaW5kaW5nT25TeW50YXg9aX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuQmluZGluZ1doZW5TeW50YXg9dm9pZCAwO3ZhciByPW4oMTU5KSxpPW4oMjQwKSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9iaW5kaW5nPXR9cmV0dXJuIHQucHJvdG90eXBlLndoZW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludD10LG5ldyByLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKX0sdC5wcm90b3R5cGUud2hlblRhcmdldE5hbWVkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQ9aS5uYW1lZENvbnN0cmFpbnQodCksbmV3IHIuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS53aGVuVGFyZ2V0SXNEZWZhdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQudGFyZ2V0JiYhdC50YXJnZXQuaXNOYW1lZCgpJiYhdC50YXJnZXQuaXNUYWdnZWQoKX0sbmV3IHIuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS53aGVuVGFyZ2V0VGFnZ2VkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludD1pLnRhZ2dlZENvbnN0cmFpbnQodCkoZSksbmV3IHIuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS53aGVuSW5qZWN0ZWRJbnRvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGkudHlwZUNvbnN0cmFpbnQodCkoZS5wYXJlbnRSZXF1ZXN0KX0sbmV3IHIuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS53aGVuUGFyZW50TmFtZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludD1mdW5jdGlvbihlKXtyZXR1cm4gaS5uYW1lZENvbnN0cmFpbnQodCkoZS5wYXJlbnRSZXF1ZXN0KX0sbmV3IHIuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS53aGVuUGFyZW50VGFnZ2VkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludD1mdW5jdGlvbihuKXtyZXR1cm4gaS50YWdnZWRDb25zdHJhaW50KHQpKGUpKG4ucGFyZW50UmVxdWVzdCl9LG5ldyByLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKX0sdC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9ySXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludD1mdW5jdGlvbihlKXtyZXR1cm4gaS50cmF2ZXJzZUFuY2Vyc3RvcnMoZSxpLnR5cGVDb25zdHJhaW50KHQpKX0sbmV3IHIuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS53aGVuTm9BbmNlc3RvcklzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIWkudHJhdmVyc2VBbmNlcnN0b3JzKGUsaS50eXBlQ29uc3RyYWludCh0KSl9LG5ldyByLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKX0sdC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yTmFtZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludD1mdW5jdGlvbihlKXtyZXR1cm4gaS50cmF2ZXJzZUFuY2Vyc3RvcnMoZSxpLm5hbWVkQ29uc3RyYWludCh0KSl9LG5ldyByLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKX0sdC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JOYW1lZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZy5jb25zdHJhaW50PWZ1bmN0aW9uKGUpe3JldHVybiFpLnRyYXZlcnNlQW5jZXJzdG9ycyhlLGkubmFtZWRDb25zdHJhaW50KHQpKX0sbmV3IHIuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS53aGVuQW55QW5jZXN0b3JUYWdnZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fYmluZGluZy5jb25zdHJhaW50PWZ1bmN0aW9uKG4pe3JldHVybiBpLnRyYXZlcnNlQW5jZXJzdG9ycyhuLGkudGFnZ2VkQ29uc3RyYWludCh0KShlKSl9LG5ldyByLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKX0sdC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JUYWdnZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fYmluZGluZy5jb25zdHJhaW50PWZ1bmN0aW9uKG4pe3JldHVybiFpLnRyYXZlcnNlQW5jZXJzdG9ycyhuLGkudGFnZ2VkQ29uc3RyYWludCh0KShlKSl9LG5ldyByLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKX0sdC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yTWF0Y2hlcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZy5jb25zdHJhaW50PWZ1bmN0aW9uKGUpe3JldHVybiBpLnRyYXZlcnNlQW5jZXJzdG9ycyhlLHQpfSxuZXcgci5CaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyl9LHQucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9yTWF0Y2hlcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZy5jb25zdHJhaW50PWZ1bmN0aW9uKGUpe3JldHVybiFpLnRyYXZlcnNlQW5jZXJzdG9ycyhlLHQpfSxuZXcgci5CaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyl9LHR9KCk7ZS5CaW5kaW5nV2hlblN5bnRheD1vfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbMF09ZVswXS1uWzBdLHRbMV09ZVsxXS1uWzFdLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1OSksaT1uKDEwNyksbz1uKDQ2KSxhPUZ1bmN0aW9uLnByb3RvdHlwZSxzPU9iamVjdC5wcm90b3R5cGUsdT1hLnRvU3RyaW5nLGM9cy5oYXNPd25Qcm9wZXJ0eSxmPXUuY2FsbChPYmplY3QpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighbyh0KXx8XCJbb2JqZWN0IE9iamVjdF1cIiE9cih0KSlyZXR1cm4hMTt2YXIgZT1pKHQpO2lmKG51bGw9PT1lKXJldHVybiEwO3ZhciBuPWMuY2FsbChlLFwiY29uc3RydWN0b3JcIikmJmUuY29uc3RydWN0b3I7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgbiYmbiBpbnN0YW5jZW9mIG4mJnUuY2FsbChuKT09Zn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9e2dyYXBobGliOm4oNDQpLGxheW91dDpuKDQwMCksZGVidWc6big0NjApLHV0aWw6e3RpbWU6bigzNykudGltZSxub3RpbWU6bigzNykubm90aW1lfSx2ZXJzaW9uOm4oNDYxKX19LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24odCl7dmFyIG4scixpLG87ZnVuY3Rpb24gYSh0KXtyZXR1cm4oYT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGYmJnNlbGYsbz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT17fTtmdW5jdGlvbiBuKHIpe2lmKGVbcl0pcmV0dXJuIGVbcl0uZXhwb3J0czt2YXIgaT1lW3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtyXS5jYWxsKGkuZXhwb3J0cyxpLGkuZXhwb3J0cyxuKSxpLmw9ITAsaS5leHBvcnRzfXJldHVybiBuLm09dCxuLmM9ZSxuLmQ9ZnVuY3Rpb24odCxlLHIpe24ubyh0LGUpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9MzEpfShbZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oNCk7ZS5hPWZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXkodCk6T2JqZWN0KHIuYSkodCxcIkFycmF5XCIpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIHQmJmlzRmluaXRlKHQubGVuZ3RoKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDApLGk9bigxMyk7ZS5hPWZ1bmN0aW9uKHQsZSl7aWYodClpZihPYmplY3Qoci5hKSh0KSlmb3IodmFyIG49MCxvPXQubGVuZ3RoO248byYmITEhPT1lKHRbbl0sbik7bisrKTtlbHNlIGlmKE9iamVjdChpLmEpKHQpKWZvcih2YXIgYSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoYSkmJiExPT09ZSh0W2FdLGEpKWJyZWFrfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oNCk7ZS5hPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qoci5hKSh0LFwiRnVuY3Rpb25cIil9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9e30udG9TdHJpbmc7ZS5hPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuY2FsbCh0KT09PVwiW29iamVjdCBcIitlK1wiXVwifX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oNCk7ZS5hPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qoci5hKSh0LFwiTnVtYmVyXCIpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMzKS5taXg7dC5leHBvcnRzPXthc3NpZ246cn19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDQpO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHIuYSkodCxcIlN0cmluZ1wiKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDE1KSxpPW4oNCk7ZS5hPWZ1bmN0aW9uKHQpe2lmKCFPYmplY3Qoci5hKSh0KXx8IU9iamVjdChpLmEpKHQsXCJPYmplY3RcIikpcmV0dXJuITE7aWYobnVsbD09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0KSlyZXR1cm4hMDtmb3IodmFyIGU9dDtudWxsIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpOyllPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpPT09ZX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDYpO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHIuYSkodCk/XCJcIjp0LnRvU3RyaW5nKCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOCksaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2b2lkIDA9PT1lJiYoZT17fSksdGhpcy5vcHRpb25zPWUsdGhpcy5yb290Tm9kZT1yKHQsZSl9cmV0dXJuIHQucHJvdG90eXBlLmV4ZWN1dGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJwbGVhc2Ugb3ZlcnJpZGUgdGhpcyBtZXRob2RcIil9LHR9KCk7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDEpO2UuYT1mdW5jdGlvbih0LGUpe3JldHVybiEhT2JqZWN0KHIuYSkodCkmJnQuaW5kZXhPZihlKT4tMX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtlLmE9ZnVuY3Rpb24odCl7dmFyIGU9YSh0KTtyZXR1cm4gbnVsbCE9PXQmJlwib2JqZWN0XCI9PT1lfHxcImZ1bmN0aW9uXCI9PT1lfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMiksaT1uKDEpO2UuYT1mdW5jdGlvbih0LGUpe2lmKCFPYmplY3QoaS5hKSh0KSlyZXR1cm4gdDt2YXIgbj1bXTtyZXR1cm4gT2JqZWN0KHIuYSkodCwoZnVuY3Rpb24odCxyKXtlKHQscikmJm4ucHVzaCh0KX0pKSxufX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1mdW5jdGlvbih0KXtyZXR1cm5cIm9iamVjdFwiPT09YSh0KSYmbnVsbCE9PXR9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJlwiY29uc3RydWN0b3JcIiE9PW4mJnZvaWQgMCE9PWVbbl0mJih0W25dPWVbbl0pfWUuYT1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gZSYmcih0LGUpLG4mJnIodCxuKSxpJiZyKHQsaSksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMwKSxpPVtcIkxSXCIsXCJSTFwiLFwiVEJcIixcIkJUXCIsXCJIXCIsXCJWXCJdLG89W1wiTFJcIixcIlJMXCIsXCJIXCJdLGE9aVswXTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBzPWUuZGlyZWN0aW9ufHxhO2lmKGUuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKHQpe3JldHVybiBvLmluZGV4T2YodCk+LTF9KHMpLHMmJi0xPT09aS5pbmRleE9mKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGRpcmVjdGlvbjogXCIrcyk7aWYocz09PWlbMF0pbih0LGUpO2Vsc2UgaWYocz09PWlbMV0pbih0LGUpLHQucmlnaHQybGVmdCgpO2Vsc2UgaWYocz09PWlbMl0pbih0LGUpO2Vsc2UgaWYocz09PWlbM10pbih0LGUpLHQuYm90dG9tMnRvcCgpO2Vsc2UgaWYocz09PWlbNF18fHM9PT1pWzVdKXt2YXIgdT1yKHQsZSksYz11LmxlZnQsZj11LnJpZ2h0O24oYyxlKSxuKGYsZSksZS5pc0hvcml6b250YWw/Yy5yaWdodDJsZWZ0KCk6Yy5ib3R0b20ydG9wKCksZi50cmFuc2xhdGUoYy54LWYueCxjLnktZi55KSx0Lng9Yy54LHQueT1mLnk7dmFyIGw9dC5nZXRCb3VuZGluZ0JveCgpO2UuaXNIb3Jpem9udGFsP2wudG9wPDAmJnQudHJhbnNsYXRlKDAsLWwudG9wKTpsLmxlZnQ8MCYmdC50cmFuc2xhdGUoLWwubGVmdCwwKX12YXIgaD1lLmZpeGVkUm9vdDtyZXR1cm4gdm9pZCAwPT09aCYmKGg9ITApLGgmJnQudHJhbnNsYXRlKC0odC54K3Qud2lkdGgvMit0LmhnYXApLC0odC55K3QuaGVpZ2h0LzIrdC52Z2FwKSksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDcpLGk9e2dldElkOmZ1bmN0aW9uKHQpe3JldHVybiB0LmlkfHx0Lm5hbWV9LGdldEhHYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaGdhcHx8MTh9LGdldFZHYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQudmdhcHx8MTh9LGdldENoaWxkcmVuOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNoaWxkcmVufSxnZXRIZWlnaHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaGVpZ2h0fHwzNn0sZ2V0V2lkdGg6ZnVuY3Rpb24odCl7dmFyIGU9dC5sYWJlbHx8XCIgXCI7cmV0dXJuIHQud2lkdGh8fDE4KmUuc3BsaXQoXCJcIikubGVuZ3RofX07ZnVuY3Rpb24gbyh0LGUpe3ZhciBuPXRoaXM7aWYobi52Z2FwPW4uaGdhcD0wLHQgaW5zdGFuY2VvZiBvKXJldHVybiB0O24uZGF0YT10O3ZhciByPWUuZ2V0SEdhcCh0KSxpPWUuZ2V0VkdhcCh0KTtyZXR1cm4gbi53aWR0aD1lLmdldFdpZHRoKHQpLG4uaGVpZ2h0PWUuZ2V0SGVpZ2h0KHQpLG4uaWQ9ZS5nZXRJZCh0KSxuLng9bi55PTAsbi5kZXB0aD0wLG4uY2hpbGRyZW58fChuLmNoaWxkcmVuPVtdKSxuLmFkZEdhcChyLGkpLG59ci5hc3NpZ24oby5wcm90b3R5cGUse2lzUm9vdDpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5kZXB0aH0saXNMZWFmOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmNoaWxkcmVuLmxlbmd0aH0sYWRkR2FwOmZ1bmN0aW9uKHQsZSl7dGhpcy5oZ2FwKz10LHRoaXMudmdhcCs9ZSx0aGlzLndpZHRoKz0yKnQsdGhpcy5oZWlnaHQrPTIqZX0sZWFjaE5vZGU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49W3RoaXNdO2U9bi5zaGlmdCgpOyl0KGUpLG49ZS5jaGlsZHJlbi5jb25jYXQobil9LERGVHJhdmVyc2U6ZnVuY3Rpb24odCl7dGhpcy5lYWNoTm9kZSh0KX0sQkZUcmF2ZXJzZTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbj1bdGhpc107ZT1uLnNoaWZ0KCk7KXQoZSksbj1uLmNvbmNhdChlLmNoaWxkcmVuKX0sZ2V0Qm91bmRpbmdCb3g6ZnVuY3Rpb24oKXt2YXIgdD17bGVmdDpOdW1iZXIuTUFYX1ZBTFVFLHRvcDpOdW1iZXIuTUFYX1ZBTFVFLHdpZHRoOjAsaGVpZ2h0OjB9O3JldHVybiB0aGlzLmVhY2hOb2RlKChmdW5jdGlvbihlKXt0LmxlZnQ9TWF0aC5taW4odC5sZWZ0LGUueCksdC50b3A9TWF0aC5taW4odC50b3AsZS55KSx0LndpZHRoPU1hdGgubWF4KHQud2lkdGgsZS54K2Uud2lkdGgpLHQuaGVpZ2h0PU1hdGgubWF4KHQuaGVpZ2h0LGUueStlLmhlaWdodCl9KSksdH0sdHJhbnNsYXRlOmZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09ZSYmKGU9MCksdGhpcy5lYWNoTm9kZSgoZnVuY3Rpb24obil7bi54Kz10LG4ueSs9ZX0pKX0scmlnaHQybGVmdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Qm91bmRpbmdCb3goKTt0aGlzLmVhY2hOb2RlKChmdW5jdGlvbihlKXtlLng9ZS54LTIqKGUueC10LmxlZnQpLWUud2lkdGh9KSksdGhpcy50cmFuc2xhdGUodC53aWR0aCwwKX0sYm90dG9tMnRvcDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Qm91bmRpbmdCb3goKTt0aGlzLmVhY2hOb2RlKChmdW5jdGlvbihlKXtlLnk9ZS55LTIqKGUueS10LnRvcCktZS5oZWlnaHR9KSksdGhpcy50cmFuc2xhdGUoMCx0LmhlaWdodCl9fSksdC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIGEscz1uZXcgbyh0LGU9ci5hc3NpZ24oe30saSxlKSksdT1bc107aWYoIW4mJiF0LmNvbGxhcHNlZClmb3IoO2E9dS5zaGlmdCgpOylpZighYS5kYXRhLmNvbGxhcHNlZCl7dmFyIGM9ZS5nZXRDaGlsZHJlbihhLmRhdGEpLGY9Yz9jLmxlbmd0aDowO2lmKGEuY2hpbGRyZW49bmV3IEFycmF5KGYpLGMmJmYpZm9yKHZhciBsPTA7bDxmO2wrKyl7dmFyIGg9bmV3IG8oY1tsXSxlKTthLmNoaWxkcmVuW2xdPWgsdS5wdXNoKGgpLGgucGFyZW50PWEsaC5kZXB0aD1hLmRlcHRoKzF9fXJldHVybiBzfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oNiksaT1uKDIwKTtlLmE9ZnVuY3Rpb24odCxlKXt2YXIgbj1PYmplY3QoaS5hKShlKSxvPW4ubGVuZ3RoO2lmKE9iamVjdChyLmEpKHQpKXJldHVybiFvO2Zvcih2YXIgYT0wO2E8bzthKz0xKXt2YXIgcz1uW2FdO2lmKGVbc10hPT10W3NdfHwhKHMgaW4gdCkpcmV0dXJuITF9cmV0dXJuITB9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyKSxpPW4oMyksbz1PYmplY3Qua2V5cz9mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmtleXModCl9OmZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiBPYmplY3Qoci5hKSh0LChmdW5jdGlvbihuLHIpe09iamVjdChpLmEpKHQpJiZcInByb3RvdHlwZVwiPT09cnx8ZS5wdXNoKHIpfSkpLGV9O2UuYT1vfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigxKSxpPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7ZS5hPWZ1bmN0aW9uKHQsZSl7aWYoIU9iamVjdChyLmEpKHQpKXJldHVybltdO2Zvcih2YXIgbj10P2UubGVuZ3RoOjAsbz1uLTE7bi0tOyl7dmFyIGE9dm9pZCAwLHM9ZVtuXTtuIT09byYmcz09PWF8fChhPXMsaS5jYWxsKHQscywxKSl9cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigxMiksaT1uKDIpO2UuYT1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gT2JqZWN0KGkuYSkodCwoZnVuY3Rpb24odCl7T2JqZWN0KHIuYSkoZSx0KXx8ZS5wdXNoKHQpfSkpLGV9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigwKSxpPW4oMyksbz1uKDI0KTtlLmE9ZnVuY3Rpb24odCxlKXtpZighZSlyZXR1cm57MDp0fTtpZighT2JqZWN0KGkuYSkoZSkpe3ZhciBuPU9iamVjdChyLmEpKGUpP2U6ZS5yZXBsYWNlKC9cXHMrL2csXCJcIikuc3BsaXQoXCIqXCIpO2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVwiX1wiLHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspZSs9dFtuW3JdXSYmdFtuW3JdXS50b1N0cmluZygpO3JldHVybiBlfX1yZXR1cm4gT2JqZWN0KG8uYSkodCxlKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDIpLGk9bigwKSxvPW4oMyksYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2UuYT1mdW5jdGlvbih0LGUpe2lmKCFlfHwhT2JqZWN0KGkuYSkodCkpcmV0dXJue307dmFyIG4scz17fSx1PU9iamVjdChvLmEpKGUpP2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRbZV19O3JldHVybiBPYmplY3Qoci5hKSh0LChmdW5jdGlvbih0KXtuPXUodCksYS5jYWxsKHMsbik/c1tuXS5wdXNoKHQpOnNbbl09W3RdfSkpLHN9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZS5hPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoZSl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyKSxpPW4oMyksbz1PYmplY3QudmFsdWVzP2Z1bmN0aW9uKHQpe3JldHVybiBPYmplY3QudmFsdWVzKHQpfTpmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gT2JqZWN0KHIuYSkodCwoZnVuY3Rpb24obixyKXtPYmplY3QoaS5hKSh0KSYmXCJwcm90b3R5cGVcIj09PXJ8fGUucHVzaChuKX0pKSxlfTtlLmE9b30sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPXt9LnRvU3RyaW5nO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gci5jYWxsKHQpLnJlcGxhY2UoL15cXFtvYmplY3QgLyxcIlwiKS5yZXBsYWNlKC9dJC8sXCJcIil9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9T2JqZWN0LnByb3RvdHlwZTtlLmE9ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4gdD09PShcImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8cil9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigxNSksaT1uKDEpLG89big4KTtlLmE9ZnVuY3Rpb24gdChlLG4pe2lmKGU9PT1uKXJldHVybiEwO2lmKCFlfHwhbilyZXR1cm4hMTtpZihPYmplY3Qoby5hKShlKXx8T2JqZWN0KG8uYSkobikpcmV0dXJuITE7aWYoT2JqZWN0KGkuYSkoZSl8fE9iamVjdChpLmEpKG4pKXtpZihlLmxlbmd0aCE9PW4ubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgYT0hMCxzPTA7czxlLmxlbmd0aCYmKGE9dChlW3NdLG5bc10pKTtzKyspO3JldHVybiBhfWlmKE9iamVjdChyLmEpKGUpfHxPYmplY3Qoci5hKShuKSl7dmFyIHU9T2JqZWN0LmtleXMoZSksYz1PYmplY3Qua2V5cyhuKTtpZih1Lmxlbmd0aCE9PWMubGVuZ3RoKXJldHVybiExO2ZvcihhPSEwLHM9MDtzPHUubGVuZ3RoJiYoYT10KGVbdVtzXV0sblt1W3NdXSkpO3MrKyk7cmV0dXJuIGF9cmV0dXJuITF9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXIodC5kYXRhLGUsITApLGk9cih0LmRhdGEsZSwhMCksbz10LmNoaWxkcmVuLmxlbmd0aCxhPU1hdGgucm91bmQoby8yKSxzPWUuZ2V0U2lkZXx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gZTxhP1wicmlnaHRcIjpcImxlZnRcIn0sdT0wO3U8bzt1Kyspe3ZhciBjPXQuY2hpbGRyZW5bdV07XCJyaWdodFwiPT09cyhjLHUpP2kuY2hpbGRyZW4ucHVzaChjKTpuLmNoaWxkcmVuLnB1c2goYyl9cmV0dXJuIG4uZWFjaE5vZGUoKGZ1bmN0aW9uKHQpe3QuaXNSb290KCl8fCh0LnNpZGU9XCJsZWZ0XCIpfSkpLGkuZWFjaE5vZGUoKGZ1bmN0aW9uKHQpe3QuaXNSb290KCl8fCh0LnNpZGU9XCJyaWdodFwiKX0pKSx7bGVmdDpuLHJpZ2h0Oml9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPXtjb21wYWN0Qm94Om4oMzIpLGRlbmRyb2dyYW06bigxMTQpLGluZGVudGVkOm4oMTE2KSxtaW5kbWFwOm4oMTE4KX07dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxpPW4oMTEzKSxvPW4oMTcpLGE9big3KSxzPWZ1bmN0aW9uKHQpe3ZhciBlLG47ZnVuY3Rpb24gcigpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbj10LChlPXIpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUuX19wcm90b19fPW4sci5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbigpe3JldHVybiBvKHRoaXMucm9vdE5vZGUsdGhpcy5vcHRpb25zLGkpfSxyfShyKSx1PXt9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBlPWEuYXNzaWduKHt9LHUsZSksbmV3IHModCxlKS5leGVjdXRlKCl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHI9bigxMik7bi5kKGUsXCJjb250YWluc1wiLChmdW5jdGlvbigpe3JldHVybiByLmF9KSksbi5kKGUsXCJpbmNsdWRlc1wiLChmdW5jdGlvbigpe3JldHVybiByLmF9KSk7dmFyIGk9bigzNCk7bi5kKGUsXCJkaWZmZXJlbmNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGkuYX0pKTt2YXIgbz1uKDM1KTtuLmQoZSxcImZpbmRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gby5hfSkpO3ZhciBhPW4oMzYpO24uZChlLFwiZmluZEluZGV4XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGEuYX0pKTt2YXIgcz1uKDM3KTtuLmQoZSxcImZpcnN0VmFsdWVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcy5hfSkpO3ZhciB1PW4oMzgpO24uZChlLFwiZmxhdHRlblwiLChmdW5jdGlvbigpe3JldHVybiB1LmF9KSk7dmFyIGM9bigzOSk7bi5kKGUsXCJmbGF0dGVuRGVlcFwiLChmdW5jdGlvbigpe3JldHVybiBjLmF9KSk7dmFyIGY9big0MCk7bi5kKGUsXCJnZXRSYW5nZVwiLChmdW5jdGlvbigpe3JldHVybiBmLmF9KSk7dmFyIGw9big0MSk7bi5kKGUsXCJwdWxsXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pKTt2YXIgaD1uKDIxKTtuLmQoZSxcInB1bGxBdFwiLChmdW5jdGlvbigpe3JldHVybiBoLmF9KSk7dmFyIGQ9big0Mik7bi5kKGUsXCJyZWR1Y2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZC5hfSkpO3ZhciBwPW4oNDMpO24uZChlLFwicmVtb3ZlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pKTt2YXIgZz1uKDQ0KTtuLmQoZSxcInNvcnRCeVwiLChmdW5jdGlvbigpe3JldHVybiBnLmF9KSk7dmFyIHY9big0NSk7bi5kKGUsXCJ1bmlvblwiLChmdW5jdGlvbigpe3JldHVybiB2LmF9KSk7dmFyIHk9bigyMik7bi5kKGUsXCJ1bmlxXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHkuYX0pKTt2YXIgbT1uKDQ2KTtuLmQoZSxcInZhbHVlc09mS2V5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG0uYX0pKTt2YXIgYj1uKDQ3KTtuLmQoZSxcImhlYWRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gYi5hfSkpO3ZhciB4PW4oNDgpO24uZChlLFwibGFzdFwiLChmdW5jdGlvbigpe3JldHVybiB4LmF9KSk7dmFyIHc9big0OSk7bi5kKGUsXCJzdGFydHNXaXRoXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHcuYX0pKTt2YXIgUz1uKDUwKTtuLmQoZSxcImVuZHNXaXRoXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFMuYX0pKTt2YXIgRT1uKDE0KTtuLmQoZSxcImZpbHRlclwiLChmdW5jdGlvbigpe3JldHVybiBFLmF9KSk7dmFyIF89big1MSk7bi5kKGUsXCJldmVyeVwiLChmdW5jdGlvbigpe3JldHVybiBfLmF9KSk7dmFyIE89big1Mik7bi5kKGUsXCJzb21lXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE8uYX0pKTt2YXIgaz1uKDUzKTtuLmQoZSxcImdyb3VwXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGsuYX0pKTt2YXIgTT1uKDI0KTtuLmQoZSxcImdyb3VwQnlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTS5hfSkpO3ZhciBBPW4oMjMpO24uZChlLFwiZ3JvdXBUb01hcFwiLChmdW5jdGlvbigpe3JldHVybiBBLmF9KSk7dmFyIFQ9big1NCk7bi5kKGUsXCJnZXRXcmFwQmVoYXZpb3JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVC5hfSkpO3ZhciBDPW4oNTUpO24uZChlLFwid3JhcEJlaGF2aW9yXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEMuYX0pKTt2YXIgST1uKDU2KTtuLmQoZSxcIm51bWJlcjJjb2xvclwiLChmdW5jdGlvbigpe3JldHVybiBJLmF9KSk7dmFyIFA9big1Nyk7bi5kKGUsXCJwYXJzZVJhZGl1c1wiLChmdW5jdGlvbigpe3JldHVybiBQLmF9KSk7dmFyIGo9big1OCk7bi5kKGUsXCJjbGFtcFwiLChmdW5jdGlvbigpe3JldHVybiBqLmF9KSk7dmFyIEQ9big1OSk7bi5kKGUsXCJmaXhlZEJhc2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRC5hfSkpO3ZhciBOPW4oNjApO24uZChlLFwiaXNEZWNpbWFsXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE4uYX0pKTt2YXIgUj1uKDYxKTtuLmQoZSxcImlzRXZlblwiLChmdW5jdGlvbigpe3JldHVybiBSLmF9KSk7dmFyIEw9big2Mik7bi5kKGUsXCJpc0ludGVnZXJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTC5hfSkpO3ZhciBCPW4oNjMpO24uZChlLFwiaXNOZWdhdGl2ZVwiLChmdW5jdGlvbigpe3JldHVybiBCLmF9KSk7dmFyIEc9big2NCk7bi5kKGUsXCJpc051bWJlckVxdWFsXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEcuYX0pKTt2YXIgRj1uKDY1KTtuLmQoZSxcImlzT2RkXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEYuYX0pKTt2YXIgVT1uKDY2KTtuLmQoZSxcImlzUG9zaXRpdmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVS5hfSkpO3ZhciB6PW4oNjcpO24uZChlLFwibWF4QnlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gei5hfSkpO3ZhciBWPW4oNjgpO24uZChlLFwibWluQnlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVi5hfSkpO3ZhciBXPW4oNjkpO24uZChlLFwibW9kXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFcuYX0pKTt2YXIgWD1uKDcwKTtuLmQoZSxcInRvRGVncmVlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFguYX0pKTt2YXIgWT1uKDcxKTtuLmQoZSxcInRvSW50ZWdlclwiLChmdW5jdGlvbigpe3JldHVybiBZLmF9KSk7dmFyIEg9big3Mik7bi5kKGUsXCJ0b1JhZGlhblwiLChmdW5jdGlvbigpe3JldHVybiBILmF9KSk7dmFyIHE9big3Myk7bi5kKGUsXCJmb3JJblwiLChmdW5jdGlvbigpe3JldHVybiBxLmF9KSk7dmFyIEs9bigyNSk7bi5kKGUsXCJoYXNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSy5hfSkpO3ZhciBaPW4oNzQpO24uZChlLFwiaGFzS2V5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFouYX0pKTt2YXIgUT1uKDc1KTtuLmQoZSxcImhhc1ZhbHVlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFEuYX0pKTt2YXIgSj1uKDIwKTtuLmQoZSxcImtleXNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSi5hfSkpO3ZhciAkPW4oMTkpO24uZChlLFwiaXNNYXRjaFwiLChmdW5jdGlvbigpe3JldHVybiAkLmF9KSk7dmFyIHR0PW4oMjYpO24uZChlLFwidmFsdWVzXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHR0LmF9KSk7dmFyIGV0PW4oNzYpO24uZChlLFwibG93ZXJDYXNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGV0LmF9KSk7dmFyIG50PW4oNzcpO24uZChlLFwibG93ZXJGaXJzdFwiLChmdW5jdGlvbigpe3JldHVybiBudC5hfSkpO3ZhciBydD1uKDc4KTtuLmQoZSxcInN1YnN0aXR1dGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcnQuYX0pKTt2YXIgaXQ9big3OSk7bi5kKGUsXCJ1cHBlckNhc2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaXQuYX0pKTt2YXIgb3Q9big4MCk7bi5kKGUsXCJ1cHBlckZpcnN0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG90LmF9KSk7dmFyIGF0PW4oMjcpO24uZChlLFwiZ2V0VHlwZVwiLChmdW5jdGlvbigpe3JldHVybiBhdC5hfSkpO3ZhciBzdD1uKDgxKTtuLmQoZSxcImlzQXJndW1lbnRzXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHN0LmF9KSk7dmFyIHV0PW4oMCk7bi5kKGUsXCJpc0FycmF5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHV0LmF9KSk7dmFyIGN0PW4oMSk7bi5kKGUsXCJpc0FycmF5TGlrZVwiLChmdW5jdGlvbigpe3JldHVybiBjdC5hfSkpO3ZhciBmdD1uKDgyKTtuLmQoZSxcImlzQm9vbGVhblwiLChmdW5jdGlvbigpe3JldHVybiBmdC5hfSkpO3ZhciBsdD1uKDgzKTtuLmQoZSxcImlzRGF0ZVwiLChmdW5jdGlvbigpe3JldHVybiBsdC5hfSkpO3ZhciBodD1uKDg0KTtuLmQoZSxcImlzRXJyb3JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaHQuYX0pKTt2YXIgZHQ9bigzKTtuLmQoZSxcImlzRnVuY3Rpb25cIiwoZnVuY3Rpb24oKXtyZXR1cm4gZHQuYX0pKTt2YXIgcHQ9big4NSk7bi5kKGUsXCJpc0Zpbml0ZVwiLChmdW5jdGlvbigpe3JldHVybiBwdC5hfSkpO3ZhciBndD1uKDYpO24uZChlLFwiaXNOaWxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZ3QuYX0pKTt2YXIgdnQ9big4Nik7bi5kKGUsXCJpc051bGxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdnQuYX0pKTt2YXIgeXQ9big1KTtuLmQoZSxcImlzTnVtYmVyXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHl0LmF9KSk7dmFyIG10PW4oMTMpO24uZChlLFwiaXNPYmplY3RcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbXQuYX0pKTt2YXIgYnQ9bigxNSk7bi5kKGUsXCJpc09iamVjdExpa2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gYnQuYX0pKTt2YXIgeHQ9big5KTtuLmQoZSxcImlzUGxhaW5PYmplY3RcIiwoZnVuY3Rpb24oKXtyZXR1cm4geHQuYX0pKTt2YXIgd3Q9bigyOCk7bi5kKGUsXCJpc1Byb3RvdHlwZVwiLChmdW5jdGlvbigpe3JldHVybiB3dC5hfSkpO3ZhciBTdD1uKDg3KTtuLmQoZSxcImlzUmVnRXhwXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFN0LmF9KSk7dmFyIEV0PW4oOCk7bi5kKGUsXCJpc1N0cmluZ1wiLChmdW5jdGlvbigpe3JldHVybiBFdC5hfSkpO3ZhciBfdD1uKDQpO24uZChlLFwiaXNUeXBlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIF90LmF9KSk7dmFyIE90PW4oODgpO24uZChlLFwiaXNVbmRlZmluZWRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gT3QuYX0pKTt2YXIga3Q9big4OSk7bi5kKGUsXCJpc0VsZW1lbnRcIiwoZnVuY3Rpb24oKXtyZXR1cm4ga3QuYX0pKTt2YXIgTXQ9big5MCk7bi5kKGUsXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTXQuYX0pKTt2YXIgQXQ9big5MSk7bi5kKGUsXCJjbGVhckFuaW1hdGlvbkZyYW1lXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEF0LmF9KSk7dmFyIFR0PW4oOTIpO24uZChlLFwiYXVnbWVudFwiLChmdW5jdGlvbigpe3JldHVybiBUdC5hfSkpO3ZhciBDdD1uKDkzKTtuLmQoZSxcImNsb25lXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEN0LmF9KSk7dmFyIEl0PW4oOTQpO24uZChlLFwiZGVib3VuY2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSXQuYX0pKTt2YXIgUHQ9big5NSk7bi5kKGUsXCJtZW1vaXplXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFB0LmF9KSk7dmFyIGp0PW4oOTYpO24uZChlLFwiZGVlcE1peFwiLChmdW5jdGlvbigpe3JldHVybiBqdC5hfSkpO3ZhciBEdD1uKDIpO24uZChlLFwiZWFjaFwiLChmdW5jdGlvbigpe3JldHVybiBEdC5hfSkpO3ZhciBOdD1uKDk3KTtuLmQoZSxcImV4dGVuZFwiLChmdW5jdGlvbigpe3JldHVybiBOdC5hfSkpO3ZhciBSdD1uKDk4KTtuLmQoZSxcImluZGV4T2ZcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUnQuYX0pKTt2YXIgTHQ9big5OSk7bi5kKGUsXCJpc0VtcHR5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEx0LmF9KSk7dmFyIEJ0PW4oMjkpO24uZChlLFwiaXNFcXVhbFwiLChmdW5jdGlvbigpe3JldHVybiBCdC5hfSkpO3ZhciBHdD1uKDEwMCk7bi5kKGUsXCJpc0VxdWFsV2l0aFwiLChmdW5jdGlvbigpe3JldHVybiBHdC5hfSkpO3ZhciBGdD1uKDEwMSk7bi5kKGUsXCJtYXBcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRnQuYX0pKTt2YXIgVXQ9bigxMDIpO24uZChlLFwibWFwVmFsdWVzXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFV0LmF9KSk7dmFyIHp0PW4oMTYpO24uZChlLFwibWl4XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHp0LmF9KSksbi5kKGUsXCJhc3NpZ25cIiwoZnVuY3Rpb24oKXtyZXR1cm4genQuYX0pKTt2YXIgVnQ9bigxMDMpO24uZChlLFwiZ2V0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFZ0LmF9KSk7dmFyIFd0PW4oMTA0KTtuLmQoZSxcInNldFwiLChmdW5jdGlvbigpe3JldHVybiBXdC5hfSkpO3ZhciBYdD1uKDEwNSk7bi5kKGUsXCJwaWNrXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFh0LmF9KSk7dmFyIFl0PW4oMTA2KTtuLmQoZSxcInRocm90dGxlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFl0LmF9KSk7dmFyIEh0PW4oMTA3KTtuLmQoZSxcInRvQXJyYXlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSHQuYX0pKTt2YXIgcXQ9bigxMCk7bi5kKGUsXCJ0b1N0cmluZ1wiLChmdW5jdGlvbigpe3JldHVybiBxdC5hfSkpO3ZhciBLdD1uKDEwOCk7bi5kKGUsXCJ1bmlxdWVJZFwiLChmdW5jdGlvbigpe3JldHVybiBLdC5hfSkpO3ZhciBadD1uKDEwOSk7bi5kKGUsXCJub29wXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFp0LmF9KSk7dmFyIFF0PW4oMTEwKTtuLmQoZSxcImlkZW50aXR5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFF0LmF9KSk7dmFyIEp0PW4oMTExKTtuLmQoZSxcInNpemVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSnQuYX0pKTt2YXIgJHQ9bigxMTIpO24uZChlLFwiQ2FjaGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gJHQuYX0pKX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMTQpLGk9bigxMik7ZS5hPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPVtdKSxPYmplY3Qoci5hKSh0LChmdW5jdGlvbih0KXtyZXR1cm4hT2JqZWN0KGkuYSkoZSx0KX0pKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDMpLGk9bigxOSksbz1uKDApLGE9big5KTtlLmE9ZnVuY3Rpb24odCxlKXtpZighT2JqZWN0KG8uYSkodCkpcmV0dXJuIG51bGw7dmFyIG47aWYoT2JqZWN0KHIuYSkoZSkmJihuPWUpLE9iamVjdChhLmEpKGUpJiYobj1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KGkuYSkodCxlKX0pLG4pZm9yKHZhciBzPTA7czx0Lmxlbmd0aDtzKz0xKWlmKG4odFtzXSkpcmV0dXJuIHRbc107cmV0dXJuIG51bGx9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZS5hPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1uJiYobj0wKTtmb3IodmFyIHI9bjtyPHQubGVuZ3RoO3IrKylpZihlKHRbcl0scikpcmV0dXJuIHI7cmV0dXJuLTF9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big2KSxpPW4oMCk7ZS5hPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW51bGwsbz0wO288dC5sZW5ndGg7bysrKXt2YXIgYT10W29dW2VdO2lmKCFPYmplY3Qoci5hKShhKSl7bj1PYmplY3QoaS5hKShhKT9hWzBdOmE7YnJlYWt9fXJldHVybiBufX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMCk7ZS5hPWZ1bmN0aW9uKHQpe2lmKCFPYmplY3Qoci5hKSh0KSlyZXR1cm5bXTtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7bisrKWU9ZS5jb25jYXQodFtuXSk7cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigwKTtlLmE9ZnVuY3Rpb24gdChlLG4pe2lmKHZvaWQgMD09PW4mJihuPVtdKSxPYmplY3Qoci5hKShlKSlmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krPTEpdChlW2ldLG4pO2Vsc2Ugbi5wdXNoKGUpO3JldHVybiBufX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMCksaT1uKDE0KTtlLmE9ZnVuY3Rpb24odCl7aWYoISh0PU9iamVjdChpLmEpKHQsKGZ1bmN0aW9uKHQpe3JldHVybiFpc05hTih0KX0pKSkubGVuZ3RoKXJldHVybnttaW46MCxtYXg6MH07aWYoT2JqZWN0KHIuYSkodFswXSkpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKyspZT1lLmNvbmNhdCh0W25dKTt0PWV9dmFyIG89TWF0aC5tYXguYXBwbHkobnVsbCx0KTtyZXR1cm57bWluOk1hdGgubWluLmFwcGx5KG51bGwsdCksbWF4Om99fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPUFycmF5LnByb3RvdHlwZSxpPXIuc3BsaWNlLG89ci5pbmRleE9mO2UuYT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKylmb3IodmFyIGE9ZVtyXSxzPS0xOyhzPW8uY2FsbCh0LGEpKT4tMTspaS5jYWxsKHQscywxKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDIpLGk9bigwKSxvPW4oOSk7ZS5hPWZ1bmN0aW9uKHQsZSxuKXtpZighT2JqZWN0KGkuYSkodCkmJiFPYmplY3Qoby5hKSh0KSlyZXR1cm4gdDt2YXIgYT1uO3JldHVybiBPYmplY3Qoci5hKSh0LChmdW5jdGlvbih0LG4pe2E9ZShhLHQsbil9KSksYX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDEpLGk9bigyMSk7ZS5hPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107aWYoIU9iamVjdChyLmEpKHQpKXJldHVybiBuO2Zvcih2YXIgbz0tMSxhPVtdLHM9dC5sZW5ndGg7KytvPHM7KXt2YXIgdT10W29dO2UodSxvLHQpJiYobi5wdXNoKHUpLGEucHVzaChvKSl9cmV0dXJuIE9iamVjdChpLmEpKHQsYSksbn19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDApLGk9big4KSxvPW4oMyk7ZS5hPWZ1bmN0aW9uKHQsZSl7dmFyIG47aWYoT2JqZWN0KG8uYSkoZSkpbj1mdW5jdGlvbih0LG4pe3JldHVybiBlKHQpLWUobil9O2Vsc2V7dmFyIGE9W107T2JqZWN0KGkuYSkoZSk/YS5wdXNoKGUpOk9iamVjdChyLmEpKGUpJiYoYT1lKSxuPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxhLmxlbmd0aDtuKz0xKXt2YXIgcj1hW25dO2lmKHRbcl0+ZVtyXSlyZXR1cm4gMTtpZih0W3JdPGVbcl0pcmV0dXJuLTF9cmV0dXJuIDB9fXJldHVybiB0LnNvcnQobiksdH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDIyKTtlLmE9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIE9iamVjdChyLmEpKFtdLmNvbmNhdC5hcHBseShbXSx0KSl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyKSxpPW4oMCksbz1uKDYpO2UuYT1mdW5jdGlvbih0LGUpe3ZhciBuPVtdLGE9e307cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIHM9dFtlXTtPYmplY3Qoby5hKShzKXx8KE9iamVjdChpLmEpKHMpfHwocz1bc10pLE9iamVjdChyLmEpKHMsKGZ1bmN0aW9uKHQpe2FbdF18fChuLnB1c2godCksYVt0XT0hMCl9KSkpfSkpLG59fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZS5hPWZ1bmN0aW9uKHQpe2lmKE9iamVjdChyLmEpKHQpKXJldHVybiB0WzBdfTt2YXIgcj1uKDEpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZS5hPWZ1bmN0aW9uKHQpe2lmKE9iamVjdChyLmEpKHQpKXJldHVybiB0W3QubGVuZ3RoLTFdfTt2YXIgcj1uKDEpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigwKSxpPW4oOCk7ZS5hPWZ1bmN0aW9uKHQsZSl7cmV0dXJuISghT2JqZWN0KHIuYSkodCkmJiFPYmplY3QoaS5hKSh0KSkmJnRbMF09PT1lfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMCksaT1uKDgpO2UuYT1mdW5jdGlvbih0LGUpe3JldHVybiEoIU9iamVjdChyLmEpKHQpJiYhT2JqZWN0KGkuYSkodCkpJiZ0W3QubGVuZ3RoLTFdPT09ZX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtlLmE9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZighZSh0W25dLG4pKXJldHVybiExO3JldHVybiEwfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWlmKGUodFtuXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDIzKTtlLmE9ZnVuY3Rpb24odCxlKXtpZighZSlyZXR1cm5bdF07dmFyIG49T2JqZWN0KHIuYSkodCxlKSxpPVtdO2Zvcih2YXIgbyBpbiBuKWkucHVzaChuW29dKTtyZXR1cm4gaX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtlLmE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFtcIl93cmFwX1wiK2VdfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1mdW5jdGlvbih0LGUpe2lmKHRbXCJfd3JhcF9cIitlXSlyZXR1cm4gdFtcIl93cmFwX1wiK2VdO3ZhciBuPWZ1bmN0aW9uKG4pe3RbZV0obil9O3JldHVybiB0W1wiX3dyYXBfXCIrZV09bixufX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPXt9O2UuYT1mdW5jdGlvbih0KXt2YXIgZT1yW3RdO2lmKCFlKXtmb3IodmFyIG49dC50b1N0cmluZygxNiksaT1uLmxlbmd0aDtpPDY7aSsrKW49XCIwXCIrbjtlPVwiI1wiK24sclt0XT1lfXJldHVybiBlfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMCk7ZS5hPWZ1bmN0aW9uKHQpe3ZhciBlPTAsbj0wLGk9MCxvPTA7cmV0dXJuIE9iamVjdChyLmEpKHQpPzE9PT10Lmxlbmd0aD9lPW49aT1vPXRbMF06Mj09PXQubGVuZ3RoPyhlPWk9dFswXSxuPW89dFsxXSk6Mz09PXQubGVuZ3RoPyhlPXRbMF0sbj1vPXRbMV0saT10WzJdKTooZT10WzBdLG49dFsxXSxpPXRbMl0sbz10WzNdKTplPW49aT1vPXQse3IxOmUscjI6bixyMzppLHI0Om99fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ8ZT9lOnQ+bj9uOnR9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZS5hPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS50b1N0cmluZygpLHI9bi5pbmRleE9mKFwiLlwiKTtpZigtMT09PXIpcmV0dXJuIE1hdGgucm91bmQodCk7dmFyIGk9bi5zdWJzdHIocisxKS5sZW5ndGg7cmV0dXJuIGk+MjAmJihpPTIwKSxwYXJzZUZsb2F0KHQudG9GaXhlZChpKSl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big1KTtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChyLmEpKHQpJiZ0JTEhPTB9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big1KTtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChyLmEpKHQpJiZ0JTI9PTB9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big1KSxpPU51bWJlci5pc0ludGVnZXI/TnVtYmVyLmlzSW50ZWdlcjpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHIuYSkodCkmJnQlMT09MH07ZS5hPWl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDUpO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHIuYSkodCkmJnQ8MH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtlLmE9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0xZS01KSxNYXRoLmFicyh0LWUpPG59fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big1KTtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChyLmEpKHQpJiZ0JTIhPTB9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big1KTtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChyLmEpKHQpJiZ0PjB9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyKSxpPW4oMCksbz1uKDMpO2UuYT1mdW5jdGlvbih0LGUpe2lmKE9iamVjdChpLmEpKHQpKXt2YXIgbixhLHM9dFswXTtyZXR1cm4gbj1PYmplY3Qoby5hKShlKT9lKHRbMF0pOnRbMF1bZV0sT2JqZWN0KHIuYSkodCwoZnVuY3Rpb24odCl7KGE9T2JqZWN0KG8uYSkoZSk/ZSh0KTp0W2VdKT5uJiYocz10LG49YSl9KSksc319fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyKSxpPW4oMCksbz1uKDMpO2UuYT1mdW5jdGlvbih0LGUpe2lmKE9iamVjdChpLmEpKHQpKXt2YXIgbixhLHM9dFswXTtyZXR1cm4gbj1PYmplY3Qoby5hKShlKT9lKHRbMF0pOnRbMF1bZV0sT2JqZWN0KHIuYSkodCwoZnVuY3Rpb24odCl7KGE9T2JqZWN0KG8uYSkoZSk/ZSh0KTp0W2VdKTxuJiYocz10LG49YSl9KSksc319fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZS5hPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQlZStlKSVlfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPTE4MC9NYXRoLlBJO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gcip0fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1wYXJzZUludH0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPU1hdGguUEkvMTgwO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gcip0fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMik7ZS5hPXIuYX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMjUpO2UuYT1yLmF9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDEyKSxpPW4oMjYpO2UuYT1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3Qoci5hKShPYmplY3QoaS5hKSh0KSxlKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDEwKTtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChyLmEpKHQpLnRvTG93ZXJDYXNlKCl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigxMCk7ZS5hPWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdChyLmEpKHQpO3JldHVybiBlLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpK2Uuc3Vic3RyaW5nKDEpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP3QucmVwbGFjZSgvXFxcXD9cXHsoW157fV0rKVxcfS9nLChmdW5jdGlvbih0LG4pe3JldHVyblwiXFxcXFwiPT09dC5jaGFyQXQoMCk/dC5zbGljZSgxKTp2b2lkIDA9PT1lW25dP1wiXCI6ZVtuXX0pKTp0fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMTApO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHIuYSkodCkudG9VcHBlckNhc2UoKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDEwKTtlLmE9ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0KHIuYSkodCk7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big0KTtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChyLmEpKHQsXCJBcmd1bWVudHNcIil9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big0KTtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChyLmEpKHQsXCJCb29sZWFuXCIpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oNCk7ZS5hPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qoci5hKSh0LFwiRGF0ZVwiKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDQpO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHIuYSkodCxcIkVycm9yXCIpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oNSk7ZS5hPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qoci5hKSh0KSYmaXNGaW5pdGUodCl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZS5hPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDQpO2UuYT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHIuYSkodCxcIlJlZ0V4cFwiKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZS5hPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRWxlbWVudHx8dCBpbnN0YW5jZW9mIEhUTUxEb2N1bWVudH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24odCl7cmV0dXJuIHNldFRpbWVvdXQodCwxNil9KSh0KX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtlLmE9ZnVuY3Rpb24odCl7KHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc0NhbmNlbEFuaW1hdGlvbkZyYW1lfHxjbGVhclRpbWVvdXQpKHQpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMTYpLGk9bigzKTtlLmE9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07Zm9yKHZhciBuPXRbMF0sbz0xO288dC5sZW5ndGg7bysrKXt2YXIgYT10W29dO09iamVjdChpLmEpKGEpJiYoYT1hLnByb3RvdHlwZSksT2JqZWN0KHIuYSkobi5wcm90b3R5cGUsYSl9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMCk7ZS5hPWZ1bmN0aW9uIHQoZSl7aWYoXCJvYmplY3RcIiE9PWEoZSl8fG51bGw9PT1lKXJldHVybiBlO3ZhciBuO2lmKE9iamVjdChyLmEpKGUpKXtuPVtdO2Zvcih2YXIgaT0wLG89ZS5sZW5ndGg7aTxvO2krKylcIm9iamVjdFwiPT09YShlW2ldKSYmbnVsbCE9ZVtpXT9uW2ldPXQoZVtpXSk6bltpXT1lW2ldfWVsc2UgZm9yKHZhciBzIGluIG49e30sZSlcIm9iamVjdFwiPT09YShlW3NdKSYmbnVsbCE9ZVtzXT9uW3NdPXQoZVtzXSk6bltzXT1lW3NdO3JldHVybiBufX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1mdW5jdGlvbih0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxvPWFyZ3VtZW50cyxhPWZ1bmN0aW9uKCl7cj1udWxsLG58fHQuYXBwbHkoaSxvKX0scz1uJiYhcjtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGEsZSkscyYmdC5hcHBseShpLG8pfX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDMpO2UuYT1mdW5jdGlvbih0LGUpe2lmKCFPYmplY3Qoci5hKSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiKTt2YXIgbj1mdW5jdGlvbiBuKCl7Zm9yKHZhciByPVtdLGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXJbaV09YXJndW1lbnRzW2ldO3ZhciBvPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sYT1uLmNhY2hlO2lmKGEuaGFzKG8pKXJldHVybiBhLmdldChvKTt2YXIgcz10LmFwcGx5KHRoaXMscik7cmV0dXJuIGEuc2V0KG8scyksc307cmV0dXJuIG4uY2FjaGU9bmV3IE1hcCxufX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMCksaT1uKDkpO2Z1bmN0aW9uIG8odCxlLG4sYSl7Zm9yKHZhciBzIGluIG49bnx8MCxhPWF8fDUsZSlpZihlLmhhc093blByb3BlcnR5KHMpKXt2YXIgdT1lW3NdO251bGwhPT11JiZPYmplY3QoaS5hKSh1KT8oT2JqZWN0KGkuYSkodFtzXSl8fCh0W3NdPXt9KSxuPGE/byh0W3NdLHUsbisxLGEpOnRbc109ZVtzXSk6T2JqZWN0KHIuYSkodSk/KHRbc109W10sdFtzXT10W3NdLmNvbmNhdCh1KSk6dm9pZCAwIT09dSYmKHRbc109dSl9fWUuYT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrPTEpbyh0LGVbcl0pO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMTYpLGk9bigzKTtlLmE9ZnVuY3Rpb24odCxlLG4sbyl7T2JqZWN0KGkuYSkoZSl8fChuPWUsZT10LHQ9ZnVuY3Rpb24oKXt9KTt2YXIgYT1PYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5jcmVhdGUodCx7Y29uc3RydWN0b3I6e3ZhbHVlOmV9fSl9OmZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe31uLnByb3RvdHlwZT10O3ZhciByPW5ldyBuO3JldHVybiByLmNvbnN0cnVjdG9yPWUscn0scz1hKGUucHJvdG90eXBlLHQpO3JldHVybiB0LnByb3RvdHlwZT1PYmplY3Qoci5hKShzLHQucHJvdG90eXBlKSx0LnN1cGVyY2xhc3M9YShlLnByb3RvdHlwZSxlKSxPYmplY3Qoci5hKShzLG4pLE9iamVjdChyLmEpKHQsbyksdH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDEpO2UuYT1mdW5jdGlvbih0LGUpe2lmKCFPYmplY3Qoci5hKSh0KSlyZXR1cm4tMTt2YXIgbj1BcnJheS5wcm90b3R5cGUuaW5kZXhPZjtpZihuKXJldHVybiBuLmNhbGwodCxlKTtmb3IodmFyIGk9LTEsbz0wO288dC5sZW5ndGg7bysrKWlmKHRbb109PT1lKXtpPW87YnJlYWt9cmV0dXJuIGl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big2KSxpPW4oMSksbz1uKDI3KSxhPW4oMjgpLHM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtlLmE9ZnVuY3Rpb24odCl7aWYoT2JqZWN0KHIuYSkodCkpcmV0dXJuITA7aWYoT2JqZWN0KGkuYSkodCkpcmV0dXJuIXQubGVuZ3RoO3ZhciBlPU9iamVjdChvLmEpKHQpO2lmKFwiTWFwXCI9PT1lfHxcIlNldFwiPT09ZSlyZXR1cm4hdC5zaXplO2lmKE9iamVjdChhLmEpKHQpKXJldHVybiFPYmplY3Qua2V5cyh0KS5sZW5ndGg7Zm9yKHZhciBuIGluIHQpaWYocy5jYWxsKHQsbikpcmV0dXJuITE7cmV0dXJuITB9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigzKSxpPW4oMjkpO2UuYT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE9iamVjdChyLmEpKG4pPyEhbih0LGUpOk9iamVjdChpLmEpKHQsZSl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyKSxpPW4oMSk7ZS5hPWZ1bmN0aW9uKHQsZSl7aWYoIU9iamVjdChpLmEpKHQpKXJldHVybiB0O3ZhciBuPVtdO3JldHVybiBPYmplY3Qoci5hKSh0LChmdW5jdGlvbih0LHIpe24ucHVzaChlKHQscikpfSkpLG59fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big2KSxpPW4oMTMpLG89ZnVuY3Rpb24odCl7cmV0dXJuIHR9O2UuYT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8pO3ZhciBuPXt9O3JldHVybiBPYmplY3QoaS5hKSh0KSYmIU9iamVjdChyLmEpKHQpJiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihyKXtuW3JdPWUodFtyXSxyKX0pKSxufX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oOCk7ZS5hPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9MCxvPU9iamVjdChyLmEpKGUpP2Uuc3BsaXQoXCIuXCIpOmU7dCYmaTxvLmxlbmd0aDspdD10W29baSsrXV07cmV0dXJuIHZvaWQgMD09PXR8fGk8by5sZW5ndGg/bjp0fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMTMpLGk9big4KSxvPW4oNSk7ZS5hPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT10LHM9T2JqZWN0KGkuYSkoZSk/ZS5zcGxpdChcIi5cIik6ZTtyZXR1cm4gcy5mb3JFYWNoKChmdW5jdGlvbih0LGUpe2U8cy5sZW5ndGgtMT8oT2JqZWN0KHIuYSkoYVt0XSl8fChhW3RdPU9iamVjdChvLmEpKHNbZSsxXSk/W106e30pLGE9YVt0XSk6YVt0XT1ufSkpLHR9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyKSxpPW4oOSksbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2UuYT1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10fHwhT2JqZWN0KGkuYSkodCkpcmV0dXJue307dmFyIG49e307cmV0dXJuIE9iamVjdChyLmEpKGUsKGZ1bmN0aW9uKGUpe28uY2FsbCh0LGUpJiYobltlXT10W2VdKX0pKSxufX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1mdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLGEscz0wO258fChuPXt9KTt2YXIgdT1mdW5jdGlvbigpe3M9ITE9PT1uLmxlYWRpbmc/MDpEYXRlLm5vdygpLHI9bnVsbCxhPXQuYXBwbHkoaSxvKSxyfHwoaT1vPW51bGwpfSxjPWZ1bmN0aW9uKCl7dmFyIGM9RGF0ZS5ub3coKTtzfHwhMSE9PW4ubGVhZGluZ3x8KHM9Yyk7dmFyIGY9ZS0oYy1zKTtyZXR1cm4gaT10aGlzLG89YXJndW1lbnRzLGY8PTB8fGY+ZT8ociYmKGNsZWFyVGltZW91dChyKSxyPW51bGwpLHM9YyxhPXQuYXBwbHkoaSxvKSxyfHwoaT1vPW51bGwpKTpyfHwhMT09PW4udHJhaWxpbmd8fChyPXNldFRpbWVvdXQodSxmKSksYX07cmV0dXJuIGMuY2FuY2VsPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHIpLHM9MCxyPWk9bz1udWxsfSxjfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMSk7ZS5hPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qoci5hKSh0KT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KTpbXX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj17fTtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuIHJbdD10fHxcImdcIl0/clt0XSs9MTpyW3RdPTEsdCtyW3RdfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2UuYT1mdW5jdGlvbigpe319LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtlLmE9ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZS5hPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qoci5hKSh0KT8wOk9iamVjdChpLmEpKHQpP3QubGVuZ3RoOk9iamVjdC5rZXlzKHQpLmxlbmd0aH07dmFyIHI9big2KSxpPW4oMSl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLm1hcD17fX1yZXR1cm4gdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLm1hcFt0XX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5tYXBbdF07cmV0dXJuIHZvaWQgMD09PW4/ZTpufSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLm1hcFt0XT1lfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMubWFwPXt9fSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7ZGVsZXRlIHRoaXMubWFwW3RdfSx0LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubWFwKS5sZW5ndGh9LHR9KCk7ZS5hPXJ9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbih0LGUsbixyKXt2b2lkIDA9PT1yJiYocj1bXSk7dmFyIGk9dGhpcztpLnc9dHx8MCxpLmg9ZXx8MCxpLnk9bnx8MCxpLng9MCxpLmM9cnx8W10saS5jcz1yLmxlbmd0aCxpLnByZWxpbT0wLGkubW9kPTAsaS5zaGlmdD0wLGkuY2hhbmdlPTAsaS50bD1udWxsLGkudHI9bnVsbCxpLmVsPW51bGwsaS5lcj1udWxsLGkubXNlbD0wLGkubXNlcj0wfWZ1bmN0aW9uIHIodCxlKXt2YXIgbj1mdW5jdGlvbiB0KGUsbil7dmFyIHI9bj9lLnk6ZS54O3JldHVybiBlLmNoaWxkcmVuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3I9TWF0aC5taW4odChlLG4pLHIpfSkpLHJ9KHQsZSk7IWZ1bmN0aW9uIHQoZSxuLHIpe3I/ZS55Kz1uOmUueCs9bixlLmNoaWxkcmVuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QoZSxuLHIpfSkpfSh0LC1uLGUpfW4uZnJvbU5vZGU9ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gbnVsbDt2YXIgcj1bXTtyZXR1cm4gdC5jaGlsZHJlbi5mb3JFYWNoKChmdW5jdGlvbih0KXtyLnB1c2gobi5mcm9tTm9kZSh0LGUpKX0pKSxlP25ldyBuKHQuaGVpZ2h0LHQud2lkdGgsdC54LHIpOm5ldyBuKHQud2lkdGgsdC5oZWlnaHQsdC55LHIpfSx0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIGk9ZS5pc0hvcml6b250YWw7ZnVuY3Rpb24gbyh0KXswPT09dC5jcz8odC5lbD10LHQuZXI9dCx0Lm1zZWw9dC5tc2VyPTApOih0LmVsPXQuY1swXS5lbCx0Lm1zZWw9dC5jWzBdLm1zZWwsdC5lcj10LmNbdC5jcy0xXS5lcix0Lm1zZXI9dC5jW3QuY3MtMV0ubXNlcil9ZnVuY3Rpb24gYSh0LGUsbil7Zm9yKHZhciByPXQuY1tlLTFdLGk9ci5tb2Qsbz10LmNbZV0sYT1vLm1vZDtudWxsIT09ciYmbnVsbCE9PW87KXtmKHIpPm4ubG93JiYobj1uLm54dCk7dmFyIGw9aStyLnByZWxpbStyLnctKGErby5wcmVsaW0pO2w+MCYmKGErPWwscyh0LGUsbi5pbmRleCxsKSk7dmFyIGg9ZihyKSxkPWYobyk7aDw9ZCYmbnVsbCE9PShyPWMocikpJiYoaSs9ci5tb2QpLGg+PWQmJm51bGwhPT0obz11KG8pKSYmKGErPW8ubW9kKX0hciYmbz9mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LmNbMF0uZWw7aS50bD1uO3ZhciBvPXItbi5tb2QtdC5jWzBdLm1zZWw7aS5tb2QrPW8saS5wcmVsaW0tPW8sdC5jWzBdLmVsPXQuY1tlXS5lbCx0LmNbMF0ubXNlbD10LmNbZV0ubXNlbH0odCxlLG8sYSk6ciYmIW8mJmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQuY1tlXS5lcjtpLnRyPW47dmFyIG89ci1uLm1vZC10LmNbZV0ubXNlcjtpLm1vZCs9byxpLnByZWxpbS09byx0LmNbZV0uZXI9dC5jW2UtMV0uZXIsdC5jW2VdLm1zZXI9dC5jW2UtMV0ubXNlcn0odCxlLHIsaSl9ZnVuY3Rpb24gcyh0LGUsbixyKXt0LmNbZV0ubW9kKz1yLHQuY1tlXS5tc2VsKz1yLHQuY1tlXS5tc2VyKz1yLGZ1bmN0aW9uKHQsZSxuLHIpe2lmKG4hPT1lLTEpe3ZhciBpPWUtbjt0LmNbbisxXS5zaGlmdCs9ci9pLHQuY1tlXS5zaGlmdC09ci9pLHQuY1tlXS5jaGFuZ2UtPXItci9pfX0odCxlLG4scil9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gMD09PXQuY3M/dC50bDp0LmNbMF19ZnVuY3Rpb24gYyh0KXtyZXR1cm4gMD09PXQuY3M/dC50cjp0LmNbdC5jcy0xXX1mdW5jdGlvbiBmKHQpe3JldHVybiB0LnkrdC5ofWZ1bmN0aW9uIGwodCxlLG4pe2Zvcig7bnVsbCE9PW4mJnQ+PW4ubG93OyluPW4ubnh0O3JldHVybntsb3c6dCxpbmRleDplLG54dDpufX0hZnVuY3Rpb24gdChlLG4scil7dm9pZCAwPT09ciYmKHI9MCksbj8oZS54PXIscis9ZS53aWR0aCk6KGUueT1yLHIrPWUuaGVpZ2h0KSxlLmNoaWxkcmVuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QoZSxuLHIpfSkpfSh0LGkpO3ZhciBoPW4uZnJvbU5vZGUodCxpKTtyZXR1cm4gZnVuY3Rpb24gdChlKXtpZigwIT09ZS5jcyl7dChlLmNbMF0pO2Zvcih2YXIgbj1sKGYoZS5jWzBdLmVsKSwwLG51bGwpLHI9MTtyPGUuY3M7KytyKXt0KGUuY1tyXSk7dmFyIGk9ZihlLmNbcl0uZXIpO2EoZSxyLG4pLG49bChpLHIsbil9IWZ1bmN0aW9uKHQpe3QucHJlbGltPSh0LmNbMF0ucHJlbGltK3QuY1swXS5tb2QrdC5jW3QuY3MtMV0ubW9kK3QuY1t0LmNzLTFdLnByZWxpbSt0LmNbdC5jcy0xXS53KS8yLXQudy8yfShlKSxvKGUpfWVsc2UgbyhlKX0oaCksZnVuY3Rpb24gdChlLG4pe24rPWUubW9kLGUueD1lLnByZWxpbStuLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49MCxyPTA7cjx0LmNzO3IrKyllKz10LmNbcl0uc2hpZnQsbis9ZSt0LmNbcl0uY2hhbmdlLHQuY1tyXS5tb2QrPW59KGUpO2Zvcih2YXIgcj0wO3I8ZS5jcztyKyspdChlLmNbcl0sbil9KGgsMCksZnVuY3Rpb24gdChlLG4scil7cj9uLnk9ZS54Om4ueD1lLngsZS5jLmZvckVhY2goKGZ1bmN0aW9uKGUsaSl7dChlLG4uY2hpbGRyZW5baV0scil9KSl9KGgsdCxpKSxyKHQsaSksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxpPW4oMTE1KSxvPW4oMTcpLGE9big3KSxzPWZ1bmN0aW9uKHQpe3ZhciBlLG47ZnVuY3Rpb24gcigpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbj10LChlPXIpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUuX19wcm90b19fPW4sci5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3ROb2RlLndpZHRoPTAsbyh0aGlzLnJvb3ROb2RlLHRoaXMub3B0aW9ucyxpKX0scn0ociksdT17fTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1hLmFzc2lnbih7fSx1LGUpLG5ldyBzKHQsZSkuZXhlY3V0ZSgpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyk7ZnVuY3Rpb24gaSh0LGUpe3ZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PWUmJihlPVtdKTt2YXIgbj10aGlzO24ueD1uLnk9MCxuLmxlZnRDaGlsZD1uLnJpZ2h0Q2hpbGQ9bnVsbCxuLmhlaWdodD0wLG4uY2hpbGRyZW49ZX12YXIgbz17aXNIb3Jpem9udGFsOiEwLG5vZGVTZXA6MjAsbm9kZVNpemU6MjAscmFua1NlcDoyMDAsc3ViVHJlZVNlcDoxMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pLGU9ci5hc3NpZ24oe30sbyxlKTt2YXIgbixhPTAscz1mdW5jdGlvbiB0KGUpe2lmKCFlKXJldHVybiBudWxsO2Uud2lkdGg9MCxlLmRlcHRoJiZlLmRlcHRoPmEmJihhPWUuZGVwdGgpO3ZhciBuPWUuY2hpbGRyZW4scj1uLmxlbmd0aCxvPW5ldyBpKGUuaGVpZ2h0LFtdKTtyZXR1cm4gbi5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3ZhciBpPXQoZSk7by5jaGlsZHJlbi5wdXNoKGkpLDA9PT1uJiYoby5sZWZ0Q2hpbGQ9aSksbj09PXItMSYmKG8ucmlnaHRDaGlsZD1pKX0pKSxvLm9yaWdpbk5vZGU9ZSxvLmlzTGVhZj1lLmlzTGVhZigpLG99KHQpO3JldHVybiBmdW5jdGlvbiB0KGUpe2lmKGUuaXNMZWFmfHwwPT09ZS5jaGlsZHJlbi5sZW5ndGgpZS5kcmF3aW5nRGVwdGg9YTtlbHNle3ZhciBuPWUuY2hpbGRyZW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdChlKX0pKSxyPU1hdGgubWluLmFwcGx5KG51bGwsbik7ZS5kcmF3aW5nRGVwdGg9ci0xfXJldHVybiBlLmRyYXdpbmdEZXB0aH0ocyksZnVuY3Rpb24gdChyKXtyLng9ci5kcmF3aW5nRGVwdGgqZS5yYW5rU2VwLHIuaXNMZWFmPyhyLnk9MCxuJiYoci55PW4ueStuLmhlaWdodCtlLm5vZGVTZXAsci5vcmlnaW5Ob2RlLnBhcmVudCE9PW4ub3JpZ2luTm9kZS5wYXJlbnQmJihyLnkrPWUuc3ViVHJlZVNlcCkpLG49cik6KHIuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dChlKX0pKSxyLnk9KHIubGVmdENoaWxkLnkrci5yaWdodENoaWxkLnkpLzIpfShzKSxmdW5jdGlvbiB0KGUsbixyKXtyPyhuLng9ZS54LG4ueT1lLnkpOihuLng9ZS55LG4ueT1lLngpLGUuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24oZSxpKXt0KGUsbi5jaGlsZHJlbltpXSxyKX0pKX0ocyx0LGUuaXNIb3Jpem9udGFsKSx0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEpLGk9bigxMTcpLG89bigzMCksYT1uKDcpLHM9W1wiTFJcIixcIlJMXCIsXCJIXCJdLHU9c1swXSxjPWZ1bmN0aW9uKHQpe3ZhciBlLG47ZnVuY3Rpb24gcigpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbj10LChlPXIpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUuX19wcm90b19fPW4sci5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucyxlPXRoaXMucm9vdE5vZGU7dC5pc0hvcml6b250YWw9ITA7dmFyIG49dC5pbmRlbnQscj12b2lkIDA9PT1uPzIwOm4sYT10LmRyb3BDYXAsYz12b2lkIDA9PT1hfHxhLGY9dC5kaXJlY3Rpb258fHU7aWYoZiYmLTE9PT1zLmluZGV4T2YoZikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgZGlyZWN0aW9uOiBcIitmKTtpZihmPT09c1swXSlpKGUscixjKTtlbHNlIGlmKGY9PT1zWzFdKWkoZSxyLGMpLGUucmlnaHQybGVmdCgpO2Vsc2UgaWYoZj09PXNbMl0pe3ZhciBsPW8oZSx0KSxoPWwubGVmdCxkPWwucmlnaHQ7aShoLHIsYyksaC5yaWdodDJsZWZ0KCksaShkLHIsYyk7dmFyIHA9aC5nZXRCb3VuZGluZ0JveCgpO2QudHJhbnNsYXRlKHAud2lkdGgsMCksZS54PWQueC1lLndpZHRoLzJ9cmV0dXJuIGV9LHJ9KHIpLGY9e307dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9YS5hc3NpZ24oe30sZixlKSxuZXcgYyh0LGUpLmV4ZWN1dGUoKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1udWxsO3QuZWFjaE5vZGUoKGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUsbixyKXtpZighcil0cnl7aWYodC5pZD09PXQucGFyZW50LmNoaWxkcmVuWzBdLmlkKXJldHVybiB0LngrPW4qdC5kZXB0aCx2b2lkKHQueT1lP2UueTowKX1jYXRjaCh0KXt9dC54Kz1uKnQuZGVwdGgsdC55PWU/ZS55K2UuaGVpZ2h0OjB9KHQscixlLG4pLHI9dH0pKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxpPW4oMTE5KSxvPW4oMTcpLGE9big3KSxzPWZ1bmN0aW9uKHQpe3ZhciBlLG47ZnVuY3Rpb24gcigpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbj10LChlPXIpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUuX19wcm90b19fPW4sci5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbigpe3JldHVybiBvKHRoaXMucm9vdE5vZGUsdGhpcy5vcHRpb25zLGkpfSxyfShyKSx1PXt9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBlPWEuYXNzaWduKHt9LHUsZSksbmV3IHModCxlKS5leGVjdXRlKCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KSxpPXtnZXRTdWJUcmVlU2VwOmZ1bmN0aW9uKCl7cmV0dXJuIDB9fTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT17fSksZT1yLmFzc2lnbih7fSxpLGUpLHQucGFyZW50PXt4OjAsd2lkdGg6MCxoZWlnaHQ6MCx5OjB9LHQuQkZUcmF2ZXJzZSgoZnVuY3Rpb24odCl7dC54PXQucGFyZW50LngrdC5wYXJlbnQud2lkdGh9KSksdC5wYXJlbnQ9bnVsbCxmdW5jdGlvbiB0KGUsbil7dmFyIHI9MDtyZXR1cm4gZS5jaGlsZHJlbi5sZW5ndGg/ZS5jaGlsZHJlbi5mb3JFYWNoKChmdW5jdGlvbihlKXtyKz10KGUsbil9KSk6cj1lLmhlaWdodCxlLl9zdWJUcmVlU2VwPW4uZ2V0U3ViVHJlZVNlcChlLmRhdGEpLGUudG90YWxIZWlnaHQ9TWF0aC5tYXgoZS5oZWlnaHQscikrMiplLl9zdWJUcmVlU2VwLGUudG90YWxIZWlnaHR9KHQsZSksdC5zdGFydFk9MCx0Lnk9dC50b3RhbEhlaWdodC8yLXQuaGVpZ2h0LzIsdC5lYWNoTm9kZSgoZnVuY3Rpb24odCl7dmFyIGU9dC5jaGlsZHJlbixuPWUubGVuZ3RoO2lmKG4pe3ZhciByPWVbMF07aWYoci5zdGFydFk9dC5zdGFydFkrdC5fc3ViVHJlZVNlcCwxPT09bilyLnk9dC55K3QuaGVpZ2h0LzItci5oZWlnaHQvMjtlbHNle3IueT1yLnN0YXJ0WStyLnRvdGFsSGVpZ2h0LzItci5oZWlnaHQvMjtmb3IodmFyIGk9MTtpPG47aSsrKXt2YXIgbz1lW2ldO28uc3RhcnRZPWVbaS0xXS5zdGFydFkrZVtpLTFdLnRvdGFsSGVpZ2h0LG8ueT1vLnN0YXJ0WStvLnRvdGFsSGVpZ2h0LzItby5oZWlnaHQvMn19fX0pKSxmdW5jdGlvbiB0KGUpe3ZhciBuPWUuY2hpbGRyZW4scj1uLmxlbmd0aDtpZihyKXtuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QoZSl9KSk7dmFyIGk9blswXSxvPW5bci0xXSxhPW8ueS1pLnkrby5oZWlnaHQscz0wO2lmKG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7cys9dC50b3RhbEhlaWdodH0pKSxhPmUuaGVpZ2h0KWUueT1pLnkrYS8yLWUuaGVpZ2h0LzI7ZWxzZSBpZigxIT09bi5sZW5ndGh8fGUuaGVpZ2h0PnMpe3ZhciB1PWUueSsoZS5oZWlnaHQtYSkvMi1pLnk7bi5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnRyYW5zbGF0ZSgwLHUpfSkpfWVsc2UgZS55PShpLnkraS5oZWlnaHQvMitvLnkrby5oZWlnaHQvMikvMi1lLmhlaWdodC8yfX0odCl9fV0pfSxcIm9iamVjdFwiPT09YShlKSYmXCJvYmplY3RcIj09PWEodCk/dC5leHBvcnRzPW8oKToocj1bXSx2b2lkIDA9PT0oaT1cImZ1bmN0aW9uXCI9PXR5cGVvZihuPW8pP24uYXBwbHkoZSxyKTpuKXx8KHQuZXhwb3J0cz1pKSl9KS5jYWxsKHRoaXMsbig3MikodCkpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXQuZXhwb3J0cz17fTtmdW5jdGlvbiBvKCl7dGhyb3cgbmV3IEVycm9yKFwic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKX1mdW5jdGlvbiBhKCl7dGhyb3cgbmV3IEVycm9yKFwiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpfWZ1bmN0aW9uIHModCl7aWYobj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigobj09PW98fCFuKSYmc2V0VGltZW91dClyZXR1cm4gbj1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIG4odCwwKX1jYXRjaChlKXt0cnl7cmV0dXJuIG4uY2FsbChudWxsLHQsMCl9Y2F0Y2goZSl7cmV0dXJuIG4uY2FsbCh0aGlzLHQsMCl9fX0hZnVuY3Rpb24oKXt0cnl7bj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6b31jYXRjaCh0KXtuPW99dHJ5e3I9XCJmdW5jdGlvblwiPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDphfWNhdGNoKHQpe3I9YX19KCk7dmFyIHUsYz1bXSxmPSExLGw9LTE7ZnVuY3Rpb24gaCgpe2YmJnUmJihmPSExLHUubGVuZ3RoP2M9dS5jb25jYXQoYyk6bD0tMSxjLmxlbmd0aCYmZCgpKX1mdW5jdGlvbiBkKCl7aWYoIWYpe3ZhciB0PXMoaCk7Zj0hMDtmb3IodmFyIGU9Yy5sZW5ndGg7ZTspe2Zvcih1PWMsYz1bXTsrK2w8ZTspdSYmdVtsXS5ydW4oKTtsPS0xLGU9Yy5sZW5ndGh9dT1udWxsLGY9ITEsZnVuY3Rpb24odCl7aWYocj09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KHQpO2lmKChyPT09YXx8IXIpJiZjbGVhclRpbWVvdXQpcmV0dXJuIHI9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dCh0KTt0cnl7cih0KX1jYXRjaChlKXt0cnl7cmV0dXJuIHIuY2FsbChudWxsLHQpfWNhdGNoKGUpe3JldHVybiByLmNhbGwodGhpcyx0KX19fSh0KX19ZnVuY3Rpb24gcCh0LGUpe3RoaXMuZnVuPXQsdGhpcy5hcnJheT1lfWZ1bmN0aW9uIGcoKXt9aS5uZXh0VGljaz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW24tMV09YXJndW1lbnRzW25dO2MucHVzaChuZXcgcCh0LGUpKSwxIT09Yy5sZW5ndGh8fGZ8fHMoZCl9LHAucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9LGkudGl0bGU9XCJicm93c2VyXCIsaS5icm93c2VyPSEwLGkuZW52PXt9LGkuYXJndj1bXSxpLnZlcnNpb249XCJcIixpLnZlcnNpb25zPXt9LGkub249ZyxpLmFkZExpc3RlbmVyPWcsaS5vbmNlPWcsaS5vZmY9ZyxpLnJlbW92ZUxpc3RlbmVyPWcsaS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZyxpLmVtaXQ9ZyxpLnByZXBlbmRMaXN0ZW5lcj1nLGkucHJlcGVuZE9uY2VMaXN0ZW5lcj1nLGkubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybltdfSxpLmJpbmRpbmc9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcIil9LGkuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXCIvXCJ9LGkuY2hkaXI9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKFwicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkXCIpfSxpLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigxKSxpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLmlzR3JvdXA9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuaXNFbnRpdHlHcm91cD1mdW5jdGlvbigpe3JldHVybiExfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe2Zvcih2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpLG49dGhpcy5nZXRDaGlsZHJlbigpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtlLmFkZChpLmNsb25lKCkpfXJldHVybiBlfSxlfShuKDEzNykuYSk7ZS5hPWl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDEpLGk9bigxMzgpLG89bigzOSksYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3JldHVybiB0LmNhbGwodGhpcyxlKXx8dGhpc31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5faXNJbkJCb3g9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldEJCb3goKTtyZXR1cm4gbi5taW5YPD10JiZuLm1heFg+PXQmJm4ubWluWTw9ZSYmbi5tYXhZPj1lfSxlLnByb3RvdHlwZS5hZnRlckF0dHJzQ2hhbmdlPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmFmdGVyQXR0cnNDaGFuZ2UuY2FsbCh0aGlzLGUpLHRoaXMuY2xlYXJDYWNoZUJCb3goKX0sZS5wcm90b3R5cGUuZ2V0QkJveD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY2ZnLmJib3g7cmV0dXJuIHR8fCh0PXRoaXMuY2FsY3VsYXRlQkJveCgpLHRoaXMuc2V0KFwiYmJveFwiLHQpKSx0fSxlLnByb3RvdHlwZS5nZXRDYW52YXNCQm94PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jZmcuY2FudmFzQkJveDtyZXR1cm4gdHx8KHQ9dGhpcy5jYWxjdWxhdGVDYW52YXNCQm94KCksdGhpcy5zZXQoXCJjYW52YXNCQm94XCIsdCkpLHR9LGUucHJvdG90eXBlLmFwcGx5TWF0cml4PWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmFwcGx5TWF0cml4LmNhbGwodGhpcyxlKSx0aGlzLnNldChcImNhbnZhc0JCb3hcIixudWxsKX0sZS5wcm90b3R5cGUuY2FsY3VsYXRlQ2FudmFzQkJveD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0QkJveCgpLGU9dGhpcy5nZXRUb3RhbE1hdHJpeCgpLG49dC5taW5YLHI9dC5taW5ZLGk9dC5tYXhYLGE9dC5tYXhZO2lmKGUpe3ZhciBzPU9iamVjdChvLmMpKGUsW3QubWluWCx0Lm1pblldKSx1PU9iamVjdChvLmMpKGUsW3QubWF4WCx0Lm1pblldKSxjPU9iamVjdChvLmMpKGUsW3QubWluWCx0Lm1heFldKSxmPU9iamVjdChvLmMpKGUsW3QubWF4WCx0Lm1heFldKTtuPU1hdGgubWluKHNbMF0sdVswXSxjWzBdLGZbMF0pLGk9TWF0aC5tYXgoc1swXSx1WzBdLGNbMF0sZlswXSkscj1NYXRoLm1pbihzWzFdLHVbMV0sY1sxXSxmWzFdKSxhPU1hdGgubWF4KHNbMV0sdVsxXSxjWzFdLGZbMV0pfXZhciBsPXRoaXMuYXR0cnM7aWYobC5zaGFkb3dDb2xvcil7dmFyIGg9bC5zaGFkb3dCbHVyLGQ9dm9pZCAwPT09aD8wOmgscD1sLnNoYWRvd09mZnNldFgsZz12b2lkIDA9PT1wPzA6cCx2PWwuc2hhZG93T2Zmc2V0WSx5PXZvaWQgMD09PXY/MDp2LG09bi1kK2csYj1pK2QrZyx4PXItZCt5LHc9YStkK3k7bj1NYXRoLm1pbihuLG0pLGk9TWF0aC5tYXgoaSxiKSxyPU1hdGgubWluKHIseCksYT1NYXRoLm1heChhLHcpfXJldHVybnt4Om4seTpyLG1pblg6bixtaW5ZOnIsbWF4WDppLG1heFk6YSx3aWR0aDppLW4saGVpZ2h0OmEtcn19LGUucHJvdG90eXBlLmNsZWFyQ2FjaGVCQm94PWZ1bmN0aW9uKCl7dGhpcy5zZXQoXCJiYm94XCIsbnVsbCksdGhpcy5zZXQoXCJjYW52YXNCQm94XCIsbnVsbCl9LGUucHJvdG90eXBlLmlzQ2xpcFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwiaXNDbGlwU2hhcGVcIil9LGUucHJvdG90eXBlLmlzSW5TaGFwZT1mdW5jdGlvbih0LGUpe3JldHVybiExfSxlLnByb3RvdHlwZS5pc09ubHlIaXRCb3g9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZS5wcm90b3R5cGUuaXNIaXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldChcInN0YXJ0QXJyb3dTaGFwZVwiKSxyPXRoaXMuZ2V0KFwiZW5kQXJyb3dTaGFwZVwiKSxpPVt0LGUsMV0sbz0oaT10aGlzLmludmVydEZyb21NYXRyaXgoaSkpWzBdLGE9aVsxXSxzPXRoaXMuX2lzSW5CQm94KG8sYSk7aWYodGhpcy5pc09ubHlIaXRCb3goKSlyZXR1cm4gcztpZihzJiYhdGhpcy5pc0NsaXBwZWQobyxhKSl7aWYodGhpcy5pc0luU2hhcGUobyxhKSlyZXR1cm4hMDtpZihuJiZuLmlzSGl0KG8sYSkpcmV0dXJuITA7aWYociYmci5pc0hpdChvLGEpKXJldHVybiEwfXJldHVybiExfSxlfShpLmEpO2UuYT1hfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyODYpLGk9e307Zm9yKHZhciBvIGluIHIpci5oYXNPd25Qcm9wZXJ0eShvKSYmKGlbcltvXV09byk7dmFyIGE9dC5leHBvcnRzPXtyZ2I6e2NoYW5uZWxzOjMsbGFiZWxzOlwicmdiXCJ9LGhzbDp7Y2hhbm5lbHM6MyxsYWJlbHM6XCJoc2xcIn0saHN2OntjaGFubmVsczozLGxhYmVsczpcImhzdlwifSxod2I6e2NoYW5uZWxzOjMsbGFiZWxzOlwiaHdiXCJ9LGNteWs6e2NoYW5uZWxzOjQsbGFiZWxzOlwiY215a1wifSx4eXo6e2NoYW5uZWxzOjMsbGFiZWxzOlwieHl6XCJ9LGxhYjp7Y2hhbm5lbHM6MyxsYWJlbHM6XCJsYWJcIn0sbGNoOntjaGFubmVsczozLGxhYmVsczpcImxjaFwifSxoZXg6e2NoYW5uZWxzOjEsbGFiZWxzOltcImhleFwiXX0sa2V5d29yZDp7Y2hhbm5lbHM6MSxsYWJlbHM6W1wia2V5d29yZFwiXX0sYW5zaTE2OntjaGFubmVsczoxLGxhYmVsczpbXCJhbnNpMTZcIl19LGFuc2kyNTY6e2NoYW5uZWxzOjEsbGFiZWxzOltcImFuc2kyNTZcIl19LGhjZzp7Y2hhbm5lbHM6MyxsYWJlbHM6W1wiaFwiLFwiY1wiLFwiZ1wiXX0sYXBwbGU6e2NoYW5uZWxzOjMsbGFiZWxzOltcInIxNlwiLFwiZzE2XCIsXCJiMTZcIl19LGdyYXk6e2NoYW5uZWxzOjEsbGFiZWxzOltcImdyYXlcIl19fTtmb3IodmFyIHMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KHMpKXtpZighKFwiY2hhbm5lbHNcImluIGFbc10pKXRocm93IG5ldyBFcnJvcihcIm1pc3NpbmcgY2hhbm5lbHMgcHJvcGVydHk6IFwiK3MpO2lmKCEoXCJsYWJlbHNcImluIGFbc10pKXRocm93IG5ldyBFcnJvcihcIm1pc3NpbmcgY2hhbm5lbCBsYWJlbHMgcHJvcGVydHk6IFwiK3MpO2lmKGFbc10ubGFiZWxzLmxlbmd0aCE9PWFbc10uY2hhbm5lbHMpdGhyb3cgbmV3IEVycm9yKFwiY2hhbm5lbCBhbmQgbGFiZWwgY291bnRzIG1pc21hdGNoOiBcIitzKTt2YXIgdT1hW3NdLmNoYW5uZWxzLGM9YVtzXS5sYWJlbHM7ZGVsZXRlIGFbc10uY2hhbm5lbHMsZGVsZXRlIGFbc10ubGFiZWxzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhW3NdLFwiY2hhbm5lbHNcIix7dmFsdWU6dX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhW3NdLFwibGFiZWxzXCIse3ZhbHVlOmN9KX1hLnJnYi5oc2w9ZnVuY3Rpb24odCl7dmFyIGUsbixyPXRbMF0vMjU1LGk9dFsxXS8yNTUsbz10WzJdLzI1NSxhPU1hdGgubWluKHIsaSxvKSxzPU1hdGgubWF4KHIsaSxvKSx1PXMtYTtyZXR1cm4gcz09PWE/ZT0wOnI9PT1zP2U9KGktbykvdTppPT09cz9lPTIrKG8tcikvdTpvPT09cyYmKGU9NCsoci1pKS91KSwoZT1NYXRoLm1pbig2MCplLDM2MCkpPDAmJihlKz0zNjApLG49KGErcykvMixbZSwxMDAqKHM9PT1hPzA6bjw9LjU/dS8ocythKTp1LygyLXMtYSkpLDEwMCpuXX0sYS5yZ2IuaHN2PWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYT10WzBdLzI1NSxzPXRbMV0vMjU1LHU9dFsyXS8yNTUsYz1NYXRoLm1heChhLHMsdSksZj1jLU1hdGgubWluKGEscyx1KSxsPWZ1bmN0aW9uKHQpe3JldHVybihjLXQpLzYvZisuNX07cmV0dXJuIDA9PT1mP2k9bz0wOihvPWYvYyxlPWwoYSksbj1sKHMpLHI9bCh1KSxhPT09Yz9pPXItbjpzPT09Yz9pPTEvMytlLXI6dT09PWMmJihpPTIvMytuLWUpLGk8MD9pKz0xOmk+MSYmKGktPTEpKSxbMzYwKmksMTAwKm8sMTAwKmNdfSxhLnJnYi5od2I9ZnVuY3Rpb24odCl7dmFyIGU9dFswXSxuPXRbMV0scj10WzJdO3JldHVyblthLnJnYi5oc2wodClbMF0sMTAwKigxLzI1NSpNYXRoLm1pbihlLE1hdGgubWluKG4scikpKSwxMDAqKHI9MS0xLzI1NSpNYXRoLm1heChlLE1hdGgubWF4KG4scikpKV19LGEucmdiLmNteWs9ZnVuY3Rpb24odCl7dmFyIGUsbj10WzBdLzI1NSxyPXRbMV0vMjU1LGk9dFsyXS8yNTU7cmV0dXJuWzEwMCooKDEtbi0oZT1NYXRoLm1pbigxLW4sMS1yLDEtaSkpKS8oMS1lKXx8MCksMTAwKigoMS1yLWUpLygxLWUpfHwwKSwxMDAqKCgxLWktZSkvKDEtZSl8fDApLDEwMCplXX0sYS5yZ2Iua2V5d29yZD1mdW5jdGlvbih0KXt2YXIgZT1pW3RdO2lmKGUpcmV0dXJuIGU7dmFyIG4sbyxhLHM9MS8wO2Zvcih2YXIgdSBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkodSkpe3ZhciBjPXJbdV0sZj0obz10LGE9YyxNYXRoLnBvdyhvWzBdLWFbMF0sMikrTWF0aC5wb3cob1sxXS1hWzFdLDIpK01hdGgucG93KG9bMl0tYVsyXSwyKSk7ZjxzJiYocz1mLG49dSl9cmV0dXJuIG59LGEua2V5d29yZC5yZ2I9ZnVuY3Rpb24odCl7cmV0dXJuIHJbdF19LGEucmdiLnh5ej1mdW5jdGlvbih0KXt2YXIgZT10WzBdLzI1NSxuPXRbMV0vMjU1LHI9dFsyXS8yNTU7cmV0dXJuWzEwMCooLjQxMjQqKGU9ZT4uMDQwNDU/TWF0aC5wb3coKGUrLjA1NSkvMS4wNTUsMi40KTplLzEyLjkyKSsuMzU3Nioobj1uPi4wNDA0NT9NYXRoLnBvdygobisuMDU1KS8xLjA1NSwyLjQpOm4vMTIuOTIpKy4xODA1KihyPXI+LjA0MDQ1P01hdGgucG93KChyKy4wNTUpLzEuMDU1LDIuNCk6ci8xMi45MikpLDEwMCooLjIxMjYqZSsuNzE1MipuKy4wNzIyKnIpLDEwMCooLjAxOTMqZSsuMTE5MipuKy45NTA1KnIpXX0sYS5yZ2IubGFiPWZ1bmN0aW9uKHQpe3ZhciBlPWEucmdiLnh5eih0KSxuPWVbMF0scj1lWzFdLGk9ZVsyXTtyZXR1cm4gci89MTAwLGkvPTEwOC44ODMsbj0obi89OTUuMDQ3KT4uMDA4ODU2P01hdGgucG93KG4sMS8zKTo3Ljc4NypuKzE2LzExNixbMTE2KihyPXI+LjAwODg1Nj9NYXRoLnBvdyhyLDEvMyk6Ny43ODcqcisxNi8xMTYpLTE2LDUwMCoobi1yKSwyMDAqKHItKGk9aT4uMDA4ODU2P01hdGgucG93KGksMS8zKTo3Ljc4NyppKzE2LzExNikpXX0sYS5oc2wucmdiPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYT10WzBdLzM2MCxzPXRbMV0vMTAwLHU9dFsyXS8xMDA7aWYoMD09PXMpcmV0dXJuW289MjU1KnUsbyxvXTtlPTIqdS0obj11PC41P3UqKDErcyk6dStzLXUqcyksaT1bMCwwLDBdO2Zvcih2YXIgYz0wO2M8MztjKyspKHI9YSsxLzMqLShjLTEpKTwwJiZyKysscj4xJiZyLS0sbz02KnI8MT9lKzYqKG4tZSkqcjoyKnI8MT9uOjMqcjwyP2UrKG4tZSkqKDIvMy1yKSo2OmUsaVtjXT0yNTUqbztyZXR1cm4gaX0sYS5oc2wuaHN2PWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0sbj10WzFdLzEwMCxyPXRbMl0vMTAwLGk9bixvPU1hdGgubWF4KHIsLjAxKTtyZXR1cm4gbio9KHIqPTIpPD0xP3I6Mi1yLGkqPW88PTE/bzoyLW8sW2UsMTAwKigwPT09cj8yKmkvKG8raSk6MipuLyhyK24pKSwxMDAqKChyK24pLzIpXX0sYS5oc3YucmdiPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0vNjAsbj10WzFdLzEwMCxyPXRbMl0vMTAwLGk9TWF0aC5mbG9vcihlKSU2LG89ZS1NYXRoLmZsb29yKGUpLGE9MjU1KnIqKDEtbikscz0yNTUqciooMS1uKm8pLHU9MjU1KnIqKDEtbiooMS1vKSk7c3dpdGNoKHIqPTI1NSxpKXtjYXNlIDA6cmV0dXJuW3IsdSxhXTtjYXNlIDE6cmV0dXJuW3MscixhXTtjYXNlIDI6cmV0dXJuW2Escix1XTtjYXNlIDM6cmV0dXJuW2EscyxyXTtjYXNlIDQ6cmV0dXJuW3UsYSxyXTtjYXNlIDU6cmV0dXJuW3IsYSxzXX19LGEuaHN2LmhzbD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaT10WzBdLG89dFsxXS8xMDAsYT10WzJdLzEwMCxzPU1hdGgubWF4KGEsLjAxKTtyZXR1cm4gcj0oMi1vKSphLG49bypzLFtpLDEwMCoobj0obi89KGU9KDItbykqcyk8PTE/ZToyLWUpfHwwKSwxMDAqKHIvPTIpXX0sYS5od2IucmdiPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYSxzLHU9dFswXS8zNjAsYz10WzFdLzEwMCxmPXRbMl0vMTAwLGw9YytmO3N3aXRjaChsPjEmJihjLz1sLGYvPWwpLHI9Nip1LShlPU1hdGguZmxvb3IoNip1KSksMCE9KDEmZSkmJihyPTEtciksaT1jK3IqKChuPTEtZiktYyksZSl7ZGVmYXVsdDpjYXNlIDY6Y2FzZSAwOm89bixhPWkscz1jO2JyZWFrO2Nhc2UgMTpvPWksYT1uLHM9YzticmVhaztjYXNlIDI6bz1jLGE9bixzPWk7YnJlYWs7Y2FzZSAzOm89YyxhPWkscz1uO2JyZWFrO2Nhc2UgNDpvPWksYT1jLHM9bjticmVhaztjYXNlIDU6bz1uLGE9YyxzPWl9cmV0dXJuWzI1NSpvLDI1NSphLDI1NSpzXX0sYS5jbXlrLnJnYj1mdW5jdGlvbih0KXt2YXIgZT10WzBdLzEwMCxuPXRbMV0vMTAwLHI9dFsyXS8xMDAsaT10WzNdLzEwMDtyZXR1cm5bMjU1KigxLU1hdGgubWluKDEsZSooMS1pKStpKSksMjU1KigxLU1hdGgubWluKDEsbiooMS1pKStpKSksMjU1KigxLU1hdGgubWluKDEsciooMS1pKStpKSldfSxhLnh5ei5yZ2I9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGk9dFswXS8xMDAsbz10WzFdLzEwMCxhPXRbMl0vMTAwO3JldHVybiBuPS0uOTY4OSppKzEuODc1OCpvKy4wNDE1KmEscj0uMDU1NyppKy0uMjA0Km8rMS4wNTcqYSxlPShlPTMuMjQwNippKy0xLjUzNzIqbystLjQ5ODYqYSk+LjAwMzEzMDg/MS4wNTUqTWF0aC5wb3coZSwxLzIuNCktLjA1NToxMi45MiplLG49bj4uMDAzMTMwOD8xLjA1NSpNYXRoLnBvdyhuLDEvMi40KS0uMDU1OjEyLjkyKm4scj1yPi4wMDMxMzA4PzEuMDU1Kk1hdGgucG93KHIsMS8yLjQpLS4wNTU6MTIuOTIqcixbMjU1KihlPU1hdGgubWluKE1hdGgubWF4KDAsZSksMSkpLDI1NSoobj1NYXRoLm1pbihNYXRoLm1heCgwLG4pLDEpKSwyNTUqKHI9TWF0aC5taW4oTWF0aC5tYXgoMCxyKSwxKSldfSxhLnh5ei5sYWI9ZnVuY3Rpb24odCl7dmFyIGU9dFswXSxuPXRbMV0scj10WzJdO3JldHVybiBuLz0xMDAsci89MTA4Ljg4MyxlPShlLz05NS4wNDcpPi4wMDg4NTY/TWF0aC5wb3coZSwxLzMpOjcuNzg3KmUrMTYvMTE2LFsxMTYqKG49bj4uMDA4ODU2P01hdGgucG93KG4sMS8zKTo3Ljc4NypuKzE2LzExNiktMTYsNTAwKihlLW4pLDIwMCoobi0ocj1yPi4wMDg4NTY/TWF0aC5wb3cociwxLzMpOjcuNzg3KnIrMTYvMTE2KSldfSxhLmxhYi54eXo9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGk9dFswXTtlPXRbMV0vNTAwKyhuPShpKzE2KS8xMTYpLHI9bi10WzJdLzIwMDt2YXIgbz1NYXRoLnBvdyhuLDMpLGE9TWF0aC5wb3coZSwzKSxzPU1hdGgucG93KHIsMyk7cmV0dXJuIG49bz4uMDA4ODU2P286KG4tMTYvMTE2KS83Ljc4NyxlPWE+LjAwODg1Nj9hOihlLTE2LzExNikvNy43ODcscj1zPi4wMDg4NTY/czooci0xNi8xMTYpLzcuNzg3LFtlKj05NS4wNDcsbio9MTAwLHIqPTEwOC44ODNdfSxhLmxhYi5sY2g9ZnVuY3Rpb24odCl7dmFyIGUsbj10WzBdLHI9dFsxXSxpPXRbMl07cmV0dXJuKGU9MzYwKk1hdGguYXRhbjIoaSxyKS8yL01hdGguUEkpPDAmJihlKz0zNjApLFtuLE1hdGguc3FydChyKnIraSppKSxlXX0sYS5sY2gubGFiPWZ1bmN0aW9uKHQpe3ZhciBlLG49dFswXSxyPXRbMV07cmV0dXJuIGU9dFsyXS8zNjAqMipNYXRoLlBJLFtuLHIqTWF0aC5jb3MoZSkscipNYXRoLnNpbihlKV19LGEucmdiLmFuc2kxNj1mdW5jdGlvbih0KXt2YXIgZT10WzBdLG49dFsxXSxyPXRbMl0saT0xIGluIGFyZ3VtZW50cz9hcmd1bWVudHNbMV06YS5yZ2IuaHN2KHQpWzJdO2lmKDA9PT0oaT1NYXRoLnJvdW5kKGkvNTApKSlyZXR1cm4gMzA7dmFyIG89MzArKE1hdGgucm91bmQoci8yNTUpPDwyfE1hdGgucm91bmQobi8yNTUpPDwxfE1hdGgucm91bmQoZS8yNTUpKTtyZXR1cm4gMj09PWkmJihvKz02MCksb30sYS5oc3YuYW5zaTE2PWZ1bmN0aW9uKHQpe3JldHVybiBhLnJnYi5hbnNpMTYoYS5oc3YucmdiKHQpLHRbMl0pfSxhLnJnYi5hbnNpMjU2PWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0sbj10WzFdLHI9dFsyXTtyZXR1cm4gZT09PW4mJm49PT1yP2U8OD8xNjplPjI0OD8yMzE6TWF0aC5yb3VuZCgoZS04KS8yNDcqMjQpKzIzMjoxNiszNipNYXRoLnJvdW5kKGUvMjU1KjUpKzYqTWF0aC5yb3VuZChuLzI1NSo1KStNYXRoLnJvdW5kKHIvMjU1KjUpfSxhLmFuc2kxNi5yZ2I9ZnVuY3Rpb24odCl7dmFyIGU9dCUxMDtpZigwPT09ZXx8Nz09PWUpcmV0dXJuIHQ+NTAmJihlKz0zLjUpLFtlPWUvMTAuNSoyNTUsZSxlXTt2YXIgbj0uNSooMSt+fih0PjUwKSk7cmV0dXJuWygxJmUpKm4qMjU1LChlPj4xJjEpKm4qMjU1LChlPj4yJjEpKm4qMjU1XX0sYS5hbnNpMjU2LnJnYj1mdW5jdGlvbih0KXtpZih0Pj0yMzIpe3ZhciBlPTEwKih0LTIzMikrODtyZXR1cm5bZSxlLGVdfXZhciBuO3JldHVybiB0LT0xNixbTWF0aC5mbG9vcih0LzM2KS81KjI1NSxNYXRoLmZsb29yKChuPXQlMzYpLzYpLzUqMjU1LG4lNi81KjI1NV19LGEucmdiLmhleD1mdW5jdGlvbih0KXt2YXIgZT0oKCgyNTUmTWF0aC5yb3VuZCh0WzBdKSk8PDE2KSsoKDI1NSZNYXRoLnJvdW5kKHRbMV0pKTw8OCkrKDI1NSZNYXRoLnJvdW5kKHRbMl0pKSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7cmV0dXJuXCIwMDAwMDBcIi5zdWJzdHJpbmcoZS5sZW5ndGgpK2V9LGEuaGV4LnJnYj1mdW5jdGlvbih0KXt2YXIgZT10LnRvU3RyaW5nKDE2KS5tYXRjaCgvW2EtZjAtOV17Nn18W2EtZjAtOV17M30vaSk7aWYoIWUpcmV0dXJuWzAsMCwwXTt2YXIgbj1lWzBdOzM9PT1lWzBdLmxlbmd0aCYmKG49bi5zcGxpdChcIlwiKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0K3R9KSkuam9pbihcIlwiKSk7dmFyIHI9cGFyc2VJbnQobiwxNik7cmV0dXJuW3I+PjE2JjI1NSxyPj44JjI1NSwyNTUmcl19LGEucmdiLmhjZz1mdW5jdGlvbih0KXt2YXIgZSxuPXRbMF0vMjU1LHI9dFsxXS8yNTUsaT10WzJdLzI1NSxvPU1hdGgubWF4KE1hdGgubWF4KG4sciksaSksYT1NYXRoLm1pbihNYXRoLm1pbihuLHIpLGkpLHM9by1hO3JldHVybiBlPXM8PTA/MDpvPT09bj8oci1pKS9zJTY6bz09PXI/MisoaS1uKS9zOjQrKG4tcikvcys0LGUvPTYsWzM2MCooZSU9MSksMTAwKnMsMTAwKihzPDE/YS8oMS1zKTowKV19LGEuaHNsLmhjZz1mdW5jdGlvbih0KXt2YXIgZT10WzFdLzEwMCxuPXRbMl0vMTAwLHI9MSxpPTA7cmV0dXJuKHI9bjwuNT8yKmUqbjoyKmUqKDEtbikpPDEmJihpPShuLS41KnIpLygxLXIpKSxbdFswXSwxMDAqciwxMDAqaV19LGEuaHN2LmhjZz1mdW5jdGlvbih0KXt2YXIgZT10WzFdLzEwMCxuPXRbMl0vMTAwLHI9ZSpuLGk9MDtyZXR1cm4gcjwxJiYoaT0obi1yKS8oMS1yKSksW3RbMF0sMTAwKnIsMTAwKmldfSxhLmhjZy5yZ2I9ZnVuY3Rpb24odCl7dmFyIGU9dFswXS8zNjAsbj10WzFdLzEwMCxyPXRbMl0vMTAwO2lmKDA9PT1uKXJldHVyblsyNTUqciwyNTUqciwyNTUqcl07dmFyIGksbz1bMCwwLDBdLGE9ZSUxKjYscz1hJTEsdT0xLXM7c3dpdGNoKE1hdGguZmxvb3IoYSkpe2Nhc2UgMDpvWzBdPTEsb1sxXT1zLG9bMl09MDticmVhaztjYXNlIDE6b1swXT11LG9bMV09MSxvWzJdPTA7YnJlYWs7Y2FzZSAyOm9bMF09MCxvWzFdPTEsb1syXT1zO2JyZWFrO2Nhc2UgMzpvWzBdPTAsb1sxXT11LG9bMl09MTticmVhaztjYXNlIDQ6b1swXT1zLG9bMV09MCxvWzJdPTE7YnJlYWs7ZGVmYXVsdDpvWzBdPTEsb1sxXT0wLG9bMl09dX1yZXR1cm4gaT0oMS1uKSpyLFsyNTUqKG4qb1swXStpKSwyNTUqKG4qb1sxXStpKSwyNTUqKG4qb1syXStpKV19LGEuaGNnLmhzdj1mdW5jdGlvbih0KXt2YXIgZT10WzFdLzEwMCxuPWUrdFsyXS8xMDAqKDEtZSkscj0wO3JldHVybiBuPjAmJihyPWUvbiksW3RbMF0sMTAwKnIsMTAwKm5dfSxhLmhjZy5oc2w9ZnVuY3Rpb24odCl7dmFyIGU9dFsxXS8xMDAsbj10WzJdLzEwMCooMS1lKSsuNSplLHI9MDtyZXR1cm4gbj4wJiZuPC41P3I9ZS8oMipuKTpuPj0uNSYmbjwxJiYocj1lLygyKigxLW4pKSksW3RbMF0sMTAwKnIsMTAwKm5dfSxhLmhjZy5od2I9ZnVuY3Rpb24odCl7dmFyIGU9dFsxXS8xMDAsbj1lK3RbMl0vMTAwKigxLWUpO3JldHVyblt0WzBdLDEwMCoobi1lKSwxMDAqKDEtbildfSxhLmh3Yi5oY2c9ZnVuY3Rpb24odCl7dmFyIGU9dFsxXS8xMDAsbj0xLXRbMl0vMTAwLHI9bi1lLGk9MDtyZXR1cm4gcjwxJiYoaT0obi1yKS8oMS1yKSksW3RbMF0sMTAwKnIsMTAwKmldfSxhLmFwcGxlLnJnYj1mdW5jdGlvbih0KXtyZXR1cm5bdFswXS82NTUzNSoyNTUsdFsxXS82NTUzNSoyNTUsdFsyXS82NTUzNSoyNTVdfSxhLnJnYi5hcHBsZT1mdW5jdGlvbih0KXtyZXR1cm5bdFswXS8yNTUqNjU1MzUsdFsxXS8yNTUqNjU1MzUsdFsyXS8yNTUqNjU1MzVdfSxhLmdyYXkucmdiPWZ1bmN0aW9uKHQpe3JldHVyblt0WzBdLzEwMCoyNTUsdFswXS8xMDAqMjU1LHRbMF0vMTAwKjI1NV19LGEuZ3JheS5oc2w9YS5ncmF5Lmhzdj1mdW5jdGlvbih0KXtyZXR1cm5bMCwwLHRbMF1dfSxhLmdyYXkuaHdiPWZ1bmN0aW9uKHQpe3JldHVyblswLDEwMCx0WzBdXX0sYS5ncmF5LmNteWs9ZnVuY3Rpb24odCl7cmV0dXJuWzAsMCwwLHRbMF1dfSxhLmdyYXkubGFiPWZ1bmN0aW9uKHQpe3JldHVyblt0WzBdLDAsMF19LGEuZ3JheS5oZXg9ZnVuY3Rpb24odCl7dmFyIGU9MjU1Jk1hdGgucm91bmQodFswXS8xMDAqMjU1KSxuPSgoZTw8MTYpKyhlPDw4KStlKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtyZXR1cm5cIjAwMDAwMFwiLnN1YnN0cmluZyhuLmxlbmd0aCkrbn0sYS5yZ2IuZ3JheT1mdW5jdGlvbih0KXtyZXR1cm5bKHRbMF0rdFsxXSt0WzJdKS8zLzI1NSoxMDBdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOTcpLGk9bigxNDUpLG89bigxMDIpLGE9bigzMTkpLHM9bigzMjUpLHU9bigxODQpLGM9bigxODUpLGY9bigzMjgpLGw9bigzMjkpLGg9bigxODkpLGQ9bigzMzApLHA9big3NiksZz1uKDMzNCksdj1uKDMzNSkseT1uKDE5NCksbT1uKDI5KSxiPW4oNzUpLHg9bigzMzkpLHc9big0MyksUz1uKDM0MSksRT1uKDYwKSxfPW4oNjYpLE89e307T1tcIltvYmplY3QgQXJndW1lbnRzXVwiXT1PW1wiW29iamVjdCBBcnJheV1cIl09T1tcIltvYmplY3QgQXJyYXlCdWZmZXJdXCJdPU9bXCJbb2JqZWN0IERhdGFWaWV3XVwiXT1PW1wiW29iamVjdCBCb29sZWFuXVwiXT1PW1wiW29iamVjdCBEYXRlXVwiXT1PW1wiW29iamVjdCBGbG9hdDMyQXJyYXldXCJdPU9bXCJbb2JqZWN0IEZsb2F0NjRBcnJheV1cIl09T1tcIltvYmplY3QgSW50OEFycmF5XVwiXT1PW1wiW29iamVjdCBJbnQxNkFycmF5XVwiXT1PW1wiW29iamVjdCBJbnQzMkFycmF5XVwiXT1PW1wiW29iamVjdCBNYXBdXCJdPU9bXCJbb2JqZWN0IE51bWJlcl1cIl09T1tcIltvYmplY3QgT2JqZWN0XVwiXT1PW1wiW29iamVjdCBSZWdFeHBdXCJdPU9bXCJbb2JqZWN0IFNldF1cIl09T1tcIltvYmplY3QgU3RyaW5nXVwiXT1PW1wiW29iamVjdCBTeW1ib2xdXCJdPU9bXCJbb2JqZWN0IFVpbnQ4QXJyYXldXCJdPU9bXCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XVwiXT1PW1wiW29iamVjdCBVaW50MTZBcnJheV1cIl09T1tcIltvYmplY3QgVWludDMyQXJyYXldXCJdPSEwLE9bXCJbb2JqZWN0IEVycm9yXVwiXT1PW1wiW29iamVjdCBGdW5jdGlvbl1cIl09T1tcIltvYmplY3QgV2Vha01hcF1cIl09ITEsdC5leHBvcnRzPWZ1bmN0aW9uIHQoZSxuLGssTSxBLFQpe3ZhciBDLEk9MSZuLFA9MiZuLGo9NCZuO2lmKGsmJihDPUE/ayhlLE0sQSxUKTprKGUpKSx2b2lkIDAhPT1DKXJldHVybiBDO2lmKCF3KGUpKXJldHVybiBlO3ZhciBEPW0oZSk7aWYoRCl7aWYoQz1nKGUpLCFJKXJldHVybiBjKGUsQyl9ZWxzZXt2YXIgTj1wKGUpLFI9XCJbb2JqZWN0IEZ1bmN0aW9uXVwiPT1OfHxcIltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dXCI9PU47aWYoYihlKSlyZXR1cm4gdShlLEkpO2lmKFwiW29iamVjdCBPYmplY3RdXCI9PU58fFwiW29iamVjdCBBcmd1bWVudHNdXCI9PU58fFImJiFBKXtpZihDPVB8fFI/e306eShlKSwhSSlyZXR1cm4gUD9sKGUscyhDLGUpKTpmKGUsYShDLGUpKX1lbHNle2lmKCFPW05dKXJldHVybiBBP2U6e307Qz12KGUsTixJKX19VHx8KFQ9bmV3IHIpO3ZhciBMPVQuZ2V0KGUpO2lmKEwpcmV0dXJuIEw7VC5zZXQoZSxDKSxTKGUpP2UuZm9yRWFjaCgoZnVuY3Rpb24ocil7Qy5hZGQodChyLG4sayxyLGUsVCkpfSkpOngoZSkmJmUuZm9yRWFjaCgoZnVuY3Rpb24ocixpKXtDLnNldChpLHQocixuLGssaSxlLFQpKX0pKTt2YXIgQj1EP3ZvaWQgMDooaj9QP2Q6aDpQP186RSkoZSk7cmV0dXJuIGkoQnx8ZSwoZnVuY3Rpb24ocixpKXtCJiYocj1lW2k9cl0pLG8oQyxpLHQocixuLGssaSxlLFQpKX0pKSxDfX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQpe3JldHVybihuPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX12YXIgcj1cIm9iamVjdFwiPT0odm9pZCAwPT09ZT9cInVuZGVmaW5lZFwiOm4oZSkpJiZlJiZlLk9iamVjdD09PU9iamVjdCYmZTt0LmV4cG9ydHM9cn0pLmNhbGwodGhpcyxuKDE3OSkpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKG49XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfXZhciByO3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7cj1yfHxuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpfWNhdGNoKHQpe1wib2JqZWN0XCI9PT0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIHdpbmRvdz9cInVuZGVmaW5lZFwiOm4od2luZG93KSkmJihyPXdpbmRvdyl9dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIG4uY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0K1wiXCJ9Y2F0Y2godCl7fX1yZXR1cm5cIlwifX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjUpLGk9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9cihPYmplY3QsXCJkZWZpbmVQcm9wZXJ0eVwiKTtyZXR1cm4gdCh7fSxcIlwiLHt9KSx0fWNhdGNoKHQpe319KCk7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyMCksaT1uKDg4KSxvPW4oMjkpLGE9big3NSkscz1uKDEwNCksdT1uKDMyKSxjPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49byh0KSxmPSFuJiZpKHQpLGw9IW4mJiFmJiZhKHQpLGg9IW4mJiFmJiYhbCYmdSh0KSxkPW58fGZ8fGx8fGgscD1kP3IodC5sZW5ndGgsU3RyaW5nKTpbXSxnPXAubGVuZ3RoO2Zvcih2YXIgdiBpbiB0KSFlJiYhYy5jYWxsKHQsdil8fGQmJihcImxlbmd0aFwiPT12fHxsJiYoXCJvZmZzZXRcIj09dnx8XCJwYXJlbnRcIj09dil8fGgmJihcImJ1ZmZlclwiPT12fHxcImJ5dGVMZW5ndGhcIj09dnx8XCJieXRlT2Zmc2V0XCI9PXYpfHxzKHYsZykpfHxwLnB1c2godik7cmV0dXJuIHB9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIodCl7cmV0dXJuKHI9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfXZhciBpPW4oNDUpLG89XCJvYmplY3RcIj09cihlKSYmZSYmIWUubm9kZVR5cGUmJmUsYT1vJiZcIm9iamVjdFwiPT1yKHQpJiZ0JiYhdC5ub2RlVHlwZSYmdCxzPWEmJmEuZXhwb3J0cz09PW8/aS5CdWZmZXI6dm9pZCAwLHU9cz9zLmFsbG9jVW5zYWZlOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihlKXJldHVybiB0LnNsaWNlKCk7dmFyIG49dC5sZW5ndGgscj11P3Uobik6bmV3IHQuY29uc3RydWN0b3Iobik7cmV0dXJuIHQuY29weShyKSxyfX0pLmNhbGwodGhpcyxuKDcyKSh0KSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9QXJyYXkocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBhPXRbbl07ZShhLG4sdCkmJihvW2krK109YSl9cmV0dXJuIG99fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybltdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUwKSxpPW4oMTA3KSxvPW4oMTQ5KSxhPW4oMTg3KSxzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KXIoZSxvKHQpKSx0PWkodCk7cmV0dXJuIGV9OmE7dC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE5MCksaT1uKDE0OSksbz1uKDYwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxvLGkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUwKSxpPW4oMjkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIG89ZSh0KTtyZXR1cm4gaSh0KT9vOnIobyxuKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KShuKDQ1KSxcIlNldFwiKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDUpLlVpbnQ4QXJyYXk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZT9yKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTk1KSxpPW4oMTA3KSxvPW4oMTA2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuXCJmdW5jdGlvblwiIT10eXBlb2YgdC5jb25zdHJ1Y3Rvcnx8byh0KT97fTpyKGkodCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDMpLGk9T2JqZWN0LmNyZWF0ZSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gZnVuY3Rpb24oZSl7aWYoIXIoZSkpcmV0dXJue307aWYoaSlyZXR1cm4gaShlKTt0LnByb3RvdHlwZT1lO3ZhciBuPW5ldyB0O3JldHVybiB0LnByb3RvdHlwZT12b2lkIDAsbn19KCk7dC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxOTcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDUpLGk9bigxMDgpLG89bigxOTgpLGE9bigyOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGEodCk/cjppKSh0LG8oZSkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3Q6cn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4NiksaT1uKDM0NSksbz1uKDU1KSxhPW4oMjkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybihhKHQpP3I6aSkodCxvKGUsMykpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzQ4KSxpPW4oNDYpO3QuZXhwb3J0cz1mdW5jdGlvbiB0KGUsbixvLGEscyl7cmV0dXJuIGU9PT1ufHwobnVsbD09ZXx8bnVsbD09bnx8IWkoZSkmJiFpKG4pP2UhPWUmJm4hPW46cihlLG4sbyxhLHQscykpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjAyKSxpPW4oMzUxKSxvPW4oMjAzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sYSxzLHUpe3ZhciBjPTEmbixmPXQubGVuZ3RoLGw9ZS5sZW5ndGg7aWYoZiE9bCYmIShjJiZsPmYpKXJldHVybiExO3ZhciBoPXUuZ2V0KHQpLGQ9dS5nZXQoZSk7aWYoaCYmZClyZXR1cm4gaD09ZSYmZD09dDt2YXIgcD0tMSxnPSEwLHY9MiZuP25ldyByOnZvaWQgMDtmb3IodS5zZXQodCxlKSx1LnNldChlLHQpOysrcDxmOyl7dmFyIHk9dFtwXSxtPWVbcF07aWYoYSl2YXIgYj1jP2EobSx5LHAsZSx0LHUpOmEoeSxtLHAsdCxlLHUpO2lmKHZvaWQgMCE9PWIpe2lmKGIpY29udGludWU7Zz0hMTticmVha31pZih2KXtpZighaShlLChmdW5jdGlvbih0LGUpe2lmKCFvKHYsZSkmJih5PT09dHx8cyh5LHQsbixhLHUpKSlyZXR1cm4gdi5wdXNoKGUpfSkpKXtnPSExO2JyZWFrfX1lbHNlIGlmKHkhPT1tJiYhcyh5LG0sbixhLHUpKXtnPSExO2JyZWFrfX1yZXR1cm4gdS5kZWxldGUodCksdS5kZWxldGUoZSksZ319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0NCksaT1uKDM0OSksbz1uKDM1MCk7ZnVuY3Rpb24gYSh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgcjsrK2U8bjspdGhpcy5hZGQodFtlXSl9YS5wcm90b3R5cGUuYWRkPWEucHJvdG90eXBlLnB1c2g9aSxhLnByb3RvdHlwZS5oYXM9byx0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5oYXMoZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PT10JiYhcih0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBudWxsIT1uJiYoblt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChuKSkpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM2MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1wiXCI6cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM2MiksaT1uKDIwOCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJmkodCxlLHIpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEwKSxpPW4oODgpLG89bigyOSksYT1uKDEwNCkscz1uKDE0NiksdT1uKDg5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgYz0tMSxmPShlPXIoZSx0KSkubGVuZ3RoLGw9ITE7KytjPGY7KXt2YXIgaD11KGVbY10pO2lmKCEobD1udWxsIT10JiZuKHQsaCkpKWJyZWFrO3Q9dFtoXX1yZXR1cm4gbHx8KytjIT1mP2w6ISEoZj1udWxsPT10PzA6dC5sZW5ndGgpJiZzKGYpJiZhKGgsZikmJihvKHQpfHxpKHQpKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNjUpLGk9bigyMDgpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZpKHQsZSxyKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTExKSxpPW4oNTUpLG89bigyMTMpLGE9bigyOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGEodCk/cjpvKSh0LGkoZSwzKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDgpLGk9big1NCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49LTEsbz1pKHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gcih0LChmdW5jdGlvbih0LHIsaSl7b1srK25dPWUodCxyLGkpfSkpLG99fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNjcpLGk9bigxMDgpLG89big1NSksYT1uKDM2OCkscz1uKDI5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciB1PXModCk/cjphLGM9YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiB1KHQsbyhlLDQpLG4sYyxpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM3OCksaT1NYXRoLm1heDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlPWkodm9pZCAwPT09ZT90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIG89YXJndW1lbnRzLGE9LTEscz1pKG8ubGVuZ3RoLWUsMCksdT1BcnJheShzKTsrK2E8czspdVthXT1vW2UrYV07YT0tMTtmb3IodmFyIGM9QXJyYXkoZSsxKTsrK2E8ZTspY1thXT1vW2FdO3JldHVybiBjW2VdPW4odSkscih0LHRoaXMsYyl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzc5KSxpPW4oMzgwKShyKTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjAyKSxpPW4oMzgxKSxvPW4oMzg1KSxhPW4oMjAzKSxzPW4oMzg2KSx1PW4oMTU1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBjPS0xLGY9aSxsPXQubGVuZ3RoLGg9ITAsZD1bXSxwPWQ7aWYobiloPSExLGY9bztlbHNlIGlmKGw+PTIwMCl7dmFyIGc9ZT9udWxsOnModCk7aWYoZylyZXR1cm4gdShnKTtoPSExLGY9YSxwPW5ldyByfWVsc2UgcD1lP1tdOmQ7dDpmb3IoOysrYzxsOyl7dmFyIHY9dFtjXSx5PWU/ZSh2KTp2O2lmKHY9bnx8MCE9PXY/djowLGgmJnk9PXkpe2Zvcih2YXIgbT1wLmxlbmd0aDttLS07KWlmKHBbbV09PT15KWNvbnRpbnVlIHQ7ZSYmcC5wdXNoKHkpLGQucHVzaCh2KX1lbHNlIGYocCx5LG4pfHwocCE9PWQmJnAucHVzaCh5KSxkLnB1c2godikpfXJldHVybiBkfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPXQubGVuZ3RoLG89bisocj8xOi0xKTtyP28tLTorK288aTspaWYoZSh0W29dLG8sdCkpcmV0dXJuIG87cmV0dXJuLTF9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1NCksaT1uKDQ2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCkmJnIodCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzODgpLGk9big2MCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOnIodCxpKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQyKSxpPW4oMjIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGEscz17fSx1PW5ldyBpLGM9ZnVuY3Rpb24odCl7dmFyIGU9dC52IT09bz90LnY6dC53LHI9c1tlXSxpPW4odCksYz1hLmRpc3RhbmNlK2k7aWYoaTwwKXRocm93IG5ldyBFcnJvcihcImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gQmFkIGVkZ2U6IFwiK3QrXCIgV2VpZ2h0OiBcIitpKTtjPHIuZGlzdGFuY2UmJihyLmRpc3RhbmNlPWMsci5wcmVkZWNlc3Nvcj1vLHUuZGVjcmVhc2UoZSxjKSl9O3Qubm9kZXMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10PT09ZT8wOk51bWJlci5QT1NJVElWRV9JTkZJTklUWTtzW3RdPXtkaXN0YW5jZTpufSx1LmFkZCh0LG4pfSkpO2Zvcig7dS5zaXplKCk+MCYmKG89dS5yZW1vdmVNaW4oKSwoYT1zW29dKS5kaXN0YW5jZSE9PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7KXIobykuZm9yRWFjaChjKTtyZXR1cm4gc30odCxTdHJpbmcoZSksbnx8byxyfHxmdW5jdGlvbihlKXtyZXR1cm4gdC5vdXRFZGdlcyhlKX0pfTt2YXIgbz1yLmNvbnN0YW50KDEpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Mik7ZnVuY3Rpb24gaSgpe3RoaXMuX2Fycj1bXSx0aGlzLl9rZXlJbmRpY2VzPXt9fXQuZXhwb3J0cz1pLGkucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLmxlbmd0aH0saS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXl9KSl9LGkucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gci5oYXModGhpcy5fa2V5SW5kaWNlcyx0KX0saS5wcm90b3R5cGUucHJpb3JpdHk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fa2V5SW5kaWNlc1t0XTtpZih2b2lkIDAhPT1lKXJldHVybiB0aGlzLl9hcnJbZV0ucHJpb3JpdHl9LGkucHJvdG90eXBlLm1pbj1mdW5jdGlvbigpe2lmKDA9PT10aGlzLnNpemUoKSl0aHJvdyBuZXcgRXJyb3IoXCJRdWV1ZSB1bmRlcmZsb3dcIik7cmV0dXJuIHRoaXMuX2FyclswXS5rZXl9LGkucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2tleUluZGljZXM7aWYodD1TdHJpbmcodCksIXIuaGFzKG4sdCkpe3ZhciBpPXRoaXMuX2FycixvPWkubGVuZ3RoO3JldHVybiBuW3RdPW8saS5wdXNoKHtrZXk6dCxwcmlvcml0eTplfSksdGhpcy5fZGVjcmVhc2UobyksITB9cmV0dXJuITF9LGkucHJvdG90eXBlLnJlbW92ZU1pbj1mdW5jdGlvbigpe3RoaXMuX3N3YXAoMCx0aGlzLl9hcnIubGVuZ3RoLTEpO3ZhciB0PXRoaXMuX2Fyci5wb3AoKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2tleUluZGljZXNbdC5rZXldLHRoaXMuX2hlYXBpZnkoMCksdC5rZXl9LGkucHJvdG90eXBlLmRlY3JlYXNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fa2V5SW5kaWNlc1t0XTtpZihlPnRoaXMuX2FycltuXS5wcmlvcml0eSl0aHJvdyBuZXcgRXJyb3IoXCJOZXcgcHJpb3JpdHkgaXMgZ3JlYXRlciB0aGFuIGN1cnJlbnQgcHJpb3JpdHkuIEtleTogXCIrdCtcIiBPbGQ6IFwiK3RoaXMuX2FycltuXS5wcmlvcml0eStcIiBOZXc6IFwiK2UpO3RoaXMuX2FycltuXS5wcmlvcml0eT1lLHRoaXMuX2RlY3JlYXNlKG4pfSxpLnByb3RvdHlwZS5faGVhcGlmeT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9hcnIsbj0yKnQscj1uKzEsaT10O248ZS5sZW5ndGgmJihpPWVbbl0ucHJpb3JpdHk8ZVtpXS5wcmlvcml0eT9uOmkscjxlLmxlbmd0aCYmKGk9ZVtyXS5wcmlvcml0eTxlW2ldLnByaW9yaXR5P3I6aSksaSE9PXQmJih0aGlzLl9zd2FwKHQsaSksdGhpcy5faGVhcGlmeShpKSkpfSxpLnByb3RvdHlwZS5fZGVjcmVhc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dGhpcy5fYXJyLHI9blt0XS5wcmlvcml0eTswIT09dCYmIShuW2U9dD4+MV0ucHJpb3JpdHk8cik7KXRoaXMuX3N3YXAodCxlKSx0PWV9LGkucHJvdG90eXBlLl9zd2FwPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYXJyLHI9dGhpcy5fa2V5SW5kaWNlcyxpPW5bdF0sbz1uW2VdO25bdF09byxuW2VdPWkscltvLmtleV09dCxyW2kua2V5XT1lfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0wLG49W10saT17fSxvPVtdO3JldHVybiB0Lm5vZGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24oYSl7ci5oYXMoaSxhKXx8ZnVuY3Rpb24gYShzKXt2YXIgdT1pW3NdPXtvblN0YWNrOiEwLGxvd2xpbms6ZSxpbmRleDplKyt9O2lmKG4ucHVzaChzKSx0LnN1Y2Nlc3NvcnMocykuZm9yRWFjaCgoZnVuY3Rpb24odCl7ci5oYXMoaSx0KT9pW3RdLm9uU3RhY2smJih1Lmxvd2xpbms9TWF0aC5taW4odS5sb3dsaW5rLGlbdF0uaW5kZXgpKTooYSh0KSx1Lmxvd2xpbms9TWF0aC5taW4odS5sb3dsaW5rLGlbdF0ubG93bGluaykpfSkpLHUubG93bGluaz09PXUuaW5kZXgpe3ZhciBjLGY9W107ZG97Yz1uLnBvcCgpLGlbY10ub25TdGFjaz0hMSxmLnB1c2goYyl9d2hpbGUocyE9PWMpO28ucHVzaChmKX19KGEpfSkpLG99fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Mik7ZnVuY3Rpb24gaSh0KXt2YXIgZT17fSxuPXt9LGk9W107aWYoci5lYWNoKHQuc2lua3MoKSwoZnVuY3Rpb24gYShzKXtpZihyLmhhcyhuLHMpKXRocm93IG5ldyBvO3IuaGFzKGUscyl8fChuW3NdPSEwLGVbc109ITAsci5lYWNoKHQucHJlZGVjZXNzb3JzKHMpLGEpLGRlbGV0ZSBuW3NdLGkucHVzaChzKSl9KSksci5zaXplKGUpIT09dC5ub2RlQ291bnQoKSl0aHJvdyBuZXcgbztyZXR1cm4gaX1mdW5jdGlvbiBvKCl7fXQuZXhwb3J0cz1pLGkuQ3ljbGVFeGNlcHRpb249byxvLnByb3RvdHlwZT1uZXcgRXJyb3J9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3IuaXNBcnJheShlKXx8KGU9W2VdKTt2YXIgaT0odC5pc0RpcmVjdGVkKCk/dC5zdWNjZXNzb3JzOnQubmVpZ2hib3JzKS5iaW5kKHQpLG89W10sYT17fTtyZXR1cm4gci5lYWNoKGUsKGZ1bmN0aW9uKGUpe2lmKCF0Lmhhc05vZGUoZSkpdGhyb3cgbmV3IEVycm9yKFwiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiBcIitlKTshZnVuY3Rpb24gdChlLG4saSxvLGEscyl7ci5oYXMobyxuKXx8KG9bbl09ITAsaXx8cy5wdXNoKG4pLHIuZWFjaChhKG4pLChmdW5jdGlvbihuKXt0KGUsbixpLG8sYSxzKX0pKSxpJiZzLnB1c2gobikpfSh0LGUsXCJwb3N0XCI9PT1uLGEsaSxvKX0pKSxvfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDA3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/KHQ9cih0KSk9PT0xLzB8fHQ9PT0tMS8wPzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1Nyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP3IodCwxKTpbXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwMyksaT1uKDczKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4peyh2b2lkIDAhPT1uJiYhaSh0W2VdLG4pfHx2b2lkIDA9PT1uJiYhKGUgaW4gdCkpJiZyKHQsZSxuKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoKFwiY29uc3RydWN0b3JcIiE9PWV8fFwiZnVuY3Rpb25cIiE9dHlwZW9mIHRbZV0pJiZcIl9fcHJvdG9fX1wiIT1lKXJldHVybiB0W2VdfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMjcpLGk9big0NCkuR3JhcGgsbz1uKDExNCkuc2xhY2s7ZnVuY3Rpb24gYSh0LGUpe3JldHVybiByLmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbiBuKGkpe3IuZm9yRWFjaChlLm5vZGVFZGdlcyhpKSwoZnVuY3Rpb24ocil7dmFyIGE9ci52LHM9aT09PWE/ci53OmE7dC5oYXNOb2RlKHMpfHxvKGUscil8fCh0LnNldE5vZGUocyx7fSksdC5zZXRFZGdlKGkscyx7fSksbihzKSl9KSl9KSksdC5ub2RlQ291bnQoKX1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIHIubWluQnkoZS5lZGdlcygpLChmdW5jdGlvbihuKXtpZih0Lmhhc05vZGUobi52KSE9PXQuaGFzTm9kZShuLncpKXJldHVybiBvKGUsbil9KSl9ZnVuY3Rpb24gdSh0LGUsbil7ci5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24odCl7ZS5ub2RlKHQpLnJhbmsrPW59KSl9dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1uZXcgaSh7ZGlyZWN0ZWQ6ITF9KSxjPXQubm9kZXMoKVswXSxmPXQubm9kZUNvdW50KCk7ci5zZXROb2RlKGMse30pO2Zvcig7YShyLHQpPGY7KWU9cyhyLHQpLG49ci5oYXNOb2RlKGUudik/byh0LGUpOi1vKHQsZSksdShyLHQsbik7cmV0dXJuIHJ9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4obj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9XHJcbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKEMpIE1pY3Jvc29mdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIHI7IWZ1bmN0aW9uKHIpeyFmdW5jdGlvbihpKXt2YXIgbz1cIm9iamVjdFwiPT09KHZvaWQgMD09PWU/XCJ1bmRlZmluZWRcIjpuKGUpKT9lOlwib2JqZWN0XCI9PT0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIHNlbGY/XCJ1bmRlZmluZWRcIjpuKHNlbGYpKT9zZWxmOlwib2JqZWN0XCI9PT1uKHRoaXMpP3RoaXM6RnVuY3Rpb24oXCJyZXR1cm4gdGhpcztcIikoKSxhPXMocik7ZnVuY3Rpb24gcyh0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe1wiZnVuY3Rpb25cIiE9dHlwZW9mIHRbbl0mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4se2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpyfSksZSYmZShuLHIpfX12b2lkIDA9PT1vLlJlZmxlY3Q/by5SZWZsZWN0PXI6YT1zKG8uUmVmbGVjdCxhKSxmdW5jdGlvbihlKXt2YXIgcj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGk9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sLG89aSYmdm9pZCAwIT09U3ltYm9sLnRvUHJpbWl0aXZlP1N5bWJvbC50b1ByaW1pdGl2ZTpcIkBAdG9QcmltaXRpdmVcIixhPWkmJnZvaWQgMCE9PVN5bWJvbC5pdGVyYXRvcj9TeW1ib2wuaXRlcmF0b3I6XCJAQGl0ZXJhdG9yXCIscz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuY3JlYXRlLHU9e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5LGM9IXMmJiF1LGY9e2NyZWF0ZTpzP2Z1bmN0aW9uKCl7cmV0dXJuIEQoT2JqZWN0LmNyZWF0ZShudWxsKSl9OnU/ZnVuY3Rpb24oKXtyZXR1cm4gRCh7X19wcm90b19fOm51bGx9KX06ZnVuY3Rpb24oKXtyZXR1cm4gRCh7fSl9LGhhczpjP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHIuY2FsbCh0LGUpfTpmdW5jdGlvbih0LGUpe3JldHVybiBlIGluIHR9LGdldDpjP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHIuY2FsbCh0LGUpP3RbZV06dm9pZCAwfTpmdW5jdGlvbih0LGUpe3JldHVybiB0W2VdfX0sbD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb24pLGg9XCJvYmplY3RcIj09PSh2b2lkIDA9PT10P1widW5kZWZpbmVkXCI6bih0KSkmJnQuZW52JiZcInRydWVcIj09PXQuZW52LlJFRkxFQ1RfTUVUQURBVEFfVVNFX01BUF9QT0xZRklMTCxkPWh8fFwiZnVuY3Rpb25cIiE9dHlwZW9mIE1hcHx8XCJmdW5jdGlvblwiIT10eXBlb2YgTWFwLnByb3RvdHlwZS5lbnRyaWVzP2Z1bmN0aW9uKCl7dmFyIHQ9e30sZT1bXSxuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5faW5kZXg9MCx0aGlzLl9rZXlzPXQsdGhpcy5fdmFsdWVzPWUsdGhpcy5fc2VsZWN0b3I9bn1yZXR1cm4gdC5wcm90b3R5cGVbXCJAQGl0ZXJhdG9yXCJdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbmRleDtpZih0Pj0wJiZ0PHRoaXMuX2tleXMubGVuZ3RoKXt2YXIgbj10aGlzLl9zZWxlY3Rvcih0aGlzLl9rZXlzW3RdLHRoaXMuX3ZhbHVlc1t0XSk7cmV0dXJuIHQrMT49dGhpcy5fa2V5cy5sZW5ndGg/KHRoaXMuX2luZGV4PS0xLHRoaXMuX2tleXM9ZSx0aGlzLl92YWx1ZXM9ZSk6dGhpcy5faW5kZXgrKyx7dmFsdWU6bixkb25lOiExfX1yZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fSx0LnByb3RvdHlwZS50aHJvdz1mdW5jdGlvbih0KXt0aHJvdyB0aGlzLl9pbmRleD49MCYmKHRoaXMuX2luZGV4PS0xLHRoaXMuX2tleXM9ZSx0aGlzLl92YWx1ZXM9ZSksdH0sdC5wcm90b3R5cGUucmV0dXJuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbmRleD49MCYmKHRoaXMuX2luZGV4PS0xLHRoaXMuX2tleXM9ZSx0aGlzLl92YWx1ZXM9ZSkse3ZhbHVlOnQsZG9uZTohMH19LHR9KCk7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuX2tleXM9W10sdGhpcy5fdmFsdWVzPVtdLHRoaXMuX2NhY2hlS2V5PXQsdGhpcy5fY2FjaGVJbmRleD0tMn1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwic2l6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGh9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9maW5kKHQsITEpPj0wfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZmluZCh0LCExKTtyZXR1cm4gZT49MD90aGlzLl92YWx1ZXNbZV06dm9pZCAwfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9maW5kKHQsITApO3JldHVybiB0aGlzLl92YWx1ZXNbbl09ZSx0aGlzfSxlLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5fZmluZChlLCExKTtpZihuPj0wKXtmb3IodmFyIHI9dGhpcy5fa2V5cy5sZW5ndGgsaT1uKzE7aTxyO2krKyl0aGlzLl9rZXlzW2ktMV09dGhpcy5fa2V5c1tpXSx0aGlzLl92YWx1ZXNbaS0xXT10aGlzLl92YWx1ZXNbaV07cmV0dXJuIHRoaXMuX2tleXMubGVuZ3RoLS0sdGhpcy5fdmFsdWVzLmxlbmd0aC0tLGU9PT10aGlzLl9jYWNoZUtleSYmKHRoaXMuX2NhY2hlS2V5PXQsdGhpcy5fY2FjaGVJbmRleD0tMiksITB9cmV0dXJuITF9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fa2V5cy5sZW5ndGg9MCx0aGlzLl92YWx1ZXMubGVuZ3RoPTAsdGhpcy5fY2FjaGVLZXk9dCx0aGlzLl9jYWNoZUluZGV4PS0yfSxlLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzLHIpfSxlLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5fa2V5cyx0aGlzLl92YWx1ZXMsaSl9LGUucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5fa2V5cyx0aGlzLl92YWx1ZXMsbyl9LGUucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVudHJpZXMoKX0sZS5wcm90b3R5cGVbYV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9LGUucHJvdG90eXBlLl9maW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2NhY2hlS2V5IT09dCYmKHRoaXMuX2NhY2hlSW5kZXg9dGhpcy5fa2V5cy5pbmRleE9mKHRoaXMuX2NhY2hlS2V5PXQpKSx0aGlzLl9jYWNoZUluZGV4PDAmJmUmJih0aGlzLl9jYWNoZUluZGV4PXRoaXMuX2tleXMubGVuZ3RoLHRoaXMuX2tleXMucHVzaCh0KSx0aGlzLl92YWx1ZXMucHVzaCh2b2lkIDApKSx0aGlzLl9jYWNoZUluZGV4fSxlfSgpO2Z1bmN0aW9uIHIodCxlKXtyZXR1cm4gdH1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIGV9ZnVuY3Rpb24gbyh0LGUpe3JldHVyblt0LGVdfX0oKTpNYXAscD1ofHxcImZ1bmN0aW9uXCIhPXR5cGVvZiBTZXR8fFwiZnVuY3Rpb25cIiE9dHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcz9mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9tYXA9bmV3IGR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInNpemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5zaXplfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLmhhcyh0KX0sdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tYXAuc2V0KHQsdCksdGhpc30sdC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tYXAuZGVsZXRlKHQpfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX21hcC5jbGVhcigpfSx0LnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5rZXlzKCl9LHQucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAudmFsdWVzKCl9LHQucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwLmVudHJpZXMoKX0sdC5wcm90b3R5cGVbXCJAQGl0ZXJhdG9yXCJdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2V5cygpfSx0LnByb3RvdHlwZVthXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmtleXMoKX0sdH0oKTpTZXQsZz1uZXcoaHx8XCJmdW5jdGlvblwiIT10eXBlb2YgV2Vha01hcD9mdW5jdGlvbigpe3ZhciB0PWYuY3JlYXRlKCksZT1uKCk7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX2tleT1uKCl9cmV0dXJuIHQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt2YXIgZT1pKHQsITEpO3JldHVybiB2b2lkIDAhPT1lJiZmLmhhcyhlLHRoaXMuX2tleSl9LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT1pKHQsITEpO3JldHVybiB2b2lkIDAhPT1lP2YuZ2V0KGUsdGhpcy5fa2V5KTp2b2lkIDB9LHQucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBpKHQsITApW3RoaXMuX2tleV09ZSx0aGlzfSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9aSh0LCExKTtyZXR1cm4gdm9pZCAwIT09ZSYmZGVsZXRlIGVbdGhpcy5fa2V5XX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9rZXk9bigpfSx0fSgpO2Z1bmN0aW9uIG4oKXt2YXIgZTtkb3tlPVwiQEBXZWFrTWFwQEBcIithKCl9d2hpbGUoZi5oYXModCxlKSk7cmV0dXJuIHRbZV09ITAsZX1mdW5jdGlvbiBpKHQsbil7aWYoIXIuY2FsbCh0LGUpKXtpZighbilyZXR1cm47T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6Zi5jcmVhdGUoKX0pfXJldHVybiB0W2VdfWZ1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49MDtuPGU7KytuKXRbbl09MjU1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4gdH1mdW5jdGlvbiBhKCl7dmFyIHQsZT0odD0xNixcImZ1bmN0aW9uXCI9PXR5cGVvZiBVaW50OEFycmF5P1widW5kZWZpbmVkXCIhPXR5cGVvZiBjcnlwdG8/Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSh0KSk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1zQ3J5cHRvP21zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSh0KSk6byhuZXcgVWludDhBcnJheSh0KSx0KTpvKG5ldyBBcnJheSh0KSx0KSk7ZVs2XT03OSZlWzZdfDY0LGVbOF09MTkxJmVbOF18MTI4O2Zvcih2YXIgbj1cIlwiLHI9MDtyPDE2Oysrcil7dmFyIGk9ZVtyXTs0IT09ciYmNiE9PXImJjghPT1yfHwobis9XCItXCIpLGk8MTYmJihuKz1cIjBcIiksbis9aS50b1N0cmluZygxNikudG9Mb3dlckNhc2UoKX1yZXR1cm4gbn19KCk6V2Vha01hcCk7ZnVuY3Rpb24gdih0LGUsbil7dmFyIHI9Zy5nZXQodCk7aWYoUyhyKSl7aWYoIW4pcmV0dXJuO3I9bmV3IGQsZy5zZXQodCxyKX12YXIgaT1yLmdldChlKTtpZihTKGkpKXtpZighbilyZXR1cm47aT1uZXcgZCxyLnNldChlLGkpfXJldHVybiBpfWZ1bmN0aW9uIHkodCxlLG4pe3ZhciByPXYoZSxuLCExKTtyZXR1cm4hUyhyKSYmISFyLmhhcyh0KX1mdW5jdGlvbiBtKHQsZSxuKXt2YXIgcj12KGUsbiwhMSk7aWYoIVMocikpcmV0dXJuIHIuZ2V0KHQpfWZ1bmN0aW9uIGIodCxlLG4scil7dihuLHIsITApLnNldCh0LGUpfWZ1bmN0aW9uIHgodCxlKXt2YXIgbj1bXSxyPXYodCxlLCExKTtpZihTKHIpKXJldHVybiBuO2Zvcih2YXIgaT1mdW5jdGlvbih0KXt2YXIgZT1DKHQsYSk7aWYoIUEoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgbj1lLmNhbGwodCk7aWYoIV8obikpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gbn0oci5rZXlzKCkpLG89MDs7KXt2YXIgcz1JKGkpO2lmKCFzKXJldHVybiBuLmxlbmd0aD1vLG47dmFyIHU9cy52YWx1ZTt0cnl7bltvXT11fWNhdGNoKHQpe3RyeXtQKGkpfWZpbmFsbHl7dGhyb3cgdH19bysrfX1mdW5jdGlvbiB3KHQpe2lmKG51bGw9PT10KXJldHVybiAxO3N3aXRjaChuKHQpKXtjYXNlXCJ1bmRlZmluZWRcIjpyZXR1cm4gMDtjYXNlXCJib29sZWFuXCI6cmV0dXJuIDI7Y2FzZVwic3RyaW5nXCI6cmV0dXJuIDM7Y2FzZVwic3ltYm9sXCI6cmV0dXJuIDQ7Y2FzZVwibnVtYmVyXCI6cmV0dXJuIDU7Y2FzZVwib2JqZWN0XCI6cmV0dXJuIG51bGw9PT10PzE6NjtkZWZhdWx0OnJldHVybiA2fX1mdW5jdGlvbiBTKHQpe3JldHVybiB2b2lkIDA9PT10fWZ1bmN0aW9uIEUodCl7cmV0dXJuIG51bGw9PT10fWZ1bmN0aW9uIF8odCl7cmV0dXJuXCJvYmplY3RcIj09PW4odCk/bnVsbCE9PXQ6XCJmdW5jdGlvblwiPT10eXBlb2YgdH1mdW5jdGlvbiBPKHQsZSl7c3dpdGNoKHcodCkpe2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OnJldHVybiB0fXZhciBuPTM9PT1lP1wic3RyaW5nXCI6NT09PWU/XCJudW1iZXJcIjpcImRlZmF1bHRcIixyPUModCxvKTtpZih2b2lkIDAhPT1yKXt2YXIgaT1yLmNhbGwodCxuKTtpZihfKGkpKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIGl9cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoXCJzdHJpbmdcIj09PWUpe3ZhciBuPXQudG9TdHJpbmc7aWYoQShuKSlpZighXyhpPW4uY2FsbCh0KSkpcmV0dXJuIGk7aWYoQShyPXQudmFsdWVPZikpaWYoIV8oaT1yLmNhbGwodCkpKXJldHVybiBpfWVsc2V7dmFyIHI7aWYoQShyPXQudmFsdWVPZikpaWYoIV8oaT1yLmNhbGwodCkpKXJldHVybiBpO3ZhciBpLG89dC50b1N0cmluZztpZihBKG8pKWlmKCFfKGk9by5jYWxsKHQpKSlyZXR1cm4gaX10aHJvdyBuZXcgVHlwZUVycm9yfSh0LFwiZGVmYXVsdFwiPT09bj9cIm51bWJlclwiOm4pfWZ1bmN0aW9uIGsodCl7dmFyIGU9Tyh0LDMpO3JldHVyblwic3ltYm9sXCI9PT1uKGUpP2U6ZnVuY3Rpb24odCl7cmV0dXJuXCJcIit0fShlKX1mdW5jdGlvbiBNKHQpe3JldHVybiBBcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXkodCk6dCBpbnN0YW5jZW9mIE9iamVjdD90IGluc3RhbmNlb2YgQXJyYXk6XCJbb2JqZWN0IEFycmF5XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEEodCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdH1mdW5jdGlvbiBUKHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHR9ZnVuY3Rpb24gQyh0LGUpe3ZhciBuPXRbZV07aWYobnVsbCE9bil7aWYoIUEobikpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gbn19ZnVuY3Rpb24gSSh0KXt2YXIgZT10Lm5leHQoKTtyZXR1cm4hZS5kb25lJiZlfWZ1bmN0aW9uIFAodCl7dmFyIGU9dC5yZXR1cm47ZSYmZS5jYWxsKHQpfWZ1bmN0aW9uIGoodCl7dmFyIGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHR8fHQ9PT1sKXJldHVybiBlO2lmKGUhPT1sKXJldHVybiBlO3ZhciBuPXQucHJvdG90eXBlLHI9biYmT2JqZWN0LmdldFByb3RvdHlwZU9mKG4pO2lmKG51bGw9PXJ8fHI9PT1PYmplY3QucHJvdG90eXBlKXJldHVybiBlO3ZhciBpPXIuY29uc3RydWN0b3I7cmV0dXJuXCJmdW5jdGlvblwiIT10eXBlb2YgaXx8aT09PXQ/ZTppfWZ1bmN0aW9uIEQodCl7cmV0dXJuIHQuX189dm9pZCAwLGRlbGV0ZSB0Ll9fLHR9ZShcImRlY29yYXRlXCIsKGZ1bmN0aW9uKHQsZSxuLHIpe2lmKFMobikpe2lmKCFNKHQpKXRocm93IG5ldyBUeXBlRXJyb3I7aWYoIVQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGgtMTtuPj0wOy0tbil7dmFyIHI9KDAsdFtuXSkoZSk7aWYoIVMocikmJiFFKHIpKXtpZighVChyKSl0aHJvdyBuZXcgVHlwZUVycm9yO2U9cn19cmV0dXJuIGV9KHQsZSl9aWYoIU0odCkpdGhyb3cgbmV3IFR5cGVFcnJvcjtpZighXyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yO2lmKCFfKHIpJiYhUyhyKSYmIUUocikpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gRShyKSYmKHI9dm9pZCAwKSxmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9dC5sZW5ndGgtMTtpPj0wOy0taSl7dmFyIG89KDAsdFtpXSkoZSxuLHIpO2lmKCFTKG8pJiYhRShvKSl7aWYoIV8obykpdGhyb3cgbmV3IFR5cGVFcnJvcjtyPW99fXJldHVybiByfSh0LGUsbj1rKG4pLHIpfSkpLGUoXCJtZXRhZGF0YVwiLChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe2lmKCFfKG4pKXRocm93IG5ldyBUeXBlRXJyb3I7aWYoIVMocikmJiFmdW5jdGlvbih0KXtzd2l0Y2godyh0KSl7Y2FzZSAzOmNhc2UgNDpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0ocikpdGhyb3cgbmV3IFR5cGVFcnJvcjtiKHQsZSxuLHIpfX0pKSxlKFwiZGVmaW5lTWV0YWRhdGFcIiwoZnVuY3Rpb24odCxlLG4scil7aWYoIV8obikpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gUyhyKXx8KHI9ayhyKSksYih0LGUsbixyKX0pKSxlKFwiaGFzTWV0YWRhdGFcIiwoZnVuY3Rpb24odCxlLG4pe2lmKCFfKGUpKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIFMobil8fChuPWsobikpLGZ1bmN0aW9uIHQoZSxuLHIpe2lmKHkoZSxuLHIpKXJldHVybiEwO3ZhciBpPWoobik7cmV0dXJuIUUoaSkmJnQoZSxpLHIpfSh0LGUsbil9KSksZShcImhhc093bk1ldGFkYXRhXCIsKGZ1bmN0aW9uKHQsZSxuKXtpZighXyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yO3JldHVybiBTKG4pfHwobj1rKG4pKSx5KHQsZSxuKX0pKSxlKFwiZ2V0TWV0YWRhdGFcIiwoZnVuY3Rpb24odCxlLG4pe2lmKCFfKGUpKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIFMobil8fChuPWsobikpLGZ1bmN0aW9uIHQoZSxuLHIpe2lmKHkoZSxuLHIpKXJldHVybiBtKGUsbixyKTt2YXIgaT1qKG4pO3JldHVybiBFKGkpP3ZvaWQgMDp0KGUsaSxyKX0odCxlLG4pfSkpLGUoXCJnZXRPd25NZXRhZGF0YVwiLChmdW5jdGlvbih0LGUsbil7aWYoIV8oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gUyhuKXx8KG49ayhuKSksbSh0LGUsbil9KSksZShcImdldE1ldGFkYXRhS2V5c1wiLChmdW5jdGlvbih0LGUpe2lmKCFfKHQpKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIFMoZSl8fChlPWsoZSkpLGZ1bmN0aW9uIHQoZSxuKXt2YXIgcj14KGUsbiksaT1qKGUpO2lmKG51bGw9PT1pKXJldHVybiByO3ZhciBvPXQoaSxuKTtpZihvLmxlbmd0aDw9MClyZXR1cm4gcjtpZihyLmxlbmd0aDw9MClyZXR1cm4gbztmb3IodmFyIGE9bmV3IHAscz1bXSx1PTAsYz1yO3U8Yy5sZW5ndGg7dSsrKXt2YXIgZj1jW3VdO2EuaGFzKGYpfHwoYS5hZGQoZikscy5wdXNoKGYpKX1mb3IodmFyIGw9MCxoPW87bDxoLmxlbmd0aDtsKyspe2Y9aFtsXTthLmhhcyhmKXx8KGEuYWRkKGYpLHMucHVzaChmKSl9cmV0dXJuIHN9KHQsZSl9KSksZShcImdldE93bk1ldGFkYXRhS2V5c1wiLChmdW5jdGlvbih0LGUpe2lmKCFfKHQpKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIFMoZSl8fChlPWsoZSkpLHgodCxlKX0pKSxlKFwiZGVsZXRlTWV0YWRhdGFcIiwoZnVuY3Rpb24odCxlLG4pe2lmKCFfKGUpKXRocm93IG5ldyBUeXBlRXJyb3I7UyhuKXx8KG49ayhuKSk7dmFyIHI9dihlLG4sITEpO2lmKFMocikpcmV0dXJuITE7aWYoIXIuZGVsZXRlKHQpKXJldHVybiExO2lmKHIuc2l6ZT4wKXJldHVybiEwO3ZhciBpPWcuZ2V0KGUpO3JldHVybiBpLmRlbGV0ZShuKSxpLnNpemU+MHx8Zy5kZWxldGUoZSksITB9KSl9KGEpfSgpfShyfHwocj17fSkpfSkuY2FsbCh0aGlzLG4oMTczKSxuKDE3OSkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMzQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKHQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXJldHVybiByKHQsZSk7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO3JldHVyblwiT2JqZWN0XCI9PT1uJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLFwiTWFwXCI9PT1ufHxcIlNldFwiPT09bj9BcnJheS5mcm9tKHQpOlwiQXJndW1lbnRzXCI9PT1ufHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKT9yKHQsZSk6dm9pZCAwfX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5NZXRhZGF0YVJlYWRlcj12b2lkIDA7dmFyIHI9bigzMSksaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmdldENvbnN0cnVjdG9yTWV0YWRhdGE9ZnVuY3Rpb24odCl7cmV0dXJue2NvbXBpbGVyR2VuZXJhdGVkTWV0YWRhdGE6UmVmbGVjdC5nZXRNZXRhZGF0YShyLlBBUkFNX1RZUEVTLHQpLHVzZXJHZW5lcmF0ZWRNZXRhZGF0YTpSZWZsZWN0LmdldE1ldGFkYXRhKHIuVEFHR0VELHQpfHx7fX19LHQucHJvdG90eXBlLmdldFByb3BlcnRpZXNNZXRhZGF0YT1mdW5jdGlvbih0KXtyZXR1cm4gUmVmbGVjdC5nZXRNZXRhZGF0YShyLlRBR0dFRF9QUk9QLHQpfHxbXX0sdH0oKTtlLk1ldGFkYXRhUmVhZGVyPWl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLmlzU3RhY2tPdmVyZmxvd0V4ZXB0aW9uPXZvaWQgMDt2YXIgcj1uKDQxKTtlLmlzU3RhY2tPdmVyZmxvd0V4ZXB0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgUmFuZ2VFcnJvcnx8dC5tZXNzYWdlPT09ci5TVEFDS19PVkVSRkxPV319LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLmluamVjdD1lLkxhenlTZXJ2aWNlSWRlbnRpZmVyPXZvaWQgMDt2YXIgcj1uKDQxKSxpPW4oMzEpLG89big0NyksYT1uKDYxKSxzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9jYj10fXJldHVybiB0LnByb3RvdHlwZS51bndyYXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2IoKX0sdH0oKTtlLkxhenlTZXJ2aWNlSWRlbnRpZmVyPXMsZS5pbmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixzKXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcihyLlVOREVGSU5FRF9JTkpFQ1RfQU5OT1RBVElPTihlLm5hbWUpKTt2YXIgdT1uZXcgby5NZXRhZGF0YShpLklOSkVDVF9UQUcsdCk7XCJudW1iZXJcIj09dHlwZW9mIHM/YS50YWdQYXJhbWV0ZXIoZSxuLHMsdSk6YS50YWdQcm9wZXJ0eShlLG4sdSl9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuVGFyZ2V0PXZvaWQgMDt2YXIgcj1uKDMxKSxpPW4oNjgpLG89big0NyksYT1uKDQ3Mykscz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4scyl7dGhpcy5pZD1pLmlkKCksdGhpcy50eXBlPXQsdGhpcy5zZXJ2aWNlSWRlbnRpZmllcj1uLHRoaXMubmFtZT1uZXcgYS5RdWVyeWFibGVTdHJpbmcoZXx8XCJcIiksdGhpcy5tZXRhZGF0YT1uZXcgQXJyYXk7dmFyIHU9bnVsbDtcInN0cmluZ1wiPT10eXBlb2Ygcz91PW5ldyBvLk1ldGFkYXRhKHIuTkFNRURfVEFHLHMpOnMgaW5zdGFuY2VvZiBvLk1ldGFkYXRhJiYodT1zKSxudWxsIT09dSYmdGhpcy5tZXRhZGF0YS5wdXNoKHUpfXJldHVybiB0LnByb3RvdHlwZS5oYXNUYWc9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10aGlzLm1ldGFkYXRhO2U8bi5sZW5ndGg7ZSsrKXtpZihuW2VdLmtleT09PXQpcmV0dXJuITB9cmV0dXJuITF9LHQucHJvdG90eXBlLmlzQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNUYWcoci5NVUxUSV9JTkpFQ1RfVEFHKX0sdC5wcm90b3R5cGUubWF0Y2hlc0FycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hdGNoZXNUYWcoci5NVUxUSV9JTkpFQ1RfVEFHKSh0KX0sdC5wcm90b3R5cGUuaXNOYW1lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc1RhZyhyLk5BTUVEX1RBRyl9LHQucHJvdG90eXBlLmlzVGFnZ2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWV0YWRhdGEuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5IT09ci5JTkpFQ1RfVEFHJiZ0LmtleSE9PXIuTVVMVElfSU5KRUNUX1RBRyYmdC5rZXkhPT1yLk5BTUVfVEFHJiZ0LmtleSE9PXIuVU5NQU5BR0VEX1RBRyYmdC5rZXkhPT1yLk5BTUVEX1RBR30pKX0sdC5wcm90b3R5cGUuaXNPcHRpb25hbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXNUYWcoci5PUFRJT05BTF9UQUcpKCEwKX0sdC5wcm90b3R5cGUuZ2V0TmFtZWRUYWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc05hbWVkKCk/dGhpcy5tZXRhZGF0YS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmtleT09PXIuTkFNRURfVEFHfSkpWzBdOm51bGx9LHQucHJvdG90eXBlLmdldEN1c3RvbVRhZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1RhZ2dlZCgpP3RoaXMubWV0YWRhdGEuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXkhPT1yLklOSkVDVF9UQUcmJnQua2V5IT09ci5NVUxUSV9JTkpFQ1RfVEFHJiZ0LmtleSE9PXIuTkFNRV9UQUcmJnQua2V5IT09ci5VTk1BTkFHRURfVEFHJiZ0LmtleSE9PXIuTkFNRURfVEFHfSkpOm51bGx9LHQucHJvdG90eXBlLm1hdGNoZXNOYW1lZFRhZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tYXRjaGVzVGFnKHIuTkFNRURfVEFHKSh0KX0sdC5wcm90b3R5cGUubWF0Y2hlc1RhZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbihuKXtmb3IodmFyIHI9MCxpPWUubWV0YWRhdGE7cjxpLmxlbmd0aDtyKyspe3ZhciBvPWlbcl07aWYoby5rZXk9PT10JiZvLnZhbHVlPT09bilyZXR1cm4hMH1yZXR1cm4hMX19LHR9KCk7ZS5UYXJnZXQ9c30sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuQmluZGluZ1doZW5PblN5bnRheD12b2lkIDA7dmFyIHI9bigxNTkpLGk9bigxNjApLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2JpbmRpbmc9dCx0aGlzLl9iaW5kaW5nV2hlblN5bnRheD1uZXcgaS5CaW5kaW5nV2hlblN5bnRheCh0aGlzLl9iaW5kaW5nKSx0aGlzLl9iaW5kaW5nT25TeW50YXg9bmV3IHIuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpfXJldHVybiB0LnByb3RvdHlwZS53aGVuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuKHQpfSx0LnByb3RvdHlwZS53aGVuVGFyZ2V0TmFtZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5UYXJnZXROYW1lZCh0KX0sdC5wcm90b3R5cGUud2hlblRhcmdldElzRGVmYXVsdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0SXNEZWZhdWx0KCl9LHQucHJvdG90eXBlLndoZW5UYXJnZXRUYWdnZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblRhcmdldFRhZ2dlZCh0LGUpfSx0LnByb3RvdHlwZS53aGVuSW5qZWN0ZWRJbnRvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuSW5qZWN0ZWRJbnRvKHQpfSx0LnByb3RvdHlwZS53aGVuUGFyZW50TmFtZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5QYXJlbnROYW1lZCh0KX0sdC5wcm90b3R5cGUud2hlblBhcmVudFRhZ2dlZD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuUGFyZW50VGFnZ2VkKHQsZSl9LHQucHJvdG90eXBlLndoZW5BbnlBbmNlc3RvcklzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JJcyh0KX0sdC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JJcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JJcyh0KX0sdC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yTmFtZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3Rvck5hbWVkKHQpfSx0LnByb3RvdHlwZS53aGVuQW55QW5jZXN0b3JUYWdnZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yVGFnZ2VkKHQsZSl9LHQucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9yTmFtZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yTmFtZWQodCl9LHQucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9yVGFnZ2VkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yVGFnZ2VkKHQsZSl9LHQucHJvdG90eXBlLndoZW5BbnlBbmNlc3Rvck1hdGNoZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3Rvck1hdGNoZXModCl9LHQucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9yTWF0Y2hlcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JNYXRjaGVzKHQpfSx0LnByb3RvdHlwZS5vbkFjdGl2YXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdPblN5bnRheC5vbkFjdGl2YXRpb24odCl9LHR9KCk7ZS5CaW5kaW5nV2hlbk9uU3ludGF4PW99LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLnR5cGVDb25zdHJhaW50PWUubmFtZWRDb25zdHJhaW50PWUudGFnZ2VkQ29uc3RyYWludD1lLnRyYXZlcnNlQW5jZXJzdG9ycz12b2lkIDA7dmFyIHI9bigzMSksaT1uKDQ3KTtlLnRyYXZlcnNlQW5jZXJzdG9ycz1mdW5jdGlvbiB0KGUsbil7dmFyIHI9ZS5wYXJlbnRSZXF1ZXN0O3JldHVybiBudWxsIT09ciYmKCEhbihyKXx8dChyLG4pKX07dmFyIG89ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPWZ1bmN0aW9uKG4pe3JldHVybiBudWxsIT09biYmbnVsbCE9PW4udGFyZ2V0JiZuLnRhcmdldC5tYXRjaGVzVGFnKHQpKGUpfTtyZXR1cm4gbi5tZXRhRGF0YT1uZXcgaS5NZXRhZGF0YSh0LGUpLG59fTtlLnRhZ2dlZENvbnN0cmFpbnQ9bzt2YXIgYT1vKHIuTkFNRURfVEFHKTtlLm5hbWVkQ29uc3RyYWludD1hO2UudHlwZUNvbnN0cmFpbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPW51bGw7aWYobnVsbCE9PWUpe2lmKG49ZS5iaW5kaW5nc1swXSxcInN0cmluZ1wiPT10eXBlb2YgdClyZXR1cm4gbi5zZXJ2aWNlSWRlbnRpZmllcj09PXQ7dmFyIHI9ZS5iaW5kaW5nc1swXS5pbXBsZW1lbnRhdGlvblR5cGU7cmV0dXJuIHQ9PT1yfXJldHVybiExfX19LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLChmdW5jdGlvbigpe3JldHVybiBvfSkpO3ZhciByPW4oMiksaT1uKDgwKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT1uZXcgaS5hLG49ci5lLmZyb21WYWx1ZXModFswXSx0WzFdLHRbMl0pLG89ci5lLmZyb21WYWx1ZXModFswXSx0WzFdLHRbMl0pLGE9MzthPHQubGVuZ3RoOyl7dmFyIHM9dFthKytdLHU9dFthKytdLGM9dFthKytdO3M8blswXSYmKG5bMF09cyksdTxuWzFdJiYoblsxXT11KSxjPG5bMl0mJihuWzJdPWMpLHM+b1swXSYmKG9bMF09cyksdT5vWzFdJiYob1sxXT11KSxjPm9bMl0mJihvWzJdPWMpfXJldHVybiBlLnNldE1pbk1heChuLG8pLGV9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSk7dmFyIHI9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIG5hdmlnYXRvciYmL1ZlcnNpb25cXC9bXFxkXFwuXSsuKlNhZmFyaS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMjQ5KTtuLm8ocixcIkFBQkJcIikmJm4uZChlLFwiQUFCQlwiLChmdW5jdGlvbigpe3JldHVybiByLkFBQkJ9KSksbi5vKHIsXCJGcnVzdHVtXCIpJiZuLmQoZSxcIkZydXN0dW1cIiwoZnVuY3Rpb24oKXtyZXR1cm4gci5GcnVzdHVtfSkpO24oMjcwKTt2YXIgaT1uKDI1MSk7bi5vKGksXCJBQUJCXCIpJiZuLmQoZSxcIkFBQkJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaS5BQUJCfSkpLG4ubyhpLFwiRnJ1c3R1bVwiKSYmbi5kKGUsXCJGcnVzdHVtXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGkuRnJ1c3R1bX0pKX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24oMTMyKTt2YXIgcj1uKDI1MCk7bi5vKHIsXCJBQUJCXCIpJiZuLmQoZSxcIkFBQkJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gci5BQUJCfSkpLG4ubyhyLFwiRnJ1c3R1bVwiKSYmbi5kKGUsXCJGcnVzdHVtXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHIuRnJ1c3R1bX0pKX0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDI1Mik7bi5vKHIsXCJBQUJCXCIpJiZuLmQoZSxcIkFBQkJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gci5BQUJCfSkpLG4ubyhyLFwiRnJ1c3R1bVwiKSYmbi5kKGUsXCJGcnVzdHVtXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHIuRnJ1c3R1bX0pKTtuKDEzNSl9LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0xZS02fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciB0PW5ldyBGbG9hdDMyQXJyYXkoMik7cmV0dXJuIHRbMF09MCx0WzFdPTAsdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFswXT1lLHRbMV09bix0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0WzBdPWVbMF0rblswXSx0WzFdPWVbMV0rblsxXSx0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0WzBdPWVbMF0qblswXSx0WzFdPWVbMV0qblsxXSx0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0WzBdPWVbMF0vblswXSx0WzFdPWVbMV0vblsxXSx0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1lWzBdLXRbMF0scj1lWzFdLXRbMV07cmV0dXJuIE1hdGguc3FydChuKm4rcipyKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZVswXS10WzBdLHI9ZVsxXS10WzFdO3JldHVybiBuKm4rcipyfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dFswXSxuPXRbMV07cmV0dXJuIE1hdGguc3FydChlKmUrbipuKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0sbj10WzFdO3JldHVybiBlKmUrbipufX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1lWzBdLHI9ZVsxXSxpPW4qbityKnI7aT4wJiYoaT0xL01hdGguc3FydChpKSx0WzBdPWVbMF0qaSx0WzFdPWVbMV0qaSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdKmVbMF0rdFsxXSplWzFdfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPXt9O24ucihyKSxuLmQocixcImVhc2VMaW5lYXJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTX0pKSxuLmQocixcImVhc2VRdWFkXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEN9KSksbi5kKHIsXCJlYXNlUXVhZEluXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEF9KSksbi5kKHIsXCJlYXNlUXVhZE91dFwiLChmdW5jdGlvbigpe3JldHVybiBUfSkpLG4uZChyLFwiZWFzZVF1YWRJbk91dFwiLChmdW5jdGlvbigpe3JldHVybiBDfSkpLG4uZChyLFwiZWFzZUN1YmljXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGp9KSksbi5kKHIsXCJlYXNlQ3ViaWNJblwiLChmdW5jdGlvbigpe3JldHVybiBJfSkpLG4uZChyLFwiZWFzZUN1YmljT3V0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFB9KSksbi5kKHIsXCJlYXNlQ3ViaWNJbk91dFwiLChmdW5jdGlvbigpe3JldHVybiBqfSkpLG4uZChyLFwiZWFzZVBvbHlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUn0pKSxuLmQocixcImVhc2VQb2x5SW5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gRH0pKSxuLmQocixcImVhc2VQb2x5T3V0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE59KSksbi5kKHIsXCJlYXNlUG9seUluT3V0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSksbi5kKHIsXCJlYXNlU2luXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFV9KSksbi5kKHIsXCJlYXNlU2luSW5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gR30pKSxuLmQocixcImVhc2VTaW5PdXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRn0pKSxuLmQocixcImVhc2VTaW5Jbk91dFwiLChmdW5jdGlvbigpe3JldHVybiBVfSkpLG4uZChyLFwiZWFzZUV4cFwiLChmdW5jdGlvbigpe3JldHVybiBYfSkpLG4uZChyLFwiZWFzZUV4cEluXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFZ9KSksbi5kKHIsXCJlYXNlRXhwT3V0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFd9KSksbi5kKHIsXCJlYXNlRXhwSW5PdXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gWH0pKSxuLmQocixcImVhc2VDaXJjbGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gcX0pKSxuLmQocixcImVhc2VDaXJjbGVJblwiLChmdW5jdGlvbigpe3JldHVybiBZfSkpLG4uZChyLFwiZWFzZUNpcmNsZU91dFwiLChmdW5jdGlvbigpe3JldHVybiBIfSkpLG4uZChyLFwiZWFzZUNpcmNsZUluT3V0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHF9KSksbi5kKHIsXCJlYXNlQm91bmNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSksbi5kKHIsXCJlYXNlQm91bmNlSW5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gWn0pKSxuLmQocixcImVhc2VCb3VuY2VPdXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUX0pKSxuLmQocixcImVhc2VCb3VuY2VJbk91dFwiLChmdW5jdGlvbigpe3JldHVybiBKfSkpLG4uZChyLFwiZWFzZUJhY2tcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZXR9KSksbi5kKHIsXCJlYXNlQmFja0luXCIsKGZ1bmN0aW9uKCl7cmV0dXJuICR9KSksbi5kKHIsXCJlYXNlQmFja091dFwiLChmdW5jdGlvbigpe3JldHVybiB0dH0pKSxuLmQocixcImVhc2VCYWNrSW5PdXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZXR9KSksbi5kKHIsXCJlYXNlRWxhc3RpY1wiLChmdW5jdGlvbigpe3JldHVybiBpdH0pKSxuLmQocixcImVhc2VFbGFzdGljSW5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gcnR9KSksbi5kKHIsXCJlYXNlRWxhc3RpY091dFwiLChmdW5jdGlvbigpe3JldHVybiBpdH0pKSxuLmQocixcImVhc2VFbGFzdGljSW5PdXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gb3R9KSk7dmFyIGk9bigxKSxvPW4oMTM5KSxhPW4oMTM3KSxzPW4oMTkpLHU9bigwKTtmdW5jdGlvbiBjKHQpe3JldHVybihjPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX12YXIgZixsLGg9MCxkPTAscD0wLGc9MCx2PTAseT0wLG09XCJvYmplY3RcIj09PShcInVuZGVmaW5lZFwiPT10eXBlb2YgcGVyZm9ybWFuY2U/XCJ1bmRlZmluZWRcIjpjKHBlcmZvcm1hbmNlKSkmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLGI9XCJvYmplY3RcIj09PShcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93P1widW5kZWZpbmVkXCI6Yyh3aW5kb3cpKSYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiB4KCl7cmV0dXJuIHZ8fChiKHcpLHY9bS5ub3coKSt5KX1mdW5jdGlvbiB3KCl7dj0wfWZ1bmN0aW9uIFMoKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfWZ1bmN0aW9uIEUodCxlLG4pe3ZhciByPW5ldyBTO3JldHVybiByLnJlc3RhcnQodCxlLG4pLHJ9ZnVuY3Rpb24gXygpe3Y9KGc9bS5ub3coKSkreSxoPWQ9MDt0cnl7IWZ1bmN0aW9uKCl7eCgpLCsraDtmb3IodmFyIHQsZT1mO2U7KSh0PXYtZS5fdGltZSk+PTAmJmUuX2NhbGwuY2FsbChudWxsLHQpLGU9ZS5fbmV4dDstLWh9KCl9ZmluYWxseXtoPTAsZnVuY3Rpb24oKXt2YXIgdCxlLG49ZixyPTEvMDtmb3IoO247KW4uX2NhbGw/KHI+bi5fdGltZSYmKHI9bi5fdGltZSksdD1uLG49bi5fbmV4dCk6KGU9bi5fbmV4dCxuLl9uZXh0PW51bGwsbj10P3QuX25leHQ9ZTpmPWUpO2w9dCxrKHIpfSgpLHY9MH19ZnVuY3Rpb24gTygpe3ZhciB0PW0ubm93KCksZT10LWc7ZT4xZTMmJih5LT1lLGc9dCl9ZnVuY3Rpb24gayh0KXtofHwoZCYmKGQ9Y2xlYXJUaW1lb3V0KGQpKSx0LXY+MjQ/KHQ8MS8wJiYoZD1zZXRUaW1lb3V0KF8sdC1tLm5vdygpLXkpKSxwJiYocD1jbGVhckludGVydmFsKHApKSk6KHB8fChnPW0ubm93KCkscD1zZXRJbnRlcnZhbChPLDFlMykpLGg9MSxiKF8pKSl9ZnVuY3Rpb24gTSh0KXtyZXR1cm4rdH1mdW5jdGlvbiBBKHQpe3JldHVybiB0KnR9ZnVuY3Rpb24gVCh0KXtyZXR1cm4gdCooMi10KX1mdW5jdGlvbiBDKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIEkodCl7cmV0dXJuIHQqdCp0fWZ1bmN0aW9uIFAodCl7cmV0dXJuLS10KnQqdCsxfWZ1bmN0aW9uIGoodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQqdDoodC09MikqdCp0KzIpLzJ9Uy5wcm90b3R5cGU9RS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlMscmVzdGFydDpmdW5jdGlvbih0LGUsbil7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb25cIik7bj0obnVsbD09bj94KCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fGw9PT10aGlzfHwobD9sLl9uZXh0PXRoaXM6Zj10aGlzLGw9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9bixrKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLGsoKSl9fTt2YXIgRD1mdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIE1hdGgucG93KHQsZSl9cmV0dXJuIGU9K2Usbi5leHBvbmVudD10LG59KDMpLE49ZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxlKX1yZXR1cm4gZT0rZSxuLmV4cG9uZW50PXQsbn0oMyksUj1mdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LGUpOjItTWF0aC5wb3coMi10LGUpKS8yfXJldHVybiBlPStlLG4uZXhwb25lbnQ9dCxufSgzKSxMPU1hdGguUEksQj1MLzI7ZnVuY3Rpb24gRyh0KXtyZXR1cm4gMT09K3Q/MToxLU1hdGguY29zKHQqQil9ZnVuY3Rpb24gRih0KXtyZXR1cm4gTWF0aC5zaW4odCpCKX1mdW5jdGlvbiBVKHQpe3JldHVybigxLU1hdGguY29zKEwqdCkpLzJ9ZnVuY3Rpb24geih0KXtyZXR1cm4gMS4wMDA5Nzc1MTcxMDY1NDk0KihNYXRoLnBvdygyLC0xMCp0KS0uMDAwOTc2NTYyNSl9ZnVuY3Rpb24gVih0KXtyZXR1cm4geigxLSt0KX1mdW5jdGlvbiBXKHQpe3JldHVybiAxLXoodCl9ZnVuY3Rpb24gWCh0KXtyZXR1cm4oKHQqPTIpPD0xP3ooMS10KToyLXoodC0xKSkvMn1mdW5jdGlvbiBZKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9ZnVuY3Rpb24gSCh0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX1mdW5jdGlvbiBxKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfXZhciBLPTcuNTYyNTtmdW5jdGlvbiBaKHQpe3JldHVybiAxLVEoMS10KX1mdW5jdGlvbiBRKHQpe3JldHVybih0PSt0KTw0LzExP0sqdCp0OnQ8OC8xMT9LKih0LT02LzExKSp0KzMvNDp0PDEwLzExP0sqKHQtPTkvMTEpKnQrMTUvMTY6SyoodC09MjEvMjIpKnQrNjMvNjR9ZnVuY3Rpb24gSih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtUSgxLXQpOlEodC0xKSsxKS8yfXZhciAkPWZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4odD0rdCkqdCooZSoodC0xKSt0KX1yZXR1cm4gZT0rZSxuLm92ZXJzaG9vdD10LG59KDEuNzAxNTgpLHR0PWZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4tLXQqdCooKHQrMSkqZSt0KSsxfXJldHVybiBlPStlLG4ub3ZlcnNob290PXQsbn0oMS43MDE1OCksZXQ9ZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybigodCo9Mik8MT90KnQqKChlKzEpKnQtZSk6KHQtPTIpKnQqKChlKzEpKnQrZSkrMikvMn1yZXR1cm4gZT0rZSxuLm92ZXJzaG9vdD10LG59KDEuNzAxNTgpLG50PTIqTWF0aC5QSSxydD1mdW5jdGlvbiB0KGUsbil7dmFyIHI9TWF0aC5hc2luKDEvKGU9TWF0aC5tYXgoMSxlKSkpKihuLz1udCk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gZSp6KC0gLS10KSpNYXRoLnNpbigoci10KS9uKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKm50KX0saS5wZXJpb2Q9ZnVuY3Rpb24obil7cmV0dXJuIHQoZSxuKX0saX0oMSwuMyksaXQ9ZnVuY3Rpb24gdChlLG4pe3ZhciByPU1hdGguYXNpbigxLyhlPU1hdGgubWF4KDEsZSkpKSoobi89bnQpO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtZSp6KHQ9K3QpKk1hdGguc2luKCh0K3IpL24pfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihlKXtyZXR1cm4gdChlLG4qbnQpfSxpLnBlcmlvZD1mdW5jdGlvbihuKXtyZXR1cm4gdChlLG4pfSxpfSgxLC4zKSxvdD1mdW5jdGlvbiB0KGUsbil7dmFyIHI9TWF0aC5hc2luKDEvKGU9TWF0aC5tYXgoMSxlKSkpKihuLz1udCk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/ZSp6KC10KSpNYXRoLnNpbigoci10KS9uKToyLWUqeih0KSpNYXRoLnNpbigocit0KS9uKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKm50KX0saS5wZXJpb2Q9ZnVuY3Rpb24obil7cmV0dXJuIHQoZSxuKX0saX0oMSwuMyksYXQ9ZnVuY3Rpb24odCxlLG4pe3QucHJvdG90eXBlPWUucHJvdG90eXBlPW4sbi5jb25zdHJ1Y3Rvcj10fTtmdW5jdGlvbiBzdCh0LGUpe3ZhciBuPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBlKW5bcl09ZVtyXTtyZXR1cm4gbn1mdW5jdGlvbiB1dCgpe312YXIgY3Q9XCJcXFxccyooWystXT9cXFxcZCspXFxcXHMqXCIsZnQ9XCJcXFxccyooWystXT9cXFxcZCpcXFxcLj9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixsdD1cIlxcXFxzKihbKy1dP1xcXFxkKlxcXFwuP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KSVcXFxccypcIixodD0vXiMoWzAtOWEtZl17Myw4fSkkLyxkdD1uZXcgUmVnRXhwKFwiXnJnYlxcXFwoXCIrW2N0LGN0LGN0XStcIlxcXFwpJFwiKSxwdD1uZXcgUmVnRXhwKFwiXnJnYlxcXFwoXCIrW2x0LGx0LGx0XStcIlxcXFwpJFwiKSxndD1uZXcgUmVnRXhwKFwiXnJnYmFcXFxcKFwiK1tjdCxjdCxjdCxmdF0rXCJcXFxcKSRcIiksdnQ9bmV3IFJlZ0V4cChcIl5yZ2JhXFxcXChcIitbbHQsbHQsbHQsZnRdK1wiXFxcXCkkXCIpLHl0PW5ldyBSZWdFeHAoXCJeaHNsXFxcXChcIitbZnQsbHQsbHRdK1wiXFxcXCkkXCIpLG10PW5ldyBSZWdFeHAoXCJeaHNsYVxcXFwoXCIrW2Z0LGx0LGx0LGZ0XStcIlxcXFwpJFwiKSxidD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiB4dCgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIHd0KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gU3QodCl7dmFyIGUsbjtyZXR1cm4gdD0odCtcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKSwoZT1odC5leGVjKHQpKT8obj1lWzFdLmxlbmd0aCxlPXBhcnNlSW50KGVbMV0sMTYpLDY9PT1uP0V0KGUpOjM9PT1uP25ldyBNdChlPj44JjE1fGU+PjQmMjQwLGU+PjQmMTV8MjQwJmUsKDE1JmUpPDw0fDE1JmUsMSk6OD09PW4/X3QoZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwoMjU1JmUpLzI1NSk6ND09PW4/X3QoZT4+MTImMTV8ZT4+OCYyNDAsZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgoMTUmZSk8PDR8MTUmZSkvMjU1KTpudWxsKTooZT1kdC5leGVjKHQpKT9uZXcgTXQoZVsxXSxlWzJdLGVbM10sMSk6KGU9cHQuZXhlYyh0KSk/bmV3IE10KDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLDEpOihlPWd0LmV4ZWModCkpP190KGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPXZ0LmV4ZWModCkpP190KDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLGVbNF0pOihlPXl0LmV4ZWModCkpP0l0KGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsMSk6KGU9bXQuZXhlYyh0KSk/SXQoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpidC5oYXNPd25Qcm9wZXJ0eSh0KT9FdChidFt0XSk6XCJ0cmFuc3BhcmVudFwiPT09dD9uZXcgTXQoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBFdCh0KXtyZXR1cm4gbmV3IE10KHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiBfdCh0LGUsbixyKXtyZXR1cm4gcjw9MCYmKHQ9ZT1uPU5hTiksbmV3IE10KHQsZSxuLHIpfWZ1bmN0aW9uIE90KHQpe3JldHVybiB0IGluc3RhbmNlb2YgdXR8fCh0PVN0KHQpKSx0P25ldyBNdCgodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgTXR9ZnVuY3Rpb24ga3QodCxlLG4scil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP090KHQpOm5ldyBNdCh0LGUsbixudWxsPT1yPzE6cil9ZnVuY3Rpb24gTXQodCxlLG4scil7dGhpcy5yPSt0LHRoaXMuZz0rZSx0aGlzLmI9K24sdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIEF0KCl7cmV0dXJuXCIjXCIrQ3QodGhpcy5yKStDdCh0aGlzLmcpK0N0KHRoaXMuYil9ZnVuY3Rpb24gVHQoKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpP1wicmdiKFwiOlwicmdiYShcIikrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLnIpfHwwKSkrXCIsIFwiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpK1wiLCBcIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuYil8fDApKSsoMT09PXQ/XCIpXCI6XCIsIFwiK3QrXCIpXCIpfWZ1bmN0aW9uIEN0KHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2P1wiMFwiOlwiXCIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEl0KHQsZSxuLHIpe3JldHVybiByPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcganQodCxlLG4scil9ZnVuY3Rpb24gUHQodCl7aWYodCBpbnN0YW5jZW9mIGp0KXJldHVybiBuZXcganQodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgdXR8fCh0PVN0KHQpKSwhdClyZXR1cm4gbmV3IGp0O2lmKHQgaW5zdGFuY2VvZiBqdClyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4oZSxuLHIpLG89TWF0aC5tYXgoZSxuLHIpLGE9TmFOLHM9by1pLHU9KG8raSkvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1yKS9zKzYqKG48cik6bj09PW8/KHItZSkvcysyOihlLW4pL3MrNCxzLz11PC41P28raToyLW8taSxhKj02MCk6cz11PjAmJnU8MT8wOmEsbmV3IGp0KGEscyx1LHQub3BhY2l0eSl9ZnVuY3Rpb24ganQodCxlLG4scil7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIER0KHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1mdW5jdGlvbiBOdCh0LGUsbixyLGkpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSplKyg0LTYqbyszKmEpKm4rKDErMyp0KzMqby0zKmEpKnIrYSppKS82fWF0KHV0LFN0LHtjb3B5OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsdCl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4Onh0LGZvcm1hdEhleDp4dCxmb3JtYXRIc2w6ZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcykuZm9ybWF0SHNsKCl9LGZvcm1hdFJnYjp3dCx0b1N0cmluZzp3dH0pLGF0KE10LGt0LHN0KHV0LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgTXQodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Ljc6TWF0aC5wb3coLjcsdCksbmV3IE10KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6QXQsZm9ybWF0SGV4OkF0LGZvcm1hdFJnYjpUdCx0b1N0cmluZzpUdH0pKSxhdChqdCwoZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1B0KHQpOm5ldyBqdCh0LGUsbixudWxsPT1yPzE6cil9KSxzdCh1dCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IGp0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Ljc6TWF0aC5wb3coLjcsdCksbmV3IGp0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oJTM2MCszNjAqKHRoaXMuaDwwKSxlPWlzTmFOKHQpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLG49dGhpcy5sLHI9bisobjwuNT9uOjEtbikqZSxpPTIqbi1yO3JldHVybiBuZXcgTXQoRHQodD49MjQwP3QtMjQwOnQrMTIwLGksciksRHQodCxpLHIpLER0KHQ8MTIwP3QrMjQwOnQtMTIwLGksciksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGZvcm1hdEhzbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4oMT09PSh0PWlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSk/XCJoc2woXCI6XCJoc2xhKFwiKSsodGhpcy5ofHwwKStcIiwgXCIrMTAwKih0aGlzLnN8fDApK1wiJSwgXCIrMTAwKih0aGlzLmx8fDApK1wiJVwiKygxPT09dD9cIilcIjpcIiwgXCIrdCtcIilcIil9fSkpO3ZhciBSdD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O2Z1bmN0aW9uIEx0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0K24qZX19ZnVuY3Rpb24gQnQodCl7cmV0dXJuIDE9PSh0PSt0KT9HdDpmdW5jdGlvbihlLG4pe3JldHVybiBuLWU/ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PU1hdGgucG93KHQsbiksZT1NYXRoLnBvdyhlLG4pLXQsbj0xL24sZnVuY3Rpb24ocil7cmV0dXJuIE1hdGgucG93KHQrciplLG4pfX0oZSxuLHQpOlJ0KGlzTmFOKGUpP246ZSl9fWZ1bmN0aW9uIEd0KHQsZSl7dmFyIG49ZS10O3JldHVybiBuP0x0KHQsbik6UnQoaXNOYU4odCk/ZTp0KX12YXIgRnQ9ZnVuY3Rpb24gdChlKXt2YXIgbj1CdChlKTtmdW5jdGlvbiByKHQsZSl7dmFyIHI9bigodD1rdCh0KSkuciwoZT1rdChlKSkuciksaT1uKHQuZyxlLmcpLG89bih0LmIsZS5iKSxhPUd0KHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5yPXIoZSksdC5nPWkoZSksdC5iPW8oZSksdC5vcGFjaXR5PWEoZSksdCtcIlwifX1yZXR1cm4gci5nYW1tYT10LHJ9KDEpO2Z1bmN0aW9uIFV0KHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbixyLGk9ZS5sZW5ndGgsbz1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSkscz1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPGk7KytuKXI9a3QoZVtuXSksb1tuXT1yLnJ8fDAsYVtuXT1yLmd8fDAsc1tuXT1yLmJ8fDA7cmV0dXJuIG89dChvKSxhPXQoYSkscz10KHMpLHIub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiByLnI9byh0KSxyLmc9YSh0KSxyLmI9cyh0KSxyK1wiXCJ9fX1VdCgoZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgtMTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHI9bjw9MD9uPTA6bj49MT8obj0xLGUtMSk6TWF0aC5mbG9vcihuKmUpLGk9dFtyXSxvPXRbcisxXSxhPXI+MD90W3ItMV06MippLW8scz1yPGUtMT90W3IrMl06MipvLWk7cmV0dXJuIE50KChuLXIvZSkqZSxhLGksbyxzKX19KSksVXQoKGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihuKXt2YXIgcj1NYXRoLmZsb29yKCgobiU9MSk8MD8rK246bikqZSksaT10WyhyK2UtMSklZV0sbz10W3IlZV0sYT10WyhyKzEpJWVdLHM9dFsocisyKSVlXTtyZXR1cm4gTnQoKG4tci9lKSplLGksbyxhLHMpfX0pKTt2YXIgenQ9ZnVuY3Rpb24odCxlKXtlfHwoZT1bXSk7dmFyIG4scj10P01hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKTowLGk9ZS5zbGljZSgpO3JldHVybiBmdW5jdGlvbihvKXtmb3Iobj0wO248cjsrK24paVtuXT10W25dKigxLW8pK2Vbbl0qbztyZXR1cm4gaX19O2Z1bmN0aW9uIFZ0KHQpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJiEodCBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiBXdCh0LGUpe3ZhciBuLHI9ZT9lLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KHIpO2ZvcihuPTA7bjxpOysrbilvW25dPSR0KHRbbl0sZVtuXSk7Zm9yKDtuPHI7KytuKWFbbl09ZVtuXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKG49MDtuPGk7KytuKWFbbl09b1tuXSh0KTtyZXR1cm4gYX19dmFyIFh0PWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IERhdGU7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihyKXtyZXR1cm4gbi5zZXRUaW1lKHQqKDEtcikrZSpyKSxufX0sWXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19O2Z1bmN0aW9uIEh0KHQpe3JldHVybihIdD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9dmFyIHF0PWZ1bmN0aW9uKHQsZSl7dmFyIG4scj17fSxpPXt9O2ZvcihuIGluIG51bGwhPT10JiZcIm9iamVjdFwiPT09SHQodCl8fCh0PXt9KSxudWxsIT09ZSYmXCJvYmplY3RcIj09PUh0KGUpfHwoZT17fSksZSluIGluIHQ/cltuXT0kdCh0W25dLGVbbl0pOmlbbl09ZVtuXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKG4gaW4gcilpW25dPXJbbl0odCk7cmV0dXJuIGl9fSxLdD0vWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csWnQ9bmV3IFJlZ0V4cChLdC5zb3VyY2UsXCJnXCIpO3ZhciBRdD1mdW5jdGlvbih0LGUpe3ZhciBuLHIsaSxvPUt0Lmxhc3RJbmRleD1adC5sYXN0SW5kZXg9MCxhPS0xLHM9W10sdT1bXTtmb3IodCs9XCJcIixlKz1cIlwiOyhuPUt0LmV4ZWModCkpJiYocj1adC5leGVjKGUpKTspKGk9ci5pbmRleCk+byYmKGk9ZS5zbGljZShvLGkpLHNbYV0/c1thXSs9aTpzWysrYV09aSksKG49blswXSk9PT0ocj1yWzBdKT9zW2FdP3NbYV0rPXI6c1srK2FdPXI6KHNbKythXT1udWxsLHUucHVzaCh7aTphLHg6WXQobixyKX0pKSxvPVp0Lmxhc3RJbmRleDtyZXR1cm4gbzxlLmxlbmd0aCYmKGk9ZS5zbGljZShvKSxzW2FdP3NbYV0rPWk6c1srK2FdPWkpLHMubGVuZ3RoPDI/dVswXT9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrXCJcIn19KHVbMF0ueCk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fShlKTooZT11Lmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIG4scj0wO3I8ZTsrK3Ipc1sobj11W3JdKS5pXT1uLngodCk7cmV0dXJuIHMuam9pbihcIlwiKX0pfTtmdW5jdGlvbiBKdCh0KXtyZXR1cm4oSnQ9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfXZhciAkdD1mdW5jdGlvbih0LGUpe3ZhciBuLHI9SnQoZSk7cmV0dXJuIG51bGw9PWV8fFwiYm9vbGVhblwiPT09cj9SdChlKTooXCJudW1iZXJcIj09PXI/WXQ6XCJzdHJpbmdcIj09PXI/KG49U3QoZSkpPyhlPW4sRnQpOlF0OmUgaW5zdGFuY2VvZiBTdD9GdDplIGluc3RhbmNlb2YgRGF0ZT9YdDpWdChlKT96dDpBcnJheS5pc0FycmF5KGUpP1d0OlwiZnVuY3Rpb25cIiE9dHlwZW9mIGUudmFsdWVPZiYmXCJmdW5jdGlvblwiIT10eXBlb2YgZS50b1N0cmluZ3x8aXNOYU4oZSk/cXQ6WXQpKHQsZSl9LHRlPW4oNTIpLGVlPVsxLDAsMCwwLDEsMCwwLDAsMV07ZnVuY3Rpb24gbmUodCxlLG4pe3ZhciBpLG89ZS5zdGFydFRpbWU7aWYobjxvK2UuZGVsYXl8fGUuX3BhdXNlZClyZXR1cm4hMTt2YXIgYT1lLmR1cmF0aW9uLHM9ZS5lYXNpbmc7aWYobj1uLW8tZS5kZWxheSxlLnJlcGVhdClpPW4lYS9hLGk9cltzXShpKTtlbHNle2lmKCEoKGk9bi9hKTwxKSlyZXR1cm4gZS5vbkZyYW1lP3QuYXR0cihlLm9uRnJhbWUoMSkpOnQuYXR0cihlLnRvQXR0cnMpLCEwO2k9cltzXShpKX1pZihlLm9uRnJhbWUpe3ZhciBjPWUub25GcmFtZShpKTt0LmF0dHIoYyl9ZWxzZSFmdW5jdGlvbih0LGUsbil7dmFyIHI9e30saT1lLmZyb21BdHRycyxvPWUudG9BdHRycztpZighdC5kZXN0cm95ZWQpe3ZhciBhLHMsYyxmO2Zvcih2YXIgbCBpbiBvKWlmKCFPYmplY3QodS5xKShpW2xdLG9bbF0pKWlmKFwicGF0aFwiPT09bCl7dmFyIGg9b1tsXSxkPWlbbF07aC5sZW5ndGg+ZC5sZW5ndGg/KGg9dGUucGFyc2VQYXRoU3RyaW5nKG9bbF0pLGQ9dGUucGFyc2VQYXRoU3RyaW5nKGlbbF0pLGQ9dGUuZmlsbFBhdGhCeURpZmYoZCxoKSxkPXRlLmZvcm1hdFBhdGgoZCxoKSxlLmZyb21BdHRycy5wYXRoPWQsZS50b0F0dHJzLnBhdGg9aCk6ZS5wYXRoRm9ybWF0dGVkfHwoaD10ZS5wYXJzZVBhdGhTdHJpbmcob1tsXSksZD10ZS5wYXJzZVBhdGhTdHJpbmcoaVtsXSksZD10ZS5mb3JtYXRQYXRoKGQsaCksZS5mcm9tQXR0cnMucGF0aD1kLGUudG9BdHRycy5wYXRoPWgsZS5wYXRoRm9ybWF0dGVkPSEwKSxyW2xdPVtdO2Zvcih2YXIgcD0wO3A8aC5sZW5ndGg7cCsrKXtmb3IodmFyIGc9aFtwXSx2PWRbcF0seT1bXSxtPTA7bTxnLmxlbmd0aDttKyspT2JqZWN0KHUudCkoZ1ttXSkmJnYmJk9iamVjdCh1LnQpKHZbbV0pPyhhPSR0KHZbbV0sZ1ttXSkseS5wdXNoKGEobikpKTp5LnB1c2goZ1ttXSk7cltsXS5wdXNoKHkpfX1lbHNlIGlmKFwibWF0cml4XCI9PT1sKXt2YXIgYj0oYz1pW2xdfHxlZSwoVnQoZj1vW2xdfHxlZSk/enQ6V3QpKGMsZikpKG4pO3JbbF09Yn1lbHNlW1wiZmlsbFwiLFwic3Ryb2tlXCIsXCJmaWxsU3R5bGVcIixcInN0cm9rZVN0eWxlXCJdLmluY2x1ZGVzKGwpJiYocz1vW2xdLC9eW3IsUixMLGxdezF9W1xcc10qXFwoLy50ZXN0KHMpKT9yW2xdPW9bbF06T2JqZWN0KHUucikob1tsXSl8fChhPSR0KGlbbF0sb1tsXSkscltsXT1hKG4pKTt0LmF0dHIocil9fSh0LGUsaSk7cmV0dXJuITF9dmFyIHJlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmFuaW1hdG9ycz1bXSx0aGlzLmN1cnJlbnQ9MCx0aGlzLnRpbWVyPW51bGwsdGhpcy5jYW52YXM9dH1yZXR1cm4gdC5wcm90b3R5cGUuaW5pdFRpbWVyPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9dGhpczt0aGlzLnRpbWVyPUUoKGZ1bmN0aW9uKGkpe2lmKHIuY3VycmVudD1pLHIuYW5pbWF0b3JzLmxlbmd0aD4wKXtmb3IodmFyIG89ci5hbmltYXRvcnMubGVuZ3RoLTE7bz49MDtvLS0paWYoKHQ9ci5hbmltYXRvcnNbb10pLmRlc3Ryb3llZClyLnJlbW92ZUFuaW1hdG9yKG8pO2Vsc2V7aWYoIXQuaXNBbmltYXRlUGF1c2VkKCkpZm9yKHZhciBhPShlPXQuZ2V0KFwiYW5pbWF0aW9uc1wiKSkubGVuZ3RoLTE7YT49MDthLS0pbj1lW2FdLG5lKHQsbixpKSYmKGUuc3BsaWNlKGEsMSksITEsbi5jYWxsYmFjayYmbi5jYWxsYmFjaygpKTswPT09ZS5sZW5ndGgmJnIucmVtb3ZlQW5pbWF0b3Iobyl9ci5jYW52YXMuZ2V0KFwiYXV0b0RyYXdcIil8fHIuY2FudmFzLmRyYXcoKX19KSl9LHQucHJvdG90eXBlLmFkZEFuaW1hdG9yPWZ1bmN0aW9uKHQpe3RoaXMuYW5pbWF0b3JzLnB1c2godCl9LHQucHJvdG90eXBlLnJlbW92ZUFuaW1hdG9yPWZ1bmN0aW9uKHQpe3RoaXMuYW5pbWF0b3JzLnNwbGljZSh0LDEpfSx0LnByb3RvdHlwZS5pc0FuaW1hdGluZz1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5hbmltYXRvcnMubGVuZ3RofSx0LnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy50aW1lciYmdGhpcy50aW1lci5zdG9wKCl9LHQucHJvdG90eXBlLnN0b3BBbGxBbmltYXRpb25zPWZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PSEwKSx0aGlzLmFuaW1hdG9ycy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnN0b3BBbmltYXRlKHQpfSkpLHRoaXMuYW5pbWF0b3JzPVtdLHRoaXMuY2FudmFzLmRyYXcoKX0sdC5wcm90b3R5cGUuZ2V0VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnR9LHR9KCksaWU9bigxMTYpLG9lPVtcIm1vdXNlZG93blwiLFwibW91c2V1cFwiLFwiZGJsY2xpY2tcIixcIm1vdXNlb3V0XCIsXCJtb3VzZW92ZXJcIixcIm1vdXNlbW92ZVwiLFwibW91c2VsZWF2ZVwiLFwibW91c2VlbnRlclwiLFwidG91Y2hzdGFydFwiLFwidG91Y2htb3ZlXCIsXCJ0b3VjaGVuZFwiLFwiZHJhZ2VudGVyXCIsXCJkcmFnb3ZlclwiLFwiZHJhZ2xlYXZlXCIsXCJkcm9wXCIsXCJjb250ZXh0bWVudVwiLFwibW91c2V3aGVlbFwiXTtmdW5jdGlvbiBhZSh0LGUsbil7bi5uYW1lPWUsbi50YXJnZXQ9dCxuLmN1cnJlbnRUYXJnZXQ9dCxuLmRlbGVnYXRlVGFyZ2V0PXQsdC5lbWl0KGUsbil9ZnVuY3Rpb24gc2UodCxlLG4pe2lmKG4uYnViYmxlcyl7dmFyIHI9dm9pZCAwLGk9ITE7aWYoXCJtb3VzZWVudGVyXCI9PT1lPyhyPW4uZnJvbVNoYXBlLGk9ITApOlwibW91c2VsZWF2ZVwiPT09ZSYmKGk9ITAscj1uLnRvU2hhcGUpLHQuaXNDYW52YXMoKSYmaSlyZXR1cm47aWYociYmT2JqZWN0KHMuZykodCxyKSlyZXR1cm4gdm9pZChuLmJ1YmJsZXM9ITEpO24ubmFtZT1lLG4uY3VycmVudFRhcmdldD10LG4uZGVsZWdhdGVUYXJnZXQ9dCx0LmVtaXQoZSxuKX19dmFyIHVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgZT10aGlzO3RoaXMuZHJhZ2dpbmdTaGFwZT1udWxsLHRoaXMuZHJhZ2dpbmc9ITEsdGhpcy5jdXJyZW50U2hhcGU9bnVsbCx0aGlzLm1vdXNlZG93blNoYXBlPW51bGwsdGhpcy5tb3VzZWRvd25Qb2ludD1udWxsLHRoaXMuX2V2ZW50Q2FsbGJhY2s9ZnVuY3Rpb24odCl7dmFyIG49dC50eXBlO2UuX3RyaWdnZXJFdmVudChuLHQpfSx0aGlzLl9vbkRvY3VtZW50TW92ZT1mdW5jdGlvbih0KXtpZihlLmNhbnZhcy5nZXQoXCJlbFwiKSE9PXQudGFyZ2V0JiYoZS5kcmFnZ2luZ3x8ZS5jdXJyZW50U2hhcGUpKXt2YXIgbj1lLl9nZXRQb2ludEluZm8odCk7ZS5kcmFnZ2luZyYmZS5fZW1pdEV2ZW50KFwiZHJhZ1wiLHQsbixlLmRyYWdnaW5nU2hhcGUpfX0sdGhpcy5fb25Eb2N1bWVudE1vdXNlVXA9ZnVuY3Rpb24odCl7aWYoZS5jYW52YXMuZ2V0KFwiZWxcIikhPT10LnRhcmdldCYmZS5kcmFnZ2luZyl7dmFyIG49ZS5fZ2V0UG9pbnRJbmZvKHQpO2UuZHJhZ2dpbmdTaGFwZSYmZS5fZW1pdEV2ZW50KFwiZHJvcFwiLHQsbixudWxsKSxlLl9lbWl0RXZlbnQoXCJkcmFnZW5kXCIsdCxuLGUuZHJhZ2dpbmdTaGFwZSksZS5fYWZ0ZXJEcmFnKGUuZHJhZ2dpbmdTaGFwZSxuLHQpfX0sdGhpcy5jYW52YXM9dC5jYW52YXN9cmV0dXJuIHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLl9iaW5kRXZlbnRzKCl9LHQucHJvdG90eXBlLl9iaW5kRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuY2FudmFzLmdldChcImVsXCIpO09iamVjdChzLmEpKG9lLChmdW5jdGlvbihuKXtlLmFkZEV2ZW50TGlzdGVuZXIobix0Ll9ldmVudENhbGxiYWNrKX0pKSxkb2N1bWVudCYmKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbkRvY3VtZW50TW92ZSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0aGlzLl9vbkRvY3VtZW50TW91c2VVcCkpfSx0LnByb3RvdHlwZS5fY2xlYXJFdmVudHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5jYW52YXMuZ2V0KFwiZWxcIik7T2JqZWN0KHMuYSkob2UsKGZ1bmN0aW9uKG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLHQuX2V2ZW50Q2FsbGJhY2spfSkpLGRvY3VtZW50JiYoZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uRG9jdW1lbnRNb3ZlKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uRG9jdW1lbnRNb3VzZVVwKSl9LHQucHJvdG90eXBlLl9nZXRFdmVudE9iaj1mdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGE9bmV3IGllLmEodCxlKTtyZXR1cm4gYS5mcm9tU2hhcGU9aSxhLnRvU2hhcGU9byxhLng9bi54LGEueT1uLnksYS5jbGllbnRYPW4uY2xpZW50WCxhLmNsaWVudFk9bi5jbGllbnRZLGEucHJvcGFnYXRpb25QYXRoLnB1c2gociksYX0sdC5wcm90b3R5cGUuX2dldFNoYXBlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2FudmFzLmdldFNoYXBlKHQueCx0LnksZSl9LHQucHJvdG90eXBlLl9nZXRQb2ludEluZm89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYW52YXMsbj1lLmdldENsaWVudEJ5RXZlbnQodCkscj1lLmdldFBvaW50QnlFdmVudCh0KTtyZXR1cm57eDpyLngseTpyLnksY2xpZW50WDpuLngsY2xpZW50WTpuLnl9fSx0LnByb3RvdHlwZS5fdHJpZ2dlckV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZ2V0UG9pbnRJbmZvKGUpLHI9dGhpcy5fZ2V0U2hhcGUobixlKSxpPXRoaXNbXCJfb25cIit0XSxvPSExO2lmKGkpaS5jYWxsKHRoaXMsbixyLGUpO2Vsc2V7dmFyIGE9dGhpcy5jdXJyZW50U2hhcGU7XCJtb3VzZWVudGVyXCI9PT10fHxcImRyYWdlbnRlclwiPT09dHx8XCJtb3VzZW92ZXJcIj09PXQ/KHRoaXMuX2VtaXRFdmVudCh0LGUsbixudWxsLG51bGwsciksciYmdGhpcy5fZW1pdEV2ZW50KHQsZSxuLHIsbnVsbCxyKSxcIm1vdXNlZW50ZXJcIj09PXQmJnRoaXMuZHJhZ2dpbmdTaGFwZSYmdGhpcy5fZW1pdEV2ZW50KFwiZHJhZ2VudGVyXCIsZSxuLG51bGwpKTpcIm1vdXNlbGVhdmVcIj09PXR8fFwiZHJhZ2xlYXZlXCI9PT10fHxcIm1vdXNlb3V0XCI9PT10PyhvPSEwLGEmJnRoaXMuX2VtaXRFdmVudCh0LGUsbixhLGEsbnVsbCksdGhpcy5fZW1pdEV2ZW50KHQsZSxuLG51bGwsYSxudWxsKSxcIm1vdXNlbGVhdmVcIj09PXQmJnRoaXMuZHJhZ2dpbmdTaGFwZSYmdGhpcy5fZW1pdEV2ZW50KFwiZHJhZ2xlYXZlXCIsZSxuLG51bGwpKTp0aGlzLl9lbWl0RXZlbnQodCxlLG4scixudWxsLG51bGwpfWlmKG98fCh0aGlzLmN1cnJlbnRTaGFwZT1yKSxyJiYhci5nZXQoXCJkZXN0cm95ZWRcIikpe3ZhciBzPXRoaXMuY2FudmFzO3MuZ2V0KFwiZWxcIikuc3R5bGUuY3Vyc29yPXIuYXR0cihcImN1cnNvclwiKXx8cy5nZXQoXCJjdXJzb3JcIil9fSx0LnByb3RvdHlwZS5fb25tb3VzZWRvd249ZnVuY3Rpb24odCxlLG4pezA9PT1uLmJ1dHRvbiYmKHRoaXMubW91c2Vkb3duU2hhcGU9ZSx0aGlzLm1vdXNlZG93blBvaW50PXQsdGhpcy5tb3VzZWRvd25UaW1lU3RhbXA9bi50aW1lU3RhbXApLHRoaXMuX2VtaXRFdmVudChcIm1vdXNlZG93blwiLG4sdCxlLG51bGwsbnVsbCl9LHQucHJvdG90eXBlLl9lbWl0TW91c2VvdmVyRXZlbnRzPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMuY2FudmFzLmdldChcImVsXCIpO24hPT1yJiYobiYmKHRoaXMuX2VtaXRFdmVudChcIm1vdXNlb3V0XCIsdCxlLG4sbixyKSx0aGlzLl9lbWl0RXZlbnQoXCJtb3VzZWxlYXZlXCIsdCxlLG4sbixyKSxyJiYhci5nZXQoXCJkZXN0cm95ZWRcIil8fChpLnN0eWxlLmN1cnNvcj10aGlzLmNhbnZhcy5nZXQoXCJjdXJzb3JcIikpKSxyJiYodGhpcy5fZW1pdEV2ZW50KFwibW91c2VvdmVyXCIsdCxlLHIsbixyKSx0aGlzLl9lbWl0RXZlbnQoXCJtb3VzZWVudGVyXCIsdCxlLHIsbixyKSkpfSx0LnByb3RvdHlwZS5fZW1pdERyYWdvdmVyRXZlbnRzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cj8ociE9PW4mJihuJiZ0aGlzLl9lbWl0RXZlbnQoXCJkcmFnbGVhdmVcIix0LGUsbixuLHIpLHRoaXMuX2VtaXRFdmVudChcImRyYWdlbnRlclwiLHQsZSxyLG4scikpLGl8fHRoaXMuX2VtaXRFdmVudChcImRyYWdvdmVyXCIsdCxlLHIpKTpuJiZ0aGlzLl9lbWl0RXZlbnQoXCJkcmFnbGVhdmVcIix0LGUsbixuLHIpLGkmJnRoaXMuX2VtaXRFdmVudChcImRyYWdvdmVyXCIsdCxlLHIpfSx0LnByb3RvdHlwZS5fYWZ0ZXJEcmFnPWZ1bmN0aW9uKHQsZSxuKXt0JiYodC5zZXQoXCJjYXB0dXJlXCIsITApLHRoaXMuZHJhZ2dpbmdTaGFwZT1udWxsKSx0aGlzLmRyYWdnaW5nPSExO3ZhciByPXRoaXMuX2dldFNoYXBlKGUsbik7ciE9PXQmJnRoaXMuX2VtaXRNb3VzZW92ZXJFdmVudHMobixlLHQsciksdGhpcy5jdXJyZW50U2hhcGU9cn0sdC5wcm90b3R5cGUuX29ubW91c2V1cD1mdW5jdGlvbih0LGUsbil7aWYoMD09PW4uYnV0dG9uKXt2YXIgcj10aGlzLmRyYWdnaW5nU2hhcGU7dGhpcy5kcmFnZ2luZz8ociYmdGhpcy5fZW1pdEV2ZW50KFwiZHJvcFwiLG4sdCxlKSx0aGlzLl9lbWl0RXZlbnQoXCJkcmFnZW5kXCIsbix0LHIpLHRoaXMuX2FmdGVyRHJhZyhyLHQsbikpOih0aGlzLl9lbWl0RXZlbnQoXCJtb3VzZXVwXCIsbix0LGUpLGU9PT10aGlzLm1vdXNlZG93blNoYXBlJiZ0aGlzLl9lbWl0RXZlbnQoXCJjbGlja1wiLG4sdCxlKSx0aGlzLm1vdXNlZG93blNoYXBlPW51bGwsdGhpcy5tb3VzZWRvd25Qb2ludD1udWxsKX19LHQucHJvdG90eXBlLl9vbmRyYWdvdmVyPWZ1bmN0aW9uKHQsZSxuKXtuLnByZXZlbnREZWZhdWx0KCk7dmFyIHI9dGhpcy5jdXJyZW50U2hhcGU7dGhpcy5fZW1pdERyYWdvdmVyRXZlbnRzKG4sdCxyLGUsITApfSx0LnByb3RvdHlwZS5fb25tb3VzZW1vdmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuY2FudmFzLGk9dGhpcy5jdXJyZW50U2hhcGUsbz10aGlzLmRyYWdnaW5nU2hhcGU7aWYodGhpcy5kcmFnZ2luZylvJiZ0aGlzLl9lbWl0RHJhZ292ZXJFdmVudHMobix0LGksZSwhMSksdGhpcy5fZW1pdEV2ZW50KFwiZHJhZ1wiLG4sdCxvKTtlbHNle3ZhciBhPXRoaXMubW91c2Vkb3duUG9pbnQ7aWYoYSl7dmFyIHM9dGhpcy5tb3VzZWRvd25TaGFwZSx1PW4udGltZVN0YW1wLXRoaXMubW91c2Vkb3duVGltZVN0YW1wLGM9YS5jbGllbnRYLXQuY2xpZW50WCxmPWEuY2xpZW50WS10LmNsaWVudFk7dT4xMjB8fGMqYytmKmY+NDA/cyYmcy5nZXQoXCJkcmFnZ2FibGVcIik/KChvPXRoaXMubW91c2Vkb3duU2hhcGUpLnNldChcImNhcHR1cmVcIiwhMSksdGhpcy5kcmFnZ2luZ1NoYXBlPW8sdGhpcy5kcmFnZ2luZz0hMCx0aGlzLl9lbWl0RXZlbnQoXCJkcmFnc3RhcnRcIixuLHQsbyksdGhpcy5tb3VzZWRvd25TaGFwZT1udWxsLHRoaXMubW91c2Vkb3duUG9pbnQ9bnVsbCk6IXMmJnIuZ2V0KFwiZHJhZ2dhYmxlXCIpPyh0aGlzLmRyYWdnaW5nPSEwLHRoaXMuX2VtaXRFdmVudChcImRyYWdzdGFydFwiLG4sdCxudWxsKSx0aGlzLm1vdXNlZG93blNoYXBlPW51bGwsdGhpcy5tb3VzZWRvd25Qb2ludD1udWxsKToodGhpcy5fZW1pdE1vdXNlb3ZlckV2ZW50cyhuLHQsaSxlKSx0aGlzLl9lbWl0RXZlbnQoXCJtb3VzZW1vdmVcIixuLHQsZSkpOih0aGlzLl9lbWl0TW91c2VvdmVyRXZlbnRzKG4sdCxpLGUpLHRoaXMuX2VtaXRFdmVudChcIm1vdXNlbW92ZVwiLG4sdCxlKSl9ZWxzZSB0aGlzLl9lbWl0TW91c2VvdmVyRXZlbnRzKG4sdCxpLGUpLHRoaXMuX2VtaXRFdmVudChcIm1vdXNlbW92ZVwiLG4sdCxlKX19LHQucHJvdG90eXBlLl9lbWl0RXZlbnQ9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBhPXRoaXMuX2dldEV2ZW50T2JqKHQsZSxuLHIsaSxvKTtpZihyKXthLnNoYXBlPXIsYWUocix0LGEpO2Zvcih2YXIgcz1yLmdldFBhcmVudCgpO3M7KXMuZW1pdERlbGVnYXRpb24odCxhKSxhLnByb3BhZ2F0aW9uU3RvcHBlZHx8c2Uocyx0LGEpLGEucHJvcGFnYXRpb25QYXRoLnB1c2gocykscz1zLmdldFBhcmVudCgpfWVsc2V7YWUodGhpcy5jYW52YXMsdCxhKX19LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckV2ZW50cygpLHRoaXMuY2FudmFzPW51bGwsdGhpcy5jdXJyZW50U2hhcGU9bnVsbCx0aGlzLmRyYWdnaW5nU2hhcGU9bnVsbCx0aGlzLm1vdXNlZG93blBvaW50PW51bGwsdGhpcy5tb3VzZWRvd25TaGFwZT1udWxsLHRoaXMubW91c2Vkb3duVGltZVN0YW1wPW51bGx9LHR9KCksY2U9T2JqZWN0KG8uYSkoKSxmZT1jZSYmXCJmaXJlZm94XCI9PT1jZS5uYW1lLGxlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4uaW5pdENvbnRhaW5lcigpLG4uaW5pdERvbSgpLG4uaW5pdEV2ZW50cygpLG4uaW5pdFRpbWVsaW5lKCksbn1yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0Q2ZnPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZy5jYWxsKHRoaXMpO3JldHVybiBlLmN1cnNvcj1cImRlZmF1bHRcIixlLnN1cHBvcnRDU1NUcmFuc2Zvcm09ITEsZX0sZS5wcm90b3R5cGUuaW5pdENvbnRhaW5lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwiY29udGFpbmVyXCIpO09iamVjdChzLmgpKHQpJiYodD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KSx0aGlzLnNldChcImNvbnRhaW5lclwiLHQpKX0sZS5wcm90b3R5cGUuaW5pdERvbT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY3JlYXRlRG9tKCk7dGhpcy5zZXQoXCJlbFwiLHQpLHRoaXMuZ2V0KFwiY29udGFpbmVyXCIpLmFwcGVuZENoaWxkKHQpLHRoaXMuc2V0RE9NU2l6ZSh0aGlzLmdldChcIndpZHRoXCIpLHRoaXMuZ2V0KFwiaGVpZ2h0XCIpKX0sZS5wcm90b3R5cGUuaW5pdEV2ZW50cz1mdW5jdGlvbigpe3ZhciB0PW5ldyB1ZSh7Y2FudmFzOnRoaXN9KTt0LmluaXQoKSx0aGlzLnNldChcImV2ZW50Q29udHJvbGxlclwiLHQpfSxlLnByb3RvdHlwZS5pbml0VGltZWxpbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgcmUodGhpcyk7dGhpcy5zZXQoXCJ0aW1lbGluZVwiLHQpfSxlLnByb3RvdHlwZS5zZXRET01TaXplPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXQoXCJlbFwiKTtzLmMmJihuLnN0eWxlLndpZHRoPXQrXCJweFwiLG4uc3R5bGUuaGVpZ2h0PWUrXCJweFwiKX0sZS5wcm90b3R5cGUuY2hhbmdlU2l6ZT1mdW5jdGlvbih0LGUpe3RoaXMuc2V0RE9NU2l6ZSh0LGUpLHRoaXMuc2V0KFwid2lkdGhcIix0KSx0aGlzLnNldChcImhlaWdodFwiLGUpLHRoaXMub25DYW52YXNDaGFuZ2UoXCJjaGFuZ2VTaXplXCIpfSxlLnByb3RvdHlwZS5nZXRSZW5kZXJlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcInJlbmRlcmVyXCIpfSxlLnByb3RvdHlwZS5nZXRDdXJzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJjdXJzb3JcIil9LGUucHJvdG90eXBlLnNldEN1cnNvcj1mdW5jdGlvbih0KXt0aGlzLnNldChcImN1cnNvclwiLHQpO3ZhciBlPXRoaXMuZ2V0KFwiZWxcIik7cy5jJiZlJiYoZS5zdHlsZS5jdXJzb3I9dCl9LGUucHJvdG90eXBlLmdldFBvaW50QnlFdmVudD1mdW5jdGlvbih0KXtpZih0aGlzLmdldChcInN1cHBvcnRDU1NUcmFuc2Zvcm1cIikpe2lmKGZlJiYhT2JqZWN0KHMuZSkodC5sYXllclgpJiZ0LmxheWVyWCE9PXQub2Zmc2V0WClyZXR1cm57eDp0LmxheWVyWCx5OnQubGF5ZXJZfTtpZighT2JqZWN0KHMuZSkodC5vZmZzZXRYKSlyZXR1cm57eDp0Lm9mZnNldFgseTp0Lm9mZnNldFl9fXZhciBlPXRoaXMuZ2V0Q2xpZW50QnlFdmVudCh0KSxuPWUueCxyPWUueTtyZXR1cm4gdGhpcy5nZXRQb2ludEJ5Q2xpZW50KG4scil9LGUucHJvdG90eXBlLmdldENsaWVudEJ5RXZlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdC50b3VjaGVzJiYoZT1cInRvdWNoZW5kXCI9PT10LnR5cGU/dC5jaGFuZ2VkVG91Y2hlc1swXTp0LnRvdWNoZXNbMF0pLHt4OmUuY2xpZW50WCx5OmUuY2xpZW50WX19LGUucHJvdG90eXBlLmdldFBvaW50QnlDbGllbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldChcImVsXCIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4OnQtbi5sZWZ0LHk6ZS1uLnRvcH19LGUucHJvdG90eXBlLmdldENsaWVudEJ5UG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldChcImVsXCIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4OnQrbi5sZWZ0LHk6ZStuLnRvcH19LGUucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLnJlbW92ZURvbT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwiZWxcIik7dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfSxlLnByb3RvdHlwZS5jbGVhckV2ZW50cz1mdW5jdGlvbigpe3RoaXMuZ2V0KFwiZXZlbnRDb250cm9sbGVyXCIpLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUuaXNDYW52YXM9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZ2V0UGFyZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldChcInRpbWVsaW5lXCIpO3RoaXMuZ2V0KFwiZGVzdHJveWVkXCIpfHwodGhpcy5jbGVhcigpLGUmJmUuc3RvcCgpLHRoaXMuY2xlYXJFdmVudHMoKSx0aGlzLnJlbW92ZURvbSgpLHQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSl9LGV9KGEuYSk7ZS5hPWxlfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJhXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSk7dmFyIHI9bmV3IE1hcDtmdW5jdGlvbiBpKHQsZSl7ci5zZXQodCxlKX1mdW5jdGlvbiBvKHQpe3JldHVybiByLmdldCh0KX12YXIgYT1mdW5jdGlvbih0KXt2YXIgZT10LmF0dHIoKTtyZXR1cm57eDplLngseTplLnksd2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9fSxzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cigpLG49ZS54LHI9ZS55LGk9ZS5yO3JldHVybnt4Om4taSx5OnItaSx3aWR0aDoyKmksaGVpZ2h0OjIqaX19LHU9bigyMCk7ZnVuY3Rpb24gYyh0LGUpe3JldHVybiB0JiZlP3ttaW5YOk1hdGgubWluKHQubWluWCxlLm1pblgpLG1pblk6TWF0aC5taW4odC5taW5ZLGUubWluWSksbWF4WDpNYXRoLm1heCh0Lm1heFgsZS5tYXhYKSxtYXhZOk1hdGgubWF4KHQubWF4WSxlLm1heFkpfTp0fHxlfWZ1bmN0aW9uIGYodCxlKXt2YXIgbj10LmdldChcInN0YXJ0QXJyb3dTaGFwZVwiKSxyPXQuZ2V0KFwiZW5kQXJyb3dTaGFwZVwiKTtyZXR1cm4gbiYmKGU9YyhlLG4uZ2V0Q2FudmFzQkJveCgpKSksciYmKGU9YyhlLHIuZ2V0Q2FudmFzQkJveCgpKSksZX12YXIgbD1uKDY5KSxoPW4oMzgpLGQ9bigwKTtmdW5jdGlvbiBwKHQsZSl7dmFyIG49dC5wcmVQb2ludCxyPXQuY3VycmVudFBvaW50LGk9dC5uZXh0UG9pbnQsbz1NYXRoLnBvdyhyWzBdLW5bMF0sMikrTWF0aC5wb3coclsxXS1uWzFdLDIpLGE9TWF0aC5wb3coclswXS1pWzBdLDIpK01hdGgucG93KHJbMV0taVsxXSwyKSxzPU1hdGgucG93KG5bMF0taVswXSwyKStNYXRoLnBvdyhuWzFdLWlbMV0sMiksdT1NYXRoLmFjb3MoKG8rYS1zKS8oMipNYXRoLnNxcnQobykqTWF0aC5zcXJ0KGEpKSk7aWYoIXV8fDA9PT1NYXRoLnNpbih1KXx8T2JqZWN0KGQudSkodSwwKSlyZXR1cm57eEV4dHJhOjAseUV4dHJhOjB9O3ZhciBjPU1hdGguYWJzKE1hdGguYXRhbjIoaVsxXS1yWzFdLGlbMF0tclswXSkpLGY9TWF0aC5hYnMoTWF0aC5hdGFuMihpWzBdLXJbMF0saVsxXS1yWzFdKSk7cmV0dXJuIGM9Yz5NYXRoLlBJLzI/TWF0aC5QSS1jOmMsZj1mPk1hdGguUEkvMj9NYXRoLlBJLWY6Zix7eEV4dHJhOk1hdGguY29zKHUvMi1jKSooZS8yKigxL01hdGguc2luKHUvMikpKS1lLzJ8fDAseUV4dHJhOk1hdGguY29zKGYtdS8yKSooZS8yKigxL01hdGguc2luKHUvMikpKS1lLzJ8fDB9fWkoXCJyZWN0XCIsYSksaShcImltYWdlXCIsYSksaShcImNpcmNsZVwiLHMpLGkoXCJtYXJrZXJcIixzKSxpKFwicG9seWxpbmVcIiwoZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuYXR0cigpLnBvaW50cyxuPVtdLHI9W10saT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO24ucHVzaChvWzBdKSxyLnB1c2gob1sxXSl9dmFyIGE9dS5mLmdldEJCb3hCeUFycmF5KG4scikscz1hLngsYz1hLnksbD17bWluWDpzLG1pblk6YyxtYXhYOnMrYS53aWR0aCxtYXhZOmMrYS5oZWlnaHR9O3JldHVybnt4OihsPWYodCxsKSkubWluWCx5OmwubWluWSx3aWR0aDpsLm1heFgtbC5taW5YLGhlaWdodDpsLm1heFktbC5taW5ZfX0pKSxpKFwicG9seWdvblwiLChmdW5jdGlvbih0KXtmb3IodmFyIGU9dC5hdHRyKCkucG9pbnRzLG49W10scj1bXSxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07bi5wdXNoKG9bMF0pLHIucHVzaChvWzFdKX1yZXR1cm4gdS5mLmdldEJCb3hCeUFycmF5KG4scil9KSksaShcInRleHRcIiwoZnVuY3Rpb24odCl7dmFyIGU9dC5hdHRyKCksbj1lLngscj1lLnksaT1lLnRleHQsbz1lLmZvbnRTaXplLGE9ZS5saW5lSGVpZ2h0LHM9ZS5mb250O3N8fChzPU9iamVjdChsLmEpKGUpKTt2YXIgdSxjPU9iamVjdChsLmMpKGkscyk7aWYoYyl7dmFyIGY9ZS50ZXh0QWxpZ24saD1lLnRleHRCYXNlbGluZSxkPU9iamVjdChsLmIpKGksbyxhKSxwPXt4Om4seTpyLWR9O2YmJihcImVuZFwiPT09Znx8XCJyaWdodFwiPT09Zj9wLngtPWM6XCJjZW50ZXJcIj09PWYmJihwLngtPWMvMikpLGgmJihcInRvcFwiPT09aD9wLnkrPWQ6XCJtaWRkbGVcIj09PWgmJihwLnkrPWQvMikpLHU9e3g6cC54LHk6cC55LHdpZHRoOmMsaGVpZ2h0OmR9fWVsc2UgdT17eDpuLHk6cix3aWR0aDowLGhlaWdodDowfTtyZXR1cm4gdX0pKSxpKFwicGF0aFwiLChmdW5jdGlvbih0KXt2YXIgZT10LmF0dHIoKSxuPWUucGF0aCxyPWUuc3Ryb2tlP2UubGluZVdpZHRoOjAsaT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXSxyPVtdLGk9W10sbz0wO288dC5sZW5ndGg7bysrKXt2YXIgYT0oeT10W29dKS5jdXJyZW50UG9pbnQscz15LnBhcmFtcyxjPXkucHJlUG9pbnQsZj12b2lkIDA7c3dpdGNoKHkuY29tbWFuZCl7Y2FzZVwiUVwiOmY9dS5lLmJveChjWzBdLGNbMV0sc1sxXSxzWzJdLHNbM10sc1s0XSk7YnJlYWs7Y2FzZVwiQ1wiOmY9dS5iLmJveChjWzBdLGNbMV0sc1sxXSxzWzJdLHNbM10sc1s0XSxzWzVdLHNbNl0pO2JyZWFrO2Nhc2VcIkFcIjp2YXIgbD15LmFyY1BhcmFtcztmPXUuYS5ib3gobC5jeCxsLmN5LGwucngsbC5yeSxsLnhSb3RhdGlvbixsLnN0YXJ0QW5nbGUsbC5lbmRBbmdsZSk7YnJlYWs7ZGVmYXVsdDpuLnB1c2goYVswXSksci5wdXNoKGFbMV0pfWYmJih5LmJveD1mLG4ucHVzaChmLngsZi54K2Yud2lkdGgpLHIucHVzaChmLnksZi55K2YuaGVpZ2h0KSksZSYmKFwiTFwiPT09eS5jb21tYW5kfHxcIk1cIj09PXkuY29tbWFuZCkmJnkucHJlUG9pbnQmJnkubmV4dFBvaW50JiZpLnB1c2goeSl9bj1uLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIU51bWJlci5pc05hTih0KX0pKSxyPXIuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hTnVtYmVyLmlzTmFOKHQpfSkpO3ZhciBoPU1hdGgubWluLmFwcGx5KG51bGwsbiksZD1NYXRoLm1pbi5hcHBseShudWxsLHIpLGc9TWF0aC5tYXguYXBwbHkobnVsbCxuKSx2PU1hdGgubWF4LmFwcGx5KG51bGwscik7aWYoMD09PWkubGVuZ3RoKXJldHVybnt4OmgseTpkLHdpZHRoOmctaCxoZWlnaHQ6di1kfTtmb3Iobz0wO288aS5sZW5ndGg7bysrKXt2YXIgeTsoYT0oeT1pW29dKS5jdXJyZW50UG9pbnQpWzBdPT09aD9oLT1wKHksZSkueEV4dHJhOmFbMF09PT1nJiYoZys9cCh5LGUpLnhFeHRyYSksYVsxXT09PWQ/ZC09cCh5LGUpLnlFeHRyYTphWzFdPT09diYmKHYrPXAoeSxlKS55RXh0cmEpfXJldHVybnt4OmgseTpkLHdpZHRoOmctaCxoZWlnaHQ6di1kfX0odC5nZXQoXCJzZWdtZW50c1wiKXx8T2JqZWN0KGguZCkobiksciksbz1pLngsYT1pLnkscz17bWluWDpvLG1pblk6YSxtYXhYOm8raS53aWR0aCxtYXhZOmEraS5oZWlnaHR9O3JldHVybnt4OihzPWYodCxzKSkubWluWCx5OnMubWluWSx3aWR0aDpzLm1heFgtcy5taW5YLGhlaWdodDpzLm1heFktcy5taW5ZfX0pKSxpKFwibGluZVwiLChmdW5jdGlvbih0KXt2YXIgZT10LmF0dHIoKSxuPWUueDEscj1lLnkxLGk9ZS54MixvPWUueTIsYT17bWluWDpNYXRoLm1pbihuLGkpLG1heFg6TWF0aC5tYXgobixpKSxtaW5ZOk1hdGgubWluKHIsbyksbWF4WTpNYXRoLm1heChyLG8pfTtyZXR1cm57eDooYT1mKHQsYSkpLm1pblgseTphLm1pblksd2lkdGg6YS5tYXhYLWEubWluWCxoZWlnaHQ6YS5tYXhZLWEubWluWX19KSksaShcImVsbGlwc2VcIiwoZnVuY3Rpb24odCl7dmFyIGU9dC5hdHRyKCksbj1lLngscj1lLnksaT1lLnJ4LG89ZS5yeTtyZXR1cm57eDpuLWkseTpyLW8sd2lkdGg6MippLGhlaWdodDoyKm99fSkpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigxKSxpPW4oMjEpLG89bigxNSksYT1uKDcxKSxzPW4oMzQpLHU9bigyNSksYz1uKDgxKSxmPW4oNzkpLGw9bigwKSxoPS9ebFxccypcXChcXHMqKFtcXGQuXSspXFxzKlxcKVxccyooLiopL2ksZD0vXnJcXHMqXFwoXFxzKihbXFxkLl0rKVxccyosXFxzKihbXFxkLl0rKVxccyosXFxzKihbXFxkLl0rKVxccypcXClcXHMqKC4qKS9pLHA9L1tcXGQuXSs6KCNbXlxcc10rfFteKV0rXFwpKS9naTtmdW5jdGlvbiBnKHQpe3ZhciBlPXQubWF0Y2gocCk7aWYoIWUpcmV0dXJuXCJcIjt2YXIgbj1cIlwiO3JldHVybiBlLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dC5zcGxpdChcIjpcIiksZT1lLnNwbGl0KFwiOlwiKSxOdW1iZXIodFswXSktTnVtYmVyKGVbMF0pfSkpLE9iamVjdChsLmYpKGUsKGZ1bmN0aW9uKHQpe3Q9dC5zcGxpdChcIjpcIiksbis9JzxzdG9wIG9mZnNldD1cIicrdFswXSsnXCIgc3RvcC1jb2xvcj1cIicrdFsxXSsnXCI+PC9zdG9wPid9KSksbn12YXIgdj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5jZmc9e307dmFyIGU9bnVsbCxuPU9iamVjdChsLkgpKFwiZ3JhZGllbnRfXCIpO3JldHVyblwibFwiPT09dC50b0xvd2VyQ2FzZSgpWzBdP2Z1bmN0aW9uKHQsZSl7dmFyIG4scixpPWguZXhlYyh0KSxvPU9iamVjdChsLkIpKE9iamVjdChsLkcpKHBhcnNlRmxvYXQoaVsxXSkpLDIqTWF0aC5QSSksYT1pWzJdO28+PTAmJm88LjUqTWF0aC5QST8obj17eDowLHk6MH0scj17eDoxLHk6MX0pOi41Kk1hdGguUEk8PW8mJm88TWF0aC5QST8obj17eDoxLHk6MH0scj17eDowLHk6MX0pOk1hdGguUEk8PW8mJm88MS41Kk1hdGguUEk/KG49e3g6MSx5OjF9LHI9e3g6MCx5OjB9KToobj17eDowLHk6MX0scj17eDoxLHk6MH0pO3ZhciBzPU1hdGgudGFuKG8pLHU9cypzLGM9KHIueC1uLngrcyooci55LW4ueSkpLyh1KzEpK24ueCxmPXMqKHIueC1uLngrcyooci55LW4ueSkpLyh1KzEpK24ueTtlLnNldEF0dHJpYnV0ZShcIngxXCIsbi54KSxlLnNldEF0dHJpYnV0ZShcInkxXCIsbi55KSxlLnNldEF0dHJpYnV0ZShcIngyXCIsYyksZS5zZXRBdHRyaWJ1dGUoXCJ5MlwiLGYpLGUuaW5uZXJIVE1MPWcoYSl9KHQsZT1PYmplY3QodS5iKShcImxpbmVhckdyYWRpZW50XCIpKTpmdW5jdGlvbih0LGUpe3ZhciBuPWQuZXhlYyh0KSxyPXBhcnNlRmxvYXQoblsxXSksaT1wYXJzZUZsb2F0KG5bMl0pLG89cGFyc2VGbG9hdChuWzNdKSxhPW5bNF07ZS5zZXRBdHRyaWJ1dGUoXCJjeFwiLHIpLGUuc2V0QXR0cmlidXRlKFwiY3lcIixpKSxlLnNldEF0dHJpYnV0ZShcInJcIixvKSxlLmlubmVySFRNTD1nKGEpfSh0LGU9T2JqZWN0KHUuYikoXCJyYWRpYWxHcmFkaWVudFwiKSksZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLG4pLHRoaXMuZWw9ZSx0aGlzLmlkPW4sdGhpcy5jZmc9dCx0aGlzfXJldHVybiB0LnByb3RvdHlwZS5tYXRjaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNmZz09PWV9LHR9KCkseT17c2hhZG93Q29sb3I6XCJjb2xvclwiLHNoYWRvd09wYWNpdHk6XCJvcGFjaXR5XCIsc2hhZG93Qmx1cjpcImJsdXJcIixzaGFkb3dPZmZzZXRYOlwiZHhcIixzaGFkb3dPZmZzZXRZOlwiZHlcIn0sbT17eDpcIi00MCVcIix5OlwiLTQwJVwiLHdpZHRoOlwiMjAwJVwiLGhlaWdodDpcIjIwMCVcIn0sYj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy50eXBlPVwiZmlsdGVyXCIsdGhpcy5jZmc9e30sdGhpcy50eXBlPVwiZmlsdGVyXCI7dmFyIGU9T2JqZWN0KHUuYikoXCJmaWx0ZXJcIik7cmV0dXJuIE9iamVjdChsLmYpKG0sKGZ1bmN0aW9uKHQsbil7ZS5zZXRBdHRyaWJ1dGUobix0KX0pKSx0aGlzLmVsPWUsdGhpcy5pZD1PYmplY3QobC5IKShcImZpbHRlcl9cIiksdGhpcy5lbC5pZD10aGlzLmlkLHRoaXMuY2ZnPXQsdGhpcy5fcGFyc2VTaGFkb3codCxlKSx0aGlzfXJldHVybiB0LnByb3RvdHlwZS5tYXRjaD1mdW5jdGlvbih0LGUpe2lmKHRoaXMudHlwZSE9PXQpcmV0dXJuITE7dmFyIG49ITAscj10aGlzLmNmZztyZXR1cm4gT2JqZWN0KGwuZikoT2JqZWN0LmtleXMociksKGZ1bmN0aW9uKHQpe2lmKHJbdF0hPT1lW3RdKXJldHVybiBuPSExLCExfSkpLG59LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY2ZnO3JldHVybiBuW3lbdF1dPWUsdGhpcy5fcGFyc2VTaGFkb3cobix0aGlzLmVsKSx0aGlzfSx0LnByb3RvdHlwZS5fcGFyc2VTaGFkb3c9ZnVuY3Rpb24odCxlKXt2YXIgbj0nPGZlRHJvcFNoYWRvd1xcbiAgICAgIGR4PVwiJysodC5keHx8MCkrJ1wiXFxuICAgICAgZHk9XCInKyh0LmR5fHwwKSsnXCJcXG4gICAgICBzdGREZXZpYXRpb249XCInKyh0LmJsdXI/dC5ibHVyLzEwOjApKydcIlxcbiAgICAgIGZsb29kLWNvbG9yPVwiJysodC5jb2xvcj90LmNvbG9yOlwiIzAwMFwiKSsnXCJcXG4gICAgICBmbG9vZC1vcGFjaXR5PVwiJysodC5vcGFjaXR5P3Qub3BhY2l0eToxKSsnXCJcXG4gICAgICAvPic7ZS5pbm5lckhUTUw9bn0sdH0oKSx4PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuY2ZnPXt9O3ZhciBuPU9iamVjdCh1LmIpKFwibWFya2VyXCIpLHI9T2JqZWN0KGwuSCkoXCJtYXJrZXJfXCIpO24uc2V0QXR0cmlidXRlKFwiaWRcIixyKTt2YXIgaT1PYmplY3QodS5iKShcInBhdGhcIik7aS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIix0LnN0cm9rZXx8XCJub25lXCIpLGkuc2V0QXR0cmlidXRlKFwiZmlsbFwiLHQuZmlsbHx8XCJub25lXCIpLG4uYXBwZW5kQ2hpbGQoaSksbi5zZXRBdHRyaWJ1dGUoXCJvdmVyZmxvd1wiLFwidmlzaWJsZVwiKSxuLnNldEF0dHJpYnV0ZShcIm9yaWVudFwiLFwiYXV0by1zdGFydC1yZXZlcnNlXCIpLHRoaXMuZWw9bix0aGlzLmNoaWxkPWksdGhpcy5pZD1yO3ZhciBvPXRbXCJtYXJrZXItc3RhcnRcIj09PWU/XCJzdGFydEFycm93XCI6XCJlbmRBcnJvd1wiXTtyZXR1cm4gdGhpcy5zdHJva2U9dC5zdHJva2V8fFwiIzAwMFwiLCEwPT09bz90aGlzLl9zZXREZWZhdWx0UGF0aChlLGkpOih0aGlzLmNmZz1vLHRoaXMuX3NldE1hcmtlcih0LmxpbmVXaWR0aCxpKSksdGhpc31yZXR1cm4gdC5wcm90b3R5cGUubWF0Y2g9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdC5wcm90b3R5cGUuX3NldERlZmF1bHRQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5lbDtlLnNldEF0dHJpYnV0ZShcImRcIixcIk0wLDAgTFwiKzEwKk1hdGguY29zKE1hdGguUEkvNikrXCIsNSBMMCwxMFwiKSxuLnNldEF0dHJpYnV0ZShcInJlZlhcIixcIlwiKzEwKk1hdGguY29zKE1hdGguUEkvNikpLG4uc2V0QXR0cmlidXRlKFwicmVmWVwiLFwiNVwiKX0sdC5wcm90b3R5cGUuX3NldE1hcmtlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZWwscj10aGlzLmNmZy5wYXRoLGk9dGhpcy5jZmcuZDtPYmplY3QobC5tKShyKSYmKHI9ci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmpvaW4oXCIgXCIpfSkpLmpvaW4oXCJcIikpLGUuc2V0QXR0cmlidXRlKFwiZFwiLHIpLG4uYXBwZW5kQ2hpbGQoZSksaSYmbi5zZXRBdHRyaWJ1dGUoXCJyZWZYXCIsXCJcIitpL3QpfSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jaGlsZDtlLmF0dHI/ZS5hdHRyKFwiZmlsbFwiLHQpOmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLHQpfSx0fSgpLHc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMudHlwZT1cImNsaXBcIix0aGlzLmNmZz17fTt2YXIgZT1PYmplY3QodS5iKShcImNsaXBQYXRoXCIpO3RoaXMuZWw9ZSx0aGlzLmlkPU9iamVjdChsLkgpKFwiY2xpcF9cIiksZS5pZD10aGlzLmlkO3ZhciBuPXQuY2ZnLmVsO3JldHVybiBlLmFwcGVuZENoaWxkKG4pLHRoaXMuY2ZnPXQsdGhpc31yZXR1cm4gdC5wcm90b3R5cGUubWF0Y2g9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbDt0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9LHR9KCksUz0vXnBcXHMqXFwoXFxzKihbYXh5bl0pXFxzKlxcKVxccyooLiopL2ksRT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5jZmc9e307dmFyIGU9T2JqZWN0KHUuYikoXCJwYXR0ZXJuXCIpO2Uuc2V0QXR0cmlidXRlKFwicGF0dGVyblVuaXRzXCIsXCJ1c2VyU3BhY2VPblVzZVwiKTt2YXIgbj1PYmplY3QodS5iKShcImltYWdlXCIpO2UuYXBwZW5kQ2hpbGQobik7dmFyIHI9T2JqZWN0KGwuSCkoXCJwYXR0ZXJuX1wiKTtlLmlkPXIsdGhpcy5lbD1lLHRoaXMuaWQ9cix0aGlzLmNmZz10O3ZhciBpPVMuZXhlYyh0KVsyXTtuLnNldEF0dHJpYnV0ZShcImhyZWZcIixpKTt2YXIgbz1uZXcgSW1hZ2U7ZnVuY3Rpb24gYSgpe2Uuc2V0QXR0cmlidXRlKFwid2lkdGhcIixcIlwiK28ud2lkdGgpLGUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsXCJcIitvLmhlaWdodCl9cmV0dXJuIGkubWF0Y2goL15kYXRhOi9pKXx8KG8uY3Jvc3NPcmlnaW49XCJBbm9ueW1vdXNcIiksby5zcmM9aSxvLmNvbXBsZXRlP2EoKTooby5vbmxvYWQ9YSxvLnNyYz1vLnNyYyksdGhpc31yZXR1cm4gdC5wcm90b3R5cGUubWF0Y2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jZmc9PT1lfSx0fSgpLF89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlPU9iamVjdCh1LmIpKFwiZGVmc1wiKSxuPU9iamVjdChsLkgpKFwiZGVmc19cIik7ZS5pZD1uLHQuYXBwZW5kQ2hpbGQoZSksdGhpcy5jaGlsZHJlbj1bXSx0aGlzLmRlZmF1bHRBcnJvdz17fSx0aGlzLmVsPWUsdGhpcy5jYW52YXM9dH1yZXR1cm4gdC5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLmNoaWxkcmVuLHI9bnVsbCxpPTA7aTxuLmxlbmd0aDtpKyspaWYobltpXS5tYXRjaCh0LGUpKXtyPW5baV0uaWQ7YnJlYWt9cmV0dXJuIHJ9LHQucHJvdG90eXBlLmZpbmRCeUlkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmNoaWxkcmVuLG49bnVsbCxyPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5pZD09PXQpe249ZVtyXTticmVha31yZXR1cm4gbn0sdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmNhbnZhcz10aGlzLmNhbnZhcyx0LnBhcmVudD10aGlzfSx0LnByb3RvdHlwZS5nZXREZWZhdWx0QXJyb3c9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnN0cm9rZXx8dC5zdHJva2VTdHlsZTtpZih0aGlzLmRlZmF1bHRBcnJvd1tuXSlyZXR1cm4gdGhpcy5kZWZhdWx0QXJyb3dbbl0uaWQ7dmFyIHI9bmV3IHgodCxlKTtyZXR1cm4gdGhpcy5kZWZhdWx0QXJyb3dbbl09cix0aGlzLmVsLmFwcGVuZENoaWxkKHIuZWwpLHRoaXMuYWRkKHIpLHIuaWR9LHQucHJvdG90eXBlLmFkZEdyYWRpZW50PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB2KHQpO3JldHVybiB0aGlzLmVsLmFwcGVuZENoaWxkKGUuZWwpLHRoaXMuYWRkKGUpLGUuaWR9LHQucHJvdG90eXBlLmFkZEFycm93PWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IHgodCxlKTtyZXR1cm4gdGhpcy5lbC5hcHBlbmRDaGlsZChuLmVsKSx0aGlzLmFkZChuKSxuLmlkfSx0LnByb3RvdHlwZS5hZGRTaGFkb3c9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGIodCk7cmV0dXJuIHRoaXMuZWwuYXBwZW5kQ2hpbGQoZS5lbCksdGhpcy5hZGQoZSksZS5pZH0sdC5wcm90b3R5cGUuYWRkUGF0dGVybj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgRSh0KTtyZXR1cm4gdGhpcy5lbC5hcHBlbmRDaGlsZChlLmVsKSx0aGlzLmFkZChlKSxlLmlkfSx0LnByb3RvdHlwZS5hZGRDbGlwPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB3KHQpO3JldHVybiB0aGlzLmVsLmFwcGVuZENoaWxkKGUuZWwpLHRoaXMuYWRkKGUpLGUuaWR9LHR9KCksTz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3JldHVybiB0LmNhbGwodGhpcyxPYmplY3Qoci5hKShPYmplY3Qoci5hKSh7fSxlKSx7YXV0b0RyYXc6ITAscmVuZGVyZXI6XCJzdmdcIn0pKXx8dGhpc31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5nZXRTaGFwZUJhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gY30sZS5wcm90b3R5cGUuZ2V0R3JvdXBCYXNlPWZ1bmN0aW9uKCl7cmV0dXJuIGYuYX0sZS5wcm90b3R5cGUuZ2V0U2hhcGU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4udGFyZ2V0fHxuLnNyY0VsZW1lbnQ7aWYoIW8uYVtyLnRhZ05hbWVdKXtmb3IodmFyIGk9ci5wYXJlbnROb2RlO2kmJiFvLmFbaS50YWdOYW1lXTspaT1pLnBhcmVudE5vZGU7cj1pfXJldHVybiB0aGlzLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChcImVsXCIpPT09cn0pKX0sZS5wcm90b3R5cGUuY3JlYXRlRG9tPWZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0KHUuYikoXCJzdmdcIiksZT1uZXcgXyh0KTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLFwiXCIrdGhpcy5nZXQoXCJ3aWR0aFwiKSksdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIixcIlwiK3RoaXMuZ2V0KFwiaGVpZ2h0XCIpKSx0aGlzLnNldChcImNvbnRleHRcIixlKSx0fSxlLnByb3RvdHlwZS5vbkNhbnZhc0NoYW5nZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcImNvbnRleHRcIiksbj10aGlzLmdldChcImVsXCIpO2lmKFwic29ydFwiPT09dCl7dmFyIHI9dGhpcy5nZXQoXCJjaGlsZHJlblwiKTtyJiZyLmxlbmd0aCYmT2JqZWN0KHUuZCkodGhpcywoZnVuY3Rpb24odCxlKXtyZXR1cm4gci5pbmRleE9mKHQpLXIuaW5kZXhPZihlKT8xOjB9KSl9ZWxzZSBpZihcImNsZWFyXCI9PT10KXtpZihuKXtuLmlubmVySFRNTD1cIlwiO3ZhciBpPWUuZWw7aS5pbm5lckhUTUw9XCJcIixuLmFwcGVuZENoaWxkKGkpfX1lbHNlXCJtYXRyaXhcIj09PXQ/T2JqZWN0KHMuYykodGhpcyk6XCJjbGlwXCI9PT10P09iamVjdChzLmEpKHRoaXMsZSk6XCJjaGFuZ2VTaXplXCI9PT10JiYobi5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLFwiXCIrdGhpcy5nZXQoXCJ3aWR0aFwiKSksbi5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIixcIlwiK3RoaXMuZ2V0KFwiaGVpZ2h0XCIpKSl9LGUucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImNvbnRleHRcIiksZT10aGlzLmdldENoaWxkcmVuKCk7T2JqZWN0KHMuYSkodGhpcyx0KSxlLmxlbmd0aCYmT2JqZWN0KGEuYSkodCxlKX0sZX0oaS5BYnN0cmFjdENhbnZhcyk7ZS5hPU99LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gci5hfSkpLG4uZChlLFwiYlwiLChmdW5jdGlvbigpe3JldHVybiBvLmF9KSk7dmFyIHI9big4MCksaT0obig2KSxuKDcpLG4oMikpLG89KGkuZS5jcmVhdGUoKSxuKDU4KSk7bigxMjcpLGkuZS5jcmVhdGUoKSxpLmUuY3JlYXRlKCksaS5lLmNyZWF0ZSgpLGkuZS5jcmVhdGUoKSxpLmUuY3JlYXRlKCl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDEpLGk9bigyMSk7ZnVuY3Rpb24gbyh0LGUsbil7dmFyIHI9dC5nZXRUb3RhbE1hdHJpeCgpO2lmKHIpe3ZhciBvPWZ1bmN0aW9uKHQsZSl7aWYoZSl7dmFyIG49T2JqZWN0KGkuaW52ZXJ0KShlKTtyZXR1cm4gT2JqZWN0KGkubXVsdGlwbHlWZWMyKShuLHQpfXJldHVybiB0fShbZSxuLDFdLHIpO3JldHVybltvWzBdLG9bMV1dfXJldHVybltlLG5dfWZ1bmN0aW9uIGEodCxlLG4pe2lmKHQuaXNDYW52YXMmJnQuaXNDYW52YXMoKSlyZXR1cm4hMDtpZighT2JqZWN0KGkuaXNBbGxvd0NhcHR1cmUpKHQpfHwhMT09PXQuY2ZnLmlzSW5WaWV3KXJldHVybiExO2lmKHQuY2ZnLmNsaXBTaGFwZSl7dmFyIHI9byh0LGUsbiksYT1yWzBdLHM9clsxXTtpZih0LmlzQ2xpcHBlZChhLHMpKXJldHVybiExfXZhciB1PXQuY2ZnLmNhY2hlQ2FudmFzQkJveHx8dC5nZXRDYW52YXNCQm94KCk7cmV0dXJuIGU+PXUubWluWCYmZTw9dS5tYXhYJiZuPj11Lm1pblkmJm48PXUubWF4WX12YXIgcz1uKDU3KSx1PW4oNzgpLGM9bigxNiksZj1uKDMwKSxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRDZmc9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5nZXREZWZhdWx0Q2ZnLmNhbGwodGhpcyk7cmV0dXJuIGUucmVuZGVyZXI9XCJjYW52YXNcIixlLmF1dG9EcmF3PSEwLGUubG9jYWxSZWZyZXNoPSEwLGUucmVmcmVzaEVsZW1lbnRzPVtdLGUuY2xpcFZpZXc9ITAsZS5xdWlja0hpdD0hMSxlfSxlLnByb3RvdHlwZS5vbkNhbnZhc0NoYW5nZT1mdW5jdGlvbih0KXtcImF0dHJcIiE9PXQmJlwic29ydFwiIT09dCYmXCJjaGFuZ2VTaXplXCIhPT10fHwodGhpcy5zZXQoXCJyZWZyZXNoRWxlbWVudHNcIixbdGhpc10pLHRoaXMuZHJhdygpKX0sZS5wcm90b3R5cGUuZ2V0U2hhcGVCYXNlPWZ1bmN0aW9uKCl7cmV0dXJuIHN9LGUucHJvdG90eXBlLmdldEdyb3VwQmFzZT1mdW5jdGlvbigpe3JldHVybiB1LmF9LGUucHJvdG90eXBlLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcInBpeGVsUmF0aW9cIil8fE9iamVjdChjLmQpKCk7cmV0dXJuIHQ+PTE/TWF0aC5jZWlsKHQpOjF9LGUucHJvdG90eXBlLmdldFZpZXdSYW5nZT1mdW5jdGlvbigpe3JldHVybnttaW5YOjAsbWluWTowLG1heFg6dGhpcy5jZmcud2lkdGgsbWF4WTp0aGlzLmNmZy5oZWlnaHR9fSxlLnByb3RvdHlwZS5jcmVhdGVEb209ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLGU9dC5nZXRDb250ZXh0KFwiMmRcIik7cmV0dXJuIHRoaXMuc2V0KFwiY29udGV4dFwiLGUpLHR9LGUucHJvdG90eXBlLnNldERPTVNpemU9ZnVuY3Rpb24oZSxuKXt0LnByb3RvdHlwZS5zZXRET01TaXplLmNhbGwodGhpcyxlLG4pO3ZhciByPXRoaXMuZ2V0KFwiY29udGV4dFwiKSxpPXRoaXMuZ2V0KFwiZWxcIiksbz10aGlzLmdldFBpeGVsUmF0aW8oKTtpLndpZHRoPW8qZSxpLmhlaWdodD1vKm4sbz4xJiZyLnNjYWxlKG8sbyl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuY2xlYXIuY2FsbCh0aGlzKSx0aGlzLl9jbGVhckZyYW1lKCk7dmFyIGU9dGhpcy5nZXQoXCJjb250ZXh0XCIpLG49dGhpcy5nZXQoXCJlbFwiKTtlLmNsZWFyUmVjdCgwLDAsbi53aWR0aCxuLmhlaWdodCl9LGUucHJvdG90eXBlLmdldFNoYXBlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHRoaXMuZ2V0KFwicXVpY2tIaXRcIik/ZnVuY3Rpb24gdChlLG4scil7aWYoIWEoZSxuLHIpKXJldHVybiBudWxsO2Zvcih2YXIgaT1udWxsLHM9ZS5nZXRDaGlsZHJlbigpLHU9cy5sZW5ndGgtMTt1Pj0wO3UtLSl7dmFyIGM9c1t1XTtpZihjLmlzR3JvdXAoKSlpPXQoYyxuLHIpO2Vsc2UgaWYoYShjLG4scikpe3ZhciBmPWMsbD1vKGMsbixyKSxoPWxbMF0sZD1sWzFdO2YuaXNJblNoYXBlKGgsZCkmJihpPWMpfWlmKGkpYnJlYWt9cmV0dXJuIGl9KHRoaXMsZSxuKTp0LnByb3RvdHlwZS5nZXRTaGFwZS5jYWxsKHRoaXMsZSxuLG51bGwpfSxlLnByb3RvdHlwZS5fZ2V0UmVmcmVzaFJlZ2lvbj1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXQoXCJyZWZyZXNoRWxlbWVudHNcIiksbj10aGlzLmdldFZpZXdSYW5nZSgpO2UubGVuZ3RoJiZlWzBdPT09dGhpcz90PW46KHQ9T2JqZWN0KGYuZikoZSkpJiYodC5taW5YPU1hdGguZmxvb3IodC5taW5YKSx0Lm1pblk9TWF0aC5mbG9vcih0Lm1pblkpLHQubWF4WD1NYXRoLmNlaWwodC5tYXhYKSx0Lm1heFk9TWF0aC5jZWlsKHQubWF4WSksdC5tYXhZKz0xLHRoaXMuZ2V0KFwiY2xpcFZpZXdcIikmJih0PU9iamVjdChmLmcpKHQsbikpKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUucmVmcmVzaEVsZW1lbnQ9ZnVuY3Rpb24odCl7dGhpcy5nZXQoXCJyZWZyZXNoRWxlbWVudHNcIikucHVzaCh0KX0sZS5wcm90b3R5cGUuX2NsZWFyRnJhbWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImRyYXdGcmFtZVwiKTt0JiYoT2JqZWN0KGMuYSkodCksdGhpcy5zZXQoXCJkcmF3RnJhbWVcIixudWxsKSx0aGlzLnNldChcInJlZnJlc2hFbGVtZW50c1wiLFtdKSl9LGUucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImRyYXdGcmFtZVwiKTt0aGlzLmdldChcImF1dG9EcmF3XCIpJiZ0fHx0aGlzLl9zdGFydERyYXcoKX0sZS5wcm90b3R5cGUuX2RyYXdBbGw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImNvbnRleHRcIiksZT10aGlzLmdldChcImVsXCIpLG49dGhpcy5nZXRDaGlsZHJlbigpO3QuY2xlYXJSZWN0KDAsMCxlLndpZHRoLGUuaGVpZ2h0KSxPYmplY3QoZi5hKSh0LHRoaXMpLE9iamVjdChmLmQpKHQsbiksdGhpcy5zZXQoXCJyZWZyZXNoRWxlbWVudHNcIixbXSl9LGUucHJvdG90eXBlLl9kcmF3UmVnaW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJjb250ZXh0XCIpLGU9dGhpcy5nZXQoXCJyZWZyZXNoRWxlbWVudHNcIiksbj10aGlzLmdldENoaWxkcmVuKCkscj10aGlzLl9nZXRSZWZyZXNoUmVnaW9uKCk7cj8odC5jbGVhclJlY3Qoci5taW5YLHIubWluWSxyLm1heFgtci5taW5YLHIubWF4WS1yLm1pblkpLHQuc2F2ZSgpLHQuYmVnaW5QYXRoKCksdC5yZWN0KHIubWluWCxyLm1pblksci5tYXhYLXIubWluWCxyLm1heFktci5taW5ZKSx0LmNsaXAoKSxPYmplY3QoZi5hKSh0LHRoaXMpLE9iamVjdChmLmIpKHRoaXMsbixyKSxPYmplY3QoZi5kKSh0LG4sciksdC5yZXN0b3JlKCkpOmUubGVuZ3RoJiZPYmplY3QoZi5jKShlKSxPYmplY3QoYy5jKShlLChmdW5jdGlvbih0KXt0LmdldChcImhhc0NoYW5nZWRcIikmJnQuc2V0KFwiaGFzQ2hhbmdlZFwiLCExKX0pKSx0aGlzLnNldChcInJlZnJlc2hFbGVtZW50c1wiLFtdKX0sZS5wcm90b3R5cGUuX3N0YXJ0RHJhdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLmdldChcImRyYXdGcmFtZVwiKTtlfHwoZT1PYmplY3QoYy5uKSgoZnVuY3Rpb24oKXt0LmdldChcImxvY2FsUmVmcmVzaFwiKT90Ll9kcmF3UmVnaW9uKCk6dC5fZHJhd0FsbCgpLHQuc2V0KFwiZHJhd0ZyYW1lXCIsbnVsbCl9KSksdGhpcy5zZXQoXCJkcmF3RnJhbWVcIixlKSl9LGUucHJvdG90eXBlLnNraXBEcmF3PWZ1bmN0aW9uKCl7fSxlfShpLkFic3RyYWN0Q2FudmFzKTtlLmE9bH0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByOyFmdW5jdGlvbih0KXt0LlBBTlNUQVJUPVwiUEFOU1RBUlRcIix0LlBBTkVORD1cIlBBTkVORFwiLHQuUEFOTU9WRT1cIlBBTk1PVkVcIix0LlBJTkNIPVwiUElOQ0hcIix0LktFWURPV049XCJLRVlET1dOXCIsdC5LRVlVUD1cIktFWVVQXCIsdC5IT1ZFUj1cIkhPVkVSXCJ9KHJ8fChyPXt9KSk7bigxMzMpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHI9big0OTMpO2UuZGVmYXVsdD1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0hMCkse2xhenlJbmplY3Q6ci5tYWtlUHJvcGVydHlJbmplY3REZWNvcmF0b3IodCxlKSxsYXp5SW5qZWN0TmFtZWQ6ci5tYWtlUHJvcGVydHlJbmplY3ROYW1lZERlY29yYXRvcih0LGUpLGxhenlJbmplY3RUYWdnZWQ6ci5tYWtlUHJvcGVydHlJbmplY3RUYWdnZWREZWNvcmF0b3IodCxlKSxsYXp5TXVsdGlJbmplY3Q6ci5tYWtlUHJvcGVydHlNdWx0aUluamVjdERlY29yYXRvcih0LGUpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9yKHQpOltdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbztmdW5jdGlvbiBhKHQpe3JldHVybihhPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1vPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBVaW50OEFycmF5fHx0IGluc3RhbmNlb2YgVWludDE2QXJyYXl8fHQgaW5zdGFuY2VvZiBVaW50MzJBcnJheXx8dCBpbnN0YW5jZW9mIEludDhBcnJheXx8dCBpbnN0YW5jZW9mIEludDE2QXJyYXl8fHQgaW5zdGFuY2VvZiBJbnQzMkFycmF5fHx0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5fHx0IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5fHx0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXl9LGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49T2JqZWN0LmtleXMoZSkscj0wO3I8bi5sZW5ndGg7KytyKXRbbltyXV09ZVtuW3JdXTtyZXR1cm4gdH07ZnVuY3Rpb24gbih0KXt2YXIgZT1uZXcgRXJyb3IoXCIocmVnbCkgXCIrdCk7dGhyb3cgY29uc29sZS5lcnJvcihlKSxlfWZ1bmN0aW9uIHIodCxlKXt0fHxuKGUpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQ/XCI6IFwiK3Q6XCJcIn1mdW5jdGlvbiBvKHQsZSl7c3dpdGNoKGUpe2Nhc2VcIm51bWJlclwiOnJldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0O2Nhc2VcIm9iamVjdFwiOnJldHVyblwib2JqZWN0XCI9PT1hKHQpO2Nhc2VcInN0cmluZ1wiOnJldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0O2Nhc2VcImJvb2xlYW5cIjpyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIHQ7Y2FzZVwiZnVuY3Rpb25cIjpyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0O2Nhc2VcInVuZGVmaW5lZFwiOnJldHVybiB2b2lkIDA9PT10O2Nhc2VcInN5bWJvbFwiOnJldHVyblwic3ltYm9sXCI9PT1hKHQpfX1mdW5jdGlvbiBzKHQsZSxyKXtlLmluZGV4T2YodCk8MCYmbihcImludmFsaWQgdmFsdWVcIitpKHIpK1wiLiBtdXN0IGJlIG9uZSBvZjogXCIrZSl9dmFyIHU9W1wiZ2xcIixcImNhbnZhc1wiLFwiY29udGFpbmVyXCIsXCJhdHRyaWJ1dGVzXCIsXCJwaXhlbFJhdGlvXCIsXCJleHRlbnNpb25zXCIsXCJvcHRpb25hbEV4dGVuc2lvbnNcIixcInByb2ZpbGVcIixcIm9uRG9uZVwiXTtmdW5jdGlvbiBjKHQsZSl7Zm9yKHQrPVwiXCI7dC5sZW5ndGg8ZTspdD1cIiBcIit0O3JldHVybiB0fWZ1bmN0aW9uIGYoKXt0aGlzLm5hbWU9XCJ1bmtub3duXCIsdGhpcy5saW5lcz1bXSx0aGlzLmluZGV4PXt9LHRoaXMuaGFzRXJyb3JzPSExfWZ1bmN0aW9uIGwodCxlKXt0aGlzLm51bWJlcj10LHRoaXMubGluZT1lLHRoaXMuZXJyb3JzPVtdfWZ1bmN0aW9uIGgodCxlLG4pe3RoaXMuZmlsZT10LHRoaXMubGluZT1lLHRoaXMubWVzc2FnZT1ufWZ1bmN0aW9uIGQoKXt2YXIgdD1uZXcgRXJyb3IsZT0odC5zdGFja3x8dCkudG9TdHJpbmcoKSxuPS9jb21waWxlUHJvY2VkdXJlLipcXG5cXHMqYXQuKlxcKCguKilcXCkvLmV4ZWMoZSk7aWYobilyZXR1cm4gblsxXTt2YXIgcj0vY29tcGlsZVByb2NlZHVyZS4qXFxuXFxzKmF0XFxzKyguKikoXFxufCQpLy5leGVjKGUpO3JldHVybiByP3JbMV06XCJ1bmtub3duXCJ9ZnVuY3Rpb24gcCgpe3ZhciB0PW5ldyBFcnJvcixlPSh0LnN0YWNrfHx0KS50b1N0cmluZygpLG49L2F0IFJFR0xDb21tYW5kLipcXG5cXHMrYXQuKlxcKCguKilcXCkvLmV4ZWMoZSk7aWYobilyZXR1cm4gblsxXTt2YXIgcj0vYXQgUkVHTENvbW1hbmQuKlxcblxccythdFxccysoLiopXFxuLy5leGVjKGUpO3JldHVybiByP3JbMV06XCJ1bmtub3duXCJ9ZnVuY3Rpb24gZyh0LGUpe3ZhciBuLHI9dC5zcGxpdChcIlxcblwiKSxpPTEsbz0wLGE9e3Vua25vd246bmV3IGYsMDpuZXcgZn07YS51bmtub3duLm5hbWU9YVswXS5uYW1lPWV8fGQoKSxhLnVua25vd24ubGluZXMucHVzaChuZXcgbCgwLFwiXCIpKTtmb3IodmFyIHM9MDtzPHIubGVuZ3RoOysrcyl7dmFyIHU9cltzXSxjPS9eXFxzKiNcXHMqKFxcdyspXFxzKyguKylcXHMqJC8uZXhlYyh1KTtpZihjKXN3aXRjaChjWzFdKXtjYXNlXCJsaW5lXCI6dmFyIGg9LyhcXGQrKShcXHMrXFxkKyk/Ly5leGVjKGNbMl0pO2gmJihpPTB8aFsxXSxoWzJdJiYoKG89MHxoWzJdKWluIGF8fChhW29dPW5ldyBmKSkpO2JyZWFrO2Nhc2VcImRlZmluZVwiOnZhciBwPS9TSEFERVJfTkFNRShfQjY0KT9cXHMrKC4qKSQvLmV4ZWMoY1syXSk7cCYmKGFbb10ubmFtZT1wWzFdPyhuPXBbMl0sXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGF0b2I/YXRvYihuKTpcImJhc2U2NDpcIituKTpwWzJdKX1hW29dLmxpbmVzLnB1c2gobmV3IGwoaSsrLHUpKX1yZXR1cm4gT2JqZWN0LmtleXMoYSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9YVt0XTtlLmxpbmVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuaW5kZXhbdC5udW1iZXJdPXR9KSl9KSksYX1mdW5jdGlvbiB2KHQpe3QuX2NvbW1hbmRSZWY9ZCgpfWZ1bmN0aW9uIHkodCxlKXt2YXIgcj1wKCk7bih0K1wiIGluIGNvbW1hbmQgXCIrKGV8fGQoKSkrKFwidW5rbm93blwiPT09cj9cIlwiOlwiIGNhbGxlZCBmcm9tIFwiK3IpKX1mdW5jdGlvbiBtKHQsZSxuLHIpe28odCxlKXx8eShcImludmFsaWQgcGFyYW1ldGVyIHR5cGVcIitpKG4pK1wiLiBleHBlY3RlZCBcIitlK1wiLCBnb3QgXCIrYSh0KSxyfHxkKCkpfXZhciBiPXt9O2Z1bmN0aW9uIHgodCxlKXtyZXR1cm4gMzI4MjA9PT10fHwzMjgxOT09PXR8fDMzNjM1PT09dD8yOjM0MDQyPT09dD80OmJbdF0qZX1mdW5jdGlvbiB3KHQpe3JldHVybiEodCZ0LTF8fCF0KX1iWzUxMjBdPWJbNTEyMV09MSxiWzUxMjJdPWJbNTEyM109YlszNjE5M109YlszMzYzNV09YlszMjgxOV09YlszMjgyMF09MixiWzUxMjRdPWJbNTEyNV09Yls1MTI2XT1iWzM0MDQyXT00O3ZhciBTPWUocix7b3B0aW9uYWw6ZnVuY3Rpb24odCl7dCgpfSxyYWlzZTpuLGNvbW1hbmRSYWlzZTp5LGNvbW1hbmQ6ZnVuY3Rpb24odCxlLG4pe3R8fHkoZSxufHxkKCkpfSxwYXJhbWV0ZXI6ZnVuY3Rpb24odCxlLHIpe3QgaW4gZXx8bihcInVua25vd24gcGFyYW1ldGVyIChcIit0K1wiKVwiK2kocikrXCIuIHBvc3NpYmxlIHZhbHVlczogXCIrT2JqZWN0LmtleXMoZSkuam9pbigpKX0sY29tbWFuZFBhcmFtZXRlcjpmdW5jdGlvbih0LGUsbixyKXt0IGluIGV8fHkoXCJ1bmtub3duIHBhcmFtZXRlciAoXCIrdCtcIilcIitpKG4pK1wiLiBwb3NzaWJsZSB2YWx1ZXM6IFwiK09iamVjdC5rZXlzKGUpLmpvaW4oKSxyfHxkKCkpfSxjb25zdHJ1Y3RvcjpmdW5jdGlvbih0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbih0KXt1LmluZGV4T2YodCk8MCYmbignaW52YWxpZCByZWdsIGNvbnN0cnVjdG9yIGFyZ3VtZW50IFwiJyt0KydcIi4gbXVzdCBiZSBvbmUgb2YgJyt1KX0pKX0sdHlwZTpmdW5jdGlvbih0LGUscil7byh0LGUpfHxuKFwiaW52YWxpZCBwYXJhbWV0ZXIgdHlwZVwiK2kocikrXCIuIGV4cGVjdGVkIFwiK2UrXCIsIGdvdCBcIithKHQpKX0sY29tbWFuZFR5cGU6bSxpc1R5cGVkQXJyYXk6ZnVuY3Rpb24oZSxyKXt0KGUpfHxuKFwiaW52YWxpZCBwYXJhbWV0ZXIgdHlwZVwiK2kocikrXCIuIG11c3QgYmUgYSB0eXBlZCBhcnJheVwiKX0sbm5pOmZ1bmN0aW9uKHQsZSl7dD49MCYmKDB8dCk9PT10fHxuKFwiaW52YWxpZCBwYXJhbWV0ZXIgdHlwZSwgKFwiK3QrXCIpXCIraShlKStcIi4gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXJcIil9LG9uZU9mOnMsc2hhZGVyRXJyb3I6ZnVuY3Rpb24odCxlLG4saSxvKXtpZighdC5nZXRTaGFkZXJQYXJhbWV0ZXIoZSx0LkNPTVBJTEVfU1RBVFVTKSl7dmFyIGE9dC5nZXRTaGFkZXJJbmZvTG9nKGUpLHM9aT09PXQuRlJBR01FTlRfU0hBREVSP1wiZnJhZ21lbnRcIjpcInZlcnRleFwiO20obixcInN0cmluZ1wiLHMrXCIgc2hhZGVyIHNvdXJjZSBtdXN0IGJlIGEgc3RyaW5nXCIsbyk7dmFyIHU9ZyhuLG8pLGY9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHQuc3BsaXQoXCJcXG5cIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoISh0Lmxlbmd0aDw1KSl7dmFyIG49L15FUlJPUjpcXHMrKFxcZCspOihcXGQrKTpcXHMqKC4qKSQvLmV4ZWModCk7bj9lLnB1c2gobmV3IGgoMHxuWzFdLDB8blsyXSxuWzNdLnRyaW0oKSkpOnQubGVuZ3RoPjAmJmUucHVzaChuZXcgaChcInVua25vd25cIiwwLHQpKX19KSksZX0oYSk7IWZ1bmN0aW9uKHQsZSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj10W2UuZmlsZV07aWYobil7dmFyIHI9bi5pbmRleFtlLmxpbmVdO2lmKHIpcmV0dXJuIHIuZXJyb3JzLnB1c2goZSksdm9pZChuLmhhc0Vycm9ycz0hMCl9dC51bmtub3duLmhhc0Vycm9ycz0hMCx0LnVua25vd24ubGluZXNbMF0uZXJyb3JzLnB1c2goZSl9KSl9KHUsZiksT2JqZWN0LmtleXModSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dVt0XTtpZihlLmhhc0Vycm9ycyl7dmFyIG49W1wiXCJdLHI9W1wiXCJdO2koXCJmaWxlIG51bWJlciBcIit0K1wiOiBcIitlLm5hbWUrXCJcXG5cIixcImNvbG9yOnJlZDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2ZvbnQtd2VpZ2h0OmJvbGRcIiksZS5saW5lcy5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmVycm9ycy5sZW5ndGg+MCl7aShjKHQubnVtYmVyLDQpK1wifCAgXCIsXCJiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgZm9udC13ZWlnaHQ6Ym9sZFwiKSxpKHQubGluZStcIlxcblwiLFwiY29sb3I6cmVkOyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgZm9udC13ZWlnaHQ6Ym9sZFwiKTt2YXIgZT0wO3QuZXJyb3JzLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPW4ubWVzc2FnZSxvPS9eXFxzKicoLiopJ1xccyo6XFxzKiguKikkLy5leGVjKHIpO2lmKG8pe3ZhciBhPW9bMV07c3dpdGNoKHI9b1syXSxhKXtjYXNlXCJhc3NpZ25cIjphPVwiPVwifWU9TWF0aC5tYXgodC5saW5lLmluZGV4T2YoYSxlKSwwKX1lbHNlIGU9MDtpKGMoXCJ8IFwiLDYpKSxpKGMoXCJeXl5cIixlKzMpK1wiXFxuXCIsXCJmb250LXdlaWdodDpib2xkXCIpLGkoYyhcInwgXCIsNikpLGkocitcIlxcblwiLFwiZm9udC13ZWlnaHQ6Ym9sZFwiKX0pKSxpKGMoXCJ8IFwiLDYpK1wiXFxuXCIpfWVsc2UgaShjKHQubnVtYmVyLDQpK1wifCAgXCIpLGkodC5saW5lK1wiXFxuXCIsXCJjb2xvcjpyZWRcIil9KSksXCJ1bmRlZmluZWRcIj09dHlwZW9mIGRvY3VtZW50fHx3aW5kb3cuY2hyb21lP2NvbnNvbGUubG9nKG4uam9pbihcIlwiKSk6KHJbMF09bi5qb2luKFwiJWNcIiksY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSxyKSl9ZnVuY3Rpb24gaSh0LGUpe24ucHVzaCh0KSxyLnB1c2goZXx8XCJcIil9fSkpLHIucmFpc2UoXCJFcnJvciBjb21waWxpbmcgXCIrcytcIiBzaGFkZXIsIFwiK3VbMF0ubmFtZSl9fSxsaW5rRXJyb3I6ZnVuY3Rpb24odCxlLG4saSxvKXtpZighdC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsdC5MSU5LX1NUQVRVUykpe3ZhciBhPXQuZ2V0UHJvZ3JhbUluZm9Mb2coZSkscz1nKG4sbyksdT0nRXJyb3IgbGlua2luZyBwcm9ncmFtIHdpdGggdmVydGV4IHNoYWRlciwgXCInK2coaSxvKVswXS5uYW1lKydcIiwgYW5kIGZyYWdtZW50IHNoYWRlciBcIicrc1swXS5uYW1lKydcIic7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50P2NvbnNvbGUubG9nKFwiJWNcIit1K1wiXFxuJWNcIithLFwiY29sb3I6cmVkO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Zm9udC13ZWlnaHQ6Ym9sZFwiLFwiY29sb3I6cmVkXCIpOmNvbnNvbGUubG9nKHUrXCJcXG5cIithKSxyLnJhaXNlKHUpfX0sY2FsbFNpdGU6cCxzYXZlQ29tbWFuZFJlZjp2LHNhdmVEcmF3SW5mbzpmdW5jdGlvbih0LGUsbixyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0P3IuaWQodCk6MH1mdW5jdGlvbiBvKHQsZSl7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtyLmlkKGUpXT0hMH0pKX12KHQpLHQuX2ZyYWdJZD1pKHQuc3RhdGljLmZyYWcpLHQuX3ZlcnRJZD1pKHQuc3RhdGljLnZlcnQpO3ZhciBhPXQuX3VuaWZvcm1TZXQ9e307byhhLGUuc3RhdGljKSxvKGEsZS5keW5hbWljKTt2YXIgcz10Ll9hdHRyaWJ1dGVTZXQ9e307byhzLG4uc3RhdGljKSxvKHMsbi5keW5hbWljKSx0Ll9oYXNDb3VudD1cImNvdW50XCJpbiB0LnN0YXRpY3x8XCJjb3VudFwiaW4gdC5keW5hbWljfHxcImVsZW1lbnRzXCJpbiB0LnN0YXRpY3x8XCJlbGVtZW50c1wiaW4gdC5keW5hbWljfSxmcmFtZWJ1ZmZlckZvcm1hdDpmdW5jdGlvbih0LGUsbil7dC50ZXh0dXJlP3ModC50ZXh0dXJlLl90ZXh0dXJlLmludGVybmFsZm9ybWF0LGUsXCJ1bnN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdCBmb3IgYXR0YWNobWVudFwiKTpzKHQucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIuZm9ybWF0LG4sXCJ1bnN1cHBvcnRlZCByZW5kZXJidWZmZXIgZm9ybWF0IGZvciBhdHRhY2htZW50XCIpfSxndWVzc0NvbW1hbmQ6ZCx0ZXh0dXJlMkQ6ZnVuY3Rpb24odCxlLG4pe3ZhciBpLG89ZS53aWR0aCxhPWUuaGVpZ2h0LHM9ZS5jaGFubmVscztyKG8+MCYmbzw9bi5tYXhUZXh0dXJlU2l6ZSYmYT4wJiZhPD1uLm1heFRleHR1cmVTaXplLFwiaW52YWxpZCB0ZXh0dXJlIHNoYXBlXCIpLDMzMDcxPT09dC53cmFwUyYmMzMwNzE9PT10LndyYXBUfHxyKHcobykmJncoYSksXCJpbmNvbXBhdGlibGUgd3JhcCBtb2RlIGZvciB0ZXh0dXJlLCBib3RoIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBwb3dlciBvZiAyXCIpLDE9PT1lLm1pcG1hc2s/MSE9PW8mJjEhPT1hJiZyKDk5ODQhPT10Lm1pbkZpbHRlciYmOTk4NiE9PXQubWluRmlsdGVyJiY5OTg1IT09dC5taW5GaWx0ZXImJjk5ODchPT10Lm1pbkZpbHRlcixcIm1pbiBmaWx0ZXIgcmVxdWlyZXMgbWlwbWFwXCIpOihyKHcobykmJncoYSksXCJ0ZXh0dXJlIG11c3QgYmUgYSBzcXVhcmUgcG93ZXIgb2YgMiB0byBzdXBwb3J0IG1pcG1hcHBpbmdcIikscihlLm1pcG1hc2s9PT0obzw8MSktMSxcIm1pc3Npbmcgb3IgaW5jb21wbGV0ZSBtaXBtYXAgZGF0YVwiKSksNTEyNj09PWUudHlwZSYmKG4uZXh0ZW5zaW9ucy5pbmRleE9mKFwib2VzX3RleHR1cmVfZmxvYXRfbGluZWFyXCIpPDAmJnIoOTcyOD09PXQubWluRmlsdGVyJiY5NzI4PT09dC5tYWdGaWx0ZXIsXCJmaWx0ZXIgbm90IHN1cHBvcnRlZCwgbXVzdCBlbmFibGUgb2VzX3RleHR1cmVfZmxvYXRfbGluZWFyXCIpLHIoIXQuZ2VuTWlwbWFwcyxcIm1pcG1hcCBnZW5lcmF0aW9uIG5vdCBzdXBwb3J0ZWQgd2l0aCBmbG9hdCB0ZXh0dXJlc1wiKSk7dmFyIHU9ZS5pbWFnZXM7Zm9yKGk9MDtpPDE2OysraSlpZih1W2ldKXt2YXIgYz1vPj5pLGY9YT4+aTtyKGUubWlwbWFzayYxPDxpLFwibWlzc2luZyBtaXBtYXAgZGF0YVwiKTt2YXIgbD11W2ldO2lmKHIobC53aWR0aD09PWMmJmwuaGVpZ2h0PT09ZixcImludmFsaWQgc2hhcGUgZm9yIG1pcCBpbWFnZXNcIikscihsLmZvcm1hdD09PWUuZm9ybWF0JiZsLmludGVybmFsZm9ybWF0PT09ZS5pbnRlcm5hbGZvcm1hdCYmbC50eXBlPT09ZS50eXBlLFwiaW5jb21wYXRpYmxlIHR5cGUgZm9yIG1pcCBpbWFnZVwiKSxsLmNvbXByZXNzZWQpO2Vsc2UgaWYobC5kYXRhKXt2YXIgaD1NYXRoLmNlaWwoeChsLnR5cGUscykqYy9sLnVucGFja0FsaWdubWVudCkqbC51bnBhY2tBbGlnbm1lbnQ7cihsLmRhdGEuYnl0ZUxlbmd0aD09PWgqZixcImludmFsaWQgZGF0YSBmb3IgaW1hZ2UsIGJ1ZmZlciBzaXplIGlzIGluY29uc2lzdGVudCB3aXRoIGltYWdlIGZvcm1hdFwiKX1lbHNlIGwuZWxlbWVudHx8bC5jb3B5fWVsc2UgdC5nZW5NaXBtYXBzfHxyKDA9PShlLm1pcG1hc2smMTw8aSksXCJleHRyYSBtaXBtYXAgZGF0YVwiKTtlLmNvbXByZXNzZWQmJnIoIXQuZ2VuTWlwbWFwcyxcIm1pcG1hcCBnZW5lcmF0aW9uIGZvciBjb21wcmVzc2VkIGltYWdlcyBub3Qgc3VwcG9ydGVkXCIpfSx0ZXh0dXJlQ3ViZTpmdW5jdGlvbih0LGUsbixpKXt2YXIgbz10LndpZHRoLGE9dC5oZWlnaHQscz10LmNoYW5uZWxzO3Iobz4wJiZvPD1pLm1heFRleHR1cmVTaXplJiZhPjAmJmE8PWkubWF4VGV4dHVyZVNpemUsXCJpbnZhbGlkIHRleHR1cmUgc2hhcGVcIikscihvPT09YSxcImN1YmUgbWFwIG11c3QgYmUgc3F1YXJlXCIpLHIoMzMwNzE9PT1lLndyYXBTJiYzMzA3MT09PWUud3JhcFQsXCJ3cmFwIG1vZGUgbm90IHN1cHBvcnRlZCBieSBjdWJlIG1hcFwiKTtmb3IodmFyIHU9MDt1PG4ubGVuZ3RoOysrdSl7dmFyIGM9blt1XTtyKGMud2lkdGg9PT1vJiZjLmhlaWdodD09PWEsXCJpbmNvbnNpc3RlbnQgY3ViZSBtYXAgZmFjZSBzaGFwZVwiKSxlLmdlbk1pcG1hcHMmJihyKCFjLmNvbXByZXNzZWQsXCJjYW4gbm90IGdlbmVyYXRlIG1pcG1hcCBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlc1wiKSxyKDE9PT1jLm1pcG1hc2ssXCJjYW4gbm90IHNwZWNpZnkgbWlwbWFwcyBhbmQgZ2VuZXJhdGUgbWlwbWFwc1wiKSk7Zm9yKHZhciBmPWMuaW1hZ2VzLGw9MDtsPDE2OysrbCl7dmFyIGg9ZltsXTtpZihoKXt2YXIgZD1vPj5sLHA9YT4+bDtyKGMubWlwbWFzayYxPDxsLFwibWlzc2luZyBtaXBtYXAgZGF0YVwiKSxyKGgud2lkdGg9PT1kJiZoLmhlaWdodD09PXAsXCJpbnZhbGlkIHNoYXBlIGZvciBtaXAgaW1hZ2VzXCIpLHIoaC5mb3JtYXQ9PT10LmZvcm1hdCYmaC5pbnRlcm5hbGZvcm1hdD09PXQuaW50ZXJuYWxmb3JtYXQmJmgudHlwZT09PXQudHlwZSxcImluY29tcGF0aWJsZSB0eXBlIGZvciBtaXAgaW1hZ2VcIiksaC5jb21wcmVzc2VkfHwoaC5kYXRhP3IoaC5kYXRhLmJ5dGVMZW5ndGg9PT1kKnAqTWF0aC5tYXgoeChoLnR5cGUscyksaC51bnBhY2tBbGlnbm1lbnQpLFwiaW52YWxpZCBkYXRhIGZvciBpbWFnZSwgYnVmZmVyIHNpemUgaXMgaW5jb25zaXN0ZW50IHdpdGggaW1hZ2UgZm9ybWF0XCIpOmguZWxlbWVudHx8aC5jb3B5KX19fX19KSxFPTA7ZnVuY3Rpb24gXyh0LGUpe3RoaXMuaWQ9RSsrLHRoaXMudHlwZT10LHRoaXMuZGF0YT1lfWZ1bmN0aW9uIE8odCl7cmV0dXJuIHQucmVwbGFjZSgvXFxcXC9nLFwiXFxcXFxcXFxcIikucmVwbGFjZSgvXCIvZywnXFxcXFwiJyl9ZnVuY3Rpb24gayh0KXtyZXR1cm5cIltcIitmdW5jdGlvbiB0KGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm5bXTt2YXIgbj1lLmNoYXJBdCgwKSxyPWUuY2hhckF0KGUubGVuZ3RoLTEpO2lmKGUubGVuZ3RoPjEmJm49PT1yJiYoJ1wiJz09PW58fFwiJ1wiPT09bikpcmV0dXJuWydcIicrTyhlLnN1YnN0cigxLGUubGVuZ3RoLTIpKSsnXCInXTt2YXIgaT0vXFxbKGZhbHNlfHRydWV8bnVsbHxcXGQrfCdbXiddKid8XCJbXlwiXSpcIilcXF0vLmV4ZWMoZSk7aWYoaSlyZXR1cm4gdChlLnN1YnN0cigwLGkuaW5kZXgpKS5jb25jYXQodChpWzFdKSkuY29uY2F0KHQoZS5zdWJzdHIoaS5pbmRleCtpWzBdLmxlbmd0aCkpKTt2YXIgbz1lLnNwbGl0KFwiLlwiKTtpZigxPT09by5sZW5ndGgpcmV0dXJuWydcIicrTyhlKSsnXCInXTtmb3IodmFyIGE9W10scz0wO3M8by5sZW5ndGg7KytzKWE9YS5jb25jYXQodChvW3NdKSk7cmV0dXJuIGF9KHQpLmpvaW4oXCJdW1wiKStcIl1cIn12YXIgTT17RHluYW1pY1ZhcmlhYmxlOl8sZGVmaW5lOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBfKHQsayhlK1wiXCIpKX0saXNEeW5hbWljOmZ1bmN0aW9uKHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJiF0Ll9yZWdsVHlwZXx8dCBpbnN0YW5jZW9mIF99LHVuYm94OmZ1bmN0aW9uIHQoZSxuKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBlP25ldyBfKDAsZSk6XCJudW1iZXJcIj09dHlwZW9mIGV8fFwiYm9vbGVhblwiPT10eXBlb2YgZT9uZXcgXyg1LGUpOkFycmF5LmlzQXJyYXkoZSk/bmV3IF8oNixlLm1hcCgoZnVuY3Rpb24oZSxyKXtyZXR1cm4gdChlLG4rXCJbXCIrcitcIl1cIil9KSkpOmUgaW5zdGFuY2VvZiBfP2U6dm9pZCBTKCExLFwiaW52YWxpZCBvcHRpb24gdHlwZSBpbiB1bmlmb3JtIFwiK24pfSxhY2Nlc3NvcjprfSxBPXtuZXh0OlwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT9mdW5jdGlvbih0KXtyZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpfTpmdW5jdGlvbih0KXtyZXR1cm4gc2V0VGltZW91dCh0LDE2KX0sY2FuY2VsOlwiZnVuY3Rpb25cIj09dHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lP2Z1bmN0aW9uKHQpe3JldHVybiBjYW5jZWxBbmltYXRpb25GcmFtZSh0KX06Y2xlYXJUaW1lb3V0fSxUPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P2Z1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX07ZnVuY3Rpb24gQyh0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdD90LnNwbGl0KCk6KFMoQXJyYXkuaXNBcnJheSh0KSxcImludmFsaWQgZXh0ZW5zaW9uIGFycmF5XCIpLHQpfWZ1bmN0aW9uIEkodCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/KFMoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50LFwibm90IHN1cHBvcnRlZCBvdXRzaWRlIG9mIERPTVwiKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpKTp0fWZ1bmN0aW9uIFAodCl7dmFyIG4scixpLG8scyx1PXR8fHt9LGM9e30sZj1bXSxsPVtdLGg9XCJ1bmRlZmluZWRcIj09dHlwZW9mIHdpbmRvdz8xOndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLGQ9ITEscD1mdW5jdGlvbih0KXt0JiZTLnJhaXNlKHQpfSxnPWZ1bmN0aW9uKCl7fTtpZihcInN0cmluZ1wiPT10eXBlb2YgdT8oUyhcInVuZGVmaW5lZFwiIT10eXBlb2YgZG9jdW1lbnQsXCJzZWxlY3RvciBxdWVyaWVzIG9ubHkgc3VwcG9ydGVkIGluIERPTSBlbnZpcm9tZW50c1wiKSxuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodSksUyhuLFwiaW52YWxpZCBxdWVyeSBzdHJpbmcgZm9yIGVsZW1lbnRcIikpOlwib2JqZWN0XCI9PT1hKHUpP1wic3RyaW5nXCI9PXR5cGVvZihzPXUpLm5vZGVOYW1lJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBzLmFwcGVuZENoaWxkJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBzLmdldEJvdW5kaW5nQ2xpZW50UmVjdD9uPXU6ZnVuY3Rpb24odCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdC5kcmF3QXJyYXlzfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LmRyYXdFbGVtZW50c30odSk/aT0obz11KS5jYW52YXM6KFMuY29uc3RydWN0b3IodSksXCJnbFwiaW4gdT9vPXUuZ2w6XCJjYW52YXNcImluIHU/aT1JKHUuY2FudmFzKTpcImNvbnRhaW5lclwiaW4gdSYmKHI9SSh1LmNvbnRhaW5lcikpLFwiYXR0cmlidXRlc1wiaW4gdSYmKGM9dS5hdHRyaWJ1dGVzLFMudHlwZShjLFwib2JqZWN0XCIsXCJpbnZhbGlkIGNvbnRleHQgYXR0cmlidXRlc1wiKSksXCJleHRlbnNpb25zXCJpbiB1JiYoZj1DKHUuZXh0ZW5zaW9ucykpLFwib3B0aW9uYWxFeHRlbnNpb25zXCJpbiB1JiYobD1DKHUub3B0aW9uYWxFeHRlbnNpb25zKSksXCJvbkRvbmVcImluIHUmJihTLnR5cGUodS5vbkRvbmUsXCJmdW5jdGlvblwiLFwiaW52YWxpZCBvciBtaXNzaW5nIG9uRG9uZSBjYWxsYmFja1wiKSxwPXUub25Eb25lKSxcInByb2ZpbGVcImluIHUmJihkPSEhdS5wcm9maWxlKSxcInBpeGVsUmF0aW9cImluIHUmJihoPSt1LnBpeGVsUmF0aW8sUyhoPjAsXCJpbnZhbGlkIHBpeGVsIHJhdGlvXCIpKSk6Uy5yYWlzZShcImludmFsaWQgYXJndW1lbnRzIHRvIHJlZ2xcIiksbiYmKFwiY2FudmFzXCI9PT1uLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/aT1uOnI9biksIW8pe2lmKCFpKXtTKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBkb2N1bWVudCxcIm11c3QgbWFudWFsbHkgc3BlY2lmeSB3ZWJnbCBjb250ZXh0IG91dHNpZGUgb2YgRE9NIGVudmlyb25tZW50c1wiKTt2YXIgdj1mdW5jdGlvbih0LG4scil7dmFyIGksbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO2Z1bmN0aW9uIGEoKXt2YXIgbj13aW5kb3cuaW5uZXJXaWR0aCxpPXdpbmRvdy5pbm5lckhlaWdodDtpZih0IT09ZG9jdW1lbnQuYm9keSl7dmFyIGE9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtuPWEucmlnaHQtYS5sZWZ0LGk9YS5ib3R0b20tYS50b3B9by53aWR0aD1yKm4sby5oZWlnaHQ9cippLGUoby5zdHlsZSx7d2lkdGg6bitcInB4XCIsaGVpZ2h0OmkrXCJweFwifSl9cmV0dXJuIGUoby5zdHlsZSx7Ym9yZGVyOjAsbWFyZ2luOjAscGFkZGluZzowLHRvcDowLGxlZnQ6MH0pLHQuYXBwZW5kQ2hpbGQobyksdD09PWRvY3VtZW50LmJvZHkmJihvLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixlKHQuc3R5bGUse21hcmdpbjowLHBhZGRpbmc6MH0pKSx0IT09ZG9jdW1lbnQuYm9keSYmXCJmdW5jdGlvblwiPT10eXBlb2YgUmVzaXplT2JzZXJ2ZXI/KGk9bmV3IFJlc2l6ZU9ic2VydmVyKChmdW5jdGlvbigpe3NldFRpbWVvdXQoYSl9KSkpLm9ic2VydmUodCk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixhLCExKSxhKCkse2NhbnZhczpvLG9uRGVzdHJveTpmdW5jdGlvbigpe2k/aS5kaXNjb25uZWN0KCk6d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixhKSx0LnJlbW92ZUNoaWxkKG8pfX19KHJ8fGRvY3VtZW50LmJvZHksMCxoKTtpZighdilyZXR1cm4gbnVsbDtpPXYuY2FudmFzLGc9di5vbkRlc3Ryb3l9dm9pZCAwPT09Yy5wcmVtdWx0aXBsaWVkQWxwaGEmJihjLnByZW11bHRpcGxpZWRBbHBoYT0hMCksbz1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4obil7dHJ5e3JldHVybiB0LmdldENvbnRleHQobixlKX1jYXRjaCh0KXtyZXR1cm4gbnVsbH19cmV0dXJuIG4oXCJ3ZWJnbFwiKXx8bihcImV4cGVyaW1lbnRhbC13ZWJnbFwiKXx8bihcIndlYmdsLWV4cGVyaW1lbnRhbFwiKX0oaSxjKX1yZXR1cm4gbz97Z2w6byxjYW52YXM6aSxjb250YWluZXI6cixleHRlbnNpb25zOmYsb3B0aW9uYWxFeHRlbnNpb25zOmwscGl4ZWxSYXRpbzpoLHByb2ZpbGU6ZCxvbkRvbmU6cCxvbkRlc3Ryb3k6Z306KGcoKSxwKFwid2ViZ2wgbm90IHN1cHBvcnRlZCwgdHJ5IHVwZ3JhZGluZyB5b3VyIGJyb3dzZXIgb3IgZ3JhcGhpY3MgZHJpdmVycyBodHRwOi8vZ2V0LndlYmdsLm9yZ1wiKSxudWxsKX1mdW5jdGlvbiBqKHQsZSl7Zm9yKHZhciBuPUFycmF5KHQpLHI9MDtyPHQ7KytyKW5bcl09ZShyKTtyZXR1cm4gbn1mdW5jdGlvbiBEKHQpe3ZhciBlLG47cmV0dXJuIGU9KHQ+NjU1MzUpPDw0LGV8PW49KCh0Pj4+PWUpPjI1NSk8PDMsZXw9bj0oKHQ+Pj49bik+MTUpPDwyLChlfD1uPSgodD4+Pj1uKT4zKTw8MSl8KHQ+Pj49bik+PjF9ZnVuY3Rpb24gTigpe3ZhciB0PWooOCwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pKTtmdW5jdGlvbiBlKGUpe3ZhciBuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xNjtlPD0xPDwyODtlKj0xNilpZih0PD1lKXJldHVybiBlO3JldHVybiAwfShlKSxyPXRbRChuKT4+Ml07cmV0dXJuIHIubGVuZ3RoPjA/ci5wb3AoKTpuZXcgQXJyYXlCdWZmZXIobil9ZnVuY3Rpb24gbihlKXt0W0QoZS5ieXRlTGVuZ3RoKT4+Ml0ucHVzaChlKX1yZXR1cm57YWxsb2M6ZSxmcmVlOm4sYWxsb2NUeXBlOmZ1bmN0aW9uKHQsbil7dmFyIHI9bnVsbDtzd2l0Y2godCl7Y2FzZSA1MTIwOnI9bmV3IEludDhBcnJheShlKG4pLDAsbik7YnJlYWs7Y2FzZSA1MTIxOnI9bmV3IFVpbnQ4QXJyYXkoZShuKSwwLG4pO2JyZWFrO2Nhc2UgNTEyMjpyPW5ldyBJbnQxNkFycmF5KGUoMipuKSwwLG4pO2JyZWFrO2Nhc2UgNTEyMzpyPW5ldyBVaW50MTZBcnJheShlKDIqbiksMCxuKTticmVhaztjYXNlIDUxMjQ6cj1uZXcgSW50MzJBcnJheShlKDQqbiksMCxuKTticmVhaztjYXNlIDUxMjU6cj1uZXcgVWludDMyQXJyYXkoZSg0Km4pLDAsbik7YnJlYWs7Y2FzZSA1MTI2OnI9bmV3IEZsb2F0MzJBcnJheShlKDQqbiksMCxuKTticmVhaztkZWZhdWx0OnJldHVybiBudWxsfXJldHVybiByLmxlbmd0aCE9PW4/ci5zdWJhcnJheSgwLG4pOnJ9LGZyZWVUeXBlOmZ1bmN0aW9uKHQpe24odC5idWZmZXIpfX19dmFyIFI9TigpO2Z1bmN0aW9uIEwoZSl7cmV0dXJuISFlJiZcIm9iamVjdFwiPT09YShlKSYmQXJyYXkuaXNBcnJheShlLnNoYXBlKSYmQXJyYXkuaXNBcnJheShlLnN0cmlkZSkmJlwibnVtYmVyXCI9PXR5cGVvZiBlLm9mZnNldCYmZS5zaGFwZS5sZW5ndGg9PT1lLnN0cmlkZS5sZW5ndGgmJihBcnJheS5pc0FycmF5KGUuZGF0YSl8fHQoZS5kYXRhKSl9Ui56ZXJvPU4oKTt2YXIgQj1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmtleXModCkubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX0sRz17c2hhcGU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49dDtuLmxlbmd0aDtuPW5bMF0pZS5wdXNoKG4ubGVuZ3RoKTtyZXR1cm4gZX0sZmxhdHRlbjpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT0xO2lmKGUubGVuZ3RoKWZvcih2YXIgbz0wO288ZS5sZW5ndGg7KytvKWkqPWVbb107ZWxzZSBpPTA7dmFyIGE9cnx8Ui5hbGxvY1R5cGUobixpKTtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpicmVhaztjYXNlIDE6IWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MDtyPGU7KytyKW5bcl09dFtyXX0odCxlWzBdLGEpO2JyZWFrO2Nhc2UgMjohZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPTAsbz0wO288ZTsrK28pZm9yKHZhciBhPXRbb10scz0wO3M8bjsrK3MpcltpKytdPWFbc119KHQsZVswXSxlWzFdLGEpO2JyZWFrO2Nhc2UgMzpGKHQsZVswXSxlWzFdLGVbMl0sYSwwKTticmVhaztkZWZhdWx0OiFmdW5jdGlvbiB0KGUsbixyLGksbyl7Zm9yKHZhciBhPTEscz1yKzE7czxuLmxlbmd0aDsrK3MpYSo9bltzXTt2YXIgdT1uW3JdO2lmKG4ubGVuZ3RoLXI9PTQpe3ZhciBjPW5bcisxXSxmPW5bcisyXSxsPW5bciszXTtmb3Iocz0wO3M8dTsrK3MpRihlW3NdLGMsZixsLGksbyksbys9YX1lbHNlIGZvcihzPTA7czx1Oysrcyl0KGVbc10sbixyKzEsaSxvKSxvKz1hfSh0LGUsMCxhLDApfXJldHVybiBhfX07ZnVuY3Rpb24gRih0LGUsbixyLGksbyl7Zm9yKHZhciBhPW8scz0wO3M8ZTsrK3MpZm9yKHZhciB1PXRbc10sYz0wO2M8bjsrK2MpZm9yKHZhciBmPXVbY10sbD0wO2w8cjsrK2wpaVthKytdPWZbbF19dmFyIFU9e1wiW29iamVjdCBJbnQ4QXJyYXldXCI6NTEyMCxcIltvYmplY3QgSW50MTZBcnJheV1cIjo1MTIyLFwiW29iamVjdCBJbnQzMkFycmF5XVwiOjUxMjQsXCJbb2JqZWN0IFVpbnQ4QXJyYXldXCI6NTEyMSxcIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldXCI6NTEyMSxcIltvYmplY3QgVWludDE2QXJyYXldXCI6NTEyMyxcIltvYmplY3QgVWludDMyQXJyYXldXCI6NTEyNSxcIltvYmplY3QgRmxvYXQzMkFycmF5XVwiOjUxMjYsXCJbb2JqZWN0IEZsb2F0NjRBcnJheV1cIjo1MTIxLFwiW29iamVjdCBBcnJheUJ1ZmZlcl1cIjo1MTIxfSx6PXtpbnQ4OjUxMjAsaW50MTY6NTEyMixpbnQzMjo1MTI0LHVpbnQ4OjUxMjEsdWludDE2OjUxMjMsdWludDMyOjUxMjUsZmxvYXQ6NTEyNixmbG9hdDMyOjUxMjZ9LFY9e2R5bmFtaWM6MzUwNDgsc3RyZWFtOjM1MDQwLHN0YXRpYzozNTA0NH0sVz1HLmZsYXR0ZW4sWD1HLnNoYXBlLFk9W107ZnVuY3Rpb24gSCh0KXtyZXR1cm4gMHxVW09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KV19ZnVuY3Rpb24gcSh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7KytuKXRbbl09ZVtuXX1mdW5jdGlvbiBLKHQsZSxuLHIsaSxvLGEpe2Zvcih2YXIgcz0wLHU9MDt1PG47Kyt1KWZvcih2YXIgYz0wO2M8cjsrK2MpdFtzKytdPWVbaSp1K28qYythXX1ZWzUxMjBdPTEsWVs1MTIyXT0yLFlbNTEyNF09NCxZWzUxMjFdPTEsWVs1MTIzXT0yLFlbNTEyNV09NCxZWzUxMjZdPTQ7dmFyIFo9e3BvaW50czowLHBvaW50OjAsbGluZXM6MSxsaW5lOjEsdHJpYW5nbGVzOjQsdHJpYW5nbGU6NCxcImxpbmUgbG9vcFwiOjIsXCJsaW5lIHN0cmlwXCI6MyxcInRyaWFuZ2xlIHN0cmlwXCI6NSxcInRyaWFuZ2xlIGZhblwiOjZ9LFE9bmV3IEZsb2F0MzJBcnJheSgxKSxKPW5ldyBVaW50MzJBcnJheShRLmJ1ZmZlcik7ZnVuY3Rpb24gJCh0KXtmb3IodmFyIGU9Ui5hbGxvY1R5cGUoNTEyMyx0Lmxlbmd0aCksbj0wO248dC5sZW5ndGg7KytuKWlmKGlzTmFOKHRbbl0pKWVbbl09NjU1MzU7ZWxzZSBpZih0W25dPT09MS8wKWVbbl09MzE3NDQ7ZWxzZSBpZih0W25dPT09LTEvMCllW25dPTY0NTEyO2Vsc2V7UVswXT10W25dO3ZhciByPUpbMF0saT1yPj4+MzE8PDE1LG89KHI8PDE+Pj4yNCktMTI3LGE9cj4+MTMmMTAyMztpZihvPC0yNCllW25dPWk7ZWxzZSBpZihvPC0xNCl7dmFyIHM9LTE0LW87ZVtuXT1pKyhhKzEwMjQ+PnMpfWVsc2UgZVtuXT1vPjE1P2krMzE3NDQ6aSsobysxNTw8MTApK2F9cmV0dXJuIGV9ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl8fHQoZSl9dmFyIGV0PWZ1bmN0aW9uKHQpe3JldHVybiEodCZ0LTF8fCF0KX0sbnQ9Wzk5ODQsOTk4Niw5OTg1LDk5ODddLHJ0PVswLDY0MDksNjQxMCw2NDA3LDY0MDhdLGl0PXt9O2Z1bmN0aW9uIG90KHQpe3JldHVyblwiW29iamVjdCBcIit0K1wiXVwifWl0WzY0MDldPWl0WzY0MDZdPWl0WzY0MDJdPTEsaXRbMzQwNDFdPWl0WzY0MTBdPTIsaXRbNjQwN109aXRbMzU5MDRdPTMsaXRbNjQwOF09aXRbMzU5MDZdPTQ7dmFyIGF0PW90KFwiSFRNTENhbnZhc0VsZW1lbnRcIiksc3Q9b3QoXCJPZmZzY3JlZW5DYW52YXNcIiksdXQ9b3QoXCJDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcIiksY3Q9b3QoXCJJbWFnZUJpdG1hcFwiKSxmdD1vdChcIkhUTUxJbWFnZUVsZW1lbnRcIiksbHQ9b3QoXCJIVE1MVmlkZW9FbGVtZW50XCIpLGh0PU9iamVjdC5rZXlzKFUpLmNvbmNhdChbYXQsc3QsdXQsY3QsZnQsbHRdKSxkdD1bXTtkdFs1MTIxXT0xLGR0WzUxMjZdPTQsZHRbMzYxOTNdPTIsZHRbNTEyM109MixkdFs1MTI1XT00O3ZhciBwdD1bXTtmdW5jdGlvbiBndCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKDA9PT10Lmxlbmd0aHx8XCJudW1iZXJcIj09dHlwZW9mIHRbMF0pfWZ1bmN0aW9uIHZ0KHQpe3JldHVybiEhQXJyYXkuaXNBcnJheSh0KSYmISgwPT09dC5sZW5ndGh8fCF0dCh0WzBdKSl9ZnVuY3Rpb24geXQodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBtdCh0KXtyZXR1cm4geXQodCk9PT1hdH1mdW5jdGlvbiBidCh0KXtyZXR1cm4geXQodCk9PT1zdH1mdW5jdGlvbiB4dCh0KXtpZighdClyZXR1cm4hMTt2YXIgZT15dCh0KTtyZXR1cm4gaHQuaW5kZXhPZihlKT49MHx8Z3QodCl8fHZ0KHQpfHxMKHQpfWZ1bmN0aW9uIHd0KHQpe3JldHVybiAwfFVbT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpXX1mdW5jdGlvbiBTdCh0LGUpe3JldHVybiBSLmFsbG9jVHlwZSgzNjE5Mz09PXQudHlwZT81MTI2OnQudHlwZSxlKX1mdW5jdGlvbiBFdCh0LGUpezM2MTkzPT09dC50eXBlPyh0LmRhdGE9JChlKSxSLmZyZWVUeXBlKGUpKTp0LmRhdGE9ZX1mdW5jdGlvbiBfdCh0LGUsbixyLGksbyl7dmFyIGE7aWYoYT12b2lkIDAhPT1wdFt0XT9wdFt0XTppdFt0XSpkdFtlXSxvJiYoYSo9NiksaSl7Zm9yKHZhciBzPTAsdT1uO3U+PTE7KXMrPWEqdSp1LHUvPTI7cmV0dXJuIHN9cmV0dXJuIGEqbipyfWZ1bmN0aW9uIE90KG4scixpLG8scyx1LGMpe3ZhciBmPXtcImRvbid0IGNhcmVcIjo0MzUyLFwiZG9udCBjYXJlXCI6NDM1MixuaWNlOjQzNTQsZmFzdDo0MzUzfSxsPXtyZXBlYXQ6MTA0OTcsY2xhbXA6MzMwNzEsbWlycm9yOjMzNjQ4fSxoPXtuZWFyZXN0Ojk3MjgsbGluZWFyOjk3Mjl9LGQ9ZSh7bWlwbWFwOjk5ODcsXCJuZWFyZXN0IG1pcG1hcCBuZWFyZXN0XCI6OTk4NCxcImxpbmVhciBtaXBtYXAgbmVhcmVzdFwiOjk5ODUsXCJuZWFyZXN0IG1pcG1hcCBsaW5lYXJcIjo5OTg2LFwibGluZWFyIG1pcG1hcCBsaW5lYXJcIjo5OTg3fSxoKSxwPXtub25lOjAsYnJvd3NlcjozNzQ0NH0sZz17dWludDg6NTEyMSxyZ2JhNDozMjgxOSxyZ2I1NjU6MzM2MzUsXCJyZ2I1IGExXCI6MzI4MjB9LHY9e2FscGhhOjY0MDYsbHVtaW5hbmNlOjY0MDksXCJsdW1pbmFuY2UgYWxwaGFcIjo2NDEwLHJnYjo2NDA3LHJnYmE6NjQwOCxyZ2JhNDozMjg1NCxcInJnYjUgYTFcIjozMjg1NSxyZ2I1NjU6MzYxOTR9LHk9e307ci5leHRfc3JnYiYmKHYuc3JnYj0zNTkwNCx2LnNyZ2JhPTM1OTA2KSxyLm9lc190ZXh0dXJlX2Zsb2F0JiYoZy5mbG9hdDMyPWcuZmxvYXQ9NTEyNiksci5vZXNfdGV4dHVyZV9oYWxmX2Zsb2F0JiYoZy5mbG9hdDE2PWdbXCJoYWxmIGZsb2F0XCJdPTM2MTkzKSxyLndlYmdsX2RlcHRoX3RleHR1cmUmJihlKHYse2RlcHRoOjY0MDIsXCJkZXB0aCBzdGVuY2lsXCI6MzQwNDF9KSxlKGcse3VpbnQxNjo1MTIzLHVpbnQzMjo1MTI1LFwiZGVwdGggc3RlbmNpbFwiOjM0MDQyfSkpLHIud2ViZ2xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMmJmUoeSx7XCJyZ2IgczN0YyBkeHQxXCI6MzM3NzYsXCJyZ2JhIHMzdGMgZHh0MVwiOjMzNzc3LFwicmdiYSBzM3RjIGR4dDNcIjozMzc3OCxcInJnYmEgczN0YyBkeHQ1XCI6MzM3Nzl9KSxyLndlYmdsX2NvbXByZXNzZWRfdGV4dHVyZV9hdGMmJmUoeSx7XCJyZ2IgYXRjXCI6MzU5ODYsXCJyZ2JhIGF0YyBleHBsaWNpdCBhbHBoYVwiOjM1OTg3LFwicmdiYSBhdGMgaW50ZXJwb2xhdGVkIGFscGhhXCI6MzQ3OTh9KSxyLndlYmdsX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyYmZSh5LHtcInJnYiBwdnJ0YyA0YnBwdjFcIjozNTg0MCxcInJnYiBwdnJ0YyAyYnBwdjFcIjozNTg0MSxcInJnYmEgcHZydGMgNGJwcHYxXCI6MzU4NDIsXCJyZ2JhIHB2cnRjIDJicHB2MVwiOjM1ODQzfSksci53ZWJnbF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSYmKHlbXCJyZ2IgZXRjMVwiXT0zNjE5Nik7dmFyIG09QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobi5nZXRQYXJhbWV0ZXIoMzQ0NjcpKTtPYmplY3Qua2V5cyh5KS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT15W3RdO20uaW5kZXhPZihlKT49MCYmKHZbdF09ZSl9KSk7dmFyIGI9T2JqZWN0LmtleXModik7aS50ZXh0dXJlRm9ybWF0cz1iO3ZhciB4PVtdO09iamVjdC5rZXlzKHYpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXZbdF07eFtlXT10fSkpO3ZhciB3PVtdO09iamVjdC5rZXlzKGcpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWdbdF07d1tlXT10fSkpO3ZhciBFPVtdO09iamVjdC5rZXlzKGgpLmZvckVhY2goKGZ1bmN0aW9uKHQpe0VbaFt0XV09dH0pKTt2YXIgXz1bXTtPYmplY3Qua2V5cyhkKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1kW3RdO19bZV09dH0pKTt2YXIgTz1bXTtPYmplY3Qua2V5cyhsKS5mb3JFYWNoKChmdW5jdGlvbih0KXtPW2xbdF1dPXR9KSk7dmFyIGs9Yi5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7dmFyIG49dltlXTtyZXR1cm4gNjQwOT09PW58fDY0MDY9PT1ufHw2NDA5PT09bnx8NjQxMD09PW58fDY0MDI9PT1ufHwzNDA0MT09PW58fHIuZXh0X3NyZ2ImJigzNTkwND09PW58fDM1OTA2PT09bik/dFtuXT1uOjMyODU1PT09bnx8ZS5pbmRleE9mKFwicmdiYVwiKT49MD90W25dPTY0MDg6dFtuXT02NDA3LHR9KSx7fSk7ZnVuY3Rpb24gTSgpe3RoaXMuaW50ZXJuYWxmb3JtYXQ9NjQwOCx0aGlzLmZvcm1hdD02NDA4LHRoaXMudHlwZT01MTIxLHRoaXMuY29tcHJlc3NlZD0hMSx0aGlzLnByZW11bHRpcGx5QWxwaGE9ITEsdGhpcy5mbGlwWT0hMSx0aGlzLnVucGFja0FsaWdubWVudD0xLHRoaXMuY29sb3JTcGFjZT0zNzQ0NCx0aGlzLndpZHRoPTAsdGhpcy5oZWlnaHQ9MCx0aGlzLmNoYW5uZWxzPTB9ZnVuY3Rpb24gQSh0LGUpe3QuaW50ZXJuYWxmb3JtYXQ9ZS5pbnRlcm5hbGZvcm1hdCx0LmZvcm1hdD1lLmZvcm1hdCx0LnR5cGU9ZS50eXBlLHQuY29tcHJlc3NlZD1lLmNvbXByZXNzZWQsdC5wcmVtdWx0aXBseUFscGhhPWUucHJlbXVsdGlwbHlBbHBoYSx0LmZsaXBZPWUuZmxpcFksdC51bnBhY2tBbGlnbm1lbnQ9ZS51bnBhY2tBbGlnbm1lbnQsdC5jb2xvclNwYWNlPWUuY29sb3JTcGFjZSx0LndpZHRoPWUud2lkdGgsdC5oZWlnaHQ9ZS5oZWlnaHQsdC5jaGFubmVscz1lLmNoYW5uZWxzfWZ1bmN0aW9uIFQodCxlKXtpZihcIm9iamVjdFwiPT09YShlKSYmZSl7aWYoXCJwcmVtdWx0aXBseUFscGhhXCJpbiBlJiYoUy50eXBlKGUucHJlbXVsdGlwbHlBbHBoYSxcImJvb2xlYW5cIixcImludmFsaWQgcHJlbXVsdGlwbHlBbHBoYVwiKSx0LnByZW11bHRpcGx5QWxwaGE9ZS5wcmVtdWx0aXBseUFscGhhKSxcImZsaXBZXCJpbiBlJiYoUy50eXBlKGUuZmxpcFksXCJib29sZWFuXCIsXCJpbnZhbGlkIHRleHR1cmUgZmxpcFwiKSx0LmZsaXBZPWUuZmxpcFkpLFwiYWxpZ25tZW50XCJpbiBlJiYoUy5vbmVPZihlLmFsaWdubWVudCxbMSwyLDQsOF0sXCJpbnZhbGlkIHRleHR1cmUgdW5wYWNrIGFsaWdubWVudFwiKSx0LnVucGFja0FsaWdubWVudD1lLmFsaWdubWVudCksXCJjb2xvclNwYWNlXCJpbiBlJiYoUy5wYXJhbWV0ZXIoZS5jb2xvclNwYWNlLHAsXCJpbnZhbGlkIGNvbG9yU3BhY2VcIiksdC5jb2xvclNwYWNlPXBbZS5jb2xvclNwYWNlXSksXCJ0eXBlXCJpbiBlKXt2YXIgbj1lLnR5cGU7UyhyLm9lc190ZXh0dXJlX2Zsb2F0fHwhKFwiZmxvYXRcIj09PW58fFwiZmxvYXQzMlwiPT09biksXCJ5b3UgbXVzdCBlbmFibGUgdGhlIE9FU190ZXh0dXJlX2Zsb2F0IGV4dGVuc2lvbiBpbiBvcmRlciB0byB1c2UgZmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMuXCIpLFMoci5vZXNfdGV4dHVyZV9oYWxmX2Zsb2F0fHwhKFwiaGFsZiBmbG9hdFwiPT09bnx8XCJmbG9hdDE2XCI9PT1uKSxcInlvdSBtdXN0IGVuYWJsZSB0aGUgT0VTX3RleHR1cmVfaGFsZl9mbG9hdCBleHRlbnNpb24gaW4gb3JkZXIgdG8gdXNlIDE2LWJpdCBmbG9hdGluZyBwb2ludCB0ZXh0dXJlcy5cIiksUyhyLndlYmdsX2RlcHRoX3RleHR1cmV8fCEoXCJ1aW50MTZcIj09PW58fFwidWludDMyXCI9PT1ufHxcImRlcHRoIHN0ZW5jaWxcIj09PW4pLFwieW91IG11c3QgZW5hYmxlIHRoZSBXRUJHTF9kZXB0aF90ZXh0dXJlIGV4dGVuc2lvbiBpbiBvcmRlciB0byB1c2UgZGVwdGgvc3RlbmNpbCB0ZXh0dXJlcy5cIiksUy5wYXJhbWV0ZXIobixnLFwiaW52YWxpZCB0ZXh0dXJlIHR5cGVcIiksdC50eXBlPWdbbl19dmFyIG89dC53aWR0aCxzPXQuaGVpZ2h0LHU9dC5jaGFubmVscyxjPSExO1wic2hhcGVcImluIGU/KFMoQXJyYXkuaXNBcnJheShlLnNoYXBlKSYmZS5zaGFwZS5sZW5ndGg+PTIsXCJzaGFwZSBtdXN0IGJlIGFuIGFycmF5XCIpLG89ZS5zaGFwZVswXSxzPWUuc2hhcGVbMV0sMz09PWUuc2hhcGUubGVuZ3RoJiYodT1lLnNoYXBlWzJdLFModT4wJiZ1PD00LFwiaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHNcIiksYz0hMCksUyhvPj0wJiZvPD1pLm1heFRleHR1cmVTaXplLFwiaW52YWxpZCB3aWR0aFwiKSxTKHM+PTAmJnM8PWkubWF4VGV4dHVyZVNpemUsXCJpbnZhbGlkIGhlaWdodFwiKSk6KFwicmFkaXVzXCJpbiBlJiYobz1zPWUucmFkaXVzLFMobz49MCYmbzw9aS5tYXhUZXh0dXJlU2l6ZSxcImludmFsaWQgcmFkaXVzXCIpKSxcIndpZHRoXCJpbiBlJiYobz1lLndpZHRoLFMobz49MCYmbzw9aS5tYXhUZXh0dXJlU2l6ZSxcImludmFsaWQgd2lkdGhcIikpLFwiaGVpZ2h0XCJpbiBlJiYocz1lLmhlaWdodCxTKHM+PTAmJnM8PWkubWF4VGV4dHVyZVNpemUsXCJpbnZhbGlkIGhlaWdodFwiKSksXCJjaGFubmVsc1wiaW4gZSYmKHU9ZS5jaGFubmVscyxTKHU+MCYmdTw9NCxcImludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzXCIpLGM9ITApKSx0LndpZHRoPTB8byx0LmhlaWdodD0wfHMsdC5jaGFubmVscz0wfHU7dmFyIGY9ITE7aWYoXCJmb3JtYXRcImluIGUpe3ZhciBsPWUuZm9ybWF0O1Moci53ZWJnbF9kZXB0aF90ZXh0dXJlfHwhKFwiZGVwdGhcIj09PWx8fFwiZGVwdGggc3RlbmNpbFwiPT09bCksXCJ5b3UgbXVzdCBlbmFibGUgdGhlIFdFQkdMX2RlcHRoX3RleHR1cmUgZXh0ZW5zaW9uIGluIG9yZGVyIHRvIHVzZSBkZXB0aC9zdGVuY2lsIHRleHR1cmVzLlwiKSxTLnBhcmFtZXRlcihsLHYsXCJpbnZhbGlkIHRleHR1cmUgZm9ybWF0XCIpO3ZhciBoPXQuaW50ZXJuYWxmb3JtYXQ9dltsXTt0LmZvcm1hdD1rW2hdLGwgaW4gZyYmKFwidHlwZVwiaW4gZXx8KHQudHlwZT1nW2xdKSksbCBpbiB5JiYodC5jb21wcmVzc2VkPSEwKSxmPSEwfSFjJiZmP3QuY2hhbm5lbHM9aXRbdC5mb3JtYXRdOmMmJiFmP3QuY2hhbm5lbHMhPT1ydFt0LmZvcm1hdF0mJih0LmZvcm1hdD10LmludGVybmFsZm9ybWF0PXJ0W3QuY2hhbm5lbHNdKTpmJiZjJiZTKHQuY2hhbm5lbHM9PT1pdFt0LmZvcm1hdF0sXCJudW1iZXIgb2YgY2hhbm5lbHMgaW5jb25zaXN0ZW50IHdpdGggc3BlY2lmaWVkIGZvcm1hdFwiKX19ZnVuY3Rpb24gQyh0KXtuLnBpeGVsU3RvcmVpKDM3NDQwLHQuZmxpcFkpLG4ucGl4ZWxTdG9yZWkoMzc0NDEsdC5wcmVtdWx0aXBseUFscGhhKSxuLnBpeGVsU3RvcmVpKDM3NDQzLHQuY29sb3JTcGFjZSksbi5waXhlbFN0b3JlaSgzMzE3LHQudW5wYWNrQWxpZ25tZW50KX1mdW5jdGlvbiBJKCl7TS5jYWxsKHRoaXMpLHRoaXMueE9mZnNldD0wLHRoaXMueU9mZnNldD0wLHRoaXMuZGF0YT1udWxsLHRoaXMubmVlZHNGcmVlPSExLHRoaXMuZWxlbWVudD1udWxsLHRoaXMubmVlZHNDb3B5PSExfWZ1bmN0aW9uIFAoZSxuKXt2YXIgcj1udWxsO2lmKHh0KG4pP3I9bjpuJiYoUy50eXBlKG4sXCJvYmplY3RcIixcImludmFsaWQgcGl4ZWwgZGF0YSB0eXBlXCIpLFQoZSxuKSxcInhcImluIG4mJihlLnhPZmZzZXQ9MHxuLngpLFwieVwiaW4gbiYmKGUueU9mZnNldD0wfG4ueSkseHQobi5kYXRhKSYmKHI9bi5kYXRhKSksUyghZS5jb21wcmVzc2VkfHxyIGluc3RhbmNlb2YgVWludDhBcnJheSxcImNvbXByZXNzZWQgdGV4dHVyZSBkYXRhIG11c3QgYmUgc3RvcmVkIGluIGEgdWludDhhcnJheVwiKSxuLmNvcHkpe1MoIXIsXCJjYW4gbm90IHNwZWNpZnkgY29weSBhbmQgZGF0YSBmaWVsZCBmb3IgdGhlIHNhbWUgdGV4dHVyZVwiKTt2YXIgbz1zLnZpZXdwb3J0V2lkdGgsYT1zLnZpZXdwb3J0SGVpZ2h0O2Uud2lkdGg9ZS53aWR0aHx8by1lLnhPZmZzZXQsZS5oZWlnaHQ9ZS5oZWlnaHR8fGEtZS55T2Zmc2V0LGUubmVlZHNDb3B5PSEwLFMoZS54T2Zmc2V0Pj0wJiZlLnhPZmZzZXQ8byYmZS55T2Zmc2V0Pj0wJiZlLnlPZmZzZXQ8YSYmZS53aWR0aD4wJiZlLndpZHRoPD1vJiZlLmhlaWdodD4wJiZlLmhlaWdodDw9YSxcImNvcHkgdGV4dHVyZSByZWFkIG91dCBvZiBib3VuZHNcIil9ZWxzZSBpZihyKXtpZih0KHIpKWUuY2hhbm5lbHM9ZS5jaGFubmVsc3x8NCxlLmRhdGE9cixcInR5cGVcImluIG58fDUxMjEhPT1lLnR5cGV8fChlLnR5cGU9d3QocikpO2Vsc2UgaWYoZ3QocikpZS5jaGFubmVscz1lLmNoYW5uZWxzfHw0LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5sZW5ndGg7c3dpdGNoKHQudHlwZSl7Y2FzZSA1MTIxOmNhc2UgNTEyMzpjYXNlIDUxMjU6Y2FzZSA1MTI2OnZhciByPVIuYWxsb2NUeXBlKHQudHlwZSxuKTtyLnNldChlKSx0LmRhdGE9cjticmVhaztjYXNlIDM2MTkzOnQuZGF0YT0kKGUpO2JyZWFrO2RlZmF1bHQ6Uy5yYWlzZShcInVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSwgbXVzdCBzcGVjaWZ5IGEgdHlwZWQgYXJyYXlcIil9fShlLHIpLGUuYWxpZ25tZW50PTEsZS5uZWVkc0ZyZWU9ITA7ZWxzZSBpZihMKHIpKXt2YXIgdT1yLmRhdGE7QXJyYXkuaXNBcnJheSh1KXx8NTEyMSE9PWUudHlwZXx8KGUudHlwZT13dCh1KSk7dmFyIGMsZixsLGgsZCxwLGc9ci5zaGFwZSx2PXIuc3RyaWRlOzM9PT1nLmxlbmd0aD8obD1nWzJdLHA9dlsyXSk6KFMoMj09PWcubGVuZ3RoLFwiaW52YWxpZCBuZGFycmF5IHBpeGVsIGRhdGEsIG11c3QgYmUgMiBvciAzRFwiKSxsPTEscD0xKSxjPWdbMF0sZj1nWzFdLGg9dlswXSxkPXZbMV0sZS5hbGlnbm1lbnQ9MSxlLndpZHRoPWMsZS5oZWlnaHQ9ZixlLmNoYW5uZWxzPWwsZS5mb3JtYXQ9ZS5pbnRlcm5hbGZvcm1hdD1ydFtsXSxlLm5lZWRzRnJlZT0hMCxmdW5jdGlvbih0LGUsbixyLGksbyl7Zm9yKHZhciBhPXQud2lkdGgscz10LmhlaWdodCx1PXQuY2hhbm5lbHMsYz1TdCh0LGEqcyp1KSxmPTAsbD0wO2w8czsrK2wpZm9yKHZhciBoPTA7aDxhOysraClmb3IodmFyIGQ9MDtkPHU7KytkKWNbZisrXT1lW24qaCtyKmwraSpkK29dO0V0KHQsYyl9KGUsdSxoLGQscCxyLm9mZnNldCl9ZWxzZSBpZihtdChyKXx8YnQocil8fHl0KHIpPT09dXQpbXQocil8fGJ0KHIpP2UuZWxlbWVudD1yOmUuZWxlbWVudD1yLmNhbnZhcyxlLndpZHRoPWUuZWxlbWVudC53aWR0aCxlLmhlaWdodD1lLmVsZW1lbnQuaGVpZ2h0LGUuY2hhbm5lbHM9NDtlbHNlIGlmKGZ1bmN0aW9uKHQpe3JldHVybiB5dCh0KT09PWN0fShyKSllLmVsZW1lbnQ9cixlLndpZHRoPXIud2lkdGgsZS5oZWlnaHQ9ci5oZWlnaHQsZS5jaGFubmVscz00O2Vsc2UgaWYoZnVuY3Rpb24odCl7cmV0dXJuIHl0KHQpPT09ZnR9KHIpKWUuZWxlbWVudD1yLGUud2lkdGg9ci5uYXR1cmFsV2lkdGgsZS5oZWlnaHQ9ci5uYXR1cmFsSGVpZ2h0LGUuY2hhbm5lbHM9NDtlbHNlIGlmKGZ1bmN0aW9uKHQpe3JldHVybiB5dCh0KT09PWx0fShyKSllLmVsZW1lbnQ9cixlLndpZHRoPXIudmlkZW9XaWR0aCxlLmhlaWdodD1yLnZpZGVvSGVpZ2h0LGUuY2hhbm5lbHM9NDtlbHNlIGlmKHZ0KHIpKXt2YXIgeT1lLndpZHRofHxyWzBdLmxlbmd0aCxtPWUuaGVpZ2h0fHxyLmxlbmd0aCxiPWUuY2hhbm5lbHM7Yj10dChyWzBdWzBdKT9ifHxyWzBdWzBdLmxlbmd0aDpifHwxO2Zvcih2YXIgeD1HLnNoYXBlKHIpLHc9MSxFPTA7RTx4Lmxlbmd0aDsrK0Updyo9eFtFXTt2YXIgXz1TdChlLHcpO0cuZmxhdHRlbihyLHgsXCJcIixfKSxFdChlLF8pLGUuYWxpZ25tZW50PTEsZS53aWR0aD15LGUuaGVpZ2h0PW0sZS5jaGFubmVscz1iLGUuZm9ybWF0PWUuaW50ZXJuYWxmb3JtYXQ9cnRbYl0sZS5uZWVkc0ZyZWU9ITB9fWVsc2UgZS53aWR0aD1lLndpZHRofHwxLGUuaGVpZ2h0PWUuaGVpZ2h0fHwxLGUuY2hhbm5lbHM9ZS5jaGFubmVsc3x8NDs1MTI2PT09ZS50eXBlP1MoaS5leHRlbnNpb25zLmluZGV4T2YoXCJvZXNfdGV4dHVyZV9mbG9hdFwiKT49MCxcIm9lc190ZXh0dXJlX2Zsb2F0IGV4dGVuc2lvbiBub3QgZW5hYmxlZFwiKTozNjE5Mz09PWUudHlwZSYmUyhpLmV4dGVuc2lvbnMuaW5kZXhPZihcIm9lc190ZXh0dXJlX2hhbGZfZmxvYXRcIik+PTAsXCJvZXNfdGV4dHVyZV9oYWxmX2Zsb2F0IGV4dGVuc2lvbiBub3QgZW5hYmxlZFwiKX1mdW5jdGlvbiBqKHQsZSxyKXt2YXIgaT10LmVsZW1lbnQsYT10LmRhdGEscz10LmludGVybmFsZm9ybWF0LHU9dC5mb3JtYXQsYz10LnR5cGUsZj10LndpZHRoLGw9dC5oZWlnaHQ7Qyh0KSxpP24udGV4SW1hZ2UyRChlLHIsdSx1LGMsaSk6dC5jb21wcmVzc2VkP24uY29tcHJlc3NlZFRleEltYWdlMkQoZSxyLHMsZixsLDAsYSk6dC5uZWVkc0NvcHk/KG8oKSxuLmNvcHlUZXhJbWFnZTJEKGUscix1LHQueE9mZnNldCx0LnlPZmZzZXQsZixsLDApKTpuLnRleEltYWdlMkQoZSxyLHUsZixsLDAsdSxjLGF8fG51bGwpfWZ1bmN0aW9uIEQodCxlLHIsaSxhKXt2YXIgcz10LmVsZW1lbnQsdT10LmRhdGEsYz10LmludGVybmFsZm9ybWF0LGY9dC5mb3JtYXQsbD10LnR5cGUsaD10LndpZHRoLGQ9dC5oZWlnaHQ7Qyh0KSxzP24udGV4U3ViSW1hZ2UyRChlLGEscixpLGYsbCxzKTp0LmNvbXByZXNzZWQ/bi5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChlLGEscixpLGMsaCxkLHUpOnQubmVlZHNDb3B5PyhvKCksbi5jb3B5VGV4U3ViSW1hZ2UyRChlLGEscixpLHQueE9mZnNldCx0LnlPZmZzZXQsaCxkKSk6bi50ZXhTdWJJbWFnZTJEKGUsYSxyLGksaCxkLGYsbCx1KX12YXIgTj1bXTtmdW5jdGlvbiBGKCl7cmV0dXJuIE4ucG9wKCl8fG5ldyBJfWZ1bmN0aW9uIFUodCl7dC5uZWVkc0ZyZWUmJlIuZnJlZVR5cGUodC5kYXRhKSxJLmNhbGwodCksTi5wdXNoKHQpfWZ1bmN0aW9uIHooKXtNLmNhbGwodGhpcyksdGhpcy5nZW5NaXBtYXBzPSExLHRoaXMubWlwbWFwSGludD00MzUyLHRoaXMubWlwbWFzaz0wLHRoaXMuaW1hZ2VzPUFycmF5KDE2KX1mdW5jdGlvbiBWKHQsZSxuKXt2YXIgcj10LmltYWdlc1swXT1GKCk7dC5taXBtYXNrPTEsci53aWR0aD10LndpZHRoPWUsci5oZWlnaHQ9dC5oZWlnaHQ9bixyLmNoYW5uZWxzPXQuY2hhbm5lbHM9NH1mdW5jdGlvbiBXKHQsZSl7dmFyIG49bnVsbDtpZih4dChlKSlBKG49dC5pbWFnZXNbMF09RigpLHQpLFAobixlKSx0Lm1pcG1hc2s9MTtlbHNlIGlmKFQodCxlKSxBcnJheS5pc0FycmF5KGUubWlwbWFwKSlmb3IodmFyIHI9ZS5taXBtYXAsaT0wO2k8ci5sZW5ndGg7KytpKUEobj10LmltYWdlc1tpXT1GKCksdCksbi53aWR0aD4+PWksbi5oZWlnaHQ+Pj1pLFAobixyW2ldKSx0Lm1pcG1hc2t8PTE8PGk7ZWxzZSBBKG49dC5pbWFnZXNbMF09RigpLHQpLFAobixlKSx0Lm1pcG1hc2s9MTtBKHQsdC5pbWFnZXNbMF0pLCF0LmNvbXByZXNzZWR8fDMzNzc2IT09dC5pbnRlcm5hbGZvcm1hdCYmMzM3NzchPT10LmludGVybmFsZm9ybWF0JiYzMzc3OCE9PXQuaW50ZXJuYWxmb3JtYXQmJjMzNzc5IT09dC5pbnRlcm5hbGZvcm1hdHx8Uyh0LndpZHRoJTQ9PTAmJnQuaGVpZ2h0JTQ9PTAsXCJmb3IgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMsIG1pcG1hcCBsZXZlbCAwIG11c3QgaGF2ZSB3aWR0aCBhbmQgaGVpZ2h0IHRoYXQgYXJlIGEgbXVsdGlwbGUgb2YgNFwiKX1mdW5jdGlvbiBYKHQsZSl7Zm9yKHZhciBuPXQuaW1hZ2VzLHI9MDtyPG4ubGVuZ3RoOysrcil7aWYoIW5bcl0pcmV0dXJuO2oobltyXSxlLHIpfX12YXIgWT1bXTtmdW5jdGlvbiBIKCl7dmFyIHQ9WS5wb3AoKXx8bmV3IHo7TS5jYWxsKHQpLHQubWlwbWFzaz0wO2Zvcih2YXIgZT0wO2U8MTY7KytlKXQuaW1hZ2VzW2VdPW51bGw7cmV0dXJuIHR9ZnVuY3Rpb24gcSh0KXtmb3IodmFyIGU9dC5pbWFnZXMsbj0wO248ZS5sZW5ndGg7KytuKWVbbl0mJlUoZVtuXSksZVtuXT1udWxsO1kucHVzaCh0KX1mdW5jdGlvbiBLKCl7dGhpcy5taW5GaWx0ZXI9OTcyOCx0aGlzLm1hZ0ZpbHRlcj05NzI4LHRoaXMud3JhcFM9MzMwNzEsdGhpcy53cmFwVD0zMzA3MSx0aGlzLmFuaXNvdHJvcGljPTEsdGhpcy5nZW5NaXBtYXBzPSExLHRoaXMubWlwbWFwSGludD00MzUyfWZ1bmN0aW9uIFoodCxlKXtpZihcIm1pblwiaW4gZSl7dmFyIG49ZS5taW47Uy5wYXJhbWV0ZXIobixkKSx0Lm1pbkZpbHRlcj1kW25dLG50LmluZGV4T2YodC5taW5GaWx0ZXIpPj0wJiYhKFwiZmFjZXNcImluIGUpJiYodC5nZW5NaXBtYXBzPSEwKX1pZihcIm1hZ1wiaW4gZSl7dmFyIHI9ZS5tYWc7Uy5wYXJhbWV0ZXIocixoKSx0Lm1hZ0ZpbHRlcj1oW3JdfXZhciBvPXQud3JhcFMscz10LndyYXBUO2lmKFwid3JhcFwiaW4gZSl7dmFyIHU9ZS53cmFwO1wic3RyaW5nXCI9PXR5cGVvZiB1PyhTLnBhcmFtZXRlcih1LGwpLG89cz1sW3VdKTpBcnJheS5pc0FycmF5KHUpJiYoUy5wYXJhbWV0ZXIodVswXSxsKSxTLnBhcmFtZXRlcih1WzFdLGwpLG89bFt1WzBdXSxzPWxbdVsxXV0pfWVsc2V7aWYoXCJ3cmFwU1wiaW4gZSl7dmFyIGM9ZS53cmFwUztTLnBhcmFtZXRlcihjLGwpLG89bFtjXX1pZihcIndyYXBUXCJpbiBlKXt2YXIgcD1lLndyYXBUO1MucGFyYW1ldGVyKHAsbCkscz1sW3BdfX1pZih0LndyYXBTPW8sdC53cmFwVD1zLFwiYW5pc290cm9waWNcImluIGUpe3ZhciBnPWUuYW5pc290cm9waWM7UyhcIm51bWJlclwiPT10eXBlb2YgZyYmZz49MSYmZzw9aS5tYXhBbmlzb3Ryb3BpYyxcImFuaXNvIHNhbXBsZXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIFwiKSx0LmFuaXNvdHJvcGljPWUuYW5pc290cm9waWN9aWYoXCJtaXBtYXBcImluIGUpe3ZhciB2PSExO3N3aXRjaChhKGUubWlwbWFwKSl7Y2FzZVwic3RyaW5nXCI6Uy5wYXJhbWV0ZXIoZS5taXBtYXAsZixcImludmFsaWQgbWlwbWFwIGhpbnRcIiksdC5taXBtYXBIaW50PWZbZS5taXBtYXBdLHQuZ2VuTWlwbWFwcz0hMCx2PSEwO2JyZWFrO2Nhc2VcImJvb2xlYW5cIjp2PXQuZ2VuTWlwbWFwcz1lLm1pcG1hcDticmVhaztjYXNlXCJvYmplY3RcIjpTKEFycmF5LmlzQXJyYXkoZS5taXBtYXApLFwiaW52YWxpZCBtaXBtYXAgdHlwZVwiKSx0Lmdlbk1pcG1hcHM9ITEsdj0hMDticmVhaztkZWZhdWx0OlMucmFpc2UoXCJpbnZhbGlkIG1pcG1hcCB0eXBlXCIpfXYmJiEoXCJtaW5cImluIGUpJiYodC5taW5GaWx0ZXI9OTk4NCl9fWZ1bmN0aW9uIFEodCxlKXtuLnRleFBhcmFtZXRlcmkoZSwxMDI0MSx0Lm1pbkZpbHRlciksbi50ZXhQYXJhbWV0ZXJpKGUsMTAyNDAsdC5tYWdGaWx0ZXIpLG4udGV4UGFyYW1ldGVyaShlLDEwMjQyLHQud3JhcFMpLG4udGV4UGFyYW1ldGVyaShlLDEwMjQzLHQud3JhcFQpLHIuZXh0X3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJiZuLnRleFBhcmFtZXRlcmkoZSwzNDA0Nix0LmFuaXNvdHJvcGljKSx0Lmdlbk1pcG1hcHMmJihuLmhpbnQoMzMxNzAsdC5taXBtYXBIaW50KSxuLmdlbmVyYXRlTWlwbWFwKGUpKX12YXIgSj0wLG90PXt9LGF0PWkubWF4VGV4dHVyZVVuaXRzLHN0PUFycmF5KGF0KS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9KSk7ZnVuY3Rpb24gaHQodCl7TS5jYWxsKHRoaXMpLHRoaXMubWlwbWFzaz0wLHRoaXMuaW50ZXJuYWxmb3JtYXQ9NjQwOCx0aGlzLmlkPUorKyx0aGlzLnJlZkNvdW50PTEsdGhpcy50YXJnZXQ9dCx0aGlzLnRleHR1cmU9bi5jcmVhdGVUZXh0dXJlKCksdGhpcy51bml0PS0xLHRoaXMuYmluZENvdW50PTAsdGhpcy50ZXhJbmZvPW5ldyBLLGMucHJvZmlsZSYmKHRoaXMuc3RhdHM9e3NpemU6MH0pfWZ1bmN0aW9uIGR0KHQpe24uYWN0aXZlVGV4dHVyZSgzMzk4NCksbi5iaW5kVGV4dHVyZSh0LnRhcmdldCx0LnRleHR1cmUpfWZ1bmN0aW9uIHB0KCl7dmFyIHQ9c3RbMF07dD9uLmJpbmRUZXh0dXJlKHQudGFyZ2V0LHQudGV4dHVyZSk6bi5iaW5kVGV4dHVyZSgzNTUzLG51bGwpfWZ1bmN0aW9uIE90KHQpe3ZhciBlPXQudGV4dHVyZTtTKGUsXCJtdXN0IG5vdCBkb3VibGUgZGVzdHJveSB0ZXh0dXJlXCIpO3ZhciByPXQudW5pdCxpPXQudGFyZ2V0O3I+PTAmJihuLmFjdGl2ZVRleHR1cmUoMzM5ODQrciksbi5iaW5kVGV4dHVyZShpLG51bGwpLHN0W3JdPW51bGwpLG4uZGVsZXRlVGV4dHVyZShlKSx0LnRleHR1cmU9bnVsbCx0LnBhcmFtcz1udWxsLHQucGl4ZWxzPW51bGwsdC5yZWZDb3VudD0wLGRlbGV0ZSBvdFt0LmlkXSx1LnRleHR1cmVDb3VudC0tfXJldHVybiBlKGh0LnByb3RvdHlwZSx7YmluZDpmdW5jdGlvbigpe3RoaXMuYmluZENvdW50Kz0xO3ZhciB0PXRoaXMudW5pdDtpZih0PDApe2Zvcih2YXIgZT0wO2U8YXQ7KytlKXt2YXIgcj1zdFtlXTtpZihyKXtpZihyLmJpbmRDb3VudD4wKWNvbnRpbnVlO3IudW5pdD0tMX1zdFtlXT10aGlzLHQ9ZTticmVha310Pj1hdCYmUy5yYWlzZShcImluc3VmZmljaWVudCBudW1iZXIgb2YgdGV4dHVyZSB1bml0c1wiKSxjLnByb2ZpbGUmJnUubWF4VGV4dHVyZVVuaXRzPHQrMSYmKHUubWF4VGV4dHVyZVVuaXRzPXQrMSksdGhpcy51bml0PXQsbi5hY3RpdmVUZXh0dXJlKDMzOTg0K3QpLG4uYmluZFRleHR1cmUodGhpcy50YXJnZXQsdGhpcy50ZXh0dXJlKX1yZXR1cm4gdH0sdW5iaW5kOmZ1bmN0aW9uKCl7dGhpcy5iaW5kQ291bnQtPTF9LGRlY1JlZjpmdW5jdGlvbigpey0tdGhpcy5yZWZDb3VudDw9MCYmT3QodGhpcyl9fSksYy5wcm9maWxlJiYodS5nZXRUb3RhbFRleHR1cmVTaXplPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gT2JqZWN0LmtleXMob3QpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QrPW90W2VdLnN0YXRzLnNpemV9KSksdH0pLHtjcmVhdGUyRDpmdW5jdGlvbih0LGUpe3ZhciByPW5ldyBodCgzNTUzKTtmdW5jdGlvbiBvKHQsZSl7dmFyIG49ci50ZXhJbmZvO0suY2FsbChuKTt2YXIgYT1IKCk7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIHQ/VihhLDB8dCxcIm51bWJlclwiPT10eXBlb2YgZT8wfGU6MHx0KTp0PyhTLnR5cGUodCxcIm9iamVjdFwiLFwiaW52YWxpZCBhcmd1bWVudHMgdG8gcmVnbC50ZXh0dXJlXCIpLFoobix0KSxXKGEsdCkpOlYoYSwxLDEpLG4uZ2VuTWlwbWFwcyYmKGEubWlwbWFzaz0oYS53aWR0aDw8MSktMSksci5taXBtYXNrPWEubWlwbWFzayxBKHIsYSksUy50ZXh0dXJlMkQobixhLGkpLHIuaW50ZXJuYWxmb3JtYXQ9YS5pbnRlcm5hbGZvcm1hdCxvLndpZHRoPWEud2lkdGgsby5oZWlnaHQ9YS5oZWlnaHQsZHQociksWChhLDM1NTMpLFEobiwzNTUzKSxwdCgpLHEoYSksYy5wcm9maWxlJiYoci5zdGF0cy5zaXplPV90KHIuaW50ZXJuYWxmb3JtYXQsci50eXBlLGEud2lkdGgsYS5oZWlnaHQsbi5nZW5NaXBtYXBzLCExKSksby5mb3JtYXQ9eFtyLmludGVybmFsZm9ybWF0XSxvLnR5cGU9d1tyLnR5cGVdLG8ubWFnPUVbbi5tYWdGaWx0ZXJdLG8ubWluPV9bbi5taW5GaWx0ZXJdLG8ud3JhcFM9T1tuLndyYXBTXSxvLndyYXBUPU9bbi53cmFwVF0sb31yZXR1cm4gb3Rbci5pZF09cix1LnRleHR1cmVDb3VudCsrLG8odCxlKSxvLnN1YmltYWdlPWZ1bmN0aW9uKHQsZSxuLGkpe1MoISF0LFwibXVzdCBzcGVjaWZ5IGltYWdlIGRhdGFcIik7dmFyIGE9MHxlLHM9MHxuLHU9MHxpLGM9RigpO3JldHVybiBBKGMsciksYy53aWR0aD0wLGMuaGVpZ2h0PTAsUChjLHQpLGMud2lkdGg9Yy53aWR0aHx8KHIud2lkdGg+PnUpLWEsYy5oZWlnaHQ9Yy5oZWlnaHR8fChyLmhlaWdodD4+dSktcyxTKHIudHlwZT09PWMudHlwZSYmci5mb3JtYXQ9PT1jLmZvcm1hdCYmci5pbnRlcm5hbGZvcm1hdD09PWMuaW50ZXJuYWxmb3JtYXQsXCJpbmNvbXBhdGlibGUgZm9ybWF0IGZvciB0ZXh0dXJlLnN1YmltYWdlXCIpLFMoYT49MCYmcz49MCYmYStjLndpZHRoPD1yLndpZHRoJiZzK2MuaGVpZ2h0PD1yLmhlaWdodCxcInRleHR1cmUuc3ViaW1hZ2Ugd3JpdGUgb3V0IG9mIGJvdW5kc1wiKSxTKHIubWlwbWFzayYxPDx1LFwibWlzc2luZyBtaXBtYXAgZGF0YVwiKSxTKGMuZGF0YXx8Yy5lbGVtZW50fHxjLm5lZWRzQ29weSxcIm1pc3NpbmcgaW1hZ2UgZGF0YVwiKSxkdChyKSxEKGMsMzU1MyxhLHMsdSkscHQoKSxVKGMpLG99LG8ucmVzaXplPWZ1bmN0aW9uKHQsZSl7dmFyIGk9MHx0LGE9MHxlfHxpO2lmKGk9PT1yLndpZHRoJiZhPT09ci5oZWlnaHQpcmV0dXJuIG87by53aWR0aD1yLndpZHRoPWksby5oZWlnaHQ9ci5oZWlnaHQ9YSxkdChyKTtmb3IodmFyIHM9MDtyLm1pcG1hc2s+PnM7KytzKXt2YXIgdT1pPj5zLGY9YT4+cztpZighdXx8IWYpYnJlYWs7bi50ZXhJbWFnZTJEKDM1NTMscyxyLmZvcm1hdCx1LGYsMCxyLmZvcm1hdCxyLnR5cGUsbnVsbCl9cmV0dXJuIHB0KCksYy5wcm9maWxlJiYoci5zdGF0cy5zaXplPV90KHIuaW50ZXJuYWxmb3JtYXQsci50eXBlLGksYSwhMSwhMSkpLG99LG8uX3JlZ2xUeXBlPVwidGV4dHVyZTJkXCIsby5fdGV4dHVyZT1yLGMucHJvZmlsZSYmKG8uc3RhdHM9ci5zdGF0cyksby5kZXN0cm95PWZ1bmN0aW9uKCl7ci5kZWNSZWYoKX0sb30sY3JlYXRlQ3ViZTpmdW5jdGlvbih0LGUscixvLHMsZil7dmFyIGw9bmV3IGh0KDM0MDY3KTtvdFtsLmlkXT1sLHUuY3ViZUNvdW50Kys7dmFyIGg9bmV3IEFycmF5KDYpO2Z1bmN0aW9uIGQodCxlLG4scixvLHMpe3ZhciB1LGY9bC50ZXhJbmZvO2ZvcihLLmNhbGwoZiksdT0wO3U8NjsrK3UpaFt1XT1IKCk7aWYoXCJudW1iZXJcIiE9dHlwZW9mIHQmJnQpaWYoXCJvYmplY3RcIj09PWEodCkpaWYoZSlXKGhbMF0sdCksVyhoWzFdLGUpLFcoaFsyXSxuKSxXKGhbM10sciksVyhoWzRdLG8pLFcoaFs1XSxzKTtlbHNlIGlmKFooZix0KSxUKGwsdCksXCJmYWNlc1wiaW4gdCl7dmFyIHA9dC5mYWNlcztmb3IoUyhBcnJheS5pc0FycmF5KHApJiY2PT09cC5sZW5ndGgsXCJjdWJlIGZhY2VzIG11c3QgYmUgYSBsZW5ndGggNiBhcnJheVwiKSx1PTA7dTw2OysrdSlTKFwib2JqZWN0XCI9PT1hKHBbdV0pJiYhIXBbdV0sXCJpbnZhbGlkIGlucHV0IGZvciBjdWJlIG1hcCBmYWNlXCIpLEEoaFt1XSxsKSxXKGhbdV0scFt1XSl9ZWxzZSBmb3IodT0wO3U8NjsrK3UpVyhoW3VdLHQpO2Vsc2UgUy5yYWlzZShcImludmFsaWQgYXJndW1lbnRzIHRvIGN1YmUgbWFwXCIpO2Vsc2V7dmFyIGc9MHx0fHwxO2Zvcih1PTA7dTw2OysrdSlWKGhbdV0sZyxnKX1mb3IoQShsLGhbMF0pLGkubnBvdFRleHR1cmVDdWJlfHxTKGV0KGwud2lkdGgpJiZldChsLmhlaWdodCksXCJ5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBub24gcG93ZXIgb3IgdHdvIHRleHR1cmUgZGltZW5zaW9uc1wiKSxmLmdlbk1pcG1hcHM/bC5taXBtYXNrPShoWzBdLndpZHRoPDwxKS0xOmwubWlwbWFzaz1oWzBdLm1pcG1hc2ssUy50ZXh0dXJlQ3ViZShsLGYsaCxpKSxsLmludGVybmFsZm9ybWF0PWhbMF0uaW50ZXJuYWxmb3JtYXQsZC53aWR0aD1oWzBdLndpZHRoLGQuaGVpZ2h0PWhbMF0uaGVpZ2h0LGR0KGwpLHU9MDt1PDY7Kyt1KVgoaFt1XSwzNDA2OSt1KTtmb3IoUShmLDM0MDY3KSxwdCgpLGMucHJvZmlsZSYmKGwuc3RhdHMuc2l6ZT1fdChsLmludGVybmFsZm9ybWF0LGwudHlwZSxkLndpZHRoLGQuaGVpZ2h0LGYuZ2VuTWlwbWFwcywhMCkpLGQuZm9ybWF0PXhbbC5pbnRlcm5hbGZvcm1hdF0sZC50eXBlPXdbbC50eXBlXSxkLm1hZz1FW2YubWFnRmlsdGVyXSxkLm1pbj1fW2YubWluRmlsdGVyXSxkLndyYXBTPU9bZi53cmFwU10sZC53cmFwVD1PW2Yud3JhcFRdLHU9MDt1PDY7Kyt1KXEoaFt1XSk7cmV0dXJuIGR9cmV0dXJuIGQodCxlLHIsbyxzLGYpLGQuc3ViaW1hZ2U9ZnVuY3Rpb24odCxlLG4scixpKXtTKCEhZSxcIm11c3Qgc3BlY2lmeSBpbWFnZSBkYXRhXCIpLFMoXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ9PT0oMHx0KSYmdD49MCYmdDw2LFwiaW52YWxpZCBmYWNlXCIpO3ZhciBvPTB8bixhPTB8cixzPTB8aSx1PUYoKTtyZXR1cm4gQSh1LGwpLHUud2lkdGg9MCx1LmhlaWdodD0wLFAodSxlKSx1LndpZHRoPXUud2lkdGh8fChsLndpZHRoPj5zKS1vLHUuaGVpZ2h0PXUuaGVpZ2h0fHwobC5oZWlnaHQ+PnMpLWEsUyhsLnR5cGU9PT11LnR5cGUmJmwuZm9ybWF0PT09dS5mb3JtYXQmJmwuaW50ZXJuYWxmb3JtYXQ9PT11LmludGVybmFsZm9ybWF0LFwiaW5jb21wYXRpYmxlIGZvcm1hdCBmb3IgdGV4dHVyZS5zdWJpbWFnZVwiKSxTKG8+PTAmJmE+PTAmJm8rdS53aWR0aDw9bC53aWR0aCYmYSt1LmhlaWdodDw9bC5oZWlnaHQsXCJ0ZXh0dXJlLnN1YmltYWdlIHdyaXRlIG91dCBvZiBib3VuZHNcIiksUyhsLm1pcG1hc2smMTw8cyxcIm1pc3NpbmcgbWlwbWFwIGRhdGFcIiksUyh1LmRhdGF8fHUuZWxlbWVudHx8dS5uZWVkc0NvcHksXCJtaXNzaW5nIGltYWdlIGRhdGFcIiksZHQobCksRCh1LDM0MDY5K3QsbyxhLHMpLHB0KCksVSh1KSxkfSxkLnJlc2l6ZT1mdW5jdGlvbih0KXt2YXIgZT0wfHQ7aWYoZSE9PWwud2lkdGgpe2Qud2lkdGg9bC53aWR0aD1lLGQuaGVpZ2h0PWwuaGVpZ2h0PWUsZHQobCk7Zm9yKHZhciByPTA7cjw2Oysrcilmb3IodmFyIGk9MDtsLm1pcG1hc2s+Pmk7KytpKW4udGV4SW1hZ2UyRCgzNDA2OStyLGksbC5mb3JtYXQsZT4+aSxlPj5pLDAsbC5mb3JtYXQsbC50eXBlLG51bGwpO3JldHVybiBwdCgpLGMucHJvZmlsZSYmKGwuc3RhdHMuc2l6ZT1fdChsLmludGVybmFsZm9ybWF0LGwudHlwZSxkLndpZHRoLGQuaGVpZ2h0LCExLCEwKSksZH19LGQuX3JlZ2xUeXBlPVwidGV4dHVyZUN1YmVcIixkLl90ZXh0dXJlPWwsYy5wcm9maWxlJiYoZC5zdGF0cz1sLnN0YXRzKSxkLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsLmRlY1JlZigpfSxkfSxjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8YXQ7Kyt0KW4uYWN0aXZlVGV4dHVyZSgzMzk4NCt0KSxuLmJpbmRUZXh0dXJlKDM1NTMsbnVsbCksc3RbdF09bnVsbDtCKG90KS5mb3JFYWNoKE90KSx1LmN1YmVDb3VudD0wLHUudGV4dHVyZUNvdW50PTB9LGdldFRleHR1cmU6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGx9LHJlc3RvcmU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PGF0OysrdCl7dmFyIGU9c3RbdF07ZSYmKGUuYmluZENvdW50PTAsZS51bml0PS0xLHN0W3RdPW51bGwpfUIob3QpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QudGV4dHVyZT1uLmNyZWF0ZVRleHR1cmUoKSxuLmJpbmRUZXh0dXJlKHQudGFyZ2V0LHQudGV4dHVyZSk7Zm9yKHZhciBlPTA7ZTwzMjsrK2UpaWYoMCE9KHQubWlwbWFzayYxPDxlKSlpZigzNTUzPT09dC50YXJnZXQpbi50ZXhJbWFnZTJEKDM1NTMsZSx0LmludGVybmFsZm9ybWF0LHQud2lkdGg+PmUsdC5oZWlnaHQ+PmUsMCx0LmludGVybmFsZm9ybWF0LHQudHlwZSxudWxsKTtlbHNlIGZvcih2YXIgcj0wO3I8NjsrK3Ipbi50ZXhJbWFnZTJEKDM0MDY5K3IsZSx0LmludGVybmFsZm9ybWF0LHQud2lkdGg+PmUsdC5oZWlnaHQ+PmUsMCx0LmludGVybmFsZm9ybWF0LHQudHlwZSxudWxsKTtRKHQudGV4SW5mbyx0LnRhcmdldCl9KSl9LHJlZnJlc2g6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PGF0OysrdCl7dmFyIGU9c3RbdF07ZSYmKGUuYmluZENvdW50PTAsZS51bml0PS0xLHN0W3RdPW51bGwpLG4uYWN0aXZlVGV4dHVyZSgzMzk4NCt0KSxuLmJpbmRUZXh0dXJlKDM1NTMsbnVsbCksbi5iaW5kVGV4dHVyZSgzNDA2NyxudWxsKX19fX1wdFszMjg1NF09MixwdFszMjg1NV09MixwdFszNjE5NF09MixwdFszNDA0MV09NCxwdFszMzc3Nl09LjUscHRbMzM3NzddPS41LHB0WzMzNzc4XT0xLHB0WzMzNzc5XT0xLHB0WzM1OTg2XT0uNSxwdFszNTk4N109MSxwdFszNDc5OF09MSxwdFszNTg0MF09LjUscHRbMzU4NDFdPS4yNSxwdFszNTg0Ml09LjUscHRbMzU4NDNdPS4yNSxwdFszNjE5Nl09LjU7dmFyIGt0PVtdO2Z1bmN0aW9uIE10KHQsZSxuKXtyZXR1cm4ga3RbdF0qZSpufWt0WzMyODU0XT0yLGt0WzMyODU1XT0yLGt0WzM2MTk0XT0yLGt0WzMzMTg5XT0yLGt0WzM2MTY4XT0xLGt0WzM0MDQxXT00LGt0WzM1OTA3XT00LGt0WzM0ODM2XT0xNixrdFszNDg0Ml09OCxrdFszNDg0M109Njt2YXIgQXQ9WzY0MDcsNjQwOF0sVHQ9W107VHRbNjQwOF09NCxUdFs2NDA3XT0zO3ZhciBDdD1bXTtDdFs1MTIxXT0xLEN0WzUxMjZdPTQsQ3RbMzYxOTNdPTI7dmFyIEl0PVszMjg1NCwzMjg1NSwzNjE5NCwzNTkwNywzNDg0MiwzNDg0MywzNDgzNl0sUHQ9e307ZnVuY3Rpb24ganQoKXt0aGlzLnN0YXRlPTAsdGhpcy54PTAsdGhpcy55PTAsdGhpcy56PTAsdGhpcy53PTAsdGhpcy5idWZmZXI9bnVsbCx0aGlzLnNpemU9MCx0aGlzLm5vcm1hbGl6ZWQ9ITEsdGhpcy50eXBlPTUxMjYsdGhpcy5vZmZzZXQ9MCx0aGlzLnN0cmlkZT0wLHRoaXMuZGl2aXNvcj0wfWZ1bmN0aW9uIER0KGUsbixyLGksbyxhLHMpe2Z1bmN0aW9uIHUodSl7dmFyIGM7bnVsbD09PW4ubmV4dD8oUyhvLnByZXNlcnZlRHJhd2luZ0J1ZmZlciwneW91IG11c3QgY3JlYXRlIGEgd2ViZ2wgY29udGV4dCB3aXRoIFwicHJlc2VydmVEcmF3aW5nQnVmZmVyXCI6dHJ1ZSBpbiBvcmRlciB0byByZWFkIHBpeGVscyBmcm9tIHRoZSBkcmF3aW5nIGJ1ZmZlcicpLGM9NTEyMSk6KFMobnVsbCE9PW4ubmV4dC5jb2xvckF0dGFjaG1lbnRzWzBdLnRleHR1cmUsXCJZb3UgY2Fubm90IHJlYWQgZnJvbSBhIHJlbmRlcmJ1ZmZlclwiKSxjPW4ubmV4dC5jb2xvckF0dGFjaG1lbnRzWzBdLnRleHR1cmUuX3RleHR1cmUudHlwZSxhLm9lc190ZXh0dXJlX2Zsb2F0PyhTKDUxMjE9PT1jfHw1MTI2PT09YyxcIlJlYWRpbmcgZnJvbSBhIGZyYW1lYnVmZmVyIGlzIG9ubHkgYWxsb3dlZCBmb3IgdGhlIHR5cGVzICd1aW50OCcgYW5kICdmbG9hdCdcIiksNTEyNj09PWMmJlMocy5yZWFkRmxvYXQsXCJSZWFkaW5nICdmbG9hdCcgdmFsdWVzIGlzIG5vdCBwZXJtaXR0ZWQgaW4geW91ciBicm93c2VyLiBGb3IgYSBmYWxsYmFjaywgcGxlYXNlIHNlZTogaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZ2xzbC1yZWFkLWZsb2F0XCIpKTpTKDUxMjE9PT1jLFwiUmVhZGluZyBmcm9tIGEgZnJhbWVidWZmZXIgaXMgb25seSBhbGxvd2VkIGZvciB0aGUgdHlwZSAndWludDgnXCIpKTt2YXIgZj0wLGw9MCxoPWkuZnJhbWVidWZmZXJXaWR0aCxkPWkuZnJhbWVidWZmZXJIZWlnaHQscD1udWxsO3QodSk/cD11OnUmJihTLnR5cGUodSxcIm9iamVjdFwiLFwiaW52YWxpZCBhcmd1bWVudHMgdG8gcmVnbC5yZWFkKClcIiksZj0wfHUueCxsPTB8dS55LFMoZj49MCYmZjxpLmZyYW1lYnVmZmVyV2lkdGgsXCJpbnZhbGlkIHggb2Zmc2V0IGZvciByZWdsLnJlYWRcIiksUyhsPj0wJiZsPGkuZnJhbWVidWZmZXJIZWlnaHQsXCJpbnZhbGlkIHkgb2Zmc2V0IGZvciByZWdsLnJlYWRcIiksaD0wfCh1LndpZHRofHxpLmZyYW1lYnVmZmVyV2lkdGgtZiksZD0wfCh1LmhlaWdodHx8aS5mcmFtZWJ1ZmZlckhlaWdodC1sKSxwPXUuZGF0YXx8bnVsbCkscCYmKDUxMjE9PT1jP1MocCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksXCJidWZmZXIgbXVzdCBiZSAnVWludDhBcnJheScgd2hlbiByZWFkaW5nIGZyb20gYSBmcmFtZWJ1ZmZlciBvZiB0eXBlICd1aW50OCdcIik6NTEyNj09PWMmJlMocCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSxcImJ1ZmZlciBtdXN0IGJlICdGbG9hdDMyQXJyYXknIHdoZW4gcmVhZGluZyBmcm9tIGEgZnJhbWVidWZmZXIgb2YgdHlwZSAnZmxvYXQnXCIpKSxTKGg+MCYmaCtmPD1pLmZyYW1lYnVmZmVyV2lkdGgsXCJpbnZhbGlkIHdpZHRoIGZvciByZWFkIHBpeGVsc1wiKSxTKGQ+MCYmZCtsPD1pLmZyYW1lYnVmZmVySGVpZ2h0LFwiaW52YWxpZCBoZWlnaHQgZm9yIHJlYWQgcGl4ZWxzXCIpLHIoKTt2YXIgZz1oKmQqNDtyZXR1cm4gcHx8KDUxMjE9PT1jP3A9bmV3IFVpbnQ4QXJyYXkoZyk6NTEyNj09PWMmJihwPXB8fG5ldyBGbG9hdDMyQXJyYXkoZykpKSxTLmlzVHlwZWRBcnJheShwLFwiZGF0YSBidWZmZXIgZm9yIHJlZ2wucmVhZCgpIG11c3QgYmUgYSB0eXBlZGFycmF5XCIpLFMocC5ieXRlTGVuZ3RoPj1nLFwiZGF0YSBidWZmZXIgZm9yIHJlZ2wucmVhZCgpIHRvbyBzbWFsbFwiKSxlLnBpeGVsU3RvcmVpKDMzMzMsNCksZS5yZWFkUGl4ZWxzKGYsbCxoLGQsNjQwOCxjLHApLHB9cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZyYW1lYnVmZmVyXCJpbiB0P2Z1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBuLnNldEZCTyh7ZnJhbWVidWZmZXI6dC5mcmFtZWJ1ZmZlcn0sKGZ1bmN0aW9uKCl7ZT11KHQpfSkpLGV9KHQpOnUodCl9fWZ1bmN0aW9uIE50KHQpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KX1mdW5jdGlvbiBSdCh0KXtyZXR1cm4gTnQodCkuam9pbihcIlwiKX1QdFszNjA1M109XCJjb21wbGV0ZVwiLFB0WzM2MDU0XT1cImluY29tcGxldGUgYXR0YWNobWVudFwiLFB0WzM2MDU3XT1cImluY29tcGxldGUgZGltZW5zaW9uc1wiLFB0WzM2MDU1XT1cImluY29tcGxldGUsIG1pc3NpbmcgYXR0YWNobWVudFwiLFB0WzM2MDYxXT1cInVuc3VwcG9ydGVkXCI7dmFyIEx0PVwieHl6d1wiLnNwbGl0KFwiXCIpLEJ0PVwicHJvZmlsZVwiLEd0PVwiZnJhbWVidWZmZXJcIixGdD1cInZlcnRcIixVdD1cImZyYWdcIix6dD1cImVsZW1lbnRzXCIsVnQ9XCJwcmltaXRpdmVcIixXdD1cImNvdW50XCIsWHQ9XCJvZmZzZXRcIixZdD1cImluc3RhbmNlc1wiLEh0PVwidmFvXCIscXQ9R3QrXCJXaWR0aFwiLEt0PUd0K1wiSGVpZ2h0XCIsWnQ9W1wiYmxlbmQuZnVuY1wiLFwiYmxlbmQuZXF1YXRpb25cIixcInN0ZW5jaWwuZnVuY1wiLFwic3RlbmNpbC5vcEZyb250XCIsXCJzdGVuY2lsLm9wQmFja1wiLFwic2FtcGxlLmNvdmVyYWdlXCIsXCJ2aWV3cG9ydFwiLFwic2Npc3Nvci5ib3hcIixcInBvbHlnb25PZmZzZXQub2Zmc2V0XCJdLFF0PXswOjAsMToxLHplcm86MCxvbmU6MSxcInNyYyBjb2xvclwiOjc2OCxcIm9uZSBtaW51cyBzcmMgY29sb3JcIjo3NjksXCJzcmMgYWxwaGFcIjo3NzAsXCJvbmUgbWludXMgc3JjIGFscGhhXCI6NzcxLFwiZHN0IGNvbG9yXCI6Nzc0LFwib25lIG1pbnVzIGRzdCBjb2xvclwiOjc3NSxcImRzdCBhbHBoYVwiOjc3MixcIm9uZSBtaW51cyBkc3QgYWxwaGFcIjo3NzMsXCJjb25zdGFudCBjb2xvclwiOjMyNzY5LFwib25lIG1pbnVzIGNvbnN0YW50IGNvbG9yXCI6MzI3NzAsXCJjb25zdGFudCBhbHBoYVwiOjMyNzcxLFwib25lIG1pbnVzIGNvbnN0YW50IGFscGhhXCI6MzI3NzIsXCJzcmMgYWxwaGEgc2F0dXJhdGVcIjo3NzZ9LEp0PVtcImNvbnN0YW50IGNvbG9yLCBjb25zdGFudCBhbHBoYVwiLFwib25lIG1pbnVzIGNvbnN0YW50IGNvbG9yLCBjb25zdGFudCBhbHBoYVwiLFwiY29uc3RhbnQgY29sb3IsIG9uZSBtaW51cyBjb25zdGFudCBhbHBoYVwiLFwib25lIG1pbnVzIGNvbnN0YW50IGNvbG9yLCBvbmUgbWludXMgY29uc3RhbnQgYWxwaGFcIixcImNvbnN0YW50IGFscGhhLCBjb25zdGFudCBjb2xvclwiLFwiY29uc3RhbnQgYWxwaGEsIG9uZSBtaW51cyBjb25zdGFudCBjb2xvclwiLFwib25lIG1pbnVzIGNvbnN0YW50IGFscGhhLCBjb25zdGFudCBjb2xvclwiLFwib25lIG1pbnVzIGNvbnN0YW50IGFscGhhLCBvbmUgbWludXMgY29uc3RhbnQgY29sb3JcIl0sJHQ9e25ldmVyOjUxMixsZXNzOjUxMyxcIjxcIjo1MTMsZXF1YWw6NTE0LFwiPVwiOjUxNCxcIj09XCI6NTE0LFwiPT09XCI6NTE0LGxlcXVhbDo1MTUsXCI8PVwiOjUxNSxncmVhdGVyOjUxNixcIj5cIjo1MTYsbm90ZXF1YWw6NTE3LFwiIT1cIjo1MTcsXCIhPT1cIjo1MTcsZ2VxdWFsOjUxOCxcIj49XCI6NTE4LGFsd2F5czo1MTl9LHRlPXswOjAsemVybzowLGtlZXA6NzY4MCxyZXBsYWNlOjc2ODEsaW5jcmVtZW50Ojc2ODIsZGVjcmVtZW50Ojc2ODMsXCJpbmNyZW1lbnQgd3JhcFwiOjM0MDU1LFwiZGVjcmVtZW50IHdyYXBcIjozNDA1NixpbnZlcnQ6NTM4Nn0sZWU9e2ZyYWc6MzU2MzIsdmVydDozNTYzM30sbmU9e2N3OjIzMDQsY2N3OjIzMDV9O2Z1bmN0aW9uIHJlKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpfHx0KGUpfHxMKGUpfWZ1bmN0aW9uIGllKHQpe3JldHVybiB0LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuXCJ2aWV3cG9ydFwiPT09dD8tMTpcInZpZXdwb3J0XCI9PT1lPzE6dDxlPy0xOjF9KSl9ZnVuY3Rpb24gb2UodCxlLG4scil7dGhpcy50aGlzRGVwPXQsdGhpcy5jb250ZXh0RGVwPWUsdGhpcy5wcm9wRGVwPW4sdGhpcy5hcHBlbmQ9cn1mdW5jdGlvbiBhZSh0KXtyZXR1cm4gdCYmISh0LnRoaXNEZXB8fHQuY29udGV4dERlcHx8dC5wcm9wRGVwKX1mdW5jdGlvbiBzZSh0KXtyZXR1cm4gbmV3IG9lKCExLCExLCExLHQpfWZ1bmN0aW9uIHVlKHQsZSl7dmFyIG49dC50eXBlO2lmKDA9PT1uKXt2YXIgcj10LmRhdGEubGVuZ3RoO3JldHVybiBuZXcgb2UoITAscj49MSxyPj0yLGUpfWlmKDQ9PT1uKXt2YXIgaT10LmRhdGE7cmV0dXJuIG5ldyBvZShpLnRoaXNEZXAsaS5jb250ZXh0RGVwLGkucHJvcERlcCxlKX1pZig1PT09bilyZXR1cm4gbmV3IG9lKCExLCExLCExLGUpO2lmKDY9PT1uKXtmb3IodmFyIG89ITEsYT0hMSxzPSExLHU9MDt1PHQuZGF0YS5sZW5ndGg7Kyt1KXt2YXIgYz10LmRhdGFbdV07aWYoMT09PWMudHlwZSlzPSEwO2Vsc2UgaWYoMj09PWMudHlwZSlhPSEwO2Vsc2UgaWYoMz09PWMudHlwZSlvPSEwO2Vsc2UgaWYoMD09PWMudHlwZSl7bz0hMDt2YXIgZj1jLmRhdGE7Zj49MSYmKGE9ITApLGY+PTImJihzPSEwKX1lbHNlIDQ9PT1jLnR5cGUmJihvPW98fGMuZGF0YS50aGlzRGVwLGE9YXx8Yy5kYXRhLmNvbnRleHREZXAscz1zfHxjLmRhdGEucHJvcERlcCl9cmV0dXJuIG5ldyBvZShvLGEscyxlKX1yZXR1cm4gbmV3IG9lKDM9PT1uLDI9PT1uLDE9PT1uLGUpfXZhciBjZT1uZXcgb2UoITEsITEsITEsKGZ1bmN0aW9uKCl7fSkpO2Z1bmN0aW9uIGZlKHQsbixyLGksbyxzLHUsYyxmLGwsaCxkLHAsZyx2KXt2YXIgeT1sLlJlY29yZCxtPXthZGQ6MzI3NzQsc3VidHJhY3Q6MzI3NzgsXCJyZXZlcnNlIHN1YnRyYWN0XCI6MzI3Nzl9O3IuZXh0X2JsZW5kX21pbm1heCYmKG0ubWluPTMyNzc1LG0ubWF4PTMyNzc2KTt2YXIgYj1yLmFuZ2xlX2luc3RhbmNlZF9hcnJheXMseD1yLndlYmdsX2RyYXdfYnVmZmVycyx3PXtkaXJ0eTohMCxwcm9maWxlOnYucHJvZmlsZX0sRT17fSxfPVtdLE89e30saz17fTtmdW5jdGlvbiBBKHQpe3JldHVybiB0LnJlcGxhY2UoXCIuXCIsXCJfXCIpfWZ1bmN0aW9uIFQodCxlLG4pe3ZhciByPUEodCk7Xy5wdXNoKHQpLEVbcl09d1tyXT0hIW4sT1tyXT1lfWZ1bmN0aW9uIEModCxlLG4pe3ZhciByPUEodCk7Xy5wdXNoKHQpLEFycmF5LmlzQXJyYXkobik/KHdbcl09bi5zbGljZSgpLEVbcl09bi5zbGljZSgpKTp3W3JdPUVbcl09bixrW3JdPWV9VChcImRpdGhlclwiLDMwMjQpLFQoXCJibGVuZC5lbmFibGVcIiwzMDQyKSxDKFwiYmxlbmQuY29sb3JcIixcImJsZW5kQ29sb3JcIixbMCwwLDAsMF0pLEMoXCJibGVuZC5lcXVhdGlvblwiLFwiYmxlbmRFcXVhdGlvblNlcGFyYXRlXCIsWzMyNzc0LDMyNzc0XSksQyhcImJsZW5kLmZ1bmNcIixcImJsZW5kRnVuY1NlcGFyYXRlXCIsWzEsMCwxLDBdKSxUKFwiZGVwdGguZW5hYmxlXCIsMjkyOSwhMCksQyhcImRlcHRoLmZ1bmNcIixcImRlcHRoRnVuY1wiLDUxMyksQyhcImRlcHRoLnJhbmdlXCIsXCJkZXB0aFJhbmdlXCIsWzAsMV0pLEMoXCJkZXB0aC5tYXNrXCIsXCJkZXB0aE1hc2tcIiwhMCksQyhcImNvbG9yTWFza1wiLFwiY29sb3JNYXNrXCIsWyEwLCEwLCEwLCEwXSksVChcImN1bGwuZW5hYmxlXCIsMjg4NCksQyhcImN1bGwuZmFjZVwiLFwiY3VsbEZhY2VcIiwxMDI5KSxDKFwiZnJvbnRGYWNlXCIsXCJmcm9udEZhY2VcIiwyMzA1KSxDKFwibGluZVdpZHRoXCIsXCJsaW5lV2lkdGhcIiwxKSxUKFwicG9seWdvbk9mZnNldC5lbmFibGVcIiwzMjgyMyksQyhcInBvbHlnb25PZmZzZXQub2Zmc2V0XCIsXCJwb2x5Z29uT2Zmc2V0XCIsWzAsMF0pLFQoXCJzYW1wbGUuYWxwaGFcIiwzMjkyNiksVChcInNhbXBsZS5lbmFibGVcIiwzMjkyOCksQyhcInNhbXBsZS5jb3ZlcmFnZVwiLFwic2FtcGxlQ292ZXJhZ2VcIixbMSwhMV0pLFQoXCJzdGVuY2lsLmVuYWJsZVwiLDI5NjApLEMoXCJzdGVuY2lsLm1hc2tcIixcInN0ZW5jaWxNYXNrXCIsLTEpLEMoXCJzdGVuY2lsLmZ1bmNcIixcInN0ZW5jaWxGdW5jXCIsWzUxOSwwLC0xXSksQyhcInN0ZW5jaWwub3BGcm9udFwiLFwic3RlbmNpbE9wU2VwYXJhdGVcIixbMTAyOCw3NjgwLDc2ODAsNzY4MF0pLEMoXCJzdGVuY2lsLm9wQmFja1wiLFwic3RlbmNpbE9wU2VwYXJhdGVcIixbMTAyOSw3NjgwLDc2ODAsNzY4MF0pLFQoXCJzY2lzc29yLmVuYWJsZVwiLDMwODkpLEMoXCJzY2lzc29yLmJveFwiLFwic2Npc3NvclwiLFswLDAsdC5kcmF3aW5nQnVmZmVyV2lkdGgsdC5kcmF3aW5nQnVmZmVySGVpZ2h0XSksQyhcInZpZXdwb3J0XCIsXCJ2aWV3cG9ydFwiLFswLDAsdC5kcmF3aW5nQnVmZmVyV2lkdGgsdC5kcmF3aW5nQnVmZmVySGVpZ2h0XSk7dmFyIEk9e2dsOnQsY29udGV4dDpwLHN0cmluZ3M6bixuZXh0OkUsY3VycmVudDp3LGRyYXc6ZCxlbGVtZW50czpzLGJ1ZmZlcjpvLHNoYWRlcjpoLGF0dHJpYnV0ZXM6bC5zdGF0ZSx2YW86bCx1bmlmb3JtczpmLGZyYW1lYnVmZmVyOmMsZXh0ZW5zaW9uczpyLHRpbWVyOmcsaXNCdWZmZXJBcmdzOnJlfSxQPXtwcmltVHlwZXM6Wixjb21wYXJlRnVuY3M6JHQsYmxlbmRGdW5jczpRdCxibGVuZEVxdWF0aW9uczptLHN0ZW5jaWxPcHM6dGUsZ2xUeXBlczp6LG9yaWVudGF0aW9uVHlwZTpuZX07Uy5vcHRpb25hbCgoZnVuY3Rpb24oKXtJLmlzQXJyYXlMaWtlPXR0fSkpLHgmJihQLmJhY2tCdWZmZXI9WzEwMjldLFAuZHJhd0J1ZmZlcj1qKGkubWF4RHJhd2J1ZmZlcnMsKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dD9bMF06aih0LChmdW5jdGlvbih0KXtyZXR1cm4gMzYwNjQrdH0pKX0pKSk7dmFyIEQ9MDtmdW5jdGlvbiBOKCl7dmFyIHQ9ZnVuY3Rpb24oKXt2YXIgdD0wLG49W10scj1bXTtmdW5jdGlvbiBpKCl7dmFyIG49W10scj1bXTtyZXR1cm4gZSgoZnVuY3Rpb24oKXtuLnB1c2guYXBwbHkobixOdChhcmd1bWVudHMpKX0pLHtkZWY6ZnVuY3Rpb24oKXt2YXIgZT1cInZcIit0Kys7cmV0dXJuIHIucHVzaChlKSxhcmd1bWVudHMubGVuZ3RoPjAmJihuLnB1c2goZSxcIj1cIiksbi5wdXNoLmFwcGx5KG4sTnQoYXJndW1lbnRzKSksbi5wdXNoKFwiO1wiKSksZX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gUnQoW3IubGVuZ3RoPjA/XCJ2YXIgXCIrci5qb2luKFwiLFwiKStcIjtcIjpcIlwiLFJ0KG4pXSl9fSl9ZnVuY3Rpb24gbygpe3ZhciB0PWkoKSxuPWkoKSxyPXQudG9TdHJpbmcsbz1uLnRvU3RyaW5nO2Z1bmN0aW9uIGEoZSxyKXtuKGUscixcIj1cIix0LmRlZihlLHIpLFwiO1wiKX1yZXR1cm4gZSgoZnVuY3Rpb24oKXt0LmFwcGx5KHQsTnQoYXJndW1lbnRzKSl9KSx7ZGVmOnQuZGVmLGVudHJ5OnQsZXhpdDpuLHNhdmU6YSxzZXQ6ZnVuY3Rpb24oZSxuLHIpe2EoZSxuKSx0KGUsbixcIj1cIixyLFwiO1wiKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gcigpK28oKX19KX12YXIgYT1pKCkscz17fTtyZXR1cm57Z2xvYmFsOmEsbGluazpmdW5jdGlvbihlKXtmb3IodmFyIGk9MDtpPHIubGVuZ3RoOysraSlpZihyW2ldPT09ZSlyZXR1cm4gbltpXTt2YXIgbz1cImdcIit0Kys7cmV0dXJuIG4ucHVzaChvKSxyLnB1c2goZSksb30sYmxvY2s6aSxwcm9jOmZ1bmN0aW9uKHQsbil7dmFyIHI9W107ZnVuY3Rpb24gaSgpe3ZhciB0PVwiYVwiK3IubGVuZ3RoO3JldHVybiByLnB1c2godCksdH1uPW58fDA7Zm9yKHZhciBhPTA7YTxuOysrYSlpKCk7dmFyIHU9bygpLGM9dS50b1N0cmluZztyZXR1cm4gc1t0XT1lKHUse2FyZzppLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIFJ0KFtcImZ1bmN0aW9uKFwiLHIuam9pbigpLFwiKXtcIixjKCksXCJ9XCJdKX19KX0sc2NvcGU6byxjb25kOmZ1bmN0aW9uKCl7dmFyIHQ9UnQoYXJndW1lbnRzKSxuPW8oKSxyPW8oKSxpPW4udG9TdHJpbmcsYT1yLnRvU3RyaW5nO3JldHVybiBlKG4se3RoZW46ZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseShuLE50KGFyZ3VtZW50cykpLHRoaXN9LGVsc2U6ZnVuY3Rpb24oKXtyZXR1cm4gci5hcHBseShyLE50KGFyZ3VtZW50cykpLHRoaXN9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGU9YSgpO3JldHVybiBlJiYoZT1cImVsc2V7XCIrZStcIn1cIiksUnQoW1wiaWYoXCIsdCxcIil7XCIsaSgpLFwifVwiLGVdKX19KX0sY29tcGlsZTpmdW5jdGlvbigpe3ZhciB0PVsnXCJ1c2Ugc3RyaWN0XCI7JyxhLFwicmV0dXJuIHtcIl07T2JqZWN0LmtleXMocykuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5wdXNoKCdcIicsZSwnXCI6JyxzW2VdLnRvU3RyaW5nKCksXCIsXCIpfSkpLHQucHVzaChcIn1cIik7dmFyIGU9UnQodCkucmVwbGFjZSgvOy9nLFwiO1xcblwiKS5yZXBsYWNlKC99L2csXCJ9XFxuXCIpLnJlcGxhY2UoL3svZyxcIntcXG5cIik7cmV0dXJuIEZ1bmN0aW9uLmFwcGx5KG51bGwsbi5jb25jYXQoZSkpLmFwcGx5KG51bGwscil9fX0oKSxyPXQubGluayxpPXQuZ2xvYmFsO3QuaWQ9RCsrLHQuYmF0Y2hJZD1cIjBcIjt2YXIgbz1yKEkpLGE9dC5zaGFyZWQ9e3Byb3BzOlwiYTBcIn07T2JqZWN0LmtleXMoSSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7YVt0XT1pLmRlZihvLFwiLlwiLHQpfSkpLFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7dC5DSEVDSz1yKFMpLHQuY29tbWFuZFN0cj1TLmd1ZXNzQ29tbWFuZCgpLHQuY29tbWFuZD1yKHQuY29tbWFuZFN0ciksdC5hc3NlcnQ9ZnVuY3Rpb24odCxlLG4pe3QoXCJpZighKFwiLGUsXCIpKVwiLHRoaXMuQ0hFQ0ssXCIuY29tbWFuZFJhaXNlKFwiLHIobiksXCIsXCIsdGhpcy5jb21tYW5kLFwiKTtcIil9LFAuaW52YWxpZEJsZW5kQ29tYmluYXRpb25zPUp0fSkpO3ZhciBzPXQubmV4dD17fSx1PXQuY3VycmVudD17fTtPYmplY3Qua2V5cyhrKS5mb3JFYWNoKChmdW5jdGlvbih0KXtBcnJheS5pc0FycmF5KHdbdF0pJiYoc1t0XT1pLmRlZihhLm5leHQsXCIuXCIsdCksdVt0XT1pLmRlZihhLmN1cnJlbnQsXCIuXCIsdCkpfSkpO3ZhciBjPXQuY29uc3RhbnRzPXt9O09iamVjdC5rZXlzKFApLmZvckVhY2goKGZ1bmN0aW9uKHQpe2NbdF09aS5kZWYoSlNPTi5zdHJpbmdpZnkoUFt0XSkpfSkpLHQuaW52b2tlPWZ1bmN0aW9uKGUsbil7c3dpdGNoKG4udHlwZSl7Y2FzZSAwOnZhciBpPVtcInRoaXNcIixhLmNvbnRleHQsYS5wcm9wcyx0LmJhdGNoSWRdO3JldHVybiBlLmRlZihyKG4uZGF0YSksXCIuY2FsbChcIixpLnNsaWNlKDAsTWF0aC5tYXgobi5kYXRhLmxlbmd0aCsxLDQpKSxcIilcIik7Y2FzZSAxOnJldHVybiBlLmRlZihhLnByb3BzLG4uZGF0YSk7Y2FzZSAyOnJldHVybiBlLmRlZihhLmNvbnRleHQsbi5kYXRhKTtjYXNlIDM6cmV0dXJuIGUuZGVmKFwidGhpc1wiLG4uZGF0YSk7Y2FzZSA0OnJldHVybiBuLmRhdGEuYXBwZW5kKHQsZSksbi5kYXRhLnJlZjtjYXNlIDU6cmV0dXJuIG4uZGF0YS50b1N0cmluZygpO2Nhc2UgNjpyZXR1cm4gbi5kYXRhLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIHQuaW52b2tlKGUsbil9KSl9fSx0LmF0dHJpYkNhY2hlPXt9O3ZhciBmPXt9O3JldHVybiB0LnNjb3BlQXR0cmliPWZ1bmN0aW9uKHQpe3ZhciBlPW4uaWQodCk7aWYoZSBpbiBmKXJldHVybiBmW2VdO3ZhciBpPWwuc2NvcGVbZV07cmV0dXJuIGl8fChpPWwuc2NvcGVbZV09bmV3IHkpLGZbZV09cihpKX0sdH1mdW5jdGlvbiBSKHQsZSx1LGYsZCl7dmFyIHA9dC5zdGF0aWMsZz10LmR5bmFtaWM7Uy5vcHRpb25hbCgoZnVuY3Rpb24oKXt2YXIgdD1bR3QsRnQsVXQsenQsVnQsWHQsV3QsWXQsQnQsSHRdLmNvbmNhdChfKTtmdW5jdGlvbiBlKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKGUpe1MuY29tbWFuZCh0LmluZGV4T2YoZSk+PTAsJ3Vua25vd24gcGFyYW1ldGVyIFwiJytlKydcIicsZC5jb21tYW5kU3RyKX0pKX1lKHApLGUoZyl9KSk7dmFyIHY9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnN0YXRpYztpZihcInN0cmluZ1wiPT10eXBlb2YgbltVdF0mJlwic3RyaW5nXCI9PXR5cGVvZiBuW0Z0XSl7aWYoT2JqZWN0LmtleXMoZS5keW5hbWljKS5sZW5ndGg+MClyZXR1cm4gbnVsbDt2YXIgcj1lLnN0YXRpYyxpPU9iamVjdC5rZXlzKHIpO2lmKGkubGVuZ3RoPjAmJlwibnVtYmVyXCI9PXR5cGVvZiByW2lbMF1dKXtmb3IodmFyIG89W10sYT0wO2E8aS5sZW5ndGg7KythKVMoXCJudW1iZXJcIj09dHlwZW9mIHJbaVthXV0sXCJtdXN0IHNwZWNpZnkgYWxsIHZlcnRleCBhdHRyaWJ1dGUgbG9jYXRpb25zIHdoZW4gdXNpbmcgdmFvc1wiKSxvLnB1c2goWzB8cltpW2FdXSxpW2FdXSk7cmV0dXJuIG99fXJldHVybiBudWxsfSh0LGUpLHg9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnN0YXRpYyxyPXQuZHluYW1pYztpZihHdCBpbiBuKXt2YXIgaT1uW0d0XTtyZXR1cm4gaT8oaT1jLmdldEZyYW1lYnVmZmVyKGkpLFMuY29tbWFuZChpLFwiaW52YWxpZCBmcmFtZWJ1ZmZlciBvYmplY3RcIiksc2UoKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5saW5rKGkpLHI9dC5zaGFyZWQ7ZS5zZXQoci5mcmFtZWJ1ZmZlcixcIi5uZXh0XCIsbik7dmFyIG89ci5jb250ZXh0O3JldHVybiBlLnNldChvLFwiLlwiK3F0LG4rXCIud2lkdGhcIiksZS5zZXQobyxcIi5cIitLdCxuK1wiLmhlaWdodFwiKSxufSkpKTpzZSgoZnVuY3Rpb24odCxlKXt2YXIgbj10LnNoYXJlZDtlLnNldChuLmZyYW1lYnVmZmVyLFwiLm5leHRcIixcIm51bGxcIik7dmFyIHI9bi5jb250ZXh0O3JldHVybiBlLnNldChyLFwiLlwiK3F0LHIrXCIuZHJhd2luZ0J1ZmZlcldpZHRoXCIpLGUuc2V0KHIsXCIuXCIrS3QscitcIi5kcmF3aW5nQnVmZmVySGVpZ2h0XCIpLFwibnVsbFwifSkpfWlmKEd0IGluIHIpe3ZhciBvPXJbR3RdO3JldHVybiB1ZShvLChmdW5jdGlvbih0LGUpe3ZhciBuPXQuaW52b2tlKGUsbykscj10LnNoYXJlZCxpPXIuZnJhbWVidWZmZXIsYT1lLmRlZihpLFwiLmdldEZyYW1lYnVmZmVyKFwiLG4sXCIpXCIpO1Mub3B0aW9uYWwoKGZ1bmN0aW9uKCl7dC5hc3NlcnQoZSxcIiFcIituK1wifHxcIithLFwiaW52YWxpZCBmcmFtZWJ1ZmZlciBvYmplY3RcIil9KSksZS5zZXQoaSxcIi5uZXh0XCIsYSk7dmFyIHM9ci5jb250ZXh0O3JldHVybiBlLnNldChzLFwiLlwiK3F0LGErXCI/XCIrYStcIi53aWR0aDpcIitzK1wiLmRyYXdpbmdCdWZmZXJXaWR0aFwiKSxlLnNldChzLFwiLlwiK0t0LGErXCI/XCIrYStcIi5oZWlnaHQ6XCIrcytcIi5kcmF3aW5nQnVmZmVySGVpZ2h0XCIpLGF9KSl9cmV0dXJuIG51bGx9KHQpLHc9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuc3RhdGljLGk9dC5keW5hbWljO2Z1bmN0aW9uIG8odCl7aWYodCBpbiByKXt2YXIgbz1yW3RdO1MuY29tbWFuZFR5cGUobyxcIm9iamVjdFwiLFwiaW52YWxpZCBcIit0LG4uY29tbWFuZFN0cik7dmFyIGEscyx1PSEwLGM9MHxvLngsZj0wfG8ueTtyZXR1cm5cIndpZHRoXCJpbiBvPyhhPTB8by53aWR0aCxTLmNvbW1hbmQoYT49MCxcImludmFsaWQgXCIrdCxuLmNvbW1hbmRTdHIpKTp1PSExLFwiaGVpZ2h0XCJpbiBvPyhzPTB8by5oZWlnaHQsUy5jb21tYW5kKHM+PTAsXCJpbnZhbGlkIFwiK3Qsbi5jb21tYW5kU3RyKSk6dT0hMSxuZXcgb2UoIXUmJmUmJmUudGhpc0RlcCwhdSYmZSYmZS5jb250ZXh0RGVwLCF1JiZlJiZlLnByb3BEZXAsKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5zaGFyZWQuY29udGV4dCxyPWE7XCJ3aWR0aFwiaW4gb3x8KHI9ZS5kZWYobixcIi5cIixxdCxcIi1cIixjKSk7dmFyIGk9cztyZXR1cm5cImhlaWdodFwiaW4gb3x8KGk9ZS5kZWYobixcIi5cIixLdCxcIi1cIixmKSksW2MsZixyLGldfSkpfWlmKHQgaW4gaSl7dmFyIGw9aVt0XSxoPXVlKGwsKGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5pbnZva2UobixsKTtTLm9wdGlvbmFsKChmdW5jdGlvbigpe2UuYXNzZXJ0KG4scitcIiYmdHlwZW9mIFwiK3IrJz09PVwib2JqZWN0XCInLFwiaW52YWxpZCBcIit0KX0pKTt2YXIgaT1lLnNoYXJlZC5jb250ZXh0LG89bi5kZWYocixcIi54fDBcIiksYT1uLmRlZihyLFwiLnl8MFwiKSxzPW4uZGVmKCdcIndpZHRoXCIgaW4gJyxyLFwiP1wiLHIsXCIud2lkdGh8MDpcIixcIihcIixpLFwiLlwiLHF0LFwiLVwiLG8sXCIpXCIpLHU9bi5kZWYoJ1wiaGVpZ2h0XCIgaW4gJyxyLFwiP1wiLHIsXCIuaGVpZ2h0fDA6XCIsXCIoXCIsaSxcIi5cIixLdCxcIi1cIixhLFwiKVwiKTtyZXR1cm4gUy5vcHRpb25hbCgoZnVuY3Rpb24oKXtlLmFzc2VydChuLHMrXCI+PTAmJlwiK3UrXCI+PTBcIixcImludmFsaWQgXCIrdCl9KSksW28sYSxzLHVdfSkpO3JldHVybiBlJiYoaC50aGlzRGVwPWgudGhpc0RlcHx8ZS50aGlzRGVwLGguY29udGV4dERlcD1oLmNvbnRleHREZXB8fGUuY29udGV4dERlcCxoLnByb3BEZXA9aC5wcm9wRGVwfHxlLnByb3BEZXApLGh9cmV0dXJuIGU/bmV3IG9lKGUudGhpc0RlcCxlLmNvbnRleHREZXAsZS5wcm9wRGVwLChmdW5jdGlvbih0LGUpe3ZhciBuPXQuc2hhcmVkLmNvbnRleHQ7cmV0dXJuWzAsMCxlLmRlZihuLFwiLlwiLHF0KSxlLmRlZihuLFwiLlwiLEt0KV19KSk6bnVsbH12YXIgYT1vKFwidmlld3BvcnRcIik7aWYoYSl7dmFyIHM9YTthPW5ldyBvZShhLnRoaXNEZXAsYS5jb250ZXh0RGVwLGEucHJvcERlcCwoZnVuY3Rpb24odCxlKXt2YXIgbj1zLmFwcGVuZCh0LGUpLHI9dC5zaGFyZWQuY29udGV4dDtyZXR1cm4gZS5zZXQocixcIi52aWV3cG9ydFdpZHRoXCIsblsyXSksZS5zZXQocixcIi52aWV3cG9ydEhlaWdodFwiLG5bM10pLG59KSl9cmV0dXJue3ZpZXdwb3J0OmEsc2Npc3Nvcl9ib3g6byhcInNjaXNzb3IuYm94XCIpfX0odCx4LGQpLEU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnN0YXRpYyxyPXQuZHluYW1pYyxpPWZ1bmN0aW9uKCl7aWYoenQgaW4gbil7dmFyIHQ9blt6dF07cmUodCk/dD1zLmdldEVsZW1lbnRzKHMuY3JlYXRlKHQsITApKTp0JiYodD1zLmdldEVsZW1lbnRzKHQpLFMuY29tbWFuZCh0LFwiaW52YWxpZCBlbGVtZW50c1wiLGUuY29tbWFuZFN0cikpO3ZhciBpPXNlKChmdW5jdGlvbihlLG4pe2lmKHQpe3ZhciByPWUubGluayh0KTtyZXR1cm4gZS5FTEVNRU5UUz1yLHJ9cmV0dXJuIGUuRUxFTUVOVFM9bnVsbCxudWxsfSkpO3JldHVybiBpLnZhbHVlPXQsaX1pZih6dCBpbiByKXt2YXIgbz1yW3p0XTtyZXR1cm4gdWUobywoZnVuY3Rpb24odCxlKXt2YXIgbj10LnNoYXJlZCxyPW4uaXNCdWZmZXJBcmdzLGk9bi5lbGVtZW50cyxhPXQuaW52b2tlKGUsbykscz1lLmRlZihcIm51bGxcIiksdT1lLmRlZihyLFwiKFwiLGEsXCIpXCIpLGM9dC5jb25kKHUpLnRoZW4ocyxcIj1cIixpLFwiLmNyZWF0ZVN0cmVhbShcIixhLFwiKTtcIikuZWxzZShzLFwiPVwiLGksXCIuZ2V0RWxlbWVudHMoXCIsYSxcIik7XCIpO3JldHVybiBTLm9wdGlvbmFsKChmdW5jdGlvbigpe3QuYXNzZXJ0KGMuZWxzZSxcIiFcIithK1wifHxcIitzLFwiaW52YWxpZCBlbGVtZW50c1wiKX0pKSxlLmVudHJ5KGMpLGUuZXhpdCh0LmNvbmQodSkudGhlbihpLFwiLmRlc3Ryb3lTdHJlYW0oXCIscyxcIik7XCIpKSx0LkVMRU1FTlRTPXMsc30pKX1yZXR1cm4gbnVsbH0oKTtmdW5jdGlvbiBvKHQsbyl7aWYodCBpbiBuKXt2YXIgYT0wfG5bdF07cmV0dXJuIFMuY29tbWFuZCghb3x8YT49MCxcImludmFsaWQgXCIrdCxlLmNvbW1hbmRTdHIpLHNlKChmdW5jdGlvbih0LGUpe3JldHVybiBvJiYodC5PRkZTRVQ9YSksYX0pKX1pZih0IGluIHIpe3ZhciBzPXJbdF07cmV0dXJuIHVlKHMsKGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5pbnZva2UobixzKTtyZXR1cm4gbyYmKGUuT0ZGU0VUPXIsUy5vcHRpb25hbCgoZnVuY3Rpb24oKXtlLmFzc2VydChuLHIrXCI+PTBcIixcImludmFsaWQgXCIrdCl9KSkpLHJ9KSl9cmV0dXJuIG8mJmk/c2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuT0ZGU0VUPVwiMFwiLDB9KSk6bnVsbH12YXIgYT1vKFh0LCEwKTtyZXR1cm57ZWxlbWVudHM6aSxwcmltaXRpdmU6ZnVuY3Rpb24oKXtpZihWdCBpbiBuKXt2YXIgdD1uW1Z0XTtyZXR1cm4gUy5jb21tYW5kUGFyYW1ldGVyKHQsWixcImludmFsaWQgcHJpbWl0dmVcIixlLmNvbW1hbmRTdHIpLHNlKChmdW5jdGlvbihlLG4pe3JldHVybiBaW3RdfSkpfWlmKFZ0IGluIHIpe3ZhciBvPXJbVnRdO3JldHVybiB1ZShvLChmdW5jdGlvbih0LGUpe3ZhciBuPXQuY29uc3RhbnRzLnByaW1UeXBlcyxyPXQuaW52b2tlKGUsbyk7cmV0dXJuIFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7dC5hc3NlcnQoZSxyK1wiIGluIFwiK24sXCJpbnZhbGlkIHByaW1pdGl2ZSwgbXVzdCBiZSBvbmUgb2YgXCIrT2JqZWN0LmtleXMoWikpfSkpLGUuZGVmKG4sXCJbXCIscixcIl1cIil9KSl9cmV0dXJuIGk/YWUoaSk/aS52YWx1ZT9zZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5kZWYodC5FTEVNRU5UUyxcIi5wcmltVHlwZVwiKX0pKTpzZSgoZnVuY3Rpb24oKXtyZXR1cm4gNH0pKTpuZXcgb2UoaS50aGlzRGVwLGkuY29udGV4dERlcCxpLnByb3BEZXAsKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5FTEVNRU5UUztyZXR1cm4gZS5kZWYobixcIj9cIixuLFwiLnByaW1UeXBlOlwiLDQpfSkpOm51bGx9KCksY291bnQ6ZnVuY3Rpb24oKXtpZihXdCBpbiBuKXt2YXIgdD0wfG5bV3RdO3JldHVybiBTLmNvbW1hbmQoXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTAsXCJpbnZhbGlkIHZlcnRleCBjb3VudFwiLGUuY29tbWFuZFN0ciksc2UoKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSl9aWYoV3QgaW4gcil7dmFyIG89cltXdF07cmV0dXJuIHVlKG8sKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5pbnZva2UoZSxvKTtyZXR1cm4gUy5vcHRpb25hbCgoZnVuY3Rpb24oKXt0LmFzc2VydChlLFwidHlwZW9mIFwiK24rJz09PVwibnVtYmVyXCImJicrbitcIj49MCYmXCIrbitcIj09PShcIituK1wifDApXCIsXCJpbnZhbGlkIHZlcnRleCBjb3VudFwiKX0pKSxufSkpfWlmKGkpe2lmKGFlKGkpKXtpZihpKXJldHVybiBhP25ldyBvZShhLnRoaXNEZXAsYS5jb250ZXh0RGVwLGEucHJvcERlcCwoZnVuY3Rpb24odCxlKXt2YXIgbj1lLmRlZih0LkVMRU1FTlRTLFwiLnZlcnRDb3VudC1cIix0Lk9GRlNFVCk7cmV0dXJuIFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7dC5hc3NlcnQoZSxuK1wiPj0wXCIsXCJpbnZhbGlkIHZlcnRleCBvZmZzZXQvZWxlbWVudCBidWZmZXIgdG9vIHNtYWxsXCIpfSkpLG59KSk6c2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZGVmKHQuRUxFTUVOVFMsXCIudmVydENvdW50XCIpfSkpO3ZhciBzPXNlKChmdW5jdGlvbigpe3JldHVybi0xfSkpO3JldHVybiBTLm9wdGlvbmFsKChmdW5jdGlvbigpe3MuTUlTU0lORz0hMH0pKSxzfXZhciB1PW5ldyBvZShpLnRoaXNEZXB8fGEudGhpc0RlcCxpLmNvbnRleHREZXB8fGEuY29udGV4dERlcCxpLnByb3BEZXB8fGEucHJvcERlcCwoZnVuY3Rpb24odCxlKXt2YXIgbj10LkVMRU1FTlRTO3JldHVybiB0Lk9GRlNFVD9lLmRlZihuLFwiP1wiLG4sXCIudmVydENvdW50LVwiLHQuT0ZGU0VULFwiOi0xXCIpOmUuZGVmKG4sXCI/XCIsbixcIi52ZXJ0Q291bnQ6LTFcIil9KSk7cmV0dXJuIFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7dS5EWU5BTUlDPSEwfSkpLHV9cmV0dXJuIG51bGx9KCksaW5zdGFuY2VzOm8oWXQsITEpLG9mZnNldDphfX0odCxkKSxPPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5zdGF0aWMscj10LmR5bmFtaWMsbz17fTtyZXR1cm4gXy5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgcz1BKHQpO2Z1bmN0aW9uIHUoZSxpKXtpZih0IGluIG4pe3ZhciBhPWUoblt0XSk7b1tzXT1zZSgoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKX1lbHNlIGlmKHQgaW4gcil7dmFyIHU9clt0XTtvW3NdPXVlKHUsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodCxlLHQuaW52b2tlKGUsdSkpfSkpfX1zd2l0Y2godCl7Y2FzZVwiY3VsbC5lbmFibGVcIjpjYXNlXCJibGVuZC5lbmFibGVcIjpjYXNlXCJkaXRoZXJcIjpjYXNlXCJzdGVuY2lsLmVuYWJsZVwiOmNhc2VcImRlcHRoLmVuYWJsZVwiOmNhc2VcInNjaXNzb3IuZW5hYmxlXCI6Y2FzZVwicG9seWdvbk9mZnNldC5lbmFibGVcIjpjYXNlXCJzYW1wbGUuYWxwaGFcIjpjYXNlXCJzYW1wbGUuZW5hYmxlXCI6Y2FzZVwiZGVwdGgubWFza1wiOnJldHVybiB1KChmdW5jdGlvbihuKXtyZXR1cm4gUy5jb21tYW5kVHlwZShuLFwiYm9vbGVhblwiLHQsZS5jb21tYW5kU3RyKSxufSksKGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gUy5vcHRpb25hbCgoZnVuY3Rpb24oKXtlLmFzc2VydChuLFwidHlwZW9mIFwiK3IrJz09PVwiYm9vbGVhblwiJyxcImludmFsaWQgZmxhZyBcIit0LGUuY29tbWFuZFN0cil9KSkscn0pKTtjYXNlXCJkZXB0aC5mdW5jXCI6cmV0dXJuIHUoKGZ1bmN0aW9uKG4pe3JldHVybiBTLmNvbW1hbmRQYXJhbWV0ZXIobiwkdCxcImludmFsaWQgXCIrdCxlLmNvbW1hbmRTdHIpLCR0W25dfSksKGZ1bmN0aW9uKGUsbixyKXt2YXIgaT1lLmNvbnN0YW50cy5jb21wYXJlRnVuY3M7cmV0dXJuIFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7ZS5hc3NlcnQobixyK1wiIGluIFwiK2ksXCJpbnZhbGlkIFwiK3QrXCIsIG11c3QgYmUgb25lIG9mIFwiK09iamVjdC5rZXlzKCR0KSl9KSksbi5kZWYoaSxcIltcIixyLFwiXVwiKX0pKTtjYXNlXCJkZXB0aC5yYW5nZVwiOnJldHVybiB1KChmdW5jdGlvbih0KXtyZXR1cm4gUy5jb21tYW5kKHR0KHQpJiYyPT09dC5sZW5ndGgmJlwibnVtYmVyXCI9PXR5cGVvZiB0WzBdJiZcIm51bWJlclwiPT10eXBlb2YgdFsxXSYmdFswXTw9dFsxXSxcImRlcHRoIHJhbmdlIGlzIDJkIGFycmF5XCIsZS5jb21tYW5kU3RyKSx0fSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUy5vcHRpb25hbCgoZnVuY3Rpb24oKXt0LmFzc2VydChlLHQuc2hhcmVkLmlzQXJyYXlMaWtlK1wiKFwiK24rXCIpJiZcIituK1wiLmxlbmd0aD09PTImJnR5cGVvZiBcIituKydbMF09PT1cIm51bWJlclwiJiZ0eXBlb2YgJytuKydbMV09PT1cIm51bWJlclwiJiYnK24rXCJbMF08PVwiK24rXCJbMV1cIixcImRlcHRoIHJhbmdlIG11c3QgYmUgYSAyZCBhcnJheVwiKX0pKSxbZS5kZWYoXCIrXCIsbixcIlswXVwiKSxlLmRlZihcIitcIixuLFwiWzFdXCIpXX0pKTtjYXNlXCJibGVuZC5mdW5jXCI6cmV0dXJuIHUoKGZ1bmN0aW9uKHQpe1MuY29tbWFuZFR5cGUodCxcIm9iamVjdFwiLFwiYmxlbmQuZnVuY1wiLGUuY29tbWFuZFN0cik7dmFyIG49XCJzcmNSR0JcImluIHQ/dC5zcmNSR0I6dC5zcmMscj1cInNyY0FscGhhXCJpbiB0P3Quc3JjQWxwaGE6dC5zcmMsaT1cImRzdFJHQlwiaW4gdD90LmRzdFJHQjp0LmRzdCxvPVwiZHN0QWxwaGFcImluIHQ/dC5kc3RBbHBoYTp0LmRzdDtyZXR1cm4gUy5jb21tYW5kUGFyYW1ldGVyKG4sUXQscytcIi5zcmNSR0JcIixlLmNvbW1hbmRTdHIpLFMuY29tbWFuZFBhcmFtZXRlcihyLFF0LHMrXCIuc3JjQWxwaGFcIixlLmNvbW1hbmRTdHIpLFMuY29tbWFuZFBhcmFtZXRlcihpLFF0LHMrXCIuZHN0UkdCXCIsZS5jb21tYW5kU3RyKSxTLmNvbW1hbmRQYXJhbWV0ZXIobyxRdCxzK1wiLmRzdEFscGhhXCIsZS5jb21tYW5kU3RyKSxTLmNvbW1hbmQoLTE9PT1KdC5pbmRleE9mKG4rXCIsIFwiK2kpLFwidW5hbGxvd2VkIGJsZW5kaW5nIGNvbWJpbmF0aW9uIChzcmNSR0IsIGRzdFJHQikgPSAoXCIrbitcIiwgXCIraStcIilcIixlLmNvbW1hbmRTdHIpLFtRdFtuXSxRdFtpXSxRdFtyXSxRdFtvXV19KSwoZnVuY3Rpb24oZSxuLHIpe3ZhciBpPWUuY29uc3RhbnRzLmJsZW5kRnVuY3M7ZnVuY3Rpb24gbyhvLGEpe3ZhciBzPW4uZGVmKCdcIicsbyxhLCdcIiBpbiAnLHIsXCI/XCIscixcIi5cIixvLGEsXCI6XCIscixcIi5cIixvKTtyZXR1cm4gUy5vcHRpb25hbCgoZnVuY3Rpb24oKXtlLmFzc2VydChuLHMrXCIgaW4gXCIraSxcImludmFsaWQgXCIrdCtcIi5cIitvK2ErXCIsIG11c3QgYmUgb25lIG9mIFwiK09iamVjdC5rZXlzKFF0KSl9KSksc31TLm9wdGlvbmFsKChmdW5jdGlvbigpe2UuYXNzZXJ0KG4scitcIiYmdHlwZW9mIFwiK3IrJz09PVwib2JqZWN0XCInLFwiaW52YWxpZCBibGVuZCBmdW5jLCBtdXN0IGJlIGFuIG9iamVjdFwiKX0pKTt2YXIgYT1vKFwic3JjXCIsXCJSR0JcIikscz1vKFwiZHN0XCIsXCJSR0JcIik7Uy5vcHRpb25hbCgoZnVuY3Rpb24oKXt2YXIgdD1lLmNvbnN0YW50cy5pbnZhbGlkQmxlbmRDb21iaW5hdGlvbnM7ZS5hc3NlcnQobix0K1wiLmluZGV4T2YoXCIrYSsnK1wiLCBcIisnK3MrXCIpID09PSAtMSBcIixcInVuYWxsb3dlZCBibGVuZGluZyBjb21iaW5hdGlvbiBmb3IgKHNyY1JHQiwgZHN0UkdCKVwiKX0pKTt2YXIgdT1uLmRlZihpLFwiW1wiLGEsXCJdXCIpLGM9bi5kZWYoaSxcIltcIixvKFwic3JjXCIsXCJBbHBoYVwiKSxcIl1cIik7cmV0dXJuW3Usbi5kZWYoaSxcIltcIixzLFwiXVwiKSxjLG4uZGVmKGksXCJbXCIsbyhcImRzdFwiLFwiQWxwaGFcIiksXCJdXCIpXX0pKTtjYXNlXCJibGVuZC5lcXVhdGlvblwiOnJldHVybiB1KChmdW5jdGlvbihuKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2Ygbj8oUy5jb21tYW5kUGFyYW1ldGVyKG4sbSxcImludmFsaWQgXCIrdCxlLmNvbW1hbmRTdHIpLFttW25dLG1bbl1dKTpcIm9iamVjdFwiPT09YShuKT8oUy5jb21tYW5kUGFyYW1ldGVyKG4ucmdiLG0sdCtcIi5yZ2JcIixlLmNvbW1hbmRTdHIpLFMuY29tbWFuZFBhcmFtZXRlcihuLmFscGhhLG0sdCtcIi5hbHBoYVwiLGUuY29tbWFuZFN0ciksW21bbi5yZ2JdLG1bbi5hbHBoYV1dKTp2b2lkIFMuY29tbWFuZFJhaXNlKFwiaW52YWxpZCBibGVuZC5lcXVhdGlvblwiLGUuY29tbWFuZFN0cil9KSwoZnVuY3Rpb24oZSxuLHIpe3ZhciBpPWUuY29uc3RhbnRzLmJsZW5kRXF1YXRpb25zLG89bi5kZWYoKSxhPW4uZGVmKCkscz1lLmNvbmQoXCJ0eXBlb2YgXCIsciwnPT09XCJzdHJpbmdcIicpO3JldHVybiBTLm9wdGlvbmFsKChmdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxuLHIpe2UuYXNzZXJ0KHQscitcIiBpbiBcIitpLFwiaW52YWxpZCBcIituK1wiLCBtdXN0IGJlIG9uZSBvZiBcIitPYmplY3Qua2V5cyhtKSl9bihzLnRoZW4sdCxyKSxlLmFzc2VydChzLmVsc2UscitcIiYmdHlwZW9mIFwiK3IrJz09PVwib2JqZWN0XCInLFwiaW52YWxpZCBcIit0KSxuKHMuZWxzZSx0K1wiLnJnYlwiLHIrXCIucmdiXCIpLG4ocy5lbHNlLHQrXCIuYWxwaGFcIixyK1wiLmFscGhhXCIpfSkpLHMudGhlbihvLFwiPVwiLGEsXCI9XCIsaSxcIltcIixyLFwiXTtcIikscy5lbHNlKG8sXCI9XCIsaSxcIltcIixyLFwiLnJnYl07XCIsYSxcIj1cIixpLFwiW1wiLHIsXCIuYWxwaGFdO1wiKSxuKHMpLFtvLGFdfSkpO2Nhc2VcImJsZW5kLmNvbG9yXCI6cmV0dXJuIHUoKGZ1bmN0aW9uKHQpe3JldHVybiBTLmNvbW1hbmQodHQodCkmJjQ9PT10Lmxlbmd0aCxcImJsZW5kLmNvbG9yIG11c3QgYmUgYSA0ZCBhcnJheVwiLGUuY29tbWFuZFN0ciksaig0LChmdW5jdGlvbihlKXtyZXR1cm4rdFtlXX0pKX0pLChmdW5jdGlvbih0LGUsbil7cmV0dXJuIFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7dC5hc3NlcnQoZSx0LnNoYXJlZC5pc0FycmF5TGlrZStcIihcIituK1wiKSYmXCIrbitcIi5sZW5ndGg9PT00XCIsXCJibGVuZC5jb2xvciBtdXN0IGJlIGEgNGQgYXJyYXlcIil9KSksaig0LChmdW5jdGlvbih0KXtyZXR1cm4gZS5kZWYoXCIrXCIsbixcIltcIix0LFwiXVwiKX0pKX0pKTtjYXNlXCJzdGVuY2lsLm1hc2tcIjpyZXR1cm4gdSgoZnVuY3Rpb24odCl7cmV0dXJuIFMuY29tbWFuZFR5cGUodCxcIm51bWJlclwiLHMsZS5jb21tYW5kU3RyKSwwfHR9KSwoZnVuY3Rpb24odCxlLG4pe3JldHVybiBTLm9wdGlvbmFsKChmdW5jdGlvbigpe3QuYXNzZXJ0KGUsXCJ0eXBlb2YgXCIrbisnPT09XCJudW1iZXJcIicsXCJpbnZhbGlkIHN0ZW5jaWwubWFza1wiKX0pKSxlLmRlZihuLFwifDBcIil9KSk7Y2FzZVwic3RlbmNpbC5mdW5jXCI6cmV0dXJuIHUoKGZ1bmN0aW9uKG4pe1MuY29tbWFuZFR5cGUobixcIm9iamVjdFwiLHMsZS5jb21tYW5kU3RyKTt2YXIgcj1uLmNtcHx8XCJrZWVwXCIsaT1uLnJlZnx8MCxvPVwibWFza1wiaW4gbj9uLm1hc2s6LTE7cmV0dXJuIFMuY29tbWFuZFBhcmFtZXRlcihyLCR0LHQrXCIuY21wXCIsZS5jb21tYW5kU3RyKSxTLmNvbW1hbmRUeXBlKGksXCJudW1iZXJcIix0K1wiLnJlZlwiLGUuY29tbWFuZFN0ciksUy5jb21tYW5kVHlwZShvLFwibnVtYmVyXCIsdCtcIi5tYXNrXCIsZS5jb21tYW5kU3RyKSxbJHRbcl0saSxvXX0pLChmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jb25zdGFudHMuY29tcGFyZUZ1bmNzO3JldHVybiBTLm9wdGlvbmFsKChmdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXt0LmFzc2VydChlLEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwoYXJndW1lbnRzLFwiXCIpLFwiaW52YWxpZCBzdGVuY2lsLmZ1bmNcIil9aShuK1wiJiZ0eXBlb2YgXCIsbiwnPT09XCJvYmplY3RcIicpLGkoJyEoXCJjbXBcIiBpbiAnLG4sXCIpfHwoXCIsbixcIi5jbXAgaW4gXCIscixcIilcIil9KSksW2UuZGVmKCdcImNtcFwiIGluICcsbixcIj9cIixyLFwiW1wiLG4sXCIuY21wXVwiLFwiOlwiLDc2ODApLGUuZGVmKG4sXCIucmVmfDBcIiksZS5kZWYoJ1wibWFza1wiIGluICcsbixcIj9cIixuLFwiLm1hc2t8MDotMVwiKV19KSk7Y2FzZVwic3RlbmNpbC5vcEZyb250XCI6Y2FzZVwic3RlbmNpbC5vcEJhY2tcIjpyZXR1cm4gdSgoZnVuY3Rpb24obil7Uy5jb21tYW5kVHlwZShuLFwib2JqZWN0XCIscyxlLmNvbW1hbmRTdHIpO3ZhciByPW4uZmFpbHx8XCJrZWVwXCIsaT1uLnpmYWlsfHxcImtlZXBcIixvPW4uenBhc3N8fFwia2VlcFwiO3JldHVybiBTLmNvbW1hbmRQYXJhbWV0ZXIocix0ZSx0K1wiLmZhaWxcIixlLmNvbW1hbmRTdHIpLFMuY29tbWFuZFBhcmFtZXRlcihpLHRlLHQrXCIuemZhaWxcIixlLmNvbW1hbmRTdHIpLFMuY29tbWFuZFBhcmFtZXRlcihvLHRlLHQrXCIuenBhc3NcIixlLmNvbW1hbmRTdHIpLFtcInN0ZW5jaWwub3BCYWNrXCI9PT10PzEwMjk6MTAyOCx0ZVtyXSx0ZVtpXSx0ZVtvXV19KSwoZnVuY3Rpb24oZSxuLHIpe3ZhciBpPWUuY29uc3RhbnRzLnN0ZW5jaWxPcHM7ZnVuY3Rpb24gbyhvKXtyZXR1cm4gUy5vcHRpb25hbCgoZnVuY3Rpb24oKXtlLmFzc2VydChuLCchKFwiJytvKydcIiBpbiAnK3IrXCIpfHwoXCIrcitcIi5cIitvK1wiIGluIFwiK2krXCIpXCIsXCJpbnZhbGlkIFwiK3QrXCIuXCIrbytcIiwgbXVzdCBiZSBvbmUgb2YgXCIrT2JqZWN0LmtleXModGUpKX0pKSxuLmRlZignXCInLG8sJ1wiIGluICcscixcIj9cIixpLFwiW1wiLHIsXCIuXCIsbyxcIl06XCIsNzY4MCl9cmV0dXJuIFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7ZS5hc3NlcnQobixyK1wiJiZ0eXBlb2YgXCIrcisnPT09XCJvYmplY3RcIicsXCJpbnZhbGlkIFwiK3QpfSkpLFtcInN0ZW5jaWwub3BCYWNrXCI9PT10PzEwMjk6MTAyOCxvKFwiZmFpbFwiKSxvKFwiemZhaWxcIiksbyhcInpwYXNzXCIpXX0pKTtjYXNlXCJwb2x5Z29uT2Zmc2V0Lm9mZnNldFwiOnJldHVybiB1KChmdW5jdGlvbih0KXtTLmNvbW1hbmRUeXBlKHQsXCJvYmplY3RcIixzLGUuY29tbWFuZFN0cik7dmFyIG49MHx0LmZhY3RvcixyPTB8dC51bml0cztyZXR1cm4gUy5jb21tYW5kVHlwZShuLFwibnVtYmVyXCIscytcIi5mYWN0b3JcIixlLmNvbW1hbmRTdHIpLFMuY29tbWFuZFR5cGUocixcIm51bWJlclwiLHMrXCIudW5pdHNcIixlLmNvbW1hbmRTdHIpLFtuLHJdfSksKGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gUy5vcHRpb25hbCgoZnVuY3Rpb24oKXtlLmFzc2VydChuLHIrXCImJnR5cGVvZiBcIityKyc9PT1cIm9iamVjdFwiJyxcImludmFsaWQgXCIrdCl9KSksW24uZGVmKHIsXCIuZmFjdG9yfDBcIiksbi5kZWYocixcIi51bml0c3wwXCIpXX0pKTtjYXNlXCJjdWxsLmZhY2VcIjpyZXR1cm4gdSgoZnVuY3Rpb24odCl7dmFyIG49MDtyZXR1cm5cImZyb250XCI9PT10P249MTAyODpcImJhY2tcIj09PXQmJihuPTEwMjkpLFMuY29tbWFuZCghIW4scyxlLmNvbW1hbmRTdHIpLG59KSwoZnVuY3Rpb24odCxlLG4pe3JldHVybiBTLm9wdGlvbmFsKChmdW5jdGlvbigpe3QuYXNzZXJ0KGUsbisnPT09XCJmcm9udFwifHwnK24rJz09PVwiYmFja1wiJyxcImludmFsaWQgY3VsbC5mYWNlXCIpfSkpLGUuZGVmKG4sJz09PVwiZnJvbnRcIj8nLDEwMjgsXCI6XCIsMTAyOSl9KSk7Y2FzZVwibGluZVdpZHRoXCI6cmV0dXJuIHUoKGZ1bmN0aW9uKHQpe3JldHVybiBTLmNvbW1hbmQoXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PWkubGluZVdpZHRoRGltc1swXSYmdDw9aS5saW5lV2lkdGhEaW1zWzFdLFwiaW52YWxpZCBsaW5lIHdpZHRoLCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIGJldHdlZW4gXCIraS5saW5lV2lkdGhEaW1zWzBdK1wiIGFuZCBcIitpLmxpbmVXaWR0aERpbXNbMV0sZS5jb21tYW5kU3RyKSx0fSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUy5vcHRpb25hbCgoZnVuY3Rpb24oKXt0LmFzc2VydChlLFwidHlwZW9mIFwiK24rJz09PVwibnVtYmVyXCImJicrbitcIj49XCIraS5saW5lV2lkdGhEaW1zWzBdK1wiJiZcIituK1wiPD1cIitpLmxpbmVXaWR0aERpbXNbMV0sXCJpbnZhbGlkIGxpbmUgd2lkdGhcIil9KSksbn0pKTtjYXNlXCJmcm9udEZhY2VcIjpyZXR1cm4gdSgoZnVuY3Rpb24odCl7cmV0dXJuIFMuY29tbWFuZFBhcmFtZXRlcih0LG5lLHMsZS5jb21tYW5kU3RyKSxuZVt0XX0pLChmdW5jdGlvbih0LGUsbil7cmV0dXJuIFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7dC5hc3NlcnQoZSxuKyc9PT1cImN3XCJ8fCcrbisnPT09XCJjY3dcIicsXCJpbnZhbGlkIGZyb250RmFjZSwgbXVzdCBiZSBvbmUgb2YgY3csY2N3XCIpfSkpLGUuZGVmKG4rJz09PVwiY3dcIj8yMzA0OjIzMDUnKX0pKTtjYXNlXCJjb2xvck1hc2tcIjpyZXR1cm4gdSgoZnVuY3Rpb24odCl7cmV0dXJuIFMuY29tbWFuZCh0dCh0KSYmND09PXQubGVuZ3RoLFwiY29sb3IubWFzayBtdXN0IGJlIGxlbmd0aCA0IGFycmF5XCIsZS5jb21tYW5kU3RyKSx0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuISF0fSkpfSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUy5vcHRpb25hbCgoZnVuY3Rpb24oKXt0LmFzc2VydChlLHQuc2hhcmVkLmlzQXJyYXlMaWtlK1wiKFwiK24rXCIpJiZcIituK1wiLmxlbmd0aD09PTRcIixcImludmFsaWQgY29sb3IubWFza1wiKX0pKSxqKDQsKGZ1bmN0aW9uKHQpe3JldHVyblwiISFcIituK1wiW1wiK3QrXCJdXCJ9KSl9KSk7Y2FzZVwic2FtcGxlLmNvdmVyYWdlXCI6cmV0dXJuIHUoKGZ1bmN0aW9uKHQpe1MuY29tbWFuZChcIm9iamVjdFwiPT09YSh0KSYmdCxzLGUuY29tbWFuZFN0cik7dmFyIG49XCJ2YWx1ZVwiaW4gdD90LnZhbHVlOjEscj0hIXQuaW52ZXJ0O3JldHVybiBTLmNvbW1hbmQoXCJudW1iZXJcIj09dHlwZW9mIG4mJm4+PTAmJm48PTEsXCJzYW1wbGUuY292ZXJhZ2UudmFsdWUgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDFcIixlLmNvbW1hbmRTdHIpLFtuLHJdfSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUy5vcHRpb25hbCgoZnVuY3Rpb24oKXt0LmFzc2VydChlLG4rXCImJnR5cGVvZiBcIituKyc9PT1cIm9iamVjdFwiJyxcImludmFsaWQgc2FtcGxlLmNvdmVyYWdlXCIpfSkpLFtlLmRlZignXCJ2YWx1ZVwiIGluICcsbixcIj8rXCIsbixcIi52YWx1ZToxXCIpLGUuZGVmKFwiISFcIixuLFwiLmludmVydFwiKV19KSl9fSkpLG99KHQsZCksaz1mdW5jdGlvbih0LGUscil7dmFyIGk9dC5zdGF0aWMsbz10LmR5bmFtaWM7ZnVuY3Rpb24gYSh0KXtpZih0IGluIGkpe3ZhciBlPW4uaWQoaVt0XSk7Uy5vcHRpb25hbCgoZnVuY3Rpb24oKXtoLnNoYWRlcihlZVt0XSxlLFMuZ3Vlc3NDb21tYW5kKCkpfSkpO3ZhciByPXNlKChmdW5jdGlvbigpe3JldHVybiBlfSkpO3JldHVybiByLmlkPWUscn1pZih0IGluIG8pe3ZhciBhPW9bdF07cmV0dXJuIHVlKGEsKGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5pbnZva2UobixhKSxpPW4uZGVmKGUuc2hhcmVkLnN0cmluZ3MsXCIuaWQoXCIscixcIilcIik7cmV0dXJuIFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7bihlLnNoYXJlZC5zaGFkZXIsXCIuc2hhZGVyKFwiLGVlW3RdLFwiLFwiLGksXCIsXCIsZS5jb21tYW5kLFwiKTtcIil9KSksaX0pKX1yZXR1cm4gbnVsbH12YXIgcyx1PWEoVXQpLGM9YShGdCksZj1udWxsO3JldHVybiBhZSh1KSYmYWUoYyk/KGY9aC5wcm9ncmFtKGMuaWQsdS5pZCxudWxsLHIpLHM9c2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGluayhmKX0pKSk6cz1uZXcgb2UodSYmdS50aGlzRGVwfHxjJiZjLnRoaXNEZXAsdSYmdS5jb250ZXh0RGVwfHxjJiZjLmNvbnRleHREZXAsdSYmdS5wcm9wRGVwfHxjJiZjLnByb3BEZXAsKGZ1bmN0aW9uKHQsZSl7dmFyIG4scj10LnNoYXJlZC5zaGFkZXI7bj11P3UuYXBwZW5kKHQsZSk6ZS5kZWYocixcIi5cIixVdCk7dmFyIGk9citcIi5wcm9ncmFtKFwiKyhjP2MuYXBwZW5kKHQsZSk6ZS5kZWYocixcIi5cIixGdCkpK1wiLFwiK247cmV0dXJuIFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7aSs9XCIsXCIrdC5jb21tYW5kfSkpLGUuZGVmKGkrXCIpXCIpfSkpLHtmcmFnOnUsdmVydDpjLHByb2dWYXI6cyxwcm9ncmFtOmZ9fSh0LDAsdik7ZnVuY3Rpb24gTSh0KXt2YXIgZT13W3RdO2UmJihPW3RdPWUpfU0oXCJ2aWV3cG9ydFwiKSxNKEEoXCJzY2lzc29yLmJveFwiKSk7dmFyIFQ9T2JqZWN0LmtleXMoTykubGVuZ3RoPjAsQz17ZnJhbWVidWZmZXI6eCxkcmF3OkUsc2hhZGVyOmssc3RhdGU6TyxkaXJ0eTpULHNjb3BlVkFPOm51bGwsZHJhd1ZBTzpudWxsLHVzZVZBTzohMSxhdHRyaWJ1dGVzOnt9fTtpZihDLnByb2ZpbGU9ZnVuY3Rpb24odCl7dmFyIGUsbj10LnN0YXRpYyxyPXQuZHluYW1pYztpZihCdCBpbiBuKXt2YXIgaT0hIW5bQnRdOyhlPXNlKChmdW5jdGlvbih0LGUpe3JldHVybiBpfSkpKS5lbmFibGU9aX1lbHNlIGlmKEJ0IGluIHIpe3ZhciBvPXJbQnRdO2U9dWUobywoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pbnZva2UoZSxvKX0pKX1yZXR1cm4gZX0odCksQy51bmlmb3Jtcz1mdW5jdGlvbih0LGUpe3ZhciBuPXQuc3RhdGljLHI9dC5keW5hbWljLGk9e307cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByLG89blt0XTtpZihcIm51bWJlclwiPT10eXBlb2Ygb3x8XCJib29sZWFuXCI9PXR5cGVvZiBvKXI9c2UoKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBvKXt2YXIgYT1vLl9yZWdsVHlwZTtcInRleHR1cmUyZFwiPT09YXx8XCJ0ZXh0dXJlQ3ViZVwiPT09YT9yPXNlKChmdW5jdGlvbih0KXtyZXR1cm4gdC5saW5rKG8pfSkpOlwiZnJhbWVidWZmZXJcIj09PWF8fFwiZnJhbWVidWZmZXJDdWJlXCI9PT1hPyhTLmNvbW1hbmQoby5jb2xvci5sZW5ndGg+MCwnbWlzc2luZyBjb2xvciBhdHRhY2htZW50IGZvciBmcmFtZWJ1ZmZlciBzZW50IHRvIHVuaWZvcm0gXCInK3QrJ1wiJyxlLmNvbW1hbmRTdHIpLHI9c2UoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmxpbmsoby5jb2xvclswXSl9KSkpOlMuY29tbWFuZFJhaXNlKCdpbnZhbGlkIGRhdGEgZm9yIHVuaWZvcm0gXCInK3QrJ1wiJyxlLmNvbW1hbmRTdHIpfWVsc2UgdHQobyk/cj1zZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2xvYmFsLmRlZihcIltcIixqKG8ubGVuZ3RoLChmdW5jdGlvbihuKXtyZXR1cm4gUy5jb21tYW5kKFwibnVtYmVyXCI9PXR5cGVvZiBvW25dfHxcImJvb2xlYW5cIj09dHlwZW9mIG9bbl0sXCJpbnZhbGlkIHVuaWZvcm0gXCIrdCxlLmNvbW1hbmRTdHIpLG9bbl19KSksXCJdXCIpfSkpOlMuY29tbWFuZFJhaXNlKCdpbnZhbGlkIG9yIG1pc3NpbmcgZGF0YSBmb3IgdW5pZm9ybSBcIicrdCsnXCInLGUuY29tbWFuZFN0cik7ci52YWx1ZT1vLGlbdF09cn0pKSxPYmplY3Qua2V5cyhyKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1yW3RdO2lbdF09dWUoZSwoZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5pbnZva2UobixlKX0pKX0pKSxpfSh1LGQpLEMuZHJhd1ZBTz1DLnNjb3BlVkFPPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5zdGF0aWMscj10LmR5bmFtaWM7aWYoSHQgaW4gbil7dmFyIGk9bltIdF07cmV0dXJuIG51bGwhPT1pJiZudWxsPT09bC5nZXRWQU8oaSkmJihpPWwuY3JlYXRlVkFPKGkpKSxzZSgoZnVuY3Rpb24odCl7cmV0dXJuIHQubGluayhsLmdldFZBTyhpKSl9KSl9aWYoSHQgaW4gcil7dmFyIG89cltIdF07cmV0dXJuIHVlKG8sKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5pbnZva2UoZSxvKTtyZXR1cm4gZS5kZWYodC5zaGFyZWQudmFvK1wiLmdldFZBTyhcIituK1wiKVwiKX0pKX1yZXR1cm4gbnVsbH0odCksIUMuZHJhd1ZBTyYmay5wcm9ncmFtJiYhdiYmci5hbmdsZV9pbnN0YW5jZWRfYXJyYXlzKXt2YXIgST0hMCxQPWsucHJvZ3JhbS5hdHRyaWJ1dGVzLm1hcCgoZnVuY3Rpb24odCl7dmFyIG49ZS5zdGF0aWNbdF07cmV0dXJuIEk9SSYmISFuLG59KSk7aWYoSSYmUC5sZW5ndGg+MCl7dmFyIEQ9bC5nZXRWQU8obC5jcmVhdGVWQU8oUCkpO0MuZHJhd1ZBTz1uZXcgb2UobnVsbCxudWxsLG51bGwsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGluayhEKX0pKSxDLnVzZVZBTz0hMH19cmV0dXJuIHY/Qy51c2VWQU89ITA6Qy5hdHRyaWJ1dGVzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5zdGF0aWMsaT10LmR5bmFtaWMscz17fTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGk9clt0XSx1PW4uaWQodCksYz1uZXcgeTtpZihyZShpKSljLnN0YXRlPTEsYy5idWZmZXI9by5nZXRCdWZmZXIoby5jcmVhdGUoaSwzNDk2MiwhMSwhMCkpLGMudHlwZT0wO2Vsc2V7dmFyIGY9by5nZXRCdWZmZXIoaSk7aWYoZiljLnN0YXRlPTEsYy5idWZmZXI9ZixjLnR5cGU9MDtlbHNlIGlmKFMuY29tbWFuZChcIm9iamVjdFwiPT09YShpKSYmaSxcImludmFsaWQgZGF0YSBmb3IgYXR0cmlidXRlIFwiK3QsZS5jb21tYW5kU3RyKSxcImNvbnN0YW50XCJpbiBpKXt2YXIgbD1pLmNvbnN0YW50O2MuYnVmZmVyPVwibnVsbFwiLGMuc3RhdGU9MixcIm51bWJlclwiPT10eXBlb2YgbD9jLng9bDooUy5jb21tYW5kKHR0KGwpJiZsLmxlbmd0aD4wJiZsLmxlbmd0aDw9NCxcImludmFsaWQgY29uc3RhbnQgZm9yIGF0dHJpYnV0ZSBcIit0LGUuY29tbWFuZFN0ciksTHQuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtlPGwubGVuZ3RoJiYoY1t0XT1sW2VdKX0pKSl9ZWxzZXtmPXJlKGkuYnVmZmVyKT9vLmdldEJ1ZmZlcihvLmNyZWF0ZShpLmJ1ZmZlciwzNDk2MiwhMSwhMCkpOm8uZ2V0QnVmZmVyKGkuYnVmZmVyKSxTLmNvbW1hbmQoISFmLCdtaXNzaW5nIGJ1ZmZlciBmb3IgYXR0cmlidXRlIFwiJyt0KydcIicsZS5jb21tYW5kU3RyKTt2YXIgaD0wfGkub2Zmc2V0O1MuY29tbWFuZChoPj0wLCdpbnZhbGlkIG9mZnNldCBmb3IgYXR0cmlidXRlIFwiJyt0KydcIicsZS5jb21tYW5kU3RyKTt2YXIgZD0wfGkuc3RyaWRlO1MuY29tbWFuZChkPj0wJiZkPDI1NiwnaW52YWxpZCBzdHJpZGUgZm9yIGF0dHJpYnV0ZSBcIicrdCsnXCIsIG11c3QgYmUgaW50ZWdlciBiZXR3ZWVlbiBbMCwgMjU1XScsZS5jb21tYW5kU3RyKTt2YXIgcD0wfGkuc2l6ZTtTLmNvbW1hbmQoIShcInNpemVcImluIGkpfHxwPjAmJnA8PTQsJ2ludmFsaWQgc2l6ZSBmb3IgYXR0cmlidXRlIFwiJyt0KydcIiwgbXVzdCBiZSAxLDIsMyw0JyxlLmNvbW1hbmRTdHIpO3ZhciBnPSEhaS5ub3JtYWxpemVkLHY9MDtcInR5cGVcImluIGkmJihTLmNvbW1hbmRQYXJhbWV0ZXIoaS50eXBlLHosXCJpbnZhbGlkIHR5cGUgZm9yIGF0dHJpYnV0ZSBcIit0LGUuY29tbWFuZFN0ciksdj16W2kudHlwZV0pO3ZhciBtPTB8aS5kaXZpc29yO1wiZGl2aXNvclwiaW4gaSYmKFMuY29tbWFuZCgwPT09bXx8YiwnY2Fubm90IHNwZWNpZnkgZGl2aXNvciBmb3IgYXR0cmlidXRlIFwiJyt0KydcIiwgaW5zdGFuY2luZyBub3Qgc3VwcG9ydGVkJyxlLmNvbW1hbmRTdHIpLFMuY29tbWFuZChtPj0wLCdpbnZhbGlkIGRpdmlzb3IgZm9yIGF0dHJpYnV0ZSBcIicrdCsnXCInLGUuY29tbWFuZFN0cikpLFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7dmFyIG49ZS5jb21tYW5kU3RyLHI9W1wiYnVmZmVyXCIsXCJvZmZzZXRcIixcImRpdmlzb3JcIixcIm5vcm1hbGl6ZWRcIixcInR5cGVcIixcInNpemVcIixcInN0cmlkZVwiXTtPYmplY3Qua2V5cyhpKS5mb3JFYWNoKChmdW5jdGlvbihlKXtTLmNvbW1hbmQoci5pbmRleE9mKGUpPj0wLCd1bmtub3duIHBhcmFtZXRlciBcIicrZSsnXCIgZm9yIGF0dHJpYnV0ZSBwb2ludGVyIFwiJyt0KydcIiAodmFsaWQgcGFyYW1ldGVycyBhcmUgJytyK1wiKVwiLG4pfSkpfSkpLGMuYnVmZmVyPWYsYy5zdGF0ZT0xLGMuc2l6ZT1wLGMubm9ybWFsaXplZD1nLGMudHlwZT12fHxmLmR0eXBlLGMub2Zmc2V0PWgsYy5zdHJpZGU9ZCxjLmRpdmlzb3I9bX19c1t0XT1zZSgoZnVuY3Rpb24odCxlKXt2YXIgbj10LmF0dHJpYkNhY2hlO2lmKHUgaW4gbilyZXR1cm4gblt1XTt2YXIgcj17aXNTdHJlYW06ITF9O3JldHVybiBPYmplY3Qua2V5cyhjKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyW3RdPWNbdF19KSksYy5idWZmZXImJihyLmJ1ZmZlcj10LmxpbmsoYy5idWZmZXIpLHIudHlwZT1yLnR5cGV8fHIuYnVmZmVyK1wiLmR0eXBlXCIpLG5bdV09cixyfSkpfSkpLE9iamVjdC5rZXlzKGkpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWlbdF07c1t0XT11ZShlLChmdW5jdGlvbihuLHIpe3ZhciBpPW4uaW52b2tlKHIsZSksbz1uLnNoYXJlZCxhPW4uY29uc3RhbnRzLHM9by5pc0J1ZmZlckFyZ3MsdT1vLmJ1ZmZlcjtTLm9wdGlvbmFsKChmdW5jdGlvbigpe24uYXNzZXJ0KHIsaStcIiYmKHR5cGVvZiBcIitpKyc9PT1cIm9iamVjdFwifHx0eXBlb2YgJytpKyc9PT1cImZ1bmN0aW9uXCIpJiYoJytzK1wiKFwiK2krXCIpfHxcIit1K1wiLmdldEJ1ZmZlcihcIitpK1wiKXx8XCIrdStcIi5nZXRCdWZmZXIoXCIraStcIi5idWZmZXIpfHxcIitzK1wiKFwiK2krJy5idWZmZXIpfHwoXCJjb25zdGFudFwiIGluICcraStcIiYmKHR5cGVvZiBcIitpKycuY29uc3RhbnQ9PT1cIm51bWJlclwifHwnK28uaXNBcnJheUxpa2UrXCIoXCIraStcIi5jb25zdGFudCkpKSlcIiwnaW52YWxpZCBkeW5hbWljIGF0dHJpYnV0ZSBcIicrdCsnXCInKX0pKTt2YXIgYz17aXNTdHJlYW06ci5kZWYoITEpfSxmPW5ldyB5O2Yuc3RhdGU9MSxPYmplY3Qua2V5cyhmKS5mb3JFYWNoKChmdW5jdGlvbih0KXtjW3RdPXIuZGVmKFwiXCIrZlt0XSl9KSk7dmFyIGw9Yy5idWZmZXIsaD1jLnR5cGU7ZnVuY3Rpb24gZCh0KXtyKGNbdF0sXCI9XCIsaSxcIi5cIix0LFwifDA7XCIpfXJldHVybiByKFwiaWYoXCIscyxcIihcIixpLFwiKSl7XCIsYy5pc1N0cmVhbSxcIj10cnVlO1wiLGwsXCI9XCIsdSxcIi5jcmVhdGVTdHJlYW0oXCIsMzQ5NjIsXCIsXCIsaSxcIik7XCIsaCxcIj1cIixsLFwiLmR0eXBlO1wiLFwifWVsc2V7XCIsbCxcIj1cIix1LFwiLmdldEJ1ZmZlcihcIixpLFwiKTtcIixcImlmKFwiLGwsXCIpe1wiLGgsXCI9XCIsbCxcIi5kdHlwZTtcIiwnfWVsc2UgaWYoXCJjb25zdGFudFwiIGluICcsaSxcIil7XCIsYy5zdGF0ZSxcIj1cIiwyLFwiO1wiLFwiaWYodHlwZW9mIFwiK2krJy5jb25zdGFudCA9PT0gXCJudW1iZXJcIil7JyxjW0x0WzBdXSxcIj1cIixpLFwiLmNvbnN0YW50O1wiLEx0LnNsaWNlKDEpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGNbdF19KSkuam9pbihcIj1cIiksXCI9MDtcIixcIn1lbHNle1wiLEx0Lm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gY1t0XStcIj1cIitpK1wiLmNvbnN0YW50Lmxlbmd0aD5cIitlK1wiP1wiK2krXCIuY29uc3RhbnRbXCIrZStcIl06MDtcIn0pKS5qb2luKFwiXCIpLFwifX1lbHNle1wiLFwiaWYoXCIscyxcIihcIixpLFwiLmJ1ZmZlcikpe1wiLGwsXCI9XCIsdSxcIi5jcmVhdGVTdHJlYW0oXCIsMzQ5NjIsXCIsXCIsaSxcIi5idWZmZXIpO1wiLFwifWVsc2V7XCIsbCxcIj1cIix1LFwiLmdldEJ1ZmZlcihcIixpLFwiLmJ1ZmZlcik7XCIsXCJ9XCIsaCwnPVwidHlwZVwiIGluICcsaSxcIj9cIixhLmdsVHlwZXMsXCJbXCIsaSxcIi50eXBlXTpcIixsLFwiLmR0eXBlO1wiLGMubm9ybWFsaXplZCxcIj0hIVwiLGksXCIubm9ybWFsaXplZDtcIiksZChcInNpemVcIiksZChcIm9mZnNldFwiKSxkKFwic3RyaWRlXCIpLGQoXCJkaXZpc29yXCIpLHIoXCJ9fVwiKSxyLmV4aXQoXCJpZihcIixjLmlzU3RyZWFtLFwiKXtcIix1LFwiLmRlc3Ryb3lTdHJlYW0oXCIsbCxcIik7XCIsXCJ9XCIpLGN9KSl9KSksc30oZSxkKSxDLmNvbnRleHQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5zdGF0aWMsbj10LmR5bmFtaWMscj17fTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49ZVt0XTtyW3RdPXNlKChmdW5jdGlvbih0LGUpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBufHxcImJvb2xlYW5cIj09dHlwZW9mIG4/XCJcIituOnQubGluayhuKX0pKX0pKSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1uW3RdO3JbdF09dWUoZSwoZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5pbnZva2UobixlKX0pKX0pKSxyfShmKSxDfWZ1bmN0aW9uIEwodCxlLG4pe3ZhciByPXQuc2hhcmVkLmNvbnRleHQsaT10LnNjb3BlKCk7T2JqZWN0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24obyl7ZS5zYXZlKHIsXCIuXCIrbyk7dmFyIGE9bltvXS5hcHBlbmQodCxlKTtBcnJheS5pc0FycmF5KGEpP2kocixcIi5cIixvLFwiPVtcIixhLmpvaW4oKSxcIl07XCIpOmkocixcIi5cIixvLFwiPVwiLGEsXCI7XCIpfSkpLGUoaSl9ZnVuY3Rpb24gQih0LGUsbixyKXt2YXIgaSxvPXQuc2hhcmVkLGE9by5nbCxzPW8uZnJhbWVidWZmZXI7eCYmKGk9ZS5kZWYoby5leHRlbnNpb25zLFwiLndlYmdsX2RyYXdfYnVmZmVyc1wiKSk7dmFyIHUsYz10LmNvbnN0YW50cyxmPWMuZHJhd0J1ZmZlcixsPWMuYmFja0J1ZmZlcjt1PW4/bi5hcHBlbmQodCxlKTplLmRlZihzLFwiLm5leHRcIikscnx8ZShcImlmKFwiLHUsXCIhPT1cIixzLFwiLmN1cil7XCIpLGUoXCJpZihcIix1LFwiKXtcIixhLFwiLmJpbmRGcmFtZWJ1ZmZlcihcIiwzNjE2MCxcIixcIix1LFwiLmZyYW1lYnVmZmVyKTtcIikseCYmZShpLFwiLmRyYXdCdWZmZXJzV0VCR0woXCIsZixcIltcIix1LFwiLmNvbG9yQXR0YWNobWVudHMubGVuZ3RoXSk7XCIpLGUoXCJ9ZWxzZXtcIixhLFwiLmJpbmRGcmFtZWJ1ZmZlcihcIiwzNjE2MCxcIixudWxsKTtcIikseCYmZShpLFwiLmRyYXdCdWZmZXJzV0VCR0woXCIsbCxcIik7XCIpLGUoXCJ9XCIscyxcIi5jdXI9XCIsdSxcIjtcIikscnx8ZShcIn1cIil9ZnVuY3Rpb24gRyh0LGUsbil7dmFyIHI9dC5zaGFyZWQsaT1yLmdsLG89dC5jdXJyZW50LGE9dC5uZXh0LHM9ci5jdXJyZW50LHU9ci5uZXh0LGM9dC5jb25kKHMsXCIuZGlydHlcIik7Xy5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgcixmLGw9QShlKTtpZighKGwgaW4gbi5zdGF0ZSkpaWYobCBpbiBhKXtyPWFbbF0sZj1vW2xdO3ZhciBoPWood1tsXS5sZW5ndGgsKGZ1bmN0aW9uKHQpe3JldHVybiBjLmRlZihyLFwiW1wiLHQsXCJdXCIpfSkpO2ModC5jb25kKGgubWFwKChmdW5jdGlvbih0LGUpe3JldHVybiB0K1wiIT09XCIrZitcIltcIitlK1wiXVwifSkpLmpvaW4oXCJ8fFwiKSkudGhlbihpLFwiLlwiLGtbbF0sXCIoXCIsaCxcIik7XCIsaC5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGYrXCJbXCIrZStcIl09XCIrdH0pKS5qb2luKFwiO1wiKSxcIjtcIikpfWVsc2V7cj1jLmRlZih1LFwiLlwiLGwpO3ZhciBkPXQuY29uZChyLFwiIT09XCIscyxcIi5cIixsKTtjKGQpLGwgaW4gTz9kKHQuY29uZChyKS50aGVuKGksXCIuZW5hYmxlKFwiLE9bbF0sXCIpO1wiKS5lbHNlKGksXCIuZGlzYWJsZShcIixPW2xdLFwiKTtcIikscyxcIi5cIixsLFwiPVwiLHIsXCI7XCIpOmQoaSxcIi5cIixrW2xdLFwiKFwiLHIsXCIpO1wiLHMsXCIuXCIsbCxcIj1cIixyLFwiO1wiKX19KSksMD09PU9iamVjdC5rZXlzKG4uc3RhdGUpLmxlbmd0aCYmYyhzLFwiLmRpcnR5PWZhbHNlO1wiKSxlKGMpfWZ1bmN0aW9uIEYodCxlLG4scil7dmFyIGk9dC5zaGFyZWQsbz10LmN1cnJlbnQsYT1pLmN1cnJlbnQscz1pLmdsO2llKE9iamVjdC5rZXlzKG4pKS5mb3JFYWNoKChmdW5jdGlvbihpKXt2YXIgdT1uW2ldO2lmKCFyfHxyKHUpKXt2YXIgYz11LmFwcGVuZCh0LGUpO2lmKE9baV0pe3ZhciBmPU9baV07YWUodSk/ZShzLGM/XCIuZW5hYmxlKFwiOlwiLmRpc2FibGUoXCIsZixcIik7XCIpOmUodC5jb25kKGMpLnRoZW4ocyxcIi5lbmFibGUoXCIsZixcIik7XCIpLmVsc2UocyxcIi5kaXNhYmxlKFwiLGYsXCIpO1wiKSksZShhLFwiLlwiLGksXCI9XCIsYyxcIjtcIil9ZWxzZSBpZih0dChjKSl7dmFyIGw9b1tpXTtlKHMsXCIuXCIsa1tpXSxcIihcIixjLFwiKTtcIixjLm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbCtcIltcIitlK1wiXT1cIit0fSkpLmpvaW4oXCI7XCIpLFwiO1wiKX1lbHNlIGUocyxcIi5cIixrW2ldLFwiKFwiLGMsXCIpO1wiLGEsXCIuXCIsaSxcIj1cIixjLFwiO1wiKX19KSl9ZnVuY3Rpb24gVSh0LGUpe2ImJih0Lmluc3RhbmNpbmc9ZS5kZWYodC5zaGFyZWQuZXh0ZW5zaW9ucyxcIi5hbmdsZV9pbnN0YW5jZWRfYXJyYXlzXCIpKX1mdW5jdGlvbiBWKHQsZSxuLHIsaSl7dmFyIG8sYSxzLHU9dC5zaGFyZWQsYz10LnN0YXRzLGY9dS5jdXJyZW50LGw9dS50aW1lcixoPW4ucHJvZmlsZTtmdW5jdGlvbiBkKCl7cmV0dXJuXCJ1bmRlZmluZWRcIj09dHlwZW9mIHBlcmZvcm1hbmNlP1wiRGF0ZS5ub3coKVwiOlwicGVyZm9ybWFuY2Uubm93KClcIn1mdW5jdGlvbiBwKHQpe3Qobz1lLmRlZigpLFwiPVwiLGQoKSxcIjtcIiksXCJzdHJpbmdcIj09dHlwZW9mIGk/dChjLFwiLmNvdW50Kz1cIixpLFwiO1wiKTp0KGMsXCIuY291bnQrKztcIiksZyYmKHI/dChhPWUuZGVmKCksXCI9XCIsbCxcIi5nZXROdW1QZW5kaW5nUXVlcmllcygpO1wiKTp0KGwsXCIuYmVnaW5RdWVyeShcIixjLFwiKTtcIikpfWZ1bmN0aW9uIHYodCl7dChjLFwiLmNwdVRpbWUrPVwiLGQoKSxcIi1cIixvLFwiO1wiKSxnJiYocj90KGwsXCIucHVzaFNjb3BlU3RhdHMoXCIsYSxcIixcIixsLFwiLmdldE51bVBlbmRpbmdRdWVyaWVzKCksXCIsYyxcIik7XCIpOnQobCxcIi5lbmRRdWVyeSgpO1wiKSl9ZnVuY3Rpb24geSh0KXt2YXIgbj1lLmRlZihmLFwiLnByb2ZpbGVcIik7ZShmLFwiLnByb2ZpbGU9XCIsdCxcIjtcIiksZS5leGl0KGYsXCIucHJvZmlsZT1cIixuLFwiO1wiKX1pZihoKXtpZihhZShoKSlyZXR1cm4gdm9pZChoLmVuYWJsZT8ocChlKSx2KGUuZXhpdCkseShcInRydWVcIikpOnkoXCJmYWxzZVwiKSk7eShzPWguYXBwZW5kKHQsZSkpfWVsc2Ugcz1lLmRlZihmLFwiLnByb2ZpbGVcIik7dmFyIG09dC5ibG9jaygpO3AobSksZShcImlmKFwiLHMsXCIpe1wiLG0sXCJ9XCIpO3ZhciBiPXQuYmxvY2soKTt2KGIpLGUuZXhpdChcImlmKFwiLHMsXCIpe1wiLGIsXCJ9XCIpfWZ1bmN0aW9uIFcodCxlLG4scixpKXt2YXIgbz10LnNoYXJlZDtyLmZvckVhY2goKGZ1bmN0aW9uKHIpe3ZhciBhLHM9ci5uYW1lLHU9bi5hdHRyaWJ1dGVzW3NdO2lmKHUpe2lmKCFpKHUpKXJldHVybjthPXUuYXBwZW5kKHQsZSl9ZWxzZXtpZighaShjZSkpcmV0dXJuO3ZhciBjPXQuc2NvcGVBdHRyaWIocyk7Uy5vcHRpb25hbCgoZnVuY3Rpb24oKXt0LmFzc2VydChlLGMrXCIuc3RhdGVcIixcIm1pc3NpbmcgYXR0cmlidXRlIFwiK3MpfSkpLGE9e30sT2JqZWN0LmtleXMobmV3IHkpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2FbdF09ZS5kZWYoYyxcIi5cIix0KX0pKX0hZnVuY3Rpb24obixyLGkpe3ZhciBhPW8uZ2wscz1lLmRlZihuLFwiLmxvY2F0aW9uXCIpLHU9ZS5kZWYoby5hdHRyaWJ1dGVzLFwiW1wiLHMsXCJdXCIpLGM9aS5zdGF0ZSxmPWkuYnVmZmVyLGw9W2kueCxpLnksaS56LGkud10saD1bXCJidWZmZXJcIixcIm5vcm1hbGl6ZWRcIixcIm9mZnNldFwiLFwic3RyaWRlXCJdO2Z1bmN0aW9uIGQoKXtlKFwiaWYoIVwiLHUsXCIuYnVmZmVyKXtcIixhLFwiLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFwiLHMsXCIpO31cIik7dmFyIG4sbz1pLnR5cGU7aWYobj1pLnNpemU/ZS5kZWYoaS5zaXplLFwifHxcIixyKTpyLGUoXCJpZihcIix1LFwiLnR5cGUhPT1cIixvLFwifHxcIix1LFwiLnNpemUhPT1cIixuLFwifHxcIixoLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHUrXCIuXCIrdCtcIiE9PVwiK2lbdF19KSkuam9pbihcInx8XCIpLFwiKXtcIixhLFwiLmJpbmRCdWZmZXIoXCIsMzQ5NjIsXCIsXCIsZixcIi5idWZmZXIpO1wiLGEsXCIudmVydGV4QXR0cmliUG9pbnRlcihcIixbcyxuLG8saS5ub3JtYWxpemVkLGkuc3RyaWRlLGkub2Zmc2V0XSxcIik7XCIsdSxcIi50eXBlPVwiLG8sXCI7XCIsdSxcIi5zaXplPVwiLG4sXCI7XCIsaC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB1K1wiLlwiK3QrXCI9XCIraVt0XStcIjtcIn0pKS5qb2luKFwiXCIpLFwifVwiKSxiKXt2YXIgYz1pLmRpdmlzb3I7ZShcImlmKFwiLHUsXCIuZGl2aXNvciE9PVwiLGMsXCIpe1wiLHQuaW5zdGFuY2luZyxcIi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoXCIsW3MsY10sXCIpO1wiLHUsXCIuZGl2aXNvcj1cIixjLFwiO31cIil9fWZ1bmN0aW9uIHAoKXtlKFwiaWYoXCIsdSxcIi5idWZmZXIpe1wiLGEsXCIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KFwiLHMsXCIpO1wiLHUsXCIuYnVmZmVyPW51bGw7XCIsXCJ9aWYoXCIsTHQubWFwKChmdW5jdGlvbih0LGUpe3JldHVybiB1K1wiLlwiK3QrXCIhPT1cIitsW2VdfSkpLmpvaW4oXCJ8fFwiKSxcIil7XCIsYSxcIi52ZXJ0ZXhBdHRyaWI0ZihcIixzLFwiLFwiLGwsXCIpO1wiLEx0Lm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdStcIi5cIit0K1wiPVwiK2xbZV0rXCI7XCJ9KSkuam9pbihcIlwiKSxcIn1cIil9MT09PWM/ZCgpOjI9PT1jP3AoKTooZShcImlmKFwiLGMsXCI9PT1cIiwxLFwiKXtcIiksZCgpLGUoXCJ9ZWxzZXtcIikscCgpLGUoXCJ9XCIpKX0odC5saW5rKHIpLGZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIDM1NjY0OmNhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gMjtjYXNlIDM1NjY1OmNhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4gMztjYXNlIDM1NjY2OmNhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gNDtkZWZhdWx0OnJldHVybiAxfX0oci5pbmZvLnR5cGUpLGEpfSkpfWZ1bmN0aW9uIFgodCxlLHIsaSxvKXtmb3IodmFyIGEscz10LnNoYXJlZCx1PXMuZ2wsYz0wO2M8aS5sZW5ndGg7KytjKXt2YXIgZixsPWlbY10saD1sLm5hbWUsZD1sLmluZm8udHlwZSxwPXIudW5pZm9ybXNbaF0sZz10LmxpbmsobCkrXCIubG9jYXRpb25cIjtpZihwKXtpZighbyhwKSljb250aW51ZTtpZihhZShwKSl7dmFyIHY9cC52YWx1ZTtpZihTLmNvbW1hbmQobnVsbCE9diwnbWlzc2luZyB1bmlmb3JtIFwiJytoKydcIicsdC5jb21tYW5kU3RyKSwzNTY3OD09PWR8fDM1NjgwPT09ZCl7Uy5jb21tYW5kKFwiZnVuY3Rpb25cIj09dHlwZW9mIHYmJigzNTY3OD09PWQmJihcInRleHR1cmUyZFwiPT09di5fcmVnbFR5cGV8fFwiZnJhbWVidWZmZXJcIj09PXYuX3JlZ2xUeXBlKXx8MzU2ODA9PT1kJiYoXCJ0ZXh0dXJlQ3ViZVwiPT09di5fcmVnbFR5cGV8fFwiZnJhbWVidWZmZXJDdWJlXCI9PT12Ll9yZWdsVHlwZSkpLFwiaW52YWxpZCB0ZXh0dXJlIGZvciB1bmlmb3JtIFwiK2gsdC5jb21tYW5kU3RyKTt2YXIgeT10Lmxpbmsodi5fdGV4dHVyZXx8di5jb2xvclswXS5fdGV4dHVyZSk7ZSh1LFwiLnVuaWZvcm0xaShcIixnLFwiLFwiLHkrXCIuYmluZCgpKTtcIiksZS5leGl0KHksXCIudW5iaW5kKCk7XCIpfWVsc2UgaWYoMzU2NzQ9PT1kfHwzNTY3NT09PWR8fDM1Njc2PT09ZCl7Uy5vcHRpb25hbCgoZnVuY3Rpb24oKXtTLmNvbW1hbmQodHQodiksXCJpbnZhbGlkIG1hdHJpeCBmb3IgdW5pZm9ybSBcIitoLHQuY29tbWFuZFN0ciksUy5jb21tYW5kKDM1Njc0PT09ZCYmND09PXYubGVuZ3RofHwzNTY3NT09PWQmJjk9PT12Lmxlbmd0aHx8MzU2NzY9PT1kJiYxNj09PXYubGVuZ3RoLFwiaW52YWxpZCBsZW5ndGggZm9yIG1hdHJpeCB1bmlmb3JtIFwiK2gsdC5jb21tYW5kU3RyKX0pKTt2YXIgbT10Lmdsb2JhbC5kZWYoXCJuZXcgRmxvYXQzMkFycmF5KFtcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh2KStcIl0pXCIpLGI9MjszNTY3NT09PWQ/Yj0zOjM1Njc2PT09ZCYmKGI9NCksZSh1LFwiLnVuaWZvcm1NYXRyaXhcIixiLFwiZnYoXCIsZyxcIixmYWxzZSxcIixtLFwiKTtcIil9ZWxzZXtzd2l0Y2goZCl7Y2FzZSA1MTI2OlMuY29tbWFuZFR5cGUodixcIm51bWJlclwiLFwidW5pZm9ybSBcIitoLHQuY29tbWFuZFN0ciksYT1cIjFmXCI7YnJlYWs7Y2FzZSAzNTY2NDpTLmNvbW1hbmQodHQodikmJjI9PT12Lmxlbmd0aCxcInVuaWZvcm0gXCIraCx0LmNvbW1hbmRTdHIpLGE9XCIyZlwiO2JyZWFrO2Nhc2UgMzU2NjU6Uy5jb21tYW5kKHR0KHYpJiYzPT09di5sZW5ndGgsXCJ1bmlmb3JtIFwiK2gsdC5jb21tYW5kU3RyKSxhPVwiM2ZcIjticmVhaztjYXNlIDM1NjY2OlMuY29tbWFuZCh0dCh2KSYmND09PXYubGVuZ3RoLFwidW5pZm9ybSBcIitoLHQuY29tbWFuZFN0ciksYT1cIjRmXCI7YnJlYWs7Y2FzZSAzNTY3MDpTLmNvbW1hbmRUeXBlKHYsXCJib29sZWFuXCIsXCJ1bmlmb3JtIFwiK2gsdC5jb21tYW5kU3RyKSxhPVwiMWlcIjticmVhaztjYXNlIDUxMjQ6Uy5jb21tYW5kVHlwZSh2LFwibnVtYmVyXCIsXCJ1bmlmb3JtIFwiK2gsdC5jb21tYW5kU3RyKSxhPVwiMWlcIjticmVhaztjYXNlIDM1NjcxOmNhc2UgMzU2Njc6Uy5jb21tYW5kKHR0KHYpJiYyPT09di5sZW5ndGgsXCJ1bmlmb3JtIFwiK2gsdC5jb21tYW5kU3RyKSxhPVwiMmlcIjticmVhaztjYXNlIDM1NjcyOmNhc2UgMzU2Njg6Uy5jb21tYW5kKHR0KHYpJiYzPT09di5sZW5ndGgsXCJ1bmlmb3JtIFwiK2gsdC5jb21tYW5kU3RyKSxhPVwiM2lcIjticmVhaztjYXNlIDM1NjczOmNhc2UgMzU2Njk6Uy5jb21tYW5kKHR0KHYpJiY0PT09di5sZW5ndGgsXCJ1bmlmb3JtIFwiK2gsdC5jb21tYW5kU3RyKSxhPVwiNGlcIn1lKHUsXCIudW5pZm9ybVwiLGEsXCIoXCIsZyxcIixcIix0dCh2KT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh2KTp2LFwiKTtcIil9Y29udGludWV9Zj1wLmFwcGVuZCh0LGUpfWVsc2V7aWYoIW8oY2UpKWNvbnRpbnVlO2Y9ZS5kZWYocy51bmlmb3JtcyxcIltcIixuLmlkKGgpLFwiXVwiKX0zNTY3OD09PWQ/KFMoIUFycmF5LmlzQXJyYXkoZiksXCJtdXN0IHNwZWNpZnkgYSBzY2FsYXIgcHJvcCBmb3IgdGV4dHVyZXNcIiksZShcImlmKFwiLGYsXCImJlwiLGYsJy5fcmVnbFR5cGU9PT1cImZyYW1lYnVmZmVyXCIpeycsZixcIj1cIixmLFwiLmNvbG9yWzBdO1wiLFwifVwiKSk6MzU2ODA9PT1kJiYoUyghQXJyYXkuaXNBcnJheShmKSxcIm11c3Qgc3BlY2lmeSBhIHNjYWxhciBwcm9wIGZvciBjdWJlIG1hcHNcIiksZShcImlmKFwiLGYsXCImJlwiLGYsJy5fcmVnbFR5cGU9PT1cImZyYW1lYnVmZmVyQ3ViZVwiKXsnLGYsXCI9XCIsZixcIi5jb2xvclswXTtcIixcIn1cIikpLFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe3QuYXNzZXJ0KGUsbiwnYmFkIGRhdGEgb3IgbWlzc2luZyBmb3IgdW5pZm9ybSBcIicraCsnXCIuICAnK3IpfWZ1bmN0aW9uIHIodCl7UyghQXJyYXkuaXNBcnJheShmKSxcIm11c3Qgbm90IHNwZWNpZnkgYW4gYXJyYXkgdHlwZSBmb3IgdW5pZm9ybVwiKSxuKFwidHlwZW9mIFwiK2YrJz09PVwiJyt0KydcIicsXCJpbnZhbGlkIHR5cGUsIGV4cGVjdGVkIFwiK3QpfWZ1bmN0aW9uIGkoZSxyKXtBcnJheS5pc0FycmF5KGYpP1MoZi5sZW5ndGg9PT1lLFwibXVzdCBoYXZlIGxlbmd0aCBcIitlKTpuKHMuaXNBcnJheUxpa2UrXCIoXCIrZitcIikmJlwiK2YrXCIubGVuZ3RoPT09XCIrZSxcImludmFsaWQgdmVjdG9yLCBzaG91bGQgaGF2ZSBsZW5ndGggXCIrZSx0LmNvbW1hbmRTdHIpfWZ1bmN0aW9uIG8oZSl7UyghQXJyYXkuaXNBcnJheShmKSxcIm11c3Qgbm90IHNwZWNpZnkgYSB2YWx1ZSB0eXBlXCIpLG4oXCJ0eXBlb2YgXCIrZisnPT09XCJmdW5jdGlvblwiJiYnK2YrJy5fcmVnbFR5cGU9PT1cInRleHR1cmUnKygzNTUzPT09ZT9cIjJkXCI6XCJDdWJlXCIpKydcIicsXCJpbnZhbGlkIHRleHR1cmUgdHlwZVwiLHQuY29tbWFuZFN0cil9c3dpdGNoKGQpe2Nhc2UgNTEyNDpyKFwibnVtYmVyXCIpO2JyZWFrO2Nhc2UgMzU2Njc6aSgyKTticmVhaztjYXNlIDM1NjY4OmkoMyk7YnJlYWs7Y2FzZSAzNTY2OTppKDQpO2JyZWFrO2Nhc2UgNTEyNjpyKFwibnVtYmVyXCIpO2JyZWFrO2Nhc2UgMzU2NjQ6aSgyKTticmVhaztjYXNlIDM1NjY1OmkoMyk7YnJlYWs7Y2FzZSAzNTY2NjppKDQpO2JyZWFrO2Nhc2UgMzU2NzA6cihcImJvb2xlYW5cIik7YnJlYWs7Y2FzZSAzNTY3MTppKDIpO2JyZWFrO2Nhc2UgMzU2NzI6aSgzKTticmVhaztjYXNlIDM1NjczOmNhc2UgMzU2NzQ6aSg0KTticmVhaztjYXNlIDM1Njc1OmkoOSk7YnJlYWs7Y2FzZSAzNTY3NjppKDE2KTticmVhaztjYXNlIDM1Njc4Om8oMzU1Myk7YnJlYWs7Y2FzZSAzNTY4MDpvKDM0MDY3KX19KSk7dmFyIHg9MTtzd2l0Y2goZCl7Y2FzZSAzNTY3ODpjYXNlIDM1NjgwOnZhciB3PWUuZGVmKGYsXCIuX3RleHR1cmVcIik7ZSh1LFwiLnVuaWZvcm0xaShcIixnLFwiLFwiLHcsXCIuYmluZCgpKTtcIiksZS5leGl0KHcsXCIudW5iaW5kKCk7XCIpO2NvbnRpbnVlO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOmE9XCIxaVwiO2JyZWFrO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTphPVwiMmlcIix4PTI7YnJlYWs7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOmE9XCIzaVwiLHg9MzticmVhaztjYXNlIDM1NjY5OmNhc2UgMzU2NzM6YT1cIjRpXCIseD00O2JyZWFrO2Nhc2UgNTEyNjphPVwiMWZcIjticmVhaztjYXNlIDM1NjY0OmE9XCIyZlwiLHg9MjticmVhaztjYXNlIDM1NjY1OmE9XCIzZlwiLHg9MzticmVhaztjYXNlIDM1NjY2OmE9XCI0ZlwiLHg9NDticmVhaztjYXNlIDM1Njc0OmE9XCJNYXRyaXgyZnZcIjticmVhaztjYXNlIDM1Njc1OmE9XCJNYXRyaXgzZnZcIjticmVhaztjYXNlIDM1Njc2OmE9XCJNYXRyaXg0ZnZcIn1pZihlKHUsXCIudW5pZm9ybVwiLGEsXCIoXCIsZyxcIixcIiksXCJNXCI9PT1hLmNoYXJBdCgwKSl7dmFyIEU9TWF0aC5wb3coZC0zNTY3NCsyLDIpLF89dC5nbG9iYWwuZGVmKFwibmV3IEZsb2F0MzJBcnJheShcIixFLFwiKVwiKTtBcnJheS5pc0FycmF5KGYpP2UoXCJmYWxzZSwoXCIsaihFLChmdW5jdGlvbih0KXtyZXR1cm4gXytcIltcIit0K1wiXT1cIitmW3RdfSkpLFwiLFwiLF8sXCIpXCIpOmUoXCJmYWxzZSwoQXJyYXkuaXNBcnJheShcIixmLFwiKXx8XCIsZixcIiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSk/XCIsZixcIjooXCIsaihFLChmdW5jdGlvbih0KXtyZXR1cm4gXytcIltcIit0K1wiXT1cIitmK1wiW1wiK3QrXCJdXCJ9KSksXCIsXCIsXyxcIilcIil9ZWxzZSB4PjE/ZShqKHgsKGZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5KGYpP2ZbdF06ZitcIltcIit0K1wiXVwifSkpKTooUyghQXJyYXkuaXNBcnJheShmKSxcInVuaWZvcm0gdmFsdWUgbXVzdCBub3QgYmUgYW4gYXJyYXlcIiksZShmKSk7ZShcIik7XCIpfX1mdW5jdGlvbiBZKHQsZSxuLHIpe3ZhciBpPXQuc2hhcmVkLG89aS5nbCxhPWkuZHJhdyxzPXIuZHJhdyx1PWZ1bmN0aW9uKCl7dmFyIGksdT1zLmVsZW1lbnRzLGM9ZTtyZXR1cm4gdT8oKHUuY29udGV4dERlcCYmci5jb250ZXh0RHluYW1pY3x8dS5wcm9wRGVwKSYmKGM9biksaT11LmFwcGVuZCh0LGMpKTppPWMuZGVmKGEsXCIuXCIsenQpLGkmJmMoXCJpZihcIitpK1wiKVwiK28rXCIuYmluZEJ1ZmZlcigzNDk2MyxcIitpK1wiLmJ1ZmZlci5idWZmZXIpO1wiKSxpfSgpO2Z1bmN0aW9uIGMoaSl7dmFyIG89c1tpXTtyZXR1cm4gbz9vLmNvbnRleHREZXAmJnIuY29udGV4dER5bmFtaWN8fG8ucHJvcERlcD9vLmFwcGVuZCh0LG4pOm8uYXBwZW5kKHQsZSk6ZS5kZWYoYSxcIi5cIixpKX12YXIgZixsLGg9YyhWdCksZD1jKFh0KSxwPWZ1bmN0aW9uKCl7dmFyIGksbz1zLmNvdW50LHU9ZTtyZXR1cm4gbz8oKG8uY29udGV4dERlcCYmci5jb250ZXh0RHluYW1pY3x8by5wcm9wRGVwKSYmKHU9biksaT1vLmFwcGVuZCh0LHUpLFMub3B0aW9uYWwoKGZ1bmN0aW9uKCl7by5NSVNTSU5HJiZ0LmFzc2VydChlLFwiZmFsc2VcIixcIm1pc3NpbmcgdmVydGV4IGNvdW50XCIpLG8uRFlOQU1JQyYmdC5hc3NlcnQodSxpK1wiPj0wXCIsXCJtaXNzaW5nIHZlcnRleCBjb3VudFwiKX0pKSk6KGk9dS5kZWYoYSxcIi5cIixXdCksUy5vcHRpb25hbCgoZnVuY3Rpb24oKXt0LmFzc2VydCh1LGkrXCI+PTBcIixcIm1pc3NpbmcgdmVydGV4IGNvdW50XCIpfSkpKSxpfSgpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBwKXtpZigwPT09cClyZXR1cm59ZWxzZSBuKFwiaWYoXCIscCxcIil7XCIpLG4uZXhpdChcIn1cIik7YiYmKGY9YyhZdCksbD10Lmluc3RhbmNpbmcpO3ZhciBnPXUrXCIudHlwZVwiLHY9cy5lbGVtZW50cyYmYWUocy5lbGVtZW50cyk7ZnVuY3Rpb24geSgpe2Z1bmN0aW9uIHQoKXtuKGwsXCIuZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUoXCIsW2gscCxnLGQrXCI8PCgoXCIrZytcIi01MTIxKT4+MSlcIixmXSxcIik7XCIpfWZ1bmN0aW9uIGUoKXtuKGwsXCIuZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFKFwiLFtoLGQscCxmXSxcIik7XCIpfXU/dj90KCk6KG4oXCJpZihcIix1LFwiKXtcIiksdCgpLG4oXCJ9ZWxzZXtcIiksZSgpLG4oXCJ9XCIpKTplKCl9ZnVuY3Rpb24gbSgpe2Z1bmN0aW9uIHQoKXtuKG8rXCIuZHJhd0VsZW1lbnRzKFwiK1toLHAsZyxkK1wiPDwoKFwiK2crXCItNTEyMSk+PjEpXCJdK1wiKTtcIil9ZnVuY3Rpb24gZSgpe24obytcIi5kcmF3QXJyYXlzKFwiK1toLGQscF0rXCIpO1wiKX11P3Y/dCgpOihuKFwiaWYoXCIsdSxcIil7XCIpLHQoKSxuKFwifWVsc2V7XCIpLGUoKSxuKFwifVwiKSk6ZSgpfWImJihcIm51bWJlclwiIT10eXBlb2YgZnx8Zj49MCk/XCJzdHJpbmdcIj09dHlwZW9mIGY/KG4oXCJpZihcIixmLFwiPjApe1wiKSx5KCksbihcIn1lbHNlIGlmKFwiLGYsXCI8MCl7XCIpLG0oKSxuKFwifVwiKSk6eSgpOm0oKX1mdW5jdGlvbiBIKHQsZSxuLHIsaSl7dmFyIG89TigpLGE9by5wcm9jKFwiYm9keVwiLGkpO3JldHVybiBTLm9wdGlvbmFsKChmdW5jdGlvbigpe28uY29tbWFuZFN0cj1lLmNvbW1hbmRTdHIsby5jb21tYW5kPW8ubGluayhlLmNvbW1hbmRTdHIpfSkpLGImJihvLmluc3RhbmNpbmc9YS5kZWYoby5zaGFyZWQuZXh0ZW5zaW9ucyxcIi5hbmdsZV9pbnN0YW5jZWRfYXJyYXlzXCIpKSx0KG8sYSxuLHIpLG8uY29tcGlsZSgpLmJvZHl9ZnVuY3Rpb24gcSh0LGUsbixyKXtVKHQsZSksbi51c2VWQU8/bi5kcmF3VkFPP2UodC5zaGFyZWQudmFvLFwiLnNldFZBTyhcIixuLmRyYXdWQU8uYXBwZW5kKHQsZSksXCIpO1wiKTplKHQuc2hhcmVkLnZhbyxcIi5zZXRWQU8oXCIsdC5zaGFyZWQudmFvLFwiLnRhcmdldFZBTyk7XCIpOihlKHQuc2hhcmVkLnZhbyxcIi5zZXRWQU8obnVsbCk7XCIpLFcodCxlLG4sci5hdHRyaWJ1dGVzLChmdW5jdGlvbigpe3JldHVybiEwfSkpKSxYKHQsZSxuLHIudW5pZm9ybXMsKGZ1bmN0aW9uKCl7cmV0dXJuITB9KSksWSh0LGUsZSxuKX1mdW5jdGlvbiBLKHQsZSxuLHIpe2Z1bmN0aW9uIGkoKXtyZXR1cm4hMH10LmJhdGNoSWQ9XCJhMVwiLFUodCxlKSxXKHQsZSxuLHIuYXR0cmlidXRlcyxpKSxYKHQsZSxuLHIudW5pZm9ybXMsaSksWSh0LGUsZSxuKX1mdW5jdGlvbiBRKHQsZSxuLHIpe1UodCxlKTt2YXIgaT1uLmNvbnRleHREZXAsbz1lLmRlZigpLGE9ZS5kZWYoKTt0LnNoYXJlZC5wcm9wcz1hLHQuYmF0Y2hJZD1vO3ZhciBzPXQuc2NvcGUoKSx1PXQuc2NvcGUoKTtmdW5jdGlvbiBjKHQpe3JldHVybiB0LmNvbnRleHREZXAmJml8fHQucHJvcERlcH1mdW5jdGlvbiBmKHQpe3JldHVybiFjKHQpfWlmKGUocy5lbnRyeSxcImZvcihcIixvLFwiPTA7XCIsbyxcIjxcIixcImExXCIsXCI7KytcIixvLFwiKXtcIixhLFwiPVwiLFwiYTBcIixcIltcIixvLFwiXTtcIix1LFwifVwiLHMuZXhpdCksbi5uZWVkc0NvbnRleHQmJkwodCx1LG4uY29udGV4dCksbi5uZWVkc0ZyYW1lYnVmZmVyJiZCKHQsdSxuLmZyYW1lYnVmZmVyKSxGKHQsdSxuLnN0YXRlLGMpLG4ucHJvZmlsZSYmYyhuLnByb2ZpbGUpJiZWKHQsdSxuLCExLCEwKSxyKW4udXNlVkFPP24uZHJhd1ZBTz9jKG4uZHJhd1ZBTyk/dSh0LnNoYXJlZC52YW8sXCIuc2V0VkFPKFwiLG4uZHJhd1ZBTy5hcHBlbmQodCx1KSxcIik7XCIpOnModC5zaGFyZWQudmFvLFwiLnNldFZBTyhcIixuLmRyYXdWQU8uYXBwZW5kKHQscyksXCIpO1wiKTpzKHQuc2hhcmVkLnZhbyxcIi5zZXRWQU8oXCIsdC5zaGFyZWQudmFvLFwiLnRhcmdldFZBTyk7XCIpOihzKHQuc2hhcmVkLnZhbyxcIi5zZXRWQU8obnVsbCk7XCIpLFcodCxzLG4sci5hdHRyaWJ1dGVzLGYpLFcodCx1LG4sci5hdHRyaWJ1dGVzLGMpKSxYKHQscyxuLHIudW5pZm9ybXMsZiksWCh0LHUsbixyLnVuaWZvcm1zLGMpLFkodCxzLHUsbik7ZWxzZXt2YXIgbD10Lmdsb2JhbC5kZWYoXCJ7fVwiKSxoPW4uc2hhZGVyLnByb2dWYXIuYXBwZW5kKHQsdSksZD11LmRlZihoLFwiLmlkXCIpLHA9dS5kZWYobCxcIltcIixkLFwiXVwiKTt1KHQuc2hhcmVkLmdsLFwiLnVzZVByb2dyYW0oXCIsaCxcIi5wcm9ncmFtKTtcIixcImlmKCFcIixwLFwiKXtcIixwLFwiPVwiLGwsXCJbXCIsZCxcIl09XCIsdC5saW5rKChmdW5jdGlvbihlKXtyZXR1cm4gSChLLHQsbixlLDIpfSkpLFwiKFwiLGgsXCIpO31cIixwLFwiLmNhbGwodGhpcyxhMFtcIixvLFwiXSxcIixvLFwiKTtcIil9fWZ1bmN0aW9uIEoodCxlLG4pe3ZhciByPWUuc3RhdGljW25dO2lmKHImJmZ1bmN0aW9uKHQpe2lmKFwib2JqZWN0XCI9PT1hKHQpJiYhdHQodCkpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyh0KSxuPTA7bjxlLmxlbmd0aDsrK24paWYoTS5pc0R5bmFtaWModFtlW25dXSkpcmV0dXJuITA7cmV0dXJuITF9fShyKSl7dmFyIGk9dC5nbG9iYWwsbz1PYmplY3Qua2V5cyhyKSxzPSExLHU9ITEsYz0hMSxmPXQuZ2xvYmFsLmRlZihcInt9XCIpO28uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49cltlXTtpZihNLmlzRHluYW1pYyhuKSl7XCJmdW5jdGlvblwiPT10eXBlb2YgbiYmKG49cltlXT1NLnVuYm94KG4pKTt2YXIgbz11ZShuLG51bGwpO3M9c3x8by50aGlzRGVwLGM9Y3x8by5wcm9wRGVwLHU9dXx8by5jb250ZXh0RGVwfWVsc2V7c3dpdGNoKGkoZixcIi5cIixlLFwiPVwiKSxhKG4pKXtjYXNlXCJudW1iZXJcIjppKG4pO2JyZWFrO2Nhc2VcInN0cmluZ1wiOmkoJ1wiJyxuLCdcIicpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOkFycmF5LmlzQXJyYXkobikmJmkoXCJbXCIsbi5qb2luKCksXCJdXCIpO2JyZWFrO2RlZmF1bHQ6aSh0LmxpbmsobikpfWkoXCI7XCIpfX0pKSxlLmR5bmFtaWNbbl09bmV3IE0uRHluYW1pY1ZhcmlhYmxlKDQse3RoaXNEZXA6cyxjb250ZXh0RGVwOnUscHJvcERlcDpjLHJlZjpmLGFwcGVuZDpmdW5jdGlvbih0LGUpe28uZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIGk9cltuXTtpZihNLmlzRHluYW1pYyhpKSl7dmFyIG89dC5pbnZva2UoZSxpKTtlKGYsXCIuXCIsbixcIj1cIixvLFwiO1wiKX19KSl9fSksZGVsZXRlIGUuc3RhdGljW25dfX1yZXR1cm57bmV4dDpFLGN1cnJlbnQ6dyxwcm9jczpmdW5jdGlvbigpe3ZhciB0PU4oKSxlPXQucHJvYyhcInBvbGxcIiksbj10LnByb2MoXCJyZWZyZXNoXCIpLG89dC5ibG9jaygpO2UobyksbihvKTt2YXIgYSxzPXQuc2hhcmVkLHU9cy5nbCxjPXMubmV4dCxmPXMuY3VycmVudDtvKGYsXCIuZGlydHk9ZmFsc2U7XCIpLEIodCxlKSxCKHQsbixudWxsLCEwKSxiJiYoYT10LmxpbmsoYikpLHIub2VzX3ZlcnRleF9hcnJheV9vYmplY3QmJm4odC5saW5rKHIub2VzX3ZlcnRleF9hcnJheV9vYmplY3QpLFwiLmJpbmRWZXJ0ZXhBcnJheU9FUyhudWxsKTtcIik7Zm9yKHZhciBsPTA7bDxpLm1heEF0dHJpYnV0ZXM7KytsKXt2YXIgaD1uLmRlZihzLmF0dHJpYnV0ZXMsXCJbXCIsbCxcIl1cIiksZD10LmNvbmQoaCxcIi5idWZmZXJcIik7ZC50aGVuKHUsXCIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoXCIsbCxcIik7XCIsdSxcIi5iaW5kQnVmZmVyKFwiLDM0OTYyLFwiLFwiLGgsXCIuYnVmZmVyLmJ1ZmZlcik7XCIsdSxcIi52ZXJ0ZXhBdHRyaWJQb2ludGVyKFwiLGwsXCIsXCIsaCxcIi5zaXplLFwiLGgsXCIudHlwZSxcIixoLFwiLm5vcm1hbGl6ZWQsXCIsaCxcIi5zdHJpZGUsXCIsaCxcIi5vZmZzZXQpO1wiKS5lbHNlKHUsXCIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KFwiLGwsXCIpO1wiLHUsXCIudmVydGV4QXR0cmliNGYoXCIsbCxcIixcIixoLFwiLngsXCIsaCxcIi55LFwiLGgsXCIueixcIixoLFwiLncpO1wiLGgsXCIuYnVmZmVyPW51bGw7XCIpLG4oZCksYiYmbihhLFwiLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRShcIixsLFwiLFwiLGgsXCIuZGl2aXNvcik7XCIpfXJldHVybiBuKHQuc2hhcmVkLnZhbyxcIi5jdXJyZW50VkFPPW51bGw7XCIsdC5zaGFyZWQudmFvLFwiLnNldFZBTyhcIix0LnNoYXJlZC52YW8sXCIudGFyZ2V0VkFPKTtcIiksT2JqZWN0LmtleXMoTykuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIGk9T1tyXSxhPW8uZGVmKGMsXCIuXCIscikscz10LmJsb2NrKCk7cyhcImlmKFwiLGEsXCIpe1wiLHUsXCIuZW5hYmxlKFwiLGksXCIpfWVsc2V7XCIsdSxcIi5kaXNhYmxlKFwiLGksXCIpfVwiLGYsXCIuXCIscixcIj1cIixhLFwiO1wiKSxuKHMpLGUoXCJpZihcIixhLFwiIT09XCIsZixcIi5cIixyLFwiKXtcIixzLFwifVwiKX0pKSxPYmplY3Qua2V5cyhrKS5mb3JFYWNoKChmdW5jdGlvbihyKXt2YXIgaSxhLHM9a1tyXSxsPXdbcl0saD10LmJsb2NrKCk7aWYoaCh1LFwiLlwiLHMsXCIoXCIpLHR0KGwpKXt2YXIgZD1sLmxlbmd0aDtpPXQuZ2xvYmFsLmRlZihjLFwiLlwiLHIpLGE9dC5nbG9iYWwuZGVmKGYsXCIuXCIsciksaChqKGQsKGZ1bmN0aW9uKHQpe3JldHVybiBpK1wiW1wiK3QrXCJdXCJ9KSksXCIpO1wiLGooZCwoZnVuY3Rpb24odCl7cmV0dXJuIGErXCJbXCIrdCtcIl09XCIraStcIltcIit0K1wiXTtcIn0pKS5qb2luKFwiXCIpKSxlKFwiaWYoXCIsaihkLChmdW5jdGlvbih0KXtyZXR1cm4gaStcIltcIit0K1wiXSE9PVwiK2ErXCJbXCIrdCtcIl1cIn0pKS5qb2luKFwifHxcIiksXCIpe1wiLGgsXCJ9XCIpfWVsc2UgaT1vLmRlZihjLFwiLlwiLHIpLGE9by5kZWYoZixcIi5cIixyKSxoKGksXCIpO1wiLGYsXCIuXCIscixcIj1cIixpLFwiO1wiKSxlKFwiaWYoXCIsaSxcIiE9PVwiLGEsXCIpe1wiLGgsXCJ9XCIpO24oaCl9KSksdC5jb21waWxlKCl9KCksY29tcGlsZTpmdW5jdGlvbih0LHIsaSxvLGEpe3ZhciBzPU4oKTtzLnN0YXRzPXMubGluayhhKSxPYmplY3Qua2V5cyhyLnN0YXRpYykuZm9yRWFjaCgoZnVuY3Rpb24odCl7SihzLHIsdCl9KSksWnQuZm9yRWFjaCgoZnVuY3Rpb24oZSl7SihzLHQsZSl9KSk7dmFyIHU9Uih0LHIsaSxvLHMpO3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXQucHJvYyhcImRyYXdcIiwxKTtVKHQsbiksTCh0LG4sZS5jb250ZXh0KSxCKHQsbixlLmZyYW1lYnVmZmVyKSxHKHQsbixlKSxGKHQsbixlLnN0YXRlKSxWKHQsbixlLCExLCEwKTt2YXIgcj1lLnNoYWRlci5wcm9nVmFyLmFwcGVuZCh0LG4pO2lmKG4odC5zaGFyZWQuZ2wsXCIudXNlUHJvZ3JhbShcIixyLFwiLnByb2dyYW0pO1wiKSxlLnNoYWRlci5wcm9ncmFtKXEodCxuLGUsZS5zaGFkZXIucHJvZ3JhbSk7ZWxzZXtuKHQuc2hhcmVkLnZhbyxcIi5zZXRWQU8obnVsbCk7XCIpO3ZhciBpPXQuZ2xvYmFsLmRlZihcInt9XCIpLG89bi5kZWYocixcIi5pZFwiKSxhPW4uZGVmKGksXCJbXCIsbyxcIl1cIik7bih0LmNvbmQoYSkudGhlbihhLFwiLmNhbGwodGhpcyxhMCk7XCIpLmVsc2UoYSxcIj1cIixpLFwiW1wiLG8sXCJdPVwiLHQubGluaygoZnVuY3Rpb24obil7cmV0dXJuIEgocSx0LGUsbiwxKX0pKSxcIihcIixyLFwiKTtcIixhLFwiLmNhbGwodGhpcyxhMCk7XCIpKX1PYmplY3Qua2V5cyhlLnN0YXRlKS5sZW5ndGg+MCYmbih0LnNoYXJlZC5jdXJyZW50LFwiLmRpcnR5PXRydWU7XCIpfShzLHUpLGZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5wcm9jKFwic2NvcGVcIiwzKTt0LmJhdGNoSWQ9XCJhMlwiO3ZhciBpPXQuc2hhcmVkLG89aS5jdXJyZW50O2Z1bmN0aW9uIGEobil7dmFyIG89ZS5zaGFkZXJbbl07byYmci5zZXQoaS5zaGFkZXIsXCIuXCIrbixvLmFwcGVuZCh0LHIpKX1MKHQscixlLmNvbnRleHQpLGUuZnJhbWVidWZmZXImJmUuZnJhbWVidWZmZXIuYXBwZW5kKHQsciksaWUoT2JqZWN0LmtleXMoZS5zdGF0ZSkpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBvPWUuc3RhdGVbbl0uYXBwZW5kKHQscik7dHQobyk/by5mb3JFYWNoKChmdW5jdGlvbihlLGkpe3Iuc2V0KHQubmV4dFtuXSxcIltcIitpK1wiXVwiLGUpfSkpOnIuc2V0KGkubmV4dCxcIi5cIituLG8pfSkpLFYodCxyLGUsITAsITApLFt6dCxYdCxXdCxZdCxWdF0uZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIG89ZS5kcmF3W25dO28mJnIuc2V0KGkuZHJhdyxcIi5cIituLFwiXCIrby5hcHBlbmQodCxyKSl9KSksT2JqZWN0LmtleXMoZS51bmlmb3JtcykuZm9yRWFjaCgoZnVuY3Rpb24obyl7dmFyIGE9ZS51bmlmb3Jtc1tvXS5hcHBlbmQodCxyKTtBcnJheS5pc0FycmF5KGEpJiYoYT1cIltcIithLmpvaW4oKStcIl1cIiksci5zZXQoaS51bmlmb3JtcyxcIltcIituLmlkKG8pK1wiXVwiLGEpfSkpLE9iamVjdC5rZXlzKGUuYXR0cmlidXRlcykuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIGk9ZS5hdHRyaWJ1dGVzW25dLmFwcGVuZCh0LHIpLG89dC5zY29wZUF0dHJpYihuKTtPYmplY3Qua2V5cyhuZXcgeSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7ci5zZXQobyxcIi5cIit0LGlbdF0pfSkpfSkpLGUuc2NvcGVWQU8mJnIuc2V0KGkudmFvLFwiLnRhcmdldFZBT1wiLGUuc2NvcGVWQU8uYXBwZW5kKHQscikpLGEoRnQpLGEoVXQpLE9iamVjdC5rZXlzKGUuc3RhdGUpLmxlbmd0aD4wJiYocihvLFwiLmRpcnR5PXRydWU7XCIpLHIuZXhpdChvLFwiLmRpcnR5PXRydWU7XCIpKSxyKFwiYTEoXCIsdC5zaGFyZWQuY29udGV4dCxcIixhMCxcIix0LmJhdGNoSWQsXCIpO1wiKX0ocyx1KSxmdW5jdGlvbih0LGUpe3ZhciBuPXQucHJvYyhcImJhdGNoXCIsMik7dC5iYXRjaElkPVwiMFwiLFUodCxuKTt2YXIgcj0hMSxpPSEwO09iamVjdC5rZXlzKGUuY29udGV4dCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cj1yfHxlLmNvbnRleHRbdF0ucHJvcERlcH0pKSxyfHwoTCh0LG4sZS5jb250ZXh0KSxpPSExKTt2YXIgbz1lLmZyYW1lYnVmZmVyLGE9ITE7ZnVuY3Rpb24gcyh0KXtyZXR1cm4gdC5jb250ZXh0RGVwJiZyfHx0LnByb3BEZXB9bz8oby5wcm9wRGVwP3I9YT0hMDpvLmNvbnRleHREZXAmJnImJihhPSEwKSxhfHxCKHQsbixvKSk6Qih0LG4sbnVsbCksZS5zdGF0ZS52aWV3cG9ydCYmZS5zdGF0ZS52aWV3cG9ydC5wcm9wRGVwJiYocj0hMCksRyh0LG4sZSksRih0LG4sZS5zdGF0ZSwoZnVuY3Rpb24odCl7cmV0dXJuIXModCl9KSksZS5wcm9maWxlJiZzKGUucHJvZmlsZSl8fFYodCxuLGUsITEsXCJhMVwiKSxlLmNvbnRleHREZXA9cixlLm5lZWRzQ29udGV4dD1pLGUubmVlZHNGcmFtZWJ1ZmZlcj1hO3ZhciB1PWUuc2hhZGVyLnByb2dWYXI7aWYodS5jb250ZXh0RGVwJiZyfHx1LnByb3BEZXApUSh0LG4sZSxudWxsKTtlbHNle3ZhciBjPXUuYXBwZW5kKHQsbik7aWYobih0LnNoYXJlZC5nbCxcIi51c2VQcm9ncmFtKFwiLGMsXCIucHJvZ3JhbSk7XCIpLGUuc2hhZGVyLnByb2dyYW0pUSh0LG4sZSxlLnNoYWRlci5wcm9ncmFtKTtlbHNle24odC5zaGFyZWQudmFvLFwiLnNldFZBTyhudWxsKTtcIik7dmFyIGY9dC5nbG9iYWwuZGVmKFwie31cIiksbD1uLmRlZihjLFwiLmlkXCIpLGg9bi5kZWYoZixcIltcIixsLFwiXVwiKTtuKHQuY29uZChoKS50aGVuKGgsXCIuY2FsbCh0aGlzLGEwLGExKTtcIikuZWxzZShoLFwiPVwiLGYsXCJbXCIsbCxcIl09XCIsdC5saW5rKChmdW5jdGlvbihuKXtyZXR1cm4gSChRLHQsZSxuLDIpfSkpLFwiKFwiLGMsXCIpO1wiLGgsXCIuY2FsbCh0aGlzLGEwLGExKTtcIikpfX1PYmplY3Qua2V5cyhlLnN0YXRlKS5sZW5ndGg+MCYmbih0LnNoYXJlZC5jdXJyZW50LFwiLmRpcnR5PXRydWU7XCIpfShzLHUpLGUocy5jb21waWxlKCkse2Rlc3Ryb3k6ZnVuY3Rpb24oKXt1LnNoYWRlci5wcm9ncmFtLmRlc3Ryb3koKX19KX19fXZhciBsZT1mdW5jdGlvbih0LGUpe2lmKCFlLmV4dF9kaXNqb2ludF90aW1lcl9xdWVyeSlyZXR1cm4gbnVsbDt2YXIgbj1bXTtmdW5jdGlvbiByKHQpe24ucHVzaCh0KX12YXIgaT1bXTtmdW5jdGlvbiBvKCl7dGhpcy5zdGFydFF1ZXJ5SW5kZXg9LTEsdGhpcy5lbmRRdWVyeUluZGV4PS0xLHRoaXMuc3VtPTAsdGhpcy5zdGF0cz1udWxsfXZhciBhPVtdO2Z1bmN0aW9uIHModCl7YS5wdXNoKHQpfXZhciB1PVtdO2Z1bmN0aW9uIGModCxlLG4pe3ZhciByPWEucG9wKCl8fG5ldyBvO3Iuc3RhcnRRdWVyeUluZGV4PXQsci5lbmRRdWVyeUluZGV4PWUsci5zdW09MCxyLnN0YXRzPW4sdS5wdXNoKHIpfXZhciBmPVtdLGw9W107cmV0dXJue2JlZ2luUXVlcnk6ZnVuY3Rpb24odCl7dmFyIHI9bi5wb3AoKXx8ZS5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkuY3JlYXRlUXVlcnlFWFQoKTtlLmV4dF9kaXNqb2ludF90aW1lcl9xdWVyeS5iZWdpblF1ZXJ5RVhUKDM1MDA3LHIpLGkucHVzaChyKSxjKGkubGVuZ3RoLTEsaS5sZW5ndGgsdCl9LGVuZFF1ZXJ5OmZ1bmN0aW9uKCl7ZS5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkuZW5kUXVlcnlFWFQoMzUwMDcpfSxwdXNoU2NvcGVTdGF0czpjLHVwZGF0ZTpmdW5jdGlvbigpe3ZhciB0LG4sbz1pLmxlbmd0aDtpZigwIT09byl7bC5sZW5ndGg9TWF0aC5tYXgobC5sZW5ndGgsbysxKSxmLmxlbmd0aD1NYXRoLm1heChmLmxlbmd0aCxvKzEpLGZbMF09MCxsWzBdPTA7dmFyIGE9MDtmb3IodD0wLG49MDtuPGkubGVuZ3RoOysrbil7dmFyIGM9aVtuXTtlLmV4dF9kaXNqb2ludF90aW1lcl9xdWVyeS5nZXRRdWVyeU9iamVjdEVYVChjLDM0OTE5KT8oYSs9ZS5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkuZ2V0UXVlcnlPYmplY3RFWFQoYywzNDkxOCkscihjKSk6aVt0KytdPWMsZltuKzFdPWEsbFtuKzFdPXR9Zm9yKGkubGVuZ3RoPXQsdD0wLG49MDtuPHUubGVuZ3RoOysrbil7dmFyIGg9dVtuXSxkPWguc3RhcnRRdWVyeUluZGV4LHA9aC5lbmRRdWVyeUluZGV4O2guc3VtKz1mW3BdLWZbZF07dmFyIGc9bFtkXSx2PWxbcF07dj09PWc/KGguc3RhdHMuZ3B1VGltZSs9aC5zdW0vMWU2LHMoaCkpOihoLnN0YXJ0UXVlcnlJbmRleD1nLGguZW5kUXVlcnlJbmRleD12LHVbdCsrXT1oKX11Lmxlbmd0aD10fX0sZ2V0TnVtUGVuZGluZ1F1ZXJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5sZW5ndGh9LGNsZWFyOmZ1bmN0aW9uKCl7bi5wdXNoLmFwcGx5KG4saSk7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0KyspZS5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkuZGVsZXRlUXVlcnlFWFQoblt0XSk7aS5sZW5ndGg9MCxuLmxlbmd0aD0wfSxyZXN0b3JlOmZ1bmN0aW9uKCl7aS5sZW5ndGg9MCxuLmxlbmd0aD0wfX19O2Z1bmN0aW9uIGhlKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDsrK24paWYodFtuXT09PWUpcmV0dXJuIG47cmV0dXJuLTF9cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciByPVAobik7aWYoIXIpcmV0dXJuIG51bGw7dmFyIGk9ci5nbCxvPWkuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKSxzPWkuaXNDb250ZXh0TG9zdCgpLHU9ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmdW5jdGlvbiByKGUpe1MudHlwZShlLFwic3RyaW5nXCIsXCJleHRlbnNpb24gbmFtZSBtdXN0IGJlIHN0cmluZ1wiKTt2YXIgcixpPWUudG9Mb3dlckNhc2UoKTt0cnl7cj1uW2ldPXQuZ2V0RXh0ZW5zaW9uKGkpfWNhdGNoKHQpe31yZXR1cm4hIXJ9Zm9yKHZhciBpPTA7aTxlLmV4dGVuc2lvbnMubGVuZ3RoOysraSl7dmFyIG89ZS5leHRlbnNpb25zW2ldO2lmKCFyKG8pKXJldHVybiBlLm9uRGVzdHJveSgpLGUub25Eb25lKCdcIicrbysnXCIgZXh0ZW5zaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgV2ViR0wgY29udGV4dCwgdHJ5IHVwZ3JhZGluZyB5b3VyIHN5c3RlbSBvciBhIGRpZmZlcmVudCBicm93c2VyJyksbnVsbH1yZXR1cm4gZS5vcHRpb25hbEV4dGVuc2lvbnMuZm9yRWFjaChyKSx7ZXh0ZW5zaW9uczpuLHJlc3RvcmU6ZnVuY3Rpb24oKXtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZihuW3RdJiYhcih0KSl0aHJvdyBuZXcgRXJyb3IoXCIocmVnbCk6IGVycm9yIHJlc3RvcmluZyBleHRlbnNpb24gXCIrdCl9KSl9fX0oaSxyKTtpZighdSlyZXR1cm4gbnVsbDt2YXIgYyxmLGw9KGM9e1wiXCI6MH0sZj1bXCJcIl0se2lkOmZ1bmN0aW9uKHQpe3ZhciBlPWNbdF07cmV0dXJuIGV8fChlPWNbdF09Zi5sZW5ndGgsZi5wdXNoKHQpLGUpfSxzdHI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdF19fSksaD17dmFvQ291bnQ6MCxidWZmZXJDb3VudDowLGVsZW1lbnRzQ291bnQ6MCxmcmFtZWJ1ZmZlckNvdW50OjAsc2hhZGVyQ291bnQ6MCx0ZXh0dXJlQ291bnQ6MCxjdWJlQ291bnQ6MCxyZW5kZXJidWZmZXJDb3VudDowLG1heFRleHR1cmVVbml0czowfSxkPXUuZXh0ZW5zaW9ucyxwPWxlKDAsZCksZz1UKCksdj1pLmRyYXdpbmdCdWZmZXJXaWR0aCx5PWkuZHJhd2luZ0J1ZmZlckhlaWdodCxtPXt0aWNrOjAsdGltZTowLHZpZXdwb3J0V2lkdGg6dix2aWV3cG9ydEhlaWdodDp5LGZyYW1lYnVmZmVyV2lkdGg6dixmcmFtZWJ1ZmZlckhlaWdodDp5LGRyYXdpbmdCdWZmZXJXaWR0aDp2LGRyYXdpbmdCdWZmZXJIZWlnaHQ6eSxwaXhlbFJhdGlvOnIucGl4ZWxSYXRpb30sYj1mdW5jdGlvbih0LGUpe3ZhciBuPTE7ZS5leHRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMmJihuPXQuZ2V0UGFyYW1ldGVyKDM0MDQ3KSk7dmFyIHI9MSxpPTE7ZS53ZWJnbF9kcmF3X2J1ZmZlcnMmJihyPXQuZ2V0UGFyYW1ldGVyKDM0ODUyKSxpPXQuZ2V0UGFyYW1ldGVyKDM2MDYzKSk7dmFyIG89ISFlLm9lc190ZXh0dXJlX2Zsb2F0O2lmKG8pe3ZhciBhPXQuY3JlYXRlVGV4dHVyZSgpO3QuYmluZFRleHR1cmUoMzU1MyxhKSx0LnRleEltYWdlMkQoMzU1MywwLDY0MDgsMSwxLDAsNjQwOCw1MTI2LG51bGwpO3ZhciBzPXQuY3JlYXRlRnJhbWVidWZmZXIoKTtpZih0LmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxzKSx0LmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDY0LDM1NTMsYSwwKSx0LmJpbmRUZXh0dXJlKDM1NTMsbnVsbCksMzYwNTMhPT10LmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoMzYxNjApKW89ITE7ZWxzZXt0LnZpZXdwb3J0KDAsMCwxLDEpLHQuY2xlYXJDb2xvcigxLDAsMCwxKSx0LmNsZWFyKDE2Mzg0KTt2YXIgdT1SLmFsbG9jVHlwZSg1MTI2LDQpO3QucmVhZFBpeGVscygwLDAsMSwxLDY0MDgsNTEyNix1KSx0LmdldEVycm9yKCk/bz0hMToodC5kZWxldGVGcmFtZWJ1ZmZlcihzKSx0LmRlbGV0ZVRleHR1cmUoYSksbz0xPT09dVswXSksUi5mcmVlVHlwZSh1KX19dmFyIGM9ITA7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIG5hdmlnYXRvcnx8ISgvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8L1RyaWRlbnRcXC8vLnRlc3QobmF2aWdhdG9yLmFwcFZlcnNpb24pfHwvRWRnZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkpe3ZhciBmPXQuY3JlYXRlVGV4dHVyZSgpLGw9Ui5hbGxvY1R5cGUoNTEyMSwzNik7dC5hY3RpdmVUZXh0dXJlKDMzOTg0KSx0LmJpbmRUZXh0dXJlKDM0MDY3LGYpLHQudGV4SW1hZ2UyRCgzNDA2OSwwLDY0MDgsMywzLDAsNjQwOCw1MTIxLGwpLFIuZnJlZVR5cGUobCksdC5iaW5kVGV4dHVyZSgzNDA2NyxudWxsKSx0LmRlbGV0ZVRleHR1cmUoZiksYz0hdC5nZXRFcnJvcigpfXJldHVybntjb2xvckJpdHM6W3QuZ2V0UGFyYW1ldGVyKDM0MTApLHQuZ2V0UGFyYW1ldGVyKDM0MTEpLHQuZ2V0UGFyYW1ldGVyKDM0MTIpLHQuZ2V0UGFyYW1ldGVyKDM0MTMpXSxkZXB0aEJpdHM6dC5nZXRQYXJhbWV0ZXIoMzQxNCksc3RlbmNpbEJpdHM6dC5nZXRQYXJhbWV0ZXIoMzQxNSksc3VicGl4ZWxCaXRzOnQuZ2V0UGFyYW1ldGVyKDM0MDgpLGV4dGVuc2lvbnM6T2JqZWN0LmtleXMoZSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hIWVbdF19KSksbWF4QW5pc290cm9waWM6bixtYXhEcmF3YnVmZmVyczpyLG1heENvbG9yQXR0YWNobWVudHM6aSxwb2ludFNpemVEaW1zOnQuZ2V0UGFyYW1ldGVyKDMzOTAxKSxsaW5lV2lkdGhEaW1zOnQuZ2V0UGFyYW1ldGVyKDMzOTAyKSxtYXhWaWV3cG9ydERpbXM6dC5nZXRQYXJhbWV0ZXIoMzM4NiksbWF4Q29tYmluZWRUZXh0dXJlVW5pdHM6dC5nZXRQYXJhbWV0ZXIoMzU2NjEpLG1heEN1YmVNYXBTaXplOnQuZ2V0UGFyYW1ldGVyKDM0MDc2KSxtYXhSZW5kZXJidWZmZXJTaXplOnQuZ2V0UGFyYW1ldGVyKDM0MDI0KSxtYXhUZXh0dXJlVW5pdHM6dC5nZXRQYXJhbWV0ZXIoMzQ5MzApLG1heFRleHR1cmVTaXplOnQuZ2V0UGFyYW1ldGVyKDMzNzkpLG1heEF0dHJpYnV0ZXM6dC5nZXRQYXJhbWV0ZXIoMzQ5MjEpLG1heFZlcnRleFVuaWZvcm1zOnQuZ2V0UGFyYW1ldGVyKDM2MzQ3KSxtYXhWZXJ0ZXhUZXh0dXJlVW5pdHM6dC5nZXRQYXJhbWV0ZXIoMzU2NjApLG1heFZhcnlpbmdWZWN0b3JzOnQuZ2V0UGFyYW1ldGVyKDM2MzQ4KSxtYXhGcmFnbWVudFVuaWZvcm1zOnQuZ2V0UGFyYW1ldGVyKDM2MzQ5KSxnbHNsOnQuZ2V0UGFyYW1ldGVyKDM1NzI0KSxyZW5kZXJlcjp0LmdldFBhcmFtZXRlcig3OTM3KSx2ZW5kb3I6dC5nZXRQYXJhbWV0ZXIoNzkzNiksdmVyc2lvbjp0LmdldFBhcmFtZXRlcig3OTM4KSxyZWFkRmxvYXQ6byxucG90VGV4dHVyZUN1YmU6Y319KGksZCkseD1mdW5jdGlvbihlLG4scixpKXt2YXIgbz0wLGE9e307ZnVuY3Rpb24gcyh0KXt0aGlzLmlkPW8rKyx0aGlzLmJ1ZmZlcj1lLmNyZWF0ZUJ1ZmZlcigpLHRoaXMudHlwZT10LHRoaXMudXNhZ2U9MzUwNDQsdGhpcy5ieXRlTGVuZ3RoPTAsdGhpcy5kaW1lbnNpb249MSx0aGlzLmR0eXBlPTUxMjEsdGhpcy5wZXJzaXN0ZW50RGF0YT1udWxsLHIucHJvZmlsZSYmKHRoaXMuc3RhdHM9e3NpemU6MH0pfXMucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oKXtlLmJpbmRCdWZmZXIodGhpcy50eXBlLHRoaXMuYnVmZmVyKX0scy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2wodGhpcyl9O3ZhciB1PVtdO2Z1bmN0aW9uIGModCxuLHIpe3QuYnl0ZUxlbmd0aD1uLmJ5dGVMZW5ndGgsZS5idWZmZXJEYXRhKHQudHlwZSxuLHIpfWZ1bmN0aW9uIGYoZSxuLHIsaSxvLGEpe3ZhciBzLHU7aWYoZS51c2FnZT1yLEFycmF5LmlzQXJyYXkobikpe2lmKGUuZHR5cGU9aXx8NTEyNixuLmxlbmd0aD4wKWlmKEFycmF5LmlzQXJyYXkoblswXSkpe3M9WChuKTtmb3IodmFyIGY9MSxsPTE7bDxzLmxlbmd0aDsrK2wpZio9c1tsXTtlLmRpbWVuc2lvbj1mLGMoZSx1PVcobixzLGUuZHR5cGUpLHIpLGE/ZS5wZXJzaXN0ZW50RGF0YT11OlIuZnJlZVR5cGUodSl9ZWxzZSBpZihcIm51bWJlclwiPT10eXBlb2YgblswXSl7ZS5kaW1lbnNpb249bzt2YXIgaD1SLmFsbG9jVHlwZShlLmR0eXBlLG4ubGVuZ3RoKTtxKGgsbiksYyhlLGgsciksYT9lLnBlcnNpc3RlbnREYXRhPWg6Ui5mcmVlVHlwZShoKX1lbHNlIHQoblswXSk/KGUuZGltZW5zaW9uPW5bMF0ubGVuZ3RoLGUuZHR5cGU9aXx8SChuWzBdKXx8NTEyNixjKGUsdT1XKG4sW24ubGVuZ3RoLG5bMF0ubGVuZ3RoXSxlLmR0eXBlKSxyKSxhP2UucGVyc2lzdGVudERhdGE9dTpSLmZyZWVUeXBlKHUpKTpTLnJhaXNlKFwiaW52YWxpZCBidWZmZXIgZGF0YVwiKX1lbHNlIGlmKHQobikpZS5kdHlwZT1pfHxIKG4pLGUuZGltZW5zaW9uPW8sYyhlLG4sciksYSYmKGUucGVyc2lzdGVudERhdGE9bmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQ4QXJyYXkobi5idWZmZXIpKSk7ZWxzZSBpZihMKG4pKXtzPW4uc2hhcGU7dmFyIGQ9bi5zdHJpZGUscD1uLm9mZnNldCxnPTAsdj0wLHk9MCxtPTA7MT09PXMubGVuZ3RoPyhnPXNbMF0sdj0xLHk9ZFswXSxtPTApOjI9PT1zLmxlbmd0aD8oZz1zWzBdLHY9c1sxXSx5PWRbMF0sbT1kWzFdKTpTLnJhaXNlKFwiaW52YWxpZCBzaGFwZVwiKSxlLmR0eXBlPWl8fEgobi5kYXRhKXx8NTEyNixlLmRpbWVuc2lvbj12O3ZhciBiPVIuYWxsb2NUeXBlKGUuZHR5cGUsZyp2KTtLKGIsbi5kYXRhLGcsdix5LG0scCksYyhlLGIsciksYT9lLnBlcnNpc3RlbnREYXRhPWI6Ui5mcmVlVHlwZShiKX1lbHNlIG4gaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj8oZS5kdHlwZT01MTIxLGUuZGltZW5zaW9uPW8sYyhlLG4sciksYSYmKGUucGVyc2lzdGVudERhdGE9bmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQ4QXJyYXkobikpKSk6Uy5yYWlzZShcImludmFsaWQgYnVmZmVyIGRhdGFcIil9ZnVuY3Rpb24gbCh0KXtuLmJ1ZmZlckNvdW50LS0saSh0KTt2YXIgcj10LmJ1ZmZlcjtTKHIsXCJidWZmZXIgbXVzdCBub3QgYmUgZGVsZXRlZCBhbHJlYWR5XCIpLGUuZGVsZXRlQnVmZmVyKHIpLHQuYnVmZmVyPW51bGwsZGVsZXRlIGFbdC5pZF19cmV0dXJuIHIucHJvZmlsZSYmKG4uZ2V0VG90YWxCdWZmZXJTaXplPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gT2JqZWN0LmtleXMoYSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dCs9YVtlXS5zdGF0cy5zaXplfSkpLHR9KSx7Y3JlYXRlOmZ1bmN0aW9uKGksbyx1LGMpe24uYnVmZmVyQ291bnQrKzt2YXIgaD1uZXcgcyhvKTtmdW5jdGlvbiBkKG4pe3ZhciBpPTM1MDQ0LG89bnVsbCxhPTAscz0wLHU9MTtyZXR1cm4gQXJyYXkuaXNBcnJheShuKXx8dChuKXx8TChuKXx8biBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP289bjpcIm51bWJlclwiPT10eXBlb2Ygbj9hPTB8bjpuJiYoUy50eXBlKG4sXCJvYmplY3RcIixcImJ1ZmZlciBhcmd1bWVudHMgbXVzdCBiZSBhbiBvYmplY3QsIGEgbnVtYmVyIG9yIGFuIGFycmF5XCIpLFwiZGF0YVwiaW4gbiYmKFMobnVsbD09PW98fEFycmF5LmlzQXJyYXkobyl8fHQobyl8fEwobyksXCJpbnZhbGlkIGRhdGEgZm9yIGJ1ZmZlclwiKSxvPW4uZGF0YSksXCJ1c2FnZVwiaW4gbiYmKFMucGFyYW1ldGVyKG4udXNhZ2UsVixcImludmFsaWQgYnVmZmVyIHVzYWdlXCIpLGk9VltuLnVzYWdlXSksXCJ0eXBlXCJpbiBuJiYoUy5wYXJhbWV0ZXIobi50eXBlLHosXCJpbnZhbGlkIGJ1ZmZlciB0eXBlXCIpLHM9eltuLnR5cGVdKSxcImRpbWVuc2lvblwiaW4gbiYmKFMudHlwZShuLmRpbWVuc2lvbixcIm51bWJlclwiLFwiaW52YWxpZCBkaW1lbnNpb25cIiksdT0wfG4uZGltZW5zaW9uKSxcImxlbmd0aFwiaW4gbiYmKFMubm5pKGEsXCJidWZmZXIgbGVuZ3RoIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyXCIpLGE9MHxuLmxlbmd0aCkpLGguYmluZCgpLG8/ZihoLG8saSxzLHUsYyk6KGEmJmUuYnVmZmVyRGF0YShoLnR5cGUsYSxpKSxoLmR0eXBlPXN8fDUxMjEsaC51c2FnZT1pLGguZGltZW5zaW9uPXUsaC5ieXRlTGVuZ3RoPWEpLHIucHJvZmlsZSYmKGguc3RhdHMuc2l6ZT1oLmJ5dGVMZW5ndGgqWVtoLmR0eXBlXSksZH1mdW5jdGlvbiBwKHQsbil7UyhuK3QuYnl0ZUxlbmd0aDw9aC5ieXRlTGVuZ3RoLFwiaW52YWxpZCBidWZmZXIgc3ViZGF0YSBjYWxsLCBidWZmZXIgaXMgdG9vIHNtYWxsLiAgQ2FuJ3Qgd3JpdGUgZGF0YSBvZiBzaXplIFwiK3QuYnl0ZUxlbmd0aCtcIiBzdGFydGluZyBmcm9tIG9mZnNldCBcIituK1wiIHRvIGEgYnVmZmVyIG9mIHNpemUgXCIraC5ieXRlTGVuZ3RoKSxlLmJ1ZmZlclN1YkRhdGEoaC50eXBlLG4sdCl9cmV0dXJuIGFbaC5pZF09aCx1fHxkKGkpLGQuX3JlZ2xUeXBlPVwiYnVmZmVyXCIsZC5fYnVmZmVyPWgsZC5zdWJkYXRhPWZ1bmN0aW9uKGUsbil7dmFyIHIsaT0wfChufHwwKTtpZihoLmJpbmQoKSx0KGUpfHxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpcChlLGkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7aWYoZS5sZW5ndGg+MClpZihcIm51bWJlclwiPT10eXBlb2YgZVswXSl7dmFyIG89Ui5hbGxvY1R5cGUoaC5kdHlwZSxlLmxlbmd0aCk7cShvLGUpLHAobyxpKSxSLmZyZWVUeXBlKG8pfWVsc2UgaWYoQXJyYXkuaXNBcnJheShlWzBdKXx8dChlWzBdKSl7cj1YKGUpO3ZhciBhPVcoZSxyLGguZHR5cGUpO3AoYSxpKSxSLmZyZWVUeXBlKGEpfWVsc2UgUy5yYWlzZShcImludmFsaWQgYnVmZmVyIGRhdGFcIil9ZWxzZSBpZihMKGUpKXtyPWUuc2hhcGU7dmFyIHM9ZS5zdHJpZGUsdT0wLGM9MCxmPTAsbD0wOzE9PT1yLmxlbmd0aD8odT1yWzBdLGM9MSxmPXNbMF0sbD0wKToyPT09ci5sZW5ndGg/KHU9clswXSxjPXJbMV0sZj1zWzBdLGw9c1sxXSk6Uy5yYWlzZShcImludmFsaWQgc2hhcGVcIik7dmFyIGc9QXJyYXkuaXNBcnJheShlLmRhdGEpP2guZHR5cGU6SChlLmRhdGEpLHY9Ui5hbGxvY1R5cGUoZyx1KmMpO0sodixlLmRhdGEsdSxjLGYsbCxlLm9mZnNldCkscCh2LGkpLFIuZnJlZVR5cGUodil9ZWxzZSBTLnJhaXNlKFwiaW52YWxpZCBkYXRhIGZvciBidWZmZXIgc3ViZGF0YVwiKTtyZXR1cm4gZH0sci5wcm9maWxlJiYoZC5zdGF0cz1oLnN0YXRzKSxkLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsKGgpfSxkfSxjcmVhdGVTdHJlYW06ZnVuY3Rpb24odCxlKXt2YXIgbj11LnBvcCgpO3JldHVybiBufHwobj1uZXcgcyh0KSksbi5iaW5kKCksZihuLGUsMzUwNDAsMCwxLCExKSxufSxkZXN0cm95U3RyZWFtOmZ1bmN0aW9uKHQpe3UucHVzaCh0KX0sY2xlYXI6ZnVuY3Rpb24oKXtCKGEpLmZvckVhY2gobCksdS5mb3JFYWNoKGwpfSxnZXRCdWZmZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX2J1ZmZlciBpbnN0YW5jZW9mIHM/dC5fYnVmZmVyOm51bGx9LHJlc3RvcmU6ZnVuY3Rpb24oKXtCKGEpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYnVmZmVyPWUuY3JlYXRlQnVmZmVyKCksZS5iaW5kQnVmZmVyKHQudHlwZSx0LmJ1ZmZlciksZS5idWZmZXJEYXRhKHQudHlwZSx0LnBlcnNpc3RlbnREYXRhfHx0LmJ5dGVMZW5ndGgsdC51c2FnZSl9KSl9LF9pbml0QnVmZmVyOmZ9fShpLGgsciwoZnVuY3Rpb24odCl7cmV0dXJuIHcuZGVzdHJveUJ1ZmZlcih0KX0pKSx3PWZ1bmN0aW9uKGUsbixyLGksbyl7Zm9yKHZhciBhPXIubWF4QXR0cmlidXRlcyxzPW5ldyBBcnJheShhKSx1PTA7dTxhOysrdSlzW3VdPW5ldyBqdDt2YXIgYz0wLGY9e30sbD17UmVjb3JkOmp0LHNjb3BlOnt9LHN0YXRlOnMsY3VycmVudFZBTzpudWxsLHRhcmdldFZBTzpudWxsLHJlc3RvcmU6aCgpP2Z1bmN0aW9uKCl7aCgpJiZCKGYpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucmVmcmVzaCgpfSkpfTpmdW5jdGlvbigpe30sY3JlYXRlVkFPOmZ1bmN0aW9uKGUpe3ZhciByPW5ldyBwO2Z1bmN0aW9uIHMoZSl7UyhBcnJheS5pc0FycmF5KGUpLFwiYXJndW1lbnRzIHRvIHZlcnRleCBhcnJheSBjb25zdHJ1Y3RvciBtdXN0IGJlIGFuIGFycmF5XCIpLFMoZS5sZW5ndGg8YSxcInRvbyBtYW55IGF0dHJpYnV0ZXNcIiksUyhlLmxlbmd0aD4wLFwibXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBhdHRyaWJ1dGVcIik7dmFyIGk9e30sdT1yLmF0dHJpYnV0ZXM7dS5sZW5ndGg9ZS5sZW5ndGg7Zm9yKHZhciBjPTA7YzxlLmxlbmd0aDsrK2Mpe3ZhciBmLGw9ZVtjXSxoPXVbY109bmV3IGp0LGQ9bC5kYXRhfHxsO0FycmF5LmlzQXJyYXkoZCl8fHQoZCl8fEwoZCk/KHIuYnVmZmVyc1tjXSYmKGY9ci5idWZmZXJzW2NdLHQoZCkmJmYuX2J1ZmZlci5ieXRlTGVuZ3RoPj1kLmJ5dGVMZW5ndGg/Zi5zdWJkYXRhKGQpOihmLmRlc3Ryb3koKSxyLmJ1ZmZlcnNbY109bnVsbCkpLHIuYnVmZmVyc1tjXXx8KGY9ci5idWZmZXJzW2NdPW8uY3JlYXRlKGwsMzQ5NjIsITEsITApKSxoLmJ1ZmZlcj1vLmdldEJ1ZmZlcihmKSxoLnNpemU9MHxoLmJ1ZmZlci5kaW1lbnNpb24saC5ub3JtYWxpemVkPSExLGgudHlwZT1oLmJ1ZmZlci5kdHlwZSxoLm9mZnNldD0wLGguc3RyaWRlPTAsaC5kaXZpc29yPTAsaC5zdGF0ZT0xLGlbY109MSk6by5nZXRCdWZmZXIobCk/KGguYnVmZmVyPW8uZ2V0QnVmZmVyKGwpLGguc2l6ZT0wfGguYnVmZmVyLmRpbWVuc2lvbixoLm5vcm1hbGl6ZWQ9ITEsaC50eXBlPWguYnVmZmVyLmR0eXBlLGgub2Zmc2V0PTAsaC5zdHJpZGU9MCxoLmRpdmlzb3I9MCxoLnN0YXRlPTEpOm8uZ2V0QnVmZmVyKGwuYnVmZmVyKT8oaC5idWZmZXI9by5nZXRCdWZmZXIobC5idWZmZXIpLGguc2l6ZT0wfCgrbC5zaXplfHxoLmJ1ZmZlci5kaW1lbnNpb24pLGgubm9ybWFsaXplZD0hIWwubm9ybWFsaXplZHx8ITEsXCJ0eXBlXCJpbiBsPyhTLnBhcmFtZXRlcihsLnR5cGUseixcImludmFsaWQgYnVmZmVyIHR5cGVcIiksaC50eXBlPXpbbC50eXBlXSk6aC50eXBlPWguYnVmZmVyLmR0eXBlLGgub2Zmc2V0PTB8KGwub2Zmc2V0fHwwKSxoLnN0cmlkZT0wfChsLnN0cmlkZXx8MCksaC5kaXZpc29yPTB8KGwuZGl2aXNvcnx8MCksaC5zdGF0ZT0xLFMoaC5zaXplPj0xJiZoLnNpemU8PTQsXCJzaXplIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0XCIpLFMoaC5vZmZzZXQ+PTAsXCJpbnZhbGlkIG9mZnNldFwiKSxTKGguc3RyaWRlPj0wJiZoLnN0cmlkZTw9MjU1LFwic3RyaWRlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTVcIiksUyhoLmRpdmlzb3I+PTAsXCJkaXZpc29yIG11c3QgYmUgcG9zaXRpdmVcIiksUyghaC5kaXZpc29yfHwhIW4uYW5nbGVfaW5zdGFuY2VkX2FycmF5cyxcIkFOR0xFX2luc3RhbmNlZF9hcnJheXMgbXVzdCBiZSBlbmFibGVkIHRvIHVzZSBkaXZpc29yXCIpKTpcInhcImluIGw/KFMoYz4wLFwiZmlyc3QgYXR0cmlidXRlIG11c3Qgbm90IGJlIGEgY29uc3RhbnRcIiksaC54PStsLnh8fDAsaC55PStsLnl8fDAsaC56PStsLnp8fDAsaC53PStsLnd8fDAsaC5zdGF0ZT0yKTpTKCExLFwiaW52YWxpZCBhdHRyaWJ1dGUgc3BlYyBmb3IgbG9jYXRpb24gXCIrYyl9Zm9yKHZhciBwPTA7cDxyLmJ1ZmZlcnMubGVuZ3RoOysrcCkhaVtwXSYmci5idWZmZXJzW3BdJiYoci5idWZmZXJzW3BdLmRlc3Ryb3koKSxyLmJ1ZmZlcnNbcF09bnVsbCk7cmV0dXJuIHIucmVmcmVzaCgpLHN9cmV0dXJuIGkudmFvQ291bnQrPTEscy5kZXN0cm95PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDxyLmJ1ZmZlcnMubGVuZ3RoOysrdClyLmJ1ZmZlcnNbdF0mJnIuYnVmZmVyc1t0XS5kZXN0cm95KCk7ci5idWZmZXJzLmxlbmd0aD0wLHIuZGVzdHJveSgpfSxzLl92YW89cixzLl9yZWdsVHlwZT1cInZhb1wiLHMoZSl9LGdldFZBTzpmdW5jdGlvbih0KXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiZ0Ll92YW8/dC5fdmFvOm51bGx9LGRlc3Ryb3lCdWZmZXI6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTA7bjxzLmxlbmd0aDsrK24pe3ZhciByPXNbbl07ci5idWZmZXI9PT10JiYoZS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobiksci5idWZmZXI9bnVsbCl9fSxzZXRWQU86aCgpP2Z1bmN0aW9uKHQpe2lmKHQhPT1sLmN1cnJlbnRWQU8pe3ZhciBlPWgoKTt0P2UuYmluZFZlcnRleEFycmF5T0VTKHQudmFvKTplLmJpbmRWZXJ0ZXhBcnJheU9FUyhudWxsKSxsLmN1cnJlbnRWQU89dH19OmZ1bmN0aW9uKHQpe2lmKHQhPT1sLmN1cnJlbnRWQU8pe2lmKHQpdC5iaW5kQXR0cnMoKTtlbHNlIGZvcih2YXIgbj1kKCkscj0wO3I8cy5sZW5ndGg7KytyKXt2YXIgaT1zW3JdO2kuYnVmZmVyPyhlLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHIpLGUudmVydGV4QXR0cmliUG9pbnRlcihyLGkuc2l6ZSxpLnR5cGUsaS5ub3JtYWxpemVkLGkuc3RyaWRlLGkub2ZmZnNldCksbiYmaS5kaXZpc29yJiZuLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRShyLGkuZGl2aXNvcikpOihlLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShyKSxlLnZlcnRleEF0dHJpYjRmKHIsaS54LGkueSxpLnosaS53KSl9bC5jdXJyZW50VkFPPXR9fSxjbGVhcjpoKCk/ZnVuY3Rpb24oKXtCKGYpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZGVzdHJveSgpfSkpfTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIGgoKXtyZXR1cm4gbi5vZXNfdmVydGV4X2FycmF5X29iamVjdH1mdW5jdGlvbiBkKCl7cmV0dXJuIG4uYW5nbGVfaW5zdGFuY2VkX2FycmF5c31mdW5jdGlvbiBwKCl7dGhpcy5pZD0rK2MsdGhpcy5hdHRyaWJ1dGVzPVtdO3ZhciB0PWgoKTt0aGlzLnZhbz10P3QuY3JlYXRlVmVydGV4QXJyYXlPRVMoKTpudWxsLGZbdGhpcy5pZF09dGhpcyx0aGlzLmJ1ZmZlcnM9W119cmV0dXJuIHAucHJvdG90eXBlLmJpbmRBdHRycz1mdW5jdGlvbigpe2Zvcih2YXIgdD1kKCksbj10aGlzLmF0dHJpYnV0ZXMscj0wO3I8bi5sZW5ndGg7KytyKXt2YXIgaT1uW3JdO2kuYnVmZmVyPyhlLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHIpLGUuYmluZEJ1ZmZlcigzNDk2MixpLmJ1ZmZlci5idWZmZXIpLGUudmVydGV4QXR0cmliUG9pbnRlcihyLGkuc2l6ZSxpLnR5cGUsaS5ub3JtYWxpemVkLGkuc3RyaWRlLGkub2Zmc2V0KSx0JiZpLmRpdmlzb3ImJnQudmVydGV4QXR0cmliRGl2aXNvckFOR0xFKHIsaS5kaXZpc29yKSk6KGUuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHIpLGUudmVydGV4QXR0cmliNGYocixpLngsaS55LGkueixpLncpKX1mb3IodmFyIG89bi5sZW5ndGg7bzxhOysrbyllLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShvKX0scC5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbigpe3ZhciB0PWgoKTt0JiYodC5iaW5kVmVydGV4QXJyYXlPRVModGhpcy52YW8pLHRoaXMuYmluZEF0dHJzKCksbC5jdXJyZW50VkFPPXRoaXMpfSxwLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYodGhpcy52YW8pe3ZhciB0PWgoKTt0aGlzPT09bC5jdXJyZW50VkFPJiYobC5jdXJyZW50VkFPPW51bGwsdC5iaW5kVmVydGV4QXJyYXlPRVMobnVsbCkpLHQuZGVsZXRlVmVydGV4QXJyYXlPRVModGhpcy52YW8pLHRoaXMudmFvPW51bGx9Zlt0aGlzLmlkXSYmKGRlbGV0ZSBmW3RoaXMuaWRdLGkudmFvQ291bnQtPTEpfSxsfShpLGQsYixoLHgpLEU9ZnVuY3Rpb24oZSxuLHIsaSl7dmFyIG89e30sYT0wLHM9e3VpbnQ4OjUxMjEsdWludDE2OjUxMjN9O2Z1bmN0aW9uIHUodCl7dGhpcy5pZD1hKyssb1t0aGlzLmlkXT10aGlzLHRoaXMuYnVmZmVyPXQsdGhpcy5wcmltVHlwZT00LHRoaXMudmVydENvdW50PTAsdGhpcy50eXBlPTB9bi5vZXNfZWxlbWVudF9pbmRleF91aW50JiYocy51aW50MzI9NTEyNSksdS5wcm90b3R5cGUuYmluZD1mdW5jdGlvbigpe3RoaXMuYnVmZmVyLmJpbmQoKX07dmFyIGM9W107ZnVuY3Rpb24gZihpLG8sYSxzLHUsYyxmKXt2YXIgbDtpZihpLmJ1ZmZlci5iaW5kKCksbyl7dmFyIGg9ZjtmfHx0KG8pJiYoIUwobyl8fHQoby5kYXRhKSl8fChoPW4ub2VzX2VsZW1lbnRfaW5kZXhfdWludD81MTI1OjUxMjMpLHIuX2luaXRCdWZmZXIoaS5idWZmZXIsbyxhLGgsMyl9ZWxzZSBlLmJ1ZmZlckRhdGEoMzQ5NjMsYyxhKSxpLmJ1ZmZlci5kdHlwZT1sfHw1MTIxLGkuYnVmZmVyLnVzYWdlPWEsaS5idWZmZXIuZGltZW5zaW9uPTMsaS5idWZmZXIuYnl0ZUxlbmd0aD1jO2lmKGw9ZiwhZil7c3dpdGNoKGkuYnVmZmVyLmR0eXBlKXtjYXNlIDUxMjE6Y2FzZSA1MTIwOmw9NTEyMTticmVhaztjYXNlIDUxMjM6Y2FzZSA1MTIyOmw9NTEyMzticmVhaztjYXNlIDUxMjU6Y2FzZSA1MTI0Omw9NTEyNTticmVhaztkZWZhdWx0OlMucmFpc2UoXCJ1bnN1cHBvcnRlZCB0eXBlIGZvciBlbGVtZW50IGFycmF5XCIpfWkuYnVmZmVyLmR0eXBlPWx9aS50eXBlPWwsUyg1MTI1IT09bHx8ISFuLm9lc19lbGVtZW50X2luZGV4X3VpbnQsXCIzMiBiaXQgZWxlbWVudCBidWZmZXJzIG5vdCBzdXBwb3J0ZWQsIGVuYWJsZSBvZXNfZWxlbWVudF9pbmRleF91aW50IGZpcnN0XCIpO3ZhciBkPXU7ZDwwJiYoZD1pLmJ1ZmZlci5ieXRlTGVuZ3RoLDUxMjM9PT1sP2Q+Pj0xOjUxMjU9PT1sJiYoZD4+PTIpKSxpLnZlcnRDb3VudD1kO3ZhciBwPXM7aWYoczwwKXtwPTQ7dmFyIGc9aS5idWZmZXIuZGltZW5zaW9uOzE9PT1nJiYocD0wKSwyPT09ZyYmKHA9MSksMz09PWcmJihwPTQpfWkucHJpbVR5cGU9cH1mdW5jdGlvbiBsKHQpe2kuZWxlbWVudHNDb3VudC0tLFMobnVsbCE9PXQuYnVmZmVyLFwibXVzdCBub3QgZG91YmxlIGRlc3Ryb3kgZWxlbWVudHNcIiksZGVsZXRlIG9bdC5pZF0sdC5idWZmZXIuZGVzdHJveSgpLHQuYnVmZmVyPW51bGx9cmV0dXJue2NyZWF0ZTpmdW5jdGlvbihlLG4pe3ZhciBvPXIuY3JlYXRlKG51bGwsMzQ5NjMsITApLGE9bmV3IHUoby5fYnVmZmVyKTtmdW5jdGlvbiBjKGUpe2lmKGUpaWYoXCJudW1iZXJcIj09dHlwZW9mIGUpbyhlKSxhLnByaW1UeXBlPTQsYS52ZXJ0Q291bnQ9MHxlLGEudHlwZT01MTIxO2Vsc2V7dmFyIG49bnVsbCxyPTM1MDQ0LGk9LTEsdT0tMSxsPTAsaD0wO0FycmF5LmlzQXJyYXkoZSl8fHQoZSl8fEwoZSk/bj1lOihTLnR5cGUoZSxcIm9iamVjdFwiLFwiaW52YWxpZCBhcmd1bWVudHMgZm9yIGVsZW1lbnRzXCIpLFwiZGF0YVwiaW4gZSYmKG49ZS5kYXRhLFMoQXJyYXkuaXNBcnJheShuKXx8dChuKXx8TChuKSxcImludmFsaWQgZGF0YSBmb3IgZWxlbWVudCBidWZmZXJcIikpLFwidXNhZ2VcImluIGUmJihTLnBhcmFtZXRlcihlLnVzYWdlLFYsXCJpbnZhbGlkIGVsZW1lbnQgYnVmZmVyIHVzYWdlXCIpLHI9VltlLnVzYWdlXSksXCJwcmltaXRpdmVcImluIGUmJihTLnBhcmFtZXRlcihlLnByaW1pdGl2ZSxaLFwiaW52YWxpZCBlbGVtZW50IGJ1ZmZlciBwcmltaXRpdmVcIiksaT1aW2UucHJpbWl0aXZlXSksXCJjb3VudFwiaW4gZSYmKFMoXCJudW1iZXJcIj09dHlwZW9mIGUuY291bnQmJmUuY291bnQ+PTAsXCJpbnZhbGlkIHZlcnRleCBjb3VudCBmb3IgZWxlbWVudHNcIiksdT0wfGUuY291bnQpLFwidHlwZVwiaW4gZSYmKFMucGFyYW1ldGVyKGUudHlwZSxzLFwiaW52YWxpZCBidWZmZXIgdHlwZVwiKSxoPXNbZS50eXBlXSksXCJsZW5ndGhcImluIGU/bD0wfGUubGVuZ3RoOihsPXUsNTEyMz09PWh8fDUxMjI9PT1oP2wqPTI6NTEyNSE9PWgmJjUxMjQhPT1ofHwobCo9NCkpKSxmKGEsbixyLGksdSxsLGgpfWVsc2UgbygpLGEucHJpbVR5cGU9NCxhLnZlcnRDb3VudD0wLGEudHlwZT01MTIxO3JldHVybiBjfXJldHVybiBpLmVsZW1lbnRzQ291bnQrKyxjKGUpLGMuX3JlZ2xUeXBlPVwiZWxlbWVudHNcIixjLl9lbGVtZW50cz1hLGMuc3ViZGF0YT1mdW5jdGlvbih0LGUpe3JldHVybiBvLnN1YmRhdGEodCxlKSxjfSxjLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsKGEpfSxjfSxjcmVhdGVTdHJlYW06ZnVuY3Rpb24odCl7dmFyIGU9Yy5wb3AoKTtyZXR1cm4gZXx8KGU9bmV3IHUoci5jcmVhdGUobnVsbCwzNDk2MywhMCwhMSkuX2J1ZmZlcikpLGYoZSx0LDM1MDQwLC0xLC0xLDAsMCksZX0sZGVzdHJveVN0cmVhbTpmdW5jdGlvbih0KXtjLnB1c2godCl9LGdldEVsZW1lbnRzOmZ1bmN0aW9uKHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJnQuX2VsZW1lbnRzIGluc3RhbmNlb2YgdT90Ll9lbGVtZW50czpudWxsfSxjbGVhcjpmdW5jdGlvbigpe0IobykuZm9yRWFjaChsKX19fShpLGQseCxoKSxfPWZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPXt9LGE9e307ZnVuY3Rpb24gcyh0LGUsbixyKXt0aGlzLm5hbWU9dCx0aGlzLmlkPWUsdGhpcy5sb2NhdGlvbj1uLHRoaXMuaW5mbz1yfWZ1bmN0aW9uIHUodCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoOysrbilpZih0W25dLmlkPT09ZS5pZClyZXR1cm4gdm9pZCh0W25dLmxvY2F0aW9uPWUubG9jYXRpb24pO3QucHVzaChlKX1mdW5jdGlvbiBjKGUscixpKXt2YXIgcz0zNTYzMj09PWU/bzphLHU9c1tyXTtpZighdSl7dmFyIGM9bi5zdHIocik7dT10LmNyZWF0ZVNoYWRlcihlKSx0LnNoYWRlclNvdXJjZSh1LGMpLHQuY29tcGlsZVNoYWRlcih1KSxTLnNoYWRlckVycm9yKHQsdSxjLGUsaSksc1tyXT11fXJldHVybiB1fXZhciBmPXt9LGw9W10saD0wO2Z1bmN0aW9uIGQodCxlKXt0aGlzLmlkPWgrKyx0aGlzLmZyYWdJZD10LHRoaXMudmVydElkPWUsdGhpcy5wcm9ncmFtPW51bGwsdGhpcy51bmlmb3Jtcz1bXSx0aGlzLmF0dHJpYnV0ZXM9W10sdGhpcy5yZWZDb3VudD0xLGkucHJvZmlsZSYmKHRoaXMuc3RhdHM9e3VuaWZvcm1zQ291bnQ6MCxhdHRyaWJ1dGVzQ291bnQ6MH0pfWZ1bmN0aW9uIHAoZSxyLG8pe3ZhciBhLGYsbD1jKDM1NjMyLGUuZnJhZ0lkKSxoPWMoMzU2MzMsZS52ZXJ0SWQpLGQ9ZS5wcm9ncmFtPXQuY3JlYXRlUHJvZ3JhbSgpO2lmKHQuYXR0YWNoU2hhZGVyKGQsbCksdC5hdHRhY2hTaGFkZXIoZCxoKSxvKWZvcihhPTA7YTxvLmxlbmd0aDsrK2Epe3ZhciBwPW9bYV07dC5iaW5kQXR0cmliTG9jYXRpb24oZCxwWzBdLHBbMV0pfXQubGlua1Byb2dyYW0oZCksUy5saW5rRXJyb3IodCxkLG4uc3RyKGUuZnJhZ0lkKSxuLnN0cihlLnZlcnRJZCkscik7dmFyIGc9dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGQsMzU3MTgpO2kucHJvZmlsZSYmKGUuc3RhdHMudW5pZm9ybXNDb3VudD1nKTt2YXIgdj1lLnVuaWZvcm1zO2ZvcihhPTA7YTxnOysrYSlpZihmPXQuZ2V0QWN0aXZlVW5pZm9ybShkLGEpKWlmKGYuc2l6ZT4xKWZvcih2YXIgeT0wO3k8Zi5zaXplOysreSl7dmFyIG09Zi5uYW1lLnJlcGxhY2UoXCJbMF1cIixcIltcIit5K1wiXVwiKTt1KHYsbmV3IHMobSxuLmlkKG0pLHQuZ2V0VW5pZm9ybUxvY2F0aW9uKGQsbSksZikpfWVsc2UgdSh2LG5ldyBzKGYubmFtZSxuLmlkKGYubmFtZSksdC5nZXRVbmlmb3JtTG9jYXRpb24oZCxmLm5hbWUpLGYpKTt2YXIgYj10LmdldFByb2dyYW1QYXJhbWV0ZXIoZCwzNTcyMSk7aS5wcm9maWxlJiYoZS5zdGF0cy5hdHRyaWJ1dGVzQ291bnQ9Yik7dmFyIHg9ZS5hdHRyaWJ1dGVzO2ZvcihhPTA7YTxiOysrYSkoZj10LmdldEFjdGl2ZUF0dHJpYihkLGEpKSYmdSh4LG5ldyBzKGYubmFtZSxuLmlkKGYubmFtZSksdC5nZXRBdHRyaWJMb2NhdGlvbihkLGYubmFtZSksZikpfXJldHVybiBpLnByb2ZpbGUmJihyLmdldE1heFVuaWZvcm1zQ291bnQ9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiBsLmZvckVhY2goKGZ1bmN0aW9uKGUpe2Uuc3RhdHMudW5pZm9ybXNDb3VudD50JiYodD1lLnN0YXRzLnVuaWZvcm1zQ291bnQpfSkpLHR9LHIuZ2V0TWF4QXR0cmlidXRlc0NvdW50PWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gbC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnN0YXRzLmF0dHJpYnV0ZXNDb3VudD50JiYodD1lLnN0YXRzLmF0dHJpYnV0ZXNDb3VudCl9KSksdH0pLHtjbGVhcjpmdW5jdGlvbigpe3ZhciBlPXQuZGVsZXRlU2hhZGVyLmJpbmQodCk7QihvKS5mb3JFYWNoKGUpLG89e30sQihhKS5mb3JFYWNoKGUpLGE9e30sbC5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmRlbGV0ZVByb2dyYW0oZS5wcm9ncmFtKX0pKSxsLmxlbmd0aD0wLGY9e30sci5zaGFkZXJDb3VudD0wfSxwcm9ncmFtOmZ1bmN0aW9uKG4saSxzLHUpe1MuY29tbWFuZChuPj0wLFwibWlzc2luZyB2ZXJ0ZXggc2hhZGVyXCIscyksUy5jb21tYW5kKGk+PTAsXCJtaXNzaW5nIGZyYWdtZW50IHNoYWRlclwiLHMpO3ZhciBjPWZbaV07Y3x8KGM9ZltpXT17fSk7dmFyIGg9Y1tuXTtpZihoJiYoaC5yZWZDb3VudCsrLCF1KSlyZXR1cm4gaDt2YXIgZz1uZXcgZChpLG4pO3JldHVybiByLnNoYWRlckNvdW50KysscChnLHMsdSksaHx8KGNbbl09ZyksbC5wdXNoKGcpLGUoZyx7ZGVzdHJveTpmdW5jdGlvbigpe2lmKGcucmVmQ291bnQtLSxnLnJlZkNvdW50PD0wKXt0LmRlbGV0ZVByb2dyYW0oZy5wcm9ncmFtKTt2YXIgZT1sLmluZGV4T2YoZyk7bC5zcGxpY2UoZSwxKSxyLnNoYWRlckNvdW50LS19Y1tnLnZlcnRJZF0ucmVmQ291bnQ8PTAmJih0LmRlbGV0ZVNoYWRlcihhW2cudmVydElkXSksZGVsZXRlIGFbZy52ZXJ0SWRdLGRlbGV0ZSBmW2cuZnJhZ0lkXVtnLnZlcnRJZF0pLE9iamVjdC5rZXlzKGZbZy5mcmFnSWRdKS5sZW5ndGh8fCh0LmRlbGV0ZVNoYWRlcihvW2cuZnJhZ0lkXSksZGVsZXRlIG9bZy5mcmFnSWRdLGRlbGV0ZSBmW2cuZnJhZ0lkXSl9fSl9LHJlc3RvcmU6ZnVuY3Rpb24oKXtvPXt9LGE9e307Zm9yKHZhciB0PTA7dDxsLmxlbmd0aDsrK3QpcChsW3RdLG51bGwsbFt0XS5hdHRyaWJ1dGVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuW3QubG9jYXRpb24sdC5uYW1lXX0pKSl9LHNoYWRlcjpjLGZyYWc6LTEsdmVydDotMX19KGksbCxoLHIpLE89T3QoaSxkLGIsKGZ1bmN0aW9uKCl7SS5wcm9jcy5wb2xsKCl9KSxtLGgsciksaz1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXtyZ2JhNDozMjg1NCxyZ2I1NjU6MzYxOTQsXCJyZ2I1IGExXCI6MzI4NTUsZGVwdGg6MzMxODksc3RlbmNpbDozNjE2OCxcImRlcHRoIHN0ZW5jaWxcIjozNDA0MX07ZS5leHRfc3JnYiYmKG8uc3JnYmE9MzU5MDcpLGUuZXh0X2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JiYoby5yZ2JhMTZmPTM0ODQyLG8ucmdiMTZmPTM0ODQzKSxlLndlYmdsX2NvbG9yX2J1ZmZlcl9mbG9hdCYmKG8ucmdiYTMyZj0zNDgzNik7dmFyIHM9W107T2JqZWN0LmtleXMobykuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9b1t0XTtzW2VdPXR9KSk7dmFyIHU9MCxjPXt9O2Z1bmN0aW9uIGYodCl7dGhpcy5pZD11KyssdGhpcy5yZWZDb3VudD0xLHRoaXMucmVuZGVyYnVmZmVyPXQsdGhpcy5mb3JtYXQ9MzI4NTQsdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsaS5wcm9maWxlJiYodGhpcy5zdGF0cz17c2l6ZTowfSl9ZnVuY3Rpb24gbChlKXt2YXIgbj1lLnJlbmRlcmJ1ZmZlcjtTKG4sXCJtdXN0IG5vdCBkb3VibGUgZGVzdHJveSByZW5kZXJidWZmZXJcIiksdC5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG51bGwpLHQuZGVsZXRlUmVuZGVyYnVmZmVyKG4pLGUucmVuZGVyYnVmZmVyPW51bGwsZS5yZWZDb3VudD0wLGRlbGV0ZSBjW2UuaWRdLHIucmVuZGVyYnVmZmVyQ291bnQtLX1yZXR1cm4gZi5wcm90b3R5cGUuZGVjUmVmPWZ1bmN0aW9uKCl7LS10aGlzLnJlZkNvdW50PD0wJiZsKHRoaXMpfSxpLnByb2ZpbGUmJihyLmdldFRvdGFsUmVuZGVyYnVmZmVyU2l6ZT1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIE9iamVjdC5rZXlzKGMpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QrPWNbZV0uc3RhdHMuc2l6ZX0pKSx0fSkse2NyZWF0ZTpmdW5jdGlvbihlLHUpe3ZhciBsPW5ldyBmKHQuY3JlYXRlUmVuZGVyYnVmZmVyKCkpO2Z1bmN0aW9uIGgoZSxyKXt2YXIgdT0wLGM9MCxmPTMyODU0O2lmKFwib2JqZWN0XCI9PT1hKGUpJiZlKXt2YXIgZD1lO2lmKFwic2hhcGVcImluIGQpe3ZhciBwPWQuc2hhcGU7UyhBcnJheS5pc0FycmF5KHApJiZwLmxlbmd0aD49MixcImludmFsaWQgcmVuZGVyYnVmZmVyIHNoYXBlXCIpLHU9MHxwWzBdLGM9MHxwWzFdfWVsc2VcInJhZGl1c1wiaW4gZCYmKHU9Yz0wfGQucmFkaXVzKSxcIndpZHRoXCJpbiBkJiYodT0wfGQud2lkdGgpLFwiaGVpZ2h0XCJpbiBkJiYoYz0wfGQuaGVpZ2h0KTtcImZvcm1hdFwiaW4gZCYmKFMucGFyYW1ldGVyKGQuZm9ybWF0LG8sXCJpbnZhbGlkIHJlbmRlcmJ1ZmZlciBmb3JtYXRcIiksZj1vW2QuZm9ybWF0XSl9ZWxzZVwibnVtYmVyXCI9PXR5cGVvZiBlPyh1PTB8ZSxjPVwibnVtYmVyXCI9PXR5cGVvZiByPzB8cjp1KTplP1MucmFpc2UoXCJpbnZhbGlkIGFyZ3VtZW50cyB0byByZW5kZXJidWZmZXIgY29uc3RydWN0b3JcIik6dT1jPTE7aWYoUyh1PjAmJmM+MCYmdTw9bi5tYXhSZW5kZXJidWZmZXJTaXplJiZjPD1uLm1heFJlbmRlcmJ1ZmZlclNpemUsXCJpbnZhbGlkIHJlbmRlcmJ1ZmZlciBzaXplXCIpLHUhPT1sLndpZHRofHxjIT09bC5oZWlnaHR8fGYhPT1sLmZvcm1hdClyZXR1cm4gaC53aWR0aD1sLndpZHRoPXUsaC5oZWlnaHQ9bC5oZWlnaHQ9YyxsLmZvcm1hdD1mLHQuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxsLnJlbmRlcmJ1ZmZlciksdC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLGYsdSxjKSxTKDA9PT10LmdldEVycm9yKCksXCJpbnZhbGlkIHJlbmRlciBidWZmZXIgZm9ybWF0XCIpLGkucHJvZmlsZSYmKGwuc3RhdHMuc2l6ZT1NdChsLmZvcm1hdCxsLndpZHRoLGwuaGVpZ2h0KSksaC5mb3JtYXQ9c1tsLmZvcm1hdF0saH1yZXR1cm4gY1tsLmlkXT1sLHIucmVuZGVyYnVmZmVyQ291bnQrKyxoKGUsdSksaC5yZXNpemU9ZnVuY3Rpb24oZSxyKXt2YXIgbz0wfGUsYT0wfHJ8fG87cmV0dXJuIG89PT1sLndpZHRoJiZhPT09bC5oZWlnaHR8fChTKG8+MCYmYT4wJiZvPD1uLm1heFJlbmRlcmJ1ZmZlclNpemUmJmE8PW4ubWF4UmVuZGVyYnVmZmVyU2l6ZSxcImludmFsaWQgcmVuZGVyYnVmZmVyIHNpemVcIiksaC53aWR0aD1sLndpZHRoPW8saC5oZWlnaHQ9bC5oZWlnaHQ9YSx0LmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsbC5yZW5kZXJidWZmZXIpLHQucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxsLmZvcm1hdCxvLGEpLFMoMD09PXQuZ2V0RXJyb3IoKSxcImludmFsaWQgcmVuZGVyIGJ1ZmZlciBmb3JtYXRcIiksaS5wcm9maWxlJiYobC5zdGF0cy5zaXplPU10KGwuZm9ybWF0LGwud2lkdGgsbC5oZWlnaHQpKSksaH0saC5fcmVnbFR5cGU9XCJyZW5kZXJidWZmZXJcIixoLl9yZW5kZXJidWZmZXI9bCxpLnByb2ZpbGUmJihoLnN0YXRzPWwuc3RhdHMpLGguZGVzdHJveT1mdW5jdGlvbigpe2wuZGVjUmVmKCl9LGh9LGNsZWFyOmZ1bmN0aW9uKCl7QihjKS5mb3JFYWNoKGwpfSxyZXN0b3JlOmZ1bmN0aW9uKCl7QihjKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnJlbmRlcmJ1ZmZlcj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHQuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxlLnJlbmRlcmJ1ZmZlciksdC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLGUuZm9ybWF0LGUud2lkdGgsZS5oZWlnaHQpfSkpLHQuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX19fShpLGQsYixoLHIpLEM9ZnVuY3Rpb24odCxuLHIsaSxvLHMpe3ZhciB1PXtjdXI6bnVsbCxuZXh0Om51bGwsZGlydHk6ITEsc2V0RkJPOm51bGx9LGM9W1wicmdiYVwiXSxmPVtcInJnYmE0XCIsXCJyZ2I1NjVcIixcInJnYjUgYTFcIl07bi5leHRfc3JnYiYmZi5wdXNoKFwic3JnYmFcIiksbi5leHRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQmJmYucHVzaChcInJnYmExNmZcIixcInJnYjE2ZlwiKSxuLndlYmdsX2NvbG9yX2J1ZmZlcl9mbG9hdCYmZi5wdXNoKFwicmdiYTMyZlwiKTt2YXIgbD1bXCJ1aW50OFwiXTtmdW5jdGlvbiBoKHQsZSxuKXt0aGlzLnRhcmdldD10LHRoaXMudGV4dHVyZT1lLHRoaXMucmVuZGVyYnVmZmVyPW47dmFyIHI9MCxpPTA7ZT8ocj1lLndpZHRoLGk9ZS5oZWlnaHQpOm4mJihyPW4ud2lkdGgsaT1uLmhlaWdodCksdGhpcy53aWR0aD1yLHRoaXMuaGVpZ2h0PWl9ZnVuY3Rpb24gZCh0KXt0JiYodC50ZXh0dXJlJiZ0LnRleHR1cmUuX3RleHR1cmUuZGVjUmVmKCksdC5yZW5kZXJidWZmZXImJnQucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIuZGVjUmVmKCkpfWZ1bmN0aW9uIHAodCxlLG4pe2lmKHQpaWYodC50ZXh0dXJlKXt2YXIgcj10LnRleHR1cmUuX3RleHR1cmUsaT1NYXRoLm1heCgxLHIud2lkdGgpLG89TWF0aC5tYXgoMSxyLmhlaWdodCk7UyhpPT09ZSYmbz09PW4sXCJpbmNvbnNpc3RlbnQgd2lkdGgvaGVpZ2h0IGZvciBzdXBwbGllZCB0ZXh0dXJlXCIpLHIucmVmQ291bnQrPTF9ZWxzZXt2YXIgYT10LnJlbmRlcmJ1ZmZlci5fcmVuZGVyYnVmZmVyO1MoYS53aWR0aD09PWUmJmEuaGVpZ2h0PT09bixcImluY29uc2lzdGVudCB3aWR0aC9oZWlnaHQgZm9yIHJlbmRlcmJ1ZmZlclwiKSxhLnJlZkNvdW50Kz0xfX1mdW5jdGlvbiBnKGUsbil7biYmKG4udGV4dHVyZT90LmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLGUsbi50YXJnZXQsbi50ZXh0dXJlLl90ZXh0dXJlLnRleHR1cmUsMCk6dC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCxlLDM2MTYxLG4ucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIucmVuZGVyYnVmZmVyKSl9ZnVuY3Rpb24gdih0KXt2YXIgZT0zNTUzLG49bnVsbCxyPW51bGwsaT10O1wib2JqZWN0XCI9PT1hKHQpJiYoaT10LmRhdGEsXCJ0YXJnZXRcImluIHQmJihlPTB8dC50YXJnZXQpKSxTLnR5cGUoaSxcImZ1bmN0aW9uXCIsXCJpbnZhbGlkIGF0dGFjaG1lbnQgZGF0YVwiKTt2YXIgbz1pLl9yZWdsVHlwZTtyZXR1cm5cInRleHR1cmUyZFwiPT09bz8obj1pLFMoMzU1Mz09PWUpKTpcInRleHR1cmVDdWJlXCI9PT1vPyhuPWksUyhlPj0zNDA2OSYmZTwzNDA3NSxcImludmFsaWQgY3ViZSBtYXAgdGFyZ2V0XCIpKTpcInJlbmRlcmJ1ZmZlclwiPT09bz8ocj1pLGU9MzYxNjEpOlMucmFpc2UoXCJpbnZhbGlkIHJlZ2wgb2JqZWN0IGZvciBhdHRhY2htZW50XCIpLG5ldyBoKGUsbixyKX1mdW5jdGlvbiB5KHQsZSxuLHIsYSl7aWYobil7dmFyIHM9aS5jcmVhdGUyRCh7d2lkdGg6dCxoZWlnaHQ6ZSxmb3JtYXQ6cix0eXBlOmF9KTtyZXR1cm4gcy5fdGV4dHVyZS5yZWZDb3VudD0wLG5ldyBoKDM1NTMscyxudWxsKX12YXIgdT1vLmNyZWF0ZSh7d2lkdGg6dCxoZWlnaHQ6ZSxmb3JtYXQ6cn0pO3JldHVybiB1Ll9yZW5kZXJidWZmZXIucmVmQ291bnQ9MCxuZXcgaCgzNjE2MSxudWxsLHUpfWZ1bmN0aW9uIG0odCl7cmV0dXJuIHQmJih0LnRleHR1cmV8fHQucmVuZGVyYnVmZmVyKX1mdW5jdGlvbiBiKHQsZSxuKXt0JiYodC50ZXh0dXJlP3QudGV4dHVyZS5yZXNpemUoZSxuKTp0LnJlbmRlcmJ1ZmZlciYmdC5yZW5kZXJidWZmZXIucmVzaXplKGUsbiksdC53aWR0aD1lLHQuaGVpZ2h0PW4pfW4ub2VzX3RleHR1cmVfaGFsZl9mbG9hdCYmbC5wdXNoKFwiaGFsZiBmbG9hdFwiLFwiZmxvYXQxNlwiKSxuLm9lc190ZXh0dXJlX2Zsb2F0JiZsLnB1c2goXCJmbG9hdFwiLFwiZmxvYXQzMlwiKTt2YXIgeD0wLHc9e307ZnVuY3Rpb24gRSgpe3RoaXMuaWQ9eCsrLHdbdGhpcy5pZF09dGhpcyx0aGlzLmZyYW1lYnVmZmVyPXQuY3JlYXRlRnJhbWVidWZmZXIoKSx0aGlzLndpZHRoPTAsdGhpcy5oZWlnaHQ9MCx0aGlzLmNvbG9yQXR0YWNobWVudHM9W10sdGhpcy5kZXB0aEF0dGFjaG1lbnQ9bnVsbCx0aGlzLnN0ZW5jaWxBdHRhY2htZW50PW51bGwsdGhpcy5kZXB0aFN0ZW5jaWxBdHRhY2htZW50PW51bGx9ZnVuY3Rpb24gXyh0KXt0LmNvbG9yQXR0YWNobWVudHMuZm9yRWFjaChkKSxkKHQuZGVwdGhBdHRhY2htZW50KSxkKHQuc3RlbmNpbEF0dGFjaG1lbnQpLGQodC5kZXB0aFN0ZW5jaWxBdHRhY2htZW50KX1mdW5jdGlvbiBPKGUpe3ZhciBuPWUuZnJhbWVidWZmZXI7UyhuLFwibXVzdCBub3QgZG91YmxlIGRlc3Ryb3kgZnJhbWVidWZmZXJcIiksdC5kZWxldGVGcmFtZWJ1ZmZlcihuKSxlLmZyYW1lYnVmZmVyPW51bGwscy5mcmFtZWJ1ZmZlckNvdW50LS0sZGVsZXRlIHdbZS5pZF19ZnVuY3Rpb24gayhlKXt2YXIgbjt0LmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxlLmZyYW1lYnVmZmVyKTt2YXIgaT1lLmNvbG9yQXR0YWNobWVudHM7Zm9yKG49MDtuPGkubGVuZ3RoOysrbilnKDM2MDY0K24saVtuXSk7Zm9yKG49aS5sZW5ndGg7bjxyLm1heENvbG9yQXR0YWNobWVudHM7KytuKXQuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwNjQrbiwzNTUzLG51bGwsMCk7dC5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzMzMwNiwzNTUzLG51bGwsMCksdC5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA5NiwzNTUzLG51bGwsMCksdC5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjEyOCwzNTUzLG51bGwsMCksZygzNjA5NixlLmRlcHRoQXR0YWNobWVudCksZygzNjEyOCxlLnN0ZW5jaWxBdHRhY2htZW50KSxnKDMzMzA2LGUuZGVwdGhTdGVuY2lsQXR0YWNobWVudCk7dmFyIG89dC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKDM2MTYwKTt0LmlzQ29udGV4dExvc3QoKXx8MzYwNTM9PT1vfHxTLnJhaXNlKFwiZnJhbWVidWZmZXIgY29uZmlndXJhdGlvbiBub3Qgc3VwcG9ydGVkLCBzdGF0dXMgPSBcIitQdFtvXSksdC5iaW5kRnJhbWVidWZmZXIoMzYxNjAsdS5uZXh0P3UubmV4dC5mcmFtZWJ1ZmZlcjpudWxsKSx1LmN1cj11Lm5leHQsdC5nZXRFcnJvcigpfWZ1bmN0aW9uIE0odCxpKXt2YXIgbz1uZXcgRTtmdW5jdGlvbiBhKHQsZSl7dmFyIGk7Uyh1Lm5leHQhPT1vLFwiY2FuIG5vdCB1cGRhdGUgZnJhbWVidWZmZXIgd2hpY2ggaXMgY3VycmVudGx5IGluIHVzZVwiKTt2YXIgcz0wLGg9MCxkPSEwLGc9ITAsYj1udWxsLHg9ITAsdz1cInJnYmFcIixFPVwidWludDhcIixPPTEsTT1udWxsLEE9bnVsbCxUPW51bGwsQz0hMTtpZihcIm51bWJlclwiPT10eXBlb2YgdClzPTB8dCxoPTB8ZXx8cztlbHNlIGlmKHQpe1MudHlwZSh0LFwib2JqZWN0XCIsXCJpbnZhbGlkIGFyZ3VtZW50cyBmb3IgZnJhbWVidWZmZXJcIik7dmFyIEk9dDtpZihcInNoYXBlXCJpbiBJKXt2YXIgUD1JLnNoYXBlO1MoQXJyYXkuaXNBcnJheShQKSYmUC5sZW5ndGg+PTIsXCJpbnZhbGlkIHNoYXBlIGZvciBmcmFtZWJ1ZmZlclwiKSxzPVBbMF0saD1QWzFdfWVsc2VcInJhZGl1c1wiaW4gSSYmKHM9aD1JLnJhZGl1cyksXCJ3aWR0aFwiaW4gSSYmKHM9SS53aWR0aCksXCJoZWlnaHRcImluIEkmJihoPUkuaGVpZ2h0KTsoXCJjb2xvclwiaW4gSXx8XCJjb2xvcnNcImluIEkpJiYoYj1JLmNvbG9yfHxJLmNvbG9ycyxBcnJheS5pc0FycmF5KGIpJiZTKDE9PT1iLmxlbmd0aHx8bi53ZWJnbF9kcmF3X2J1ZmZlcnMsXCJtdWx0aXBsZSByZW5kZXIgdGFyZ2V0cyBub3Qgc3VwcG9ydGVkXCIpKSxifHwoXCJjb2xvckNvdW50XCJpbiBJJiYoTz0wfEkuY29sb3JDb3VudCxTKE8+MCxcImludmFsaWQgY29sb3IgYnVmZmVyIGNvdW50XCIpKSxcImNvbG9yVGV4dHVyZVwiaW4gSSYmKHg9ISFJLmNvbG9yVGV4dHVyZSx3PVwicmdiYTRcIiksXCJjb2xvclR5cGVcImluIEkmJihFPUkuY29sb3JUeXBlLHg/KFMobi5vZXNfdGV4dHVyZV9mbG9hdHx8IShcImZsb2F0XCI9PT1FfHxcImZsb2F0MzJcIj09PUUpLFwieW91IG11c3QgZW5hYmxlIE9FU190ZXh0dXJlX2Zsb2F0IGluIG9yZGVyIHRvIHVzZSBmbG9hdGluZyBwb2ludCBmcmFtZWJ1ZmZlciBvYmplY3RzXCIpLFMobi5vZXNfdGV4dHVyZV9oYWxmX2Zsb2F0fHwhKFwiaGFsZiBmbG9hdFwiPT09RXx8XCJmbG9hdDE2XCI9PT1FKSxcInlvdSBtdXN0IGVuYWJsZSBPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IGluIG9yZGVyIHRvIHVzZSAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgZnJhbWVidWZmZXIgb2JqZWN0c1wiKSk6XCJoYWxmIGZsb2F0XCI9PT1FfHxcImZsb2F0MTZcIj09PUU/KFMobi5leHRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQsXCJ5b3UgbXVzdCBlbmFibGUgRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0IHRvIHVzZSAxNi1iaXQgcmVuZGVyIGJ1ZmZlcnNcIiksdz1cInJnYmExNmZcIik6XCJmbG9hdFwiIT09RSYmXCJmbG9hdDMyXCIhPT1FfHwoUyhuLndlYmdsX2NvbG9yX2J1ZmZlcl9mbG9hdCxcInlvdSBtdXN0IGVuYWJsZSBXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQgaW4gb3JkZXIgdG8gdXNlIDMyLWJpdCBmbG9hdGluZyBwb2ludCByZW5kZXJidWZmZXJzXCIpLHc9XCJyZ2JhMzJmXCIpLFMub25lT2YoRSxsLFwiaW52YWxpZCBjb2xvciB0eXBlXCIpKSxcImNvbG9yRm9ybWF0XCJpbiBJJiYodz1JLmNvbG9yRm9ybWF0LGMuaW5kZXhPZih3KT49MD94PSEwOmYuaW5kZXhPZih3KT49MD94PSExOng/Uy5vbmVPZihJLmNvbG9yRm9ybWF0LGMsXCJpbnZhbGlkIGNvbG9yIGZvcm1hdCBmb3IgdGV4dHVyZVwiKTpTLm9uZU9mKEkuY29sb3JGb3JtYXQsZixcImludmFsaWQgY29sb3IgZm9ybWF0IGZvciByZW5kZXJidWZmZXJcIikpKSwoXCJkZXB0aFRleHR1cmVcImluIEl8fFwiZGVwdGhTdGVuY2lsVGV4dHVyZVwiaW4gSSkmJihDPSEoIUkuZGVwdGhUZXh0dXJlJiYhSS5kZXB0aFN0ZW5jaWxUZXh0dXJlKSxTKCFDfHxuLndlYmdsX2RlcHRoX3RleHR1cmUsXCJ3ZWJnbF9kZXB0aF90ZXh0dXJlIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkXCIpKSxcImRlcHRoXCJpbiBJJiYoXCJib29sZWFuXCI9PXR5cGVvZiBJLmRlcHRoP2Q9SS5kZXB0aDooTT1JLmRlcHRoLGc9ITEpKSxcInN0ZW5jaWxcImluIEkmJihcImJvb2xlYW5cIj09dHlwZW9mIEkuc3RlbmNpbD9nPUkuc3RlbmNpbDooQT1JLnN0ZW5jaWwsZD0hMSkpLFwiZGVwdGhTdGVuY2lsXCJpbiBJJiYoXCJib29sZWFuXCI9PXR5cGVvZiBJLmRlcHRoU3RlbmNpbD9kPWc9SS5kZXB0aFN0ZW5jaWw6KFQ9SS5kZXB0aFN0ZW5jaWwsZD0hMSxnPSExKSl9ZWxzZSBzPWg9MTt2YXIgaj1udWxsLEQ9bnVsbCxOPW51bGwsUj1udWxsO2lmKEFycmF5LmlzQXJyYXkoYikpaj1iLm1hcCh2KTtlbHNlIGlmKGIpaj1bdihiKV07ZWxzZSBmb3Ioaj1uZXcgQXJyYXkoTyksaT0wO2k8TzsrK2kpaltpXT15KHMsaCx4LHcsRSk7UyhuLndlYmdsX2RyYXdfYnVmZmVyc3x8ai5sZW5ndGg8PTEsXCJ5b3UgbXVzdCBlbmFibGUgdGhlIFdFQkdMX2RyYXdfYnVmZmVycyBleHRlbnNpb24gaW4gb3JkZXIgdG8gdXNlIG11bHRpcGxlIGNvbG9yIGJ1ZmZlcnMuXCIpLFMoai5sZW5ndGg8PXIubWF4Q29sb3JBdHRhY2htZW50cyxcInRvbyBtYW55IGNvbG9yIGF0dGFjaG1lbnRzLCBub3Qgc3VwcG9ydGVkXCIpLHM9c3x8alswXS53aWR0aCxoPWh8fGpbMF0uaGVpZ2h0LE0/RD12KE0pOmQmJiFnJiYoRD15KHMsaCxDLFwiZGVwdGhcIixcInVpbnQzMlwiKSksQT9OPXYoQSk6ZyYmIWQmJihOPXkocyxoLCExLFwic3RlbmNpbFwiLFwidWludDhcIikpLFQ/Uj12KFQpOiFNJiYhQSYmZyYmZCYmKFI9eShzLGgsQyxcImRlcHRoIHN0ZW5jaWxcIixcImRlcHRoIHN0ZW5jaWxcIikpLFMoISFNKyEhQSshIVQ8PTEsXCJpbnZhbGlkIGZyYW1lYnVmZmVyIGNvbmZpZ3VyYXRpb24sIGNhbiBzcGVjaWZ5IGV4YWN0bHkgb25lIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudFwiKTt2YXIgTD1udWxsO2ZvcihpPTA7aTxqLmxlbmd0aDsrK2kpaWYocChqW2ldLHMsaCksUyghaltpXXx8altpXS50ZXh0dXJlJiZBdC5pbmRleE9mKGpbaV0udGV4dHVyZS5fdGV4dHVyZS5mb3JtYXQpPj0wfHxqW2ldLnJlbmRlcmJ1ZmZlciYmSXQuaW5kZXhPZihqW2ldLnJlbmRlcmJ1ZmZlci5fcmVuZGVyYnVmZmVyLmZvcm1hdCk+PTAsXCJmcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IFwiK2krXCIgaXMgaW52YWxpZFwiKSxqW2ldJiZqW2ldLnRleHR1cmUpe3ZhciBCPVR0W2pbaV0udGV4dHVyZS5fdGV4dHVyZS5mb3JtYXRdKkN0W2pbaV0udGV4dHVyZS5fdGV4dHVyZS50eXBlXTtudWxsPT09TD9MPUI6UyhMPT09QixcImFsbCBjb2xvciBhdHRhY2htZW50cyBtdWNoIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsLlwiKX1yZXR1cm4gcChELHMsaCksUyghRHx8RC50ZXh0dXJlJiY2NDAyPT09RC50ZXh0dXJlLl90ZXh0dXJlLmZvcm1hdHx8RC5yZW5kZXJidWZmZXImJjMzMTg5PT09RC5yZW5kZXJidWZmZXIuX3JlbmRlcmJ1ZmZlci5mb3JtYXQsXCJpbnZhbGlkIGRlcHRoIGF0dGFjaG1lbnQgZm9yIGZyYW1lYnVmZmVyIG9iamVjdFwiKSxwKE4scyxoKSxTKCFOfHxOLnJlbmRlcmJ1ZmZlciYmMzYxNjg9PT1OLnJlbmRlcmJ1ZmZlci5fcmVuZGVyYnVmZmVyLmZvcm1hdCxcImludmFsaWQgc3RlbmNpbCBhdHRhY2htZW50IGZvciBmcmFtZWJ1ZmZlciBvYmplY3RcIikscChSLHMsaCksUyghUnx8Ui50ZXh0dXJlJiYzNDA0MT09PVIudGV4dHVyZS5fdGV4dHVyZS5mb3JtYXR8fFIucmVuZGVyYnVmZmVyJiYzNDA0MT09PVIucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIuZm9ybWF0LFwiaW52YWxpZCBkZXB0aC1zdGVuY2lsIGF0dGFjaG1lbnQgZm9yIGZyYW1lYnVmZmVyIG9iamVjdFwiKSxfKG8pLG8ud2lkdGg9cyxvLmhlaWdodD1oLG8uY29sb3JBdHRhY2htZW50cz1qLG8uZGVwdGhBdHRhY2htZW50PUQsby5zdGVuY2lsQXR0YWNobWVudD1OLG8uZGVwdGhTdGVuY2lsQXR0YWNobWVudD1SLGEuY29sb3I9ai5tYXAobSksYS5kZXB0aD1tKEQpLGEuc3RlbmNpbD1tKE4pLGEuZGVwdGhTdGVuY2lsPW0oUiksYS53aWR0aD1vLndpZHRoLGEuaGVpZ2h0PW8uaGVpZ2h0LGsobyksYX1yZXR1cm4gcy5mcmFtZWJ1ZmZlckNvdW50KyssYSh0LGkpLGUoYSx7cmVzaXplOmZ1bmN0aW9uKHQsZSl7Uyh1Lm5leHQhPT1vLFwiY2FuIG5vdCByZXNpemUgYSBmcmFtZWJ1ZmZlciB3aGljaCBpcyBjdXJyZW50bHkgaW4gdXNlXCIpO3ZhciBuPU1hdGgubWF4KDB8dCwxKSxyPU1hdGgubWF4KDB8ZXx8biwxKTtpZihuPT09by53aWR0aCYmcj09PW8uaGVpZ2h0KXJldHVybiBhO2Zvcih2YXIgaT1vLmNvbG9yQXR0YWNobWVudHMscz0wO3M8aS5sZW5ndGg7KytzKWIoaVtzXSxuLHIpO3JldHVybiBiKG8uZGVwdGhBdHRhY2htZW50LG4sciksYihvLnN0ZW5jaWxBdHRhY2htZW50LG4sciksYihvLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQsbixyKSxvLndpZHRoPWEud2lkdGg9bixvLmhlaWdodD1hLmhlaWdodD1yLGsobyksYX0sX3JlZ2xUeXBlOlwiZnJhbWVidWZmZXJcIixfZnJhbWVidWZmZXI6byxkZXN0cm95OmZ1bmN0aW9uKCl7TyhvKSxfKG8pfSx1c2U6ZnVuY3Rpb24odCl7dS5zZXRGQk8oe2ZyYW1lYnVmZmVyOmF9LHQpfX0pfXJldHVybiBlKHUse2dldEZyYW1lYnVmZmVyOmZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJlwiZnJhbWVidWZmZXJcIj09PXQuX3JlZ2xUeXBlKXt2YXIgZT10Ll9mcmFtZWJ1ZmZlcjtpZihlIGluc3RhbmNlb2YgRSlyZXR1cm4gZX1yZXR1cm4gbnVsbH0sY3JlYXRlOk0sY3JlYXRlQ3ViZTpmdW5jdGlvbih0KXt2YXIgbz1BcnJheSg2KTtmdW5jdGlvbiBhKHQpe3ZhciByO1Moby5pbmRleE9mKHUubmV4dCk8MCxcImNhbiBub3QgdXBkYXRlIGZyYW1lYnVmZmVyIHdoaWNoIGlzIGN1cnJlbnRseSBpbiB1c2VcIik7dmFyIHMsZj17Y29sb3I6bnVsbH0saD0wLGQ9bnVsbCxwPVwicmdiYVwiLGc9XCJ1aW50OFwiLHY9MTtpZihcIm51bWJlclwiPT10eXBlb2YgdCloPTB8dDtlbHNlIGlmKHQpe1MudHlwZSh0LFwib2JqZWN0XCIsXCJpbnZhbGlkIGFyZ3VtZW50cyBmb3IgZnJhbWVidWZmZXJcIik7dmFyIHk9dDtpZihcInNoYXBlXCJpbiB5KXt2YXIgbT15LnNoYXBlO1MoQXJyYXkuaXNBcnJheShtKSYmbS5sZW5ndGg+PTIsXCJpbnZhbGlkIHNoYXBlIGZvciBmcmFtZWJ1ZmZlclwiKSxTKG1bMF09PT1tWzFdLFwiY3ViZSBmcmFtZWJ1ZmZlciBtdXN0IGJlIHNxdWFyZVwiKSxoPW1bMF19ZWxzZVwicmFkaXVzXCJpbiB5JiYoaD0wfHkucmFkaXVzKSxcIndpZHRoXCJpbiB5PyhoPTB8eS53aWR0aCxcImhlaWdodFwiaW4geSYmUyh5LmhlaWdodD09PWgsXCJtdXN0IGJlIHNxdWFyZVwiKSk6XCJoZWlnaHRcImluIHkmJihoPTB8eS5oZWlnaHQpOyhcImNvbG9yXCJpbiB5fHxcImNvbG9yc1wiaW4geSkmJihkPXkuY29sb3J8fHkuY29sb3JzLEFycmF5LmlzQXJyYXkoZCkmJlMoMT09PWQubGVuZ3RofHxuLndlYmdsX2RyYXdfYnVmZmVycyxcIm11bHRpcGxlIHJlbmRlciB0YXJnZXRzIG5vdCBzdXBwb3J0ZWRcIikpLGR8fChcImNvbG9yQ291bnRcImluIHkmJih2PTB8eS5jb2xvckNvdW50LFModj4wLFwiaW52YWxpZCBjb2xvciBidWZmZXIgY291bnRcIikpLFwiY29sb3JUeXBlXCJpbiB5JiYoUy5vbmVPZih5LmNvbG9yVHlwZSxsLFwiaW52YWxpZCBjb2xvciB0eXBlXCIpLGc9eS5jb2xvclR5cGUpLFwiY29sb3JGb3JtYXRcImluIHkmJihwPXkuY29sb3JGb3JtYXQsUy5vbmVPZih5LmNvbG9yRm9ybWF0LGMsXCJpbnZhbGlkIGNvbG9yIGZvcm1hdCBmb3IgdGV4dHVyZVwiKSkpLFwiZGVwdGhcImluIHkmJihmLmRlcHRoPXkuZGVwdGgpLFwic3RlbmNpbFwiaW4geSYmKGYuc3RlbmNpbD15LnN0ZW5jaWwpLFwiZGVwdGhTdGVuY2lsXCJpbiB5JiYoZi5kZXB0aFN0ZW5jaWw9eS5kZXB0aFN0ZW5jaWwpfWVsc2UgaD0xO2lmKGQpaWYoQXJyYXkuaXNBcnJheShkKSlmb3Iocz1bXSxyPTA7cjxkLmxlbmd0aDsrK3Ipc1tyXT1kW3JdO2Vsc2Ugcz1bZF07ZWxzZXtzPUFycmF5KHYpO3ZhciBiPXtyYWRpdXM6aCxmb3JtYXQ6cCx0eXBlOmd9O2ZvcihyPTA7cjx2OysrcilzW3JdPWkuY3JlYXRlQ3ViZShiKX1mb3IoZi5jb2xvcj1BcnJheShzLmxlbmd0aCkscj0wO3I8cy5sZW5ndGg7KytyKXt2YXIgeD1zW3JdO1MoXCJmdW5jdGlvblwiPT10eXBlb2YgeCYmXCJ0ZXh0dXJlQ3ViZVwiPT09eC5fcmVnbFR5cGUsXCJpbnZhbGlkIGN1YmUgbWFwXCIpLGg9aHx8eC53aWR0aCxTKHgud2lkdGg9PT1oJiZ4LmhlaWdodD09PWgsXCJpbnZhbGlkIGN1YmUgbWFwIHNoYXBlXCIpLGYuY29sb3Jbcl09e3RhcmdldDozNDA2OSxkYXRhOnNbcl19fWZvcihyPTA7cjw2Oysrcil7Zm9yKHZhciB3PTA7dzxzLmxlbmd0aDsrK3cpZi5jb2xvclt3XS50YXJnZXQ9MzQwNjkrcjtyPjAmJihmLmRlcHRoPW9bMF0uZGVwdGgsZi5zdGVuY2lsPW9bMF0uc3RlbmNpbCxmLmRlcHRoU3RlbmNpbD1vWzBdLmRlcHRoU3RlbmNpbCksb1tyXT9vW3JdKGYpOm9bcl09TShmKX1yZXR1cm4gZShhLHt3aWR0aDpoLGhlaWdodDpoLGNvbG9yOnN9KX1yZXR1cm4gYSh0KSxlKGEse2ZhY2VzOm8scmVzaXplOmZ1bmN0aW9uKHQpe3ZhciBlLG49MHx0O2lmKFMobj4wJiZuPD1yLm1heEN1YmVNYXBTaXplLFwiaW52YWxpZCByYWRpdXMgZm9yIGN1YmUgZmJvXCIpLG49PT1hLndpZHRoKXJldHVybiBhO3ZhciBpPWEuY29sb3I7Zm9yKGU9MDtlPGkubGVuZ3RoOysrZSlpW2VdLnJlc2l6ZShuKTtmb3IoZT0wO2U8NjsrK2Upb1tlXS5yZXNpemUobik7cmV0dXJuIGEud2lkdGg9YS5oZWlnaHQ9bixhfSxfcmVnbFR5cGU6XCJmcmFtZWJ1ZmZlckN1YmVcIixkZXN0cm95OmZ1bmN0aW9uKCl7by5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmRlc3Ryb3koKX0pKX19KX0sY2xlYXI6ZnVuY3Rpb24oKXtCKHcpLmZvckVhY2goTyl9LHJlc3RvcmU6ZnVuY3Rpb24oKXt1LmN1cj1udWxsLHUubmV4dD1udWxsLHUuZGlydHk9ITAsQih3KS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmZyYW1lYnVmZmVyPXQuY3JlYXRlRnJhbWVidWZmZXIoKSxrKGUpfSkpfX0pfShpLGQsYixPLGssaCksST1mZShpLGwsZCxiLHgsRSwwLEMse30sdyxfLHtlbGVtZW50czpudWxsLHByaW1pdGl2ZTo0LGNvdW50Oi0xLG9mZnNldDowLGluc3RhbmNlczotMX0sbSxwLHIpLGo9RHQoaSxDLEkucHJvY3MucG9sbCxtLG8sZCxiKSxEPUkubmV4dCxOPWkuY2FudmFzLEc9W10sRj1bXSxVPVtdLFE9W3Iub25EZXN0cm95XSxKPW51bGw7ZnVuY3Rpb24gJCgpe2lmKDA9PT1HLmxlbmd0aClyZXR1cm4gcCYmcC51cGRhdGUoKSx2b2lkKEo9bnVsbCk7Sj1BLm5leHQoJCksY3QoKTtmb3IodmFyIHQ9Ry5sZW5ndGgtMTt0Pj0wOy0tdCl7dmFyIGU9R1t0XTtlJiZlKG0sbnVsbCwwKX1pLmZsdXNoKCkscCYmcC51cGRhdGUoKX1mdW5jdGlvbiB0dCgpeyFKJiZHLmxlbmd0aD4wJiYoSj1BLm5leHQoJCkpfWZ1bmN0aW9uIGV0KCl7SiYmKEEuY2FuY2VsKCQpLEo9bnVsbCl9ZnVuY3Rpb24gbnQodCl7dC5wcmV2ZW50RGVmYXVsdCgpLHM9ITAsZXQoKSxGLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QoKX0pKX1mdW5jdGlvbiBydCh0KXtpLmdldEVycm9yKCkscz0hMSx1LnJlc3RvcmUoKSxfLnJlc3RvcmUoKSx4LnJlc3RvcmUoKSxPLnJlc3RvcmUoKSxrLnJlc3RvcmUoKSxDLnJlc3RvcmUoKSx3LnJlc3RvcmUoKSxwJiZwLnJlc3RvcmUoKSxJLnByb2NzLnJlZnJlc2goKSx0dCgpLFUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dCgpfSkpfWZ1bmN0aW9uIGl0KHQpe2Z1bmN0aW9uIG4odCxlKXt2YXIgbj17fSxyPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihpKXt2YXIgbz10W2ldO2lmKE0uaXNEeW5hbWljKG8pKXJbaV09TS51bmJveChvLGkpO2Vsc2V7aWYoZSYmQXJyYXkuaXNBcnJheShvKSlmb3IodmFyIGE9MDthPG8ubGVuZ3RoOysrYSlpZihNLmlzRHluYW1pYyhvW2FdKSlyZXR1cm4gdm9pZChyW2ldPU0udW5ib3gobyxpKSk7bltpXT1vfX0pKSx7ZHluYW1pYzpyLHN0YXRpYzpufX1TKCEhdCxcImludmFsaWQgYXJncyB0byByZWdsKHsuLi59KVwiKSxTLnR5cGUodCxcIm9iamVjdFwiLFwiaW52YWxpZCBhcmdzIHRvIHJlZ2woey4uLn0pXCIpO3ZhciByPW4odC5jb250ZXh0fHx7fSwhMCksaT1uKHQudW5pZm9ybXN8fHt9LCEwKSxvPW4odC5hdHRyaWJ1dGVzfHx7fSwhMSksYT1uKGZ1bmN0aW9uKHQpe3ZhciBuPWUoe30sdCk7ZnVuY3Rpb24gcih0KXtpZih0IGluIG4pe3ZhciBlPW5bdF07ZGVsZXRlIG5bdF0sT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24ocil7blt0K1wiLlwiK3JdPWVbcl19KSl9fXJldHVybiBkZWxldGUgbi51bmlmb3JtcyxkZWxldGUgbi5hdHRyaWJ1dGVzLGRlbGV0ZSBuLmNvbnRleHQsZGVsZXRlIG4udmFvLFwic3RlbmNpbFwiaW4gbiYmbi5zdGVuY2lsLm9wJiYobi5zdGVuY2lsLm9wQmFjaz1uLnN0ZW5jaWwub3BGcm9udD1uLnN0ZW5jaWwub3AsZGVsZXRlIG4uc3RlbmNpbC5vcCkscihcImJsZW5kXCIpLHIoXCJkZXB0aFwiKSxyKFwiY3VsbFwiKSxyKFwic3RlbmNpbFwiKSxyKFwicG9seWdvbk9mZnNldFwiKSxyKFwic2Npc3NvclwiKSxyKFwic2FtcGxlXCIpLFwidmFvXCJpbiB0JiYobi52YW89dC52YW8pLG59KHQpLCExKSx1PXtncHVUaW1lOjAsY3B1VGltZTowLGNvdW50OjB9LGM9SS5jb21waWxlKGEsbyxpLHIsdSksZj1jLmRyYXcsbD1jLmJhdGNoLGg9Yy5zY29wZSxkPVtdO3JldHVybiBlKChmdW5jdGlvbih0LGUpe3ZhciBuO2lmKHMmJlMucmFpc2UoXCJjb250ZXh0IGxvc3RcIiksXCJmdW5jdGlvblwiPT10eXBlb2YgdClyZXR1cm4gaC5jYWxsKHRoaXMsbnVsbCx0LDApO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGUpaWYoXCJudW1iZXJcIj09dHlwZW9mIHQpZm9yKG49MDtuPHQ7KytuKWguY2FsbCh0aGlzLG51bGwsZSxuKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBoLmNhbGwodGhpcyx0LGUsMCk7Zm9yKG49MDtuPHQubGVuZ3RoOysrbiloLmNhbGwodGhpcyx0W25dLGUsbil9ZWxzZSBpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYodD4wKXJldHVybiBsLmNhbGwodGhpcyxmdW5jdGlvbih0KXtmb3IoO2QubGVuZ3RoPHQ7KWQucHVzaChudWxsKTtyZXR1cm4gZH0oMHx0KSwwfHQpfWVsc2V7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGYuY2FsbCh0aGlzLHQpO2lmKHQubGVuZ3RoKXJldHVybiBsLmNhbGwodGhpcyx0LHQubGVuZ3RoKX19KSx7c3RhdHM6dSxkZXN0cm95OmZ1bmN0aW9uKCl7Yy5kZXN0cm95KCl9fSl9TiYmKE4uYWRkRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dGxvc3RcIixudCwhMSksTi5hZGRFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0cmVzdG9yZWRcIixydCwhMSkpO3ZhciBvdD1DLnNldEZCTz1pdCh7ZnJhbWVidWZmZXI6TS5kZWZpbmUuY2FsbChudWxsLDEsXCJmcmFtZWJ1ZmZlclwiKX0pO2Z1bmN0aW9uIGF0KHQsZSl7dmFyIG49MDtJLnByb2NzLnBvbGwoKTt2YXIgcj1lLmNvbG9yO3ImJihpLmNsZWFyQ29sb3IoK3JbMF18fDAsK3JbMV18fDAsK3JbMl18fDAsK3JbM118fDApLG58PTE2Mzg0KSxcImRlcHRoXCJpbiBlJiYoaS5jbGVhckRlcHRoKCtlLmRlcHRoKSxufD0yNTYpLFwic3RlbmNpbFwiaW4gZSYmKGkuY2xlYXJTdGVuY2lsKDB8ZS5zdGVuY2lsKSxufD0xMDI0KSxTKCEhbixcImNhbGxlZCByZWdsLmNsZWFyIHdpdGggbm8gYnVmZmVyIHNwZWNpZmllZFwiKSxpLmNsZWFyKG4pfWZ1bmN0aW9uIHN0KHQpe3JldHVybiBTLnR5cGUodCxcImZ1bmN0aW9uXCIsXCJyZWdsLmZyYW1lKCkgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpLEcucHVzaCh0KSx0dCgpLHtjYW5jZWw6ZnVuY3Rpb24oKXt2YXIgZT1oZShHLHQpO1MoZT49MCxcImNhbm5vdCBjYW5jZWwgYSBmcmFtZSB0d2ljZVwiKSxHW2VdPWZ1bmN0aW9uIHQoKXt2YXIgZT1oZShHLHQpO0dbZV09R1tHLmxlbmd0aC0xXSxHLmxlbmd0aC09MSxHLmxlbmd0aDw9MCYmZXQoKX19fX1mdW5jdGlvbiB1dCgpe3ZhciB0PUQudmlld3BvcnQsZT1ELnNjaXNzb3JfYm94O3RbMF09dFsxXT1lWzBdPWVbMV09MCxtLnZpZXdwb3J0V2lkdGg9bS5mcmFtZWJ1ZmZlcldpZHRoPW0uZHJhd2luZ0J1ZmZlcldpZHRoPXRbMl09ZVsyXT1pLmRyYXdpbmdCdWZmZXJXaWR0aCxtLnZpZXdwb3J0SGVpZ2h0PW0uZnJhbWVidWZmZXJIZWlnaHQ9bS5kcmF3aW5nQnVmZmVySGVpZ2h0PXRbM109ZVszXT1pLmRyYXdpbmdCdWZmZXJIZWlnaHR9ZnVuY3Rpb24gY3QoKXttLnRpY2srPTEsbS50aW1lPWx0KCksdXQoKSxJLnByb2NzLnBvbGwoKX1mdW5jdGlvbiBmdCgpe08ucmVmcmVzaCgpLHV0KCksSS5wcm9jcy5yZWZyZXNoKCkscCYmcC51cGRhdGUoKX1mdW5jdGlvbiBsdCgpe3JldHVybihUKCktZykvMWUzfWZ0KCk7dmFyIGh0PWUoaXQse2NsZWFyOmZ1bmN0aW9uKHQpe2lmKFMoXCJvYmplY3RcIj09PWEodCkmJnQsXCJyZWdsLmNsZWFyKCkgdGFrZXMgYW4gb2JqZWN0IGFzIGlucHV0XCIpLFwiZnJhbWVidWZmZXJcImluIHQpaWYodC5mcmFtZWJ1ZmZlciYmXCJmcmFtZWJ1ZmZlckN1YmVcIj09PXQuZnJhbWVidWZmZXJfcmVnbFR5cGUpZm9yKHZhciBuPTA7bjw2OysrbilvdChlKHtmcmFtZWJ1ZmZlcjp0LmZyYW1lYnVmZmVyLmZhY2VzW25dfSx0KSxhdCk7ZWxzZSBvdCh0LGF0KTtlbHNlIGF0KDAsdCl9LHByb3A6TS5kZWZpbmUuYmluZChudWxsLDEpLGNvbnRleHQ6TS5kZWZpbmUuYmluZChudWxsLDIpLHRoaXM6TS5kZWZpbmUuYmluZChudWxsLDMpLGRyYXc6aXQoe30pLGJ1ZmZlcjpmdW5jdGlvbih0KXtyZXR1cm4geC5jcmVhdGUodCwzNDk2MiwhMSwhMSl9LGVsZW1lbnRzOmZ1bmN0aW9uKHQpe3JldHVybiBFLmNyZWF0ZSh0LCExKX0sdGV4dHVyZTpPLmNyZWF0ZTJELGN1YmU6Ty5jcmVhdGVDdWJlLHJlbmRlcmJ1ZmZlcjprLmNyZWF0ZSxmcmFtZWJ1ZmZlcjpDLmNyZWF0ZSxmcmFtZWJ1ZmZlckN1YmU6Qy5jcmVhdGVDdWJlLHZhbzp3LmNyZWF0ZVZBTyxhdHRyaWJ1dGVzOm8sZnJhbWU6c3Qsb246ZnVuY3Rpb24odCxlKXt2YXIgbjtzd2l0Y2goUy50eXBlKGUsXCJmdW5jdGlvblwiLFwibGlzdGVuZXIgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpLHQpe2Nhc2VcImZyYW1lXCI6cmV0dXJuIHN0KGUpO2Nhc2VcImxvc3RcIjpuPUY7YnJlYWs7Y2FzZVwicmVzdG9yZVwiOm49VTticmVhaztjYXNlXCJkZXN0cm95XCI6bj1RO2JyZWFrO2RlZmF1bHQ6Uy5yYWlzZShcImludmFsaWQgZXZlbnQsIG11c3QgYmUgb25lIG9mIGZyYW1lLGxvc3QscmVzdG9yZSxkZXN0cm95XCIpfXJldHVybiBuLnB1c2goZSkse2NhbmNlbDpmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7Kyt0KWlmKG5bdF09PT1lKXJldHVybiBuW3RdPW5bbi5sZW5ndGgtMV0sdm9pZCBuLnBvcCgpfX19LGxpbWl0czpiLGhhc0V4dGVuc2lvbjpmdW5jdGlvbih0KXtyZXR1cm4gYi5leHRlbnNpb25zLmluZGV4T2YodC50b0xvd2VyQ2FzZSgpKT49MH0scmVhZDpqLGRlc3Ryb3k6ZnVuY3Rpb24oKXtHLmxlbmd0aD0wLGV0KCksTiYmKE4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dGxvc3RcIixudCksTi5yZW1vdmVFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0cmVzdG9yZWRcIixydCkpLF8uY2xlYXIoKSxDLmNsZWFyKCksay5jbGVhcigpLE8uY2xlYXIoKSxFLmNsZWFyKCkseC5jbGVhcigpLHcuY2xlYXIoKSxwJiZwLmNsZWFyKCksUS5mb3JFYWNoKChmdW5jdGlvbih0KXt0KCl9KSl9LF9nbDppLF9yZWZyZXNoOmZ0LHBvbGw6ZnVuY3Rpb24oKXtjdCgpLHAmJnAudXBkYXRlKCl9LG5vdzpsdCxzdGF0czpofSk7cmV0dXJuIHIub25Eb25lKG51bGwsaHQpLGh0fX0sXCJvYmplY3RcIj09PWEoZSkmJnZvaWQgMCE9PXQ/dC5leHBvcnRzPW8oKTp2b2lkIDA9PT0oaT1cImZ1bmN0aW9uXCI9PXR5cGVvZihyPW8pP3IuY2FsbChlLG4sZSx0KTpyKXx8KHQuZXhwb3J0cz1pKX0sLCwsLCwsLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4MiksaT1uKDI4Myksbz17fTtmb3IodmFyIGEgaW4gcilyLmhhc093blByb3BlcnR5KGEpJiYob1tyW2FdXT1hKTt2YXIgcz10LmV4cG9ydHM9e3RvOnt9LGdldDp7fX07ZnVuY3Rpb24gdSh0LGUsbil7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGUsdCksbil9ZnVuY3Rpb24gYyh0KXt2YXIgZT10LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO3JldHVybiBlLmxlbmd0aDwyP1wiMFwiK2U6ZX1zLmdldD1mdW5jdGlvbih0KXt2YXIgZSxuO3N3aXRjaCh0LnN1YnN0cmluZygwLDMpLnRvTG93ZXJDYXNlKCkpe2Nhc2VcImhzbFwiOmU9cy5nZXQuaHNsKHQpLG49XCJoc2xcIjticmVhaztjYXNlXCJod2JcIjplPXMuZ2V0Lmh3Yih0KSxuPVwiaHdiXCI7YnJlYWs7ZGVmYXVsdDplPXMuZ2V0LnJnYih0KSxuPVwicmdiXCJ9cmV0dXJuIGU/e21vZGVsOm4sdmFsdWU6ZX06bnVsbH0scy5nZXQucmdiPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciBlLG4saSxvPVswLDAsMCwxXTtpZihlPXQubWF0Y2goL14jKFthLWYwLTldezZ9KShbYS1mMC05XXsyfSk/JC9pKSl7Zm9yKGk9ZVsyXSxlPWVbMV0sbj0wO248MztuKyspe3ZhciBhPTIqbjtvW25dPXBhcnNlSW50KGUuc2xpY2UoYSxhKzIpLDE2KX1pJiYob1szXT1wYXJzZUludChpLDE2KS8yNTUpfWVsc2UgaWYoZT10Lm1hdGNoKC9eIyhbYS1mMC05XXszLDR9KSQvaSkpe2ZvcihpPShlPWVbMV0pWzNdLG49MDtuPDM7bisrKW9bbl09cGFyc2VJbnQoZVtuXStlW25dLDE2KTtpJiYob1szXT1wYXJzZUludChpK2ksMTYpLzI1NSl9ZWxzZSBpZihlPXQubWF0Y2goL15yZ2JhP1xcKFxccyooWystXT9cXGQrKVxccyosXFxzKihbKy1dP1xcZCspXFxzKixcXHMqKFsrLV0/XFxkKylcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpJC8pKXtmb3Iobj0wO248MztuKyspb1tuXT1wYXJzZUludChlW24rMV0sMCk7ZVs0XSYmKG9bM109cGFyc2VGbG9hdChlWzRdKSl9ZWxzZXtpZighKGU9dC5tYXRjaCgvXnJnYmE/XFwoXFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLFxccyooWystXT9bXFxkXFwuXSspXFwlXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyooPzosXFxzKihbKy1dP1tcXGRcXC5dKylcXHMqKT9cXCkkLykpKXJldHVybihlPXQubWF0Y2goLyhcXEQrKS8pKT9cInRyYW5zcGFyZW50XCI9PT1lWzFdP1swLDAsMCwwXToobz1yW2VbMV1dKT8ob1szXT0xLG8pOm51bGw6bnVsbDtmb3Iobj0wO248MztuKyspb1tuXT1NYXRoLnJvdW5kKDIuNTUqcGFyc2VGbG9hdChlW24rMV0pKTtlWzRdJiYob1szXT1wYXJzZUZsb2F0KGVbNF0pKX1mb3Iobj0wO248MztuKyspb1tuXT11KG9bbl0sMCwyNTUpO3JldHVybiBvWzNdPXUob1szXSwwLDEpLG99LHMuZ2V0LmhzbD1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gbnVsbDt2YXIgZT10Lm1hdGNoKC9eaHNsYT9cXChcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKykoPzpkZWcpP1xccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpJC8pO2lmKGUpe3ZhciBuPXBhcnNlRmxvYXQoZVs0XSk7cmV0dXJuWyhwYXJzZUZsb2F0KGVbMV0pKzM2MCklMzYwLHUocGFyc2VGbG9hdChlWzJdKSwwLDEwMCksdShwYXJzZUZsb2F0KGVbM10pLDAsMTAwKSx1KGlzTmFOKG4pPzE6biwwLDEpXX1yZXR1cm4gbnVsbH0scy5nZXQuaHdiPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciBlPXQubWF0Y2goL15od2JcXChcXHMqKFsrLV0/XFxkKltcXC5dP1xcZCspKD86ZGVnKT9cXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKig/OixcXHMqKFsrLV0/W1xcZFxcLl0rKVxccyopP1xcKSQvKTtpZihlKXt2YXIgbj1wYXJzZUZsb2F0KGVbNF0pO3JldHVyblsocGFyc2VGbG9hdChlWzFdKSUzNjArMzYwKSUzNjAsdShwYXJzZUZsb2F0KGVbMl0pLDAsMTAwKSx1KHBhcnNlRmxvYXQoZVszXSksMCwxMDApLHUoaXNOYU4obik/MTpuLDAsMSldfXJldHVybiBudWxsfSxzLnRvLmhleD1mdW5jdGlvbigpe3ZhciB0PWkoYXJndW1lbnRzKTtyZXR1cm5cIiNcIitjKHRbMF0pK2ModFsxXSkrYyh0WzJdKSsodFszXTwxP2MoTWF0aC5yb3VuZCgyNTUqdFszXSkpOlwiXCIpfSxzLnRvLnJnYj1mdW5jdGlvbigpe3ZhciB0PWkoYXJndW1lbnRzKTtyZXR1cm4gdC5sZW5ndGg8NHx8MT09PXRbM10/XCJyZ2IoXCIrTWF0aC5yb3VuZCh0WzBdKStcIiwgXCIrTWF0aC5yb3VuZCh0WzFdKStcIiwgXCIrTWF0aC5yb3VuZCh0WzJdKStcIilcIjpcInJnYmEoXCIrTWF0aC5yb3VuZCh0WzBdKStcIiwgXCIrTWF0aC5yb3VuZCh0WzFdKStcIiwgXCIrTWF0aC5yb3VuZCh0WzJdKStcIiwgXCIrdFszXStcIilcIn0scy50by5yZ2IucGVyY2VudD1mdW5jdGlvbigpe3ZhciB0PWkoYXJndW1lbnRzKSxlPU1hdGgucm91bmQodFswXS8yNTUqMTAwKSxuPU1hdGgucm91bmQodFsxXS8yNTUqMTAwKSxyPU1hdGgucm91bmQodFsyXS8yNTUqMTAwKTtyZXR1cm4gdC5sZW5ndGg8NHx8MT09PXRbM10/XCJyZ2IoXCIrZStcIiUsIFwiK24rXCIlLCBcIityK1wiJSlcIjpcInJnYmEoXCIrZStcIiUsIFwiK24rXCIlLCBcIityK1wiJSwgXCIrdFszXStcIilcIn0scy50by5oc2w9ZnVuY3Rpb24oKXt2YXIgdD1pKGFyZ3VtZW50cyk7cmV0dXJuIHQubGVuZ3RoPDR8fDE9PT10WzNdP1wiaHNsKFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIlLCBcIit0WzJdK1wiJSlcIjpcImhzbGEoXCIrdFswXStcIiwgXCIrdFsxXStcIiUsIFwiK3RbMl0rXCIlLCBcIit0WzNdK1wiKVwifSxzLnRvLmh3Yj1mdW5jdGlvbigpe3ZhciB0PWkoYXJndW1lbnRzKSxlPVwiXCI7cmV0dXJuIHQubGVuZ3RoPj00JiYxIT09dFszXSYmKGU9XCIsIFwiK3RbM10pLFwiaHdiKFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIlLCBcIit0WzJdK1wiJVwiK2UrXCIpXCJ9LHMudG8ua2V5d29yZD1mdW5jdGlvbih0KXtyZXR1cm4gb1t0LnNsaWNlKDAsMyldfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3QuZXhwb3J0cz17YWxpY2VibHVlOlsyNDAsMjQ4LDI1NV0sYW50aXF1ZXdoaXRlOlsyNTAsMjM1LDIxNV0sYXF1YTpbMCwyNTUsMjU1XSxhcXVhbWFyaW5lOlsxMjcsMjU1LDIxMl0sYXp1cmU6WzI0MCwyNTUsMjU1XSxiZWlnZTpbMjQ1LDI0NSwyMjBdLGJpc3F1ZTpbMjU1LDIyOCwxOTZdLGJsYWNrOlswLDAsMF0sYmxhbmNoZWRhbG1vbmQ6WzI1NSwyMzUsMjA1XSxibHVlOlswLDAsMjU1XSxibHVldmlvbGV0OlsxMzgsNDMsMjI2XSxicm93bjpbMTY1LDQyLDQyXSxidXJseXdvb2Q6WzIyMiwxODQsMTM1XSxjYWRldGJsdWU6Wzk1LDE1OCwxNjBdLGNoYXJ0cmV1c2U6WzEyNywyNTUsMF0sY2hvY29sYXRlOlsyMTAsMTA1LDMwXSxjb3JhbDpbMjU1LDEyNyw4MF0sY29ybmZsb3dlcmJsdWU6WzEwMCwxNDksMjM3XSxjb3Juc2lsazpbMjU1LDI0OCwyMjBdLGNyaW1zb246WzIyMCwyMCw2MF0sY3lhbjpbMCwyNTUsMjU1XSxkYXJrYmx1ZTpbMCwwLDEzOV0sZGFya2N5YW46WzAsMTM5LDEzOV0sZGFya2dvbGRlbnJvZDpbMTg0LDEzNCwxMV0sZGFya2dyYXk6WzE2OSwxNjksMTY5XSxkYXJrZ3JlZW46WzAsMTAwLDBdLGRhcmtncmV5OlsxNjksMTY5LDE2OV0sZGFya2toYWtpOlsxODksMTgzLDEwN10sZGFya21hZ2VudGE6WzEzOSwwLDEzOV0sZGFya29saXZlZ3JlZW46Wzg1LDEwNyw0N10sZGFya29yYW5nZTpbMjU1LDE0MCwwXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0XSxkYXJrcmVkOlsxMzksMCwwXSxkYXJrc2FsbW9uOlsyMzMsMTUwLDEyMl0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0M10sZGFya3NsYXRlYmx1ZTpbNzIsNjEsMTM5XSxkYXJrc2xhdGVncmF5Ols0Nyw3OSw3OV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzldLGRhcmt0dXJxdW9pc2U6WzAsMjA2LDIwOV0sZGFya3Zpb2xldDpbMTQ4LDAsMjExXSxkZWVwcGluazpbMjU1LDIwLDE0N10sZGVlcHNreWJsdWU6WzAsMTkxLDI1NV0sZGltZ3JheTpbMTA1LDEwNSwxMDVdLGRpbWdyZXk6WzEwNSwxMDUsMTA1XSxkb2RnZXJibHVlOlszMCwxNDQsMjU1XSxmaXJlYnJpY2s6WzE3OCwzNCwzNF0sZmxvcmFsd2hpdGU6WzI1NSwyNTAsMjQwXSxmb3Jlc3RncmVlbjpbMzQsMTM5LDM0XSxmdWNoc2lhOlsyNTUsMCwyNTVdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjBdLGdob3N0d2hpdGU6WzI0OCwyNDgsMjU1XSxnb2xkOlsyNTUsMjE1LDBdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMl0sZ3JheTpbMTI4LDEyOCwxMjhdLGdyZWVuOlswLDEyOCwwXSxncmVlbnllbGxvdzpbMTczLDI1NSw0N10sZ3JleTpbMTI4LDEyOCwxMjhdLGhvbmV5ZGV3OlsyNDAsMjU1LDI0MF0saG90cGluazpbMjU1LDEwNSwxODBdLGluZGlhbnJlZDpbMjA1LDkyLDkyXSxpbmRpZ286Wzc1LDAsMTMwXSxpdm9yeTpbMjU1LDI1NSwyNDBdLGtoYWtpOlsyNDAsMjMwLDE0MF0sbGF2ZW5kZXI6WzIzMCwyMzAsMjUwXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NV0sbGF3bmdyZWVuOlsxMjQsMjUyLDBdLGxlbW9uY2hpZmZvbjpbMjU1LDI1MCwyMDVdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzBdLGxpZ2h0Y29yYWw6WzI0MCwxMjgsMTI4XSxsaWdodGN5YW46WzIyNCwyNTUsMjU1XSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTBdLGxpZ2h0Z3JheTpbMjExLDIxMSwyMTFdLGxpZ2h0Z3JlZW46WzE0NCwyMzgsMTQ0XSxsaWdodGdyZXk6WzIxMSwyMTEsMjExXSxsaWdodHBpbms6WzI1NSwxODIsMTkzXSxsaWdodHNhbG1vbjpbMjU1LDE2MCwxMjJdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzBdLGxpZ2h0c2t5Ymx1ZTpbMTM1LDIwNiwyNTBdLGxpZ2h0c2xhdGVncmF5OlsxMTksMTM2LDE1M10sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzXSxsaWdodHN0ZWVsYmx1ZTpbMTc2LDE5NiwyMjJdLGxpZ2h0eWVsbG93OlsyNTUsMjU1LDIyNF0sbGltZTpbMCwyNTUsMF0sbGltZWdyZWVuOls1MCwyMDUsNTBdLGxpbmVuOlsyNTAsMjQwLDIzMF0sbWFnZW50YTpbMjU1LDAsMjU1XSxtYXJvb246WzEyOCwwLDBdLG1lZGl1bWFxdWFtYXJpbmU6WzEwMiwyMDUsMTcwXSxtZWRpdW1ibHVlOlswLDAsMjA1XSxtZWRpdW1vcmNoaWQ6WzE4Niw4NSwyMTFdLG1lZGl1bXB1cnBsZTpbMTQ3LDExMiwyMTldLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzXSxtZWRpdW1zbGF0ZWJsdWU6WzEyMywxMDQsMjM4XSxtZWRpdW1zcHJpbmdncmVlbjpbMCwyNTAsMTU0XSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDRdLG1lZGl1bXZpb2xldHJlZDpbMTk5LDIxLDEzM10sbWlkbmlnaHRibHVlOlsyNSwyNSwxMTJdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTBdLG1pc3R5cm9zZTpbMjU1LDIyOCwyMjVdLG1vY2Nhc2luOlsyNTUsMjI4LDE4MV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczXSxuYXZ5OlswLDAsMTI4XSxvbGRsYWNlOlsyNTMsMjQ1LDIzMF0sb2xpdmU6WzEyOCwxMjgsMF0sb2xpdmVkcmFiOlsxMDcsMTQyLDM1XSxvcmFuZ2U6WzI1NSwxNjUsMF0sb3JhbmdlcmVkOlsyNTUsNjksMF0sb3JjaGlkOlsyMTgsMTEyLDIxNF0scGFsZWdvbGRlbnJvZDpbMjM4LDIzMiwxNzBdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTJdLHBhbGV0dXJxdW9pc2U6WzE3NSwyMzgsMjM4XSxwYWxldmlvbGV0cmVkOlsyMTksMTEyLDE0N10scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTNdLHBlYWNocHVmZjpbMjU1LDIxOCwxODVdLHBlcnU6WzIwNSwxMzMsNjNdLHBpbms6WzI1NSwxOTIsMjAzXSxwbHVtOlsyMjEsMTYwLDIyMV0scG93ZGVyYmx1ZTpbMTc2LDIyNCwyMzBdLHB1cnBsZTpbMTI4LDAsMTI4XSxyZWJlY2NhcHVycGxlOlsxMDIsNTEsMTUzXSxyZWQ6WzI1NSwwLDBdLHJvc3licm93bjpbMTg4LDE0MywxNDNdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNV0sc2FkZGxlYnJvd246WzEzOSw2OSwxOV0sc2FsbW9uOlsyNTAsMTI4LDExNF0sc2FuZHlicm93bjpbMjQ0LDE2NCw5Nl0sc2VhZ3JlZW46WzQ2LDEzOSw4N10sc2Vhc2hlbGw6WzI1NSwyNDUsMjM4XSxzaWVubmE6WzE2MCw4Miw0NV0sc2lsdmVyOlsxOTIsMTkyLDE5Ml0sc2t5Ymx1ZTpbMTM1LDIwNiwyMzVdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNV0sc2xhdGVncmF5OlsxMTIsMTI4LDE0NF0sc2xhdGVncmV5OlsxMTIsMTI4LDE0NF0sc25vdzpbMjU1LDI1MCwyNTBdLHNwcmluZ2dyZWVuOlswLDI1NSwxMjddLHN0ZWVsYmx1ZTpbNzAsMTMwLDE4MF0sdGFuOlsyMTAsMTgwLDE0MF0sdGVhbDpbMCwxMjgsMTI4XSx0aGlzdGxlOlsyMTYsMTkxLDIxNl0sdG9tYXRvOlsyNTUsOTksNzFdLHR1cnF1b2lzZTpbNjQsMjI0LDIwOF0sdmlvbGV0OlsyMzgsMTMwLDIzOF0sd2hlYXQ6WzI0NSwyMjIsMTc5XSx3aGl0ZTpbMjU1LDI1NSwyNTVdLHdoaXRlc21va2U6WzI0NSwyNDUsMjQ1XSx5ZWxsb3c6WzI1NSwyNTUsMF0seWVsbG93Z3JlZW46WzE1NCwyMDUsNTBdfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMjg0KSxpPUFycmF5LnByb3RvdHlwZS5jb25jYXQsbz1BcnJheS5wcm90b3R5cGUuc2xpY2UsYT10LmV4cG9ydHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxhPXQubGVuZ3RoO248YTtuKyspe3ZhciBzPXRbbl07cihzKT9lPWkuY2FsbChlLG8uY2FsbChzKSk6ZS5wdXNoKHMpfXJldHVybiBlfTthLndyYXA9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQoYShhcmd1bWVudHMpKX19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4hKCF0fHxcInN0cmluZ1wiPT10eXBlb2YgdCkmJih0IGluc3RhbmNlb2YgQXJyYXl8fEFycmF5LmlzQXJyYXkodCl8fHQubGVuZ3RoPj0wJiYodC5zcGxpY2UgaW5zdGFuY2VvZiBGdW5jdGlvbnx8T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHQubGVuZ3RoLTEpJiZcIlN0cmluZ1wiIT09dC5jb25zdHJ1Y3Rvci5uYW1lKSl9fSxmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4ocj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9dmFyIGk9bigxNzYpLG89bigyODcpLGE9e307T2JqZWN0LmtleXMoaSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7YVt0XT17fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYVt0XSxcImNoYW5uZWxzXCIse3ZhbHVlOmlbdF0uY2hhbm5lbHN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYVt0XSxcImxhYmVsc1wiLHt2YWx1ZTppW3RdLmxhYmVsc30pO3ZhciBlPW8odCk7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIGk9ZVtuXTthW3RdW25dPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIGU7YXJndW1lbnRzLmxlbmd0aD4xJiYoZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKTt2YXIgbj10KGUpO2lmKFwib2JqZWN0XCI9PT1yKG4pKWZvcih2YXIgaT1uLmxlbmd0aCxvPTA7bzxpO28rKyluW29dPU1hdGgucm91bmQobltvXSk7cmV0dXJuIG59O3JldHVyblwiY29udmVyc2lvblwiaW4gdCYmKGUuY29udmVyc2lvbj10LmNvbnZlcnNpb24pLGV9KGkpLGFbdF1bbl0ucmF3PWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP2U6KGFyZ3VtZW50cy5sZW5ndGg+MSYmKGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSksdChlKSl9O3JldHVyblwiY29udmVyc2lvblwiaW4gdCYmKGUuY29udmVyc2lvbj10LmNvbnZlcnNpb24pLGV9KGkpfSkpfSkpLHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dC5leHBvcnRzPXthbGljZWJsdWU6WzI0MCwyNDgsMjU1XSxhbnRpcXVld2hpdGU6WzI1MCwyMzUsMjE1XSxhcXVhOlswLDI1NSwyNTVdLGFxdWFtYXJpbmU6WzEyNywyNTUsMjEyXSxhenVyZTpbMjQwLDI1NSwyNTVdLGJlaWdlOlsyNDUsMjQ1LDIyMF0sYmlzcXVlOlsyNTUsMjI4LDE5Nl0sYmxhY2s6WzAsMCwwXSxibGFuY2hlZGFsbW9uZDpbMjU1LDIzNSwyMDVdLGJsdWU6WzAsMCwyNTVdLGJsdWV2aW9sZXQ6WzEzOCw0MywyMjZdLGJyb3duOlsxNjUsNDIsNDJdLGJ1cmx5d29vZDpbMjIyLDE4NCwxMzVdLGNhZGV0Ymx1ZTpbOTUsMTU4LDE2MF0sY2hhcnRyZXVzZTpbMTI3LDI1NSwwXSxjaG9jb2xhdGU6WzIxMCwxMDUsMzBdLGNvcmFsOlsyNTUsMTI3LDgwXSxjb3JuZmxvd2VyYmx1ZTpbMTAwLDE0OSwyMzddLGNvcm5zaWxrOlsyNTUsMjQ4LDIyMF0sY3JpbXNvbjpbMjIwLDIwLDYwXSxjeWFuOlswLDI1NSwyNTVdLGRhcmtibHVlOlswLDAsMTM5XSxkYXJrY3lhbjpbMCwxMzksMTM5XSxkYXJrZ29sZGVucm9kOlsxODQsMTM0LDExXSxkYXJrZ3JheTpbMTY5LDE2OSwxNjldLGRhcmtncmVlbjpbMCwxMDAsMF0sZGFya2dyZXk6WzE2OSwxNjksMTY5XSxkYXJra2hha2k6WzE4OSwxODMsMTA3XSxkYXJrbWFnZW50YTpbMTM5LDAsMTM5XSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3XSxkYXJrb3JhbmdlOlsyNTUsMTQwLDBdLGRhcmtvcmNoaWQ6WzE1Myw1MCwyMDRdLGRhcmtyZWQ6WzEzOSwwLDBdLGRhcmtzYWxtb246WzIzMywxNTAsMTIyXSxkYXJrc2VhZ3JlZW46WzE0MywxODgsMTQzXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzldLGRhcmtzbGF0ZWdyYXk6WzQ3LDc5LDc5XSxkYXJrc2xhdGVncmV5Ols0Nyw3OSw3OV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5XSxkYXJrdmlvbGV0OlsxNDgsMCwyMTFdLGRlZXBwaW5rOlsyNTUsMjAsMTQ3XSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1XSxkaW1ncmF5OlsxMDUsMTA1LDEwNV0sZGltZ3JleTpbMTA1LDEwNSwxMDVdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTVdLGZpcmVicmljazpbMTc4LDM0LDM0XSxmbG9yYWx3aGl0ZTpbMjU1LDI1MCwyNDBdLGZvcmVzdGdyZWVuOlszNCwxMzksMzRdLGZ1Y2hzaWE6WzI1NSwwLDI1NV0sZ2FpbnNib3JvOlsyMjAsMjIwLDIyMF0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTVdLGdvbGQ6WzI1NSwyMTUsMF0sZ29sZGVucm9kOlsyMTgsMTY1LDMyXSxncmF5OlsxMjgsMTI4LDEyOF0sZ3JlZW46WzAsMTI4LDBdLGdyZWVueWVsbG93OlsxNzMsMjU1LDQ3XSxncmV5OlsxMjgsMTI4LDEyOF0saG9uZXlkZXc6WzI0MCwyNTUsMjQwXSxob3RwaW5rOlsyNTUsMTA1LDE4MF0saW5kaWFucmVkOlsyMDUsOTIsOTJdLGluZGlnbzpbNzUsMCwxMzBdLGl2b3J5OlsyNTUsMjU1LDI0MF0sa2hha2k6WzI0MCwyMzAsMTQwXSxsYXZlbmRlcjpbMjMwLDIzMCwyNTBdLGxhdmVuZGVyYmx1c2g6WzI1NSwyNDAsMjQ1XSxsYXduZ3JlZW46WzEyNCwyNTIsMF0sbGVtb25jaGlmZm9uOlsyNTUsMjUwLDIwNV0sbGlnaHRibHVlOlsxNzMsMjE2LDIzMF0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjhdLGxpZ2h0Y3lhbjpbMjI0LDI1NSwyNTVdLGxpZ2h0Z29sZGVucm9keWVsbG93OlsyNTAsMjUwLDIxMF0sbGlnaHRncmF5OlsyMTEsMjExLDIxMV0sbGlnaHRncmVlbjpbMTQ0LDIzOCwxNDRdLGxpZ2h0Z3JleTpbMjExLDIxMSwyMTFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTNdLGxpZ2h0c2FsbW9uOlsyNTUsMTYwLDEyMl0sbGlnaHRzZWFncmVlbjpbMzIsMTc4LDE3MF0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MF0sbGlnaHRzbGF0ZWdyYXk6WzExOSwxMzYsMTUzXSxsaWdodHNsYXRlZ3JleTpbMTE5LDEzNiwxNTNdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMl0sbGlnaHR5ZWxsb3c6WzI1NSwyNTUsMjI0XSxsaW1lOlswLDI1NSwwXSxsaW1lZ3JlZW46WzUwLDIwNSw1MF0sbGluZW46WzI1MCwyNDAsMjMwXSxtYWdlbnRhOlsyNTUsMCwyNTVdLG1hcm9vbjpbMTI4LDAsMF0sbWVkaXVtYXF1YW1hcmluZTpbMTAyLDIwNSwxNzBdLG1lZGl1bWJsdWU6WzAsMCwyMDVdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMV0sbWVkaXVtcHVycGxlOlsxNDcsMTEyLDIxOV0sbWVkaXVtc2VhZ3JlZW46WzYwLDE3OSwxMTNdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzhdLG1lZGl1bXNwcmluZ2dyZWVuOlswLDI1MCwxNTRdLG1lZGl1bXR1cnF1b2lzZTpbNzIsMjA5LDIwNF0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzXSxtaWRuaWdodGJsdWU6WzI1LDI1LDExMl0sbWludGNyZWFtOlsyNDUsMjU1LDI1MF0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNV0sbW9jY2FzaW46WzI1NSwyMjgsMTgxXSxuYXZham93aGl0ZTpbMjU1LDIyMiwxNzNdLG5hdnk6WzAsMCwxMjhdLG9sZGxhY2U6WzI1MywyNDUsMjMwXSxvbGl2ZTpbMTI4LDEyOCwwXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzVdLG9yYW5nZTpbMjU1LDE2NSwwXSxvcmFuZ2VyZWQ6WzI1NSw2OSwwXSxvcmNoaWQ6WzIxOCwxMTIsMjE0XSxwYWxlZ29sZGVucm9kOlsyMzgsMjMyLDE3MF0scGFsZWdyZWVuOlsxNTIsMjUxLDE1Ml0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzhdLHBhbGV2aW9sZXRyZWQ6WzIxOSwxMTIsMTQ3XSxwYXBheWF3aGlwOlsyNTUsMjM5LDIxM10scGVhY2hwdWZmOlsyNTUsMjE4LDE4NV0scGVydTpbMjA1LDEzMyw2M10scGluazpbMjU1LDE5MiwyMDNdLHBsdW06WzIyMSwxNjAsMjIxXSxwb3dkZXJibHVlOlsxNzYsMjI0LDIzMF0scHVycGxlOlsxMjgsMCwxMjhdLHJlYmVjY2FwdXJwbGU6WzEwMiw1MSwxNTNdLHJlZDpbMjU1LDAsMF0scm9zeWJyb3duOlsxODgsMTQzLDE0M10scm95YWxibHVlOls2NSwxMDUsMjI1XSxzYWRkbGVicm93bjpbMTM5LDY5LDE5XSxzYWxtb246WzI1MCwxMjgsMTE0XSxzYW5keWJyb3duOlsyNDQsMTY0LDk2XSxzZWFncmVlbjpbNDYsMTM5LDg3XSxzZWFzaGVsbDpbMjU1LDI0NSwyMzhdLHNpZW5uYTpbMTYwLDgyLDQ1XSxzaWx2ZXI6WzE5MiwxOTIsMTkyXSxza3libHVlOlsxMzUsMjA2LDIzNV0sc2xhdGVibHVlOlsxMDYsOTAsMjA1XSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0XSxzbGF0ZWdyZXk6WzExMiwxMjgsMTQ0XSxzbm93OlsyNTUsMjUwLDI1MF0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyN10sc3RlZWxibHVlOls3MCwxMzAsMTgwXSx0YW46WzIxMCwxODAsMTQwXSx0ZWFsOlswLDEyOCwxMjhdLHRoaXN0bGU6WzIxNiwxOTEsMjE2XSx0b21hdG86WzI1NSw5OSw3MV0sdHVycXVvaXNlOls2NCwyMjQsMjA4XSx2aW9sZXQ6WzIzOCwxMzAsMjM4XSx3aGVhdDpbMjQ1LDIyMiwxNzldLHdoaXRlOlsyNTUsMjU1LDI1NV0sd2hpdGVzbW9rZTpbMjQ1LDI0NSwyNDVdLHllbGxvdzpbMjU1LDI1NSwwXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MF19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNzYpO2Z1bmN0aW9uIGkodCl7dmFyIGU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9e30sZT1PYmplY3Qua2V5cyhyKSxuPWUubGVuZ3RoLGk9MDtpPG47aSsrKXRbZVtpXV09e2Rpc3RhbmNlOi0xLHBhcmVudDpudWxsfTtyZXR1cm4gdH0oKSxuPVt0XTtmb3IoZVt0XS5kaXN0YW5jZT0wO24ubGVuZ3RoOylmb3IodmFyIGk9bi5wb3AoKSxvPU9iamVjdC5rZXlzKHJbaV0pLGE9by5sZW5ndGgscz0wO3M8YTtzKyspe3ZhciB1PW9bc10sYz1lW3VdOy0xPT09Yy5kaXN0YW5jZSYmKGMuZGlzdGFuY2U9ZVtpXS5kaXN0YW5jZSsxLGMucGFyZW50PWksbi51bnNoaWZ0KHUpKX1yZXR1cm4gZX1mdW5jdGlvbiBvKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBlKHQobikpfX1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciBuPVtlW3RdLnBhcmVudCx0XSxpPXJbZVt0XS5wYXJlbnRdW3RdLGE9ZVt0XS5wYXJlbnQ7ZVthXS5wYXJlbnQ7KW4udW5zaGlmdChlW2FdLnBhcmVudCksaT1vKHJbZVthXS5wYXJlbnRdW2FdLGkpLGE9ZVthXS5wYXJlbnQ7cmV0dXJuIGkuY29udmVyc2lvbj1uLGl9dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1pKHQpLG49e30scj1PYmplY3Qua2V5cyhlKSxvPXIubGVuZ3RoLHM9MDtzPG87cysrKXt2YXIgdT1yW3NdO251bGwhPT1lW3VdLnBhcmVudCYmKG5bdV09YSh1LGUpKX1yZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4OSk7dC5leHBvcnRzPXtHcmFwaDpyLkdyYXBoLGpzb246bigzOTApLGFsZzpuKDM5MSksdmVyc2lvbjpyLnZlcnNpb259fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPXtHcmFwaDpuKDE0MiksdmVyc2lvbjpuKDM4OSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNzcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0LDQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOTkpLGk9QXJyYXkucHJvdG90eXBlLnNwbGljZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPXIoZSx0KTtyZXR1cm4hKG48MCkmJihuPT1lLmxlbmd0aC0xP2UucG9wKCk6aS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1yKGUsdCk7cmV0dXJuIG48MD92b2lkIDA6ZVtuXVsxXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcy5fX2RhdGFfXyx0KT4tMX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fLGk9cihuLHQpO3JldHVybiBpPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5baV1bMV09ZSx0aGlzfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOTgpO3QuZXhwb3J0cz1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IHIsdGhpcy5zaXplPTB9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk4KSxpPW4oMTQzKSxvPW4oMTQ0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiByKXt2YXIgYT1uLl9fZGF0YV9fO2lmKCFpfHxhLmxlbmd0aDwxOTkpcmV0dXJuIGEucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBvKGEpfXJldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZT1uLnNpemUsdGhpc319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg2KSxpPW4oMzA0KSxvPW4oNDMpLGE9bigxODApLHM9L15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLyx1PUZ1bmN0aW9uLnByb3RvdHlwZSxjPU9iamVjdC5wcm90b3R5cGUsZj11LnRvU3RyaW5nLGw9Yy5oYXNPd25Qcm9wZXJ0eSxoPVJlZ0V4cChcIl5cIitmLmNhbGwobCkucmVwbGFjZSgvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csXCJcXFxcJCZcIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZyxcIiQxLio/XCIpK1wiJFwiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuISghbyh0KXx8aSh0KSkmJihyKHQpP2g6cykudGVzdChhKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc0KSxpPU9iamVjdC5wcm90b3R5cGUsbz1pLmhhc093blByb3BlcnR5LGE9aS50b1N0cmluZyxzPXI/ci50b1N0cmluZ1RhZzp2b2lkIDA7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8uY2FsbCh0LHMpLG49dFtzXTt0cnl7dFtzXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2godCl7fXZhciBpPWEuY2FsbCh0KTtyZXR1cm4gciYmKGU/dFtzXT1uOmRlbGV0ZSB0W3NdKSxpfX0sZnVuY3Rpb24odCxlKXt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5jYWxsKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLGk9bigzMDUpLG89KHI9L1teLl0rJC8uZXhlYyhpJiZpLmtleXMmJmkua2V5cy5JRV9QUk9UT3x8XCJcIikpP1wiU3ltYm9sKHNyYylfMS5cIityOlwiXCI7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiEhbyYmbyBpbiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDUpW1wiX19jb3JlLWpzX3NoYXJlZF9fXCJdO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzA4KSxpPW4oOTgpLG89bigxNDMpO3QuZXhwb3J0cz1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IHIsbWFwOm5ldyhvfHxpKSxzdHJpbmc6bmV3IHJ9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzA5KSxpPW4oMzEwKSxvPW4oMzExKSxhPW4oMzEyKSxzPW4oMzEzKTtmdW5jdGlvbiB1KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fXUucHJvdG90eXBlLmNsZWFyPXIsdS5wcm90b3R5cGUuZGVsZXRlPWksdS5wcm90b3R5cGUuZ2V0PW8sdS5wcm90b3R5cGUuaGFzPWEsdS5wcm90b3R5cGUuc2V0PXMsdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwMCk7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1yP3IobnVsbCk6e30sdGhpcy5zaXplPTB9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwMCksaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKHIpe3ZhciBuPWVbdF07cmV0dXJuXCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fXCI9PT1uP3ZvaWQgMDpufXJldHVybiBpLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwMCksaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiByP3ZvaWQgMCE9PWVbdF06aS5jYWxsKGUsdCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDApO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09ciYmdm9pZCAwPT09ZT9cIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX19cIjplLHRoaXN9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1yKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9fSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKG49XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfXQuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1uKHQpO3JldHVyblwic3RyaW5nXCI9PWV8fFwibnVtYmVyXCI9PWV8fFwic3ltYm9sXCI9PWV8fFwiYm9vbGVhblwiPT1lP1wiX19wcm90b19fXCIhPT10Om51bGw9PT10fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTAxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcyx0KS5nZXQodCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLHQpLmhhcyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49cih0aGlzLHQpLGk9bi5zaXplO3JldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZSs9bi5zaXplPT1pPzA6MSx0aGlzfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODcpLGk9big2MCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnIoZSxpKGUpLHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTkpLGk9big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpJiZcIltvYmplY3QgQXJndW1lbnRzXVwiPT1yKHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDU5KSxpPW4oMTQ2KSxvPW4oNDYpLGE9e307YVtcIltvYmplY3QgRmxvYXQzMkFycmF5XVwiXT1hW1wiW29iamVjdCBGbG9hdDY0QXJyYXldXCJdPWFbXCJbb2JqZWN0IEludDhBcnJheV1cIl09YVtcIltvYmplY3QgSW50MTZBcnJheV1cIl09YVtcIltvYmplY3QgSW50MzJBcnJheV1cIl09YVtcIltvYmplY3QgVWludDhBcnJheV1cIl09YVtcIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldXCJdPWFbXCJbb2JqZWN0IFVpbnQxNkFycmF5XVwiXT1hW1wiW29iamVjdCBVaW50MzJBcnJheV1cIl09ITAsYVtcIltvYmplY3QgQXJndW1lbnRzXVwiXT1hW1wiW29iamVjdCBBcnJheV1cIl09YVtcIltvYmplY3QgQXJyYXlCdWZmZXJdXCJdPWFbXCJbb2JqZWN0IEJvb2xlYW5dXCJdPWFbXCJbb2JqZWN0IERhdGFWaWV3XVwiXT1hW1wiW29iamVjdCBEYXRlXVwiXT1hW1wiW29iamVjdCBFcnJvcl1cIl09YVtcIltvYmplY3QgRnVuY3Rpb25dXCJdPWFbXCJbb2JqZWN0IE1hcF1cIl09YVtcIltvYmplY3QgTnVtYmVyXVwiXT1hW1wiW29iamVjdCBPYmplY3RdXCJdPWFbXCJbb2JqZWN0IFJlZ0V4cF1cIl09YVtcIltvYmplY3QgU2V0XVwiXT1hW1wiW29iamVjdCBTdHJpbmddXCJdPWFbXCJbb2JqZWN0IFdlYWtNYXBdXCJdPSExLHQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KSYmaSh0Lmxlbmd0aCkmJiEhYVtyKHQpXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4MykoT2JqZWN0LmtleXMsT2JqZWN0KTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODcpLGk9big2Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnIoZSxpKGUpLHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDMpLGk9bigxMDYpLG89bigzMjcpLGE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXIodCkpcmV0dXJuIG8odCk7dmFyIGU9aSh0KSxuPVtdO2Zvcih2YXIgcyBpbiB0KShcImNvbnN0cnVjdG9yXCIhPXN8fCFlJiZhLmNhbGwodCxzKSkmJm4ucHVzaChzKTtyZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKG51bGwhPXQpZm9yKHZhciBuIGluIE9iamVjdCh0KSllLnB1c2gobik7cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4NyksaT1uKDE0OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCxpKHQpLGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODcpLGk9bigxODgpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiByKHQsaSh0KSxlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE5MCksaT1uKDE4OCksbz1uKDY2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxvLGkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjUpKG4oNDUpLFwiRGF0YVZpZXdcIik7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KShuKDQ1KSxcIlByb21pc2VcIik7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KShuKDQ1KSxcIldlYWtNYXBcIik7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj1uZXcgdC5jb25zdHJ1Y3RvcihlKTtyZXR1cm4gZSYmXCJzdHJpbmdcIj09dHlwZW9mIHRbMF0mJm4uY2FsbCh0LFwiaW5kZXhcIikmJihyLmluZGV4PXQuaW5kZXgsci5pbnB1dD10LmlucHV0KSxyfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUxKSxpPW4oMzM2KSxvPW4oMzM3KSxhPW4oMzM4KSxzPW4oMTkzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciB1PXQuY29uc3RydWN0b3I7c3dpdGNoKGUpe2Nhc2VcIltvYmplY3QgQXJyYXlCdWZmZXJdXCI6cmV0dXJuIHIodCk7Y2FzZVwiW29iamVjdCBCb29sZWFuXVwiOmNhc2VcIltvYmplY3QgRGF0ZV1cIjpyZXR1cm4gbmV3IHUoK3QpO2Nhc2VcIltvYmplY3QgRGF0YVZpZXddXCI6cmV0dXJuIGkodCxuKTtjYXNlXCJbb2JqZWN0IEZsb2F0MzJBcnJheV1cIjpjYXNlXCJbb2JqZWN0IEZsb2F0NjRBcnJheV1cIjpjYXNlXCJbb2JqZWN0IEludDhBcnJheV1cIjpjYXNlXCJbb2JqZWN0IEludDE2QXJyYXldXCI6Y2FzZVwiW29iamVjdCBJbnQzMkFycmF5XVwiOmNhc2VcIltvYmplY3QgVWludDhBcnJheV1cIjpjYXNlXCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XVwiOmNhc2VcIltvYmplY3QgVWludDE2QXJyYXldXCI6Y2FzZVwiW29iamVjdCBVaW50MzJBcnJheV1cIjpyZXR1cm4gcyh0LG4pO2Nhc2VcIltvYmplY3QgTWFwXVwiOnJldHVybiBuZXcgdTtjYXNlXCJbb2JqZWN0IE51bWJlcl1cIjpjYXNlXCJbb2JqZWN0IFN0cmluZ11cIjpyZXR1cm4gbmV3IHUodCk7Y2FzZVwiW29iamVjdCBSZWdFeHBdXCI6cmV0dXJuIG8odCk7Y2FzZVwiW29iamVjdCBTZXRdXCI6cmV0dXJuIG5ldyB1O2Nhc2VcIltvYmplY3QgU3ltYm9sXVwiOnJldHVybiBhKHQpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZT9yKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49L1xcdyokLzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5zb3VyY2Usbi5leGVjKHQpKTtyZXR1cm4gZS5sYXN0SW5kZXg9dC5sYXN0SW5kZXgsZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc0KSxpPXI/ci5wcm90b3R5cGU6dm9pZCAwLG89aT9pLnZhbHVlT2Y6dm9pZCAwO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbz9PYmplY3Qoby5jYWxsKHQpKTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM0MCksaT1uKDEwNSksbz1uKDE0NyksYT1vJiZvLmlzTWFwLHM9YT9pKGEpOnI7dC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc2KSxpPW4oNDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0KSYmXCJbb2JqZWN0IE1hcF1cIj09cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM0MiksaT1uKDEwNSksbz1uKDE0NyksYT1vJiZvLmlzU2V0LHM9YT9pKGEpOnI7dC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc2KSxpPW4oNDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0KSYmXCJbb2JqZWN0IFNldF1cIj09cih0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7Zm9yKHZhciBpPS0xLG89T2JqZWN0KGUpLGE9cihlKSxzPWEubGVuZ3RoO3MtLTspe3ZhciB1PWFbdD9zOisraV07aWYoITE9PT1uKG9bdV0sdSxvKSlicmVha31yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1NCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7aWYobnVsbD09bilyZXR1cm4gbjtpZighcihuKSlyZXR1cm4gdChuLGkpO2Zvcih2YXIgbz1uLmxlbmd0aCxhPWU/bzotMSxzPU9iamVjdChuKTsoZT9hLS06KythPG8pJiYhMSE9PWkoc1thXSxhLHMpOyk7cmV0dXJuIG59fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTA4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXTtyZXR1cm4gcih0LChmdW5jdGlvbih0LHIsaSl7ZSh0LHIsaSkmJm4ucHVzaCh0KX0pKSxufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzQ3KSxpPW4oMzU1KSxvPW4oMjA1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9aSh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/byhlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKG4pe3JldHVybiBuPT09dHx8cihuLHQsZSl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOTcpLGk9bigyMDApO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixvKXt2YXIgYT1uLmxlbmd0aCxzPWEsdT0hbztpZihudWxsPT10KXJldHVybiFzO2Zvcih0PU9iamVjdCh0KTthLS07KXt2YXIgYz1uW2FdO2lmKHUmJmNbMl0/Y1sxXSE9PXRbY1swXV06IShjWzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK2E8czspe3ZhciBmPShjPW5bYV0pWzBdLGw9dFtmXSxoPWNbMV07aWYodSYmY1syXSl7aWYodm9pZCAwPT09bCYmIShmIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGQ9bmV3IHI7aWYobyl2YXIgcD1vKGwsaCxmLHQsZSxkKTtpZighKHZvaWQgMD09PXA/aShoLGwsMyxvLGQpOnApKXJldHVybiExfX1yZXR1cm4hMH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk3KSxpPW4oMjAxKSxvPW4oMzUyKSxhPW4oMzU0KSxzPW4oNzYpLHU9bigyOSksYz1uKDc1KSxmPW4oMzIpLGw9XCJbb2JqZWN0IE9iamVjdF1cIixoPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGQscCxnKXt2YXIgdj11KHQpLHk9dShlKSxtPXY/XCJbb2JqZWN0IEFycmF5XVwiOnModCksYj15P1wiW29iamVjdCBBcnJheV1cIjpzKGUpLHg9KG09XCJbb2JqZWN0IEFyZ3VtZW50c11cIj09bT9sOm0pPT1sLHc9KGI9XCJbb2JqZWN0IEFyZ3VtZW50c11cIj09Yj9sOmIpPT1sLFM9bT09YjtpZihTJiZjKHQpKXtpZighYyhlKSlyZXR1cm4hMTt2PSEwLHg9ITF9aWYoUyYmIXgpcmV0dXJuIGd8fChnPW5ldyByKSx2fHxmKHQpP2kodCxlLG4sZCxwLGcpOm8odCxlLG0sbixkLHAsZyk7aWYoISgxJm4pKXt2YXIgRT14JiZoLmNhbGwodCxcIl9fd3JhcHBlZF9fXCIpLF89dyYmaC5jYWxsKGUsXCJfX3dyYXBwZWRfX1wiKTtpZihFfHxfKXt2YXIgTz1FP3QudmFsdWUoKTp0LGs9Xz9lLnZhbHVlKCk6ZTtyZXR1cm4gZ3x8KGc9bmV3IHIpLHAoTyxrLG4sZCxnKX19cmV0dXJuISFTJiYoZ3x8KGc9bmV3IHIpLGEodCxlLG4sZCxwLGcpKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LFwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfX1wiKSx0aGlzfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHI7KWlmKGUodFtuXSxuLHQpKXJldHVybiEwO3JldHVybiExfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNzQpLGk9bigxOTIpLG89big3MyksYT1uKDIwMSkscz1uKDM1MyksdT1uKDE1NSksYz1yP3IucHJvdG90eXBlOnZvaWQgMCxmPWM/Yy52YWx1ZU9mOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4scixjLGwsaCl7c3dpdGNoKG4pe2Nhc2VcIltvYmplY3QgRGF0YVZpZXddXCI6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlXCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFsKG5ldyBpKHQpLG5ldyBpKGUpKSk7Y2FzZVwiW29iamVjdCBCb29sZWFuXVwiOmNhc2VcIltvYmplY3QgRGF0ZV1cIjpjYXNlXCJbb2JqZWN0IE51bWJlcl1cIjpyZXR1cm4gbygrdCwrZSk7Y2FzZVwiW29iamVjdCBFcnJvcl1cIjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2VcIltvYmplY3QgUmVnRXhwXVwiOmNhc2VcIltvYmplY3QgU3RyaW5nXVwiOnJldHVybiB0PT1lK1wiXCI7Y2FzZVwiW29iamVjdCBNYXBdXCI6dmFyIGQ9cztjYXNlXCJbb2JqZWN0IFNldF1cIjp2YXIgcD0xJnI7aWYoZHx8KGQ9dSksdC5zaXplIT1lLnNpemUmJiFwKXJldHVybiExO3ZhciBnPWguZ2V0KHQpO2lmKGcpcmV0dXJuIGc9PWU7cnw9MixoLnNldCh0LGUpO3ZhciB2PWEoZCh0KSxkKGUpLHIsYyxsLGgpO3JldHVybiBoLmRlbGV0ZSh0KSx2O2Nhc2VcIltvYmplY3QgU3ltYm9sXVwiOmlmKGYpcmV0dXJuIGYuY2FsbCh0KT09Zi5jYWxsKGUpfXJldHVybiExfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7blsrK2VdPVtyLHRdfSkpLG59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxODkpLGk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyxhLHMpe3ZhciB1PTEmbixjPXIodCksZj1jLmxlbmd0aDtpZihmIT1yKGUpLmxlbmd0aCYmIXUpcmV0dXJuITE7Zm9yKHZhciBsPWY7bC0tOyl7dmFyIGg9Y1tsXTtpZighKHU/aCBpbiBlOmkuY2FsbChlLGgpKSlyZXR1cm4hMX12YXIgZD1zLmdldCh0KSxwPXMuZ2V0KGUpO2lmKGQmJnApcmV0dXJuIGQ9PWUmJnA9PXQ7dmFyIGc9ITA7cy5zZXQodCxlKSxzLnNldChlLHQpO2Zvcih2YXIgdj11OysrbDxmOyl7dmFyIHk9dFtoPWNbbF1dLG09ZVtoXTtpZihvKXZhciBiPXU/byhtLHksaCxlLHQscyk6byh5LG0saCx0LGUscyk7aWYoISh2b2lkIDA9PT1iP3k9PT1tfHxhKHksbSxuLG8scyk6Yikpe2c9ITE7YnJlYWt9dnx8KHY9XCJjb25zdHJ1Y3RvclwiPT1oKX1pZihnJiYhdil7dmFyIHg9dC5jb25zdHJ1Y3Rvcix3PWUuY29uc3RydWN0b3I7eD09d3x8IShcImNvbnN0cnVjdG9yXCJpbiB0KXx8IShcImNvbnN0cnVjdG9yXCJpbiBlKXx8XCJmdW5jdGlvblwiPT10eXBlb2YgeCYmeCBpbnN0YW5jZW9mIHgmJlwiZnVuY3Rpb25cIj09dHlwZW9mIHcmJncgaW5zdGFuY2VvZiB3fHwoZz0hMSl9cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLGd9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMDQpLGk9big2MCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1pKHQpLG49ZS5sZW5ndGg7bi0tOyl7dmFyIG89ZVtuXSxhPXRbb107ZVtuXT1bbyxhLHIoYSldfXJldHVybiBlfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjAwKSxpPW4oMzU3KSxvPW4oMjA3KSxhPW4oMTU2KSxzPW4oMjA0KSx1PW4oMjA1KSxjPW4oODkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhKHQpJiZzKGUpP3UoYyh0KSxlKTpmdW5jdGlvbihuKXt2YXIgYT1pKG4sdCk7cmV0dXJuIHZvaWQgMD09PWEmJmE9PT1lP28obix0KTpyKGUsYSwzKX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGk9bnVsbD09dD92b2lkIDA6cih0LGUpO3JldHVybiB2b2lkIDA9PT1pP246aX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM1OSksaT0vW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2csbz0vXFxcXChcXFxcKT8vZyxhPXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKFwiXCIpLHQucmVwbGFjZShpLChmdW5jdGlvbih0LG4scixpKXtlLnB1c2gocj9pLnJlcGxhY2UobyxcIiQxXCIpOm58fHQpfSkpLGV9KSk7dC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM2MCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLHR9KSksbj1lLmNhY2hlO3JldHVybiBlfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQ0KTtmdW5jdGlvbiBpKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdHx8bnVsbCE9ZSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiKTt2YXIgbj1mdW5jdGlvbiBuKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBhPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLGEpfHxvLGF9O3JldHVybiBuLmNhY2hlPW5ldyhpLkNhY2hlfHxyKSxufWkuQ2FjaGU9cix0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNzQpLGk9bigxMTEpLG89bigyOSksYT1uKDc3KSxzPXI/ci5wcm90b3R5cGU6dm9pZCAwLHU9cz9zLnRvU3RyaW5nOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24gdChlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSlyZXR1cm4gZTtpZihvKGUpKXJldHVybiBpKGUsdCkrXCJcIjtpZihhKGUpKXJldHVybiB1P3UuY2FsbChlKTpcIlwiO3ZhciBuPWUrXCJcIjtyZXR1cm5cIjBcIj09biYmMS9lPT0tMS8wP1wiLTBcIjpufX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMDkpLGk9bigzNjQpLG89bigxNTYpLGE9big4OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvKHQpP3IoYSh0KSk6aSh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gcihlLHQpfX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmbi5jYWxsKHQsZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDgpLGk9big3Niksbz1uKDg4KSxhPW4oMjkpLHM9big1NCksdT1uKDc1KSxjPW4oMTA2KSxmPW4oMzIpLGw9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4hMDtpZihzKHQpJiYoYSh0KXx8XCJzdHJpbmdcIj09dHlwZW9mIHR8fFwiZnVuY3Rpb25cIj09dHlwZW9mIHQuc3BsaWNlfHx1KHQpfHxmKHQpfHxvKHQpKSlyZXR1cm4hdC5sZW5ndGg7dmFyIGU9aSh0KTtpZihcIltvYmplY3QgTWFwXVwiPT1lfHxcIltvYmplY3QgU2V0XVwiPT1lKXJldHVybiF0LnNpemU7aWYoYyh0KSlyZXR1cm4hcih0KS5sZW5ndGg7Zm9yKHZhciBuIGluIHQpaWYobC5jYWxsKHQsbikpcmV0dXJuITE7cmV0dXJuITB9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IociYmbyYmKG49dFsrK2ldKTsrK2k8bzspbj1lKG4sdFtpXSxpLHQpO3JldHVybiBufX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gaSh0LChmdW5jdGlvbih0LGksbyl7bj1yPyhyPSExLHQpOmUobix0LGksbyl9KSksbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0OCksaT1uKDc2KSxvPW4oNTQpLGE9bigzNzApLHM9bigzNzEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKG8odCkpcmV0dXJuIGEodCk/cyh0KTp0Lmxlbmd0aDt2YXIgZT1pKHQpO3JldHVyblwiW29iamVjdCBNYXBdXCI9PWV8fFwiW29iamVjdCBTZXRdXCI9PWU/dC5zaXplOnIodCkubGVuZ3RofX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTkpLGk9bigyOSksbz1uKDQ2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHR8fCFpKHQpJiZvKHQpJiZcIltvYmplY3QgU3RyaW5nXVwiPT1yKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzcyKSxpPW4oMzczKSxvPW4oMzc0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCk/byh0KTpyKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjA5KShcImxlbmd0aFwiKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlKXt2YXIgbj1SZWdFeHAoXCJbXFxcXHUyMDBkXFxcXHVkODAwLVxcXFx1ZGZmZlxcXFx1MDMwMC1cXFxcdTAzNmZcXFxcdWZlMjAtXFxcXHVmZTJmXFxcXHUyMGQwLVxcXFx1MjBmZlxcXFx1ZmUwZVxcXFx1ZmUwZl1cIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuLnRlc3QodCl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPVwiW1xcXFx1ZDgwMC1cXFxcdWRmZmZdXCIscj1cIltcXFxcdTAzMDAtXFxcXHUwMzZmXFxcXHVmZTIwLVxcXFx1ZmUyZlxcXFx1MjBkMC1cXFxcdTIwZmZdXCIsaT1cIlxcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXVwiLG89XCJbXlxcXFx1ZDgwMC1cXFxcdWRmZmZdXCIsYT1cIig/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn1cIixzPVwiW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdXCIsdT1cIig/OlwiK3IrXCJ8XCIraStcIilcIitcIj9cIixjPVwiW1xcXFx1ZmUwZVxcXFx1ZmUwZl0/XCIrdSsoXCIoPzpcXFxcdTIwMGQoPzpcIitbbyxhLHNdLmpvaW4oXCJ8XCIpK1wiKVtcXFxcdWZlMGVcXFxcdWZlMGZdP1wiK3UrXCIpKlwiKSxmPVwiKD86XCIrW28rcitcIj9cIixyLGEscyxuXS5qb2luKFwifFwiKStcIilcIixsPVJlZ0V4cChpK1wiKD89XCIraStcIil8XCIrZitjLFwiZ1wiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWwubGFzdEluZGV4PTA7bC50ZXN0KHQpOykrK2U7cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDUpLGk9bigxOTUpLG89bigxNTMpLGE9big1NSkscz1uKDEwNyksdT1uKDI5KSxjPW4oNzUpLGY9big4NiksbD1uKDQzKSxoPW4oMzIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGQ9dSh0KSxwPWR8fGModCl8fGgodCk7aWYoZT1hKGUsNCksbnVsbD09bil7dmFyIGc9dCYmdC5jb25zdHJ1Y3RvcjtuPXA/ZD9uZXcgZzpbXTpsKHQpJiZmKGcpP2kocyh0KSk6e319cmV0dXJuKHA/cjpvKSh0LChmdW5jdGlvbih0LHIsaSl7cmV0dXJuIGUobix0LHIsaSl9KSksbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1NyksaT1uKDExMiksbz1uKDIxNyksYT1uKDIxOSkscz1pKChmdW5jdGlvbih0KXtyZXR1cm4gbyhyKHQsMSxhLCEwKSl9KSk7dC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc0KSxpPW4oODgpLG89bigyOSksYT1yP3IuaXNDb25jYXRTcHJlYWRhYmxlOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8odCl8fGkodCl8fCEhKGEmJnQmJnRbYV0pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0LmNhbGwoZSk7Y2FzZSAxOnJldHVybiB0LmNhbGwoZSxuWzBdKTtjYXNlIDI6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSk7Y2FzZSAzOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0sblsyXSl9cmV0dXJuIHQuYXBwbHkoZSxuKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1MiksaT1uKDE4MSksbz1uKDY3KSxhPWk/ZnVuY3Rpb24odCxlKXtyZXR1cm4gaSh0LFwidG9TdHJpbmdcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6cihlKSx3cml0YWJsZTohMH0pfTpvO3QuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUpe3ZhciBuPURhdGUubm93O3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0wLHI9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1uKCksbz0xNi0oaS1yKTtpZihyPWksbz4wKXtpZigrK2U+PTgwMClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM4Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuISEobnVsbD09dD8wOnQubGVuZ3RoKSYmcih0LGUsMCk+LTF9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMTgpLGk9bigzODMpLG89bigzODQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGU9PWU/byh0LGUsbik6cih0LGksbil9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdCE9dH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bi0xLGk9dC5sZW5ndGg7KytyPGk7KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8aTspaWYobihlLHRbcl0pKXJldHVybiEwO3JldHVybiExfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTkxKSxpPW4oMzg3KSxvPW4oMTU1KSxhPXImJjEvbyhuZXcgcihbLC0wXSkpWzFdPT0xLzA/ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByKHQpfTppO3QuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1cIjIuMS44XCJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQyKSxpPW4oMTQyKTtmdW5jdGlvbiBvKHQpe3JldHVybiByLm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQubm9kZShlKSxpPXQucGFyZW50KGUpLG89e3Y6ZX07cmV0dXJuIHIuaXNVbmRlZmluZWQobil8fChvLnZhbHVlPW4pLHIuaXNVbmRlZmluZWQoaSl8fChvLnBhcmVudD1pKSxvfSkpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIHIubWFwKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49dC5lZGdlKGUpLGk9e3Y6ZS52LHc6ZS53fTtyZXR1cm4gci5pc1VuZGVmaW5lZChlLm5hbWUpfHwoaS5uYW1lPWUubmFtZSksci5pc1VuZGVmaW5lZChuKXx8KGkudmFsdWU9biksaX0pKX10LmV4cG9ydHM9e3dyaXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXtvcHRpb25zOntkaXJlY3RlZDp0LmlzRGlyZWN0ZWQoKSxtdWx0aWdyYXBoOnQuaXNNdWx0aWdyYXBoKCksY29tcG91bmQ6dC5pc0NvbXBvdW5kKCl9LG5vZGVzOm8odCksZWRnZXM6YSh0KX07ci5pc1VuZGVmaW5lZCh0LmdyYXBoKCkpfHwoZS52YWx1ZT1yLmNsb25lKHQuZ3JhcGgoKSkpO3JldHVybiBlfSxyZWFkOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBpKHQub3B0aW9ucykuc2V0R3JhcGgodC52YWx1ZSk7cmV0dXJuIHIuZWFjaCh0Lm5vZGVzLChmdW5jdGlvbih0KXtlLnNldE5vZGUodC52LHQudmFsdWUpLHQucGFyZW50JiZlLnNldFBhcmVudCh0LnYsdC5wYXJlbnQpfSkpLHIuZWFjaCh0LmVkZ2VzLChmdW5jdGlvbih0KXtlLnNldEVkZ2Uoe3Y6dC52LHc6dC53LG5hbWU6dC5uYW1lfSx0LnZhbHVlKX0pKSxlfX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9e2NvbXBvbmVudHM6bigzOTIpLGRpamtzdHJhOm4oMjIxKSxkaWprc3RyYUFsbDpuKDM5MyksZmluZEN5Y2xlczpuKDM5NCksZmxveWRXYXJzaGFsbDpuKDM5NSksaXNBY3ljbGljOm4oMzk2KSxwb3N0b3JkZXI6bigzOTcpLHByZW9yZGVyOm4oMzk4KSxwcmltOm4oMzk5KSx0YXJqYW46bigyMjMpLHRvcHNvcnQ6bigyMjQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuPXt9LGk9W107ZnVuY3Rpb24gbyhpKXtyLmhhcyhuLGkpfHwobltpXT0hMCxlLnB1c2goaSksci5lYWNoKHQuc3VjY2Vzc29ycyhpKSxvKSxyLmVhY2godC5wcmVkZWNlc3NvcnMoaSksbykpfXJldHVybiByLmVhY2godC5ub2RlcygpLChmdW5jdGlvbih0KXtlPVtdLG8odCksZS5sZW5ndGgmJmkucHVzaChlKX0pKSxpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjIxKSxpPW4oNDIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGkudHJhbnNmb3JtKHQubm9kZXMoKSwoZnVuY3Rpb24oaSxvKXtpW29dPXIodCxvLGUsbil9KSx7fSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MiksaT1uKDIyMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByLmZpbHRlcihpKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gZS5sZW5ndGg+MXx8MT09PWUubGVuZ3RoJiZ0Lmhhc0VkZ2UoZVswXSxlWzBdKX0pKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIHI9e30saT10Lm5vZGVzKCk7cmV0dXJuIGkuZm9yRWFjaCgoZnVuY3Rpb24odCl7clt0XT17fSxyW3RdW3RdPXtkaXN0YW5jZTowfSxpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QhPT1lJiYoclt0XVtlXT17ZGlzdGFuY2U6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfSl9KSksbih0KS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgaT1uLnY9PT10P24udzpuLnYsbz1lKG4pO3JbdF1baV09e2Rpc3RhbmNlOm8scHJlZGVjZXNzb3I6dH19KSl9KSksaS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1yW3RdO2kuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIG89cltuXTtpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPW9bdF0saT1lW25dLGE9b1tuXSxzPXIuZGlzdGFuY2UraS5kaXN0YW5jZTtzPGEuZGlzdGFuY2UmJihhLmRpc3RhbmNlPXMsYS5wcmVkZWNlc3Nvcj1pLnByZWRlY2Vzc29yKX0pKX0pKX0pKSxyfSh0LGV8fGksbnx8ZnVuY3Rpb24oZSl7cmV0dXJuIHQub3V0RWRnZXMoZSl9KX07dmFyIGk9ci5jb25zdGFudCgxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjI0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3IodCl9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIHIuQ3ljbGVFeGNlcHRpb24pcmV0dXJuITE7dGhyb3cgdH1yZXR1cm4hMH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIyNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCxlLFwicG9zdFwiKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIyNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCxlLFwicHJlXCIpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDIpLGk9bigxNDIpLG89bigyMjIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGE9bmV3IGkscz17fSx1PW5ldyBvO2Z1bmN0aW9uIGModCl7dmFyIHI9dC52PT09bj90Lnc6dC52LGk9dS5wcmlvcml0eShyKTtpZih2b2lkIDAhPT1pKXt2YXIgbz1lKHQpO288aSYmKHNbcl09bix1LmRlY3JlYXNlKHIsbykpfX1pZigwPT09dC5ub2RlQ291bnQoKSlyZXR1cm4gYTtyLmVhY2godC5ub2RlcygpLChmdW5jdGlvbih0KXt1LmFkZCh0LE51bWJlci5QT1NJVElWRV9JTkZJTklUWSksYS5zZXROb2RlKHQpfSkpLHUuZGVjcmVhc2UodC5ub2RlcygpWzBdLDApO3ZhciBmPSExO2Zvcig7dS5zaXplKCk+MDspe2lmKG49dS5yZW1vdmVNaW4oKSxyLmhhcyhzLG4pKWEuc2V0RWRnZShuLHNbbl0pO2Vsc2V7aWYoZil0aHJvdyBuZXcgRXJyb3IoXCJJbnB1dCBncmFwaCBpcyBub3QgY29ubmVjdGVkOiBcIit0KTtmPSEwfXQubm9kZUVkZ2VzKG4pLmZvckVhY2goYyl9cmV0dXJuIGF9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyNyksaT1uKDQzOSksbz1uKDQ0MiksYT1uKDQ0Mykscz1uKDM3KS5ub3JtYWxpemVSYW5rcyx1PW4oNDQ1KSxjPW4oMzcpLnJlbW92ZUVtcHR5UmFua3MsZj1uKDQ0NiksbD1uKDQ0NyksaD1uKDQ0OCksZD1uKDQ0OSkscD1uKDQ1OCksZz1uKDM3KSx2PW4oNDQpLkdyYXBoO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPWUmJmUuZGVidWdUaW1pbmc/Zy50aW1lOmcubm90aW1lO24oXCJsYXlvdXRcIiwoZnVuY3Rpb24oKXt2YXIgZT1uKFwiICBidWlsZExheW91dEdyYXBoXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB2KHttdWx0aWdyYXBoOiEwLGNvbXBvdW5kOiEwfSksbj1rKHQuZ3JhcGgoKSk7cmV0dXJuIGUuc2V0R3JhcGgoci5tZXJnZSh7fSxtLE8obix5KSxyLnBpY2sobixiKSkpLHIuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPWsodC5ub2RlKG4pKTtlLnNldE5vZGUobixyLmRlZmF1bHRzKE8oaSx4KSx3KSksZS5zZXRQYXJlbnQobix0LnBhcmVudChuKSl9KSksci5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24obil7dmFyIGk9ayh0LmVkZ2UobikpO2Uuc2V0RWRnZShuLHIubWVyZ2Uoe30sRSxPKGksUyksci5waWNrKGksXykpKX0pKSxlfSh0KX0pKTtuKFwiICBydW5MYXlvdXRcIiwoZnVuY3Rpb24oKXshZnVuY3Rpb24odCxlKXtlKFwiICAgIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHNcIiwoZnVuY3Rpb24oKXshZnVuY3Rpb24odCl7dmFyIGU9dC5ncmFwaCgpO2UucmFua3NlcC89MixyLmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihuKXt2YXIgcj10LmVkZ2Uobik7ci5taW5sZW4qPTIsXCJjXCIhPT1yLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkmJihcIlRCXCI9PT1lLnJhbmtkaXJ8fFwiQlRcIj09PWUucmFua2Rpcj9yLndpZHRoKz1yLmxhYmVsb2Zmc2V0OnIuaGVpZ2h0Kz1yLmxhYmVsb2Zmc2V0KX0pKX0odCl9KSksZShcIiAgICByZW1vdmVTZWxmRWRnZXNcIiwoZnVuY3Rpb24oKXshZnVuY3Rpb24odCl7ci5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7aWYoZS52PT09ZS53KXt2YXIgbj10Lm5vZGUoZS52KTtuLnNlbGZFZGdlc3x8KG4uc2VsZkVkZ2VzPVtdKSxuLnNlbGZFZGdlcy5wdXNoKHtlOmUsbGFiZWw6dC5lZGdlKGUpfSksdC5yZW1vdmVFZGdlKGUpfX0pKX0odCl9KSksZShcIiAgICBhY3ljbGljXCIsKGZ1bmN0aW9uKCl7aS5ydW4odCl9KSksZShcIiAgICBuZXN0aW5nR3JhcGgucnVuXCIsKGZ1bmN0aW9uKCl7Zi5ydW4odCl9KSksZShcIiAgICByYW5rXCIsKGZ1bmN0aW9uKCl7YShnLmFzTm9uQ29tcG91bmRHcmFwaCh0KSl9KSksZShcIiAgICBpbmplY3RFZGdlTGFiZWxQcm94aWVzXCIsKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3IuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZWRnZShlKTtpZihuLndpZHRoJiZuLmhlaWdodCl7dmFyIHI9dC5ub2RlKGUudiksaT17cmFuazoodC5ub2RlKGUudykucmFuay1yLnJhbmspLzIrci5yYW5rLGU6ZX07Zy5hZGREdW1teU5vZGUodCxcImVkZ2UtcHJveHlcIixpLFwiX2VwXCIpfX0pKX0odCl9KSksZShcIiAgICByZW1vdmVFbXB0eVJhbmtzXCIsKGZ1bmN0aW9uKCl7Yyh0KX0pKSxlKFwiICAgIG5lc3RpbmdHcmFwaC5jbGVhbnVwXCIsKGZ1bmN0aW9uKCl7Zi5jbGVhbnVwKHQpfSkpLGUoXCIgICAgbm9ybWFsaXplUmFua3NcIiwoZnVuY3Rpb24oKXtzKHQpfSkpLGUoXCIgICAgYXNzaWduUmFua01pbk1heFwiLChmdW5jdGlvbigpeyFmdW5jdGlvbih0KXt2YXIgZT0wO3IuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPXQubm9kZShuKTtpLmJvcmRlclRvcCYmKGkubWluUmFuaz10Lm5vZGUoaS5ib3JkZXJUb3ApLnJhbmssaS5tYXhSYW5rPXQubm9kZShpLmJvcmRlckJvdHRvbSkucmFuayxlPXIubWF4KGUsaS5tYXhSYW5rKSl9KSksdC5ncmFwaCgpLm1heFJhbms9ZX0odCl9KSksZShcIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzXCIsKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3IuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQubm9kZShlKTtcImVkZ2UtcHJveHlcIj09PW4uZHVtbXkmJih0LmVkZ2Uobi5lKS5sYWJlbFJhbms9bi5yYW5rLHQucmVtb3ZlTm9kZShlKSl9KSl9KHQpfSkpLGUoXCIgICAgbm9ybWFsaXplLnJ1blwiLChmdW5jdGlvbigpe28ucnVuKHQpfSkpLGUoXCIgICAgcGFyZW50RHVtbXlDaGFpbnNcIiwoZnVuY3Rpb24oKXt1KHQpfSkpLGUoXCIgICAgYWRkQm9yZGVyU2VnbWVudHNcIiwoZnVuY3Rpb24oKXtsKHQpfSkpLGUoXCIgICAgb3JkZXJcIiwoZnVuY3Rpb24oKXtkKHQpfSkpLGUoXCIgICAgaW5zZXJ0U2VsZkVkZ2VzXCIsKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPWcuYnVpbGRMYXllck1hdHJpeCh0KTtyLmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIG49MDtyLmZvckVhY2goZSwoZnVuY3Rpb24oZSxpKXt2YXIgbz10Lm5vZGUoZSk7by5vcmRlcj1pK24sci5mb3JFYWNoKG8uc2VsZkVkZ2VzLChmdW5jdGlvbihlKXtnLmFkZER1bW15Tm9kZSh0LFwic2VsZmVkZ2VcIix7d2lkdGg6ZS5sYWJlbC53aWR0aCxoZWlnaHQ6ZS5sYWJlbC5oZWlnaHQscmFuazpvLnJhbmssb3JkZXI6aSsgKytuLGU6ZS5lLGxhYmVsOmUubGFiZWx9LFwiX3NlXCIpfSkpLGRlbGV0ZSBvLnNlbGZFZGdlc30pKX0pKX0odCl9KSksZShcIiAgICBhZGp1c3RDb29yZGluYXRlU3lzdGVtXCIsKGZ1bmN0aW9uKCl7aC5hZGp1c3QodCl9KSksZShcIiAgICBwb3NpdGlvblwiLChmdW5jdGlvbigpe3AodCl9KSksZShcIiAgICBwb3NpdGlvblNlbGZFZGdlc1wiLChmdW5jdGlvbigpeyFmdW5jdGlvbih0KXtyLmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihlKXt2YXIgbj10Lm5vZGUoZSk7aWYoXCJzZWxmZWRnZVwiPT09bi5kdW1teSl7dmFyIHI9dC5ub2RlKG4uZS52KSxpPXIueCtyLndpZHRoLzIsbz1yLnksYT1uLngtaSxzPXIuaGVpZ2h0LzI7dC5zZXRFZGdlKG4uZSxuLmxhYmVsKSx0LnJlbW92ZU5vZGUoZSksbi5sYWJlbC5wb2ludHM9W3t4OmkrMiphLzMseTpvLXN9LHt4OmkrNSphLzYseTpvLXN9LHt4OmkrYSx5Om99LHt4OmkrNSphLzYseTpvK3N9LHt4OmkrMiphLzMseTpvK3N9XSxuLmxhYmVsLng9bi54LG4ubGFiZWwueT1uLnl9fSkpfSh0KX0pKSxlKFwiICAgIHJlbW92ZUJvcmRlck5vZGVzXCIsKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3IuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe2lmKHQuY2hpbGRyZW4oZSkubGVuZ3RoKXt2YXIgbj10Lm5vZGUoZSksaT10Lm5vZGUobi5ib3JkZXJUb3ApLG89dC5ub2RlKG4uYm9yZGVyQm90dG9tKSxhPXQubm9kZShyLmxhc3Qobi5ib3JkZXJMZWZ0KSkscz10Lm5vZGUoci5sYXN0KG4uYm9yZGVyUmlnaHQpKTtuLndpZHRoPU1hdGguYWJzKHMueC1hLngpLG4uaGVpZ2h0PU1hdGguYWJzKG8ueS1pLnkpLG4ueD1hLngrbi53aWR0aC8yLG4ueT1pLnkrbi5oZWlnaHQvMn19KSksci5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7XCJib3JkZXJcIj09PXQubm9kZShlKS5kdW1teSYmdC5yZW1vdmVOb2RlKGUpfSkpfSh0KX0pKSxlKFwiICAgIG5vcm1hbGl6ZS51bmRvXCIsKGZ1bmN0aW9uKCl7by51bmRvKHQpfSkpLGUoXCIgICAgZml4dXBFZGdlTGFiZWxDb29yZHNcIiwoZnVuY3Rpb24oKXshZnVuY3Rpb24odCl7ci5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49dC5lZGdlKGUpO2lmKHIuaGFzKG4sXCJ4XCIpKXN3aXRjaChcImxcIiE9PW4ubGFiZWxwb3MmJlwiclwiIT09bi5sYWJlbHBvc3x8KG4ud2lkdGgtPW4ubGFiZWxvZmZzZXQpLG4ubGFiZWxwb3Mpe2Nhc2VcImxcIjpuLngtPW4ud2lkdGgvMituLmxhYmVsb2Zmc2V0O2JyZWFrO2Nhc2VcInJcIjpuLngrPW4ud2lkdGgvMituLmxhYmVsb2Zmc2V0fX0pKX0odCl9KSksZShcIiAgICB1bmRvQ29vcmRpbmF0ZVN5c3RlbVwiLChmdW5jdGlvbigpe2gudW5kbyh0KX0pKSxlKFwiICAgIHRyYW5zbGF0ZUdyYXBoXCIsKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxuPTAsaT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbz0wLGE9dC5ncmFwaCgpLHM9YS5tYXJnaW54fHwwLHU9YS5tYXJnaW55fHwwO2Z1bmN0aW9uIGModCl7dmFyIHI9dC54LGE9dC55LHM9dC53aWR0aCx1PXQuaGVpZ2h0O2U9TWF0aC5taW4oZSxyLXMvMiksbj1NYXRoLm1heChuLHIrcy8yKSxpPU1hdGgubWluKGksYS11LzIpLG89TWF0aC5tYXgobyxhK3UvMil9ci5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7Yyh0Lm5vZGUoZSkpfSkpLHIuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZWRnZShlKTtyLmhhcyhuLFwieFwiKSYmYyhuKX0pKSxlLT1zLGktPXUsci5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24obil7dmFyIHI9dC5ub2RlKG4pO3IueC09ZSxyLnktPWl9KSksci5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24obil7dmFyIG89dC5lZGdlKG4pO3IuZm9yRWFjaChvLnBvaW50cywoZnVuY3Rpb24odCl7dC54LT1lLHQueS09aX0pKSxyLmhhcyhvLFwieFwiKSYmKG8ueC09ZSksci5oYXMobyxcInlcIikmJihvLnktPWkpfSkpLGEud2lkdGg9bi1lK3MsYS5oZWlnaHQ9by1pK3V9KHQpfSkpLGUoXCIgICAgYXNzaWduTm9kZUludGVyc2VjdHNcIiwoZnVuY3Rpb24oKXshZnVuY3Rpb24odCl7ci5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG4scixpPXQuZWRnZShlKSxvPXQubm9kZShlLnYpLGE9dC5ub2RlKGUudyk7aS5wb2ludHM/KG49aS5wb2ludHNbMF0scj1pLnBvaW50c1tpLnBvaW50cy5sZW5ndGgtMV0pOihpLnBvaW50cz1bXSxuPWEscj1vKSxpLnBvaW50cy51bnNoaWZ0KGcuaW50ZXJzZWN0UmVjdChvLG4pKSxpLnBvaW50cy5wdXNoKGcuaW50ZXJzZWN0UmVjdChhLHIpKX0pKX0odCl9KSksZShcIiAgICByZXZlcnNlUG9pbnRzXCIsKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3IuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZWRnZShlKTtuLnJldmVyc2VkJiZuLnBvaW50cy5yZXZlcnNlKCl9KSl9KHQpfSkpLGUoXCIgICAgYWN5Y2xpYy51bmRvXCIsKGZ1bmN0aW9uKCl7aS51bmRvKHQpfSkpfShlLG4pfSkpLG4oXCIgIHVwZGF0ZUlucHV0R3JhcGhcIiwoZnVuY3Rpb24oKXshZnVuY3Rpb24odCxlKXtyLmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihuKXt2YXIgcj10Lm5vZGUobiksaT1lLm5vZGUobik7ciYmKHIueD1pLngsci55PWkueSxlLmNoaWxkcmVuKG4pLmxlbmd0aCYmKHIud2lkdGg9aS53aWR0aCxyLmhlaWdodD1pLmhlaWdodCkpfSkpLHIuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPXQuZWRnZShuKSxvPWUuZWRnZShuKTtpLnBvaW50cz1vLnBvaW50cyxyLmhhcyhvLFwieFwiKSYmKGkueD1vLngsaS55PW8ueSl9KSksdC5ncmFwaCgpLndpZHRoPWUuZ3JhcGgoKS53aWR0aCx0LmdyYXBoKCkuaGVpZ2h0PWUuZ3JhcGgoKS5oZWlnaHR9KHQsZSl9KSl9KSl9O3ZhciB5PVtcIm5vZGVzZXBcIixcImVkZ2VzZXBcIixcInJhbmtzZXBcIixcIm1hcmdpbnhcIixcIm1hcmdpbnlcIl0sbT17cmFua3NlcDo1MCxlZGdlc2VwOjIwLG5vZGVzZXA6NTAscmFua2RpcjpcInRiXCJ9LGI9W1wiYWN5Y2xpY2VyXCIsXCJyYW5rZXJcIixcInJhbmtkaXJcIixcImFsaWduXCJdLHg9W1wid2lkdGhcIixcImhlaWdodFwiXSx3PXt3aWR0aDowLGhlaWdodDowfSxTPVtcIm1pbmxlblwiLFwid2VpZ2h0XCIsXCJ3aWR0aFwiLFwiaGVpZ2h0XCIsXCJsYWJlbG9mZnNldFwiXSxFPXttaW5sZW46MSx3ZWlnaHQ6MSx3aWR0aDowLGhlaWdodDowLGxhYmVsb2Zmc2V0OjEwLGxhYmVscG9zOlwiclwifSxfPVtcImxhYmVscG9zXCJdO2Z1bmN0aW9uIE8odCxlKXtyZXR1cm4gci5tYXBWYWx1ZXMoci5waWNrKHQsZSksTnVtYmVyKX1mdW5jdGlvbiBrKHQpe3ZhciBlPXt9O3JldHVybiByLmZvckVhY2godCwoZnVuY3Rpb24odCxuKXtlW24udG9Mb3dlckNhc2UoKV09dH0pKSxlfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCw1KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExMiksaT1uKDczKSxvPW4oMTEzKSxhPW4oNjYpLHM9T2JqZWN0LnByb3RvdHlwZSx1PXMuaGFzT3duUHJvcGVydHksYz1yKChmdW5jdGlvbih0LGUpe3Q9T2JqZWN0KHQpO3ZhciBuPS0xLHI9ZS5sZW5ndGgsYz1yPjI/ZVsyXTp2b2lkIDA7Zm9yKGMmJm8oZVswXSxlWzFdLGMpJiYocj0xKTsrK248cjspZm9yKHZhciBmPWVbbl0sbD1hKGYpLGg9LTEsZD1sLmxlbmd0aDsrK2g8ZDspe3ZhciBwPWxbaF0sZz10W3BdOyh2b2lkIDA9PT1nfHxpKGcsc1twXSkmJiF1LmNhbGwodCxwKSkmJih0W3BdPWZbcF0pfXJldHVybiB0fSkpO3QuZXhwb3J0cz1jfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MDQpKG4oNDA1KSk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDU1KSxpPW4oNTQpLG89big2MCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4sYSl7dmFyIHM9T2JqZWN0KGUpO2lmKCFpKGUpKXt2YXIgdT1yKG4sMyk7ZT1vKGUpLG49ZnVuY3Rpb24odCl7cmV0dXJuIHUoc1t0XSx0LHMpfX12YXIgYz10KGUsbixhKTtyZXR1cm4gYz4tMT9zW3U/ZVtjXTpjXTp2b2lkIDB9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjE4KSxpPW4oNTUpLG89big0MDYpLGE9TWF0aC5tYXg7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcz1udWxsPT10PzA6dC5sZW5ndGg7aWYoIXMpcmV0dXJuLTE7dmFyIHU9bnVsbD09bj8wOm8obik7cmV0dXJuIHU8MCYmKHU9YShzK3UsMCkpLHIodCxpKGUsMyksdSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMjYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1yKHQpLG49ZSUxO3JldHVybiBlPT1lP24/ZS1uOmU6MH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQwOCksaT1uKDQzKSxvPW4oNzcpLGE9L15bLStdMHhbMC05YS1mXSskL2kscz0vXjBiWzAxXSskL2ksdT0vXjBvWzAtN10rJC9pLGM9cGFyc2VJbnQ7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXJldHVybiB0O2lmKG8odCkpcmV0dXJuIE5hTjtpZihpKHQpKXt2YXIgZT1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PWkoZSk/ZStcIlwiOmV9aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD1yKHQpO3ZhciBuPXMudGVzdCh0KTtyZXR1cm4gbnx8dS50ZXN0KHQpP2ModC5zbGljZSgyKSxuPzI6OCk6YS50ZXN0KHQpP05hTjordH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQwOSksaT0vXlxccysvO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnNsaWNlKDAscih0KSsxKS5yZXBsYWNlKGksXCJcIik6dH19LGZ1bmN0aW9uKHQsZSl7dmFyIG49L1xccy87dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJm4udGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1NCksaT1uKDE5OCksbz1uKDY2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD90OnIodCxpKGUpLG8pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBlP3RbZS0xXTp2b2lkIDB9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDMpLGk9bigxNTMpLG89big1NSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49e307cmV0dXJuIGU9byhlLDMpLGkodCwoZnVuY3Rpb24odCxpLG8pe3IobixpLGUodCxpLG8pKX0pKSxufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTU4KSxpPW4oNDE0KSxvPW4oNjcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/cih0LG8saSk6dm9pZCAwfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD5lfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDE2KSxpPW4oNDE5KSgoZnVuY3Rpb24odCxlLG4pe3IodCxlLG4pfSkpO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5NyksaT1uKDIyOCksbz1uKDE1NCksYT1uKDQxNykscz1uKDQzKSx1PW4oNjYpLGM9bigyMjkpO3QuZXhwb3J0cz1mdW5jdGlvbiB0KGUsbixmLGwsaCl7ZSE9PW4mJm8obiwoZnVuY3Rpb24obyx1KXtpZihofHwoaD1uZXcgcikscyhvKSlhKGUsbix1LGYsdCxsLGgpO2Vsc2V7dmFyIGQ9bD9sKGMoZSx1KSxvLHUrXCJcIixlLG4saCk6dm9pZCAwO3ZvaWQgMD09PWQmJihkPW8pLGkoZSx1LGQpfX0pLHUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjI4KSxpPW4oMTg0KSxvPW4oMTkzKSxhPW4oMTg1KSxzPW4oMTk0KSx1PW4oODgpLGM9bigyOSksZj1uKDIxOSksbD1uKDc1KSxoPW4oODYpLGQ9big0MykscD1uKDE2OCksZz1uKDMyKSx2PW4oMjI5KSx5PW4oNDE4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbSxiLHgsdyl7dmFyIFM9dih0LG4pLEU9dihlLG4pLF89dy5nZXQoRSk7aWYoXylyKHQsbixfKTtlbHNle3ZhciBPPXg/eChTLEUsbitcIlwiLHQsZSx3KTp2b2lkIDAsaz12b2lkIDA9PT1PO2lmKGspe3ZhciBNPWMoRSksQT0hTSYmbChFKSxUPSFNJiYhQSYmZyhFKTtPPUUsTXx8QXx8VD9jKFMpP089UzpmKFMpP089YShTKTpBPyhrPSExLE89aShFLCEwKSk6VD8oaz0hMSxPPW8oRSwhMCkpOk89W106cChFKXx8dShFKT8oTz1TLHUoUyk/Tz15KFMpOmQoUykmJiFoKFMpfHwoTz1zKEUpKSk6az0hMX1rJiYody5zZXQoRSxPKSxiKE8sRSxtLHgsdyksdy5kZWxldGUoRSkpLHIodCxuLE8pfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg3KSxpPW4oNjYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0LGkodCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEyKSxpPW4oMTEzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIoKGZ1bmN0aW9uKGUsbil7dmFyIHI9LTEsbz1uLmxlbmd0aCxhPW8+MT9uW28tMV06dm9pZCAwLHM9bz4yP25bMl06dm9pZCAwO2ZvcihhPXQubGVuZ3RoPjMmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGE/KG8tLSxhKTp2b2lkIDAscyYmaShuWzBdLG5bMV0scykmJihhPW88Mz92b2lkIDA6YSxvPTEpLGU9T2JqZWN0KGUpOysrcjxvOyl7dmFyIHU9bltyXTt1JiZ0KGUsdSxyLGEpfXJldHVybiBlfSkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTU4KSxpPW4oMjMwKSxvPW4oNjcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/cih0LG8saSk6dm9pZCAwfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTU4KSxpPW4oNTUpLG89bigyMzApO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9yKHQsaShlLDIpLG8pOnZvaWQgMH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ1KTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4gci5EYXRlLm5vdygpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDI0KSxpPW4oNDI3KSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD97fTpyKHQsZSl9KSk7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQyNSksaT1uKDIwNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCxlLChmdW5jdGlvbihlLG4pe3JldHVybiBpKHQsbil9KSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDkpLGk9big0MjYpLG89bigxMTApO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBhPS0xLHM9ZS5sZW5ndGgsdT17fTsrK2E8czspe3ZhciBjPWVbYV0sZj1yKHQsYyk7bihmLGMpJiZpKHUsbyhjLHQpLGYpfXJldHVybiB1fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTAyKSxpPW4oMTEwKSxvPW4oMTA0KSxhPW4oNDMpLHM9big4OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLHUpe2lmKCFhKHQpKXJldHVybiB0O2Zvcih2YXIgYz0tMSxmPShlPWkoZSx0KSkubGVuZ3RoLGw9Zi0xLGg9dDtudWxsIT1oJiYrK2M8Zjspe3ZhciBkPXMoZVtjXSkscD1uO2lmKFwiX19wcm90b19fXCI9PT1kfHxcImNvbnN0cnVjdG9yXCI9PT1kfHxcInByb3RvdHlwZVwiPT09ZClyZXR1cm4gdDtpZihjIT1sKXt2YXIgZz1oW2RdO3ZvaWQgMD09PShwPXU/dShnLGQsaCk6dm9pZCAwKSYmKHA9YShnKT9nOm8oZVtjKzFdKT9bXTp7fSl9cihoLGQscCksaD1oW2RdfXJldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjI3KSxpPW4oMjE1KSxvPW4oMjE2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8oaSh0LHZvaWQgMCxyKSx0K1wiXCIpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDI5KSgpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MzApLGk9bigxMTMpLG89bigyMjYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3JldHVybiBhJiZcIm51bWJlclwiIT10eXBlb2YgYSYmaShlLG4sYSkmJihuPWE9dm9pZCAwKSxlPW8oZSksdm9pZCAwPT09bj8obj1lLGU9MCk6bj1vKG4pLGE9dm9pZCAwPT09YT9lPG4/MTotMTpvKGEpLHIoZSxuLGEsdCl9fX0sZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLmNlaWwscj1NYXRoLm1heDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLGksbyl7Zm9yKHZhciBhPS0xLHM9cihuKChlLXQpLyhpfHwxKSksMCksdT1BcnJheShzKTtzLS07KXVbbz9zOisrYV09dCx0Kz1pO3JldHVybiB1fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTU3KSxpPW4oNDMyKSxvPW4oMTEyKSxhPW4oMTEzKSxzPW8oKGZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dClyZXR1cm5bXTt2YXIgbj1lLmxlbmd0aDtyZXR1cm4gbj4xJiZhKHQsZVswXSxlWzFdKT9lPVtdOm4+MiYmYShlWzBdLGVbMV0sZVsyXSkmJihlPVtlWzBdXSksaSh0LHIoZSwxKSxbXSl9KSk7dC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExMSksaT1uKDEwOSksbz1uKDU1KSxhPW4oMjEzKSxzPW4oNDMzKSx1PW4oMTA1KSxjPW4oNDM0KSxmPW4oNjcpLGw9bigyOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtlPWUubGVuZ3RoP3IoZSwoZnVuY3Rpb24odCl7cmV0dXJuIGwodCk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSwxPT09dC5sZW5ndGg/dFswXTp0KX06dH0pKTpbZl07dmFyIGg9LTE7ZT1yKGUsdShvKSk7dmFyIGQ9YSh0LChmdW5jdGlvbih0LG4saSl7cmV0dXJue2NyaXRlcmlhOnIoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSksaW5kZXg6KytoLHZhbHVlOnR9fSkpO3JldHVybiBzKGQsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGModCxlLG4pfSkpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10Lmxlbmd0aDtmb3IodC5zb3J0KGUpO24tLTspdFtuXT10W25dLnZhbHVlO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDM1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT0tMSxvPXQuY3JpdGVyaWEsYT1lLmNyaXRlcmlhLHM9by5sZW5ndGgsdT1uLmxlbmd0aDsrK2k8czspe3ZhciBjPXIob1tpXSxhW2ldKTtpZihjKXJldHVybiBpPj11P2M6YyooXCJkZXNjXCI9PW5baV0/LTE6MSl9cmV0dXJuIHQuaW5kZXgtZS5pbmRleH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZih0IT09ZSl7dmFyIG49dm9pZCAwIT09dCxpPW51bGw9PT10LG89dD09dCxhPXIodCkscz12b2lkIDAhPT1lLHU9bnVsbD09PWUsYz1lPT1lLGY9cihlKTtpZighdSYmIWYmJiFhJiZ0PmV8fGEmJnMmJmMmJiF1JiYhZnx8aSYmcyYmY3x8IW4mJmN8fCFvKXJldHVybiAxO2lmKCFpJiYhYSYmIWYmJnQ8ZXx8ZiYmbiYmbyYmIWkmJiFhfHx1JiZuJiZvfHwhcyYmb3x8IWMpcmV0dXJuLTF9cmV0dXJuIDB9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMDYpLGk9MDt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9KytpO3JldHVybiByKHQpK2V9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDIpLGk9big0MzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBpKHR8fFtdLGV8fFtdLHIpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0tMSxpPXQubGVuZ3RoLG89ZS5sZW5ndGgsYT17fTsrK3I8aTspe3ZhciBzPXI8bz9lW3JdOnZvaWQgMDtuKGEsdFtyXSxzKX1yZXR1cm4gYX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDI3KSxpPW4oNDQwKTt0LmV4cG9ydHM9e3J1bjpmdW5jdGlvbih0KXt2YXIgZT1cImdyZWVkeVwiPT09dC5ncmFwaCgpLmFjeWNsaWNlcj9pKHQsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LmVkZ2UoZSkud2VpZ2h0fX0odCkpOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49e30saT17fTtmdW5jdGlvbiBvKGEpe3IuaGFzKGksYSl8fChpW2FdPSEwLG5bYV09ITAsci5mb3JFYWNoKHQub3V0RWRnZXMoYSksKGZ1bmN0aW9uKHQpe3IuaGFzKG4sdC53KT9lLnB1c2godCk6byh0LncpfSkpLGRlbGV0ZSBuW2FdKX1yZXR1cm4gci5mb3JFYWNoKHQubm9kZXMoKSxvKSxlfSh0KTtyLmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIG49dC5lZGdlKGUpO3QucmVtb3ZlRWRnZShlKSxuLmZvcndhcmROYW1lPWUubmFtZSxuLnJldmVyc2VkPSEwLHQuc2V0RWRnZShlLncsZS52LG4sci51bmlxdWVJZChcInJldlwiKSl9KSl9LHVuZG86ZnVuY3Rpb24odCl7ci5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49dC5lZGdlKGUpO2lmKG4ucmV2ZXJzZWQpe3QucmVtb3ZlRWRnZShlKTt2YXIgcj1uLmZvcndhcmROYW1lO2RlbGV0ZSBuLnJldmVyc2VkLGRlbGV0ZSBuLmZvcndhcmROYW1lLHQuc2V0RWRnZShlLncsZS52LG4scil9fSkpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3KSxpPW4oNDQpLkdyYXBoLG89big0NDEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKHQubm9kZUNvdW50KCk8PTEpcmV0dXJuW107dmFyIG49ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgaSxhPTAscz0wO3IuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKHQpe24uc2V0Tm9kZSh0LHt2OnQsaW46MCxvdXQ6MH0pfSkpLHIuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKHQpe3ZhciByPW4uZWRnZSh0LnYsdC53KXx8MCxpPWUodCksbz1yK2k7bi5zZXRFZGdlKHQudix0Lncsbykscz1NYXRoLm1heChzLG4ubm9kZSh0LnYpLm91dCs9aSksYT1NYXRoLm1heChhLG4ubm9kZSh0LncpLmluKz1pKX0pKTt2YXIgYz1yLnJhbmdlKHMrYSszKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvfSkpLGY9YSsxO3JldHVybiByLmZvckVhY2gobi5ub2RlcygpLChmdW5jdGlvbih0KXt1KGMsZixuLm5vZGUodCkpfSkpLHtncmFwaDpuLGJ1Y2tldHM6Yyx6ZXJvSWR4OmZ9fSh0LGV8fGEpLGM9ZnVuY3Rpb24odCxlLG4pe3ZhciByLGk9W10sbz1lW2UubGVuZ3RoLTFdLGE9ZVswXTtmb3IoO3Qubm9kZUNvdW50KCk7KXtmb3IoO3I9YS5kZXF1ZXVlKCk7KXModCxlLG4scik7Zm9yKDtyPW8uZGVxdWV1ZSgpOylzKHQsZSxuLHIpO2lmKHQubm9kZUNvdW50KCkpZm9yKHZhciB1PWUubGVuZ3RoLTI7dT4wOy0tdSlpZihyPWVbdV0uZGVxdWV1ZSgpKXtpPWkuY29uY2F0KHModCxlLG4sciwhMCkpO2JyZWFrfX1yZXR1cm4gaX0obi5ncmFwaCxuLmJ1Y2tldHMsbi56ZXJvSWR4KTtyZXR1cm4gci5mbGF0dGVuKHIubWFwKGMsKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm91dEVkZ2VzKGUudixlLncpfSkpLCEwKX07dmFyIGE9ci5jb25zdGFudCgxKTtmdW5jdGlvbiBzKHQsZSxuLGksbyl7dmFyIGE9bz9bXTp2b2lkIDA7cmV0dXJuIHIuZm9yRWFjaCh0LmluRWRnZXMoaS52KSwoZnVuY3Rpb24ocil7dmFyIGk9dC5lZGdlKHIpLHM9dC5ub2RlKHIudik7byYmYS5wdXNoKHt2OnIudix3OnIud30pLHMub3V0LT1pLHUoZSxuLHMpfSkpLHIuZm9yRWFjaCh0Lm91dEVkZ2VzKGkudiksKGZ1bmN0aW9uKHIpe3ZhciBpPXQuZWRnZShyKSxvPXIudyxhPXQubm9kZShvKTthLmluLT1pLHUoZSxuLGEpfSkpLHQucmVtb3ZlTm9kZShpLnYpLGF9ZnVuY3Rpb24gdSh0LGUsbil7bi5vdXQ/bi5pbj90W24ub3V0LW4uaW4rZV0uZW5xdWV1ZShuKTp0W3QubGVuZ3RoLTFdLmVucXVldWUobik6dFswXS5lbnF1ZXVlKG4pfX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dmFyIHQ9e307dC5fbmV4dD10Ll9wcmV2PXQsdGhpcy5fc2VudGluZWw9dH1mdW5jdGlvbiByKHQpe3QuX3ByZXYuX25leHQ9dC5fbmV4dCx0Ll9uZXh0Ll9wcmV2PXQuX3ByZXYsZGVsZXRlIHQuX25leHQsZGVsZXRlIHQuX3ByZXZ9ZnVuY3Rpb24gaSh0LGUpe2lmKFwiX25leHRcIiE9PXQmJlwiX3ByZXZcIiE9PXQpcmV0dXJuIGV9dC5leHBvcnRzPW4sbi5wcm90b3R5cGUuZGVxdWV1ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3NlbnRpbmVsLGU9dC5fcHJldjtpZihlIT09dClyZXR1cm4gcihlKSxlfSxuLnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3NlbnRpbmVsO3QuX3ByZXYmJnQuX25leHQmJnIodCksdC5fbmV4dD1lLl9uZXh0LGUuX25leHQuX3ByZXY9dCxlLl9uZXh0PXQsdC5fcHJldj1lfSxuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPXRoaXMuX3NlbnRpbmVsLG49ZS5fcHJldjtuIT09ZTspdC5wdXNoKEpTT04uc3RyaW5naWZ5KG4saSkpLG49bi5fcHJldjtyZXR1cm5cIltcIit0LmpvaW4oXCIsIFwiKStcIl1cIn19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDI3KSxpPW4oMzcpO3QuZXhwb3J0cz17cnVuOmZ1bmN0aW9uKHQpe3QuZ3JhcGgoKS5kdW1teUNoYWlucz1bXSxyLmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihlKXshZnVuY3Rpb24odCxlKXt2YXIgbixyLG8sYT1lLnYscz10Lm5vZGUoYSkucmFuayx1PWUudyxjPXQubm9kZSh1KS5yYW5rLGY9ZS5uYW1lLGw9dC5lZGdlKGUpLGg9bC5sYWJlbFJhbms7aWYoYz09PXMrMSlyZXR1cm47Zm9yKHQucmVtb3ZlRWRnZShlKSxvPTAsKytzO3M8YzsrK28sKytzKWwucG9pbnRzPVtdLHI9e3dpZHRoOjAsaGVpZ2h0OjAsZWRnZUxhYmVsOmwsZWRnZU9iajplLHJhbms6c30sbj1pLmFkZER1bW15Tm9kZSh0LFwiZWRnZVwiLHIsXCJfZFwiKSxzPT09aCYmKHIud2lkdGg9bC53aWR0aCxyLmhlaWdodD1sLmhlaWdodCxyLmR1bW15PVwiZWRnZS1sYWJlbFwiLHIubGFiZWxwb3M9bC5sYWJlbHBvcyksdC5zZXRFZGdlKGEsbix7d2VpZ2h0Omwud2VpZ2h0fSxmKSwwPT09byYmdC5ncmFwaCgpLmR1bW15Q2hhaW5zLnB1c2gobiksYT1uO3Quc2V0RWRnZShhLHUse3dlaWdodDpsLndlaWdodH0sZil9KHQsZSl9KSl9LHVuZG86ZnVuY3Rpb24odCl7ci5mb3JFYWNoKHQuZ3JhcGgoKS5kdW1teUNoYWlucywoZnVuY3Rpb24oZSl7dmFyIG4scj10Lm5vZGUoZSksaT1yLmVkZ2VMYWJlbDtmb3IodC5zZXRFZGdlKHIuZWRnZU9iaixpKTtyLmR1bW15OyluPXQuc3VjY2Vzc29ycyhlKVswXSx0LnJlbW92ZU5vZGUoZSksaS5wb2ludHMucHVzaCh7eDpyLngseTpyLnl9KSxcImVkZ2UtbGFiZWxcIj09PXIuZHVtbXkmJihpLng9ci54LGkueT1yLnksaS53aWR0aD1yLndpZHRoLGkuaGVpZ2h0PXIuaGVpZ2h0KSxlPW4scj10Lm5vZGUoZSl9KSl9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMTE0KS5sb25nZXN0UGF0aCxpPW4oMjMxKSxvPW4oNDQ0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7c3dpdGNoKHQuZ3JhcGgoKS5yYW5rZXIpe2Nhc2VcIm5ldHdvcmstc2ltcGxleFwiOnModCk7YnJlYWs7Y2FzZVwidGlnaHQtdHJlZVwiOiFmdW5jdGlvbih0KXtyKHQpLGkodCl9KHQpO2JyZWFrO2Nhc2VcImxvbmdlc3QtcGF0aFwiOmEodCk7YnJlYWs7ZGVmYXVsdDpzKHQpfX07dmFyIGE9cjtmdW5jdGlvbiBzKHQpe28odCl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyNyksaT1uKDIzMSksbz1uKDExNCkuc2xhY2ssYT1uKDExNCkubG9uZ2VzdFBhdGgscz1uKDQ0KS5hbGcucHJlb3JkZXIsdT1uKDQ0KS5hbGcucG9zdG9yZGVyLGM9bigzNykuc2ltcGxpZnk7ZnVuY3Rpb24gZih0KXt0PWModCksYSh0KTt2YXIgZSxuPWkodCk7Zm9yKGQobiksbChuLHQpO2U9ZyhuKTspeShuLHQsZSx2KG4sdCxlKSl9ZnVuY3Rpb24gbCh0LGUpe3ZhciBuPXUodCx0Lm5vZGVzKCkpO249bi5zbGljZSgwLG4ubGVuZ3RoLTEpLHIuZm9yRWFjaChuLChmdW5jdGlvbihuKXshZnVuY3Rpb24odCxlLG4pe3ZhciByPXQubm9kZShuKS5wYXJlbnQ7dC5lZGdlKG4scikuY3V0dmFsdWU9aCh0LGUsbil9KHQsZSxuKX0pKX1mdW5jdGlvbiBoKHQsZSxuKXt2YXIgaT10Lm5vZGUobikucGFyZW50LG89ITAsYT1lLmVkZ2UobixpKSxzPTA7cmV0dXJuIGF8fChvPSExLGE9ZS5lZGdlKGksbikpLHM9YS53ZWlnaHQsci5mb3JFYWNoKGUubm9kZUVkZ2VzKG4pLChmdW5jdGlvbihyKXt2YXIgYSx1LGM9ci52PT09bixmPWM/ci53OnIudjtpZihmIT09aSl7dmFyIGw9Yz09PW8saD1lLmVkZ2Uocikud2VpZ2h0O2lmKHMrPWw/aDotaCxhPW4sdT1mLHQuaGFzRWRnZShhLHUpKXt2YXIgZD10LmVkZ2UobixmKS5jdXR2YWx1ZTtzKz1sPy1kOmR9fX0pKSxzfWZ1bmN0aW9uIGQodCxlKXthcmd1bWVudHMubGVuZ3RoPDImJihlPXQubm9kZXMoKVswXSkscCh0LHt9LDEsZSl9ZnVuY3Rpb24gcCh0LGUsbixpLG8pe3ZhciBhPW4scz10Lm5vZGUoaSk7cmV0dXJuIGVbaV09ITAsci5mb3JFYWNoKHQubmVpZ2hib3JzKGkpLChmdW5jdGlvbihvKXtyLmhhcyhlLG8pfHwobj1wKHQsZSxuLG8saSkpfSkpLHMubG93PWEscy5saW09bisrLG8/cy5wYXJlbnQ9bzpkZWxldGUgcy5wYXJlbnQsbn1mdW5jdGlvbiBnKHQpe3JldHVybiByLmZpbmQodC5lZGdlcygpLChmdW5jdGlvbihlKXtyZXR1cm4gdC5lZGdlKGUpLmN1dHZhbHVlPDB9KSl9ZnVuY3Rpb24gdih0LGUsbil7dmFyIGk9bi52LGE9bi53O2UuaGFzRWRnZShpLGEpfHwoaT1uLncsYT1uLnYpO3ZhciBzPXQubm9kZShpKSx1PXQubm9kZShhKSxjPXMsZj0hMTtzLmxpbT51LmxpbSYmKGM9dSxmPSEwKTt2YXIgbD1yLmZpbHRlcihlLmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3JldHVybiBmPT09bSh0LHQubm9kZShlLnYpLGMpJiZmIT09bSh0LHQubm9kZShlLncpLGMpfSkpO3JldHVybiByLm1pbkJ5KGwsKGZ1bmN0aW9uKHQpe3JldHVybiBvKGUsdCl9KSl9ZnVuY3Rpb24geSh0LGUsbixpKXt2YXIgbz1uLnYsYT1uLnc7dC5yZW1vdmVFZGdlKG8sYSksdC5zZXRFZGdlKGkudixpLncse30pLGQodCksbCh0LGUpLGZ1bmN0aW9uKHQsZSl7dmFyIG49ci5maW5kKHQubm9kZXMoKSwoZnVuY3Rpb24odCl7cmV0dXJuIWUubm9kZSh0KS5wYXJlbnR9KSksaT1zKHQsbik7aT1pLnNsaWNlKDEpLHIuZm9yRWFjaChpLChmdW5jdGlvbihuKXt2YXIgcj10Lm5vZGUobikucGFyZW50LGk9ZS5lZGdlKG4sciksbz0hMTtpfHwoaT1lLmVkZ2UocixuKSxvPSEwKSxlLm5vZGUobikucmFuaz1lLm5vZGUocikucmFuaysobz9pLm1pbmxlbjotaS5taW5sZW4pfSkpfSh0LGUpfWZ1bmN0aW9uIG0odCxlLG4pe3JldHVybiBuLmxvdzw9ZS5saW0mJmUubGltPD1uLmxpbX10LmV4cG9ydHM9ZixmLmluaXRMb3dMaW1WYWx1ZXM9ZCxmLmluaXRDdXRWYWx1ZXM9bCxmLmNhbGNDdXRWYWx1ZT1oLGYubGVhdmVFZGdlPWcsZi5lbnRlckVkZ2U9dixmLmV4Y2hhbmdlRWRnZXM9eX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT17fSxuPTA7ZnVuY3Rpb24gaShvKXt2YXIgYT1uO3IuZm9yRWFjaCh0LmNoaWxkcmVuKG8pLGkpLGVbb109e2xvdzphLGxpbTpuKyt9fXJldHVybiByLmZvckVhY2godC5jaGlsZHJlbigpLGkpLGV9KHQpO3IuZm9yRWFjaCh0LmdyYXBoKCkuZHVtbXlDaGFpbnMsKGZ1bmN0aW9uKG4pe2Zvcih2YXIgcj10Lm5vZGUobiksaT1yLmVkZ2VPYmosbz1mdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLGE9W10scz1bXSx1PU1hdGgubWluKGVbbl0ubG93LGVbcl0ubG93KSxjPU1hdGgubWF4KGVbbl0ubGltLGVbcl0ubGltKTtpPW47ZG97aT10LnBhcmVudChpKSxhLnB1c2goaSl9d2hpbGUoaSYmKGVbaV0ubG93PnV8fGM+ZVtpXS5saW0pKTtvPWksaT1yO2Zvcig7KGk9dC5wYXJlbnQoaSkpIT09bzspcy5wdXNoKGkpO3JldHVybntwYXRoOmEuY29uY2F0KHMucmV2ZXJzZSgpKSxsY2E6b319KHQsZSxpLnYsaS53KSxhPW8ucGF0aCxzPW8ubGNhLHU9MCxjPWFbdV0sZj0hMDtuIT09aS53Oyl7aWYocj10Lm5vZGUobiksZil7Zm9yKDsoYz1hW3VdKSE9PXMmJnQubm9kZShjKS5tYXhSYW5rPHIucmFuazspdSsrO2M9PT1zJiYoZj0hMSl9aWYoIWYpe2Zvcig7dTxhLmxlbmd0aC0xJiZ0Lm5vZGUoYz1hW3UrMV0pLm1pblJhbms8PXIucmFuazspdSsrO2M9YVt1XX10LnNldFBhcmVudChuLGMpLG49dC5zdWNjZXNzb3JzKG4pWzBdfX0pKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3KSxpPW4oMzcpO3QuZXhwb3J0cz17cnVuOmZ1bmN0aW9uKHQpe3ZhciBlPWkuYWRkRHVtbXlOb2RlKHQsXCJyb290XCIse30sXCJfcm9vdFwiKSxuPWZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiByLmZvckVhY2godC5jaGlsZHJlbigpLChmdW5jdGlvbihuKXshZnVuY3Rpb24gbihpLG8pe3ZhciBhPXQuY2hpbGRyZW4oaSk7YSYmYS5sZW5ndGgmJnIuZm9yRWFjaChhLChmdW5jdGlvbih0KXtuKHQsbysxKX0pKTtlW2ldPW99KG4sMSl9KSksZX0odCksbz1yLm1heChyLnZhbHVlcyhuKSktMSxhPTIqbysxO3QuZ3JhcGgoKS5uZXN0aW5nUm9vdD1lLHIuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3QuZWRnZShlKS5taW5sZW4qPWF9KSk7dmFyIHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIucmVkdWNlKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gZSt0LmVkZ2Uobikud2VpZ2h0fSksMCl9KHQpKzE7ci5mb3JFYWNoKHQuY2hpbGRyZW4oKSwoZnVuY3Rpb24odSl7IWZ1bmN0aW9uIHQoZSxuLG8sYSxzLHUsYyl7dmFyIGY9ZS5jaGlsZHJlbihjKTtpZighZi5sZW5ndGgpcmV0dXJuIHZvaWQoYyE9PW4mJmUuc2V0RWRnZShuLGMse3dlaWdodDowLG1pbmxlbjpvfSkpO3ZhciBsPWkuYWRkQm9yZGVyTm9kZShlLFwiX2J0XCIpLGg9aS5hZGRCb3JkZXJOb2RlKGUsXCJfYmJcIiksZD1lLm5vZGUoYyk7ZS5zZXRQYXJlbnQobCxjKSxkLmJvcmRlclRvcD1sLGUuc2V0UGFyZW50KGgsYyksZC5ib3JkZXJCb3R0b209aCxyLmZvckVhY2goZiwoZnVuY3Rpb24ocil7dChlLG4sbyxhLHMsdSxyKTt2YXIgaT1lLm5vZGUociksZj1pLmJvcmRlclRvcD9pLmJvcmRlclRvcDpyLGQ9aS5ib3JkZXJCb3R0b20/aS5ib3JkZXJCb3R0b206cixwPWkuYm9yZGVyVG9wP2E6MiphLGc9ZiE9PWQ/MTpzLXVbY10rMTtlLnNldEVkZ2UobCxmLHt3ZWlnaHQ6cCxtaW5sZW46ZyxuZXN0aW5nRWRnZTohMH0pLGUuc2V0RWRnZShkLGgse3dlaWdodDpwLG1pbmxlbjpnLG5lc3RpbmdFZGdlOiEwfSl9KSksZS5wYXJlbnQoYyl8fGUuc2V0RWRnZShuLGwse3dlaWdodDowLG1pbmxlbjpzK3VbY119KX0odCxlLGEscyxvLG4sdSl9KSksdC5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yPWF9LGNsZWFudXA6ZnVuY3Rpb24odCl7dmFyIGU9dC5ncmFwaCgpO3QucmVtb3ZlTm9kZShlLm5lc3RpbmdSb290KSxkZWxldGUgZS5uZXN0aW5nUm9vdCxyLmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihlKXt0LmVkZ2UoZSkubmVzdGluZ0VkZ2UmJnQucmVtb3ZlRWRnZShlKX0pKX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNyksaT1uKDM3KTtmdW5jdGlvbiBvKHQsZSxuLHIsbyxhKXt2YXIgcz17d2lkdGg6MCxoZWlnaHQ6MCxyYW5rOmEsYm9yZGVyVHlwZTplfSx1PW9bZV1bYS0xXSxjPWkuYWRkRHVtbXlOb2RlKHQsXCJib3JkZXJcIixzLG4pO29bZV1bYV09Yyx0LnNldFBhcmVudChjLHIpLHUmJnQuc2V0RWRnZSh1LGMse3dlaWdodDoxfSl9dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3IuZm9yRWFjaCh0LmNoaWxkcmVuKCksKGZ1bmN0aW9uIGUobil7dmFyIGk9dC5jaGlsZHJlbihuKSxhPXQubm9kZShuKTtpZihpLmxlbmd0aCYmci5mb3JFYWNoKGksZSksci5oYXMoYSxcIm1pblJhbmtcIikpe2EuYm9yZGVyTGVmdD1bXSxhLmJvcmRlclJpZ2h0PVtdO2Zvcih2YXIgcz1hLm1pblJhbmssdT1hLm1heFJhbmsrMTtzPHU7KytzKW8odCxcImJvcmRlckxlZnRcIixcIl9ibFwiLG4sYSxzKSxvKHQsXCJib3JkZXJSaWdodFwiLFwiX2JyXCIsbixhLHMpfX0pKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDI3KTtmdW5jdGlvbiBpKHQpe3IuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe28odC5ub2RlKGUpKX0pKSxyLmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihlKXtvKHQuZWRnZShlKSl9KSl9ZnVuY3Rpb24gbyh0KXt2YXIgZT10LndpZHRoO3Qud2lkdGg9dC5oZWlnaHQsdC5oZWlnaHQ9ZX1mdW5jdGlvbiBhKHQpe3QueT0tdC55fWZ1bmN0aW9uIHModCl7dmFyIGU9dC54O3QueD10LnksdC55PWV9dC5leHBvcnRzPXthZGp1c3Q6ZnVuY3Rpb24odCl7dmFyIGU9dC5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcImxyXCIhPT1lJiZcInJsXCIhPT1lfHxpKHQpfSx1bmRvOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZ3JhcGgoKS5yYW5rZGlyLnRvTG93ZXJDYXNlKCk7XCJidFwiIT09ZSYmXCJybFwiIT09ZXx8ZnVuY3Rpb24odCl7ci5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7YSh0Lm5vZGUoZSkpfSkpLHIuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZWRnZShlKTtyLmZvckVhY2gobi5wb2ludHMsYSksci5oYXMobixcInlcIikmJmEobil9KSl9KHQpO1wibHJcIiE9PWUmJlwicmxcIiE9PWV8fCghZnVuY3Rpb24odCl7ci5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7cyh0Lm5vZGUoZSkpfSkpLHIuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZWRnZShlKTtyLmZvckVhY2gobi5wb2ludHMscyksci5oYXMobixcInhcIikmJnMobil9KSl9KHQpLGkodCkpfX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDI3KSxpPW4oNDUwKSxvPW4oNDUxKSxhPW4oNDUyKSxzPW4oNDU2KSx1PW4oNDU3KSxjPW4oNDQpLkdyYXBoLGY9bigzNyk7ZnVuY3Rpb24gbCh0LGUsbil7cmV0dXJuIHIubWFwKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBzKHQsZSxuKX0pKX1mdW5jdGlvbiBoKHQsZSl7dmFyIG49bmV3IGM7ci5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciBpPXQuZ3JhcGgoKS5yb290LG89YSh0LGksbixlKTtyLmZvckVhY2goby52cywoZnVuY3Rpb24oZSxuKXt0Lm5vZGUoZSkub3JkZXI9bn0pKSx1KHQsbixvLnZzKX0pKX1mdW5jdGlvbiBkKHQsZSl7ci5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe3IuZm9yRWFjaChlLChmdW5jdGlvbihlLG4pe3Qubm9kZShlKS5vcmRlcj1ufSkpfSkpfXQuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1mLm1heFJhbmsodCksbj1sKHQsci5yYW5nZSgxLGUrMSksXCJpbkVkZ2VzXCIpLGE9bCh0LHIucmFuZ2UoZS0xLC0xLC0xKSxcIm91dEVkZ2VzXCIpLHM9aSh0KTtkKHQscyk7Zm9yKHZhciB1LGM9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHA9MCxnPTA7Zzw0OysrcCwrK2cpe2gocCUyP246YSxwJTQ+PTIpLHM9Zi5idWlsZExheWVyTWF0cml4KHQpO3ZhciB2PW8odCxzKTt2PGMmJihnPTAsdT1yLmNsb25lRGVlcChzKSxjPXYpfWQodCx1KX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDI3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9e30sbj1yLmZpbHRlcih0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3JldHVybiF0LmNoaWxkcmVuKGUpLmxlbmd0aH0pKSxpPXIubWF4KHIubWFwKG4sKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkucmFua30pKSksbz1yLm1hcChyLnJhbmdlKGkrMSksKGZ1bmN0aW9uKCl7cmV0dXJuW119KSk7dmFyIGE9ci5zb3J0QnkobiwoZnVuY3Rpb24oZSl7cmV0dXJuIHQubm9kZShlKS5yYW5rfSkpO3JldHVybiByLmZvckVhY2goYSwoZnVuY3Rpb24gbihpKXtpZihyLmhhcyhlLGkpKXJldHVybjtlW2ldPSEwO3ZhciBhPXQubm9kZShpKTtvW2EucmFua10ucHVzaChpKSxyLmZvckVhY2godC5zdWNjZXNzb3JzKGkpLG4pfSkpLG99fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyNyk7ZnVuY3Rpb24gaSh0LGUsbil7Zm9yKHZhciBpPXIuemlwT2JqZWN0KG4sci5tYXAobiwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0pKSksbz1yLmZsYXR0ZW4oci5tYXAoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHIuc29ydEJ5KHIubWFwKHQub3V0RWRnZXMoZSksKGZ1bmN0aW9uKGUpe3JldHVybntwb3M6aVtlLnddLHdlaWdodDp0LmVkZ2UoZSkud2VpZ2h0fX0pKSxcInBvc1wiKX0pKSwhMCksYT0xO2E8bi5sZW5ndGg7KWE8PD0xO3ZhciBzPTIqYS0xO2EtPTE7dmFyIHU9ci5tYXAobmV3IEFycmF5KHMpLChmdW5jdGlvbigpe3JldHVybiAwfSkpLGM9MDtyZXR1cm4gci5mb3JFYWNoKG8uZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5wb3MrYTt1W2VdKz10LndlaWdodDtmb3IodmFyIG49MDtlPjA7KWUlMiYmKG4rPXVbZSsxXSksdVtlPWUtMT4+MV0rPXQud2VpZ2h0O2MrPXQud2VpZ2h0Km59KSkpLGN9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj0xO3I8ZS5sZW5ndGg7KytyKW4rPWkodCxlW3ItMV0sZVtyXSk7cmV0dXJuIG59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNyksaT1uKDQ1Myksbz1uKDQ1NCksYT1uKDQ1NSk7dC5leHBvcnRzPWZ1bmN0aW9uIHQoZSxuLHMsdSl7dmFyIGM9ZS5jaGlsZHJlbihuKSxmPWUubm9kZShuKSxsPWY/Zi5ib3JkZXJMZWZ0OnZvaWQgMCxoPWY/Zi5ib3JkZXJSaWdodDp2b2lkIDAsZD17fTtsJiYoYz1yLmZpbHRlcihjLChmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWwmJnQhPT1ofSkpKTt2YXIgcD1pKGUsYyk7ci5mb3JFYWNoKHAsKGZ1bmN0aW9uKG4pe2lmKGUuY2hpbGRyZW4obi52KS5sZW5ndGgpe3ZhciBpPXQoZSxuLnYscyx1KTtkW24udl09aSxyLmhhcyhpLFwiYmFyeWNlbnRlclwiKSYmKG89bixhPWksci5pc1VuZGVmaW5lZChvLmJhcnljZW50ZXIpPyhvLmJhcnljZW50ZXI9YS5iYXJ5Y2VudGVyLG8ud2VpZ2h0PWEud2VpZ2h0KTooby5iYXJ5Y2VudGVyPShvLmJhcnljZW50ZXIqby53ZWlnaHQrYS5iYXJ5Y2VudGVyKmEud2VpZ2h0KS8oby53ZWlnaHQrYS53ZWlnaHQpLG8ud2VpZ2h0Kz1hLndlaWdodCkpfXZhciBvLGF9KSk7dmFyIGc9byhwLHMpOyFmdW5jdGlvbih0LGUpe3IuZm9yRWFjaCh0LChmdW5jdGlvbih0KXt0LnZzPXIuZmxhdHRlbih0LnZzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF0/ZVt0XS52czp0fSkpLCEwKX0pKX0oZyxkKTt2YXIgdj1hKGcsdSk7aWYobCYmKHYudnM9ci5mbGF0dGVuKFtsLHYudnMsaF0sITApLGUucHJlZGVjZXNzb3JzKGwpLmxlbmd0aCkpe3ZhciB5PWUubm9kZShlLnByZWRlY2Vzc29ycyhsKVswXSksbT1lLm5vZGUoZS5wcmVkZWNlc3NvcnMoaClbMF0pO3IuaGFzKHYsXCJiYXJ5Y2VudGVyXCIpfHwodi5iYXJ5Y2VudGVyPTAsdi53ZWlnaHQ9MCksdi5iYXJ5Y2VudGVyPSh2LmJhcnljZW50ZXIqdi53ZWlnaHQreS5vcmRlcittLm9yZGVyKS8odi53ZWlnaHQrMiksdi53ZWlnaHQrPTJ9cmV0dXJuIHZ9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIubWFwKGUsKGZ1bmN0aW9uKGUpe3ZhciBuPXQuaW5FZGdlcyhlKTtpZihuLmxlbmd0aCl7dmFyIGk9ci5yZWR1Y2UobiwoZnVuY3Rpb24oZSxuKXt2YXIgcj10LmVkZ2UobiksaT10Lm5vZGUobi52KTtyZXR1cm57c3VtOmUuc3VtK3Iud2VpZ2h0Kmkub3JkZXIsd2VpZ2h0OmUud2VpZ2h0K3Iud2VpZ2h0fX0pLHtzdW06MCx3ZWlnaHQ6MH0pO3JldHVybnt2OmUsYmFyeWNlbnRlcjppLnN1bS9pLndlaWdodCx3ZWlnaHQ6aS53ZWlnaHR9fXJldHVybnt2OmV9fSkpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMjcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXt9O3JldHVybiByLmZvckVhY2godCwoZnVuY3Rpb24odCxlKXt2YXIgaT1uW3Qudl09e2luZGVncmVlOjAsaW46W10sb3V0OltdLHZzOlt0LnZdLGk6ZX07ci5pc1VuZGVmaW5lZCh0LmJhcnljZW50ZXIpfHwoaS5iYXJ5Y2VudGVyPXQuYmFyeWNlbnRlcixpLndlaWdodD10LndlaWdodCl9KSksci5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIGU9blt0LnZdLGk9blt0LnddO3IuaXNVbmRlZmluZWQoZSl8fHIuaXNVbmRlZmluZWQoaSl8fChpLmluZGVncmVlKyssZS5vdXQucHVzaChuW3Qud10pKX0pKSxmdW5jdGlvbih0KXt2YXIgZT1bXTtmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbihlKXtlLm1lcmdlZHx8KHIuaXNVbmRlZmluZWQoZS5iYXJ5Y2VudGVyKXx8ci5pc1VuZGVmaW5lZCh0LmJhcnljZW50ZXIpfHxlLmJhcnljZW50ZXI+PXQuYmFyeWNlbnRlcikmJmZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPTA7dC53ZWlnaHQmJihuKz10LmJhcnljZW50ZXIqdC53ZWlnaHQscis9dC53ZWlnaHQpO2Uud2VpZ2h0JiYobis9ZS5iYXJ5Y2VudGVyKmUud2VpZ2h0LHIrPWUud2VpZ2h0KTt0LnZzPWUudnMuY29uY2F0KHQudnMpLHQuYmFyeWNlbnRlcj1uL3IsdC53ZWlnaHQ9cix0Lmk9TWF0aC5taW4oZS5pLHQuaSksZS5tZXJnZWQ9ITB9KHQsZSl9fWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe24uaW4ucHVzaChlKSwwPT0tLW4uaW5kZWdyZWUmJnQucHVzaChuKX19Zm9yKDt0Lmxlbmd0aDspe3ZhciBvPXQucG9wKCk7ZS5wdXNoKG8pLHIuZm9yRWFjaChvLmluLnJldmVyc2UoKSxuKG8pKSxyLmZvckVhY2goby5vdXQsaShvKSl9cmV0dXJuIHIubWFwKHIuZmlsdGVyKGUsKGZ1bmN0aW9uKHQpe3JldHVybiF0Lm1lcmdlZH0pKSwoZnVuY3Rpb24odCl7cmV0dXJuIHIucGljayh0LFtcInZzXCIsXCJpXCIsXCJiYXJ5Y2VudGVyXCIsXCJ3ZWlnaHRcIl0pfSkpfShyLmZpbHRlcihuLChmdW5jdGlvbih0KXtyZXR1cm4hdC5pbmRlZ3JlZX0pKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNyksaT1uKDM3KTtmdW5jdGlvbiBvKHQsZSxuKXtmb3IodmFyIGk7ZS5sZW5ndGgmJihpPXIubGFzdChlKSkuaTw9bjspZS5wb3AoKSx0LnB1c2goaS52cyksbisrO3JldHVybiBufXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPWkucGFydGl0aW9uKHQsKGZ1bmN0aW9uKHQpe3JldHVybiByLmhhcyh0LFwiYmFyeWNlbnRlclwiKX0pKSxhPW4ubGhzLHM9ci5zb3J0Qnkobi5yaHMsKGZ1bmN0aW9uKHQpe3JldHVybi10Lml9KSksdT1bXSxjPTAsZj0wLGw9MDthLnNvcnQoKGg9ISFlLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYmFyeWNlbnRlcjxlLmJhcnljZW50ZXI/LTE6dC5iYXJ5Y2VudGVyPmUuYmFyeWNlbnRlcj8xOmg/ZS5pLXQuaTp0LmktZS5pfSkpLGw9byh1LHMsbCksci5mb3JFYWNoKGEsKGZ1bmN0aW9uKHQpe2wrPXQudnMubGVuZ3RoLHUucHVzaCh0LnZzKSxjKz10LmJhcnljZW50ZXIqdC53ZWlnaHQsZis9dC53ZWlnaHQsbD1vKHUscyxsKX0pKTt2YXIgaDt2YXIgZD17dnM6ci5mbGF0dGVuKHUsITApfTtmJiYoZC5iYXJ5Y2VudGVyPWMvZixkLndlaWdodD1mKTtyZXR1cm4gZH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3KSxpPW4oNDQpLkdyYXBoO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIG89ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKDt0Lmhhc05vZGUoZT1yLnVuaXF1ZUlkKFwiX3Jvb3RcIikpOyk7cmV0dXJuIGV9KHQpLGE9bmV3IGkoe2NvbXBvdW5kOiEwfSkuc2V0R3JhcGgoe3Jvb3Q6b30pLnNldERlZmF1bHROb2RlTGFiZWwoKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSl9KSk7cmV0dXJuIHIuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGkpe3ZhciBzPXQubm9kZShpKSx1PXQucGFyZW50KGkpOyhzLnJhbms9PT1lfHxzLm1pblJhbms8PWUmJmU8PXMubWF4UmFuaykmJihhLnNldE5vZGUoaSksYS5zZXRQYXJlbnQoaSx1fHxvKSxyLmZvckVhY2godFtuXShpKSwoZnVuY3Rpb24oZSl7dmFyIG49ZS52PT09aT9lLnc6ZS52LG89YS5lZGdlKG4saSkscz1yLmlzVW5kZWZpbmVkKG8pPzA6by53ZWlnaHQ7YS5zZXRFZGdlKG4saSx7d2VpZ2h0OnQuZWRnZShlKS53ZWlnaHQrc30pfSkpLHIuaGFzKHMsXCJtaW5SYW5rXCIpJiZhLnNldE5vZGUoaSx7Ym9yZGVyTGVmdDpzLmJvcmRlckxlZnRbZV0sYm9yZGVyUmlnaHQ6cy5ib3JkZXJSaWdodFtlXX0pKX0pKSxhfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGksbz17fTtyLmZvckVhY2gobiwoZnVuY3Rpb24obil7Zm9yKHZhciByLGEscz10LnBhcmVudChuKTtzOyl7aWYoKHI9dC5wYXJlbnQocykpPyhhPW9bcl0sb1tyXT1zKTooYT1pLGk9cyksYSYmYSE9PXMpcmV0dXJuIHZvaWQgZS5zZXRFZGdlKGEscyk7cz1yfX0pKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDI3KSxpPW4oMzcpLG89big0NTkpLnBvc2l0aW9uWDt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7KGZ1bmN0aW9uKHQpe3ZhciBlPWkuYnVpbGRMYXllck1hdHJpeCh0KSxuPXQuZ3JhcGgoKS5yYW5rc2VwLG89MDtyLmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIGk9ci5tYXgoci5tYXAoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHQubm9kZShlKS5oZWlnaHR9KSkpO3IuZm9yRWFjaChlLChmdW5jdGlvbihlKXt0Lm5vZGUoZSkueT1vK2kvMn0pKSxvKz1pK259KSl9KSh0PWkuYXNOb25Db21wb3VuZEdyYXBoKHQpKSxyLmZvckVhY2gobyh0KSwoZnVuY3Rpb24oZSxuKXt0Lm5vZGUobikueD1lfSkpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMjcpLGk9big0NCkuR3JhcGgsbz1uKDM3KTtmdW5jdGlvbiBhKHQsZSl7dmFyIG49e307cmV0dXJuIHIucmVkdWNlKGUsKGZ1bmN0aW9uKGUsaSl7dmFyIG89MCxhPTAscz1lLmxlbmd0aCxjPXIubGFzdChpKTtyZXR1cm4gci5mb3JFYWNoKGksKGZ1bmN0aW9uKGUsZil7dmFyIGw9ZnVuY3Rpb24odCxlKXtpZih0Lm5vZGUoZSkuZHVtbXkpcmV0dXJuIHIuZmluZCh0LnByZWRlY2Vzc29ycyhlKSwoZnVuY3Rpb24oZSl7cmV0dXJuIHQubm9kZShlKS5kdW1teX0pKX0odCxlKSxoPWw/dC5ub2RlKGwpLm9yZGVyOnM7KGx8fGU9PT1jKSYmKHIuZm9yRWFjaChpLnNsaWNlKGEsZisxKSwoZnVuY3Rpb24oZSl7ci5mb3JFYWNoKHQucHJlZGVjZXNzb3JzKGUpLChmdW5jdGlvbihyKXt2YXIgaT10Lm5vZGUociksYT1pLm9yZGVyOyEoYTxvfHxoPGEpfHxpLmR1bW15JiZ0Lm5vZGUoZSkuZHVtbXl8fHUobixyLGUpfSkpfSkpLGE9ZisxLG89aCl9KSksaX0pKSxufWZ1bmN0aW9uIHModCxlKXt2YXIgbj17fTtmdW5jdGlvbiBpKGUsaSxvLGEscyl7dmFyIGM7ci5mb3JFYWNoKHIucmFuZ2UoaSxvKSwoZnVuY3Rpb24oaSl7Yz1lW2ldLHQubm9kZShjKS5kdW1teSYmci5mb3JFYWNoKHQucHJlZGVjZXNzb3JzKGMpLChmdW5jdGlvbihlKXt2YXIgcj10Lm5vZGUoZSk7ci5kdW1teSYmKHIub3JkZXI8YXx8ci5vcmRlcj5zKSYmdShuLGUsYyl9KSl9KSl9cmV0dXJuIHIucmVkdWNlKGUsKGZ1bmN0aW9uKGUsbil7dmFyIG8sYT0tMSxzPTA7cmV0dXJuIHIuZm9yRWFjaChuLChmdW5jdGlvbihyLHUpe2lmKFwiYm9yZGVyXCI9PT10Lm5vZGUocikuZHVtbXkpe3ZhciBjPXQucHJlZGVjZXNzb3JzKHIpO2MubGVuZ3RoJiYobz10Lm5vZGUoY1swXSkub3JkZXIsaShuLHMsdSxhLG8pLHM9dSxhPW8pfWkobixzLG4ubGVuZ3RoLG8sZS5sZW5ndGgpfSkpLG59KSksbn1mdW5jdGlvbiB1KHQsZSxuKXtpZihlPm4pe3ZhciByPWU7ZT1uLG49cn12YXIgaT10W2VdO2l8fCh0W2VdPWk9e30pLGlbbl09ITB9ZnVuY3Rpb24gYyh0LGUsbil7aWYoZT5uKXt2YXIgaT1lO2U9bixuPWl9cmV0dXJuIHIuaGFzKHRbZV0sbil9ZnVuY3Rpb24gZih0LGUsbixpKXt2YXIgbz17fSxhPXt9LHM9e307cmV0dXJuIHIuZm9yRWFjaChlLChmdW5jdGlvbih0KXtyLmZvckVhY2godCwoZnVuY3Rpb24odCxlKXtvW3RdPXQsYVt0XT10LHNbdF09ZX0pKX0pKSxyLmZvckVhY2goZSwoZnVuY3Rpb24odCl7dmFyIGU9LTE7ci5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciB1PWkodCk7aWYodS5sZW5ndGgpZm9yKHZhciBmPSgodT1yLnNvcnRCeSh1LChmdW5jdGlvbih0KXtyZXR1cm4gc1t0XX0pKSkubGVuZ3RoLTEpLzIsbD1NYXRoLmZsb29yKGYpLGg9TWF0aC5jZWlsKGYpO2w8PWg7KytsKXt2YXIgZD11W2xdO2FbdF09PT10JiZlPHNbZF0mJiFjKG4sdCxkKSYmKGFbZF09dCxhW3RdPW9bdF09b1tkXSxlPXNbZF0pfX0pKX0pKSx7cm9vdDpvLGFsaWduOmF9fWZ1bmN0aW9uIGwodCxlLG4sbyxhKXt2YXIgcz17fSx1PWZ1bmN0aW9uKHQsZSxuLG8pe3ZhciBhPW5ldyBpLHM9dC5ncmFwaCgpLHU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbihpLG8sYSl7dmFyIHMsdT1pLm5vZGUobyksYz1pLm5vZGUoYSksZj0wO2lmKGYrPXUud2lkdGgvMixyLmhhcyh1LFwibGFiZWxwb3NcIikpc3dpdGNoKHUubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZVwibFwiOnM9LXUud2lkdGgvMjticmVhaztjYXNlXCJyXCI6cz11LndpZHRoLzJ9aWYocyYmKGYrPW4/czotcykscz0wLGYrPSh1LmR1bW15P2U6dCkvMixmKz0oYy5kdW1teT9lOnQpLzIsZis9Yy53aWR0aC8yLHIuaGFzKGMsXCJsYWJlbHBvc1wiKSlzd2l0Y2goYy5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlXCJsXCI6cz1jLndpZHRoLzI7YnJlYWs7Y2FzZVwiclwiOnM9LWMud2lkdGgvMn1yZXR1cm4gcyYmKGYrPW4/czotcykscz0wLGZ9fShzLm5vZGVzZXAscy5lZGdlc2VwLG8pO3JldHVybiByLmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIGk7ci5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe3ZhciByPW5bZV07aWYoYS5zZXROb2RlKHIpLGkpe3ZhciBvPW5baV0scz1hLmVkZ2UobyxyKTthLnNldEVkZ2UobyxyLE1hdGgubWF4KHUodCxlLGkpLHN8fDApKX1pPWV9KSl9KSksYX0odCxlLG4sYSksYz1hP1wiYm9yZGVyTGVmdFwiOlwiYm9yZGVyUmlnaHRcIjtmdW5jdGlvbiBmKHQsZSl7Zm9yKHZhciBuPXUubm9kZXMoKSxyPW4ucG9wKCksaT17fTtyOylpW3JdP3Qocik6KGlbcl09ITAsbi5wdXNoKHIpLG49bi5jb25jYXQoZShyKSkpLHI9bi5wb3AoKX1yZXR1cm4gZigoZnVuY3Rpb24odCl7c1t0XT11LmluRWRnZXModCkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCh0LHNbZS52XSt1LmVkZ2UoZSkpfSksMCl9KSx1LnByZWRlY2Vzc29ycy5iaW5kKHUpKSxmKChmdW5jdGlvbihlKXt2YXIgbj11Lm91dEVkZ2VzKGUpLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5taW4odCxzW2Uud10tdS5lZGdlKGUpKX0pLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkscj10Lm5vZGUoZSk7biE9PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSYmci5ib3JkZXJUeXBlIT09YyYmKHNbZV09TWF0aC5tYXgoc1tlXSxuKSl9KSx1LnN1Y2Nlc3NvcnMuYmluZCh1KSksci5mb3JFYWNoKG8sKGZ1bmN0aW9uKHQpe3NbdF09c1tuW3RdXX0pKSxzfWZ1bmN0aW9uIGgodCxlKXtyZXR1cm4gci5taW5CeShyLnZhbHVlcyhlKSwoZnVuY3Rpb24oZSl7dmFyIG49TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLGk9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3JldHVybiByLmZvckluKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5ub2RlKGUpLndpZHRofSh0LHIpLzI7bj1NYXRoLm1heChlK28sbiksaT1NYXRoLm1pbihlLW8saSl9KSksbi1pfSkpfWZ1bmN0aW9uIGQodCxlKXt2YXIgbj1yLnZhbHVlcyhlKSxpPXIubWluKG4pLG89ci5tYXgobik7ci5mb3JFYWNoKFtcInVcIixcImRcIl0sKGZ1bmN0aW9uKG4pe3IuZm9yRWFjaChbXCJsXCIsXCJyXCJdLChmdW5jdGlvbihhKXt2YXIgcyx1PW4rYSxjPXRbdV07aWYoYyE9PWUpe3ZhciBmPXIudmFsdWVzKGMpOyhzPVwibFwiPT09YT9pLXIubWluKGYpOm8tci5tYXgoZikpJiYodFt1XT1yLm1hcFZhbHVlcyhjLChmdW5jdGlvbih0KXtyZXR1cm4gdCtzfSkpKX19KSl9KSl9ZnVuY3Rpb24gcCh0LGUpe3JldHVybiByLm1hcFZhbHVlcyh0LnVsLChmdW5jdGlvbihuLGkpe2lmKGUpcmV0dXJuIHRbZS50b0xvd2VyQ2FzZSgpXVtpXTt2YXIgbz1yLnNvcnRCeShyLm1hcCh0LGkpKTtyZXR1cm4ob1sxXStvWzJdKS8yfSkpfXQuZXhwb3J0cz17cG9zaXRpb25YOmZ1bmN0aW9uKHQpe3ZhciBlLG49by5idWlsZExheWVyTWF0cml4KHQpLGk9ci5tZXJnZShhKHQsbikscyh0LG4pKSx1PXt9O3IuZm9yRWFjaChbXCJ1XCIsXCJkXCJdLChmdW5jdGlvbihvKXtlPVwidVwiPT09bz9uOnIudmFsdWVzKG4pLnJldmVyc2UoKSxyLmZvckVhY2goW1wibFwiLFwiclwiXSwoZnVuY3Rpb24obil7XCJyXCI9PT1uJiYoZT1yLm1hcChlLChmdW5jdGlvbih0KXtyZXR1cm4gci52YWx1ZXModCkucmV2ZXJzZSgpfSkpKTt2YXIgYT0oXCJ1XCI9PT1vP3QucHJlZGVjZXNzb3JzOnQuc3VjY2Vzc29ycykuYmluZCh0KSxzPWYodCxlLGksYSksYz1sKHQsZSxzLnJvb3Qscy5hbGlnbixcInJcIj09PW4pO1wiclwiPT09biYmKGM9ci5tYXBWYWx1ZXMoYywoZnVuY3Rpb24odCl7cmV0dXJuLXR9KSkpLHVbbytuXT1jfSkpfSkpO3ZhciBjPWgodCx1KTtyZXR1cm4gZCh1LGMpLHAodSx0LmdyYXBoKCkuYWxpZ24pfSxmaW5kVHlwZTFDb25mbGljdHM6YSxmaW5kVHlwZTJDb25mbGljdHM6cyxhZGRDb25mbGljdDp1LGhhc0NvbmZsaWN0OmMsdmVydGljYWxBbGlnbm1lbnQ6Zixob3Jpem9udGFsQ29tcGFjdGlvbjpsLGFsaWduQ29vcmRpbmF0ZXM6ZCxmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudDpoLGJhbGFuY2U6cH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3KSxpPW4oMzcpLG89big0NCkuR3JhcGg7dC5leHBvcnRzPXtkZWJ1Z09yZGVyaW5nOmZ1bmN0aW9uKHQpe3ZhciBlPWkuYnVpbGRMYXllck1hdHJpeCh0KSxuPW5ldyBvKHtjb21wb3VuZDohMCxtdWx0aWdyYXBoOiEwfSkuc2V0R3JhcGgoe30pO3JldHVybiByLmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihlKXtuLnNldE5vZGUoZSx7bGFiZWw6ZX0pLG4uc2V0UGFyZW50KGUsXCJsYXllclwiK3Qubm9kZShlKS5yYW5rKX0pKSxyLmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbih0KXtuLnNldEVkZ2UodC52LHQudyx7fSx0Lm5hbWUpfSkpLHIuZm9yRWFjaChlLChmdW5jdGlvbih0LGUpe3ZhciBpPVwibGF5ZXJcIitlO24uc2V0Tm9kZShpLHtyYW5rOlwic2FtZVwifSksci5yZWR1Y2UodCwoZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zZXRFZGdlKHQsZSx7c3R5bGU6XCJpbnZpc1wifSksZX0pKX0pKSxufX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVwiMC44LjVcIn0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3JldHVybihlPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX12YXIgbj1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgbj1PYmplY3QucHJvdG90eXBlLHI9bi5oYXNPd25Qcm9wZXJ0eSxpPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbD9TeW1ib2w6e30sbz1pLml0ZXJhdG9yfHxcIkBAaXRlcmF0b3JcIixhPWkuYXN5bmNJdGVyYXRvcnx8XCJAQGFzeW5jSXRlcmF0b3JcIixzPWkudG9TdHJpbmdUYWd8fFwiQEB0b1N0cmluZ1RhZ1wiO2Z1bmN0aW9uIHUodCxlLG4pe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksdFtlXX10cnl7dSh7fSxcIlwiKX1jYXRjaCh0KXt1PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXT1ufX1mdW5jdGlvbiBjKHQsZSxuLHIpe3ZhciBpPWUmJmUucHJvdG90eXBlIGluc3RhbmNlb2YgaD9lOmgsbz1PYmplY3QuY3JlYXRlKGkucHJvdG90eXBlKSxhPW5ldyBfKHJ8fFtdKTtyZXR1cm4gby5faW52b2tlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1cInN1c3BlbmRlZFN0YXJ0XCI7cmV0dXJuIGZ1bmN0aW9uKGksbyl7aWYoXCJleGVjdXRpbmdcIj09PXIpdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtpZihcImNvbXBsZXRlZFwiPT09cil7aWYoXCJ0aHJvd1wiPT09aSl0aHJvdyBvO3JldHVybiBrKCl9Zm9yKG4ubWV0aG9kPWksbi5hcmc9bzs7KXt2YXIgYT1uLmRlbGVnYXRlO2lmKGEpe3ZhciBzPXcoYSxuKTtpZihzKXtpZihzPT09bCljb250aW51ZTtyZXR1cm4gc319aWYoXCJuZXh0XCI9PT1uLm1ldGhvZCluLnNlbnQ9bi5fc2VudD1uLmFyZztlbHNlIGlmKFwidGhyb3dcIj09PW4ubWV0aG9kKXtpZihcInN1c3BlbmRlZFN0YXJ0XCI9PT1yKXRocm93IHI9XCJjb21wbGV0ZWRcIixuLmFyZztuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKX1lbHNlXCJyZXR1cm5cIj09PW4ubWV0aG9kJiZuLmFicnVwdChcInJldHVyblwiLG4uYXJnKTtyPVwiZXhlY3V0aW5nXCI7dmFyIHU9Zih0LGUsbik7aWYoXCJub3JtYWxcIj09PXUudHlwZSl7aWYocj1uLmRvbmU/XCJjb21wbGV0ZWRcIjpcInN1c3BlbmRlZFlpZWxkXCIsdS5hcmc9PT1sKWNvbnRpbnVlO3JldHVybnt2YWx1ZTp1LmFyZyxkb25lOm4uZG9uZX19XCJ0aHJvd1wiPT09dS50eXBlJiYocj1cImNvbXBsZXRlZFwiLG4ubWV0aG9kPVwidGhyb3dcIixuLmFyZz11LmFyZyl9fX0odCxuLGEpLG99ZnVuY3Rpb24gZih0LGUsbil7dHJ5e3JldHVybnt0eXBlOlwibm9ybWFsXCIsYXJnOnQuY2FsbChlLG4pfX1jYXRjaCh0KXtyZXR1cm57dHlwZTpcInRocm93XCIsYXJnOnR9fX10LndyYXA9Yzt2YXIgbD17fTtmdW5jdGlvbiBoKCl7fWZ1bmN0aW9uIGQoKXt9ZnVuY3Rpb24gcCgpe312YXIgZz17fTtnW29dPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3ZhciB2PU9iamVjdC5nZXRQcm90b3R5cGVPZix5PXYmJnYodihPKFtdKSkpO3kmJnkhPT1uJiZyLmNhbGwoeSxvKSYmKGc9eSk7dmFyIG09cC5wcm90b3R5cGU9aC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShnKTtmdW5jdGlvbiBiKHQpe1tcIm5leHRcIixcInRocm93XCIsXCJyZXR1cm5cIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dSh0LGUsKGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbnZva2UoZSx0KX0pKX0pKX1mdW5jdGlvbiB4KHQsbil7dmFyIGk7dGhpcy5faW52b2tlPWZ1bmN0aW9uKG8sYSl7ZnVuY3Rpb24gcygpe3JldHVybiBuZXcgbigoZnVuY3Rpb24oaSxzKXshZnVuY3Rpb24gaShvLGEscyx1KXt2YXIgYz1mKHRbb10sdCxhKTtpZihcInRocm93XCIhPT1jLnR5cGUpe3ZhciBsPWMuYXJnLGg9bC52YWx1ZTtyZXR1cm4gaCYmXCJvYmplY3RcIj09PWUoaCkmJnIuY2FsbChoLFwiX19hd2FpdFwiKT9uLnJlc29sdmUoaC5fX2F3YWl0KS50aGVuKChmdW5jdGlvbih0KXtpKFwibmV4dFwiLHQscyx1KX0pLChmdW5jdGlvbih0KXtpKFwidGhyb3dcIix0LHMsdSl9KSk6bi5yZXNvbHZlKGgpLnRoZW4oKGZ1bmN0aW9uKHQpe2wudmFsdWU9dCxzKGwpfSksKGZ1bmN0aW9uKHQpe3JldHVybiBpKFwidGhyb3dcIix0LHMsdSl9KSl9dShjLmFyZyl9KG8sYSxpLHMpfSkpfXJldHVybiBpPWk/aS50aGVuKHMscyk6cygpfX1mdW5jdGlvbiB3KHQsZSl7dmFyIG49dC5pdGVyYXRvcltlLm1ldGhvZF07aWYodm9pZCAwPT09bil7aWYoZS5kZWxlZ2F0ZT1udWxsLFwidGhyb3dcIj09PWUubWV0aG9kKXtpZih0Lml0ZXJhdG9yLnJldHVybiYmKGUubWV0aG9kPVwicmV0dXJuXCIsZS5hcmc9dm9pZCAwLHcodCxlKSxcInRocm93XCI9PT1lLm1ldGhvZCkpcmV0dXJuIGw7ZS5tZXRob2Q9XCJ0aHJvd1wiLGUuYXJnPW5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpfXJldHVybiBsfXZhciByPWYobix0Lml0ZXJhdG9yLGUuYXJnKTtpZihcInRocm93XCI9PT1yLnR5cGUpcmV0dXJuIGUubWV0aG9kPVwidGhyb3dcIixlLmFyZz1yLmFyZyxlLmRlbGVnYXRlPW51bGwsbDt2YXIgaT1yLmFyZztyZXR1cm4gaT9pLmRvbmU/KGVbdC5yZXN1bHROYW1lXT1pLnZhbHVlLGUubmV4dD10Lm5leHRMb2MsXCJyZXR1cm5cIiE9PWUubWV0aG9kJiYoZS5tZXRob2Q9XCJuZXh0XCIsZS5hcmc9dm9pZCAwKSxlLmRlbGVnYXRlPW51bGwsbCk6aTooZS5tZXRob2Q9XCJ0aHJvd1wiLGUuYXJnPW5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKSxlLmRlbGVnYXRlPW51bGwsbCl9ZnVuY3Rpb24gUyh0KXt2YXIgZT17dHJ5TG9jOnRbMF19OzEgaW4gdCYmKGUuY2F0Y2hMb2M9dFsxXSksMiBpbiB0JiYoZS5maW5hbGx5TG9jPXRbMl0sZS5hZnRlckxvYz10WzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaChlKX1mdW5jdGlvbiBFKHQpe3ZhciBlPXQuY29tcGxldGlvbnx8e307ZS50eXBlPVwibm9ybWFsXCIsZGVsZXRlIGUuYXJnLHQuY29tcGxldGlvbj1lfWZ1bmN0aW9uIF8odCl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOlwicm9vdFwifV0sdC5mb3JFYWNoKFMsdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gTyh0KXtpZih0KXt2YXIgZT10W29dO2lmKGUpcmV0dXJuIGUuY2FsbCh0KTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0Lm5leHQpcmV0dXJuIHQ7aWYoIWlzTmFOKHQubGVuZ3RoKSl7dmFyIG49LTEsaT1mdW5jdGlvbiBlKCl7Zm9yKDsrK248dC5sZW5ndGg7KWlmKHIuY2FsbCh0LG4pKXJldHVybiBlLnZhbHVlPXRbbl0sZS5kb25lPSExLGU7cmV0dXJuIGUudmFsdWU9dm9pZCAwLGUuZG9uZT0hMCxlfTtyZXR1cm4gaS5uZXh0PWl9fXJldHVybntuZXh0Omt9fWZ1bmN0aW9uIGsoKXtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fXJldHVybiBkLnByb3RvdHlwZT1tLmNvbnN0cnVjdG9yPXAscC5jb25zdHJ1Y3Rvcj1kLGQuZGlzcGxheU5hbWU9dShwLHMsXCJHZW5lcmF0b3JGdW5jdGlvblwiKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9XCJmdW5jdGlvblwiPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4hIWUmJihlPT09ZHx8XCJHZW5lcmF0b3JGdW5jdGlvblwiPT09KGUuZGlzcGxheU5hbWV8fGUubmFtZSkpfSx0Lm1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxwKToodC5fX3Byb3RvX189cCx1KHQscyxcIkdlbmVyYXRvckZ1bmN0aW9uXCIpKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG0pLHR9LHQuYXdyYXA9ZnVuY3Rpb24odCl7cmV0dXJue19fYXdhaXQ6dH19LGIoeC5wcm90b3R5cGUpLHgucHJvdG90eXBlW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQuQXN5bmNJdGVyYXRvcj14LHQuYXN5bmM9ZnVuY3Rpb24oZSxuLHIsaSxvKXt2b2lkIDA9PT1vJiYobz1Qcm9taXNlKTt2YXIgYT1uZXcgeChjKGUsbixyLGkpLG8pO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24obik/YTphLm5leHQoKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdC5kb25lP3QudmFsdWU6YS5uZXh0KCl9KSl9LGIobSksdShtLHMsXCJHZW5lcmF0b3JcIiksbVtvXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxtLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJbb2JqZWN0IEdlbmVyYXRvcl1cIn0sdC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZS5yZXZlcnNlKCksZnVuY3Rpb24gbigpe2Zvcig7ZS5sZW5ndGg7KXt2YXIgcj1lLnBvcCgpO2lmKHIgaW4gdClyZXR1cm4gbi52YWx1ZT1yLG4uZG9uZT0hMSxufXJldHVybiBuLmRvbmU9ITAsbn19LHQudmFsdWVzPU8sXy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOl8scmVzZXQ6ZnVuY3Rpb24odCl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9dm9pZCAwLHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9XCJuZXh0XCIsdGhpcy5hcmc9dm9pZCAwLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKEUpLCF0KWZvcih2YXIgZSBpbiB0aGlzKVwidFwiPT09ZS5jaGFyQXQoMCkmJnIuY2FsbCh0aGlzLGUpJiYhaXNOYU4oK2Uuc2xpY2UoMSkpJiYodGhpc1tlXT12b2lkIDApfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciB0PXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKFwidGhyb3dcIj09PXQudHlwZSl0aHJvdyB0LmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbih0KXtpZih0aGlzLmRvbmUpdGhyb3cgdDt2YXIgZT10aGlzO2Z1bmN0aW9uIG4obixyKXtyZXR1cm4gYS50eXBlPVwidGhyb3dcIixhLmFyZz10LGUubmV4dD1uLHImJihlLm1ldGhvZD1cIm5leHRcIixlLmFyZz12b2lkIDApLCEhcn1mb3IodmFyIGk9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgbz10aGlzLnRyeUVudHJpZXNbaV0sYT1vLmNvbXBsZXRpb247aWYoXCJyb290XCI9PT1vLnRyeUxvYylyZXR1cm4gbihcImVuZFwiKTtpZihvLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgcz1yLmNhbGwobyxcImNhdGNoTG9jXCIpLHU9ci5jYWxsKG8sXCJmaW5hbGx5TG9jXCIpO2lmKHMmJnUpe2lmKHRoaXMucHJldjxvLmNhdGNoTG9jKXJldHVybiBuKG8uY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxvLmZpbmFsbHlMb2MpcmV0dXJuIG4oby5maW5hbGx5TG9jKX1lbHNlIGlmKHMpe2lmKHRoaXMucHJldjxvLmNhdGNoTG9jKXJldHVybiBuKG8uY2F0Y2hMb2MsITApfWVsc2V7aWYoIXUpdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7aWYodGhpcy5wcmV2PG8uZmluYWxseUxvYylyZXR1cm4gbihvLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO24+PTA7LS1uKXt2YXIgaT10aGlzLnRyeUVudHJpZXNbbl07aWYoaS50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKGksXCJmaW5hbGx5TG9jXCIpJiZ0aGlzLnByZXY8aS5maW5hbGx5TG9jKXt2YXIgbz1pO2JyZWFrfX1vJiYoXCJicmVha1wiPT09dHx8XCJjb250aW51ZVwiPT09dCkmJm8udHJ5TG9jPD1lJiZlPD1vLmZpbmFsbHlMb2MmJihvPW51bGwpO3ZhciBhPW8/by5jb21wbGV0aW9uOnt9O3JldHVybiBhLnR5cGU9dCxhLmFyZz1lLG8/KHRoaXMubWV0aG9kPVwibmV4dFwiLHRoaXMubmV4dD1vLmZpbmFsbHlMb2MsbCk6dGhpcy5jb21wbGV0ZShhKX0sY29tcGxldGU6ZnVuY3Rpb24odCxlKXtpZihcInRocm93XCI9PT10LnR5cGUpdGhyb3cgdC5hcmc7cmV0dXJuXCJicmVha1wiPT09dC50eXBlfHxcImNvbnRpbnVlXCI9PT10LnR5cGU/dGhpcy5uZXh0PXQuYXJnOlwicmV0dXJuXCI9PT10LnR5cGU/KHRoaXMucnZhbD10aGlzLmFyZz10LmFyZyx0aGlzLm1ldGhvZD1cInJldHVyblwiLHRoaXMubmV4dD1cImVuZFwiKTpcIm5vcm1hbFwiPT09dC50eXBlJiZlJiYodGhpcy5uZXh0PWUpLGx9LGZpbmlzaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2U+PTA7LS1lKXt2YXIgbj10aGlzLnRyeUVudHJpZXNbZV07aWYobi5maW5hbGx5TG9jPT09dClyZXR1cm4gdGhpcy5jb21wbGV0ZShuLmNvbXBsZXRpb24sbi5hZnRlckxvYyksRShuKSxsfX0sY2F0Y2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIG49dGhpcy50cnlFbnRyaWVzW2VdO2lmKG4udHJ5TG9jPT09dCl7dmFyIHI9bi5jb21wbGV0aW9uO2lmKFwidGhyb3dcIj09PXIudHlwZSl7dmFyIGk9ci5hcmc7RShuKX1yZXR1cm4gaX19dGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6Tyh0KSxyZXN1bHROYW1lOmUsbmV4dExvYzpufSxcIm5leHRcIj09PXRoaXMubWV0aG9kJiYodGhpcy5hcmc9dm9pZCAwKSxsfX0sdH0oXCJvYmplY3RcIj09PWUodCk/dC5leHBvcnRzOnt9KTt0cnl7cmVnZW5lcmF0b3JSdW50aW1lPW59Y2F0Y2godCl7RnVuY3Rpb24oXCJyXCIsXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKG4pfX0pLmNhbGwodGhpcyxuKDcyKSh0KSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpe3ZhciBuPVtdLHI9ITAsaT0hMSxvPXZvaWQgMDt0cnl7Zm9yKHZhciBhLHM9dFtTeW1ib2wuaXRlcmF0b3JdKCk7IShyPShhPXMubmV4dCgpKS5kb25lKSYmKG4ucHVzaChhLnZhbHVlKSwhZXx8bi5sZW5ndGghPT1lKTtyPSEwKTt9Y2F0Y2godCl7aT0hMCxvPXR9ZmluYWxseXt0cnl7cnx8bnVsbD09cy5yZXR1cm58fHMucmV0dXJuKCl9ZmluYWxseXtpZihpKXRocm93IG99fXJldHVybiBufX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKHQpe3JldHVybihyPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX12YXIgaT10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoKGZ1bmN0aW9uKGksbyl7ZnVuY3Rpb24gYSh0KXt0cnl7dShyLm5leHQodCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHModCl7dHJ5e3Uoci50aHJvdyh0KSl9Y2F0Y2godCl7byh0KX19ZnVuY3Rpb24gdSh0KXt2YXIgZTt0LmRvbmU/aSh0LnZhbHVlKTooZT10LnZhbHVlLGUgaW5zdGFuY2VvZiBuP2U6bmV3IG4oKGZ1bmN0aW9uKHQpe3QoZSl9KSkpLnRoZW4oYSxzKX11KChyPXIuYXBwbHkodCxlfHxbXSkpLm5leHQoKSl9KSl9LG89dGhpcyYmdGhpcy5fX2dlbmVyYXRvcnx8ZnVuY3Rpb24odCxlKXt2YXIgbixyLGksbyxhPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZigxJmlbMF0pdGhyb3cgaVsxXTtyZXR1cm4gaVsxXX0sdHJ5czpbXSxvcHM6W119O3JldHVybiBvPXtuZXh0OnMoMCksdGhyb3c6cygxKSxyZXR1cm46cygyKX0sXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiYob1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxvO2Z1bmN0aW9uIHMobyl7cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihvKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO2Zvcig7YTspdHJ5e2lmKG49MSxyJiYoaT0yJm9bMF0/ci5yZXR1cm46b1swXT9yLnRocm93fHwoKGk9ci5yZXR1cm4pJiZpLmNhbGwociksMCk6ci5uZXh0KSYmIShpPWkuY2FsbChyLG9bMV0pKS5kb25lKXJldHVybiBpO3N3aXRjaChyPTAsaSYmKG89WzImb1swXSxpLnZhbHVlXSksb1swXSl7Y2FzZSAwOmNhc2UgMTppPW87YnJlYWs7Y2FzZSA0OnJldHVybiBhLmxhYmVsKysse3ZhbHVlOm9bMV0sZG9uZTohMX07Y2FzZSA1OmEubGFiZWwrKyxyPW9bMV0sbz1bMF07Y29udGludWU7Y2FzZSA3Om89YS5vcHMucG9wKCksYS50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoIShpPWEudHJ5cywoaT1pLmxlbmd0aD4wJiZpW2kubGVuZ3RoLTFdKXx8NiE9PW9bMF0mJjIhPT1vWzBdKSl7YT0wO2NvbnRpbnVlfWlmKDM9PT1vWzBdJiYoIWl8fG9bMV0+aVswXSYmb1sxXTxpWzNdKSl7YS5sYWJlbD1vWzFdO2JyZWFrfWlmKDY9PT1vWzBdJiZhLmxhYmVsPGlbMV0pe2EubGFiZWw9aVsxXSxpPW87YnJlYWt9aWYoaSYmYS5sYWJlbDxpWzJdKXthLmxhYmVsPWlbMl0sYS5vcHMucHVzaChvKTticmVha31pWzJdJiZhLm9wcy5wb3AoKSxhLnRyeXMucG9wKCk7Y29udGludWV9bz1lLmNhbGwodCxhKX1jYXRjaCh0KXtvPVs2LHRdLHI9MH1maW5hbGx5e249aT0wfWlmKDUmb1swXSl0aHJvdyBvWzFdO3JldHVybnt2YWx1ZTpvWzBdP29bMV06dm9pZCAwLGRvbmU6ITB9fShbbyxzXSl9fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5Db250YWluZXI9dm9pZCAwO3ZhciBhPW4oNDY3KSxzPW4oNDEpLHU9big1NiksYz1uKDMxKSxmPW4oMjM1KSxsPW4oNDY4KSxoPW4oNDc1KSxkPW4oNDc3KSxwPW4oNjgpLGc9big5MCksdj1uKDQ4MCkseT1uKDQ4MSksbT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGU9dHx8e307aWYoXCJvYmplY3RcIiE9PXIoZSkpdGhyb3cgbmV3IEVycm9yKFwiXCIrcy5DT05UQUlORVJfT1BUSU9OU19NVVNUX0JFX0FOX09CSkVDVCk7aWYodm9pZCAwPT09ZS5kZWZhdWx0U2NvcGUpZS5kZWZhdWx0U2NvcGU9dS5CaW5kaW5nU2NvcGVFbnVtLlRyYW5zaWVudDtlbHNlIGlmKGUuZGVmYXVsdFNjb3BlIT09dS5CaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbiYmZS5kZWZhdWx0U2NvcGUhPT11LkJpbmRpbmdTY29wZUVudW0uVHJhbnNpZW50JiZlLmRlZmF1bHRTY29wZSE9PXUuQmluZGluZ1Njb3BlRW51bS5SZXF1ZXN0KXRocm93IG5ldyBFcnJvcihcIlwiK3MuQ09OVEFJTkVSX09QVElPTlNfSU5WQUxJRF9ERUZBVUxUX1NDT1BFKTtpZih2b2lkIDA9PT1lLmF1dG9CaW5kSW5qZWN0YWJsZSllLmF1dG9CaW5kSW5qZWN0YWJsZT0hMTtlbHNlIGlmKFwiYm9vbGVhblwiIT10eXBlb2YgZS5hdXRvQmluZEluamVjdGFibGUpdGhyb3cgbmV3IEVycm9yKFwiXCIrcy5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX0FVVE9fQklORF9JTkpFQ1RBQkxFKTtpZih2b2lkIDA9PT1lLnNraXBCYXNlQ2xhc3NDaGVja3MpZS5za2lwQmFzZUNsYXNzQ2hlY2tzPSExO2Vsc2UgaWYoXCJib29sZWFuXCIhPXR5cGVvZiBlLnNraXBCYXNlQ2xhc3NDaGVja3MpdGhyb3cgbmV3IEVycm9yKFwiXCIrcy5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX1NLSVBfQkFTRV9DSEVDSyk7dGhpcy5vcHRpb25zPXthdXRvQmluZEluamVjdGFibGU6ZS5hdXRvQmluZEluamVjdGFibGUsZGVmYXVsdFNjb3BlOmUuZGVmYXVsdFNjb3BlLHNraXBCYXNlQ2xhc3NDaGVja3M6ZS5za2lwQmFzZUNsYXNzQ2hlY2tzfSx0aGlzLmlkPXAuaWQoKSx0aGlzLl9iaW5kaW5nRGljdGlvbmFyeT1uZXcgeS5Mb29rdXAsdGhpcy5fc25hcHNob3RzPVtdLHRoaXMuX21pZGRsZXdhcmU9bnVsbCx0aGlzLnBhcmVudD1udWxsLHRoaXMuX21ldGFkYXRhUmVhZGVyPW5ldyBmLk1ldGFkYXRhUmVhZGVyfXJldHVybiB0Lm1lcmdlPWZ1bmN0aW9uKGUsbil7dmFyIHI9bmV3IHQsaT1sLmdldEJpbmRpbmdEaWN0aW9uYXJ5KHIpLG89bC5nZXRCaW5kaW5nRGljdGlvbmFyeShlKSxhPWwuZ2V0QmluZGluZ0RpY3Rpb25hcnkobik7ZnVuY3Rpb24gcyh0LGUpe3QudHJhdmVyc2UoKGZ1bmN0aW9uKHQsbil7bi5mb3JFYWNoKChmdW5jdGlvbih0KXtlLmFkZCh0LnNlcnZpY2VJZGVudGlmaWVyLHQuY2xvbmUoKSl9KSl9KSl9cmV0dXJuIHMobyxpKSxzKGEsaSkscn0sdC5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtmb3IodmFyIG49dGhpcy5fZ2V0Q29udGFpbmVyTW9kdWxlSGVscGVyc0ZhY3RvcnkoKSxyPTAsaT10O3I8aS5sZW5ndGg7cisrKXt2YXIgbz1pW3JdLGE9bihvLmlkKTtvLnJlZ2lzdHJ5KGEuYmluZEZ1bmN0aW9uLGEudW5iaW5kRnVuY3Rpb24sYS5pc2JvdW5kRnVuY3Rpb24sYS5yZWJpbmRGdW5jdGlvbil9fSx0LnByb3RvdHlwZS5sb2FkQXN5bmM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIGkodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbigpe3ZhciBlLG4scixpLGE7cmV0dXJuIG8odGhpcywoZnVuY3Rpb24obyl7c3dpdGNoKG8ubGFiZWwpe2Nhc2UgMDplPXRoaXMuX2dldENvbnRhaW5lck1vZHVsZUhlbHBlcnNGYWN0b3J5KCksbj0wLHI9dCxvLmxhYmVsPTE7Y2FzZSAxOnJldHVybiBuPHIubGVuZ3RoPyhpPXJbbl0sYT1lKGkuaWQpLFs0LGkucmVnaXN0cnkoYS5iaW5kRnVuY3Rpb24sYS51bmJpbmRGdW5jdGlvbixhLmlzYm91bmRGdW5jdGlvbixhLnJlYmluZEZ1bmN0aW9uKV0pOlszLDRdO2Nhc2UgMjpvLnNlbnQoKSxvLmxhYmVsPTM7Y2FzZSAzOnJldHVybiBuKyssWzMsMV07Y2FzZSA0OnJldHVyblsyXX19KSl9KSl9LHQucHJvdG90eXBlLnVubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuXT1hcmd1bWVudHNbbl07dmFyIHI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLm1vZHVsZUlkPT09dH19O2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49cihlLmlkKTt0Ll9iaW5kaW5nRGljdGlvbmFyeS5yZW1vdmVCeUNvbmRpdGlvbihuKX0pKX0sdC5wcm90b3R5cGUuYmluZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMuZGVmYXVsdFNjb3BlfHx1LkJpbmRpbmdTY29wZUVudW0uVHJhbnNpZW50LG49bmV3IGEuQmluZGluZyh0LGUpO3JldHVybiB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5hZGQodCxuKSxuZXcgZC5CaW5kaW5nVG9TeW50YXgobil9LHQucHJvdG90eXBlLnJlYmluZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy51bmJpbmQodCksdGhpcy5iaW5kKHQpfSx0LnByb3RvdHlwZS51bmJpbmQ9ZnVuY3Rpb24odCl7dHJ5e3RoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5LnJlbW92ZSh0KX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3Iocy5DQU5OT1RfVU5CSU5EK1wiIFwiK2cuZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyh0KSl9fSx0LnByb3RvdHlwZS51bmJpbmRBbGw9ZnVuY3Rpb24oKXt0aGlzLl9iaW5kaW5nRGljdGlvbmFyeT1uZXcgeS5Mb29rdXB9LHQucHJvdG90eXBlLmlzQm91bmQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuaGFzS2V5KHQpO3JldHVybiFlJiZ0aGlzLnBhcmVudCYmKGU9dGhpcy5wYXJlbnQuaXNCb3VuZCh0KSksZX0sdC5wcm90b3R5cGUuaXNCb3VuZE5hbWVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaXNCb3VuZFRhZ2dlZCh0LGMuTkFNRURfVEFHLGUpfSx0LnByb3RvdHlwZS5pc0JvdW5kVGFnZ2VkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0hMTtpZih0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5oYXNLZXkodCkpe3ZhciBpPXRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5LmdldCh0KSxvPWwuY3JlYXRlTW9ja1JlcXVlc3QodGhpcyx0LGUsbik7cj1pLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbnN0cmFpbnQobyl9KSl9cmV0dXJuIXImJnRoaXMucGFyZW50JiYocj10aGlzLnBhcmVudC5pc0JvdW5kVGFnZ2VkKHQsZSxuKSkscn0sdC5wcm90b3R5cGUuc25hcHNob3Q9ZnVuY3Rpb24oKXt0aGlzLl9zbmFwc2hvdHMucHVzaCh2LkNvbnRhaW5lclNuYXBzaG90Lm9mKHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5LmNsb25lKCksdGhpcy5fbWlkZGxld2FyZSkpfSx0LnByb3RvdHlwZS5yZXN0b3JlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc25hcHNob3RzLnBvcCgpO2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKHMuTk9fTU9SRV9TTkFQU0hPVFNfQVZBSUxBQkxFKTt0aGlzLl9iaW5kaW5nRGljdGlvbmFyeT10LmJpbmRpbmdzLHRoaXMuX21pZGRsZXdhcmU9dC5taWRkbGV3YXJlfSx0LnByb3RvdHlwZS5jcmVhdGVDaGlsZD1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdChlfHx0aGlzLm9wdGlvbnMpO3JldHVybiBuLnBhcmVudD10aGlzLG59LHQucHJvdG90eXBlLmFwcGx5TWlkZGxld2FyZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbj10aGlzLl9taWRkbGV3YXJlP3RoaXMuX21pZGRsZXdhcmU6dGhpcy5fcGxhbkFuZFJlc29sdmUoKTt0aGlzLl9taWRkbGV3YXJlPXQucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlKHQpfSksbil9LHQucHJvdG90eXBlLmFwcGx5Q3VzdG9tTWV0YWRhdGFSZWFkZXI9ZnVuY3Rpb24odCl7dGhpcy5fbWV0YWRhdGFSZWFkZXI9dH0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9nZXQoITEsITEsdS5UYXJnZXRUeXBlRW51bS5WYXJpYWJsZSx0KX0sdC5wcm90b3R5cGUuZ2V0VGFnZ2VkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5fZ2V0KCExLCExLHUuVGFyZ2V0VHlwZUVudW0uVmFyaWFibGUsdCxlLG4pfSx0LnByb3RvdHlwZS5nZXROYW1lZD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmdldFRhZ2dlZCh0LGMuTkFNRURfVEFHLGUpfSx0LnByb3RvdHlwZS5nZXRBbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dldCghMCwhMCx1LlRhcmdldFR5cGVFbnVtLlZhcmlhYmxlLHQpfSx0LnByb3RvdHlwZS5nZXRBbGxUYWdnZWQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLl9nZXQoITEsITAsdS5UYXJnZXRUeXBlRW51bS5WYXJpYWJsZSx0LGUsbil9LHQucHJvdG90eXBlLmdldEFsbE5hbWVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZ2V0QWxsVGFnZ2VkKHQsYy5OQU1FRF9UQUcsZSl9LHQucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jcmVhdGVDaGlsZCgpO3JldHVybiBlLmJpbmQodCkudG9TZWxmKCksZS5nZXQodCl9LHQucHJvdG90eXBlLl9nZXRDb250YWluZXJNb2R1bGVIZWxwZXJzRmFjdG9yeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1mdW5jdGlvbih0LGUpe3QuX2JpbmRpbmcubW9kdWxlSWQ9ZX0sbj1mdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9dC5yZWJpbmQuYmluZCh0KShyKTtyZXR1cm4gZShpLG4pLGl9fTtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJue2JpbmRGdW5jdGlvbjooaT1yLGZ1bmN0aW9uKG4pe3ZhciByPXQuYmluZC5iaW5kKHQpKG4pO3JldHVybiBlKHIsaSkscn0pLGlzYm91bmRGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4gdC5pc0JvdW5kLmJpbmQodCkoZSl9LHJlYmluZEZ1bmN0aW9uOm4ociksdW5iaW5kRnVuY3Rpb246ZnVuY3Rpb24oZSl7dC51bmJpbmQuYmluZCh0KShlKX19O3ZhciBpfX0sdC5wcm90b3R5cGUuX2dldD1mdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGE9bnVsbCx1PXthdm9pZENvbnN0cmFpbnRzOnQsY29udGV4dEludGVyY2VwdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxpc011bHRpSW5qZWN0OmUsa2V5Omksc2VydmljZUlkZW50aWZpZXI6cix0YXJnZXRUeXBlOm4sdmFsdWU6b307aWYodGhpcy5fbWlkZGxld2FyZSl7aWYobnVsbD09KGE9dGhpcy5fbWlkZGxld2FyZSh1KSkpdGhyb3cgbmV3IEVycm9yKHMuSU5WQUxJRF9NSURETEVXQVJFX1JFVFVSTil9ZWxzZSBhPXRoaXMuX3BsYW5BbmRSZXNvbHZlKCkodSk7cmV0dXJuIGF9LHQucHJvdG90eXBlLl9wbGFuQW5kUmVzb2x2ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPWwucGxhbih0Ll9tZXRhZGF0YVJlYWRlcix0LGUuaXNNdWx0aUluamVjdCxlLnRhcmdldFR5cGUsZS5zZXJ2aWNlSWRlbnRpZmllcixlLmtleSxlLnZhbHVlLGUuYXZvaWRDb25zdHJhaW50cyk7cmV0dXJuIG49ZS5jb250ZXh0SW50ZXJjZXB0b3IobiksaC5yZXNvbHZlKG4pfX0sdH0oKTtlLkNvbnRhaW5lcj1tfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5CaW5kaW5nPXZvaWQgMDt2YXIgcj1uKDU2KSxpPW4oNjgpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5pZD1pLmlkKCksdGhpcy5hY3RpdmF0ZWQ9ITEsdGhpcy5zZXJ2aWNlSWRlbnRpZmllcj10LHRoaXMuc2NvcGU9ZSx0aGlzLnR5cGU9ci5CaW5kaW5nVHlwZUVudW0uSW52YWxpZCx0aGlzLmNvbnN0cmFpbnQ9ZnVuY3Rpb24odCl7cmV0dXJuITB9LHRoaXMuaW1wbGVtZW50YXRpb25UeXBlPW51bGwsdGhpcy5jYWNoZT1udWxsLHRoaXMuZmFjdG9yeT1udWxsLHRoaXMucHJvdmlkZXI9bnVsbCx0aGlzLm9uQWN0aXZhdGlvbj1udWxsLHRoaXMuZHluYW1pY1ZhbHVlPW51bGx9cmV0dXJuIHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQodGhpcy5zZXJ2aWNlSWRlbnRpZmllcix0aGlzLnNjb3BlKTtyZXR1cm4gZS5hY3RpdmF0ZWQ9ITEsZS5pbXBsZW1lbnRhdGlvblR5cGU9dGhpcy5pbXBsZW1lbnRhdGlvblR5cGUsZS5keW5hbWljVmFsdWU9dGhpcy5keW5hbWljVmFsdWUsZS5zY29wZT10aGlzLnNjb3BlLGUudHlwZT10aGlzLnR5cGUsZS5mYWN0b3J5PXRoaXMuZmFjdG9yeSxlLnByb3ZpZGVyPXRoaXMucHJvdmlkZXIsZS5jb25zdHJhaW50PXRoaXMuY29uc3RyYWludCxlLm9uQWN0aXZhdGlvbj10aGlzLm9uQWN0aXZhdGlvbixlLmNhY2hlPXRoaXMuY2FjaGUsZX0sdH0oKTtlLkJpbmRpbmc9b30sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuZ2V0QmluZGluZ0RpY3Rpb25hcnk9ZS5jcmVhdGVNb2NrUmVxdWVzdD1lLnBsYW49dm9pZCAwO3ZhciByPW4oNDY5KSxpPW4oNDEpLG89big1NiksYT1uKDMxKSxzPW4oMjM2KSx1PW4oOTApLGM9big0NzApLGY9big0NyksbD1uKDQ3MSksaD1uKDQ3MiksZD1uKDQ3NCkscD1uKDIzOCk7ZnVuY3Rpb24gZyh0KXtyZXR1cm4gdC5fYmluZGluZ0RpY3Rpb25hcnl9ZnVuY3Rpb24gdih0LGUsbixvLGEpe3ZhciBzPXkobi5jb250YWluZXIsYS5zZXJ2aWNlSWRlbnRpZmllciksYz1bXTtyZXR1cm4gcy5sZW5ndGg9PT1yLkJpbmRpbmdDb3VudC5Ob0JpbmRpbmdzQXZhaWxhYmxlJiZuLmNvbnRhaW5lci5vcHRpb25zLmF1dG9CaW5kSW5qZWN0YWJsZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5zZXJ2aWNlSWRlbnRpZmllciYmdC5nZXRDb25zdHJ1Y3Rvck1ldGFkYXRhKGEuc2VydmljZUlkZW50aWZpZXIpLmNvbXBpbGVyR2VuZXJhdGVkTWV0YWRhdGEmJihuLmNvbnRhaW5lci5iaW5kKGEuc2VydmljZUlkZW50aWZpZXIpLnRvU2VsZigpLHM9eShuLmNvbnRhaW5lcixhLnNlcnZpY2VJZGVudGlmaWVyKSksYz1lP3M6cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBkLlJlcXVlc3QodC5zZXJ2aWNlSWRlbnRpZmllcixuLG8sdCxhKTtyZXR1cm4gdC5jb25zdHJhaW50KGUpfSkpLGZ1bmN0aW9uKHQsZSxuLG8pe3N3aXRjaChlLmxlbmd0aCl7Y2FzZSByLkJpbmRpbmdDb3VudC5Ob0JpbmRpbmdzQXZhaWxhYmxlOmlmKG4uaXNPcHRpb25hbCgpKXJldHVybiBlO3ZhciBhPXUuZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyh0KSxzPWkuTk9UX1JFR0lTVEVSRUQ7dGhyb3cgcys9dS5saXN0TWV0YWRhdGFGb3JUYXJnZXQoYSxuKSxzKz11Lmxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllcihvLGEseSksbmV3IEVycm9yKHMpO2Nhc2Ugci5CaW5kaW5nQ291bnQuT25seU9uZUJpbmRpbmdBdmFpbGFibGU6aWYoIW4uaXNBcnJheSgpKXJldHVybiBlO2Nhc2Ugci5CaW5kaW5nQ291bnQuTXVsdGlwbGVCaW5kaW5nc0F2YWlsYWJsZTpkZWZhdWx0OmlmKG4uaXNBcnJheSgpKXJldHVybiBlO2E9dS5nZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nKHQpLHM9aS5BTUJJR1VPVVNfTUFUQ0grXCIgXCIrYTt0aHJvdyBzKz11Lmxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllcihvLGEseSksbmV3IEVycm9yKHMpfX0oYS5zZXJ2aWNlSWRlbnRpZmllcixjLGEsbi5jb250YWluZXIpLGN9ZnVuY3Rpb24geSh0LGUpe3ZhciBuPVtdLHI9Zyh0KTtyZXR1cm4gci5oYXNLZXkoZSk/bj1yLmdldChlKTpudWxsIT09dC5wYXJlbnQmJihuPXkodC5wYXJlbnQsZSkpLG59ZS5nZXRCaW5kaW5nRGljdGlvbmFyeT1nLGUucGxhbj1mdW5jdGlvbih0LGUsbixyLGcseSxtLGIpe3ZvaWQgMD09PWImJihiPSExKTt2YXIgeD1uZXcgYy5Db250ZXh0KGUpLHc9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBzPXQ/YS5NVUxUSV9JTkpFQ1RfVEFHOmEuSU5KRUNUX1RBRyx1PW5ldyBmLk1ldGFkYXRhKHMsbiksYz1uZXcgcC5UYXJnZXQoZSxyLG4sdSk7aWYodm9pZCAwIT09aSl7dmFyIGw9bmV3IGYuTWV0YWRhdGEoaSxvKTtjLm1ldGFkYXRhLnB1c2gobCl9cmV0dXJuIGN9KG4scixnLFwiXCIseSxtKTt0cnl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLHIsYSxzLHUpe3ZhciBjLGY7aWYobnVsbD09PXMpe2M9dihlLG4sYSxudWxsLHUpLGY9bmV3IGQuUmVxdWVzdChyLGEsbnVsbCxjLHUpO3ZhciBwPW5ldyBsLlBsYW4oYSxmKTthLmFkZFBsYW4ocCl9ZWxzZSBjPXYoZSxuLGEscyx1KSxmPXMuYWRkQ2hpbGRSZXF1ZXN0KHUuc2VydmljZUlkZW50aWZpZXIsYyx1KTtjLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPW51bGw7aWYodS5pc0FycmF5KCkpcj1mLmFkZENoaWxkUmVxdWVzdChuLnNlcnZpY2VJZGVudGlmaWVyLG4sdSk7ZWxzZXtpZihuLmNhY2hlKXJldHVybjtyPWZ9aWYobi50eXBlPT09by5CaW5kaW5nVHlwZUVudW0uSW5zdGFuY2UmJm51bGwhPT1uLmltcGxlbWVudGF0aW9uVHlwZSl7dmFyIHM9aC5nZXREZXBlbmRlbmNpZXMoZSxuLmltcGxlbWVudGF0aW9uVHlwZSk7aWYoIWEuY29udGFpbmVyLm9wdGlvbnMuc2tpcEJhc2VDbGFzc0NoZWNrcyl7dmFyIGM9aC5nZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQoZSxuLmltcGxlbWVudGF0aW9uVHlwZSk7aWYocy5sZW5ndGg8Yyl7dmFyIGw9aS5BUkdVTUVOVFNfTEVOR1RIX01JU01BVENIKGguZ2V0RnVuY3Rpb25OYW1lKG4uaW1wbGVtZW50YXRpb25UeXBlKSk7dGhyb3cgbmV3IEVycm9yKGwpfX1zLmZvckVhY2goKGZ1bmN0aW9uKG4pe3QoZSwhMSxuLnNlcnZpY2VJZGVudGlmaWVyLGEscixuKX0pKX19KSl9KHQsYixnLHgsbnVsbCx3KSx4fWNhdGNoKHQpe3Rocm93IHMuaXNTdGFja092ZXJmbG93RXhlcHRpb24odCkmJngucGxhbiYmdS5jaXJjdWxhckRlcGVuZGVuY3lUb0V4Y2VwdGlvbih4LnBsYW4ucm9vdFJlcXVlc3QpLHR9fSxlLmNyZWF0ZU1vY2tSZXF1ZXN0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW5ldyBwLlRhcmdldChvLlRhcmdldFR5cGVFbnVtLlZhcmlhYmxlLFwiXCIsZSxuZXcgZi5NZXRhZGF0YShuLHIpKSxhPW5ldyBjLkNvbnRleHQodCk7cmV0dXJuIG5ldyBkLlJlcXVlc3QoZSxhLG51bGwsW10saSl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5CaW5kaW5nQ291bnQ9dm9pZCAwO2UuQmluZGluZ0NvdW50PXtNdWx0aXBsZUJpbmRpbmdzQXZhaWxhYmxlOjIsTm9CaW5kaW5nc0F2YWlsYWJsZTowLE9ubHlPbmVCaW5kaW5nQXZhaWxhYmxlOjF9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5Db250ZXh0PXZvaWQgMDt2YXIgcj1uKDY4KSxpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmlkPXIuaWQoKSx0aGlzLmNvbnRhaW5lcj10fXJldHVybiB0LnByb3RvdHlwZS5hZGRQbGFuPWZ1bmN0aW9uKHQpe3RoaXMucGxhbj10fSx0LnByb3RvdHlwZS5zZXRDdXJyZW50UmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLmN1cnJlbnRSZXF1ZXN0PXR9LHR9KCk7ZS5Db250ZXh0PWl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLlBsYW49dm9pZCAwO3ZhciByPWZ1bmN0aW9uKHQsZSl7dGhpcy5wYXJlbnRDb250ZXh0PXQsdGhpcy5yb290UmVxdWVzdD1lfTtlLlBsYW49cn0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPXRoaXMmJnRoaXMuX19zcHJlYWRBcnJheXN8fGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wLG49YXJndW1lbnRzLmxlbmd0aDtlPG47ZSsrKXQrPWFyZ3VtZW50c1tlXS5sZW5ndGg7dmFyIHI9QXJyYXkodCksaT0wO2ZvcihlPTA7ZTxuO2UrKylmb3IodmFyIG89YXJndW1lbnRzW2VdLGE9MCxzPW8ubGVuZ3RoO2E8czthKyssaSsrKXJbaV09b1thXTtyZXR1cm4gcn07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5nZXRGdW5jdGlvbk5hbWU9ZS5nZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQ9ZS5nZXREZXBlbmRlbmNpZXM9dm9pZCAwO3ZhciBpPW4oMjM3KSxvPW4oNDEpLGE9big1Nikscz1uKDMxKSx1PW4oOTApO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZ2V0RnVuY3Rpb25OYW1lXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUuZ2V0RnVuY3Rpb25OYW1lfX0pO3ZhciBjPW4oMjM4KTtmdW5jdGlvbiBmKHQsZSxuLGkpe3ZhciBzPXQuZ2V0Q29uc3RydWN0b3JNZXRhZGF0YShuKSx1PXMuY29tcGlsZXJHZW5lcmF0ZWRNZXRhZGF0YTtpZih2b2lkIDA9PT11KXt2YXIgZj1vLk1JU1NJTkdfSU5KRUNUQUJMRV9BTk5PVEFUSU9OK1wiIFwiK2UrXCIuXCI7dGhyb3cgbmV3IEVycm9yKGYpfXZhciBkPXMudXNlckdlbmVyYXRlZE1ldGFkYXRhLHA9T2JqZWN0LmtleXMoZCksZz1mdW5jdGlvbih0LGUsbixyLGkpe2Zvcih2YXIgbz1bXSxhPTA7YTxpO2ErKyl7dmFyIHM9bChhLHQsZSxuLHIpO251bGwhPT1zJiZvLnB1c2gocyl9cmV0dXJuIG99KGksZSx1LGQsMD09PW4ubGVuZ3RoJiZwLmxlbmd0aD4wP3AubGVuZ3RoOm4ubGVuZ3RoKSx2PWZ1bmN0aW9uIHQoZSxuKXtmb3IodmFyIGk9ZS5nZXRQcm9wZXJ0aWVzTWV0YWRhdGEobiksbz1bXSxzPU9iamVjdC5rZXlzKGkpLHU9MCxmPXM7dTxmLmxlbmd0aDt1Kyspe3ZhciBsPWZbdV0sZD1pW2xdLHA9aChpW2xdKSxnPXAudGFyZ2V0TmFtZXx8bCx2PXAuaW5qZWN0fHxwLm11bHRpSW5qZWN0LHk9bmV3IGMuVGFyZ2V0KGEuVGFyZ2V0VHlwZUVudW0uQ2xhc3NQcm9wZXJ0eSxnLHYpO3kubWV0YWRhdGE9ZCxvLnB1c2goeSl9dmFyIG09T2JqZWN0LmdldFByb3RvdHlwZU9mKG4ucHJvdG90eXBlKS5jb25zdHJ1Y3RvcjtpZihtIT09T2JqZWN0KXt2YXIgYj10KGUsbSk7bz1yKG8sYil9cmV0dXJuIG99KHQsbik7cmV0dXJuIHIoZyx2KX1mdW5jdGlvbiBsKHQsZSxuLHIscyl7dmFyIHU9c1t0LnRvU3RyaW5nKCldfHxbXSxmPWgodSksbD0hMCE9PWYudW5tYW5hZ2VkLGQ9clt0XSxwPWYuaW5qZWN0fHxmLm11bHRpSW5qZWN0O2lmKChkPXB8fGQpaW5zdGFuY2VvZiBpLkxhenlTZXJ2aWNlSWRlbnRpZmVyJiYoZD1kLnVud3JhcCgpKSxsKXtpZighZSYmKGQ9PT1PYmplY3R8fGQ9PT1GdW5jdGlvbnx8dm9pZCAwPT09ZCkpe3ZhciBnPW8uTUlTU0lOR19JTkpFQ1RfQU5OT1RBVElPTitcIiBhcmd1bWVudCBcIit0K1wiIGluIGNsYXNzIFwiK24rXCIuXCI7dGhyb3cgbmV3IEVycm9yKGcpfXZhciB2PW5ldyBjLlRhcmdldChhLlRhcmdldFR5cGVFbnVtLkNvbnN0cnVjdG9yQXJndW1lbnQsZi50YXJnZXROYW1lLGQpO3JldHVybiB2Lm1ldGFkYXRhPXUsdn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBoKHQpe3ZhciBlPXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdC5rZXkudG9TdHJpbmcoKV09dC52YWx1ZX0pKSx7aW5qZWN0OmVbcy5JTkpFQ1RfVEFHXSxtdWx0aUluamVjdDplW3MuTVVMVElfSU5KRUNUX1RBR10sdGFyZ2V0TmFtZTplW3MuTkFNRV9UQUddLHVubWFuYWdlZDplW3MuVU5NQU5BR0VEX1RBR119fWUuZ2V0RGVwZW5kZW5jaWVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGYodCx1LmdldEZ1bmN0aW9uTmFtZShlKSxlLCExKX0sZS5nZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQ9ZnVuY3Rpb24gdChlLG4pe3ZhciByPU9iamVjdC5nZXRQcm90b3R5cGVPZihuLnByb3RvdHlwZSkuY29uc3RydWN0b3I7aWYociE9PU9iamVjdCl7dmFyIGk9ZihlLHUuZ2V0RnVuY3Rpb25OYW1lKHIpLHIsITApLG89aS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1ldGFkYXRhLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5PT09cy5VTk1BTkFHRURfVEFHfSkpfSkpLGE9W10uY29uY2F0LmFwcGx5KFtdLG8pLmxlbmd0aCxjPWkubGVuZ3RoLWE7cmV0dXJuIGM+MD9jOnQoZSxyKX1yZXR1cm4gMH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLlF1ZXJ5YWJsZVN0cmluZz12b2lkIDA7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuc3RyPXR9cmV0dXJuIHQucHJvdG90eXBlLnN0YXJ0c1dpdGg9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLnN0ci5pbmRleE9mKHQpfSx0LnByb3RvdHlwZS5lbmRzV2l0aD1mdW5jdGlvbih0KXt2YXIgZSxuPXQuc3BsaXQoXCJcIikucmV2ZXJzZSgpLmpvaW4oXCJcIik7cmV0dXJuIGU9dGhpcy5zdHIuc3BsaXQoXCJcIikucmV2ZXJzZSgpLmpvaW4oXCJcIiksdGhpcy5zdGFydHNXaXRoLmNhbGwoe3N0cjplfSxuKX0sdC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCl7cmV0dXJuLTEhPT10aGlzLnN0ci5pbmRleE9mKHQpfSx0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3RyPT09dH0sdC5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJ9LHR9KCk7ZS5RdWVyeWFibGVTdHJpbmc9cn0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuUmVxdWVzdD12b2lkIDA7dmFyIHI9big2OCksaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4saSxvKXt0aGlzLmlkPXIuaWQoKSx0aGlzLnNlcnZpY2VJZGVudGlmaWVyPXQsdGhpcy5wYXJlbnRDb250ZXh0PWUsdGhpcy5wYXJlbnRSZXF1ZXN0PW4sdGhpcy50YXJnZXQ9byx0aGlzLmNoaWxkUmVxdWVzdHM9W10sdGhpcy5iaW5kaW5ncz1BcnJheS5pc0FycmF5KGkpP2k6W2ldLHRoaXMucmVxdWVzdFNjb3BlPW51bGw9PT1uP25ldyBNYXA6bnVsbH1yZXR1cm4gdC5wcm90b3R5cGUuYWRkQ2hpbGRSZXF1ZXN0PWZ1bmN0aW9uKGUsbixyKXt2YXIgaT1uZXcgdChlLHRoaXMucGFyZW50Q29udGV4dCx0aGlzLG4scik7cmV0dXJuIHRoaXMuY2hpbGRSZXF1ZXN0cy5wdXNoKGkpLGl9LHR9KCk7ZS5SZXF1ZXN0PWl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLnJlc29sdmU9dm9pZCAwO3ZhciByPW4oNDEpLGk9big1Niksbz1uKDIzNiksYT1uKDkwKSxzPW4oNDc2KSx1PWZ1bmN0aW9uKHQsZSxuKXt0cnl7cmV0dXJuIG4oKX1jYXRjaChuKXt0aHJvdyBvLmlzU3RhY2tPdmVyZmxvd0V4ZXB0aW9uKG4pP25ldyBFcnJvcihyLkNJUkNVTEFSX0RFUEVOREVOQ1lfSU5fRkFDVE9SWSh0LGUudG9TdHJpbmcoKSkpOm59fTtlLnJlc29sdmU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe24ucGFyZW50Q29udGV4dC5zZXRDdXJyZW50UmVxdWVzdChuKTt2YXIgbz1uLmJpbmRpbmdzLGM9bi5jaGlsZFJlcXVlc3RzLGY9bi50YXJnZXQmJm4udGFyZ2V0LmlzQXJyYXkoKSxsPSEobi5wYXJlbnRSZXF1ZXN0JiZuLnBhcmVudFJlcXVlc3QudGFyZ2V0JiZuLnRhcmdldCYmbi5wYXJlbnRSZXF1ZXN0LnRhcmdldC5tYXRjaGVzQXJyYXkobi50YXJnZXQuc2VydmljZUlkZW50aWZpZXIpKTtpZihmJiZsKXJldHVybiBjLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIHQoZSkobil9KSk7dmFyIGg9bnVsbDtpZighbi50YXJnZXQuaXNPcHRpb25hbCgpfHwwIT09by5sZW5ndGgpe3ZhciBkPW9bMF0scD1kLnNjb3BlPT09aS5CaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbixnPWQuc2NvcGU9PT1pLkJpbmRpbmdTY29wZUVudW0uUmVxdWVzdDtpZihwJiZkLmFjdGl2YXRlZClyZXR1cm4gZC5jYWNoZTtpZihnJiZudWxsIT09ZSYmZS5oYXMoZC5pZCkpcmV0dXJuIGUuZ2V0KGQuaWQpO2lmKGQudHlwZT09PWkuQmluZGluZ1R5cGVFbnVtLkNvbnN0YW50VmFsdWUpaD1kLmNhY2hlO2Vsc2UgaWYoZC50eXBlPT09aS5CaW5kaW5nVHlwZUVudW0uRnVuY3Rpb24paD1kLmNhY2hlO2Vsc2UgaWYoZC50eXBlPT09aS5CaW5kaW5nVHlwZUVudW0uQ29uc3RydWN0b3IpaD1kLmltcGxlbWVudGF0aW9uVHlwZTtlbHNlIGlmKGQudHlwZT09PWkuQmluZGluZ1R5cGVFbnVtLkR5bmFtaWNWYWx1ZSYmbnVsbCE9PWQuZHluYW1pY1ZhbHVlKWg9dShcInRvRHluYW1pY1ZhbHVlXCIsZC5zZXJ2aWNlSWRlbnRpZmllciwoZnVuY3Rpb24oKXtyZXR1cm4gZC5keW5hbWljVmFsdWUobi5wYXJlbnRDb250ZXh0KX0pKTtlbHNlIGlmKGQudHlwZT09PWkuQmluZGluZ1R5cGVFbnVtLkZhY3RvcnkmJm51bGwhPT1kLmZhY3RvcnkpaD11KFwidG9GYWN0b3J5XCIsZC5zZXJ2aWNlSWRlbnRpZmllciwoZnVuY3Rpb24oKXtyZXR1cm4gZC5mYWN0b3J5KG4ucGFyZW50Q29udGV4dCl9KSk7ZWxzZSBpZihkLnR5cGU9PT1pLkJpbmRpbmdUeXBlRW51bS5Qcm92aWRlciYmbnVsbCE9PWQucHJvdmlkZXIpaD11KFwidG9Qcm92aWRlclwiLGQuc2VydmljZUlkZW50aWZpZXIsKGZ1bmN0aW9uKCl7cmV0dXJuIGQucHJvdmlkZXIobi5wYXJlbnRDb250ZXh0KX0pKTtlbHNle2lmKGQudHlwZSE9PWkuQmluZGluZ1R5cGVFbnVtLkluc3RhbmNlfHxudWxsPT09ZC5pbXBsZW1lbnRhdGlvblR5cGUpe3ZhciB2PWEuZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhuLnNlcnZpY2VJZGVudGlmaWVyKTt0aHJvdyBuZXcgRXJyb3Ioci5JTlZBTElEX0JJTkRJTkdfVFlQRStcIiBcIit2KX1oPXMucmVzb2x2ZUluc3RhbmNlKGQuaW1wbGVtZW50YXRpb25UeXBlLGMsdChlKSl9cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZC5vbkFjdGl2YXRpb24mJihoPWQub25BY3RpdmF0aW9uKG4ucGFyZW50Q29udGV4dCxoKSkscCYmKGQuY2FjaGU9aCxkLmFjdGl2YXRlZD0hMCksZyYmbnVsbCE9PWUmJiFlLmhhcyhkLmlkKSYmZS5zZXQoZC5pZCxoKSxofX19KHQucGxhbi5yb290UmVxdWVzdC5yZXF1ZXN0U2NvcGUpKHQucGxhbi5yb290UmVxdWVzdCl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9dGhpcyYmdGhpcy5fX3NwcmVhZEFycmF5c3x8ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoO2U8bjtlKyspdCs9YXJndW1lbnRzW2VdLmxlbmd0aDt2YXIgcj1BcnJheSh0KSxpPTA7Zm9yKGU9MDtlPG47ZSsrKWZvcih2YXIgbz1hcmd1bWVudHNbZV0sYT0wLHM9by5sZW5ndGg7YTxzO2ErKyxpKyspcltpXT1vW2FdO3JldHVybiByfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLnJlc29sdmVJbnN0YW5jZT12b2lkIDA7dmFyIGk9big0MSksbz1uKDU2KSxhPW4oMzEpO2UucmVzb2x2ZUluc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcyx1LGM9bnVsbDtpZihlLmxlbmd0aD4wKXt2YXIgZj1lLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10LnRhcmdldCYmdC50YXJnZXQudHlwZT09PW8uVGFyZ2V0VHlwZUVudW0uQ29uc3RydWN0b3JBcmd1bWVudH0pKS5tYXAobik7dT1mLGM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQudGFyZ2V0JiZ0LnRhcmdldC50eXBlPT09by5UYXJnZXRUeXBlRW51bS5DbGFzc1Byb3BlcnR5fSkpLGk9ci5tYXAobik7cmV0dXJuIHIuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt2YXIgcjtyPWUudGFyZ2V0Lm5hbWUudmFsdWUoKTt2YXIgbz1pW25dO3Rbcl09b30pKSx0fShjPW5ldygocz10KS5iaW5kLmFwcGx5KHMscihbdm9pZCAwXSx1KSkpLGUsbil9ZWxzZSBjPW5ldyB0O3JldHVybiBmdW5jdGlvbih0LGUpe2lmKFJlZmxlY3QuaGFzTWV0YWRhdGEoYS5QT1NUX0NPTlNUUlVDVCx0KSl7dmFyIG49UmVmbGVjdC5nZXRNZXRhZGF0YShhLlBPU1RfQ09OU1RSVUNULHQpO3RyeXtlW24udmFsdWVdKCl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKGkuUE9TVF9DT05TVFJVQ1RfRVJST1IodC5uYW1lLGUubWVzc2FnZSkpfX19KHQsYyksY319LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLkJpbmRpbmdUb1N5bnRheD12b2lkIDA7dmFyIHI9big0MSksaT1uKDU2KSxvPW4oNDc4KSxhPW4oMjM5KSxzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9iaW5kaW5nPXR9cmV0dXJuIHQucHJvdG90eXBlLnRvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9iaW5kaW5nLnR5cGU9aS5CaW5kaW5nVHlwZUVudW0uSW5zdGFuY2UsdGhpcy5fYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGU9dCxuZXcgby5CaW5kaW5nSW5XaGVuT25TeW50YXgodGhpcy5fYmluZGluZyl9LHQucHJvdG90eXBlLnRvU2VsZj1mdW5jdGlvbigpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHRoaXMuX2JpbmRpbmcuc2VydmljZUlkZW50aWZpZXIpdGhyb3cgbmV3IEVycm9yKFwiXCIrci5JTlZBTElEX1RPX1NFTEZfVkFMVUUpO3ZhciB0PXRoaXMuX2JpbmRpbmcuc2VydmljZUlkZW50aWZpZXI7cmV0dXJuIHRoaXMudG8odCl9LHQucHJvdG90eXBlLnRvQ29uc3RhbnRWYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZy50eXBlPWkuQmluZGluZ1R5cGVFbnVtLkNvbnN0YW50VmFsdWUsdGhpcy5fYmluZGluZy5jYWNoZT10LHRoaXMuX2JpbmRpbmcuZHluYW1pY1ZhbHVlPW51bGwsdGhpcy5fYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGU9bnVsbCxuZXcgYS5CaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS50b0R5bmFtaWNWYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZy50eXBlPWkuQmluZGluZ1R5cGVFbnVtLkR5bmFtaWNWYWx1ZSx0aGlzLl9iaW5kaW5nLmNhY2hlPW51bGwsdGhpcy5fYmluZGluZy5keW5hbWljVmFsdWU9dCx0aGlzLl9iaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZT1udWxsLG5ldyBvLkJpbmRpbmdJbldoZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKX0sdC5wcm90b3R5cGUudG9Db25zdHJ1Y3Rvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZy50eXBlPWkuQmluZGluZ1R5cGVFbnVtLkNvbnN0cnVjdG9yLHRoaXMuX2JpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlPXQsbmV3IGEuQmluZGluZ1doZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKX0sdC5wcm90b3R5cGUudG9GYWN0b3J5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9iaW5kaW5nLnR5cGU9aS5CaW5kaW5nVHlwZUVudW0uRmFjdG9yeSx0aGlzLl9iaW5kaW5nLmZhY3Rvcnk9dCxuZXcgYS5CaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS50b0Z1bmN0aW9uPWZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKHIuSU5WQUxJRF9GVU5DVElPTl9CSU5ESU5HKTt2YXIgZT10aGlzLnRvQ29uc3RhbnRWYWx1ZSh0KTtyZXR1cm4gdGhpcy5fYmluZGluZy50eXBlPWkuQmluZGluZ1R5cGVFbnVtLkZ1bmN0aW9uLGV9LHQucHJvdG90eXBlLnRvQXV0b0ZhY3Rvcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmcudHlwZT1pLkJpbmRpbmdUeXBlRW51bS5GYWN0b3J5LHRoaXMuX2JpbmRpbmcuZmFjdG9yeT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5jb250YWluZXIuZ2V0KHQpfX0sbmV3IGEuQmluZGluZ1doZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKX0sdC5wcm90b3R5cGUudG9Qcm92aWRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZy50eXBlPWkuQmluZGluZ1R5cGVFbnVtLlByb3ZpZGVyLHRoaXMuX2JpbmRpbmcucHJvdmlkZXI9dCxuZXcgYS5CaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS50b1NlcnZpY2U9ZnVuY3Rpb24odCl7dGhpcy50b0R5bmFtaWNWYWx1ZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFpbmVyLmdldCh0KX0pKX0sdH0oKTtlLkJpbmRpbmdUb1N5bnRheD1zfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5CaW5kaW5nSW5XaGVuT25TeW50YXg9dm9pZCAwO3ZhciByPW4oNDc5KSxpPW4oMTU5KSxvPW4oMTYwKSxhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9iaW5kaW5nPXQsdGhpcy5fYmluZGluZ1doZW5TeW50YXg9bmV3IG8uQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyksdGhpcy5fYmluZGluZ09uU3ludGF4PW5ldyBpLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKSx0aGlzLl9iaW5kaW5nSW5TeW50YXg9bmV3IHIuQmluZGluZ0luU3ludGF4KHQpfXJldHVybiB0LnByb3RvdHlwZS5pblJlcXVlc3RTY29wZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iaW5kaW5nSW5TeW50YXguaW5SZXF1ZXN0U2NvcGUoKX0sdC5wcm90b3R5cGUuaW5TaW5nbGV0b25TY29wZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iaW5kaW5nSW5TeW50YXguaW5TaW5nbGV0b25TY29wZSgpfSx0LnByb3RvdHlwZS5pblRyYW5zaWVudFNjb3BlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdJblN5bnRheC5pblRyYW5zaWVudFNjb3BlKCl9LHQucHJvdG90eXBlLndoZW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW4odCl9LHQucHJvdG90eXBlLndoZW5UYXJnZXROYW1lZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblRhcmdldE5hbWVkKHQpfSx0LnByb3RvdHlwZS53aGVuVGFyZ2V0SXNEZWZhdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5UYXJnZXRJc0RlZmF1bHQoKX0sdC5wcm90b3R5cGUud2hlblRhcmdldFRhZ2dlZD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0VGFnZ2VkKHQsZSl9LHQucHJvdG90eXBlLndoZW5JbmplY3RlZEludG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5JbmplY3RlZEludG8odCl9LHQucHJvdG90eXBlLndoZW5QYXJlbnROYW1lZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblBhcmVudE5hbWVkKHQpfSx0LnByb3RvdHlwZS53aGVuUGFyZW50VGFnZ2VkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5QYXJlbnRUYWdnZWQodCxlKX0sdC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9ySXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3RvcklzKHQpfSx0LnByb3RvdHlwZS53aGVuTm9BbmNlc3RvcklzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3RvcklzKHQpfSx0LnByb3RvdHlwZS53aGVuQW55QW5jZXN0b3JOYW1lZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yTmFtZWQodCl9LHQucHJvdG90eXBlLndoZW5BbnlBbmNlc3RvclRhZ2dlZD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JUYWdnZWQodCxlKX0sdC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JOYW1lZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JOYW1lZCh0KX0sdC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JUYWdnZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JUYWdnZWQodCxlKX0sdC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yTWF0Y2hlcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yTWF0Y2hlcyh0KX0sdC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JNYXRjaGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3Rvck1hdGNoZXModCl9LHQucHJvdG90eXBlLm9uQWN0aXZhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmluZGluZ09uU3ludGF4Lm9uQWN0aXZhdGlvbih0KX0sdH0oKTtlLkJpbmRpbmdJbldoZW5PblN5bnRheD1hfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5CaW5kaW5nSW5TeW50YXg9dm9pZCAwO3ZhciByPW4oNTYpLGk9bigyMzkpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2JpbmRpbmc9dH1yZXR1cm4gdC5wcm90b3R5cGUuaW5SZXF1ZXN0U2NvcGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmluZGluZy5zY29wZT1yLkJpbmRpbmdTY29wZUVudW0uUmVxdWVzdCxuZXcgaS5CaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS5pblNpbmdsZXRvblNjb3BlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JpbmRpbmcuc2NvcGU9ci5CaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbixuZXcgaS5CaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0LnByb3RvdHlwZS5pblRyYW5zaWVudFNjb3BlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JpbmRpbmcuc2NvcGU9ci5CaW5kaW5nU2NvcGVFbnVtLlRyYW5zaWVudCxuZXcgaS5CaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpfSx0fSgpO2UuQmluZGluZ0luU3ludGF4PW99LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLkNvbnRhaW5lclNuYXBzaG90PXZvaWQgMDt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxuKXt2YXIgcj1uZXcgdDtyZXR1cm4gci5iaW5kaW5ncz1lLHIubWlkZGxld2FyZT1uLHJ9LHR9KCk7ZS5Db250YWluZXJTbmFwc2hvdD1yfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5Mb29rdXA9dm9pZCAwO3ZhciByPW4oNDEpLGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fbWFwPW5ldyBNYXB9cmV0dXJuIHQucHJvdG90eXBlLmdldE1hcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXB9LHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKHIuTlVMTF9BUkdVTUVOVCk7aWYobnVsbD09ZSl0aHJvdyBuZXcgRXJyb3Ioci5OVUxMX0FSR1VNRU5UKTt2YXIgbj10aGlzLl9tYXAuZ2V0KHQpO3ZvaWQgMCE9PW4/KG4ucHVzaChlKSx0aGlzLl9tYXAuc2V0KHQsbikpOnRoaXMuX21hcC5zZXQodCxbZV0pfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3Ioci5OVUxMX0FSR1VNRU5UKTt2YXIgZT10aGlzLl9tYXAuZ2V0KHQpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGU7dGhyb3cgbmV3IEVycm9yKHIuS0VZX05PVF9GT1VORCl9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcihyLk5VTExfQVJHVU1FTlQpO2lmKCF0aGlzLl9tYXAuZGVsZXRlKHQpKXRocm93IG5ldyBFcnJvcihyLktFWV9OT1RfRk9VTkQpfSx0LnByb3RvdHlwZS5yZW1vdmVCeUNvbmRpdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX21hcC5mb3JFYWNoKChmdW5jdGlvbihuLHIpe3ZhciBpPW4uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hdChlKX0pKTtpLmxlbmd0aD4wP2UuX21hcC5zZXQocixpKTplLl9tYXAuZGVsZXRlKHIpfSkpfSx0LnByb3RvdHlwZS5oYXNLZXk9ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3Ioci5OVUxMX0FSR1VNRU5UKTtyZXR1cm4gdGhpcy5fbWFwLmhhcyh0KX0sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgdDtyZXR1cm4gdGhpcy5fbWFwLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5hZGQobix0LmNsb25lKCkpfSkpfSkpLGV9LHQucHJvdG90eXBlLnRyYXZlcnNlPWZ1bmN0aW9uKHQpe3RoaXMuX21hcC5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3QobixlKX0pKX0sdH0oKTtlLkxvb2t1cD1pfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5Bc3luY0NvbnRhaW5lck1vZHVsZT1lLkNvbnRhaW5lck1vZHVsZT12b2lkIDA7dmFyIHI9big2OCksaT1mdW5jdGlvbih0KXt0aGlzLmlkPXIuaWQoKSx0aGlzLnJlZ2lzdHJ5PXR9O2UuQ29udGFpbmVyTW9kdWxlPWk7dmFyIG89ZnVuY3Rpb24odCl7dGhpcy5pZD1yLmlkKCksdGhpcy5yZWdpc3RyeT10fTtlLkFzeW5jQ29udGFpbmVyTW9kdWxlPW99LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLmluamVjdGFibGU9dm9pZCAwO3ZhciByPW4oNDEpLGk9bigzMSk7ZS5pbmplY3RhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoaS5QQVJBTV9UWVBFUyx0KSl0aHJvdyBuZXcgRXJyb3Ioci5EVVBMSUNBVEVEX0lOSkVDVEFCTEVfREVDT1JBVE9SKTt2YXIgZT1SZWZsZWN0LmdldE1ldGFkYXRhKGkuREVTSUdOX1BBUkFNX1RZUEVTLHQpfHxbXTtyZXR1cm4gUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShpLlBBUkFNX1RZUEVTLGUsdCksdH19fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS50YWdnZWQ9dm9pZCAwO3ZhciByPW4oNDcpLGk9big2MSk7ZS50YWdnZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obixvLGEpe3ZhciBzPW5ldyByLk1ldGFkYXRhKHQsZSk7XCJudW1iZXJcIj09dHlwZW9mIGE/aS50YWdQYXJhbWV0ZXIobixvLGEscyk6aS50YWdQcm9wZXJ0eShuLG8scyl9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUubmFtZWQ9dm9pZCAwO3ZhciByPW4oMzEpLGk9big0Nyksbz1uKDYxKTtlLm5hbWVkPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4sYSl7dmFyIHM9bmV3IGkuTWV0YWRhdGEoci5OQU1FRF9UQUcsdCk7XCJudW1iZXJcIj09dHlwZW9mIGE/by50YWdQYXJhbWV0ZXIoZSxuLGEscyk6by50YWdQcm9wZXJ0eShlLG4scyl9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUub3B0aW9uYWw9dm9pZCAwO3ZhciByPW4oMzEpLGk9big0Nyksbz1uKDYxKTtlLm9wdGlvbmFsPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1uZXcgaS5NZXRhZGF0YShyLk9QVElPTkFMX1RBRywhMCk7XCJudW1iZXJcIj09dHlwZW9mIG4/by50YWdQYXJhbWV0ZXIodCxlLG4sYSk6by50YWdQcm9wZXJ0eSh0LGUsYSl9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUudW5tYW5hZ2VkPXZvaWQgMDt2YXIgcj1uKDMxKSxpPW4oNDcpLG89big2MSk7ZS51bm1hbmFnZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3ZhciBhPW5ldyBpLk1ldGFkYXRhKHIuVU5NQU5BR0VEX1RBRywhMCk7by50YWdQYXJhbWV0ZXIodCxlLG4sYSl9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUubXVsdGlJbmplY3Q9dm9pZCAwO3ZhciByPW4oMzEpLGk9big0Nyksbz1uKDYxKTtlLm11bHRpSW5qZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4sYSl7dmFyIHM9bmV3IGkuTWV0YWRhdGEoci5NVUxUSV9JTkpFQ1RfVEFHLHQpO1wibnVtYmVyXCI9PXR5cGVvZiBhP28udGFnUGFyYW1ldGVyKGUsbixhLHMpOm8udGFnUHJvcGVydHkoZSxuLHMpfX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLnRhcmdldE5hbWU9dm9pZCAwO3ZhciByPW4oMzEpLGk9big0Nyksbz1uKDYxKTtlLnRhcmdldE5hbWU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixhKXt2YXIgcz1uZXcgaS5NZXRhZGF0YShyLk5BTUVfVEFHLHQpO28udGFnUGFyYW1ldGVyKGUsbixhLHMpfX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLnBvc3RDb25zdHJ1Y3Q9dm9pZCAwO3ZhciByPW4oNDEpLGk9bigzMSksbz1uKDQ3KTtlLnBvc3RDb25zdHJ1Y3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3ZhciBhPW5ldyBvLk1ldGFkYXRhKGkuUE9TVF9DT05TVFJVQ1QsZSk7aWYoUmVmbGVjdC5oYXNPd25NZXRhZGF0YShpLlBPU1RfQ09OU1RSVUNULHQuY29uc3RydWN0b3IpKXRocm93IG5ldyBFcnJvcihyLk1VTFRJUExFX1BPU1RfQ09OU1RSVUNUX01FVEhPRFMpO1JlZmxlY3QuZGVmaW5lTWV0YWRhdGEoaS5QT1NUX0NPTlNUUlVDVCxhLHQuY29uc3RydWN0b3IpfX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLm11bHRpQmluZFRvU2VydmljZT12b2lkIDAsZS5tdWx0aUJpbmRUb1NlcnZpY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgbj1bXSxyPTA7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyluW3JdPWFyZ3VtZW50c1tyXTtyZXR1cm4gbi5mb3JFYWNoKChmdW5jdGlvbihuKXtyZXR1cm4gdC5iaW5kKG4pLnRvU2VydmljZShlKX0pKX19fX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKGUscil7cmV0dXJuIHQuZXhwb3J0cz1uPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSxuKGUscil9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcj1TeW1ib2wuZm9yKFwiSU5KRUNUSU9OXCIpO2Z1bmN0aW9uIGkodCxlLG4saSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGkmJiFSZWZsZWN0Lmhhc01ldGFkYXRhKHIsdGhpcyxlKSYmUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShyLG4oKSx0aGlzLGUpLFJlZmxlY3QuaGFzTWV0YWRhdGEocix0aGlzLGUpP1JlZmxlY3QuZ2V0TWV0YWRhdGEocix0aGlzLGUpOm4oKX0sc2V0OmZ1bmN0aW9uKHQpe1JlZmxlY3QuZGVmaW5lTWV0YWRhdGEocix0LHRoaXMsZSl9fSl9ZS5tYWtlUHJvcGVydHlJbmplY3REZWNvcmF0b3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHIsbyl7aShyLG8sKGZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0KG4pfSksZSl9fX0sZS5tYWtlUHJvcGVydHlJbmplY3ROYW1lZERlY29yYXRvcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe3JldHVybiBmdW5jdGlvbihvLGEpe2kobyxhLChmdW5jdGlvbigpe3JldHVybiB0LmdldE5hbWVkKG4scil9KSxlKX19fSxlLm1ha2VQcm9wZXJ0eUluamVjdFRhZ2dlZERlY29yYXRvcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuLHIsbyl7cmV0dXJuIGZ1bmN0aW9uKGEscyl7aShhLHMsKGZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0VGFnZ2VkKG4scixvKX0pLGUpfX19LGUubWFrZVByb3BlcnR5TXVsdGlJbmplY3REZWNvcmF0b3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHIsbyl7aShyLG8sKGZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0QWxsKG4pfSksZSl9fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHIodCl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKXJldHVybiBBcnJheS5mcm9tKHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBGbG9hdDMyQXJyYXkoMik7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IEZsb2F0MzJBcnJheSgyKTtyZXR1cm4gblswXT10LG5bMV09ZSxufX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXRbMF0saT10WzFdLG89ZVswXSxhPWVbMV07cmV0dXJuIE1hdGguYWJzKG4tbyk8PXIqTWF0aC5tYXgoMSxNYXRoLmFicyhuKSxNYXRoLmFicyhvKSkmJk1hdGguYWJzKGktYSk8PXIqTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhhKSl9O3ZhciByPW4oMjUzKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2Nyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTcpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjU4KX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT0xL2VbMF0sdFsxXT0xL2VbMV0sdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFswXT1NYXRoLm1pbihlWzBdLG5bMF0pLHRbMV09TWF0aC5taW4oZVsxXSxuWzFdKSx0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0WzBdPU1hdGgubWF4KGVbMF0sblswXSksdFsxXT1NYXRoLm1heChlWzFdLG5bMV0pLHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIHI9TWF0aC5jb3MobiksaT1NYXRoLnNpbihuKSxvPWVbMF0sYT1lWzFdO3JldHVybiB0WzBdPW8qci1hKmksdFsxXT1vKmkrYSpyLHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPU1hdGguZmxvb3IoZVswXSksdFsxXT1NYXRoLmZsb29yKGVbMV0pLHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPU1hdGguY2VpbChlWzBdKSx0WzFdPU1hdGguY2VpbChlWzFdKSx0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1NYXRoLnJvdW5kKGVbMF0pLHRbMV09TWF0aC5yb3VuZChlWzFdKSx0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0WzBdPWVbMF0qbix0WzFdPWVbMV0qbix0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRbMF09ZVswXStuWzBdKnIsdFsxXT1lWzFdK25bMV0qcix0fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI1OSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjApfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjYxKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI2Mil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09LWVbMF0sdFsxXT0tZVsxXSx0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWVbMF0qblsxXS1lWzFdKm5bMF07cmV0dXJuIHRbMF09dFsxXT0wLHRbMl09cix0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZVswXSxvPWVbMV07cmV0dXJuIHRbMF09aStyKihuWzBdLWkpLHRbMV09bytyKihuWzFdLW8pLHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2U9ZXx8MTt2YXIgbj0yKk1hdGgucmFuZG9tKCkqTWF0aC5QSTtyZXR1cm4gdFswXT1NYXRoLmNvcyhuKSplLHRbMV09TWF0aC5zaW4obikqZSx0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWVbMF0saT1lWzFdO3JldHVybiB0WzBdPW5bMF0qcituWzJdKmksdFsxXT1uWzFdKnIrblszXSppLHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZVswXSxpPWVbMV07cmV0dXJuIHRbMF09blswXSpyK25bMl0qaStuWzRdLHRbMV09blsxXSpyK25bM10qaStuWzVdLHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZVswXSxpPWVbMV07cmV0dXJuIHRbMF09blswXSpyK25bM10qaStuWzZdLHRbMV09blsxXSpyK25bNF0qaStuWzddLHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZVswXSxpPWVbMV07cmV0dXJuIHRbMF09blswXSpyK25bNF0qaStuWzEyXSx0WzFdPW5bMV0qcituWzVdKmkrblsxM10sdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4saSxvLGEpe3ZhciBzLHU7ZXx8KGU9Mik7bnx8KG49MCk7dT1pP01hdGgubWluKGkqZStuLHQubGVuZ3RoKTp0Lmxlbmd0aDtmb3Iocz1uO3M8dTtzKz1lKXJbMF09dFtzXSxyWzFdPXRbcysxXSxvKHIscixhKSx0W3NdPXJbMF0sdFtzKzFdPXJbMV07cmV0dXJuIHR9O3ZhciByPW4oMjU0KSgpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZVswXSplWzBdK2VbMV0qZVsxXTtpZihyPm4qbil7dmFyIGk9TWF0aC5zcXJ0KHIpO3RbMF09ZVswXS9pKm4sdFsxXT1lWzFdL2kqbn1lbHNlIHRbMF09ZVswXSx0WzFdPWVbMV07cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpLG4uZChlLFwiRzZHcmFwaEV2ZW50XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHl0fSkpLG4uZChlLFwiRzZFdmVudFwiLChmdW5jdGlvbigpe3JldHVybiBZZX0pKSxuLmQoZSxcIk5vZGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gb2V9KSksbi5kKGUsXCJFZGdlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGllfSkpLG4uZChlLFwiQ29tYm9cIiwoZnVuY3Rpb24oKXtyZXR1cm4gYWV9KSksbi5kKGUsXCJIdWxsXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEllfSkpLG4uZChlLFwicmVnaXN0ZXJOb2RlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHRufSkpLG4uZChlLFwicmVnaXN0ZXJDb21ib1wiLChmdW5jdGlvbigpe3JldHVybiBubn0pKSxuLmQoZSxcIkFic3RyYWN0R3JhcGhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gamV9KSksbi5kKGUsXCJyZWdpc3RlckVkZ2VcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZW59KSksbi5kKGUsXCJyZWdpc3RlckJlaGF2aW9yXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJufSkpLG4uZChlLFwiQWJzdHJhY3RMYXlvdXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSmV9KSksbi5kKGUsXCJBYnN0cmFjdEV2ZW50XCIsKGZ1bmN0aW9uKCl7cmV0dXJuICRlfSkpLG4uZChlLFwiQmFzZUdsb2JhbFwiLChmdW5jdGlvbigpe3JldHVybiBvbn0pKSxuLmQoZSxcIkdyYXBoXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG5kfSkpLG4uZChlLFwiVHJlZUdyYXBoXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHZkfSkpLG4uZChlLFwiVXRpbFwiLChmdW5jdGlvbigpe3JldHVybiBkZH0pKSxuLmQoZSxcIkxheW91dFwiLChmdW5jdGlvbigpe3JldHVybiBOaH0pKSxuLmQoZSxcInJlZ2lzdGVyTGF5b3V0XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIExofSkpLG4uZChlLFwiR2xvYmFsXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIERufSkpLG4uZChlLFwiTWluaW1hcFwiLChmdW5jdGlvbigpe3JldHVybiBpeX0pKSxuLmQoZSxcIkdyaWRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gb3l9KSksbi5kKGUsXCJCdW5kbGluZ1wiLChmdW5jdGlvbigpe3JldHVybiBheX0pKSxuLmQoZSxcIk1lbnVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gc3l9KSksbi5kKGUsXCJGaXNoZXllXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHV5fSkpLG4uZChlLFwiQWxnb3JpdGhtXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSksbi5kKGUsXCJUb29sQmFyXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGN5fSkpLG4uZChlLFwiVG9vbHRpcFwiLChmdW5jdGlvbigpe3JldHVybiBmeX0pKSxuLmQoZSxcIlRpbWVCYXJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbHl9KSksbi5kKGUsXCJJbWFnZU1pbmltYXBcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaHl9KSksbi5kKGUsXCJFZGdlRmlsdGVyTGVuc1wiLChmdW5jdGlvbigpe3JldHVybiBkeX0pKSxuLmQoZSxcIkFycm93XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEhlfSkpLG4uZChlLFwiTWFya2VyXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHFlfSkpLG4uZChlLFwiU2hhcGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gS2V9KSksbi5kKGUsXCJ2ZXJzaW9uXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGd5fSkpO3ZhciByPXt9O24ucihyKSxuLmQocixcImNvbXBhcmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gd30pKSxuLmQocixcImdldExpbmVJbnRlcnNlY3RcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRX0pKSxuLmQocixcImdldFJlY3RJbnRlcnNlY3RCeVBvaW50XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIF99KSksbi5kKHIsXCJnZXRDaXJjbGVJbnRlcnNlY3RCeVBvaW50XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE99KSksbi5kKHIsXCJnZXRFbGxpcHNlSW50ZXJzZWN0QnlQb2ludFwiLChmdW5jdGlvbigpe3JldHVybiBrfSkpLG4uZChyLFwiYXBwbHlNYXRyaXhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTX0pKSxuLmQocixcImludmVydE1hdHJpeFwiLChmdW5jdGlvbigpe3JldHVybiBBfSkpLG4uZChyLFwiZ2V0Q2lyY2xlQ2VudGVyQnlQb2ludHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVH0pKSxuLmQocixcImRpc3RhbmNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEN9KSksbi5kKHIsXCJzY2FsZU1hdHJpeFwiLChmdW5jdGlvbigpe3JldHVybiBJfSkpLG4uZChyLFwiZmxveWRXYXJzaGFsbFwiLChmdW5jdGlvbigpe3JldHVybiBQfSkpLG4uZChyLFwiZ2V0QWRqTWF0cml4XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGp9KSksbi5kKHIsXCJ0cmFuc2xhdGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRH0pKSxuLmQocixcIm1vdmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTn0pKSxuLmQocixcInNjYWxlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSksbi5kKHIsXCJyb3RhdGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTH0pKSxuLmQocixcImdldERlZ3JlZVwiLChmdW5jdGlvbigpe3JldHVybiBCfSkpLG4uZChyLFwiaXNQb2ludEluUG9seWdvblwiLChmdW5jdGlvbigpe3JldHVybiBXfSkpLG4uZChyLFwiaW50ZXJzZWN0QkJveFwiLChmdW5jdGlvbigpe3JldHVybiBYfSkpLG4uZChyLFwiaXNQb2x5Z29uc0ludGVyc2VjdFwiLChmdW5jdGlvbigpe3JldHVybiBZfSkpLG4uZChyLFwiTGluZVwiLChmdW5jdGlvbigpe3JldHVybiBIfSkpLG4uZChyLFwiZ2V0QkJveEJvdW5kTGluZVwiLChmdW5jdGlvbigpe3JldHVybiBxfSkpLG4uZChyLFwiaXRlbUludGVyc2VjdEJ5TGluZVwiLChmdW5jdGlvbigpe3JldHVybiBafSkpLG4uZChyLFwiZnJhY3Rpb25Ub0xpbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUX0pKSxuLmQocixcImdldFBvaW50c0NlbnRlclwiLChmdW5jdGlvbigpe3JldHVybiBKfSkpLG4uZChyLFwic3F1YXJlRGlzdFwiLChmdW5jdGlvbigpe3JldHVybiAkfSkpLG4uZChyLFwicG9pbnRMaW5lU3F1YXJlRGlzdFwiLChmdW5jdGlvbigpe3JldHVybiB0dH0pKSxuLmQocixcImlzUG9pbnRzT3ZlcmxhcFwiLChmdW5jdGlvbigpe3JldHVybiBldH0pKSxuLmQocixcInBvaW50UmVjdFNxdWFyZURpc3RcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbnR9KSk7dmFyIGk9e307bi5yKGkpLG4uZChpLFwidW5pcXVlSWRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbXR9KSksbi5kKGksXCJmb3JtYXRQYWRkaW5nXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGJ0fSkpLG4uZChpLFwiY2xvbmVFdmVudFwiLChmdW5jdGlvbigpe3JldHVybiB4dH0pKSxuLmQoaSxcImlzVmlld3BvcnRDaGFuZ2VkXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHd0fSkpLG4uZChpLFwiaXNOYU5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gU3R9KSksbi5kKGksXCJjYWxjdWxhdGlvbkl0ZW1zQkJveFwiLChmdW5jdGlvbigpe3JldHVybiBFdH0pKSxuLmQoaSxcInByb2Nlc3NQYXJhbGxlbEVkZ2VzXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIF90fSkpO3ZhciBvPXt9O24ucihvKSxuLmQobyxcImdldEJCb3hcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUHR9KSksbi5kKG8sXCJnZXRMb29wQ2Znc1wiLChmdW5jdGlvbigpe3JldHVybiBqdH0pKSxuLmQobyxcImdldExhYmVsUG9zaXRpb25cIiwoZnVuY3Rpb24oKXtyZXR1cm4gRHR9KSksbi5kKG8sXCJ0cmF2ZXJzZVRyZWVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUnR9KSksbi5kKG8sXCJ0cmF2ZXJzZVRyZWVVcFwiLChmdW5jdGlvbigpe3JldHVybiBMdH0pKSxuLmQobyxcImdldExldHRlcldpZHRoXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEJ0fSkpLG4uZChvLFwiZ2V0VGV4dFNpemVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gR3R9KSksbi5kKG8sXCJwbGFpbkNvbWJvc1RvVHJlZXNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRnR9KSksbi5kKG8sXCJyZWNvbnN0cnVjdFRyZWVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gVXR9KSksbi5kKG8sXCJnZXRDb21ib0JCb3hcIiwoZnVuY3Rpb24oKXtyZXR1cm4genR9KSksbi5kKG8sXCJzaG91bGRSZWZyZXNoRWRnZVwiLChmdW5jdGlvbigpe3JldHVybiBWdH0pKSxuLmQobyxcImNsb25lQmVzaWRlc0ltZ1wiLChmdW5jdGlvbigpe3JldHVybiBXdH0pKTt2YXIgYT17fTtuLnIoYSksbi5kKGEsXCJnZXRTcGxpbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaGV9KSksbi5kKGEsXCJnZXRDb250cm9sUG9pbnRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZGV9KSksbi5kKGEsXCJwb2ludHNUb1BvbHlnb25cIiwoZnVuY3Rpb24oKXtyZXR1cm4gcGV9KSksbi5kKGEsXCJwYXRoVG9Qb2ludHNcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZ2V9KSksbi5kKGEsXCJnZXRDbG9zZWRTcGxpbmVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdmV9KSksbi5kKGEsXCJyb3VuZGVkSHVsbFwiLChmdW5jdGlvbigpe3JldHVybiB4ZX0pKSxuLmQoYSxcInBhZGRlZEh1bGxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gd2V9KSk7dmFyIHM9e307bi5yKHMpLG4uZChzLFwibGVmdFRyYW5zbGF0ZVwiLChmdW5jdGlvbigpe3JldHVybiBjbn0pKSxuLmQocyxcImxlZnRSb3RhdGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZm59KSksbi5kKHMsXCJsZWZ0U2NhbGVcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbG59KSksbi5kKHMsXCJ0cmFuc2Zvcm1cIiwoZnVuY3Rpb24oKXtyZXR1cm4gaG59KSksbi5kKHMsXCJkaXJlY3Rpb25cIiwoZnVuY3Rpb24oKXtyZXR1cm4gZG59KSksbi5kKHMsXCJhbmdsZVRvXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHBufSkpLG4uZChzLFwidmVydGljYWxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZ259KSk7dmFyIHU9e307bi5yKHUpLG4uZCh1LFwibWl4Q29sb3JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQ259KSksbi5kKHUsXCJnZXRDb2xvcnNXaXRoU3ViamVjdENvbG9yXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIElufSkpLG4uZCh1LFwiZ2V0Q29sb3JTZXRzQnlTdWJqZWN0Q29sb3JzXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFBufSkpO3ZhciBjPXt9O24ucihjKSxuLmQoYyxcImdwdURldGVjdG9yXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFhofSkpO3ZhciBmPXt9O24ucihmKSxuLmQoZixcInByb2NjZXNzVG9GdW5jXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGFkfSkpLG4uZChmLFwiYnVpbGRUZXh0dXJlRGF0YVwiLChmdW5jdGlvbigpe3JldHVybiBzZH0pKSxuLmQoZixcImJ1aWxkVGV4dHVyZURhdGFXaXRoT25lRWRnZUF0dHJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdWR9KSksbi5kKGYsXCJidWlsZFRleHR1cmVEYXRhV2l0aFR3b0VkZ2VBdHRyXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGNkfSkpLG4uZChmLFwiYXR0cmlidXRlc1RvVGV4dHVyZURhdGFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZmR9KSksbi5kKGYsXCJhcnJheVRvVGV4dHVyZURhdGFcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbGR9KSksbi5kKGYsXCJyYWRpYWxMYXlvdXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gaGR9KSk7dmFyIGw9e307bi5yKGwpLG4uZChsLFwiZGVmYXVsdFwiLChmdW5jdGlvbigpe3JldHVybiB5cH0pKSxuLmQobCxcImFzc2lnblwiLChmdW5jdGlvbigpe3JldHVybiBRZH0pKSxuLmQobCxcImZvcm1hdFwiLChmdW5jdGlvbigpe3JldHVybiBncH0pKSxuLmQobCxcInBhcnNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHZwfSkpLG4uZChsLFwiZGVmYXVsdEkxOG5cIiwoZnVuY3Rpb24oKXtyZXR1cm4gZXB9KSksbi5kKGwsXCJzZXRHbG9iYWxEYXRlSTE4blwiLChmdW5jdGlvbigpe3JldHVybiBycH0pKSxuLmQobCxcInNldEdsb2JhbERhdGVNYXNrc1wiLChmdW5jdGlvbigpe3JldHVybiBwcH0pKTt2YXIgaD1uKDApLGQ9e2dldERlZmF1bHRDZmc6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7cmV0dXJue319LHVwZGF0ZUNmZzpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLHQpLCEwfSxzaG91bGRCZWdpbjpmdW5jdGlvbigpe3JldHVybiEwfSxzaG91bGRVcGRhdGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2hvdWxkRW5kOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGJpbmQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuZXZlbnRzO3RoaXMuZ3JhcGg9dCxcImRyYWctY2FudmFzXCIhPT10aGlzLnR5cGUmJlwiYnJ1c2gtc2VsZWN0XCIhPT10aGlzLnR5cGUmJlwibGFzc28tc2VsZWN0XCIhPT10aGlzLnR5cGV8fHQuZ2V0KFwiY2FudmFzXCIpLnNldChcImRyYWdnYWJsZVwiLCEwKSxPYmplY3QoaC5mKShuLChmdW5jdGlvbihlLG4pe3Qub24obixlKX0pKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLChmdW5jdGlvbigpe2Uua2V5ZG93bj0hMX0pKX0sdW5iaW5kOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZXZlbnRzO1wiZHJhZy1jYW52YXNcIiE9PXRoaXMudHlwZSYmXCJicnVzaC1zZWxlY3RcIiE9PXRoaXMudHlwZSYmXCJsYXNzby1zZWxlY3RcIiE9PXRoaXMudHlwZXx8dC5nZXQoXCJjYW52YXNcIikuc2V0KFwiZHJhZ2dhYmxlXCIsITEpLE9iamVjdChoLmYpKGUsKGZ1bmN0aW9uKGUsbil7dC5vZmYobixlKX0pKX0sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzW3RdfSxzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpc1t0XT1lLHRoaXN9fSxwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5yZWdpc3RlckJlaGF2aW9yPWZ1bmN0aW9uKGUsbil7aWYoIW4pdGhyb3cgbmV3IEVycm9yKFwicGxlYXNlIHNwZWNpZnkgaGFuZGxlciBmb3IgdGhpcyBiZWhhdmlvcjogXCIrZSk7dmFyIHI9T2JqZWN0KGguYykoZCk7T2JqZWN0LmFzc2lnbihyLG4pO3ZhciBpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7T2JqZWN0LmFzc2lnbih0aGlzLHRoaXMuZ2V0RGVmYXVsdENmZygpLHQpO3ZhciBuPXRoaXMuZ2V0RXZlbnRzKCk7dGhpcy5ldmVudHM9bnVsbDt2YXIgcj17fTtuJiYoT2JqZWN0KGguZikobiwoZnVuY3Rpb24odCxuKXtyW25dPU9iamVjdChoLkopKGUsdCl9KSksdGhpcy5ldmVudHM9cil9O2kucHJvdG90eXBlPXIsdC50eXBlc1tlXT1pfSx0Lmhhc0JlaGF2aW9yPWZ1bmN0aW9uKGUpe3JldHVybiEhdC50eXBlc1tlXX0sdC5nZXRCZWhhdmlvcj1mdW5jdGlvbihlKXtyZXR1cm4gdC50eXBlc1tlXX0sdC50eXBlcz17fSx0fSgpLGc9cCx2PW4oMSkseT1uKDEzNiksbT1uKDE4KSxiPW4oNTEpLHg9bS5hLnRyYW5zZm9ybSx3PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBlW3RdLW5bdF19fSxTPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD49ZSYmdDw9bn0sRT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLngtdC54LG89bi55LXQueSxhPWUueC10Lngscz1lLnktdC55LHU9ci54LW4ueCxjPXIueS1uLnksZj1hKmMtcyp1LGw9MS9mLGg9bnVsbDtpZihmKmY+MWUtNCooYSphK3MqcykqKHUqdStjKmMpKXt2YXIgZD0oaSpjLW8qdSkqbCxwPShpKnMtbyphKSpsO1MoZCwwLDEpJiZTKHAsMCwxKSYmKGg9e3g6dC54K2QqYSx5OnQueStkKnN9KX1yZXR1cm4gaH0sXz1mdW5jdGlvbih0LGUpe3ZhciBuPXQueCxyPXQueSxpPXQud2lkdGgsbz10LmhlaWdodCxhPVtdLHM9e3g6bitpLzIseTpyK28vMn07YS5wdXNoKHt4Om4seTpyfSksYS5wdXNoKHt4Om4raSx5OnJ9KSxhLnB1c2goe3g6bitpLHk6citvfSksYS5wdXNoKHt4Om4seTpyK299KSxhLnB1c2goe3g6bix5OnJ9KTtmb3IodmFyIHU9bnVsbCxjPTE7YzxhLmxlbmd0aCYmISh1PUUoYVtjLTFdLGFbY10scyxlKSk7YysrKTtyZXR1cm4gdX0sTz1mdW5jdGlvbih0LGUpe3ZhciBuPXQueCxyPXQueSxpPXQucixvPWUueC1uLGE9ZS55LXI7aWYoTWF0aC5zcXJ0KG8qbythKmEpPGkpcmV0dXJuIG51bGw7dmFyIHM9TWF0aC5zaWduKG8pLHU9TWF0aC5zaWduKGEpLGM9TWF0aC5hdGFuKGEvbyk7cmV0dXJue3g6bitNYXRoLmFicyhpKk1hdGguY29zKGMpKSpzLHk6citNYXRoLmFicyhpKk1hdGguc2luKGMpKSp1fX0saz1mdW5jdGlvbih0LGUpe3ZhciBuPXQucngscj10LnJ5LGk9dC54LG89dC55LGE9ZS54LWkscz1lLnktbyx1PU1hdGguYXRhbjIocy9yLGEvbik7cmV0dXJuIHU8MCYmKHUrPTIqTWF0aC5QSSkse3g6aStuKk1hdGguY29zKHUpLHk6bytyKk1hdGguc2luKHUpfX0sTT1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49MSk7dmFyIHI9W3QueCx0Lnksbl07cmV0dXJuIGUmJiFpc05hTihlWzBdKXx8KGU9WzEsMCwwLDAsMSwwLDAsMCwxXSksbS5kLnRyYW5zZm9ybU1hdDMocixyLGUpLHt4OnJbMF0seTpyWzFdfX0sQT1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49MSksZSYmIWlzTmFOKGVbMF0pfHwoZT1bMSwwLDAsMCwxLDAsMCwwLDFdKTt2YXIgcj1tLmIuaW52ZXJ0KFsxLDAsMCwwLDEsMCwwLDAsMV0sZSk7cnx8KHI9WzEsMCwwLDAsMSwwLDAsMCwxXSk7dmFyIGk9W3QueCx0Lnksbl07cmV0dXJuIG0uZC50cmFuc2Zvcm1NYXQzKGksaSxyKSx7eDppWzBdLHk6aVsxXX19LFQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQueC1lLngsaT10LnktZS55LG89dC54LW4ueCxhPXQueS1uLnkscz0odC54KnQueC1lLngqZS54LWUueSplLnkrdC55KnQueSkvMix1PSh0LngqdC54LW4ueCpuLngtbi55Km4ueSt0LnkqdC55KS8yLGM9aSpvLXIqYTtyZXR1cm57eDotKGEqcy1pKnUpL2MseTotKHIqdS1vKnMpL2N9fSxDPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC54LWUueCxyPXQueS1lLnk7cmV0dXJuIE1hdGguc3FydChuKm4rcipyKX0sST1mdW5jdGlvbih0LGUpe3ZhciBuPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPVtdO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7ci5wdXNoKHQqZSl9KSksbi5wdXNoKHIpfSkpLG59LFA9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49dC5sZW5ndGgscj0wO3I8bjtyKz0xKXtlW3JdPVtdO2Zvcih2YXIgaT0wO2k8bjtpKz0xKXI9PT1pP2Vbcl1baV09MDowIT09dFtyXVtpXSYmdFtyXVtpXT9lW3JdW2ldPXRbcl1baV06ZVtyXVtpXT0xLzB9Zm9yKHZhciBvPTA7bzxuO28rPTEpZm9yKHI9MDtyPG47cis9MSlmb3IoaT0wO2k8bjtpKz0xKWVbcl1baV0+ZVtyXVtvXStlW29dW2ldJiYoZVtyXVtpXT1lW3JdW29dK2Vbb11baV0pO3JldHVybiBlfSxqPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5ub2RlcyxyPXQuZWRnZXMsaT1bXSxvPXt9O2lmKCFuKXRocm93IG5ldyBFcnJvcihcImludmFsaWQgbm9kZXMgZGF0YSFcIik7cmV0dXJuIG4mJm4uZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtvW3QuaWRdPWU7aS5wdXNoKFtdKX0pKSxyJiZyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQuc291cmNlLHI9dC50YXJnZXQsYT1vW25dLHM9b1tyXTtpW2FdW3NdPTEsZXx8KGlbc11bYV09MSl9KSksaX0sRD1mdW5jdGlvbih0LGUpe3QudHJhbnNsYXRlKGUueCxlLnkpfSxOPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRNYXRyaXgoKTtufHwobj1bMSwwLDAsMCwxLDAsMCwwLDFdKTt2YXIgcj10LmdldENhbnZhc0JCb3goKSxpPWUueC1yLm1pblgsbz1lLnktci5taW5ZLGE9eChuLFtbXCJ0XCIsaSxvXV0pO3Quc2V0TWF0cml4KGEpfSxSPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRNYXRyaXgoKTtufHwobj1bMSwwLDAsMCwxLDAsMCwwLDFdKTt2YXIgcj1lO09iamVjdChoLm0pKGUpfHwocj1bZSxlXSksT2JqZWN0KGgubSkoZSkmJjE9PT1lLmxlbmd0aCYmKHI9W2VbMF0sZVswXV0pLG49eChuLFtbXCJzXCIsclswXSxyWzFdXV0pLHQuc2V0TWF0cml4KG4pfSxMPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRNYXRyaXgoKTtufHwobj1bMSwwLDAsMCwxLDAsMCwwLDFdKSxuPXgobixbW1wiclwiLGVdXSksdC5zZXRNYXRyaXgobil9LEI9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1bXSxpPTA7aTx0O2krKylyW2ldPTA7cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zb3VyY2UmJihyW2VbdC5zb3VyY2VdXSs9MSksdC50YXJnZXQmJihyW2VbdC50YXJnZXRdXSs9MSl9KSkscn07ZnVuY3Rpb24gRyh0LGUsbil7cmV0dXJuKG5bMF0tdFswXSkqKGVbMV0tdFsxXSk9PShlWzBdLXRbMF0pKihuWzFdLXRbMV0pJiZNYXRoLm1pbih0WzBdLGVbMF0pPD1uWzBdJiZuWzBdPD1NYXRoLm1heCh0WzBdLGVbMF0pJiZNYXRoLm1pbih0WzFdLGVbMV0pPD1uWzFdJiZuWzFdPD1NYXRoLm1heCh0WzFdLGVbMV0pfXZhciBGLFUseixWLFc9ZnVuY3Rpb24odCxlLG4pe3ZhciByPSExLGk9dC5sZW5ndGg7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gTWF0aC5hYnModCk8MWUtNj8wOnQ8MD8tMToxfWlmKGk8PTIpcmV0dXJuITE7Zm9yKHZhciBhPTA7YTxpO2ErKyl7dmFyIHM9dFthXSx1PXRbKGErMSklaV07aWYoRyhzLHUsW2Usbl0pKXJldHVybiEwO28oc1sxXS1uKT4wIT1vKHVbMV0tbik+MCYmbyhlLShuLXNbMV0pKihzWzBdLXVbMF0pLyhzWzFdLXVbMV0pLXNbMF0pPDAmJihyPSFyKX1yZXR1cm4gcn0sWD1mdW5jdGlvbih0LGUpe3JldHVybiEoZS5taW5YPnQubWF4WHx8ZS5tYXhYPHQubWluWHx8ZS5taW5ZPnQubWF4WXx8ZS5tYXhZPHQubWluWSl9LFk9ZnVuY3Rpb24odCxlKXt2YXIgbj1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF19KSksbj10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV19KSk7cmV0dXJue21pblg6TWF0aC5taW4uYXBwbHkobnVsbCxlKSxtYXhYOk1hdGgubWF4LmFwcGx5KG51bGwsZSksbWluWTpNYXRoLm1pbi5hcHBseShudWxsLG4pLG1heFk6TWF0aC5tYXguYXBwbHkobnVsbCxuKX19LHI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49dC5sZW5ndGgscj0wO3I8bi0xO3IrKyl7dmFyIGk9dFtyXSxvPXRbcisxXTtlLnB1c2goe2Zyb206e3g6aVswXSx5OmlbMV19LHRvOnt4Om9bMF0seTpvWzFdfX0pfWlmKGUubGVuZ3RoPjEpe3ZhciBhPXRbMF0scz10W24tMV07ZS5wdXNoKHtmcm9tOnt4OnNbMF0seTpzWzFdfSx0bzp7eDphWzBdLHk6YVsxXX19KX1yZXR1cm4gZX07aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4hMTt2YXIgaT1uKHQpLG89bihlKTtpZighWChpLG8pKXJldHVybiExO3ZhciBhPSExO2lmKE9iamVjdChoLmYpKGUsKGZ1bmN0aW9uKGUpe2lmKFcodCxlWzBdLGVbMV0pKXJldHVybiBhPSEwLCExfSkpLGEpcmV0dXJuITA7aWYoT2JqZWN0KGguZikodCwoZnVuY3Rpb24odCl7aWYoVyhlLHRbMF0sdFsxXSkpcmV0dXJuIGE9ITAsITF9KSksYSlyZXR1cm4hMDt2YXIgcz1yKHQpLHU9cihlKSxjPSExO3JldHVybiBPYmplY3QoaC5mKSh1LChmdW5jdGlvbih0KXtpZihmdW5jdGlvbih0LGUpe3ZhciBuPSExO3JldHVybiBPYmplY3QoaC5mKSh0LChmdW5jdGlvbih0KXtpZihFKHQuZnJvbSx0LnRvLGUuZnJvbSxlLnRvKSlyZXR1cm4gbj0hMCwhMX0pKSxufShzLHQpKXJldHVybiBjPSEwLCExfSkpLGN9LEg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIpe3RoaXMueDE9dCx0aGlzLnkxPWUsdGhpcy54Mj1uLHRoaXMueTI9cn1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0QkJveD1mdW5jdGlvbigpe3ZhciB0PU1hdGgubWluKHRoaXMueDEsdGhpcy54MiksZT1NYXRoLm1pbih0aGlzLnkxLHRoaXMueTIpLG49TWF0aC5tYXgodGhpcy54MSx0aGlzLngyKSxyPU1hdGgubWF4KHRoaXMueTEsdGhpcy55Mik7cmV0dXJue3g6dCx5OmUsbWluWDp0LG1pblk6ZSxtYXhYOm4sbWF4WTpyLHdpZHRoOm4tdCxoZWlnaHQ6ci1lfX0sdH0oKSxxPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3RvcDpbdC5taW5YLHQubWluWSx0Lm1heFgsdC5taW5ZXSxsZWZ0Olt0Lm1pblgsdC5taW5ZLHQubWluWCx0Lm1heFldLGJvdHRvbTpbdC5taW5YLHQubWF4WSx0Lm1heFgsdC5tYXhZXSxyaWdodDpbdC5tYXhYLHQubWluWSx0Lm1heFgsdC5tYXhZXX1bZV19LEs9ZnVuY3Rpb24odCxlKXt2YXIgbj0oZS54Mi1lLngxKSoodC55MS1lLnkxKS0oZS55Mi1lLnkxKSoodC54MS1lLngxKSxyPSh0LngyLXQueDEpKih0LnkxLWUueTEpLSh0LnkyLXQueTEpKih0LngxLWUueDEpLGk9KGUueTItZS55MSkqKHQueDItdC54MSktKGUueDItZS54MSkqKHQueTItdC55MSk7aWYoaSl7dmFyIG89bi9pLGE9ci9pO2lmKG8+PTAmJm88PTEmJmE+PTAmJmE8PTEpcmV0dXJuIG99cmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWX0sWj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXCJ0b3BcIixcImxlZnRcIixcImJvdHRvbVwiLFwicmlnaHRcIl0scj10LmdldEJCb3goKSxpPTAsbz1bXSxhPTA7YTw0O2ErKyl7dmFyIHM9cShyLG5bYV0pLHU9c1swXSxjPXNbMV0sZj1zWzJdLGw9c1szXTtvW2FdPUUoe3g6ZS54MSx5OmUueTF9LHt4OmUueDIseTplLnkyfSx7eDp1LHk6Y30se3g6Zix5Omx9KSxvW2FdJiYoaSs9MSl9cmV0dXJuW28saV19LFE9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W1widG9wXCIsXCJsZWZ0XCIsXCJib3R0b21cIixcInJpZ2h0XCJdLHI9dC5nZXRCQm94KCksaT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbz0wLGE9MDthPDQ7YSsrKXt2YXIgcz1xKHIsblthXSksdT1zWzBdLGM9c1sxXSxmPXNbMl0sbD1zWzNdLGg9SyhlLG5ldyBIKHUsYyxmLGwpKTsoaD1NYXRoLmFicyhoLS41KSk+PTAmJmg8PTEmJihvKz0xLGk9aDxpP2g6aSl9cmV0dXJuIDA9PT1vPy0xOml9LEo9ZnVuY3Rpb24odCl7dmFyIGU9MCxuPTA7aWYodC5sZW5ndGg+MCl7Zm9yKHZhciByPTAsaT10O3I8aS5sZW5ndGg7cisrKXt2YXIgbz1pW3JdO2UrPW8ueCxuKz1vLnl9ZS89dC5sZW5ndGgsbi89dC5sZW5ndGh9cmV0dXJue3g6ZSx5Om59fSwkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgucG93KHQueC1lLngsMikrTWF0aC5wb3codC55LWUueSwyKX0sdHQ9ZnVuY3Rpb24odCxlKXt2YXIgbixyPWUueDEsaT1lLnkxLG89ZS54Mi1yLGE9ZS55Mi1pLHM9dC54LXIsdT10LnktaSxjPXMqbyt1KmE7bj1jPD0wfHwoYz0ocz1vLXMpKm8rKHU9YS11KSphKTw9MD8wOmMqYy8obypvK2EqYSk7dmFyIGY9cypzK3UqdS1uO3JldHVybiBmPDAmJihmPTApLGZ9LGV0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49LjAwMSksTWF0aC5wb3codC54LWUueCwyKStNYXRoLnBvdyh0LnktZS55LDIpPE1hdGgucG93KG4sMil9LG50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC54PGUueCxyPXQueD5lLngrZS53aWR0aCxpPXQueT5lLnkrZS5oZWlnaHQsbz10Lnk8ZS55O2lmKCEobnx8cnx8aXx8bykpcmV0dXJuIDA7aWYoaSYmIW4mJiFyKXJldHVybiBNYXRoLnBvdyhlLnkrZS5oZWlnaHQtdC55LDIpO2lmKG8mJiFuJiYhcilyZXR1cm4gTWF0aC5wb3codC55LWUueSwyKTtpZihuJiYhaSYmIW8pcmV0dXJuIE1hdGgucG93KGUueC10LngsMik7aWYociYmIWkmJiFvKXJldHVybiBNYXRoLnBvdyhlLngrZS53aWR0aC10LngsMik7dmFyIGE9TWF0aC5taW4oTWF0aC5hYnMoZS54LXQueCksTWF0aC5hYnMoZS54K2Uud2lkdGgtdC54KSkscz1NYXRoLm1pbihNYXRoLmFicyhlLnktdC55KSxNYXRoLmFicyhlLnkrZS5oZWlnaHQtdC55KSk7cmV0dXJuIGEqYStzKnN9LHJ0PVwicmdiKDI1MywgMjUzLCAyNTMpXCIsaXQ9XCJyZ2IoOTUsIDE0OSwgMjU1KVwiLG90PVwicmdiKDk1LCAxNDksIDI1NSlcIixhdD1cInJnYigyNDcsIDI1MCwgMjU1KVwiLHN0PVwicmdiKDk1LCAxNDksIDI1NSlcIix1dD1cInJnYigyMjQsIDIyNCwgMjI0KVwiLGN0PVwicmdiKDk1LCAxNDksIDI1NSlcIixmdD1cInJnYigyMjQsIDIyNCwgMjI0KVwiLGx0PVwicmdiKDk1LCAxNDksIDI1NSlcIixodD17dmVyc2lvbjpcIjAuMC4xMlwiLHJvb3RDb250YWluZXJDbGFzc05hbWU6XCJyb290LWNvbnRhaW5lclwiLG5vZGVDb250YWluZXJDbGFzc05hbWU6XCJub2RlLWNvbnRhaW5lclwiLGVkZ2VDb250YWluZXJDbGFzc05hbWU6XCJlZGdlLWNvbnRhaW5lclwiLGNvbWJvQ29udGFpbmVyQ2xhc3NOYW1lOlwiY29tYm8tY29udGFpbmVyXCIsZGVsZWdhdGVDb250YWluZXJDbGFzc05hbWU6XCJkZWxlZ2F0ZS1jb250YWluZXJcIixkZWZhdWx0TG9vcFBvc2l0aW9uOlwidG9wXCIsbm9kZUxhYmVsOntzdHlsZTp7ZmlsbDpcIiMwMDBcIixmb250U2l6ZToxMix0ZXh0QWxpZ246XCJjZW50ZXJcIix0ZXh0QmFzZWxpbmU6XCJtaWRkbGVcIn0sb2Zmc2V0OjR9LGRlZmF1bHROb2RlOnt0eXBlOlwiY2lyY2xlXCIsc3R5bGU6e2xpbmVXaWR0aDoxLHN0cm9rZTppdCxmaWxsOlwicmdiKDIzOSwgMjQ0LCAyNTUpXCJ9LHNpemU6MjAsY29sb3I6aXQsbGlua1BvaW50czp7c2l6ZTo4LGxpbmVXaWR0aDoxLGZpbGw6YXQsc3Ryb2tlOm90fX0sbm9kZVN0YXRlU3R5bGVzOnthY3RpdmU6e2ZpbGw6YXQsc3Ryb2tlOm90LGxpbmVXaWR0aDoyLHNoYWRvd0NvbG9yOml0LHNoYWRvd0JsdXI6MTB9LHNlbGVjdGVkOntmaWxsOlwicmdiKDI1NSwgMjU1LCAyNTUpXCIsc3Ryb2tlOnN0LGxpbmVXaWR0aDo0LHNoYWRvd0NvbG9yOnN0LHNoYWRvd0JsdXI6MTAsXCJ0ZXh0LXNoYXBlXCI6e2ZvbnRXZWlnaHQ6NTAwfX0saGlnaGxpZ2h0OntmaWxsOlwicmdiKDIyMywgMjM0LCAyNTUpXCIsc3Ryb2tlOlwiIzQ1NzJkOVwiLGxpbmVXaWR0aDoyLFwidGV4dC1zaGFwZVwiOntmb250V2VpZ2h0OjUwMH19LGluYWN0aXZlOntmaWxsOlwicmdiKDI0NywgMjUwLCAyNTUpXCIsc3Ryb2tlOlwicmdiKDE5MSwgMjEzLCAyNTUpXCIsbGluZVdpZHRoOjF9LGRpc2FibGU6e2ZpbGw6XCJyZ2IoMjUwLCAyNTAsIDI1MClcIixzdHJva2U6XCJyZ2IoMjI0LCAyMjQsIDIyNClcIixsaW5lV2lkdGg6MX19LGVkZ2VMYWJlbDp7c3R5bGU6e2ZpbGw6XCJyZ2IoMCwgMCwgMClcIix0ZXh0QWxpZ246XCJjZW50ZXJcIix0ZXh0QmFzZWxpbmU6XCJtaWRkbGVcIixmb250U2l6ZToxMn19LGRlZmF1bHRFZGdlOnt0eXBlOlwibGluZVwiLHNpemU6MSxzdHlsZTp7c3Ryb2tlOnV0LGxpbmVBcHBlbmRXaWR0aDoyfSxjb2xvcjp1dH0sZWRnZVN0YXRlU3R5bGVzOnthY3RpdmU6e3N0cm9rZTpcInJnYig5NSwgMTQ5LCAyNTUpXCIsbGluZVdpZHRoOjF9LHNlbGVjdGVkOntzdHJva2U6Y3QsbGluZVdpZHRoOjIsc2hhZG93Q29sb3I6Y3Qsc2hhZG93Qmx1cjoxMCxcInRleHQtc2hhcGVcIjp7Zm9udFdlaWdodDo1MDB9fSxoaWdobGlnaHQ6e3N0cm9rZTpcInJnYig5NSwgMTQ5LCAyNTUpXCIsbGluZVdpZHRoOjIsXCJ0ZXh0LXNoYXBlXCI6e2ZvbnRXZWlnaHQ6NTAwfX0saW5hY3RpdmU6e3N0cm9rZTpcInJnYigyMzQsIDIzNCwgMjM0KVwiLGxpbmVXaWR0aDoxfSxkaXNhYmxlOntzdHJva2U6XCJyZ2IoMjQ1LCAyNDUsIDI0NSlcIixsaW5lV2lkdGg6MX19LGNvbWJvTGFiZWw6e3N0eWxlOntmaWxsOlwicmdiKDAsIDAsIDApXCIsdGV4dEJhc2VsaW5lOlwibWlkZGxlXCIsZm9udFNpemU6MTJ9LHJlZlk6MTAscmVmWDoxMH0sZGVmYXVsdENvbWJvOnt0eXBlOlwiY2lyY2xlXCIsc3R5bGU6e2ZpbGw6cnQsbGluZVdpZHRoOjEsc3Ryb2tlOmZ0LHI6NSx3aWR0aDoyMCxoZWlnaHQ6MTB9LHNpemU6WzIwLDVdLGNvbG9yOmZ0LHBhZGRpbmc6WzI1LDIwLDE1LDIwXX0sY29tYm9TdGF0ZVN0eWxlczp7YWN0aXZlOntzdHJva2U6XCJyZ2IoOTUsIDE0OSwgMjU1KVwiLGxpbmVXaWR0aDoxLGZpbGw6XCJyZ2IoMjQ3LCAyNTAsIDI1NSlcIn0sc2VsZWN0ZWQ6e3N0cm9rZTpsdCxsaW5lV2lkdGg6MixmaWxsOnJ0LHNoYWRvd0NvbG9yOmx0LHNoYWRvd0JsdXI6MTAsXCJ0ZXh0LXNoYXBlXCI6e2ZvbnRXZWlnaHQ6NTAwfX0saGlnaGxpZ2h0OntzdHJva2U6XCIjNDU3MmQ5XCIsbGluZVdpZHRoOjIsZmlsbDpydCxcInRleHQtc2hhcGVcIjp7Zm9udFdlaWdodDo1MDB9fSxpbmFjdGl2ZTp7c3Ryb2tlOlwicmdiKDIyNCwgMjI0LCAyMjQpXCIsZmlsbDpydCxsaW5lV2lkdGg6MX0sZGlzYWJsZTp7c3Ryb2tlOlwicmdiKDIzNCwgMjM0LCAyMzQpXCIsZmlsbDpcInJnYigyNTAsIDI1MCwgMjUwKVwiLGxpbmVXaWR0aDoxfX0sZGVsZWdhdGVTdHlsZTp7ZmlsbDpcIiNGM0Y5RkZcIixmaWxsT3BhY2l0eTouNSxzdHJva2U6XCIjMTg5MEZGXCIsc3Ryb2tlT3BhY2l0eTouOSxsaW5lRGFzaDpbNSw1XX19LGR0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmdyYXBoPXQsdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5tb2Rlcz10LmdldChcIm1vZGVzXCIpfHx7ZGVmYXVsdDpbXX0sdGhpcy5mb3JtYXRNb2RlcygpLHRoaXMubW9kZT10LmdldChcImRlZmF1bHRNb2RlXCIpfHxcImRlZmF1bHRcIix0aGlzLmN1cnJlbnRCZWhhdmVzPVtdLHRoaXMuc2V0TW9kZSh0aGlzLm1vZGUpfXJldHVybiB0LnByb3RvdHlwZS5mb3JtYXRNb2Rlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kZXM7T2JqZWN0KGguZikodCwoZnVuY3Rpb24odCl7T2JqZWN0KGguZikodCwoZnVuY3Rpb24oZSxuKXtPYmplY3QoaC54KShlKSYmKHRbbl09e3R5cGU6ZX0pfSkpfSkpfSx0LnByb3RvdHlwZS5zZXRCZWhhdmlvcnM9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLmdyYXBoLHI9dGhpcy5tb2Rlc1t0XSxpPVtdO09iamVjdChoLmYpKHJ8fFtdLChmdW5jdGlvbih0KXt2YXIgcj1wLmdldEJlaGF2aW9yKHQudHlwZXx8dCk7ciYmKGU9bmV3IHIodCkpJiYoZS5iaW5kKG4pLGkucHVzaChlKSl9KSksdGhpcy5jdXJyZW50QmVoYXZlcz1pfSx0Lm1lcmdlQmVoYXZpb3JzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdChoLmYpKGUsKGZ1bmN0aW9uKGUpe3QuaW5kZXhPZihlKTwwJiYoT2JqZWN0KGgueCkoZSkmJihlPXt0eXBlOmV9KSx0LnB1c2goZSkpfSkpLHR9LHQuZmlsdGVyQmVoYXZpb3JzPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9XCJcIjtyPU9iamVjdChoLngpKHQpP3Q6dC50eXBlLGUuaW5kZXhPZihyKTwwJiZuLnB1c2godCl9KSksbn0sdC5wcm90b3R5cGUuc2V0TW9kZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm1vZGVzLG49dGhpcy5ncmFwaCxyPXQ7ZVtyXSYmKG4uZW1pdChcImJlZm9yZW1vZGVjaGFuZ2VcIix7bW9kZTp0fSksT2JqZWN0KGguZikodGhpcy5jdXJyZW50QmVoYXZlcywoZnVuY3Rpb24odCl7dC5kZWxlZ2F0ZSYmdC5kZWxlZ2F0ZS5yZW1vdmUoKSx0LnVuYmluZChuKX0pKSx0aGlzLnNldEJlaGF2aW9ycyhyKSxuLmVtaXQoXCJhZnRlcm1vZGVjaGFuZ2VcIix7bW9kZTp0fSksdGhpcy5tb2RlPXQpfSx0LnByb3RvdHlwZS5nZXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW9kZX0sdC5wcm90b3R5cGUubWFuaXB1bGF0ZUJlaGF2aW9ycz1mdW5jdGlvbihlLG4scil7dmFyIGksbz10aGlzO2lmKGk9T2JqZWN0KGgubSkoZSk/ZTpbZV0sT2JqZWN0KGgubSkobikpcmV0dXJuIE9iamVjdChoLmYpKG4sKGZ1bmN0aW9uKGUpe28ubW9kZXNbZV0/by5tb2Rlc1tlXT1yP3QubWVyZ2VCZWhhdmlvcnMoby5tb2Rlc1tlXXx8W10saSk6dC5maWx0ZXJCZWhhdmlvcnMoby5tb2Rlc1tlXXx8W10saSk6ciYmKG8ubW9kZXNbZV09aSl9KSksdGhpczt2YXIgYT1uO3JldHVybiBufHwoYT10aGlzLm1vZGUpLHRoaXMubW9kZXNbYV18fHImJih0aGlzLm1vZGVzW2FdPWkpLHRoaXMubW9kZXNbYV09cj90Lm1lcmdlQmVoYXZpb3JzKHRoaXMubW9kZXNbYV18fFtdLGkpOnQuZmlsdGVyQmVoYXZpb3JzKHRoaXMubW9kZXNbYV18fFtdLGkpLHRoaXMuc2V0TW9kZSh0aGlzLm1vZGUpLHRoaXN9LHQucHJvdG90eXBlLnVwZGF0ZUJlaGF2aW9yPWZ1bmN0aW9uKHQsZSxuKXtPYmplY3QoaC54KSh0KSYmKHQ9e3R5cGU6dH0pO3ZhciByPVtdO2lmKG4mJm4hPT10aGlzLm1vZGUmJlwiZGVmYXVsdFwiIT09bil7aWYoIShyPXRoaXMubW9kZXNbbl0pfHwhci5sZW5ndGgpcmV0dXJuIGNvbnNvbGUud2FybihcIlVwZGF0ZSBiZWhhdmlvciBmYWlsZWQhIFRoZXJlIGlzIG5vIGJlaGF2aW9ycyBpbiB0aGlzIG1vZGUgb24gdGhlIGdyYXBoLlwiKSx0aGlzO3ZhciBpPXIubGVuZ3RoO2ZvcihhPTA7YTxpO2ErKyl7aWYoKHM9clthXSkudHlwZT09PXQudHlwZXx8cz09PXQudHlwZSlyZXR1cm4gcz09PXQudHlwZSYmKHM9e3R5cGU6c30pLE9iamVjdC5hc3NpZ24ocyxlKSxyW2FdPXMsdGhpczthPT09aS0xJiZjb25zb2xlLndhcm4oXCJVcGRhdGUgYmVoYXZpb3IgZmFpbGVkISBUaGVyZSBpcyBubyBzdWNoIGJlaGF2aW9yIGluIHRoZSBtb2RlXCIpfX1lbHNle2lmKCEocj10aGlzLmN1cnJlbnRCZWhhdmVzKXx8IXIubGVuZ3RoKXJldHVybiBjb25zb2xlLndhcm4oXCJVcGRhdGUgYmVoYXZpb3IgZmFpbGVkISBUaGVyZSBpcyBubyBiZWhhdmlvcnMgaW4gdGhpcyBtb2RlIG9uIHRoZSBncmFwaC5cIiksdGhpcztmb3IodmFyIG89ci5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBzO2lmKChzPXJbYV0pLnR5cGU9PT10LnR5cGUpcmV0dXJuIHMudXBkYXRlQ2ZnKGUpLHRoaXM7YT09PW8tMSYmY29uc29sZS53YXJuKFwiVXBkYXRlIGJlaGF2aW9yIGZhaWxlZCEgVGhlcmUgaXMgbm8gc3VjaCBiZWhhdmlvciBpbiB0aGUgbW9kZVwiKX19cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmdyYXBoPW51bGwsdGhpcy5tb2Rlcz1udWxsLHRoaXMuY3VycmVudEJlaGF2ZXM9bnVsbCx0aGlzLmRlc3Ryb3llZD0hMH0sdH0oKTtmdW5jdGlvbiBwdCh0LGUsbil7aWYodCl7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyKXJldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLCExKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbiwhMSl9fTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LmF0dGFjaEV2ZW50KXJldHVybiB0LmF0dGFjaEV2ZW50KFwib25cIitlLG4pLHtyZW1vdmU6ZnVuY3Rpb24oKXt0LmRldGFjaEV2ZW50KFwib25cIitlLG4pfX19fWZ1bmN0aW9uIGd0KHQpe0Z8fChGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiKSxVPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0clwiKSx6PS9eXFxzKjwoXFx3K3whKVtePl0qPi8sVj17dHI6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRib2R5XCIpLHRib2R5OkYsdGhlYWQ6Rix0Zm9vdDpGLHRkOlUsdGg6VSxcIipcIjpkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpfSk7dmFyIGU9ei50ZXN0KHQpJiZSZWdFeHAuJDE7ZSYmZSBpbiBWfHwoZT1cIipcIik7dmFyIG49VltlXTt0PXQucmVwbGFjZSgvKF5cXHMqKXwoXFxzKiQpL2csXCJcIiksbi5pbm5lckhUTUw9XCJcIit0O3ZhciByPW4uY2hpbGROb2Rlc1swXTtyZXR1cm4gbi5yZW1vdmVDaGlsZChyKSxyfWZ1bmN0aW9uIHZ0KHQsZSl7aWYodClmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodC5zdHlsZVtuXT1lW25dKTtyZXR1cm4gdH12YXIgeXQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIHIuaXRlbT1uLml0ZW0sci5jYW52YXNYPW4uY2FudmFzWCxyLmNhbnZhc1k9bi5jYW52YXNZLHIud2hlZWxEZWx0YT1uLndoZWVsRGVsdGEsci5kZXRhaWw9bi5kZXRhaWwscn1yZXR1cm4gT2JqZWN0KHYuYikoZSx0KSxlfShuKDIxKS5FdmVudCksbXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQrXCItXCIrTWF0aC5yYW5kb20oKStEYXRlLm5vdygpfSxidD1mdW5jdGlvbih0KXt2YXIgZT0wLG49MCxyPTAsaT0wO2lmKE9iamVjdChoLnQpKHQpKWU9bj1yPWk9dDtlbHNlIGlmKE9iamVjdChoLngpKHQpKXtlPW49cj1pPXBhcnNlSW50KHQsMTApfWVsc2UgT2JqZWN0KGgubSkodCkmJihlPXRbMF0scj1PYmplY3QoaC5zKSh0WzFdKT90WzBdOnRbMV0saT1PYmplY3QoaC5zKSh0WzJdKT90WzBdOnRbMl0sbj1PYmplY3QoaC5zKSh0WzNdKT9yOnRbM10pO3JldHVybltlLHIsaSxuXX0seHQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHl0KHQudHlwZSx0KTtyZXR1cm4gZS5jbGllbnRYPXQuY2xpZW50WCxlLmNsaWVudFk9dC5jbGllbnRZLGUueD10LngsZS55PXQueSxlLnRhcmdldD10LnRhcmdldCxlLmN1cnJlbnRUYXJnZXQ9dC5jdXJyZW50VGFyZ2V0LGUuYnViYmxlcz0hMCxlLml0ZW09dC5pdGVtLGV9LHd0PWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiExO2Zvcih2YXIgZT1bMSwwLDAsMCwxLDAsMCwwLDFdLG49MDtuPDk7bisrKWlmKHRbbl0hPT1lW25dKXJldHVybiEwO3JldHVybiExfSxTdD1mdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcih0KSl9LEV0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xLzAsbj0tMS8wLHI9MS8wLGk9LTEvMCxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBhPXRbb10uZ2V0QkJveCgpLHM9YS5taW5YLHU9YS5taW5ZLGM9YS5tYXhYLGY9YS5tYXhZO3M8ZSYmKGU9cyksdTxyJiYocj11KSxjPm4mJihuPWMpLGY+aSYmKGk9Zil9cmV0dXJue3g6TWF0aC5mbG9vcihlKSx5Ok1hdGguZmxvb3Iociksd2lkdGg6TWF0aC5jZWlsKG4pLU1hdGguZmxvb3IoZSksaGVpZ2h0Ok1hdGguY2VpbChpKS1NYXRoLmZsb29yKHIpLG1pblg6ZSxtaW5ZOnIsbWF4WDpuLG1heFk6aX19LF90PWZ1bmN0aW9uKHQsZSxuLHIsaSl7dm9pZCAwPT09ZSYmKGU9MTUpLHZvaWQgMD09PW4mJihuPVwicXVhZHJhdGljXCIpO2Zvcih2YXIgbz10Lmxlbmd0aCxhPTIqZSxzPVtcInRvcFwiLFwidG9wLXJpZ2h0XCIsXCJyaWdodFwiLFwiYm90dG9tLXJpZ2h0XCIsXCJib3R0b21cIixcImJvdHRvbS1sZWZ0XCIsXCJsZWZ0XCIsXCJ0b3AtbGVmdFwiXSx1PXt9LGM9W10sZj17fSxsPTA7bDxvO2wrKyl7dmFyIGg9dFtsXSxkPWguc291cmNlLHA9aC50YXJnZXQsZz1kK1wiLVwiK3A7aWYoIWNbbF0pe3VbZ118fCh1W2ddPVtdKSxjW2xdPSEwLHVbZ10ucHVzaChoKTtmb3IodmFyIHY9MDt2PG87disrKWlmKGwhPT12KXt2YXIgeT10W3ZdLG09eS5zb3VyY2UsYj15LnRhcmdldDtjW3ZdfHwoZD09PWImJnA9PT1tPyh1W2ddLnB1c2goeSksY1t2XT0hMCxmW20rXCJ8XCIrYitcInxcIisodVtnXS5sZW5ndGgtMSldPSEwKTpkPT09bSYmcD09PWImJih1W2ddLnB1c2goeSksY1t2XT0hMCkpfX19Zm9yKHZhciB4IGluIHUpZm9yKHZhciB3PXVbeF0sUz13Lmxlbmd0aCxFPTA7RTxTO0UrKyl7dmFyIF89d1tFXTtpZihfLnNvdXJjZSE9PV8udGFyZ2V0KWlmKDE9PT1TJiZyJiZfLnNvdXJjZSE9PV8udGFyZ2V0KV8udHlwZT1yO2Vsc2V7Xy50eXBlPW47dmFyIE89KEUlMj09MD8xOi0xKSooZltfLnNvdXJjZStcInxcIitfLnRhcmdldCtcInxcIitFXT8tMToxKTtfLmN1cnZlT2Zmc2V0PVMlMj09MT9PKk1hdGguY2VpbChFLzIpKmE6TyooTWF0aC5mbG9vcihFLzIpKmErZSl9ZWxzZSBpJiYoXy50eXBlPWkpLF8ubG9vcENmZz17cG9zaXRpb246c1tFJThdLGRpc3Q6MjAqTWF0aC5mbG9vcihFLzgpKzUwfX1yZXR1cm4gdH0sT3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuZGVzdHJveWVkPSExLHRoaXMuZ3JhcGg9dCx0aGlzLmRlc3Ryb3llZD0hMX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0Vmlld0NlbnRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Rm9ybWF0UGFkZGluZygpLGU9dGhpcy5ncmFwaCxuPXRoaXMuZ3JhcGguZ2V0KFwid2lkdGhcIikscj1lLmdldChcImhlaWdodFwiKTtyZXR1cm57eDoobi10WzFdLXRbM10pLzIrdFszXSx5OihyLXRbMF0tdFsyXSkvMit0WzBdfX0sdC5wcm90b3R5cGUuZml0Q2VudGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ncmFwaCxlPXQuZ2V0KFwiZ3JvdXBcIik7ZS5yZXNldE1hdHJpeCgpO3ZhciBuPWUuZ2V0Q2FudmFzQkJveCgpO2lmKDAhPT1uLndpZHRoJiYwIT09bi5oZWlnaHQpe3ZhciByPXRoaXMuZ2V0Vmlld0NlbnRlcigpLGk9bi54K24ud2lkdGgvMixvPW4ueStuLmhlaWdodC8yO3QudHJhbnNsYXRlKHIueC1pLHIueS1vKX19LHQucHJvdG90eXBlLmZpdFZpZXc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdyYXBoLGU9dGhpcy5nZXRGb3JtYXRQYWRkaW5nKCksbj10LmdldChcIndpZHRoXCIpLHI9dC5nZXQoXCJoZWlnaHRcIiksaT10LmdldChcImdyb3VwXCIpO2kucmVzZXRNYXRyaXgoKTt2YXIgbz1pLmdldENhbnZhc0JCb3goKTtpZigwIT09by53aWR0aCYmMCE9PW8uaGVpZ2h0KXt2YXIgYT10aGlzLmdldFZpZXdDZW50ZXIoKSxzPW8ueCtvLndpZHRoLzIsdT1vLnkrby5oZWlnaHQvMjt0LnRyYW5zbGF0ZShhLngtcyxhLnktdSk7dmFyIGM9KG4tZVsxXS1lWzNdKS9vLndpZHRoLGY9KHItZVswXS1lWzJdKS9vLmhlaWdodCxsPWM7Yz5mJiYobD1mKSx0Lnpvb20obCxhKX19LHQucHJvdG90eXBlLmdldEZvcm1hdFBhZGRpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdyYXBoLmdldChcImZpdFZpZXdQYWRkaW5nXCIpO3JldHVybiBidCh0KX0sdC5wcm90b3R5cGUuZm9jdXNQb2ludD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcyxpPXRoaXMuZ2V0Vmlld0NlbnRlcigpLG89dGhpcy5nZXRQb2ludEJ5Q2FudmFzKGkueCxpLnkpLGE9dGhpcy5ncmFwaC5nZXQoXCJncm91cFwiKS5nZXRNYXRyaXgoKTtpZihhfHwoYT1bMSwwLDAsMCwxLDAsMCwwLDFdKSxlKXt2YXIgcz0oby54LXQueCkqYVswXSx1PShvLnktdC55KSphWzRdLGM9MCxmPTAsbD0wLGg9MDt0aGlzLmdyYXBoLmdldChcImNhbnZhc1wiKS5hbmltYXRlKChmdW5jdGlvbih0KXtsPXMqdCxoPXUqdCxyLmdyYXBoLnRyYW5zbGF0ZShsLWMsaC1mKSxjPWwsZj1ofSksT2JqZWN0KHYuYSkoe30sbikpfWVsc2UgdGhpcy5ncmFwaC50cmFuc2xhdGUoKG8ueC10LngpKmFbMF0sKG8ueS10LnkpKmFbNF0pfSx0LnByb3RvdHlwZS5nZXRQb2ludEJ5Q2FudmFzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5ncmFwaC5nZXQoXCJncm91cFwiKS5nZXRNYXRyaXgoKTtyZXR1cm4gbnx8KG49WzEsMCwwLDAsMSwwLDAsMCwxXSksQSh7eDp0LHk6ZX0sbil9LHQucHJvdG90eXBlLmdldFBvaW50QnlDbGllbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdyYXBoLmdldChcImNhbnZhc1wiKS5nZXRQb2ludEJ5Q2xpZW50KHQsZSk7cmV0dXJuIHRoaXMuZ2V0UG9pbnRCeUNhbnZhcyhuLngsbi55KX0sdC5wcm90b3R5cGUuZ2V0Q2xpZW50QnlQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ3JhcGguZ2V0KFwiY2FudmFzXCIpLHI9dGhpcy5nZXRDYW52YXNCeVBvaW50KHQsZSksaT1uLmdldENsaWVudEJ5UG9pbnQoci54LHIueSk7cmV0dXJue3g6aS54LHk6aS55fX0sdC5wcm90b3R5cGUuZ2V0Q2FudmFzQnlQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ3JhcGguZ2V0KFwiZ3JvdXBcIikuZ2V0TWF0cml4KCk7cmV0dXJuIG58fChuPVsxLDAsMCwwLDEsMCwwLDAsMV0pLE0oe3g6dCx5OmV9LG4pfSx0LnByb3RvdHlwZS5mb2N1cz1mdW5jdGlvbih0LGUsbil7T2JqZWN0KGgueCkodCkmJih0PXRoaXMuZ3JhcGguZmluZEJ5SWQodCkpO3ZhciByPXQuZ2V0KFwiZ3JvdXBcIikuZ2V0TWF0cml4KCk7cnx8KHI9WzEsMCwwLDAsMSwwLDAsMCwxXSksdCYmdGhpcy5mb2N1c1BvaW50KHt4OnJbNl0seTpyWzddfSxlLG4pfSx0LnByb3RvdHlwZS5jaGFuZ2VTaXplPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5ncmFwaDtpZighT2JqZWN0KGgudCkodCl8fCFPYmplY3QoaC50KShlKSl0aHJvdyBFcnJvcihcImludmFsaWQgY2FudmFzIHdpZHRoICYgaGVpZ2h0LCBwbGVhc2UgbWFrZSBzdXJlIHdpZHRoICYgaGVpZ2h0IHR5cGUgaXMgbnVtYmVyXCIpO24uc2V0KHt3aWR0aDp0LGhlaWdodDplfSksbi5nZXQoXCJjYW52YXNcIikuY2hhbmdlU2l6ZSh0LGUpLG4uZ2V0KFwicGx1Z2luc1wiKS5mb3JFYWNoKChmdW5jdGlvbihyKXtpZihyLmdldChcImdyaWRDb250YWluZXJcIikpe3ZhciBpPW4uZ2V0KFwibWluWm9vbVwiKTt2dChyLmdldChcImNvbnRhaW5lclwiKSx7d2lkdGg6dCtcInB4XCIsaGVpZ2h0OmUrXCJweFwifSksdnQoci5nZXQoXCJncmlkQ29udGFpbmVyXCIpLHt3aWR0aDp0L2krXCJweFwiLGhlaWdodDplL2krXCJweFwiLGxlZnQ6MCx0b3A6MH0pfX0pKX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZ3JhcGg9bnVsbCx0aGlzLmRlc3Ryb3llZD0hMX0sdH0oKSxrdD17XCIgXCI6LjMzMjk5ODY1NzIyNjU2MjUsYTouNTU4OTk5NjMzNzg5MDYyNSxBOi42NTY5OTkyMDY1NDI5Njg3LGI6LjU4NTk5ODUzNTE1NjI1LEI6LjY3Njk5ODkwMTM2NzE4NzUsYzouNTQ2OTk4NTk2MTkxNDA2MixDOi43Mjc5OTk4Nzc5Mjk2ODc1LGQ6LjU4NTk5ODUzNTE1NjI1LEQ6LjcwNTk5OTc1NTg1OTM3NSxlOi41NTQ5OTg3NzkyOTY4NzUsRTouNjM2OTk5NTExNzE4NzUsZjouMzcyOTk5NTcyNzUzOTA2MjcsRjouNTc2OTk4OTAxMzY3MTg3NSxnOi41OTA5OTg4NDAzMzIwMzEyLEc6Ljc0Nzk5OTU3Mjc1MzkwNjMsaDouNTU1OTk5NzU1ODU5Mzc1LEg6LjcxOTk5OTY5NDgyNDIxODgsaTouMjU1OTk5NzU1ODU5Mzc1LEk6LjIzNjk5OTUxMTcxODc1LGo6LjI2Njk5OTgxNjg5NDUzMTIzLEo6LjUxNjk5OTgxNjg5NDUzMTIsazouNTI4OTk5MzI4NjEzMjgxMixLOi42ODk5OTkzODk2NDg0Mzc1LGw6LjIzNDk5OTA4NDQ3MjY1NjI0LEw6LjU4Nzk5ODk2MjQwMjM0MzcsbTouODU0OTk4Nzc5Mjk2ODc1LE06Ljg4MTk5OTIwNjU0Mjk2ODcsbjouNTU4OTk5NjMzNzg5MDYyNSxOOi43MTg5OTg3MTgyNjE3MTg4LG86LjU4NTk5ODUzNTE1NjI1LE86Ljc2Njk5OTgxNjg5NDUzMTIscDouNTg1OTk4NTM1MTU2MjUsUDouNjQxOTk5ODE2ODk0NTMxMixxOi41ODU5OTg1MzUxNTYyNSxROi43NjY5OTk4MTY4OTQ1MzEyLHI6LjM2NDk5OTM4OTY0ODQzNzUsUjouNjc1OTk5NDUwNjgzNTkzOCxzOi41MDQ5OTg3NzkyOTY4NzUsUzouNjMxOTk5MjA2NTQyOTY4Nyx0Oi4zNTQ5OTg3NzkyOTY4NzUsVDouNjE4OTk4NzE4MjYxNzE4Nyx1Oi41NTk5OTkwODQ0NzI2NTYyLFU6LjcxMzk5OTkzODk2NDg0MzcsdjouNDgxOTk5MjA2NTQyOTY4NzQsVjouNjM4OTk5OTM4OTY0ODQzOCx3Oi43NTQ5OTg3NzkyOTY4NzUsVzouOTI5OTk4Nzc5Mjk2ODc1LHg6LjUwODk5OTYzMzc4OTA2MjUsWDouNjM2OTk5NTExNzE4NzUseTouNDk1OTk5MTQ1NTA3ODEyNSxZOi42NjE5OTk1MTE3MTg3NSx6Oi40ODY5OTk1MTE3MTg3NSxaOi42MjM5OTkwMjM0Mzc1LDA6LjYsMTouNDAwOTk5NDUwNjgzNTkzNzcsMjouNiwzOi42LDQ6LjYsNTouNiw2Oi42LDc6LjU0Njk5ODU5NjE5MTQwNjIsODouNiw5Oi42LFwiW1wiOi4zMzI5OTg2NTcyMjY1NjI1LFwiXVwiOi4zMzI5OTg2NTcyMjY1NjI1LFwiLFwiOi4yNjM5OTk5Mzg5NjQ4NDM3NSxcIi5cIjouMjYzOTk5OTM4OTY0ODQzNzUsXCI7XCI6LjI2Mzk5OTkzODk2NDg0Mzc1LFwiOlwiOi4yNjM5OTk5Mzg5NjQ4NDM3NSxcIntcIjouMzMyOTk4NjU3MjI2NTYyNSxcIn1cIjouMzMyOTk4NjU3MjI2NTYyNSxcIlxcXFxcIjouNSxcInxcIjouMTk0OTk5Njk0ODI0MjE4NzUsXCI9XCI6LjYwNDk5ODc3OTI5Njg3NSxcIitcIjouNjA0OTk4Nzc5Mjk2ODc1LFwiLVwiOi42MDQ5OTg3NzkyOTY4NzUsXzouNSxcImBcIjouMzMyOTk4NjU3MjI2NTYyNSxcIiB+XCI6LjgzMjk5ODY1NzIyNjU2MjUsXCIhXCI6LjMzMjk5ODY1NzIyNjU2MjUsXCJAXCI6Ljg1Nzk5ODY1NzIyNjU2MjUsXCIjXCI6LjYsJDouNixcIiVcIjouOTY5OTk5Njk0ODI0MjE4OCxcIl5cIjouNTE3OTk5MjY3NTc4MTI1LFwiJlwiOi43MjU5OTk0NTA2ODM1OTM3LFwiKlwiOi41MDU5OTk3NTU4NTkzNzUsXCIoXCI6LjMzMjk5ODY1NzIyNjU2MjUsXCIpXCI6LjMzMjk5ODY1NzIyNjU2MjUsXCI8XCI6LjYwNDk5ODc3OTI5Njg3NSxcIj5cIjouNjA0OTk4Nzc5Mjk2ODc1LFwiL1wiOi41LFwiP1wiOi41MzY5OTk1MTE3MTg3NX0sTXQ9TWF0aC5QSSxBdD1NYXRoLnNpbixUdD1NYXRoLmNvcyxDdD1BdChNdC84KSxJdD1UdChNdC84KSxQdD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0QkJveCgpLHI9e3g6bi5taW5YLHk6bi5taW5ZfSxpPXt4Om4ubWF4WCx5Om4ubWF4WX07aWYoZSl7dmFyIG89ZS5nZXRNYXRyaXgoKTtvfHwobz1bMSwwLDAsMCwxLDAsMCwwLDFdKSxyPU0ocixvKSxpPU0oaSxvKX12YXIgYT1yLngscz1yLnksdT1pLngsYz1pLnk7cmV0dXJue3g6YSx5OnMsbWluWDphLG1pblk6cyxtYXhYOnUsbWF4WTpjLHdpZHRoOnUtYSxoZWlnaHQ6Yy1zfX0sanQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5zb3VyY2VOb2RlfHx0LnRhcmdldE5vZGUsbj1lLmdldChcImdyb3VwXCIpLmdldE1hdHJpeCgpO258fChuPVsxLDAsMCwwLDEsMCwwLDAsMV0pO3ZhciByPWUuZ2V0S2V5U2hhcGUoKS5nZXRCQm94KCksaT10Lmxvb3BDZmd8fHt9LG89aS5kaXN0fHwyKk1hdGgubWF4KHIud2lkdGgsci5oZWlnaHQpLGE9aS5wb3NpdGlvbnx8aHQuZGVmYXVsdExvb3BQb3NpdGlvbixzPVtuWzZdLG5bN11dLHU9W3Quc3RhcnRQb2ludC54LHQuc3RhcnRQb2ludC55XSxjPVt0LmVuZFBvaW50LngsdC5lbmRQb2ludC55XSxmPXIuaGVpZ2h0LzIsbD1yLmhlaWdodC8yLGg9ZipDdCxkPWYqSXQscD1sKkN0LGc9bCpJdDtpZih1WzBdPT09Y1swXSYmdVsxXT09PWNbMV0pe3N3aXRjaChhKXtjYXNlXCJ0b3BcIjp1PVtzWzBdLWgsc1sxXS1kXSxjPVtzWzBdK3Asc1sxXS1nXTticmVhaztjYXNlXCJ0b3AtcmlnaHRcIjpmPXIuaGVpZ2h0LzIsbD1yLndpZHRoLzIsdT1bc1swXSsoaD1mKkN0KSxzWzFdLShkPWYqSXQpXSxjPVtzWzBdKyhnPWwqSXQpLHNbMV0tKHA9bCpDdCldO2JyZWFrO2Nhc2VcInJpZ2h0XCI6Zj1yLndpZHRoLzIsbD1yLndpZHRoLzIsdT1bc1swXSsoZD1mKkl0KSxzWzFdLShoPWYqQ3QpXSxjPVtzWzBdKyhnPWwqSXQpLHNbMV0rKHA9bCpDdCldO2JyZWFrO2Nhc2VcImJvdHRvbS1yaWdodFwiOmY9ci53aWR0aC8yLGw9ci5oZWlnaHQvMix1PVtzWzBdKyhkPWYqSXQpLHNbMV0rKGg9ZipDdCldLGM9W3NbMF0rKHA9bCpDdCksc1sxXSsoZz1sKkl0KV07YnJlYWs7Y2FzZVwiYm90dG9tXCI6Zj1yLmhlaWdodC8yLGw9ci5oZWlnaHQvMix1PVtzWzBdKyhoPWYqQ3QpLHNbMV0rKGQ9ZipJdCldLGM9W3NbMF0tKHA9bCpDdCksc1sxXSsoZz1sKkl0KV07YnJlYWs7Y2FzZVwiYm90dG9tLWxlZnRcIjpmPXIuaGVpZ2h0LzIsbD1yLndpZHRoLzIsdT1bc1swXS0oaD1mKkN0KSxzWzFdKyhkPWYqSXQpXSxjPVtzWzBdLShnPWwqSXQpLHNbMV0rKHA9bCpDdCldO2JyZWFrO2Nhc2VcImxlZnRcIjpmPXIud2lkdGgvMixsPXIud2lkdGgvMix1PVtzWzBdLShkPWYqSXQpLHNbMV0rKGg9ZipDdCldLGM9W3NbMF0tKGc9bCpJdCksc1sxXS0ocD1sKkN0KV07YnJlYWs7Y2FzZVwidG9wLWxlZnRcIjpmPXIud2lkdGgvMixsPXIuaGVpZ2h0LzIsdT1bc1swXS0oZD1mKkl0KSxzWzFdLShoPWYqQ3QpXSxjPVtzWzBdLShwPWwqQ3QpLHNbMV0tKGc9bCpJdCldO2JyZWFrO2RlZmF1bHQ6Zj1yLndpZHRoLzIsbD1yLndpZHRoLzIsdT1bc1swXS0oaD1mKkN0KSxzWzFdLShkPWYqSXQpXSxjPVtzWzBdKyhwPWwqQ3QpLHNbMV0tKGc9bCpJdCldfWlmKCExPT09aS5jbG9ja3dpc2Upe3ZhciB2PVt1WzBdLHVbMV1dO3U9W2NbMF0sY1sxXV0sYz1bdlswXSx2WzFdXX19dmFyIHk9W3VbMF0tc1swXSx1WzFdLXNbMV1dLGI9KGYrbykvZix4PShsK28pL2w7ITE9PT1pLmNsb2Nrd2lzZSYmKGI9KGwrbykvbCx4PShmK28pL2YpO3ZhciB3PW0uYy5zY2FsZShbMCwwXSx5LGIpLFM9W3NbMF0rd1swXSxzWzFdK3dbMV1dLEU9W2NbMF0tc1swXSxjWzFdLXNbMV1dLF89bS5jLnNjYWxlKFswLDBdLEUseCksTz1bc1swXStfWzBdLHNbMV0rX1sxXV07cmV0dXJuIHQuc3RhcnRQb2ludD17eDp1WzBdLHk6dVsxXX0sdC5lbmRQb2ludD17eDpjWzBdLHk6Y1sxXX0sdC5jb250cm9sUG9pbnRzPVt7eDpTWzBdLHk6U1sxXX0se3g6T1swXSx5Ok9bMV19XSx0fSxEdD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPVtdLGE9dC5nZXRQb2ludChlKTtpZihudWxsPT09YSlyZXR1cm57eDowLHk6MCxhbmdsZTowfTtpZihlPDFlLTQpbz10LmdldFN0YXJ0VGFuZ2VudCgpLnJldmVyc2UoKTtlbHNlIGlmKGU+Ljk5OTkpbz10LmdldEVuZFRhbmdlbnQoKTtlbHNle3ZhciBzPXQuZ2V0UG9pbnQoZSsxZS00KTtvLnB1c2goW2EueCxhLnldKSxvLnB1c2goW3MueCxzLnldKX12YXIgdT1NYXRoLmF0YW4yKG9bMV1bMV0tb1swXVsxXSxvWzFdWzBdLW9bMF1bMF0pO2lmKHU8MCYmKHUrPTIqTXQpLG4mJihhLngrPVR0KHUpKm4sYS55Kz1BdCh1KSpuKSxyKXt2YXIgYz11LU10LzI7dT4uNSpNdCYmdTwxLjUqTXQmJihjLT1NdCksYS54Kz1UdChjKSpyLGEueSs9QXQoYykqcn12YXIgZj17eDphLngseTphLnksYW5nbGU6dX07cmV0dXJuIGk/KHU+LjUqTXQmJnU8MS41Kk10JiYodS09TXQpLE9iamVjdCh2LmEpKHtyb3RhdGU6dX0sZikpOmZ9LE50PWZ1bmN0aW9uIHQoZSxuKXtpZighMT09PW4oZSkpcmV0dXJuITE7aWYoZSYmZS5jaGlsZHJlbilmb3IodmFyIHI9ZS5jaGlsZHJlbi5sZW5ndGgtMTtyPj0wO3ItLSlpZighdChlLmNoaWxkcmVuW3JdLG4pKXJldHVybiExO3JldHVybiEwfSxSdD1mdW5jdGlvbih0LGUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGUmJk50KHQsZSl9LEx0PWZ1bmN0aW9uKHQsZSl7XCJmdW5jdGlvblwiPT10eXBlb2YgZSYmZnVuY3Rpb24gdChlLG4pe2lmKGUmJmUuY2hpbGRyZW4pZm9yKHZhciByPWUuY2hpbGRyZW4ubGVuZ3RoLTE7cj49MDtyLS0paWYoIXQoZS5jaGlsZHJlbltyXSxuKSlyZXR1cm47cmV0dXJuITEhPT1uKGUpfSh0LGUpfSxCdD1mdW5jdGlvbih0LGUpe3JldHVybiBlKihrdFt0XXx8MSl9LEd0PWZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPW5ldyBSZWdFeHAoXCJbw6TCuOKCrC3DqcK+wqVdK1wiKTtyZXR1cm4gdC5zcGxpdChcIlwiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyLnRlc3QodCk/bis9ZTpuKz1CdCh0LGUpfSkpLFtuLGVdfSxGdD1mdW5jdGlvbih0LGUpe3ZhciBuPVtdLHI9e30saT17fTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lbdC5pZF09dH0pKSx0LmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIG89T2JqZWN0KGguYykodCk7by5pdGVtVHlwZT1cImNvbWJvXCIsby5jaGlsZHJlbj12b2lkIDAsby5wYXJlbnRJZD09PW8uaWQ/KGNvbnNvbGUud2FybihcIlRoZSBwYXJlbnRJZCBmb3IgY29tYm8gXCIrby5pZCtcIiBjYW4gbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBjb21ibydzIGlkXCIpLGRlbGV0ZSBvLnBhcmVudElkKTpvLnBhcmVudElkJiYhaVtvLnBhcmVudElkXSYmKGNvbnNvbGUud2FybihcIlRoZSBwYXJlbnQgY29tYm8gZm9yIGNvbWJvIFwiK28uaWQrXCIgZG9lcyBub3QgZXhpc3QhXCIpLGRlbGV0ZSBvLnBhcmVudElkKTt2YXIgYT1yW28uaWRdO2lmKGEpe2lmKG8uY2hpbGRyZW49YS5jaGlsZHJlbixyW28uaWRdPW8sIShhPW8pLnBhcmVudElkKXJldHVybiB2b2lkIG4ucHVzaChhKTt2YXIgcz1yW2EucGFyZW50SWRdO2lmKHMpcy5jaGlsZHJlbj9zLmNoaWxkcmVuLnB1c2gobyk6cy5jaGlsZHJlbj1bb107ZWxzZXt2YXIgdT17aWQ6YS5wYXJlbnRJZCxjaGlsZHJlbjpbYV19O3JbYS5wYXJlbnRJZF09dSxyW28uaWRdPW99fWVsc2UgaWYoT2JqZWN0KGgueCkodC5wYXJlbnRJZCkpe3ZhciBjPXJbdC5wYXJlbnRJZF07aWYoYyljLmNoaWxkcmVuP2MuY2hpbGRyZW4ucHVzaChvKTpjLmNoaWxkcmVuPVtvXSxyW28uaWRdPW87ZWxzZXt2YXIgZj17aWQ6dC5wYXJlbnRJZCxjaGlsZHJlbjpbb119O3JbZi5pZF09ZixyW28uaWRdPW99fWVsc2Ugbi5wdXNoKG8pLHJbby5pZF09b30pKTt2YXIgbz17fTsoZXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKHQpe29bdC5pZF09dDt2YXIgZT1yW3QuY29tYm9JZF07aWYoZSl7dmFyIG49e2lkOnQuaWQsY29tYm9JZDp0LmNvbWJvSWR9O2UuY2hpbGRyZW4/ZS5jaGlsZHJlbi5wdXNoKG4pOmUuY2hpbGRyZW49W25dLG4uaXRlbVR5cGU9XCJub2RlXCIsclt0LmlkXT1ufX0pKTt2YXIgYT0wO3JldHVybiBuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZGVwdGg9YSsxMCxOdCh0LChmdW5jdGlvbih0KXt2YXIgZSxuPXJbdC5pZF0uaXRlbVR5cGU7ZT1cIm5vZGVcIj09PW4/clt0LmNvbWJvSWRdOnJbdC5wYXJlbnRJZF0sdC5kZXB0aD1lJiZcIm5vZGVcIj09PW4/YSsxOmErMTAsYTx0LmRlcHRoJiYoYT10LmRlcHRoKTt2YXIgaT1vW3QuaWRdO3JldHVybiBpJiYoaS5kZXB0aD10LmRlcHRoKSwhMH0pKX0pKSxufSxVdD1mdW5jdGlvbih0LGUsbil7dmFyIHIsaT10LG89e3Jvb3Q6e2NoaWxkcmVuOnR9fSxhPSExLHM9XCJyb290XCI7KHR8fFtdKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighYSlyZXR1cm4gdC5pZD09PWU/KHI9dCxcImNvbWJvXCI9PT10Lml0ZW1UeXBlP3IucGFyZW50SWQ9bjpyLmNvbWJvSWQ9bix2b2lkKGE9ITApKTp2b2lkIFJ0KHQsKGZ1bmN0aW9uKHQpe3JldHVybiBvW3QuaWRdPXtjaGlsZHJlbjp0LmNoaWxkcmVufSxpPW9bdC5wYXJlbnRJZHx8dC5jb21ib0lkfHxcInJvb3RcIl0uY2hpbGRyZW4sIXR8fCF0LnJlbW92ZWQmJmUhPT10LmlkfHwhaXx8KHM9dC5wYXJlbnRJZHx8dC5jb21ib0lkfHxcInJvb3RcIixyPXQsXCJjb21ib1wiPT09dC5pdGVtVHlwZT9yLnBhcmVudElkPW46ci5jb21ib0lkPW4sYT0hMCwhMSl9KSl9KSk7dmFyIHU9KGk9b1tzXS5jaGlsZHJlbik/aS5pbmRleE9mKHIpOi0xO2lmKHU+LTEmJmkuc3BsaWNlKHUsMSksYXx8KHI9e2lkOmUsaXRlbVR5cGU6XCJub2RlXCIsY29tYm9JZDpufSxvW2VdPXtjaGlsZHJlbjp2b2lkIDB9KSxlKXt2YXIgYz0hMTtpZihuKXt2YXIgZj0wOyh0fHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7Y3x8UnQodCwoZnVuY3Rpb24odCl7cmV0dXJuIG4hPT10LmlkfHwoYz0hMCx0LmNoaWxkcmVuP3QuY2hpbGRyZW4ucHVzaChyKTp0LmNoaWxkcmVuPVtyXSxmPXQuZGVwdGgsXCJub2RlXCI9PT1yLml0ZW1UeXBlP3IuZGVwdGg9ZisyOnIuZGVwdGg9ZisxLCExKX0pKX0pKX1lbHNlIG4mJmN8fFwibm9kZVwiPT09ci5pdGVtVHlwZXx8dC5wdXNoKHIpO3ZhciBsPXIuZGVwdGg7UnQociwoZnVuY3Rpb24odCl7cmV0dXJuXCJub2RlXCI9PT10Lml0ZW1UeXBlP2wrPTI6bCs9MSx0LmRlcHRoPWwsITB9KSl9cmV0dXJuIHR9LHp0PWZ1bmN0aW9uKHQsZSl7dmFyIG49e21pblg6MS8wLG1pblk6MS8wLG1heFg6LTEvMCxtYXhZOi0xLzAseDp2b2lkIDAseTp2b2lkIDAsd2lkdGg6dm9pZCAwLGhlaWdodDp2b2lkIDAsY2VudGVyWDp2b2lkIDAsY2VudGVyWTp2b2lkIDB9O3JldHVybiB0JiYwIT09dC5sZW5ndGg/KHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9ZS5maW5kQnlJZCh0LmlkKTtpZihyJiZyLmlzVmlzaWJsZSgpKXtyLnNldChcImJib3hDYW52YXNDYWNoZVwiLHZvaWQgMCk7dmFyIGk9ci5nZXRDYW52YXNCQm94KCk7aS54JiZuLm1pblg+aS5taW5YJiYobi5taW5YPWkubWluWCksaS55JiZuLm1pblk+aS5taW5ZJiYobi5taW5ZPWkubWluWSksaS54JiZuLm1heFg8aS5tYXhYJiYobi5tYXhYPWkubWF4WCksaS55JiZuLm1heFk8aS5tYXhZJiYobi5tYXhZPWkubWF4WSl9fSkpLG4ueD0obi5taW5YK24ubWF4WCkvMixuLnk9KG4ubWluWStuLm1heFkpLzIsbi53aWR0aD1uLm1heFgtbi5taW5YLG4uaGVpZ2h0PW4ubWF4WS1uLm1pblksbi5jZW50ZXJYPShuLm1pblgrbi5tYXhYKS8yLG4uY2VudGVyWT0obi5taW5ZK24ubWF4WSkvMixPYmplY3Qua2V5cyhuKS5mb3JFYWNoKChmdW5jdGlvbih0KXtuW3RdIT09MS8wJiZuW3RdIT09LTEvMHx8KG5bdF09dm9pZCAwKX0pKSxuKTpufSxWdD1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3QoaC50KSh0LngpfHxPYmplY3QoaC50KSh0LnkpfHx0LnR5cGV8fHQuYW5jaG9yUG9pbnRzfHx0LnNpemU7cmV0dXJuIHQuc3R5bGUmJihlPWV8fE9iamVjdChoLnQpKHQuc3R5bGUucil8fE9iamVjdChoLnQpKHQuc3R5bGUud2lkdGgpfHxPYmplY3QoaC50KSh0LnN0eWxlLmhlaWdodCl8fE9iamVjdChoLnQpKHQuc3R5bGUucngpfHxPYmplY3QoaC50KSh0LnN0eWxlLnJ5KSksZX0sV3Q9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPXRbbl07aWYoT2JqZWN0KGgudikocikpe3ZhciBpPXt9O09iamVjdC5rZXlzKHIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXJbdF07KFwiaW1nXCIhPT10fHxPYmplY3QoaC54KShlKSkmJihpW3RdPU9iamVjdChoLmMpKGUpKX0pKSxlW25dPWl9ZWxzZSBlW25dPU9iamVjdChoLmMpKHIpfSkpLGV9O2Z1bmN0aW9uIFh0KHQpe3JldHVybihYdD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gWXQodCl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpcmV0dXJuIHQ7dmFyIGU9ZnVuY3Rpb24odCl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpcmV0dXJuIHQ7dHJ5e3JldHVybiBKU09OLnBhcnNlKHQudHJpbSgpKX1jYXRjaChlKXtyZXR1cm4gdC50cmltKCl9fSxuPWUodCk7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIG4pcmV0dXJuIG47Zm9yKHZhciByPWZ1bmN0aW9uKHQpe3JldHVybiB0W3QubGVuZ3RoLTFdfSxpPXQudHJpbSgpLG89W10sYT1bXSxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3JldHVybiB0LnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiByKGEpPT09dH0pKX0sdT1udWxsLGM9MCxmPVwiXCI7YzxpLmxlbmd0aDspe3ZhciBsPWlbY10saD1zKCdcIicsXCInXCIpO2lmKGh8fGwudHJpbSgpKXt2YXIgZD1cIlxcXFxcIj09PWlbYy0xXSxwPXMoXCJ9XCIpLGc9cyhcIl1cIiksdj1zKFwiLFwiKSx5PXIobyk7aWYoaClpZihyKGEpIT09bHx8ZClmKz1sO2Vsc2V7YS5wb3AoKTt2YXIgbT1lKGYpO3kucHVzaChtKSx1PW0sZj1cIlwifWVsc2UgaWYoZyYmXCIsXCI9PT1sKWYmJih5LnB1c2goZShmKSksZj1cIlwiKTtlbHNlIGlmKHAmJlwiOlwiPT09bClhLnB1c2goXCIsXCIpLGYmJih5LnB1c2goZiksZj1cIlwiKTtlbHNlIGlmKHYmJlwiLFwiPT09bClmJiYoeS5wdXNoKGUoZikpLGY9XCJcIiksYS5wb3AoKTtlbHNlIGlmKFwifVwiPT09bCYmKHB8fHYpKXtmJiYoeS5wdXNoKGUoZikpLGY9XCJcIiksdiYmYS5wb3AoKTtmb3IodmFyIGI9e30seD0xO3g8eS5sZW5ndGg7eCs9MiliW3lbeC0xXV09eVt4XTtvLnBvcCgpLG8ubGVuZ3RoJiZyKG8pLnB1c2goYiksYS5wb3AoKSx1PWJ9ZWxzZVwiXVwiPT09bCYmZz8oZiYmKHkucHVzaChlKGYpKSxmPVwiXCIpLG8ucG9wKCksby5sZW5ndGgmJnIobykucHVzaCh5KSxhLnBvcCgpLHU9eSk6XCJ7XCI9PT1sPyhvLnB1c2goW10pLGEucHVzaChcIn1cIikpOlwiW1wiPT09bD8oby5wdXNoKFtdKSxhLnB1c2goXCJdXCIpKTonXCInPT09bD9hLnB1c2goJ1wiJyk6XCInXCI9PT1sP2EucHVzaChcIidcIik6Zis9bDtjKz0xfWVsc2UgYys9MX1yZXR1cm4gdXx8Zn1mdW5jdGlvbiBIdCh0LGUpe3ZhciBuO3ZvaWQgMD09PWUmJihlPXt4OjAseTowfSk7dmFyIHI9T2JqZWN0KHYuYSkoe3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH0sZSk7aWYobnVsbD09PShuPXQuY2hpbGRyZW4pfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmxlbmd0aCl7dmFyIGk9dC5hdHRycyxvPXZvaWQgMD09PWk/e306aSxhPW8ubWFyZ2luVG9wLHM9T2JqZWN0KHYuYSkoe30sZSk7YSYmKHMueSs9YSk7Zm9yKHZhciB1PTA7dTx0LmNoaWxkcmVuLmxlbmd0aDt1Kyspe3QuY2hpbGRyZW5bdV0uYXR0cnMua2V5PShvLmtleXx8XCJyb290XCIpK1wiIC1cIit1K1wiIFwiO3ZhciBjPUh0KHQuY2hpbGRyZW5bdV0scyk7aWYoYy5iYm94KXt2YXIgZj1jLmJib3g7XCJpbmxpbmVcIj09PWMuYXR0cnMubmV4dD9zLngrPWMuYmJveC53aWR0aDpzLnkrPWMuYmJveC5oZWlnaHQsZi53aWR0aCtmLng+ci53aWR0aCYmKHIud2lkdGg9Zi53aWR0aCtmLngpLGYuaGVpZ2h0K2YueT5yLmhlaWdodCYmKHIuaGVpZ2h0PWYuaGVpZ2h0K2YueSl9fX1yZXR1cm4gdC5iYm94PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpLG89dC5hdHRycyxhPXZvaWQgMD09PW8/e306byxzPXt4OmUueHx8MCx5OmUueXx8MCx3aWR0aDpuLndpZHRofHwwLGhlaWdodDpuLmhlaWdodHx8MH07c3dpdGNoKHQudHlwZSl7Y2FzZVwibWFrZXJcIjpjYXNlXCJjaXJjbGVcIjphLnImJihpPTIqYS5yLHI9MiphLnIpO2JyZWFrO2Nhc2VcInRleHRcIjphLnRleHQmJihpPUd0KGEudGV4dCxhLmZvbnRTaXplfHwxMilbMF0scj0xNixzLnkrPXIscy5oZWlnaHQ9cixzLndpZHRoPWksdC5hdHRycz1PYmplY3Qodi5hKSh7Zm9udFNpemU6MTIsZmlsbDpcIiMwMDBcIn0sYSkpO2JyZWFrO2RlZmF1bHQ6YS53aWR0aCYmKGk9YS53aWR0aCksYS5oZWlnaHQmJihyPWEuaGVpZ2h0KX1yZXR1cm4gcj49MCYmKHMuaGVpZ2h0PXIpLGk+PTAmJihzLndpZHRoPWkpLGEubWFyZ2luVG9wJiYocy55Kz1hLm1hcmdpblRvcCksYS5tYXJnaW5MZWZ0JiYocy54Kz1hLm1hcmdpbkxlZnQpLHN9KHQsZSxyKSx0LmF0dHJzPU9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LHQuYXR0cnMpLHQuYmJveCksdH1mdW5jdGlvbiBxdCh0KXt2YXIgZT17fSxuPWZ1bmN0aW9uKGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIG49dC5sZW5ndGgscj1bXSxpPTAsbz1cIlwiO2k8bjspaWYoXCJ7XCI9PT10W2ldJiZcIntcIj09PXRbaSsxXSlyLnB1c2gobyksbz1cIlwiLGkrPTI7ZWxzZSBpZihcIn1cIj09PXRbaV0mJlwifVwiPT09dFtpKzFdKXtpZihyLmxlbmd0aCl7dmFyIGE9ci5wb3AoKTtvPU9iamVjdChoLmkpKGUsbyxhLmVuZHNXaXRoKFwiPVwiKT8nXCJ7JytvKyd9XCInOm8pLHIucHVzaChhK28pfWkrPTIsbz1cIlwifWVsc2Ugbys9dFtpXSxpKz0xO3JldHVybiByLnB1c2gobyksci5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHJbZS0xXSYmcltlLTFdLmVuZHNXaXRoKFwiPVwiKT8nXCJ7Jyt0Kyd9XCInOnR9KSkuam9pbihcIlwiKX19KFwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dChlKTp0KShlKSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ci5pbm5lckhUTUw9bjt2YXIgaT1IdChmdW5jdGlvbiB0KGUsbil7dmFyIHI9e30saT1lLmdldEF0dHJpYnV0ZU5hbWVzJiZlLmdldEF0dHJpYnV0ZU5hbWVzKCl8fFtdLG89ZS5jaGlsZHJlbiYmQXJyYXkuZnJvbShlLmNoaWxkcmVuKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUsbil9KSksYT17fSxzPWUudGFnTmFtZT9lLnRhZ05hbWUudG9Mb3dlckNhc2UoKTpcImdyb3VwXCI7cmV0dXJuXCJ0ZXh0XCI9PT1zJiYoci50ZXh0PWUuaW5uZXJUZXh0KSxhLnR5cGU9cyxcImltZ1wiPT09cyYmKGEudHlwZT1cImltYWdlXCIpLEFycmF5LmZyb20oaSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC5zcGxpdChcIi1cIikucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pKSxpPWUuZ2V0QXR0cmlidXRlKHQpO3RyeXtpZihcInN0eWxlXCI9PT1ufHxcImF0dHJzXCI9PT1uKXt2YXIgbz1ZdChpKTtyPU9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LHIpLG8pfWVsc2UgYVtuXT1ZdChpKX1jYXRjaCh0KXtpZihcInN0eWxlXCI9PT1uKXRocm93IHQ7YVtuXT1pfX0pKSxhLmF0dHJzPXIsbiYmbi5zdHlsZSYmYS5uYW1lJiZcIm9iamVjdFwiPT09WHQobi5zdHlsZVthLm5hbWVdKSYmKGEuYXR0cnM9T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sYS5hdHRycyksbi5zdHlsZVthLm5hbWVdKSksbiYmbi5zdHlsZSYmYS5rZXlzaGFwZSYmKGEuYXR0cnM9T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sYS5hdHRycyksbi5zdHlsZSkpLG8ubGVuZ3RoJiYoYS5jaGlsZHJlbj1vKSxhfShyLmNoaWxkcmVuWzBdLGUpKTtyZXR1cm4gci5yZW1vdmUoKSxpfTtyZXR1cm57ZHJhdzpmdW5jdGlvbih0LHIpe3ZhciBpPW4odCksbz1yO3JldHVybiBmdW5jdGlvbiB0KGUpe3ZhciBuPWUuYXR0cnMsaT12b2lkIDA9PT1uP3t9Om4sYT1lLmJib3gscz1lLnR5cGUsdT1lLmNoaWxkcmVuLGM9T2JqZWN0KHYuYykoZSxbXCJhdHRyc1wiLFwiYmJveFwiLFwidHlwZVwiLFwiY2hpbGRyZW5cIl0pO2lmKFwiZ3JvdXBcIiE9PWUudHlwZSl7dmFyIGY9ci5hZGRTaGFwZShlLnR5cGUsT2JqZWN0KHYuYSkoe2F0dHJzOmksb3JpZ2luOntiYm94OmEsdHlwZTpzLGNoaWxkcmVuOnV9fSxjKSk7ZS5rZXlzaGFwZSYmKG89Zil9ZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdChlKX0pKX0oaSksZVt0LmlkXT1baV0sb30sdXBkYXRlOmZ1bmN0aW9uKHQscil7ZVt0LmlkXXx8KGVbdC5pZF09W10pO3ZhciBpPXIuZ2V0Q29udGFpbmVyKCksbz1pLmdldChcImNoaWxkcmVuXCIpLGE9bih0KSxzPWZ1bmN0aW9uIHQoZSxuKXt2YXIgcixpLG8sYSxzPShlfHx7fSkudHlwZSx1PSgobnVsbD09bj92b2lkIDA6bi5hdHRycyl8fHt9KS5rZXk7aWYodSYmZSYmKGUuYXR0cnMua2V5PXUpLCFlJiZuKXJldHVybnthY3Rpb246XCJkZWxldGVcIix2YWw6bix0eXBlOnMsa2V5OnV9O2lmKGUmJiFuKXJldHVybnthY3Rpb246XCJhZGRcIix2YWw6ZSx0eXBlOnN9O2lmKCFlJiYhbilyZXR1cm57YWN0aW9uOlwic2FtZVwiLHR5cGU6c307dmFyIGM9W107aWYoKG51bGw9PT0ocj1lLmNoaWxkcmVuKXx8dm9pZCAwPT09cj92b2lkIDA6ci5sZW5ndGgpPjB8fChudWxsPT09KGk9bi5jaGlsZHJlbil8fHZvaWQgMD09PWk/dm9pZCAwOmkubGVuZ3RoKT4wKWZvcih2YXIgZj1NYXRoLm1heChudWxsPT09KG89ZS5jaGlsZHJlbil8fHZvaWQgMD09PW8/dm9pZCAwOm8ubGVuZ3RoLG51bGw9PT0oYT1uLmNoaWxkcmVuKXx8dm9pZCAwPT09YT92b2lkIDA6YS5sZW5ndGgpLGw9bi5jaGlsZHJlbnx8W10saD1lLmNoaWxkcmVufHxbXSxkPTA7ZDxmO2QrPTEpYy5wdXNoKHQoaFtkXSxsW2RdKSk7dmFyIHA9T2JqZWN0LmtleXMobi5hdHRycyksZz1PYmplY3Qua2V5cyhlLmF0dHJzKTtyZXR1cm4gbi50eXBlIT09ZS50eXBlP3thY3Rpb246XCJyZXN0cnVjdHVyZVwiLG5vd1RhcmdldDplLGZvcm1lclRhcmdldDpuLGtleTp1LGNoaWxkcmVuOmN9OnAuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm5cImNoaWxkcmVuXCIhPT10fSkpLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmF0dHJzW3RdIT09bi5hdHRyc1t0XXx8IWcuaW5jbHVkZXModCl9KSk/e2FjdGlvbjpcImNoYW5nZVwiLHZhbDplLGNoaWxkcmVuOmMsdHlwZTpzLGtleTp1fTp7YWN0aW9uOlwic2FtZVwiLGNoaWxkcmVuOmMsdHlwZTpzLGtleTp1fX0oYSxlW3QuaWRdLnBvcCgpKSx1PWZ1bmN0aW9uIHQoZSl7dmFyIG47XCJncm91cFwiIT09ZS50eXBlJiZpLmFkZFNoYXBlKGUudHlwZSx7YXR0cnM6ZS5hdHRyc30pLChudWxsPT09KG49ZS5jaGlsZHJlbil8fHZvaWQgMD09PW4/dm9pZCAwOm4ubGVuZ3RoKSYmZS5jaGlsZHJlbi5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfSkpfSxjPWZ1bmN0aW9uIHQoZSl7dmFyIG4scj1vLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmF0dHJzLmtleT09PWUuYXR0cnMua2V5fSkpO3ImJmkucmVtb3ZlQ2hpbGQociksKG51bGw9PT0obj1lLmNoaWxkcmVuKXx8dm9pZCAwPT09bj92b2lkIDA6bi5sZW5ndGgpJiZlLmNoaWxkcmVuLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9KSl9OyFmdW5jdGlvbiB0KGUpe3ZhciBuPWUua2V5O2lmKFwiZ3JvdXBcIiE9PWUudHlwZSl7dmFyIGk9by5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gdC5hdHRycy5rZXk9PT1ufSkpO3N3aXRjaChlLmFjdGlvbil7Y2FzZVwiY2hhbmdlXCI6aWYoaSl7dmFyIGE9ZS52YWwua2V5c2hhcGU/ci5nZXRPcmlnaW5TdHlsZSgpOnt9O2kuYXR0cihPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxhKSxlLnZhbC5hdHRycykpfWJyZWFrO2Nhc2VcImFkZFwiOnUoZS52YWwpO2JyZWFrO2Nhc2VcImRlbGV0ZVwiOmMoZS52YWwpO2JyZWFrO2Nhc2VcInJlc3RydWN0dXJlXCI6YyhlLmZvcm1lclRhcmdldCksdShlLm5vd1RhcmdldCl9fWUuY2hpbGRyZW4mJmUuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9KSl9KHMpLGVbdC5pZF0ucHVzaChhKX0sZ2V0QW5jaG9yUG9pbnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1swLC41XSxbMSwuNV0sWy41LDFdLFsuNSwwXV19fX12YXIgS3Q9e307ZnVuY3Rpb24gWnQodCl7cmV0dXJuIEt0W3RdfHwoS3RbdF09T2JqZWN0KGguSSkodCkpLEt0W3RdfXZhciBRdD17ZGVmYXVsdFNoYXBlVHlwZTpcImRlZmF1bHRUeXBlXCIsY2xhc3NOYW1lOm51bGwsZ2V0U2hhcGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbdF18fHRoaXNbdGhpcy5kZWZhdWx0U2hhcGVUeXBlXXx8dGhpc1tcInNpbXBsZS1jaXJjbGVcIl19LGRyYXc6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuZ2V0U2hhcGUodCksaT1yLmRyYXcoZSxuKTtyZXR1cm4gci5hZnRlckRyYXcmJnIuYWZ0ZXJEcmF3KGUsbixpKSxpfSxiYXNlVXBkYXRlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLmdldFNoYXBlKHQpO3IudXBkYXRlJiZyLnVwZGF0ZShlLG4pLHIuYWZ0ZXJVcGRhdGUmJnIuYWZ0ZXJVcGRhdGUoZSxuKX0sc2V0U3RhdGU6ZnVuY3Rpb24odCxlLG4scil7dGhpcy5nZXRTaGFwZSh0KS5zZXRTdGF0ZShlLG4scil9LHNob3VsZFVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuZ2V0U2hhcGUodCkudXBkYXRlfSxnZXRDb250cm9sUG9pbnRzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZ2V0U2hhcGUodCkuZ2V0Q29udHJvbFBvaW50cyhlKX0sZ2V0QW5jaG9yUG9pbnRzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZ2V0U2hhcGUodCkuZ2V0QW5jaG9yUG9pbnRzKGUpfX0sSnQ9e29wdGlvbnM6e30sZHJhdzpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmRyYXdTaGFwZSh0LGUpfSxkcmF3U2hhcGU6ZnVuY3Rpb24oKXt9LGFmdGVyRHJhdzpmdW5jdGlvbigpe30sYWZ0ZXJVcGRhdGU6ZnVuY3Rpb24oKXt9LHNldFN0YXRlOmZ1bmN0aW9uKCl7fSxnZXRDb250cm9sUG9pbnRzOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbnRyb2xQb2ludHN9LGdldEFuY2hvclBvaW50czpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMuYW5jaG9yUG9pbnRzO3JldHVybiB0LmFuY2hvclBvaW50c3x8ZX19LCR0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5yZWdpc3RlckZhY3Rvcnk9ZnVuY3Rpb24oZSxuKXt2YXIgcj1adChlKSxpPVF0LG89T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30saSksbik7cmV0dXJuIHRbcl09byxvLmNsYXNzTmFtZT1yLG99LHQuZ2V0RmFjdG9yeT1mdW5jdGlvbihlKXtyZXR1cm4gdFtadChlKV19LHQucmVnaXN0ZXJOb2RlPWZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvPXQuTm9kZTtpZihcInN0cmluZ1wiPT10eXBlb2Ygbnx8XCJmdW5jdGlvblwiPT10eXBlb2Ygbil7dmFyIGE9cXQobik7aT1PYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxvLmdldFNoYXBlKFwic2luZ2xlLW5vZGVcIikpLGEpfWVsc2UgaWYobi5qc3gpe2E9cXQobi5qc3gpO2k9T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sby5nZXRTaGFwZShcInNpbmdsZS1ub2RlXCIpKSxhKSxuKX1lbHNle28uZ2V0U2hhcGUocik7dmFyIHM9cj9vLmdldFNoYXBlKHIpOkp0O2k9T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30scyksbil9cmV0dXJuIGkudHlwZT1lLGkuaXRlbVR5cGU9XCJub2RlXCIsb1tlXT1pLGl9LHQucmVnaXN0ZXJFZGdlPWZ1bmN0aW9uKGUsbixyKXt2YXIgaT10LkVkZ2Usbz1yP2kuZ2V0U2hhcGUocik6SnQsYT1PYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxvKSxuKTtyZXR1cm4gYS50eXBlPWUsYS5pdGVtVHlwZT1cImVkZ2VcIixpW2VdPWEsYX0sdC5yZWdpc3RlckNvbWJvPWZ1bmN0aW9uKGUsbixyKXt2YXIgaT10LkNvbWJvLG89cj9pLmdldFNoYXBlKHIpOkp0LGE9T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sbyksbik7cmV0dXJuIGEudHlwZT1lLGEuaXRlbVR5cGU9XCJjb21ib1wiLGlbZV09YSxhfSx0fSgpLHRlPSR0OyR0LnJlZ2lzdGVyRmFjdG9yeShcIm5vZGVcIix7ZGVmYXVsdFNoYXBlVHlwZTpcImNpcmNsZVwifSksJHQucmVnaXN0ZXJGYWN0b3J5KFwiZWRnZVwiLHtkZWZhdWx0U2hhcGVUeXBlOlwibGluZVwifSksJHQucmVnaXN0ZXJGYWN0b3J5KFwiY29tYm9cIix7ZGVmYXVsdFNoYXBlVHlwZTpcImNpcmNsZVwifSk7dmFyIGVlPVtcInN0YXJ0QXJyb3dcIixcImVuZEFycm93XCJdLG5lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9jZmc9e30sdGhpcy5kZXN0cm95ZWQ9ITE7dmFyIGU9e2lkOnZvaWQgMCx0eXBlOlwiaXRlbVwiLG1vZGVsOnt9LGdyb3VwOnZvaWQgMCxhbmltYXRlOiExLHZpc2libGU6ITAsbG9ja2VkOiExLGV2ZW50OiEwLGtleVNoYXBlOnZvaWQgMCxzdGF0ZXM6W119O3RoaXMuX2NmZz1PYmplY3QuYXNzaWduKGUsdGhpcy5nZXREZWZhdWx0Q2ZnKCksdCk7dmFyIG49dGhpcy5nZXQoXCJtb2RlbFwiKSxyPW4uaWQsaT10aGlzLmdldChcInR5cGVcIik7cnx8KHI9bXQoaSksdGhpcy5nZXQoXCJtb2RlbFwiKS5pZD1yKSx0aGlzLnNldChcImlkXCIscik7dmFyIG89dC5ncm91cDtvJiYoby5zZXQoXCJpdGVtXCIsdGhpcyksby5zZXQoXCJpZFwiLHIpKSx0aGlzLmluaXQoKSx0aGlzLmRyYXcoKTt2YXIgYT1uLnNoYXBlfHxuLnR5cGV8fChcImVkZ2VcIj09PWk/XCJsaW5lXCI6XCJjaXJjbGVcIikscz10aGlzLmdldChcInNoYXBlRmFjdG9yeVwiKTtpZihzJiZzW2FdKXt2YXIgdT1zW2FdLm9wdGlvbnM7aWYodSYmdS5zdGF0ZVN0eWxlcyl7dmFyIGM9dGhpcy5nZXQoXCJzdHlsZXNcIil8fG4uc3RhdGVTdHlsZXM7Yz1PYmplY3QoaC5lKSh7fSx1LnN0YXRlU3R5bGVzLGMpLHRoaXMuc2V0KFwic3R5bGVzXCIsYyl9fX1yZXR1cm4gdC5wcm90b3R5cGUuY2FsY3VsYXRlQkJveD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwia2V5U2hhcGVcIiksZT10aGlzLmdldChcImdyb3VwXCIpLG49UHQodCxlKTtyZXR1cm4gbi54PW4ubWluWCxuLnk9bi5taW5ZLG4ud2lkdGg9bi5tYXhYLW4ubWluWCxuLmhlaWdodD1uLm1heFktbi5taW5ZLG4uY2VudGVyWD0obi5taW5YK24ubWF4WCkvMixuLmNlbnRlclk9KG4ubWluWStuLm1heFkpLzIsbn0sdC5wcm90b3R5cGUuY2FsY3VsYXRlQ2FudmFzQkJveD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwia2V5U2hhcGVcIiksZT10aGlzLmdldChcImdyb3VwXCIpLG49UHQodCxlKTtyZXR1cm4gbi54PW4ubWluWCxuLnk9bi5taW5ZLG4ud2lkdGg9bi5tYXhYLW4ubWluWCxuLmhlaWdodD1uLm1heFktbi5taW5ZLG4uY2VudGVyWD0obi5taW5YK24ubWF4WCkvMixuLmNlbnRlclk9KG4ubWluWStuLm1heFkpLzIsbn0sdC5wcm90b3R5cGUuZHJhd0lubmVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJzaGFwZUZhY3RvcnlcIiksZT10aGlzLmdldChcImdyb3VwXCIpLG49dGhpcy5nZXQoXCJtb2RlbFwiKTtlLmNsZWFyKCk7dmFyIHI9bi52aXNpYmxlO2lmKHZvaWQgMD09PXJ8fHJ8fHRoaXMuY2hhbmdlVmlzaWJpbGl0eShyKSx0KXt0aGlzLnVwZGF0ZVBvc2l0aW9uKG4pO3ZhciBpPXRoaXMuZ2V0U2hhcGVDZmcobiksbz1pLnR5cGUsYT10LmRyYXcobyxpLGUpO2EmJih0aGlzLnNldChcImtleVNoYXBlXCIsYSksYS5zZXQoXCJpc0tleVNoYXBlXCIsITApLGEuc2V0KFwiZHJhZ2dhYmxlXCIsITApKSx0aGlzLnNldE9yaWdpblN0eWxlKCksdGhpcy5zZXQoXCJjdXJyZW50U2hhcGVcIixvKSx0aGlzLnJlc3RvcmVTdGF0ZXModCxvKX19LHQucHJvdG90eXBlLnNldE9yaWdpblN0eWxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0KFwiZ3JvdXBcIikuZ2V0KFwiY2hpbGRyZW5cIiksbj10aGlzLmdldEtleVNoYXBlKCkscj10aGlzLGk9bi5nZXQoXCJuYW1lXCIpO2lmKHRoaXMuZ2V0KFwib3JpZ2luU3R5bGVcIikpe3ZhciBvPXRoaXMuZ2V0T3JpZ2luU3R5bGUoKTtpJiYhb1tpXSYmKG9baV09e30pO3ZhciBhPXRoaXMuZ2V0Q3VycmVudFN0YXRlc1N0eWxlKCk7T2JqZWN0KGguZikoZSwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoXCJuYW1lXCIpLG49dC5hdHRyKCk7aWYoZSYmZSE9PWkpe3ZhciByPWFbZV07b1tlXXx8KG9bZV09e30pLHI/T2JqZWN0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGk9blt0XTtpIT09clt0XSYmKG9bZV1bdF09aSl9KSk6b1tlXT1PYmplY3QoaC5jKShuKX1lbHNle3ZhciBzPXQuYXR0cigpLHU9T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sYSksYVtpXSk7T2JqZWN0LmtleXMocykuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49c1t0XTtPYmplY3QoaC53KShuKSYmLTE9PT1lZS5pbmRleE9mKGUpfHx1W3RdIT09biYmKGk/b1tpXVt0XT1uOm9bdF09bil9KSl9fSkpLG8ucGF0aCYmZGVsZXRlIG8ucGF0aCxvLm1hdHJpeCYmZGVsZXRlIG8ubWF0cml4LHIuc2V0KFwib3JpZ2luU3R5bGVcIixvKX1lbHNle3ZhciBzPXt9O09iamVjdChoLmYpKGUsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0KFwidHlwZVwiKSxuPXQuZ2V0KFwibmFtZVwiKTtpZihuJiZuIT09aSlzW25dPVwiaW1hZ2VcIiE9PWU/T2JqZWN0KGguYykodC5hdHRyKCkpOnIuZ2V0U2hhcGVTdHlsZUJ5TmFtZShuKTtlbHNle3ZhciBvPXIuZ2V0U2hhcGVTdHlsZUJ5TmFtZSgpO2lmKG8ucGF0aCYmZGVsZXRlIG8ucGF0aCxvLm1hdHJpeCYmZGVsZXRlIG8ubWF0cml4LGkpaWYobilzW2ldPW87ZWxzZXt2YXIgYT1tdChcInNoYXBlXCIpO3Quc2V0KFwibmFtZVwiLGEpLHNbYV09XCJpbWFnZVwiIT09ZT9PYmplY3QoaC5jKSh0LmF0dHIoKSk6ci5nZXRTaGFwZVN0eWxlQnlOYW1lKG4pfWVsc2UgT2JqZWN0LmFzc2lnbihzLG8pfX0pKSxyLnNldChcIm9yaWdpblN0eWxlXCIscyl9fSx0LnByb3RvdHlwZS5yZXN0b3JlU3RhdGVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPW4uZ2V0KFwic3RhdGVzXCIpO09iamVjdChoLmYpKHIsKGZ1bmN0aW9uKHIpe3Quc2V0U3RhdGUoZSxyLCEwLG4pfSkpfSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGUuZ2V0RmFjdG9yeSh0aGlzLmdldChcInR5cGVcIikpO3RoaXMuc2V0KFwic2hhcGVGYWN0b3J5XCIsdCl9LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2ZnW3RdfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtPYmplY3QoaC53KSh0KT90aGlzLl9jZmc9T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sdGhpcy5fY2ZnKSx0KTp0aGlzLl9jZmdbdF09ZX0sdC5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZz1mdW5jdGlvbigpe3JldHVybnt9fSx0LnByb3RvdHlwZS5jbGVhckNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5zZXQoXCJiYm94Q2FjaGVcIixudWxsKSx0aGlzLnNldChcImJib3hDYW52YXNDYWNoZVwiLG51bGwpfSx0LnByb3RvdHlwZS5iZWZvcmVEcmF3PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5hZnRlckRyYXc9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmFmdGVyVXBkYXRlPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKCl7dGhpcy5iZWZvcmVEcmF3KCksdGhpcy5kcmF3SW5uZXIoKSx0aGlzLmFmdGVyRHJhdygpfSx0LnByb3RvdHlwZS5nZXRTaGFwZVN0eWxlQnlOYW1lPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5nZXQoXCJncm91cFwiKTtpZihlPXQ/bi5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoXCJuYW1lXCIpPT09dH0pKTp0aGlzLmdldEtleVNoYXBlKCkpe3ZhciByPXt9O3JldHVybiBPYmplY3QoaC5mKShlLmF0dHIoKSwoZnVuY3Rpb24odCxlKXtcImltZ1wiIT09ZSYmKHJbZV09dCl9KSkscn1yZXR1cm57fX0sdC5wcm90b3R5cGUuZ2V0U2hhcGVDZmc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXQoXCJzdHlsZXNcIik7aWYoZSl7dmFyIG49dDtyZXR1cm4gbi5zdHlsZT1PYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxlKSx0LnN0eWxlKSxufXJldHVybiB0fSx0LnByb3RvdHlwZS5nZXRTdGF0ZVN0eWxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0KFwic3R5bGVzXCIpO3JldHVybiBlJiZlW3RdfSx0LnByb3RvdHlwZS5nZXRPcmlnaW5TdHlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcIm9yaWdpblN0eWxlXCIpfSx0LnByb3RvdHlwZS5nZXRDdXJyZW50U3RhdGVzU3R5bGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9e30sbj10LmdldFN0YXRlcygpO3JldHVybiBuJiZuLmxlbmd0aD8oT2JqZWN0KGguZikodC5nZXRTdGF0ZXMoKSwoZnVuY3Rpb24obil7ZT1PYmplY3QuYXNzaWduKGUsdC5nZXRTdGF0ZVN0eWxlKG4pKX0pKSxlKTp0aGlzLmdldE9yaWdpblN0eWxlKCl9LHQucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXQoXCJzdGF0ZXNcIikscj10aGlzLmdldChcInNoYXBlRmFjdG9yeVwiKSxpPXQsbz10O09iamVjdChoLngpKGUpJiYoaT10K1wiOlwiK2Usbz10K1wiOlwiKTt2YXIgYT1uO2lmKE9iamVjdChoLm4pKGUpKXt2YXIgcz1uLmluZGV4T2Yobyk7aWYoZSl7aWYocz4tMSlyZXR1cm47bi5wdXNoKGkpfWVsc2Ugcz4tMSYmbi5zcGxpY2UocywxKX1lbHNlIGlmKE9iamVjdChoLngpKGUpKXt2YXIgdT1uLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5jbHVkZXMobyl9KSk7dS5sZW5ndGg+MCYmdGhpcy5jbGVhclN0YXRlcyh1KSwoYT1hLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIXQuaW5jbHVkZXMobyl9KSkpLnB1c2goaSksdGhpcy5zZXQoXCJzdGF0ZXNcIixhKX1pZihyKXt2YXIgYz10aGlzLmdldChcIm1vZGVsXCIpLnR5cGU7ci5zZXRTdGF0ZShjLHQsZSx0aGlzKX19LHQucHJvdG90eXBlLmNsZWFyU3RhdGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1lLmdldFN0YXRlcygpLHI9ZS5nZXQoXCJzaGFwZUZhY3RvcnlcIiksaT1lLmdldChcIm1vZGVsXCIpLnR5cGU7dHx8KHQ9biksT2JqZWN0KGgueCkodCkmJih0PVt0XSk7dmFyIG89bi5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybi0xPT09dC5pbmRleE9mKGUpfSkpO2Uuc2V0KFwic3RhdGVzXCIsbyksdC5mb3JFYWNoKChmdW5jdGlvbih0KXtyLnNldFN0YXRlKGksdCwhMSxlKX0pKX0sdC5wcm90b3R5cGUuZ2V0Q29udGFpbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwiZ3JvdXBcIil9LHQucHJvdG90eXBlLmdldEtleVNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwia2V5U2hhcGVcIil9LHQucHJvdG90eXBlLmdldE1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwibW9kZWxcIil9LHQucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJ0eXBlXCIpfSx0LnByb3RvdHlwZS5nZXRJRD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcImlkXCIpfSx0LnByb3RvdHlwZS5pc0l0ZW09ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdC5wcm90b3R5cGUuZ2V0U3RhdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwic3RhdGVzXCIpfSx0LnByb3RvdHlwZS5oYXNTdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRTdGF0ZXMoKS5pbmRleE9mKHQpPj0wfSx0LnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJtb2RlbFwiKTt0aGlzLnVwZGF0ZVBvc2l0aW9uKHQpLHRoaXMudXBkYXRlU2hhcGUoKSx0aGlzLmFmdGVyVXBkYXRlKCksdGhpcy5jbGVhckNhY2hlKCl9LHQucHJvdG90eXBlLmlzT25seU1vdmU9ZnVuY3Rpb24odCl7cmV0dXJuITF9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPSExKTt2YXIgbj10aGlzLmdldChcIm1vZGVsXCIpLHI9bi52aXNpYmxlLGk9dC52aXNpYmxlO3IhPT1pJiZ2b2lkIDAhPT1pJiZ0aGlzLmNoYW5nZVZpc2liaWxpdHkoaSk7dmFyIG89bi54LGE9bi55O3QueD1pc05hTih0LngpP24ueDp0LngsdC55PWlzTmFOKHQueSk/bi55OnQueTt2YXIgcz10aGlzLmdldChcInN0eWxlc1wiKTtpZih0LnN0YXRlU3R5bGVzKXt2YXIgdT10LnN0YXRlU3R5bGVzO09iamVjdChoLkEpKHMsdSksZGVsZXRlIHQuc3RhdGVTdHlsZXN9T2JqZWN0LmFzc2lnbihuLHQpLGU/dGhpcy51cGRhdGVQb3NpdGlvbih0KToobz09PXQueCYmYT09PXQueXx8dGhpcy51cGRhdGVQb3NpdGlvbih0KSx0aGlzLnVwZGF0ZVNoYXBlKCkpLHRoaXMuYWZ0ZXJVcGRhdGUoKSx0aGlzLmNsZWFyQ2FjaGUoKX0sdC5wcm90b3R5cGUudXBkYXRlU2hhcGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcInNoYXBlRmFjdG9yeVwiKSxlPXRoaXMuZ2V0KFwibW9kZWxcIiksbj1lLnR5cGU7aWYodC5zaG91bGRVcGRhdGUobikmJm49PT10aGlzLmdldChcImN1cnJlbnRTaGFwZVwiKSl7dmFyIHI9dGhpcy5nZXRTaGFwZUNmZyhlKTt0LmJhc2VVcGRhdGUobixyLHRoaXMpfWVsc2UgdGhpcy5kcmF3KCk7dGhpcy5zZXRPcmlnaW5TdHlsZShlKSx0aGlzLnJlc3RvcmVTdGF0ZXModCxuKX0sdC5wcm90b3R5cGUudXBkYXRlUG9zaXRpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXQoXCJtb2RlbFwiKSxuPU9iamVjdChoLnMpKHQueCk/ZS54OnQueCxyPU9iamVjdChoLnMpKHQueSk/ZS55OnQueSxpPXRoaXMuZ2V0KFwiZ3JvdXBcIik7T2JqZWN0KGgucykobil8fE9iamVjdChoLnMpKHIpfHwoaS5yZXNldE1hdHJpeCgpLEQoaSx7eDpuLHk6cn0pLGUueD1uLGUueT1yLHRoaXMuY2xlYXJDYWNoZSgpKX0sdC5wcm90b3R5cGUuZ2V0QkJveD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwiYmJveENhY2hlXCIpO3JldHVybiB0fHwodD10aGlzLmNhbGN1bGF0ZUJCb3goKSx0aGlzLnNldChcImJib3hDYWNoZVwiLHQpKSx0fSx0LnByb3RvdHlwZS5nZXRDYW52YXNCQm94PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJiYm94Q2FudmFzQ2FjaGVcIik7cmV0dXJuIHR8fCh0PXRoaXMuY2FsY3VsYXRlQ2FudmFzQkJveCgpLHRoaXMuc2V0KFwiYmJveENhbnZhc0NhY2hlXCIsdCkpLHR9LHQucHJvdG90eXBlLnRvRnJvbnQ9ZnVuY3Rpb24oKXt0aGlzLmdldChcImdyb3VwXCIpLnRvRnJvbnQoKX0sdC5wcm90b3R5cGUudG9CYWNrPWZ1bmN0aW9uKCl7dGhpcy5nZXQoXCJncm91cFwiKS50b0JhY2soKX0sdC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuY2hhbmdlVmlzaWJpbGl0eSghMCl9LHQucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmNoYW5nZVZpc2liaWxpdHkoITEpfSx0LnByb3RvdHlwZS5jaGFuZ2VWaXNpYmlsaXR5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0KFwiZ3JvdXBcIik7dD9lLnNob3coKTplLmhpZGUoKSx0aGlzLnNldChcInZpc2libGVcIix0KX0sdC5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwidmlzaWJsZVwiKX0sdC5wcm90b3R5cGUuZW5hYmxlQ2FwdHVyZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcImdyb3VwXCIpO2UmJmUuc2V0KFwiY2FwdHVyZVwiLHQpfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYoIXRoaXMuZGVzdHJveWVkKXt2YXIgdD10aGlzLmdldChcImFuaW1hdGVcIiksZT10aGlzLmdldChcImdyb3VwXCIpO3QmJmUuc3RvcEFuaW1hdGUoKSx0aGlzLmNsZWFyQ2FjaGUoKSxlLnJlbW92ZSgpLHRoaXMuX2NmZz1udWxsLHRoaXMuZGVzdHJveWVkPSEwfX0sdH0oKSxyZT17c291cmNlOlwic3RhcnRcIix0YXJnZXQ6XCJlbmRcIn0saWU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIE9iamVjdCh2LmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZz1mdW5jdGlvbigpe3JldHVybnt0eXBlOlwiZWRnZVwiLHNvdXJjZU5vZGU6bnVsbCx0YXJnZXROb2RlOm51bGwsc3RhcnRQb2ludDpudWxsLGVuZFBvaW50Om51bGwsbGlua0NlbnRlcjohMX19LGUucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbih0LGUpe3ZhciBuPXJlW3RdK1wiUG9pbnRcIixyPXQrXCJOb2RlXCIsaT10aGlzLmdldChyKTtpJiYhaS5kZXN0cm95ZWQmJmkucmVtb3ZlRWRnZSh0aGlzKSxPYmplY3QoaC53KShlKT8odGhpcy5zZXQobixlKSx0aGlzLnNldChyLG51bGwpKTooZS5hZGRFZGdlKHRoaXMpLHRoaXMuc2V0KHIsZSksdGhpcy5zZXQobixudWxsKSl9LGUucHJvdG90eXBlLmdldExpbmtQb2ludD1mdW5jdGlvbih0LGUsbil7dmFyIHI9cmVbdF0rXCJQb2ludFwiLGk9dCtcIk5vZGVcIixvPXRoaXMuZ2V0KHIpO2lmKCFvKXt2YXIgYT10aGlzLmdldChpKSxzPXQrXCJBbmNob3JcIix1PXRoaXMuZ2V0UHJlUG9pbnQodCxuKSxjPWVbc107T2JqZWN0KGgucykoYyl8fChvPWEuZ2V0TGlua1BvaW50QnlBbmNob3IoYykpLG89b3x8YS5nZXRMaW5rUG9pbnQodSksT2JqZWN0KGgucykoby5pbmRleCl8fHRoaXMuc2V0KHQrXCJBbmNob3JJbmRleFwiLG8uaW5kZXgpfXJldHVybiBvfSxlLnByb3RvdHlwZS5nZXRQcmVQb2ludD1mdW5jdGlvbih0LGUpe2lmKGUmJmUubGVuZ3RoKXJldHVybiBlW1wic291cmNlXCI9PT10PzA6ZS5sZW5ndGgtMV07dmFyIG49XCJzb3VyY2VcIj09PXQ/XCJ0YXJnZXRcIjpcInNvdXJjZVwiO3JldHVybiB0aGlzLmdldEVuZFBvaW50KG4pfSxlLnByb3RvdHlwZS5nZXRFbmRQb2ludD1mdW5jdGlvbih0KXt2YXIgZT10K1wiTm9kZVwiLG49cmVbdF0rXCJQb2ludFwiLHI9dGhpcy5nZXQoZSk7cmV0dXJuIHI/ci5nZXQoXCJtb2RlbFwiKTp0aGlzLmdldChuKX0sZS5wcm90b3R5cGUuZ2V0Q29udHJvbFBvaW50c0J5Q2VudGVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RW5kUG9pbnQoXCJzb3VyY2VcIiksbj10aGlzLmdldEVuZFBvaW50KFwidGFyZ2V0XCIpLHI9dGhpcy5nZXQoXCJzaGFwZUZhY3RvcnlcIiksaT10LnR5cGU7cmV0dXJuIHIuZ2V0Q29udHJvbFBvaW50cyhpLHtzdGFydFBvaW50OmUsZW5kUG9pbnQ6bn0pfSxlLnByb3RvdHlwZS5nZXRFbmRDZW50ZXI9ZnVuY3Rpb24odCl7dmFyIGU9dCtcIk5vZGVcIixuPXJlW3RdK1wiUG9pbnRcIixyPXRoaXMuZ2V0KGUpO2lmKHIpe3ZhciBpPXIuZ2V0QkJveCgpO3JldHVybnt4OmkuY2VudGVyWCx5OmkuY2VudGVyWX19cmV0dXJuIHRoaXMuZ2V0KG4pfSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW5pdC5jYWxsKHRoaXMpLHRoaXMuc2V0U291cmNlKHRoaXMuZ2V0KFwic291cmNlXCIpKSx0aGlzLnNldFRhcmdldCh0aGlzLmdldChcInRhcmdldFwiKSl9LGUucHJvdG90eXBlLmdldFNoYXBlQ2ZnPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuZ2V0KFwibGlua0NlbnRlclwiKSxyPXQucHJvdG90eXBlLmdldFNoYXBlQ2ZnLmNhbGwodGhpcyxlKTtpZihuKXIuc3RhcnRQb2ludD10aGlzLmdldEVuZENlbnRlcihcInNvdXJjZVwiKSxyLmVuZFBvaW50PXRoaXMuZ2V0RW5kQ2VudGVyKFwidGFyZ2V0XCIpO2Vsc2V7dmFyIGk9ci5jb250cm9sUG9pbnRzfHx0aGlzLmdldENvbnRyb2xQb2ludHNCeUNlbnRlcihyKTtyLnN0YXJ0UG9pbnQ9dGhpcy5nZXRMaW5rUG9pbnQoXCJzb3VyY2VcIixlLGkpLHIuZW5kUG9pbnQ9dGhpcy5nZXRMaW5rUG9pbnQoXCJ0YXJnZXRcIixlLGkpfXJldHVybiByLnNvdXJjZU5vZGU9dGhpcy5nZXQoXCJzb3VyY2VOb2RlXCIpLHIudGFyZ2V0Tm9kZT10aGlzLmdldChcInRhcmdldE5vZGVcIikscn0sZS5wcm90b3R5cGUuZ2V0TW9kZWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcIm1vZGVsXCIpLGU9dGhpcy5nZXQoXCJzb3VyY2VOb2RlXCIpLG49dGhpcy5nZXQoXCJ0YXJnZXROb2RlXCIpO3JldHVybiBlP2RlbGV0ZSB0LnNvdXJjZU5vZGU6dC5zb3VyY2U9dGhpcy5nZXQoXCJzdGFydFBvaW50XCIpLG4/ZGVsZXRlIHQudGFyZ2V0Tm9kZTp0LnRhcmdldD10aGlzLmdldChcImVuZFBvaW50XCIpLE9iamVjdChoLngpKHQuc291cmNlKXx8T2JqZWN0KGgudykodC5zb3VyY2UpfHwodC5zb3VyY2U9dC5zb3VyY2UuZ2V0SUQoKSksT2JqZWN0KGgueCkodC50YXJnZXQpfHxPYmplY3QoaC53KSh0LnRhcmdldCl8fCh0LnRhcmdldD10LnRhcmdldC5nZXRJRCgpKSx0fSxlLnByb3RvdHlwZS5zZXRTb3VyY2U9ZnVuY3Rpb24odCl7dGhpcy5zZXRFbmQoXCJzb3VyY2VcIix0KSx0aGlzLnNldChcInNvdXJjZVwiLHQpfSxlLnByb3RvdHlwZS5zZXRUYXJnZXQ9ZnVuY3Rpb24odCl7dGhpcy5zZXRFbmQoXCJ0YXJnZXRcIix0KSx0aGlzLnNldChcInRhcmdldFwiLHQpfSxlLnByb3RvdHlwZS5nZXRTb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJzb3VyY2VcIil9LGUucHJvdG90eXBlLmdldFRhcmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcInRhcmdldFwiKX0sZS5wcm90b3R5cGUudXBkYXRlUG9zaXRpb249ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPSExKTt2YXIgbj10aGlzLmdldChcIm1vZGVsXCIpLHI9bi52aXNpYmxlLGk9dC52aXNpYmxlO3IhPT1pJiZ2b2lkIDAhPT1pJiZ0aGlzLmNoYW5nZVZpc2liaWxpdHkoaSk7dmFyIG89dGhpcy5nZXQoXCJzdHlsZXNcIik7aWYodC5zdGF0ZVN0eWxlcyl7dmFyIGE9dC5zdGF0ZVN0eWxlcztPYmplY3QoaC5BKShvLGEpLGRlbGV0ZSB0LnN0YXRlU3R5bGVzfU9iamVjdC5hc3NpZ24obix0KSx0aGlzLnVwZGF0ZVNoYXBlKCksdGhpcy5hZnRlclVwZGF0ZSgpLHRoaXMuY2xlYXJDYWNoZSgpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXQoXCJzb3VyY2VOb2RlXCIpLG49dGhpcy5nZXQoXCJ0YXJnZXROb2RlXCIpO2UmJiFlLmRlc3Ryb3llZCYmZS5yZW1vdmVFZGdlKHRoaXMpLG4mJiFuLmRlc3Ryb3llZCYmbi5yZW1vdmVFZGdlKHRoaXMpLHQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX0sZX0obmUpLG9lPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3Qodi5iKShlLHQpLGUucHJvdG90eXBlLmdldE5lYXJlc3RQb2ludD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9dFswXSxpPUModFswXSxlKSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBhPXRbb10scz1DKGEsZSk7czxpJiYocj1hLGk9cyxuPW8pfXJldHVybiByLmFuY2hvckluZGV4PW4scn0sZS5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZz1mdW5jdGlvbigpe3JldHVybnt0eXBlOlwibm9kZVwiLGVkZ2VzOltdfX0sZS5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJlZGdlc1wiKX0sZS5wcm90b3R5cGUuZ2V0SW5FZGdlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuZ2V0KFwiZWRnZXNcIikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoXCJ0YXJnZXRcIik9PT10fSkpfSxlLnByb3RvdHlwZS5nZXRPdXRFZGdlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuZ2V0KFwiZWRnZXNcIikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoXCJzb3VyY2VcIik9PT10fSkpfSxlLnByb3RvdHlwZS5nZXROZWlnaGJvcnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuZ2V0KFwiZWRnZXNcIik7aWYoXCJ0YXJnZXRcIj09PXQpe3JldHVybiBuLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0U291cmNlKCk9PT1lfSkpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VGFyZ2V0KCl9KSl9aWYoXCJzb3VyY2VcIj09PXQpe3JldHVybiBuLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VGFyZ2V0KCk9PT1lfSkpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0U291cmNlKCl9KSl9cmV0dXJuIG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRTb3VyY2UoKT09PWU/dC5nZXRUYXJnZXQoKTp0LmdldFNvdXJjZSgpfSkpfSxlLnByb3RvdHlwZS5nZXRMaW5rUG9pbnRCeUFuY2hvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRBbmNob3JQb2ludHMoKVt0XX0sZS5wcm90b3R5cGUuZ2V0TGlua1BvaW50PWZ1bmN0aW9uKHQpe3ZhciBlLG4scj10aGlzLmdldChcImtleVNoYXBlXCIpLmdldChcInR5cGVcIiksaT10aGlzLmdldChcInR5cGVcIiksbz10aGlzLmdldEJCb3goKTtcImNvbWJvXCI9PT1pPyhlPW8uY2VudGVyWHx8KG8ubWF4WCtvLm1pblgpLzIsbj1vLmNlbnRlcll8fChvLm1heFkrby5taW5ZKS8yKTooZT1vLmNlbnRlclgsbj1vLmNlbnRlclkpO3ZhciBhLHM9dGhpcy5nZXRBbmNob3JQb2ludHMoKTtzd2l0Y2gocil7Y2FzZVwiY2lyY2xlXCI6YT1PKHt4OmUseTpuLHI6by53aWR0aC8yfSx0KTticmVhaztjYXNlXCJlbGxpcHNlXCI6YT1rKHt4OmUseTpuLHJ4Om8ud2lkdGgvMixyeTpvLmhlaWdodC8yfSx0KTticmVhaztkZWZhdWx0OmE9XyhvLHQpfXZhciB1PWE7cmV0dXJuIHMubGVuZ3RoJiYodXx8KHU9dCksdT10aGlzLmdldE5lYXJlc3RQb2ludChzLHUpKSx1fHwodT17eDplLHk6bn0pLHV9LGUucHJvdG90eXBlLmdldEFuY2hvclBvaW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwiYW5jaG9yUG9pbnRzQ2FjaGVcIik7aWYoIXQpe3Q9W107dmFyIGU9dGhpcy5nZXQoXCJzaGFwZUZhY3RvcnlcIiksbj10aGlzLmdldEJCb3goKSxyPXRoaXMuZ2V0KFwibW9kZWxcIiksaT10aGlzLmdldFNoYXBlQ2ZnKHIpLG89ci50eXBlLGE9ZS5nZXRBbmNob3JQb2ludHMobyxpKXx8W107T2JqZWN0KGguZikoYSwoZnVuY3Rpb24oZSxyKXt2YXIgaT17eDpuLm1pblgrZVswXSpuLndpZHRoLHk6bi5taW5ZK2VbMV0qbi5oZWlnaHQsYW5jaG9ySW5kZXg6cn07dC5wdXNoKGkpfSkpLHRoaXMuc2V0KFwiYW5jaG9yUG9pbnRzQ2FjaGVcIix0KX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuYWRkRWRnZT1mdW5jdGlvbih0KXt0aGlzLmdldChcImVkZ2VzXCIpLnB1c2godCl9LGUucHJvdG90eXBlLmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnNldChcImxvY2tlZFwiLCEwKX0sZS5wcm90b3R5cGUudW5sb2NrPWZ1bmN0aW9uKCl7dGhpcy5zZXQoXCJsb2NrZWRcIiwhMSl9LGUucHJvdG90eXBlLmhhc0xvY2tlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcImxvY2tlZFwiKX0sZS5wcm90b3R5cGUucmVtb3ZlRWRnZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEVkZ2VzKCksbj1lLmluZGV4T2YodCk7bj4tMSYmZS5zcGxpY2UobiwxKX0sZS5wcm90b3R5cGUuY2xlYXJDYWNoZT1mdW5jdGlvbigpe3RoaXMuc2V0KFwiYmJveENhY2hlXCIsbnVsbCksdGhpcy5zZXQoXCJhbmNob3JQb2ludHNDYWNoZVwiLG51bGwpfSxlLnByb3RvdHlwZS5pc09ubHlNb3ZlPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiExO3ZhciBlPSFPYmplY3QoaC5zKSh0LngpLG49IU9iamVjdChoLnMpKHQueSkscj1PYmplY3Qua2V5cyh0KTtyZXR1cm4gMT09PXIubGVuZ3RoJiYoZXx8bil8fDI9PT1yLmxlbmd0aCYmZSYmbn0sZX0obmUpLGFlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3Qodi5iKShlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRDZmc9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTpcImNvbWJvXCIsbm9kZXM6W10sZWRnZXM6W10sY29tYm9zOltdfX0sZS5wcm90b3R5cGUuZ2V0U2hhcGVDZmc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXQoXCJzdHlsZXNcIiksbj10aGlzLmdldChcImJib3hcIik7aWYoZSYmbil7dmFyIHI9dCxpPXtyOk1hdGguaHlwb3Qobi5oZWlnaHQsbi53aWR0aCkvMnx8aHQuZGVmYXVsdENvbWJvLnNpemVbMF0vMix3aWR0aDpuLndpZHRofHxodC5kZWZhdWx0Q29tYm8uc2l6ZVswXSxoZWlnaHQ6bi5oZWlnaHR8fGh0LmRlZmF1bHRDb21iby5zaXplWzFdfTtyLnN0eWxlPU9iamVjdCh2LmEpKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGUpLHQuc3R5bGUpLGkpO3ZhciBvPXQucGFkZGluZ3x8aHQuZGVmYXVsdENvbWJvLnBhZGRpbmc7cmV0dXJuIE9iamVjdChoLnQpKG8pPyhpLnIrPW8saS53aWR0aCs9MipvLGkuaGVpZ2h0Kz0yKm8pOihpLnIrPW9bMF0saS53aWR0aCs9b1sxXStvWzNdfHwyKm9bMV0saS5oZWlnaHQrPW9bMF0rb1syXXx8MipvWzBdKSx0aGlzLnNldChcInNpemVDYWNoZVwiLGkpLHJ9cmV0dXJuIHR9LGUucHJvdG90eXBlLmNhbGN1bGF0ZUNhbnZhc0JCb3g9ZnVuY3Rpb24oKXtpZighdGhpcy5kZXN0cm95ZWQpe3ZhciB0PXRoaXMuZ2V0KFwia2V5U2hhcGVcIiksZT10aGlzLmdldChcImdyb3VwXCIpLG49UHQodCxlKTtuLmNlbnRlclg9KG4ubWluWCtuLm1heFgpLzIsbi5jZW50ZXJZPShuLm1pblkrbi5tYXhZKS8yO3ZhciByPXRoaXMuZ2V0KFwic2l6ZUNhY2hlXCIpLGk9dGhpcy5nZXQoXCJiYm94Q2FjaGVcIil8fHt9LG89aS54LGE9aS54O2lmKHIpXCJjaXJjbGVcIj09PXQuZ2V0KFwidHlwZVwiKT8obi53aWR0aD0yKnIucixuLmhlaWdodD0yKnIucik6KG4ud2lkdGg9ci53aWR0aCxuLmhlaWdodD1yLmhlaWdodCksbi5taW5YPW4uY2VudGVyWC1uLndpZHRoLzIsbi5taW5ZPW4uY2VudGVyWS1uLmhlaWdodC8yLG4ubWF4WD1uLmNlbnRlclgrbi53aWR0aC8yLG4ubWF4WT1uLmNlbnRlclkrbi5oZWlnaHQvMjtlbHNlIG4ud2lkdGg9bi5tYXhYLW4ubWluWCxuLmhlaWdodD1uLm1heFktbi5taW5ZLG4uY2VudGVyWD0obi5taW5YK24ubWF4WCkvMixuLmNlbnRlclk9KG4ubWluWStuLm1heFkpLzI7cmV0dXJuIG4ueD1uLm1pblgsbi55PW4ubWluWSxuLng9PT1vJiZuLnk9PT1hfHx0aGlzLnNldChcImFuY2hvclBvaW50c0NhY2hlXCIsbnVsbCksbn19LGUucHJvdG90eXBlLmdldENoaWxkcmVuPWZ1bmN0aW9uKCl7cmV0dXJue25vZGVzOnRoaXMuZ2V0Tm9kZXMoKSxjb21ib3M6dGhpcy5nZXRDb21ib3MoKX19LGUucHJvdG90eXBlLmdldE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwibm9kZXNcIil9LGUucHJvdG90eXBlLmdldENvbWJvcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcImNvbWJvc1wiKX0sZS5wcm90b3R5cGUuYWRkQ2hpbGQ9ZnVuY3Rpb24odCl7c3dpdGNoKHQuZ2V0VHlwZSgpKXtjYXNlXCJub2RlXCI6dGhpcy5hZGROb2RlKHQpO2JyZWFrO2Nhc2VcImNvbWJvXCI6dGhpcy5hZGRDb21ibyh0KTticmVhaztkZWZhdWx0OnJldHVybiBjb25zb2xlLndhcm4oXCJPbmx5IG5vZGUgb3IgY29tYm8gaXRlbXMgYXJlIGFsbG93ZWQgdG8gYmUgYWRkZWQgaW50byBhIGNvbWJvXCIpLCExfXJldHVybiEwfSxlLnByb3RvdHlwZS5hZGRDb21ibz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXQoXCJjb21ib3NcIikucHVzaCh0KSwhMH0sZS5wcm90b3R5cGUuYWRkTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXQoXCJub2Rlc1wiKS5wdXNoKHQpLCEwfSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbih0KXtzd2l0Y2godC5nZXRUeXBlKCkpe2Nhc2VcIm5vZGVcIjp0aGlzLnJlbW92ZU5vZGUodCk7YnJlYWs7Y2FzZVwiY29tYm9cIjp0aGlzLnJlbW92ZUNvbWJvKHQpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIGNvbnNvbGUud2FybihcIk9ubHkgbm9kZSBvciBjb21ibyBpdGVtcyBhcmUgYWxsb3dlZCB0byBiZSBhZGRlZCBpbnRvIGEgY29tYm9cIiksITF9cmV0dXJuITB9LGUucHJvdG90eXBlLnJlbW92ZUNvbWJvPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPXRoaXMuZ2V0Q29tYm9zKCksbj1lLmluZGV4T2YodCk7cmV0dXJuIG4+LTEmJihlLnNwbGljZShuLDEpLCEwKX19LGUucHJvdG90eXBlLnJlbW92ZU5vZGU9ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dGhpcy5nZXROb2RlcygpLG49ZS5pbmRleE9mKHQpO3JldHVybiBuPi0xJiYoZS5zcGxpY2UobiwxKSwhMCl9fSxlLnByb3RvdHlwZS5pc09ubHlNb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiExfSxlLnByb3RvdHlwZS5nZXRCQm94PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0KFwiYmJveENhbnZhc0NhY2hlXCIsbnVsbCksdGhpcy5jYWxjdWxhdGVDYW52YXNCQm94KCl9LGUucHJvdG90eXBlLmNsZWFyQ2FjaGU9ZnVuY3Rpb24oKXt0aGlzLnNldChcImJib3hDYWNoZVwiLG51bGwpLHRoaXMuc2V0KFwiYmJveENhbnZhc0NhY2hlXCIsbnVsbCksdGhpcy5zZXQoXCJhbmNob3JQb2ludHNDYWNoZVwiLG51bGwpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYoIXRoaXMuZGVzdHJveWVkKXt2YXIgdD10aGlzLmdldChcImFuaW1hdGVcIiksZT10aGlzLmdldChcImdyb3VwXCIpO3QmJmUuc3RvcEFuaW1hdGUoKSx0aGlzLmNsZWFyQ2FjaGUoKSx0aGlzLnNldChcInNpemVDYWNoZVwiLG51bGwpLHRoaXMuc2V0KFwiYmJveFwiLG51bGwpLGUucmVtb3ZlKCksdGhpcy5fY2ZnPW51bGwsdGhpcy5kZXN0cm95ZWQ9ITB9fSxlfShvZSksc2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuZ3JhcGg9dCx0aGlzLmRlc3Ryb3llZD0hMX1yZXR1cm4gdC5wcm90b3R5cGUuYWRkSXRlbT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdyYXBoLGk9XCJ2ZWRnZVwiPT09dD9cImVkZ2VcIjp0LG89ci5nZXQoaStcIkdyb3VwXCIpfHxyLmdldChcImdyb3VwXCIpLGE9T2JqZWN0KGguSSkoaSkscz1udWxsLHU9ci5nZXQoaStPYmplY3QoaC5JKShcInN0YXRlU3R5bGVzXCIpKXx8e30sYz1yLmdldChcImRlZmF1bHRcIithKTtlLnN0YXRlU3R5bGVzJiYodT1lLnN0YXRlU3R5bGVzKSxjJiZPYmplY3QoaC5mKShjLChmdW5jdGlvbih0LG4pe09iamVjdChoLnYpKHQpJiYhT2JqZWN0KGgubSkodCk/ZVtuXT1PYmplY3QoaC5lKSh7fSx0LGVbbl0pOk9iamVjdChoLm0pKHQpP2Vbbl09ZVtuXXx8T2JqZWN0KGguYykoY1tuXSk6ZVtuXT1lW25dfHxjW25dfSkpO3ZhciBmPXIuZ2V0KGkrXCJNYXBwZXJcIik7aWYoZil7dmFyIGw9ZihlKTtsLnN0YXRlU3R5bGVzJiYodT1sLnN0YXRlU3R5bGVzLGRlbGV0ZSBsLnN0YXRlU3R5bGVzKSxPYmplY3QoaC5mKShsLChmdW5jdGlvbih0LG4pe09iamVjdChoLnYpKHQpJiYhT2JqZWN0KGgubSkodCk/ZVtuXT1PYmplY3QoaC5lKSh7fSxlW25dLHQpOmVbbl09bFtuXXx8ZVtuXX0pKX1pZihyLmVtaXQoXCJiZWZvcmVhZGRpdGVtXCIse3R5cGU6dCxtb2RlbDplfSksXCJlZGdlXCI9PT10fHxcInZlZGdlXCI9PT10KXt2YXIgZD12b2lkIDAscD12b2lkIDA7aWYoZD1lLnNvdXJjZSxwPWUudGFyZ2V0LGQmJk9iamVjdChoLngpKGQpJiYoZD1yLmZpbmRCeUlkKGQpKSxwJiZPYmplY3QoaC54KShwKSYmKHA9ci5maW5kQnlJZChwKSksIWR8fCFwKXJldHVybiB2b2lkIGNvbnNvbGUud2FybihcIlRoZSBzb3VyY2Ugb3IgdGFyZ2V0IG5vZGUgb2YgZWRnZSBcIitlLmlkK1wiIGRvZXMgbm90IGV4aXN0IVwiKTtkLmdldFR5cGUmJlwiY29tYm9cIj09PWQuZ2V0VHlwZSgpJiYoZS5pc0NvbWJvRWRnZT0hMCkscC5nZXRUeXBlJiZcImNvbWJvXCI9PT1wLmdldFR5cGUoKSYmKGUuaXNDb21ib0VkZ2U9ITApLHM9bmV3IGllKHttb2RlbDplLHNvdXJjZTpkLHRhcmdldDpwLHN0eWxlczp1LGxpbmtDZW50ZXI6ci5nZXQoXCJsaW5rQ2VudGVyXCIpLGdyb3VwOm8uYWRkR3JvdXAoKX0pfWVsc2UgaWYoXCJub2RlXCI9PT10KXM9bmV3IG9lKHttb2RlbDplLHN0eWxlczp1LGdyb3VwOm8uYWRkR3JvdXAoKX0pO2Vsc2UgaWYoXCJjb21ib1wiPT09dCl7dmFyIGc9ZS5jaGlsZHJlbix2PXp0KGcscik7ZS54PXYueHx8ZS54fHwxMDAqTWF0aC5yYW5kb20oKSxlLnk9di55fHxlLnl8fDEwMCpNYXRoLnJhbmRvbSgpO3ZhciB5PW8uYWRkR3JvdXAoKTt5LnNldFpJbmRleChlLmRlcHRoKTt2YXIgbT0ocz1uZXcgYWUoe21vZGVsOmUsc3R5bGVzOnUsYmJveDp2LGdyb3VwOnl9KSkuZ2V0TW9kZWwoKTsoZ3x8W10pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXIuZmluZEJ5SWQodC5pZCk7cy5hZGRDaGlsZChlKSx0LmRlcHRoPW0uZGVwdGgrMn0pKSxlLmNvbGxhcHNlZCYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyLmNvbGxhcHNlQ29tYm8ocyksbi51cGRhdGVDb21ibyhzLFtdKX0pLDI1MCl9aWYocylyZXR1cm4gci5nZXQodCtcInNcIikucHVzaChzKSxyLmdldChcIml0ZW1NYXBcIilbcy5nZXQoXCJpZFwiKV09cyxyLmVtaXQoXCJhZnRlcmFkZGl0ZW1cIix7aXRlbTpzLG1vZGVsOmV9KSxzfSx0LnByb3RvdHlwZS51cGRhdGVJdGVtPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXRoaXMuZ3JhcGg7aWYoT2JqZWN0KGgueCkodCkmJih0PWkuZmluZEJ5SWQodCkpLHQmJiF0LmRlc3Ryb3llZCl7dmFyIG89XCJcIjt0LmdldFR5cGUmJihvPXQuZ2V0VHlwZSgpKTt2YXIgYT1pLmdldChvK1wiTWFwcGVyXCIpLHM9dC5nZXRNb2RlbCgpLHU9dC5pc09ubHlNb3ZlKGUpO2lmKGEpe3ZhciBjPWEoT2JqZWN0KGguZSkoe30scyxlKSksZj1PYmplY3QoaC5lKSh7fSxzLGMsZSk7Yy5zdGF0ZVN0eWxlcyYmKHQuc2V0KFwic3R5bGVzXCIsZi5zdGF0ZVN0eWxlcyksZGVsZXRlIGYuc3RhdGVTdHlsZXMpLE9iamVjdChoLmYpKGYsKGZ1bmN0aW9uKHQsbil7ZVtuXT10fSkpfWVsc2UgT2JqZWN0KGguZikoZSwoZnVuY3Rpb24odCxuKXtzW25dJiZPYmplY3QoaC52KSh0KSYmIU9iamVjdChoLm0pKHQpJiYoZVtuXT1PYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxzW25dKSxlW25dKSl9KSk7aWYoaS5lbWl0KFwiYmVmb3JldXBkYXRlaXRlbVwiLHtpdGVtOnQsY2ZnOmV9KSxcImVkZ2VcIj09PW8pe2lmKGUuc291cmNlKXt2YXIgbD1lLnNvdXJjZTtPYmplY3QoaC54KShsKSYmKGw9aS5maW5kQnlJZChsKSksdC5zZXRTb3VyY2UobCl9aWYoZS50YXJnZXQpe3ZhciBkPWUudGFyZ2V0O09iamVjdChoLngpKGQpJiYoZD1pLmZpbmRCeUlkKGQpKSx0LnNldFRhcmdldChkKX10LnVwZGF0ZShlKX1pZihcIm5vZGVcIj09PW98fFwiY29tYm9cIj09PW8pe3QudXBkYXRlKGUsdSk7dmFyIHA9dC5nZXRFZGdlcygpLGc9VnQoZSk7aWYoZyYmXCJub2RlXCI9PT1vKU9iamVjdChoLmYpKHAsKGZ1bmN0aW9uKHQpe3QucmVmcmVzaCgpfSkpO2Vsc2UgaWYoZyYmXCJjb21ib1wiPT09byl7dmFyIHk9dC5nZXQoXCJzaGFwZUZhY3RvcnlcIiksbT1zLnR5cGV8fFwiY2lyY2xlXCI7KHZvaWQgMD09PXMuYW5pbWF0ZXx8dm9pZCAwPT09ZS5hbmltYXRlP251bGw9PT0ocj1udWxsPT09KG49eVttXSl8fHZvaWQgMD09PW4/dm9pZCAwOm4ub3B0aW9ucyl8fHZvaWQgMD09PXI/dm9pZCAwOnIuYW5pbWF0ZTpzLmFuaW1hdGV8fGUuYW5pbWF0ZSk/c2V0VGltZW91dCgoZnVuY3Rpb24oKXtpZih0JiYhdC5kZXN0cm95ZWQpe3ZhciBlPXQuZ2V0S2V5U2hhcGUoKTtlJiYhZS5kZXN0cm95ZWQmJk9iamVjdChoLmYpKHAsKGZ1bmN0aW9uKHQpe3QmJiF0LmRlc3Ryb3llZCYmdC5yZWZyZXNoKCl9KSl9fSksMjAxKTpPYmplY3QoaC5mKShwLChmdW5jdGlvbih0KXt0LnJlZnJlc2goKX0pKX19aS5lbWl0KFwiYWZ0ZXJ1cGRhdGVpdGVtXCIse2l0ZW06dCxjZmc6ZX0pfX0sdC5wcm90b3R5cGUudXBkYXRlQ29tYm89ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk9dGhpcy5ncmFwaDtpZihPYmplY3QoaC54KSh0KSYmKHQ9aS5maW5kQnlJZCh0KSksdCYmIXQuZGVzdHJveWVkKXt2YXIgbz16dChlLGkpO3Quc2V0KFwiYmJveFwiLG8pLHQudXBkYXRlKHt4Om8ueCx5Om8ueX0pO3ZhciBhPXQuZ2V0RWRnZXMoKXx8W10scz1hLmxlbmd0aCx1PXQuZ2V0TW9kZWwoKSxjPXQuZ2V0KFwic2hhcGVGYWN0b3J5XCIpLGY9dS50eXBlfHxcImNpcmNsZVwiO2lmKHZvaWQgMD09PXUuYW5pbWF0ZT9udWxsPT09KHI9bnVsbD09PShuPWNbZl0pfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLm9wdGlvbnMpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmFuaW1hdGU6dS5hbmltYXRlKXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYodCYmIXQuZGVzdHJveWVkKXt2YXIgZT10LmdldEtleVNoYXBlKCk7aWYoZSYmIWUuZGVzdHJveWVkKWZvcih2YXIgbj0wO248cztuKyspe3ZhciByPWFbbl07ciYmIXIuZGVzdHJveWVkJiZyLnJlZnJlc2goKX19fSksMjAxKTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspe3ZhciBkPWFbbF07ZCYmIWQuZGVzdHJveWVkJiZkLnJlZnJlc2goKX19fSx0LnByb3RvdHlwZS5jb2xsYXBzZUNvbWJvPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JhcGg7T2JqZWN0KGgueCkodCkmJih0PWUuZmluZEJ5SWQodCkpO3ZhciBuPXQuZ2V0Q2hpbGRyZW4oKTtuLm5vZGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuaGlkZUl0ZW0odCl9KSksbi5jb21ib3MuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5oaWRlSXRlbSh0KX0pKX0sdC5wcm90b3R5cGUuZXhwYW5kQ29tYm89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ncmFwaDtPYmplY3QoaC54KSh0KSYmKHQ9ZS5maW5kQnlJZCh0KSk7dmFyIG49dC5nZXRDaGlsZHJlbigpO24ubm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5zaG93SXRlbSh0KX0pKSxuLmNvbWJvcy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmdldE1vZGVsKCkuY29sbGFwc2VkP3Quc2hvdygpOmUuc2hvd0l0ZW0odCl9KSl9LHQucHJvdG90eXBlLnJlbW92ZUl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuZ3JhcGg7aWYoT2JqZWN0KGgueCkodCkmJih0PW4uZmluZEJ5SWQodCkpLHQmJiF0LmRlc3Ryb3llZCl7dmFyIHI9T2JqZWN0KGguYykodC5nZXRNb2RlbCgpKTtuLmVtaXQoXCJiZWZvcmVyZW1vdmVpdGVtXCIse2l0ZW06cn0pO3ZhciBpPVwiXCI7dC5nZXRUeXBlJiYoaT10LmdldFR5cGUoKSk7dmFyIG89bi5nZXQoaStcInNcIiksYT1vLmluZGV4T2YodCk7aWYoYT4tMSYmby5zcGxpY2UoYSwxKSxcImVkZ2VcIj09PWkpe3ZhciBzPW4uZ2V0KFwidlwiK2krXCJzXCIpLHU9cy5pbmRleE9mKHQpO3U+LTEmJnMuc3BsaWNlKHUsMSl9dmFyIGM9dC5nZXQoXCJpZFwiKTtkZWxldGUgbi5nZXQoXCJpdGVtTWFwXCIpW2NdO3ZhciBmPW4uZ2V0KFwiY29tYm9UcmVlc1wiKSxsPXQuZ2V0KFwiaWRcIik7aWYoXCJub2RlXCI9PT1pKXt2YXIgZD10LmdldE1vZGVsKCkuY29tYm9JZDtpZihmKXt2YXIgcD1mLGc9ITE7Zi5mb3JFYWNoKChmdW5jdGlvbih0KXtnfHxSdCh0LChmdW5jdGlvbih0KXtpZih0LmlkPT09bCYmcCl7dmFyIGU9cC5pbmRleE9mKHQpO3JldHVybiBwLnNwbGljZShlLDEpLGc9ITAsITF9cmV0dXJuIHA9dC5jaGlsZHJlbiwhMH0pKX0pKX1mb3IodmFyIHY9KHg9dC5nZXRFZGdlcygpKS5sZW5ndGgtMTt2Pj0wO3YtLSluLnJlbW92ZUl0ZW0oeFt2XSwhMSk7ZCYmbi51cGRhdGVDb21ibyhkKX1lbHNlIGlmKFwiY29tYm9cIj09PWkpe3ZhciB5LG09dC5nZXRNb2RlbCgpLnBhcmVudElkLGI9ITE7KGZ8fFtdKS5mb3JFYWNoKChmdW5jdGlvbih0KXtifHxSdCh0LChmdW5jdGlvbih0KXtyZXR1cm4gdC5pZCE9PWx8fCh5PXQsYj0hMCwhMSl9KSl9KSkseS5yZW1vdmVkPSEwLHkmJnkuY2hpbGRyZW4mJnkuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5yZW1vdmVJdGVtKHQuaWQpfSkpO3ZhciB4O2Zvcih2PSh4PXQuZ2V0RWRnZXMoKSkubGVuZ3RoO3Y+PTA7di0tKW4ucmVtb3ZlSXRlbSh4W3ZdLCExKTttJiZuLnVwZGF0ZUNvbWJvKG0pfXQuZGVzdHJveSgpLG4uZW1pdChcImFmdGVycmVtb3ZlaXRlbVwiLHtpdGVtOnJ9KX19LHQucHJvdG90eXBlLnNldEl0ZW1TdGF0ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5ncmFwaCxpPWU7T2JqZWN0KGgueCkobikmJihpPWUrXCI6XCIrbiksdC5oYXNTdGF0ZShpKT09PW4mJm58fE9iamVjdChoLngpKG4pJiZ0Lmhhc1N0YXRlKGkpfHwoci5lbWl0KFwiYmVmb3JlaXRlbXN0YXRlY2hhbmdlXCIse2l0ZW06dCxzdGF0ZTppLGVuYWJsZWQ6bn0pLHQuc2V0U3RhdGUoZSxuKSxyLmF1dG9QYWludCgpLHIuZW1pdChcImFmdGVyaXRlbXN0YXRlY2hhbmdlXCIse2l0ZW06dCxzdGF0ZTppLGVuYWJsZWQ6bn0pKX0sdC5wcm90b3R5cGUucHJpb3JpdHlTdGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ3JhcGgscj10O09iamVjdChoLngpKHQpJiYocj1uLmZpbmRCeUlkKHQpKSx0aGlzLnNldEl0ZW1TdGF0ZShyLGUsITEpLHRoaXMuc2V0SXRlbVN0YXRlKHIsZSwhMCl9LHQucHJvdG90eXBlLmNsZWFySXRlbVN0YXRlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ3JhcGg7T2JqZWN0KGgueCkodCkmJih0PW4uZmluZEJ5SWQodCkpLG4uZW1pdChcImJlZm9yZWl0ZW1zdGF0ZXNjbGVhclwiLHtpdGVtOnQsc3RhdGVzOmV9KSx0LmNsZWFyU3RhdGVzKGUpLG4uZW1pdChcImFmdGVyaXRlbXN0YXRlc2NsZWFyXCIse2l0ZW06dCxzdGF0ZXM6ZX0pfSx0LnByb3RvdHlwZS5yZWZyZXNoSXRlbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdyYXBoO09iamVjdChoLngpKHQpJiYodD1lLmZpbmRCeUlkKHQpKSxlLmVtaXQoXCJiZWZvcmVpdGVtcmVmcmVzaFwiLHtpdGVtOnR9KSx0LnJlZnJlc2goKSxlLmVtaXQoXCJhZnRlcml0ZW1yZWZyZXNoXCIse2l0ZW06dH0pfSx0LnByb3RvdHlwZS5hZGRDb21ib3M9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dGhpcy5ncmFwaDsodHx8W10pLmZvckVhY2goKGZ1bmN0aW9uKHQpe0x0KHQsKGZ1bmN0aW9uKHQpe3ZhciByO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuaWQ9PT10LmlkJiYoZS5jaGlsZHJlbj10LmNoaWxkcmVuLGUuZGVwdGg9dC5kZXB0aCxyPWUpfSkpLHImJm4uYWRkSXRlbShcImNvbWJvXCIsciksITB9KSl9KSk7dmFyIGk9ci5nZXQoXCJjb21ib0dyb3VwXCIpO2kmJmkuc29ydCgpfSx0LnByb3RvdHlwZS5jaGFuZ2VJdGVtVmlzaWJpbGl0eT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdyYXBoO2lmKE9iamVjdChoLngpKHQpJiYodD1yLmZpbmRCeUlkKHQpKSx0KXtpZihyLmVtaXQoXCJiZWZvcmVpdGVtdmlzaWJpbGl0eWNoYW5nZVwiLHtpdGVtOnQsdmlzaWJsZTplfSksdC5jaGFuZ2VWaXNpYmlsaXR5KGUpLHQuZ2V0VHlwZSYmXCJub2RlXCI9PT10LmdldFR5cGUoKSl7dmFyIGk9dC5nZXRFZGdlcygpO09iamVjdChoLmYpKGksKGZ1bmN0aW9uKHQpeyghZXx8dC5nZXQoXCJzb3VyY2VcIikuaXNWaXNpYmxlKCkmJnQuZ2V0KFwidGFyZ2V0XCIpLmlzVmlzaWJsZSgpKSYmbi5jaGFuZ2VJdGVtVmlzaWJpbGl0eSh0LGUpfSkpfWVsc2UgaWYodC5nZXRUeXBlJiZcImNvbWJvXCI9PT10LmdldFR5cGUoKSl7dmFyIG89ci5nZXQoXCJjb21ib1RyZWVzXCIpLGE9dC5nZXQoXCJpZFwiKSxzPVtdLHU9ITE7KG98fFtdKS5mb3JFYWNoKChmdW5jdGlvbih0KXt1fHx0LmNoaWxkcmVuJiYwIT09dC5jaGlsZHJlbi5sZW5ndGgmJlJ0KHQsKGZ1bmN0aW9uKHQpe3JldHVybiB0LmlkIT09YXx8KHM9dC5jaGlsZHJlbix1PSEwLCExKX0pKX0pKSxzJiZzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBpPXIuZmluZEJ5SWQodC5pZCk7bi5jaGFuZ2VJdGVtVmlzaWJpbGl0eShpLGUpfSkpO2k9dC5nZXRFZGdlcygpO09iamVjdChoLmYpKGksKGZ1bmN0aW9uKHQpeyghZXx8dC5nZXQoXCJzb3VyY2VcIikuaXNWaXNpYmxlKCkmJnQuZ2V0KFwidGFyZ2V0XCIpLmlzVmlzaWJsZSgpKSYmbi5jaGFuZ2VJdGVtVmlzaWJpbGl0eSh0LGUpfSkpfXJldHVybiByLmVtaXQoXCJhZnRlcml0ZW12aXNpYmlsaXR5Y2hhbmdlXCIse2l0ZW06dCx2aXNpYmxlOmV9KSx0fWNvbnNvbGUud2FybihcIlRoZSBpdGVtIHRvIGJlIHNob3duIG9yIGhpZGRlbiBkb2VzIG5vdCBleGlzdCFcIil9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmdyYXBoPW51bGwsdGhpcy5kZXN0cm95ZWQ9ITB9LHR9KCksdWU9bnVsbCxjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5ncmFwaD10LHRoaXMuY2FjaGVkU3RhdGVzPXtlbmFibGVkOnt9LGRpc2FibGVkOnt9fSx0aGlzLmRlc3Ryb3llZD0hMX1yZXR1cm4gdC5jaGVja0NhY2hlPWZ1bmN0aW9uKHQsZSxuKXtpZihuW2VdKXt2YXIgcj1uW2VdLmluZGV4T2YodCk7cj49MCYmbltlXS5zcGxpY2UociwxKX19LHQuY2FjaGVTdGF0ZT1mdW5jdGlvbih0LGUsbil7bltlXXx8KG5bZV09W10pLG5bZV0ucHVzaCh0KX0sdC5wcm90b3R5cGUudXBkYXRlU3RhdGU9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXRoaXMsbz10LmNoZWNrQ2FjaGUsYT10LmNhY2hlU3RhdGU7aWYoIWUuZGVzdHJveWVkKXt2YXIgcz10aGlzLmNhY2hlZFN0YXRlcyx1PXMuZW5hYmxlZCxjPXMuZGlzYWJsZWQ7cj8obyhlLG4sYyksYShlLG4sdSkpOihvKGUsbix1KSxhKGUsbixjKSksdWUmJmNsZWFyVGltZW91dCh1ZSksdWU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt1ZT1udWxsLGkudXBkYXRlR3JhcGhTdGF0ZXMoKX0pLDE2KX19LHQucHJvdG90eXBlLnVwZGF0ZVN0YXRlcz1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztPYmplY3QoaC54KShlKT90aGlzLnVwZGF0ZVN0YXRlKHQsZSxuKTplLmZvckVhY2goKGZ1bmN0aW9uKGUpe3IudXBkYXRlU3RhdGUodCxlLG4pfSkpfSx0LnByb3RvdHlwZS51cGRhdGVHcmFwaFN0YXRlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ3JhcGguZ2V0KFwic3RhdGVzXCIpLGU9dGhpcy5jYWNoZWRTdGF0ZXM7T2JqZWN0KGguZikoZS5kaXNhYmxlZCwoZnVuY3Rpb24oZSxuKXt0W25dJiYodFtuXT10W25dLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIGUuaW5kZXhPZih0KTwwJiYhZS5kZXN0cm95ZWR9KSkpfSkpLE9iamVjdChoLmYpKGUuZW5hYmxlZCwoZnVuY3Rpb24oZSxuKXtpZih0W25dKXt2YXIgcj17fTt0W25dLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZGVzdHJveWVkfHwoclt0LmdldChcImlkXCIpXT0hMCl9KSksZS5mb3JFYWNoKChmdW5jdGlvbihlKXtpZighZS5kZXN0cm95ZWQpe3ZhciBpPWUuZ2V0KFwiaWRcIik7cltpXXx8KHJbaV09ITAsdFtuXS5wdXNoKGUpKX19KSl9ZWxzZSB0W25dPWV9KSksdGhpcy5ncmFwaC5lbWl0KFwiZ3JhcGhzdGF0ZWNoYW5nZVwiLHtzdGF0ZXM6dH0pLHRoaXMuY2FjaGVkU3RhdGVzPXtlbmFibGVkOnt9LGRpc2FibGVkOnt9fX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZ3JhcGg9bnVsbCx0aGlzLmNhY2hlZFN0YXRlcz1udWxsLHVlJiZjbGVhclRpbWVvdXQodWUpLHVlPW51bGwsdGhpcy5kZXN0cm95ZWQ9ITB9LHR9KCksZmU9bigzOCksbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmZT90LnJlcGxhY2UoL1xcXFw/XFx7KFtee31dKylcXH0vZywoZnVuY3Rpb24odCxuKXtpZihcIlxcXFxcIj09PXQuY2hhckF0KDApKXJldHVybiB0LnNsaWNlKDEpO3ZhciByPWVbbl07cmV0dXJuIDA9PT1yJiYocj1cIjBcIikscnx8XCJcIn0pKTp0fSxoZT1mdW5jdGlvbih0KXt2YXIgZT1bXTtpZih0Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcihcInBvaW50IGxlbmd0aCBtdXN0IGxhcmduIHRoYW4gMiwgbm93IGl0J3MgXCIrdC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9dDtuPHIubGVuZ3RoO24rKyl7dmFyIGk9cltuXSxvPWkueCxhPWkueTtlLnB1c2gobyksZS5wdXNoKGEpfXZhciBzPU9iamVjdChmZS5hKShlKTtyZXR1cm4gcy51bnNoaWZ0KFtcIk1cIix0WzBdLngsdFswXS55XSksc30sZGU9ZnVuY3Rpb24odCxlLG4scil7dm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09ciYmKHI9MCk7dmFyIGk9e3g6KDEtbikqdC54K24qZS54LHk6KDEtbikqdC55K24qZS55fSxvPVswLDBdO20uYy5ub3JtYWxpemUobyxbZS54LXQueCxlLnktdC55XSksbyYmKG9bMF18fG9bMV0pfHwobz1bMCwwXSk7dmFyIGE9Wy1vWzFdKnIsb1swXSpyXTtyZXR1cm4gaS54Kz1hWzBdLGkueSs9YVsxXSxpfSxwZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQubGVuZ3RoO2lmKCFuKXJldHVyblwiXCI7Zm9yKHZhciByPVwiXCIsaT0wO2k8bjtpKyspe3ZhciBvPXRbaV07cis9bGUoMD09PWk/XCJNe3h9IHt5fVwiOlwiTHt4fSB7eX1cIixvKX1yZXR1cm4gZSYmKHIrPVwiWlwiKSxyfSxnZT1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZihcIkFcIiE9PXRbMF0pZm9yKHZhciBuPTE7bjx0Lmxlbmd0aDtuKz0yKWUucHVzaChbdFtuXSx0W24rMV1dKTtlbHNle3ZhciByPXQubGVuZ3RoO2UucHVzaChbdFtyLTJdLHRbci0xXV0pfX0pKSxlfSx2ZT1mdW5jdGlvbih0KXtpZih0Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcihcInBvaW50IGxlbmd0aCBtdXN0IGxhcmduIHRoYW4gMiwgbm93IGl0J3MgXCIrdC5sZW5ndGgpO3ZhciBlPXRbMF0sbj10WzFdLHI9dFt0Lmxlbmd0aC0xXSxpPXRbdC5sZW5ndGgtMl07dC51bnNoaWZ0KHIpLHQudW5zaGlmdChpKSx0LnB1c2goZSksdC5wdXNoKG4pO2Zvcih2YXIgbz1bXSxhPTE7YTx0Lmxlbmd0aC0yO2ErPTEpe3ZhciBzPXRbYS0xXS54LHU9dFthLTFdLnksYz10W2FdLngsZj10W2FdLnksbD10W2ErMV0ueCxoPXRbYSsxXS55LGQ9YysobC1zKS82LHA9ZisoaC11KS82LGc9bC0oKGEhPT10Lmxlbmd0aC0yP3RbYSsyXS54OmwpLWMpLzYsdj1oLSgoYSE9PXQubGVuZ3RoLTI/dFthKzJdLnk6aCktZikvNjtvLnB1c2goW1wiQ1wiLGQscCxnLHYsbCxoXSl9cmV0dXJuIG8udW5zaGlmdChbXCJNXCIsci54LHIueV0pLG99LHllPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG0uYy5zY2FsZShbMCwwXSxtLmMubm9ybWFsaXplKFswLDBdLHQpLGUpfSxtZT1mdW5jdGlvbih0LGUpe3ZhciBuPVt0WzFdLWVbMV0sZVswXS10WzBdXSxyPU1hdGguc3FydChuWzBdKm5bMF0rblsxXSpuWzFdKTtpZigwPT09cil0aHJvdyBuZXcgRXJyb3IoXCJwMCBzaG91bGQgbm90IGJlIGVxdWFsIHRvIHAxXCIpO3JldHVybltuWzBdL3IsblsxXS9yXX0sYmU9ZnVuY3Rpb24odCxlKXtyZXR1cm5bZVswXS10WzBdLGVbMV0tdFsxXV19O2Z1bmN0aW9uIHhlKHQsZSl7aWYoIXR8fHQubGVuZ3RoPDEpcmV0dXJuXCJcIjtpZigxPT09dC5sZW5ndGgpcmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPVt0WzBdWzBdLHRbMF1bMV0tZV0scj1bdFswXVswXSx0WzBdWzFdK2VdO3JldHVyblwiTSBcIituK1wiIEEgXCIrZStcIixcIitlK1wiLDAsMCwwLFwiK3IrXCIgQSBcIitlK1wiLFwiK2UrXCIsMCwwLDAsXCIrbn0odCk7aWYoMj09PXQubGVuZ3RoKXJldHVybiBmdW5jdGlvbih0KXt2YXIgbj1tLmMuc2NhbGUoWzAsMF0sbWUodFswXSx0WzFdKSxlKSxyPW0uYy5zY2FsZShbMCwwXSxuLC0xKSxpPW0uYy5hZGQoWzAsMF0sdFswXSxuKSxvPW0uYy5hZGQoWzAsMF0sdFsxXSxuKSxhPW0uYy5hZGQoWzAsMF0sdFsxXSxyKSxzPW0uYy5hZGQoWzAsMF0sdFswXSxyKTtyZXR1cm5cIk0gXCIraStcIiBMIFwiK28rXCIgQSBcIitbZSxlLFwiMCwwLDBcIixhXS5qb2luKFwiLFwiKStcIiBMIFwiK3MrXCIgQSBcIitbZSxlLFwiMCwwLDBcIixpXS5qb2luKFwiLFwiKX0odCk7Zm9yKHZhciBuPW5ldyBBcnJheSh0Lmxlbmd0aCkscj0wO3I8bi5sZW5ndGg7KytyKXt2YXIgaT0wPT09cj90W3QubGVuZ3RoLTFdOnRbci0xXSxvPXRbcl0sYT1tLmMuc2NhbGUoWzAsMF0sbWUoaSxvKSxlKTtuW3JdPVttLmMuYWRkKFswLDBdLGksYSksbS5jLmFkZChbMCwwXSxvLGEpXX12YXIgcz1cIkEgXCIrW2UsZSxcIjAsMCwwLFwiXS5qb2luKFwiLFwiKTtyZXR1cm4obj1uLm1hcCgoZnVuY3Rpb24odCxlKXt2YXIgcj1cIlwiO3JldHVybiAwPT09ZSYmKHI9XCJNIFwiK25bbi5sZW5ndGgtMV1bMV0rXCIgXCIpLHIrPXMrdFswXStcIiBMIFwiK3RbMV19KSkpLmpvaW4oXCIgXCIpfWZ1bmN0aW9uIHdlKHQsZSl7dmFyIG4scixpLG89dC5sZW5ndGg7aWYoIXR8fG88MSlyZXR1cm5cIlwiO2lmKDE9PT1vKXJldHVybiByPVsobj10KVswXVswXSxuWzBdWzFdLWVdLGk9W25bMF1bMF0sblswXVsxXStlXSxcIk0gXCIrcitcIiBBIFwiK1tlLGUsXCIwLDAsMFwiLGldLmpvaW4oXCIsXCIpK1wiIEEgXCIrW2UsZSxcIjAsMCwwXCIscl0uam9pbihcIixcIik7aWYoMj09PW8pcmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPWJlKHRbMF0sdFsxXSkscj15ZShuLGUpLGk9bS5jLmFkZChbMCwwXSx0WzBdLG0uYy5zY2FsZShbMCwwXSxyLC0xKSksbz1tLmMuYWRkKFswLDBdLHRbMV0sciksYT0xLjIqZSxzPXllKG0uYy5ub3JtYWxpemUoWzAsMF0sbiksYSksdT1tLmMuc2NhbGUoWzAsMF0scywtMSksYz1tLmMuYWRkKFswLDBdLGksdSksZj1tLmMuYWRkKFswLDBdLG8sdSksbD1tLmMuYWRkKFswLDBdLGkscyk7cmV0dXJuXCJNIFwiK2krXCIgQyBcIitbYyxmLG9dLmpvaW4oXCIsXCIpK1wiIFMgXCIrW2wsaV0uam9pbihcIixcIikrXCIgWlwifSh0KTtmb3IodmFyIGE9dC5tYXAoKGZ1bmN0aW9uKGUsbil7dmFyIHI9dFsobisxKSVvXTtyZXR1cm57cDplLHY6bS5jLm5vcm1hbGl6ZShbMCwwXSxiZShlLHIpKX19KSkscz0wO3M8YS5sZW5ndGg7KytzKXt2YXIgdT1zPjA/cy0xOm8tMSxjPW0uYy5ub3JtYWxpemUoWzAsMF0sbS5jLmFkZChbMCwwXSxhW3VdLnYsbS5jLnNjYWxlKFswLDBdLGFbc10udiwtMSkpKTthW3NdLnA9bS5jLmFkZChbMCwwXSxhW3NdLnAsbS5jLnNjYWxlKFswLDBdLGMsZSkpfXJldHVybiBhLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9dC5wO3JldHVybnt4OmVbMF0seTplWzFdfX0pKX12YXIgU2U9ZnVuY3Rpb24odCxlLG4pe3JldHVybih0Lnktbi55KSooZS54LW4ueCktKHQueC1uLngpKihlLnktbi55KX0sRWU9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybnt4OnQuZ2V0TW9kZWwoKS54LHk6dC5nZXRNb2RlbCgpLnl9fSkpO2lmKGUuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC54PT09ZS54P3QueS1lLnk6dC54LWUueH0pKSwxPT09ZS5sZW5ndGgpcmV0dXJuIGU7Zm9yKHZhciBuPVtdLHI9MDtyPGUubGVuZ3RoO3IrKyl7Zm9yKDtuLmxlbmd0aD49MiYmU2UobltuLmxlbmd0aC0yXSxuW24ubGVuZ3RoLTFdLGVbcl0pPD0wOyluLnBvcCgpO24ucHVzaChlW3JdKX12YXIgaT1bXTtmb3Iocj1lLmxlbmd0aC0xO3I+PTA7ci0tKXtmb3IoO2kubGVuZ3RoPj0yJiZTZShpW2kubGVuZ3RoLTJdLGlbaS5sZW5ndGgtMV0sZVtyXSk8PTA7KWkucG9wKCk7aS5wdXNoKGVbcl0pfXJldHVybiBpLnBvcCgpLG4ucG9wKCksbi5jb25jYXQoaSl9LF9lPXttYXhSb3V0aW5nSXRlcmF0aW9uczoxMDAsbWF4TWFyY2hpbmdJdGVyYXRpb25zOjEwMCxwaXhlbEdyb3VwU2l6ZToyLGVkZ2VSMDoxMCxlZGdlUjE6MTAsbm9kZVIwOjUsbm9kZVIxOjEwLG1vcnBoQnVmZmVyOjUsdGhyZXNob2xkOi4wMDEsc2tpcDoxNixub2RlSW5mbHVlbmNlRmFjdG9yOjEsZWRnZUluZmx1ZW5jZUZhY3RvcjoxLG5lZ2F0aXZlTm9kZUluZmx1ZW5jZUZhY3RvcjotLjV9O2Z1bmN0aW9uIE9lKHQsZSxuKXt2YXIgcj0hMSxpPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2VsbHNbdCtuKmUud2lkdGhdfSxvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9MDtyZXR1cm4gaSh0LTEsZS0xKT49biYmKHIrPTEpLGkodCxlLTEpPm4mJihyKz0yKSxpKHQtMSxlKT5uJiYocis9NCksaSh0LGUpPm4mJihyKz04KSxyfSxhPWZ1bmN0aW9uKG4scil7Zm9yKHZhciBpLGEscz1uLHU9cixjPTA7YzxlLndpZHRoKmUuaGVpZ2h0O2MrKyl7aWYoaT1zLGE9dSx0LmZpbmRJbmRleCgoZnVuY3Rpb24odCl7cmV0dXJuIHQueD09PXMmJnQueT09PXV9KSk+LTEpe2lmKHRbMF0ueD09PXMmJnRbMF0ueT09PXUpcmV0dXJuITB9ZWxzZSB0LnB1c2goe3g6cyx5OnV9KTt2YXIgZj1vKHMsdSk7c3dpdGNoKGYpe2Nhc2UtMTpyZXR1cm4gY29uc29sZS53YXJuKFwiTWFyY2hlZCBvdXQgb2YgYm91bmRzXCIpLCEwO2Nhc2UgMDpjYXNlIDM6Y2FzZSAyOmNhc2UgNzpzKys7YnJlYWs7Y2FzZSAxMjpjYXNlIDE0OmNhc2UgNDpzLS07YnJlYWs7Y2FzZSA2OjA9PT1pJiYoLTE9PT1hP3MtPTE6cys9MSk7YnJlYWs7Y2FzZSAxOmNhc2UgMTM6Y2FzZSA1OnUtLTticmVhaztjYXNlIDk6MT09PWkmJigwPT09YT91LT0xOnUrPTEpO2JyZWFrO2Nhc2UgMTA6Y2FzZSA4OmNhc2UgMTE6dSsrO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIGNvbnNvbGUud2FybihcIk1hcmNoaW5nIHNxdWFyZXMgaW52YWxpZCBzdGF0ZTogXCIrZiksITB9fX07dGhpcy5tYXJjaD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8ZS53aWR0aCYmIXI7dCs9MSlmb3IodmFyIHM9MDtzPGUuaGVpZ2h0JiYhcjtzKz0xKWkodCxzKT5uJiYxNSE9PW8odCxzKSYmKHI9YSh0LHMpKTtyZXR1cm4gcn19dmFyIGtlPWZ1bmN0aW9uKHQsZSl7dmFyIG49TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHI9bnVsbDtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgaT1RKHQsZSk7aT49MCYmaTxuJiYocj10LG49aSl9KSkscn07ZnVuY3Rpb24gTWUodCxlLG4scixpKXt2YXIgbz1mdW5jdGlvbih0LGUsbil7dmFyIHI9bnVsbCxpPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbz17eDp0LmdldE1vZGVsKCkueCx5OnQuZ2V0TW9kZWwoKS55fSxhPXt4OmUuZ2V0TW9kZWwoKS54LHk6ZS5nZXRNb2RlbCgpLnl9LHM9JChvLGEpLHU9bmV3IEgoby54LG8ueSxhLngsYS55KSxjPW4ucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBRKGUsdSk+MD90KzE6dH0pLDApO3MqTWF0aC5wb3coYysxLDIpPGkmJihyPWUsaT1zKk1hdGgucG93KGMrMSwyKSl9KSkscn0odCxuLGUpO2lmKG51bGw9PT1vKXJldHVybltdO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG49W107dC5sZW5ndGg+MDspe3ZhciByPXQucG9wKCk7aWYoMD09PXQubGVuZ3RoKXtuLnB1c2gocik7YnJlYWt9dmFyIGk9dC5wb3AoKSxvPW5ldyBIKHIueDEsci55MSxpLngyLGkueTIpO2tlKGUsbyk/KG4ucHVzaChyKSx0LnB1c2goaSkpOnQucHVzaChvKX1yZXR1cm4gbn0oZnVuY3Rpb24odCxlLG4scil7dmFyIGk9W10sbz1bXTtvLnB1c2godCk7Zm9yKHZhciBhPSEwLHM9MCx1PWZ1bmN0aW9uKHQsZSl7dmFyIG49ITE7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bnx8KGV0KHQse3g6ZS54MSx5OmUueTF9KXx8ZXQodCx7eDplLngyLHk6ZS55Mn0pKSYmKG49ITApfSkpLG59LGM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPWU7bjxyLmxlbmd0aDtuKyspe3ZhciBpPXJbbl0uZ2V0QkJveCgpLG89W1tpLngsaS55XSxbaS54K2kud2lkdGgsaS55XSxbaS54LGkueStpLmhlaWdodF0sW2kueCtpLndpZHRoLGkueStpLmhlaWdodF1dO2lmKFcobyx0LngsdC55KSlyZXR1cm4hMH1yZXR1cm4hMX07YSYmczxuOyl7YT0hMTtmb3IodmFyIGY9ZnVuY3Rpb24oKXt2YXIgdD1vLnBvcCgpLG49a2UoZSx0KTtpZihuKXt2YXIgZj1aKG4sdCksbD1mWzBdO2lmKDI9PT1mWzFdKXt2YXIgaD1mdW5jdGlvbihzKXtmb3IodmFyIGY9cixoPUNlKG4sZixsLHMpLGQ9dShoLG8pfHx1KGgsaSkscD1jKGgsZSk7IWQmJnAmJmY+PTE7KWg9Q2UobixmLz0xLjUsbCxzKSxkPXUoaCxvKXx8dShoLGkpLHA9YyhoLGUpOyFofHxkfHxzJiZwfHwoby5wdXNoKG5ldyBIKHQueDEsdC55MSxoLngsaC55KSksby5wdXNoKG5ldyBIKGgueCxoLnksdC54Mix0LnkyKSksYT0hMCl9O2goITApLGF8fGgoITEpfX1hfHxpLnB1c2godCkscys9MX07IWEmJm8ubGVuZ3RoOylmKCl9Zm9yKDtvLmxlbmd0aDspaS5wdXNoKG8ucG9wKCkpO3JldHVybiBpfShuZXcgSCh0LmdldE1vZGVsKCkueCx0LmdldE1vZGVsKCkueSxvLmdldE1vZGVsKCkueCxvLmdldE1vZGVsKCkueSksZSxyLGkpKX12YXIgQWU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPU9iamVjdC5hc3NpZ24oX2UsbiksaT1KKHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm57eDp0LmdldE1vZGVsKCkueCx5OnQuZ2V0TW9kZWwoKS55fX0pKSk7dD10LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuICQoe3g6dC5nZXRNb2RlbCgpLngseTp0LmdldE1vZGVsKCkueX0saSktJCh7eDplLmdldE1vZGVsKCkueCx5OmUuZ2V0TW9kZWwoKS55fSxpKX0pKTt2YXIgbz1bXSxhPVtdO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7TWUodCxlLG8sci5tYXhSb3V0aW5nSXRlcmF0aW9ucyxyLm1vcnBoQnVmZmVyKS5mb3JFYWNoKChmdW5jdGlvbih0KXthLnB1c2godCl9KSksby5wdXNoKHQpfSkpO2Zvcih2YXIgcyx1LGMsZixsLGg9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXttaW5YOk51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtaW5ZOk51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtYXhYOk51bWJlci5ORUdBVElWRV9JTkZJTklUWSxtYXhZOk51bWJlci5ORUdBVElWRV9JTkZJTklUWSx3aWR0aDowLGhlaWdodDowLHg6MCx5OjB9LGk9W107dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpLnB1c2godC5nZXRCQm94KCkpfSkpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5wdXNoKHQuZ2V0QkJveCgpKX0pKTtmb3IodmFyIG89MCxhPWk7bzxhLmxlbmd0aDtvKyspe3ZhciBzPWFbb107ci5taW5YPShzLm1pblg8ci5taW5YP3MubWluWDpyLm1pblgpLW4sci5taW5ZPShzLm1pblk8ci5taW5ZP3MubWluWTpyLm1pblkpLW4sci5tYXhYPShzLm1heFg+ci5tYXhYP3MubWF4WDpyLm1heFgpK24sci5tYXhZPShzLm1heFk+ci5tYXhZP3MubWF4WTpyLm1heFkpK259cmV0dXJuIHIud2lkdGg9ci5tYXhYLXIubWluWCxyLmhlaWdodD1yLm1heFktci5taW5ZLHIueD1yLm1pblgsci55PXIubWluWSxyfSh0LGEsci5ub2RlUjApLGQ9KHM9aC53aWR0aCx1PWguaGVpZ2h0LGM9ci5waXhlbEdyb3VwU2l6ZSxmPU1hdGguY2VpbChzL2MpLGw9TWF0aC5jZWlsKHUvYykse2NlbGxzOm5ldyBGbG9hdDMyQXJyYXkoTWF0aC5tYXgoMCxmKmwpKS5maWxsKDApLHdpZHRoOmYsaGVpZ2h0Omx9KSxwPVtdLGc9W10sdj0wO3Y8ci5tYXhNYXJjaGluZ0l0ZXJhdGlvbnM7disrKWlmKFRlKHQsZSxhLGgsZCxyKSxnPVtdLG5ldyBPZShwPVtdLGQsci50aHJlc2hvbGQpLm1hcmNoKCkpe3ZhciB5PXAubWFwKChmdW5jdGlvbih0KXtyZXR1cm57eDpNYXRoLnJvdW5kKHQueCpyLnBpeGVsR3JvdXBTaXplK2gubWluWCkseTpNYXRoLnJvdW5kKHQueSpyLnBpeGVsR3JvdXBTaXplK2gubWluWSl9fSkpO2lmKHkpe3ZhciBtPXkubGVuZ3RoO2lmKHIuc2tpcD4xKWZvcihtPU1hdGguZmxvb3IoeS5sZW5ndGgvci5za2lwKTttPDMmJnIuc2tpcD4xOylyLnNraXAtPTEsbT1NYXRoLmZsb29yKHkubGVuZ3RoL3Iuc2tpcCk7Zm9yKHZhciBiPTAseD0wO3g8bTt4Kz0xLGIrPXIuc2tpcClnLnB1c2goe3g6eVtiXS54LHk6eVtiXS55fSl9aWYoZyYmZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxuPXQ7ZTxuLmxlbmd0aDtlKyspe3ZhciByPW5bZV0saT1nLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuW3QueCx0LnldfSkpO2lmKCFXKGksci5nZXRCQm94KCkuY2VudGVyWCxyLmdldEJCb3goKS5jZW50ZXJZKSlyZXR1cm4hMX1yZXR1cm4hMH0oKSlyZXR1cm4gZztpZihyLnRocmVzaG9sZCo9Ljksdjw9LjUqci5tYXhNYXJjaGluZ0l0ZXJhdGlvbnMpci5tZW1iZXJJbmZsdWVuY2VGYWN0b3IqPTEuMixyLmVkZ2VJbmZsdWVuY2VGYWN0b3IqPTEuMjtlbHNle2lmKCEoMCE9PXIubm9uTWVtYmVySW5mbHVlbmNlRmFjdG9yJiZlLmxlbmd0aD4wKSlicmVhaztyLm5vbk1lbWJlckluZmx1ZW5jZUZhY3Rvcio9Ljh9fXJldHVybiBnfTtmdW5jdGlvbiBUZSh0LGUsbixyLGksbyl7ZnVuY3Rpb24gYSh0LGUpe3ZhciBuPU1hdGguZmxvb3IoKHQtZSkvby5waXhlbEdyb3VwU2l6ZSk7cmV0dXJuIG48MD8wOm59ZnVuY3Rpb24gcyh0LGUpe3JldHVybiB0Km8ucGl4ZWxHcm91cFNpemUrZX12YXIgdT0oby5ub2RlUjAtby5ub2RlUjEpKihvLm5vZGVSMC1vLm5vZGVSMSksYz0oby5lZGdlUjAtby5lZGdlUjEpKihvLmVkZ2VSMC1vLmVkZ2VSMSksZj1mdW5jdGlvbih0LGUpe3JldHVybltNYXRoLm1pbihhKHQubWluWCxlK3IubWluWCksaS53aWR0aCksTWF0aC5taW4oYSh0Lm1pblksZStyLm1pblkpLGkuaGVpZ2h0KSxNYXRoLm1pbihhKHQubWF4WCwtZStyLm1pblgpLGkud2lkdGgpLE1hdGgubWluKGEodC5tYXhZLC1lK3IubWluWSksaS5oZWlnaHQpXX0sbD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmdldEJCb3goKSxhPWYobixvLm5vZGVSMSksdT1hWzBdLGM9YVsxXSxsPWFbMl0saD1hWzNdLGQ9YztkPGg7ZCs9MSlmb3IodmFyIHA9dTtwPGw7cCs9MSlpZighKGU8MCYmaVtwK2QqaS53aWR0aF08PTApKXt2YXIgZz1zKHAsci5taW5YKSx2PXMoZCxyLm1pblkpLHk9bnQoe3g6Zyx5OnZ9LHt4Om4ubWluWCx5Om4ubWluWSx3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodH0pO2lmKHk8TWF0aC5wb3coby5ub2RlUjEsMikpe3ZhciBtPU1hdGguc3FydCh5KS1vLm5vZGVSMTtpLmNlbGxzW3ArZCppLndpZHRoXSs9ZSptKm19fX07by5ub2RlSW5mbHVlbmNlRmFjdG9yJiZ0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2wodCxvLm5vZGVJbmZsdWVuY2VGYWN0b3IvdSl9KSksby5lZGdlSW5mbHVlbmNlRmFjdG9yJiZuLmZvckVhY2goKGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmdldEJCb3goKSxhPWYobixvLmVkZ2VSMSksdT1hWzBdLGM9YVsxXSxsPWFbMl0saD1hWzNdLGQ9YztkPGg7ZCs9MSlmb3IodmFyIHA9dTtwPGw7cCs9MSlpZighKGU8MCYmaS5jZWxsc1twK2QqaS53aWR0aF08PTApKXt2YXIgZz1zKHAsci5taW5YKSx2PXMoZCxyLm1pblkpLHk9dHQoe3g6Zyx5OnZ9LHQpO2lmKHk8TWF0aC5wb3coby5lZGdlUjEsMikpe3ZhciBtPU1hdGguc3FydCh5KS1vLmVkZ2VSMTtpLmNlbGxzW3ArZCppLndpZHRoXSs9ZSptKm19fX0odCxvLmVkZ2VJbmZsdWVuY2VGYWN0b3IvYyl9KSksby5uZWdhdGl2ZU5vZGVJbmZsdWVuY2VGYWN0b3ImJmUuZm9yRWFjaCgoZnVuY3Rpb24odCl7bCh0LG8ubmVnYXRpdmVOb2RlSW5mbHVlbmNlRmFjdG9yL3UpfSkpfWZ1bmN0aW9uIENlKHQsZSxuLHIpe3ZhciBpPXQuZ2V0QkJveCgpLG89blswXSxhPW5bMV0scz1uWzJdLHU9blszXSxjPXt0b3BMZWZ0Ont4OmkubWluWC1lLHk6aS5taW5ZLWV9LHRvcFJpZ2h0Ont4OmkubWF4WCtlLHk6aS5taW5ZLWV9LGJvdHRvbUxlZnQ6e3g6aS5taW5YLWUseTppLm1heFkrZX0sYm90dG9tUmlnaHQ6e3g6aS5tYXhYK2UseTppLm1heFkrZX19LGY9aS5oZWlnaHQqaS53aWR0aDtmdW5jdGlvbiBsKHQsZSl7cmV0dXJuIGkud2lkdGgqKC41Kih0LnktaS5taW5ZKyhlLnktaS5taW5ZKSkpfWlmKGEpcmV0dXJuIG8/cj9jLnRvcExlZnQ6Yy5ib3R0b21SaWdodDpzP3I/Yy5ib3R0b21MZWZ0OmMudG9wUmlnaHQ6bChhLHUpPC41KmY/YS55PnUueT9yP2MudG9wTGVmdDpjLmJvdHRvbVJpZ2h0OnI/Yy50b3BSaWdodDpjLmJvdHRvbUxlZnQ6YS55PHUueT9yP2MuYm90dG9tTGVmdDpjLnRvcFJpZ2h0OnI/Yy5ib3R0b21SaWdodDpjLnRvcExlZnQ7aWYodSl7aWYobylyZXR1cm4gcj9jLnRvcFJpZ2h0OmMuYm90dG9tTGVmdDtpZihzKXJldHVybiByP2MuYm90dG9tUmlnaHQ6Yy50b3BMZWZ0fXJldHVybiBsKG8scyk8LjUqZj9vLng+cy54P3I/Yy50b3BMZWZ0OmMuYm90dG9tUmlnaHQ6cj9jLmJvdHRvbUxlZnQ6Yy50b3BSaWdodDpvLng8cy54P3I/Yy50b3BSaWdodDpjLmJvdHRvbUxlZnQ6cj9jLmJvdHRvbVJpZ2h0OmMudG9wTGVmdH12YXIgSWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5jZmc9T2JqZWN0KGguZSkodGhpcy5nZXREZWZhdWx0Q2ZnKCksZSksdGhpcy5ncmFwaD10LHRoaXMuaWQ9dGhpcy5jZmcuaWQsdGhpcy5ncm91cD10aGlzLmNmZy5ncm91cCx0aGlzLm1lbWJlcnM9dGhpcy5jZmcubWVtYmVycy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoaC54KShlKT90LmZpbmRCeUlkKGUpOmV9KSksdGhpcy5ub25NZW1iZXJzPXRoaXMuY2ZnLm5vbk1lbWJlcnMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KGgueCkoZSk/dC5maW5kQnlJZChlKTplfSkpLHRoaXMuc2V0UGFkZGluZygpLHRoaXMuc2V0VHlwZSgpLHRoaXMucGF0aD10aGlzLmNhbGNQYXRoKHRoaXMubWVtYmVycyx0aGlzLm5vbk1lbWJlcnMpLHRoaXMucmVuZGVyKCl9cmV0dXJuIHQucHJvdG90eXBlLmdldERlZmF1bHRDZmc9ZnVuY3Rpb24oKXtyZXR1cm57aWQ6XCJnNi1odWxsXCIsdHlwZTpcInJvdW5kLWNvbnZleFwiLG1lbWJlcnM6W10sbm9uTWVtYmVyczpbXSxzdHlsZTp7ZmlsbDpcImxpZ2h0Ymx1ZVwiLHN0cm9rZTpcImJsdWVcIixvcGFjaXR5Oi4yfSxwYWRkaW5nOjEwfX0sdC5wcm90b3R5cGUuc2V0UGFkZGluZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMubWVtYmVycy5sZW5ndGgmJnRoaXMubWVtYmVyc1swXS5nZXRLZXlTaGFwZSgpLmdldENhbnZhc0JCb3goKS53aWR0aC8yO3RoaXMucGFkZGluZz10aGlzLmNmZy5wYWRkaW5nPjA/dGhpcy5jZmcucGFkZGluZyt0OjEwK3QsdGhpcy5jZmcuYnViYmxlQ2ZnPXtub2RlUjA6dGhpcy5wYWRkaW5nLXQsbm9kZVIxOnRoaXMucGFkZGluZy10LG1vcnBoQnVmZmVyOnRoaXMucGFkZGluZy10fX0sdC5wcm90b3R5cGUuc2V0VHlwZT1mdW5jdGlvbigpe3RoaXMudHlwZT10aGlzLmNmZy50eXBlLHRoaXMubWVtYmVycy5sZW5ndGg8MyYmKHRoaXMudHlwZT1cInJvdW5kLWNvbnZleFwiKSxcInJvdW5kLWNvbnZleFwiIT09dGhpcy50eXBlJiZcInNtb290aC1jb252ZXhcIiE9PXRoaXMudHlwZSYmXCJidWJibGVcIiE9PXRoaXMudHlwZSYmKGNvbnNvbGUud2FybihcIlRoZSBodWxsIHR5cGUgc2hvdWxkIGJlIGVpdGhlciByb3VuZC1jb252ZXgsIHNtb290aC1jb252ZXggb3IgYnViYmxlLCByb3VuZC1jb252ZXggaXMgdXNlZCBieSBkZWZhdWx0LlwiKSx0aGlzLnR5cGU9XCJyb3VuZC1jb252ZXhcIil9LHQucHJvdG90eXBlLmNhbGNQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpO3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2VcInJvdW5kLWNvbnZleFwiOmk9eGUoKG49RWUodCkpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuW3QueCx0LnldfSkpLHRoaXMucGFkZGluZykscj1PYmplY3QoZmUuYikoaSk7YnJlYWs7Y2FzZVwic21vb3RoLWNvbnZleFwiOjI9PT0obj1FZSh0KSkubGVuZ3RoPyhpPXhlKG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm5bdC54LHQueV19KSksdGhpcy5wYWRkaW5nKSxyPU9iamVjdChmZS5iKShpKSk6bi5sZW5ndGg+MiYmKGk9d2Uobi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVyblt0LngsdC55XX0pKSx0aGlzLnBhZGRpbmcpLHI9dmUoaSkpO2JyZWFrO2Nhc2VcImJ1YmJsZVwiOnI9KG49QWUodCxlLHRoaXMuY2ZnLmJ1YmJsZUNmZykpLmxlbmd0aD49MiYmdmUobil9cmV0dXJuIHJ9LHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuZ3JvdXAuYWRkU2hhcGUoXCJwYXRoXCIse2F0dHJzOk9iamVjdCh2LmEpKHtwYXRoOnRoaXMucGF0aH0sdGhpcy5jZmcuc3R5bGUpLGlkOnRoaXMuaWQsbmFtZTp0aGlzLmNmZy5pZH0pLHRoaXMuZ3JvdXAudG9CYWNrKCl9LHQucHJvdG90eXBlLmFkZE1lbWJlcj1mdW5jdGlvbih0KXtpZih0KXtPYmplY3QoaC54KSh0KSYmKHQ9dGhpcy5ncmFwaC5maW5kQnlJZCh0KSksdGhpcy5tZW1iZXJzLnB1c2godCk7dmFyIGU9dGhpcy5ub25NZW1iZXJzLmluZGV4T2YodCk7cmV0dXJuIGU+LTEmJnRoaXMubm9uTWVtYmVycy5zcGxpY2UoZSwxKSx0aGlzLnVwZGF0ZURhdGEodGhpcy5tZW1iZXJzLHRoaXMubm9uTWVtYmVycyksITB9fSx0LnByb3RvdHlwZS5hZGROb25NZW1iZXI9ZnVuY3Rpb24odCl7aWYodCl7T2JqZWN0KGgueCkodCkmJih0PXRoaXMuZ3JhcGguZmluZEJ5SWQodCkpLHRoaXMubm9uTWVtYmVycy5wdXNoKHQpO3ZhciBlPXRoaXMubWVtYmVycy5pbmRleE9mKHQpO3JldHVybiBlPi0xJiZ0aGlzLm1lbWJlcnMuc3BsaWNlKGUsMSksdGhpcy51cGRhdGVEYXRhKHRoaXMubWVtYmVycyx0aGlzLm5vbk1lbWJlcnMpLCEwfX0sdC5wcm90b3R5cGUucmVtb3ZlTWVtYmVyPWZ1bmN0aW9uKHQpe2lmKHQpe09iamVjdChoLngpKHQpJiYodD10aGlzLmdyYXBoLmZpbmRCeUlkKHQpKTt2YXIgZT10aGlzLm1lbWJlcnMuaW5kZXhPZih0KTtyZXR1cm4gZT4tMSYmKHRoaXMubWVtYmVycy5zcGxpY2UoZSwxKSx0aGlzLnVwZGF0ZURhdGEodGhpcy5tZW1iZXJzLHRoaXMubm9uTWVtYmVycyksITApfX0sdC5wcm90b3R5cGUucmVtb3ZlTm9uTWVtYmVyPWZ1bmN0aW9uKHQpe2lmKHQpe09iamVjdChoLngpKHQpJiYodD10aGlzLmdyYXBoLmZpbmRCeUlkKHQpKTt2YXIgZT10aGlzLm5vbk1lbWJlcnMuaW5kZXhPZih0KTtyZXR1cm4gZT4tMSYmKHRoaXMubm9uTWVtYmVycy5zcGxpY2UoZSwxKSx0aGlzLnVwZGF0ZURhdGEodGhpcy5tZW1iZXJzLHRoaXMubm9uTWVtYmVycyksITApfX0sdC5wcm90b3R5cGUudXBkYXRlRGF0YT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5ncm91cC5maW5kQnlJZCh0aGlzLmlkKS5yZW1vdmUoKSx0JiYodGhpcy5tZW1iZXJzPXQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KGgueCkodCk/bi5ncmFwaC5maW5kQnlJZCh0KTp0fSkpKSxlJiYodGhpcy5ub25NZW1iZXJzPWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KGgueCkodCk/bi5ncmFwaC5maW5kQnlJZCh0KTp0fSkpKSx0aGlzLnBhdGg9dGhpcy5jYWxjUGF0aCh0aGlzLm1lbWJlcnMsdGhpcy5ub25NZW1iZXJzKSx0aGlzLnJlbmRlcigpfSx0LnByb3RvdHlwZS51cGRhdGVTdHlsZT1mdW5jdGlvbih0KXt0aGlzLmdyb3VwLmZpbmRCeUlkKHRoaXMuaWQpLmF0dHIoT2JqZWN0KHYuYSkoe30sdCkpfSx0LnByb3RvdHlwZS51cGRhdGVDZmc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLmNmZz1PYmplY3QoaC5lKSh0aGlzLmNmZyx0KSx0aGlzLmlkPXRoaXMuY2ZnLmlkLHRoaXMuZ3JvdXA9dGhpcy5jZmcuZ3JvdXAsdC5tZW1iZXJzJiYodGhpcy5tZW1iZXJzPXRoaXMuY2ZnLm1lbWJlcnMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KGgueCkodCk/ZS5ncmFwaC5maW5kQnlJZCh0KTp0fSkpKSx0Lm5vbk1lbWJlcnMmJih0aGlzLm5vbk1lbWJlcnM9dGhpcy5jZmcubm9uTWVtYmVycy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QoaC54KSh0KT9lLmdyYXBoLmZpbmRCeUlkKHQpOnR9KSkpLHRoaXMuc2V0UGFkZGluZygpLHRoaXMuc2V0VHlwZSgpLHRoaXMucGF0aD10aGlzLmNhbGNQYXRoKHRoaXMubWVtYmVycyx0aGlzLm5vbk1lbWJlcnMpLHRoaXMucmVuZGVyKCl9LHQucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCl7dmFyIGUsbixyPXRoaXMsaT0oZT1PYmplY3QoaC54KSh0KT90aGlzLmdyYXBoLmZpbmRCeUlkKHQpOnQpLmdldEtleVNoYXBlKCk7aWYoXCJwYXRoXCI9PT1lLmdldChcInR5cGVcIikpbj1nZShpLmF0dHIoXCJwYXRoXCIpKTtlbHNle3ZhciBvPWkuZ2V0Q2FudmFzQkJveCgpO249W1tvLm1pblgsby5taW5ZXSxbby5tYXhYLG8ubWluWV0sW28ubWF4WCxvLm1heFldLFtvLm1pblgsby5tYXhZXV19cmV0dXJuIG49bi5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPXIuZ3JhcGguZ2V0UG9pbnRCeUNhbnZhcyh0WzBdLHRbMV0pO3JldHVybltlLngsZS55XX0pKSxZKG4sZ2UodGhpcy5wYXRoKSl9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmdyb3VwLnJlbW92ZSgpLHRoaXMuY2ZnPW51bGx9LHR9KCksUGU9bS5hLnRyYW5zZm9ybSxqZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5jZmc9T2JqZWN0KGguZSkobi5nZXREZWZhdWx0Q2ZnKCksZSksbi5pbml0KCksbi5hbmltYXRpbmc9ITEsbi5kZXN0cm95ZWQ9ITEsbi5jZmcuZW5hYmxlZFN0YWNrJiYobi51bmRvU3RhY2s9bmV3IGIuU3RhY2sobi5jZmcubWF4U3RlcCksbi5yZWRvU3RhY2s9bmV3IGIuU3RhY2sobi5jZmcubWF4U3RlcCkpLG59cmV0dXJuIE9iamVjdCh2LmIpKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuaW5pdENhbnZhcygpO3ZhciB0PW5ldyBPdCh0aGlzKSxlPW5ldyBkdCh0aGlzKSxuPW5ldyBzZSh0aGlzKSxyPW5ldyBjZSh0aGlzKTt0aGlzLnNldCh7dmlld0NvbnRyb2xsZXI6dCxtb2RlQ29udHJvbGxlcjplLGl0ZW1Db250cm9sbGVyOm4sc3RhdGVDb250cm9sbGVyOnJ9KSx0aGlzLmluaXRMYXlvdXRDb250cm9sbGVyKCksdGhpcy5pbml0RXZlbnRDb250cm9sbGVyKCksdGhpcy5pbml0R3JvdXBzKCksdGhpcy5pbml0UGx1Z2lucygpfSxlLnByb3RvdHlwZS5pbml0R3JvdXBzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJjYW52YXNcIiksZT10aGlzLmdldChcImNhbnZhc1wiKS5nZXQoXCJlbFwiKS5pZCxuPXQuYWRkR3JvdXAoe2lkOmUrXCItcm9vdFwiLGNsYXNzTmFtZTpodC5yb290Q29udGFpbmVyQ2xhc3NOYW1lfSk7aWYodGhpcy5nZXQoXCJncm91cEJ5VHlwZXNcIikpe3ZhciByPW4uYWRkR3JvdXAoe2lkOmUrXCItZWRnZVwiLGNsYXNzTmFtZTpodC5lZGdlQ29udGFpbmVyQ2xhc3NOYW1lfSksaT1uLmFkZEdyb3VwKHtpZDplK1wiLW5vZGVcIixjbGFzc05hbWU6aHQubm9kZUNvbnRhaW5lckNsYXNzTmFtZX0pLG89bi5hZGRHcm91cCh7aWQ6ZStcIi1jb21ib1wiLGNsYXNzTmFtZTpodC5jb21ib0NvbnRhaW5lckNsYXNzTmFtZX0pO28udG9CYWNrKCksdGhpcy5zZXQoe25vZGVHcm91cDppLGVkZ2VHcm91cDpyLGNvbWJvR3JvdXA6b30pfXZhciBhPW4uYWRkR3JvdXAoe2lkOmUrXCItZGVsZWdhdGVcIixjbGFzc05hbWU6aHQuZGVsZWdhdGVDb250YWluZXJDbGFzc05hbWV9KTt0aGlzLnNldCh7ZGVsZWdhdGVHcm91cDphfSksdGhpcy5zZXQoXCJncm91cFwiLG4pfSxlLnByb3RvdHlwZS5nZXREZWZhdWx0Q2ZnPWZ1bmN0aW9uKCl7cmV0dXJue2NvbnRhaW5lcjp2b2lkIDAsd2lkdGg6dm9pZCAwLGhlaWdodDp2b2lkIDAscmVuZGVyZXI6XCJjYW52YXNcIixtb2Rlczp7fSxwbHVnaW5zOltdLGRhdGE6e30sZml0Vmlld1BhZGRpbmc6MTAsbWluWm9vbTouMixtYXhab29tOjEwLGV2ZW50OiEwLGdyb3VwQnlUeXBlczohMCxkaXJlY3RlZDohMSxhdXRvUGFpbnQ6ITAsbm9kZXM6W10sZWRnZXM6W10sY29tYm9zOltdLHZlZGdlczpbXSxpdGVtTWFwOnt9LGxpbmtDZW50ZXI6ITEsZGVmYXVsdE5vZGU6e30sZGVmYXVsdEVkZ2U6e30sbm9kZVN0YXRlU3R5bGVzOnt9LGVkZ2VTdGF0ZVN0eWxlczp7fSxzdGF0ZXM6e30sYW5pbWF0ZTohMSxhbmltYXRlQ2ZnOntvbkZyYW1lOnZvaWQgMCxkdXJhdGlvbjo1MDAsZWFzaW5nOlwiZWFzZUxpbmVhclwifSxjYWxsYmFjazp2b2lkIDAsZW5hYmxlZFN0YWNrOiExLG1heFN0ZXA6MTAsdG9vbHRpcHM6W119fSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0KGgudykodCk/dGhpcy5jZmc9T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sdGhpcy5jZmcpLHQpOnRoaXMuY2ZnW3RdPWUsdGhpc30sZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNmZ1t0XX0sZS5wcm90b3R5cGUuZ2V0R3JvdXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJncm91cFwiKX0sZS5wcm90b3R5cGUuZ2V0Q29udGFpbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwiY29udGFpbmVyXCIpfSxlLnByb3RvdHlwZS5nZXRNaW5ab29tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwibWluWm9vbVwiKX0sZS5wcm90b3R5cGUuc2V0TWluWm9vbT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXQoXCJtaW5ab29tXCIsdCl9LGUucHJvdG90eXBlLmdldE1heFpvb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJtYXhab29tXCIpfSxlLnByb3RvdHlwZS5zZXRNYXhab29tPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNldChcIm1heFpvb21cIix0KX0sZS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJ3aWR0aFwiKX0sZS5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwiaGVpZ2h0XCIpfSxlLnByb3RvdHlwZS5jbGVhckl0ZW1TdGF0ZXM9ZnVuY3Rpb24odCxlKXtPYmplY3QoaC54KSh0KSYmKHQ9dGhpcy5maW5kQnlJZCh0KSk7dmFyIG49dGhpcy5nZXQoXCJpdGVtQ29udHJvbGxlclwiKTtlfHwoZT10LmdldChcInN0YXRlc1wiKSksbi5jbGVhckl0ZW1TdGF0ZXModCxlKSx0aGlzLmdldChcInN0YXRlQ29udHJvbGxlclwiKS51cGRhdGVTdGF0ZXModCxlLCExKX0sZS5wcm90b3R5cGUubm9kZT1mdW5jdGlvbih0KXtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiZ0aGlzLnNldChcIm5vZGVNYXBwZXJcIix0KX0sZS5wcm90b3R5cGUuZWRnZT1mdW5jdGlvbih0KXtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiZ0aGlzLnNldChcImVkZ2VNYXBwZXJcIix0KX0sZS5wcm90b3R5cGUuY29tYm89ZnVuY3Rpb24odCl7XCJmdW5jdGlvblwiPT10eXBlb2YgdCYmdGhpcy5zZXQoXCJjb21ib01hcHBlclwiLHQpfSxlLnByb3RvdHlwZS5maW5kQnlJZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXQoXCJpdGVtTWFwXCIpW3RdfSxlLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzLmdldCh0K1wic1wiKTtyZXR1cm4gT2JqZWN0KGguZikociwoZnVuY3Rpb24odCxyKXtpZihlKHQscikpcmV0dXJuIG49dH0pKSxufSxlLnByb3RvdHlwZS5maW5kQWxsPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107cmV0dXJuIE9iamVjdChoLmYpKHRoaXMuZ2V0KHQrXCJzXCIpLChmdW5jdGlvbih0LHIpe2UodCxyKSYmbi5wdXNoKHQpfSkpLG59LGUucHJvdG90eXBlLmZpbmRBbGxCeVN0YXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZmluZEFsbCh0LChmdW5jdGlvbih0KXtyZXR1cm4gdC5oYXNTdGF0ZShlKX0pKX0sZS5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXQoXCJncm91cFwiKSxyPU9iamVjdChoLmMpKG4uZ2V0TWF0cml4KCkpO3J8fChyPVsxLDAsMCwwLDEsMCwwLDAsMV0pLHI9UGUocixbW1widFwiLHQsZV1dKSxuLnNldE1hdHJpeChyKSx0aGlzLmVtaXQoXCJ2aWV3cG9ydGNoYW5nZVwiLHthY3Rpb246XCJ0cmFuc2xhdGVcIixtYXRyaXg6bi5nZXRNYXRyaXgoKX0pLHRoaXMuYXV0b1BhaW50KCl9LGUucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0KFwiZ3JvdXBcIik7TihuLHt4OnQseTplfSksdGhpcy5lbWl0KFwidmlld3BvcnRjaGFuZ2VcIix7YWN0aW9uOlwibW92ZVwiLG1hdHJpeDpuLmdldE1hdHJpeCgpfSl9LGUucHJvdG90eXBlLmZpdFZpZXc9ZnVuY3Rpb24odCl7dCYmdGhpcy5zZXQoXCJmaXRWaWV3UGFkZGluZ1wiLHQpLHRoaXMuZ2V0KFwidmlld0NvbnRyb2xsZXJcIikuZml0VmlldygpLHRoaXMuYXV0b1BhaW50KCl9LGUucHJvdG90eXBlLmZpdENlbnRlcj1mdW5jdGlvbigpe3RoaXMuZ2V0KFwidmlld0NvbnRyb2xsZXJcIikuZml0Q2VudGVyKCksdGhpcy5hdXRvUGFpbnQoKX0sZS5wcm90b3R5cGUuYWRkQmVoYXZpb3JzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZ2V0KFwibW9kZUNvbnRyb2xsZXJcIikubWFuaXB1bGF0ZUJlaGF2aW9ycyh0LGUsITApLHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUJlaGF2aW9ycz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmdldChcIm1vZGVDb250cm9sbGVyXCIpLm1hbmlwdWxhdGVCZWhhdmlvcnModCxlLCExKSx0aGlzfSxlLnByb3RvdHlwZS51cGRhdGVCZWhhdmlvcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuZ2V0KFwibW9kZUNvbnRyb2xsZXJcIikudXBkYXRlQmVoYXZpb3IodCxlLG4pLHRoaXN9LGUucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldChcImdyb3VwXCIpLHI9T2JqZWN0KGguYykobi5nZXRNYXRyaXgoKSksaT10aGlzLmdldChcIm1pblpvb21cIiksbz10aGlzLmdldChcIm1heFpvb21cIik7cnx8KHI9WzEsMCwwLDAsMSwwLDAsMCwxXSkscj1QZShyLGU/W1tcInRcIiwtZS54LC1lLnldLFtcInNcIix0LHRdLFtcInRcIixlLngsZS55XV06W1tcInNcIix0LHRdXSksaSYmclswXTxpfHxvJiZyWzBdPm98fChuLnNldE1hdHJpeChyKSx0aGlzLmVtaXQoXCJ2aWV3cG9ydGNoYW5nZVwiLHthY3Rpb246XCJ6b29tXCIsbWF0cml4OnJ9KSx0aGlzLmF1dG9QYWludCgpKX0sZS5wcm90b3R5cGUuem9vbVRvPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC90aGlzLmdldFpvb20oKTt0aGlzLnpvb20obixlKX0sZS5wcm90b3R5cGUuZm9jdXNJdGVtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLmdldChcInZpZXdDb250cm9sbGVyXCIpLGk9ITE7ZT9pPSEwOnZvaWQgMD09PWUmJihpPXRoaXMuZ2V0KFwiYW5pbWF0ZVwiKSk7dmFyIG89e307bj9vPW46dm9pZCAwPT09biYmKG89dGhpcy5nZXQoXCJhbmltYXRlQ2ZnXCIpKSxyLmZvY3VzKHQsaSxvKSx0aGlzLmF1dG9QYWludCgpfSxlLnByb3RvdHlwZS5hdXRvUGFpbnQ9ZnVuY3Rpb24oKXt0aGlzLmdldChcImF1dG9QYWludFwiKSYmdGhpcy5wYWludCgpfSxlLnByb3RvdHlwZS5wYWludD1mdW5jdGlvbigpe3RoaXMuZW1pdChcImJlZm9yZXBhaW50XCIpLHRoaXMuZ2V0KFwiY2FudmFzXCIpLmRyYXcoKSx0aGlzLmVtaXQoXCJhZnRlcnBhaW50XCIpfSxlLnByb3RvdHlwZS5nZXRQb2ludEJ5Q2xpZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZ2V0KFwidmlld0NvbnRyb2xsZXJcIikuZ2V0UG9pbnRCeUNsaWVudCh0LGUpfSxlLnByb3RvdHlwZS5nZXRDbGllbnRCeVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZ2V0KFwidmlld0NvbnRyb2xsZXJcIikuZ2V0Q2xpZW50QnlQb2ludCh0LGUpfSxlLnByb3RvdHlwZS5nZXRQb2ludEJ5Q2FudmFzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZ2V0KFwidmlld0NvbnRyb2xsZXJcIikuZ2V0UG9pbnRCeUNhbnZhcyh0LGUpfSxlLnByb3RvdHlwZS5nZXRDYW52YXNCeVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZ2V0KFwidmlld0NvbnRyb2xsZXJcIikuZ2V0Q2FudmFzQnlQb2ludCh0LGUpfSxlLnByb3RvdHlwZS5zaG93SXRlbT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPSEwKTt2YXIgbj10aGlzLmdldChcIml0ZW1Db250cm9sbGVyXCIpLmNoYW5nZUl0ZW1WaXNpYmlsaXR5KHQsITApO2lmKGUmJnRoaXMuZ2V0KFwiZW5hYmxlZFN0YWNrXCIpKXt2YXIgcj1uLmdldElEKCksaT17fSxvPXt9O3N3aXRjaChuLmdldFR5cGUoKSl7Y2FzZVwibm9kZVwiOmkubm9kZXM9W3tpZDpyLHZpc2libGU6ITF9XSxvLm5vZGVzPVt7aWQ6cix2aXNpYmxlOiEwfV07YnJlYWs7Y2FzZVwiZWRnZVwiOmkubm9kZXM9W3tpZDpyLHZpc2libGU6ITF9XSxvLmVkZ2VzPVt7aWQ6cix2aXNpYmxlOiEwfV07YnJlYWs7Y2FzZVwiY29tYm9cIjppLm5vZGVzPVt7aWQ6cix2aXNpYmxlOiExfV0sby5jb21ib3M9W3tpZDpyLHZpc2libGU6ITB9XX10aGlzLnB1c2hTdGFjayhcInZpc2libGVcIix7YmVmb3JlOmksYWZ0ZXI6b30pfX0sZS5wcm90b3R5cGUuaGlkZUl0ZW09ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT0hMCk7dmFyIG49dGhpcy5nZXQoXCJpdGVtQ29udHJvbGxlclwiKS5jaGFuZ2VJdGVtVmlzaWJpbGl0eSh0LCExKTtpZihlJiZ0aGlzLmdldChcImVuYWJsZWRTdGFja1wiKSl7dmFyIHI9bi5nZXRJRCgpLGk9e30sbz17fTtzd2l0Y2gobi5nZXRUeXBlKCkpe2Nhc2VcIm5vZGVcIjppLm5vZGVzPVt7aWQ6cix2aXNpYmxlOiEwfV0sby5ub2Rlcz1be2lkOnIsdmlzaWJsZTohMX1dO2JyZWFrO2Nhc2VcImVkZ2VcIjppLm5vZGVzPVt7aWQ6cix2aXNpYmxlOiEwfV0sby5lZGdlcz1be2lkOnIsdmlzaWJsZTohMX1dO2JyZWFrO2Nhc2VcImNvbWJvXCI6aS5ub2Rlcz1be2lkOnIsdmlzaWJsZTohMH1dLG8uY29tYm9zPVt7aWQ6cix2aXNpYmxlOiExfV19dGhpcy5wdXNoU3RhY2soXCJ2aXNpYmxlXCIse2JlZm9yZTppLGFmdGVyOm99KX19LGUucHJvdG90eXBlLnJlZnJlc2hJdGVtPWZ1bmN0aW9uKHQpe3RoaXMuZ2V0KFwiaXRlbUNvbnRyb2xsZXJcIikucmVmcmVzaEl0ZW0odCl9LGUucHJvdG90eXBlLnNldEF1dG9QYWludD1mdW5jdGlvbih0KXt0aGlzLnNldChcImF1dG9QYWludFwiLHQpLHRoaXMuZ2V0KFwiY2FudmFzXCIpLnNldChcImF1dG9EcmF3XCIsdCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPSEwKSx0aGlzLnJlbW92ZUl0ZW0odCxlKX0sZS5wcm90b3R5cGUucmVtb3ZlSXRlbT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPSEwKTt2YXIgbj10O2lmKE9iamVjdChoLngpKHQpJiYobj10aGlzLmZpbmRCeUlkKHQpKSwhbiYmT2JqZWN0KGgueCkodCkpY29uc29sZS53YXJuKFwiVGhlIGl0ZW0gdG8gYmUgcmVtb3ZlZCBkb2VzIG5vdCBleGlzdCFcIik7ZWxzZSBpZihuKXt2YXIgcj1cIlwiO2lmKG4uZ2V0VHlwZSYmKHI9bi5nZXRUeXBlKCkpLGUmJnRoaXMuZ2V0KFwiZW5hYmxlZFN0YWNrXCIpKXt2YXIgaT1PYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxuLmdldE1vZGVsKCkpLHtpdGVtVHlwZTpyfSksbz17fTtzd2l0Y2gocil7Y2FzZVwibm9kZVwiOm8ubm9kZXM9W2ldLG8uZWRnZXM9W107Zm9yKHZhciBhPW4uZ2V0RWRnZXMoKSxzPWEubGVuZ3RoLTE7cz49MDtzLS0pby5lZGdlcy5wdXNoKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGFbc10uZ2V0TW9kZWwoKSkse2l0ZW1UeXBlOlwiZWRnZVwifSkpO2JyZWFrO2Nhc2VcImVkZ2VcIjpvLmVkZ2VzPVtpXTticmVhaztjYXNlXCJjb21ib1wiOm8uY29tYm9zPVtpXX10aGlzLnB1c2hTdGFjayhcImRlbGV0ZVwiLHtiZWZvcmU6byxhZnRlcjp7fX0pfWlmKFwibm9kZVwiPT09ciluLmdldE1vZGVsKCkuY29tYm9JZCYmdGhpcy51cGRhdGVDb21ib1RyZWUobik7aWYodGhpcy5nZXQoXCJpdGVtQ29udHJvbGxlclwiKS5yZW1vdmVJdGVtKG4pLFwiY29tYm9cIj09PXIpe3ZhciB1PVV0KHRoaXMuZ2V0KFwiY29tYm9UcmVlc1wiKSk7dGhpcy5zZXQoXCJjb21ib1RyZWVzXCIsdSl9fX0sZS5wcm90b3R5cGUuYWRkSXRlbT1mdW5jdGlvbih0LGUsbixyKXt2b2lkIDA9PT1uJiYobj0hMCksdm9pZCAwPT09ciYmKHI9ITApO3ZhciBpPXRoaXMuZ2V0KFwiY29tYm9Tb3J0ZWRcIik7dGhpcy5zZXQoXCJjb21ib1NvcnRlZFwiLGkmJiFyKTt2YXIgbz10aGlzLmdldChcIml0ZW1Db250cm9sbGVyXCIpO2lmKCFlLmlkfHwhdGhpcy5maW5kQnlJZChlLmlkKSl7dmFyIGEscz10aGlzLmdldChcImNvbWJvVHJlZXNcIik7aWYoc3x8KHM9W10pLFwiY29tYm9cIj09PXQpe3ZhciB1PXRoaXMuZ2V0KFwiaXRlbU1hcFwiKSxjPSExO2lmKHMuZm9yRWFjaCgoZnVuY3Rpb24obil7Y3x8THQobiwoZnVuY3Rpb24obil7aWYoZS5wYXJlbnRJZD09PW4uaWQpe2M9ITA7dmFyIHI9T2JqZWN0KHYuYSkoe2lkOmUuaWQsZGVwdGg6bi5kZXB0aCsyfSxlKTtuLmNoaWxkcmVuP24uY2hpbGRyZW4ucHVzaChyKTpuLmNoaWxkcmVuPVtyXSxlLmRlcHRoPXIuZGVwdGgsYT1vLmFkZEl0ZW0odCxlKX12YXIgaT11W24uaWRdO3JldHVybiBjJiZpJiZpLmdldFR5cGUmJlwiY29tYm9cIj09PWkuZ2V0VHlwZSgpJiZvLnVwZGF0ZUNvbWJvKGksbi5jaGlsZHJlbiksITB9KSl9KSksIWMpe3ZhciBmPU9iamVjdCh2LmEpKHtpZDplLmlkLGRlcHRoOjB9LGUpO2UuZGVwdGg9Zi5kZXB0aCxzLnB1c2goZiksYT1vLmFkZEl0ZW0odCxlKX10aGlzLnNldChcImNvbWJvVHJlZXNcIixzKX1lbHNlIGlmKFwibm9kZVwiPT09dCYmT2JqZWN0KGgueCkoZS5jb21ib0lkKSYmcyl7dmFyIGw7aWYoKGw9dGhpcy5maW5kQnlJZChlLmNvbWJvSWQpKSYmbC5nZXRUeXBlJiZcImNvbWJvXCIhPT1sLmdldFR5cGUoKSlyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oXCInXCIrZS5jb21ib0lkK1wiJyBpcyBhIG5vdCBpZCBvZiBhIGNvbWJvIGluIHRoZSBncmFwaCwgdGhlIG5vZGUgd2lsbCBiZSBhZGRlZCB3aXRob3V0IGNvbWJvLlwiKTthPW8uYWRkSXRlbSh0LGUpO3ZhciBkPXRoaXMuZ2V0KFwiaXRlbU1hcFwiKSxwPSExLGc9ITE7KHN8fFtdKS5mb3JFYWNoKChmdW5jdGlvbih0KXtnfHxwfHxMdCh0LChmdW5jdGlvbih0KXtpZih0LmlkPT09ZS5pZClyZXR1cm4gZz0hMCwhMTtpZihlLmNvbWJvSWQ9PT10LmlkJiYhZyl7cD0hMDt2YXIgbj1PYmplY3QoaC5jKShlKTtuLml0ZW1UeXBlPVwibm9kZVwiLHQuY2hpbGRyZW4/dC5jaGlsZHJlbi5wdXNoKG4pOnQuY2hpbGRyZW49W25dLGUuZGVwdGg9dC5kZXB0aCsxfXJldHVybiBwJiZkW3QuaWRdLmdldFR5cGUmJlwiY29tYm9cIj09PWRbdC5pZF0uZ2V0VHlwZSgpJiZvLnVwZGF0ZUNvbWJvKGRbdC5pZF0sdC5jaGlsZHJlbiksITB9KSl9KSl9ZWxzZSBhPW8uYWRkSXRlbSh0LGUpO2lmKFwibm9kZVwiPT09dCYmZS5jb21ib0lkfHxcImNvbWJvXCI9PT10JiZlLnBhcmVudElkKShsPXRoaXMuZmluZEJ5SWQoZS5jb21ib0lkfHxlLnBhcmVudElkKSkmJmwuYWRkQ2hpbGQoYSk7dmFyIHk9dGhpcy5nZXQoXCJjb21ib3NcIik7aWYoeSYmeS5sZW5ndGg+MCYmdGhpcy5zb3J0Q29tYm9zKCksdGhpcy5hdXRvUGFpbnQoKSxuJiZ0aGlzLmdldChcImVuYWJsZWRTdGFja1wiKSl7dmFyIG09T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sYS5nZXRNb2RlbCgpKSx7aXRlbVR5cGU6dH0pLGI9e307c3dpdGNoKHQpe2Nhc2VcIm5vZGVcIjpiLm5vZGVzPVttXTticmVhaztjYXNlXCJlZGdlXCI6Yi5lZGdlcz1bbV07YnJlYWs7Y2FzZVwiY29tYm9cIjpiLmNvbWJvcz1bbV19dGhpcy5wdXNoU3RhY2soXCJhZGRcIix7YmVmb3JlOnt9LGFmdGVyOmJ9KX1yZXR1cm4gYX1jb25zb2xlLndhcm4oXCJUaGlzIGl0ZW0gZXhpc3RzIGFscmVhZHkuIEJlIHN1cmUgdGhlIGlkICVjXCIrZS5pZCtcIiVjIGlzIHVuaXF1ZS5cIixcImZvbnQtc2l6ZTogMjBweDsgY29sb3I6IHJlZDtcIixcIlwiKX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB2b2lkIDA9PT1uJiYobj0hMCksdm9pZCAwPT09ciYmKHI9ITApLHRoaXMuYWRkSXRlbSh0LGUsbixyKX0sZS5wcm90b3R5cGUudXBkYXRlSXRlbT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt2b2lkIDA9PT1uJiYobj0hMCk7dmFyIGksbz10aGlzLmdldChcIml0ZW1Db250cm9sbGVyXCIpO2k9T2JqZWN0KGgueCkodCk/dGhpcy5maW5kQnlJZCh0KTp0O3ZhciBhPU9iamVjdChoLmMpKGkuZ2V0TW9kZWwoKSkscz1cIlwiO2kuZ2V0VHlwZSYmKHM9aS5nZXRUeXBlKCkpO3ZhciB1PU9iamVjdCh2LmQpKGkuZ2V0U3RhdGVzKCkpO2lmKFwiY29tYm9cIj09PXMmJk9iamVjdChoLmYpKHUsKGZ1bmN0aW9uKHQpe3JldHVybiByLnNldEl0ZW1TdGF0ZShpLHQsITEpfSkpLG8udXBkYXRlSXRlbShpLGUpLFwiY29tYm9cIj09PXMmJk9iamVjdChoLmYpKHUsKGZ1bmN0aW9uKHQpe3JldHVybiByLnNldEl0ZW1TdGF0ZShpLHQsITApfSkpLG4mJnRoaXMuZ2V0KFwiZW5hYmxlZFN0YWNrXCIpKXt2YXIgYz17bm9kZXM6W10sZWRnZXM6W10sY29tYm9zOltdfSxmPXtub2RlczpbXSxlZGdlczpbXSxjb21ib3M6W119LGw9T2JqZWN0KHYuYSkoe2lkOmEuaWR9LGUpO3N3aXRjaChzKXtjYXNlXCJub2RlXCI6Yy5ub2Rlcy5wdXNoKGEpLGYubm9kZXMucHVzaChsKTticmVhaztjYXNlXCJlZGdlXCI6Yy5lZGdlcy5wdXNoKGEpLGYuZWRnZXMucHVzaChsKTticmVhaztjYXNlXCJjb21ib1wiOmMuY29tYm9zLnB1c2goYSksZi5jb21ib3MucHVzaChsKX1cIm5vZGVcIj09PXMmJmMubm9kZXMucHVzaChhKSx0aGlzLnB1c2hTdGFjayhcInVwZGF0ZVwiLHtiZWZvcmU6YyxhZnRlcjpmfSl9fSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PW4mJihuPSEwKSx0aGlzLnVwZGF0ZUl0ZW0odCxlLG4pfSxlLnByb3RvdHlwZS5zZXRJdGVtU3RhdGU9ZnVuY3Rpb24odCxlLG4pe09iamVjdChoLngpKHQpJiYodD10aGlzLmZpbmRCeUlkKHQpKSx0aGlzLmdldChcIml0ZW1Db250cm9sbGVyXCIpLnNldEl0ZW1TdGF0ZSh0LGUsbik7dmFyIHI9dGhpcy5nZXQoXCJzdGF0ZUNvbnRyb2xsZXJcIik7T2JqZWN0KGgueCkobik/ci51cGRhdGVTdGF0ZSh0LGUrXCI6XCIrbiwhMCk6ci51cGRhdGVTdGF0ZSh0LGUsbil9LGUucHJvdG90eXBlLnByaW9yaXR5U3RhdGU9ZnVuY3Rpb24odCxlKXt0aGlzLmdldChcIml0ZW1Db250cm9sbGVyXCIpLnByaW9yaXR5U3RhdGUodCxlKX0sZS5wcm90b3R5cGUuZGF0YT1mdW5jdGlvbih0KXt0aGlzLnNldChcImRhdGFcIix0KX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLnNldChcImNvbWJvU29ydGVkXCIsITEpO3ZhciBlPXRoaXMuZ2V0KFwiZGF0YVwiKTtpZih0aGlzLmdldChcImVuYWJsZWRTdGFja1wiKSYmdGhpcy5jbGVhclN0YWNrKCksIWUpdGhyb3cgbmV3IEVycm9yKFwiZGF0YSBtdXN0IGJlIGRlZmluZWQgZmlyc3RcIik7dmFyIG49ZS5ub2RlcyxyPXZvaWQgMD09PW4/W106bixpPWUuZWRnZXMsbz12b2lkIDA9PT1pP1tdOmksYT1lLmNvbWJvcyxzPXZvaWQgMD09PWE/W106YTtpZih0aGlzLmNsZWFyKCksdGhpcy5lbWl0KFwiYmVmb3JlcmVuZGVyXCIpLE9iamVjdChoLmYpKHIsKGZ1bmN0aW9uKGUpe3QuYWRkKFwibm9kZVwiLGUsITEsITEpfSkpLHMmJjAhPT1zLmxlbmd0aCl7dmFyIHU9RnQocyxyKTt0aGlzLnNldChcImNvbWJvVHJlZXNcIix1KSx0LmFkZENvbWJvcyhzKX1PYmplY3QoaC5mKShvLChmdW5jdGlvbihlKXt0LmFkZChcImVkZ2VcIixlLCExLCExKX0pKTt2YXIgYz10LmdldChcImFuaW1hdGVcIik7KHQuZ2V0KFwiZml0Vmlld1wiKXx8dC5nZXQoXCJmaXRDZW50ZXJcIikpJiZ0LnNldChcImFuaW1hdGVcIiwhMSk7dmFyIGY9dC5nZXQoXCJsYXlvdXRDb250cm9sbGVyXCIpO2lmKGYpe2lmKGYubGF5b3V0KChmdW5jdGlvbigpe3QuZ2V0KFwiZml0Vmlld1wiKT90LmZpdFZpZXcoKTp0LmdldChcImZpdENlbnRlclwiKSYmdC5maXRDZW50ZXIoKTt0LmF1dG9QYWludCgpLHQuZW1pdChcImFmdGVycmVuZGVyXCIpLCh0LmdldChcImZpdFZpZXdcIil8fHQuZ2V0KFwiZml0Q2VudGVyXCIpKSYmdC5zZXQoXCJhbmltYXRlXCIsYyl9KSksdGhpcy5kZXN0cm95ZWQpcmV0dXJufWVsc2UgdC5nZXQoXCJmaXRWaWV3XCIpJiZ0LmZpdFZpZXcoKSx0LmdldChcImZpdENlbnRlclwiKSYmdC5maXRDZW50ZXIoKSx0LmVtaXQoXCJhZnRlcnJlbmRlclwiKSx0LnNldChcImFuaW1hdGVcIixjKTt0aGlzLmdldChcImdyb3VwQnlUeXBlc1wiKXx8KHMmJjAhPT1zLmxlbmd0aD90aGlzLnNvcnRDb21ib3MoKTplLm5vZGVzJiZlLmVkZ2VzJiZlLm5vZGVzLmxlbmd0aDxlLmVkZ2VzLmxlbmd0aD90aGlzLmdldE5vZGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC50b0Zyb250KCl9KSk6dGhpcy5nZXRFZGdlcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QudG9CYWNrKCl9KSkpO3RoaXMuZ2V0KFwiZW5hYmxlZFN0YWNrXCIpJiZ0aGlzLnB1c2hTdGFjayhcInJlbmRlclwiKX0sZS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXt0aGlzLmRhdGEodCksdGhpcy5yZW5kZXIoKX0sZS5wcm90b3R5cGUuZGlmZkl0ZW1zPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpPXRoaXMsbz10aGlzLmdldChcIml0ZW1NYXBcIik7T2JqZWN0KGguZikobiwoZnVuY3Rpb24obil7aWYocj1vW24uaWRdKXtpZihpLmdldChcImFuaW1hdGVcIikmJlwibm9kZVwiPT09dCl7dmFyIGE9ci5nZXRDb250YWluZXIoKS5nZXRNYXRyaXgoKTthfHwoYT1bMSwwLDAsMCwxLDAsMCwwLDFdKSxyLnNldChcIm9yaWdpbkF0dHJzXCIse3g6YVs2XSx5OmFbN119KX1pLnVwZGF0ZUl0ZW0ocixuLCExKX1lbHNlIHI9aS5hZGRJdGVtKHQsbiwhMSk7ciYmZVt0K1wic1wiXS5wdXNoKHIpfSkpfSxlLnByb3RvdHlwZS5jaGFuZ2VEYXRhPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9ITApO3ZhciBuPXRoaXM7aWYoIXQpcmV0dXJuIHRoaXM7ZSYmdGhpcy5nZXQoXCJlbmFibGVkU3RhY2tcIikmJnRoaXMucHVzaFN0YWNrKFwiY2hhbmdlZGF0YVwiLHtiZWZvcmU6bi5zYXZlKCksYWZ0ZXI6dH0pLHRoaXMuc2V0KFwiY29tYm9Tb3J0ZWRcIiwhMSksdGhpcy5yZW1vdmVIdWxscygpLHRoaXMuZ2V0Tm9kZXMoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBuLmNsZWFySXRlbVN0YXRlcyh0KX0pKSx0aGlzLmdldEVkZ2VzKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbi5jbGVhckl0ZW1TdGF0ZXModCl9KSk7dmFyIHI9dGhpcy5nZXQoXCJjYW52YXNcIiksaT1yLmdldChcImxvY2FsUmVmcmVzaFwiKTtyLnNldChcImxvY2FsUmVmcmVzaFwiLCExKSxuLmdldChcImRhdGFcIil8fChuLmRhdGEodCksbi5yZW5kZXIoKSk7dmFyIG89dGhpcy5nZXQoXCJpdGVtTWFwXCIpLGE9e25vZGVzOltdLGVkZ2VzOltdfSxzPXQuY29tYm9zO2lmKHMpe3ZhciB1PUZ0KHMsdC5ub2Rlcyk7dGhpcy5zZXQoXCJjb21ib1RyZWVzXCIsdSl9dGhpcy5kaWZmSXRlbXMoXCJub2RlXCIsYSx0Lm5vZGVzKSxPYmplY3QoaC5mKShvLChmdW5jdGlvbih0LGUpe29bZV0uZ2V0TW9kZWwoKS5kZXB0aD0wLHQuZ2V0VHlwZSYmXCJlZGdlXCI9PT10LmdldFR5cGUoKXx8KHQuZ2V0VHlwZSYmXCJjb21ib1wiPT09dC5nZXRUeXBlKCk/KGRlbGV0ZSBvW2VdLHQuZGVzdHJveSgpKTphLm5vZGVzLmluZGV4T2YodCk8MCYmKGRlbGV0ZSBvW2VdLG4ucmVtb3ZlKHQsITEpKSl9KSk7Zm9yKHZhciBjPXRoaXMuZ2V0Q29tYm9zKCksZj1jLmxlbmd0aC0xO2Y+PTA7Zi0tKWNbZl0uZGVzdHJveWVkJiZjLnNwbGljZShmLDEpO3MmJihuLmFkZENvbWJvcyhzKSx0aGlzLmdldChcImdyb3VwQnlUeXBlc1wiKXx8dGhpcy5zb3J0Q29tYm9zKCkpLHRoaXMuZGlmZkl0ZW1zKFwiZWRnZVwiLGEsdC5lZGdlcyksT2JqZWN0KGguZikobywoZnVuY3Rpb24odCxlKXsoIXQuZ2V0VHlwZXx8XCJub2RlXCIhPT10LmdldFR5cGUoKSYmXCJjb21ib1wiIT09dC5nZXRUeXBlKCkpJiZhLmVkZ2VzLmluZGV4T2YodCk8MCYmKGRlbGV0ZSBvW2VdLG4ucmVtb3ZlKHQsITEpKX0pKSx0aGlzLnNldCh7bm9kZXM6YS5ub2RlcyxlZGdlczphLmVkZ2VzfSk7dmFyIGw9dGhpcy5nZXQoXCJsYXlvdXRDb250cm9sbGVyXCIpO3JldHVybiBsJiYobC5jaGFuZ2VEYXRhKCksbi5nZXQoXCJhbmltYXRlXCIpJiYhbC5nZXRMYXlvdXRUeXBlKCk/bi5wb3NpdGlvbnNBbmltYXRlKCk6bi5hdXRvUGFpbnQoKSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyLnNldChcImxvY2FsUmVmcmVzaFwiLGkpfSksMTYpLHRoaXN9LGUucHJvdG90eXBlLmFkZENvbWJvcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcImNvbWJvVHJlZXNcIik7dGhpcy5nZXQoXCJpdGVtQ29udHJvbGxlclwiKS5hZGRDb21ib3MoZSx0KX0sZS5wcm90b3R5cGUuY3JlYXRlQ29tYm89ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuc2V0KFwiY29tYm9Tb3J0ZWRcIiwhMSk7dmFyIHIsaT1cIlwiO2lmKHQpe2lmKE9iamVjdChoLngpKHQpKWk9dCxyPXtpZDp0fTtlbHNle2lmKCEoaT10LmlkKSlyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oXCJDcmVhdGUgY29tYm8gZmFpbGVkLiBQbGVhc2UgYXNzaWduIGEgdW5pcXVlIHN0cmluZyBpZCBmb3IgdGhlIGFkZGluZyBjb21iby5cIik7cj10fXZhciBvPWUubWFwKChmdW5jdGlvbih0KXt2YXIgZT1uLmZpbmRCeUlkKHQpLHI9XCJcIjtlLmdldFR5cGUmJihyPWUuZ2V0VHlwZSgpKTt2YXIgbz17aWQ6ZS5nZXRJRCgpLGl0ZW1UeXBlOnJ9O3JldHVyblwiY29tYm9cIj09PXI/by5wYXJlbnRJZD1pOlwibm9kZVwiPT09ciYmKG8uY29tYm9JZD1pKSxvfSkpO3IuY2hpbGRyZW49byx0aGlzLmFkZEl0ZW0oXCJjb21ib1wiLHIsITEpLHRoaXMuc2V0KFwiY29tYm9Tb3J0ZWRcIiwhMSk7dmFyIGE9dGhpcy5nZXQoXCJjb21ib1RyZWVzXCIpOyhhfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7THQodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQuaWQhPT1pfHwodC5pdGVtVHlwZT1cImNvbWJvXCIsdC5jaGlsZHJlbj1vLCExKX0pKX0pKSxhJiZ0aGlzLnNvcnRDb21ib3MoKX19LGUucHJvdG90eXBlLnVuY29tYm89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXQ7aWYoT2JqZWN0KGgueCkodCkmJihuPXRoaXMuZmluZEJ5SWQodCkpLCFufHxuLmdldFR5cGUmJlwiY29tYm9cIiE9PW4uZ2V0VHlwZSgpKWNvbnNvbGUud2FybihcIlRoZSBpdGVtIGlzIG5vdCBhIGNvbWJvIVwiKTtlbHNle3ZhciByPW4uZ2V0TW9kZWwoKS5wYXJlbnRJZCxpPXRoaXMuZ2V0KFwiY29tYm9UcmVlc1wiKTtpfHwoaT1bXSk7dmFyIG8sYT10aGlzLmdldChcIml0ZW1NYXBcIikscz1uLmdldChcImlkXCIpLHU9W10sYz10aGlzLmdldChcImNvbWJvc1wiKSxmPXRoaXMuZmluZEJ5SWQocik7aWYoaS5mb3JFYWNoKChmdW5jdGlvbihpKXtvfHxMdChpLChmdW5jdGlvbihpKXtpZihpLmlkPT09cyl7bz1pLG4uZ2V0RWRnZXMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlLnJlbW92ZUl0ZW0odCwhMSl9KSk7dmFyIGw9Yy5pbmRleE9mKHQpO2Muc3BsaWNlKGwsMSksZGVsZXRlIGFbc10sbi5kZXN0cm95KCl9cmV0dXJuIXJ8fCFvfHxpLmlkIT09cnx8KGYucmVtb3ZlQ29tYm8obiksLTEhPT0obD0odT1pLmNoaWxkcmVuKS5pbmRleE9mKG8pKSYmdS5zcGxpY2UobCwxKSxvLmNoaWxkcmVuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPWUuZmluZEJ5SWQodC5pZCksaT1uLmdldE1vZGVsKCk7bi5nZXRUeXBlJiZcImNvbWJvXCI9PT1uLmdldFR5cGUoKT8odC5wYXJlbnRJZD1yLGRlbGV0ZSB0LmNvbWJvSWQsaS5wYXJlbnRJZD1yLGRlbGV0ZSBpLmNvbWJvSWQpOm4uZ2V0VHlwZSYmXCJub2RlXCI9PT1uLmdldFR5cGUoKSYmKHQuY29tYm9JZD1yLGkuY29tYm9JZD1yKSxmLmFkZENoaWxkKG4pLHUucHVzaCh0KX0pKSwhMSl9KSl9KSksIXImJm8pe3ZhciBsPWkuaW5kZXhPZihvKTtpLnNwbGljZShsLDEpLG8uY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5wYXJlbnRJZD12b2lkIDAsZS5maW5kQnlJZCh0LmlkKS5nZXRNb2RlbCgpLnBhcmVudElkPXZvaWQgMCxcIm5vZGVcIiE9PXQuaXRlbVR5cGUmJmkucHVzaCh0KX0pKX19fSxlLnByb3RvdHlwZS51cGRhdGVDb21ib3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5nZXQoXCJjb21ib1RyZWVzXCIpLG49dGhpcy5nZXQoXCJpdGVtQ29udHJvbGxlclwiKSxyPXRoaXMuZ2V0KFwiaXRlbU1hcFwiKTsoZXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKGUpe0x0KGUsKGZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiEwO3ZhciBpPXJbZS5pZF07aWYoaSYmaS5nZXRUeXBlJiZcImNvbWJvXCI9PT1pLmdldFR5cGUoKSl7dmFyIG89T2JqZWN0KHYuZCkoaS5nZXRTdGF0ZXMoKSk7T2JqZWN0KGguZikobywoZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0SXRlbVN0YXRlKGksZSwhMSl9KSksbi51cGRhdGVDb21ibyhpLGUuY2hpbGRyZW4pLE9iamVjdChoLmYpKG8sKGZ1bmN0aW9uKGUpe3JldHVybiB0LnNldEl0ZW1TdGF0ZShpLGUsITApfSkpfXJldHVybiEwfSkpfSkpLHRoaXMuc29ydENvbWJvcygpfSxlLnByb3RvdHlwZS51cGRhdGVDb21ibz1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMscj10O2lmKE9iamVjdChoLngpKHQpJiYocj10aGlzLmZpbmRCeUlkKHQpKSwhcnx8ci5nZXRUeXBlJiZcImNvbWJvXCIhPT1yLmdldFR5cGUoKSljb25zb2xlLndhcm4oXCJUaGUgaXRlbSB0byBiZSB1cGRhdGVkIGlzIG5vdCBhIGNvbWJvIVwiKTtlbHNle2U9ci5nZXQoXCJpZFwiKTt2YXIgaT10aGlzLmdldChcImNvbWJvVHJlZXNcIiksbz10aGlzLmdldChcIml0ZW1Db250cm9sbGVyXCIpLGE9dGhpcy5nZXQoXCJpdGVtTWFwXCIpOyhpfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7THQodCwoZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITA7dmFyIHI9YVt0LmlkXTtpZihlPT09dC5pZCYmciYmci5nZXRUeXBlJiZcImNvbWJvXCI9PT1yLmdldFR5cGUoKSl7dmFyIGk9T2JqZWN0KHYuZCkoci5nZXRTdGF0ZXMoKSk7T2JqZWN0KGguZikoaSwoZnVuY3Rpb24odCl7ci5nZXRTdGF0ZVN0eWxlKHQpJiZuLnNldEl0ZW1TdGF0ZShyLHQsITEpfSkpLG8udXBkYXRlQ29tYm8ocix0LmNoaWxkcmVuKSxPYmplY3QoaC5mKShpLChmdW5jdGlvbih0KXtyLmdldFN0YXRlU3R5bGUodCkmJm4uc2V0SXRlbVN0YXRlKHIsdCwhMCl9KSksZSYmKGU9dC5wYXJlbnRJZCl9cmV0dXJuITB9KSl9KSl9fSxlLnByb3RvdHlwZS51cGRhdGVDb21ib1RyZWU9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PW4mJihuPSEwKTt2YXIgcjt0aGlzLnNldChcImNvbWJvU29ydGVkXCIsITEpO3ZhciBpLG89KHI9T2JqZWN0KGgueCkodCk/dGhpcy5maW5kQnlJZCh0KTp0KS5nZXRNb2RlbCgpLGE9by5jb21ib0lkfHxvLnBhcmVudElkLHM9XCJcIjtpZihyLmdldFR5cGUmJihzPXIuZ2V0VHlwZSgpKSxlJiZcImNvbWJvXCI9PT1zKXt2YXIgdSxjPXRoaXMuZ2V0KFwiY29tYm9UcmVlc1wiKSxmPSEwO2lmKChjfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dXx8UnQodCwoZnVuY3Rpb24odCl7aWYoIXUpcmV0dXJuIHQuaWQ9PT1yLmdldElEKCkmJih1PXQpLCEwfSkpfSkpLFJ0KHUsKGZ1bmN0aW9uKHQpe3JldHVybiB0LmlkIT09ZXx8KGY9ITEsITEpfSkpLCFmKXJldHVybiB2b2lkIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byB1cGRhdGUgdGhlIGNvbWJvIHRyZWUhIFRoZSBwYXJlbnRJZCBwb2ludHMgdG8gYSBkZXNjZW5kYW50IG9mIHRoZSBjb21ibyFcIil9aWYobiYmdGhpcy5nZXQoXCJlbmFibGVkU3RhY2tcIikpe3ZhciBsPXt9LGQ9e307XCJjb21ib1wiPT09cz8obC5jb21ib3M9W3tpZDpvLmlkLHBhcmVudElkOm8ucGFyZW50SWR9XSxkLmNvbWJvcz1be2lkOm8uaWQscGFyZW50SWQ6ZX1dKTpcIm5vZGVcIj09PXMmJihsLm5vZGVzPVt7aWQ6by5pZCxwYXJlbnRJZDpvLmNvbWJvSWR9XSxkLm5vZGVzPVt7aWQ6by5pZCxwYXJlbnRJZDplfV0pLHRoaXMucHVzaFN0YWNrKFwidXBkYXRlQ29tYm9UcmVlXCIse2JlZm9yZTpsLGFmdGVyOmR9KX1pZihvLnBhcmVudElkfHxvLmNvbWJvSWQpe3ZhciBwPXRoaXMuZmluZEJ5SWQoby5wYXJlbnRJZHx8by5jb21ib0lkKTtwJiZwLnJlbW92ZUNoaWxkKHIpfShcImNvbWJvXCI9PT1zP28ucGFyZW50SWQ9ZTpcIm5vZGVcIj09PXMmJihvLmNvbWJvSWQ9ZSksZSkmJigoaT10aGlzLmZpbmRCeUlkKGUpKSYmaS5hZGRDaGlsZChyKSk7YSYmKChpPXRoaXMuZmluZEJ5SWQoYSkpJiZpLnJlbW92ZUNoaWxkKHIpKTt2YXIgZz1VdCh0aGlzLmdldChcImNvbWJvVHJlZXNcIiksby5pZCxlKTt0aGlzLnNldChcImNvbWJvVHJlZXNcIixnKSx0aGlzLnVwZGF0ZUNvbWJvcygpfSxlLnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKCl7dmFyIHQ9W10sZT1bXSxuPVtdO3JldHVybiBPYmplY3QoaC5mKSh0aGlzLmdldChcIm5vZGVzXCIpLChmdW5jdGlvbihlKXt0LnB1c2goZS5nZXRNb2RlbCgpKX0pKSxPYmplY3QoaC5mKSh0aGlzLmdldChcImVkZ2VzXCIpLChmdW5jdGlvbih0KXtlLnB1c2godC5nZXRNb2RlbCgpKX0pKSxPYmplY3QoaC5mKSh0aGlzLmdldChcImNvbWJvc1wiKSwoZnVuY3Rpb24odCl7bi5wdXNoKHQuZ2V0TW9kZWwoKSl9KSkse25vZGVzOnQsZWRnZXM6ZSxjb21ib3M6bn19LGUucHJvdG90eXBlLmNoYW5nZVNpemU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5nZXQoXCJ2aWV3Q29udHJvbGxlclwiKS5jaGFuZ2VTaXplKHQsZSksdGhpc30sZS5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbigpe2lmKHRoaXMuZW1pdChcImJlZm9yZWdyYXBocmVmcmVzaFwiKSx0aGlzLmdldChcImFuaW1hdGVcIikpdGhpcy5wb3NpdGlvbnNBbmltYXRlKCk7ZWxzZXt2YXIgdD10aGlzLmdldChcIm5vZGVzXCIpLGU9dGhpcy5nZXQoXCJlZGdlc1wiKSxuPXRoaXMuZ2V0KFwiZWRnZXNcIik7T2JqZWN0KGguZikodCwoZnVuY3Rpb24odCl7dC5yZWZyZXNoKCl9KSksT2JqZWN0KGguZikoZSwoZnVuY3Rpb24odCl7dC5yZWZyZXNoKCl9KSksT2JqZWN0KGguZikobiwoZnVuY3Rpb24odCl7dC5yZWZyZXNoKCl9KSl9dGhpcy5lbWl0KFwiYWZ0ZXJncmFwaHJlZnJlc2hcIiksdGhpcy5hdXRvUGFpbnQoKX0sZS5wcm90b3R5cGUuZ2V0Tm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJub2Rlc1wiKX0sZS5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJlZGdlc1wiKX0sZS5wcm90b3R5cGUuZ2V0Q29tYm9zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwiY29tYm9zXCIpfSxlLnByb3RvdHlwZS5nZXRDb21ib0NoaWxkcmVuPWZ1bmN0aW9uKHQpe2lmKE9iamVjdChoLngpKHQpJiYodD10aGlzLmZpbmRCeUlkKHQpKSx0JiYoIXQuZ2V0VHlwZXx8XCJjb21ib1wiPT09dC5nZXRUeXBlKCkpKXJldHVybiB0LmdldENoaWxkcmVuKCk7Y29uc29sZS53YXJuKFwiVGhlIGNvbWJvIGRvZXMgbm90IGV4aXN0IVwiKX0sZS5wcm90b3R5cGUucG9zaXRpb25zQW5pbWF0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dC5lbWl0KFwiYmVmb3JlYW5pbWF0ZVwiKTt2YXIgZT10LmdldChcImFuaW1hdGVDZmdcIiksbj1lLm9uRnJhbWUscj10LmdldE5vZGVzKCksaT1yLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRNb2RlbCgpO3JldHVybntpZDplLmlkLHg6ZS54LHk6ZS55fX0pKTt0LmlzQW5pbWF0aW5nKCkmJnQuc3RvcEFuaW1hdGUoKSx0LmdldChcImNhbnZhc1wiKS5hbmltYXRlKChmdW5jdGlvbihlKXtPYmplY3QoaC5mKShpLChmdW5jdGlvbihyKXt2YXIgaT10LmZpbmRCeUlkKHIuaWQpO2lmKGkmJiFpLmRlc3Ryb3llZCl7dmFyIG89aS5nZXQoXCJvcmlnaW5BdHRyc1wiKSxhPWkuZ2V0KFwibW9kZWxcIik7aWYoIW8pe3ZhciBzPWkuZ2V0Q29udGFpbmVyKCkuZ2V0TWF0cml4KCk7c3x8KHM9WzEsMCwwLDAsMSwwLDAsMCwxXSksbz17eDpzWzZdLHk6c1s3XX0saS5zZXQoXCJvcmlnaW5BdHRyc1wiLG8pfWlmKG4pe3ZhciB1PW4oaSxlLHIsbyk7aS5zZXQoXCJtb2RlbFwiLE9iamVjdC5hc3NpZ24oYSx1KSl9ZWxzZSBhLng9by54KyhyLngtby54KSplLGEueT1vLnkrKHIueS1vLnkpKmV9fSkpLHQucmVmcmVzaFBvc2l0aW9ucygpfSkse2R1cmF0aW9uOmUuZHVyYXRpb24sZWFzaW5nOmUuZWFzaW5nLGNhbGxiYWNrOmZ1bmN0aW9uKCl7T2JqZWN0KGguZikociwoZnVuY3Rpb24odCl7dC5zZXQoXCJvcmlnaW5BdHRyc1wiLG51bGwpfSkpLGUuY2FsbGJhY2smJmUuY2FsbGJhY2soKSx0LmVtaXQoXCJhZnRlcmFuaW1hdGVcIiksdC5hbmltYXRpbmc9ITF9fSl9LGUucHJvdG90eXBlLnJlZnJlc2hQb3NpdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoXCJiZWZvcmVncmFwaHJlZnJlc2hwb3NpdGlvblwiKTt2YXIgdCxlPXRoaXMuZ2V0KFwibm9kZXNcIiksbj10aGlzLmdldChcImVkZ2VzXCIpLHI9dGhpcy5nZXQoXCJ2ZWRnZXNcIiksaT10aGlzLmdldChcImNvbWJvc1wiKSxvPXt9O09iamVjdChoLmYpKGUsKGZ1bmN0aW9uKGUpe3Q9ZS5nZXRNb2RlbCgpO3ZhciBuPWUuZ2V0KFwib3JpZ2luQXR0cnNcIik7biYmdC54PT09bi54JiZ0Lnk9PT1uLnl8fChlLnVwZGF0ZVBvc2l0aW9uKHt4OnQueCx5OnQueX0pLG9bdC5pZF09ITAsdC5jb21ib0lkJiYob1t0LmNvbWJvSWRdPSEwKSl9KSksaSYmMCE9PWkubGVuZ3RoJiZ0aGlzLnVwZGF0ZUNvbWJvcygpLE9iamVjdChoLmYpKG4sKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0U291cmNlKCkuZ2V0TW9kZWwoKSxuPXQuZ2V0VGFyZ2V0KCkuZ2V0TW9kZWwoKTsob1tlLmlkXXx8b1tuLmlkXXx8dC5nZXRNb2RlbCgpLmlzQ29tYm9FZGdlKSYmdC5yZWZyZXNoKCl9KSksT2JqZWN0KGguZikociwoZnVuY3Rpb24odCl7dC5yZWZyZXNoKCl9KSksdGhpcy5lbWl0KFwiYWZ0ZXJncmFwaHJlZnJlc2hwb3NpdGlvblwiKSx0aGlzLmF1dG9QYWludCgpfSxlLnByb3RvdHlwZS5zdG9wQW5pbWF0ZT1mdW5jdGlvbigpe3RoaXMuZ2V0KFwiY2FudmFzXCIpLnN0b3BBbmltYXRlKCl9LGUucHJvdG90eXBlLmlzQW5pbWF0aW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYW5pbWF0aW5nfSxlLnByb3RvdHlwZS5nZXRab29tPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJncm91cFwiKS5nZXRNYXRyaXgoKTtyZXR1cm4gdD90WzBdOjF9LGUucHJvdG90eXBlLmdldEN1cnJlbnRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwibW9kZUNvbnRyb2xsZXJcIikuZ2V0TW9kZSgpfSxlLnByb3RvdHlwZS5zZXRNb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldChcIm1vZGVDb250cm9sbGVyXCIpLnNldE1vZGUodCksdGhpc30sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJjYW52YXNcIikuY2xlYXIoKSx0aGlzLmluaXRHcm91cHMoKSx0aGlzLnNldCh7aXRlbU1hcDp7fSxub2RlczpbXSxlZGdlczpbXSxncm91cHM6W10sY29tYm9zOltdLGNvbWJvVHJlZXM6W119KSx0aGlzLmVtaXQoXCJhZnRlcnJlbmRlclwiKSx0aGlzfSxlLnByb3RvdHlwZS51cGRhdGVMYXlvdXQ9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLmdldChcImxheW91dENvbnRyb2xsZXJcIik7T2JqZWN0KGgueCkodCk/dD17dHlwZTplPXR9OmU9dC50eXBlO3ZhciByPXRoaXMuZ2V0KFwibGF5b3V0XCIpLGk9cj9yLnR5cGU6dm9pZCAwO2lmKGUmJmkhPT1lfHx2b2lkIDAhPT10LmdwdUVuYWJsZWQmJnQuZ3B1RW5hYmxlZCE9PXIuZ3B1RW5hYmxlZCllfHwoZT1pKSx0aGlzLnNldChcImxheW91dFwiLHQpLG4uY2hhbmdlTGF5b3V0KGUpO2Vsc2V7dmFyIG89e307T2JqZWN0LmFzc2lnbihvLHIsdCksby50eXBlPWl8fFwicmFuZG9tXCIsdGhpcy5zZXQoXCJsYXlvdXRcIixvKSxuLnVwZGF0ZUxheW91dENmZyhvKX19LGUucHJvdG90eXBlLmRlc3Ryb3lMYXlvdXQ9ZnVuY3Rpb24oKXt0aGlzLmdldChcImxheW91dENvbnRyb2xsZXJcIikuZGVzdHJveUxheW91dCgpfSxlLnByb3RvdHlwZS5sYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImxheW91dENvbnRyb2xsZXJcIiksZT10aGlzLmdldChcImxheW91dFwiKTtlJiZ0JiYoZS53b3JrZXJFbmFibGVkP3QubGF5b3V0KCk6dC5sYXlvdXRNZXRob2Q/dC5yZWxheW91dCghMCk6dC5sYXlvdXQoKSl9LGUucHJvdG90eXBlLmNvbGxhcHNlQ29tYm89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihPYmplY3QoaC54KSh0KSYmKHQ9dGhpcy5maW5kQnlJZCh0KSksdCl7dGhpcy5lbWl0KFwiYmVmb3JlY29sbGFwc2VleHBhbmRjb21ib1wiLHthY3Rpb246XCJleHBhbmRcIixpdGVtOnR9KTt2YXIgbj10LmdldE1vZGVsKCk7dGhpcy5nZXQoXCJpdGVtQ29udHJvbGxlclwiKS5jb2xsYXBzZUNvbWJvKHQpLG4uY29sbGFwc2VkPSEwO3ZhciByPXRoaXMuZ2V0RWRnZXMoKS5jb25jYXQodGhpcy5nZXQoXCJ2ZWRnZXNcIikpLGk9W10sbz1bXSxhPXRoaXMuZ2V0KFwiY29tYm9UcmVlc1wiKSxzPSExLHU9e307KGF8fFtdKS5mb3JFYWNoKChmdW5jdGlvbih0KXt1W3QuaWRdPXR9KSksKGF8fFtdKS5mb3JFYWNoKChmdW5jdGlvbih0KXtzfHxSdCh0LChmdW5jdGlvbih0KXtpZihzJiZ1W3QuaWRdKXJldHVybiExO2lmKG4ucGFyZW50SWQ9PT10LmlkPyh1PXt9LHQuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dVt0LmlkXT10fSkpKTpuLmlkPT09dC5pZCYmKHM9ITApLHMpe3ZhciByPWUuZmluZEJ5SWQodC5pZCk7ciYmci5nZXRUeXBlJiZcImNvbWJvXCI9PT1yLmdldFR5cGUoKSYmKGk9aS5jb25jYXQoci5nZXROb2RlcygpKSxvPW8uY29uY2F0KHIuZ2V0Q29tYm9zKCkpKX1yZXR1cm4hMH0pKX0pKTt2YXIgYz17fSxmPVtdO3IuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIXQuaXNWaXNpYmxlKCl8fHQuZ2V0TW9kZWwoKS5pc1ZFZGdlKXt2YXIgcj10LmdldFNvdXJjZSgpLGE9dC5nZXRUYXJnZXQoKTtpZigoaS5pbmNsdWRlcyhyKXx8by5pbmNsdWRlcyhyKSkmJiFpLmluY2x1ZGVzKGEpJiYhby5pbmNsdWRlcyhhKXx8ci5nZXRNb2RlbCgpLmlkPT09bi5pZCl7aWYoKGg9dC5nZXRNb2RlbCgpKS5pc1ZFZGdlKXJldHVybiB2b2lkIGUucmVtb3ZlSXRlbSh0LCExKTtmb3IodmFyIHM9YS5nZXRNb2RlbCgpOyFhLmlzVmlzaWJsZSgpOyl7aWYoIShhPWUuZmluZEJ5SWQocy5wYXJlbnRJZHx8cy5jb21ib0lkKSl8fCFzLnBhcmVudElkJiYhcy5jb21ib0lkKXJldHVybjtzPWEuZ2V0TW9kZWwoKX12YXIgdT1zLmlkO2lmKGNbbi5pZCtcIi1cIit1XSlyZXR1cm4gdm9pZChjW24uaWQrXCItXCIrdV0rPWguc2l6ZXx8MSk7dmFyIGw9ZS5hZGRJdGVtKFwidmVkZ2VcIix7c291cmNlOm4uaWQsdGFyZ2V0OnUsaXNWRWRnZTohMH0sITEpO2Nbbi5pZCtcIi1cIit1XT1oLnNpemV8fDEsZi5wdXNoKGwpfWVsc2UgaWYoIWkuaW5jbHVkZXMocikmJiFvLmluY2x1ZGVzKHIpJiYoaS5pbmNsdWRlcyhhKXx8by5pbmNsdWRlcyhhKSl8fGEuZ2V0TW9kZWwoKS5pZD09PW4uaWQpe3ZhciBoO2lmKChoPXQuZ2V0TW9kZWwoKSkuaXNWRWRnZSlyZXR1cm4gdm9pZCBlLnJlbW92ZUl0ZW0odCwhMSk7Zm9yKHZhciBkPXIuZ2V0TW9kZWwoKTshci5pc1Zpc2libGUoKTspe2lmKCEocj1lLmZpbmRCeUlkKGQucGFyZW50SWR8fGQuY29tYm9JZCkpfHwhZC5wYXJlbnRJZCYmIWQuY29tYm9JZClyZXR1cm47ZD1yLmdldE1vZGVsKCl9dmFyIHA9ZC5pZDtpZihjW3ArXCItXCIrbi5pZF0pcmV0dXJuIHZvaWQoY1twK1wiLVwiK24uaWRdKz1oLnNpemV8fDEpO2w9ZS5hZGRJdGVtKFwidmVkZ2VcIix7dGFyZ2V0Om4uaWQsc291cmNlOnAsaXNWRWRnZTohMH0sITEpO2NbcCtcIi1cIituLmlkXT1oLnNpemV8fDEsZi5wdXNoKGwpfX19KSksZi5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LmdldE1vZGVsKCk7ZS51cGRhdGVJdGVtKHQse3NpemU6Y1tuLnNvdXJjZStcIi1cIituLnRhcmdldF19LCExKX0pKSx0aGlzLmVtaXQoXCJhZnRlcmNvbGxhcHNlZXhwYW5kY29tYm9cIix7YWN0aW9uOlwiY29sbGFwc2VcIixpdGVtOnR9KX1lbHNlIGNvbnNvbGUud2FybihcIlRoZSBjb21ibyB0byBiZSBjb2xsYXBzZWQgZG9lcyBub3QgZXhpc3QhXCIpfSxlLnByb3RvdHlwZS5leHBhbmRDb21ibz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKE9iamVjdChoLngpKHQpJiYodD10aGlzLmZpbmRCeUlkKHQpKSwhdHx8dC5nZXRUeXBlJiZcImNvbWJvXCIhPT10LmdldFR5cGUoKSljb25zb2xlLndhcm4oXCJUaGUgY29tYm8gdG8gYmUgY29sbGFwc2VkIGRvZXMgbm90IGV4aXN0IVwiKTtlbHNle3RoaXMuZW1pdChcImJlZm9yZWNvbGxhcHNlZXhwYW5kY29tYm9cIix7YWN0aW9uOlwiZXhwYW5kXCIsaXRlbTp0fSk7dmFyIG49dC5nZXRNb2RlbCgpO3RoaXMuZ2V0KFwiaXRlbUNvbnRyb2xsZXJcIikuZXhwYW5kQ29tYm8odCksbi5jb2xsYXBzZWQ9ITE7dmFyIHI9dGhpcy5nZXRFZGdlcygpLmNvbmNhdCh0aGlzLmdldChcInZlZGdlc1wiKSksaT1bXSxvPVtdLGE9dGhpcy5nZXQoXCJjb21ib1RyZWVzXCIpLHM9ITEsdT17fTsoYXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3VbdC5pZF09dH0pKSwoYXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3N8fFJ0KHQsKGZ1bmN0aW9uKHQpe2lmKHMmJnVbdC5pZF0pcmV0dXJuITE7aWYobi5wYXJlbnRJZD09PXQuaWQ/KHU9e30sdC5jaGlsZHJlbi5mb3JFYWNoKChmdW5jdGlvbih0KXt1W3QuaWRdPXR9KSkpOm4uaWQ9PT10LmlkJiYocz0hMCkscyl7dmFyIHI9ZS5maW5kQnlJZCh0LmlkKTtyJiZyLmdldFR5cGUmJlwiY29tYm9cIj09PXIuZ2V0VHlwZSgpJiYoaT1pLmNvbmNhdChyLmdldE5vZGVzKCkpLG89by5jb25jYXQoci5nZXRDb21ib3MoKSkpfXJldHVybiEwfSkpfSkpO3ZhciBjPXt9LGY9e307ci5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighdC5pc1Zpc2libGUoKXx8dC5nZXRNb2RlbCgpLmlzVkVkZ2Upe3ZhciByPXQuZ2V0U291cmNlKCksYT10LmdldFRhcmdldCgpLHM9ci5nZXQoXCJpZFwiKSx1PWEuZ2V0KFwiaWRcIik7aWYoKGkuaW5jbHVkZXMocil8fG8uaW5jbHVkZXMocikpJiYhaS5pbmNsdWRlcyhhKSYmIW8uaW5jbHVkZXMoYSl8fHM9PT1uLmlkKXtpZih0LmdldE1vZGVsKCkuaXNWRWRnZSlyZXR1cm4gdm9pZCBlLnJlbW92ZUl0ZW0odCwhMSk7Zm9yKHZhciBsPWEuZ2V0TW9kZWwoKTshYS5pc1Zpc2libGUoKTspe2lmKCEoYT1lLmZpbmRCeUlkKGwuY29tYm9JZHx8bC5wYXJlbnRJZCkpfHwhbC5wYXJlbnRJZCYmIWwuY29tYm9JZClyZXR1cm47bD1hLmdldE1vZGVsKCl9dT1sLmlkO2Zvcih2YXIgaD1yLmdldE1vZGVsKCk7IXIuaXNWaXNpYmxlKCk7KXtpZighKHI9ZS5maW5kQnlJZChoLmNvbWJvSWR8fGgucGFyZW50SWQpKXx8IWgucGFyZW50SWQmJiFoLmNvbWJvSWQpcmV0dXJuO2lmKGguY29tYm9JZD09PW4uaWR8fGgucGFyZW50SWQ9PT1uLmlkKWJyZWFrO2g9ci5nZXRNb2RlbCgpfWlmKHM9aC5pZCx1KXtpZihjW3A9cytcIi1cIit1XSlyZXR1cm4gY1twXSs9dC5nZXRNb2RlbCgpLnNpemV8fDEsdm9pZCBlLnVwZGF0ZUl0ZW0oZltwXSx7c2l6ZTpjW3BdfSwhMSk7dmFyIGQ9ZS5hZGRJdGVtKFwidmVkZ2VcIix7c291cmNlOnMsdGFyZ2V0OnUsaXNWRWRnZTohMH0sITEpO2NbcF09dC5nZXRNb2RlbCgpLnNpemV8fDEsZltwXT1kfX1lbHNlIGlmKCFpLmluY2x1ZGVzKHIpJiYhby5pbmNsdWRlcyhyKSYmKGkuaW5jbHVkZXMoYSl8fG8uaW5jbHVkZXMoYSkpfHx1PT09bi5pZCl7aWYodC5nZXRNb2RlbCgpLmlzVkVkZ2UpcmV0dXJuIHZvaWQgZS5yZW1vdmVJdGVtKHQsITEpO2ZvcihoPXIuZ2V0TW9kZWwoKTshci5pc1Zpc2libGUoKTspe2lmKCEocj1lLmZpbmRCeUlkKGguY29tYm9JZHx8aC5wYXJlbnRJZCkpfHwhaC5wYXJlbnRJZCYmIWguY29tYm9JZClyZXR1cm47aD1yLmdldE1vZGVsKCl9cz1oLmlkO2ZvcihsPWEuZ2V0TW9kZWwoKTshYS5pc1Zpc2libGUoKTspe2lmKCEoYT1lLmZpbmRCeUlkKGwuY29tYm9JZHx8bC5wYXJlbnRJZCkpfHwhbC5wYXJlbnRJZCYmIWwuY29tYm9JZClyZXR1cm47aWYobC5jb21ib0lkPT09bi5pZHx8bC5wYXJlbnRJZD09PW4uaWQpYnJlYWs7bD1hLmdldE1vZGVsKCl9aWYodT1sLmlkLHMpe3ZhciBwO2lmKGNbcD1zK1wiLVwiK3VdKXJldHVybiBjW3BdKz10LmdldE1vZGVsKCkuc2l6ZXx8MSx2b2lkIGUudXBkYXRlSXRlbShmW3BdLHtzaXplOmNbcF19LCExKTtkPWUuYWRkSXRlbShcInZlZGdlXCIse3RhcmdldDp1LHNvdXJjZTpzLGlzVkVkZ2U6ITB9LCExKTtjW3BdPXQuZ2V0TW9kZWwoKS5zaXplfHwxLGZbcF09ZH19ZWxzZShpLmluY2x1ZGVzKHIpfHxvLmluY2x1ZGVzKHIpKSYmKGkuaW5jbHVkZXMoYSl8fG8uaW5jbHVkZXMoYSkpJiZyLmlzVmlzaWJsZSgpJiZhLmlzVmlzaWJsZSgpJiZ0LnNob3coKX19KSksdGhpcy5lbWl0KFwiYWZ0ZXJjb2xsYXBzZWV4cGFuZGNvbWJvXCIse2FjdGlvbjpcImV4cGFuZFwiLGl0ZW06dH0pfX0sZS5wcm90b3R5cGUuY29sbGFwc2VFeHBhbmRDb21ibz1mdW5jdGlvbih0KXtpZihPYmplY3QoaC54KSh0KSYmKHQ9dGhpcy5maW5kQnlJZCh0KSksIXQuZ2V0VHlwZXx8XCJjb21ib1wiPT09dC5nZXRUeXBlKCkpe2Zvcih2YXIgZT10LmdldE1vZGVsKCksbj10aGlzLmZpbmRCeUlkKGUucGFyZW50SWQpO247KXt2YXIgcj1uLmdldE1vZGVsKCk7aWYoci5jb2xsYXBzZWQpcmV0dXJuIGNvbnNvbGUud2FybihcIkZhaWwgdG8gZXhwYW5kIHRoZSBjb21ibyBzaW5jZSBpdCdzIGFuY2VzdG9yIGNvbWJvIGlzIGNvbGxhcHNlZC5cIiksdm9pZChuPXZvaWQgMCk7bj10aGlzLmZpbmRCeUlkKHIucGFyZW50SWQpfWUuY29sbGFwc2VkP3RoaXMuZXhwYW5kQ29tYm8odCk6dGhpcy5jb2xsYXBzZUNvbWJvKHQpLHRoaXMudXBkYXRlQ29tYm8odCl9fSxlLnByb3RvdHlwZS5zb3J0Q29tYm9zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZighdGhpcy5nZXQoXCJjb21ib1NvcnRlZFwiKSl7dGhpcy5zZXQoXCJjb21ib1NvcnRlZFwiLCEwKTt2YXIgZT1bXSxuPXt9Oyh0aGlzLmdldChcImNvbWJvVHJlZXNcIil8fFtdKS5mb3JFYWNoKChmdW5jdGlvbih0KXtSdCh0LChmdW5jdGlvbih0KXtyZXR1cm4gZVt0LmRlcHRoXT9lW3QuZGVwdGhdLnB1c2godC5pZCk6ZVt0LmRlcHRoXT1bdC5pZF0sblt0LmlkXT10LmRlcHRoLCEwfSkpfSkpLCh0aGlzLmdldEVkZ2VzKCkuY29uY2F0KHRoaXMuZ2V0KFwidmVkZ2VzXCIpKXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPXQuZ2V0TW9kZWwoKSxpPW5bci5zb3VyY2VdfHwwLG89bltyLnRhcmdldF18fDAsYT1NYXRoLm1heChpLG8pO2VbYV0/ZVthXS5wdXNoKHIuaWQpOmVbYV09W3IuaWRdfSkpLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoZSYmZS5sZW5ndGgpZm9yKHZhciBuPWUubGVuZ3RoLTE7bj49MDtuLS0pe3ZhciByPXQuZmluZEJ5SWQoZVtuXSk7ciYmci50b0Zyb250KCl9fSkpfX0sZS5wcm90b3R5cGUuZ2V0TmVpZ2hib3JzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dDtyZXR1cm4gT2JqZWN0KGgueCkodCkmJihuPXRoaXMuZmluZEJ5SWQodCkpLG4uZ2V0TmVpZ2hib3JzKGUpfSxlLnByb3RvdHlwZS5nZXROb2RlRGVncmVlPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dm9pZCAwKTt2YXIgbj10O09iamVjdChoLngpKHQpJiYobj10aGlzLmZpbmRCeUlkKHQpKTt2YXIgcj10aGlzLmdldChcImRlZ3JlZXNcIik7cnx8KHI9T2JqZWN0KGIuZ2V0RGVncmVlKSh0aGlzLmdldChcImRhdGFcIikpKSx0aGlzLnNldChcImRlZ2Vlc1wiLHIpO3ZhciBpLG89cltuLmdldElEKCldO3N3aXRjaChlKXtjYXNlXCJpblwiOmk9by5pbkRlZ3JlZTticmVhaztjYXNlXCJvdXRcIjppPW8ub3V0RGVncmVlO2JyZWFrO2Nhc2VcImFsbFwiOmk9bzticmVhaztkZWZhdWx0Omk9by5kZWdyZWV9cmV0dXJuIGl9LGUucHJvdG90eXBlLmdldFVuZG9TdGFjaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuZG9TdGFja30sZS5wcm90b3R5cGUuZ2V0UmVkb1N0YWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVkb1N0YWNrfSxlLnByb3RvdHlwZS5nZXRTdGFja0RhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJlbmFibGVkU3RhY2tcIik/e3VuZG9TdGFjazp0aGlzLnVuZG9TdGFjay50b0FycmF5KCkscmVkb1N0YWNrOnRoaXMucmVkb1N0YWNrLnRvQXJyYXkoKX06bnVsbH0sZS5wcm90b3R5cGUuY2xlYXJTdGFjaz1mdW5jdGlvbigpe3RoaXMuZ2V0KFwiZW5hYmxlZFN0YWNrXCIpJiYodGhpcy51bmRvU3RhY2suY2xlYXIoKSx0aGlzLnJlZG9TdGFjay5jbGVhcigpKX0sZS5wcm90b3R5cGUucHVzaFN0YWNrPWZ1bmN0aW9uKHQsZSxuKXtpZih2b2lkIDA9PT10JiYodD1cInVwZGF0ZVwiKSx2b2lkIDA9PT1uJiYobj1cInVuZG9cIiksdGhpcy5nZXQoXCJlbmFibGVkU3RhY2tcIikpe3ZhciByPWU/T2JqZWN0KGguYykoZSk6e2JlZm9yZTp7fSxhZnRlcjpPYmplY3QoaC5jKSh0aGlzLnNhdmUoKSl9O1wicmVkb1wiPT09bj90aGlzLnJlZG9TdGFjay5wdXNoKHthY3Rpb246dCxkYXRhOnJ9KTp0aGlzLnVuZG9TdGFjay5wdXNoKHthY3Rpb246dCxkYXRhOnJ9KSx0aGlzLmVtaXQoXCJzdGFja2NoYW5nZVwiLHt1bmRvU3RhY2s6dGhpcy51bmRvU3RhY2sscmVkb1N0YWNrOnRoaXMucmVkb1N0YWNrfSl9ZWxzZSBjb25zb2xlLndhcm4oXCLDqMKvwrfDpeKApsuGw6XCkMKvw6figJ3CqCB1bmRvICYgcmVkbyDDpcWgxbjDqMaSwr3Dr8K8xZLDpcWTwqjDpcKuxb7DpMK+4oC5w6XFkuKAkyBHcmFwaCDDpuKAlMK2w6XigqzihKLDqeKApsKNw6fCvcKuIGVuYWJsZWRTdGFjazogdHJ1ZSAhXCIpfSxlLnByb3RvdHlwZS5nZXRBZGpNYXRyaXg9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT10JiYodD0hMCksdm9pZCAwPT09ZSYmKGU9dGhpcy5nZXQoXCJkaXJlY3RlZFwiKSk7dmFyIG49dGhpcy5nZXQoXCJhZGpNYXRyaXhcIik7cmV0dXJuIG4mJnR8fChuPU9iamVjdChiLmdldEFkak1hdHJpeCkodGhpcy5zYXZlKCksZSksdGhpcy5zZXQoXCJhZGpNYXRyaXhcIixuKSksbn0sZS5wcm90b3R5cGUuZ2V0U2hvcnRlc3RQYXRoTWF0cml4PWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dCYmKHQ9ITApLHZvaWQgMD09PWUmJihlPXRoaXMuZ2V0KFwiZGlyZWN0ZWRcIikpO3ZhciBuPXRoaXMuZ2V0KFwiYWRqTWF0cml4XCIpLHI9dGhpcy5nZXQoXCJzaG9ydGVzdFBhdGhNYXRyaXhcIik7cmV0dXJuIG4mJnR8fChuPU9iamVjdChiLmdldEFkak1hdHJpeCkodGhpcy5zYXZlKCksZSksdGhpcy5zZXQoXCJhZGpNYXRyaXhcIixuKSksciYmdHx8KHI9T2JqZWN0KGIuZmxveWRXYXJzaGFsbCkodGhpcy5zYXZlKCksZSksdGhpcy5zZXQoXCJzaG9ydGVzdFBhdGhNYXRyaXhcIixyKSkscn0sZS5wcm90b3R5cGUub249ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0LnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsZSxuLHIpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5jbGVhcigpLHRoaXMuY2xlYXJTdGFjaygpLHRoaXMuZ2V0KFwiaXRlbUNvbnRyb2xsZXJcIikuZGVzdHJveSgpLHRoaXMuZ2V0KFwibW9kZUNvbnRyb2xsZXJcIikuZGVzdHJveSgpLHRoaXMuZ2V0KFwidmlld0NvbnRyb2xsZXJcIikuZGVzdHJveSgpLHRoaXMuZ2V0KFwic3RhdGVDb250cm9sbGVyXCIpLmRlc3Ryb3koKSx0aGlzLmdldChcImNhbnZhc1wiKS5kZXN0cm95KCksdGhpcy5jZmc9bnVsbCx0aGlzLmRlc3Ryb3llZD0hMCx0aGlzLnJlZG9TdGFjaz1udWxsLHRoaXMudW5kb1N0YWNrPW51bGx9LGUucHJvdG90eXBlLmNyZWF0ZUh1bGw9ZnVuY3Rpb24odCl7aWYodC5tZW1iZXJzJiYhKHQubWVtYmVycy5sZW5ndGg8MSkpe3ZhciBlPXRoaXMuZ2V0KFwiaHVsbEdyb3VwXCIpLG49dGhpcy5nZXQoXCJodWxsTWFwXCIpO2lmKG58fChuPXt9LHRoaXMuc2V0KFwiaHVsbE1hcFwiLG4pKSxlfHwoKGU9dGhpcy5nZXQoXCJncm91cFwiKS5hZGRHcm91cCh7aWQ6XCJodWxsR3JvdXBcIn0pKS50b0JhY2soKSx0aGlzLnNldChcImh1bGxHcm91cFwiLGUpKSxuW3QuaWRdKXJldHVybiBjb25zb2xlLndhcm4oXCJFeGlzdGVkIGh1bGwgaWQuXCIpLG5bdC5pZF07dmFyIHI9ZS5hZGRHcm91cCh7aWQ6dC5pZCtcIi1jb250YWluZXJcIn0pLGk9bmV3IEllKHRoaXMsT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sdCkse2dyb3VwOnJ9KSk7cmV0dXJuIG5baS5pZF09aSxpfWNvbnNvbGUud2FybihcIkNyZWF0ZSBodWxsIGZhaWxlZCEgVGhlIG1lbWJlcnMgaXMgZW1wdHkuXCIpfSxlLnByb3RvdHlwZS5nZXRIdWxscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcImh1bGxNYXBcIil9LGUucHJvdG90eXBlLmdldEh1bGxCeUlkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldChcImh1bGxNYXBcIilbdF19LGUucHJvdG90eXBlLnJlbW92ZUh1bGw9ZnVuY3Rpb24odCl7dmFyIGU7ZT1PYmplY3QoaC54KSh0KT90aGlzLmdldEh1bGxCeUlkKHQpOnQsZGVsZXRlIHRoaXMuZ2V0KFwiaHVsbE1hcFwiKVtlLmlkXSxlLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUucmVtb3ZlSHVsbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEh1bGxzKCk7dCYmT2JqZWN0LmtleXModCkubGVuZ3RoJiYodC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmRlc3Ryb3koKX0pKSx0aGlzLnNldChcImh1bGxNYXBcIix7fSkpfSxlfSh5LmEpO2Z1bmN0aW9uIERlKHQpe3JldHVybihEZT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9dmFyIE5lPW0uYS50cmFuc2Zvcm0sUmU9W1wic3RhcnRBcnJvd1wiLFwiZW5kQXJyb3dcIl0sTGU9e2xpbmVXaWR0aDoxLHN0cm9rZTp2b2lkIDAsZmlsbDp2b2lkIDAsbGluZUFwcGVuZFdpZHRoOjEsb3BhY2l0eTp2b2lkIDAsc3Ryb2tlT3BhY2l0eTp2b2lkIDAsZmlsbE9wYWNpdHk6dm9pZCAwLHg6MCx5OjAscjoxMCx3aWR0aDoyMCxoZWlnaHQ6MjAsc2hhZG93Q29sb3I6dm9pZCAwLHNoYWRvd0JsdXI6MCxzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WTowfSxCZT17ZWRnZTp7bGluZVdpZHRoOjEsc3Ryb2tlOlwiIzAwMFwiLGxpbmVEYXNoOnZvaWQgMCxzdGFydEFycm93OiExLGVuZEFycm93OiExLG9wYWNpdHk6dm9pZCAwLHN0cm9rZU9wYWNpdHk6dm9pZCAwLGZpbGxPcGFjaXR5OnZvaWQgMCxzaGFkb3dDb2xvcjp2b2lkIDAsc2hhZG93Qmx1cjowLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjB9LG5vZGU6TGUsY29tYm86TGV9LEdlPXtvcHRpb25zOnt9LGl0ZW1UeXBlOlwiXCIsdHlwZTpcIlwiLGdldEN1c3RvbUNvbmZpZzpmdW5jdGlvbih0KXtyZXR1cm57fX0sZ2V0T3B0aW9uczpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KGguZSkoe2xhYmVsQ2ZnOntzdHlsZTp7Zm9udEZhbWlseTpcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5LG51bGwpLmdldFByb3BlcnR5VmFsdWUoXCJmb250LWZhbWlseVwiKXx8XCJBcmlhbCwgc2Fucy1zZXJpZlwifX0sZGVzY3JpcHRpb25DZmc6e3N0eWxlOntmb250RmFtaWx5OlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtZmFtaWx5XCIpfHxcIkFyaWFsLCBzYW5zLXNlcmlmXCJ9fX0sdGhpcy5vcHRpb25zLHRoaXMuZ2V0Q3VzdG9tQ29uZmlnKHQpfHx7fSx0KX0sZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZHJhd1NoYXBlKHQsZSk7KG4uc2V0KFwiY2xhc3NOYW1lXCIsdGhpcy5pdGVtVHlwZStcIi1zaGFwZVwiKSx0LmxhYmVsKSYmdGhpcy5kcmF3TGFiZWwodCxlKS5zZXQoXCJjbGFzc05hbWVcIix0aGlzLml0ZW1UeXBlK1wiLWxhYmVsXCIpO3JldHVybiBufSxhZnRlckRyYXc6ZnVuY3Rpb24odCxlLG4pe30sZHJhd1NoYXBlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGx9LGRyYXdMYWJlbDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0T3B0aW9ucyh0KS5sYWJlbENmZ3x8e30scj10aGlzLmdldExhYmVsU3R5bGUodCxuLGUpLGk9ci5yb3RhdGU7ZGVsZXRlIHIucm90YXRlO3ZhciBvPWUuYWRkU2hhcGUoXCJ0ZXh0XCIse2F0dHJzOnIsZHJhZ2dhYmxlOiEwLGNsYXNzTmFtZTpcInRleHQtc2hhcGVcIixuYW1lOlwidGV4dC1zaGFwZVwifSk7aWYoaSl7dmFyIGE9by5nZXRCQm94KCkscz1vLmdldE1hdHJpeCgpO2lmKHN8fChzPVsxLDAsMCwwLDEsMCwwLDAsMV0pLHIucm90YXRlQ2VudGVyKXN3aXRjaChyLnJvdGF0ZUNlbnRlcil7Y2FzZVwiY2VudGVyXCI6cz1OZShzLFtbXCJ0XCIsLWEud2lkdGgvMiwtYS5oZWlnaHQvMl0sW1wiclwiLGldLFtcInRcIixhLndpZHRoLzIsYS5oZWlnaHQvMl1dKTticmVhaztjYXNlXCJsZWZ0dG9wXCI6cz1OZShzLFtbXCJ0XCIsLXIueCwtci55XSxbXCJyXCIsaV0sW1widFwiLHIueCxyLnldXSk7YnJlYWs7Y2FzZVwibGVmdGNlbnRlclwiOnM9TmUocyxbW1widFwiLC1yLngsLXIueS1hLmhlaWdodC8yXSxbXCJyXCIsaV0sW1widFwiLHIueCxyLnkrYS5oZWlnaHQvMl1dKTticmVhaztkZWZhdWx0OnM9TmUocyxbW1widFwiLC1hLndpZHRoLzIsLWEuaGVpZ2h0LzJdLFtcInJcIixpXSxbXCJ0XCIsYS53aWR0aC8yLGEuaGVpZ2h0LzJdXSl9ZWxzZSBzPU5lKHMsW1tcInRcIiwtci54LC1yLnktYS5oZWlnaHQvMl0sW1wiclwiLGldLFtcInRcIixyLngsci55K2EuaGVpZ2h0LzJdXSk7by5zZXRNYXRyaXgocyl9aWYoci5iYWNrZ3JvdW5kKXt2YXIgdT10aGlzLmRyYXdMYWJlbEJnKHQsZSxvKSxjPXRoaXMuaXRlbVR5cGUrXCItbGFiZWwtYmdcIjt1LnNldChcImNsYXNzbmFtZVwiLGMpLG8udG9Gcm9udCgpfXJldHVybiBvfSxkcmF3TGFiZWxCZzpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5vcHRpb25zLmxhYmVsQ2ZnLGk9T2JqZWN0KGguQSkoe30scix0LmxhYmVsQ2ZnKSxvPXRoaXMuZ2V0TGFiZWxCZ1N0eWxlQnlQb3NpdGlvbihuLHQsaSxlKTtyZXR1cm4gZS5hZGRTaGFwZShcInJlY3RcIix7bmFtZTpcInRleHQtYmctc2hhcGVcIixhdHRyczpvfSl9LGdldExhYmVsU3R5bGVCeVBvc2l0aW9uOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm57dGV4dDp0LmxhYmVsfX0sZ2V0TGFiZWxCZ1N0eWxlQnlQb3NpdGlvbjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm57fX0sZ2V0TGFiZWxTdHlsZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5nZXRMYWJlbFN0eWxlQnlQb3NpdGlvbih0LGUsbiksaT10aGlzLml0ZW1UeXBlK1wiTGFiZWxcIixvPWh0W2ldP2h0W2ldLnN0eWxlOm51bGw7cmV0dXJuIE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LG8pLHIpLGUuc3R5bGUpfSxnZXRTaGFwZVN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0LnN0eWxlfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXt0aGlzLnVwZGF0ZVNoYXBlU3R5bGUodCxlKSx0aGlzLnVwZGF0ZUxhYmVsKHQsZSl9LHVwZGF0ZVNoYXBlU3R5bGU6ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmdldENvbnRhaW5lcigpLHI9ZS5nZXRLZXlTaGFwZSgpLGk9T2JqZWN0KGguQSkoe30sci5hdHRyKCksdC5zdHlsZSksbz1mdW5jdGlvbih0KXt2YXIgZSxvPWlbdF07aWYoT2JqZWN0KGgudykobykpe3ZhciBhPW4uZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KFwibmFtZVwiKT09PXR9KSk7YSYmYS5hdHRyKG8pfWVsc2Ugci5hdHRyKCgoZT17fSlbdF09byxlKSl9O2Zvcih2YXIgYSBpbiBpKW8oYSl9LHVwZGF0ZUxhYmVsOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5nZXRDb250YWluZXIoKSxyPXRoaXMuZ2V0T3B0aW9ucyh7fSkubGFiZWxDZmcsaT10aGlzLml0ZW1UeXBlK1wiLWxhYmVsXCIsbz1uLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChcImNsYXNzTmFtZVwiKT09PWl9KSksYT10aGlzLml0ZW1UeXBlK1wiLWxhYmVsLWJnXCIscz1uLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChcImNsYXNzbmFtZVwiKT09PWF9KSk7aWYodC5sYWJlbHx8XCJcIj09PXQubGFiZWwpaWYobyl7dmFyIHU9e307ZS5nZXRNb2RlbCYmKHU9ZS5nZXRNb2RlbCgpLmxhYmVsQ2ZnKTt2YXIgYz1PYmplY3QoaC5lKSh7fSxyLHUsdC5sYWJlbENmZyksZj10aGlzLmdldExhYmVsU3R5bGVCeVBvc2l0aW9uKHQsYyxuKSxsPXQubGFiZWxDZmc/dC5sYWJlbENmZy5zdHlsZTp2b2lkIDAsZD1jLnN0eWxlJiZjLnN0eWxlLmJhY2tncm91bmQscD1PYmplY3Qodi5hKShPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxvLmF0dHIoKSksZiksbCksZz1wLnJvdGF0ZTtpZihkZWxldGUgcC5yb3RhdGUsZyl7dmFyIHk9WzEsMCwwLDAsMSwwLDAsMCwxXTt5PU5lKHksW1tcInRcIiwtcC54LC1wLnldLFtcInJcIixnXSxbXCJ0XCIscC54LHAueV1dKSxvLnJlc2V0TWF0cml4KCksby5hdHRyKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LHApLHttYXRyaXg6eX0pKX1lbHNlIG8ucmVzZXRNYXRyaXgoKSxvLmF0dHIocCk7aWYocylpZihwLmJhY2tncm91bmQpe3ZhciBtPXRoaXMuZ2V0TGFiZWxCZ1N0eWxlQnlQb3NpdGlvbihvLHQsYyxuKSxiPU9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LG0pLGQpO2lmKHMucmVzZXRNYXRyaXgoKSxnKXt2YXIgeD1bMSwwLDAsMCwxLDAsMCwwLDFdO3g9TmUoeCxbW1widFwiLC1iLngsLWIueV0sW1wiclwiLGddLFtcInRcIixiLngsYi55XV0pLGIubWF0cml4PXh9cy5hdHRyKGIpfWVsc2Ugbi5yZW1vdmVDaGlsZChzKTtlbHNlIHAuYmFja2dyb3VuZCYmKChzPXRoaXMuZHJhd0xhYmVsQmcodCxuLG8pKS5zZXQoXCJjbGFzc25hbWVcIixhKSxvLnRvRnJvbnQoKSl9ZWxzZXt0aGlzLmRyYXdMYWJlbCh0LG4pLnNldChcImNsYXNzTmFtZVwiLGkpfX0sYWZ0ZXJVcGRhdGU6ZnVuY3Rpb24odCxlKXt9LHNldFN0YXRlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpLG89bi5nZXQoXCJrZXlTaGFwZVwiKTtpZihvKXt2YXIgYT1uLmdldFR5cGUoKSxzPU9iamVjdChoLm4pKGUpP3Q6dCtcIjpcIitlLHU9dGhpcy5nZXRTdGF0ZVN0eWxlKHMsbiksYz1uLmdldFN0YXRlU3R5bGUocyk7aWYoY3x8dSl7dmFyIGY9T2JqZWN0KGguQSkoe30sY3x8dSksbD1uLmdldENvbnRhaW5lcigpLGQ9e3g6MSx5OjEsY3g6MSxjeToxfTtpZihcImNvbWJvXCI9PT1hJiYoZC5yPTEsZC53aWR0aD0xLGQuaGVpZ2h0PTEpLGUpe3ZhciBwPWZ1bmN0aW9uKHQpe3ZhciBlLG49Zlt0XTtpZihPYmplY3QoaC53KShuKSYmIVJlLmluY2x1ZGVzKHQpKXt2YXIgcj1sLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldChcIm5hbWVcIik9PT10fSkpO3ImJnIuYXR0cihuKX1lbHNlIG8uYXR0cigoKGU9e30pW3RdPW4sZSkpfTtmb3IodmFyIGcgaW4gZilwKGcpfWVsc2V7dmFyIHY9V3Qobi5nZXRDdXJyZW50U3RhdGVzU3R5bGUoKSkseT1uLmdldE1vZGVsKCksbT1PYmplY3QoaC5BKSh7fSx5LnN0eWxlLFd0KG4uZ2V0T3JpZ2luU3R5bGUoKSkpLGI9by5nZXQoXCJuYW1lXCIpLHg9by5hdHRyKCksdz17fTtPYmplY3Qua2V5cyh4KS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZihcImltZ1wiIT09dCl7dmFyIGU9eFt0XTtlJiZcIm9iamVjdFwiPT09RGUoZSk/d1t0XT1PYmplY3QoaC5jKShlKTp3W3RdPWV9fSkpO3ZhciBTPXt9LEU9ZnVuY3Rpb24odCl7dmFyIGU9Zlt0XTtpZihPYmplY3QoaC53KShlKSYmIVJlLmluY2x1ZGVzKHQpKXt2YXIgbj1sLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldChcIm5hbWVcIik9PT10fSkpO2lmKG4pe3ZhciByPU9iamVjdChoLmMpKG4uYXR0cigpKTtPYmplY3QoaC5mKShlLChmdW5jdGlvbihlLGkpe2lmKHQ9PT1iJiZ3W2ldJiYhZFtpXSl7ZGVsZXRlIHdbaV07dmFyIHM9bVt0XVtpXXx8QmVbYV1baV07by5hdHRyKGkscyl9ZWxzZSBpZihyW2ldfHwwPT09cltpXSl7ZGVsZXRlIHJbaV07dmFyIHU9bVt0XVtpXXx8QmVbYV1baV07bi5hdHRyKGksdSl9fSkpLFNbdF09cn19ZWxzZSBpZih3W3RdJiYhZFt0XSl7ZGVsZXRlIHdbdF07dmFyIGk9bVt0XXx8KG1bYl0/bVtiXVt0XTp2b2lkIDApfHxCZVthXVt0XTtvLmF0dHIodCxpKX19O2Zvcih2YXIgXyBpbiBmKUUoXyk7Zm9yKHZhciBnIGluIGI/U1tiXT13Ok9iamVjdChoLkEpKFMsdyksdilpZighZFtnXSl7dmFyIE89dltnXTtPYmplY3QoaC53KShPKSYmIVJlLmluY2x1ZGVzKGcpfHwoYj8oT2JqZWN0KGguQSkobVtiXSwoKGk9e30pW2ddPU8saSkpLGRlbGV0ZSBtW2ddKTpPYmplY3QoaC5BKShtLCgocj17fSlbZ109TyxyKSksZGVsZXRlIHZbZ10pfXZhciBrPXt9O09iamVjdChoLmUpKGssbSxTLHYpO3ZhciBNPSExLEE9ZnVuY3Rpb24odCl7dmFyIGUsbixyPWtbdF07aWYoT2JqZWN0KGgudykocikmJiFSZS5pbmNsdWRlcyh0KSl7dmFyIGk9bC5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoXCJuYW1lXCIpPT09dH0pKTtpJiYodD09PWImJihcImNvbWJvXCI9PT1hJiYoZGVsZXRlIHIucixkZWxldGUgci53aWR0aCxkZWxldGUgci5oZWlnaHQpLE09ITApLGkuYXR0cihyKSl9ZWxzZSBpZighTSl7dmFyIHM9cnx8QmVbYV1bdF07XCJjb21ib1wiPT09YT9ifHxvLmF0dHIoKChlPXt9KVt0XT1zLGUpKTpvLmF0dHIoKChuPXt9KVt0XT1zLG4pKX19O2Zvcih2YXIgVCBpbiBrKUEoVCl9fX19LGdldFN0YXRlU3R5bGU6ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmdldE1vZGVsKCkscj1lLmdldFR5cGUoKSxpPXRoaXMuZ2V0T3B0aW9ucyhuKSxvPWkuc3RhdGVTdHlsZXMsYT1pLnN0eWxlLHM9dm9pZCAwPT09YT97fTphLHU9bi5zdGF0ZVN0eWxlcz9uLnN0YXRlU3R5bGVzW3RdOm8mJm9bdF07cmV0dXJuXCJjb21ib1wiPT09cj9PYmplY3QoaC5jKSh1KTpPYmplY3QoaC5BKSh7fSxzLHUpfSxnZXRDb250cm9sUG9pbnRzOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbnRyb2xQb2ludHN9LGdldEFuY2hvclBvaW50czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRPcHRpb25zKHQpLmFuY2hvclBvaW50c319LEZlPXtpdGVtVHlwZTpcIm5vZGVcIixzaGFwZVR5cGU6XCJzaW5nbGUtbm9kZVwiLGxhYmVsUG9zaXRpb246XCJjZW50ZXJcIixvZmZzZXQ6aHQubm9kZUxhYmVsLm9mZnNldCxnZXRTaXplOmZ1bmN0aW9uKHQpe3ZhciBlPXQuc2l6ZXx8dGhpcy5nZXRPcHRpb25zKHt9KS5zaXplfHxodC5kZWZhdWx0Tm9kZS5zaXplO3JldHVybiBPYmplY3QoaC5tKShlKSYmMT09PWUubGVuZ3RoJiYoZT1bZVswXSxlWzBdXSksT2JqZWN0KGgubSkoZSl8fChlPVtlLGVdKSxlfSxnZXRMYWJlbFN0eWxlQnlQb3NpdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBuPWUucG9zaXRpb258fHRoaXMubGFiZWxQb3NpdGlvbjtpZihcImNlbnRlclwiPT09bilyZXR1cm57eDowLHk6MCx0ZXh0OnQubGFiZWx9O3ZhciByPWUub2Zmc2V0O09iamVjdChoLnMpKHIpJiYocj10aGlzLm9mZnNldCk7dmFyIGksbz10aGlzLmdldFNpemUodCksYT1vWzBdLHM9b1sxXTtzd2l0Y2gobil7Y2FzZVwidG9wXCI6aT17eDowLHk6MC1zLzItcix0ZXh0QmFzZWxpbmU6XCJib3R0b21cIn07YnJlYWs7Y2FzZVwiYm90dG9tXCI6aT17eDowLHk6cy8yK3IsdGV4dEJhc2VsaW5lOlwidG9wXCJ9O2JyZWFrO2Nhc2VcImxlZnRcIjppPXt4OjAtYS8yLXIseTowLHRleHRBbGlnbjpcInJpZ2h0XCJ9O2JyZWFrO2RlZmF1bHQ6aT17eDphLzIrcix5OjAsdGV4dEFsaWduOlwibGVmdFwifX1yZXR1cm4gaS50ZXh0PXQubGFiZWwsaX0sZ2V0TGFiZWxCZ1N0eWxlQnlQb3NpdGlvbjpmdW5jdGlvbih0LGUsbixyKXtpZighdClyZXR1cm57fTt2YXIgaT10LmdldEJCb3goKSxvPW4uc3R5bGUmJm4uc3R5bGUuYmFja2dyb3VuZDtpZighbylyZXR1cm57fTt2YXIgYSxzPWJ0KG8ucGFkZGluZyksdT1pLndpZHRoK3NbMV0rc1szXSxjPWkuaGVpZ2h0K3NbMF0rc1syXSxmPW4ub2Zmc2V0O3JldHVybiBPYmplY3QoaC5zKShmKSYmKGY9dGhpcy5vZmZzZXQpLGE9e3g6aS5taW5YLXNbM10seTppLm1pblktc1swXX0sYT1PYmplY3Qodi5hKShPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxhKSxvKSx7d2lkdGg6dSxoZWlnaHQ6Y30pfSxkcmF3U2hhcGU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnNoYXBlVHlwZSxyPXRoaXMuZ2V0U2hhcGVTdHlsZSh0KTtyZXR1cm4gZS5hZGRTaGFwZShuLHthdHRyczpyLGRyYWdnYWJsZTohMCxuYW1lOlwibm9kZS1zaGFwZVwifSl9LHVwZGF0ZUxpbmtQb2ludHM6ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMuZ2V0T3B0aW9ucyh0KS5saW5rUG9pbnRzLGk9ZS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm5cImxpbmstcG9pbnQtbGVmdFwiPT09dC5nZXQoXCJjbGFzc05hbWVcIil9KSksbz1lLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwibGluay1wb2ludC1yaWdodFwiPT09dC5nZXQoXCJjbGFzc05hbWVcIil9KSksYT1lLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwibGluay1wb2ludC10b3BcIj09PXQuZ2V0KFwiY2xhc3NOYW1lXCIpfSkpLHM9ZS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm5cImxpbmstcG9pbnQtYm90dG9tXCI9PT10LmdldChcImNsYXNzTmFtZVwiKX0pKTtpJiYobj1pLmF0dHIoKSksbyYmIW4mJihuPW8uYXR0cigpKSxhJiYhbiYmKG49YS5hdHRyKCkpLHMmJiFuJiYobj1zLmF0dHIoKSksbnx8KG49cik7dmFyIHU9T2JqZWN0KGguQSkoe30sbix0LmxpbmtQb2ludHMpLGM9dS5maWxsLGY9dS5zdHJva2UsbD11LmxpbmVXaWR0aCxkPXUuc2l6ZS8yO2R8fChkPXUucik7dmFyIHA9dC5saW5rUG9pbnRzP3QubGlua1BvaW50czp7bGVmdDp2b2lkIDAscmlnaHQ6dm9pZCAwLHRvcDp2b2lkIDAsYm90dG9tOnZvaWQgMH0sZz1wLmxlZnQseT1wLnJpZ2h0LG09cC50b3AsYj1wLmJvdHRvbSx4PXRoaXMuZ2V0U2l6ZSh0KSx3PXhbMF0sUz14WzFdLEU9e3I6ZCxmaWxsOmMsc3Ryb2tlOmYsbGluZVdpZHRoOmx9O2k/Z3x8dm9pZCAwPT09Zz9pLmF0dHIoT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sRSkse3g6LXcvMix5OjB9KSk6aS5yZW1vdmUoKTpnJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LEUpLHt4Oi13LzIseTowfSksY2xhc3NOYW1lOlwibGluay1wb2ludC1sZWZ0XCIsbmFtZTpcImxpbmstcG9pbnQtbGVmdFwiLGlzQW5jaG9yUG9pbnQ6ITB9KSxvPyh5fHx2b2lkIDA9PT15fHxvLnJlbW92ZSgpLG8uYXR0cihPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxFKSx7eDp3LzIseTowfSkpKTp5JiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LEUpLHt4OncvMix5OjB9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LXJpZ2h0XCIsbmFtZTpcImxpbmstcG9pbnQtcmlnaHRcIixpc0FuY2hvclBvaW50OiEwfSksYT8obXx8dm9pZCAwPT09bXx8YS5yZW1vdmUoKSxhLmF0dHIoT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sRSkse3g6MCx5Oi1TLzJ9KSkpOm0mJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sRSkse3g6MCx5Oi1TLzJ9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LXRvcFwiLG5hbWU6XCJsaW5rLXBvaW50LXRvcFwiLGlzQW5jaG9yUG9pbnQ6ITB9KSxzP2J8fHZvaWQgMD09PWI/cy5hdHRyKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LEUpLHt4OjAseTpTLzJ9KSk6cy5yZW1vdmUoKTpiJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LEUpLHt4OjAseTpTLzJ9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LWJvdHRvbVwiLG5hbWU6XCJsaW5rLXBvaW50LWJvdHRvbVwiLGlzQW5jaG9yUG9pbnQ6ITB9KX0sdXBkYXRlU2hhcGU6ZnVuY3Rpb24odCxlLG4scil7ZS5nZXQoXCJrZXlTaGFwZVwiKS5hdHRyKE9iamVjdCh2LmEpKHt9LG4pKSx0aGlzLnVwZGF0ZUxhYmVsKHQsZSksciYmdGhpcy51cGRhdGVJY29uKHQsZSl9LHVwZGF0ZUljb246ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZS5nZXRDb250YWluZXIoKSxpPXRoaXMuZ2V0T3B0aW9ucyh0KS5pY29uLG89KHQuaWNvbj90Lmljb246e3Nob3c6dm9pZCAwfSkuc2hvdyxhPXIuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0KFwiY2xhc3NOYW1lXCIpPT09bi50eXBlK1wiLWljb25cIn0pKTtpZihhKWlmKG98fHZvaWQgMD09PW8pe3ZhciBzPU9iamVjdChoLkEpKHt9LGEuYXR0cigpLGkpLHU9cy53aWR0aCxjPXMuaGVpZ2h0O2EuYXR0cihPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxzKSx7eDotdS8yLHk6LWMvMn0pKX1lbHNlIGEucmVtb3ZlKCk7ZWxzZSBpZihvKXt1PWkud2lkdGgsYz1pLmhlaWdodDtyLmFkZFNoYXBlKFwiaW1hZ2VcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30saSkse3g6LXUvMix5Oi1jLzJ9KSxjbGFzc05hbWU6dGhpcy50eXBlK1wiLWljb25cIixuYW1lOnRoaXMudHlwZStcIi1pY29uXCJ9KTt2YXIgZj1yLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwibm9kZS1sYWJlbFwiPT09dC5nZXQoXCJjbGFzc05hbWVcIil9KSk7ZiYmZi50b0Zyb250KCl9fX0sVWU9T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sR2UpLEZlKTt0ZS5yZWdpc3Rlck5vZGUoXCJzaW5nbGUtbm9kZVwiLFVlKTt2YXIgemU9e2l0ZW1UeXBlOlwiZWRnZVwiLGxhYmVsUG9zaXRpb246XCJjZW50ZXJcIixyZWZYOjAscmVmWTowLGxhYmVsQXV0b1JvdGF0ZTohMSxvcHRpb25zOntzaXplOmh0LmRlZmF1bHRFZGdlLnNpemUsc3R5bGU6e3g6MCx5OjAsc3Ryb2tlOmh0LmRlZmF1bHRFZGdlLnN0eWxlLnN0cm9rZSxsaW5lQXBwZW5kV2lkdGg6aHQuZGVmYXVsdEVkZ2Uuc3R5bGUubGluZUFwcGVuZFdpZHRofSxsYWJlbENmZzp7c3R5bGU6e2ZpbGw6aHQuZWRnZUxhYmVsLnN0eWxlLmZpbGwsZm9udFNpemU6aHQuZWRnZUxhYmVsLnN0eWxlLmZvbnRTaXplfX0sc3RhdGVTdHlsZXM6T2JqZWN0KHYuYSkoe30saHQuZWRnZVN0YXRlU3R5bGVzKX0sZ2V0UGF0aDpmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gT2JqZWN0KGguZikodCwoZnVuY3Rpb24odCxuKXswPT09bj9lLnB1c2goW1wiTVwiLHQueCx0LnldKTplLnB1c2goW1wiTFwiLHQueCx0LnldKX0pKSxlfSxnZXRTaGFwZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5zdHlsZSxuPXtzdHJva2U6dC5jb2xvcn0scj1PYmplY3QoaC5BKSh7fSxlLG4sdC5zdHlsZSksaT10LnNpemV8fGh0LmRlZmF1bHRFZGdlLnNpemUsbz0odD10aGlzLmdldFBhdGhQb2ludHModCkpLnN0YXJ0UG9pbnQsYT10LmVuZFBvaW50LHM9dGhpcy5nZXRDb250cm9sUG9pbnRzKHQpLHU9W29dO3MmJih1PXUuY29uY2F0KHMpKSx1LnB1c2goYSk7dmFyIGM9dGhpcy5nZXRQYXRoKHUpO3JldHVybiBPYmplY3QoaC5BKSh7fSxodC5kZWZhdWx0RWRnZS5zdHlsZSx7c3Ryb2tlOmh0LmRlZmF1bHRFZGdlLmNvbG9yLGxpbmVXaWR0aDppLHBhdGg6Y30scil9LHVwZGF0ZVNoYXBlU3R5bGU6ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmdldENvbnRhaW5lcigpLHI9e3N0cm9rZTp0LmNvbG9yfSxpPW4uZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuXCJlZGdlLXNoYXBlXCI9PT10LmdldChcImNsYXNzTmFtZVwiKX0pKXx8ZS5nZXRLZXlTaGFwZSgpLG89dC5zaXplLGE9KHQ9dGhpcy5nZXRQYXRoUG9pbnRzKHQpKS5zdGFydFBvaW50LHM9dC5lbmRQb2ludCx1PXRoaXMuZ2V0Q29udHJvbFBvaW50cyh0KSxjPVthXTt1JiYoYz1jLmNvbmNhdCh1KSksYy5wdXNoKHMpO3ZhciBmPWkuYXR0cigpLGw9T2JqZWN0KGguQSkoe30scixmLHQuc3R5bGUpLGQ9dC5zb3VyY2VOb2RlLHA9dC50YXJnZXROb2RlLGc9e3JhZGl1czpsLnJhZGl1c307dXx8KGc9e3NvdXJjZTpkLHRhcmdldDpwLG9mZnNldDpsLm9mZnNldCxyYWRpdXM6bC5yYWRpdXN9KSxmLmVuZEFycm93JiYhMT09PWwuZW5kQXJyb3cmJih0LnN0eWxlLmVuZEFycm93PXtwYXRoOlwiXCJ9KSxmLnN0YXJ0QXJyb3cmJiExPT09bC5zdGFydEFycm93JiYodC5zdHlsZS5zdGFydEFycm93PXtwYXRoOlwiXCJ9KTt2YXIgdj10aGlzLmdldFBhdGgoYyxnKSx5PU9iamVjdChoLkEpKHIsaS5hdHRyKCkse2xpbmVXaWR0aDpvLHBhdGg6dn0sdC5zdHlsZSk7aSYmaS5hdHRyKHkpfSxnZXRMYWJlbFN0eWxlQnlQb3NpdGlvbjpmdW5jdGlvbih0LGUsbil7dmFyIHIsaT1lLnBvc2l0aW9ufHx0aGlzLmxhYmVsUG9zaXRpb24sbz17fSxhPW4mJm4uZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuXCJlZGdlLXNoYXBlXCI9PT10LmdldChcImNsYXNzTmFtZVwiKX0pKTtyPVwic3RhcnRcIj09PWk/MDpcImVuZFwiPT09aT8xOi41O3ZhciBzPWUucmVmWHx8dGhpcy5yZWZYLHU9ZS5yZWZZfHx0aGlzLnJlZlk7aWYodC5zdGFydFBvaW50Lng9PT10LmVuZFBvaW50LngmJnQuc3RhcnRQb2ludC55PT09dC5lbmRQb2ludC55KXJldHVybiBvLng9dC5zdGFydFBvaW50LngrcyxvLnk9dC5zdGFydFBvaW50LnkrdSxvLnRleHQ9dC5sYWJlbCxvO3ZhciBjPU9iamVjdChoLnMpKGUuYXV0b1JvdGF0ZSk/dGhpcy5sYWJlbEF1dG9Sb3RhdGU6ZS5hdXRvUm90YXRlLGY9RHQoYSxyLHMsdSxjKTtyZXR1cm4gby54PWYueCxvLnk9Zi55LG8ucm90YXRlPWYucm90YXRlLG8udGV4dEFsaWduPXRoaXMuX2dldFRleHRBbGlnbihpLGYuYW5nbGUpLG8udGV4dD10LmxhYmVsLG99LGdldExhYmVsQmdTdHlsZUJ5UG9zaXRpb246ZnVuY3Rpb24odCxlLG4scil7aWYoIXQpcmV0dXJue307dmFyIGk9dC5nZXRCQm94KCksbz1uLnN0eWxlJiZuLnN0eWxlLmJhY2tncm91bmQ7aWYoIW8pcmV0dXJue307dmFyIGEscz1vLnBhZGRpbmcsdT1pLndpZHRoK3NbMV0rc1szXSxjPWkuaGVpZ2h0K3NbMF0rc1syXSxmPW4ucG9zaXRpb258fHRoaXMubGFiZWxQb3NpdGlvbixsPU9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LG8pLHt3aWR0aDp1LGhlaWdodDpjLHg6aS5taW5YLXNbMl0seTppLm1pblktc1swXSxyb3RhdGU6MH0pLGQ9T2JqZWN0KGgucykobi5hdXRvUm90YXRlKT90aGlzLmxhYmVsQXV0b1JvdGF0ZTpuLmF1dG9Sb3RhdGUscD1yJiZyLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwiZWRnZS1zaGFwZVwiPT09dC5nZXQoXCJjbGFzc05hbWVcIil9KSk7YT1cInN0YXJ0XCI9PT1mPzA6XCJlbmRcIj09PWY/MTouNTt2YXIgZz1uLnJlZlh8fHRoaXMucmVmWCx5PW4ucmVmWXx8dGhpcy5yZWZZO2lmKGUuc3RhcnRQb2ludC54PT09ZS5lbmRQb2ludC54JiZlLnN0YXJ0UG9pbnQueT09PWUuZW5kUG9pbnQueSlyZXR1cm4gbC54PWUuc3RhcnRQb2ludC54K2ctdS8yLGwueT1lLnN0YXJ0UG9pbnQueSt5LWMvMixsO3ZhciBtPUR0KHAsYSxnLXUvMix5K2MvMixkKSxiPW0uYW5nbGU7cmV0dXJuIGI+LjUqTWF0aC5QSSYmYjwxLjUqTWF0aC5QSSYmKG09RHQocCxhLGcrdS8yLHkrYy8yLGQpKSxkJiYobC54PW0ueCxsLnk9bS55KSxsLnJvdGF0ZT1tLnJvdGF0ZSxsfSxfZ2V0VGV4dEFsaWduOmZ1bmN0aW9uKHQsZSl7dmFyIG49XCJjZW50ZXJcIjtyZXR1cm4gZT8oZSU9MipNYXRoLlBJLFwiY2VudGVyXCIhPT10JiYobj1lPj0wJiZlPD1NYXRoLlBJLzJ8fGU+PTEuNSpNYXRoLlBJJiZlPDIqTWF0aC5QST90OmZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuXCJzdGFydFwiPT09dD9lPVwiZW5kXCI6XCJlbmRcIj09PXQmJihlPVwic3RhcnRcIiksZX0odCkpLG4pOnR9LGdldENvbnRyb2xQb2ludHM6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29udHJvbFBvaW50c30sZ2V0UGF0aFBvaW50czpmdW5jdGlvbih0KXtyZXR1cm4gdH0sZHJhd1NoYXBlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRTaGFwZVN0eWxlKHQpO3JldHVybiBlLmFkZFNoYXBlKFwicGF0aFwiLHtjbGFzc05hbWU6XCJlZGdlLXNoYXBlXCIsbmFtZTpcImVkZ2Utc2hhcGVcIixhdHRyczpufSl9LGRyYXdMYWJlbDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3B0aW9ucy5sYWJlbENmZyxyPU9iamVjdChoLmUpKHtmb250RmFtaWx5OlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtZmFtaWx5XCIpfHxcIkFyaWFsLCBzYW5zLXNlcmlmXCJ9LG4sdC5sYWJlbENmZyksaT10aGlzLmdldExhYmVsU3R5bGUodCxyLGUpLG89aS5yb3RhdGU7ZGVsZXRlIGkucm90YXRlO3ZhciBhPWUuYWRkU2hhcGUoXCJ0ZXh0XCIse2F0dHJzOmksbmFtZTpcInRleHQtc2hhcGVcIn0pO2lmKG8mJmEucm90YXRlQXRTdGFydChvKSxpLmJhY2tncm91bmQpe3ZhciBzPXRoaXMuZHJhd0xhYmVsQmcodCxlLGEpLHU9dGhpcy5pdGVtVHlwZStcIi1sYWJlbC1iZ1wiO3Muc2V0KFwiY2xhc3NuYW1lXCIsdSksYS50b0Zyb250KCl9cmV0dXJuIGF9LGRyYXdMYWJlbEJnOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLm9wdGlvbnMubGFiZWxDZmcsaT1PYmplY3QoaC5lKSh7fSxyLHQubGFiZWxDZmcpLG89dGhpcy5nZXRMYWJlbFN0eWxlKHQsaSxlKS5yb3RhdGUsYT10aGlzLmdldExhYmVsQmdTdHlsZUJ5UG9zaXRpb24obix0LGksZSk7ZGVsZXRlIGEucm90YXRlO3ZhciBzPWUuYWRkU2hhcGUoXCJyZWN0XCIse25hbWU6XCJ0ZXh0LWJnLXNoYXBlXCIsYXR0cnM6YX0pO3JldHVybiBvJiZzLnJvdGF0ZUF0U3RhcnQobyksc319LFZlPU9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LEdlKSx6ZSk7dGUucmVnaXN0ZXJFZGdlKFwic2luZ2xlLWVkZ2VcIixWZSksdGUucmVnaXN0ZXJFZGdlKFwibGluZVwiLHtnZXRDb250cm9sUG9pbnRzOmZ1bmN0aW9uKCl7fX0sXCJzaW5nbGUtZWRnZVwiKSx0ZS5yZWdpc3RlckVkZ2UoXCJzcGxpbmVcIix7Z2V0UGF0aDpmdW5jdGlvbih0KXtyZXR1cm4gaGUodCl9fSxcInNpbmdsZS1lZGdlXCIpLHRlLnJlZ2lzdGVyRWRnZShcImFyY1wiLHtjdXJ2ZU9mZnNldDoyMCxjbG9ja3dpc2U6MSxnZXRDb250cm9sUG9pbnRzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scj10LnN0YXJ0UG9pbnQsaT10LmVuZFBvaW50LG89KHIueCtpLngpLzIsYT0oci55K2kueSkvMjtpZih2b2lkIDAhPT10LmNvbnRyb2xQb2ludHMpe2lmKG49dC5jb250cm9sUG9pbnRzWzBdLGU9VChyLG4saSksci54PD1pLngmJnIueT5pLnk/dGhpcy5jbG9ja3dpc2U9ZS54Pm4ueD8wOjE6ci54PD1pLngmJnIueTxpLnk/dGhpcy5jbG9ja3dpc2U9ZS54Pm4ueD8xOjA6ci54PmkueCYmci55PD1pLnk/dGhpcy5jbG9ja3dpc2U9ZS55PG4ueT8wOjE6dGhpcy5jbG9ja3dpc2U9ZS55PG4ueT8xOjAsKG4ueC1yLngpLyhuLnktci55KT09KGkueC1yLngpLyhpLnktci55KSlyZXR1cm5bXX1lbHNle3ZvaWQgMD09PXQuY3VydmVPZmZzZXQmJih0LmN1cnZlT2Zmc2V0PXRoaXMuY3VydmVPZmZzZXQpLE9iamVjdChoLm0pKHQuY3VydmVPZmZzZXQpJiYodC5jdXJ2ZU9mZnNldD10LmN1cnZlT2Zmc2V0WzBdKSx0LmN1cnZlT2Zmc2V0PDA/dGhpcy5jbG9ja3dpc2U9MDp0aGlzLmNsb2Nrd2lzZT0xO3ZhciBzPXt4OmkueC1yLngseTppLnktci55fSx1PU1hdGguYXRhbjIocy55LHMueCk7bj17eDp0LmN1cnZlT2Zmc2V0Kk1hdGguY29zKC1NYXRoLlBJLzIrdSkrbyx5OnQuY3VydmVPZmZzZXQqTWF0aC5zaW4oLU1hdGguUEkvMit1KSthfSxlPVQocixuLGkpfXZhciBjPUMocixlKTtyZXR1cm5be3g6Yyx5OmN9XX0sZ2V0UGF0aDpmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gZS5wdXNoKFtcIk1cIix0WzBdLngsdFswXS55XSksMj09PXQubGVuZ3RoP2UucHVzaChbXCJMXCIsdFsxXS54LHRbMV0ueV0pOmUucHVzaChbXCJBXCIsdFsxXS54LHRbMV0ueSwwLDAsdGhpcy5jbG9ja3dpc2UsdFsyXS54LHRbMl0ueV0pLGV9fSxcInNpbmdsZS1lZGdlXCIpLHRlLnJlZ2lzdGVyRWRnZShcInF1YWRyYXRpY1wiLHtjdXJ2ZVBvc2l0aW9uOi41LGN1cnZlT2Zmc2V0Oi0yMCxnZXRDb250cm9sUG9pbnRzOmZ1bmN0aW9uKHQpe3ZhciBlPXQuY29udHJvbFBvaW50cztpZighZXx8IWUubGVuZ3RoKXt2YXIgbj10LnN0YXJ0UG9pbnQscj10LmVuZFBvaW50O3ZvaWQgMD09PXQuY3VydmVPZmZzZXQmJih0LmN1cnZlT2Zmc2V0PXRoaXMuY3VydmVPZmZzZXQpLHZvaWQgMD09PXQuY3VydmVQb3NpdGlvbiYmKHQuY3VydmVQb3NpdGlvbj10aGlzLmN1cnZlUG9zaXRpb24pLE9iamVjdChoLm0pKHRoaXMuY3VydmVPZmZzZXQpJiYodC5jdXJ2ZU9mZnNldD10LmN1cnZlT2Zmc2V0WzBdKSxPYmplY3QoaC5tKSh0aGlzLmN1cnZlUG9zaXRpb24pJiYodC5jdXJ2ZVBvc2l0aW9uPXQuY3VydmVPZmZzZXRbMF0pLGU9W2RlKG4scix0LmN1cnZlUG9zaXRpb24sdC5jdXJ2ZU9mZnNldCldfXJldHVybiBlfSxnZXRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiBlLnB1c2goW1wiTVwiLHRbMF0ueCx0WzBdLnldKSxlLnB1c2goW1wiUVwiLHRbMV0ueCx0WzFdLnksdFsyXS54LHRbMl0ueV0pLGV9fSxcInNpbmdsZS1lZGdlXCIpLHRlLnJlZ2lzdGVyRWRnZShcImN1YmljXCIse2N1cnZlUG9zaXRpb246Wy41LC41XSxjdXJ2ZU9mZnNldDpbLTIwLDIwXSxnZXRDb250cm9sUG9pbnRzOmZ1bmN0aW9uKHQpe3ZhciBlPXQuY29udHJvbFBvaW50cztpZih2b2lkIDA9PT10LmN1cnZlT2Zmc2V0JiYodC5jdXJ2ZU9mZnNldD10aGlzLmN1cnZlT2Zmc2V0KSx2b2lkIDA9PT10LmN1cnZlUG9zaXRpb24mJih0LmN1cnZlUG9zaXRpb249dGhpcy5jdXJ2ZVBvc2l0aW9uKSxPYmplY3QoaC50KSh0LmN1cnZlT2Zmc2V0KSYmKHQuY3VydmVPZmZzZXQ9W3QuY3VydmVPZmZzZXQsLXQuY3VydmVPZmZzZXRdKSxPYmplY3QoaC50KSh0LmN1cnZlUG9zaXRpb24pJiYodC5jdXJ2ZVBvc2l0aW9uPVt0LmN1cnZlUG9zaXRpb24sMS10LmN1cnZlUG9zaXRpb25dKSwhZXx8IWUubGVuZ3RofHxlLmxlbmd0aDwyKXt2YXIgbj10LnN0YXJ0UG9pbnQscj10LmVuZFBvaW50O2U9W2RlKG4scix0LmN1cnZlUG9zaXRpb25bMF0sdC5jdXJ2ZU9mZnNldFswXSksZGUobixyLHQuY3VydmVQb3NpdGlvblsxXSx0LmN1cnZlT2Zmc2V0WzFdKV19cmV0dXJuIGV9LGdldFBhdGg6ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIGUucHVzaChbXCJNXCIsdFswXS54LHRbMF0ueV0pLGUucHVzaChbXCJDXCIsdFsxXS54LHRbMV0ueSx0WzJdLngsdFsyXS55LHRbM10ueCx0WzNdLnldKSxlfX0sXCJzaW5nbGUtZWRnZVwiKSx0ZS5yZWdpc3RlckVkZ2UoXCJjdWJpYy12ZXJ0aWNhbFwiLHtjdXJ2ZVBvc2l0aW9uOlsuNSwuNV0sZ2V0Q29udHJvbFBvaW50czpmdW5jdGlvbih0KXt2YXIgZT10LnN0YXJ0UG9pbnQsbj10LmVuZFBvaW50O3JldHVybiB2b2lkIDAhPT10LmN1cnZlUG9zaXRpb24mJih0aGlzLmN1cnZlUG9zaXRpb249dC5jdXJ2ZVBvc2l0aW9uKSxPYmplY3QoaC50KSh0aGlzLmN1cnZlUG9zaXRpb24pJiYodGhpcy5jdXJ2ZVBvc2l0aW9uPVt0aGlzLmN1cnZlUG9zaXRpb24sMS10aGlzLmN1cnZlUG9zaXRpb25dKSxbe3g6ZS54LHk6KG4ueS1lLnkpKnRoaXMuY3VydmVQb3NpdGlvblswXStlLnl9LHt4Om4ueCx5OihuLnktZS55KSp0aGlzLmN1cnZlUG9zaXRpb25bMV0rZS55fV19fSxcImN1YmljXCIpLHRlLnJlZ2lzdGVyRWRnZShcImN1YmljLWhvcml6b250YWxcIix7Y3VydmVQb3NpdGlvbjpbLjUsLjVdLGdldENvbnRyb2xQb2ludHM6ZnVuY3Rpb24odCl7dmFyIGU9dC5zdGFydFBvaW50LG49dC5lbmRQb2ludDtyZXR1cm4gdm9pZCAwIT09dC5jdXJ2ZVBvc2l0aW9uJiYodGhpcy5jdXJ2ZVBvc2l0aW9uPXQuY3VydmVQb3NpdGlvbiksT2JqZWN0KGgudCkodGhpcy5jdXJ2ZVBvc2l0aW9uKSYmKHRoaXMuY3VydmVQb3NpdGlvbj1bdGhpcy5jdXJ2ZVBvc2l0aW9uLDEtdGhpcy5jdXJ2ZVBvc2l0aW9uXSksW3t4OihuLngtZS54KSp0aGlzLmN1cnZlUG9zaXRpb25bMF0rZS54LHk6ZS55fSx7eDoobi54LWUueCkqdGhpcy5jdXJ2ZVBvc2l0aW9uWzFdK2UueCx5Om4ueX1dfX0sXCJjdWJpY1wiKSx0ZS5yZWdpc3RlckVkZ2UoXCJsb29wXCIse2dldFBhdGhQb2ludHM6ZnVuY3Rpb24odCl7cmV0dXJuIGp0KHQpfSxnZXRDb250cm9sUG9pbnRzOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbnRyb2xQb2ludHN9LGFmdGVyRHJhdzpmdW5jdGlvbih0KXt0LmNvbnRyb2xQb2ludHM9dm9pZCAwfSxhZnRlclVwZGF0ZTpmdW5jdGlvbih0KXt0LmNvbnRyb2xQb2ludHM9dm9pZCAwfX0sXCJjdWJpY1wiKTt2YXIgV2U9e2l0ZW1UeXBlOlwiY29tYm9cIixzaGFwZVR5cGU6XCJzaW5nbGUtY29tYm9cIixsYWJlbFBvc2l0aW9uOlwidG9wXCIscmVmWDpodC5jb21ib0xhYmVsLnJlZlgscmVmWTpodC5jb21ib0xhYmVsLnJlZlksb3B0aW9uczp7c3R5bGU6e3N0cm9rZTpodC5kZWZhdWx0Q29tYm8uc3R5bGUuc3Ryb2tlLGZpbGw6aHQuZGVmYXVsdENvbWJvLnN0eWxlLmZpbGwsbGluZVdpZHRoOmh0LmRlZmF1bHRDb21iby5zdHlsZS5saW5lV2lkdGh9LGxhYmVsQ2ZnOntzdHlsZTp7ZmlsbDpodC5jb21ib0xhYmVsLnN0eWxlLmZpbGwsZm9udFNpemU6aHQuY29tYm9MYWJlbC5zdHlsZS5mb250U2l6ZX19LHN0YXRlU3R5bGVzOk9iamVjdCh2LmEpKHt9LGh0LmNvbWJvU3RhdGVTdHlsZXMpfSxnZXRTaXplOmZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdChoLmMpKHQuc2l6ZXx8dGhpcy5vcHRpb25zLnNpemV8fGh0LmRlZmF1bHRDb21iby5zaXplKTtyZXR1cm4gT2JqZWN0KGgubSkoZSkmJjE9PT1lLmxlbmd0aCYmKGU9W2VbMF0sZVswXV0pLE9iamVjdChoLm0pKGUpfHwoZT1bZSxlXSksZX0sZ2V0TGFiZWxTdHlsZUJ5UG9zaXRpb246ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnBvc2l0aW9ufHx0aGlzLmxhYmVsUG9zaXRpb24scj10LnN0eWxlLGk9dC5wYWRkaW5nfHx0aGlzLm9wdGlvbnMucGFkZGluZztPYmplY3QoaC5tKShpKSYmKGk9aVswXSk7dmFyIG89ZS5yZWZYLGE9ZS5yZWZZO09iamVjdChoLnMpKG8pJiYobz10aGlzLnJlZlgpLE9iamVjdChoLnMpKGEpJiYoYT10aGlzLnJlZlkpO3ZhciBzLHU9dGhpcy5nZXRTaXplKHQpLGM9KE1hdGgubWF4KHIucix1WzBdLzIpfHx1WzBdLzIpK2k7c3dpdGNoKG4pe2Nhc2VcInRvcFwiOnM9e3g6MCx5Oi1jLWEsdGV4dEJhc2VsaW5lOlwiYm90dG9tXCIsdGV4dEFsaWduOlwiY2VudGVyXCJ9O2JyZWFrO2Nhc2VcImJvdHRvbVwiOnM9e3g6MCx5OmMrYSx0ZXh0QmFzZWxpbmU6XCJib3R0b21cIix0ZXh0QWxpZ246XCJjZW50ZXJcIn07YnJlYWs7Y2FzZVwibGVmdFwiOnM9e3g6LWMrbyx5OjAsdGV4dEFsaWduOlwibGVmdFwifTticmVhaztjYXNlXCJjZW50ZXJcIjpzPXt4OjAseTowLHRleHQ6dC5sYWJlbCx0ZXh0QWxpZ246XCJjZW50ZXJcIn07YnJlYWs7ZGVmYXVsdDpzPXt4OmMrbyx5OjAsdGV4dEFsaWduOlwicmlnaHRcIn19cmV0dXJuIHMudGV4dD10LmxhYmVsLHN9LGRyYXdTaGFwZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc2hhcGVUeXBlLHI9dGhpcy5nZXRTaGFwZVN0eWxlKHQpO3JldHVybiBlLmFkZFNoYXBlKG4se2F0dHJzOnIsZHJhZ2dhYmxlOiEwLG5hbWU6XCJjb21iby1zaGFwZVwifSl9LHVwZGF0ZVNoYXBlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmdldChcImtleVNoYXBlXCIpOyh2b2lkIDA9PT10LmFuaW1hdGU/dGhpcy5vcHRpb25zLmFuaW1hdGU6dC5hbmltYXRlKSYmci5hbmltYXRlP3IuYW5pbWF0ZShuLHtkdXJhdGlvbjoyMDAsZWFzaW5nOlwiZWFzZUxpbmVhclwifSk6ci5hdHRyKE9iamVjdCh2LmEpKHt9LG4pKSx0aGlzLnVwZGF0ZUxhYmVsKHQsZSl9fSxYZT1PYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxHZSksV2UpO3RlLnJlZ2lzdGVyQ29tYm8oXCJzaW5nbGUtY29tYm9cIixYZSksdGUucmVnaXN0ZXJDb21ibyhcImNpcmNsZVwiLHtvcHRpb25zOntzaXplOltodC5kZWZhdWx0Q29tYm8uc2l6ZVswXSxodC5kZWZhdWx0Q29tYm8uc2l6ZVswXV0scGFkZGluZzpodC5kZWZhdWx0Q29tYm8ucGFkZGluZ1swXSxhbmltYXRlOiEwLHN0eWxlOntzdHJva2U6aHQuZGVmYXVsdENvbWJvLnN0eWxlLnN0cm9rZSxmaWxsOmh0LmRlZmF1bHRDb21iby5zdHlsZS5maWxsLGxpbmVXaWR0aDpodC5kZWZhdWx0Q29tYm8uc3R5bGUubGluZVdpZHRofSxsYWJlbENmZzp7c3R5bGU6e2ZpbGw6aHQuY29tYm9MYWJlbC5zdHlsZS5maWxsLGZvbnRTaXplOmh0LmNvbWJvTGFiZWwuc3R5bGUuZm9udFNpemV9LHJlZlg6MCxyZWZZOjB9LHN0YXRlU3R5bGVzOk9iamVjdCh2LmEpKHt9LGh0LmNvbWJvU3RhdGVTdHlsZXMpfSxzaGFwZVR5cGU6XCJjaXJjbGVcIixsYWJlbFBvc2l0aW9uOlwidG9wXCIsZHJhd1NoYXBlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRTaGFwZVN0eWxlKHQpO3JldHVybiBkZWxldGUgbi5oZWlnaHQsZGVsZXRlIG4ud2lkdGgsZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpuLGNsYXNzTmFtZTpcImNpcmNsZS1jb21ib1wiLG5hbWU6XCJjaXJjbGUtY29tYm9cIixkcmFnZ2FibGU6ITB9KX0sZ2V0U2hhcGVTdHlsZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMuc3R5bGUsbj10LnBhZGRpbmd8fHRoaXMub3B0aW9ucy5wYWRkaW5nO09iamVjdChoLm0pKG4pJiYobj1uWzBdKTt2YXIgcixpPXtzdHJva2U6dC5jb2xvcn0sbz1PYmplY3QoaC5BKSh7fSxlLGksdC5zdHlsZSksYT10aGlzLmdldFNpemUodCk7cj0hT2JqZWN0KGgudCkoby5yKXx8aXNOYU4oby5yKT9hWzBdLzJ8fGh0LmRlZmF1bHRDb21iby5zdHlsZS5yOk1hdGgubWF4KG8ucixhWzBdLzIpfHxhWzBdLzIsby5yPXIrbjt2YXIgcz1PYmplY3Qodi5hKSh7eDowLHk6MH0sbyk7cmV0dXJuIHQuc3R5bGU/dC5zdHlsZS5yPXI6dC5zdHlsZT17cjpyfSxzfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFNpemUodCkscj10LnBhZGRpbmd8fHRoaXMub3B0aW9ucy5wYWRkaW5nO09iamVjdChoLm0pKHIpJiYocj1yWzBdKTt2YXIgaT1PYmplY3QoaC5jKSh0LnN0eWxlKSxvPU1hdGgubWF4KGkucixuWzBdLzIpfHxuWzBdLzI7aS5yPW8rcjt2YXIgYT1lLmdldChcInNpemVDYWNoZVwiKTthJiYoYS5yPWkucik7dmFyIHM9e3N0cm9rZTp0LmNvbG9yfSx1PWUuZ2V0KFwia2V5U2hhcGVcIiksYz1PYmplY3QoaC5BKSh7fSx1LmF0dHIoKSxzLGkpO3Quc3R5bGU/dC5zdHlsZS5yPW86dC5zdHlsZT17cjpvfSx0aGlzLnVwZGF0ZVNoYXBlKHQsZSxjLCEwKX19LFwic2luZ2xlLWNvbWJvXCIpLHRlLnJlZ2lzdGVyQ29tYm8oXCJyZWN0XCIse29wdGlvbnM6e3NpemU6WzQwLDVdLHBhZGRpbmc6WzI1LDIwLDE1LDIwXSxhbmltYXRlOiEwLHN0eWxlOntyYWRpdXM6MCxzdHJva2U6aHQuZGVmYXVsdENvbWJvLnN0eWxlLnN0cm9rZSxmaWxsOmh0LmRlZmF1bHRDb21iby5zdHlsZS5maWxsLGxpbmVXaWR0aDpodC5kZWZhdWx0Q29tYm8uc3R5bGUubGluZVdpZHRofSxsYWJlbENmZzp7c3R5bGU6e2ZpbGw6aHQuY29tYm9MYWJlbC5zdHlsZS5maWxsLGZvbnRTaXplOmh0LmNvbWJvTGFiZWwuc3R5bGUuZm9udFNpemV9fSxhbmNob3JQb2ludHM6W1swLC41XSxbMSwuNV1dLHN0YXRlU3R5bGVzOk9iamVjdCh2LmEpKHt9LGh0LmNvbWJvU3RhdGVTdHlsZXMpfSxzaGFwZVR5cGU6XCJyZWN0XCIsbGFiZWxQb3NpdGlvbjpcInRvcFwiLGRyYXdTaGFwZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0U2hhcGVTdHlsZSh0KTtyZXR1cm4gZS5hZGRTaGFwZShcInJlY3RcIix7YXR0cnM6bixjbGFzc05hbWU6XCJyZWN0LWNvbWJvXCIsbmFtZTpcInJlY3QtY29tYm9cIixkcmFnZ2FibGU6ITB9KX0sZ2V0TGFiZWxTdHlsZUJ5UG9zaXRpb246ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnBvc2l0aW9ufHx0aGlzLmxhYmVsUG9zaXRpb24scj10LnN0eWxlLGk9dC5wYWRkaW5nfHx0aGlzLm9wdGlvbnMucGFkZGluZztPYmplY3QoaC50KShpKSYmKGk9W2ksaSxpLGldKTt2YXIgbz1lLnJlZlgsYT1lLnJlZlk7T2JqZWN0KGgucykobykmJihvPXRoaXMucmVmWCksT2JqZWN0KGgucykoYSkmJihhPXRoaXMucmVmWSk7dmFyIHMsdT1yLndpZHRoLzIraVszXSxjPXIuaGVpZ2h0LzIraVswXTtzd2l0Y2gobil7Y2FzZVwidG9wXCI6cz17eDowLXUrbyx5OjAtYythLHRleHRCYXNlbGluZTpcInRvcFwiLHRleHRBbGlnbjpcImxlZnRcIn07YnJlYWs7Y2FzZVwiYm90dG9tXCI6cz17eDowLHk6YythLHRleHRCYXNlbGluZTpcImJvdHRvbVwiLHRleHRBbGlnbjpcImNlbnRlclwifTticmVhaztjYXNlXCJsZWZ0XCI6cz17eDowLXUrYSx5OjAsdGV4dEFsaWduOlwibGVmdFwifTticmVhaztjYXNlXCJjZW50ZXJcIjpzPXt4OjAseTowLHRleHQ6dC5sYWJlbCx0ZXh0QWxpZ246XCJjZW50ZXJcIn07YnJlYWs7ZGVmYXVsdDpzPXt4OnUrbyx5OjAsdGV4dEFsaWduOlwicmlnaHRcIn19cmV0dXJuIHMudGV4dD10LmxhYmVsLHN9LGdldFNoYXBlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLnN0eWxlLG49dC5wYWRkaW5nfHx0aGlzLm9wdGlvbnMucGFkZGluZztPYmplY3QoaC50KShuKSYmKG49W24sbixuLG5dKTt2YXIgcixpLG89e3N0cm9rZTp0LmNvbG9yfSxhPU9iamVjdChoLkEpKHt9LGUsbyx0LnN0eWxlKSxzPXRoaXMuZ2V0U2l6ZSh0KTtyPSFPYmplY3QoaC50KShhLndpZHRoKXx8aXNOYU4oYS53aWR0aCk/c1swXXx8aHQuZGVmYXVsdENvbWJvLnN0eWxlLndpZHRoOk1hdGgubWF4KGEud2lkdGgsc1swXSl8fHNbMF0saT0hT2JqZWN0KGgudCkoYS5oZWlnaHQpfHxpc05hTihhLmhlaWdodCk/c1sxXXx8aHQuZGVmYXVsdENvbWJvLnN0eWxlLmhlaWdodDpNYXRoLm1heChhLmhlaWdodCxzWzFdKXx8c1sxXTt2YXIgdT0tci8yLW5bM10sYz0taS8yLW5bMF07YS53aWR0aD1yK25bMV0rblszXSxhLmhlaWdodD1pK25bMF0rblsyXTt2YXIgZj1PYmplY3Qodi5hKSh7eDp1LHk6Y30sYSk7cmV0dXJuIHQuc3R5bGU/KHQuc3R5bGUud2lkdGg9cix0LnN0eWxlLmhlaWdodD1pKTp0LnN0eWxlPXt3aWR0aDpyLGhlaWdodDppfSxmfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFNpemUodCkscj10LnBhZGRpbmd8fHRoaXMub3B0aW9ucy5wYWRkaW5nO09iamVjdChoLnQpKHIpJiYocj1bcixyLHIscl0pO3ZhciBpPU9iamVjdChoLmMpKHQuc3R5bGUpLG89TWF0aC5tYXgoaS53aWR0aCxuWzBdKXx8blswXSxhPU1hdGgubWF4KGkuaGVpZ2h0LG5bMV0pfHxuWzFdO2kud2lkdGg9bytyWzFdK3JbM10saS5oZWlnaHQ9YStyWzBdK3JbMl07dmFyIHM9ZS5nZXQoXCJzaXplQ2FjaGVcIik7cyYmKHMud2lkdGg9aS53aWR0aCxzLmhlaWdodD1pLmhlaWdodCksaS54PS1vLzItclszXSxpLnk9LWEvMi1yWzBdO3ZhciB1PXtzdHJva2U6dC5jb2xvcn0sYz1lLmdldChcImtleVNoYXBlXCIpLGY9T2JqZWN0KGguQSkoe30sYy5hdHRyKCksdSxpKTt0LnN0eWxlPyh0LnN0eWxlLndpZHRoPW8sdC5zdHlsZS5oZWlnaHQ9YSk6dC5zdHlsZT17d2lkdGg6byxoZWlnaHQ6YX0sdGhpcy51cGRhdGVTaGFwZSh0LGUsZiwhMSl9LHVwZGF0ZVNoYXBlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmdldChcImtleVNoYXBlXCIpOyh2b2lkIDA9PT10LmFuaW1hdGU/dGhpcy5vcHRpb25zLmFuaW1hdGU6dC5hbmltYXRlKSYmci5hbmltYXRlP3IuYW5pbWF0ZShuLHtkdXJhdGlvbjoyMDAsZWFzaW5nOlwiZWFzZUxpbmVhclwifSk6ci5hdHRyKE9iamVjdCh2LmEpKHt9LG4pKSx0aGlzLnVwZGF0ZUxhYmVsKHQsZSl9fSxcInNpbmdsZS1jb21ib1wiKSx0ZS5yZWdpc3Rlck5vZGUoXCJzaW1wbGUtY2lyY2xlXCIse29wdGlvbnM6e3NpemU6aHQuZGVmYXVsdE5vZGUuc2l6ZSxzdHlsZTp7eDowLHk6MCxzdHJva2U6aHQuZGVmYXVsdE5vZGUuc3R5bGUuc3Ryb2tlLGZpbGw6aHQuZGVmYXVsdE5vZGUuc3R5bGUuZmlsbCxsaW5lV2lkdGg6aHQuZGVmYXVsdE5vZGUuc3R5bGUubGluZVdpZHRofSxsYWJlbENmZzp7c3R5bGU6e2ZpbGw6aHQubm9kZUxhYmVsLnN0eWxlLmZpbGwsZm9udFNpemU6aHQubm9kZUxhYmVsLnN0eWxlLmZvbnRTaXplfX0sc3RhdGVTdHlsZXM6T2JqZWN0KHYuYSkoe30saHQubm9kZVN0YXRlU3R5bGVzKX0sc2hhcGVUeXBlOlwic2ltcGxlLWNpcmNsZVwiLGxhYmVsUG9zaXRpb246XCJjZW50ZXJcIixkcmF3U2hhcGU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFNoYXBlU3R5bGUodCk7cmV0dXJuIGUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6bixjbGFzc05hbWU6dGhpcy50eXBlK1wiLWtleVNoYXBlXCIsZHJhZ2dhYmxlOiEwfSl9LGdldFNoYXBlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRPcHRpb25zKHQpLnN0eWxlLG49e3N0cm9rZTp0LmNvbG9yfSxyPU9iamVjdChoLmUpKHt9LGUsbiksaT10aGlzLmdldFNpemUodClbMF0vMjtyZXR1cm4gT2JqZWN0KHYuYSkoe3g6MCx5OjAscjppfSxyKX0sdXBkYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRTaXplKHQpLHI9e3N0cm9rZTp0LmNvbG9yLHI6blswXS8yfSxpPWUuZ2V0KFwia2V5U2hhcGVcIiksbz1PYmplY3QoaC5lKSh7fSxpLmF0dHIoKSxyLHQuc3R5bGUpO3RoaXMudXBkYXRlU2hhcGUodCxlLG8sITApfX0sXCJzaW5nbGUtbm9kZVwiKSx0ZS5yZWdpc3Rlck5vZGUoXCJzaW1wbGUtcmVjdFwiLHtvcHRpb25zOntzaXplOlsxMDAsMzBdLHN0eWxlOntyYWRpdXM6MCxzdHJva2U6aHQuZGVmYXVsdE5vZGUuc3R5bGUuc3Ryb2tlLGZpbGw6aHQuZGVmYXVsdE5vZGUuc3R5bGUuZmlsbCxsaW5lV2lkdGg6aHQuZGVmYXVsdE5vZGUuc3R5bGUubGluZVdpZHRofSxsYWJlbENmZzp7c3R5bGU6e2ZpbGw6aHQubm9kZUxhYmVsLnN0eWxlLmZpbGwsZm9udFNpemU6aHQubm9kZUxhYmVsLnN0eWxlLmZvbnRTaXplfX0sYW5jaG9yUG9pbnRzOltbMCwuNV0sWzEsLjVdXSxzdGF0ZVN0eWxlczpPYmplY3Qodi5hKSh7fSxodC5ub2RlU3RhdGVTdHlsZXMpfSxzaGFwZVR5cGU6XCJzaW1wbGUtcmVjdFwiLGxhYmVsUG9zaXRpb246XCJjZW50ZXJcIixkcmF3U2hhcGU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFNoYXBlU3R5bGUodCk7cmV0dXJuIGUuYWRkU2hhcGUoXCJyZWN0XCIse2F0dHJzOm4sY2xhc3NOYW1lOnRoaXMudHlwZStcIi1rZXlTaGFwZVwiLG5hbWU6dGhpcy50eXBlK1wiLWtleVNoYXBlXCIsZHJhZ2dhYmxlOiEwfSl9LGdldFNoYXBlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRPcHRpb25zKHQpLnN0eWxlLG49e3N0cm9rZTp0LmNvbG9yfSxyPU9iamVjdChoLkEpKHt9LGUsbiksaT10aGlzLmdldFNpemUodCksbz1yLndpZHRofHxpWzBdLGE9ci5oZWlnaHR8fGlbMV07cmV0dXJuIE9iamVjdCh2LmEpKHt4Oi1vLzIseTotYS8yLHdpZHRoOm8saGVpZ2h0OmF9LHIpfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXtlLmdldENvbnRhaW5lcigpO3ZhciBuPXRoaXMuZ2V0T3B0aW9ucyh7fSkuc3R5bGUscj10aGlzLmdldFNpemUodCksaT1lLmdldChcImtleVNoYXBlXCIpO3Quc2l6ZXx8KHJbMF09aS5hdHRyKFwid2lkdGhcIil8fG4ud2lkdGgsclsxXT1pLmF0dHIoXCJoZWlnaHRcIil8fG4uaGVpZ2h0KTt2YXIgbz17c3Ryb2tlOnQuY29sb3IseDotclswXS8yLHk6LXJbMV0vMix3aWR0aDpyWzBdLGhlaWdodDpyWzFdfSxhPU9iamVjdChoLkEpKHt9LG4saS5hdHRyKCksbyk7YT1PYmplY3QoaC5BKShhLHQuc3R5bGUpLHRoaXMudXBkYXRlU2hhcGUodCxlLGEsITEpfX0sXCJzaW5nbGUtbm9kZVwiKSx0ZS5yZWdpc3Rlck5vZGUoXCJpbWFnZVwiLHtvcHRpb25zOntpbWc6XCJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL21kbi9ybXNfZjhjNmEwL2FmdHMvaW1nL0EqZUQ3blQ2dG1ZZ0FBQUFBQUFBQUFBQUJrQVJRbkFRXCIsc2l6ZToyMDAsY2xpcENmZzp7c2hvdzohMSx0eXBlOlwiY2lyY2xlXCIscjo1MCxyeDo1MCxyeTozNSx3aWR0aDo1MCxoZWlnaHQ6MzUscG9pbnRzOltbMzAsMTJdLFsxMiwzMF0sWzMwLDQ4XSxbNDgsMzBdXSxwYXRoOltbXCJNXCIsMjUsMjVdLFtcIkxcIiw1MCwyNV0sW1wiQVwiLDEyLjUsMTIuNSwwLDEsMSw1MCw1MF0sW1wiQVwiLDEyLjUsMTIuNSwwLDEsMCw1MCw1MF0sW1wiTFwiLDI1LDc1XSxbXCJaXCJdXSx4OjAseTowfX0sc2hhcGVUeXBlOlwiaW1hZ2VcIixsYWJlbFBvc2l0aW9uOlwiYm90dG9tXCIsZHJhd1NoYXBlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5zaGFwZVR5cGUscj10aGlzLmdldFNoYXBlU3R5bGUodCk7ZGVsZXRlIHIuZmlsbDt2YXIgaT1lLmFkZFNoYXBlKG4se2F0dHJzOnIsY2xhc3NOYW1lOnRoaXMudHlwZStcIi1rZXlTaGFwZVwiLG5hbWU6dGhpcy50eXBlK1wiLWtleVNoYXBlXCIsZHJhZ2dhYmxlOiEwfSk7cmV0dXJuIHRoaXMuZHJhd0NsaXAodCxpKSxpfSxkcmF3Q2xpcDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0T3B0aW9ucyh0KS5jbGlwQ2ZnO2lmKG4uc2hvdyl7dmFyIHI9bi50eXBlLGk9bi54LG89bi55LGE9bi5zdHlsZTtpZihcImNpcmNsZVwiPT09cil7dmFyIHM9bi5yO2Uuc2V0Q2xpcCh7dHlwZTpcImNpcmNsZVwiLGF0dHJzOk9iamVjdCh2LmEpKHtyOnMseDppLHk6b30sYSl9KX1lbHNlIGlmKFwicmVjdFwiPT09cil7dmFyIHU9bi53aWR0aCxjPW4uaGVpZ2h0LGY9aS11LzIsbD1vLWMvMjtlLnNldENsaXAoe3R5cGU6XCJyZWN0XCIsYXR0cnM6T2JqZWN0KHYuYSkoe3g6Zix5Omwsd2lkdGg6dSxoZWlnaHQ6Y30sYSl9KX1lbHNlIGlmKFwiZWxsaXBzZVwiPT09cil7dmFyIGg9bi5yeCxkPW4ucnk7ZS5zZXRDbGlwKHt0eXBlOlwiZWxsaXBzZVwiLGF0dHJzOk9iamVjdCh2LmEpKHt4OmkseTpvLHJ4Omgscnk6ZH0sYSl9KX1lbHNlIGlmKFwicG9seWdvblwiPT09cil7dmFyIHA9bi5wb2ludHM7ZS5zZXRDbGlwKHt0eXBlOlwicG9seWdvblwiLGF0dHJzOk9iamVjdCh2LmEpKHtwb2ludHM6cH0sYSl9KX1lbHNlIGlmKFwicGF0aFwiPT09cil7dmFyIGc9bi5wYXRoO2Uuc2V0Q2xpcCh7dHlwZTpcInBhdGhcIixhdHRyczpPYmplY3Qodi5hKSh7cGF0aDpnfSxhKX0pfX19LGdldFNoYXBlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRPcHRpb25zKHQpLnN0eWxlLG49dGhpcy5nZXRTaXplKHQpLHI9dGhpcy5nZXRPcHRpb25zKHQpLmltZyxpPW5bMF0sbz1uWzFdO3JldHVybiBlJiYoaT1lLndpZHRofHxuWzBdLG89ZS5oZWlnaHR8fG5bMV0pLE9iamVjdCh2LmEpKHt4Oi1pLzIseTotby8yLHdpZHRoOmksaGVpZ2h0Om8saW1nOnJ9LGUpfSx1cGRhdGVTaGFwZVN0eWxlOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5nZXRDb250YWluZXIoKSxyPXRoaXMuaXRlbVR5cGUrXCItc2hhcGVcIixpPW4uZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0KFwiY2xhc3NOYW1lXCIpPT09cn0pKXx8ZS5nZXRLZXlTaGFwZSgpLG89dGhpcy5nZXRTaGFwZVN0eWxlKHQpO2kmJmkuYXR0cihvKX19LFwic2luZ2xlLW5vZGVcIik7dmFyIFllLEhlPXt0cmlhbmdsZTpmdW5jdGlvbih0LGUsbil7dm9pZCAwPT09dCYmKHQ9MTApLHZvaWQgMD09PWUmJihlPTE1KSx2b2lkIDA9PT1uJiYobj0wKTt2YXIgcj0yKm47cmV0dXJuXCJNIFwiK3IrXCIsMCBMIFwiKyhyK2UpK1wiLC1cIit0LzIrXCIgTCBcIisocitlKStcIixcIit0LzIrXCIgWlwifSx2ZWU6ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PXQmJih0PTE1KSx2b2lkIDA9PT1lJiYoZT0yMCksdm9pZCAwPT09biYmKG49MCk7dmFyIHI9MipuO3JldHVyblwiTSBcIityK1wiLDAgTCBcIisocitlKStcIiwtXCIrdC8yK1wiXFxuICAgICAgICBMIFwiKyhyKzIqZS8zKStcIiwwIEwgXCIrKHIrZSkrXCIsXCIrdC8yK1wiIFpcIn0sY2lyY2xlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PXQmJih0PTUpLHZvaWQgMD09PWUmJihlPTApLFwiTSBcIisyKmUrXCIsIDBcXG4gICAgICAgICAgICBhIFwiK3QrXCIsXCIrdCtcIiAwIDEsMCBcIisyKnQrXCIsMFxcbiAgICAgICAgICAgIGEgXCIrdCtcIixcIit0K1wiIDAgMSwwIFwiKzIqLXQrXCIsMFwifSxyZWN0OmZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT10JiYodD0xMCksdm9pZCAwPT09ZSYmKGU9MTApLHZvaWQgMD09PW4mJihuPTApO3ZhciByPTIqbjtyZXR1cm5cIk0gXCIrcitcIixcIistdC8yK1wiIFxcbiAgICAgICAgTCBcIisocitlKStcIixcIistdC8yK1wiIFxcbiAgICAgICAgTCBcIisocitlKStcIixcIit0LzIrXCIgXFxuICAgICAgICBMIFwiK3IrXCIsXCIrdC8yK1wiIFpcIn0sZGlhbW9uZDpmdW5jdGlvbih0LGUsbil7dm9pZCAwPT09dCYmKHQ9MTUpLHZvaWQgMD09PWUmJihlPTE1KSx2b2lkIDA9PT1uJiYobj0wKTt2YXIgcj0yKm47cmV0dXJuXCJNIFwiK3IrXCIsMCBcXG4gICAgICAgIEwgXCIrKHIrZS8yKStcIixcIistdC8yK1wiIFxcbiAgICAgICAgTCBcIisocitlKStcIiwwIFxcbiAgICAgICAgTCBcIisocitlLzIpK1wiLFwiK3QvMitcIiBaXCJ9LHRyaWFuZ2xlUmVjdDpmdW5jdGlvbih0LGUsbixyLGksbyl7dm9pZCAwPT09dCYmKHQ9MTUpLHZvaWQgMD09PWUmJihlPTE1KSx2b2lkIDA9PT1uJiYobj0xNSksdm9pZCAwPT09ciYmKHI9Myksdm9pZCAwPT09aSYmKGk9NSksdm9pZCAwPT09byYmKG89MCk7dmFyIGE9MipvLHM9YStlK2k7cmV0dXJuXCJNIFwiK2ErXCIsMCBMIFwiKyhhK2UpK1wiLC1cIit0LzIrXCIgTCBcIisoYStlKStcIixcIit0LzIrXCIgWlxcbiAgICAgICAgICAgIE0gXCIrcytcIiwgLVwiK24vMitcIlxcbiAgICAgICAgICAgIEwgXCIrKHMrcikrXCIgLVwiK24vMitcIlxcbiAgICAgICAgICAgIEwgXCIrKHMrcikrXCIgXCIrbi8yK1wiXFxuICAgICAgICAgICAgTCBcIitzK1wiIFwiK24vMitcIlxcbiAgICAgICAgICAgIFpcIn19LHFlPXtjb2xsYXBzZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuW1tcIk1cIix0LW4sZV0sW1wiYVwiLG4sbiwwLDEsMCwyKm4sMF0sW1wiYVwiLG4sbiwwLDEsMCwyKi1uLDBdLFtcIk1cIix0LW4rNCxlXSxbXCJMXCIsdCtuLTQsZV1dfSxleHBhbmQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybltbXCJNXCIsdC1uLGVdLFtcImFcIixuLG4sMCwxLDAsMipuLDBdLFtcImFcIixuLG4sMCwxLDAsMiotbiwwXSxbXCJNXCIsdC1uKzQsZV0sW1wiTFwiLHQtbisyKm4tNCxlXSxbXCJNXCIsdC1uK24sZS1uKzRdLFtcIkxcIix0LGUrbi00XV19LHVwVHJpYW5nbGU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4qTWF0aC5jb3MoTWF0aC5QSS82KSxpPW4qTWF0aC5zaW4oTWF0aC5QSS82KTtyZXR1cm5bW1wiTVwiLHQtcixlK2ldLFtcIkxcIix0K3IsZStpXSxbXCJMXCIsdCxlLW5dLFtcIlpcIl1dfSxkb3duVHJpYW5nbGU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4qTWF0aC5jb3MoTWF0aC5QSS82KSxpPW4qTWF0aC5zaW4oTWF0aC5QSS82KTtyZXR1cm5bW1wiTVwiLHQtcixlLWldLFtcIkxcIix0K3IsZS1pXSxbXCJMXCIsdCxlK25dLFtcIlpcIl1dfX0sS2U9dGUsWmU9bS5hLnRyYW5zZm9ybSxRZT1PYmplY3Qodi5hKShPYmplY3Qodi5hKShPYmplY3Qodi5hKShPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxpKSxvKSxhKSxyKSx7dHJhbnNmb3JtOlplLG1hdDM6bS5ifSksSmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuZ3JhcGg9dCx0aGlzLmxheW91dENmZz10LmdldChcImxheW91dFwiKXx8e30sdGhpcy5sYXlvdXRUeXBlPXRoaXMubGF5b3V0Q2ZnLnR5cGUsdGhpcy5pbml0TGF5b3V0KCl9cmV0dXJuIHQucHJvdG90eXBlLmluaXRMYXlvdXQ9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmdldExheW91dFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXRDZmcudHlwZX0sdC5wcm90b3R5cGUucmVmcmVzaExheW91dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ3JhcGg7dCYmKHQuZ2V0KFwiYW5pbWF0ZVwiKT90LnBvc2l0aW9uc0FuaW1hdGUoKTp0LnJlZnJlc2hQb3NpdGlvbnMoKSl9LHQucHJvdG90eXBlLmNoYW5nZUxheW91dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdyYXBoLG49dGhpcy5sYXlvdXRNZXRob2Q7dGhpcy5sYXlvdXRUeXBlPXQsdGhpcy5sYXlvdXRDZmc9ZS5nZXQoXCJsYXlvdXRcIil8fHt9LHRoaXMubGF5b3V0Q2ZnLnR5cGU9dCxuJiZuLmRlc3Ryb3koKSx0aGlzLmxheW91dCgpfSx0LnByb3RvdHlwZS5jaGFuZ2VEYXRhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sYXlvdXRNZXRob2Q7dCYmdC5kZXN0cm95KCksdGhpcy5sYXlvdXQoKX0sdC5wcm90b3R5cGUuZGVzdHJveUxheW91dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGF5b3V0TWV0aG9kLGU9dGhpcy5ncmFwaDt0JiZ0LmRlc3Ryb3koKSxlLnNldChcImxheW91dFwiLHZvaWQgMCksdGhpcy5sYXlvdXRDZmc9dm9pZCAwLHRoaXMubGF5b3V0VHlwZT12b2lkIDAsdGhpcy5sYXlvdXRNZXRob2Q9dm9pZCAwfSx0LnByb3RvdHlwZS5zZXREYXRhRnJvbUdyYXBoPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9W10sbj1bXSxyPXRoaXMuZ3JhcGguZ2V0Tm9kZXMoKSxpPXRoaXMuZ3JhcGguZ2V0RWRnZXMoKSxvPXRoaXMuZ3JhcGguZ2V0Q29tYm9zKCksYT1yLmxlbmd0aCxzPTA7czxhO3MrKyl7dmFyIHU9cltzXTtpZih1LmlzVmlzaWJsZSgpKXt2YXIgYz11LmdldE1vZGVsKCk7dC5wdXNoKGMpfX12YXIgZj1pLmxlbmd0aDtmb3Iocz0wO3M8ZjtzKyspe3ZhciBsPWlbc107aWYobCYmIWwuZGVzdHJveWVkJiZsLmlzVmlzaWJsZSgpKShjPWwuZ2V0TW9kZWwoKSkuaXNDb21ib0VkZ2V8fGUucHVzaChjKX12YXIgaD1vLmxlbmd0aDtmb3Iocz0wO3M8aDtzKyspe3ZhciBkPW9bc107aWYoIWQuZGVzdHJveWVkJiZkLmlzVmlzaWJsZSgpKXtjPWQuZ2V0TW9kZWwoKTtuLnB1c2goYyl9fXJldHVybntub2Rlczp0LGVkZ2VzOmUsY29tYm9zOm59fSx0LnByb3RvdHlwZS5yZWxheW91dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdyYXBoLG49dGhpcy5sYXlvdXRNZXRob2Qscj10aGlzLmxheW91dENmZztpZih0KXt0aGlzLmRhdGE9dGhpcy5zZXREYXRhRnJvbUdyYXBoKCk7dmFyIGk9dGhpcy5kYXRhLm5vZGVzO2lmKCFpKXJldHVybiExO3RoaXMuaW5pdFBvc2l0aW9ucyhyLmNlbnRlcixpKSxuLmluaXQodGhpcy5kYXRhKX1cImZvcmNlXCI9PT10aGlzLmxheW91dFR5cGUmJihuLnRpY2tpbmc9ITEsbi5mb3JjZVNpbXVsYXRpb24uc3RvcCgpKSxlLmVtaXQoXCJiZWZvcmVsYXlvdXRcIiksbi5leGVjdXRlKHQpLG4uaXNDdXN0b21MYXlvdXQmJnIub25MYXlvdXRFbmQmJnIub25MYXlvdXRFbmQoKX0sdC5wcm90b3R5cGUubGF5b3V0QW5pbWF0ZT1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUubW92ZVRvWmVybz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ3JhcGguZ2V0KFwiZGF0YVwiKS5ub2RlcztpZih2b2lkIDAhPT10WzBdLngmJm51bGwhPT10WzBdLngmJiFTdCh0WzBdLngpKXtmb3IodmFyIGU9WzAsMF0sbj10Lmxlbmd0aCxyPTA7cjxuO3IrKyl7dmFyIGk9dFtyXTtlWzBdKz1pLngsZVsxXSs9aS55fWVbMF0vPXQubGVuZ3RoLGVbMV0vPXQubGVuZ3RoO2ZvcihyPTA7cjxuO3IrKyl7KGk9dFtyXSkueC09ZVswXSxpLnktPWVbMV19fX0sdC5wcm90b3R5cGUuaW5pdFBvc2l0aW9ucz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ3JhcGg7aWYoIWUpcmV0dXJuITE7dmFyIHI9ITAsaT0uODUqbi5nZXQoXCJ3aWR0aFwiKSxvPS44NSpuLmdldChcImhlaWdodFwiKSxhPWUubGVuZ3RoLHM9TWF0aC5jZWlsKE1hdGguc3FydChhKSooaS9vKSksdT1pLyhzLTEpLGM9by8oTWF0aC5jZWlsKGEvcyktMSk7aXNGaW5pdGUodSkmJnV8fCh1PTApLGlzRmluaXRlKGMpJiZ1fHwoYz0wKTtmb3IodmFyIGY9dFswXS1pLzIsbD10WzFdLW8vMixoPWUubGVuZ3RoLGQ9MDtkPGg7ZCsrKXt2YXIgcD1lW2RdO1N0KHAueCkmJihyPSExLHAueD1kJXMqdStmKSxTdChwLnkpJiYocj0hMSxwLnk9TWF0aC5mbG9vcihkL3MpKmMrbCl9cmV0dXJuIHJ9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxheW91dE1ldGhvZDt0aGlzLmdyYXBoPW51bGwsdCYmKHQuZGVzdHJveSgpLHQuZGVzdHJveWVkPSEwKSx0aGlzLmRlc3Ryb3llZD0hMH0sdH0oKSwkZT1mdW5jdGlvbih0KXt0aGlzLmdyYXBoPXQsdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5pbml0RXZlbnRzKCl9OyFmdW5jdGlvbih0KXt0LkNMSUNLPVwiY2xpY2tcIix0LkRCTENMSUNLPVwiZGJsY2xpY2tcIix0Lk1PVVNFRE9XTj1cIm1vdXNlZG93blwiLHQuTU9VREVVUD1cIm1vdXNldXBcIix0LkNPTlRFWFRNRU5VPVwiY29udGV4dG1lbnVcIix0Lk1PVVNFRU5URVI9XCJtb3VzZWVudGVyXCIsdC5NT1VTRU9VVD1cIm1vdXNlb3V0XCIsdC5NT1VTRU9WRVI9XCJtb3VzZW92ZXJcIix0Lk1PVVNFTU9WRT1cIm1vdXNlbW92ZVwiLHQuTU9VU0VMRUFWRT1cIm1vdXNlbGVhdmVcIix0LkRSQUdTVEFSVD1cImRyYWdzdGFydFwiLHQuRFJBR0VORD1cImRyYWdlbmRcIix0LkRSQUc9XCJkcmFnXCIsdC5EUkFHRU5URVI9XCJkcmFnZW50ZXJcIix0LkRSQUdMRUFWRT1cImRyYWdsZWF2ZVwiLHQuRFJBR09WRVI9XCJkcmFnb3ZlclwiLHQuRFJBR09VVD1cImRyYWdvdXRcIix0LkREUk9QPVwiZHJvcFwiLHQuS0VZVVA9XCJrZXl1cFwiLHQuS0VZRE9XTj1cImtleWRvd25cIix0LldIRUVMPVwid2hlZWxcIix0LkZPQ1VTPVwiZm9jdXNcIix0LkJMVVI9XCJibHVyXCIsdC5UT1VDSFNUQVJUPVwidG91Y2hzdGFydFwiLHQuVE9VQ0hNT1ZFPVwidG91Y2htb3ZlXCIsdC5UT1VDSEVORD1cInRvdWNoZW5kXCIsdC5OT0RFX0NPTlRFWFRNRU5VPVwibm9kZTpjb250ZXh0bWVudVwiLHQuTk9ERV9DTElDSz1cIm5vZGU6Y2xpY2tcIix0Lk5PREVfREJMQ0xJQ0s9XCJub2RlOmRibGNsaWNrXCIsdC5OT0RFX01PVVNFRE9XTj1cIm5vZGU6bW91c2Vkb3duXCIsdC5OT0RFX01PVVNFVVA9XCJub2RlOm1vdXNldXBcIix0Lk5PREVfTU9VU0VFTlRFUj1cIm5vZGU6bW91c2VlbnRlclwiLHQuTk9ERV9NT1VTRUxFQVZFPVwibm9kZTptb3VzZWxlYXZlXCIsdC5OT0RFX01PVVNFTU9WRT1cIm5vZGU6bW91c2Vtb3ZlXCIsdC5OT0RFX01PVVNFT1VUPVwibm9kZTptb3VzZW91dFwiLHQuTk9ERV9NT1VTRU9WRVI9XCJub2RlOm1vdXNlb3ZlclwiLHQuTk9ERV9EUk9QPVwibm9kZTpkcm9wXCIsdC5OT0RFX0RSQUdPVkVSPVwibm9kZTpkcmFnb3ZlclwiLHQuTk9ERV9EUkFHRU5URVI9XCJub2RlOmRyYWdlbnRlclwiLHQuTk9ERV9EUkFHTEVBVkU9XCJub2RlOmRyYWdsZWF2ZVwiLHQuTk9ERV9EUkFHU1RBUlQ9XCJub2RlOmRyYWdzdGFydFwiLHQuTk9ERV9EUkFHPVwibm9kZTpkcmFnXCIsdC5OT0RFX0RSQUdFTkQ9XCJub2RlOmRyYWdlbmRcIix0LkNPTUJPX0NPTlRFWFRNRU5VPVwiY29tYm86Y29udGV4dG1lbnVcIix0LkNPTUJPX0NMSUNLPVwiY29tYm86Y2xpY2tcIix0LkNPTUJPX0RCTENMSUNLPVwiY29tYm86ZGJsY2xpY2tcIix0LkNPTUJPX01PVVNFRE9XTj1cImNvbWJvOm1vdXNlZG93blwiLHQuQ09NQk9fTU9VU0VVUD1cImNvbWJvOm1vdXNldXBcIix0LkNPTUJPX01PVVNFRU5URVI9XCJjb21ibzptb3VzZWVudGVyXCIsdC5DT01CT19NT1VTRUxFQVZFPVwiY29tYm86bW91c2VsZWF2ZVwiLHQuQ09NQk9fTU9VU0VNT1ZFPVwiY29tYm86bW91c2Vtb3ZlXCIsdC5DT01CT19NT1VTRU9VVD1cImNvbWJvOm1vdXNlb3V0XCIsdC5DT01CT19NT1VTRU9WRVI9XCJjb21ibzptb3VzZW92ZXJcIix0LkNPTUJPX0RST1A9XCJjb21ibzpkcm9wXCIsdC5DT01CT19EUkFHT1ZFUj1cImNvbWJvOmRyYWdvdmVyXCIsdC5DT01CT19EUkFHRU5URVI9XCJjb21ibzpkcmFnZW50ZXJcIix0LkNPTUJPX0RSQUdMRUFWRT1cImNvbWJvOmRyYWdsZWF2ZVwiLHQuQ09NQk9fRFJBR1NUQVJUPVwiY29tYm86ZHJhZ3N0YXJ0XCIsdC5DT01CT19EUkFHPVwiY29tYm86ZHJhZ1wiLHQuQ09NQk9fRFJBR0VORD1cImNvbWJvOmRyYWdlbmRcIix0LkVER0VfQ09OVEVYVE1FTlU9XCJlZGdlOmNvbnRleHRtZW51XCIsdC5FREdFX0NMSUNLPVwiZWRnZTpjbGlja1wiLHQuRURHRV9EQkxDTElDSz1cImVkZ2U6ZGJsY2xpY2tcIix0LkVER0VfTU9VU0VET1dOPVwiZWRnZTptb3VzZWRvd25cIix0LkVER0VfTU9VU0VVUD1cImVkZ2U6bW91c2V1cFwiLHQuRURHRV9NT1VTRUVOVEVSPVwiZWRnZTptb3VzZWVudGVyXCIsdC5FREdFX01PVVNFTEVBVkU9XCJlZGdlOm1vdXNlbGVhdmVcIix0LkVER0VfTU9VU0VNT1ZFPVwiZWRnZTptb3VzZW1vdmVcIix0LkVER0VfTU9VU0VPVVQ9XCJlZGdlOm1vdXNlb3V0XCIsdC5FREdFX01PVVNFT1ZFUj1cImVkZ2U6bW91c2VvdmVyXCIsdC5FREdFX0RST1A9XCJlZGdlOmRyb3BcIix0LkVER0VfRFJBR09WRVI9XCJlZGdlOmRyYWdvdmVyXCIsdC5FREdFX0RSQUdFTlRFUj1cImVkZ2U6ZHJhZ2VudGVyXCIsdC5FREdFX0RSQUdMRUFWRT1cImVkZ2U6ZHJhZ2xlYXZlXCIsdC5DQU5WQVNfQ09OVEVYVE1FTlU9XCJjYW52YXM6Y29udGV4dG1lbnVcIix0LkNBTlZBU19DTElDSz1cImNhbnZhczpjbGlja1wiLHQuQ0FOVkFTX0RCTENMSUNLPVwiY2FudmFzOmRibGNsaWNrXCIsdC5DQU5WQVNfTU9VU0VET1dOPVwiY2FudmFzOm1vdXNlZG93blwiLHQuQ0FOVkFTX01PVVNFVVA9XCJjYW52YXM6bW91c2V1cFwiLHQuQ0FOVkFTX01PVVNFRU5URVI9XCJjYW52YXM6bW91c2VlbnRlclwiLHQuQ0FOVkFTX01PVVNFTEVBVkU9XCJjYW52YXM6bW91c2VsZWF2ZVwiLHQuQ0FOVkFTX01PVVNFTU9WRT1cImNhbnZhczptb3VzZW1vdmVcIix0LkNBTlZBU19NT1VTRU9VVD1cImNhbnZhczptb3VzZW91dFwiLHQuQ0FOVkFTX01PVVNFT1ZFUj1cImNhbnZhczptb3VzZW92ZXJcIix0LkNBTlZBU19EUk9QPVwiY2FudmFzOmRyb3BcIix0LkNBTlZBU19EUkFHRU5URVI9XCJjYW52YXM6ZHJhZ2VudGVyXCIsdC5DQU5WQVNfRFJBR0xFQVZFPVwiY2FudmFzOmRyYWdsZWF2ZVwiLHQuQ0FOVkFTX0RSQUdTVEFSVD1cImNhbnZhczpkcmFnc3RhcnRcIix0LkNBTlZBU19EUkFHPVwiY2FudmFzOmRyYWdcIix0LkNBTlZBU19EUkFHRU5EPVwiY2FudmFzOmRyYWdlbmRcIix0LkJFRk9SRVJFTkRFUj1cImJlZm9yZXJlbmRlclwiLHQuQUZURVJSRU5ERVI9XCJhZnRlcnJlbmRlclwiLHQuQkVGT1JFQURESVRFTT1cImJlZm9yZWFkZGl0ZW1cIix0LkFGVEVSQURESVRFTT1cImFmdGVyYWRkaXRlbVwiLHQuQkVGT1JFUkVNT1ZFSVRFTT1cImJlZm9yZXJlbW92ZWl0ZW1cIix0LkFGVEVSUkVNT1ZFSVRFTT1cImFmdGVycmVtb3ZlaXRlbVwiLHQuQkVGT1JFVVBEQVRFSVRFTT1cImJlZm9yZXVwZGF0ZWl0ZW1cIix0LkFGVEVSVVBEQVRFSVRFTT1cImFmdGVydXBkYXRlaXRlbVwiLHQuQkVGT1JFSVRFTVZJU0lCSUxJVFlDSEFOR0U9XCJiZWZvcmVpdGVtdmlzaWJpbGl0eWNoYW5nZVwiLHQuQUZURVJJVEVNVklTSUJJTElUWUNIQU5HRT1cImFmdGVyaXRlbXZpc2liaWxpdHljaGFuZ2VcIix0LkJFRk9SRUlURU1TVEFURUNIQU5HRT1cImJlZm9yZWl0ZW1zdGF0ZWNoYW5nZVwiLHQuQUZURVJJVEVNU1RBVEVDSEFOR0U9XCJhZnRlcml0ZW1zdGF0ZWNoYW5nZVwiLHQuQkVGT1JFSVRFTVJFRlJFU0g9XCJiZWZvcmVpdGVtcmVmcmVzaFwiLHQuQUZURVJJVEVNUkVGUkVTSD1cImFmdGVyaXRlbXJlZnJlc2hcIix0LkJFRk9SRUlURU1TVEFURVNDTEVBUj1cImJlZm9yZWl0ZW1zdGF0ZXNjbGVhclwiLHQuQUZURVJJVEVNU1RBVEVTQ0xFQVI9XCJhZnRlcml0ZW1zdGF0ZXNjbGVhclwiLHQuQkVGT1JFTU9ERUNIQU5HRT1cImJlZm9yZW1vZGVjaGFuZ2VcIix0LkFGVEVSTU9ERUNIQU5HRT1cImFmdGVybW9kZWNoYW5nZVwiLHQuQkVGT1JFTEFZT1VUPVwiYmVmb3JlbGF5b3V0XCIsdC5BRlRFUkxBWU9VVD1cImFmdGVybGF5b3V0XCIsdC5CRUZPUkVDUkVBVEVFREdFPVwiYmVmb3JlY3JlYXRlZWRnZVwiLHQuQUZURVJDUkVBVEVFREdFPVwiYWZ0ZXJjcmVhdGVlZGdlXCIsdC5CRUZPUkVHUkFQSFJFRlJFU0hQT1NJVElPTj1cImJlZm9yZWdyYXBocmVmcmVzaHBvc2l0aW9uXCIsdC5BRlRFUkdSQVBIUkVGUkVTSFBPU0lUSU9OPVwiYWZ0ZXJncmFwaHJlZnJlc2hwb3NpdGlvblwiLHQuQkVGT1JFR1JBUEhSRUZSRVNIPVwiYmVmb3JlZ3JhcGhyZWZyZXNoXCIsdC5BRlRFUkdSQVBIUkVGUkVTSD1cImFmdGVyZ3JhcGhyZWZyZXNoXCIsdC5CRUZPUkVBTklNQVRFPVwiYmVmb3JlYW5pbWF0ZVwiLHQuQUZURVJBTklNQVRFPVwiYWZ0ZXJhbmltYXRlXCIsdC5CRUZPUkVQQUlOVD1cImJlZm9yZXBhaW50XCIsdC5BRlRFUlBBSU5UPVwiYWZ0ZXJwYWludFwiLHQuQkVGT1JFQ09MTEFQU0VFWFBBTkRDT01CTz1cImJlZm9yZWNvbGxhcHNlZXhwYW5kY29tYm9cIix0LkFGVEVSQ09MTEFQU0VFWFBBTkRDT01CTz1cImFmdGVyY29sbGFwc2VleHBhbmRjb21ib1wiLHQuR1JBUEhTVEFURUNIQU5HRT1cImdyYXBoc3RhdGVjaGFuZ2VcIix0LkFGVEVSQUNUSVZBVEVSRUxBVElPTlM9XCJhZnRlcmFjdGl2YXRlcmVsYXRpb25zXCIsdC5OT0RFU0VMRUNUQ0hBTkdFPVwibm9kZXNlbGVjdGNoYW5nZVwiLHQuVE9PTFRJUENIQU5HRT1cInRvb2x0aXBjaGFuZ2VcIix0LldIRUVMWk9PTT1cIndoZWVsem9vbVwiLHQuVklFV1BPUlRDSEFOR0U9XCJ2aWV3cG9ydGNoYW5nZVwiLHQuRFJBR05PREVFTkQ9XCJkcmFnbm9kZWVuZFwiLHQuU1RBQ0tDSEFOR0U9XCJzdGFja2NoYW5nZVwifShZZXx8KFllPXt9KSk7dmFyIHRuPUtlLnJlZ2lzdGVyTm9kZSxlbj1LZS5yZWdpc3RlckVkZ2Usbm49S2UucmVnaXN0ZXJDb21ibyxybj1nLnJlZ2lzdGVyQmVoYXZpb3Isb249aHQsYW49KEtlLnJlZ2lzdGVyTm9kZSxLZS5yZWdpc3RlckVkZ2UsS2UucmVnaXN0ZXJDb21ibyxnLnJlZ2lzdGVyQmVoYXZpb3Isbig1MykpLHNuPW4oNjMpLHVuPW4oMik7ZnVuY3Rpb24gY24odCxlLG4pe3ZhciByPVswLDAsMCwwLDAsMCwwLDAsMF07cmV0dXJuIHVuLmEuZnJvbVRyYW5zbGF0aW9uKHIsbiksdW4uYS5tdWx0aXBseSh0LHIsZSl9ZnVuY3Rpb24gZm4odCxlLG4pe3ZhciByPVswLDAsMCwwLDAsMCwwLDAsMF07cmV0dXJuIHVuLmEuZnJvbVJvdGF0aW9uKHIsbiksdW4uYS5tdWx0aXBseSh0LHIsZSl9ZnVuY3Rpb24gbG4odCxlLG4pe3ZhciByPVswLDAsMCwwLDAsMCwwLDAsMF07cmV0dXJuIHVuLmEuZnJvbVNjYWxpbmcocixuKSx1bi5hLm11bHRpcGx5KHQscixlKX1mdW5jdGlvbiBobih0LGUpe2Zvcih2YXIgbixyLGksbz10P1tdLmNvbmNhdCh0KTpbMSwwLDAsMCwxLDAsMCwwLDFdLGE9MCxzPWUubGVuZ3RoO2E8czthKyspe3ZhciB1PWVbYV07c3dpdGNoKHVbMF0pe2Nhc2VcInRcIjpjbihvLG8sW3VbMV0sdVsyXV0pO2JyZWFrO2Nhc2VcInNcIjpsbihvLG8sW3VbMV0sdVsyXV0pO2JyZWFrO2Nhc2VcInJcIjpmbihvLG8sdVsxXSk7YnJlYWs7Y2FzZVwibVwiOm49byxyPW8saT11WzFdLHVuLmEubXVsdGlwbHkobixpLHIpfX1yZXR1cm4gb31mdW5jdGlvbiBkbih0LGUpe3JldHVybiB0WzBdKmVbMV0tZVswXSp0WzFdfWZ1bmN0aW9uIHBuKHQsZSxuKXt2YXIgcj11bi5kLmFuZ2xlKHQsZSksaT1kbih0LGUpPj0wO3JldHVybiBuP2k/MipNYXRoLlBJLXI6cjppP3I6MipNYXRoLlBJLXJ9ZnVuY3Rpb24gZ24odCxlLG4pe3JldHVybiBuPyh0WzBdPWVbMV0sdFsxXT0tMSplWzBdKToodFswXT0tMSplWzFdLHRbMV09ZVswXSksdH12YXIgdm49big4NSkseW49bi5uKHZuKSxtbj1uKDk1KSxibj1uLm4obW4pLHhuPVt7aW5kZXg6NyxvcGFjaXR5Oi4xNX0se2luZGV4OjYsb3BhY2l0eTouMjV9LHtpbmRleDo1LG9wYWNpdHk6LjN9LHtpbmRleDo1LG9wYWNpdHk6LjQ1fSx7aW5kZXg6NSxvcGFjaXR5Oi42NX0se2luZGV4OjUsb3BhY2l0eTouODV9LHtpbmRleDo0LG9wYWNpdHk6Ljl9LHtpbmRleDozLG9wYWNpdHk6Ljk1fSx7aW5kZXg6MixvcGFjaXR5Oi45N30se2luZGV4OjEsb3BhY2l0eTouOTh9XTtmdW5jdGlvbiB3bih0LGUsbil7dmFyIHI7cmV0dXJuKHI9TWF0aC5yb3VuZCh0LmgpPj02MCYmTWF0aC5yb3VuZCh0LmgpPD0yNDA/bj9NYXRoLnJvdW5kKHQuaCktMiplOk1hdGgucm91bmQodC5oKSsyKmU6bj9NYXRoLnJvdW5kKHQuaCkrMiplOk1hdGgucm91bmQodC5oKS0yKmUpPDA/cis9MzYwOnI+PTM2MCYmKHItPTM2MCkscn1mdW5jdGlvbiBTbih0LGUsbil7cmV0dXJuIDA9PT10LmgmJjA9PT10LnM/dC5zOigocj1uP3Qucy0uMTYqZTo0PT09ZT90LnMrLjE2OnQucysuMDUqZSk+MSYmKHI9MSksbiYmNT09PWUmJnI+LjEmJihyPS4xKSxyPC4wNiYmKHI9LjA2KSxOdW1iZXIoci50b0ZpeGVkKDIpKSk7dmFyIHJ9ZnVuY3Rpb24gRW4odCxlLG4pe3ZhciByO3JldHVybihyPW4/dC52Ky4wNSplOnQudi0uMTUqZSk+MSYmKHI9MSksTnVtYmVyKHIudG9GaXhlZCgyKSl9ZnVuY3Rpb24gX24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxuPVtdLHI9Ym4oKSh0KSxpPTU7aT4wO2ktPTEpe3ZhciBvPXIudG9Ic3YoKSxhPWJuKCkoe2g6d24obyxpLCEwKSxzOlNuKG8saSwhMCksdjpFbihvLGksITApfSkudG9IZXhTdHJpbmcoKTtuLnB1c2goYSl9bi5wdXNoKHIudG9IZXhTdHJpbmcoKSk7Zm9yKHZhciBzPTE7czw9NDtzKz0xKXt2YXIgdT1yLnRvSHN2KCksYz1ibigpKHtoOnduKHUscyksczpTbih1LHMpLHY6RW4odSxzKX0pLnRvSGV4U3RyaW5nKCk7bi5wdXNoKGMpfXJldHVyblwiZGFya1wiPT09ZS50aGVtZT94bi5tYXAoKGZ1bmN0aW9uKHQpe3ZhciByPXQuaW5kZXgsaT10Lm9wYWNpdHk7cmV0dXJuIGJuLmEubWl4KGUuYmFja2dyb3VuZENvbG9yfHxcIiMxNDE0MTRcIixuW3JdLDEwMCppKS50b0hleFN0cmluZygpfSkpOm59dmFyIE9uPXtyZWQ6XCIjRjUyMjJEXCIsdm9sY2FubzpcIiNGQTU0MUNcIixvcmFuZ2U6XCIjRkE4QzE2XCIsZ29sZDpcIiNGQUFEMTRcIix5ZWxsb3c6XCIjRkFEQjE0XCIsbGltZTpcIiNBMEQ5MTFcIixncmVlbjpcIiM1MkM0MUFcIixjeWFuOlwiIzEzQzJDMlwiLGJsdWU6XCIjMTg5MEZGXCIsZ2Vla2JsdWU6XCIjMkY1NEVCXCIscHVycGxlOlwiIzcyMkVEMVwiLG1hZ2VudGE6XCIjRUIyRjk2XCIsZ3JleTpcIiM2NjY2NjZcIn0sa249e30sTW49e307T2JqZWN0LmtleXMoT24pLmZvckVhY2goKGZ1bmN0aW9uKHQpe2tuW3RdPV9uKE9uW3RdKSxrblt0XS5wcmltYXJ5PWtuW3RdWzVdLE1uW3RdPV9uKE9uW3RdLHt0aGVtZTpcImRhcmtcIixiYWNrZ3JvdW5kQ29sb3I6XCIjMTQxNDE0XCJ9KSxNblt0XS5wcmltYXJ5PU1uW3RdWzVdfSkpO2tuLnJlZCxrbi52b2xjYW5vLGtuLmdvbGQsa24ub3JhbmdlLGtuLnllbGxvdyxrbi5saW1lLGtuLmdyZWVuLGtuLmN5YW4sa24uYmx1ZSxrbi5nZWVrYmx1ZSxrbi5wdXJwbGUsa24ubWFnZW50YSxrbi5ncmV5O3ZhciBBbixUbixDbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9eW4oKSh0KSxpPXluKCkoZSk7cmV0dXJuIHluKCkoWygxLW4pKnIucmVkKCkrbippLnJlZCgpLCgxLW4pKnIuZ3JlZW4oKStuKmkuZ3JlZW4oKSwoMS1uKSpyLmJsdWUoKStuKmkuYmx1ZSgpXSkucmdiKCl9LEluPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1cIiNmZmZcIiksdm9pZCAwPT09biYmKG49XCJkZWZhdWx0XCIpLHZvaWQgMD09PXImJihyPVwicmdiKDE1MCwgMTUwLCAxNTApXCIpLFwiZGVmYXVsdFwiPT09bj9mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09ZSYmKGU9XCIjZmZmXCIpLHZvaWQgMD09PW4mJihuPVwicmdiKDE1MCwgMTUwLCAxNTApXCIpO3ZhciByPUNuKGUsdCwuMDUpLnJnYigpLnRvU3RyaW5nKCksaT1DbihlLHQsLjEpLnJnYigpLnRvU3RyaW5nKCksbz1DbihlLHQsLjIpLnJnYigpLnRvU3RyaW5nKCksYT1DbihlLHQsLjQpLnJnYigpLnRvU3RyaW5nKCkscz1DbihlLG4sLjAyKS5yZ2IoKS50b1N0cmluZygpLHU9Q24oZSxuLC4wNSkucmdiKCkudG9TdHJpbmcoKSxjPUNuKGUsbiwuMSkucmdiKCkudG9TdHJpbmcoKSxmPUNuKGUsbiwuMikucmdiKCkudG9TdHJpbmcoKSxsPUNuKGUsbiwuMykucmdiKCkudG9TdHJpbmcoKSxoPV9uKHQse3RoZW1lOlwiZGVmYXVsdFwiLGJhY2tncm91bmRDb2xvcjplfSksZD15bigpKHQpLmhleCgpLnRvTG93ZXJDYXNlKCkscD1oLmluZGV4T2YoZCksZz10O3JldHVybi0xIT09cCYmKGc9aFtwKzFdKSx7bWFpblN0cm9rZTp0LG1haW5GaWxsOmksYWN0aXZlU3Ryb2tlOnQsYWN0aXZlRmlsbDpyLGluYWN0aXZlU3Ryb2tlOmEsaW5hY3RpdmVGaWxsOnIsc2VsZWN0ZWRTdHJva2U6dCxzZWxlY3RlZEZpbGw6ZSxoaWdobGlnaHRTdHJva2U6ZyxoaWdobGlnaHRGaWxsOm8sZGlzYWJsZVN0cm9rZTpsLGRpc2FibGVGaWxsOnUsZWRnZU1haW5TdHJva2U6bCxlZGdlQWN0aXZlU3Ryb2tlOnQsZWRnZUluYWN0aXZlU3Ryb2tlOmYsZWRnZVNlbGVjdGVkU3Ryb2tlOnQsZWRnZUhpZ2hsaWdodFN0cm9rZTp0LGVkZ2VEaXNhYmxlU3Ryb2tlOmMsY29tYm9NYWluU3Ryb2tlOmwsY29tYm9NYWluRmlsbDpzLGNvbWJvQWN0aXZlU3Ryb2tlOnQsY29tYm9BY3RpdmVGaWxsOnIsY29tYm9JbmFjdGl2ZVN0cm9rZTpsLGNvbWJvSW5hY3RpdmVGaWxsOnMsY29tYm9TZWxlY3RlZFN0cm9rZTp0LGNvbWJvU2VsZWN0ZWRGaWxsOnMsY29tYm9IaWdobGlnaHRTdHJva2U6Zyxjb21ib0hpZ2hsaWdodEZpbGw6cyxjb21ib0Rpc2FibGVTdHJva2U6Zixjb21ib0Rpc2FibGVGaWxsOnV9fSh0LGUsXCJyZ2IoMTUwLCAxNTAsIDE1MClcIik6ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PWUmJihlPVwiI2ZmZlwiKSx2b2lkIDA9PT1uJiYobj1cIiM3NzdcIik7dmFyIHI9Q24oZSx0LC4yKS5yZ2IoKS50b1N0cmluZygpLGk9Q24oZSx0LC4zKS5yZ2IoKS50b1N0cmluZygpLG89Q24oZSx0LC42KS5yZ2IoKS50b1N0cmluZygpLGE9Q24oZSx0LC44KS5yZ2IoKS50b1N0cmluZygpLHM9Q24oZSxuLC4yKS5yZ2IoKS50b1N0cmluZygpLHU9Q24oZSxuLC4yNSkucmdiKCkudG9TdHJpbmcoKSxjPUNuKGUsbiwuMykucmdiKCkudG9TdHJpbmcoKSxmPUNuKGUsbiwuNCkucmdiKCkudG9TdHJpbmcoKSxsPUNuKGUsbiwuNSkucmdiKCkudG9TdHJpbmcoKSxoPV9uKHQse3RoZW1lOlwiZGFya1wiLGJhY2tncm91bmRDb2xvcjplfSksZD15bigpKHQpLmhleCgpLnRvTG93ZXJDYXNlKCkscD1oLmluZGV4T2YoZCksZz10O3JldHVybi0xIT09cCYmKGc9aFtwKzFdKSx7bWFpblN0cm9rZTphLG1haW5GaWxsOnIsYWN0aXZlU3Ryb2tlOnQsYWN0aXZlRmlsbDppLGluYWN0aXZlU3Ryb2tlOmEsaW5hY3RpdmVGaWxsOnIsc2VsZWN0ZWRTdHJva2U6dCxzZWxlY3RlZEZpbGw6cixoaWdobGlnaHRTdHJva2U6dCxoaWdobGlnaHRGaWxsOm8sZGlzYWJsZVN0cm9rZTpsLGRpc2FibGVGaWxsOnUsZWRnZU1haW5TdHJva2U6bixlZGdlQWN0aXZlU3Ryb2tlOnQsZWRnZUluYWN0aXZlU3Ryb2tlOm4sZWRnZVNlbGVjdGVkU3Ryb2tlOnQsZWRnZUhpZ2hsaWdodFN0cm9rZTp0LGVkZ2VEaXNhYmxlU3Ryb2tlOmMsY29tYm9NYWluU3Ryb2tlOmYsY29tYm9NYWluRmlsbDp1LGNvbWJvQWN0aXZlU3Ryb2tlOnQsY29tYm9BY3RpdmVGaWxsOnMsY29tYm9JbmFjdGl2ZVN0cm9rZTpmLGNvbWJvSW5hY3RpdmVGaWxsOnUsY29tYm9TZWxlY3RlZFN0cm9rZTp0LGNvbWJvU2VsZWN0ZWRGaWxsOnMsY29tYm9IaWdobGlnaHRTdHJva2U6Zyxjb21ib0hpZ2hsaWdodEZpbGw6dSxjb21ib0Rpc2FibGVTdHJva2U6Zixjb21ib0Rpc2FibGVGaWxsOnN9fSh0LGUsXCIjNzc3XCIpfSxQbj1mdW5jdGlvbih0LGUsbixyKXt2b2lkIDA9PT1lJiYoZT1cIiNmZmZcIiksdm9pZCAwPT09biYmKG49XCJkZWZhdWx0XCIpLHZvaWQgMD09PXImJihyPVwicmdiKDE1MCwgMTUwLCAxNTApXCIpO3ZhciBpPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2kucHVzaChJbih0LGUsbixyKSl9KSksaX0sam49SW4oXCJyZ2IoOTUsIDE0OSwgMjU1KVwiLFwicmdiKDI1NSwgMjU1LCAyNTUpXCIpLERuPXt2ZXJzaW9uOlwiMC4wLjIwXCIscm9vdENvbnRhaW5lckNsYXNzTmFtZTpcInJvb3QtY29udGFpbmVyXCIsbm9kZUNvbnRhaW5lckNsYXNzTmFtZTpcIm5vZGUtY29udGFpbmVyXCIsZWRnZUNvbnRhaW5lckNsYXNzTmFtZTpcImVkZ2UtY29udGFpbmVyXCIsY29tYm9Db250YWluZXJDbGFzc05hbWU6XCJjb21iby1jb250YWluZXJcIixkZWxlZ2F0ZUNvbnRhaW5lckNsYXNzTmFtZTpcImRlbGVnYXRlLWNvbnRhaW5lclwiLGRlZmF1bHRMb29wUG9zaXRpb246XCJ0b3BcIixub2RlTGFiZWw6e3N0eWxlOntmaWxsOlwiIzAwMFwiLGZvbnRTaXplOjEyLHRleHRBbGlnbjpcImNlbnRlclwiLHRleHRCYXNlbGluZTpcIm1pZGRsZVwifSxvZmZzZXQ6NH0sZGVmYXVsdE5vZGU6e3R5cGU6XCJjaXJjbGVcIixzdHlsZTp7bGluZVdpZHRoOjEsc3Ryb2tlOmpuLm1haW5TdHJva2UsZmlsbDpqbi5tYWluRmlsbH0sc2l6ZToyMCxjb2xvcjpqbi5tYWluU3Ryb2tlLGxpbmtQb2ludHM6e3NpemU6OCxsaW5lV2lkdGg6MSxmaWxsOmpuLmFjdGl2ZUZpbGwsc3Ryb2tlOmpuLmFjdGl2ZVN0cm9rZX19LG5vZGVTdGF0ZVN0eWxlczp7YWN0aXZlOntmaWxsOmpuLmFjdGl2ZUZpbGwsc3Ryb2tlOmpuLmFjdGl2ZVN0cm9rZSxsaW5lV2lkdGg6MixzaGFkb3dDb2xvcjpqbi5tYWluU3Ryb2tlLHNoYWRvd0JsdXI6MTB9LHNlbGVjdGVkOntmaWxsOmpuLnNlbGVjdGVkRmlsbCxzdHJva2U6am4uc2VsZWN0ZWRTdHJva2UsbGluZVdpZHRoOjQsc2hhZG93Q29sb3I6am4uc2VsZWN0ZWRTdHJva2Usc2hhZG93Qmx1cjoxMCxcInRleHQtc2hhcGVcIjp7Zm9udFdlaWdodDo1MDB9fSxoaWdobGlnaHQ6e2ZpbGw6am4uaGlnaGxpZ2h0RmlsbCxzdHJva2U6am4uaGlnaGxpZ2h0U3Ryb2tlLGxpbmVXaWR0aDoyLFwidGV4dC1zaGFwZVwiOntmb250V2VpZ2h0OjUwMH19LGluYWN0aXZlOntmaWxsOmpuLmluYWN0aXZlRmlsbCxzdHJva2U6am4uaW5hY3RpdmVTdHJva2UsbGluZVdpZHRoOjF9LGRpc2FibGU6e2ZpbGw6am4uZGlzYWJsZUZpbGwsc3Ryb2tlOmpuLmRpc2FibGVTdHJva2UsbGluZVdpZHRoOjF9fSxlZGdlTGFiZWw6e3N0eWxlOntmaWxsOlwicmdiKDAsIDAsIDApXCIsdGV4dEFsaWduOlwiY2VudGVyXCIsdGV4dEJhc2VsaW5lOlwibWlkZGxlXCIsZm9udFNpemU6MTJ9fSxkZWZhdWx0RWRnZTp7dHlwZTpcImxpbmVcIixzaXplOjEsc3R5bGU6e3N0cm9rZTpqbi5lZGdlTWFpblN0cm9rZSxsaW5lQXBwZW5kV2lkdGg6Mn0sY29sb3I6am4uZWRnZU1haW5TdHJva2V9LGVkZ2VTdGF0ZVN0eWxlczp7YWN0aXZlOntzdHJva2U6am4uZWRnZUFjdGl2ZVN0cm9rZSxsaW5lV2lkdGg6MX0sc2VsZWN0ZWQ6e3N0cm9rZTpqbi5lZGdlU2VsZWN0ZWRTdHJva2UsbGluZVdpZHRoOjIsc2hhZG93Q29sb3I6am4uZWRnZVNlbGVjdGVkU3Ryb2tlLHNoYWRvd0JsdXI6MTAsXCJ0ZXh0LXNoYXBlXCI6e2ZvbnRXZWlnaHQ6NTAwfX0saGlnaGxpZ2h0OntzdHJva2U6am4uZWRnZUhpZ2hsaWdodFN0cm9rZSxsaW5lV2lkdGg6MixcInRleHQtc2hhcGVcIjp7Zm9udFdlaWdodDo1MDB9fSxpbmFjdGl2ZTp7c3Ryb2tlOmpuLmVkZ2VJbmFjdGl2ZVN0cm9rZSxsaW5lV2lkdGg6MX0sZGlzYWJsZTp7c3Ryb2tlOmpuLmVkZ2VEaXNhYmxlU3Ryb2tlLGxpbmVXaWR0aDoxfX0sY29tYm9MYWJlbDp7c3R5bGU6e2ZpbGw6XCJyZ2IoMCwgMCwgMClcIix0ZXh0QmFzZWxpbmU6XCJtaWRkbGVcIixmb250U2l6ZToxMn0scmVmWToxMCxyZWZYOjEwfSxkZWZhdWx0Q29tYm86e3R5cGU6XCJjaXJjbGVcIixzdHlsZTp7ZmlsbDpqbi5jb21ib01haW5GaWxsLGxpbmVXaWR0aDoxLHN0cm9rZTpqbi5jb21ib01haW5TdHJva2Uscjo1LHdpZHRoOjIwLGhlaWdodDoxMH0sc2l6ZTpbMjAsNV0sY29sb3I6am4uY29tYm9NYWluU3Ryb2tlLHBhZGRpbmc6WzI1LDIwLDE1LDIwXX0sY29tYm9TdGF0ZVN0eWxlczp7YWN0aXZlOntzdHJva2U6am4uY29tYm9BY3RpdmVTdHJva2UsbGluZVdpZHRoOjEsZmlsbDpqbi5jb21ib0FjdGl2ZUZpbGx9LHNlbGVjdGVkOntzdHJva2U6am4uY29tYm9TZWxlY3RlZFN0cm9rZSxsaW5lV2lkdGg6MixmaWxsOmpuLmNvbWJvU2VsZWN0ZWRGaWxsLHNoYWRvd0NvbG9yOmpuLmNvbWJvU2VsZWN0ZWRTdHJva2Usc2hhZG93Qmx1cjoxMCxcInRleHQtc2hhcGVcIjp7Zm9udFdlaWdodDo1MDB9fSxoaWdobGlnaHQ6e3N0cm9rZTpqbi5jb21ib0hpZ2hsaWdodFN0cm9rZSxsaW5lV2lkdGg6MixmaWxsOmpuLmNvbWJvSGlnaGxpZ2h0RmlsbCxcInRleHQtc2hhcGVcIjp7Zm9udFdlaWdodDo1MDB9fSxpbmFjdGl2ZTp7c3Ryb2tlOmpuLmNvbWJvSW5hY3RpdmVTdHJva2UsZmlsbDpqbi5jb21ib0luYWN0aXZlRmlsbCxsaW5lV2lkdGg6MX0sZGlzYWJsZTp7c3Ryb2tlOmpuLmNvbWJvRGlzYWJsZVN0cm9rZSxmaWxsOmpuLmNvbWJvRGlzYWJsZUZpbGwsbGluZVdpZHRoOjF9fSxkZWxlZ2F0ZVN0eWxlOntmaWxsOlwiI0YzRjlGRlwiLGZpbGxPcGFjaXR5Oi41LHN0cm9rZTpcIiMxODkwRkZcIixzdHJva2VPcGFjaXR5Oi45LGxpbmVEYXNoOls1LDVdfSx0ZXh0V2F0ZXJNYXJrZXJDb25maWc6e3dpZHRoOjE1MCxoZWlnaHQ6MTAwLGNvbXBhdGlibGU6ITEsdGV4dDp7eDowLHk6NjAsbGluZUhlaWdodDoyMCxyb3RhdGU6MjAsZm9udFNpemU6MTQsZm9udEZhbWlseTpcIk1pY3Jvc29mdCBZYUhlaVwiLGZpbGw6XCJyZ2JhKDAsIDAsIDAsIDAuMSlcIixiYXNlbGluZTpcIk1pZGRsZVwifX0saW1hZ2VXYXRlck1hcmtlckNvbmZpZzp7d2lkdGg6MTUwLGhlaWdodDoxMzAsY29tcGF0aWJsZTohMSxpbWFnZTp7eDowLHk6MCx3aWR0aDozMCxoZWlnaHQ6MjAscm90YXRlOjB9fSx3YXRlck1hcmtlckltYWdlOlwiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS9vcy9zL3Byb2QvYW50di9hc3NldHMvaW1hZ2UvbG9nby13aXRoLXRleHQtNzNiOGEuc3ZnXCJ9LE5uPVFlLmNsb25lRXZlbnQsUm49UWUuaXNWaWV3cG9ydENoYW5nZWQsTG49ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gbi5leHRlbmRFdmVudHM9W10sbi5kcmFnZ2luZz0hMSxuLnByZUl0ZW09bnVsbCxuLmdyYXBoPWUsbi5kZXN0cm95ZWQ9ITEsbi5pbml0RXZlbnRzKCksbn1yZXR1cm4gT2JqZWN0KHYuYikoZSx0KSxlLnByb3RvdHlwZS5pbml0RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ncmFwaCxlPXRoaXMuZXh0ZW5kRXZlbnRzLG49dm9pZCAwPT09ZT9bXTplLHI9dC5nZXQoXCJjYW52YXNcIiksaT1yLmdldChcImVsXCIpLG89T2JqZWN0KGguSikodGhpcyxcIm9uQ2FudmFzRXZlbnRzXCIpLGE9T2JqZWN0KGguSikodGhpcyxcIm9uRXh0ZW5kRXZlbnRzXCIpLHM9T2JqZWN0KGguSikodGhpcyxcIm9uV2hlZWxFdmVudFwiKTtyLm9mZihcIipcIikub24oXCIqXCIsbyksdGhpcy5jYW52YXNIYW5kbGVyPW8sbi5wdXNoKHB0KGksXCJET01Nb3VzZVNjcm9sbFwiLHMpKSxuLnB1c2gocHQoaSxcIm1vdXNld2hlZWxcIixzKSksXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmKG4ucHVzaChwdCh3aW5kb3csXCJrZXlkb3duXCIsYSkpLG4ucHVzaChwdCh3aW5kb3csXCJrZXl1cFwiLGEpKSxuLnB1c2gocHQod2luZG93LFwiZm9jdXNcIixhKSkpfSxlLmdldEl0ZW1Sb290PWZ1bmN0aW9uKHQpe2Zvcig7dCYmIXQuZ2V0KFwiaXRlbVwiKTspdD10LmdldChcInBhcmVudFwiKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUub25DYW52YXNFdmVudHM9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5ncmFwaCxyPW4uZ2V0KFwiY2FudmFzXCIpLGk9dC50YXJnZXQsbz10LnR5cGU7dC5jYW52YXNYPXQueCx0LmNhbnZhc1k9dC55O3ZhciBhPXt4OnQuY2FudmFzWCx5OnQuY2FudmFzWX0scz1uLmdldChcImdyb3VwXCIpLmdldE1hdHJpeCgpO2lmKHN8fChzPVsxLDAsMCwwLDEsMCwwLDAsMV0pLFJuKHMpJiYoYT1uLmdldFBvaW50QnlDbGllbnQodC5jbGllbnRYLHQuY2xpZW50WSkpLHQueD1hLngsdC55PWEueSx0LmN1cnJlbnRUYXJnZXQ9bixpPT09cilyZXR1cm5cIm1vdXNlbW92ZVwiPT09byYmdGhpcy5oYW5kbGVNb3VzZU1vdmUodCxcImNhbnZhc1wiKSx0LnRhcmdldD1yLHQuaXRlbT1udWxsLG4uZW1pdChvLHQpLHZvaWQgbi5lbWl0KFwiY2FudmFzOlwiK28sdCk7dmFyIHU9ZS5nZXRJdGVtUm9vdChpKTtpZih1KXt2YXIgYz11LmdldChcIml0ZW1cIik7aWYoIWMuZGVzdHJveWVkKXt2YXIgZj1jLmdldFR5cGUoKTtpZih0LnRhcmdldD1pLHQuaXRlbT1jLHQuY2FudmFzWD09PXQueCYmdC5jYW52YXNZPT09dC55KXt2YXIgbD1uLmdldENhbnZhc0J5UG9pbnQodC54LHQueSk7dC5jYW52YXNYPWwueCx0LmNhbnZhc1k9bC55fW4uZW1pdChvLHQpLHQubmFtZSYmIXQubmFtZS5pbmNsdWRlcyhcIjpcIik/bi5lbWl0KGYrXCI6XCIrbyx0KTpuLmVtaXQodC5uYW1lLHQpLFwiZHJhZ3N0YXJ0XCI9PT1vJiYodGhpcy5kcmFnZ2luZz0hMCksXCJkcmFnZW5kXCI9PT1vJiYodGhpcy5kcmFnZ2luZz0hMSksXCJtb3VzZW1vdmVcIj09PW8mJnRoaXMuaGFuZGxlTW91c2VNb3ZlKHQsZil9fWVsc2Ugbi5lbWl0KG8sdCl9LGUucHJvdG90eXBlLm9uRXh0ZW5kRXZlbnRzPWZ1bmN0aW9uKHQpe3RoaXMuZ3JhcGguZW1pdCh0LnR5cGUsdCl9LGUucHJvdG90eXBlLm9uV2hlZWxFdmVudD1mdW5jdGlvbih0KXtPYmplY3QoaC5zKSh0LndoZWVsRGVsdGEpJiYodC53aGVlbERlbHRhPS10LmRldGFpbCksdGhpcy5ncmFwaC5lbWl0KFwid2hlZWxcIix0KX0sZS5wcm90b3R5cGUuaGFuZGxlTW91c2VNb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5ncmFwaCxyPXRoaXMucHJlSXRlbSxpPW4uZ2V0KFwiY2FudmFzXCIpLG89dC50YXJnZXQ9PT1pP251bGw6dC5pdGVtO3Q9Tm4odCksciYmciE9PW8mJiFyLmRlc3Ryb3llZCYmKHQuaXRlbT1yLHRoaXMuZW1pdEN1c3RvbUV2ZW50KHIuZ2V0VHlwZSgpLFwibW91c2VsZWF2ZVwiLHQpLHRoaXMuZHJhZ2dpbmcmJnRoaXMuZW1pdEN1c3RvbUV2ZW50KHIuZ2V0VHlwZSgpLFwiZHJhZ2xlYXZlXCIsdCkpLG8mJnIhPT1vJiYodC5pdGVtPW8sdGhpcy5lbWl0Q3VzdG9tRXZlbnQoZSxcIm1vdXNlZW50ZXJcIix0KSx0aGlzLmRyYWdnaW5nJiZ0aGlzLmVtaXRDdXN0b21FdmVudChlLFwiZHJhZ2VudGVyXCIsdCkpLHRoaXMucHJlSXRlbT1vfSxlLnByb3RvdHlwZS5lbWl0Q3VzdG9tRXZlbnQ9ZnVuY3Rpb24odCxlLG4pe24udHlwZT1lLHRoaXMuZ3JhcGguZW1pdCh0K1wiOlwiK2Usbil9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdyYXBoLGU9dGhpcy5jYW52YXNIYW5kbGVyLG49dGhpcy5leHRlbmRFdmVudHM7dC5nZXQoXCJjYW52YXNcIikub2ZmKFwiKlwiLGUpLE9iamVjdChoLmYpKG4sKGZ1bmN0aW9uKHQpe3QucmVtb3ZlKCl9KSksdGhpcy5kcmFnZ2luZz0hMSx0aGlzLnByZUl0ZW09bnVsbCx0aGlzLmV4dGVuZEV2ZW50cy5sZW5ndGg9MCx0aGlzLmNhbnZhc0hhbmRsZXI9bnVsbCx0aGlzLmRlc3Ryb3llZD0hMH0sZX0oJGUpLEJuPWZ1bmN0aW9uKHQpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0fSxHbj0vLShcXHcpL2csRm49KEFuPWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoR24sKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU/ZS50b1VwcGVyQ2FzZSgpOlwiXCJ9KSl9LFRuPU9iamVjdC5jcmVhdGUobnVsbCksQXJyYXkuaXNBcnJheSksVW49ZnVuY3Rpb24odCl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIHR9LHpuPWZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIuaXNOYU4oTnVtYmVyKHQpKX0sVm49ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1bXSxpPTA7aTx0O2krKylyW2ldPTA7cmV0dXJuIG4/KG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zb3VyY2UmJihyW2VbdC5zb3VyY2VdXSs9MSksdC50YXJnZXQmJihyW2VbdC50YXJnZXRdXSs9MSl9KSkscik6cn0sV249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49dC5sZW5ndGgscj0wO3I8bjtyKz0xKXtlW3JdPVtdO2Zvcih2YXIgaT0wO2k8bjtpKz0xKXI9PT1pP2Vbcl1baV09MDowIT09dFtyXVtpXSYmdFtyXVtpXT9lW3JdW2ldPXRbcl1baV06ZVtyXVtpXT0xLzB9Zm9yKHZhciBvPTA7bzxuO28rPTEpZm9yKHZhciBhPTA7YTxuO2ErPTEpZm9yKHZhciBzPTA7czxuO3MrPTEpZVthXVtzXT5lW2FdW29dK2Vbb11bc10mJihlW2FdW3NdPWVbYV1bb10rZVtvXVtzXSk7cmV0dXJuIGV9LFhuPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5ub2RlcyxyPXQuZWRnZXMsaT1bXSxvPXt9O2lmKCFuKXRocm93IG5ldyBFcnJvcihcImludmFsaWQgbm9kZXMgZGF0YSFcIik7cmV0dXJuIG4mJm4uZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtvW3QuaWRdPWU7aS5wdXNoKFtdKX0pKSxyJiZyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQuc291cmNlLHI9dC50YXJnZXQsYT1vW25dLHM9b1tyXTtpW2FdW3NdPTEsZXx8KGlbc11bYV09MSl9KSksaX0sWW49ZnVuY3Rpb24odCxlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZmdW5jdGlvbiB0KGUsbil7aWYoZSYmZS5jaGlsZHJlbilmb3IodmFyIHI9ZS5jaGlsZHJlbi5sZW5ndGgtMTtyPj0wO3ItLSlpZighdChlLmNoaWxkcmVuW3JdLG4pKXJldHVybjtyZXR1cm4hIW4oZSl9KHQsZSl9O2Z1bmN0aW9uIEhuKHQpe3JldHVybihIbj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9dmFyIHFuPWZ1bmN0aW9uIHQoZSl7aWYobnVsbD09PWUpcmV0dXJuIGU7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIG5ldyBEYXRlKGUuZ2V0VGltZSgpKTtpZihlIGluc3RhbmNlb2YgQXJyYXkpe3ZhciBuPVtdO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe24ucHVzaCh0KX0pKSxuLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9KSl9aWYoXCJvYmplY3RcIj09PUhuKGUpJiZlIT09e30pe3ZhciByPU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIE9iamVjdC5rZXlzKHIpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JbZV09dChyW2VdKX0pKSxyfXJldHVybiBlfSxLbj1mdW5jdGlvbih0KXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0fTtmdW5jdGlvbiBabih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19dmFyIFFuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsdCksdGhpcy5ub2Rlcz1bXSx0aGlzLmVkZ2VzPVtdLHRoaXMuY29tYm9zPVtdLHRoaXMucG9zaXRpb25zPVtdLHRoaXMuZGVzdHJveWVkPSExLHRoaXMub25MYXlvdXRFbmQ9ZnVuY3Rpb24oKXt9fXZhciBlLG4scjtyZXR1cm4gZT10LChuPVt7a2V5OlwibGF5b3V0XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5pdCh0KSx0aGlzLmV4ZWN1dGUoITApfX0se2tleTpcImluaXRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm5vZGVzPXQubm9kZXN8fFtdLHRoaXMuZWRnZXM9dC5lZGdlc3x8W10sdGhpcy5jb21ib3M9dC5jb21ib3N8fFtdfX0se2tleTpcImV4ZWN1dGVcIix2YWx1ZTpmdW5jdGlvbih0KXt9fSx7a2V5OlwiZXhlY3V0ZVdpdGhXb3JrZXJcIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6XCJnZXREZWZhdWx0Q2ZnXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LHtrZXk6XCJ1cGRhdGVDZmdcIix2YWx1ZTpmdW5jdGlvbih0KXt0JiZPYmplY3QuYXNzaWduKHRoaXMsdCl9fSx7a2V5OlwiZ2V0VHlwZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuXCJiYXNlXCJ9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ub2Rlcz1udWxsLHRoaXMuZWRnZXM9bnVsbCx0aGlzLmNvbWJvcz1udWxsLHRoaXMucG9zaXRpb25zPW51bGwsdGhpcy5kZXN0cm95ZWQ9ITB9fV0pJiZabihlLnByb3RvdHlwZSxuKSxyJiZabihlLHIpLHR9KCk7ZnVuY3Rpb24gSm4odCl7cmV0dXJuKEpuPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiAkbih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4odHI9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIGVyKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9cnIodCk7aWYoZSl7dmFyIGk9cnIodGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG5yKHRoaXMsbil9fWZ1bmN0aW9uIG5yKHQsZSl7cmV0dXJuIWV8fFwib2JqZWN0XCIhPT1KbihlKSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZT9mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4gdH0odCk6ZX1mdW5jdGlvbiBycih0KXtyZXR1cm4ocnI9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfXZhciBpcj1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJnRyKHQsZSl9KG8sdCk7dmFyIGUsbixyLGk9ZXIobyk7ZnVuY3Rpb24gbyh0KXt2YXIgZTtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLG8pLChlPWkuY2FsbCh0aGlzKSkuYmVnaW49WzAsMF0sZS5wcmV2ZW50T3ZlcmxhcD0hMCxlLnByZXZlbnRPdmVybGFwUGFkZGluZz0xMCxlLmNvbmRlbnNlPSExLGUuc29ydEJ5PVwiZGVncmVlXCIsZS5ub2RlU2l6ZT0zMCxlLm5vZGVzPVtdLGUuZWRnZXM9W10sZS53aWR0aD0zMDAsZS5oZWlnaHQ9MzAwLGUucm93PTAsZS5jb2w9MCxlLmNlbGxXaWR0aD0wLGUuY2VsbEhlaWdodD0wLGUuY2VsbFVzZWQ9e30sZS5pZDJtYW5Qb3M9e30sZS5vbkxheW91dEVuZD1mdW5jdGlvbigpe30sZS51cGRhdGVDZmcodCksZX1yZXR1cm4gZT1vLChuPVt7a2V5OlwiZ2V0RGVmYXVsdENmZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2JlZ2luOlswLDBdLHByZXZlbnRPdmVybGFwOiEwLHByZXZlbnRPdmVybGFwUGFkZGluZzoxMCxjb25kZW5zZTohMSxyb3dzOnZvaWQgMCxjb2xzOnZvaWQgMCxwb3NpdGlvbjp2b2lkIDAsc29ydEJ5OlwiZGVncmVlXCIsbm9kZVNpemU6MzB9fX0se2tleTpcImV4ZWN1dGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10Lm5vZGVzLG49ZS5sZW5ndGgscj10LmJlZ2luO2lmKDAhPT1uKXtpZigxPT09bilyZXR1cm4gZVswXS54PXJbMF0sZVswXS55PXJbMV0sdm9pZCh0Lm9uTGF5b3V0RW5kJiZ0Lm9uTGF5b3V0RW5kKCkpO3ZhciBpPXQuZWRnZXMsbz1bXTtlLmZvckVhY2goKGZ1bmN0aW9uKHQpe28ucHVzaCh0KX0pKTt2YXIgYT17fTtpZihvLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7YVt0LmlkXT1lfSkpLChcImRlZ3JlZVwiPT09dC5zb3J0Qnl8fCFCbih0LnNvcnRCeSl8fHZvaWQgMD09PW9bMF1bdC5zb3J0QnldKSYmKHQuc29ydEJ5PVwiZGVncmVlXCIsem4oZVswXS5kZWdyZWUpKSl7dmFyIHM9Vm4oby5sZW5ndGgsYSxpKTtvLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dC5kZWdyZWU9c1tlXX0pKX1vLnNvcnQoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG5bdC5zb3J0QnldLWVbdC5zb3J0QnldfSkpLHQud2lkdGh8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fCh0LndpZHRoPXdpbmRvdy5pbm5lcldpZHRoKSx0LmhlaWdodHx8XCJ1bmRlZmluZWRcIj09dHlwZW9mIHdpbmRvd3x8KHQuaGVpZ2h0PXdpbmRvdy5pbm5lckhlaWdodCk7dmFyIHU9dC5yb3dzLGM9bnVsbCE9dC5jb2xzP3QuY29sczp0LmNvbHVtbnM7aWYodC5jZWxscz1uLG51bGwhPXUmJm51bGwhPWM/KHQucm93cz11LHQuY29scz1jKTpudWxsIT11JiZudWxsPT1jPyh0LnJvd3M9dSx0LmNvbHM9TWF0aC5jZWlsKHQuY2VsbHMvdC5yb3dzKSk6bnVsbD09dSYmbnVsbCE9Yz8odC5jb2xzPWMsdC5yb3dzPU1hdGguY2VpbCh0LmNlbGxzL3QuY29scykpOih0LnNwbGl0cz1NYXRoLnNxcnQodC5jZWxscyp0LmhlaWdodC90LndpZHRoKSx0LnJvd3M9TWF0aC5yb3VuZCh0LnNwbGl0cyksdC5jb2xzPU1hdGgucm91bmQodC53aWR0aC90LmhlaWdodCp0LnNwbGl0cykpLHQuY29scyp0LnJvd3M+dC5jZWxscyl7dmFyIGY9dC5zbWFsbCgpLGw9dC5sYXJnZSgpOyhmLTEpKmw+PXQuY2VsbHM/dC5zbWFsbChmLTEpOihsLTEpKmY+PXQuY2VsbHMmJnQubGFyZ2UobC0xKX1lbHNlIGZvcig7dC5jb2xzKnQucm93czx0LmNlbGxzOyl7dmFyIGg9dC5zbWFsbCgpLGQ9dC5sYXJnZSgpOyhkKzEpKmg+PXQuY2VsbHM/dC5sYXJnZShkKzEpOnQuc21hbGwoaCsxKX10LmNlbGxXaWR0aD10LndpZHRoL3QuY29scyx0LmNlbGxIZWlnaHQ9dC5oZWlnaHQvdC5yb3dzLHQuY29uZGVuc2UmJih0LmNlbGxXaWR0aD0wLHQuY2VsbEhlaWdodD0wKSx0LnByZXZlbnRPdmVybGFwJiZvLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuLHI7ZS54JiZlLnl8fChlLng9MCxlLnk9MCksRm4oZS5zaXplKT8obj1lLnNpemVbMF0scj1lLnNpemVbMV0pOlVuKGUuc2l6ZSkmJihuPWUuc2l6ZSxyPWUuc2l6ZSksdm9pZCAwIT09biYmdm9pZCAwIT09cnx8KEZuKHQubm9kZVNpemUpPyhuPXQubm9kZVNpemVbMF0scj10Lm5vZGVTaXplWzFdKTpVbih0Lm5vZGVTaXplKT8obj10Lm5vZGVTaXplLHI9dC5ub2RlU2l6ZSk6KG49MzAscj0zMCkpO3ZhciBpPXQucHJldmVudE92ZXJsYXBQYWRkaW5nLG89bitpLGE9citpO3QuY2VsbFdpZHRoPU1hdGgubWF4KHQuY2VsbFdpZHRoLG8pLHQuY2VsbEhlaWdodD1NYXRoLm1heCh0LmNlbGxIZWlnaHQsYSl9KSksdC5jZWxsVXNlZD17fSx0LnJvdz0wLHQuY29sPTAsdC5pZDJtYW5Qb3M9e307Zm9yKHZhciBwPTA7cDxvLmxlbmd0aDtwKyspe3ZhciBnPW9bcF0sdj12b2lkIDA7aWYodC5wb3NpdGlvbiYmKHY9dC5wb3NpdGlvbihnKSksdiYmKHZvaWQgMCE9PXYucm93fHx2b2lkIDAhPT12LmNvbCkpe3ZhciB5PXtyb3c6di5yb3csY29sOnYuY29sfTtpZih2b2lkIDA9PT15LmNvbClmb3IoeS5jb2w9MDt0LnVzZWQoeS5yb3cseS5jb2wpOyl5LmNvbCsrO2Vsc2UgaWYodm9pZCAwPT09eS5yb3cpZm9yKHkucm93PTA7dC51c2VkKHkucm93LHkuY29sKTspeS5yb3crKzt0LmlkMm1hblBvc1tnLmlkXT15LHQudXNlKHkucm93LHkuY29sKX10LmdldFBvcyhnKX1yZXR1cm4gdC5vbkxheW91dEVuZCYmdC5vbkxheW91dEVuZCgpLHtlZGdlczppLG5vZGVzOm99fXQub25MYXlvdXRFbmQmJnQub25MYXlvdXRFbmQoKX19LHtrZXk6XCJzbWFsbFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5yb3dzfHw1LHI9dGhpcy5jb2xzfHw1O3JldHVybiBudWxsPT10P2U9TWF0aC5taW4obixyKTpNYXRoLm1pbihuLHIpPT09dGhpcy5yb3dzP3RoaXMucm93cz10OnRoaXMuY29scz10LGV9fSx7a2V5OlwibGFyZ2VcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMucm93c3x8NSxyPXRoaXMuY29sc3x8NTtyZXR1cm4gbnVsbD09dD9lPU1hdGgubWF4KG4scik6TWF0aC5tYXgobixyKT09PXRoaXMucm93cz90aGlzLnJvd3M9dDp0aGlzLmNvbHM9dCxlfX0se2tleTpcInVzZWRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNlbGxVc2VkW1wiYy1cIi5jb25jYXQodCxcIi1cIikuY29uY2F0KGUpXXx8ITF9fSx7a2V5OlwidXNlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLmNlbGxVc2VkW1wiYy1cIi5jb25jYXQodCxcIi1cIikuY29uY2F0KGUpXT0hMH19LHtrZXk6XCJtb3ZlVG9OZXh0Q2VsbFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb2xzfHw1O3RoaXMuY29sKyssdGhpcy5jb2w+PXQmJih0aGlzLmNvbD0wLHRoaXMucm93KyspfX0se2tleTpcImdldFBvc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG4scj10aGlzLmJlZ2luLGk9dGhpcy5jZWxsV2lkdGgsbz10aGlzLmNlbGxIZWlnaHQsYT10aGlzLmlkMm1hblBvc1t0LmlkXTtpZihhKWU9YS5jb2wqaStpLzIrclswXSxuPWEucm93Km8rby8yK3JbMV07ZWxzZXtmb3IoO3RoaXMudXNlZCh0aGlzLnJvdyx0aGlzLmNvbCk7KXRoaXMubW92ZVRvTmV4dENlbGwoKTtlPXRoaXMuY29sKmkraS8yK3JbMF0sbj10aGlzLnJvdypvK28vMityWzFdLHRoaXMudXNlKHRoaXMucm93LHRoaXMuY29sKSx0aGlzLm1vdmVUb05leHRDZWxsKCl9dC54PWUsdC55PW59fSx7a2V5OlwiZ2V0VHlwZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuXCJncmlkXCJ9fV0pJiYkbihlLnByb3RvdHlwZSxuKSxyJiYkbihlLHIpLG99KFFuKTtmdW5jdGlvbiBvcih0KXtyZXR1cm4ob3I9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIGFyKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBzcih0LGUpe3JldHVybihzcj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gdXIodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1mcih0KTtpZihlKXt2YXIgaT1mcih0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gY3IodGhpcyxuKX19ZnVuY3Rpb24gY3IodCxlKXtyZXR1cm4hZXx8XCJvYmplY3RcIiE9PW9yKGUpJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP2Z1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiB0fSh0KTplfWZ1bmN0aW9uIGZyKHQpe3JldHVybihmcj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9dmFyIGxyPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmc3IodCxlKX0obyx0KTt2YXIgZSxuLHIsaT11cihvKTtmdW5jdGlvbiBvKHQpe3ZhciBlO3JldHVybiBmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsbyksKGU9aS5jYWxsKHRoaXMpKS5jZW50ZXI9WzAsMF0sZS53aWR0aD0zMDAsZS5oZWlnaHQ9MzAwLGUubm9kZXM9W10sZS5lZGdlcz1bXSxlLm9uTGF5b3V0RW5kPWZ1bmN0aW9uKCl7fSxlLnVwZGF0ZUNmZyh0KSxlfXJldHVybiBlPW8sKG49W3trZXk6XCJnZXREZWZhdWx0Q2ZnXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57Y2VudGVyOlswLDBdLHdpZHRoOjMwMCxoZWlnaHQ6MzAwfX19LHtrZXk6XCJleGVjdXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5ub2RlcyxuPXQuY2VudGVyO3JldHVybiB0LndpZHRofHxcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwodC53aWR0aD13aW5kb3cuaW5uZXJXaWR0aCksdC5oZWlnaHR8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fCh0LmhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHQpLGUmJmUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS54PS45KihNYXRoLnJhbmRvbSgpLS41KSp0LndpZHRoK25bMF0sZS55PS45KihNYXRoLnJhbmRvbSgpLS41KSp0LmhlaWdodCtuWzFdfSkpLHQub25MYXlvdXRFbmQmJnQub25MYXlvdXRFbmQoKSx7bm9kZXM6ZSxlZGdlczp0aGlzLmVkZ2VzfX19LHtrZXk6XCJnZXRUeXBlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cInJhbmRvbVwifX1dKSYmYXIoZS5wcm90b3R5cGUsbiksciYmYXIoZSxyKSxvfShRbik7ZnVuY3Rpb24gaHIodCl7cmV0dXJuKGhyPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBkcih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gcHIodCxlKXtyZXR1cm4ocHI9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIGdyKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9eXIodCk7aWYoZSl7dmFyIGk9eXIodGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHZyKHRoaXMsbil9fWZ1bmN0aW9uIHZyKHQsZSl7cmV0dXJuIWV8fFwib2JqZWN0XCIhPT1ocihlKSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZT9mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4gdH0odCk6ZX1mdW5jdGlvbiB5cih0KXtyZXR1cm4oeXI9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfXZhciBtcj1mdW5jdGlvbih0LGUpe3JldHVybiB0P1VuKHQpP2Z1bmN0aW9uKGUpe3JldHVybiB0fTp0OmZ1bmN0aW9uKHQpe3JldHVybiBlfHwxfX0sYnI9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZwcih0LGUpfShvLHQpO3ZhciBlLG4scixpPWdyKG8pO2Z1bmN0aW9uIG8odCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyxvKSwoZT1pLmNhbGwodGhpcykpLm1heEl0ZXJhdGlvbj0xZTMsZS5lZGdlU3RyZW5ndGg9MjAwLGUubm9kZVN0cmVuZ3RoPTFlMyxlLmNvdWxvbWJEaXNTY2FsZT0uMDA1LGUuZGFtcGluZz0uOSxlLm1heFNwZWVkPTFlMyxlLm1pbk1vdmVtZW50PS41LGUuaW50ZXJ2YWw9LjAyLGUuZmFjdG9yPTEsZS5saW5rRGlzdGFuY2U9MSxlLmdyYXZpdHk9MTAsZS5wcmV2ZW50T3ZlcmxhcD0hMCxlLnRpY2s9ZnVuY3Rpb24oKXt9LGUubm9kZXM9W10sZS5lZGdlcz1bXSxlLndpZHRoPTMwMCxlLmhlaWdodD0zMDAsZS5ub2RlTWFwPXt9LGUubm9kZUlkeE1hcD17fSxlLnVwZGF0ZUNmZyh0KSxlfXJldHVybiBlPW8sKG49W3trZXk6XCJnZXREZWZhdWx0Q2ZnXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57bWF4SXRlcmF0aW9uOjUwMCxncmF2aXR5OjEwLGVuYWJsZVRpY2s6ITB9fX0se2tleTpcImV4ZWN1dGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10Lm5vZGVzO2lmKHZvaWQgMCE9PXQudGltZUludGVydmFsJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0LnRpbWVJbnRlcnZhbCksZSYmMCE9PWUubGVuZ3RoKXt0LndpZHRofHxcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwodC53aWR0aD13aW5kb3cuaW5uZXJXaWR0aCksdC5oZWlnaHR8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fCh0LmhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHQpLHQuY2VudGVyfHwodC5jZW50ZXI9W3Qud2lkdGgvMix0LmhlaWdodC8yXSk7dmFyIG49dC5jZW50ZXI7aWYoMT09PWUubGVuZ3RoKXJldHVybiBlWzBdLng9blswXSxlWzBdLnk9blsxXSx2b2lkKHQub25MYXlvdXRFbmQmJnQub25MYXlvdXRFbmQoKSk7dmFyIHI9e30saT17fTtlLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7VW4oZS54KXx8KGUueD1NYXRoLnJhbmRvbSgpKnQud2lkdGgpLFVuKGUueSl8fChlLnk9TWF0aC5yYW5kb20oKSp0LmhlaWdodCkscltlLmlkXT1lLGlbZS5pZF09bn0pKSx0Lm5vZGVNYXA9cix0Lm5vZGVJZHhNYXA9aSx0LmxpbmtEaXN0YW5jZT1tcih0LmxpbmtEaXN0YW5jZSwxKSx0Lm5vZGVTdHJlbmd0aD1tcih0Lm5vZGVTdHJlbmd0aCwxKSx0LmVkZ2VTdHJlbmd0aD1tcih0LmVkZ2VTdHJlbmd0aCwxKTt2YXIgbyxhPXQubm9kZVNpemU7aWYodC5wcmV2ZW50T3ZlcmxhcCl7dmFyIHMsdT10Lm5vZGVTcGFjaW5nO3M9VW4odSk/ZnVuY3Rpb24oKXtyZXR1cm4gdX06S24odSk/dTpmdW5jdGlvbigpe3JldHVybiAwfSxvPWE/Rm4oYSk/ZnVuY3Rpb24odCl7cmV0dXJuKGFbMF0+YVsxXT9hWzBdOmFbMV0pK3ModCl9OmZ1bmN0aW9uKHQpe3JldHVybiBhK3ModCl9OmZ1bmN0aW9uKHQpe3JldHVybiB0LnNpemU/Rm4odC5zaXplKT8odC5zaXplWzBdPnQuc2l6ZVsxXT90LnNpemVbMF06dC5zaXplWzFdKStzKHQpOnQuc2l6ZStzKHQpOjEwK3ModCl9fXQubm9kZVNpemU9bzt2YXIgYz10LmVkZ2VzO3QuZGVncmVlcz1WbihlLmxlbmd0aCx0Lm5vZGVJZHhNYXAsYyksdC5nZXRNYXNzfHwodC5nZXRNYXNzPWZ1bmN0aW9uKGUpe3JldHVybiB0LmRlZ3JlZXNbdC5ub2RlSWR4TWFwW2UuaWRdXX0pLHQucnVuKCl9ZWxzZSB0Lm9uTGF5b3V0RW5kJiZ0Lm9uTGF5b3V0RW5kKCl9fSx7a2V5OlwicnVuXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5ub2RlcyxuPXQuZWRnZXMscj10Lm1heEl0ZXJhdGlvbjtpZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93KXt2YXIgaT0wO3RoaXMudGltZUludGVydmFsPXdpbmRvdy5zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt2YXIgbz1bXSxhPVtdO2lmKGUpe2UuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtvWzIqZV09MCxvWzIqZSsxXT0wLGFbMiplXT0wLGFbMiplKzFdPTB9KSksdC5jYWxSZXB1bHNpdmUobyxlKSxuJiZ0LmNhbEF0dHJhY3RpdmUobyxuKSx0LmNhbEdyYXZpdHkobyxlKTt2YXIgcz1NYXRoLm1heCguMDIsdC5pbnRlcnZhbC0uMDAyKmkpO3QudXBkYXRlVmVsb2NpdHkobyxhLHMsZSk7dmFyIHU9W107ZS5mb3JFYWNoKChmdW5jdGlvbih0KXt1LnB1c2goe3g6dC54LHk6dC55fSl9KSksdC51cGRhdGVQb3NpdGlvbihhLHMsZSksdC50aWNrJiZ0LnRpY2soKTt2YXIgYz0wO2UuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgbj10LngtdVtlXS54LHI9dC55LXVbZV0ueTtjKz1NYXRoLnNxcnQobipuK3Iqcil9KSksKGMvPWUubGVuZ3RoKTx0Lm1pbk1vdmVtZW50JiYod2luZG93LmNsZWFySW50ZXJ2YWwodC50aW1lSW50ZXJ2YWwpLHQub25MYXlvdXRFbmQmJnQub25MYXlvdXRFbmQoKSksKytpPnImJih3aW5kb3cuY2xlYXJJbnRlcnZhbCh0LnRpbWVJbnRlcnZhbCksdC5vbkxheW91dEVuZCYmdC5vbkxheW91dEVuZCgpKX19KSwwKX19fSx7a2V5OlwiY2FsUmVwdWxzaXZlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldE1hc3Mscj10aGlzLm5vZGVTdHJlbmd0aCxpPXRoaXMuZmFjdG9yLG89dGhpcy5jb3Vsb21iRGlzU2NhbGUsYT10aGlzLnByZXZlbnRPdmVybGFwLHM9dGhpcy5ub2RlU2l6ZTtlLmZvckVhY2goKGZ1bmN0aW9uKHUsYyl7dmFyIGY9bj9uKHUpOjE7ZS5mb3JFYWNoKChmdW5jdGlvbihlLGwpe2lmKCEoYz49bCkpe3ZhciBoPXUueC1lLngsZD11LnktZS55LHA9TWF0aC5zcXJ0KGgqaCtkKmQpKy4wMSxnPShwKy4xKSpvLHY9aC9wLHk9ZC9wLG09KHIodSkrcihlKSkvMippLyhnKmcpLGI9bj9uKGUpOjE7aWYodFsyKmNdKz12Km0vZix0WzIqYysxXSs9eSptL2YsdFsyKmxdLT12Km0vYix0WzIqbCsxXS09eSptL2IsYSYmcDwocyh1KStzKGUpKS8yKXt2YXIgeD0ocih1KStyKGUpKS8yLyhwKnApO3RbMipjXSs9dip4L2YsdFsyKmMrMV0rPXkqeC9mLHRbMipsXS09dip4L2IsdFsyKmwrMV0tPXkqeC9ifX19KSl9KSl9fSx7a2V5OlwiY2FsQXR0cmFjdGl2ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5ub2RlTWFwLHI9dGhpcy5ub2RlSWR4TWFwLGk9dGhpcy5saW5rRGlzdGFuY2Usbz10aGlzLmVkZ2VTdHJlbmd0aCxhPXRoaXMuZ2V0TWFzcztlLmZvckVhY2goKGZ1bmN0aW9uKGUscyl7dmFyIHU9bltlLnNvdXJjZV0sYz1uW2UudGFyZ2V0XSxmPWMueC11LngsbD1jLnktdS55LGg9TWF0aC5zcXJ0KGYqZitsKmwpKy4wMSxkPWYvaCxwPWwvaCxnPSgoaShlKXx8MSktaCkqbyhlKSx2PXJbZS5zb3VyY2VdLHk9cltlLnRhcmdldF0sbT1hP2EodSk6MSxiPWE/YShjKToxO3RbMip2XS09ZCpnL20sdFsyKnYrMV0tPXAqZy9tLHRbMip5XSs9ZCpnL2IsdFsyKnkrMV0rPXAqZy9ifSkpfX0se2tleTpcImNhbEdyYXZpdHlcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLmNlbnRlcixyPXRoaXMuZ3Jhdml0eSxpPXRoaXMuZGVncmVlcyxvPWUubGVuZ3RoLGE9MDthPG87YSsrKXt2YXIgcz1lW2FdLHU9cy54LW5bMF0sYz1zLnktblsxXSxmPXI7aWYodGhpcy5nZXRDZW50ZXIpe3ZhciBsPXRoaXMuZ2V0Q2VudGVyKHMsaVthXSk7bCYmVW4obFswXSkmJlVuKGxbMV0pJiZVbihsWzJdKSYmKHU9cy54LWxbMF0sYz1zLnktbFsxXSxmPWxbMl0pfWYmJih0WzIqYV0tPWYqdSx0WzIqYSsxXS09ZipjKX19fSx7a2V5OlwidXBkYXRlVmVsb2NpdHlcIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLG89bippLmRhbXBpbmc7ci5mb3JFYWNoKChmdW5jdGlvbihuLHIpe3ZhciBhPXRbMipyXSpvfHwuMDEscz10WzIqcisxXSpvfHwuMDEsdT1NYXRoLnNxcnQoYSphK3Mqcyk7aWYodT5pLm1heFNwZWVkKXt2YXIgYz1pLm1heFNwZWVkL3U7YSo9YyxzKj1jfWVbMipyXT1hLGVbMipyKzFdPXN9KSl9fSx7a2V5OlwidXBkYXRlUG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7bi5mb3JFYWNoKChmdW5jdGlvbihuLHIpe3ZhciBpPXRbMipyXSplLG89dFsyKnIrMV0qZTtuLngrPWksbi55Kz1vfSkpfX0se2tleTpcInN0b3BcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudGltZUludGVydmFsJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVJbnRlcnZhbCl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zdG9wKCksdGhpcy50aWNrPW51bGwsdGhpcy5ub2Rlcz1udWxsLHRoaXMuZWRnZXM9bnVsbCx0aGlzLmRlc3Ryb3llZD0hMH19LHtrZXk6XCJnZXRUeXBlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cImdGb3JjZVwifX1dKSYmZHIoZS5wcm90b3R5cGUsbiksciYmZHIoZSxyKSxvfShRbik7ZnVuY3Rpb24geHIodCxlLG4scil7aWYoaXNOYU4oZSl8fGlzTmFOKG4pKXJldHVybiB0O3ZhciBpLG8sYSxzLHUsYyxmLGwsaCxkPXQuX3Jvb3QscD17ZGF0YTpyfSxnPXQuX3gwLHY9dC5feTAseT10Ll94MSxtPXQuX3kxO2lmKCFkKXJldHVybiB0Ll9yb290PXAsdDtmb3IoO2QubGVuZ3RoOylpZigoYz1lPj0obz0oZyt5KS8yKSk/Zz1vOnk9bywoZj1uPj0oYT0odittKS8yKSk/dj1hOm09YSxpPWQsIShkPWRbbD1mPDwxfGNdKSlyZXR1cm4gaVtsXT1wLHQ7aWYocz0rdC5feC5jYWxsKG51bGwsZC5kYXRhKSx1PSt0Ll95LmNhbGwobnVsbCxkLmRhdGEpLGU9PT1zJiZuPT09dSlyZXR1cm4gcC5uZXh0PWQsaT9pW2xdPXA6dC5fcm9vdD1wLHQ7ZG97aT1pP2lbbF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChjPWU+PShvPShnK3kpLzIpKT9nPW86eT1vLChmPW4+PShhPSh2K20pLzIpKT92PWE6bT1hfXdoaWxlKChsPWY8PDF8Yyk9PShoPSh1Pj1hKTw8MXxzPj1vKSk7cmV0dXJuIGlbaF09ZCxpW2xdPXAsdH12YXIgd3I9ZnVuY3Rpb24odCxlLG4scixpKXt0aGlzLm5vZGU9dCx0aGlzLngwPWUsdGhpcy55MD1uLHRoaXMueDE9cix0aGlzLnkxPWl9O2Z1bmN0aW9uIFNyKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIEVyKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIF9yKHQsZSxuKXt2YXIgcj1uZXcgT3IobnVsbD09ZT9TcjplLG51bGw9PW4/RXI6bixOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gT3IodCxlLG4scixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5feDA9bix0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBrcih0KXtmb3IodmFyIGU9e2RhdGE6dC5kYXRhfSxuPWU7dD10Lm5leHQ7KW49bi5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIGV9dmFyIE1yPV9yLnByb3RvdHlwZT1Pci5wcm90b3R5cGU7TXIuY29weT1mdW5jdGlvbigpe3ZhciB0LGUsbj1uZXcgT3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIG47aWYoIXIubGVuZ3RoKXJldHVybiBuLl9yb290PWtyKHIpLG47Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6bi5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKGU9ci5zb3VyY2VbaV0pJiYoZS5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6ZSx0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09a3IoZSkpO3JldHVybiBufSxNci5hZGQ9ZnVuY3Rpb24odCl7dmFyIGU9K3RoaXMuX3guY2FsbChudWxsLHQpLG49K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiB4cih0aGlzLmNvdmVyKGUsbiksZSxuLHQpfSxNci5hZGRBbGw9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSxzPW5ldyBBcnJheShvKSx1PTEvMCxjPTEvMCxmPS0xLzAsbD0tMS8wO2ZvcihuPTA7bjxvOysrbilpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxlPXRbbl0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsZSkpfHwoYVtuXT1yLHNbbl09aSxyPHUmJih1PXIpLHI+ZiYmKGY9ciksaTxjJiYoYz1pKSxpPmwmJihsPWkpKTtpZih1PmZ8fGM+bClyZXR1cm4gdGhpcztmb3IodGhpcy5jb3Zlcih1LGMpLmNvdmVyKGYsbCksbj0wO248bzsrK24peHIodGhpcyxhW25dLHNbbl0sdFtuXSk7cmV0dXJuIHRoaXN9LE1yLmNvdmVyPWZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odD0rdCl8fGlzTmFOKGU9K2UpKXJldHVybiB0aGlzO3ZhciBuPXRoaXMuX3gwLHI9dGhpcy5feTAsaT10aGlzLl94MSxvPXRoaXMuX3kxO2lmKGlzTmFOKG4pKWk9KG49TWF0aC5mbG9vcih0KSkrMSxvPShyPU1hdGguZmxvb3IoZSkpKzE7ZWxzZXtmb3IodmFyIGEscyx1PWktbnx8MSxjPXRoaXMuX3Jvb3Q7bj50fHx0Pj1pfHxyPmV8fGU+PW87KXN3aXRjaChzPShlPHIpPDwxfHQ8biwoYT1uZXcgQXJyYXkoNCkpW3NdPWMsYz1hLHUqPTIscyl7Y2FzZSAwOmk9bit1LG89cit1O2JyZWFrO2Nhc2UgMTpuPWktdSxvPXIrdTticmVhaztjYXNlIDI6aT1uK3Uscj1vLXU7YnJlYWs7Y2FzZSAzOm49aS11LHI9by11fXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1jKX1yZXR1cm4gdGhpcy5feDA9bix0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzfSxNci5kYXRhPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMudmlzaXQoKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3t0LnB1c2goZS5kYXRhKX13aGlsZShlPWUubmV4dCl9KSksdH0sTXIuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxNci5maW5kPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpLG8sYSxzLHUsYyxmPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxkPXRoaXMuX3kxLHA9W10sZz10aGlzLl9yb290O2ZvcihnJiZwLnB1c2gobmV3IHdyKGcsZixsLGgsZCkpLG51bGw9PW4/bj0xLzA6KGY9dC1uLGw9ZS1uLGg9dCtuLGQ9ZStuLG4qPW4pO3U9cC5wb3AoKTspaWYoISghKGc9dS5ub2RlKXx8KGk9dS54MCk+aHx8KG89dS55MCk+ZHx8KGE9dS54MSk8Znx8KHM9dS55MSk8bCkpaWYoZy5sZW5ndGgpe3ZhciB2PShpK2EpLzIseT0obytzKS8yO3AucHVzaChuZXcgd3IoZ1szXSx2LHksYSxzKSxuZXcgd3IoZ1syXSxpLHksdixzKSxuZXcgd3IoZ1sxXSx2LG8sYSx5KSxuZXcgd3IoZ1swXSxpLG8sdix5KSksKGM9KGU+PXkpPDwxfHQ+PXYpJiYodT1wW3AubGVuZ3RoLTFdLHBbcC5sZW5ndGgtMV09cFtwLmxlbmd0aC0xLWNdLHBbcC5sZW5ndGgtMS1jXT11KX1lbHNle3ZhciBtPXQtK3RoaXMuX3guY2FsbChudWxsLGcuZGF0YSksYj1lLSt0aGlzLl95LmNhbGwobnVsbCxnLmRhdGEpLHg9bSptK2IqYjtpZih4PG4pe3ZhciB3PU1hdGguc3FydChuPXgpO2Y9dC13LGw9ZS13LGg9dCt3LGQ9ZSt3LHI9Zy5kYXRhfX1yZXR1cm4gcn0sTXIucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBlLG4scixpLG8sYSxzLHUsYyxmLGwsaCxkPXRoaXMuX3Jvb3QscD10aGlzLl94MCxnPXRoaXMuX3kwLHY9dGhpcy5feDEseT10aGlzLl95MTtpZighZClyZXR1cm4gdGhpcztpZihkLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PShzPShwK3YpLzIpKT9wPXM6dj1zLChmPWE+PSh1PShnK3kpLzIpKT9nPXU6eT11LGU9ZCwhKGQ9ZFtsPWY8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFkLmxlbmd0aClicmVhazsoZVtsKzEmM118fGVbbCsyJjNdfHxlW2wrMyYzXSkmJihuPWUsaD1sKX1mb3IoO2QuZGF0YSE9PXQ7KWlmKHI9ZCwhKGQ9ZC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1kLm5leHQpJiZkZWxldGUgZC5uZXh0LHI/KGk/ci5uZXh0PWk6ZGVsZXRlIHIubmV4dCx0aGlzKTplPyhpP2VbbF09aTpkZWxldGUgZVtsXSwoZD1lWzBdfHxlWzFdfHxlWzJdfHxlWzNdKSYmZD09PShlWzNdfHxlWzJdfHxlWzFdfHxlWzBdKSYmIWQubGVuZ3RoJiYobj9uW2hdPWQ6dGhpcy5fcm9vdD1kKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSxNci5yZW1vdmVBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtlPG47KytlKXRoaXMucmVtb3ZlKHRbZV0pO3JldHVybiB0aGlzfSxNci5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LE1yLnNpemU9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KChmdW5jdGlvbihlKXtpZighZS5sZW5ndGgpZG97Kyt0fXdoaWxlKGU9ZS5uZXh0KX0pKSx0fSxNci52aXNpdD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGEscz1bXSx1PXRoaXMuX3Jvb3Q7Zm9yKHUmJnMucHVzaChuZXcgd3IodSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO2U9cy5wb3AoKTspaWYoIXQodT1lLm5vZGUscj1lLngwLGk9ZS55MCxvPWUueDEsYT1lLnkxKSYmdS5sZW5ndGgpe3ZhciBjPShyK28pLzIsZj0oaSthKS8yOyhuPXVbM10pJiZzLnB1c2gobmV3IHdyKG4sYyxmLG8sYSkpLChuPXVbMl0pJiZzLnB1c2gobmV3IHdyKG4scixmLGMsYSkpLChuPXVbMV0pJiZzLnB1c2gobmV3IHdyKG4sYyxpLG8sZikpLChuPXVbMF0pJiZzLnB1c2gobmV3IHdyKG4scixpLGMsZikpfXJldHVybiB0aGlzfSxNci52aXNpdEFmdGVyPWZ1bmN0aW9uKHQpe3ZhciBlLG49W10scj1bXTtmb3IodGhpcy5fcm9vdCYmbi5wdXNoKG5ldyB3cih0aGlzLl9yb290LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1uLnBvcCgpOyl7dmFyIGk9ZS5ub2RlO2lmKGkubGVuZ3RoKXt2YXIgbyxhPWUueDAscz1lLnkwLHU9ZS54MSxjPWUueTEsZj0oYSt1KS8yLGw9KHMrYykvMjsobz1pWzBdKSYmbi5wdXNoKG5ldyB3cihvLGEscyxmLGwpKSwobz1pWzFdKSYmbi5wdXNoKG5ldyB3cihvLGYscyx1LGwpKSwobz1pWzJdKSYmbi5wdXNoKG5ldyB3cihvLGEsbCxmLGMpKSwobz1pWzNdKSYmbi5wdXNoKG5ldyB3cihvLGYsbCx1LGMpKX1yLnB1c2goZSl9Zm9yKDtlPXIucG9wKCk7KXQoZS5ub2RlLGUueDAsZS55MCxlLngxLGUueTEpO3JldHVybiB0aGlzfSxNci54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl94PXQsdGhpcyk6dGhpcy5feH0sTXIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feT10LHRoaXMpOnRoaXMuX3l9O3ZhciBBcj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LFRyPWZ1bmN0aW9uKHQpe3JldHVybiAxZS02Kih0KCktLjUpfSxDcj17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBJcigpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLHI9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXStcIlwiKXx8dCBpbiByfHwvW1xccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIrdCk7clt0XT1bXX1yZXR1cm4gbmV3IFByKHIpfWZ1bmN0aW9uIFByKHQpe3RoaXMuXz10fWZ1bmN0aW9uIGpyKHQsZSl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPVwiXCIscj10LmluZGV4T2YoXCIuXCIpO2lmKHI+PTAmJihuPXQuc2xpY2UocisxKSx0PXQuc2xpY2UoMCxyKSksdCYmIWUuaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSl9ZnVuY3Rpb24gRHIodCxlKXtmb3IodmFyIG4scj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZigobj10W3JdKS5uYW1lPT09ZSlyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBOcih0LGUsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKHRbcl0ubmFtZT09PWUpe3Rbcl09Q3IsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPW4mJnQucHVzaCh7bmFtZTplLHZhbHVlOm59KSx0fVByLnByb3RvdHlwZT1Jci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlByLG9uOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzLl8saT1qcih0K1wiXCIsciksbz0tMSxhPWkubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIitlKTtmb3IoOysrbzxhOylpZihuPSh0PWlbb10pLnR5cGUpcltuXT1OcihyW25dLHQubmFtZSxlKTtlbHNlIGlmKG51bGw9PWUpZm9yKG4gaW4gcilyW25dPU5yKHJbbl0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KytvPGE7KWlmKChuPSh0PWlbb10pLnR5cGUpJiYobj1EcihyW25dLHQubmFtZSkpKXJldHVybiBufSxjb3B5OmZ1bmN0aW9uKCl7dmFyIHQ9e30sZT10aGlzLl87Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dLnNsaWNlKCk7cmV0dXJuIG5ldyBQcih0KX0sY2FsbDpmdW5jdGlvbih0LGUpe2lmKChuPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIG4scixpPW5ldyBBcnJheShuKSxvPTA7bzxuOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIit0KTtmb3Iobz0wLG49KHI9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylyW29dLnZhbHVlLmFwcGx5KGUsaSl9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIrdCk7Zm9yKHZhciByPXRoaXMuX1t0XSxpPTAsbz1yLmxlbmd0aDtpPG87KytpKXJbaV0udmFsdWUuYXBwbHkoZSxuKX19O3ZhciBScj1JcjtmdW5jdGlvbiBMcih0KXtyZXR1cm4oTHI9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfXZhciBCcixHcixGcj0wLFVyPTAsenI9MCxWcj0wLFdyPTAsWHI9MCxZcj1cIm9iamVjdFwiPT09KFwidW5kZWZpbmVkXCI9PXR5cGVvZiBwZXJmb3JtYW5jZT9cInVuZGVmaW5lZFwiOkxyKHBlcmZvcm1hbmNlKSkmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLEhyPVwib2JqZWN0XCI9PT0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIHdpbmRvdz9cInVuZGVmaW5lZFwiOkxyKHdpbmRvdykpJiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIHFyKCl7cmV0dXJuIFdyfHwoSHIoS3IpLFdyPVlyLm5vdygpK1hyKX1mdW5jdGlvbiBLcigpe1dyPTB9ZnVuY3Rpb24gWnIoKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfWZ1bmN0aW9uIFFyKHQsZSxuKXt2YXIgcj1uZXcgWnI7cmV0dXJuIHIucmVzdGFydCh0LGUsbikscn1mdW5jdGlvbiBKcigpe1dyPShWcj1Zci5ub3coKSkrWHIsRnI9VXI9MDt0cnl7IWZ1bmN0aW9uKCl7cXIoKSwrK0ZyO2Zvcih2YXIgdCxlPUJyO2U7KSh0PVdyLWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS1Gcn0oKX1maW5hbGx5e0ZyPTAsZnVuY3Rpb24oKXt2YXIgdCxlLG49QnIscj0xLzA7Zm9yKDtuOyluLl9jYWxsPyhyPm4uX3RpbWUmJihyPW4uX3RpbWUpLHQ9bixuPW4uX25leHQpOihlPW4uX25leHQsbi5fbmV4dD1udWxsLG49dD90Ll9uZXh0PWU6QnI9ZSk7R3I9dCx0aShyKX0oKSxXcj0wfX1mdW5jdGlvbiAkcigpe3ZhciB0PVlyLm5vdygpLGU9dC1WcjtlPjFlMyYmKFhyLT1lLFZyPXQpfWZ1bmN0aW9uIHRpKHQpe0ZyfHwoVXImJihVcj1jbGVhclRpbWVvdXQoVXIpKSx0LVdyPjI0Pyh0PDEvMCYmKFVyPXNldFRpbWVvdXQoSnIsdC1Zci5ub3coKS1YcikpLHpyJiYoenI9Y2xlYXJJbnRlcnZhbCh6cikpKTooenJ8fChWcj1Zci5ub3coKSx6cj1zZXRJbnRlcnZhbCgkciwxZTMpKSxGcj0xLEhyKEpyKSkpfVpyLnByb3RvdHlwZT1Rci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlpyLHJlc3RhcnQ6ZnVuY3Rpb24odCxlLG4pe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO249KG51bGw9PW4/cXIoKTorbikrKG51bGw9PWU/MDorZSksdGhpcy5fbmV4dHx8R3I9PT10aGlzfHwoR3I/R3IuX25leHQ9dGhpczpCcj10aGlzLEdyPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPW4sdGkoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsdGkoKSl9fTtmdW5jdGlvbiBlaSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIG5pKHQpe3JldHVybiB0Lnl9dmFyIHJpPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKSxpaT1mdW5jdGlvbih0KXt2YXIgZSxuLHI9MSxpPS4wMDEsbz0xLU1hdGgucG93KGksMS8zMDApLGE9MCxzPS42LHU9bmV3IE1hcCxjPVFyKGgpLGY9UnIoXCJ0aWNrXCIsXCJlbmRcIiksbD0obj0xLGZ1bmN0aW9uKCl7cmV0dXJuKG49KDE2NjQ1MjUqbisxMDEzOTA0MjIzKSU0Mjk0OTY3Mjk2KS80Mjk0OTY3Mjk2fSk7ZnVuY3Rpb24gaCgpe2QoKSxmLmNhbGwoXCJ0aWNrXCIsZSkscjxpJiYoYy5zdG9wKCksZi5jYWxsKFwiZW5kXCIsZSkpfWZ1bmN0aW9uIGQobil7dmFyIGksYyxmPXQubGVuZ3RoO3ZvaWQgMD09PW4mJihuPTEpO2Zvcih2YXIgbD0wO2w8bjsrK2wpZm9yKHIrPShhLXIpKm8sdS5mb3JFYWNoKChmdW5jdGlvbih0KXt0KHIpfSkpLGk9MDtpPGY7KytpKW51bGw9PShjPXRbaV0pLmZ4P2MueCs9Yy52eCo9czooYy54PWMuZngsYy52eD0wKSxudWxsPT1jLmZ5P2MueSs9Yy52eSo9czooYy55PWMuZnksYy52eT0wKTtyZXR1cm4gZX1mdW5jdGlvbiBwKCl7Zm9yKHZhciBlLG49MCxyPXQubGVuZ3RoO248cjsrK24pe2lmKChlPXRbbl0pLmluZGV4PW4sbnVsbCE9ZS5meCYmKGUueD1lLmZ4KSxudWxsIT1lLmZ5JiYoZS55PWUuZnkpLGlzTmFOKGUueCl8fGlzTmFOKGUueSkpe3ZhciBpPTEwKk1hdGguc3FydCguNStuKSxvPW4qcmk7ZS54PWkqTWF0aC5jb3MobyksZS55PWkqTWF0aC5zaW4obyl9KGlzTmFOKGUudngpfHxpc05hTihlLnZ5KSkmJihlLnZ4PWUudnk9MCl9fWZ1bmN0aW9uIGcoZSl7cmV0dXJuIGUuaW5pdGlhbGl6ZSYmZS5pbml0aWFsaXplKHQsbCksZX1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLHAoKSxlPXt0aWNrOmQscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBjLnJlc3RhcnQoaCksZX0sc3RvcDpmdW5jdGlvbigpe3JldHVybiBjLnN0b3AoKSxlfSxub2RlczpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHAoKSx1LmZvckVhY2goZyksZSk6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3QsZSk6cn0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3QsZSk6aX0sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxlKTorb30sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsZSk6YX0sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0xLXQsZSk6MS1zfSxyYW5kb21Tb3VyY2U6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx1LmZvckVhY2goZyksZSk6bH0sZm9yY2U6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xPyhudWxsPT1uP3UuZGVsZXRlKHQpOnUuc2V0KHQsZyhuKSksZSk6dS5nZXQodCl9LGZpbmQ6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYSxzLHUsYz0wLGY9dC5sZW5ndGg7Zm9yKG51bGw9PXI/cj0xLzA6cio9cixjPTA7YzxmOysrYykoYT0oaT1lLShzPXRbY10pLngpKmkrKG89bi1zLnkpKm8pPHImJih1PXMscj1hKTtyZXR1cm4gdX0sb246ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xPyhmLm9uKHQsbiksZSk6Zi5vbih0KX19fSxvaT1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGksbz1BcigtMzApLGE9MSxzPTEvMCx1PS44MTtmdW5jdGlvbiBjKG4pe3ZhciBpLG89dC5sZW5ndGgsYT1fcih0LGVpLG5pKS52aXNpdEFmdGVyKGwpO2ZvcihyPW4saT0wO2k8bzsrK2kpZT10W2ldLGEudmlzaXQoaCl9ZnVuY3Rpb24gZigpe2lmKHQpe3ZhciBlLG4scj10Lmxlbmd0aDtmb3IoaT1uZXcgQXJyYXkociksZT0wO2U8cjsrK2Upbj10W2VdLGlbbi5pbmRleF09K28obixlLHQpfX1mdW5jdGlvbiBsKHQpe3ZhciBlLG4scixvLGEscz0wLHU9MDtpZih0Lmxlbmd0aCl7Zm9yKHI9bz1hPTA7YTw0OysrYSkoZT10W2FdKSYmKG49TWF0aC5hYnMoZS52YWx1ZSkpJiYocys9ZS52YWx1ZSx1Kz1uLHIrPW4qZS54LG8rPW4qZS55KTt0Lng9ci91LHQueT1vL3V9ZWxzZXsoZT10KS54PWUuZGF0YS54LGUueT1lLmRhdGEueTtkb3tzKz1pW2UuZGF0YS5pbmRleF19d2hpbGUoZT1lLm5leHQpfXQudmFsdWU9c31mdW5jdGlvbiBoKHQsbyxjLGYpe2lmKCF0LnZhbHVlKXJldHVybiEwO3ZhciBsPXQueC1lLngsaD10LnktZS55LGQ9Zi1vLHA9bCpsK2gqaDtpZihkKmQvdTxwKXJldHVybiBwPHMmJigwPT09bCYmKHArPShsPVRyKG4pKSpsKSwwPT09aCYmKHArPShoPVRyKG4pKSpoKSxwPGEmJihwPU1hdGguc3FydChhKnApKSxlLnZ4Kz1sKnQudmFsdWUqci9wLGUudnkrPWgqdC52YWx1ZSpyL3ApLCEwO2lmKCEodC5sZW5ndGh8fHA+PXMpKXsodC5kYXRhIT09ZXx8dC5uZXh0KSYmKDA9PT1sJiYocCs9KGw9VHIobikpKmwpLDA9PT1oJiYocCs9KGg9VHIobikpKmgpLHA8YSYmKHA9TWF0aC5zcXJ0KGEqcCkpKTtkb3t0LmRhdGEhPT1lJiYoZD1pW3QuZGF0YS5pbmRleF0qci9wLGUudngrPWwqZCxlLnZ5Kz1oKmQpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGMuaW5pdGlhbGl6ZT1mdW5jdGlvbihlLHIpe3Q9ZSxuPXIsZigpfSxjLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPVwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dDpBcigrdCksZigpLGMpOm99LGMuZGlzdGFuY2VNaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGMpOk1hdGguc3FydChhKX0sYy5kaXN0YW5jZU1heD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10KnQsYyk6TWF0aC5zcXJ0KHMpfSxjLnRoZXRhPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQqdCxjKTpNYXRoLnNxcnQodSl9LGN9O2Z1bmN0aW9uIGFpKHQpe3JldHVybihhaT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gc2kodCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gdWkodCxlKXt2YXIgbj10LmdldChlKTtpZighbil0aHJvdyBuZXcgRXJyb3IoXCJub2RlIG5vdCBmb3VuZDogXCIrZSk7cmV0dXJuIG59dmFyIGNpPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYSxzPXNpLHU9ZnVuY3Rpb24odCl7cmV0dXJuIDEvTWF0aC5taW4oaVt0LnNvdXJjZS5pbmRleF0saVt0LnRhcmdldC5pbmRleF0pfSxjPUFyKDMwKSxmPTE7ZnVuY3Rpb24gbChyKXtmb3IodmFyIGk9MCxzPXQubGVuZ3RoO2k8ZjsrK2kpZm9yKHZhciB1LGMsbCxoLGQscCxnLHY9MDt2PHM7Kyt2KWM9KHU9dFt2XSkuc291cmNlLGg9KGw9dS50YXJnZXQpLngrbC52eC1jLngtYy52eHx8VHIoYSksZD1sLnkrbC52eS1jLnktYy52eXx8VHIoYSksaCo9cD0oKHA9TWF0aC5zcXJ0KGgqaCtkKmQpKS1uW3ZdKS9wKnIqZVt2XSxkKj1wLGwudngtPWgqKGc9b1t2XSksbC52eS09ZCpnLGMudngrPWgqKGc9MS1nKSxjLnZ5Kz1kKmd9ZnVuY3Rpb24gaCgpe2lmKHIpe3ZhciBhLHUsYz1yLmxlbmd0aCxmPXQubGVuZ3RoLGw9bmV3IE1hcChyLm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm5bcyh0LGUsciksdF19KSkpO2ZvcihhPTAsaT1uZXcgQXJyYXkoYyk7YTxmOysrYSkodT10W2FdKS5pbmRleD1hLFwib2JqZWN0XCIhPT1haSh1LnNvdXJjZSkmJih1LnNvdXJjZT11aShsLHUuc291cmNlKSksXCJvYmplY3RcIiE9PWFpKHUudGFyZ2V0KSYmKHUudGFyZ2V0PXVpKGwsdS50YXJnZXQpKSxpW3Uuc291cmNlLmluZGV4XT0oaVt1LnNvdXJjZS5pbmRleF18fDApKzEsaVt1LnRhcmdldC5pbmRleF09KGlbdS50YXJnZXQuaW5kZXhdfHwwKSsxO2ZvcihhPTAsbz1uZXcgQXJyYXkoZik7YTxmOysrYSl1PXRbYV0sb1thXT1pW3Uuc291cmNlLmluZGV4XS8oaVt1LnNvdXJjZS5pbmRleF0raVt1LnRhcmdldC5pbmRleF0pO2U9bmV3IEFycmF5KGYpLGQoKSxuPW5ldyBBcnJheShmKSxwKCl9fWZ1bmN0aW9uIGQoKXtpZihyKWZvcih2YXIgbj0wLGk9dC5sZW5ndGg7bjxpOysrbillW25dPSt1KHRbbl0sbix0KX1mdW5jdGlvbiBwKCl7aWYocilmb3IodmFyIGU9MCxpPXQubGVuZ3RoO2U8aTsrK2UpbltlXT0rYyh0W2VdLGUsdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxsLmluaXRpYWxpemU9ZnVuY3Rpb24odCxlKXtyPXQsYT1lLGgoKX0sbC5saW5rcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLGgoKSxsKTp0fSxsLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsbCk6c30sbC5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSt0LGwpOmZ9LGwuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9XCJmdW5jdGlvblwiPT10eXBlb2YgdD90OkFyKCt0KSxkKCksbCk6dX0sbC5kaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3Q6QXIoK3QpLHAoKSxsKTpjfSxsfTtmdW5jdGlvbiBmaSh0KXtyZXR1cm4gdC54K3Qudnh9ZnVuY3Rpb24gbGkodCl7cmV0dXJuIHQueSt0LnZ5fXZhciBoaT1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaT0xLG89MTtmdW5jdGlvbiBhKCl7Zm9yKHZhciB0LGEsdSxjLGYsbCxoLGQ9ZS5sZW5ndGgscD0wO3A8bzsrK3ApZm9yKGE9X3IoZSxmaSxsaSkudmlzaXRBZnRlcihzKSx0PTA7dDxkOysrdCl1PWVbdF0sbD1uW3UuaW5kZXhdLGg9bCpsLGM9dS54K3UudngsZj11LnkrdS52eSxhLnZpc2l0KGcpO2Z1bmN0aW9uIGcodCxlLG4sbyxhKXt2YXIgcz10LmRhdGEsZD10LnIscD1sK2Q7aWYoIXMpcmV0dXJuIGU+YytwfHxvPGMtcHx8bj5mK3B8fGE8Zi1wO2lmKHMuaW5kZXg+dS5pbmRleCl7dmFyIGc9Yy1zLngtcy52eCx2PWYtcy55LXMudnkseT1nKmcrdip2O3k8cCpwJiYoMD09PWcmJih5Kz0oZz1UcihyKSkqZyksMD09PXYmJih5Kz0odj1UcihyKSkqdikseT0ocC0oeT1NYXRoLnNxcnQoeSkpKS95KmksdS52eCs9KGcqPXkpKihwPShkKj1kKS8oaCtkKSksdS52eSs9KHYqPXkpKnAscy52eC09ZyoocD0xLXApLHMudnktPXYqcCl9fX1mdW5jdGlvbiBzKHQpe2lmKHQuZGF0YSlyZXR1cm4gdC5yPW5bdC5kYXRhLmluZGV4XTtmb3IodmFyIGU9dC5yPTA7ZTw0OysrZSl0W2VdJiZ0W2VdLnI+dC5yJiYodC5yPXRbZV0ucil9ZnVuY3Rpb24gdSgpe2lmKGUpe3ZhciByLGksbz1lLmxlbmd0aDtmb3Iobj1uZXcgQXJyYXkobykscj0wO3I8bzsrK3IpaT1lW3JdLG5baS5pbmRleF09K3QoaSxyLGUpfX1yZXR1cm5cImZ1bmN0aW9uXCIhPXR5cGVvZiB0JiYodD1BcihudWxsPT10PzE6K3QpKSxhLmluaXRpYWxpemU9ZnVuY3Rpb24odCxuKXtlPXQscj1uLHUoKX0sYS5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGEpOm99LGEuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3QsYSk6aX0sYS5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9XCJmdW5jdGlvblwiPT10eXBlb2YgZT9lOkFyKCtlKSx1KCksYSk6dH0sYX07ZnVuY3Rpb24gZGkodCxlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdH0odCl8fGZ1bmN0aW9uKHQsZSl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKSlyZXR1cm47dmFyIG49W10scj0hMCxpPSExLG89dm9pZCAwO3RyeXtmb3IodmFyIGEscz10W1N5bWJvbC5pdGVyYXRvcl0oKTshKHI9KGE9cy5uZXh0KCkpLmRvbmUpJiYobi5wdXNoKGEudmFsdWUpLCFlfHxuLmxlbmd0aCE9PWUpO3I9ITApO31jYXRjaCh0KXtpPSEwLG89dH1maW5hbGx5e3RyeXtyfHxudWxsPT1zLnJldHVybnx8cy5yZXR1cm4oKX1maW5hbGx5e2lmKGkpdGhyb3cgb319cmV0dXJuIG59KHQsZSl8fGZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXJldHVybiBwaSh0LGUpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTtcIk9iamVjdFwiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZihcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4pcmV0dXJuIEFycmF5LmZyb20odCk7aWYoXCJBcmd1bWVudHNcIj09PW58fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKXJldHVybiBwaSh0LGUpfSh0LGUpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gcGkodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBnaSgpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBlLG49ZnVuY3Rpb24odCl7cmV0dXJuIHQuY2x1c3Rlcn0scj10KDEpLGk9dCgtMSksbz10KDEwMCksYT10KC4xKSxzPVswLDBdLHU9W10sYz17fSxmPVtdLGw9MTAwLGg9MTAwLGQ9e25vbmU6e3g6MCx5OjB9fSxwPVtdLGc9XCJmb3JjZVwiLHY9ITAseT0uMTtmdW5jdGlvbiBtKHQpe2lmKCF2KXJldHVybiBtO2UudGljaygpLHgoKTtmb3IodmFyIHIsaT0wLG89dS5sZW5ndGgsYT10Knk7aTxvOysraSkocj11W2ldKS52eCs9KGRbbihyKV0ueC1yLngpKmEsci52eSs9KGRbbihyKV0ueS1yLnkpKmF9ZnVuY3Rpb24gYigpe3UmJmZ1bmN0aW9uKCl7aWYoIXV8fCF1Lmxlbmd0aClyZXR1cm47aWYodm9pZCAwPT09bih1WzBdKSl0aHJvdyBFcnJvcihcIkNvdWxkbnQgZmluZCB0aGUgZ3JvdXBpbmcgYXR0cmlidXRlIGZvciB0aGUgbm9kZXMuIE1ha2Ugc3VyZSB0byBzZXQgaXQgdXAgd2l0aCBmb3JjZUluQUJveC5ncm91cEJ5KCdjbHVzdGVyQXR0cicpIGJlZm9yZSBjYWxsaW5nIC5saW5rcygpXCIpO3ZhciB0PShkPVtdLGc9W10sdj17fSx5PVtdLHM9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9bih0KTtlW3JdfHwoZVtyXT17Y291bnQ6MCxzdW1mb3JjZU5vZGVTaXplOjB9KX0pKSx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBpPW4odCksbz1yKHQpLGE9ZVtpXTthLmNvdW50PWEuY291bnQrMSxhLnN1bWZvcmNlTm9kZVNpemU9YS5zdW1mb3JjZU5vZGVTaXplK01hdGguUEkqKG8qbykqMS4zLGVbaV09YX0pKSxlfSh1KSx5PWZ1bmN0aW9uKHQpe3ZhciBlPXt9LHI9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9ZnVuY3Rpb24odCl7dmFyIGU9bihjW3Quc291cmNlXSkscj1uKGNbdC50YXJnZXRdKTtyZXR1cm4gZTw9cj9cIlwiLmNvbmNhdChlLFwiflwiKS5jb25jYXQocik6XCJcIi5jb25jYXQocixcIn5cIikuY29uY2F0KGUpfSh0KSxpPTA7dm9pZCAwIT09ZVtyXSYmKGk9ZVtyXSksaSs9MSxlW3JdPWl9KSksT2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9ZGkodCwyKSxuPWVbMF0saT1lWzFdLG89bi5zcGxpdChcIn5cIilbMF0sYT1uLnNwbGl0KFwiflwiKVsxXTt2b2lkIDAhPT1vJiZ2b2lkIDAhPT1hJiZyLnB1c2goe3NvdXJjZTpvLHRhcmdldDphLGNvdW50Oml9KX0pKSxyfShmKSxPYmplY3Qua2V5cyhzKS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3ZhciBuPXNbdF07ZC5wdXNoKHtpZDp0LHNpemU6bi5jb3VudCxyOk1hdGguc3FydChuLnN1bWZvcmNlTm9kZVNpemUvTWF0aC5QSSl9KSx2W3RdPWV9KSkseS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT12W3Quc291cmNlXSxuPXZbdC50YXJnZXRdO3ZvaWQgMCE9PWUmJnZvaWQgMCE9PW4mJmcucHVzaCh7c291cmNlOmUsdGFyZ2V0Om4sY291bnQ6dC5jb3VudH0pfSkpLHtub2RlczpkLGxpbmtzOmd9KTt2YXIgcyxkLGcsdix5O2U9aWkodC5ub2RlcykuZm9yY2UoXCJ4XCIsZnVuY3Rpb24odCl7dmFyIGUsbixyLGk9QXIoLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPWUubGVuZ3RoO288YTsrK28pKGk9ZVtvXSkudngrPShyW29dLWkueCkqbltvXSp0fWZ1bmN0aW9uIGEoKXtpZihlKXt2YXIgbyxhPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyluW29dPWlzTmFOKHJbb109K3QoZVtvXSxvLGUpKT8wOitpKGVbb10sbyxlKX19cmV0dXJuXCJmdW5jdGlvblwiIT10eXBlb2YgdCYmKHQ9QXIobnVsbD09dD8wOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dCxhKCl9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9XCJmdW5jdGlvblwiPT10eXBlb2YgdD90OkFyKCt0KSxhKCksbyk6aX0sby54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTpBcigrZSksYSgpLG8pOnR9LG99KGwpLnN0cmVuZ3RoKC4xKSkuZm9yY2UoXCJ5XCIsZnVuY3Rpb24odCl7dmFyIGUsbixyLGk9QXIoLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPWUubGVuZ3RoO288YTsrK28pKGk9ZVtvXSkudnkrPShyW29dLWkueSkqbltvXSp0fWZ1bmN0aW9uIGEoKXtpZihlKXt2YXIgbyxhPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyluW29dPWlzTmFOKHJbb109K3QoZVtvXSxvLGUpKT8wOitpKGVbb10sbyxlKX19cmV0dXJuXCJmdW5jdGlvblwiIT10eXBlb2YgdCYmKHQ9QXIobnVsbD09dD8wOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dCxhKCl9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9XCJmdW5jdGlvblwiPT10eXBlb2YgdD90OkFyKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTpBcigrZSksYSgpLG8pOnR9LG99KGgpLnN0cmVuZ3RoKC4xKSkuZm9yY2UoXCJjb2xsaWRlXCIsaGkoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJ9KSkuaXRlcmF0aW9ucyg0KSkuZm9yY2UoXCJjaGFyZ2VcIixvaSgpLnN0cmVuZ3RoKGkpKS5mb3JjZShcImxpbmtzXCIsY2kodC5ub2Rlcy5sZW5ndGg/dC5saW5rczpbXSkuZGlzdGFuY2Uobykuc3RyZW5ndGgoYSkpLHA9ZS5ub2RlcygpLHgoKX0oKX1mdW5jdGlvbiB4KCl7cmV0dXJuIGQ9e25vbmU6e3g6MCx5OjB9fSxwLmZvckVhY2goKGZ1bmN0aW9uKHQpe2RbdC5pZF09e3g6dC54LXNbMF0seTp0Lnktc1sxXX19KSksZH1mdW5jdGlvbiB3KHQpe2M9e30sdC5mb3JFYWNoKChmdW5jdGlvbih0KXtjW3QuaWRdPXR9KSl9cmV0dXJuIG0uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXt1PXQsYigpfSxtLnRlbXBsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPXQsYigpLG0pOmd9LG0uZ3JvdXBCeT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9cInN0cmluZ1wiPT10eXBlb2YgdD8obj1mdW5jdGlvbihlKXtyZXR1cm4gZVt0XX0sbSk6KG49dCxtKTpufSxtLmVuYWJsZUdyb3VwaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PXQsbSk6dn0sbS5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT10LG0pOnl9LG0uY2VudGVyWD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LG0pOmx9LG0uY2VudGVyWT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD10LG0pOmh9LG0ubm9kZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHcodHx8W10pLHU9dHx8W10sbSk6dX0sbS5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj10fHxbXSxiKCksbSk6Zn0sbS5mb3JjZU5vZGVTaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPVwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTp0KCtlKSxiKCksbSk6cn0sbS5ub2RlU2l6ZT1tLmZvcmNlTm9kZVNpemUsbS5mb3JjZUNoYXJnZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2U6dCgrZSksYigpLG0pOml9LG0uZm9yY2VMaW5rRGlzdGFuY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89XCJmdW5jdGlvblwiPT10eXBlb2YgZT9lOnQoK2UpLGIoKSxtKTpvfSxtLmZvcmNlTGlua1N0cmVuZ3RoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTp0KCtlKSxiKCksbSk6YX0sbS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCxtKTpzfSxtLmdldEZvY2lzPXgsbX12YXIgdmk9XCJMQVlPVVRfUlVOXCIseWk9XCJMQVlPVVRfRU5EXCIsbWk9XCJMQVlPVVRfRVJST1JcIixiaT1cIkxBWU9VVF9USUNLXCIseGk9XCJHUFVfTEFZT1VUX1JVTlwiLHdpPVwiR1BVX0xBWU9VVF9FTkRcIjtmdW5jdGlvbiBTaSh0KXtyZXR1cm4oU2k9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIEVpKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBfaSh0LGUpe3JldHVybihfaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gT2kodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1NaSh0KTtpZihlKXt2YXIgaT1NaSh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4ga2kodGhpcyxuKX19ZnVuY3Rpb24ga2kodCxlKXtyZXR1cm4hZXx8XCJvYmplY3RcIiE9PVNpKGUpJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP2Z1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiB0fSh0KTplfWZ1bmN0aW9uIE1pKHQpe3JldHVybihNaT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9dmFyIEFpPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmX2kodCxlKX0obyx0KTt2YXIgZSxuLHIsaT1PaShvKTtmdW5jdGlvbiBvKHQpe3ZhciBlO3JldHVybiBmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsbyksKGU9aS5jYWxsKHRoaXMpKS5jZW50ZXI9WzAsMF0sZS5ub2RlU3RyZW5ndGg9bnVsbCxlLmVkZ2VTdHJlbmd0aD1udWxsLGUucHJldmVudE92ZXJsYXA9ITEsZS5jbHVzdGVyTm9kZVN0cmVuZ3RoPW51bGwsZS5jbHVzdGVyRWRnZVN0cmVuZ3RoPW51bGwsZS5jbHVzdGVyRWRnZURpc3RhbmNlPW51bGwsZS5jbHVzdGVyTm9kZVNpemU9bnVsbCxlLmNsdXN0ZXJGb2NpU3RyZW5ndGg9bnVsbCxlLmxpbmtEaXN0YW5jZT01MCxlLmFscGhhRGVjYXk9LjAyOCxlLmFscGhhTWluPS4wMDEsZS5hbHBoYT0uMyxlLmNvbGxpZGVTdHJlbmd0aD0xLGUud29ya2VyRW5hYmxlZD0hMSxlLnRpY2s9ZnVuY3Rpb24oKXt9LGUub25MYXlvdXRFbmQ9ZnVuY3Rpb24oKXt9LGUudGlja2luZz12b2lkIDAsdCYmZS51cGRhdGVDZmcodCksZX1yZXR1cm4gZT1vLChuPVt7a2V5OlwiZ2V0RGVmYXVsdENmZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2NlbnRlcjpbMCwwXSxub2RlU3RyZW5ndGg6bnVsbCxlZGdlU3RyZW5ndGg6bnVsbCxwcmV2ZW50T3ZlcmxhcDohMSxub2RlU2l6ZTp2b2lkIDAsbm9kZVNwYWNpbmc6dm9pZCAwLGxpbmtEaXN0YW5jZTo1MCxmb3JjZVNpbXVsYXRpb246bnVsbCxhbHBoYURlY2F5Oi4wMjgsYWxwaGFNaW46LjAwMSxhbHBoYTouMyxjb2xsaWRlU3RyZW5ndGg6MSxjbHVzdGVyaW5nOiExLGNsdXN0ZXJOb2RlU3RyZW5ndGg6LTEsY2x1c3RlckVkZ2VTdHJlbmd0aDouMSxjbHVzdGVyRWRnZURpc3RhbmNlOjEwMCxjbHVzdGVyRm9jaVN0cmVuZ3RoOi44LGNsdXN0ZXJOb2RlU2l6ZToxMCx0aWNrOmZ1bmN0aW9uKCl7fSxvbkxheW91dEVuZDpmdW5jdGlvbigpe30sd29ya2VyRW5hYmxlZDohMX19fSx7a2V5OlwiaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMubm9kZXM9dC5ub2Rlc3x8W107dmFyIGU9dC5lZGdlc3x8W107dGhpcy5lZGdlcz1lLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9e30sbj1bXCJ0YXJnZXROb2RlXCIsXCJzb3VyY2VOb2RlXCIsXCJzdGFydFBvaW50XCIsXCJlbmRQb2ludFwiXTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24ocil7bi5pbmRleE9mKHIpPi0xfHwoZVtyXT10W3JdKX0pKSxlfSkpLHRoaXMudGlja2luZz0hMX19LHtrZXk6XCJleGVjdXRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWUubm9kZXMscj1lLmVkZ2VzO2lmKCFlLnRpY2tpbmcpe3ZhciBpPWUuZm9yY2VTaW11bGF0aW9uLG89ZS5hbHBoYU1pbixhPWUuYWxwaGFEZWNheSxzPWUuYWxwaGE7aWYoaSl7aWYodClpZihlLmNsdXN0ZXJpbmcmJmUuY2x1c3RlckZvcmNlJiYoZS5jbHVzdGVyRm9yY2Uubm9kZXMobiksZS5jbHVzdGVyRm9yY2UubGlua3MocikpLGkubm9kZXMobiksciYmZS5lZGdlRm9yY2UpZS5lZGdlRm9yY2UubGlua3Mocik7ZWxzZSBpZihyJiYhZS5lZGdlRm9yY2Upe3ZhciB1PWNpKCkuaWQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmlkfSkpLmxpbmtzKHIpO2UuZWRnZVN0cmVuZ3RoJiZ1LnN0cmVuZ3RoKGUuZWRnZVN0cmVuZ3RoKSxlLmxpbmtEaXN0YW5jZSYmdS5kaXN0YW5jZShlLmxpbmtEaXN0YW5jZSksZS5lZGdlRm9yY2U9dSxpLmZvcmNlKFwibGlua1wiLHUpfWUucHJldmVudE92ZXJsYXAmJmUub3ZlcmxhcFByb2Nlc3MoaSksaS5hbHBoYShzKS5yZXN0YXJ0KCksdGhpcy50aWNraW5nPSEwfWVsc2UgdHJ5e3ZhciBjPW9pKCk7aWYoZS5ub2RlU3RyZW5ndGgmJmMuc3RyZW5ndGgoZS5ub2RlU3RyZW5ndGgpLGk9aWkoKS5ub2RlcyhuKSxlLmNsdXN0ZXJpbmcpe3ZhciBmPWdpKCk7Zi5jZW50ZXJYKGUuY2VudGVyWzBdKS5jZW50ZXJZKGUuY2VudGVyWzFdKS50ZW1wbGF0ZShcImZvcmNlXCIpLnN0cmVuZ3RoKGUuY2x1c3RlckZvY2lTdHJlbmd0aCksciYmZi5saW5rcyhyKSxuJiZmLm5vZGVzKG4pLGYuZm9yY2VMaW5rRGlzdGFuY2UoZS5jbHVzdGVyRWRnZURpc3RhbmNlKS5mb3JjZUxpbmtTdHJlbmd0aChlLmNsdXN0ZXJFZGdlU3RyZW5ndGgpLmZvcmNlQ2hhcmdlKGUuY2x1c3Rlck5vZGVTdHJlbmd0aCkuZm9yY2VOb2RlU2l6ZShlLmNsdXN0ZXJOb2RlU2l6ZSksZS5jbHVzdGVyRm9yY2U9ZixpLmZvcmNlKFwiZ3JvdXBcIixmKX1pZihpLmZvcmNlKFwiY2VudGVyXCIsZnVuY3Rpb24odCxlKXt2YXIgbixyPTE7ZnVuY3Rpb24gaSgpe3ZhciBpLG8sYT1uLmxlbmd0aCxzPTAsdT0wO2ZvcihpPTA7aTxhOysraSlzKz0obz1uW2ldKS54LHUrPW8ueTtmb3Iocz0ocy9hLXQpKnIsdT0odS9hLWUpKnIsaT0wO2k8YTsrK2kpKG89bltpXSkueC09cyxvLnktPXV9cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PWUmJihlPTApLGkuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXR9LGkueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxpKTp0fSxpLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsaSk6ZX0saS5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxpKTpyfSxpfShlLmNlbnRlclswXSxlLmNlbnRlclsxXSkpLmZvcmNlKFwiY2hhcmdlXCIsYykuYWxwaGEocykuYWxwaGFEZWNheShhKS5hbHBoYU1pbihvKSxlLnByZXZlbnRPdmVybGFwJiZlLm92ZXJsYXBQcm9jZXNzKGkpLHIpe3ZhciBsPWNpKCkuaWQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmlkfSkpLmxpbmtzKHIpO2UuZWRnZVN0cmVuZ3RoJiZsLnN0cmVuZ3RoKGUuZWRnZVN0cmVuZ3RoKSxlLmxpbmtEaXN0YW5jZSYmbC5kaXN0YW5jZShlLmxpbmtEaXN0YW5jZSksZS5lZGdlRm9yY2U9bCxpLmZvcmNlKFwibGlua1wiLGwpfWlmKGUud29ya2VyRW5hYmxlZCYmIVRpKCkmJihlLndvcmtlckVuYWJsZWQ9ITEsY29uc29sZS53YXJuKFwid29ya2VyRW5hYmxlZCBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgd2hlbiBydW5uaW5nIGluIHdlYiB3b3JrZXIuXCIpKSxlLndvcmtlckVuYWJsZWQpe2kuc3RvcCgpO2Zvcih2YXIgaD1mdW5jdGlvbih0KXt2YXIgZT10LmFscGhhTWluKCksbj10LmFscGhhVGFyZ2V0KCkscj10LmFscGhhKCksaT1NYXRoLmxvZygoZS1uKS8oci1uKSkvTWF0aC5sb2coMS10LmFscGhhRGVjYXkoKSk7cmV0dXJuIE1hdGguY2VpbChpKX0oaSksZD0xO2Q8PWg7ZCsrKWkudGljaygpLHBvc3RNZXNzYWdlKHtub2RlczpuLGN1cnJlbnRUaWNrOmQsdG90YWxUaWNrczpoLHR5cGU6Yml9LHZvaWQgMCk7ZS50aWNraW5nPSExfWVsc2UgaS5vbihcInRpY2tcIiwoZnVuY3Rpb24oKXtlLnRpY2soKX0pKS5vbihcImVuZFwiLChmdW5jdGlvbigpe2UudGlja2luZz0hMSxlLm9uTGF5b3V0RW5kJiZlLm9uTGF5b3V0RW5kKCl9KSksZS50aWNraW5nPSEwO2UuZm9yY2VTaW11bGF0aW9uPWksZS50aWNraW5nPSEwfWNhdGNoKHQpe2UudGlja2luZz0hMSxjb25zb2xlLndhcm4odCl9fX19LHtrZXk6XCJvdmVybGFwUHJvY2Vzc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG4scj10aGlzLm5vZGVTaXplLGk9dGhpcy5ub2RlU3BhY2luZyxvPXRoaXMuY29sbGlkZVN0cmVuZ3RoO2lmKG49VW4oaSk/ZnVuY3Rpb24oKXtyZXR1cm4gaX06S24oaSk/aTpmdW5jdGlvbigpe3JldHVybiAwfSxyKWlmKEtuKHIpKWU9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkrbih0KX07ZWxzZSBpZihGbihyKSl7dmFyIGE9KHJbMF0+clsxXT9yWzBdOnJbMV0pLzI7ZT1mdW5jdGlvbih0KXtyZXR1cm4gYStuKHQpfX1lbHNlIGlmKFVuKHIpKXt2YXIgcz1yLzI7ZT1mdW5jdGlvbih0KXtyZXR1cm4gcytuKHQpfX1lbHNlIGU9ZnVuY3Rpb24oKXtyZXR1cm4gMTB9O2Vsc2UgZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5zaXplP0ZuKHQuc2l6ZSk/KHQuc2l6ZVswXT50LnNpemVbMV0/dC5zaXplWzBdOnQuc2l6ZVsxXSkvMituKHQpOnQuc2l6ZS8yK24odCk6MTArbih0KX07dC5mb3JjZShcImNvbGxpc2lvbkZvcmNlXCIsaGkoZSkuc3RyZW5ndGgobykpfX0se2tleTpcInVwZGF0ZUNmZ1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMudGlja2luZyYmKHRoaXMuZm9yY2VTaW11bGF0aW9uLnN0b3AoKSx0aGlzLnRpY2tpbmc9ITEpLHRoaXMuZm9yY2VTaW11bGF0aW9uPW51bGwsT2JqZWN0LmFzc2lnbih0aGlzLHQpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudGlja2luZyYmKHRoaXMuZm9yY2VTaW11bGF0aW9uLnN0b3AoKSx0aGlzLnRpY2tpbmc9ITEpLHRoaXMubm9kZXM9bnVsbCx0aGlzLmVkZ2VzPW51bGwsdGhpcy5kZXN0cm95ZWQ9ITB9fV0pJiZFaShlLnByb3RvdHlwZSxuKSxyJiZFaShlLHIpLG99KFFuKTtmdW5jdGlvbiBUaSgpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWZ1bmN0aW9uIENpKHQpe3JldHVybihDaT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gSWkodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIFBpKHQsZSl7cmV0dXJuKFBpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiBqaSh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPU5pKHQpO2lmKGUpe3ZhciBpPU5pKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBEaSh0aGlzLG4pfX1mdW5jdGlvbiBEaSh0LGUpe3JldHVybiFlfHxcIm9iamVjdFwiIT09Q2koZSkmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9KHQpOmV9ZnVuY3Rpb24gTmkodCl7cmV0dXJuKE5pPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBSaSh0LGUsbixyKXt0LmZvckVhY2goKGZ1bmN0aW9uKGUsbil7dFtuXS5jaGlsZHJlbj1bXSx0W25dLnBhcmVudD1bXX0pKSxyP2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHI9MDtlLnNvdXJjZSYmKHI9bltlLnNvdXJjZV0pO3ZhciBpPTA7ZS50YXJnZXQmJihpPW5bZS50YXJnZXRdKTt2YXIgbz10W3JdLmNoaWxkcmVuLGE9dFtpXS5wYXJlbnQ7by5wdXNoKHRbaV0uaWQpLGEucHVzaCh0W3JdLmlkKX0pKTplLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciByPTA7ZS5zb3VyY2UmJihyPW5bZS5zb3VyY2VdKTt2YXIgaT0wO2UudGFyZ2V0JiYoaT1uW2UudGFyZ2V0XSk7dmFyIG89dFtyXS5jaGlsZHJlbixhPXRbaV0uY2hpbGRyZW47by5wdXNoKHRbaV0uaWQpLGEucHVzaCh0W3JdLmlkKX0pKX1mdW5jdGlvbiBMaSh0LGUsbil7Zm9yKHZhciByPW4ubGVuZ3RoLGk9MDtpPHI7aSsrKWlmKHQuaWQ9PT1uW2ldLnNvdXJjZSYmZS5pZD09PW5baV0udGFyZ2V0fHxlLmlkPT09bltpXS5zb3VyY2UmJnQuaWQ9PT1uW2ldLnRhcmdldClyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBCaSh0LGUpe3ZhciBuPXQuZGVncmVlLHI9ZS5kZWdyZWU7cmV0dXJuIG48cj8tMTpuPnI/MTowfXZhciBHaT1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlBpKHQsZSl9KG8sdCk7dmFyIGUsbixyLGk9amkobyk7ZnVuY3Rpb24gbyh0KXt2YXIgZTtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLG8pLChlPWkuY2FsbCh0aGlzKSkucmFkaXVzPW51bGwsZS5zdGFydFJhZGl1cz1udWxsLGUuZW5kUmFkaXVzPW51bGwsZS5zdGFydEFuZ2xlPTAsZS5lbmRBbmdsZT0yKk1hdGguUEksZS5jbG9ja3dpc2U9ITAsZS5kaXZpc2lvbnM9MSxlLm9yZGVyaW5nPW51bGwsZS5hbmdsZVJhdGlvPTEsZS5ub2Rlcz1bXSxlLmVkZ2VzPVtdLGUubm9kZU1hcD17fSxlLmRlZ3JlZXM9W10sZS53aWR0aD0zMDAsZS5oZWlnaHQ9MzAwLGUudXBkYXRlQ2ZnKHQpLGV9cmV0dXJuIGU9bywobj1be2tleTpcImdldERlZmF1bHRDZmdcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybntyYWRpdXM6bnVsbCxzdGFydFJhZGl1czpudWxsLGVuZFJhZGl1czpudWxsLHN0YXJ0QW5nbGU6MCxlbmRBbmdsZToyKk1hdGguUEksY2xvY2t3aXNlOiEwLGRpdmlzaW9uczoxLG9yZGVyaW5nOm51bGwsYW5nbGVSYXRpbzoxfX19LHtrZXk6XCJleGVjdXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm5vZGVzLGU9dGhpcy5lZGdlcyxuPXQubGVuZ3RoO2lmKDAhPT1uKXt0aGlzLndpZHRofHxcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwodGhpcy53aWR0aD13aW5kb3cuaW5uZXJXaWR0aCksdGhpcy5oZWlnaHR8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fCh0aGlzLmhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHQpLHRoaXMuY2VudGVyfHwodGhpcy5jZW50ZXI9W3RoaXMud2lkdGgvMix0aGlzLmhlaWdodC8yXSk7dmFyIHI9dGhpcy5jZW50ZXI7aWYoMT09PW4pcmV0dXJuIHRbMF0ueD1yWzBdLHRbMF0ueT1yWzFdLHZvaWQodGhpcy5vbkxheW91dEVuZCYmdGhpcy5vbkxheW91dEVuZCgpKTt2YXIgaT10aGlzLnJhZGl1cyxvPXRoaXMuc3RhcnRSYWRpdXMsYT10aGlzLmVuZFJhZGl1cyxzPXRoaXMuZGl2aXNpb25zLHU9dGhpcy5zdGFydEFuZ2xlLGM9dGhpcy5lbmRBbmdsZSxmPShjLXUpL24sbD17fTt0LmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7bFt0LmlkXT1lfSkpLHRoaXMubm9kZU1hcD1sO3ZhciBoPVZuKHQubGVuZ3RoLGwsZSk7dGhpcy5kZWdyZWVzPWgsaXx8b3x8YT8hbyYmYT9vPWE6byYmIWEmJihhPW8pOmk9dGhpcy5oZWlnaHQ+dGhpcy53aWR0aD90aGlzLndpZHRoLzI6dGhpcy5oZWlnaHQvMjt2YXIgZD1mKnRoaXMuYW5nbGVSYXRpbyxwPXRoaXMub3JkZXJpbmcsZz1bXTtnPVwidG9wb2xvZ3lcIj09PXA/dGhpcy50b3BvbG9neU9yZGVyaW5nKCk6XCJ0b3BvbG9neS1kaXJlY3RlZFwiPT09cD90aGlzLnRvcG9sb2d5T3JkZXJpbmcoITApOlwiZGVncmVlXCI9PT1wP3RoaXMuZGVncmVlT3JkZXJpbmcoKTp0O2Zvcih2YXIgdj10aGlzLmNsb2Nrd2lzZSx5PU1hdGguY2VpbChuL3MpLG09MDttPG47KyttKXt2YXIgYj1pO2J8fG51bGw9PT1vfHxudWxsPT09YXx8KGI9byttKihhLW8pLyhuLTEpKSxifHwoYj0xMCsxMDAqbS8obi0xKSk7dmFyIHg9dSttJXkqZCsyKk1hdGguUEkvcypNYXRoLmZsb29yKG0veSk7dnx8KHg9Yy1tJXkqZC0yKk1hdGguUEkvcypNYXRoLmZsb29yKG0veSkpLGdbbV0ueD1yWzBdK01hdGguY29zKHgpKmIsZ1ttXS55PXJbMV0rTWF0aC5zaW4oeCkqYixnW21dLndlaWdodD1oW21dfXJldHVybiB0aGlzLm9uTGF5b3V0RW5kJiZ0aGlzLm9uTGF5b3V0RW5kKCkse25vZGVzOmcsZWRnZXM6dGhpcy5lZGdlc319dGhpcy5vbkxheW91dEVuZCYmdGhpcy5vbkxheW91dEVuZCgpfX0se2tleTpcInRvcG9sb2d5T3JkZXJpbmdcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF0sZT10aGlzLG49ZS5kZWdyZWVzLHI9ZS5lZGdlcyxpPWUubm9kZXMsbz1xbihpKSxhPWUubm9kZU1hcCxzPVtvWzBdXSx1PVtpWzBdXSxjPVtdLGY9aS5sZW5ndGg7Y1swXT0hMCxSaShvLHIsYSx0KTt2YXIgbD0wO3JldHVybiBvLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7aWYoMCE9PWUpaWYoZSE9PWYtMSYmbltlXT09PW5bZSsxXSYmIUxpKHNbbF0sdCxyKXx8Y1tlXSl7Zm9yKHZhciBoPXNbbF0uY2hpbGRyZW4sZD0hMSxwPTA7cDxoLmxlbmd0aDtwKyspe3ZhciBnPWFbaFtwXV07aWYobltnXT09PW5bZV0mJiFjW2ddKXtzLnB1c2gob1tnXSksdS5wdXNoKGlbYVtvW2ddLmlkXV0pLGNbZ109ITAsZD0hMDticmVha319Zm9yKHZhciB2PTA7IWQmJihjW3ZdfHwocy5wdXNoKG9bdl0pLHUucHVzaChpW2Fbb1t2XS5pZF1dKSxjW3ZdPSEwLGQ9ITApLCsrdiE9PWYpOyk7fWVsc2Ugcy5wdXNoKHQpLHUucHVzaChpW2FbdC5pZF1dKSxjW2VdPSEwLGwrK30pKSx1fX0se2tleTpcImRlZ3JlZU9yZGVyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm5vZGVzLGU9W10sbj10aGlzLmRlZ3JlZXM7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXt0LmRlZ3JlZT1uW3JdLGUucHVzaCh0KX0pKSxlLnNvcnQoQmkpLGV9fSx7a2V5OlwiZ2V0VHlwZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuXCJjaXJjdWxhclwifX1dKSYmSWkoZS5wcm90b3R5cGUsbiksciYmSWkoZSxyKSxvfShRbiksRmk9bigxNjkpLFVpPW4ubihGaSk7ZnVuY3Rpb24gemkodCl7cmV0dXJuKHppPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBWaSh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gV2kodCxlKXtyZXR1cm4oV2k9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIFhpKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9SGkodCk7aWYoZSl7dmFyIGk9SGkodGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIFlpKHRoaXMsbil9fWZ1bmN0aW9uIFlpKHQsZSl7cmV0dXJuIWV8fFwib2JqZWN0XCIhPT16aShlKSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZT9mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4gdH0odCk6ZX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4oSGk9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfXZhciBxaT1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJldpKHQsZSl9KG8sdCk7dmFyIGUsbixyLGk9WGkobyk7ZnVuY3Rpb24gbyh0KXt2YXIgZTtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLG8pLChlPWkuY2FsbCh0aGlzKSkucmFua2Rpcj1cIlRCXCIsZS5ub2Rlc2VwPTUwLGUucmFua3NlcD01MCxlLmNvbnRyb2xQb2ludHM9ITEsZS5zb3J0QnlDb21ibz0hMSxlLm5vZGVzPVtdLGUuZWRnZXM9W10sZS5vbkxheW91dEVuZD1mdW5jdGlvbigpe30sZS51cGRhdGVDZmcodCksZX1yZXR1cm4gZT1vLChuPVt7a2V5OlwiZ2V0RGVmYXVsdENmZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3JhbmtkaXI6XCJUQlwiLGFsaWduOnZvaWQgMCxub2RlU2l6ZTp2b2lkIDAsbm9kZXNlcEZ1bmM6dm9pZCAwLHJhbmtzZXBGdW5jOnZvaWQgMCxub2Rlc2VwOjUwLHJhbmtzZXA6NTAsY29udHJvbFBvaW50czohMX19fSx7a2V5OlwiZXhlY3V0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQubm9kZXMsbj10Lm5vZGVTaXplLHI9dC5yYW5rZGlyO2lmKGUpe3ZhciBpLG89dC5lZGdlc3x8W10sYT1uZXcgVWkuYS5ncmFwaGxpYi5HcmFwaDtpPW4/Rm4obik/ZnVuY3Rpb24oKXtyZXR1cm4gbn06ZnVuY3Rpb24oKXtyZXR1cm5bbixuXX06ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2l6ZT9Gbih0LnNpemUpP3Quc2l6ZTpbdC5zaXplLHQuc2l6ZV06WzQwLDQwXX07dmFyIHMsdT1LaSh0Lm5vZGVzZXBGdW5jLHQubm9kZXNlcCw1MCksYz1LaSh0LnJhbmtzZXBGdW5jLHQucmFua3NlcCw1MCk7cmV0dXJuXCJMUlwiIT09ciYmXCJSTFwiIT09cnx8KHU9S2kodC5yYW5rc2VwRnVuYyx0LnJhbmtzZXAsNTApLGM9S2kodC5ub2Rlc2VwRnVuYyx0Lm5vZGVzZXAsNTApKSxhLnNldERlZmF1bHRFZGdlTGFiZWwoKGZ1bmN0aW9uKCl7cmV0dXJue319KSksYS5zZXRHcmFwaCh0KSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWkodCksbj1jKHQpLHI9dSh0KSxvPWVbMF0rMipyLHM9ZVsxXSsyKm47YS5zZXROb2RlKHQuaWQse3dpZHRoOm8saGVpZ2h0OnN9KX0pKSxvLmZvckVhY2goKGZ1bmN0aW9uKHQpe2Euc2V0RWRnZSh0LnNvdXJjZSx0LnRhcmdldCx7d2VpZ2h0OnQud2VpZ2h0fHwxfSl9KSksVWkuYS5sYXlvdXQoYSksYS5ub2RlcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3M9YS5ub2RlKHQpO3ZhciBuPWUuZmluZEluZGV4KChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PXR9KSk7ZVtuXS54PXMueCxlW25dLnk9cy55fSkpLGEuZWRnZXMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtzPWEuZWRnZShlKTt2YXIgbj1vLmZpbmRJbmRleCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuc291cmNlPT09ZS52JiZ0LnRhcmdldD09PWUud30pKTt0LmNvbnRyb2xQb2ludHMmJlwibG9vcFwiIT09b1tuXS50eXBlJiYob1tuXS5jb250cm9sUG9pbnRzPXMucG9pbnRzLnNsaWNlKDEscy5wb2ludHMubGVuZ3RoLTEpKX0pKSx0LnNvcnRCeUNvbWJvJiZ0LnNvcnRMZXZlbChcImNvbWJvSWRcIiksdC5vbkxheW91dEVuZCYmdC5vbkxheW91dEVuZCgpLHtub2RlczplLGVkZ2VzOm99fX19LHtrZXk6XCJzb3J0TGV2ZWxcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZS5ub2RlcyxyPXt9O24uZm9yRWFjaCgoZnVuY3Rpb24odCl7clt0LnldfHwoclt0LnldPXt5OnQueSxub2RlczpbXX0pLHJbdC55XS5ub2Rlcy5wdXNoKHQpfSkpLE9iamVjdC5rZXlzKHIpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPXJbbl0ubm9kZXMsbz1pLmxlbmd0aCxhPXt9O2lmKGkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5jb21ib0lkO2FbZV18fChhW2VdPXt4OjAseTowLGNvdW50OjB9KSxhW2VdLngrPXQueCxhW2VdLnkrPXQueSxhW2VdLmNvdW50Kyt9KSksT2JqZWN0LmtleXMoYSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7YVt0XS54Lz1hW3RdLmNvdW50LGFbdF0ueS89YVt0XS5jb3VudH0pKSwxIT09byl7dmFyIHM9aS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LngtZS54fSkpLHU9c1swXS54LGM9KHNbby0xXS54LXUpLyhvLTEpO2kuc29ydCgoZnVuY3Rpb24oZSxuKXt2YXIgcj1lW3RdfHxcInVuZGVmaW5lZFwiLGk9blt0XXx8XCJ1bmRlZmluZWRcIjtyZXR1cm4gcjxpPy0xOnI+aT8xOjB9KSkuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0Lng9dStlKmN9KSl9ZWxzZSBlLm9uTGF5b3V0RW5kJiZlLm9uTGF5b3V0RW5kKCl9KSl9fSx7a2V5OlwiZ2V0VHlwZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuXCJkYWdyZVwifX1dKSYmVmkoZS5wcm90b3R5cGUsbiksciYmVmkoZSxyKSxvfShRbik7ZnVuY3Rpb24gS2kodCxlLG4pe3JldHVybiB0fHwoVW4oZSk/ZnVuY3Rpb24oKXtyZXR1cm4gZX06ZnVuY3Rpb24oKXtyZXR1cm4gbn0pfXZhciBaaT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIFFpKHQpe3JldHVybiBaaS5jYWxsKHQpLmVuZHNXaXRoKFwiQXJyYXldXCIpfXZhciBKaT1mdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIVFpKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5XCIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHlcIik7dmFyIG49ZS5mcm9tSW5kZXgscj12b2lkIDA9PT1uPzA6bixpPWUudG9JbmRleCxvPXZvaWQgMD09PWk/dC5sZW5ndGg6aTtpZihyPDB8fHI+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgRXJyb3IoXCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aFwiKTtpZihvPD1yfHxvPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihvKSl0aHJvdyBuZXcgRXJyb3IoXCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aFwiKTtmb3IodmFyIGE9dFtyXSxzPXIrMTtzPG87cysrKXRbc10+YSYmKGE9dFtzXSk7cmV0dXJuIGF9O3ZhciAkaT1mdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIVFpKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5XCIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHlcIik7dmFyIG49ZS5mcm9tSW5kZXgscj12b2lkIDA9PT1uPzA6bixpPWUudG9JbmRleCxvPXZvaWQgMD09PWk/dC5sZW5ndGg6aTtpZihyPDB8fHI+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgRXJyb3IoXCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aFwiKTtpZihvPD1yfHxvPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihvKSl0aHJvdyBuZXcgRXJyb3IoXCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aFwiKTtmb3IodmFyIGE9dFtyXSxzPXIrMTtzPG87cysrKXRbc108YSYmKGE9dFtzXSk7cmV0dXJuIGF9O3ZhciB0bz1mdW5jdGlvbih0KXt2YXIgZSxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighUWkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcImlucHV0IG11c3QgYmUgYW4gYXJyYXlcIik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eVwiKTtpZih2b2lkIDAhPT1uLm91dHB1dCl7aWYoIVFpKG4ub3V0cHV0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZFwiKTtlPW4ub3V0cHV0fWVsc2UgZT1uZXcgQXJyYXkodC5sZW5ndGgpO3ZhciByPSRpKHQpLGk9SmkodCk7aWYocj09PWkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJtaW5pbXVtIGFuZCBtYXhpbXVtIGlucHV0IHZhbHVlcyBhcmUgZXF1YWwuIENhbm5vdCByZXNjYWxlIGEgY29uc3RhbnQgYXJyYXlcIik7dmFyIG89bi5taW4sYT12b2lkIDA9PT1vP24uYXV0b01pbk1heD9yOjA6byxzPW4ubWF4LHU9dm9pZCAwPT09cz9uLmF1dG9NaW5NYXg/aToxOnM7aWYoYT49dSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm1pbiBvcHRpb24gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4IG9wdGlvblwiKTtmb3IodmFyIGM9KHUtYSkvKGktciksZj0wO2Y8dC5sZW5ndGg7ZisrKWVbZl09KHRbZl0tcikqYythO3JldHVybiBlfSxlbz1cIiBcIi5yZXBlYXQoMiksbm89XCIgXCIucmVwZWF0KDQpO2Z1bmN0aW9uIHJvKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxuPWUubWF4Um93cyxyPXZvaWQgMD09PW4/MTU6bixpPWUubWF4Q29sdW1ucyxvPXZvaWQgMD09PWk/MTA6aSxhPWUubWF4TnVtU2l6ZSxzPXZvaWQgMD09PWE/ODphO3JldHVyblwiXCIuY29uY2F0KHQuY29uc3RydWN0b3IubmFtZSxcIiB7XFxuXCIpLmNvbmNhdChlbyxcIltcXG5cIikuY29uY2F0KG5vKS5jb25jYXQoaW8odCxyLG8scyksXCJcXG5cIikuY29uY2F0KGVvLFwiXVxcblwiKS5jb25jYXQoZW8sXCJyb3dzOiBcIikuY29uY2F0KHQucm93cyxcIlxcblwiKS5jb25jYXQoZW8sXCJjb2x1bW5zOiBcIikuY29uY2F0KHQuY29sdW1ucyxcIlxcbn1cIil9ZnVuY3Rpb24gaW8odCxlLG4scil7Zm9yKHZhciBpPXQucm93cyxvPXQuY29sdW1ucyxhPU1hdGgubWluKGksZSkscz1NYXRoLm1pbihvLG4pLHU9W10sYz0wO2M8YTtjKyspe2Zvcih2YXIgZj1bXSxsPTA7bDxzO2wrKylmLnB1c2gob28odC5nZXQoYyxsKSxyKSk7dS5wdXNoKFwiXCIuY29uY2F0KGYuam9pbihcIiBcIikpKX1yZXR1cm4gcyE9PW8mJih1W3UubGVuZ3RoLTFdKz1cIiAuLi4gXCIuY29uY2F0KG8tbixcIiBtb3JlIGNvbHVtbnNcIikpLGEhPT1pJiZ1LnB1c2goXCIuLi4gXCIuY29uY2F0KGktZSxcIiBtb3JlIHJvd3NcIikpLHUuam9pbihcIlxcblwiLmNvbmNhdChubykpfWZ1bmN0aW9uIG9vKHQsZSl7dmFyIG49U3RyaW5nKHQpO2lmKG4ubGVuZ3RoPD1lKXJldHVybiBuLnBhZEVuZChlLFwiIFwiKTt2YXIgcj10LnRvUHJlY2lzaW9uKGUtMik7aWYoci5sZW5ndGg8PWUpcmV0dXJuIHI7dmFyIGk9dC50b0V4cG9uZW50aWFsKGUtMiksbz1pLmluZGV4T2YoXCJlXCIpLGE9aS5zbGljZShvKTtyZXR1cm4gaS5zbGljZSgwLGUtYS5sZW5ndGgpK2F9ZnVuY3Rpb24gYW8odCl7cmV0dXJuKGFvPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBzbyh0LGUsbil7dmFyIHI9bj90LnJvd3M6dC5yb3dzLTE7aWYoZTwwfHxlPnIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlXCIpfWZ1bmN0aW9uIHVvKHQsZSxuKXt2YXIgcj1uP3QuY29sdW1uczp0LmNvbHVtbnMtMTtpZihlPDB8fGU+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2VcIil9ZnVuY3Rpb24gY28odCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJ2ZWN0b3Igc2l6ZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY29sdW1uc1wiKTtyZXR1cm4gZX1mdW5jdGlvbiBmbyh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzXCIpO3JldHVybiBlfWZ1bmN0aW9uIGxvKHQsZSl7aWYoXCJvYmplY3RcIiE9PWFvKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJ1bmV4cGVjdGVkIHR5cGUgZm9yIHJvdyBpbmRpY2VzXCIpO2lmKGUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGU8MHx8ZT49dC5yb3dzfSkpKXRocm93IG5ldyBSYW5nZUVycm9yKFwicm93IGluZGljZXMgYXJlIG91dCBvZiByYW5nZVwiKTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKXx8KGU9QXJyYXkuZnJvbShlKSksZX1mdW5jdGlvbiBobyh0LGUpe2lmKFwib2JqZWN0XCIhPT1hbyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwidW5leHBlY3RlZCB0eXBlIGZvciBjb2x1bW4gaW5kaWNlc1wiKTtpZihlLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBlPDB8fGU+PXQuY29sdW1uc30pKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImNvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl8fChlPUFycmF5LmZyb20oZSkpLGV9ZnVuY3Rpb24gcG8odCxlLG4scixpKXtpZig1IT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImV4cGVjdGVkIDQgYXJndW1lbnRzXCIpO2lmKHZvKFwic3RhcnRSb3dcIixlKSx2byhcImVuZFJvd1wiLG4pLHZvKFwic3RhcnRDb2x1bW5cIixyKSx2byhcImVuZENvbHVtblwiLGkpLGU+bnx8cj5pfHxlPDB8fGU+PXQucm93c3x8bjwwfHxuPj10LnJvd3N8fHI8MHx8cj49dC5jb2x1bW5zfHxpPDB8fGk+PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlN1Ym1hdHJpeCBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2VcIil9ZnVuY3Rpb24gZ28odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLG49W10scj0wO3I8dDtyKyspbi5wdXNoKGUpO3JldHVybiBufWZ1bmN0aW9uIHZvKHQsZSl7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlwiLmNvbmNhdCh0LFwiIG11c3QgYmUgYSBudW1iZXJcIikpfWZ1bmN0aW9uIHlvKHQpe2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcihcIkVtcHR5IG1hdHJpeCBoYXMgbm8gZWxlbWVudHMgdG8gaW5kZXhcIil9ZnVuY3Rpb24gbW8odCxlLG4pe2Zvcih2YXIgcj10LnJvd3MsaT10LmNvbHVtbnMsbz1bXSxhPTA7YTxyO2ErKyl7Zm9yKHZhciBzPTAsdT0wLGM9MCxmPTA7ZjxpO2YrKylzKz1jPXQuZ2V0KGEsZiktblthXSx1Kz1jKmM7ZT9vLnB1c2goKHUtcypzL2kpLyhpLTEpKTpvLnB1c2goKHUtcypzL2kpL2kpfXJldHVybiBvfWZ1bmN0aW9uIGJvKHQsZSxuKXtmb3IodmFyIHI9dC5yb3dzLGk9dC5jb2x1bW5zLG89W10sYT0wO2E8aTthKyspe2Zvcih2YXIgcz0wLHU9MCxjPTAsZj0wO2Y8cjtmKyspcys9Yz10LmdldChmLGEpLW5bYV0sdSs9YypjO2U/by5wdXNoKCh1LXMqcy9yKS8oci0xKSk6by5wdXNoKCh1LXMqcy9yKS9yKX1yZXR1cm4gb31mdW5jdGlvbiB4byh0LGUsbil7Zm9yKHZhciByPXQucm93cyxpPXQuY29sdW1ucyxvPXIqaSxhPTAscz0wLHU9MCxjPTA7YzxyO2MrKylmb3IodmFyIGY9MDtmPGk7ZisrKWErPXU9dC5nZXQoYyxmKS1uLHMrPXUqdTtyZXR1cm4gZT8ocy1hKmEvbykvKG8tMSk6KHMtYSphL28pL299ZnVuY3Rpb24gd28odCxlKXtmb3IodmFyIG49MDtuPHQucm93cztuKyspZm9yKHZhciByPTA7cjx0LmNvbHVtbnM7cisrKXQuc2V0KG4scix0LmdldChuLHIpLWVbbl0pfWZ1bmN0aW9uIFNvKHQsZSl7Zm9yKHZhciBuPTA7bjx0LnJvd3M7bisrKWZvcih2YXIgcj0wO3I8dC5jb2x1bW5zO3IrKyl0LnNldChuLHIsdC5nZXQobixyKS1lW3JdKX1mdW5jdGlvbiBFbyh0LGUpe2Zvcih2YXIgbj0wO248dC5yb3dzO24rKylmb3IodmFyIHI9MDtyPHQuY29sdW1ucztyKyspdC5zZXQobixyLHQuZ2V0KG4sciktZSl9ZnVuY3Rpb24gX28odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQucm93cztuKyspe2Zvcih2YXIgcj0wLGk9MDtpPHQuY29sdW1ucztpKyspcis9TWF0aC5wb3codC5nZXQobixpKSwyKS8odC5jb2x1bW5zLTEpO2UucHVzaChNYXRoLnNxcnQocikpfXJldHVybiBlfWZ1bmN0aW9uIE9vKHQsZSl7Zm9yKHZhciBuPTA7bjx0LnJvd3M7bisrKWZvcih2YXIgcj0wO3I8dC5jb2x1bW5zO3IrKyl0LnNldChuLHIsdC5nZXQobixyKS9lW25dKX1mdW5jdGlvbiBrbyh0KXtmb3IodmFyIGU9W10sbj0wO248dC5jb2x1bW5zO24rKyl7Zm9yKHZhciByPTAsaT0wO2k8dC5yb3dzO2krKylyKz1NYXRoLnBvdyh0LmdldChpLG4pLDIpLyh0LnJvd3MtMSk7ZS5wdXNoKE1hdGguc3FydChyKSl9cmV0dXJuIGV9ZnVuY3Rpb24gTW8odCxlKXtmb3IodmFyIG49MDtuPHQucm93cztuKyspZm9yKHZhciByPTA7cjx0LmNvbHVtbnM7cisrKXQuc2V0KG4scix0LmdldChuLHIpL2Vbcl0pfWZ1bmN0aW9uIEFvKHQpe2Zvcih2YXIgZT10LnNpemUtMSxuPTAscj0wO3I8dC5jb2x1bW5zO3IrKylmb3IodmFyIGk9MDtpPHQucm93cztpKyspbis9TWF0aC5wb3codC5nZXQoaSxyKSwyKS9lO3JldHVybiBNYXRoLnNxcnQobil9ZnVuY3Rpb24gVG8odCxlKXtmb3IodmFyIG49MDtuPHQucm93cztuKyspZm9yKHZhciByPTA7cjx0LmNvbHVtbnM7cisrKXQuc2V0KG4scix0LmdldChuLHIpL2UpfWZ1bmN0aW9uIENvKHQsZSl7cmV0dXJuKENvPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiBJbyh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPWpvKHQpO2lmKGUpe3ZhciBpPWpvKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBQbyh0aGlzLG4pfX1mdW5jdGlvbiBQbyh0LGUpe3JldHVybiFlfHxcIm9iamVjdFwiIT09RG8oZSkmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9KHQpOmV9ZnVuY3Rpb24gam8odCl7cmV0dXJuKGpvPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBEbyh0KXtyZXR1cm4oRG89XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIE5vKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBSbyh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gTG8odCxlLG4pe3JldHVybiBlJiZSbyh0LnByb3RvdHlwZSxlKSxuJiZSbyh0LG4pLHR9dmFyIEJvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe05vKHRoaXMsdCl9cmV0dXJuIExvKHQsW3trZXk6XCJzaXplXCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm93cyp0aGlzLmNvbHVtbnN9fSx7a2V5OlwiYXBwbHlcIix2YWx1ZTpmdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0LmNhbGwodGhpcyxlLG4pO3JldHVybiB0aGlzfX0se2tleTpcInRvMURBcnJheVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXQucHVzaCh0aGlzLmdldChlLG4pKTtyZXR1cm4gdH19LHtrZXk6XCJ0bzJEQXJyYXlcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLnJvd3M7ZSsrKXt0LnB1c2goW10pO2Zvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0W2VdLnB1c2godGhpcy5nZXQoZSxuKSl9cmV0dXJuIHR9fSx7a2V5OlwidG9KU09OXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50bzJEQXJyYXkoKX19LHtrZXk6XCJpc1Jvd1ZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N9fSx7a2V5OlwiaXNDb2x1bW5WZWN0b3JcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5jb2x1bW5zfX0se2tleTpcImlzVmVjdG9yXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMucm93c3x8MT09PXRoaXMuY29sdW1uc319LHtrZXk6XCJpc1NxdWFyZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm93cz09PXRoaXMuY29sdW1uc319LHtrZXk6XCJpc0VtcHR5XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMucm93c3x8MD09PXRoaXMuY29sdW1uc319LHtrZXk6XCJpc1N5bW1ldHJpY1wiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc1NxdWFyZSgpKXtmb3IodmFyIHQ9MDt0PHRoaXMucm93czt0KyspZm9yKHZhciBlPTA7ZTw9dDtlKyspaWYodGhpcy5nZXQodCxlKSE9PXRoaXMuZ2V0KGUsdCkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9fSx7a2V5OlwiaXNFY2hlbG9uRm9ybVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wLG49LTEscj0hMCxpPSExO3Q8dGhpcy5yb3dzJiZyOyl7Zm9yKGU9MCxpPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PWk7KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5uPyhpPSEwLG49ZSk6KHI9ITEsaT0hMCk7dCsrfXJldHVybiByfX0se2tleTpcImlzUmVkdWNlZEVjaGVsb25Gb3JtXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTAsbj0tMSxyPSEwLGk9ITE7dDx0aGlzLnJvd3MmJnI7KXtmb3IoZT0wLGk9ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09aTspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPm4/KGk9ITAsbj1lKToocj0hMSxpPSEwKTtmb3IodmFyIG89ZSsxO288dGhpcy5yb3dzO28rKykwIT09dGhpcy5nZXQodCxvKSYmKHI9ITEpO3QrK31yZXR1cm4gcn19LHtrZXk6XCJlY2hlbG9uRm9ybVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuY2xvbmUoKSxlPTAsbj0wO2U8dC5yb3dzJiZuPHQuY29sdW1uczspe2Zvcih2YXIgcj1lLGk9ZTtpPHQucm93cztpKyspdC5nZXQoaSxuKT50LmdldChyLG4pJiYocj1pKTtpZigwPT09dC5nZXQocixuKSluKys7ZWxzZXt0LnN3YXBSb3dzKGUscik7Zm9yKHZhciBvPXQuZ2V0KGUsbiksYT1uO2E8dC5jb2x1bW5zO2ErKyl0LnNldChlLGEsdC5nZXQoZSxhKS9vKTtmb3IodmFyIHM9ZSsxO3M8dC5yb3dzO3MrKyl7dmFyIHU9dC5nZXQocyxuKS90LmdldChlLG4pO3Quc2V0KHMsbiwwKTtmb3IodmFyIGM9bisxO2M8dC5jb2x1bW5zO2MrKyl0LnNldChzLGMsdC5nZXQocyxjKS10LmdldChlLGMpKnUpfWUrKyxuKyt9fXJldHVybiB0fX0se2tleTpcInJlZHVjZWRFY2hlbG9uRm9ybVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZWNoZWxvbkZvcm0oKSxlPXQuY29sdW1ucyxuPXQucm93cyxyPW4tMTtyPj0wOylpZigwPT09dC5tYXhSb3cocikpci0tO2Vsc2V7Zm9yKHZhciBpPTAsbz0hMTtpPG4mJiExPT09bzspMT09PXQuZ2V0KHIsaSk/bz0hMDppKys7Zm9yKHZhciBhPTA7YTxyO2ErKylmb3IodmFyIHM9dC5nZXQoYSxpKSx1PWk7dTxlO3UrKyl7dmFyIGM9dC5nZXQoYSx1KS1zKnQuZ2V0KHIsdSk7dC5zZXQoYSx1LGMpfXItLX1yZXR1cm4gdH19LHtrZXk6XCJzZXRcIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcInNldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZFwiKX19LHtrZXk6XCJnZXRcIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcImdldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZFwiKX19LHtrZXk6XCJyZXBlYXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtpZihcIm9iamVjdFwiIT09RG8odCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3RcIik7dmFyIGU9dC5yb3dzLG49dm9pZCAwPT09ZT8xOmUscj10LmNvbHVtbnMsaT12b2lkIDA9PT1yPzE6cjtpZighTnVtYmVyLmlzSW50ZWdlcihuKXx8bjw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKFwicm93cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlclwiKTtpZighTnVtYmVyLmlzSW50ZWdlcihpKXx8aTw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiY29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlclwiKTtmb3IodmFyIG89bmV3IHpvKHRoaXMucm93cypuLHRoaXMuY29sdW1ucyppKSxhPTA7YTxuO2ErKylmb3IodmFyIHM9MDtzPGk7cysrKW8uc2V0U3ViTWF0cml4KHRoaXMsdGhpcy5yb3dzKmEsdGhpcy5jb2x1bW5zKnMpO3JldHVybiBvfX0se2tleTpcImZpbGxcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0KTtyZXR1cm4gdGhpc319LHtrZXk6XCJuZWdcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11bFMoLTEpfX0se2tleTpcImdldFJvd1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3NvKHRoaXMsdCk7Zm9yKHZhciBlPVtdLG49MDtuPHRoaXMuY29sdW1ucztuKyspZS5wdXNoKHRoaXMuZ2V0KHQsbikpO3JldHVybiBlfX0se2tleTpcImdldFJvd1ZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB6by5yb3dWZWN0b3IodGhpcy5nZXRSb3codCkpfX0se2tleTpcInNldFJvd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7c28odGhpcyx0KSxlPWNvKHRoaXMsZSk7Zm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbixlW25dKTtyZXR1cm4gdGhpc319LHtrZXk6XCJzd2FwUm93c1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7c28odGhpcyx0KSxzbyh0aGlzLGUpO2Zvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl7dmFyIHI9dGhpcy5nZXQodCxuKTt0aGlzLnNldCh0LG4sdGhpcy5nZXQoZSxuKSksdGhpcy5zZXQoZSxuLHIpfXJldHVybiB0aGlzfX0se2tleTpcImdldENvbHVtblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3VvKHRoaXMsdCk7Zm9yKHZhciBlPVtdLG49MDtuPHRoaXMucm93cztuKyspZS5wdXNoKHRoaXMuZ2V0KG4sdCkpO3JldHVybiBlfX0se2tleTpcImdldENvbHVtblZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB6by5jb2x1bW5WZWN0b3IodGhpcy5nZXRDb2x1bW4odCkpfX0se2tleTpcInNldENvbHVtblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dW8odGhpcyx0KSxlPWZvKHRoaXMsZSk7Zm9yKHZhciBuPTA7bjx0aGlzLnJvd3M7bisrKXRoaXMuc2V0KG4sdCxlW25dKTtyZXR1cm4gdGhpc319LHtrZXk6XCJzd2FwQ29sdW1uc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dW8odGhpcyx0KSx1byh0aGlzLGUpO2Zvcih2YXIgbj0wO248dGhpcy5yb3dzO24rKyl7dmFyIHI9dGhpcy5nZXQobix0KTt0aGlzLnNldChuLHQsdGhpcy5nZXQobixlKSksdGhpcy5zZXQobixlLHIpfXJldHVybiB0aGlzfX0se2tleTpcImFkZFJvd1ZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9Y28odGhpcyx0KTtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pK3Rbbl0pO3JldHVybiB0aGlzfX0se2tleTpcInN1YlJvd1ZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9Y28odGhpcyx0KTtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pLXRbbl0pO3JldHVybiB0aGlzfX0se2tleTpcIm11bFJvd1ZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9Y28odGhpcyx0KTtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pKnRbbl0pO3JldHVybiB0aGlzfX0se2tleTpcImRpdlJvd1ZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9Y28odGhpcyx0KTtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pL3Rbbl0pO3JldHVybiB0aGlzfX0se2tleTpcImFkZENvbHVtblZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9Zm8odGhpcyx0KTtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pK3RbZV0pO3JldHVybiB0aGlzfX0se2tleTpcInN1YkNvbHVtblZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9Zm8odGhpcyx0KTtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pLXRbZV0pO3JldHVybiB0aGlzfX0se2tleTpcIm11bENvbHVtblZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9Zm8odGhpcyx0KTtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pKnRbZV0pO3JldHVybiB0aGlzfX0se2tleTpcImRpdkNvbHVtblZlY3RvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9Zm8odGhpcyx0KTtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pL3RbZV0pO3JldHVybiB0aGlzfX0se2tleTpcIm11bFJvd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7c28odGhpcyx0KTtmb3IodmFyIG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbikqZSk7cmV0dXJuIHRoaXN9fSx7a2V5OlwibXVsQ29sdW1uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt1byh0aGlzLHQpO2Zvcih2YXIgbj0wO248dGhpcy5yb3dzO24rKyl0aGlzLnNldChuLHQsdGhpcy5nZXQobix0KSplKTtyZXR1cm4gdGhpc319LHtrZXk6XCJtYXhcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47Zm9yKHZhciB0PXRoaXMuZ2V0KDAsMCksZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQoZSxuKT50JiYodD10aGlzLmdldChlLG4pKTtyZXR1cm4gdH19LHtrZXk6XCJtYXhJbmRleFwiLHZhbHVlOmZ1bmN0aW9uKCl7eW8odGhpcyk7Zm9yKHZhciB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXSxuPTA7bjx0aGlzLnJvd3M7bisrKWZvcih2YXIgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChuLHIpPnQmJih0PXRoaXMuZ2V0KG4sciksZVswXT1uLGVbMV09cik7cmV0dXJuIGV9fSx7a2V5OlwibWluXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2Zvcih2YXIgdD10aGlzLmdldCgwLDApLGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KGUsbik8dCYmKHQ9dGhpcy5nZXQoZSxuKSk7cmV0dXJuIHR9fSx7a2V5OlwibWluSW5kZXhcIix2YWx1ZTpmdW5jdGlvbigpe3lvKHRoaXMpO2Zvcih2YXIgdD10aGlzLmdldCgwLDApLGU9WzAsMF0sbj0wO248dGhpcy5yb3dzO24rKylmb3IodmFyIHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQobixyKTx0JiYodD10aGlzLmdldChuLHIpLGVbMF09bixlWzFdPXIpO3JldHVybiBlfX0se2tleTpcIm1heFJvd1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHNvKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtmb3IodmFyIGU9dGhpcy5nZXQodCwwKSxuPTE7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHQsbik+ZSYmKGU9dGhpcy5nZXQodCxuKSk7cmV0dXJuIGV9fSx7a2V5OlwibWF4Um93SW5kZXhcIix2YWx1ZTpmdW5jdGlvbih0KXtzbyh0aGlzLHQpLHlvKHRoaXMpO2Zvcih2YXIgZT10aGlzLmdldCh0LDApLG49W3QsMF0scj0xO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldCh0LHIpPmUmJihlPXRoaXMuZ2V0KHQsciksblsxXT1yKTtyZXR1cm4gbn19LHtrZXk6XCJtaW5Sb3dcIix2YWx1ZTpmdW5jdGlvbih0KXtpZihzbyh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47Zm9yKHZhciBlPXRoaXMuZ2V0KHQsMCksbj0xO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldCh0LG4pPGUmJihlPXRoaXMuZ2V0KHQsbikpO3JldHVybiBlfX0se2tleTpcIm1pblJvd0luZGV4XCIsdmFsdWU6ZnVuY3Rpb24odCl7c28odGhpcyx0KSx5byh0aGlzKTtmb3IodmFyIGU9dGhpcy5nZXQodCwwKSxuPVt0LDBdLHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKTxlJiYoZT10aGlzLmdldCh0LHIpLG5bMV09cik7cmV0dXJuIG59fSx7a2V5OlwibWF4Q29sdW1uXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodW8odGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2Zvcih2YXIgZT10aGlzLmdldCgwLHQpLG49MTtuPHRoaXMucm93cztuKyspdGhpcy5nZXQobix0KT5lJiYoZT10aGlzLmdldChuLHQpKTtyZXR1cm4gZX19LHtrZXk6XCJtYXhDb2x1bW5JbmRleFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3VvKHRoaXMsdCkseW8odGhpcyk7Zm9yKHZhciBlPXRoaXMuZ2V0KDAsdCksbj1bMCx0XSxyPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk+ZSYmKGU9dGhpcy5nZXQocix0KSxuWzBdPXIpO3JldHVybiBufX0se2tleTpcIm1pbkNvbHVtblwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHVvKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtmb3IodmFyIGU9dGhpcy5nZXQoMCx0KSxuPTE7bjx0aGlzLnJvd3M7bisrKXRoaXMuZ2V0KG4sdCk8ZSYmKGU9dGhpcy5nZXQobix0KSk7cmV0dXJuIGV9fSx7a2V5OlwibWluQ29sdW1uSW5kZXhcIix2YWx1ZTpmdW5jdGlvbih0KXt1byh0aGlzLHQpLHlvKHRoaXMpO2Zvcih2YXIgZT10aGlzLmdldCgwLHQpLG49WzAsdF0scj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPGUmJihlPXRoaXMuZ2V0KHIsdCksblswXT1yKTtyZXR1cm4gbn19LHtrZXk6XCJkaWFnXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT1bXSxuPTA7bjx0O24rKyllLnB1c2godGhpcy5nZXQobixuKSk7cmV0dXJuIGV9fSx7a2V5Olwibm9ybVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOlwiZnJvYmVuaXVzXCIsZT0wO2lmKFwibWF4XCI9PT10KXJldHVybiB0aGlzLm1heCgpO2lmKFwiZnJvYmVuaXVzXCI9PT10KXtmb3IodmFyIG49MDtuPHRoaXMucm93cztuKyspZm9yKHZhciByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUrPXRoaXMuZ2V0KG4scikqdGhpcy5nZXQobixyKTtyZXR1cm4gTWF0aC5zcXJ0KGUpfXRocm93IG5ldyBSYW5nZUVycm9yKFwidW5rbm93biBub3JtIHR5cGU6IFwiLmNvbmNhdCh0KSl9fSx7a2V5OlwiY3VtdWxhdGl2ZVN1bVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuY29sdW1ucztuKyspdCs9dGhpcy5nZXQoZSxuKSx0aGlzLnNldChlLG4sdCk7cmV0dXJuIHRoaXN9fSx7a2V5OlwiZG90XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dC5pc01hdHJpeChlKSYmKGU9ZS50bzFEQXJyYXkoKSk7dmFyIG49dGhpcy50bzFEQXJyYXkoKTtpZihuLmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwidmVjdG9ycyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplXCIpO2Zvcih2YXIgcj0wLGk9MDtpPG4ubGVuZ3RoO2krKylyKz1uW2ldKmVbaV07cmV0dXJuIHJ9fSx7a2V5OlwibW11bFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9em8uY2hlY2tNYXRyaXgodCk7Zm9yKHZhciBlPXRoaXMucm93cyxuPXRoaXMuY29sdW1ucyxyPXQuY29sdW1ucyxpPW5ldyB6byhlLHIpLG89bmV3IEZsb2F0NjRBcnJheShuKSxhPTA7YTxyO2ErKyl7Zm9yKHZhciBzPTA7czxuO3MrKylvW3NdPXQuZ2V0KHMsYSk7Zm9yKHZhciB1PTA7dTxlO3UrKyl7Zm9yKHZhciBjPTAsZj0wO2Y8bjtmKyspYys9dGhpcy5nZXQodSxmKSpvW2ZdO2kuc2V0KHUsYSxjKX19cmV0dXJuIGl9fSx7a2V5Olwic3RyYXNzZW4yeDJcIix2YWx1ZTpmdW5jdGlvbih0KXt0PXpvLmNoZWNrTWF0cml4KHQpO3ZhciBlPW5ldyB6bygyLDIpLG49dGhpcy5nZXQoMCwwKSxyPXQuZ2V0KDAsMCksaT10aGlzLmdldCgwLDEpLG89dC5nZXQoMCwxKSxhPXRoaXMuZ2V0KDEsMCkscz10LmdldCgxLDApLHU9dGhpcy5nZXQoMSwxKSxjPXQuZ2V0KDEsMSksZj0obit1KSoocitjKSxsPShhK3UpKnIsaD1uKihvLWMpLGQ9dSoocy1yKSxwPShuK2kpKmMsZz1mK2QtcCsoaS11KSoocytjKSx2PWgrcCx5PWwrZCxtPWYtbCtoKyhhLW4pKihyK28pO3JldHVybiBlLnNldCgwLDAsZyksZS5zZXQoMCwxLHYpLGUuc2V0KDEsMCx5KSxlLnNldCgxLDEsbSksZX19LHtrZXk6XCJzdHJhc3NlbjN4M1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9em8uY2hlY2tNYXRyaXgodCk7dmFyIGU9bmV3IHpvKDMsMyksbj10aGlzLmdldCgwLDApLHI9dGhpcy5nZXQoMCwxKSxpPXRoaXMuZ2V0KDAsMiksbz10aGlzLmdldCgxLDApLGE9dGhpcy5nZXQoMSwxKSxzPXRoaXMuZ2V0KDEsMiksdT10aGlzLmdldCgyLDApLGM9dGhpcy5nZXQoMiwxKSxmPXRoaXMuZ2V0KDIsMiksbD10LmdldCgwLDApLGg9dC5nZXQoMCwxKSxkPXQuZ2V0KDAsMikscD10LmdldCgxLDApLGc9dC5nZXQoMSwxKSx2PXQuZ2V0KDEsMikseT10LmdldCgyLDApLG09dC5nZXQoMiwxKSxiPXQuZ2V0KDIsMikseD0obi1vKSooLWgrZyksdz0oLW4rbythKSoobC1oK2cpLFM9KG8rYSkqKC1sK2gpLEU9bipsLF89KC1uK3UrYykqKGwtZCt2KSxPPSgtbit1KSooZC12KSxrPSh1K2MpKigtbCtkKSxNPSgtaStjK2YpKihnK3ktbSksQT0oaS1mKSooZy1tKSxUPWkqeSxDPShjK2YpKigteSttKSxJPSgtaSthK3MpKih2K3ktYiksUD0oaS1zKSoodi1iKSxqPShhK3MpKigteStiKSxEPUUrVCtyKnAsTj0obityK2ktby1hLWMtZikqZyt3K1MrRStNK1QrQyxSPUUrXytrKyhuK3IraS1hLXMtdS1jKSp2K1QrSStqLEw9eCthKigtbCtoK3AtZy12LXkrYikrdytFK1QrSStQLEI9eCt3K1MrRStzKm0sRz1UK0krUCtqK28qZCxGPUUrXytPK2MqKC1sK2QrcC1nLXYteSttKStNK0ErVCxVPU0rQStUK0MrdSpoLHo9RStfK08raytmKmI7cmV0dXJuIGUuc2V0KDAsMCxEKSxlLnNldCgwLDEsTiksZS5zZXQoMCwyLFIpLGUuc2V0KDEsMCxMKSxlLnNldCgxLDEsQiksZS5zZXQoMSwyLEcpLGUuc2V0KDIsMCxGKSxlLnNldCgyLDEsVSksZS5zZXQoMiwyLHopLGV9fSx7a2V5OlwibW11bFN0cmFzc2VuXCIsdmFsdWU6ZnVuY3Rpb24oZSl7ZT16by5jaGVja01hdHJpeChlKTt2YXIgbj10aGlzLmNsb25lKCkscj1uLnJvd3MsaT1uLmNvbHVtbnMsbz1lLnJvd3MsYT1lLmNvbHVtbnM7ZnVuY3Rpb24gcyhlLG4scil7dmFyIGk9ZS5yb3dzLG89ZS5jb2x1bW5zO2lmKGk9PT1uJiZvPT09cilyZXR1cm4gZTt2YXIgYT10Lnplcm9zKG4scik7cmV0dXJuIGE9YS5zZXRTdWJNYXRyaXgoZSwwLDApfWkhPT1vJiZjb25zb2xlLndhcm4oXCJNdWx0aXBseWluZyBcIi5jb25jYXQocixcIiB4IFwiKS5jb25jYXQoaSxcIiBhbmQgXCIpLmNvbmNhdChvLFwiIHggXCIpLmNvbmNhdChhLFwiIG1hdHJpeDogZGltZW5zaW9ucyBkbyBub3QgbWF0Y2guXCIpKTt2YXIgdT1NYXRoLm1heChyLG8pLGM9TWF0aC5tYXgoaSxhKTtyZXR1cm4gZnVuY3Rpb24gZShuLHIsaSxvKXtpZihpPD01MTJ8fG88PTUxMilyZXR1cm4gbi5tbXVsKHIpO2klMj09MSYmbyUyPT0xPyhuPXMobixpKzEsbysxKSxyPXMocixpKzEsbysxKSk6aSUyPT0xPyhuPXMobixpKzEsbykscj1zKHIsaSsxLG8pKTpvJTI9PTEmJihuPXMobixpLG8rMSkscj1zKHIsaSxvKzEpKTt2YXIgYT1wYXJzZUludChuLnJvd3MvMiwxMCksdT1wYXJzZUludChuLmNvbHVtbnMvMiwxMCksYz1uLnN1Yk1hdHJpeCgwLGEtMSwwLHUtMSksZj1yLnN1Yk1hdHJpeCgwLGEtMSwwLHUtMSksbD1uLnN1Yk1hdHJpeCgwLGEtMSx1LG4uY29sdW1ucy0xKSxoPXIuc3ViTWF0cml4KDAsYS0xLHUsci5jb2x1bW5zLTEpLGQ9bi5zdWJNYXRyaXgoYSxuLnJvd3MtMSwwLHUtMSkscD1yLnN1Yk1hdHJpeChhLHIucm93cy0xLDAsdS0xKSxnPW4uc3ViTWF0cml4KGEsbi5yb3dzLTEsdSxuLmNvbHVtbnMtMSksdj1yLnN1Yk1hdHJpeChhLHIucm93cy0xLHUsci5jb2x1bW5zLTEpLHk9ZSh0LmFkZChjLGcpLHQuYWRkKGYsdiksYSx1KSxtPWUodC5hZGQoZCxnKSxmLGEsdSksYj1lKGMsdC5zdWIoaCx2KSxhLHUpLHg9ZShnLHQuc3ViKHAsZiksYSx1KSx3PWUodC5hZGQoYyxsKSx2LGEsdSksUz1lKHQuc3ViKGQsYyksdC5hZGQoZixoKSxhLHUpLEU9ZSh0LnN1YihsLGcpLHQuYWRkKHAsdiksYSx1KSxfPXQuYWRkKHkseCk7Xy5zdWIodyksXy5hZGQoRSk7dmFyIE89dC5hZGQoYix3KSxrPXQuYWRkKG0seCksTT10LnN1Yih5LG0pO00uYWRkKGIpLE0uYWRkKFMpO3ZhciBBPXQuemVyb3MoMipfLnJvd3MsMipfLmNvbHVtbnMpO3JldHVybihBPShBPShBPShBPUEuc2V0U3ViTWF0cml4KF8sMCwwKSkuc2V0U3ViTWF0cml4KE8sXy5yb3dzLDApKS5zZXRTdWJNYXRyaXgoaywwLF8uY29sdW1ucykpLnNldFN1Yk1hdHJpeChNLF8ucm93cyxfLmNvbHVtbnMpKS5zdWJNYXRyaXgoMCxpLTEsMCxvLTEpfShuPXMobix1LGMpLGU9cyhlLHUsYyksdSxjKX19LHtrZXk6XCJzY2FsZVJvd3NcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtpZihcIm9iamVjdFwiIT09RG8odCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3RcIik7dmFyIGU9dC5taW4sbj12b2lkIDA9PT1lPzA6ZSxyPXQubWF4LGk9dm9pZCAwPT09cj8xOnI7aWYoIU51bWJlci5pc0Zpbml0ZShuKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwibWluIG11c3QgYmUgYSBudW1iZXJcIik7aWYoIU51bWJlci5pc0Zpbml0ZShpKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwibWF4IG11c3QgYmUgYSBudW1iZXJcIik7aWYobj49aSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXhcIik7Zm9yKHZhciBvPW5ldyB6byh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxhPTA7YTx0aGlzLnJvd3M7YSsrKXt2YXIgcz10aGlzLmdldFJvdyhhKTtzLmxlbmd0aD4wJiZ0byhzLHttaW46bixtYXg6aSxvdXRwdXQ6c30pLG8uc2V0Um93KGEscyl9cmV0dXJuIG99fSx7a2V5Olwic2NhbGVDb2x1bW5zXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e307aWYoXCJvYmplY3RcIiE9PURvKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0XCIpO3ZhciBlPXQubWluLG49dm9pZCAwPT09ZT8wOmUscj10Lm1heCxpPXZvaWQgMD09PXI/MTpyO2lmKCFOdW1iZXIuaXNGaW5pdGUobikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIm1pbiBtdXN0IGJlIGEgbnVtYmVyXCIpO2lmKCFOdW1iZXIuaXNGaW5pdGUoaSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIm1heCBtdXN0IGJlIGEgbnVtYmVyXCIpO2lmKG4+PWkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4XCIpO2Zvcih2YXIgbz1uZXcgem8odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksYT0wO2E8dGhpcy5jb2x1bW5zO2ErKyl7dmFyIHM9dGhpcy5nZXRDb2x1bW4oYSk7cy5sZW5ndGgmJnRvKHMse21pbjpuLG1heDppLG91dHB1dDpzfSksby5zZXRDb2x1bW4oYSxzKX1yZXR1cm4gb319LHtrZXk6XCJmbGlwUm93c1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PU1hdGguY2VpbCh0aGlzLmNvbHVtbnMvMiksZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IodmFyIG49MDtuPHQ7bisrKXt2YXIgcj10aGlzLmdldChlLG4pLGk9dGhpcy5nZXQoZSx0aGlzLmNvbHVtbnMtMS1uKTt0aGlzLnNldChlLG4saSksdGhpcy5zZXQoZSx0aGlzLmNvbHVtbnMtMS1uLHIpfXJldHVybiB0aGlzfX0se2tleTpcImZsaXBDb2x1bW5zXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9TWF0aC5jZWlsKHRoaXMucm93cy8yKSxlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKWZvcih2YXIgbj0wO248dDtuKyspe3ZhciByPXRoaXMuZ2V0KG4sZSksaT10aGlzLmdldCh0aGlzLnJvd3MtMS1uLGUpO3RoaXMuc2V0KG4sZSxpKSx0aGlzLnNldCh0aGlzLnJvd3MtMS1uLGUscil9cmV0dXJuIHRoaXN9fSx7a2V5Olwia3JvbmVja2VyUHJvZHVjdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9em8uY2hlY2tNYXRyaXgodCk7Zm9yKHZhciBlPXRoaXMucm93cyxuPXRoaXMuY29sdW1ucyxyPXQucm93cyxpPXQuY29sdW1ucyxvPW5ldyB6byhlKnIsbippKSxhPTA7YTxlO2ErKylmb3IodmFyIHM9MDtzPG47cysrKWZvcih2YXIgdT0wO3U8cjt1KyspZm9yKHZhciBjPTA7YzxpO2MrKylvLnNldChyKmErdSxpKnMrYyx0aGlzLmdldChhLHMpKnQuZ2V0KHUsYykpO3JldHVybiBvfX0se2tleTpcInRyYW5zcG9zZVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyB6byh0aGlzLmNvbHVtbnMsdGhpcy5yb3dzKSxlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0LnNldChuLGUsdGhpcy5nZXQoZSxuKSk7cmV0dXJuIHR9fSx7a2V5Olwic29ydFJvd3NcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06R28sZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfX0se2tleTpcInNvcnRDb2x1bW5zXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOkdvLGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXRDb2x1bW4oZSx0aGlzLmdldENvbHVtbihlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc319LHtrZXk6XCJzdWJNYXRyaXhcIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtwbyh0aGlzLHQsZSxuLHIpO2Zvcih2YXIgaT1uZXcgem8oZS10KzEsci1uKzEpLG89dDtvPD1lO28rKylmb3IodmFyIGE9bjthPD1yO2ErKylpLnNldChvLXQsYS1uLHRoaXMuZ2V0KG8sYSkpO3JldHVybiBpfX0se2tleTpcInN1Yk1hdHJpeFJvd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj10aGlzLmNvbHVtbnMtMSksZT5ufHxlPDB8fGU+PXRoaXMuY29sdW1uc3x8bjwwfHxuPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBcmd1bWVudCBvdXQgb2YgcmFuZ2VcIik7Zm9yKHZhciByPW5ldyB6byh0Lmxlbmd0aCxuLWUrMSksaT0wO2k8dC5sZW5ndGg7aSsrKWZvcih2YXIgbz1lO288PW47bysrKXtpZih0W2ldPDB8fHRbaV0+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlJvdyBpbmRleCBvdXQgb2YgcmFuZ2U6IFwiLmNvbmNhdCh0W2ldKSk7ci5zZXQoaSxvLWUsdGhpcy5nZXQodFtpXSxvKSl9cmV0dXJuIHJ9fSx7a2V5Olwic3ViTWF0cml4Q29sdW1uXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPXRoaXMucm93cy0xKSxlPm58fGU8MHx8ZT49dGhpcy5yb3dzfHxuPDB8fG4+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkFyZ3VtZW50IG91dCBvZiByYW5nZVwiKTtmb3IodmFyIHI9bmV3IHpvKG4tZSsxLHQubGVuZ3RoKSxpPTA7aTx0Lmxlbmd0aDtpKyspZm9yKHZhciBvPWU7bzw9bjtvKyspe2lmKHRbaV08MHx8dFtpXT49dGhpcy5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZTogXCIuY29uY2F0KHRbaV0pKTtyLnNldChvLWUsaSx0aGlzLmdldChvLHRbaV0pKX1yZXR1cm4gcn19LHtrZXk6XCJzZXRTdWJNYXRyaXhcIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7aWYoKHQ9em8uY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSlyZXR1cm4gdGhpcztwbyh0aGlzLGUsZSt0LnJvd3MtMSxuLG4rdC5jb2x1bW5zLTEpO2Zvcih2YXIgcj0wO3I8dC5yb3dzO3IrKylmb3IodmFyIGk9MDtpPHQuY29sdW1ucztpKyspdGhpcy5zZXQoZStyLG4raSx0LmdldChyLGkpKTtyZXR1cm4gdGhpc319LHtrZXk6XCJzZWxlY3Rpb25cIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1mdW5jdGlvbih0LGUsbil7cmV0dXJue3Jvdzpsbyh0LGUpLGNvbHVtbjpobyh0LG4pfX0odGhpcyx0LGUpLHI9bmV3IHpvKHQubGVuZ3RoLGUubGVuZ3RoKSxpPTA7aTxuLnJvdy5sZW5ndGg7aSsrKWZvcih2YXIgbz1uLnJvd1tpXSxhPTA7YTxuLmNvbHVtbi5sZW5ndGg7YSsrKXt2YXIgcz1uLmNvbHVtblthXTtyLnNldChpLGEsdGhpcy5nZXQobyxzKSl9cmV0dXJuIHJ9fSx7a2V5OlwidHJhY2VcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPTAsbj0wO248dDtuKyspZSs9dGhpcy5nZXQobixuKTtyZXR1cm4gZX19LHtrZXk6XCJjbG9uZVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyB6byh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0LnNldChlLG4sdGhpcy5nZXQoZSxuKSk7cmV0dXJuIHR9fSx7a2V5Olwic3VtXCIsdmFsdWU6ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2VcInJvd1wiOnJldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9Z28odC5yb3dzKSxuPTA7bjx0LnJvd3M7KytuKWZvcih2YXIgcj0wO3I8dC5jb2x1bW5zOysrcillW25dKz10LmdldChuLHIpO3JldHVybiBlfSh0aGlzKTtjYXNlXCJjb2x1bW5cIjpyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPWdvKHQuY29sdW1ucyksbj0wO248dC5yb3dzOysrbilmb3IodmFyIHI9MDtyPHQuY29sdW1uczsrK3IpZVtyXSs9dC5nZXQobixyKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49MDtuPHQucm93cztuKyspZm9yKHZhciByPTA7cjx0LmNvbHVtbnM7cisrKWUrPXQuZ2V0KG4scik7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvcHRpb246IFwiLmNvbmNhdCh0KSl9fX0se2tleTpcInByb2R1Y3RcIix2YWx1ZTpmdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZVwicm93XCI6cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1nbyh0LnJvd3MsMSksbj0wO248dC5yb3dzOysrbilmb3IodmFyIHI9MDtyPHQuY29sdW1uczsrK3IpZVtuXSo9dC5nZXQobixyKTtyZXR1cm4gZX0odGhpcyk7Y2FzZVwiY29sdW1uXCI6cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1nbyh0LmNvbHVtbnMsMSksbj0wO248dC5yb3dzOysrbilmb3IodmFyIHI9MDtyPHQuY29sdW1uczsrK3IpZVtyXSo9dC5nZXQobixyKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xLG49MDtuPHQucm93cztuKyspZm9yKHZhciByPTA7cjx0LmNvbHVtbnM7cisrKWUqPXQuZ2V0KG4scik7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvcHRpb246IFwiLmNvbmNhdCh0KSl9fX0se2tleTpcIm1lYW5cIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZVwicm93XCI6Zm9yKHZhciBuPTA7bjx0aGlzLnJvd3M7bisrKWVbbl0vPXRoaXMuY29sdW1ucztyZXR1cm4gZTtjYXNlXCJjb2x1bW5cIjpmb3IodmFyIHI9MDtyPHRoaXMuY29sdW1ucztyKyspZVtyXS89dGhpcy5yb3dzO3JldHVybiBlO2Nhc2Ugdm9pZCAwOnJldHVybiBlL3RoaXMuc2l6ZTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3B0aW9uOiBcIi5jb25jYXQodCkpfX19LHtrZXk6XCJ2YXJpYW5jZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZihcIm9iamVjdFwiPT09RG8odCkmJihlPXQsdD12b2lkIDApLFwib2JqZWN0XCIhPT1EbyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdFwiKTt2YXIgbj1lLHI9bi51bmJpYXNlZCxpPXZvaWQgMD09PXJ8fHIsbz1uLm1lYW4sYT12b2lkIDA9PT1vP3RoaXMubWVhbih0KTpvO2lmKFwiYm9vbGVhblwiIT10eXBlb2YgaSl0aHJvdyBuZXcgVHlwZUVycm9yKFwidW5iaWFzZWQgbXVzdCBiZSBhIGJvb2xlYW5cIik7c3dpdGNoKHQpe2Nhc2VcInJvd1wiOmlmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJtZWFuIG11c3QgYmUgYW4gYXJyYXlcIik7cmV0dXJuIG1vKHRoaXMsaSxhKTtjYXNlXCJjb2x1bW5cIjppZighQXJyYXkuaXNBcnJheShhKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwibWVhbiBtdXN0IGJlIGFuIGFycmF5XCIpO3JldHVybiBibyh0aGlzLGksYSk7Y2FzZSB2b2lkIDA6aWYoXCJudW1iZXJcIiE9dHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcihcIm1lYW4gbXVzdCBiZSBhIG51bWJlclwiKTtyZXR1cm4geG8odGhpcyxpLGEpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvcHRpb246IFwiLmNvbmNhdCh0KSl9fX0se2tleTpcInN0YW5kYXJkRGV2aWF0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtcIm9iamVjdFwiPT09RG8odCkmJihlPXQsdD12b2lkIDApO3ZhciBuPXRoaXMudmFyaWFuY2UodCxlKTtpZih2b2lkIDA9PT10KXJldHVybiBNYXRoLnNxcnQobik7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspbltyXT1NYXRoLnNxcnQobltyXSk7cmV0dXJuIG59fSx7a2V5OlwiY2VudGVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKFwib2JqZWN0XCI9PT1Ebyh0KSYmKGU9dCx0PXZvaWQgMCksXCJvYmplY3RcIiE9PURvKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0XCIpO3ZhciBuPWUscj1uLmNlbnRlcixpPXZvaWQgMD09PXI/dGhpcy5tZWFuKHQpOnI7c3dpdGNoKHQpe2Nhc2VcInJvd1wiOmlmKCFBcnJheS5pc0FycmF5KGkpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheVwiKTtyZXR1cm4gd28odGhpcyxpKSx0aGlzO2Nhc2VcImNvbHVtblwiOmlmKCFBcnJheS5pc0FycmF5KGkpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheVwiKTtyZXR1cm4gU28odGhpcyxpKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKFwibnVtYmVyXCIhPXR5cGVvZiBpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJjZW50ZXIgbXVzdCBiZSBhIG51bWJlclwiKTtyZXR1cm4gRW8odGhpcyxpKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvcHRpb246IFwiLmNvbmNhdCh0KSl9fX0se2tleTpcInNjYWxlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKFwib2JqZWN0XCI9PT1Ebyh0KSYmKGU9dCx0PXZvaWQgMCksXCJvYmplY3RcIiE9PURvKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0XCIpO3ZhciBuPWUuc2NhbGU7c3dpdGNoKHQpe2Nhc2VcInJvd1wiOmlmKHZvaWQgMD09PW4pbj1fbyh0aGlzKTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KG4pKXRocm93IG5ldyBUeXBlRXJyb3IoXCJzY2FsZSBtdXN0IGJlIGFuIGFycmF5XCIpO3JldHVybiBPbyh0aGlzLG4pLHRoaXM7Y2FzZVwiY29sdW1uXCI6aWYodm9pZCAwPT09biluPWtvKHRoaXMpO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkobikpdGhyb3cgbmV3IFR5cGVFcnJvcihcInNjYWxlIG11c3QgYmUgYW4gYXJyYXlcIik7cmV0dXJuIE1vKHRoaXMsbiksdGhpcztjYXNlIHZvaWQgMDppZih2b2lkIDA9PT1uKW49QW8odGhpcyk7ZWxzZSBpZihcIm51bWJlclwiIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKFwic2NhbGUgbXVzdCBiZSBhIG51bWJlclwiKTtyZXR1cm4gVG8odGhpcyxuKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvcHRpb246IFwiLmNvbmNhdCh0KSl9fX0se2tleTpcInRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHJvKHRoaXMsdCl9fV0sW3trZXk6XCJmcm9tMURBcnJheVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXtpZih0KmUhPT1uLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImRhdGEgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGdpdmVuIGRpbWVuc2lvbnNcIik7Zm9yKHZhciByPW5ldyB6byh0LGUpLGk9MDtpPHQ7aSsrKWZvcih2YXIgbz0wO288ZTtvKyspci5zZXQoaSxvLG5baSplK29dKTtyZXR1cm4gcn19LHtrZXk6XCJyb3dWZWN0b3JcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHpvKDEsdC5sZW5ndGgpLG49MDtuPHQubGVuZ3RoO24rKyllLnNldCgwLG4sdFtuXSk7cmV0dXJuIGV9fSx7a2V5OlwiY29sdW1uVmVjdG9yXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB6byh0Lmxlbmd0aCwxKSxuPTA7bjx0Lmxlbmd0aDtuKyspZS5zZXQobiwwLHRbbl0pO3JldHVybiBlfX0se2tleTpcInplcm9zXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHpvKHQsZSl9fSx7a2V5Olwib25lc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyB6byh0LGUpLmZpbGwoMSl9fSx7a2V5OlwicmFuZFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O2lmKFwib2JqZWN0XCIhPT1EbyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdFwiKTtmb3IodmFyIHI9bi5yYW5kb20saT12b2lkIDA9PT1yP01hdGgucmFuZG9tOnIsbz1uZXcgem8odCxlKSxhPTA7YTx0O2ErKylmb3IodmFyIHM9MDtzPGU7cysrKW8uc2V0KGEscyxpKCkpO3JldHVybiBvfX0se2tleTpcInJhbmRJbnRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTtpZihcIm9iamVjdFwiIT09RG8obikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3RcIik7dmFyIHI9bi5taW4saT12b2lkIDA9PT1yPzA6cixvPW4ubWF4LGE9dm9pZCAwPT09bz8xZTM6byxzPW4ucmFuZG9tLHU9dm9pZCAwPT09cz9NYXRoLnJhbmRvbTpzO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJtaW4gbXVzdCBiZSBhbiBpbnRlZ2VyXCIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGEpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJtYXggbXVzdCBiZSBhbiBpbnRlZ2VyXCIpO2lmKGk+PWEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4XCIpO2Zvcih2YXIgYz1hLWksZj1uZXcgem8odCxlKSxsPTA7bDx0O2wrKylmb3IodmFyIGg9MDtoPGU7aCsrKXt2YXIgZD1pK01hdGgucm91bmQodSgpKmMpO2Yuc2V0KGwsaCxkKX1yZXR1cm4gZn19LHtrZXk6XCJleWVcIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dm9pZCAwPT09ZSYmKGU9dCksdm9pZCAwPT09biYmKG49MSk7Zm9yKHZhciByPU1hdGgubWluKHQsZSksaT10aGlzLnplcm9zKHQsZSksbz0wO288cjtvKyspaS5zZXQobyxvLG4pO3JldHVybiBpfX0se2tleTpcImRpYWdcIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9ciksdm9pZCAwPT09biYmKG49ZSk7Zm9yKHZhciBpPU1hdGgubWluKHIsZSxuKSxvPXRoaXMuemVyb3MoZSxuKSxhPTA7YTxpO2ErKylvLnNldChhLGEsdFthXSk7cmV0dXJuIG99fSx7a2V5OlwibWluXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2Zvcih2YXIgbj10LnJvd3Mscj10LmNvbHVtbnMsaT1uZXcgem8obixyKSxvPTA7bzxuO28rKylmb3IodmFyIGE9MDthPHI7YSsrKWkuc2V0KG8sYSxNYXRoLm1pbih0LmdldChvLGEpLGUuZ2V0KG8sYSkpKTtyZXR1cm4gaX19LHtrZXk6XCJtYXhcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7Zm9yKHZhciBuPXQucm93cyxyPXQuY29sdW1ucyxpPW5ldyB0aGlzKG4sciksbz0wO288bjtvKyspZm9yKHZhciBhPTA7YTxyO2ErKylpLnNldChvLGEsTWF0aC5tYXgodC5nZXQobyxhKSxlLmdldChvLGEpKSk7cmV0dXJuIGl9fSx7a2V5OlwiY2hlY2tNYXRyaXhcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdC5pc01hdHJpeChlKT9lOm5ldyB6byhlKX19LHtrZXk6XCJpc01hdHJpeFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiZcIk1hdHJpeFwiPT09dC5rbGFzc319XSksdH0oKTtmdW5jdGlvbiBHbyh0LGUpe3JldHVybiB0LWV9Qm8ucHJvdG90eXBlLmtsYXNzPVwiTWF0cml4XCIsXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmKEJvLnByb3RvdHlwZVtTeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIildPWZ1bmN0aW9uKCl7cmV0dXJuIHJvKHRoaXMpfSksQm8ucmFuZG9tPUJvLnJhbmQsQm8ucmFuZG9tSW50PUJvLnJhbmRJbnQsQm8uZGlhZ29uYWw9Qm8uZGlhZyxCby5wcm90b3R5cGUuZGlhZ29uYWw9Qm8ucHJvdG90eXBlLmRpYWcsQm8uaWRlbnRpdHk9Qm8uZXllLEJvLnByb3RvdHlwZS5uZWdhdGU9Qm8ucHJvdG90eXBlLm5lZyxCby5wcm90b3R5cGUudGVuc29yUHJvZHVjdD1Cby5wcm90b3R5cGUua3JvbmVja2VyUHJvZHVjdDt2YXIgRm8sVW8sem89ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZDbyh0LGUpfShuLHQpO3ZhciBlPUlvKG4pO2Z1bmN0aW9uIG4odCxyKXt2YXIgaTtpZihObyh0aGlzLG4pLGk9ZS5jYWxsKHRoaXMpLG4uaXNNYXRyaXgodCkpcmV0dXJuIFBvKGksdC5jbG9uZSgpKTtpZihOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wKXtpZihpLmRhdGE9W10sIShOdW1iZXIuaXNJbnRlZ2VyKHIpJiZyPj0wKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwibkNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXJcIik7Zm9yKHZhciBvPTA7bzx0O28rKylpLmRhdGEucHVzaChuZXcgRmxvYXQ2NEFycmF5KHIpKX1lbHNle2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIGFuIGFycmF5XCIpO3ZhciBhPXQ7aWYoXCJudW1iZXJcIiE9dHlwZW9mKHI9KHQ9YS5sZW5ndGgpP2FbMF0ubGVuZ3RoOjApKXRocm93IG5ldyBUeXBlRXJyb3IoXCJEYXRhIG11c3QgYmUgYSAyRCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50XCIpO2kuZGF0YT1bXTtmb3IodmFyIHM9MDtzPHQ7cysrKXtpZihhW3NdLmxlbmd0aCE9PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmNvbnNpc3RlbnQgYXJyYXkgZGltZW5zaW9uc1wiKTtpLmRhdGEucHVzaChGbG9hdDY0QXJyYXkuZnJvbShhW3NdKSl9fXJldHVybiBpLnJvd3M9dCxpLmNvbHVtbnM9cixpfXJldHVybiBMbyhuLFt7a2V5Olwic2V0XCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLmRhdGFbdF1bZV09bix0aGlzfX0se2tleTpcImdldFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX19LHtrZXk6XCJyZW1vdmVSb3dcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gc28odGhpcyx0KSx0aGlzLmRhdGEuc3BsaWNlKHQsMSksdGhpcy5yb3dzLT0xLHRoaXN9fSx7a2V5OlwiYWRkUm93XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMucm93cyksc28odGhpcyx0LCEwKSxlPUZsb2F0NjRBcnJheS5mcm9tKGNvKHRoaXMsZSkpLHRoaXMuZGF0YS5zcGxpY2UodCwwLGUpLHRoaXMucm93cys9MSx0aGlzfX0se2tleTpcInJlbW92ZUNvbHVtblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3VvKHRoaXMsdCk7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXtmb3IodmFyIG49bmV3IEZsb2F0NjRBcnJheSh0aGlzLmNvbHVtbnMtMSkscj0wO3I8dDtyKyspbltyXT10aGlzLmRhdGFbZV1bcl07Zm9yKHZhciBpPXQrMTtpPHRoaXMuY29sdW1ucztpKyspbltpLTFdPXRoaXMuZGF0YVtlXVtpXTt0aGlzLmRhdGFbZV09bn1yZXR1cm4gdGhpcy5jb2x1bW5zLT0xLHRoaXN9fSx7a2V5OlwiYWRkQ29sdW1uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5jb2x1bW5zKSx1byh0aGlzLHQsITApLGU9Zm8odGhpcyxlKTtmb3IodmFyIG49MDtuPHRoaXMucm93cztuKyspe2Zvcih2YXIgcj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucysxKSxpPTA7aTx0O2krKylyW2ldPXRoaXMuZGF0YVtuXVtpXTtmb3IocltpKytdPWVbbl07aTx0aGlzLmNvbHVtbnMrMTtpKyspcltpXT10aGlzLmRhdGFbbl1baS0xXTt0aGlzLmRhdGFbbl09cn1yZXR1cm4gdGhpcy5jb2x1bW5zKz0xLHRoaXN9fV0pLG59KEJvKTtmdW5jdGlvbiBWbyh0KXtyZXR1cm4oVm89XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIFdvKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBYbyh0LGUpe3JldHVybihYbz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gWW8odCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1xbyh0KTtpZihlKXt2YXIgaT1xbyh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gSG8odGhpcyxuKX19ZnVuY3Rpb24gSG8odCxlKXtyZXR1cm4hZXx8XCJvYmplY3RcIiE9PVZvKGUpJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP2Z1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiB0fSh0KTplfWZ1bmN0aW9uIHFvKHQpe3JldHVybihxbz1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9VW89em8sKEZvPUJvKS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0P3RoaXMuYWRkUyh0KTp0aGlzLmFkZE0odCl9LEZvLnByb3RvdHlwZS5hZGRTPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbikrdCk7cmV0dXJuIHRoaXN9LEZvLnByb3RvdHlwZS5hZGRNPWZ1bmN0aW9uKHQpe2lmKHQ9VW8uY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWxcIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKSt0LmdldChlLG4pKTtyZXR1cm4gdGhpc30sRm8uYWRkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBVbyh0KS5hZGQoZSl9LEZvLnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIHQ/dGhpcy5zdWJTKHQpOnRoaXMuc3ViTSh0KX0sRm8ucHJvdG90eXBlLnN1YlM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKS10KTtyZXR1cm4gdGhpc30sRm8ucHJvdG90eXBlLnN1Yk09ZnVuY3Rpb24odCl7aWYodD1Vby5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbFwiKTtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pLXQuZ2V0KGUsbikpO3JldHVybiB0aGlzfSxGby5zdWI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFVvKHQpLnN1YihlKX0sRm8ucHJvdG90eXBlLnN1YnRyYWN0PUZvLnByb3RvdHlwZS5zdWIsRm8ucHJvdG90eXBlLnN1YnRyYWN0Uz1Gby5wcm90b3R5cGUuc3ViUyxGby5wcm90b3R5cGUuc3VidHJhY3RNPUZvLnByb3RvdHlwZS5zdWJNLEZvLnN1YnRyYWN0PUZvLnN1YixGby5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0P3RoaXMubXVsUyh0KTp0aGlzLm11bE0odCl9LEZvLnByb3RvdHlwZS5tdWxTPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbikqdCk7cmV0dXJuIHRoaXN9LEZvLnByb3RvdHlwZS5tdWxNPWZ1bmN0aW9uKHQpe2lmKHQ9VW8uY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWxcIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKSp0LmdldChlLG4pKTtyZXR1cm4gdGhpc30sRm8ubXVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBVbyh0KS5tdWwoZSl9LEZvLnByb3RvdHlwZS5tdWx0aXBseT1Gby5wcm90b3R5cGUubXVsLEZvLnByb3RvdHlwZS5tdWx0aXBseVM9Rm8ucHJvdG90eXBlLm11bFMsRm8ucHJvdG90eXBlLm11bHRpcGx5TT1Gby5wcm90b3R5cGUubXVsTSxGby5tdWx0aXBseT1Gby5tdWwsRm8ucHJvdG90eXBlLmRpdj1mdW5jdGlvbih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdD90aGlzLmRpdlModCk6dGhpcy5kaXZNKHQpfSxGby5wcm90b3R5cGUuZGl2Uz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pL3QpO3JldHVybiB0aGlzfSxGby5wcm90b3R5cGUuZGl2TT1mdW5jdGlvbih0KXtpZih0PVVvLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKFwiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsXCIpO2Zvcih2YXIgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbikvdC5nZXQoZSxuKSk7cmV0dXJuIHRoaXN9LEZvLmRpdj1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgVW8odCkuZGl2KGUpfSxGby5wcm90b3R5cGUuZGl2aWRlPUZvLnByb3RvdHlwZS5kaXYsRm8ucHJvdG90eXBlLmRpdmlkZVM9Rm8ucHJvdG90eXBlLmRpdlMsRm8ucHJvdG90eXBlLmRpdmlkZU09Rm8ucHJvdG90eXBlLmRpdk0sRm8uZGl2aWRlPUZvLmRpdixGby5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0P3RoaXMubW9kUyh0KTp0aGlzLm1vZE0odCl9LEZvLnByb3RvdHlwZS5tb2RTPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbikldCk7cmV0dXJuIHRoaXN9LEZvLnByb3RvdHlwZS5tb2RNPWZ1bmN0aW9uKHQpe2lmKHQ9VW8uY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWxcIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKSV0LmdldChlLG4pKTtyZXR1cm4gdGhpc30sRm8ubW9kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBVbyh0KS5tb2QoZSl9LEZvLnByb3RvdHlwZS5tb2R1bHVzPUZvLnByb3RvdHlwZS5tb2QsRm8ucHJvdG90eXBlLm1vZHVsdXNTPUZvLnByb3RvdHlwZS5tb2RTLEZvLnByb3RvdHlwZS5tb2R1bHVzTT1Gby5wcm90b3R5cGUubW9kTSxGby5tb2R1bHVzPUZvLm1vZCxGby5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0P3RoaXMuYW5kUyh0KTp0aGlzLmFuZE0odCl9LEZvLnByb3RvdHlwZS5hbmRTPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbikmdCk7cmV0dXJuIHRoaXN9LEZvLnByb3RvdHlwZS5hbmRNPWZ1bmN0aW9uKHQpe2lmKHQ9VW8uY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWxcIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKSZ0LmdldChlLG4pKTtyZXR1cm4gdGhpc30sRm8uYW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBVbyh0KS5hbmQoZSl9LEZvLnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdD90aGlzLm9yUyh0KTp0aGlzLm9yTSh0KX0sRm8ucHJvdG90eXBlLm9yUz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pfHQpO3JldHVybiB0aGlzfSxGby5wcm90b3R5cGUub3JNPWZ1bmN0aW9uKHQpe2lmKHQ9VW8uY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWxcIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKXx0LmdldChlLG4pKTtyZXR1cm4gdGhpc30sRm8ub3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFVvKHQpLm9yKGUpfSxGby5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0P3RoaXMueG9yUyh0KTp0aGlzLnhvck0odCl9LEZvLnByb3RvdHlwZS54b3JTPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbiledCk7cmV0dXJuIHRoaXN9LEZvLnByb3RvdHlwZS54b3JNPWZ1bmN0aW9uKHQpe2lmKHQ9VW8uY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWxcIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKV50LmdldChlLG4pKTtyZXR1cm4gdGhpc30sRm8ueG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBVbyh0KS54b3IoZSl9LEZvLnByb3RvdHlwZS5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIHQ/dGhpcy5sZWZ0U2hpZnRTKHQpOnRoaXMubGVmdFNoaWZ0TSh0KX0sRm8ucHJvdG90eXBlLmxlZnRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKTw8dCk7cmV0dXJuIHRoaXN9LEZvLnByb3RvdHlwZS5sZWZ0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9VW8uY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWxcIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKTw8dC5nZXQoZSxuKSk7cmV0dXJuIHRoaXN9LEZvLmxlZnRTaGlmdD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgVW8odCkubGVmdFNoaWZ0KGUpfSxGby5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdD90aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTKHQpOnRoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE0odCl9LEZvLnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMucm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pPj50KTtyZXR1cm4gdGhpc30sRm8ucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9VW8uY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWxcIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKT4+dC5nZXQoZSxuKSk7cmV0dXJuIHRoaXN9LEZvLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFVvKHQpLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQoZSl9LEZvLnByb3RvdHlwZS5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0P3RoaXMucmlnaHRTaGlmdFModCk6dGhpcy5yaWdodFNoaWZ0TSh0KX0sRm8ucHJvdG90eXBlLnJpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbik+Pj50KTtyZXR1cm4gdGhpc30sRm8ucHJvdG90eXBlLnJpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9VW8uY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWxcIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKT4+PnQuZ2V0KGUsbikpO3JldHVybiB0aGlzfSxGby5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBVbyh0KS5yaWdodFNoaWZ0KGUpfSxGby5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0PUZvLnByb3RvdHlwZS5yaWdodFNoaWZ0LEZvLnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRTPUZvLnByb3RvdHlwZS5yaWdodFNoaWZ0UyxGby5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0TT1Gby5wcm90b3R5cGUucmlnaHRTaGlmdE0sRm8uemVyb0ZpbGxSaWdodFNoaWZ0PUZvLnJpZ2h0U2hpZnQsRm8ucHJvdG90eXBlLm5vdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLH50aGlzLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sRm8ubm90PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkubm90KCl9LEZvLnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMucm93czt0KyspZm9yKHZhciBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFicyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLmFicz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLmFicygpfSxGby5wcm90b3R5cGUuYWNvcz1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLmFjb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVbyh0KS5hY29zKCl9LEZvLnByb3RvdHlwZS5hY29zaD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSxGby5hY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLmFjb3NoKCl9LEZvLnByb3RvdHlwZS5hc2luPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sRm8uYXNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLmFzaW4oKX0sRm8ucHJvdG90eXBlLmFzaW5oPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLmFzaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkuYXNpbmgoKX0sRm8ucHJvdG90eXBlLmF0YW49ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMucm93czt0KyspZm9yKHZhciBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSxGby5hdGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkuYXRhbigpfSxGby5wcm90b3R5cGUuYXRhbmg9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMucm93czt0KyspZm9yKHZhciBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sRm8uYXRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVbyh0KS5hdGFuaCgpfSxGby5wcm90b3R5cGUuY2JydD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2JydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLmNicnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVbyh0KS5jYnJ0KCl9LEZvLnByb3RvdHlwZS5jZWlsPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jZWlsKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sRm8uY2VpbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLmNlaWwoKX0sRm8ucHJvdG90eXBlLmNsejMyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jbHozMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLmNsejMyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkuY2x6MzIoKX0sRm8ucHJvdG90eXBlLmNvcz1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sRm8uY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkuY29zKCl9LEZvLnByb3RvdHlwZS5jb3NoPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sRm8uY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLmNvc2goKX0sRm8ucHJvdG90eXBlLmV4cD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sRm8uZXhwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkuZXhwKCl9LEZvLnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwbTEodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSxGby5leHBtMT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLmV4cG0xKCl9LEZvLnByb3RvdHlwZS5mbG9vcj1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZmxvb3IodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSxGby5mbG9vcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLmZsb29yKCl9LEZvLnByb3RvdHlwZS5mcm91bmQ9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMucm93czt0KyspZm9yKHZhciBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZyb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLmZyb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLmZyb3VuZCgpfSxGby5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2codGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSxGby5sb2c9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVbyh0KS5sb2coKX0sRm8ucHJvdG90eXBlLmxvZzFwPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxcCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLmxvZzFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkubG9nMXAoKX0sRm8ucHJvdG90eXBlLmxvZzEwPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxMCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLmxvZzEwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkubG9nMTAoKX0sRm8ucHJvdG90eXBlLmxvZzI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMucm93czt0KyspZm9yKHZhciBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSxGby5sb2cyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkubG9nMigpfSxGby5wcm90b3R5cGUucm91bmQ9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMucm93czt0KyspZm9yKHZhciBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sRm8ucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVbyh0KS5yb3VuZCgpfSxGby5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2lnbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVbyh0KS5zaWduKCl9LEZvLnByb3RvdHlwZS5zaW49ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMucm93czt0KyspZm9yKHZhciBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLnNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLnNpbigpfSxGby5wcm90b3R5cGUuc2luaD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLnNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVbyh0KS5zaW5oKCl9LEZvLnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zcXJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sRm8uc3FydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLnNxcnQoKX0sRm8ucHJvdG90eXBlLnRhbj1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IodmFyIGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sRm8udGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkudGFuKCl9LEZvLnByb3RvdHlwZS50YW5oPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sRm8udGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVvKHQpLnRhbmgoKX0sRm8ucHJvdG90eXBlLnRydW5jPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50cnVuYyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LEZvLnRydW5jPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVW8odCkudHJ1bmMoKX0sRm8ucG93PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBVbyh0KS5wb3coZSl9LEZvLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIHQ/dGhpcy5wb3dTKHQpOnRoaXMucG93TSh0KX0sRm8ucHJvdG90eXBlLnBvd1M9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sTWF0aC5wb3codGhpcy5nZXQoZSxuKSx0KSk7cmV0dXJuIHRoaXN9LEZvLnByb3RvdHlwZS5wb3dNPWZ1bmN0aW9uKHQpe2lmKHQ9VW8uY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWxcIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sTWF0aC5wb3codGhpcy5nZXQoZSxuKSx0LmdldChlLG4pKSk7cmV0dXJuIHRoaXN9O3ZhciBLbz1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlhvKHQsZSl9KG8sdCk7dmFyIGUsbixyLGk9WW8obyk7ZnVuY3Rpb24gbyh0KXt2YXIgZTtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLG8pLChlPWkuY2FsbCh0aGlzKSkuZGF0YT10LGUucm93cz10Lmxlbmd0aCxlLmNvbHVtbnM9dFswXS5sZW5ndGgsZX1yZXR1cm4gZT1vLChuPVt7a2V5Olwic2V0XCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLmRhdGFbdF1bZV09bix0aGlzfX0se2tleTpcImdldFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX19XSkmJldvKGUucHJvdG90eXBlLG4pLHImJldvKGUsciksb30oQm8pO2Z1bmN0aW9uIFpvKHQsZSl7dmFyIG49MDtyZXR1cm4gTWF0aC5hYnModCk+TWF0aC5hYnMoZSk/KG49ZS90LE1hdGguYWJzKHQpKk1hdGguc3FydCgxK24qbikpOjAhPT1lPyhuPXQvZSxNYXRoLmFicyhlKSpNYXRoLnNxcnQoMStuKm4pKTowfWZ1bmN0aW9uIFFvKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBKbyh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19dmFyICRvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoUW8odGhpcyx0KSwoZT1Lby5jaGVja01hdHJpeChlKSkuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcihcIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eVwiKTt2YXIgcixpPWUucm93cyxvPWUuY29sdW1ucyxhPW4uY29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnMscz12b2lkIDA9PT1hfHxhLHU9bi5jb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnMsYz12b2lkIDA9PT11fHx1LGY9bi5hdXRvVHJhbnNwb3NlLGw9dm9pZCAwIT09ZiYmZixoPUJvb2xlYW4ocyksZD1Cb29sZWFuKGMpLHA9ITE7aWYoaTxvKWlmKGwpe2k9KHI9ZS50cmFuc3Bvc2UoKSkucm93cyxvPXIuY29sdW1ucyxwPSEwO3ZhciBnPWg7aD1kLGQ9Z31lbHNlIHI9ZS5jbG9uZSgpLGNvbnNvbGUud2FybihcIkNvbXB1dGluZyBTVkQgb24gYSBtYXRyaXggd2l0aCBtb3JlIGNvbHVtbnMgdGhhbiByb3dzLiBDb25zaWRlciBlbmFibGluZyBhdXRvVHJhbnNwb3NlXCIpO2Vsc2Ugcj1lLmNsb25lKCk7Zm9yKHZhciB2PU1hdGgubWluKGksbykseT1NYXRoLm1pbihpKzEsbyksbT1uZXcgRmxvYXQ2NEFycmF5KHkpLGI9bmV3IHpvKGksdikseD1uZXcgem8obyxvKSx3PW5ldyBGbG9hdDY0QXJyYXkobyksUz1uZXcgRmxvYXQ2NEFycmF5KGkpLEU9bmV3IEZsb2F0NjRBcnJheSh5KSxfPTA7Xzx5O18rKylFW19dPV87Zm9yKHZhciBPPU1hdGgubWluKGktMSxvKSxrPU1hdGgubWF4KDAsTWF0aC5taW4oby0yLGkpKSxNPU1hdGgubWF4KE8sayksQT0wO0E8TTtBKyspe2lmKEE8Tyl7bVtBXT0wO2Zvcih2YXIgVD1BO1Q8aTtUKyspbVtBXT1abyhtW0FdLHIuZ2V0KFQsQSkpO2lmKDAhPT1tW0FdKXtyLmdldChBLEEpPDAmJihtW0FdPS1tW0FdKTtmb3IodmFyIEM9QTtDPGk7QysrKXIuc2V0KEMsQSxyLmdldChDLEEpL21bQV0pO3Iuc2V0KEEsQSxyLmdldChBLEEpKzEpfW1bQV09LW1bQV19Zm9yKHZhciBJPUErMTtJPG87SSsrKXtpZihBPE8mJjAhPT1tW0FdKXtmb3IodmFyIFA9MCxqPUE7ajxpO2orKylQKz1yLmdldChqLEEpKnIuZ2V0KGosSSk7UD0tUC9yLmdldChBLEEpO2Zvcih2YXIgRD1BO0Q8aTtEKyspci5zZXQoRCxJLHIuZ2V0KEQsSSkrUCpyLmdldChELEEpKX13W0ldPXIuZ2V0KEEsSSl9aWYoaCYmQTxPKWZvcih2YXIgTj1BO048aTtOKyspYi5zZXQoTixBLHIuZ2V0KE4sQSkpO2lmKEE8ayl7d1tBXT0wO2Zvcih2YXIgUj1BKzE7UjxvO1IrKyl3W0FdPVpvKHdbQV0sd1tSXSk7aWYoMCE9PXdbQV0pe3dbQSsxXTwwJiYod1tBXT0wLXdbQV0pO2Zvcih2YXIgTD1BKzE7TDxvO0wrKyl3W0xdLz13W0FdO3dbQSsxXSs9MX1pZih3W0FdPS13W0FdLEErMTxpJiYwIT09d1tBXSl7Zm9yKHZhciBCPUErMTtCPGk7QisrKVNbQl09MDtmb3IodmFyIEc9QSsxO0c8aTtHKyspZm9yKHZhciBGPUErMTtGPG87RisrKVNbR10rPXdbRl0qci5nZXQoRyxGKTtmb3IodmFyIFU9QSsxO1U8bztVKyspZm9yKHZhciB6PS13W1VdL3dbQSsxXSxWPUErMTtWPGk7VisrKXIuc2V0KFYsVSxyLmdldChWLFUpK3oqU1tWXSl9aWYoZClmb3IodmFyIFc9QSsxO1c8bztXKyspeC5zZXQoVyxBLHdbV10pfX12YXIgWD1NYXRoLm1pbihvLGkrMSk7aWYoTzxvJiYobVtPXT1yLmdldChPLE8pKSxpPFgmJihtW1gtMV09MCksaysxPFgmJih3W2tdPXIuZ2V0KGssWC0xKSksd1tYLTFdPTAsaCl7Zm9yKHZhciBZPU87WTx2O1krKyl7Zm9yKHZhciBIPTA7SDxpO0grKyliLnNldChILFksMCk7Yi5zZXQoWSxZLDEpfWZvcih2YXIgcT1PLTE7cT49MDtxLS0paWYoMCE9PW1bcV0pe2Zvcih2YXIgSz1xKzE7Szx2O0srKyl7Zm9yKHZhciBaPTAsUT1xO1E8aTtRKyspWis9Yi5nZXQoUSxxKSpiLmdldChRLEspO1o9LVovYi5nZXQocSxxKTtmb3IodmFyIEo9cTtKPGk7SisrKWIuc2V0KEosSyxiLmdldChKLEspK1oqYi5nZXQoSixxKSl9Zm9yKHZhciAkPXE7JDxpOyQrKyliLnNldCgkLHEsLWIuZ2V0KCQscSkpO2Iuc2V0KHEscSwxK2IuZ2V0KHEscSkpO2Zvcih2YXIgdHQ9MDt0dDxxLTE7dHQrKyliLnNldCh0dCxxLDApfWVsc2V7Zm9yKHZhciBldD0wO2V0PGk7ZXQrKyliLnNldChldCxxLDApO2Iuc2V0KHEscSwxKX19aWYoZClmb3IodmFyIG50PW8tMTtudD49MDtudC0tKXtpZihudDxrJiYwIT09d1tudF0pZm9yKHZhciBydD1udCsxO3J0PG87cnQrKyl7Zm9yKHZhciBpdD0wLG90PW50KzE7b3Q8bztvdCsrKWl0Kz14LmdldChvdCxudCkqeC5nZXQob3QscnQpO2l0PS1pdC94LmdldChudCsxLG50KTtmb3IodmFyIGF0PW50KzE7YXQ8bzthdCsrKXguc2V0KGF0LHJ0LHguZ2V0KGF0LHJ0KStpdCp4LmdldChhdCxudCkpfWZvcih2YXIgc3Q9MDtzdDxvO3N0KyspeC5zZXQoc3QsbnQsMCk7eC5zZXQobnQsbnQsMSl9Zm9yKHZhciB1dD1YLTEsY3Q9TnVtYmVyLkVQU0lMT047WD4wOyl7dmFyIGZ0PXZvaWQgMCxsdD12b2lkIDA7Zm9yKGZ0PVgtMjtmdD49LTEmJi0xIT09ZnQ7ZnQtLSl7dmFyIGh0PU51bWJlci5NSU5fVkFMVUUrY3QqTWF0aC5hYnMobVtmdF0rTWF0aC5hYnMobVtmdCsxXSkpO2lmKE1hdGguYWJzKHdbZnRdKTw9aHR8fE51bWJlci5pc05hTih3W2Z0XSkpe3dbZnRdPTA7YnJlYWt9fWlmKGZ0PT09WC0yKWx0PTQ7ZWxzZXt2YXIgZHQ9dm9pZCAwO2ZvcihkdD1YLTE7ZHQ+PWZ0JiZkdCE9PWZ0O2R0LS0pe3ZhciBwdD0oZHQhPT1YP01hdGguYWJzKHdbZHRdKTowKSsoZHQhPT1mdCsxP01hdGguYWJzKHdbZHQtMV0pOjApO2lmKE1hdGguYWJzKG1bZHRdKTw9Y3QqcHQpe21bZHRdPTA7YnJlYWt9fWR0PT09ZnQ/bHQ9MzpkdD09PVgtMT9sdD0xOihsdD0yLGZ0PWR0KX1zd2l0Y2goZnQrKyxsdCl7Y2FzZSAxOnZhciBndD13W1gtMl07d1tYLTJdPTA7Zm9yKHZhciB2dD1YLTI7dnQ+PWZ0O3Z0LS0pe3ZhciB5dD1abyhtW3Z0XSxndCksbXQ9bVt2dF0veXQsYnQ9Z3QveXQ7aWYobVt2dF09eXQsdnQhPT1mdCYmKGd0PS1idCp3W3Z0LTFdLHdbdnQtMV09bXQqd1t2dC0xXSksZClmb3IodmFyIHh0PTA7eHQ8bzt4dCsrKXl0PW10KnguZ2V0KHh0LHZ0KStidCp4LmdldCh4dCxYLTEpLHguc2V0KHh0LFgtMSwtYnQqeC5nZXQoeHQsdnQpK210KnguZ2V0KHh0LFgtMSkpLHguc2V0KHh0LHZ0LHl0KX1icmVhaztjYXNlIDI6dmFyIHd0PXdbZnQtMV07d1tmdC0xXT0wO2Zvcih2YXIgU3Q9ZnQ7U3Q8WDtTdCsrKXt2YXIgRXQ9Wm8obVtTdF0sd3QpLF90PW1bU3RdL0V0LE90PXd0L0V0O2lmKG1bU3RdPUV0LHd0PS1PdCp3W1N0XSx3W1N0XT1fdCp3W1N0XSxoKWZvcih2YXIga3Q9MDtrdDxpO2t0KyspRXQ9X3QqYi5nZXQoa3QsU3QpK090KmIuZ2V0KGt0LGZ0LTEpLGIuc2V0KGt0LGZ0LTEsLU90KmIuZ2V0KGt0LFN0KStfdCpiLmdldChrdCxmdC0xKSksYi5zZXQoa3QsU3QsRXQpfWJyZWFrO2Nhc2UgMzp2YXIgTXQ9TWF0aC5tYXgoTWF0aC5hYnMobVtYLTFdKSxNYXRoLmFicyhtW1gtMl0pLE1hdGguYWJzKHdbWC0yXSksTWF0aC5hYnMobVtmdF0pLE1hdGguYWJzKHdbZnRdKSksQXQ9bVtYLTFdL010LFR0PW1bWC0yXS9NdCxDdD13W1gtMl0vTXQsSXQ9bVtmdF0vTXQsUHQ9d1tmdF0vTXQsanQ9KChUdCtBdCkqKFR0LUF0KStDdCpDdCkvMixEdD1BdCpDdCooQXQqQ3QpLE50PTA7MD09PWp0JiYwPT09RHR8fChOdD1EdC8oanQrKE50PWp0PDA/MC1NYXRoLnNxcnQoanQqanQrRHQpOk1hdGguc3FydChqdCpqdCtEdCkpKSk7Zm9yKHZhciBSdD0oSXQrQXQpKihJdC1BdCkrTnQsTHQ9SXQqUHQsQnQ9ZnQ7QnQ8WC0xO0J0Kyspe3ZhciBHdD1abyhSdCxMdCk7MD09PUd0JiYoR3Q9TnVtYmVyLk1JTl9WQUxVRSk7dmFyIEZ0PVJ0L0d0LFV0PUx0L0d0O2lmKEJ0IT09ZnQmJih3W0J0LTFdPUd0KSxSdD1GdCptW0J0XStVdCp3W0J0XSx3W0J0XT1GdCp3W0J0XS1VdCptW0J0XSxMdD1VdCptW0J0KzFdLG1bQnQrMV09RnQqbVtCdCsxXSxkKWZvcih2YXIgenQ9MDt6dDxvO3p0KyspR3Q9RnQqeC5nZXQoenQsQnQpK1V0KnguZ2V0KHp0LEJ0KzEpLHguc2V0KHp0LEJ0KzEsLVV0KnguZ2V0KHp0LEJ0KStGdCp4LmdldCh6dCxCdCsxKSkseC5zZXQoenQsQnQsR3QpO2lmKDA9PT0oR3Q9Wm8oUnQsTHQpKSYmKEd0PU51bWJlci5NSU5fVkFMVUUpLEZ0PVJ0L0d0LFV0PUx0L0d0LG1bQnRdPUd0LFJ0PUZ0KndbQnRdK1V0Km1bQnQrMV0sbVtCdCsxXT0tVXQqd1tCdF0rRnQqbVtCdCsxXSxMdD1VdCp3W0J0KzFdLHdbQnQrMV09RnQqd1tCdCsxXSxoJiZCdDxpLTEpZm9yKHZhciBWdD0wO1Z0PGk7VnQrKylHdD1GdCpiLmdldChWdCxCdCkrVXQqYi5nZXQoVnQsQnQrMSksYi5zZXQoVnQsQnQrMSwtVXQqYi5nZXQoVnQsQnQpK0Z0KmIuZ2V0KFZ0LEJ0KzEpKSxiLnNldChWdCxCdCxHdCl9d1tYLTJdPVJ0LDE7YnJlYWs7Y2FzZSA0OmlmKG1bZnRdPD0wJiYobVtmdF09bVtmdF08MD8tbVtmdF06MCxkKSlmb3IodmFyIFd0PTA7V3Q8PXV0O1d0KyspeC5zZXQoV3QsZnQsLXguZ2V0KFd0LGZ0KSk7Zm9yKDtmdDx1dCYmIShtW2Z0XT49bVtmdCsxXSk7KXt2YXIgWHQ9bVtmdF07aWYobVtmdF09bVtmdCsxXSxtW2Z0KzFdPVh0LGQmJmZ0PG8tMSlmb3IodmFyIFl0PTA7WXQ8bztZdCsrKVh0PXguZ2V0KFl0LGZ0KzEpLHguc2V0KFl0LGZ0KzEseC5nZXQoWXQsZnQpKSx4LnNldChZdCxmdCxYdCk7aWYoaCYmZnQ8aS0xKWZvcih2YXIgSHQ9MDtIdDxpO0h0KyspWHQ9Yi5nZXQoSHQsZnQrMSksYi5zZXQoSHQsZnQrMSxiLmdldChIdCxmdCkpLGIuc2V0KEh0LGZ0LFh0KTtmdCsrfTAsWC0tfX1pZihwKXt2YXIgcXQ9eDt4PWIsYj1xdH10aGlzLm09aSx0aGlzLm49byx0aGlzLnM9bSx0aGlzLlU9Yix0aGlzLlY9eH12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleTpcInNvbHZlXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQsbj10aGlzLnRocmVzaG9sZCxyPXRoaXMucy5sZW5ndGgsaT16by56ZXJvcyhyLHIpLG89MDtvPHI7bysrKU1hdGguYWJzKHRoaXMuc1tvXSk8PW4/aS5zZXQobyxvLDApOmkuc2V0KG8sbywxL3RoaXMuc1tvXSk7Zm9yKHZhciBhPXRoaXMuVSxzPXRoaXMucmlnaHRTaW5ndWxhclZlY3RvcnMsdT1zLm1tdWwoaSksYz1zLnJvd3MsZj1hLnJvd3MsbD16by56ZXJvcyhjLGYpLGg9MDtoPGM7aCsrKWZvcih2YXIgZD0wO2Q8ZjtkKyspe2Zvcih2YXIgcD0wLGc9MDtnPHI7ZysrKXArPXUuZ2V0KGgsZykqYS5nZXQoZCxnKTtsLnNldChoLGQscCl9cmV0dXJuIGwubW11bChlKX19LHtrZXk6XCJzb2x2ZUZvckRpYWdvbmFsXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc29sdmUoem8uZGlhZyh0KSl9fSx7a2V5OlwiaW52ZXJzZVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLG49dC5yb3dzLHI9dC5jb2x1bW5zLGk9bmV3IHpvKG4sdGhpcy5zLmxlbmd0aCksbz0wO288bjtvKyspZm9yKHZhciBhPTA7YTxyO2ErKylNYXRoLmFicyh0aGlzLnNbYV0pPmUmJmkuc2V0KG8sYSx0LmdldChvLGEpL3RoaXMuc1thXSk7Zm9yKHZhciBzPXRoaXMuVSx1PXMucm93cyxjPXMuY29sdW1ucyxmPW5ldyB6byhuLHUpLGw9MDtsPG47bCsrKWZvcih2YXIgaD0wO2g8dTtoKyspe2Zvcih2YXIgZD0wLHA9MDtwPGM7cCsrKWQrPWkuZ2V0KGwscCkqcy5nZXQoaCxwKTtmLnNldChsLGgsZCl9cmV0dXJuIGZ9fSx7a2V5OlwiY29uZGl0aW9uXCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc1swXS90aGlzLnNbTWF0aC5taW4odGhpcy5tLHRoaXMubiktMV19fSx7a2V5Olwibm9ybTJcIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zWzBdfX0se2tleTpcInJhbmtcIixnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9TWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdKk51bWJlci5FUFNJTE9OLGU9MCxuPXRoaXMucyxyPTAsaT1uLmxlbmd0aDtyPGk7cisrKW5bcl0+dCYmZSsrO3JldHVybiBlfX0se2tleTpcImRpYWdvbmFsXCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zKX19LHtrZXk6XCJ0aHJlc2hvbGRcIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTnVtYmVyLkVQU0lMT04vMipNYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF19fSx7a2V5OlwibGVmdFNpbmd1bGFyVmVjdG9yc1wiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlV9fSx7a2V5OlwicmlnaHRTaW5ndWxhclZlY3RvcnNcIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WfX0se2tleTpcImRpYWdvbmFsTWF0cml4XCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHpvLmRpYWcodGhpcy5zKX19XSkmJkpvKGUucHJvdG90eXBlLG4pLHImJkpvKGUsciksdH0oKTtmdW5jdGlvbiB0YSh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19dmFyIGVhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLHQpLHRoaXMuZGlzdGFuY2VzPWUuZGlzdGFuY2VzLHRoaXMuZGltZW5zaW9uPWUuZGltZW5zaW9ufHwyLHRoaXMubGlua0Rpc3RhbmNlPWUubGlua0Rpc3RhbmNlfXZhciBlLG4scjtyZXR1cm4gZT10LChuPVt7a2V5OlwibGF5b3V0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRpbWVuc2lvbixlPXRoaXMuZGlzdGFuY2VzLG49dGhpcy5saW5rRGlzdGFuY2U7dHJ5e3ZhciByPXpvLm11bCh6by5wb3coZSwyKSwtLjUpLGk9ci5tZWFuKFwicm93XCIpLG89ci5tZWFuKFwiY29sdW1uXCIpLGE9ci5tZWFuKCk7ci5hZGQoYSkuc3ViUm93VmVjdG9yKGkpLnN1YkNvbHVtblZlY3RvcihvKTt2YXIgcz1uZXcgJG8ociksdT16by5zcXJ0KHMuZGlhZ29uYWxNYXRyaXgpLmRpYWdvbmFsKCk7cmV0dXJuIHMubGVmdFNpbmd1bGFyVmVjdG9ycy50b0pTT04oKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB6by5tdWwoW2VdLFt1XSkudG9KU09OKClbMF0uc3BsaWNlKDAsdCl9KSl9Y2F0Y2godCl7Zm9yKHZhciBjPVtdLGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGw9TWF0aC5yYW5kb20oKSpuLGg9TWF0aC5yYW5kb20oKSpuO2MucHVzaChbbCxoXSl9cmV0dXJuIGN9fX1dKSYmdGEoZS5wcm90b3R5cGUsbiksciYmdGEoZSxyKSx0fSgpO2Z1bmN0aW9uIG5hKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX12YXIgcmE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpeyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsdCksdGhpcy5kaXNwPVtdLHRoaXMucG9zaXRpb25zPWUucG9zaXRpb25zLHRoaXMuYWRqTWF0cml4PWUuYWRqTWF0cml4LHRoaXMuZm9jdXNJRD1lLmZvY3VzSUQsdGhpcy5yYWRpaT1lLnJhZGlpLHRoaXMuaXRlcmF0aW9ucz1lLml0ZXJhdGlvbnN8fDEwLHRoaXMuaGVpZ2h0PWUuaGVpZ2h0fHwxMCx0aGlzLndpZHRoPWUud2lkdGh8fDEwLHRoaXMuc3BlZWQ9ZS5zcGVlZHx8MTAwLHRoaXMuZ3Jhdml0eT1lLmdyYXZpdHl8fDEwLHRoaXMubm9kZVNpemVGdW5jPWUubm9kZVNpemVGdW5jLHRoaXMuaz1lLmt8fDUsdGhpcy5zdHJpY3RSYWRpYWw9ZS5zdHJpY3RSYWRpYWwsdGhpcy5ub2Rlcz1lLm5vZGVzfXZhciBlLG4scjtyZXR1cm4gZT10LChuPVt7a2V5OlwibGF5b3V0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBvc2l0aW9ucyxlPVtdLG49dGhpcy5pdGVyYXRpb25zLHI9dGhpcy53aWR0aC8xMDt0aGlzLm1heERpc3BsYWNlPXIsdGhpcy5kaXNwPWU7Zm9yKHZhciBpPTA7aTxuO2krKyl0LmZvckVhY2goKGZ1bmN0aW9uKHQsbil7ZVtuXT17eDowLHk6MH19KSksdGhpcy5nZXRSZXB1bHNpb24oKSx0aGlzLnVwZGF0ZVBvc2l0aW9ucygpO3JldHVybiB0fX0se2tleTpcImdldFJlcHVsc2lvblwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQucG9zaXRpb25zLG49dC5ub2RlcyxyPXQuZGlzcCxpPXQuayxvPXQucmFkaWl8fFtdO2UuZm9yRWFjaCgoZnVuY3Rpb24oYSxzKXtyW3NdPXt4OjAseTowfSxlLmZvckVhY2goKGZ1bmN0aW9uKGUsdSl7aWYocyE9PXUmJm9bc109PT1vW3VdKXt2YXIgYz1hWzBdLWVbMF0sZj1hWzFdLWVbMV0sbD1NYXRoLnNxcnQoYypjK2YqZik7aWYoMD09PWwpe2w9MTt2YXIgaD1zPnU/MTotMTtjPS4wMSpoLGY9LjAxKmh9aWYobDx0Lm5vZGVTaXplRnVuYyhuW3NdKS8yK3Qubm9kZVNpemVGdW5jKG5bdV0pLzIpe3ZhciBkPWkqaS9sO3Jbc10ueCs9Yy9sKmQscltzXS55Kz1mL2wqZH19fSkpfSkpfX0se2tleTpcInVwZGF0ZVBvc2l0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wb3NpdGlvbnMsZT10aGlzLmRpc3Asbj10aGlzLnNwZWVkLHI9dGhpcy5zdHJpY3RSYWRpYWwsaT10aGlzLmZvY3VzSUQsbz10aGlzLm1heERpc3BsYWNlfHx0aGlzLndpZHRoLzEwO3ImJmUuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt2YXIgcj10W25dWzBdLXRbaV1bMF0sbz10W25dWzFdLXRbaV1bMV0sYT1NYXRoLnNxcnQocipyK28qbykscz1vL2EsdT0tci9hLGM9TWF0aC5zcXJ0KGUueCplLngrZS55KmUueSksZj1NYXRoLmFjb3MoKHMqZS54K3UqZS55KS9jKTtmPk1hdGguUEkvMiYmKGYtPU1hdGguUEkvMixzKj0tMSx1Kj0tMSk7dmFyIGw9TWF0aC5jb3MoZikqYztlLng9cypsLGUueT11Kmx9KSk7dmFyIGE9dGhpcy5yYWRpaTt0LmZvckVhY2goKGZ1bmN0aW9uKHMsdSl7aWYodSE9PWkpe3ZhciBjPU1hdGguc3FydChlW3VdLngqZVt1XS54K2VbdV0ueSplW3VdLnkpO2lmKGM+MCYmdSE9PWkpe3ZhciBmPU1hdGgubWluKG8qKG4vODAwKSxjKTtpZihzWzBdKz1lW3VdLngvYypmLHNbMV0rPWVbdV0ueS9jKmYscil7dmFyIGw9c1swXS10W2ldWzBdLGg9c1sxXS10W2ldWzFdLGQ9TWF0aC5zcXJ0KGwqbCtoKmgpO2w9bC9kKmFbdV0saD1oL2QqYVt1XSxzWzBdPXRbaV1bMF0rbCxzWzFdPXRbaV1bMV0raH19fX0pKX19XSkmJm5hKGUucHJvdG90eXBlLG4pLHImJm5hKGUsciksdH0oKTtmdW5jdGlvbiBpYSh0KXtyZXR1cm4oaWE9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIG9hKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBhYSh0KX0odCl8fGZ1bmN0aW9uKHQpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpcmV0dXJuIEFycmF5LmZyb20odCl9KHQpfHxmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybjtpZihcInN0cmluZ1wiPT10eXBlb2YgdClyZXR1cm4gYWEodCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PW4mJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PW58fFwiU2V0XCI9PT1uKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKFwiQXJndW1lbnRzXCI9PT1ufHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gYWEodCxlKX0odCl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gYWEodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBzYSh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gdWEodCxlKXtyZXR1cm4odWE9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIGNhKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9bGEodCk7aWYoZSl7dmFyIGk9bGEodGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGZhKHRoaXMsbil9fWZ1bmN0aW9uIGZhKHQsZSl7cmV0dXJuIWV8fFwib2JqZWN0XCIhPT1pYShlKSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZT9mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4gdH0odCk6ZX1mdW5jdGlvbiBsYSh0KXtyZXR1cm4obGE9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIGhhKHQsZSl7cmV0dXJuIE1hdGguc3FydCgodFswXS1lWzBdKSoodFswXS1lWzBdKSsodFsxXS1lWzFdKSoodFsxXS1lWzFdKSl9dmFyIGRhPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmdWEodCxlKX0obyx0KTt2YXIgZSxuLHIsaT1jYShvKTtmdW5jdGlvbiBvKHQpe3ZhciBlO3JldHVybiBmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsbyksKGU9aS5jYWxsKHRoaXMpKS5tYXhJdGVyYXRpb249MWUzLGUuZm9jdXNOb2RlPW51bGwsZS51bml0UmFkaXVzPW51bGwsZS5saW5rRGlzdGFuY2U9NTAsZS5wcmV2ZW50T3ZlcmxhcD0hMSxlLnN0cmljdFJhZGlhbD0hMCxlLm1heFByZXZlbnRPdmVybGFwSXRlcmF0aW9uPTIwMCxlLnNvcnRTdHJlbmd0aD0xMCxlLm5vZGVzPVtdLGUuZWRnZXM9W10sZS51cGRhdGVDZmcodCksZX1yZXR1cm4gZT1vLChuPVt7a2V5OlwiZ2V0RGVmYXVsdENmZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue21heEl0ZXJhdGlvbjoxZTMsZm9jdXNOb2RlOm51bGwsdW5pdFJhZGl1czpudWxsLGxpbmtEaXN0YW5jZTo1MCxwcmV2ZW50T3ZlcmxhcDohMSxub2RlU2l6ZTp2b2lkIDAsbm9kZVNwYWNpbmc6dm9pZCAwLHN0cmljdFJhZGlhbDohMCxtYXhQcmV2ZW50T3ZlcmxhcEl0ZXJhdGlvbjoyMDAsc29ydEJ5OnZvaWQgMCxzb3J0U3RyZW5ndGg6MTB9fX0se2tleTpcImV4ZWN1dGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10Lm5vZGVzLG49dC5lZGdlc3x8W107aWYoZSYmMCE9PWUubGVuZ3RoKXt0LndpZHRofHxcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwodC53aWR0aD13aW5kb3cuaW5uZXJXaWR0aCksdC5oZWlnaHR8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fCh0LmhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHQpLHQuY2VudGVyfHwodC5jZW50ZXI9W3Qud2lkdGgvMix0LmhlaWdodC8yXSk7dmFyIHI9dC5jZW50ZXI7aWYoMT09PWUubGVuZ3RoKXJldHVybiBlWzBdLng9clswXSxlWzBdLnk9clsxXSx2b2lkKHQub25MYXlvdXRFbmQmJnQub25MYXlvdXRFbmQoKSk7dmFyIGk9dC5saW5rRGlzdGFuY2Usbz1udWxsO2lmKEJuKHQuZm9jdXNOb2RlKSl7Zm9yKHZhciBhPSExLHM9MDtzPGUubGVuZ3RoO3MrKyllW3NdLmlkPT09dC5mb2N1c05vZGUmJihvPWVbc10sdC5mb2N1c05vZGU9byxhPSEwLHM9ZS5sZW5ndGgpO2F8fChvPW51bGwpfWVsc2Ugbz10LmZvY3VzTm9kZTtvfHwobz1lWzBdLHQuZm9jdXNOb2RlPW8pO3ZhciB1LGMsZixsPSh1PWUsYz1vLmlkLGY9LTEsdS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3QuaWQ9PT1jJiYoZj1lKX0pKSxmKTt0LmZvY3VzSW5kZXg9bDt2YXIgaD1Ybih7bm9kZXM6ZSxlZGdlczpufSwhMSksZD1XbihoKSxwPXQubWF4VG9Gb2N1cyhkLGwpO3QuaGFuZGxlSW5maW5pdHkoZCxsLHArMSksdC5kaXN0YW5jZXM9ZDt2YXIgZz1kW2xdLHY9dC53aWR0aHx8NTAwLHk9dC5oZWlnaHR8fDUwMCxtPXYtclswXT5yWzBdP3JbMF06di1yWzBdLGI9eS1yWzFdPnJbMV0/clsxXTp5LXJbMV07MD09PW0mJihtPXYvMiksMD09PWImJihiPXkvMik7dmFyIHg9Yj5tP206Yix3PU1hdGgubWF4LmFwcGx5KE1hdGgsb2EoZykpLFM9W107Zy5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3QudW5pdFJhZGl1c3x8KHQudW5pdFJhZGl1cz14L3cpLFNbbl09ZSp0LnVuaXRSYWRpdXN9KSksdC5yYWRpaT1TO3ZhciBFPXQuZUlkZWFsRGlzTWF0cml4KCk7dC5lSWRlYWxEaXN0YW5jZXM9RTt2YXIgXz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgsbj10WzBdLmxlbmd0aCxyPVtdLGk9MDtpPGU7aSsrKXtmb3IodmFyIG89W10sYT0wO2E8bjthKyspMCE9PXRbaV1bYV0/by5wdXNoKDEvKHRbaV1bYV0qdFtpXVthXSkpOm8ucHVzaCgwKTtyLnB1c2gobyl9cmV0dXJuIHJ9KEUpO3Qud2VpZ2h0cz1fO3ZhciBPPW5ldyBlYSh7bGlua0Rpc3RhbmNlOmksZGlzdGFuY2VzOkV9KS5sYXlvdXQoKTtPLmZvckVhY2goKGZ1bmN0aW9uKHQpe3puKHRbMF0pJiYodFswXT1NYXRoLnJhbmRvbSgpKmkpLHpuKHRbMV0pJiYodFsxXT1NYXRoLnJhbmRvbSgpKmkpfSkpLHQucG9zaXRpb25zPU8sTy5mb3JFYWNoKChmdW5jdGlvbih0LG4pe2Vbbl0ueD10WzBdK3JbMF0sZVtuXS55PXRbMV0rclsxXX0pKSxPLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RbMF0tPU9bbF1bMF0sdFsxXS09T1tsXVsxXX0pKSx0LnJ1bigpO3ZhciBrLE09dC5wcmV2ZW50T3ZlcmxhcCxBPXQubm9kZVNpemUsVD10LnN0cmljdFJhZGlhbDtpZihNKXt2YXIgQyxJPXQubm9kZVNwYWNpbmc7Qz1VbihJKT9mdW5jdGlvbigpe3JldHVybiBJfTpLbihJKT9JOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGs9QT9GbihBKT9mdW5jdGlvbih0KXtyZXR1cm4oQVswXT5BWzFdP0FbMF06QVsxXSkrQyh0KX06ZnVuY3Rpb24odCl7cmV0dXJuIEErQyh0KX06ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2l6ZT9Gbih0LnNpemUpPyh0LnNpemVbMF0+dC5zaXplWzFdP3Quc2l6ZVswXTp0LnNpemVbMV0pK0ModCk6dC5zaXplK0ModCk6MTArQyh0KX07dmFyIFA9e25vZGVzOmUsbm9kZVNpemVGdW5jOmssYWRqTWF0cml4OmgscG9zaXRpb25zOk8scmFkaWk6UyxoZWlnaHQ6eSx3aWR0aDp2LHN0cmljdFJhZGlhbDpULGZvY3VzSUQ6bCxpdGVyYXRpb25zOnQubWF4UHJldmVudE92ZXJsYXBJdGVyYXRpb258fDIwMCxrOk8ubGVuZ3RoLzQuNX0saj1uZXcgcmEoUCk7Tz1qLmxheW91dCgpfXJldHVybiBPLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7ZVtuXS54PXRbMF0rclswXSxlW25dLnk9dFsxXStyWzFdfSkpLHQub25MYXlvdXRFbmQmJnQub25MYXlvdXRFbmQoKSx7bm9kZXM6ZSxlZGdlczpufX10Lm9uTGF5b3V0RW5kJiZ0Lm9uTGF5b3V0RW5kKCl9fSx7a2V5OlwicnVuXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5tYXhJdGVyYXRpb24sZT10aGlzLnBvc2l0aW9uc3x8W10sbj10aGlzLndlaWdodHN8fFtdLHI9dGhpcy5lSWRlYWxEaXN0YW5jZXN8fFtdLGk9dGhpcy5yYWRpaXx8W10sbz0wO288PXQ7bysrKXt2YXIgYT1vL3Q7dGhpcy5vbmVJdGVyYXRpb24oYSxlLGkscixuKX19fSx7a2V5Olwib25lSXRlcmF0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz0xLXQsYT10aGlzLmZvY3VzSW5kZXg7ZS5mb3JFYWNoKChmdW5jdGlvbihzLHUpe3ZhciBjPWhhKHMsWzAsMF0pLGY9MD09PWM/MDoxL2M7aWYodSE9PWEpe3ZhciBsPTAsaD0wLGQ9MDtlLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7aWYodSE9PWUpe3ZhciBuPWhhKHMsdCksbz0wPT09bj8wOjEvbixhPXJbZV1bdV07ZCs9aVt1XVtlXSxsKz1pW3VdW2VdKih0WzBdK2EqKHNbMF0tdFswXSkqbyksaCs9aVt1XVtlXSoodFsxXSthKihzWzFdLXRbMV0pKm8pfX0pKTt2YXIgcD0wPT09blt1XT8wOjEvblt1XTtkKj1vLGQrPXQqcCpwLGwqPW8sbCs9dCpwKnNbMF0qZixzWzBdPWwvZCxoKj1vLGgrPXQqcCpzWzFdKmYsc1sxXT1oL2R9fSkpfX0se2tleTpcImVJZGVhbERpc01hdHJpeFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQubm9kZXM7aWYoIWUpcmV0dXJuW107dmFyIG49dC5kaXN0YW5jZXMscj10LmxpbmtEaXN0YW5jZSxpPXQucmFkaWl8fFtdLG89dC51bml0UmFkaXVzfHw1MCxhPVtdO3JldHVybiBuJiZuLmZvckVhY2goKGZ1bmN0aW9uKG4scyl7dmFyIHU9W107bi5mb3JFYWNoKChmdW5jdGlvbihuLGEpe2lmKHM9PT1hKXUucHVzaCgwKTtlbHNlIGlmKGlbc109PT1pW2FdKWlmKFwiZGF0YVwiPT09dC5zb3J0QnkpdS5wdXNoKG4qKE1hdGguYWJzKHMtYSkqdC5zb3J0U3RyZW5ndGgpLyhpW3NdL28pKTtlbHNlIGlmKHQuc29ydEJ5KXt2YXIgYz1lW3NdW3Quc29ydEJ5XXx8MCxmPWVbYV1bdC5zb3J0QnldfHwwO0JuKGMpJiYoYz1jLmNoYXJDb2RlQXQoMCkpLEJuKGYpJiYoZj1mLmNoYXJDb2RlQXQoMCkpLHUucHVzaChuKihNYXRoLmFicyhjLWYpKnQuc29ydFN0cmVuZ3RoKS8oaVtzXS9vKSl9ZWxzZSB1LnB1c2gobipyLyhpW3NdL28pKTtlbHNle3ZhciBsPShyK28pLzI7dS5wdXNoKG4qbCl9fSkpLGEucHVzaCh1KX0pKSxhfX0se2tleTpcImhhbmRsZUluZmluaXR5XCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10Lmxlbmd0aCxpPTA7aTxyO2krKylpZih0W2VdW2ldPT09MS8wKXt0W2VdW2ldPW4sdFtpXVtlXT1uO2Zvcih2YXIgbz0wO288cjtvKyspdFtpXVtvXSE9PTEvMCYmdFtlXVtvXT09PTEvMCYmKHRbZV1bb109bit0W2ldW29dLHRbb11bZV09bit0W2ldW29dKX1mb3IodmFyIGE9MDthPHI7YSsrKWlmKGEhPT1lKWZvcih2YXIgcz0wO3M8cjtzKyspaWYodFthXVtzXT09PTEvMCl7dmFyIHU9TWF0aC5hYnModFtlXVthXS10W2VdW3NdKTt1PTA9PT11PzE6dSx0W2FdW3NdPXV9fX0se2tleTpcIm1heFRvRm9jdXNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9MDtyPHRbZV0ubGVuZ3RoO3IrKyl0W2VdW3JdIT09MS8wJiYobj10W2VdW3JdPm4/dFtlXVtyXTpuKTtyZXR1cm4gbn19LHtrZXk6XCJnZXRUeXBlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cInJhZGlhbFwifX1dKSYmc2EoZS5wcm90b3R5cGUsbiksciYmc2EoZSxyKSxvfShRbik7ZnVuY3Rpb24gcGEodCl7cmV0dXJuKHBhPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBnYSh0LGUpe3JldHVybihnYT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gdmEodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1iYSh0KTtpZihlKXt2YXIgaT1iYSh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4geWEodGhpcyxuKX19ZnVuY3Rpb24geWEodCxlKXtyZXR1cm4hZXx8XCJvYmplY3RcIiE9PXBhKGUpJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP21hKHQpOmV9ZnVuY3Rpb24gbWEodCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9ZnVuY3Rpb24gYmEodCl7cmV0dXJuKGJhPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX12YXIgeGE9bmV3IE1hcCx3YT1mdW5jdGlvbih0LGUpe2lmKHhhLmdldCh0KSYmY29uc29sZS53YXJuKFwiVGhlIGxheW91dCB3aXRoIHRoZSBuYW1lIFwiLmNvbmNhdCh0LFwiIGV4aXN0cyBhbHJlYWR5LCBpdCB3aWxsIGJlIG92ZXJyaWRkZW5cIikpLG51bGwhPT0ocj1lKSYmXCJvYmplY3RcIj09PUhuKHIpKXt2YXIgbj1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJmdhKHQsZSl9KHIsdCk7dmFyIG49dmEocik7ZnVuY3Rpb24gcih0KXt2YXIgaTshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLHIpO3ZhciBvPW1hKGk9bi5jYWxsKHRoaXMpKSxhPXt9LHM9by5nZXREZWZhdWx0Q2ZnKCk7cmV0dXJuIE9iamVjdC5hc3NpZ24oYSxzLGUsdCksT2JqZWN0LmtleXMoYSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9YVt0XTtvW3RdPWV9KSksaX1yZXR1cm4gcn0oUW4pO3hhLnNldCh0LG4pfWVsc2UgeGEuc2V0KHQsZSk7dmFyIHJ9LFNhPWZ1bmN0aW9uKHQpe3JldHVybiB4YS5oYXModCk/eGEuZ2V0KHQpOm51bGx9O2Z1bmN0aW9uIEVhKHQpe3JldHVybihFYT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gX2EodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIE9hKHQsZSl7cmV0dXJuKE9hPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiBrYSh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPUFhKHQpO2lmKGUpe3ZhciBpPUFhKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBNYSh0aGlzLG4pfX1mdW5jdGlvbiBNYSh0LGUpe3JldHVybiFlfHxcIm9iamVjdFwiIT09RWEoZSkmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9KHQpOmV9ZnVuY3Rpb24gQWEodCl7cmV0dXJuKEFhPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX12YXIgVGE9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZPYSh0LGUpfShvLHQpO3ZhciBlLG4scixpPWthKG8pO2Z1bmN0aW9uIG8odCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyxvKSwoZT1pLmNhbGwodGhpcykpLm5vZGVTaXplPTMwLGUubWluTm9kZVNwYWNpbmc9MTAsZS5wcmV2ZW50T3ZlcmxhcD0hMSxlLmVxdWlkaXN0YW50PSExLGUuc3RhcnRBbmdsZT0xLjUqTWF0aC5QSSxlLmNsb2Nrd2lzZT0hMCxlLnNvcnRCeT1cImRlZ3JlZVwiLGUubm9kZXM9W10sZS5lZGdlcz1bXSxlLndpZHRoPTMwMCxlLmhlaWdodD0zMDAsZS5vbkxheW91dEVuZD1mdW5jdGlvbigpe30sZS51cGRhdGVDZmcodCksZX1yZXR1cm4gZT1vLChuPVt7a2V5OlwiZ2V0RGVmYXVsdENmZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue25vZGVTaXplOjMwLG1pbk5vZGVTcGFjaW5nOjEwLHByZXZlbnRPdmVybGFwOiExLHN3ZWVwOnZvaWQgMCxlcXVpZGlzdGFudDohMSxzdGFydEFuZ2xlOjEuNSpNYXRoLlBJLGNsb2Nrd2lzZTohMCxtYXhMZXZlbERpZmY6dm9pZCAwLHNvcnRCeTpcImRlZ3JlZVwifX19LHtrZXk6XCJleGVjdXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5ub2RlcyxuPXQuZWRnZXMscj1lLmxlbmd0aDtpZigwIT09cil7dC53aWR0aHx8XCJ1bmRlZmluZWRcIj09dHlwZW9mIHdpbmRvd3x8KHQud2lkdGg9d2luZG93LmlubmVyV2lkdGgpLHQuaGVpZ2h0fHxcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwodC5oZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0KSx0LmNlbnRlcnx8KHQuY2VudGVyPVt0LndpZHRoLzIsdC5oZWlnaHQvMl0pO3ZhciBpPXQuY2VudGVyO2lmKDE9PT1yKXJldHVybiBlWzBdLng9aVswXSxlWzBdLnk9aVsxXSx2b2lkKHQub25MYXlvdXRFbmQmJnQub25MYXlvdXRFbmQoKSk7dmFyIG8sYT1bXTtvPUZuKHQubm9kZVNpemUpP01hdGgubWF4KHQubm9kZVNpemVbMF0sdC5ub2RlU2l6ZVsxXSk6dC5ub2RlU2l6ZSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe2EucHVzaCh0KTt2YXIgZT1vO0ZuKHQuc2l6ZSk/ZT1NYXRoLm1heCh0LnNpemVbMF0sdC5zaXplWzFdKTpVbih0LnNpemUpJiYoZT10LnNpemUpLG89TWF0aC5tYXgobyxlKX0pKSx0LmNsb2Nrd2lzZT12b2lkIDAhPT10LmNvdW50ZXJjbG9ja3dpc2U/IXQuY291bnRlcmNsb2Nrd2lzZTp0LmNsb2Nrd2lzZTt2YXIgcz17fSx1PXt9O2lmKGEuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtzW3QuaWRdPXQsdVt0LmlkXT1lfSkpLCEoXCJkZWdyZWVcIiE9PXQuc29ydEJ5JiZCbih0LnNvcnRCeSkmJnZvaWQgMCE9PWFbMF1bdC5zb3J0QnldfHwodC5zb3J0Qnk9XCJkZWdyZWVcIixVbihlWzBdLmRlZ3JlZSkpKSl7dmFyIGM9Vm4oZS5sZW5ndGgsdSxuKTthLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dC5kZWdyZWU9Y1tlXX0pKX1hLnNvcnQoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG5bdC5zb3J0QnldLWVbdC5zb3J0QnldfSkpLHQubWF4VmFsdWVOb2RlPWFbMF0sdC5tYXhMZXZlbERpZmY9dC5tYXhMZXZlbERpZmZ8fHQubWF4VmFsdWVOb2RlW3Quc29ydEJ5XS80O3ZhciBmPVtbXV0sbD1mWzBdO2EuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYobC5sZW5ndGg+MCl7dmFyIG49TWF0aC5hYnMobFswXVt0LnNvcnRCeV0tZVt0LnNvcnRCeV0pO3QubWF4TGV2ZWxEaWZmJiZuPj10Lm1heExldmVsRGlmZiYmKGw9W10sZi5wdXNoKGwpKX1sLnB1c2goZSl9KSk7dmFyIGg9byt0Lm1pbk5vZGVTcGFjaW5nO2lmKCF0LnByZXZlbnRPdmVybGFwKXt2YXIgZD1mLmxlbmd0aD4wJiZmWzBdLmxlbmd0aD4xLHA9KE1hdGgubWluKHQud2lkdGgsdC5oZWlnaHQpLzItaCkvKGYubGVuZ3RoKyhkPzE6MCkpO2g9TWF0aC5taW4oaCxwKX12YXIgZz0wO2lmKGYuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49dC5zd2VlcDt2b2lkIDA9PT1uJiYobj0yKk1hdGguUEktMipNYXRoLlBJL2UubGVuZ3RoKTt2YXIgcj1lLmRUaGV0YT1uL01hdGgubWF4KDEsZS5sZW5ndGgtMSk7aWYoZS5sZW5ndGg+MSYmdC5wcmV2ZW50T3ZlcmxhcCl7dmFyIGk9TWF0aC5jb3MociktTWF0aC5jb3MoMCksbz1NYXRoLnNpbihyKS1NYXRoLnNpbigwKSxhPU1hdGguc3FydChoKmgvKGkqaStvKm8pKTtnPU1hdGgubWF4KGEsZyl9ZS5yPWcsZys9aH0pKSx0LmVxdWlkaXN0YW50KXtmb3IodmFyIHY9MCx5PTAsbT0wO208Zi5sZW5ndGg7bSsrKXt2YXIgYj1mW21dLnIteTt2PU1hdGgubWF4KHYsYil9eT0wLGYuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXswPT09ZSYmKHk9dC5yKSx0LnI9eSx5Kz12fSkpfXJldHVybiBmLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZFRoZXRhLHI9ZS5yO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSxvKXt2YXIgYT10LnN0YXJ0QW5nbGUrKHQuY2xvY2t3aXNlPzE6LTEpKm4qbztlLng9aVswXStyKk1hdGguY29zKGEpLGUueT1pWzFdK3IqTWF0aC5zaW4oYSl9KSl9KSksdC5vbkxheW91dEVuZCYmdC5vbkxheW91dEVuZCgpLHtub2RlczplLGVkZ2VzOm59fXQub25MYXlvdXRFbmQmJnQub25MYXlvdXRFbmQoKX19LHtrZXk6XCJnZXRUeXBlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cImNvbmNlbnRyaWNcIn19XSkmJl9hKGUucHJvdG90eXBlLG4pLHImJl9hKGUsciksb30oUW4pO2Z1bmN0aW9uIENhKHQpe3JldHVybihDYT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gSWEodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIFBhKHQsZSl7cmV0dXJuKFBhPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiBqYSh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPU5hKHQpO2lmKGUpe3ZhciBpPU5hKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBEYSh0aGlzLG4pfX1mdW5jdGlvbiBEYSh0LGUpe3JldHVybiFlfHxcIm9iamVjdFwiIT09Q2EoZSkmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9KHQpOmV9ZnVuY3Rpb24gTmEodCl7cmV0dXJuKE5hPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX12YXIgUmE9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZQYSh0LGUpfShvLHQpO3ZhciBlLG4scixpPWphKG8pO2Z1bmN0aW9uIG8odCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyxvKSwoZT1pLmNhbGwodGhpcykpLmNlbnRlcj1bMCwwXSxlLmxpbmtEaXN0YW5jZT01MCxlLm5vZGVzPVtdLGUuZWRnZXM9W10sZS5vbkxheW91dEVuZD1mdW5jdGlvbigpe30sZS51cGRhdGVDZmcodCksZX1yZXR1cm4gZT1vLChuPVt7a2V5OlwiZ2V0RGVmYXVsdENmZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2NlbnRlcjpbMCwwXSxsaW5rRGlzdGFuY2U6NTB9fX0se2tleTpcImV4ZWN1dGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMubm9kZXMsZT10aGlzLmVkZ2VzLG49dm9pZCAwPT09ZT9bXTplLHI9dGhpcy5jZW50ZXI7aWYodCYmMCE9PXQubGVuZ3RoKXtpZigxPT09dC5sZW5ndGgpcmV0dXJuIHRbMF0ueD1yWzBdLHRbMF0ueT1yWzFdLHZvaWQodGhpcy5vbkxheW91dEVuZCYmdGhpcy5vbkxheW91dEVuZCgpKTt2YXIgaT10aGlzLmxpbmtEaXN0YW5jZSxvPVhuKHtub2Rlczp0LGVkZ2VzOm59LCExKSxhPVduKG8pO3RoaXMuaGFuZGxlSW5maW5pdHkoYSk7dmFyIHMsdSxjPShzPWksdT1bXSxhLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5wdXNoKHQqcyl9KSksdS5wdXNoKGUpfSkpLHUpO3RoaXMuc2NhbGVkRGlzdGFuY2VzPWM7dmFyIGY9dGhpcy5ydW5NRFMoKTtyZXR1cm4gdGhpcy5wb3NpdGlvbnM9ZixmLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7dFtuXS54PWVbMF0rclswXSx0W25dLnk9ZVsxXStyWzFdfSkpLHRoaXMub25MYXlvdXRFbmQmJnRoaXMub25MYXlvdXRFbmQoKSx7bm9kZXM6dCxlZGdlczpufX10aGlzLm9uTGF5b3V0RW5kJiZ0aGlzLm9uTGF5b3V0RW5kKCl9fSx7a2V5OlwicnVuTURTXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNjYWxlZERpc3RhbmNlcyxlPXpvLm11bCh6by5wb3codCwyKSwtLjUpLG49ZS5tZWFuKFwicm93XCIpLHI9ZS5tZWFuKFwiY29sdW1uXCIpLGk9ZS5tZWFuKCk7ZS5hZGQoaSkuc3ViUm93VmVjdG9yKG4pLnN1YkNvbHVtblZlY3RvcihyKTt2YXIgbz1uZXcgJG8oZSksYT16by5zcXJ0KG8uZGlhZ29uYWxNYXRyaXgpLmRpYWdvbmFsKCk7cmV0dXJuIG8ubGVmdFNpbmd1bGFyVmVjdG9ycy50b0pTT04oKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB6by5tdWwoW3RdLFthXSkudG9KU09OKClbMF0uc3BsaWNlKDAsMil9KSl9fSx7a2V5OlwiaGFuZGxlSW5maW5pdHlcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0tOTk5OTk5O3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt0IT09MS8wJiZlPHQmJihlPXQpfSkpfSkpLHQuZm9yRWFjaCgoZnVuY3Rpb24obixyKXtuLmZvckVhY2goKGZ1bmN0aW9uKG4saSl7bj09PTEvMCYmKHRbcl1baV09ZSl9KSl9KSl9fSx7a2V5OlwiZ2V0VHlwZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuXCJtZHNcIn19XSkmJklhKGUucHJvdG90eXBlLG4pLHImJklhKGUsciksb30oUW4pO2Z1bmN0aW9uIExhKHQpe3JldHVybihMYT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gQmEodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIEdhKHQsZSl7cmV0dXJuKEdhPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiBGYSh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPXphKHQpO2lmKGUpe3ZhciBpPXphKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBVYSh0aGlzLG4pfX1mdW5jdGlvbiBVYSh0LGUpe3JldHVybiFlfHxcIm9iamVjdFwiIT09TGEoZSkmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9KHQpOmV9ZnVuY3Rpb24gemEodCl7cmV0dXJuKHphPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX12YXIgVmE9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZHYSh0LGUpfShvLHQpO3ZhciBlLG4scixpPUZhKG8pO2Z1bmN0aW9uIG8odCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyxvKSwoZT1pLmNhbGwodGhpcykpLm1heEl0ZXJhdGlvbj0xZTMsZS5ncmF2aXR5PTEwLGUuc3BlZWQ9MSxlLmNsdXN0ZXJpbmc9ITEsZS5jbHVzdGVyR3Jhdml0eT0xMCxlLm5vZGVzPVtdLGUuZWRnZXM9W10sZS53aWR0aD0zMDAsZS5oZWlnaHQ9MzAwLGUubm9kZU1hcD17fSxlLm5vZGVJZHhNYXA9e30sZS5vbkxheW91dEVuZD1mdW5jdGlvbigpe30sZS51cGRhdGVDZmcodCksZX1yZXR1cm4gZT1vLChuPVt7a2V5OlwiZ2V0RGVmYXVsdENmZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue21heEl0ZXJhdGlvbjoxZTMsZ3Jhdml0eToxMCxzcGVlZDoxLGNsdXN0ZXJpbmc6ITEsY2x1c3RlckdyYXZpdHk6MTB9fX0se2tleTpcImV4ZWN1dGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLm5vZGVzO2lmKGUmJjAhPT1lLmxlbmd0aCl7dGhpcy53aWR0aHx8XCJ1bmRlZmluZWRcIj09dHlwZW9mIHdpbmRvd3x8KHRoaXMud2lkdGg9d2luZG93LmlubmVyV2lkdGgpLHRoaXMuaGVpZ2h0fHxcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwodGhpcy5oZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0KSx0aGlzLmNlbnRlcnx8KHRoaXMuY2VudGVyPVt0aGlzLndpZHRoLzIsdGhpcy5oZWlnaHQvMl0pO3ZhciBuPXRoaXMuY2VudGVyO2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gZVswXS54PW5bMF0sZVswXS55PW5bMV0sdm9pZCh0aGlzLm9uTGF5b3V0RW5kJiZ0aGlzLm9uTGF5b3V0RW5kKCkpO3ZhciByPXt9LGk9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXtVbihlLngpfHwoZS54PU1hdGgucmFuZG9tKCkqdC53aWR0aCksVW4oZS55KXx8KGUueT1NYXRoLnJhbmRvbSgpKnQuaGVpZ2h0KSxyW2UuaWRdPWUsaVtlLmlkXT1ufSkpLHRoaXMubm9kZU1hcD1yLHRoaXMubm9kZUlkeE1hcD1pLHRoaXMucnVuKCl9dGhpcy5vbkxheW91dEVuZCYmdGhpcy5vbkxheW91dEVuZCgpfX0se2tleTpcInJ1blwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQubm9kZXMsbj10LmVkZ2VzLHI9dC5tYXhJdGVyYXRpb24saT10LmNlbnRlcixvPXQuaGVpZ2h0KnQud2lkdGgsYT1NYXRoLnNxcnQobykvMTAscz1vLyhlLmxlbmd0aCsxKSx1PU1hdGguc3FydChzKSxjPXQuZ3Jhdml0eSxmPXQuc3BlZWQsbD10LmNsdXN0ZXJpbmcsaD17fTtpZihsKWZvcih2YXIgZCBpbiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PWhbdC5jbHVzdGVyXSl7dmFyIGU9e25hbWU6dC5jbHVzdGVyLGN4OjAsY3k6MCxjb3VudDowfTtoW3QuY2x1c3Rlcl09ZX12YXIgbj1oW3QuY2x1c3Rlcl07VW4odC54KSYmKG4uY3grPXQueCksVW4odC55KSYmKG4uY3krPXQueSksbi5jb3VudCsrfSkpLGgpaFtkXS5jeC89aFtkXS5jb3VudCxoW2RdLmN5Lz1oW2RdLmNvdW50O2Zvcih2YXIgcD1mdW5jdGlvbihyKXt2YXIgbz1bXTtpZihlLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7b1tlXT17eDowLHk6MH19KSksdC5hcHBseUNhbGN1bGF0ZShlLG4sbyx1LHMpLGwpe3ZhciBkPXQuY2x1c3RlckdyYXZpdHl8fGM7Zm9yKHZhciBwIGluIGUuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtpZihVbih0LngpJiZVbih0LnkpKXt2YXIgbj1oW3QuY2x1c3Rlcl0scj1NYXRoLnNxcnQoKHQueC1uLmN4KSoodC54LW4uY3gpKyh0Lnktbi5jeSkqKHQueS1uLmN5KSksaT11KmQ7b1tlXS54LT1pKih0Lngtbi5jeCkvcixvW2VdLnktPWkqKHQueS1uLmN5KS9yfX0pKSxoKWhbcF0uY3g9MCxoW3BdLmN5PTAsaFtwXS5jb3VudD0wO2Zvcih2YXIgZyBpbiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWhbdC5jbHVzdGVyXTtVbih0LngpJiYoZS5jeCs9dC54KSxVbih0LnkpJiYoZS5jeSs9dC55KSxlLmNvdW50Kyt9KSksaCloW2ddLmN4Lz1oW2ddLmNvdW50LGhbZ10uY3kvPWhbZ10uY291bnR9ZS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe2lmKFVuKHQueCkmJlVuKHQueSkpe3ZhciBuPS4wMSp1KmM7b1tlXS54LT1uKih0LngtaVswXSksb1tlXS55LT1uKih0LnktaVsxXSl9fSkpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtpZihVbih0LngpJiZVbih0LnkpKXt2YXIgbj1NYXRoLnNxcnQob1tlXS54Km9bZV0ueCtvW2VdLnkqb1tlXS55KTtpZihuPjApe3ZhciByPU1hdGgubWluKGEqKGYvODAwKSxuKTt0LngrPW9bZV0ueC9uKnIsdC55Kz1vW2VdLnkvbipyfX19KSl9LGc9MDtnPHI7ZysrKXAoKTtyZXR1cm4gdC5vbkxheW91dEVuZCYmdC5vbkxheW91dEVuZCgpLHtub2RlczplLGVkZ2VzOm59fX0se2tleTpcImFwcGx5Q2FsY3VsYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt0aGlzLmNhbFJlcHVsc2l2ZSh0LG4saSksdGhpcy5jYWxBdHRyYWN0aXZlKGUsbixyKX19LHtrZXk6XCJjYWxSZXB1bHNpdmVcIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dC5mb3JFYWNoKChmdW5jdGlvbihyLGkpe2VbaV09e3g6MCx5OjB9LHQuZm9yRWFjaCgoZnVuY3Rpb24odCxvKXtpZihpIT09byYmVW4oci54KSYmVW4odC54KSYmVW4oci55KSYmVW4odC55KSl7dmFyIGE9ci54LXQueCxzPXIueS10LnksdT1hKmErcypzO2lmKDA9PT11KXt1PTE7dmFyIGM9aT5vPzE6LTE7YT0uMDEqYyxzPS4wMSpjfXZhciBmPW4vdTtlW2ldLngrPWEqZixlW2ldLnkrPXMqZn19KSl9KSl9fSx7a2V5OlwiY2FsQXR0cmFjdGl2ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodC5zb3VyY2UmJnQudGFyZ2V0KXt2YXIgaT1yLm5vZGVJZHhNYXBbdC5zb3VyY2VdLG89ci5ub2RlSWR4TWFwW3QudGFyZ2V0XTtpZihpIT09byl7dmFyIGE9ci5ub2RlTWFwW3Quc291cmNlXSxzPXIubm9kZU1hcFt0LnRhcmdldF07aWYoVW4ocy54KSYmVW4oYS54KSYmVW4ocy55KSYmVW4oYS55KSl7dmFyIHU9cy54LWEueCxjPXMueS1hLnksZj1NYXRoLnNxcnQodSp1K2MqYyksbD1mKmYvbjtlW29dLngtPXUvZipsLGVbb10ueS09Yy9mKmwsZVtpXS54Kz11L2YqbCxlW2ldLnkrPWMvZipsfX19fSkpfX0se2tleTpcImdldFR5cGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblwiZnJ1Y2h0ZXJtYW5cIn19XSkmJkJhKGUucHJvdG90eXBlLG4pLHImJkJhKGUsciksb30oUW4pLFdhPW4oMTApLFhhPW4ubihXYSksWWE9big2KSxIYT1uLm4oWWEpLHFhPW4oNyksS2E9bi5uKHFhKSxaYT1uKDExKSxRYT1uLm4oWmEpLEphPShuKDI4KSxuKDMpKSwkYT1uKDUpLHRzPW4oNDkpLGVzPW4ubih0cyk7ZnVuY3Rpb24gbnModCl7cmV0dXJuIHZvaWQgMD09PXQ/MDp0PjM2MHx8dDwtMzYwP3QlMzYwOnR9ZnVuY3Rpb24gcnModCxlLG4pe3JldHVybiBlcygpKHQpP3VuLmUuZnJvbVZhbHVlcyh0LGUsbik6Mz09PXQubGVuZ3RoP3VuLmUuY2xvbmUodCk6dW4uZS5mcm9tVmFsdWVzKHRbMF0sdFsxXSx0WzJdKX12YXIgaXMsb3MsYXMsc3MsdXMsY3MsZnMsbHMsaHMsZHMscHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbil7SGEoKSh0aGlzLHQpLHRoaXMubmFtZT12b2lkIDAsdGhpcy5tYXRyaXg9dm9pZCAwLHRoaXMucmlnaHQ9dm9pZCAwLHRoaXMudXA9dm9pZCAwLHRoaXMuZm9yd2FyZD12b2lkIDAsdGhpcy5wb3NpdGlvbj12b2lkIDAsdGhpcy5mb2NhbFBvaW50PXZvaWQgMCx0aGlzLmRpc3RhbmNlVmVjdG9yPXZvaWQgMCx0aGlzLmRpc3RhbmNlPXZvaWQgMCx0aGlzLmRvbGx5aW5nU3RlcD12b2lkIDAsdGhpcy5hemltdXRoPTAsdGhpcy5lbGV2YXRpb249MCx0aGlzLnJvbGw9MCx0aGlzLnJlbEF6aW11dGg9MCx0aGlzLnJlbEVsZXZhdGlvbj0wLHRoaXMucmVsUm9sbD0wLHRoaXMubmFtZT1lLHRoaXMubWF0cml4PXVuLmIuY2xvbmUobi5tYXRyaXgpLHRoaXMucmlnaHQ9dW4uZS5jbG9uZShuLnJpZ2h0KSx0aGlzLnVwPXVuLmUuY2xvbmUobi51cCksdGhpcy5mb3J3YXJkPXVuLmUuY2xvbmUobi5mb3J3YXJkKSx0aGlzLnBvc2l0aW9uPXVuLmUuY2xvbmUobi5wb3NpdGlvbiksdGhpcy5mb2NhbFBvaW50PXVuLmUuY2xvbmUobi5mb2NhbFBvaW50KSx0aGlzLmRpc3RhbmNlVmVjdG9yPXVuLmUuY2xvbmUobi5kaXN0YW5jZVZlY3RvciksdGhpcy5hemltdXRoPW4uYXppbXV0aCx0aGlzLmVsZXZhdGlvbj1uLmVsZXZhdGlvbix0aGlzLnJvbGw9bi5yb2xsLHRoaXMucmVsQXppbXV0aD1uLnJlbEF6aW11dGgsdGhpcy5yZWxFbGV2YXRpb249bi5yZWxFbGV2YXRpb24sdGhpcy5yZWxSb2xsPW4ucmVsUm9sbCx0aGlzLmRvbGx5aW5nU3RlcD1uLmRvbGx5aW5nU3RlcCx0aGlzLmRpc3RhbmNlPW4uZGlzdGFuY2V9cmV0dXJuIEthKCkodCxbe2tleTpcImdldFBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbn19LHtrZXk6XCJnZXRGb2NhbFBvaW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mb2NhbFBvaW50fX0se2tleTpcImdldFJvbGxcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJvbGx9fSx7a2V5OlwicmV0cmlldmVcIix2YWx1ZTpmdW5jdGlvbih0KXt0Lm1hdHJpeD11bi5iLmNvcHkodC5tYXRyaXgsdGhpcy5tYXRyaXgpLHQucmlnaHQ9dW4uZS5jb3B5KHQucmlnaHQsdGhpcy5yaWdodCksdC51cD11bi5lLmNvcHkodC51cCx0aGlzLnVwKSx0LmZvcndhcmQ9dW4uZS5jb3B5KHQuZm9yd2FyZCx0aGlzLmZvcndhcmQpLHQucG9zaXRpb249dW4uZS5jb3B5KHQucG9zaXRpb24sdGhpcy5wb3NpdGlvbiksdC5mb2NhbFBvaW50PXVuLmUuY29weSh0LmZvY2FsUG9pbnQsdGhpcy5mb2NhbFBvaW50KSx0LmRpc3RhbmNlVmVjdG9yPXVuLmUuY29weSh0LmRpc3RhbmNlVmVjdG9yLHRoaXMuZGlzdGFuY2VWZWN0b3IpLHQuYXppbXV0aD10aGlzLmF6aW11dGgsdC5lbGV2YXRpb249dGhpcy5lbGV2YXRpb24sdC5yb2xsPXRoaXMucm9sbCx0LnJlbEF6aW11dGg9dGhpcy5yZWxBemltdXRoLHQucmVsRWxldmF0aW9uPXRoaXMucmVsRWxldmF0aW9uLHQucmVsUm9sbD10aGlzLnJlbFJvbGwsdC5kb2xseWluZ1N0ZXA9dGhpcy5kb2xseWluZ1N0ZXAsdC5kaXN0YW5jZT10aGlzLmRpc3RhbmNlfX1dKSx0fSgpOyFmdW5jdGlvbih0KXt0Lk9SQklUSU5HPVwiT1JCSVRJTkdcIix0LkVYUExPUklORz1cIkVYUExPUklOR1wiLHQuVFJBQ0tJTkc9XCJUUkFDS0lOR1wifShsc3x8KGxzPXt9KSksZnVuY3Rpb24odCl7dC5ERUZBVUxUPVwiREVGQVVMVFwiLHQuUk9UQVRJT05BTD1cIlJPVEFUSU9OQUxcIix0LlRSQU5TTEFUSU9OQUw9XCJUUkFOU0xBVElPTkFMXCIsdC5DSU5FTUFUSUM9XCJDSU5FTUFUSUNcIn0oaHN8fChocz17fSkpLGZ1bmN0aW9uKHQpe3QuT1JUSE9HUkFQSElDPVwiT1JUSE9HUkFQSElDXCIsdC5QRVJTUEVDVElWRT1cIlBFUlNQRUNUSVZFXCJ9KGRzfHwoZHM9e30pKTt2YXIgZ3MsdnMseXMsbXMsYnMseHMsd3MsU3MsRXMsX3MsT3Msa3MsTXMsQXMsVHM9TWF0aC5QSS8xODAsQ3M9MTgwL01hdGguUEksSXM9KGlzPU9iamVjdCgkYS5pbmplY3RhYmxlKSgpLG9zPU9iamVjdCgkYS5pbmplY3QpKEphLklERU5USUZJRVIuSW50ZXJhY3RvclNlcnZpY2UpLGlzKChmcz1jcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtIYSgpKHRoaXMsdCksdGhpcy5tYXRyaXg9dW4uYi5jcmVhdGUoKSx0aGlzLnJpZ2h0PXVuLmUuZnJvbVZhbHVlcygxLDAsMCksdGhpcy51cD11bi5lLmZyb21WYWx1ZXMoMCwxLDApLHRoaXMuZm9yd2FyZD11bi5lLmZyb21WYWx1ZXMoMCwwLDEpLHRoaXMucG9zaXRpb249dW4uZS5mcm9tVmFsdWVzKDAsMCwxKSx0aGlzLmZvY2FsUG9pbnQ9dW4uZS5mcm9tVmFsdWVzKDAsMCwwKSx0aGlzLmRpc3RhbmNlVmVjdG9yPXVuLmUuZnJvbVZhbHVlcygwLDAsMCksdGhpcy5kaXN0YW5jZT0xLHRoaXMuYXppbXV0aD0wLHRoaXMuZWxldmF0aW9uPTAsdGhpcy5yb2xsPTAsdGhpcy5yZWxBemltdXRoPTAsdGhpcy5yZWxFbGV2YXRpb249MCx0aGlzLnJlbFJvbGw9MCx0aGlzLmRvbGx5aW5nU3RlcD0wLHRoaXMubWF4RGlzdGFuY2U9MS8wLHRoaXMubWluRGlzdGFuY2U9LTEvMCx0aGlzLnJvdGF0ZVdvcmxkPSExLFhhKCkodGhpcyxcImludGVyYWN0b3JcIix1cyx0aGlzKSx0aGlzLmZvdj0zMCx0aGlzLm5lYXI9LjEsdGhpcy5mYXI9MWU0LHRoaXMuYXNwZWN0PTEsdGhpcy5sZWZ0PXZvaWQgMCx0aGlzLnJyaWdodD12b2lkIDAsdGhpcy50b3A9dm9pZCAwLHRoaXMuYm90dG9tPXZvaWQgMCx0aGlzLnpvb209MSx0aGlzLnBlcnNwZWN0aXZlPXVuLmIuY3JlYXRlKCksdGhpcy52aWV3PXZvaWQgMCx0aGlzLmZvbGxvd2luZz12b2lkIDAsdGhpcy50eXBlPWxzLkVYUExPUklORyx0aGlzLnRyYWNraW5nTW9kZT1ocy5ERUZBVUxULHRoaXMucHJvamVjdGlvbk1vZGU9ZHMuUEVSU1BFQ1RJVkUsdGhpcy5mcnVzdHVtPW5ldyBKYS5GcnVzdHVtLHRoaXMubGFuZG1hcmtzPVtdLHRoaXMubGFuZG1hcmtBbmltYXRpb25JRD12b2lkIDB9cmV0dXJuIEthKCkodCxbe2tleTpcImNsb25lXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgdDtyZXR1cm4gZS5zZXRUeXBlKHRoaXMudHlwZSx2b2lkIDApLGUuaW50ZXJhY3Rvcj10aGlzLmludGVyYWN0b3IsZX19LHtrZXk6XCJnZXRQcm9qZWN0aW9uTW9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvamVjdGlvbk1vZGV9fSx7a2V5OlwiZ2V0UGVyc3BlY3RpdmVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBlcnNwZWN0aXZlfX0se2tleTpcImdldEZydXN0dW1cIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZydXN0dW19fSx7a2V5OlwiZ2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9ufX0se2tleTpcInNldFR5cGVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnR5cGU9dCx0aGlzLnR5cGU9PT1scy5FWFBMT1JJTkc/dGhpcy5zZXRXb3JsZFJvdGF0aW9uKCEwKTp0aGlzLnNldFdvcmxkUm90YXRpb24oITEpLHRoaXMuX2dldEFuZ2xlcygpLHRoaXMudHlwZT09PWxzLlRSQUNLSU5HJiZ2b2lkIDAhPT1lJiZ0aGlzLnNldFRyYWNraW5nTW9kZShlKSx0aGlzfX0se2tleTpcInNldFByb2plY3Rpb25Nb2RlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJvamVjdGlvbk1vZGU9dCx0aGlzfX0se2tleTpcInNldFRyYWNraW5nTW9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWxzLlRSQUNLSU5HKXRocm93IG5ldyBFcnJvcihcIkltcG9zc2libGUgdG8gc2V0IGEgdHJhY2tpbmcgbW9kZSBpZiB0aGUgY2FtZXJhIGlzIG5vdCBvZiB0cmFja2luZyB0eXBlXCIpO3JldHVybiB0aGlzLnRyYWNraW5nTW9kZT10LHRoaXN9fSx7a2V5Olwic2V0V29ybGRSb3RhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMucm90YXRlV29ybGQ9dCx0aGlzLl9nZXRBbmdsZXMoKX19LHtrZXk6XCJnZXRWaWV3VHJhbnNmb3JtXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdW4uYi5pbnZlcnQodW4uYi5jcmVhdGUoKSx0aGlzLm1hdHJpeCl9fSx7a2V5OlwiZ2V0V29ybGRUcmFuc2Zvcm1cIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdHJpeH19LHtrZXk6XCJzZXRNYXRyaXhcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tYXRyaXg9dCx0aGlzLl91cGRhdGUoKSx0aGlzfX0se2tleTpcInNldEFzcGVjdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNldFBlcnNwZWN0aXZlKHRoaXMubmVhcix0aGlzLmZhcix0aGlzLmZvdix0KSx0aGlzfX0se2tleTpcInNldFZpZXdPZmZzZXRcIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLGksbyl7cmV0dXJuIHRoaXMuYXNwZWN0PXQvZSx2b2lkIDA9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9dCx0aGlzLnZpZXcuZnVsbEhlaWdodD1lLHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9cix0aGlzLnZpZXcud2lkdGg9aSx0aGlzLnZpZXcuaGVpZ2h0PW8sdGhpcy5wcm9qZWN0aW9uTW9kZT09PWRzLlBFUlNQRUNUSVZFP3RoaXMuc2V0UGVyc3BlY3RpdmUodGhpcy5uZWFyLHRoaXMuZmFyLHRoaXMuZm92LHRoaXMuYXNwZWN0KTp0aGlzLnNldE9ydGhvZ3JhcGhpYyh0aGlzLmxlZnQsdGhpcy5ycmlnaHQsdGhpcy50b3AsdGhpcy5ib3R0b20sdGhpcy5uZWFyLHRoaXMuZmFyKSx0aGlzfX0se2tleTpcImNsZWFyVmlld09mZnNldFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnByb2plY3Rpb25Nb2RlPT09ZHMuUEVSU1BFQ1RJVkU/dGhpcy5zZXRQZXJzcGVjdGl2ZSh0aGlzLm5lYXIsdGhpcy5mYXIsdGhpcy5mb3YsdGhpcy5hc3BlY3QpOnRoaXMuc2V0T3J0aG9ncmFwaGljKHRoaXMubGVmdCx0aGlzLnJyaWdodCx0aGlzLnRvcCx0aGlzLmJvdHRvbSx0aGlzLm5lYXIsdGhpcy5mYXIpLHRoaXN9fSx7a2V5Olwic2V0UGVyc3BlY3RpdmVcIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uTW9kZT1kcy5QRVJTUEVDVElWRSx0aGlzLmZvdj1uLHRoaXMubmVhcj10LHRoaXMuZmFyPWUsdGhpcy5hc3BlY3Q9cix1bi5iLnBlcnNwZWN0aXZlKHRoaXMucGVyc3BlY3RpdmUsdGhpcy5mb3YqVHMsdGhpcy5hc3BlY3QsdGhpcy5uZWFyLHRoaXMuZmFyKSx0aGlzfX0se2tleTpcInNldE9ydGhvZ3JhcGhpY1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt0aGlzLnByb2plY3Rpb25Nb2RlPWRzLk9SVEhPR1JBUEhJQyx0aGlzLnJyaWdodD1lLHRoaXMubGVmdD10LHRoaXMudG9wPW4sdGhpcy5ib3R0b209cix0aGlzLm5lYXI9aSx0aGlzLmZhcj1vO3ZhciBhPSh0aGlzLnJyaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSkscz0odGhpcy50b3AtdGhpcy5ib3R0b20pLygyKnRoaXMuem9vbSksdT0odGhpcy5ycmlnaHQrdGhpcy5sZWZ0KS8yLGM9KHRoaXMudG9wK3RoaXMuYm90dG9tKS8yLGY9dS1hLGw9dSthLGg9YytzLGQ9Yy1zO2lmKHZvaWQgMCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe3ZhciBwPSh0aGlzLnJyaWdodC10aGlzLmxlZnQpL3RoaXMudmlldy5mdWxsV2lkdGgvdGhpcy56b29tLGc9KHRoaXMudG9wLXRoaXMuYm90dG9tKS90aGlzLnZpZXcuZnVsbEhlaWdodC90aGlzLnpvb207bD0oZis9cCp0aGlzLnZpZXcub2Zmc2V0WCkrcCp0aGlzLnZpZXcud2lkdGgsZD0oaC09Zyp0aGlzLnZpZXcub2Zmc2V0WSktZyp0aGlzLnZpZXcuaGVpZ2h0fXJldHVybiB1bi5iLm9ydGhvKHRoaXMucGVyc3BlY3RpdmUsZixsLGgsZCxpLG8pLHRoaXN9fSx7a2V5Olwic2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX3NldFBvc2l0aW9uKHQsZSxuKSx0aGlzLnNldEZvY2FsUG9pbnQodGhpcy5mb2NhbFBvaW50KSx0aGlzfX0se2tleTpcInNldEZvY2FsUG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dW4uZS5mcm9tVmFsdWVzKDAsMSwwKTtpZih0aGlzLmZvY2FsUG9pbnQ9cnModCxlLG4pLHRoaXMudHJhY2tpbmdNb2RlPT09aHMuQ0lORU1BVElDKXt2YXIgaT11bi5lLnN1YnRyYWN0KHVuLmUuY3JlYXRlKCksdGhpcy5mb2NhbFBvaW50LHRoaXMucG9zaXRpb24pO3Q9aVswXSxlPWlbMV0sbj1pWzJdO3ZhciBvPXVuLmUubGVuZ3RoKGkpLGE9TWF0aC5hc2luKGUvbykqQ3Mscz05MCtNYXRoLmF0YW4yKG4sdCkqQ3MsdT11bi5iLmNyZWF0ZSgpO3VuLmIucm90YXRlWSh1LHUscypUcyksdW4uYi5yb3RhdGVYKHUsdSxhKlRzKSxyPXVuLmUudHJhbnNmb3JtTWF0NCh1bi5lLmNyZWF0ZSgpLFswLDEsMF0sdSl9cmV0dXJuIHVuLmIuaW52ZXJ0KHRoaXMubWF0cml4LHVuLmIubG9va0F0KHVuLmIuY3JlYXRlKCksdGhpcy5wb3NpdGlvbix0aGlzLmZvY2FsUG9pbnQscikpLHRoaXMuX2dldEF4ZXMoKSx0aGlzLl9nZXREaXN0YW5jZSgpLHRoaXMuX2dldEFuZ2xlcygpLHRoaXN9fSx7a2V5Olwic2V0RGlzdGFuY2VcIix2YWx1ZTpmdW5jdGlvbih0KXtpZighKHRoaXMuZGlzdGFuY2U9PT10fHx0PDApKXt0aGlzLmRpc3RhbmNlPXQsdGhpcy5kaXN0YW5jZTwyZS00JiYodGhpcy5kaXN0YW5jZT0yZS00KSx0aGlzLmRvbGx5aW5nU3RlcD10aGlzLmRpc3RhbmNlLzEwMDt2YXIgZT11bi5lLmNyZWF0ZSgpO3Q9dGhpcy5kaXN0YW5jZTt2YXIgbj10aGlzLmZvcndhcmQscj10aGlzLmZvY2FsUG9pbnQ7cmV0dXJuIGVbMF09dCpuWzBdK3JbMF0sZVsxXT10Km5bMV0rclsxXSxlWzJdPXQqblsyXStyWzJdLHRoaXMuX3NldFBvc2l0aW9uKGUpLHRoaXN9fX0se2tleTpcInNldE1heERpc3RhbmNlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWF4RGlzdGFuY2U9dCx0aGlzfX0se2tleTpcInNldE1pbkRpc3RhbmNlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWluRGlzdGFuY2U9dCx0aGlzfX0se2tleTpcImNoYW5nZUF6aW11dGhcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXRBemltdXRoKHRoaXMuYXppbXV0aCt0KSx0aGlzfX0se2tleTpcImNoYW5nZUVsZXZhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNldEVsZXZhdGlvbih0aGlzLmVsZXZhdGlvbit0KSx0aGlzfX0se2tleTpcImNoYW5nZVJvbGxcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXRSb2xsKHRoaXMucm9sbCt0KSx0aGlzfX0se2tleTpcInNldEF6aW11dGhcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hemltdXRoPW5zKHQpLHRoaXMuY29tcHV0ZU1hdHJpeCgpLHRoaXMuX2dldEF4ZXMoKSx0aGlzLnR5cGU9PT1scy5PUkJJVElOR3x8dGhpcy50eXBlPT09bHMuRVhQTE9SSU5HP3RoaXMuX2dldFBvc2l0aW9uKCk6dGhpcy50eXBlPT09bHMuVFJBQ0tJTkcmJnRoaXMuX2dldEZvY2FsUG9pbnQoKSx0aGlzfX0se2tleTpcImdldEF6aW11dGhcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF6aW11dGh9fSx7a2V5Olwic2V0RWxldmF0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWxldmF0aW9uPW5zKHQpLHRoaXMuY29tcHV0ZU1hdHJpeCgpLHRoaXMuX2dldEF4ZXMoKSx0aGlzLnR5cGU9PT1scy5PUkJJVElOR3x8dGhpcy50eXBlPT09bHMuRVhQTE9SSU5HP3RoaXMuX2dldFBvc2l0aW9uKCk6dGhpcy50eXBlPT09bHMuVFJBQ0tJTkcmJnRoaXMuX2dldEZvY2FsUG9pbnQoKSx0aGlzfX0se2tleTpcInNldFJvbGxcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yb2xsPW5zKHQpLHRoaXMuY29tcHV0ZU1hdHJpeCgpLHRoaXMuX2dldEF4ZXMoKSx0aGlzLnR5cGU9PT1scy5PUkJJVElOR3x8dGhpcy50eXBlPT09bHMuRVhQTE9SSU5HP3RoaXMuX2dldFBvc2l0aW9uKCk6dGhpcy50eXBlPT09bHMuVFJBQ0tJTkcmJnRoaXMuX2dldEZvY2FsUG9pbnQoKSx0aGlzfX0se2tleTpcInJvdGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLnR5cGU9PT1scy5FWFBMT1JJTkcpe3Q9bnModCksZT1ucyhlKSxuPW5zKG4pO3ZhciByPXVuLmMuc2V0QXhpc0FuZ2xlKHVuLmMuY3JlYXRlKCksWzEsMCwwXSwodGhpcy5yb3RhdGVXb3JsZD8xOi0xKSplKlRzKSxpPXVuLmMuc2V0QXhpc0FuZ2xlKHVuLmMuY3JlYXRlKCksWzAsMSwwXSwodGhpcy5yb3RhdGVXb3JsZD8xOi0xKSp0KlRzKSxvPXVuLmMuc2V0QXhpc0FuZ2xlKHVuLmMuY3JlYXRlKCksWzAsMCwxXSxuKlRzKSxhPXVuLmMubXVsdGlwbHkodW4uYy5jcmVhdGUoKSxpLHIpO2E9dW4uYy5tdWx0aXBseSh1bi5jLmNyZWF0ZSgpLGEsbyk7dmFyIHM9dW4uYi5mcm9tUXVhdCh1bi5iLmNyZWF0ZSgpLGEpO3VuLmIudHJhbnNsYXRlKHRoaXMubWF0cml4LHRoaXMubWF0cml4LFswLDAsLXRoaXMuZGlzdGFuY2VdKSx1bi5iLm11bHRpcGx5KHRoaXMubWF0cml4LHRoaXMubWF0cml4LHMpLHVuLmIudHJhbnNsYXRlKHRoaXMubWF0cml4LHRoaXMubWF0cml4LFswLDAsdGhpcy5kaXN0YW5jZV0pfWVsc2V7aWYoTWF0aC5hYnModGhpcy5lbGV2YXRpb24rZSk+OTApcmV0dXJuO3RoaXMucmVsRWxldmF0aW9uPW5zKGUpLHRoaXMucmVsQXppbXV0aD1ucyh0KSx0aGlzLnJlbFJvbGw9bnMobiksdGhpcy5lbGV2YXRpb24rPXRoaXMucmVsRWxldmF0aW9uLHRoaXMuYXppbXV0aCs9dGhpcy5yZWxBemltdXRoLHRoaXMucm9sbCs9dGhpcy5yZWxSb2xsLHRoaXMuY29tcHV0ZU1hdHJpeCgpfXJldHVybiB0aGlzLl9nZXRBeGVzKCksdGhpcy50eXBlPT09bHMuT1JCSVRJTkd8fHRoaXMudHlwZT09PWxzLkVYUExPUklORz90aGlzLl9nZXRQb3NpdGlvbigpOnRoaXMudHlwZT09PWxzLlRSQUNLSU5HJiZ0aGlzLl9nZXRGb2NhbFBvaW50KCksdGhpcy5fdXBkYXRlKCksdGhpc319LHtrZXk6XCJwYW5cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXJzKHQsZSwwKSxyPXVuLmUuY2xvbmUodGhpcy5wb3NpdGlvbik7cmV0dXJuIHVuLmUuYWRkKHIscix1bi5lLnNjYWxlKHVuLmUuY3JlYXRlKCksdGhpcy5yaWdodCxuWzBdKSksdW4uZS5hZGQocixyLHVuLmUuc2NhbGUodW4uZS5jcmVhdGUoKSx0aGlzLnVwLG5bMV0pKSx0aGlzLl9zZXRQb3NpdGlvbihyKSx0aGlzfX0se2tleTpcImRvbGx5XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mb3J3YXJkLG49dW4uZS5jbG9uZSh0aGlzLnBvc2l0aW9uKSxyPXRoaXMuZG9sbHlpbmdTdGVwLGk9dGhpcy5kaXN0YW5jZSt0KnRoaXMuZG9sbHlpbmdTdGVwO3JldHVybiByPU1hdGgubWF4KE1hdGgubWluKGksdGhpcy5tYXhEaXN0YW5jZSksdGhpcy5taW5EaXN0YW5jZSktdGhpcy5kaXN0YW5jZSxuWzBdKz1yKmVbMF0sblsxXSs9ciplWzFdLG5bMl0rPXIqZVsyXSx0aGlzLl9zZXRQb3NpdGlvbihuKSx0aGlzLnR5cGU9PT1scy5PUkJJVElOR3x8dGhpcy50eXBlPT09bHMuRVhQTE9SSU5HP3RoaXMuX2dldERpc3RhbmNlKCk6dGhpcy50eXBlPT09bHMuVFJBQ0tJTkcmJnVuLmUuYWRkKHRoaXMuZm9jYWxQb2ludCxuLHRoaXMuZGlzdGFuY2VWZWN0b3IpLHRoaXN9fSx7a2V5OlwiY3JlYXRlTGFuZG1hcmtcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY2xvbmUoKTtuLnNldFBvc2l0aW9uKGUucG9zaXRpb24pLG4uc2V0Rm9jYWxQb2ludChlLmZvY2FsUG9pbnQpLHZvaWQgMCE9PWUucm9sbCYmbi5zZXRSb2xsKGUucm9sbCk7dmFyIHI9bmV3IHBzKHQsbik7cmV0dXJuIHRoaXMubGFuZG1hcmtzLnB1c2gocikscn19LHtrZXk6XCJzZXRMYW5kbWFya1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBwcyh0LHRoaXMpO3JldHVybiB0aGlzLmxhbmRtYXJrcy5wdXNoKGUpLHRoaXN9fSx7a2V5OlwiZ290b0xhbmRtYXJrXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxZTMscj10aGlzLmxhbmRtYXJrcy5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lPT09dH0pKTtpZihyKXtpZigwPT09bilyZXR1cm4gdm9pZCByLnJldHJpZXZlKHRoaXMpO3ZvaWQgMCE9PXRoaXMubGFuZG1hcmtBbmltYXRpb25JRCYmd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubGFuZG1hcmtBbmltYXRpb25JRCksdGhpcy5pbnRlcmFjdG9yLmRpc2Nvbm5lY3QoKTt2YXIgaSxvPXIuZ2V0UG9zaXRpb24oKSxhPXIuZ2V0Rm9jYWxQb2ludCgpLHM9ci5nZXRSb2xsKCksdT1mdW5jdGlvbiB0KHIpe3ZvaWQgMD09PWkmJihpPXIpO3ZhciB1LGM9ci1pLGY9KDEtTWF0aC5jb3MoYy9uKk1hdGguUEkpKS8yLGw9dW4uZS5jcmVhdGUoKSxoPXVuLmUuY3JlYXRlKCk7aWYodW4uZS5sZXJwKGwsZS5mb2NhbFBvaW50LGEsZiksdW4uZS5sZXJwKGgsZS5wb3NpdGlvbixvLGYpLHU9ZS5yb2xsKigxLWYpK3MqZixlLnNldEZvY2FsUG9pbnQobCksZS5zZXRQb3NpdGlvbihoKSxlLnNldFJvbGwodSksZS5jb21wdXRlTWF0cml4KCksISh1bi5lLmRpc3QobCxhKSt1bi5lLmRpc3QoaCxvKT4uMDEpKXJldHVybiBlLnNldEZvY2FsUG9pbnQobCksZS5zZXRQb3NpdGlvbihoKSxlLnNldFJvbGwodSksZS5jb21wdXRlTWF0cml4KCksdm9pZCBlLmludGVyYWN0b3IuY29ubmVjdCgpO2M8biYmKGUubGFuZG1hcmtBbmltYXRpb25JRD13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpKX07d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh1KX19fSx7a2V5OlwiX3VwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fZ2V0QXhlcygpLHRoaXMuX2dldFBvc2l0aW9uKCksdGhpcy5fZ2V0RGlzdGFuY2UoKSx0aGlzLl9nZXRBbmdsZXMoKX19LHtrZXk6XCJjb21wdXRlTWF0cml4XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlLG49dW4uYy5zZXRBeGlzQW5nbGUodW4uYy5jcmVhdGUoKSxbMCwwLDFdLHRoaXMucm9sbCpUcyk7dW4uYi5pZGVudGl0eSh0aGlzLm1hdHJpeCksdD11bi5jLnNldEF4aXNBbmdsZSh1bi5jLmNyZWF0ZSgpLFsxLDAsMF0sKHRoaXMucm90YXRlV29ybGQmJnRoaXMudHlwZSE9PWxzLlRSQUNLSU5HfHx0aGlzLnR5cGU9PT1scy5UUkFDS0lORz8xOi0xKSp0aGlzLmVsZXZhdGlvbipUcyksZT11bi5jLnNldEF4aXNBbmdsZSh1bi5jLmNyZWF0ZSgpLFswLDEsMF0sKHRoaXMucm90YXRlV29ybGQmJnRoaXMudHlwZSE9PWxzLlRSQUNLSU5HfHx0aGlzLnR5cGU9PT1scy5UUkFDS0lORz8xOi0xKSp0aGlzLmF6aW11dGgqVHMpO3ZhciByPXVuLmMubXVsdGlwbHkodW4uYy5jcmVhdGUoKSxlLHQpO3I9dW4uYy5tdWx0aXBseSh1bi5jLmNyZWF0ZSgpLHIsbik7dmFyIGk9dW4uYi5mcm9tUXVhdCh1bi5iLmNyZWF0ZSgpLHIpO3RoaXMudHlwZT09PWxzLk9SQklUSU5HfHx0aGlzLnR5cGU9PT1scy5FWFBMT1JJTkc/KHVuLmIudHJhbnNsYXRlKHRoaXMubWF0cml4LHRoaXMubWF0cml4LHRoaXMuZm9jYWxQb2ludCksdW4uYi5tdWx0aXBseSh0aGlzLm1hdHJpeCx0aGlzLm1hdHJpeCxpKSx1bi5iLnRyYW5zbGF0ZSh0aGlzLm1hdHJpeCx0aGlzLm1hdHJpeCxbMCwwLHRoaXMuZGlzdGFuY2VdKSk6dGhpcy50eXBlPT09bHMuVFJBQ0tJTkcmJih1bi5iLnRyYW5zbGF0ZSh0aGlzLm1hdHJpeCx0aGlzLm1hdHJpeCx0aGlzLnBvc2l0aW9uKSx1bi5iLm11bHRpcGx5KHRoaXMubWF0cml4LHRoaXMubWF0cml4LGkpKX19LHtrZXk6XCJfc2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wb3NpdGlvbj1ycyh0LGUsbik7dmFyIHI9dGhpcy5tYXRyaXg7clsxMl09dGhpcy5wb3NpdGlvblswXSxyWzEzXT10aGlzLnBvc2l0aW9uWzFdLHJbMTRdPXRoaXMucG9zaXRpb25bMl0sclsxNV09MX19LHtrZXk6XCJfZ2V0QXhlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dW4uZS5jb3B5KHRoaXMucmlnaHQscnModW4uZi50cmFuc2Zvcm1NYXQ0KHVuLmYuY3JlYXRlKCksWzEsMCwwLDBdLHRoaXMubWF0cml4KSkpLHVuLmUuY29weSh0aGlzLnVwLHJzKHVuLmYudHJhbnNmb3JtTWF0NCh1bi5mLmNyZWF0ZSgpLFswLDEsMCwwXSx0aGlzLm1hdHJpeCkpKSx1bi5lLmNvcHkodGhpcy5mb3J3YXJkLHJzKHVuLmYudHJhbnNmb3JtTWF0NCh1bi5mLmNyZWF0ZSgpLFswLDAsMSwwXSx0aGlzLm1hdHJpeCkpKSx1bi5lLm5vcm1hbGl6ZSh0aGlzLnJpZ2h0LHRoaXMucmlnaHQpLHVuLmUubm9ybWFsaXplKHRoaXMudXAsdGhpcy51cCksdW4uZS5ub3JtYWxpemUodGhpcy5mb3J3YXJkLHRoaXMuZm9yd2FyZCl9fSx7a2V5OlwiX2dldEFuZ2xlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kaXN0YW5jZVZlY3RvclswXSxlPXRoaXMuZGlzdGFuY2VWZWN0b3JbMV0sbj10aGlzLmRpc3RhbmNlVmVjdG9yWzJdLHI9dW4uZS5sZW5ndGgodGhpcy5kaXN0YW5jZVZlY3Rvcik7aWYoMD09PXIpcmV0dXJuIHRoaXMuZWxldmF0aW9uPTAsdm9pZCh0aGlzLmF6aW11dGg9MCk7dGhpcy50eXBlPT09bHMuVFJBQ0tJTkd8fHRoaXMucm90YXRlV29ybGQ/KHRoaXMuZWxldmF0aW9uPU1hdGguYXNpbihlL3IpKkNzLHRoaXMuYXppbXV0aD1NYXRoLmF0YW4yKC10LC1uKSpDcyk6KHRoaXMuZWxldmF0aW9uPS1NYXRoLmFzaW4oZS9yKSpDcyx0aGlzLmF6aW11dGg9LU1hdGguYXRhbjIoLXQsLW4pKkNzKX19LHtrZXk6XCJfZ2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbigpe3VuLmUuY29weSh0aGlzLnBvc2l0aW9uLHJzKHVuLmYudHJhbnNmb3JtTWF0NCh1bi5mLmNyZWF0ZSgpLFswLDAsMCwxXSx0aGlzLm1hdHJpeCkpKSx0aGlzLl9nZXREaXN0YW5jZSgpfX0se2tleTpcIl9nZXRGb2NhbFBvaW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt1bi5lLnRyYW5zZm9ybU1hdDModGhpcy5kaXN0YW5jZVZlY3RvcixbMCwwLC10aGlzLmRpc3RhbmNlXSx1bi5hLmZyb21NYXQ0KHVuLmEuY3JlYXRlKCksdGhpcy5tYXRyaXgpKSx1bi5lLmFkZCh0aGlzLmZvY2FsUG9pbnQsdGhpcy5wb3NpdGlvbix0aGlzLmRpc3RhbmNlVmVjdG9yKSx0aGlzLl9nZXREaXN0YW5jZSgpfX0se2tleTpcIl9nZXREaXN0YW5jZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5kaXN0YW5jZVZlY3Rvcj11bi5lLnN1YnRyYWN0KHVuLmUuY3JlYXRlKCksdGhpcy5mb2NhbFBvaW50LHRoaXMucG9zaXRpb24pLHRoaXMuZGlzdGFuY2U9dW4uZS5sZW5ndGgodGhpcy5kaXN0YW5jZVZlY3RvciksdGhpcy5kb2xseWluZ1N0ZXA9dGhpcy5kaXN0YW5jZS8xMDB9fV0pLHR9KCksY3MuUHJvamVjdGlvbk1vZGU9e09SVEhPR1JBUEhJQzpcIk9SVEhPR1JBUEhJQ1wiLFBFUlNQRUNUSVZFOlwiUEVSU1BFQ1RJVkVcIn0sc3M9ZnMsdXM9UWEoKShzcy5wcm90b3R5cGUsXCJpbnRlcmFjdG9yXCIsW29zXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLGFzPXNzKSl8fGFzKSxQcz0oZ3M9T2JqZWN0KCRhLmluamVjdGFibGUpKCksdnM9T2JqZWN0KCRhLmluamVjdCkoSmEuSURFTlRJRklFUi5HZW9tZXRyeUNvbXBvbmVudE1hbmFnZXIpLGdzKCh3cz14cz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtIYSgpKHRoaXMsdCksdGhpcy5jb25maWc9dm9pZCAwLFhhKCkodGhpcyxcImdlb21ldHJ5XCIsYnMsdGhpcyksdGhpcy5lbnRpdHk9dm9pZCAwLHRoaXMuY29tcG9uZW50PXZvaWQgMH1yZXR1cm4gS2EoKSh0LFt7a2V5OlwiZ2V0RW50aXR5XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnRpdHl9fSx7a2V5OlwiZ2V0Q29tcG9uZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnR9fSx7a2V5Olwic2V0Q29uZmlnXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5jb25maWc9dH19LHtrZXk6XCJzZXRFbnRpdHlcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmVudGl0eT10LHRoaXMuY29tcG9uZW50PXRoaXMuZ2VvbWV0cnkuY3JlYXRlKHQpLHRoaXMuY29tcG9uZW50LmVudGl0eT10LHRoaXMub25FbnRpdHlDcmVhdGVkKCl9fSx7a2V5Olwib25FbnRpdHlDcmVhdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXt9fV0pLHR9KCkseHMuQk9YPVwiYm94XCIseHMuU1BIRVJFPVwic3BoZXJlXCIseHMuUExBTkU9XCJwbGFuZVwiLHhzLk1FUkdFRD1cIm1lcmdlZFwiLG1zPXdzLGJzPVFhKCkobXMucHJvdG90eXBlLFwiZ2VvbWV0cnlcIixbdnNdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSkseXM9bXMpKXx8eXMpLGpzPW4oOSksRHM9bi5uKGpzKSxOcz1uKDE0KSxScz1uLm4oTnMpLExzPW4oNCksQnM9bi5uKExzKSxHcz1uKDMyKSxGcz1uLm4oR3MpLFVzPW4oMjkpLHpzPW4ubihVcyksVnM9big4KTtmdW5jdGlvbiBXcygpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBkb2N1bWVudClyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTt0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGEgY2FudmFzIGluIHRoaXMgY29udGV4dFwiKX1mdW5jdGlvbiBYcyh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gWXModCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/WHMoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtCcygpKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpYcyhPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH12YXIgSHMscXMsS3MsWnMsUXMsSnMsJHMsdHUsZXUsbnUscnUsaXUsb3UsYXUsc3UsdXUsY3UsZnUsbHUsaHUsZHUscHUsZ3UsdnUseXUsbXUsYnUseHUsd3UsU3UsRXUsX3UsT3Usa3UsTXUsQXU9KFNzPU9iamVjdCgkYS5pbmplY3RhYmxlKSgpLEVzPU9iamVjdCgkYS5pbmplY3QpKEphLklERU5USUZJRVIuUmVuZGVyRW5naW5lKSxfcz1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLkNvbmZpZ1NlcnZpY2UpLFNzKChrcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtIYSgpKHRoaXMsdCksWGEoKSh0aGlzLFwiZW5naW5lXCIsTXMsdGhpcyksWGEoKSh0aGlzLFwiY29uZmlnU2VydmljZVwiLEFzLHRoaXMpLHRoaXMuZW50aXR5PU9iamVjdChKYS5jcmVhdGVFbnRpdHkpKCksdGhpcy5tb2RlbD12b2lkIDAsdGhpcy5kaXJ0eT0hMCx0aGlzLmNvbXBpbGVkQnVuZGxlPXZvaWQgMCx0aGlzLmluaXRQcm9taXNlPXZvaWQgMH12YXIgZSxuLHI7cmV0dXJuIEthKCkodCxbe2tleTpcImluaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29uZmlnU2VydmljZS5nZXQoKSxlPXQuY2FudmFzLG49dC5lbmdpbmVPcHRpb25zO3RoaXMuaW5pdFByb21pc2U9dGhpcy5lbmdpbmUuaW5pdChZcyh7Y2FudmFzOmV8fFdzKCksc3dhcENoYWluRm9ybWF0OlZzLlRleHR1cmVGb3JtYXQuQkdSQThVbm9ybSxhbnRpYWxpYXNpbmc6ITF9LG4pKX19LHtrZXk6XCJzZXRCdW5kbGVcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmNvbXBpbGVkQnVuZGxlPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodCkpfX0se2tleTpcInNldERpc3BhdGNoXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dCYmKHRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dC5kaXNwYXRjaD10KSx0aGlzfX0se2tleTpcInNldE1heEl0ZXJhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQmJih0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQubWF4SXRlcmF0aW9uPXQpLHRoaXN9fSx7a2V5Olwic2V0QmluZGluZ1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7dmFyIHI9ZXMoKShlKXx8RnMoKShlKXx8enMoKShlKTtpZih0aGlzLmNvbXBpbGVkQnVuZGxlJiZ0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQpe3ZhciBpPXRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dC5kZWZpbmVzLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWU9PT10fSkpO2lmKGkpcmV0dXJuIGkudmFsdWU9ZSx0aGlzO3ZhciBvPXRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dC51bmlmb3Jtcy5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lPT09dH0pKTtvJiYocj8oby5kYXRhPWUsby5pc1JlZmVyZXI9ITEsby5zdG9yYWdlQ2xhc3M9PT1KYS5TVE9SQUdFX0NMQVNTLlVuaWZvcm0/dGhpcy5tb2RlbCYmdGhpcy5tb2RlbC51cGRhdGVVbmlmb3JtKHQsZSk6dGhpcy5tb2RlbCYmdGhpcy5tb2RlbC51cGRhdGVCdWZmZXIodCxlKSk6KG8uaXNSZWZlcmVyPSEwLG8uZGF0YT1lKSl9fWVsc2UgT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5zZXRCaW5kaW5nKGUsdFtlXSl9KSk7cmV0dXJuIHRoaXN9fSx7a2V5OlwiZXhlY3V0ZVwiLHZhbHVlOihyPVJzKCkoRHMuYS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIGUsbixyPXRoaXMsaT1hcmd1bWVudHM7cmV0dXJuIERzLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYoZT1pLmxlbmd0aD4wJiZ2b2lkIDAhPT1pWzBdP2lbMF06MSwhdGhpcy5kaXJ0eSl7dC5uZXh0PTY7YnJlYWt9cmV0dXJuIHRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dCYmKGU+MT90aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQubWF4SXRlcmF0aW9uPWU6dGhpcy5jb21waWxlZEJ1bmRsZS5jb250ZXh0Lm1heEl0ZXJhdGlvbisrKSx0Lm5leHQ9NSx0aGlzLmNvbXBpbGUoKTtjYXNlIDU6dGhpcy5kaXJ0eT0hMTtjYXNlIDY6Zm9yKHRoaXMuZW5naW5lLmJlZ2luRnJhbWUoKSx0aGlzLmVuZ2luZS5jbGVhcih7fSksdGhpcy5jb21waWxlZEJ1bmRsZS5jb250ZXh0JiZ0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQudW5pZm9ybXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5pc1JlZmVyZXJ9KSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRhLG49dC5uYW1lO3IubW9kZWwuY29uZmlybUlucHV0KGUubW9kZWwsbil9KSksbj0wO248ZTtuKyspdGhpcy5tb2RlbC5ydW4oKTtyZXR1cm4gdGhpcy5lbmdpbmUuZW5kRnJhbWUoKSx0LmFicnVwdChcInJldHVyblwiLHRoaXMpO2Nhc2UgMTI6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpLGZ1bmN0aW9uKCl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6XCJnZXRPdXRwdXRcIix2YWx1ZToobj1ScygpKERzLmEubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiBEcy5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0LmFicnVwdChcInJldHVyblwiLHRoaXMubW9kZWwucmVhZERhdGEoKSk7Y2FzZSAxOmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKSxmdW5jdGlvbigpe3JldHVybiBuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OlwiY29tcGlsZVwiLHZhbHVlOihlPVJzKCkoRHMuYS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIGUsbixyO3JldHVybiBEcy5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLmluaXRQcm9taXNlO2Nhc2UgMjpyZXR1cm4gZT1Zcyh7fSx0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQpLG49dGhpcy5lbmdpbmUuc3VwcG9ydFdlYkdQVT90aGlzLmVuZ2luZS51c2VXR1NMP0phLlRhcmdldC5XR1NMOkphLlRhcmdldC5HTFNMNDUwOkphLlRhcmdldC5HTFNMMTAwLHI9dGhpcy5jb21waWxlZEJ1bmRsZS5zaGFkZXJzW25dLGUuZGVmaW5lcy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJ1bnRpbWV9KSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9XCJcIi5jb25jYXQoSmEuRGVmaW5lVmFsdWVQbGFjZWhvbGRlcikuY29uY2F0KHQubmFtZSk7cj1yLnJlcGxhY2UoZSxcIlwiLmNvbmNhdCh0LnZhbHVlKSl9KSksZS5zaGFkZXI9cixlLnVuaWZvcm1zLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCF0LmRhdGEmJnQuc3RvcmFnZUNsYXNzPT09SmEuU1RPUkFHRV9DTEFTUy5TdG9yYWdlQnVmZmVyKXt2YXIgbj0xO3QudHlwZT09PUphLkFTVF9UT0tFTl9UWVBFUy5GbG9hdEFycmF5P249MTp0LnR5cGU9PT1KYS5BU1RfVE9LRU5fVFlQRVMuVmVjdG9yNEZsb2F0QXJyYXkmJihuPTQpLHQuZGF0YT1uZXcgRmxvYXQzMkFycmF5KGUub3V0cHV0Lmxlbmd0aCpuKS5maWxsKDApfX0pKSx0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQ9ZSx0Lm5leHQ9MTEsdGhpcy5lbmdpbmUuY3JlYXRlQ29tcHV0ZU1vZGVsKHRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dCk7Y2FzZSAxMTp0aGlzLm1vZGVsPXQuc2VudDtjYXNlIDEyOmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKSxmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfV0pLHR9KCksTXM9UWEoKShrcy5wcm90b3R5cGUsXCJlbmdpbmVcIixbRXNdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksQXM9UWEoKShrcy5wcm90b3R5cGUsXCJjb25maWdTZXJ2aWNlXCIsW19zXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLE9zPWtzKSl8fE9zKSxUdT0oSHM9T2JqZWN0KCRhLmluamVjdGFibGUpKCkscXM9T2JqZWN0KCRhLmluamVjdCkoSmEuSURFTlRJRklFUi5NYXRlcmlhbENvbXBvbmVudE1hbmFnZXIpLEhzKCgkcz1Kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtIYSgpKHRoaXMsdCksdGhpcy5jb25maWc9dm9pZCAwLFhhKCkodGhpcyxcIm1hdGVyaWFsXCIsUXMsdGhpcyksdGhpcy5lbnRpdHk9dm9pZCAwLHRoaXMuY29tcG9uZW50PXZvaWQgMH1yZXR1cm4gS2EoKSh0LFt7a2V5OlwiZ2V0RW50aXR5XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnRpdHl9fSx7a2V5OlwiZ2V0Q29tcG9uZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnR9fSx7a2V5Olwic2V0Q29uZmlnXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5jb25maWc9dH19LHtrZXk6XCJzZXRFbnRpdHlcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuZW50aXR5PXQsdGhpcy5jb21wb25lbnQ9dGhpcy5tYXRlcmlhbC5jcmVhdGUodCksdGhpcy5jb21wb25lbnQuZW50aXR5PXQsdGhpcy5jb21wb25lbnQudHlwZT1lLHRoaXMub25FbnRpdHlDcmVhdGVkKCl9fSx7a2V5Olwib25FbnRpdHlDcmVhdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXt9fV0pLHR9KCksSnMuQkFTSUM9XCJiYXNpY1wiLFpzPSRzLFFzPVFhKCkoWnMucHJvdG90eXBlLFwibWF0ZXJpYWxcIixbcXNdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksS3M9WnMpKXx8S3MpLEN1PSh0dT1PYmplY3QoJGEuaW5qZWN0YWJsZSkoKSxldT1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLk1lc2hDb21wb25lbnRNYW5hZ2VyKSxudT1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLkN1bGxhYmxlQ29tcG9uZW50TWFuYWdlcikscnU9T2JqZWN0KCRhLmluamVjdCkoSmEuSURFTlRJRklFUi5UcmFuc2Zvcm1Db21wb25lbnRNYW5hZ2VyKSxpdT1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLlN5c3RlbXMpLG91PU9iamVjdCgkYS5uYW1lZCkoSmEuSURFTlRJRklFUi5TY2VuZUdyYXBoU3lzdGVtKSx0dSgoZHU9aHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7SGEoKSh0aGlzLHQpLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLmNvbmZpZz12b2lkIDAsWGEoKSh0aGlzLFwibWVzaFwiLHV1LHRoaXMpLFhhKCkodGhpcyxcImN1bGxhYmxlXCIsY3UsdGhpcyksWGEoKSh0aGlzLFwidHJhbnNmb3JtXCIsZnUsdGhpcyksWGEoKSh0aGlzLFwic2NlbmVHcmFwaFN5c3RlbVwiLGx1LHRoaXMpLHRoaXMubWVzaENvbXBvbmVudD12b2lkIDAsdGhpcy50cmFuc2Zvcm1Db21wb25lbnQ9dm9pZCAwLHRoaXMuZW50aXR5PXZvaWQgMH1yZXR1cm4gS2EoKSh0LFt7a2V5OlwiZ2V0RW50aXR5XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnRpdHl9fSx7a2V5OlwiZ2V0VHJhbnNmb3JtQ29tcG9uZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm1Db21wb25lbnR9fSx7a2V5OlwiZ2V0TWVzaENvbXBvbmVudFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzaENvbXBvbmVudH19LHtrZXk6XCJzZXRDb25maWdcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmNvbmZpZz10fX0se2tleTpcInNldEVudGl0eVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuZW50aXR5PXQsdGhpcy5jdWxsYWJsZS5jcmVhdGUodCksdGhpcy5tZXNoQ29tcG9uZW50PXRoaXMubWVzaC5jcmVhdGUodCksdGhpcy50cmFuc2Zvcm1Db21wb25lbnQ9dGhpcy50cmFuc2Zvcm0uY3JlYXRlKHQpLHRoaXMub25FbnRpdHlDcmVhdGVkKCl9fSx7a2V5Olwic2V0TWF0ZXJpYWxcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tZXNoQ29tcG9uZW50Lm1hdGVyaWFsPXQsdGhpc319LHtrZXk6XCJzZXRHZW9tZXRyeVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1lc2hDb21wb25lbnQuZ2VvbWV0cnk9dCx0aGlzfX0se2tleTpcInNldEF0dHJpYnV0ZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO09iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZvaWQgMCE9PXRbbl0mJnRbbl0hPT1lLmF0dHJpYnV0ZXNbbl0mJihlLm9uQXR0cmlidXRlQ2hhbmdlZCh7bmFtZTpuLGRhdGE6dFtuXX0pLGUuYXR0cmlidXRlc1tuXT10W25dKX0pKX19LHtrZXk6XCJzZXRWaXNpYmxlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5tZXNoQ29tcG9uZW50LnZpc2libGU9dCx0aGlzLm1lc2hDb21wb25lbnQuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHI9ZS5tZXNoLmdldENvbXBvbmVudEJ5RW50aXR5KG4pO3ImJihyLnZpc2libGU9dCl9KSksdGhpc319LHtrZXk6XCJpc1Zpc2libGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lc2hDb21wb25lbnQudmlzaWJsZX19LHtrZXk6XCJhdHRhY2hcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zY2VuZUdyYXBoU3lzdGVtLmF0dGFjaCh0aGlzLmVudGl0eSx0LmVudGl0eSksdGhpc319LHtrZXk6XCJkZXRhY2hcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjZW5lR3JhcGhTeXN0ZW0uZGV0YWNoKHRoaXMuZW50aXR5KSx0aGlzfX0se2tleTpcImRldGFjaENoaWxkcmVuXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY2VuZUdyYXBoU3lzdGVtLmRldGFjaENoaWxkcmVuKHRoaXMuZW50aXR5KSx0aGlzfX0se2tleTpcIm9uRW50aXR5Q3JlYXRlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleTpcIm9uQXR0cmlidXRlQ2hhbmdlZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZSxuPXQuZGF0YTt0aGlzLm1lc2hDb21wb25lbnQmJnRoaXMubWVzaENvbXBvbmVudC5tYXRlcmlhbCYmdGhpcy5tZXNoQ29tcG9uZW50Lm1hdGVyaWFsLnNldFVuaWZvcm0odGhpcy5jb252ZXJ0QXR0cmlidXRlTmFtZTJVbmlmb3JtTmFtZShlKSxuKX19LHtrZXk6XCJjb252ZXJ0QXR0cmlidXRlTmFtZTJVbmlmb3JtTmFtZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0fX1dKSx0fSgpLGh1LlBPSU5UPVwicG9pbnRcIixodS5MSU5FPVwibGluZVwiLGh1LkdSSUQ9XCJncmlkXCIsc3U9ZHUsdXU9UWEoKShzdS5wcm90b3R5cGUsXCJtZXNoXCIsW2V1XSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLGN1PVFhKCkoc3UucHJvdG90eXBlLFwiY3VsbGFibGVcIixbbnVdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksZnU9UWEoKShzdS5wcm90b3R5cGUsXCJ0cmFuc2Zvcm1cIixbcnVdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksbHU9UWEoKShzdS5wcm90b3R5cGUsXCJzY2VuZUdyYXBoU3lzdGVtXCIsW2l1LG91XSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLGF1PXN1KSl8fGF1KSxJdT1uKDI3MyksUHU9bi5uKEl1KSxqdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtIYSgpKHRoaXMsdCksdGhpcy5hdHRyaWJ1dGU9dm9pZCAwLHRoaXMuYnVmZmVyPXZvaWQgMDt2YXIgcj1uLmJ1ZmZlcixpPW4ub2Zmc2V0LG89bi5zdHJpZGUsYT1uLm5vcm1hbGl6ZWQscz1uLnNpemUsdT1uLmRpdmlzb3I7dGhpcy5idWZmZXI9cix0aGlzLmF0dHJpYnV0ZT17YnVmZmVyOnIuZ2V0KCksb2Zmc2V0Oml8fDAsc3RyaWRlOm98fDAsbm9ybWFsaXplZDphfHwhMSxkaXZpc29yOnV8fDB9LHMmJih0aGlzLmF0dHJpYnV0ZS5zaXplPXMpfXJldHVybiBLYSgpKHQsW3trZXk6XCJnZXRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHJpYnV0ZX19LHtrZXk6XCJ1cGRhdGVCdWZmZXJcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmJ1ZmZlci5zdWJEYXRhKHQpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYnVmZmVyLmRlc3Ryb3koKX19XSksdH0oKSxEdT0ocHU9e30sQnMoKShwdSxKYS5nbC5QT0lOVFMsXCJwb2ludHNcIiksQnMoKShwdSxKYS5nbC5MSU5FUyxcImxpbmVzXCIpLEJzKCkocHUsSmEuZ2wuTElORV9MT09QLFwibGluZSBsb29wXCIpLEJzKCkocHUsSmEuZ2wuTElORV9TVFJJUCxcImxpbmUgc3RyaXBcIiksQnMoKShwdSxKYS5nbC5UUklBTkdMRVMsXCJ0cmlhbmdsZXNcIiksQnMoKShwdSxKYS5nbC5UUklBTkdMRV9GQU4sXCJ0cmlhbmdsZSBmYW5cIiksQnMoKShwdSxKYS5nbC5UUklBTkdMRV9TVFJJUCxcInRyaWFuZ2xlIHN0cmlwXCIpLHB1KSxOdT0oZ3U9e30sQnMoKShndSxKYS5nbC5TVEFUSUNfRFJBVyxcInN0YXRpY1wiKSxCcygpKGd1LEphLmdsLkRZTkFNSUNfRFJBVyxcImR5bmFtaWNcIiksQnMoKShndSxKYS5nbC5TVFJFQU1fRFJBVyxcInN0cmVhbVwiKSxndSksUnU9KHZ1PXt9LEJzKCkodnUsSmEuZ2wuQllURSxcImludDhcIiksQnMoKSh2dSxKYS5nbC5VTlNJR05FRF9JTlQsXCJpbnQxNlwiKSxCcygpKHZ1LEphLmdsLklOVCxcImludDMyXCIpLEJzKCkodnUsSmEuZ2wuVU5TSUdORURfQllURSxcInVpbnQ4XCIpLEJzKCkodnUsSmEuZ2wuVU5TSUdORURfU0hPUlQsXCJ1aW50MTZcIiksQnMoKSh2dSxKYS5nbC5VTlNJR05FRF9JTlQsXCJ1aW50MzJcIiksQnMoKSh2dSxKYS5nbC5GTE9BVCxcImZsb2F0XCIpLHZ1KSxMdT0oeXU9e30sQnMoKSh5dSxKYS5nbC5BTFBIQSxcImFscGhhXCIpLEJzKCkoeXUsSmEuZ2wuTFVNSU5BTkNFLFwibHVtaW5hbmNlXCIpLEJzKCkoeXUsSmEuZ2wuTFVNSU5BTkNFX0FMUEhBLFwibHVtaW5hbmNlIGFscGhhXCIpLEJzKCkoeXUsSmEuZ2wuUkdCLFwicmdiXCIpLEJzKCkoeXUsSmEuZ2wuUkdCQSxcInJnYmFcIiksQnMoKSh5dSxKYS5nbC5SR0JBNCxcInJnYmE0XCIpLEJzKCkoeXUsSmEuZ2wuUkdCNV9BMSxcInJnYjUgYTFcIiksQnMoKSh5dSxKYS5nbC5SR0I1NjUsXCJyZ2I1NjVcIiksQnMoKSh5dSxKYS5nbC5ERVBUSF9DT01QT05FTlQsXCJkZXB0aFwiKSxCcygpKHl1LEphLmdsLkRFUFRIX1NURU5DSUwsXCJkZXB0aCBzdGVuY2lsXCIpLHl1KSxCdT0obXU9e30sQnMoKShtdSxKYS5nbC5ET05UX0NBUkUsXCJkb250IGNhcmVcIiksQnMoKShtdSxKYS5nbC5OSUNFU1QsXCJuaWNlXCIpLEJzKCkobXUsSmEuZ2wuRkFTVEVTVCxcImZhc3RcIiksbXUpLEd1PShidT17fSxCcygpKGJ1LEphLmdsLk5FQVJFU1QsXCJuZWFyZXN0XCIpLEJzKCkoYnUsSmEuZ2wuTElORUFSLFwibGluZWFyXCIpLEJzKCkoYnUsSmEuZ2wuTElORUFSX01JUE1BUF9MSU5FQVIsXCJtaXBtYXBcIiksQnMoKShidSxKYS5nbC5ORUFSRVNUX01JUE1BUF9MSU5FQVIsXCJuZWFyZXN0IG1pcG1hcCBsaW5lYXJcIiksQnMoKShidSxKYS5nbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QsXCJsaW5lYXIgbWlwbWFwIG5lYXJlc3RcIiksQnMoKShidSxKYS5nbC5ORUFSRVNUX01JUE1BUF9ORUFSRVNULFwibmVhcmVzdCBtaXBtYXAgbmVhcmVzdFwiKSxidSksRnU9KHh1PXt9LEJzKCkoeHUsSmEuZ2wuUkVQRUFULFwicmVwZWF0XCIpLEJzKCkoeHUsSmEuZ2wuQ0xBTVBfVE9fRURHRSxcImNsYW1wXCIpLEJzKCkoeHUsSmEuZ2wuTUlSUk9SRURfUkVQRUFULFwibWlycm9yXCIpLHh1KSxVdT0od3U9e30sQnMoKSh3dSxKYS5nbC5OT05FLFwibm9uZVwiKSxCcygpKHd1LEphLmdsLkJST1dTRVJfREVGQVVMVF9XRUJHTCxcImJyb3dzZXJcIiksd3UpLHp1PShTdT17fSxCcygpKFN1LEphLmdsLk5FVkVSLFwibmV2ZXJcIiksQnMoKShTdSxKYS5nbC5BTFdBWVMsXCJhbHdheXNcIiksQnMoKShTdSxKYS5nbC5MRVNTLFwibGVzc1wiKSxCcygpKFN1LEphLmdsLkxFUVVBTCxcImxlcXVhbFwiKSxCcygpKFN1LEphLmdsLkdSRUFURVIsXCJncmVhdGVyXCIpLEJzKCkoU3UsSmEuZ2wuR0VRVUFMLFwiZ2VxdWFsXCIpLEJzKCkoU3UsSmEuZ2wuRVFVQUwsXCJlcXVhbFwiKSxCcygpKFN1LEphLmdsLk5PVEVRVUFMLFwibm90ZXF1YWxcIiksU3UpLFZ1PShFdT17fSxCcygpKEV1LEphLmdsLkZVTkNfQURELFwiYWRkXCIpLEJzKCkoRXUsSmEuZ2wuTUlOX0VYVCxcIm1pblwiKSxCcygpKEV1LEphLmdsLk1BWF9FWFQsXCJtYXhcIiksQnMoKShFdSxKYS5nbC5GVU5DX1NVQlRSQUNULFwic3VidHJhY3RcIiksQnMoKShFdSxKYS5nbC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1QsXCJyZXZlcnNlIHN1YnRyYWN0XCIpLEV1KSxXdT0oX3U9e30sQnMoKShfdSxKYS5nbC5aRVJPLFwiemVyb1wiKSxCcygpKF91LEphLmdsLk9ORSxcIm9uZVwiKSxCcygpKF91LEphLmdsLlNSQ19DT0xPUixcInNyYyBjb2xvclwiKSxCcygpKF91LEphLmdsLk9ORV9NSU5VU19TUkNfQ09MT1IsXCJvbmUgbWludXMgc3JjIGNvbG9yXCIpLEJzKCkoX3UsSmEuZ2wuU1JDX0FMUEhBLFwic3JjIGFscGhhXCIpLEJzKCkoX3UsSmEuZ2wuT05FX01JTlVTX1NSQ19BTFBIQSxcIm9uZSBtaW51cyBzcmMgYWxwaGFcIiksQnMoKShfdSxKYS5nbC5EU1RfQ09MT1IsXCJkc3QgY29sb3JcIiksQnMoKShfdSxKYS5nbC5PTkVfTUlOVVNfRFNUX0NPTE9SLFwib25lIG1pbnVzIGRzdCBjb2xvclwiKSxCcygpKF91LEphLmdsLkRTVF9BTFBIQSxcImRzdCBhbHBoYVwiKSxCcygpKF91LEphLmdsLk9ORV9NSU5VU19EU1RfQUxQSEEsXCJvbmUgbWludXMgZHN0IGFscGhhXCIpLEJzKCkoX3UsSmEuZ2wuQ09OU1RBTlRfQ09MT1IsXCJjb25zdGFudCBjb2xvclwiKSxCcygpKF91LEphLmdsLk9ORV9NSU5VU19DT05TVEFOVF9DT0xPUixcIm9uZSBtaW51cyBjb25zdGFudCBjb2xvclwiKSxCcygpKF91LEphLmdsLkNPTlNUQU5UX0FMUEhBLFwiY29uc3RhbnQgYWxwaGFcIiksQnMoKShfdSxKYS5nbC5PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEsXCJvbmUgbWludXMgY29uc3RhbnQgYWxwaGFcIiksQnMoKShfdSxKYS5nbC5TUkNfQUxQSEFfU0FUVVJBVEUsXCJzcmMgYWxwaGEgc2F0dXJhdGVcIiksX3UpLFh1PShPdT17fSxCcygpKE91LEphLmdsLk5FVkVSLFwibmV2ZXJcIiksQnMoKShPdSxKYS5nbC5BTFdBWVMsXCJhbHdheXNcIiksQnMoKShPdSxKYS5nbC5MRVNTLFwibGVzc1wiKSxCcygpKE91LEphLmdsLkxFUVVBTCxcImxlcXVhbFwiKSxCcygpKE91LEphLmdsLkdSRUFURVIsXCJncmVhdGVyXCIpLEJzKCkoT3UsSmEuZ2wuR0VRVUFMLFwiZ2VxdWFsXCIpLEJzKCkoT3UsSmEuZ2wuRVFVQUwsXCJlcXVhbFwiKSxCcygpKE91LEphLmdsLk5PVEVRVUFMLFwibm90ZXF1YWxcIiksT3UpLFl1PShrdT17fSxCcygpKGt1LEphLmdsLlpFUk8sXCJ6ZXJvXCIpLEJzKCkoa3UsSmEuZ2wuS0VFUCxcImtlZXBcIiksQnMoKShrdSxKYS5nbC5SRVBMQUNFLFwicmVwbGFjZVwiKSxCcygpKGt1LEphLmdsLklOVkVSVCxcImludmVydFwiKSxCcygpKGt1LEphLmdsLklOQ1IsXCJpbmNyZW1lbnRcIiksQnMoKShrdSxKYS5nbC5ERUNSLFwiZGVjcmVtZW50XCIpLEJzKCkoa3UsSmEuZ2wuSU5DUl9XUkFQLFwiaW5jcmVtZW50IHdyYXBcIiksQnMoKShrdSxKYS5nbC5ERUNSX1dSQVAsXCJkZWNyZW1lbnQgd3JhcFwiKSxrdSksSHU9KE11PXt9LEJzKCkoTXUsSmEuZ2wuRlJPTlQsXCJmcm9udFwiKSxCcygpKE11LEphLmdsLkJBQ0ssXCJiYWNrXCIpLE11KSxxdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtIYSgpKHRoaXMsdCksdGhpcy5idWZmZXI9dm9pZCAwO3ZhciByPW4uZGF0YSxpPW4udXNhZ2Usbz1uLnR5cGU7dGhpcy5idWZmZXI9ZS5idWZmZXIoe2RhdGE6cix1c2FnZTpOdVtpfHxKYS5nbC5TVEFUSUNfRFJBV10sdHlwZTpSdVtvfHxKYS5nbC5VTlNJR05FRF9CWVRFXX0pfXJldHVybiBLYSgpKHQsW3trZXk6XCJnZXRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlcn19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5Olwic3ViRGF0YVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGF0YSxuPXQub2Zmc2V0O3RoaXMuYnVmZmVyLnN1YmRhdGEoZSxuKX19XSksdH0oKSxLdT1uKDI2KSxadT1uLm4oS3UpO2Z1bmN0aW9uIFF1KHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBKdSh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9RdShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe0JzKCkodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlF1KE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fXZhciAkdT0wLHRjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe3ZhciByPXRoaXM7SGEoKSh0aGlzLHQpLHRoaXMucmVHbD1lLHRoaXMuY29udGV4dD1uLHRoaXMuZW50aXR5PU9iamVjdChKYS5jcmVhdGVFbnRpdHkpKCksdGhpcy50ZXhGQk89dm9pZCAwLHRoaXMuY29tcHV0ZUNvbW1hbmQ9dm9pZCAwLHRoaXMudGV4dHVyZUNhY2hlPXt9LHRoaXMub3V0cHV0VGV4dHVyZU5hbWU9dm9pZCAwLHRoaXMuc3dhcE91dHB1dFRleHR1cmVOYW1lPXZvaWQgMCx0aGlzLmNvbXBpbGVkUGluZ3Bvbmc9dm9pZCAwLHRoaXMuZHluYW1pY1Bpbmdwb25nPXZvaWQgMDt2YXIgaT17fTt0aGlzLmNvbnRleHQudW5pZm9ybXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5uYW1lLG49dC50eXBlLG89dC5kYXRhLGE9dC5pc1JlZmVyZXIscz10LnN0b3JhZ2VDbGFzcztpZihzPT09SmEuU1RPUkFHRV9DTEFTUy5TdG9yYWdlQnVmZmVyKXtpZihhKXIudGV4dHVyZUNhY2hlW2VdPXtkYXRhOnZvaWQgMH0saVtcIlwiLmNvbmNhdChlLFwiU2l6ZVwiKV09ZnVuY3Rpb24oKXtyZXR1cm4gby5jb21waWxlZEJ1bmRsZS5jb250ZXh0Lm91dHB1dC50ZXh0dXJlU2l6ZX07ZWxzZXtyLnRleHR1cmVDYWNoZVtlXT1yLmNhbGNEYXRhVGV4dHVyZShlLG4sbyk7dmFyIHU9ci50ZXh0dXJlQ2FjaGVbZV0sYz11LnRleHR1cmVXaWR0aCxmPXUuaXNPdXRwdXQ7aVtcIlwiLmNvbmNhdChlLFwiU2l6ZVwiKV09W2MsY10sZiYmKHIub3V0cHV0VGV4dHVyZU5hbWU9ZSxyLmNvbnRleHQubmVlZFBpbmdwb25nJiYoci5vdXRwdXRUZXh0dXJlTmFtZT1cIlwiLmNvbmNhdChlLFwiT3V0cHV0XCIpLHIudGV4dHVyZUNhY2hlW3Iub3V0cHV0VGV4dHVyZU5hbWVdPXIuY2FsY0RhdGFUZXh0dXJlKGUsbixvKSkpfWlbZV09ZnVuY3Rpb24oKXtyZXR1cm4gci50ZXh0dXJlQ2FjaGVbZV0udGV4dHVyZX19ZWxzZSBpZihzPT09SmEuU1RPUkFHRV9DTEFTUy5Vbmlmb3JtKXtpZihvJiYoQXJyYXkuaXNBcnJheShvKXx8RnMoKShvKSkmJm8ubGVuZ3RoPjE2KXRocm93IG5ldyBFcnJvcihcImludmFsaWQgZGF0YSB0eXBlIFwiLmNvbmNhdChuKSk7aVtlXT1mdW5jdGlvbigpe3JldHVybiB0LmRhdGF9fX0pKTt2YXIgbz10aGlzLmdldE91cHV0RGF0YVRleHR1cmUoKSxhPW8udGV4dHVyZVdpZHRoLHM9by50ZXhlbENvdW50O2kudV9PdXRwdXRUZXh0dXJlU2l6ZT1bYSxhXSxpLnVfT3V0cHV0VGV4ZWxDb3VudD1zLHRoaXMuY29udGV4dC5vdXRwdXQudGV4dHVyZVNpemU9W2EsYV07dmFyIHU9e2F0dHJpYnV0ZXM6e2FfUG9zaXRpb246W1stMSwxLDBdLFstMSwtMSwwXSxbMSwxLDBdLFsxLC0xLDBdXSxhX1RleENvb3JkOltbMCwxXSxbMCwwXSxbMSwxXSxbMSwwXV19LGZyYWc6XCIjaWZkZWYgR0xfRlJBR01FTlRfUFJFQ0lTSU9OX0hJR0hcXG4gIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4jZWxzZVxcbiAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuI2VuZGlmXFxuXCIuY29uY2F0KHRoaXMuY29udGV4dC5zaGFkZXIpLHVuaWZvcm1zOmksdmVydDpcImF0dHJpYnV0ZSB2ZWMzIGFfUG9zaXRpb247XFxuYXR0cmlidXRlIHZlYzIgYV9UZXhDb29yZDtcXG5cXG52YXJ5aW5nIHZlYzIgdl9UZXhDb29yZDtcXG5cXG52b2lkIG1haW4oKSB7XFxuICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9Qb3NpdGlvbiwgMS4wKTtcXG4gIHZfVGV4Q29vcmQgPSBhX1RleENvb3JkO1xcbn1cIixwcmltaXRpdmU6XCJ0cmlhbmdsZSBzdHJpcFwiLGNvdW50OjR9O3RoaXMuY29tcHV0ZUNvbW1hbmQ9dGhpcy5yZUdsKHUpfXZhciBlO3JldHVybiBLYSgpKHQsW3trZXk6XCJydW5cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5jb250ZXh0Lm1heEl0ZXJhdGlvbj4xJiZ0aGlzLmNvbnRleHQubmVlZFBpbmdwb25nJiYodGhpcy5jb21waWxlZFBpbmdwb25nPSEwKSwodGhpcy5jb21waWxlZFBpbmdwb25nfHx0aGlzLmR5bmFtaWNQaW5ncG9uZykmJnRoaXMuc3dhcCgpLHRoaXMudGV4RkJPPXRoaXMucmVHbC5mcmFtZWJ1ZmZlcih7Y29sb3I6dGhpcy5nZXRPdXB1dERhdGFUZXh0dXJlKCkudGV4dHVyZX0pLHRoaXMudGV4RkJPLnVzZSgoZnVuY3Rpb24oKXt0LmNvbXB1dGVDb21tYW5kKCl9KSl9fSx7a2V5OlwicmVhZERhdGFcIix2YWx1ZTooZT1ScygpKERzLmEubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBlLG4scixpLG8sYSxzLHUsYz10aGlzO3JldHVybiBEcy5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmlmKHRoaXMucmVHbCh7ZnJhbWVidWZmZXI6dGhpcy50ZXhGQk99KSgoZnVuY3Rpb24oKXtlPWMucmVHbC5yZWFkKCl9KSksIWUpe3QubmV4dD02O2JyZWFrfWlmKG49dGhpcy5nZXRPdXB1dERhdGFUZXh0dXJlKCkscj1uLm9yaWdpbmFsRGF0YUxlbmd0aCxpPW4uZWxlbWVudHNQZXJUZXhlbCxvPW4udHlwZWRBcnJheUNvbnN0cnVjdG9yLGE9dm9pZCAwPT09bz9GbG9hdDMyQXJyYXk6byxzPVtdLDQhPT1pKWZvcih1PTA7dTxlLmxlbmd0aDt1Kz00KTE9PT1pP3MucHVzaChlW3VdKToyPT09aT9zLnB1c2goZVt1XSxlW3UrMV0pOnMucHVzaChlW3VdLGVbdSsxXSxlW3UrMl0pO2Vsc2Ugcz1lO3JldHVybiB0LmFicnVwdChcInJldHVyblwiLG5ldyBhKHMuc2xpY2UoMCxyKSkpO2Nhc2UgNjpyZXR1cm4gdC5hYnJ1cHQoXCJyZXR1cm5cIixuZXcgRmxvYXQzMkFycmF5KTtjYXNlIDc6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6XCJjb25maXJtSW5wdXRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuO3RoaXMuZW50aXR5PT09dC5lbnRpdHk/KHRoaXMuZHluYW1pY1Bpbmdwb25nPSEwLG49dGhpcyk6bj10LHRoaXMudGV4dHVyZUNhY2hlW2VdLmlkPW4uZ2V0T3VwdXREYXRhVGV4dHVyZSgpLmlkLHRoaXMudGV4dHVyZUNhY2hlW2VdLnRleHR1cmU9bi5nZXRPdXB1dERhdGFUZXh0dXJlKCkudGV4dHVyZX19LHtrZXk6XCJ1cGRhdGVVbmlmb3JtXCIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OlwidXBkYXRlQnVmZmVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRleHQudW5pZm9ybXMuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZT09PXR9KSk7aWYobil7dmFyIHI9dGhpcy5jYWxjRGF0YVRleHR1cmUodCxuLnR5cGUsZSksaT1yLnRleHR1cmUsbz1yLmRhdGE7dGhpcy50ZXh0dXJlQ2FjaGVbdF0uZGF0YT1vLHRoaXMudGV4dHVyZUNhY2hlW3RdLnRleHR1cmU9aX19fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleTpcInN3YXBcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuc3dhcE91dHB1dFRleHR1cmVOYW1lfHx0aGlzLmNyZWF0ZVN3YXBPdXRwdXREYXRhVGV4dHVyZSgpLHRoaXMuY29tcGlsZWRQaW5ncG9uZyl7dmFyIHQ9dGhpcy5jb250ZXh0Lm91dHB1dC5uYW1lO3RoaXMudGV4dHVyZUNhY2hlW3RdLmlkPXRoaXMuZ2V0T3VwdXREYXRhVGV4dHVyZSgpLmlkLHRoaXMudGV4dHVyZUNhY2hlW3RdLnRleHR1cmU9dGhpcy5nZXRPdXB1dERhdGFUZXh0dXJlKCkudGV4dHVyZX12YXIgZT10aGlzLm91dHB1dFRleHR1cmVOYW1lO3RoaXMub3V0cHV0VGV4dHVyZU5hbWU9dGhpcy5zd2FwT3V0cHV0VGV4dHVyZU5hbWUsdGhpcy5zd2FwT3V0cHV0VGV4dHVyZU5hbWU9ZX19LHtrZXk6XCJnZXRPdXB1dERhdGFUZXh0dXJlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0dXJlQ2FjaGVbdGhpcy5vdXRwdXRUZXh0dXJlTmFtZV19fSx7a2V5OlwiY3JlYXRlU3dhcE91dHB1dERhdGFUZXh0dXJlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNsb25lRGF0YVRleHR1cmUodGhpcy5nZXRPdXB1dERhdGFUZXh0dXJlKCkpO3RoaXMuc3dhcE91dHB1dFRleHR1cmVOYW1lPVwiXCIuY29uY2F0KHRoaXMuZW50aXR5LFwiLXN3YXBcIiksdGhpcy50ZXh0dXJlQ2FjaGVbdGhpcy5zd2FwT3V0cHV0VGV4dHVyZU5hbWVdPXR9fSx7a2V5OlwiY2xvbmVEYXRhVGV4dHVyZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGF0YSxuPXQudGV4dHVyZVdpZHRoO3JldHVybiBKdShKdSh7fSx0KSx7fSx7aWQ6JHUrKyx0ZXh0dXJlOnRoaXMucmVHbC50ZXh0dXJlKHt3aWR0aDpuLGhlaWdodDpuLGRhdGE6ZSx0eXBlOlwiZmxvYXRcIn0pfSl9fSx7a2V5OlwiY2FsY0RhdGFUZXh0dXJlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPTE7ZT09PUphLkFTVF9UT0tFTl9UWVBFUy5WZWN0b3I0RmxvYXRBcnJheSYmKHI9NCk7Zm9yKHZhciBpPVtdLG89MDtvPG4ubGVuZ3RoO28rPXIpMT09PXI/aS5wdXNoKG5bb10sMCwwLDApOjI9PT1yP2kucHVzaChuW29dLG5bbysxXSwwLDApOjM9PT1yP2kucHVzaChuW29dLG5bbysxXSxuW28rMl0sMCk6ND09PXImJmkucHVzaChuW29dLG5bbysxXSxuW28rMl0sbltvKzNdKTt2YXIgYT1uLmxlbmd0aCxzPU1hdGguY2VpbChhL3IpLHU9TWF0aC5jZWlsKE1hdGguc3FydChzKSksYz11KnU7czxjJiZpLnB1c2guYXBwbHkoaSxadSgpKG5ldyBBcnJheSg0KihjLXMpKS5maWxsKDApKSk7dmFyIGY9dGhpcy5yZUdsLnRleHR1cmUoe3dpZHRoOnUsaGVpZ2h0OnUsZGF0YTppLHR5cGU6XCJmbG9hdFwifSk7cmV0dXJue2lkOiR1KyssZGF0YTppLG9yaWdpbmFsRGF0YUxlbmd0aDphLHR5cGVkQXJyYXlDb25zdHJ1Y3RvcjpGcygpKG4pP24uY29uc3RydWN0b3I6dm9pZCAwLHRleHR1cmVXaWR0aDp1LHRleHR1cmU6Zix0ZXhlbENvdW50OnMsZWxlbWVudHNQZXJUZXhlbDpyLGlzT3V0cHV0OnQ9PT10aGlzLmNvbnRleHQub3V0cHV0Lm5hbWV9fX1dKSx0fSgpLGVjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe0hhKCkodGhpcyx0KSx0aGlzLmVsZW1lbnRzPXZvaWQgMDt2YXIgcj1uLmRhdGEsaT1uLnVzYWdlLG89bi50eXBlLGE9bi5jb3VudDt0aGlzLmVsZW1lbnRzPWUuZWxlbWVudHMoe2RhdGE6cix1c2FnZTpOdVtpfHxKYS5nbC5TVEFUSUNfRFJBV10sdHlwZTpSdVtvfHxKYS5nbC5VTlNJR05FRF9CWVRFXSxjb3VudDphfSl9cmV0dXJuIEthKCkodCxbe2tleTpcImdldFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHN9fSx7a2V5Olwic3ViRGF0YVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGF0YTt0aGlzLmVsZW1lbnRzLnN1YmRhdGEoZSl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50cy5kZXN0cm95KCl9fV0pLHR9KCksbmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbil7SGEoKSh0aGlzLHQpLHRoaXMuZnJhbWVidWZmZXI9dm9pZCAwO3ZhciByPW4ud2lkdGgsaT1uLmhlaWdodCxvPW4uY29sb3IsYT1uLmNvbG9ycyxzPShuLmRlcHRoLG4uc3RlbmNpbCx7d2lkdGg6cixoZWlnaHQ6aX0pO0FycmF5LmlzQXJyYXkoYSkmJihzLmNvbG9ycz1hLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0KCl9KSkpLG8mJlwiYm9vbGVhblwiIT10eXBlb2YgbyYmKHMuY29sb3I9by5nZXQoKSksdGhpcy5mcmFtZWJ1ZmZlcj1lLmZyYW1lYnVmZmVyKHMpfXJldHVybiBLYSgpKHQsW3trZXk6XCJnZXRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZyYW1lYnVmZmVyfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZnJhbWVidWZmZXIuZGVzdHJveSgpfX0se2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQud2lkdGgsbj10LmhlaWdodDt0aGlzLmZyYW1lYnVmZmVyLnJlc2l6ZShlLG4pfX1dKSx0fSgpLHJjPW4oOTMpLGljPW4ubihyYyksb2M9bigxNjgpLGFjPW4ubihvYyk7ZnVuY3Rpb24gc2ModCl7dmFyIGU9e307cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4peyFmdW5jdGlvbiB0KGUsbixyLGkpe2lmKG51bGw9PT1ufHxcIm51bWJlclwiPT10eXBlb2Ygbnx8XCJib29sZWFuXCI9PXR5cGVvZiBufHxBcnJheS5pc0FycmF5KG4pJiZcIm51bWJlclwiPT10eXBlb2YgblswXXx8RnMoKShuKXx8XCJcIj09PW58fHZvaWQgMCE9PW4ucmVzaXplKXJldHVybiB2b2lkKHJbXCJcIi5jb25jYXQoaSYmaStcIi5cIikuY29uY2F0KGUpXT1uKTthYygpKG4pJiZPYmplY3Qua2V5cyhuKS5mb3JFYWNoKChmdW5jdGlvbihvKXt0KG8sbltvXSxyLFwiXCIuY29uY2F0KGkmJmkrXCIuXCIpLmNvbmNhdChlKSl9KSk7QXJyYXkuaXNBcnJheShuKSYmbi5mb3JFYWNoKChmdW5jdGlvbihuLG8pe09iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKGEpe3QoYSxuW2FdLHIsXCJcIi5jb25jYXQoaSYmaStcIi5cIikuY29uY2F0KGUsXCJbXCIpLmNvbmNhdChvLFwiXVwiKSl9KSl9KSl9KG4sdFtuXSxlLFwiXCIpfSkpLGV9ZnVuY3Rpb24gdWModCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIGNjKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP3VjKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7QnMoKSh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6dWMoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9dmFyIGZjLGxjLGhjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe0hhKCkodGhpcyx0KSx0aGlzLnJlR2w9dm9pZCAwLHRoaXMuZHJhd0NvbW1hbmQ9dm9pZCAwLHRoaXMudW5pZm9ybXM9e30sdGhpcy5yZUdsPWU7dmFyIHI9bi52cyxpPW4uZnMsbz1uLmRlZmluZXMsYT1uLmF0dHJpYnV0ZXMscz1uLnVuaWZvcm1zLHU9bi5wcmltaXRpdmUsYz1uLmNvdW50LGY9bi5lbGVtZW50cyxsPW4uZGVwdGgsaD1uLmJsZW5kLGQ9bi5zdGVuY2lsLHA9bi5jdWxsLGc9bi5pbnN0YW5jZXMsdj1uLnNjaXNzb3IseT1uLnZpZXdwb3J0LG09e307cyYmKHRoaXMudW5pZm9ybXM9c2MocyksT2JqZWN0LmtleXMocykuZm9yRWFjaCgoZnVuY3Rpb24odCl7bVt0XT1lLnByb3AodCl9KSkpO3ZhciBiPXt9O09iamVjdC5rZXlzKGEpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2JbdF09YVt0XS5nZXQoKX0pKTt2YXIgeD1vJiZ0aGlzLmdlbmVyYXRlRGVmaW5lcyhvKXx8XCJcIix3PXthdHRyaWJ1dGVzOmIsZnJhZzpcIiNpZmRlZiBHTF9GUkFHTUVOVF9QUkVDSVNJT05fSElHSFxcbiAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbiNlbHNlXFxuICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG4jZW5kaWZcXG5cIi5jb25jYXQoeCxcIlxcblwiKS5jb25jYXQoaSksdW5pZm9ybXM6bSx2ZXJ0OlwiXFxuXCIuY29uY2F0KHgsXCJcXG5cIikuY29uY2F0KHIpLHByaW1pdGl2ZTpEdVt2b2lkIDA9PT11P0phLmdsLlRSSUFOR0xFUzp1XX07ZyYmKHcuaW5zdGFuY2VzPWcpLGMmJih3LmNvdW50PWMpLGYmJih3LmVsZW1lbnRzPWYuZ2V0KCkpLHYmJih3LnNjaXNzb3I9dikseSYmKHcudmlld3BvcnQ9eSksdGhpcy5pbml0RGVwdGhEcmF3UGFyYW1zKHtkZXB0aDpsfSx3KSx0aGlzLmluaXRCbGVuZERyYXdQYXJhbXMoe2JsZW5kOmh9LHcpLHRoaXMuaW5pdFN0ZW5jaWxEcmF3UGFyYW1zKHtzdGVuY2lsOmR9LHcpLHRoaXMuaW5pdEN1bGxEcmF3UGFyYW1zKHtjdWxsOnB9LHcpLHRoaXMuZHJhd0NvbW1hbmQ9ZSh3KX1yZXR1cm4gS2EoKSh0LFt7a2V5OlwiYWRkVW5pZm9ybXNcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnVuaWZvcm1zPWNjKGNjKHt9LHRoaXMudW5pZm9ybXMpLHNjKHQpKX19LHtrZXk6XCJkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9Y2MoY2Moe30sdGhpcy51bmlmb3Jtcyksc2ModC51bmlmb3Jtc3x8e30pKSxuPXt9O09iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPWljKCkoZVt0XSk7XCJib29sZWFuXCI9PT1yfHxcIm51bWJlclwiPT09cnx8QXJyYXkuaXNBcnJheShlW3RdKXx8ZVt0XS5CWVRFU19QRVJfRUxFTUVOVD9uW3RdPWVbdF06XCJzdHJpbmdcIj09PXJ8fChuW3RdPWVbdF0uZ2V0KCkpfSkpLHRoaXMuZHJhd0NvbW1hbmQobil9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleTpcImluaXREZXB0aERyYXdQYXJhbXNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXQuZGVwdGg7biYmKGUuZGVwdGg9e2VuYWJsZTp2b2lkIDA9PT1uLmVuYWJsZXx8ISFuLmVuYWJsZSxtYXNrOnZvaWQgMD09PW4ubWFza3x8ISFuLm1hc2ssZnVuYzp6dVtuLmZ1bmN8fEphLmdsLkxFU1NdLHJhbmdlOm4ucmFuZ2V8fFswLDFdfSl9fSx7a2V5OlwiaW5pdEJsZW5kRHJhd1BhcmFtc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dC5ibGVuZDtpZihuKXt2YXIgcj1uLmVuYWJsZSxpPW4uZnVuYyxvPW4uZXF1YXRpb24sYT1uLmNvbG9yLHM9dm9pZCAwPT09YT9bMCwwLDAsMF06YTtlLmJsZW5kPXtlbmFibGU6ISFyLGZ1bmM6e3NyY1JHQjpXdVtpJiZpLnNyY1JHQnx8SmEuZ2wuU1JDX0FMUEhBXSxzcmNBbHBoYTpXdVtpJiZpLnNyY0FscGhhfHxKYS5nbC5TUkNfQUxQSEFdLGRzdFJHQjpXdVtpJiZpLmRzdFJHQnx8SmEuZ2wuT05FX01JTlVTX1NSQ19BTFBIQV0sZHN0QWxwaGE6V3VbaSYmaS5kc3RBbHBoYXx8SmEuZ2wuT05FX01JTlVTX1NSQ19BTFBIQV19LGVxdWF0aW9uOntyZ2I6VnVbbyYmby5yZ2J8fEphLmdsLkZVTkNfQUREXSxhbHBoYTpWdVtvJiZvLmFscGhhfHxKYS5nbC5GVU5DX0FERF19LGNvbG9yOnN9fX19LHtrZXk6XCJpbml0U3RlbmNpbERyYXdQYXJhbXNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXQuc3RlbmNpbDtpZihuKXt2YXIgcj1uLmVuYWJsZSxpPW4ubWFzayxvPXZvaWQgMD09PWk/LTE6aSxhPW4uZnVuYyxzPXZvaWQgMD09PWE/e2NtcDpKYS5nbC5BTFdBWVMscmVmOjAsbWFzazotMX06YSx1PW4ub3BGcm9udCxjPXZvaWQgMD09PXU/e2ZhaWw6SmEuZ2wuS0VFUCx6ZmFpbDpKYS5nbC5LRUVQLHpwYXNzOkphLmdsLktFRVB9OnUsZj1uLm9wQmFjayxsPXZvaWQgMD09PWY/e2ZhaWw6SmEuZ2wuS0VFUCx6ZmFpbDpKYS5nbC5LRUVQLHpwYXNzOkphLmdsLktFRVB9OmY7ZS5zdGVuY2lsPXtlbmFibGU6ISFyLG1hc2s6byxmdW5jOmNjKGNjKHt9LHMpLHt9LHtjbXA6WHVbcy5jbXBdfSksb3BGcm9udDp7ZmFpbDpZdVtjLmZhaWxdLHpmYWlsOll1W2MuemZhaWxdLHpwYXNzOll1W2MuenBhc3NdfSxvcEJhY2s6e2ZhaWw6WXVbbC5mYWlsXSx6ZmFpbDpZdVtsLnpmYWlsXSx6cGFzczpZdVtsLnpwYXNzXX19fX19LHtrZXk6XCJpbml0Q3VsbERyYXdQYXJhbXNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXQuY3VsbDtpZihuKXt2YXIgcj1uLmVuYWJsZSxpPW4uZmFjZSxvPXZvaWQgMD09PWk/SmEuZ2wuQkFDSzppO2UuY3VsbD17ZW5hYmxlOiEhcixmYWNlOkh1W29dfX19fSx7a2V5OlwiZ2VuZXJhdGVEZWZpbmVzXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuXCIjZGVmaW5lIFwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQoTnVtYmVyKHRbZV0pKX0pKS5qb2luKFwiXFxuXCIpfX1dKSx0fSgpLGRjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe0hhKCkodGhpcyx0KSx0aGlzLnRleHR1cmU9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuaGVpZ2h0PXZvaWQgMDt2YXIgcj1uLmRhdGEsaT1uLnR5cGUsbz12b2lkIDA9PT1pP0phLmdsLlVOU0lHTkVEX0JZVEU6aSxhPW4ud2lkdGgscz1uLmhlaWdodCx1PW4uZmxpcFksYz12b2lkIDAhPT11JiZ1LGY9bi5mb3JtYXQsbD12b2lkIDA9PT1mP0phLmdsLlJHQkE6ZixoPW4ubWlwbWFwLGQ9dm9pZCAwIT09aCYmaCxwPW4ud3JhcFMsZz12b2lkIDA9PT1wP0phLmdsLkNMQU1QX1RPX0VER0U6cCx2PW4ud3JhcFQseT12b2lkIDA9PT12P0phLmdsLkNMQU1QX1RPX0VER0U6dixtPW4uYW5pc28sYj12b2lkIDA9PT1tPzA6bSx4PW4uYWxpZ25tZW50LHc9dm9pZCAwPT09eD8xOngsUz1uLnByZW11bHRpcGx5QWxwaGEsRT12b2lkIDAhPT1TJiZTLF89bi5tYWcsTz12b2lkIDA9PT1fP0phLmdsLk5FQVJFU1Q6XyxrPW4ubWluLE09dm9pZCAwPT09az9KYS5nbC5ORUFSRVNUOmssQT1uLmNvbG9yU3BhY2UsVD12b2lkIDA9PT1BP0phLmdsLkJST1dTRVJfREVGQVVMVF9XRUJHTDpBO3RoaXMud2lkdGg9YSx0aGlzLmhlaWdodD1zO3ZhciBDPXt3aWR0aDphLGhlaWdodDpzLHR5cGU6UnVbb10sZm9ybWF0Okx1W2xdLHdyYXBTOkZ1W2ddLHdyYXBUOkZ1W3ldLG1hZzpHdVtPXSxtaW46R3VbTV0sYWxpZ25tZW50OncsZmxpcFk6Yyxjb2xvclNwYWNlOlV1W1RdLHByZW11bHRpcGx5QWxwaGE6RSxhbmlzbzpifTtyJiYoQy5kYXRhPXIpLFwibnVtYmVyXCI9PXR5cGVvZiBkP0MubWlwbWFwPUJ1W2RdOlwiYm9vbGVhblwiPT10eXBlb2YgZCYmKEMubWlwbWFwPWQpLHRoaXMudGV4dHVyZT1lLnRleHR1cmUoQyl9cmV0dXJuIEthKCkodCxbe2tleTpcImdldFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dHVyZX19LHtrZXk6XCJ1cGRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudGV4dHVyZS5fdGV4dHVyZS5iaW5kKCl9fSx7a2V5OlwicmVzaXplXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC53aWR0aCxuPXQuaGVpZ2h0O3RoaXMudGV4dHVyZS5yZXNpemUoZSxuKSx0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9bn19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnRleHR1cmUuZGVzdHJveSgpfX1dKSx0fSgpLHBjPU9iamVjdCgkYS5pbmplY3RhYmxlKSgpKGZjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBlPXRoaXM7SGEoKSh0aGlzLHQpLHRoaXMuc3VwcG9ydFdlYkdQVT0hMSx0aGlzLnVzZVdHU0w9ITEsdGhpcy4kY2FudmFzPXZvaWQgMCx0aGlzLmdsPXZvaWQgMCx0aGlzLmluaXRlZD12b2lkIDAsdGhpcy5jcmVhdGVNb2RlbD1mdW5jdGlvbigpe3ZhciB0PVJzKCkoRHMuYS5tYXJrKChmdW5jdGlvbiB0KG4pe3JldHVybiBEcy5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmlmKCFuLnVuaWZvcm1zKXt0Lm5leHQ9MzticmVha31yZXR1cm4gdC5uZXh0PTMsUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMobi51bmlmb3JtcykubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9UnMoKShEcy5hLm1hcmsoKGZ1bmN0aW9uIHQoZSl7dmFyIHI7cmV0dXJuIERzLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYoIW4udW5pZm9ybXNbZV18fHZvaWQgMD09PW4udW5pZm9ybXNbZV0ubG9hZCl7dC5uZXh0PTU7YnJlYWt9cmV0dXJuIHQubmV4dD0zLG4udW5pZm9ybXNbZV0ubG9hZCgpO2Nhc2UgMzpyPXQuc2VudCxuLnVuaWZvcm1zW2VdPXI7Y2FzZSA1OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpKTtjYXNlIDM6cmV0dXJuIHQuYWJydXB0KFwicmV0dXJuXCIsbmV3IGhjKGUuZ2wsbikpO2Nhc2UgNDpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpLHRoaXMuY3JlYXRlQXR0cmlidXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcganUoZS5nbCx0KX0sdGhpcy5jcmVhdGVCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxdShlLmdsLHQpfSx0aGlzLmNyZWF0ZUVsZW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZWMoZS5nbCx0KX0sdGhpcy5jcmVhdGVUZXh0dXJlMkQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBkYyhlLmdsLHQpfSx0aGlzLmNyZWF0ZUZyYW1lYnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbmMoZS5nbCx0KX0sdGhpcy51c2VGcmFtZWJ1ZmZlcj1mdW5jdGlvbih0LG4pe2UuZ2woe2ZyYW1lYnVmZmVyOnQ/dC5nZXQoKTpudWxsfSkobil9LHRoaXMuY3JlYXRlQ29tcHV0ZU1vZGVsPWZ1bmN0aW9uKCl7dmFyIHQ9UnMoKShEcy5hLm1hcmsoKGZ1bmN0aW9uIHQobil7cmV0dXJuIERzLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KFwicmV0dXJuXCIsbmV3IHRjKGUuZ2wsbikpO2Nhc2UgMTpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpLHRoaXMuY2xlYXI9ZnVuY3Rpb24odCl7dmFyIG49dC5jb2xvcixyPXQuZGVwdGgsaT10LnN0ZW5jaWwsbz10LmZyYW1lYnVmZmVyLGE9dm9pZCAwPT09bz9udWxsOm8scz17Y29sb3I6bixkZXB0aDpyLHN0ZW5jaWw6aX07cy5mcmFtZWJ1ZmZlcj1udWxsPT09YT9hOmEuZ2V0KCksZS5nbC5jbGVhcihzKX0sdGhpcy5zZXRTY2lzc29yPWZ1bmN0aW9uKHQpe2UuZ2wmJmUuZ2wuX2dsJiYodC5lbmFibGUmJnQuYm94PyhlLmdsLl9nbC5lbmFibGUoSmEuZ2wuU0NJU1NPUl9URVNUKSxlLmdsLl9nbC5zY2lzc29yKHQuYm94LngsdC5ib3gueSx0LmJveC53aWR0aCx0LmJveC5oZWlnaHQpKTplLmdsLl9nbC5kaXNhYmxlKEphLmdsLlNDSVNTT1JfVEVTVCksZS5nbC5fcmVmcmVzaCgpKX0sdGhpcy52aWV3cG9ydD1mdW5jdGlvbih0KXt2YXIgbj10Lngscj10LnksaT10LndpZHRoLG89dC5oZWlnaHQ7ZS5nbCYmZS5nbC5fZ2wmJihlLmdsLl9nbC52aWV3cG9ydChuLHIsaSxvKSxlLmdsLl9yZWZyZXNoKCkpfSx0aGlzLnJlYWRQaXhlbHM9ZnVuY3Rpb24odCl7dmFyIG49dC5mcmFtZWJ1ZmZlcixyPXt4OnQueCx5OnQueSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH07cmV0dXJuIG4mJihyLmZyYW1lYnVmZmVyPW4uZ2V0KCkpLGUuZ2wucmVhZChyKX0sdGhpcy5nZXRDYW52YXM9ZnVuY3Rpb24oKXtyZXR1cm4gZS4kY2FudmFzfSx0aGlzLmdldEdMQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiBlLmdsLl9nbH0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7ZS5nbCYmKGUuZ2wuZGVzdHJveSgpLGUuaW5pdGVkPSExKX19dmFyIGU7cmV0dXJuIEthKCkodCxbe2tleTpcImluaXRcIix2YWx1ZTooZT1ScygpKERzLmEubWFyaygoZnVuY3Rpb24gdChlKXtyZXR1cm4gRHMuYS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDppZighdGhpcy5pbml0ZWQpe3QubmV4dD0yO2JyZWFrfXJldHVybiB0LmFicnVwdChcInJldHVyblwiKTtjYXNlIDI6cmV0dXJuIHRoaXMuJGNhbnZhcz1lLmNhbnZhcyx0Lm5leHQ9NSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtQdSgpKHtjYW52YXM6ZS5jYW52YXMsYXR0cmlidXRlczp7YWxwaGE6ITAsYW50aWFsaWFzOmUuYW50aWFsaWFzLHByZW11bHRpcGxpZWRBbHBoYTohMH0scGl4ZWxSYXRpbzoxLGV4dGVuc2lvbnM6W1wiT0VTX2VsZW1lbnRfaW5kZXhfdWludFwiLFwiT0VTX3RleHR1cmVfZmxvYXRcIixcIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlc1wiLFwiYW5nbGVfaW5zdGFuY2VkX2FycmF5c1wiXSxvcHRpb25hbEV4dGVuc2lvbnM6W1wiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljXCIsXCJFWFRfYmxlbmRfbWlubWF4XCIsXCJXRUJHTF9kZXB0aF90ZXh0dXJlXCJdLHByb2ZpbGU6ITAsb25Eb25lOmZ1bmN0aW9uKGUscil7IWUmJnJ8fG4oZSksdChyKX19KX0pKTtjYXNlIDU6dGhpcy5nbD10LnNlbnQsdGhpcy5pbml0ZWQ9ITA7Y2FzZSA3OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKSxmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleTpcImlzRmxvYXRTdXBwb3J0ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdsLmxpbWl0cy5yZWFkRmxvYXR9fSx7a2V5OlwiYmVnaW5GcmFtZVwiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleTpcImVuZEZyYW1lXCIsdmFsdWU6ZnVuY3Rpb24oKXt9fV0pLHR9KCkpfHxmYztmdW5jdGlvbiBnYyh0LGUsbixyKXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93KXt2YXIgaT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF0sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO28uc2V0QXR0cmlidXRlKFwidHlwZVwiLFwidGV4dC9qYXZhc2NyaXB0XCIpLG8uc2V0QXR0cmlidXRlKFwic3JjXCIsdCksciYmKG8uaWQ9ciksby5vbmxvYWQ9ZnVuY3Rpb24oKXtlJiZlKCl9LG8ub25lcnJvcj1mdW5jdGlvbihlKXtuJiZuKFwiVW5hYmxlIHRvIGxvYWQgc2NyaXB0ICdcIi5jb25jYXQodCxcIidcIiksZSl9LGkuYXBwZW5kQ2hpbGQobyl9fWZ1bmN0aW9uIHZjKHQsZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLG4pe2djKHQsKGZ1bmN0aW9uKCl7ZSgpfSksKGZ1bmN0aW9uKHQsZSl7bihlKX0pKX0pKX12YXIgeWM9ZnVuY3Rpb24oKXtyZXR1cm4gbWMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtmdW5jdGlvbiBtYygpe3JldHVybihtYz1ScygpKERzLmEubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiBEcy5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmlmKCFsYyl7dC5uZXh0PTI7YnJlYWt9cmV0dXJuIHQuYWJydXB0KFwicmV0dXJuXCIsbGMpO2Nhc2UgMjpyZXR1cm4gdC5uZXh0PTQsdmMoXCJodHRwczovL3ByZXZpZXcuYmFieWxvbmpzLmNvbS9nbHNsYW5nL2dsc2xhbmcuanNcIik7Y2FzZSA0OnJldHVybiBsYz13aW5kb3cuZ2xzbGFuZyhcImh0dHBzOi8vcHJldmlldy5iYWJ5bG9uanMuY29tL2dsc2xhbmcvZ2xzbGFuZy53YXNtXCIpLHQuYWJydXB0KFwicmV0dXJuXCIsbGMpO2Nhc2UgNjpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIGJjLHhjLHdjLFNjLEVjLF9jLE9jLGtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe0hhKCkodGhpcyx0KSx0aGlzLmVuZ2luZT1lLHRoaXMub3B0aW9ucz1uLHRoaXMuYXR0cmlidXRlPXZvaWQgMCx0aGlzLmJ1ZmZlcj12b2lkIDA7dmFyIHI9bixpPXIuYnVmZmVyLG89ci5vZmZzZXQsYT1yLnN0cmlkZSxzPXIubm9ybWFsaXplZCx1PXIuc2l6ZSxjPXIuZGl2aXNvcixmPXIuYXJyYXlTdHJpZGUsbD1yLmF0dHJpYnV0ZXMsaD1yLnN0ZXBNb2RlO3RoaXMuYnVmZmVyPWksdGhpcy5hdHRyaWJ1dGU9e2J1ZmZlcjppLmdldCgpLG9mZnNldDpvfHwwLHN0cmlkZTphfHwwLG5vcm1hbGl6ZWQ6c3x8ITEsZGl2aXNvcjpjfHwwLGFycmF5U3RyaWRlOmZ8fDAsYXR0cmlidXRlczpsLHN0ZXBNb2RlOmh8fFwidmVydGV4XCJ9LHUmJih0aGlzLmF0dHJpYnV0ZS5zaXplPXUpfXJldHVybiBLYSgpKHQsW3trZXk6XCJnZXRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHJpYnV0ZX19LHtrZXk6XCJ1cGRhdGVCdWZmZXJcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmJ1ZmZlci5zdWJEYXRhKHQpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYnVmZmVyLmRlc3Ryb3koKX19XSksdH0oKSxNYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtIYSgpKHRoaXMsdCksdGhpcy5lbmdpbmU9ZSx0aGlzLm9wdGlvbnM9bix0aGlzLmJ1ZmZlcj12b2lkIDA7dmFyIHI9bixpPXIuZGF0YSxvPXIudXNhZ2U7ci50eXBlO3RoaXMuYnVmZmVyPXRoaXMuY3JlYXRlQnVmZmVyKGkgaW5zdGFuY2VvZiBBcnJheT9uZXcgRmxvYXQzMkFycmF5KGkpOmksb3x8VnMuQnVmZmVyVXNhZ2UuVmVydGV4fFZzLkJ1ZmZlclVzYWdlLkNvcHlEc3QpfXJldHVybiBLYSgpKHQsW3trZXk6XCJnZXRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlcn19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJ1ZmZlci5kZXN0cm95KCl9fSx7a2V5Olwic3ViRGF0YVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGF0YSxuPXQub2Zmc2V0O3RoaXMuc2V0U3ViRGF0YSh0aGlzLmJ1ZmZlcixuLGUgaW5zdGFuY2VvZiBBcnJheT9uZXcgRmxvYXQzMkFycmF5KGUpOmUpfX0se2tleTpcImNyZWF0ZUJ1ZmZlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dC5ieXRlTGVuZ3RoJTQscj17c2l6ZTp0LmJ5dGVMZW5ndGgrbix1c2FnZTplfSxpPXRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVCdWZmZXIocik7cmV0dXJuIHRoaXMuc2V0U3ViRGF0YShpLDAsdCksaX19LHtrZXk6XCJzZXRTdWJEYXRhXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4peyhKYS5pc1NhZmFyaT90aGlzLmVuZ2luZS5kZXZpY2UuZ2V0UXVldWUoKTp0aGlzLmVuZ2luZS5kZXZpY2UuZGVmYXVsdFF1ZXVlKS53cml0ZUJ1ZmZlcih0LGUsbil9fV0pLHR9KCksQWM9big5NCksVGM9bi5uKEFjKSxDYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtIYSgpKHRoaXMsdCksdGhpcy5lbmdpbmU9ZSx0aGlzLmNvbnRleHQ9bix0aGlzLmVudGl0eT1PYmplY3QoSmEuY3JlYXRlRW50aXR5KSgpLHRoaXMudW5pZm9ybUdQVUJ1ZmZlckxheW91dD1bXSx0aGlzLnVuaWZvcm1CdWZmZXI9dm9pZCAwLHRoaXMudmVydGV4QnVmZmVycz17fSx0aGlzLm91dHB1dEJ1ZmZlcj12b2lkIDAsdGhpcy5iaW5kR3JvdXBFbnRyaWVzPXZvaWQgMCx0aGlzLmJpbmRHcm91cD12b2lkIDAsdGhpcy5jb21wdXRlUGlwZWxpbmU9dm9pZCAwfXZhciBlLG4scjtyZXR1cm4gS2EoKSh0LFt7a2V5OlwiaW5pdFwiLHZhbHVlOihyPVJzKCkoRHMuYS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIGUsbixyLGksbyxhLHMsdT10aGlzO3JldHVybiBEcy5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLmNvbXBpbGVDb21wdXRlUGlwZWxpbmVTdGFnZURlc2NyaXB0b3IodGhpcy5jb250ZXh0LnNoYWRlcik7Y2FzZSAyOmU9dC5zZW50LG49ZS5jb21wdXRlU3RhZ2Uscj10aGlzLmNvbnRleHQudW5pZm9ybXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5zdG9yYWdlQ2xhc3M9PT1KYS5TVE9SQUdFX0NMQVNTLlN0b3JhZ2VCdWZmZXJ9KSksaT10aGlzLmNvbnRleHQudW5pZm9ybXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5zdG9yYWdlQ2xhc3M9PT1KYS5TVE9SQUdFX0NMQVNTLlVuaWZvcm19KSksbz1pLmxlbmd0aD8xOjAsdGhpcy5iaW5kR3JvdXBFbnRyaWVzPVtdLG8mJihhPTAscz1bXSxpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKGVzKCkodC5kYXRhKSl1LnVuaWZvcm1HUFVCdWZmZXJMYXlvdXQucHVzaCh7bmFtZTp0Lm5hbWUsb2Zmc2V0OmF9KSxhKz00LHMucHVzaCh0LmRhdGEpO2Vsc2V7dmFyIGUsbj0obnVsbD09PShlPXQuZGF0YSl8fHZvaWQgMD09PWU/dm9pZCAwOmUubGVuZ3RoKXx8MTszPT09biYmKG49NCx0LmRhdGEucHVzaCgwKSk7dmFyIHI9YS80JTQ7aWYocj4wKXt2YXIgaT00LXI7aWYobj4xJiZuPD1pKTI9PT1uJiYoMz09PWkmJihhKz00LHMucHVzaCgwKSkscy5wdXNoLmFwcGx5KHMsWnUoKSh0LmRhdGEpKSx1LnVuaWZvcm1HUFVCdWZmZXJMYXlvdXQucHVzaCh7bmFtZTp0Lm5hbWUsb2Zmc2V0OmF9KSk7ZWxzZXtmb3IodmFyIG89MDtvPGk7bysrKWErPTQscy5wdXNoKDApO3MucHVzaC5hcHBseShzLFp1KCkodC5kYXRhKSksdS51bmlmb3JtR1BVQnVmZmVyTGF5b3V0LnB1c2goe25hbWU6dC5uYW1lLG9mZnNldDphfSl9fWErPTQqbn19KSksdGhpcy51bmlmb3JtQnVmZmVyPW5ldyBNYyh0aGlzLmVuZ2luZSx7ZGF0YTpzIGluc3RhbmNlb2YgQXJyYXk/bmV3IEZsb2F0MzJBcnJheShzKTpzLHVzYWdlOlZzLkJ1ZmZlclVzYWdlLlVuaWZvcm18VnMuQnVmZmVyVXNhZ2UuQ29weURzdH0pLHRoaXMuYmluZEdyb3VwRW50cmllcy5wdXNoKHtiaW5kaW5nOjAscmVzb3VyY2U6e2J1ZmZlcjp0aGlzLnVuaWZvcm1CdWZmZXIuZ2V0KCl9fSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7VGMoKSh0LmRhdGEpfHx0LnR5cGUhPT1KYS5BU1RfVE9LRU5fVFlQRVMuVmVjdG9yNEZsb2F0QXJyYXkmJnQudHlwZSE9PUphLkFTVF9UT0tFTl9UWVBFUy5GbG9hdEFycmF5fHwodC5uYW1lPT09dS5jb250ZXh0Lm91dHB1dC5uYW1lPyhlPW5ldyBNYyh1LmVuZ2luZSx7ZGF0YTppc0Zpbml0ZShOdW1iZXIodC5kYXRhKSk/W3QuZGF0YV06dC5kYXRhLHVzYWdlOlZzLkJ1ZmZlclVzYWdlLlN0b3JhZ2V8VnMuQnVmZmVyVXNhZ2UuQ29weURzdHxWcy5CdWZmZXJVc2FnZS5Db3B5U3JjfSksdS5vdXRwdXRCdWZmZXI9ZSx1LmNvbnRleHQub3V0cHV0PXtuYW1lOnQubmFtZSxsZW5ndGg6aXNGaW5pdGUoTnVtYmVyKHQuZGF0YSkpPzE6dC5kYXRhLmxlbmd0aCx0eXBlZEFycmF5Q29uc3RydWN0b3I6RmxvYXQzMkFycmF5LGdwdUJ1ZmZlcjplLmdldCgpfSk6dC5pc1JlZmVyZXI/dC5kYXRhLm1vZGVsJiZ0LmRhdGEubW9kZWwub3V0cHV0QnVmZmVyJiYoZT10LmRhdGEubW9kZWwub3V0cHV0QnVmZmVyKTplPW5ldyBNYyh1LmVuZ2luZSx7ZGF0YTppc0Zpbml0ZShOdW1iZXIodC5kYXRhKSk/W3QuZGF0YV06dC5kYXRhLHVzYWdlOlZzLkJ1ZmZlclVzYWdlLlN0b3JhZ2V8VnMuQnVmZmVyVXNhZ2UuQ29weURzdHxWcy5CdWZmZXJVc2FnZS5Db3B5U3JjfSksdS52ZXJ0ZXhCdWZmZXJzW3QubmFtZV09ZSx1LmJpbmRHcm91cEVudHJpZXMucHVzaCh7YmluZGluZzpvLHJlc291cmNlOntuYW1lOnQubmFtZSxyZWZlcjplP3ZvaWQgMDp0LmRhdGEsYnVmZmVyOmU/ZS5nZXQoKTp2b2lkIDB9fSksbysrKX0pKSx0aGlzLmNvbXB1dGVQaXBlbGluZT10aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKHtjb21wdXRlU3RhZ2U6bn0pLGNvbnNvbGUubG9nKHRoaXMuYmluZEdyb3VwRW50cmllcyksdGhpcy5iaW5kR3JvdXA9dGhpcy5lbmdpbmUuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7bGF5b3V0OnRoaXMuY29tcHV0ZVBpcGVsaW5lLmdldEJpbmRHcm91cExheW91dCgwKSxlbnRyaWVzOnRoaXMuYmluZEdyb3VwRW50cmllc30pO2Nhc2UgMTM6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpLGZ1bmN0aW9uKCl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMudW5pZm9ybUJ1ZmZlciYmdGhpcy51bmlmb3JtQnVmZmVyLmRlc3Ryb3koKSxPYmplY3Qua2V5cyh0aGlzLnZlcnRleEJ1ZmZlcnMpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LnZlcnRleEJ1ZmZlcnNbZV0uZGVzdHJveSgpfSkpfX0se2tleTpcInJlYWREYXRhXCIsdmFsdWU6KG49UnMoKShEcy5hLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgZSxuLHIsaSxvLGEscyx1LGM7cmV0dXJuIERzLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYoIShlPXRoaXMuY29udGV4dC5vdXRwdXQpKXt0Lm5leHQ9MTY7YnJlYWt9aWYobj1lLmxlbmd0aCxyPWUudHlwZWRBcnJheUNvbnN0cnVjdG9yLCEoaT1lLmdwdUJ1ZmZlcikpe3QubmV4dD0xNjticmVha31yZXR1cm4gbz1uKnIuQllURVNfUEVSX0VMRU1FTlQsYT10aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlQnVmZmVyKHtzaXplOm8sdXNhZ2U6R1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1R8R1BVQnVmZmVyVXNhZ2UuTUFQX1JFQUR9KSwocz10aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKSkuY29weUJ1ZmZlclRvQnVmZmVyKGksMCxhLDAsbyksKEphLmlzU2FmYXJpP3RoaXMuZW5naW5lLmRldmljZS5nZXRRdWV1ZSgpOnRoaXMuZW5naW5lLmRldmljZS5kZWZhdWx0UXVldWUpLnN1Ym1pdChbcy5maW5pc2goKV0pLHQubmV4dD0xMixhLm1hcEFzeW5jKFZzLk1hcE1vZGUuUmVhZCk7Y2FzZSAxMjpyZXR1cm4gdT1hLmdldE1hcHBlZFJhbmdlKCksYz1uZXcgcih1LnNsaWNlKDApKSxhLnVubWFwKCksdC5hYnJ1cHQoXCJyZXR1cm5cIixjKTtjYXNlIDE2OnJldHVybiB0LmFicnVwdChcInJldHVyblwiLG5ldyBGbG9hdDMyQXJyYXkpO2Nhc2UgMTc6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6XCJydW5cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3RoaXMuZW5naW5lLmN1cnJlbnRDb21wdXRlUGFzcyYmKHRoaXMuZW5naW5lLmN1cnJlbnRDb21wdXRlUGFzcy5zZXRQaXBlbGluZSh0aGlzLmNvbXB1dGVQaXBlbGluZSksdGhpcy5lbmdpbmUuY3VycmVudENvbXB1dGVQYXNzLnNldEJpbmRHcm91cCgwLHRoaXMuYmluZEdyb3VwKSwodD10aGlzLmVuZ2luZS5jdXJyZW50Q29tcHV0ZVBhc3MpLmRpc3BhdGNoLmFwcGx5KHQsWnUoKSh0aGlzLmNvbnRleHQuZGlzcGF0Y2gpKSl9fSx7a2V5OlwidXBkYXRlQnVmZmVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MCxyPXRoaXMudmVydGV4QnVmZmVyc1t0XTtyJiZyLnN1YkRhdGEoe2RhdGE6ZSxvZmZzZXQ6bn0pfX0se2tleTpcInVwZGF0ZVVuaWZvcm1cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudW5pZm9ybUdQVUJ1ZmZlckxheW91dC5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lPT09dH0pKTtuJiZ0aGlzLnVuaWZvcm1CdWZmZXIuc3ViRGF0YSh7ZGF0YTpOdW1iZXIuaXNGaW5pdGUoZSk/bmV3IEZsb2F0MzJBcnJheShbZV0pOm5ldyBGbG9hdDMyQXJyYXkoZSksb2Zmc2V0Om4ub2Zmc2V0fSl9fSx7a2V5OlwiY29uZmlybUlucHV0XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnZlcnRleEJ1ZmZlcnNbZV0scj10Lm91dHB1dEJ1ZmZlcjtpZihuJiZyJiZuIT09cil7dmFyIGk9dGhpcy5lbmdpbmUuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCksbz10LmNvbnRleHQub3V0cHV0LGE9by5sZW5ndGgqby50eXBlZEFycmF5Q29uc3RydWN0b3IuQllURVNfUEVSX0VMRU1FTlQ7aS5jb3B5QnVmZmVyVG9CdWZmZXIoci5nZXQoKSwwLG4uZ2V0KCksMCxhKSwoSmEuaXNTYWZhcmk/dGhpcy5lbmdpbmUuZGV2aWNlLmdldFF1ZXVlKCk6dGhpcy5lbmdpbmUuZGV2aWNlLmRlZmF1bHRRdWV1ZSkuc3VibWl0KFtpLmZpbmlzaCgpXSl9fX0se2tleTpcImNvbXBpbGVTaGFkZXJUb1NwaXJWXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLmNvbXBpbGVSYXdTaGFkZXJUb1NwaXJWKG4rdCxlKX19LHtrZXk6XCJjb21waWxlUmF3U2hhZGVyVG9TcGlyVlwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZW5naW5lLmdsc2xhbmcuY29tcGlsZUdMU0wodCxlKX19LHtrZXk6XCJjb21waWxlQ29tcHV0ZVBpcGVsaW5lU3RhZ2VEZXNjcmlwdG9yXCIsdmFsdWU6KGU9UnMoKShEcy5hLm1hcmsoKGZ1bmN0aW9uIHQoZSl7dmFyIG47cmV0dXJuIERzLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYobj1lLHRoaXMuZW5naW5lLm9wdGlvbnMudXNlV0dTTCl7dC5uZXh0PTY7YnJlYWt9cmV0dXJuIHQubmV4dD01LHRoaXMuY29tcGlsZVNoYWRlclRvU3BpclYoZSxcImNvbXB1dGVcIixcIiN2ZXJzaW9uIDQ1MFxcblwiKTtjYXNlIDU6bj10LnNlbnQ7Y2FzZSA2OnJldHVybiB0LmFicnVwdChcInJldHVyblwiLHtjb21wdXRlU3RhZ2U6e21vZHVsZTp0aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtjb2RlOm4saXNXSExTTDpKYS5pc1NhZmFyaX0pLGVudHJ5UG9pbnQ6XCJtYWluXCJ9fSk7Y2FzZSA3OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKSxmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX1dKSx0fSgpLEljPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe0hhKCkodGhpcyx0KSx0aGlzLmVuZ2luZT1lLHRoaXMub3B0aW9ucz1uLHRoaXMuaW5kZXhDb3VudD12b2lkIDAsdGhpcy5idWZmZXI9dm9pZCAwO3ZhciByPW4saT1yLmRhdGEsbz0oci51c2FnZSxyLnR5cGUsci5jb3VudCk7dGhpcy5pbmRleENvdW50PW98fDAsdGhpcy5idWZmZXI9bmV3IE1jKGUse2RhdGE6aSBpbnN0YW5jZW9mIEFycmF5P25ldyBVaW50MTZBcnJheShpKTppLHVzYWdlOlZzLkJ1ZmZlclVzYWdlLkluZGV4fFZzLkJ1ZmZlclVzYWdlLkNvcHlEc3R9KX1yZXR1cm4gS2EoKSh0LFt7a2V5OlwiZ2V0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWZmZXJ9fSx7a2V5Olwic3ViRGF0YVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuYnVmZmVyLnN1YkRhdGEodCl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5idWZmZXIuZGVzdHJveSgpfX1dKSx0fSgpLFBjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe0hhKCkodGhpcyx0KSx0aGlzLmVuZ2luZT1lLHRoaXMub3B0aW9ucz1uLHRoaXMuY29sb3JUZXh0dXJlPXZvaWQgMCx0aGlzLmRlcHRoVGV4dHVyZT12b2lkIDAsdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTA7dmFyIHI9bixpPShyLndpZHRoLHIuaGVpZ2h0LHIuY29sb3IpLG89KHIuY29sb3JzLHIuZGVwdGgpO3Iuc3RlbmNpbDtpJiYodGhpcy5jb2xvclRleHR1cmU9aSksbyYmKHRoaXMuZGVwdGhUZXh0dXJlPW8pfXJldHVybiBLYSgpKHQsW3trZXk6XCJnZXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0LGU7cmV0dXJue2NvbG9yOm51bGw9PT0odD10aGlzLmNvbG9yVGV4dHVyZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZ2V0KCksZGVwdGg6bnVsbD09PShlPXRoaXMuZGVwdGhUZXh0dXJlKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5nZXQoKX19fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZTtudWxsPT09KHQ9dGhpcy5jb2xvclRleHR1cmUpfHx2b2lkIDA9PT10fHx0LmRlc3Ryb3koKSxudWxsPT09KGU9dGhpcy5kZXB0aFRleHR1cmUpfHx2b2lkIDA9PT1lfHxlLmRlc3Ryb3koKX19LHtrZXk6XCJyZXNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxuLHI9dC53aWR0aCxpPXQuaGVpZ2h0O3I9PT10aGlzLndpZHRoJiZpPT09dGhpcy5oZWlnaHR8fChudWxsPT09KGU9dGhpcy5jb2xvclRleHR1cmUpfHx2b2lkIDA9PT1lfHxlLnJlc2l6ZSh7d2lkdGg6cixoZWlnaHQ6aX0pLG51bGw9PT0obj10aGlzLmRlcHRoVGV4dHVyZSl8fHZvaWQgMD09PW58fG4ucmVzaXplKHt3aWR0aDpyLGhlaWdodDppfSkpO3RoaXMud2lkdGg9cix0aGlzLmhlaWdodD1pfX1dKSx0fSgpLGpjPShiYz17fSxCcygpKGJjLEphLmdsLlBPSU5UUyxWcy5QcmltaXRpdmVUb3BvbG9neS5Qb2ludExpc3QpLEJzKCkoYmMsSmEuZ2wuTElORVMsVnMuUHJpbWl0aXZlVG9wb2xvZ3kuTGluZUxpc3QpLEJzKCkoYmMsSmEuZ2wuTElORV9MT09QLFZzLlByaW1pdGl2ZVRvcG9sb2d5LkxpbmVMaXN0KSxCcygpKGJjLEphLmdsLkxJTkVfU1RSSVAsVnMuUHJpbWl0aXZlVG9wb2xvZ3kuTGluZVN0cmlwKSxCcygpKGJjLEphLmdsLlRSSUFOR0xFUyxWcy5QcmltaXRpdmVUb3BvbG9neS5UcmlhbmdsZUxpc3QpLEJzKCkoYmMsSmEuZ2wuVFJJQU5HTEVfRkFOLFZzLlByaW1pdGl2ZVRvcG9sb2d5LlRyaWFuZ2xlTGlzdCksQnMoKShiYyxKYS5nbC5UUklBTkdMRV9TVFJJUCxWcy5QcmltaXRpdmVUb3BvbG9neS5UcmlhbmdsZVN0cmlwKSxiYyksRGM9KHhjPXt9LEJzKCkoeGMsSmEuZ2wuTkVWRVIsVnMuQ29tcGFyZUZ1bmN0aW9uLk5ldmVyKSxCcygpKHhjLEphLmdsLkFMV0FZUyxWcy5Db21wYXJlRnVuY3Rpb24uQWx3YXlzKSxCcygpKHhjLEphLmdsLkxFU1MsVnMuQ29tcGFyZUZ1bmN0aW9uLkxlc3MpLEJzKCkoeGMsSmEuZ2wuTEVRVUFMLFZzLkNvbXBhcmVGdW5jdGlvbi5MZXNzRXF1YWwpLEJzKCkoeGMsSmEuZ2wuR1JFQVRFUixWcy5Db21wYXJlRnVuY3Rpb24uR3JlYXRlciksQnMoKSh4YyxKYS5nbC5HRVFVQUwsVnMuQ29tcGFyZUZ1bmN0aW9uLkdyZWF0ZXJFcXVhbCksQnMoKSh4YyxKYS5nbC5FUVVBTCxWcy5Db21wYXJlRnVuY3Rpb24uRXF1YWwpLEJzKCkoeGMsSmEuZ2wuTk9URVFVQUwsVnMuQ29tcGFyZUZ1bmN0aW9uLk5vdEVxdWFsKSx4YyksTmM9KHdjPXt9LEJzKCkod2MsSmEuZ2wuRlVOQ19BREQsVnMuQmxlbmRPcGVyYXRpb24uQWRkKSxCcygpKHdjLEphLmdsLk1JTl9FWFQsVnMuQmxlbmRPcGVyYXRpb24uTWluKSxCcygpKHdjLEphLmdsLk1BWF9FWFQsVnMuQmxlbmRPcGVyYXRpb24uTWF4KSxCcygpKHdjLEphLmdsLkZVTkNfU1VCVFJBQ1QsVnMuQmxlbmRPcGVyYXRpb24uU3VidHJhY3QpLEJzKCkod2MsSmEuZ2wuRlVOQ19SRVZFUlNFX1NVQlRSQUNULFZzLkJsZW5kT3BlcmF0aW9uLlJldmVyc2VTdWJ0cmFjdCksd2MpLFJjPShTYz17fSxCcygpKFNjLEphLmdsLlpFUk8sVnMuQmxlbmRGYWN0b3IuWmVybyksQnMoKShTYyxKYS5nbC5PTkUsVnMuQmxlbmRGYWN0b3IuT25lKSxCcygpKFNjLEphLmdsLlNSQ19DT0xPUixWcy5CbGVuZEZhY3Rvci5TcmNDb2xvciksQnMoKShTYyxKYS5nbC5PTkVfTUlOVVNfU1JDX0NPTE9SLFZzLkJsZW5kRmFjdG9yLk9uZU1pbnVzU3JjQ29sb3IpLEJzKCkoU2MsSmEuZ2wuU1JDX0FMUEhBLFZzLkJsZW5kRmFjdG9yLlNyY0FscGhhKSxCcygpKFNjLEphLmdsLk9ORV9NSU5VU19TUkNfQUxQSEEsVnMuQmxlbmRGYWN0b3IuT25lTWludXNTcmNBbHBoYSksQnMoKShTYyxKYS5nbC5EU1RfQ09MT1IsVnMuQmxlbmRGYWN0b3IuRHN0Q29sb3IpLEJzKCkoU2MsSmEuZ2wuT05FX01JTlVTX0RTVF9DT0xPUixWcy5CbGVuZEZhY3Rvci5PbmVNaW51c0RzdENvbG9yKSxCcygpKFNjLEphLmdsLkRTVF9BTFBIQSxWcy5CbGVuZEZhY3Rvci5Ec3RBbHBoYSksQnMoKShTYyxKYS5nbC5PTkVfTUlOVVNfRFNUX0FMUEhBLFZzLkJsZW5kRmFjdG9yLk9uZU1pbnVzRHN0QWxwaGEpLEJzKCkoU2MsSmEuZ2wuQ09OU1RBTlRfQ09MT1IsVnMuQmxlbmRGYWN0b3IuQmxlbmRDb2xvciksQnMoKShTYyxKYS5nbC5PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IsVnMuQmxlbmRGYWN0b3IuT25lTWludXNCbGVuZENvbG9yKSxCcygpKFNjLEphLmdsLlNSQ19BTFBIQV9TQVRVUkFURSxWcy5CbGVuZEZhY3Rvci5TcmNBbHBoYVNhdHVyYXRlZCksU2MpLExjPShFYz17fSxCcygpKEVjLEphLmdsLkFMUEhBLFwicjh1bm9ybVwiKSxCcygpKEVjLEphLmdsLlJHQkEsXCJyZ2JhOHVub3JtXCIpLEJzKCkoRWMsSmEuZ2wuREVQVEhfQ09NUE9ORU5ULFwiZGVwdGgzMmZsb2F0XCIpLEJzKCkoRWMsSmEuZ2wuREVQVEhfU1RFTkNJTCxcImRlcHRoMjRwbHVzLXN0ZW5jaWw4XCIpLEVjKSxCYz0oX2M9e30sQnMoKShfYyxKYS5nbC5ORUFSRVNULFwibmVhcmVzdFwiKSxCcygpKF9jLEphLmdsLkxJTkVBUixcImxpbmVhclwiKSxfYyksR2M9KE9jPXt9LEJzKCkoT2MsSmEuZ2wuUkVQRUFULFwicmVwZWF0XCIpLEJzKCkoT2MsSmEuZ2wuQ0xBTVBfVE9fRURHRSxcImNsYW1wLXRvLWVkZ2VcIiksQnMoKShPYyxKYS5nbC5NSVJST1JFRF9SRVBFQVQsXCJtaXJyb3ItcmVwZWF0XCIpLE9jKTtmdW5jdGlvbiBGYyh0KXt2YXIgZT10LmN1bGw7cmV0dXJuIGUmJmUuZW5hYmxlP2UuZmFjZT9lLmZhY2U9PT1KYS5nbC5GUk9OVD9Wcy5DdWxsTW9kZS5Gcm9udDpWcy5DdWxsTW9kZS5CYWNrOnZvaWQgMDpWcy5DdWxsTW9kZS5Ob25lfWZ1bmN0aW9uIFVjKHQpe3ZhciBlPXQuZGVwdGgsbj0odC5zdGVuY2lsLHtjb21wYXJlOlZzLkNvbXBhcmVGdW5jdGlvbi5BbHdheXMsZGVwdGhGYWlsT3A6VnMuU3RlbmNpbE9wZXJhdGlvbi5LZWVwLGZhaWxPcDpWcy5TdGVuY2lsT3BlcmF0aW9uLktlZXAscGFzc09wOlZzLlN0ZW5jaWxPcGVyYXRpb24uS2VlcH0pO3JldHVybntkZXB0aFdyaXRlRW5hYmxlZDplJiZlLmVuYWJsZSxkZXB0aENvbXBhcmU6RGNbKG51bGw9PWU/dm9pZCAwOmUuZnVuYyl8fEphLmdsLkFMV0FZU10sZm9ybWF0OlZzLlRleHR1cmVGb3JtYXQuRGVwdGgyNFBsdXNTdGVuY2lsOCxzdGVuY2lsRnJvbnQ6bixzdGVuY2lsQmFjazpuLHN0ZW5jaWxSZWFkTWFzazo0Mjk0OTY3Mjk1LHN0ZW5jaWxXcml0ZU1hc2s6NDI5NDk2NzI5NX19ZnVuY3Rpb24gemModCxlKXt2YXIgbj10LmJsZW5kO3JldHVyblt7Zm9ybWF0OmUsYWxwaGFCbGVuZDp7c3JjRmFjdG9yOlJjW24mJm4uZnVuYyYmbi5mdW5jLnNyY0FscGhhfHxKYS5nbC5PTkVdLGRzdEZhY3RvcjpSY1tuJiZuLmZ1bmMmJm4uZnVuYy5kc3RBbHBoYXx8SmEuZ2wuWkVST10sb3BlcmF0aW9uOk5jW24mJm4uZXF1YXRpb24mJm4uZXF1YXRpb24uYWxwaGF8fEphLmdsLkZVTkNfQUREXX0sY29sb3JCbGVuZDp7c3JjRmFjdG9yOlJjW24mJm4uZnVuYyYmbi5mdW5jLnNyY1JHQnx8SmEuZ2wuT05FXSxkc3RGYWN0b3I6UmNbbiYmbi5mdW5jJiZuLmZ1bmMuZHN0UkdCfHxKYS5nbC5aRVJPXSxvcGVyYXRpb246TmNbbiYmbi5lcXVhdGlvbiYmbi5lcXVhdGlvbi5yZ2J8fEphLmdsLkZVTkNfQUREXX0sd3JpdGVNYXNrOlZzLkNvbG9yV3JpdGUuQWxsfV19ZnVuY3Rpb24gVmModCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIFdjKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP1ZjKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7QnMoKSh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6VmMoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gWGModCl7Zm9yKHZhciBlPTAsbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4+MT9uLTE6MCksaT0xO2k8bjtpKyspcltpLTFdPWFyZ3VtZW50c1tpXTtmb3IodmFyIG89MCxhPXI7bzxhLmxlbmd0aDtvKyspe3ZhciBzPWFbb107ZSs9cy5sZW5ndGh9Zm9yKHZhciB1PW5ldyB0KGUpLGM9MCxmPTAsbD1yO2Y8bC5sZW5ndGg7ZisrKXt2YXIgaD1sW2ZdO3Uuc2V0KGgsYyksYys9aC5sZW5ndGh9cmV0dXJuIHV9dmFyIFljLEhjLHFjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe0hhKCkodGhpcyx0KSx0aGlzLmVuZ2luZT1lLHRoaXMub3B0aW9ucz1uLHRoaXMucGlwZWxpbmVMYXlvdXQ9dm9pZCAwLHRoaXMucmVuZGVyUGlwZWxpbmU9dm9pZCAwLHRoaXMudW5pZm9ybXNCaW5kR3JvdXBMYXlvdXQ9dm9pZCAwLHRoaXMudW5pZm9ybUJpbmRHcm91cD12b2lkIDAsdGhpcy51bmlmb3JtQnVmZmVyPXZvaWQgMCx0aGlzLnVuaWZvcm1zPXt9LHRoaXMudW5pZm9ybUdQVUJ1ZmZlckxheW91dD1bXSx0aGlzLmF0dHJpYnV0ZUNhY2hlPXt9LHRoaXMuaW5kZXhCdWZmZXI9dm9pZCAwLHRoaXMuaW5kZXhDb3VudD12b2lkIDB9dmFyIGUsbjtyZXR1cm4gS2EoKSh0LFt7a2V5OlwiaW5pdFwiLHZhbHVlOihuPVJzKCkoRHMuYS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIGUsbixyLGksbyxhLHMsdSxjLGYsbCxoLGQscCxnLHYseT10aGlzO3JldHVybiBEcy5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiBlPXRoaXMub3B0aW9ucyxuPWUudnMscj1lLmZzLGk9ZS5hdHRyaWJ1dGVzLG89ZS51bmlmb3JtcyxhPWUucHJpbWl0aXZlLGUuY291bnQscz1lLmVsZW1lbnRzLHU9ZS5kZXB0aCxjPWUuYmxlbmQsZj1lLnN0ZW5jaWwsbD1lLmN1bGwsZS5pbnN0YW5jZXMsdC5uZXh0PTMsdGhpcy5jb21waWxlUGlwZWxpbmVTdGFnZURlc2NyaXB0b3IobixyLG51bGwpO2Nhc2UgMzpoPXQuc2VudCxkPWgudmVydGV4U3RhZ2UscD1oLmZyYWdtZW50U3RhZ2UsbyYmdGhpcy5idWlsZFVuaWZvcm1CaW5kR3JvdXAobykscyYmKHRoaXMuaW5kZXhCdWZmZXI9cy5nZXQoKSx0aGlzLmluZGV4Q291bnQ9cy5pbmRleENvdW50KSxnPXt2ZXJ0ZXhCdWZmZXJzOk9iamVjdC5rZXlzKGkpLm1hcCgoZnVuY3Rpb24odCxlKXt2YXIgbj1pW3RdLHI9bi5nZXQoKSxvPXIuYXJyYXlTdHJpZGUsYT1yLnN0ZXBNb2RlLHM9ci5hdHRyaWJ1dGVzO3JldHVybiB5LmF0dHJpYnV0ZUNhY2hlW3RdPW4se2FycmF5U3RyaWRlOm8sc3RlcE1vZGU6YSxhdHRyaWJ1dGVzOnN9fSkpfSx2PXtzYW1wbGVDb3VudDp0aGlzLmVuZ2luZS5tYWluUGFzc1NhbXBsZUNvdW50LHByaW1pdGl2ZVRvcG9sb2d5OmpjW2F8fEphLmdsLlRSSUFOR0xFU10scmFzdGVyaXphdGlvblN0YXRlOldjKFdjKHt9LHRoaXMuZ2V0RGVmYXVsdFJhc3Rlcml6YXRpb25TdGF0ZURlc2NyaXB0b3IoKSkse30se2N1bGxNb2RlOkZjKHtjdWxsOmx9KX0pLGRlcHRoU3RlbmNpbFN0YXRlOlVjKHtkZXB0aDp1LHN0ZW5jaWw6Zn0pLGNvbG9yU3RhdGVzOnpjKHtibGVuZDpjfSx0aGlzLmVuZ2luZS5vcHRpb25zLnN3YXBDaGFpbkZvcm1hdCksbGF5b3V0OnRoaXMucGlwZWxpbmVMYXlvdXQsdmVydGV4U3RhZ2U6ZCxmcmFnbWVudFN0YWdlOnAsdmVydGV4U3RhdGU6Z30sdGhpcy5yZW5kZXJQaXBlbGluZT10aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUodik7Y2FzZSAxMTpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSksZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleTpcImFkZFVuaWZvcm1zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy51bmlmb3Jtcz1XYyhXYyh7fSx0aGlzLnVuaWZvcm1zKSxzYyh0KSl9fSx7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLmVuZ2luZS5nZXRDdXJyZW50UmVuZGVyUGFzcygpLHI9V2MoV2Moe30sdGhpcy51bmlmb3Jtcyksc2ModC51bmlmb3Jtc3x8e30pKSxpPVtdO09iamVjdC5rZXlzKHIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPWljKCkoclt0XSk7aWYoXCJib29sZWFuXCI9PT1ufHxcIm51bWJlclwiPT09bnx8QXJyYXkuaXNBcnJheShyW3RdKXx8clt0XS5CWVRFU19QRVJfRUxFTUVOVCl7dmFyIG8sYT1udWxsPT09KG89ZS51bmlmb3JtR1BVQnVmZmVyTGF5b3V0LmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWU9PT10fSkpKXx8dm9pZCAwPT09bz92b2lkIDA6by5vZmZzZXQ7VGMoKShhKXx8ZS51bmlmb3JtQnVmZmVyLnN1YkRhdGEoe2RhdGE6clt0XSxvZmZzZXQ6YX0pfWVsc2V7dmFyIHMsdT1udWxsPT09KHM9ZS51bmlmb3JtR1BVQnVmZmVyTGF5b3V0LmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWU9PT10fSkpKXx8dm9pZCAwPT09cz92b2lkIDA6cy5vZmZzZXQ7aWYoIVRjKCkodSkpe3ZhciBjPXJbdF0uZ2V0KCksZj1jLmNvbG9yfHxjLGw9Zi50ZXh0dXJlLGg9Zi5zYW1wbGVyO2gmJihpLnB1c2goe2JpbmRpbmc6dSxyZXNvdXJjZTpofSksdSsrKSxpLnB1c2goe2JpbmRpbmc6dSxyZXNvdXJjZTpsLmNyZWF0ZVZpZXcoKX0pfX19KSksdGhpcy51bmlmb3JtQnVmZmVyJiYoaVswXT17YmluZGluZzowLHJlc291cmNlOntidWZmZXI6dGhpcy51bmlmb3JtQnVmZmVyLmdldCgpfX0pLHRoaXMudW5pZm9ybUJpbmRHcm91cD10aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtsYXlvdXQ6dGhpcy51bmlmb3Jtc0JpbmRHcm91cExheW91dCxlbnRyaWVzOml9KSx0aGlzLnJlbmRlclBpcGVsaW5lJiZuLnNldFBpcGVsaW5lKHRoaXMucmVuZGVyUGlwZWxpbmUpLG4uc2V0QmluZEdyb3VwKDAsdGhpcy51bmlmb3JtQmluZEdyb3VwKSx0aGlzLmluZGV4QnVmZmVyJiZuLnNldEluZGV4QnVmZmVyKHRoaXMuaW5kZXhCdWZmZXIuZ2V0KCksVnMuSW5kZXhGb3JtYXQuVWludDMyLDApLE9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlQ2FjaGUpLmZvckVhY2goKGZ1bmN0aW9uKHQscil7bi5zZXRWZXJ0ZXhCdWZmZXIoMCtyLGUuYXR0cmlidXRlQ2FjaGVbdF0uZ2V0KCkuYnVmZmVyLDApfSkpLHRoaXMuaW5kZXhCdWZmZXI/bi5kcmF3SW5kZXhlZCh0aGlzLmluZGV4Q291bnQsdGhpcy5vcHRpb25zLmluc3RhbmNlc3x8MSwwLDAsMCk6bi5kcmF3KHRoaXMub3B0aW9ucy5jb3VudHx8MCx0aGlzLm9wdGlvbnMuaW5zdGFuY2VzfHwwLDAsMCl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIil9fSx7a2V5OlwiY29tcGlsZVBpcGVsaW5lU3RhZ2VEZXNjcmlwdG9yXCIsdmFsdWU6KGU9UnMoKShEcy5hLm1hcmsoKGZ1bmN0aW9uIHQoZSxuLHIpe3ZhciBpLG8sYTtyZXR1cm4gRHMuYS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDppZihpPVwiI3ZlcnNpb24gNDUwXFxuXCIsbz1lLGE9bix0aGlzLmVuZ2luZS5vcHRpb25zLnVzZVdHU0wpe3QubmV4dD0xMDticmVha31yZXR1cm4gdC5uZXh0PTYsdGhpcy5jb21waWxlU2hhZGVyVG9TcGlyVihlLFwidmVydGV4XCIsaSk7Y2FzZSA2OnJldHVybiBvPXQuc2VudCx0Lm5leHQ9OSx0aGlzLmNvbXBpbGVTaGFkZXJUb1NwaXJWKG4sXCJmcmFnbWVudFwiLGkpO2Nhc2UgOTphPXQuc2VudDtjYXNlIDEwOnJldHVybiB0LmFicnVwdChcInJldHVyblwiLHRoaXMuY3JlYXRlUGlwZWxpbmVTdGFnZURlc2NyaXB0b3IobyxhKSk7Y2FzZSAxMTpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSksZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OlwiY29tcGlsZVNoYWRlclRvU3BpclZcIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuY29tcGlsZVJhd1NoYWRlclRvU3BpclYobit0LGUpfX0se2tleTpcImNvbXBpbGVSYXdTaGFkZXJUb1NwaXJWXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lbmdpbmUuZ2xzbGFuZy5jb21waWxlR0xTTCh0LGUpfX0se2tleTpcImNyZWF0ZVBpcGVsaW5lU3RhZ2VEZXNjcmlwdG9yXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm57dmVydGV4U3RhZ2U6e21vZHVsZTp0aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtjb2RlOnQsaXNXSExTTDpKYS5pc1NhZmFyaX0pLGVudHJ5UG9pbnQ6XCJtYWluXCJ9LGZyYWdtZW50U3RhZ2U6e21vZHVsZTp0aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtjb2RlOmUsaXNXSExTTDpKYS5pc1NhZmFyaX0pLGVudHJ5UG9pbnQ6XCJtYWluXCJ9fX19LHtrZXk6XCJnZXREZWZhdWx0UmFzdGVyaXphdGlvblN0YXRlRGVzY3JpcHRvclwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2Zyb250RmFjZTpWcy5Gcm9udEZhY2UuQ0NXLGN1bGxNb2RlOlZzLkN1bGxNb2RlLk5vbmUsZGVwdGhCaWFzOjAsZGVwdGhCaWFzU2xvcGVTY2FsZTowLGRlcHRoQmlhc0NsYW1wOjB9fX0se2tleTpcImJ1aWxkVW5pZm9ybUJpbmRHcm91cFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj0wLHI9WGMuYXBwbHkodm9pZCAwLFtGbG9hdDMyQXJyYXldLmNvbmNhdChadSgpKE9iamVjdC5rZXlzKHQpLm1hcCgoZnVuY3Rpb24ocil7cmV0dXJuIHRbcl0/KGUudW5pZm9ybUdQVUJ1ZmZlckxheW91dC5wdXNoKHtuYW1lOnIsb2Zmc2V0Om59KSxuKz00Kih0W3JdLmxlbmd0aHx8MSksdFtyXSk6W119KSkpKSksaT1bXSxvPSExO3IubGVuZ3RoJiYobz0hMCxpLnB1c2goe2JpbmRpbmc6MCx2aXNpYmlsaXR5OlZzLlNoYWRlclN0YWdlLkZyYWdtZW50fFZzLlNoYWRlclN0YWdlLlZlcnRleCx0eXBlOlZzLkJpbmRpbmdUeXBlLlVuaWZvcm1CdWZmZXJ9KSksT2JqZWN0LmtleXModCkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PXRbZV19KSkuZm9yRWFjaCgoZnVuY3Rpb24odCxuKXtlLnVuaWZvcm1HUFVCdWZmZXJMYXlvdXQucHVzaCh7bmFtZTp0LG9mZnNldDoyKm4rKG8/MTowKX0pLGkucHVzaCh7YmluZGluZzoyKm4rKG8/MTowKSx2aXNpYmlsaXR5OlZzLlNoYWRlclN0YWdlLkZyYWdtZW50LHR5cGU6VnMuQmluZGluZ1R5cGUuU2FtcGxlcn0se2JpbmRpbmc6MipuKyhvPzE6MCkrMSx2aXNpYmlsaXR5OlZzLlNoYWRlclN0YWdlLkZyYWdtZW50LHR5cGU6VnMuQmluZGluZ1R5cGUuU2FtcGxlZFRleHR1cmV9KX0pKSx0aGlzLnVuaWZvcm1zQmluZEdyb3VwTGF5b3V0PXRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe2VudHJpZXM6aX0pLHRoaXMucGlwZWxpbmVMYXlvdXQ9dGhpcy5lbmdpbmUuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtiaW5kR3JvdXBMYXlvdXRzOlt0aGlzLnVuaWZvcm1zQmluZEdyb3VwTGF5b3V0XX0pLG8mJih0aGlzLnVuaWZvcm1CdWZmZXI9bmV3IE1jKHRoaXMuZW5naW5lLHtkYXRhOnIgaW5zdGFuY2VvZiBBcnJheT9uZXcgRmxvYXQzMkFycmF5KHIpOnIsdXNhZ2U6VnMuQnVmZmVyVXNhZ2UuVW5pZm9ybXxWcy5CdWZmZXJVc2FnZS5Db3B5RHN0fSkpfX1dKSx0fSgpLEtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe0hhKCkodGhpcyx0KSx0aGlzLmVuZ2luZT1lLHRoaXMub3B0aW9ucz1uLHRoaXMudGV4dHVyZT12b2lkIDAsdGhpcy5zYW1wbGVyPXZvaWQgMCx0aGlzLndpZHRoPXZvaWQgMCx0aGlzLmhlaWdodD12b2lkIDAsdGhpcy5jcmVhdGVUZXh0dXJlKCl9cmV0dXJuIEthKCkodCxbe2tleTpcImdldFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3RleHR1cmU6dGhpcy50ZXh0dXJlLHNhbXBsZXI6dGhpcy5zYW1wbGVyfX19LHtrZXk6XCJ1cGRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6XCJyZXNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LndpZHRoLG49dC5oZWlnaHQ7ZT09PXRoaXMud2lkdGgmJm49PT10aGlzLmhlaWdodHx8KHRoaXMuZGVzdHJveSgpLHRoaXMuY3JlYXRlVGV4dHVyZSgpKSx0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9bn19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnRleHR1cmUmJnRoaXMudGV4dHVyZS5kZXN0cm95KCl9fSx7a2V5OlwiY3JlYXRlVGV4dHVyZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGU9KHQuZGF0YSx0LnR5cGUpLG49KHZvaWQgMD09PWUmJkphLmdsLlVOU0lHTkVEX0JZVEUsdC53aWR0aCkscj10LmhlaWdodCxpPSh0LmZsaXBZLHQuZm9ybWF0KSxvPXZvaWQgMD09PWk/SmEuZ2wuUkdCQTppLGE9KHQubWlwbWFwLHQud3JhcFMpLHM9dm9pZCAwPT09YT9KYS5nbC5DTEFNUF9UT19FREdFOmEsdT10LndyYXBULGM9dm9pZCAwPT09dT9KYS5nbC5DTEFNUF9UT19FREdFOnUsZj10LmFuaXNvLGw9dm9pZCAwPT09Zj8wOmYsaD0odC5hbGlnbm1lbnQsdC5wcmVtdWx0aXBseUFscGhhLHQubWFnKSxkPXZvaWQgMD09PWg/SmEuZ2wuTkVBUkVTVDpoLHA9dC5taW4sZz12b2lkIDA9PT1wP0phLmdsLk5FQVJFU1Q6cCx2PXQuY29sb3JTcGFjZSx5PSh2b2lkIDA9PT12JiZKYS5nbC5CUk9XU0VSX0RFRkFVTFRfV0VCR0wsdC51c2FnZSk7dGhpcy53aWR0aD1uLHRoaXMuaGVpZ2h0PXIsdGhpcy50ZXh0dXJlPXRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVUZXh0dXJlKHtzaXplOltuLHIsMV0sbWlwTGV2ZWxDb3VudDoxLHNhbXBsZUNvdW50OjEsZGltZW5zaW9uOlZzLlRleHR1cmVEaW1lbnNpb24uRTJkLGZvcm1hdDpMY1tvXSx1c2FnZTp5fHxWcy5UZXh0dXJlVXNhZ2UuU2FtcGxlZHxWcy5UZXh0dXJlVXNhZ2UuQ29weURzdH0pLCgheXx8eSZWcy5UZXh0dXJlVXNhZ2UuU2FtcGxlZCkmJih0aGlzLnNhbXBsZXI9dGhpcy5lbmdpbmUuZGV2aWNlLmNyZWF0ZVNhbXBsZXIoe2FkZHJlc3NNb2RlVTpHY1tzXSxhZGRyZXNzTW9kZVY6R2NbY10sYWRkcmVzc01vZGVXOkdjW3NdLG1hZ0ZpbHRlcjpCY1tkXSxtaW5GaWx0ZXI6QmNbZ10sbWF4QW5pc290cm9weTpsfSkpfX1dKSx0fSgpLFpjPU9iamVjdCgkYS5pbmplY3RhYmxlKSgpKFljPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBlPXRoaXM7SGEoKSh0aGlzLHQpLHRoaXMuc3VwcG9ydFdlYkdQVT0hMCx0aGlzLnVzZVdHU0w9ITEsdGhpcy5vcHRpb25zPXZvaWQgMCx0aGlzLmNhbnZhcz12b2lkIDAsdGhpcy5jb250ZXh0PXZvaWQgMCx0aGlzLmdsc2xhbmc9dm9pZCAwLHRoaXMuYWRhcHRlcj12b2lkIDAsdGhpcy5kZXZpY2U9dm9pZCAwLHRoaXMuc3dhcENoYWluPXZvaWQgMCx0aGlzLm1haW5QYXNzU2FtcGxlQ291bnQ9dm9pZCAwLHRoaXMubWFpblRleHR1cmU9dm9pZCAwLHRoaXMuZGVwdGhUZXh0dXJlPXZvaWQgMCx0aGlzLm1haW5Db2xvckF0dGFjaG1lbnRzPXZvaWQgMCx0aGlzLm1haW5UZXh0dXJlRXh0ZW5kcz12b2lkIDAsdGhpcy5tYWluRGVwdGhBdHRhY2htZW50PXZvaWQgMCx0aGlzLnVwbG9hZEVuY29kZXI9dm9pZCAwLHRoaXMucmVuZGVyRW5jb2Rlcj12b2lkIDAsdGhpcy5jb21wdXRlRW5jb2Rlcj12b2lkIDAsdGhpcy5yZW5kZXJUYXJnZXRFbmNvZGVyPXZvaWQgMCx0aGlzLmNvbW1hbmRCdWZmZXJzPW5ldyBBcnJheSg0KS5maWxsKHZvaWQgMCksdGhpcy5jdXJyZW50UmVuZGVyUGFzcz1udWxsLHRoaXMubWFpblJlbmRlclBhc3M9bnVsbCx0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXRWaWV3RGVzY3JpcHRvcj12b2lkIDAsdGhpcy5jdXJyZW50Q29tcHV0ZVBhc3M9bnVsbCx0aGlzLmJ1bmRsZUVuY29kZXI9dm9pZCAwLHRoaXMudGVtcEJ1ZmZlcnM9W10sdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0PW51bGwsdGhpcy51cGxvYWRFbmNvZGVyRGVzY3JpcHRvcj17bGFiZWw6XCJ1cGxvYWRcIn0sdGhpcy5yZW5kZXJFbmNvZGVyRGVzY3JpcHRvcj17bGFiZWw6XCJyZW5kZXJcIn0sdGhpcy5yZW5kZXJUYXJnZXRFbmNvZGVyRGVzY3JpcHRvcj17bGFiZWw6XCJyZW5kZXJUYXJnZXRcIn0sdGhpcy5jb21wdXRlRW5jb2RlckRlc2NyaXB0b3I9e2xhYmVsOlwiY29tcHV0ZVwifSx0aGlzLnBpcGVsaW5lcz17fSx0aGlzLmNvbXB1dGVQaXBlbGluZXM9e30sdGhpcy5kZWZhdWx0U2FtcGxlQ291bnQ9NCx0aGlzLmNsZWFyRGVwdGhWYWx1ZT0xLHRoaXMuY2xlYXJTdGVuY2lsVmFsdWU9MCx0aGlzLnRyYW5zaWVudFZpZXdwb3J0PXt4OjEvMCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy5jYWNoZWRWaWV3cG9ydD17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfSx0aGlzLmNsZWFyPWZ1bmN0aW9uKHQpe3QuZnJhbWVidWZmZXI7dmFyIG49dC5jb2xvcixyPXQuZGVwdGgsaT10LnN0ZW5jaWw7ZS5vcHRpb25zLnN1cHBvcnRDb21wdXRlJiZlLnN0YXJ0Q29tcHV0ZVBhc3MoKSxlLmN1cnJlbnRSZW5kZXJUYXJnZXQ/KGUuY3VycmVudFJlbmRlclBhc3MmJmUuZW5kUmVuZGVyVGFyZ2V0UmVuZGVyUGFzcygpLGUuc3RhcnRSZW5kZXJUYXJnZXRSZW5kZXJQYXNzKGUuY3VycmVudFJlbmRlclRhcmdldCxufHxudWxsLCEhciwhIWkpKTooZS5tYWluQ29sb3JBdHRhY2htZW50c1swXS5sb2FkVmFsdWU9bnx8VnMuTG9hZE9wLkxvYWQsZS5tYWluRGVwdGhBdHRhY2htZW50LmRlcHRoTG9hZFZhbHVlPXJ8fFZzLkxvYWRPcC5Mb2FkLGUubWFpbkRlcHRoQXR0YWNobWVudC5zdGVuY2lsTG9hZFZhbHVlPWk/ZS5jbGVhclN0ZW5jaWxWYWx1ZTpWcy5Mb2FkT3AuTG9hZCxlLm1haW5SZW5kZXJQYXNzJiZlLmVuZE1haW5SZW5kZXJQYXNzKCksZS5zdGFydE1haW5SZW5kZXJQYXNzKCkpfSx0aGlzLmNyZWF0ZU1vZGVsPWZ1bmN0aW9uKCl7dmFyIHQ9UnMoKShEcy5hLm1hcmsoKGZ1bmN0aW9uIHQobil7dmFyIHI7cmV0dXJuIERzLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHI9bmV3IHFjKGUsbiksdC5uZXh0PTMsci5pbml0KCk7Y2FzZSAzOnJldHVybiB0LmFicnVwdChcInJldHVyblwiLHIpO2Nhc2UgNDpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpLHRoaXMuY3JlYXRlQXR0cmlidXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga2MoZSx0KX0sdGhpcy5jcmVhdGVCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBNYyhlLHQpfSx0aGlzLmNyZWF0ZUVsZW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgSWMoZSx0KX0sdGhpcy5jcmVhdGVUZXh0dXJlMkQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBLYyhlLHQpfSx0aGlzLmNyZWF0ZUZyYW1lYnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUGMoZSx0KX0sdGhpcy51c2VGcmFtZWJ1ZmZlcj1mdW5jdGlvbih0LG4pe2UuY3VycmVudFJlbmRlclRhcmdldCYmZS51bmJpbmRGcmFtZWJ1ZmZlcihlLmN1cnJlbnRSZW5kZXJUYXJnZXQpLGUuY3VycmVudFJlbmRlclRhcmdldD10LGUuY3VycmVudFJlbmRlclRhcmdldFZpZXdEZXNjcmlwdG9yPXtkaW1lbnNpb246VnMuVGV4dHVyZVZpZXdEaW1lbnNpb24uRTJkLGFycmF5TGF5ZXJDb3VudDoxLGFzcGVjdDpWcy5UZXh0dXJlQXNwZWN0LkFsbH0sZS5jdXJyZW50UmVuZGVyUGFzcz1udWxsLG4oKX0sdGhpcy5jcmVhdGVDb21wdXRlTW9kZWw9ZnVuY3Rpb24oKXt2YXIgdD1ScygpKERzLmEubWFyaygoZnVuY3Rpb24gdChuKXt2YXIgcjtyZXR1cm4gRHMuYS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gcj1uZXcgQ2MoZSxuKSx0Lm5leHQ9MyxyLmluaXQoKTtjYXNlIDM6cmV0dXJuIHQuYWJydXB0KFwicmV0dXJuXCIscik7Y2FzZSA0OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCksdGhpcy5nZXRDYW52YXM9ZnVuY3Rpb24oKXtyZXR1cm4gZS5jYW52YXN9LHRoaXMuZ2V0R0xDb250ZXh0PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIil9LHRoaXMudmlld3BvcnQ9ZnVuY3Rpb24odCl7dmFyIG49dC54LHI9dC55LGk9dC53aWR0aCxvPXQuaGVpZ2h0O2lmKGUuY3VycmVudFJlbmRlclBhc3Mpe2lmKGUudHJhbnNpZW50Vmlld3BvcnQueCE9PTEvMCl7ZS5nZXRDdXJyZW50UmVuZGVyUGFzcygpLnNldFZpZXdwb3J0KGUudHJhbnNpZW50Vmlld3BvcnQueCxlLnRyYW5zaWVudFZpZXdwb3J0LnksZS50cmFuc2llbnRWaWV3cG9ydC53aWR0aCxlLnRyYW5zaWVudFZpZXdwb3J0LmhlaWdodCwwLDEpfWVsc2UgaWYobiE9PWUuY2FjaGVkVmlld3BvcnQueHx8ciE9PWUuY2FjaGVkVmlld3BvcnQueXx8aSE9PWUuY2FjaGVkVmlld3BvcnQud2lkdGh8fG8hPT1lLmNhY2hlZFZpZXdwb3J0LmhlaWdodCl7ZS5jYWNoZWRWaWV3cG9ydD17eDpuLHk6cix3aWR0aDppLGhlaWdodDpvfSxlLmdldEN1cnJlbnRSZW5kZXJQYXNzKCkuc2V0Vmlld3BvcnQobixyLGksbywwLDEpfX1lbHNlIGUudHJhbnNpZW50Vmlld3BvcnQ9e3g6bix5OnIsd2lkdGg6aSxoZWlnaHQ6b319LHRoaXMucmVhZFBpeGVscz1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKX19dmFyIGUsbjtyZXR1cm4gS2EoKSh0LFt7a2V5OlwiaXNGbG9hdFN1cHBvcnRlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSx7a2V5OlwiaW5pdFwiLHZhbHVlOihuPVJzKCkoRHMuYS5tYXJrKChmdW5jdGlvbiB0KGUpe3JldHVybiBEcy5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0aGlzLmNhbnZhcz1lLmNhbnZhcyx0aGlzLm9wdGlvbnM9ZSx0aGlzLnVzZVdHU0w9ISFlLnVzZVdHU0wsdGhpcy5tYWluUGFzc1NhbXBsZUNvdW50PWUuYW50aWFsaWFzaW5nP3RoaXMuZGVmYXVsdFNhbXBsZUNvdW50OjEsdC5uZXh0PTYsdGhpcy5pbml0R2xzbGFuZygpO2Nhc2UgNjp0aGlzLmluaXRDb250ZXh0QW5kU3dhcENoYWluKCksdGhpcy5pbml0TWFpbkF0dGFjaG1lbnRzKCk7Y2FzZSA4OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKSxmdW5jdGlvbih0KXtyZXR1cm4gbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleTpcInNldFNjaXNzb3JcIix2YWx1ZTpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKX19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm1haW5UZXh0dXJlJiZ0aGlzLm1haW5UZXh0dXJlLmRlc3Ryb3koKSx0aGlzLmRlcHRoVGV4dHVyZSYmdGhpcy5kZXB0aFRleHR1cmUuZGVzdHJveSgpLHRoaXMudGVtcEJ1ZmZlcnMuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZGVzdHJveSgpfSkpLHRoaXMudGVtcEJ1ZmZlcnM9W119fSx7a2V5OlwiYmVnaW5GcmFtZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy51cGxvYWRFbmNvZGVyPXRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKHRoaXMudXBsb2FkRW5jb2RlckRlc2NyaXB0b3IpLHRoaXMucmVuZGVyRW5jb2Rlcj10aGlzLmRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcih0aGlzLnJlbmRlckVuY29kZXJEZXNjcmlwdG9yKSx0aGlzLnJlbmRlclRhcmdldEVuY29kZXI9dGhpcy5kZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIodGhpcy5yZW5kZXJUYXJnZXRFbmNvZGVyRGVzY3JpcHRvciksdGhpcy5vcHRpb25zLnN1cHBvcnRDb21wdXRlJiYodGhpcy5jb21wdXRlRW5jb2Rlcj10aGlzLmRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcih0aGlzLmNvbXB1dGVFbmNvZGVyRGVzY3JpcHRvcikpfX0se2tleTpcImVuZEZyYW1lXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuc3VwcG9ydENvbXB1dGUmJnRoaXMuZW5kQ29tcHV0ZVBhc3MoKSx0aGlzLmVuZE1haW5SZW5kZXJQYXNzKCksdGhpcy5jb21tYW5kQnVmZmVyc1swXT10aGlzLnVwbG9hZEVuY29kZXIuZmluaXNoKCksdGhpcy5jb21tYW5kQnVmZmVyc1sxXT10aGlzLnJlbmRlckVuY29kZXIuZmluaXNoKCksdGhpcy5vcHRpb25zLnN1cHBvcnRDb21wdXRlJiYodGhpcy5jb21tYW5kQnVmZmVyc1syXT10aGlzLmNvbXB1dGVFbmNvZGVyLmZpbmlzaCgpKSx0aGlzLmNvbW1hbmRCdWZmZXJzWzNdPXRoaXMucmVuZGVyVGFyZ2V0RW5jb2Rlci5maW5pc2goKSxKYS5pc1NhZmFyaT90aGlzLmRldmljZS5nZXRRdWV1ZSgpLnN1Ym1pdCh0aGlzLmNvbW1hbmRCdWZmZXJzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSkpOnRoaXMuZGV2aWNlLmRlZmF1bHRRdWV1ZS5zdWJtaXQodGhpcy5jb21tYW5kQnVmZmVycy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpKX19LHtrZXk6XCJnZXRDdXJyZW50UmVuZGVyUGFzc1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VycmVudFJlbmRlclRhcmdldCYmIXRoaXMuY3VycmVudFJlbmRlclBhc3M/dGhpcy5zdGFydFJlbmRlclRhcmdldFJlbmRlclBhc3ModGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0LG51bGwsITEsITEpOnRoaXMuY3VycmVudFJlbmRlclBhc3N8fHRoaXMuc3RhcnRNYWluUmVuZGVyUGFzcygpLHRoaXMuY3VycmVudFJlbmRlclBhc3N9fSx7a2V5OlwiaW5pdEdsc2xhbmdcIix2YWx1ZTooZT1ScygpKERzLmEubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBlLG47cmV0dXJuIERzLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHljKCk7Y2FzZSAyOnJldHVybiB0aGlzLmdsc2xhbmc9dC5zZW50LHQubmV4dD01LG51bGw9PT0oZT1uYXZpZ2F0b3IpfHx2b2lkIDA9PT1lfHxudWxsPT09KG49ZS5ncHUpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnJlcXVlc3RBZGFwdGVyKCk7Y2FzZSA1OnJldHVybiB0aGlzLmFkYXB0ZXI9dC5zZW50LHQubmV4dD04LHRoaXMuYWRhcHRlci5yZXF1ZXN0RGV2aWNlKCk7Y2FzZSA4OnRoaXMuZGV2aWNlPXQuc2VudDtjYXNlIDk6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6XCJpbml0Q29udGV4dEFuZFN3YXBDaGFpblwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jb250ZXh0PXRoaXMuY2FudmFzLmdldENvbnRleHQoSmEuaXNTYWZhcmk/XCJncHVcIjpcImdwdXByZXNlbnRcIiksdGhpcy5zd2FwQ2hhaW49dGhpcy5jb250ZXh0LmNvbmZpZ3VyZVN3YXBDaGFpbih7ZGV2aWNlOnRoaXMuZGV2aWNlLGZvcm1hdDp0aGlzLm9wdGlvbnMuc3dhcENoYWluRm9ybWF0LHVzYWdlOlZzLlRleHR1cmVVc2FnZS5PdXRwdXRBdHRhY2htZW50fFZzLlRleHR1cmVVc2FnZS5Db3B5U3JjfSl9fSx7a2V5OlwiaW5pdE1haW5BdHRhY2htZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5tYWluVGV4dHVyZUV4dGVuZHM9e3dpZHRoOnRoaXMuY2FudmFzLndpZHRoLGhlaWdodDp0aGlzLmNhbnZhcy5oZWlnaHQsZGVwdGg6MX0sdGhpcy5vcHRpb25zLmFudGlhbGlhc2luZyl7dmFyIHQ9e3NpemU6dGhpcy5tYWluVGV4dHVyZUV4dGVuZHMsbWlwTGV2ZWxDb3VudDoxLHNhbXBsZUNvdW50OnRoaXMubWFpblBhc3NTYW1wbGVDb3VudCxkaW1lbnNpb246VnMuVGV4dHVyZURpbWVuc2lvbi5FMmQsZm9ybWF0OlZzLlRleHR1cmVGb3JtYXQuQkdSQThVbm9ybSx1c2FnZTpWcy5UZXh0dXJlVXNhZ2UuT3V0cHV0QXR0YWNobWVudH07dGhpcy5tYWluVGV4dHVyZSYmdGhpcy5tYWluVGV4dHVyZS5kZXN0cm95KCksdGhpcy5tYWluVGV4dHVyZT10aGlzLmRldmljZS5jcmVhdGVUZXh0dXJlKHQpLHRoaXMubWFpbkNvbG9yQXR0YWNobWVudHM9W3thdHRhY2htZW50OkphLmlzU2FmYXJpP3RoaXMubWFpblRleHR1cmUuY3JlYXRlRGVmYXVsdFZpZXcoKTp0aGlzLm1haW5UZXh0dXJlLmNyZWF0ZVZpZXcoKSxsb2FkVmFsdWU6WzAsMCwwLDFdLHN0b3JlT3A6VnMuU3RvcmVPcC5TdG9yZX1dfWVsc2UgdGhpcy5tYWluQ29sb3JBdHRhY2htZW50cz1be2F0dGFjaG1lbnQ6SmEuaXNTYWZhcmk/dGhpcy5zd2FwQ2hhaW4uZ2V0Q3VycmVudFRleHR1cmUoKS5jcmVhdGVEZWZhdWx0VmlldygpOnRoaXMuc3dhcENoYWluLmdldEN1cnJlbnRUZXh0dXJlKCkuY3JlYXRlVmlldygpLGxvYWRWYWx1ZTpbMCwwLDAsMV0sc3RvcmVPcDpWcy5TdG9yZU9wLlN0b3JlfV07dmFyIGU9e3NpemU6dGhpcy5tYWluVGV4dHVyZUV4dGVuZHMsbWlwTGV2ZWxDb3VudDoxLHNhbXBsZUNvdW50OnRoaXMubWFpblBhc3NTYW1wbGVDb3VudCxkaW1lbnNpb246VnMuVGV4dHVyZURpbWVuc2lvbi5FMmQsZm9ybWF0OkphLmlzU2FmYXJpP1wiZGVwdGgzMmZsb2F0LXN0ZW5jaWw4XCI6VnMuVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1c1N0ZW5jaWw4LHVzYWdlOlZzLlRleHR1cmVVc2FnZS5PdXRwdXRBdHRhY2htZW50fTt0aGlzLmRlcHRoVGV4dHVyZSYmdGhpcy5kZXB0aFRleHR1cmUuZGVzdHJveSgpLHRoaXMuZGVwdGhUZXh0dXJlPXRoaXMuZGV2aWNlLmNyZWF0ZVRleHR1cmUoZSksdGhpcy5tYWluRGVwdGhBdHRhY2htZW50PXthdHRhY2htZW50OkphLmlzU2FmYXJpP3RoaXMuZGVwdGhUZXh0dXJlLmNyZWF0ZURlZmF1bHRWaWV3KCk6dGhpcy5kZXB0aFRleHR1cmUuY3JlYXRlVmlldygpLGRlcHRoTG9hZFZhbHVlOnRoaXMuY2xlYXJEZXB0aFZhbHVlLGRlcHRoU3RvcmVPcDpWcy5TdG9yZU9wLlN0b3JlLHN0ZW5jaWxMb2FkVmFsdWU6dGhpcy5jbGVhclN0ZW5jaWxWYWx1ZSxzdGVuY2lsU3RvcmVPcDpWcy5TdG9yZU9wLlN0b3JlfX19LHtrZXk6XCJzdGFydENvbXB1dGVQYXNzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRDb21wdXRlUGFzcyYmdGhpcy5lbmRDb21wdXRlUGFzcygpLHRoaXMuY3VycmVudENvbXB1dGVQYXNzPXRoaXMuY29tcHV0ZUVuY29kZXIuYmVnaW5Db21wdXRlUGFzcygpfX0se2tleTpcInN0YXJ0TWFpblJlbmRlclBhc3NcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY3VycmVudFJlbmRlclBhc3MmJiF0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQmJnRoaXMuZW5kTWFpblJlbmRlclBhc3MoKSx0aGlzLm9wdGlvbnMuYW50aWFsaWFzaW5nP3RoaXMubWFpbkNvbG9yQXR0YWNobWVudHNbMF0ucmVzb2x2ZVRhcmdldD1KYS5pc1NhZmFyaT90aGlzLnN3YXBDaGFpbi5nZXRDdXJyZW50VGV4dHVyZSgpLmNyZWF0ZURlZmF1bHRWaWV3KCk6dGhpcy5zd2FwQ2hhaW4uZ2V0Q3VycmVudFRleHR1cmUoKS5jcmVhdGVWaWV3KCk6dGhpcy5tYWluQ29sb3JBdHRhY2htZW50c1swXS5hdHRhY2htZW50PUphLmlzU2FmYXJpP3RoaXMuc3dhcENoYWluLmdldEN1cnJlbnRUZXh0dXJlKCkuY3JlYXRlRGVmYXVsdFZpZXcoKTp0aGlzLnN3YXBDaGFpbi5nZXRDdXJyZW50VGV4dHVyZSgpLmNyZWF0ZVZpZXcoKSx0aGlzLmN1cnJlbnRSZW5kZXJQYXNzPXRoaXMucmVuZGVyRW5jb2Rlci5iZWdpblJlbmRlclBhc3Moe2NvbG9yQXR0YWNobWVudHM6dGhpcy5tYWluQ29sb3JBdHRhY2htZW50cyxkZXB0aFN0ZW5jaWxBdHRhY2htZW50OnRoaXMubWFpbkRlcHRoQXR0YWNobWVudH0pLHRoaXMubWFpblJlbmRlclBhc3M9dGhpcy5jdXJyZW50UmVuZGVyUGFzcyx0aGlzLmNhY2hlZFZpZXdwb3J0JiZ0aGlzLnZpZXdwb3J0KHRoaXMuY2FjaGVkVmlld3BvcnQpfX0se2tleTpcInN0YXJ0UmVuZGVyVGFyZ2V0UmVuZGVyUGFzc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpLG8sYT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdLHM9bnVsbD09PShyPXQuZ2V0KCkuY29sb3IpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnRleHR1cmU7cyYmKG89cy5jcmVhdGVWaWV3KHRoaXMuY3VycmVudFJlbmRlclRhcmdldFZpZXdEZXNjcmlwdG9yKSk7dmFyIHUsYz1udWxsPT09KGk9dC5nZXQoKS5kZXB0aCl8fHZvaWQgMD09PWk/dm9pZCAwOmkudGV4dHVyZTtjJiYodT1jLmNyZWF0ZVZpZXcoKSk7dmFyIGY9dGhpcy5yZW5kZXJUYXJnZXRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyh7Y29sb3JBdHRhY2htZW50czpbe2F0dGFjaG1lbnQ6byxsb2FkVmFsdWU6bnVsbCE9PWU/ZTpWcy5Mb2FkT3AuTG9hZCxzdG9yZU9wOlZzLlN0b3JlT3AuU3RvcmV9XSxkZXB0aFN0ZW5jaWxBdHRhY2htZW50OmMmJnU/e2F0dGFjaG1lbnQ6dSxkZXB0aExvYWRWYWx1ZTpuP3RoaXMuY2xlYXJEZXB0aFZhbHVlOlZzLkxvYWRPcC5Mb2FkLGRlcHRoU3RvcmVPcDpWcy5TdG9yZU9wLlN0b3JlLHN0ZW5jaWxMb2FkVmFsdWU6YT90aGlzLmNsZWFyU3RlbmNpbFZhbHVlOlZzLkxvYWRPcC5Mb2FkLHN0ZW5jaWxTdG9yZU9wOlZzLlN0b3JlT3AuU3RvcmV9OnZvaWQgMH0pO3RoaXMuY3VycmVudFJlbmRlclBhc3M9Zix0aGlzLmNhY2hlZFZpZXdwb3J0JiZ0aGlzLnZpZXdwb3J0KHRoaXMuY2FjaGVkVmlld3BvcnQpfX0se2tleTpcImVuZE1haW5SZW5kZXJQYXNzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRSZW5kZXJQYXNzPT09dGhpcy5tYWluUmVuZGVyUGFzcyYmbnVsbCE9PXRoaXMuY3VycmVudFJlbmRlclBhc3MmJih0aGlzLmN1cnJlbnRSZW5kZXJQYXNzLmVuZFBhc3MoKSx0aGlzLnJlc2V0Q2FjaGVkVmlld3BvcnQoKSx0aGlzLmN1cnJlbnRSZW5kZXJQYXNzPW51bGwsdGhpcy5tYWluUmVuZGVyUGFzcz1udWxsKX19LHtrZXk6XCJlbmRDb21wdXRlUGFzc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50Q29tcHV0ZVBhc3MmJih0aGlzLmN1cnJlbnRDb21wdXRlUGFzcy5lbmRQYXNzKCksdGhpcy5jdXJyZW50Q29tcHV0ZVBhc3M9bnVsbCl9fSx7a2V5OlwiZW5kUmVuZGVyVGFyZ2V0UmVuZGVyUGFzc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50UmVuZGVyUGFzcyYmKHRoaXMuY3VycmVudFJlbmRlclBhc3MuZW5kUGFzcygpLHRoaXMucmVzZXRDYWNoZWRWaWV3cG9ydCgpKX19LHtrZXk6XCJyZXNldENhY2hlZFZpZXdwb3J0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlZFZpZXdwb3J0PXt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fX0se2tleTpcInVuYmluZEZyYW1lYnVmZmVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5jdXJyZW50UmVuZGVyUGFzcyYmdGhpcy5jdXJyZW50UmVuZGVyUGFzcyE9PXRoaXMubWFpblJlbmRlclBhc3MmJnRoaXMuZW5kUmVuZGVyVGFyZ2V0UmVuZGVyUGFzcygpLHRoaXMudHJhbnNpZW50Vmlld3BvcnQueD0xLzAsdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0PW51bGwsdGhpcy5jdXJyZW50UmVuZGVyUGFzcz10aGlzLm1haW5SZW5kZXJQYXNzfX1dKSx0fSgpKXx8WWMsUWM9big2MiksSmM9bi5uKFFjKSwkYz1uKDIzKSx0Zj1uLm4oJGMpLGVmPW4oMjQpLG5mPW4ubihlZikscmY9bigxNyksb2Y9bi5uKHJmKTtmdW5jdGlvbiBhZih0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPW9mKCkodCk7aWYoZSl7dmFyIGk9b2YoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbmYoKSh0aGlzLG4pfX12YXIgc2YsdWY9T2JqZWN0KCRhLmluamVjdGFibGUpKCkoSGM9ZnVuY3Rpb24odCl7dGYoKShuLHQpO3ZhciBlPWFmKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gSGEoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBLYSgpKG4sW3trZXk6XCJvbkVudGl0eUNyZWF0ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29uZmlnLGU9dC53aWR0aFNlZ21lbnRzLG49dm9pZCAwPT09ZT8xOmUscj10LmhlaWdodFNlZ21lbnRzLGk9dm9pZCAwPT09cj8xOnIsbz10LmRlcHRoU2VnbWVudHMsYT12b2lkIDA9PT1vPzE6byxzPXQuaGFsZkV4dGVudHMsdT12b2lkIDA9PT1zP3VuLmUuZnJvbVZhbHVlcyguNSwuNSwuNSk6cyxjPW4sZj1pLGw9YSxoPUpjKCkodSwzKSxkPWhbMF0scD1oWzFdLGc9aFsyXSx2PVt1bi5lLmZyb21WYWx1ZXMoLWQsLXAsZyksdW4uZS5mcm9tVmFsdWVzKGQsLXAsZyksdW4uZS5mcm9tVmFsdWVzKGQscCxnKSx1bi5lLmZyb21WYWx1ZXMoLWQscCxnKSx1bi5lLmZyb21WYWx1ZXMoZCwtcCwtZyksdW4uZS5mcm9tVmFsdWVzKC1kLC1wLC1nKSx1bi5lLmZyb21WYWx1ZXMoLWQscCwtZyksdW4uZS5mcm9tVmFsdWVzKGQscCwtZyldLHk9W1swLDEsM10sWzQsNSw3XSxbMywyLDZdLFsxLDAsNF0sWzEsNCwyXSxbNSwwLDZdXSxtPVtbMCwwLDFdLFswLDAsLTFdLFswLDEsMF0sWzAsLTEsMF0sWzEsMCwwXSxbLTEsMCwwXV0sYj0xLHg9Mix3PTMsUz00LEU9NSxfPVtdLE89W10saz1bXSxNPVtdLEE9W10sVD0wLEM9ZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbyxhO2ZvcihvPTA7bzw9ZTtvKyspZm9yKGE9MDthPD1uO2ErKyl7dmFyIHM9dW4uZS5jcmVhdGUoKSx1PXVuLmUuY3JlYXRlKCksYz11bi5lLmNyZWF0ZSgpLGY9dW4uZS5jcmVhdGUoKTt1bi5lLmxlcnAocyx2W3lbdF1bMF1dLHZbeVt0XVsxXV0sby9lKSx1bi5lLmxlcnAodSx2W3lbdF1bMF1dLHZbeVt0XVsyXV0sYS9uKSx1bi5lLnN1YihjLHUsdlt5W3RdWzBdXSksdW4uZS5hZGQoZixzLGMpLHI9by9lLGk9YS9uLF8ucHVzaChmWzBdLGZbMV0sZlsyXSksTy5wdXNoKG1bdF1bMF0sbVt0XVsxXSxtW3RdWzJdKSxrLnB1c2gocixpKSxyPS44NzUqKHIvPTMpKzQvNjQsaT0uODc1KihpLz0zKSs0LzY0LHIrPXQlMy8zLGkrPU1hdGguZmxvb3IodC8zKS8zLE0ucHVzaChyLGkpLG88ZSYmYTxuJiYoQS5wdXNoKFQrbisxLFQrMSxUKSxBLnB1c2goVCtuKzEsVCtuKzIsVCsxKSksVCsrfX07QygwLGMsZiksQyhiLGMsZiksQyh4LGMsbCksQyh3LGMsbCksQyhTLGwsZiksQyhFLGwsZik7dmFyIEk9T2JqZWN0KEphLmdlbmVyYXRlQUFCQkZyb21WZXJ0aWNlcykoXyksUD10aGlzLmdldENvbXBvbmVudCgpO1AuaW5kaWNlcz1VaW50MzJBcnJheS5mcm9tKEEpLFAuYWFiYj1JLFAudmVydGV4Q291bnQ9VCxQLmF0dHJpYnV0ZXM9W3tkaXJ0eTohMCxuYW1lOlwicG9zaXRpb25cIixkYXRhOkZsb2F0MzJBcnJheS5mcm9tKF8pLGFycmF5U3RyaWRlOjEyLHN0ZXBNb2RlOlwidmVydGV4XCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXQzXCJ9XX0se2RpcnR5OiEwLG5hbWU6XCJub3JtYWxcIixkYXRhOkZsb2F0MzJBcnJheS5mcm9tKE8pLGFycmF5U3RyaWRlOjEyLHN0ZXBNb2RlOlwidmVydGV4XCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjEsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXQzXCJ9XX0se2RpcnR5OiEwLG5hbWU6XCJ1dlwiLGRhdGE6RmxvYXQzMkFycmF5LmZyb20oayksYXJyYXlTdHJpZGU6OCxzdGVwTW9kZTpcInZlcnRleFwiLGF0dHJpYnV0ZXM6W3tzaGFkZXJMb2NhdGlvbjoyLG9mZnNldDowLGZvcm1hdDpcImZsb2F0MlwifV19XX19XSksbn0oUHMpKXx8SGM7ZnVuY3Rpb24gY2YodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1vZigpKHQpO2lmKGUpe3ZhciBpPW9mKCkodGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG5mKCkodGhpcyxuKX19dmFyIGZmLGxmPU9iamVjdCgkYS5pbmplY3RhYmxlKSgpKHNmPWZ1bmN0aW9uKHQpe3RmKCkobix0KTt2YXIgZT1jZihuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIEhhKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gS2EoKShuLFt7a2V5Olwib25FbnRpdHlDcmVhdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbmZpZy5nZW9tZXRyaWVzLGU9dm9pZCAwPT09dD9bXTp0LG49dGhpcy5nZXRDb21wb25lbnQoKTtuLmFhYmI9bmV3IEphLkFBQkI7dmFyIHI9W10saT1bXSxvPTA7ZS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LmFhYmIsYT10LmluZGljZXMscz10LnZlcnRleENvdW50LHU9dC5hdHRyaWJ1dGVzO24uYWFiYi5hZGQoZSksbi52ZXJ0ZXhDb3VudCs9cyxhJiZpLnB1c2guYXBwbHkoaSxadSgpKGEubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdCtvfSkpKSksbys9cyx1LmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7cltlXT90LmRhdGEmJihlcygpKHQuZGF0YSk/cltlXS5wdXNoKHQuZGF0YSk6RnMoKSh0LmRhdGEpP3JbZV0uZGF0YT1mdW5jdGlvbih0LGUpe2lmKCF0JiYhZSl0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2Ugc3BlY2lmeSB2YWxpZCBhcmd1bWVudHMgZm9yIHBhcmFtZXRlcnMgYSBhbmQgYi5cIik7aWYoIWV8fDA9PT1lLmxlbmd0aClyZXR1cm4gdDtpZighdHx8MD09PXQubGVuZ3RoKXJldHVybiBlO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgdHlwZXMgb2YgdGhlIHR3byBhcmd1bWVudHMgcGFzc2VkIGZvciBwYXJhbWV0ZXJzIGEgYW5kIGIgZG8gbm90IG1hdGNoLlwiKTt2YXIgbj1uZXcgdC5jb25zdHJ1Y3Rvcih0Lmxlbmd0aCtlLmxlbmd0aCk7cmV0dXJuIG4uc2V0KHQpLG4uc2V0KGUsdC5sZW5ndGgpLG59KHJbZV0uZGF0YSx0LmRhdGEpOnJbZV0uZGF0YT1yW2VdLmRhdGEuY29uY2F0KHQuZGF0YSkpOihyW2VdPXQscltlXS5kaXJ0eT0hMCl9KSl9KSksbi5hdHRyaWJ1dGVzPXIsbi5pbmRpY2VzPVVpbnQzMkFycmF5LmZyb20oaSksbi5kaXJ0eT0hMH19XSksbn0oUHMpKXx8c2Y7ZnVuY3Rpb24gaGYodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1vZigpKHQpO2lmKGUpe3ZhciBpPW9mKCkodGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG5mKCkodGhpcyxuKX19dmFyIGRmLHBmPU9iamVjdCgkYS5pbmplY3RhYmxlKSgpKGZmPWZ1bmN0aW9uKHQpe3RmKCkobix0KTt2YXIgZT1oZihuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIEhhKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gS2EoKShuLFt7a2V5Olwib25FbnRpdHlDcmVhdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5jb25maWcsZT10LmhhbGZFeHRlbnRzLG49dm9pZCAwPT09ZT9bLjUsLjVdOmUscj10LndpZHRoU2VnbWVudHMsaT12b2lkIDA9PT1yPzU6cixvPXQubGVuZ3RoU2VnbWVudHMsYT12b2lkIDA9PT1vPzU6byxzPVtdLHU9W10sYz1bXSxmPVtdLGw9MCxoPTA7aDw9aTtoKyspZm9yKHZhciBkPTA7ZDw9YTtkKyspe3ZhciBwPS1uWzBdKzIqblswXSpoL2ksZz0tKC1uWzFdKzIqblsxXSpkL2EpLHY9aC9pLHk9ZC9hO3MucHVzaChwLDAsZyksdS5wdXNoKDAsMSwwKSxjLnB1c2godix5KSxoPGkmJmQ8YSYmKGYucHVzaChsK2ErMSxsKzEsbCksZi5wdXNoKGwrYSsxLGwrYSsyLGwrMSkpLGwrK312YXIgbT1PYmplY3QoSmEuZ2VuZXJhdGVBQUJCRnJvbVZlcnRpY2VzKShzKSxiPXRoaXMuZ2V0Q29tcG9uZW50KCk7Yi5pbmRpY2VzPVVpbnQzMkFycmF5LmZyb20oZiksYi5hYWJiPW0sYi52ZXJ0ZXhDb3VudD1sLGIuYXR0cmlidXRlcz1be2RpcnR5OiEwLG5hbWU6XCJwb3NpdGlvblwiLGRhdGE6RmxvYXQzMkFycmF5LmZyb20ocyksYXJyYXlTdHJpZGU6MTIsc3RlcE1vZGU6XCJ2ZXJ0ZXhcIixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MCxvZmZzZXQ6MCxmb3JtYXQ6XCJmbG9hdDNcIn1dfSx7ZGlydHk6ITAsbmFtZTpcIm5vcm1hbFwiLGRhdGE6RmxvYXQzMkFycmF5LmZyb20odSksYXJyYXlTdHJpZGU6MTIsc3RlcE1vZGU6XCJ2ZXJ0ZXhcIixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MSxvZmZzZXQ6MCxmb3JtYXQ6XCJmbG9hdDNcIn1dfSx7ZGlydHk6ITAsbmFtZTpcInV2XCIsZGF0YTpGbG9hdDMyQXJyYXkuZnJvbShjKSxhcnJheVN0cmlkZTo4LHN0ZXBNb2RlOlwidmVydGV4XCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjIsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXQyXCJ9XX1dfX1dKSxufShQcykpfHxmZjtmdW5jdGlvbiBnZih0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPW9mKCkodCk7aWYoZSl7dmFyIGk9b2YoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbmYoKSh0aGlzLG4pfX12YXIgdmYseWYsbWYsYmYseGYsd2YsU2YsRWY9T2JqZWN0KCRhLmluamVjdGFibGUpKCkoZGY9ZnVuY3Rpb24odCl7dGYoKShuLHQpO3ZhciBlPWdmKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gSGEoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBLYSgpKG4sW3trZXk6XCJvbkVudGl0eUNyZWF0ZWRcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmNvbmZpZyxlPXQucmFkaXVzLG49dm9pZCAwPT09ZT8uNTplLHI9dC5sYXRpdHVkZUJhbmRzLGk9dm9pZCAwPT09cj8xNjpyLG89dC5sb25naXR1ZGVCYW5kcyxhPXZvaWQgMD09PW8/MTY6byxzPVtdLHU9W10sYz1bXSxmPVtdLGw9MDtsPD1pO2wrKylmb3IodmFyIGg9bCpNYXRoLlBJL2ksZD1NYXRoLnNpbihoKSxwPU1hdGguY29zKGgpLGc9MDtnPD1hO2crKyl7dmFyIHY9MipnKk1hdGguUEkvYS1NYXRoLlBJLzIseT1NYXRoLnNpbih2KSxtPU1hdGguY29zKHYpKmQsYj1wLHg9eSpkLHc9MS1nL2EsUz0xLWwvaTtzLnB1c2gobSpuLGIqbix4Km4pLHUucHVzaChtLGIseCksYy5wdXNoKHcsUyl9Zm9yKHZhciBFPTA7RTxpOysrRSlmb3IodmFyIF89MDtfPGE7KytfKXt2YXIgTz1FKihhKzEpK18saz1PK2ErMTtmLnB1c2goTysxLGssTyksZi5wdXNoKE8rMSxrKzEsayl9dmFyIE09T2JqZWN0KEphLmdlbmVyYXRlQUFCQkZyb21WZXJ0aWNlcykocyksQT10aGlzLmdldENvbXBvbmVudCgpO0EuaW5kaWNlcz1VaW50MzJBcnJheS5mcm9tKGYpLEEuYWFiYj1NLEEudmVydGV4Q291bnQ9cy5sZW5ndGgvMyxBLmF0dHJpYnV0ZXM9W3tkaXJ0eTohMCxuYW1lOlwicG9zaXRpb25cIixkYXRhOkZsb2F0MzJBcnJheS5mcm9tKHMpLGFycmF5U3RyaWRlOjEyLHN0ZXBNb2RlOlwidmVydGV4XCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXQzXCJ9XX0se2RpcnR5OiEwLG5hbWU6XCJub3JtYWxcIixkYXRhOkZsb2F0MzJBcnJheS5mcm9tKHUpLGFycmF5U3RyaWRlOjEyLHN0ZXBNb2RlOlwidmVydGV4XCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjEsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXQzXCJ9XX0se2RpcnR5OiEwLG5hbWU6XCJ1dlwiLGRhdGE6RmxvYXQzMkFycmF5LmZyb20oYyksYXJyYXlTdHJpZGU6OCxzdGVwTW9kZTpcInZlcnRleFwiLGF0dHJpYnV0ZXM6W3tzaGFkZXJMb2NhdGlvbjoyLG9mZnNldDowLGZvcm1hdDpcImZsb2F0MlwifV19XX19XSksbn0oUHMpKXx8ZGYsX2Y9bigyMiksT2Y9bi5uKF9mKTtmdW5jdGlvbiBrZih0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPW9mKCkodCk7aWYoZSl7dmFyIGk9b2YoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbmYoKSh0aGlzLG4pfX12YXIgTWYsQWYsVGYsQ2YsSWYsUGYsamYsRGYsTmYsUmYsTGYsQmY9KHZmPU9iamVjdCgkYS5pbmplY3RhYmxlKSgpLHlmPU9iamVjdCgkYS5pbmplY3QpKEphLklERU5USUZJRVIuUmVuZGVyRW5naW5lKSxtZj1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLlNoYWRlck1vZHVsZVNlcnZpY2UpLHZmKCh4Zj1mdW5jdGlvbih0KXt0ZigpKG4sdCk7dmFyIGU9a2Yobik7ZnVuY3Rpb24gbigpe3ZhciB0O0hhKCkodGhpcyxuKTtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxpPW5ldyBBcnJheShyKSxvPTA7bzxyO28rKylpW29dPWFyZ3VtZW50c1tvXTtyZXR1cm4gdD1lLmNhbGwuYXBwbHkoZSxbdGhpc10uY29uY2F0KGkpKSxYYSgpKHQsXCJlbmdpbmVcIix3ZixPZigpKHQpKSxYYSgpKHQsXCJzaGFkZXJNb2R1bGVTZXJ2aWNlXCIsU2YsT2YoKSh0KSksdH1yZXR1cm4gS2EoKShuLFt7a2V5Olwib25FbnRpdHlDcmVhdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldENvbXBvbmVudCgpLGU9dGhpcy5lbmdpbmUuc3VwcG9ydFdlYkdQVT9cImxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMCkgdW5pZm9ybSBVbmlmb3JtcyB7XFxuICB2ZWM0IGNvbG9yO1xcbiAgbWF0NCBwcm9qZWN0aW9uTWF0cml4O1xcbiAgbWF0NCBtb2RlbFZpZXdNYXRyaXg7XFxufSB1bmlmb3JtcztcXG5cXG5sYXlvdXQobG9jYXRpb24gPSAwKSBpbiB2ZWMzIHBvc2l0aW9uO1xcbi8vIGxheW91dChsb2NhdGlvbiA9IDEpIGluIHZlYzMgYmFyeWNlbnRyaWM7XFxuXFxubGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IHZlYzQgZnJhZ0NvbG9yO1xcbi8vIGxheW91dChsb2NhdGlvbiA9IDEpIG91dCB2ZWMzIHZfQmFyeWNlbnRyaWM7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgZ2xfUG9zaXRpb24gPSB1bmlmb3Jtcy5wcm9qZWN0aW9uTWF0cml4ICogdW5pZm9ybXMubW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXG4gIGZyYWdDb2xvciA9IHVuaWZvcm1zLmNvbG9yO1xcbiAgLy8gdl9CYXJ5Y2VudHJpYyA9IGJhcnljZW50cmljO1xcbn1cIjonYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XFxuYXR0cmlidXRlIHZlYzMgbm9ybWFsO1xcblxcbnVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4O1xcbnVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7XFxudW5pZm9ybSB2ZWM0IGNvbG9yO1xcblxcbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XFxuXFxuI3ByYWdtYSBpbmNsdWRlIFwidXYudmVydC5kZWNsYXJhdGlvblwiXFxuXFxudm9pZCBtYWluKCkge1xcbiAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXG4gIGZyYWdDb2xvciA9IGNvbG9yO1xcblxcbiAgI3ByYWdtYSBpbmNsdWRlIFwidXYudmVydC5tYWluXCJcXG59JyxuPXRoaXMuZW5naW5lLnN1cHBvcnRXZWJHUFU/XCIvLyBsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDEpIHVuaWZvcm0gV2lyZWZyYW1lVW5pZm9ybXMge1xcbi8vICAgZmxvYXQgbGluZVdpZHRoO1xcbi8vICAgdmVjNCBsaW5lQ29sb3I7XFxuLy8gfSB3aXJlZnJhbWU7XFxuXFxubGF5b3V0KGxvY2F0aW9uID0gMCkgaW4gdmVjNCBmcmFnQ29sb3I7XFxuLy8gbGF5b3V0KGxvY2F0aW9uID0gMSkgaW4gdmVjMyB2X0JhcnljZW50cmljO1xcblxcbmxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0IG91dENvbG9yO1xcblxcbi8vIHdpcmVmcmFtZVxcbi8vIGZsb2F0IGVkZ2VGYWN0b3IoKSB7XFxuLy8gICB2ZWMzIGQgPSBmd2lkdGgodl9CYXJ5Y2VudHJpYyk7XFxuLy8gICB2ZWMzIGEzID0gc21vb3Roc3RlcCh2ZWMzKDAuMCksIGQgKiB3aXJlZnJhbWUubGluZVdpZHRoLCB2X0JhcnljZW50cmljKTtcXG4vLyAgIHJldHVybiBtaW4obWluKGEzLngsIGEzLnkpLCBhMy56KTtcXG4vLyB9XFxuXFxudm9pZCBtYWluKCkge1xcbiAgLy8gb3V0Q29sb3IgPSBtaXgoZnJhZ0NvbG9yLCB3aXJlZnJhbWUubGluZUNvbG9yLCAoMS4wIC0gZWRnZUZhY3RvcigpKSk7XFxuICBvdXRDb2xvciA9IGZyYWdDb2xvcjtcXG59XCI6J3ZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XFxuXFxuI3ByYWdtYSBpbmNsdWRlIFwidXYuZnJhZy5kZWNsYXJhdGlvblwiXFxuI3ByYWdtYSBpbmNsdWRlIFwibWFwLmZyYWcuZGVjbGFyYXRpb25cIlxcblxcbnZvaWQgbWFpbigpIHtcXG4gIHZlYzQgZGlmZnVzZUNvbG9yID0gZnJhZ0NvbG9yO1xcblxcbiAgI3ByYWdtYSBpbmNsdWRlIFwibWFwLmZyYWcubWFpblwiXFxuXFxuICBnbF9GcmFnQ29sb3IgPSBkaWZmdXNlQ29sb3I7XFxufSc7dGhpcy5zaGFkZXJNb2R1bGVTZXJ2aWNlLnJlZ2lzdGVyTW9kdWxlKFwibWF0ZXJpYWwtYmFzaWNcIix7dnM6ZSxmczpufSk7dmFyIHI9dGhpcy5zaGFkZXJNb2R1bGVTZXJ2aWNlLmdldE1vZHVsZShcIm1hdGVyaWFsLWJhc2ljXCIpLGk9ci52cyxvPXIuZnMsYT1yLnVuaWZvcm1zO3QudmVydGV4U2hhZGVyR0xTTD1pLHQuZnJhZ21lbnRTaGFkZXJHTFNMPW8sdC5zZXRVbmlmb3JtKGEpLHRoaXMuY29uZmlnLm1hcCYmKHQuc2V0RGVmaW5lcyh7VVNFX1VWOjEsVVNFX01BUDoxfSksdC5zZXRVbmlmb3JtKHttYXA6dGhpcy5jb25maWcubWFwLHV2VHJhbnNmb3JtOnVuLmEuY3JlYXRlKCl9KSl9fV0pLG59KFR1KSx3Zj1RYSgpKHhmLnByb3RvdHlwZSxcImVuZ2luZVwiLFt5Zl0se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxTZj1RYSgpKHhmLnByb3RvdHlwZSxcInNoYWRlck1vZHVsZVNlcnZpY2VcIixbbWZdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksYmY9eGYpKXx8YmYpO2Z1bmN0aW9uIEdmKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9b2YoKSh0KTtpZihlKXt2YXIgaT1vZigpKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBuZigpKHRoaXMsbil9fXZhciBGZj0oTWY9T2JqZWN0KCRhLmluamVjdGFibGUpKCksQWY9T2JqZWN0KCRhLmluamVjdCkoSmEuSURFTlRJRklFUi5TeXN0ZW1zKSxUZj1PYmplY3QoJGEubmFtZWQpKEphLklERU5USUZJRVIuTWF0ZXJpYWxTeXN0ZW0pLENmPU9iamVjdCgkYS5pbmplY3QpKEphLklERU5USUZJRVIuU3lzdGVtcyksSWY9T2JqZWN0KCRhLm5hbWVkKShKYS5JREVOVElGSUVSLkdlb21ldHJ5U3lzdGVtKSxQZj1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLlNoYWRlck1vZHVsZVNlcnZpY2UpLE1mKChEZj1mdW5jdGlvbih0KXt0ZigpKG4sdCk7dmFyIGU9R2Yobik7ZnVuY3Rpb24gbigpe3ZhciB0O0hhKCkodGhpcyxuKTtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxpPW5ldyBBcnJheShyKSxvPTA7bzxyO28rKylpW29dPWFyZ3VtZW50c1tvXTtyZXR1cm4gdD1lLmNhbGwuYXBwbHkoZSxbdGhpc10uY29uY2F0KGkpKSxYYSgpKHQsXCJtYXRlcmlhbFN5c3RlbVwiLE5mLE9mKCkodCkpLFhhKCkodCxcImdlb21ldHJ5U3lzdGVtXCIsUmYsT2YoKSh0KSksWGEoKSh0LFwic2hhZGVyTW9kdWxlU2VydmljZVwiLExmLE9mKCkodCkpLHR9cmV0dXJuIEthKCkobixbe2tleTpcIm9uQXR0cmlidXRlQ2hhbmdlZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZSxuPXQuZGF0YSxyPXRoaXMuZ2V0TWVzaENvbXBvbmVudCgpO3ImJnIubWF0ZXJpYWwmJihcImdyaWRDb2xvclwiPT09ZT8oci5tYXRlcmlhbC5zZXRVbmlmb3JtKFwidV9HcmlkQ29sb3JcIixuKSxyLm1hdGVyaWFsLnNldFVuaWZvcm0oXCJ1X0dyaWRDb2xvcjJcIixuKSk6XCJncmlkU2l6ZVwiPT09ZSYmKHIubWF0ZXJpYWwuc2V0VW5pZm9ybShcInVfR3JpZFNpemVcIixuKSxyLm1hdGVyaWFsLnNldFVuaWZvcm0oXCJ1X0dyaWRTaXplMlwiLG4pKSl9fSx7a2V5Olwib25FbnRpdHlDcmVhdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNoYWRlck1vZHVsZVNlcnZpY2UucmVnaXN0ZXJNb2R1bGUoXCJncmlkXCIse3ZzOlwiYXR0cmlidXRlIHZlYzMgYV9Qb3NpdGlvbjtcXG5cXG52YXJ5aW5nIHZlYzMgdl9Qb3NpdGlvbjtcXG5cXG51bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDtcXG51bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4O1xcblxcbnZvaWQgbWFpbigpIHtcXG4gIHZfUG9zaXRpb24gPSBhX1Bvc2l0aW9uO1xcbiAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChhX1Bvc2l0aW9uLCAxLik7XFxufVwiLGZzOlwiLy8gZ2VuZXJhdGUgZ3JpZCwgYm9ycm93IGZyb20gY2xheS5nbCB2aWV3ZXJcXG4vLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waXNzYW5nL2NsYXktdmlld2VyL2Jsb2IvbWFzdGVyL3NyYy9ncmFwaGljL2dyb3VuZC5nbHNsXFxuI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGVcXG5cXG52YXJ5aW5nIHZlYzMgdl9Qb3NpdGlvbjtcXG4vLyB2YXJ5aW5nIHZlYzMgdl9Ob3JtYWw7XFxuXFxudW5pZm9ybSBmbG9hdCB1X0dyaWRTaXplIDogNTtcXG51bmlmb3JtIGZsb2F0IHVfR3JpZFNpemUyIDogLjU7XFxudW5pZm9ybSB2ZWM0IHVfR3JpZENvbG9yIDogWzAsIDAsIDAsIDFdO1xcbnVuaWZvcm0gdmVjNCB1X0dyaWRDb2xvcjIgOiBbMC4zLCAwLjMsIDAuMywgMV07XFxudW5pZm9ybSBib29sIHVfR3JpZEVuYWJsZWQgOiB0cnVlO1xcblxcbi8vIHVuaWZvcm0gdmVjMyB1X0xpZ2h0RGlyZWN0aW9uO1xcbi8vIHVuaWZvcm0gdmVjMyB1X0xpZ2h0Q29sb3I7XFxuLy8gdW5pZm9ybSB2ZWMzIHVfQ2FtZXJhO1xcblxcbnZvaWQgbWFpbigpIHtcXG4gIC8vIHZlYzMgbiA9IHZfTm9ybWFsO1xcbiAgLy8gdmVjMyBsID0gbm9ybWFsaXplKHVfTGlnaHREaXJlY3Rpb24pO1xcbiAgLy8gZmxvYXQgTmRvdEwgPSBjbGFtcChkb3QobiwgbCksIDAuMDAxLCAxLjApO1xcblxcbiAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLik7XFxuXFxuICBpZiAodV9HcmlkRW5hYmxlZCkge1xcbiAgICBmbG9hdCB3eCA9IHZfUG9zaXRpb24ueDtcXG4gICAgZmxvYXQgd3ogPSB2X1Bvc2l0aW9uLno7XFxuICAgIC8vIGZsb2F0IHgwID0gYWJzKGZyYWN0KHd4IC8gdV9HcmlkU2l6ZSAtIDAuNSkgLSAwLjUpIC8gZndpZHRoKHd4KSAqIHVfR3JpZFNpemUgLyAyLjA7XFxuICAgIC8vIGZsb2F0IHowID0gYWJzKGZyYWN0KHd6IC8gdV9HcmlkU2l6ZSAtIDAuNSkgLSAwLjUpIC8gZndpZHRoKHd6KSAqIHVfR3JpZFNpemUgLyAyLjA7XFxuXFxuICAgIGZsb2F0IHgxID0gYWJzKGZyYWN0KHd4IC8gdV9HcmlkU2l6ZTIgLSAwLjUpIC0gMC41KSAvIGZ3aWR0aCh3eCkgKiB1X0dyaWRTaXplMjtcXG4gICAgZmxvYXQgejEgPSBhYnMoZnJhY3Qod3ogLyB1X0dyaWRTaXplMiAtIDAuNSkgLSAwLjUpIC8gZndpZHRoKHd6KSAqIHVfR3JpZFNpemUyO1xcblxcbiAgICAvLyBmbG9hdCB2MCA9IDEuMCAtIGNsYW1wKG1pbih4MCwgejApLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IHYxID0gMS4wIC0gY2xhbXAobWluKHgxLCB6MSksIDAuMCwgMS4wKTtcXG4gICAgLy8gaWYgKHYwID4gMC4xKSB7XFxuICAgICAgICAvLyBnbF9GcmFnQ29sb3IgPSBtaXgoZ2xfRnJhZ0NvbG9yLCB1X0dyaWRDb2xvciwgdjApO1xcbiAgICAvLyB9XFxuICAgIC8vIGVsc2Uge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yID0gbWl4KGdsX0ZyYWdDb2xvciwgdV9HcmlkQ29sb3IyLCB2MSk7XFxuICAgIC8vIH1cXG4gIH1cXG5cXG4gIC8vIGZsb2F0IHNoYWRvd0ZhY3RvciA9IGNhbGNTaGFkb3codV9TaGFkb3dNYXAsIHZfUG9zaXRpb25Gcm9tTGlnaHQsIGwsIG4pO1xcbiAgLy8gdmVjMyBkaWZmdXNlQ29sb3IgPSB1X0xpZ2h0Q29sb3IgKiBOZG90TCAqIHNoYWRvd0ZhY3RvcjtcXG5cXG4gIC8vIGdsX0ZyYWdDb2xvci5yZ2IgKj0gZGlmZnVzZUNvbG9yO1xcbn1cIn0pO3ZhciB0PXRoaXMuc2hhZGVyTW9kdWxlU2VydmljZS5nZXRNb2R1bGUoXCJncmlkXCIpLGU9dC52cyxuPXQuZnMscj10LnVuaWZvcm1zLGk9dGhpcy5tYXRlcmlhbFN5c3RlbS5jcmVhdGVTaGFkZXJNYXRlcmlhbCh7dmVydGV4U2hhZGVyOmUsZnJhZ21lbnRTaGFkZXI6bn0pO3RoaXMuc2V0TWF0ZXJpYWwoaSk7dmFyIG89dGhpcy5nZW9tZXRyeVN5c3RlbS5jcmVhdGVCdWZmZXJHZW9tZXRyeSh7dmVydGV4Q291bnQ6NH0pO3RoaXMuc2V0R2VvbWV0cnkobyksaS5zZXRDdWxsKHtlbmFibGU6ITEsZmFjZTpKYS5nbC5CQUNLfSkuc2V0RGVwdGgoe2VuYWJsZTohMCxmdW5jOkphLmdsLkxFU1N9KSxpLnNldFVuaWZvcm0ociksdGhpcy5zZXRBdHRyaWJ1dGVzKHtncmlkQ29sb3I6dGhpcy5jb25maWcuZ3JpZENvbG9yLGdyaWRTaXplOnRoaXMuY29uZmlnLmdyaWRTaXplfSksby5zZXRJbmRleChbMCwzLDIsMiwxLDBdKSxvLnNldEF0dHJpYnV0ZShcImFfUG9zaXRpb25cIixGbG9hdDMyQXJyYXkuZnJvbShbLTQsLTEsLTQsNCwtMSwtNCw0LC0xLDQsLTQsLTEsNF0pLHthcnJheVN0cmlkZTo4LHN0ZXBNb2RlOlwidmVydGV4XCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXQyXCJ9XX0pfX1dKSxufShDdSksTmY9UWEoKShEZi5wcm90b3R5cGUsXCJtYXRlcmlhbFN5c3RlbVwiLFtBZixUZl0se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxSZj1RYSgpKERmLnByb3RvdHlwZSxcImdlb21ldHJ5U3lzdGVtXCIsW0NmLElmXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLExmPVFhKCkoRGYucHJvdG90eXBlLFwic2hhZGVyTW9kdWxlU2VydmljZVwiLFtQZl0se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxqZj1EZikpfHxqZiksVWY9big5NiksemY9big2NCk7ZnVuY3Rpb24gVmYodCxlLG4scixpKXtXZihlLHIsLWkpLFdmKGUscixpKSx0LnB1c2gobiksdC5wdXNoKG4pfWZ1bmN0aW9uIFdmKHQsZSxuKXt0LnB1c2goW1tlWzBdLGVbMV1dLG5dKX12YXIgWGYsWWYsSGYscWYsS2YsWmYsUWYsSmYsJGYsdGwsZWw7ZnVuY3Rpb24gbmwodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1vZigpKHQpO2lmKGUpe3ZhciBpPW9mKCkodGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG5mKCkodGhpcyxuKX19dmFyIHJsLGlsLG9sLGFsLHNsLHVsLGNsLGZsLGxsLGhsLGRsLHBsPShYZj1PYmplY3QoJGEuaW5qZWN0YWJsZSkoKSxZZj1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLlN5c3RlbXMpLEhmPU9iamVjdCgkYS5uYW1lZCkoSmEuSURFTlRJRklFUi5NYXRlcmlhbFN5c3RlbSkscWY9T2JqZWN0KCRhLmluamVjdCkoSmEuSURFTlRJRklFUi5TeXN0ZW1zKSxLZj1PYmplY3QoJGEubmFtZWQpKEphLklERU5USUZJRVIuR2VvbWV0cnlTeXN0ZW0pLFpmPU9iamVjdCgkYS5pbmplY3QpKEphLklERU5USUZJRVIuU2hhZGVyTW9kdWxlU2VydmljZSksWGYoKEpmPWZ1bmN0aW9uKHQpe3RmKCkobix0KTt2YXIgZT1ubChuKTtmdW5jdGlvbiBuKCl7dmFyIHQ7SGEoKSh0aGlzLG4pO2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7bysrKWlbb109YXJndW1lbnRzW29dO3JldHVybiB0PWUuY2FsbC5hcHBseShlLFt0aGlzXS5jb25jYXQoaSkpLFhhKCkodCxcIm1hdGVyaWFsU3lzdGVtXCIsJGYsT2YoKSh0KSksWGEoKSh0LFwiZ2VvbWV0cnlTeXN0ZW1cIix0bCxPZigpKHQpKSxYYSgpKHQsXCJzaGFkZXJNb2R1bGVTZXJ2aWNlXCIsZWwsT2YoKSh0KSksdC52ZXJ0ZXhDb3VudD12b2lkIDAsdH1yZXR1cm4gS2EoKShuLFt7a2V5Olwib25BdHRyaWJ1dGVDaGFuZ2VkXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5uYW1lLG49dC5kYXRhLHI9dGhpcy5nZXRNZXNoQ29tcG9uZW50KCk7aWYociYmci5tYXRlcmlhbClzd2l0Y2goZSl7Y2FzZVwiZGFzaEFycmF5XCI6ci5tYXRlcmlhbC5zZXRVbmlmb3JtKFwidV9kYXNoX2FycmF5XCIsbik7YnJlYWs7Y2FzZVwiZGFzaE9mZnNldFwiOnIubWF0ZXJpYWwuc2V0VW5pZm9ybShcInVfZGFzaF9vZmZzZXRcIixuKTticmVhaztjYXNlXCJkYXNoUmF0aW9cIjpyLm1hdGVyaWFsLnNldFVuaWZvcm0oXCJ1X2Rhc2hfcmF0aW9cIixuKTticmVhaztjYXNlXCJ0aGlja25lc3NcIjpyLm1hdGVyaWFsLnNldFVuaWZvcm0oXCJ1X3RoaWNrbmVzc1wiLG4pO2JyZWFrO2Nhc2VcImNvbG9yXCI6dmFyIGk9bmV3IEFycmF5KHRoaXMudmVydGV4Q291bnQpLmZpbGwodm9pZCAwKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybltdLmNvbmNhdChadSgpKHQpLFp1KCkoZSkpfSksW10pO3IuZ2VvbWV0cnkuc2V0QXR0cmlidXRlKFwiYV9jb2xvclwiLEZsb2F0MzJBcnJheS5mcm9tKGkpLHthcnJheVN0cmlkZToxNixzdGVwTW9kZTpcInZlcnRleFwiLGF0dHJpYnV0ZXM6W3tzaGFkZXJMb2NhdGlvbjoxLG9mZnNldDowLGZvcm1hdDpcImZsb2F0NFwifV19KX19fSx7a2V5Olwib25FbnRpdHlDcmVhdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuc2hhZGVyTW9kdWxlU2VydmljZS5yZWdpc3Rlck1vZHVsZShcImxpbmVcIix7dnM6XCJhdHRyaWJ1dGUgdmVjMiBhX3BvcztcXG5hdHRyaWJ1dGUgdmVjNCBhX2NvbG9yO1xcbmF0dHJpYnV0ZSBmbG9hdCBhX2xpbmVfbWl0ZXI7XFxuYXR0cmlidXRlIHZlYzIgYV9saW5lX25vcm1hbDtcXG5hdHRyaWJ1dGUgZmxvYXQgYV9jb3VudGVycztcXG5cXG51bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDtcXG51bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4O1xcbnVuaWZvcm0gZmxvYXQgdV90aGlja25lc3MgOiAwLjAyO1xcbnVuaWZvcm0gdmVjMiB1X3ZpZXdwb3J0O1xcblxcbnZhcnlpbmcgdmVjNCB2X2NvbG9yO1xcbnZhcnlpbmcgdmVjMiB2X25vcm1hbDtcXG52YXJ5aW5nIGZsb2F0IHZfY291bnRlcnM7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgdl9jb2xvciA9IGFfY29sb3I7XFxuICB2X2NvdW50ZXJzID0gYV9jb3VudGVycztcXG5cXG4gIHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKHZlYzMoYV9saW5lX25vcm1hbCwgMC4wKSk7XFxuXFxuICB2ZWM0IG9mZnNldCA9IHZlYzQobm9ybWFsICogdV90aGlja25lc3MgLyAyLjAgKiBhX2xpbmVfbWl0ZXIsIDAuMCk7XFxuXFxuICB2X25vcm1hbCA9IHZlYzIobm9ybWFsICogc2lnbihhX2xpbmVfbWl0ZXIpKTtcXG5cXG4gIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoYV9wb3MsIDAuMCwgMS4wKSArIG9mZnNldDtcXG59XFxuXCIsZnM6XCJ1bmlmb3JtIGZsb2F0IHVfZGFzaF9hcnJheSA6IDAuMDI7XFxudW5pZm9ybSBmbG9hdCB1X2Rhc2hfb2Zmc2V0IDogMDtcXG51bmlmb3JtIGZsb2F0IHVfZGFzaF9yYXRpbyA6IDA7XFxudW5pZm9ybSBmbG9hdCB1X3RoaWNrbmVzcyA6IDAuMDI7XFxuXFxudmFyeWluZyB2ZWM0IHZfY29sb3I7XFxudmFyeWluZyB2ZWMyIHZfbm9ybWFsO1xcbnZhcnlpbmcgZmxvYXQgdl9jb3VudGVycztcXG5cXG52b2lkIG1haW4oKSB7XFxuICAgIGZsb2F0IGJsdXIgPSAxLiAtIHNtb290aHN0ZXAoMC45OCwgMS4sIGxlbmd0aCh2X25vcm1hbCkpO1xcblxcbiAgICBnbF9GcmFnQ29sb3IgPSB2X2NvbG9yO1xcbiAgICBnbF9GcmFnQ29sb3IuYSAqPSBibHVyICogY2VpbChtb2Qodl9jb3VudGVycyArIHVfZGFzaF9vZmZzZXQsIHVfZGFzaF9hcnJheSkgLSAodV9kYXNoX2FycmF5ICogdV9kYXNoX3JhdGlvKSk7XFxufVwifSk7dmFyIGU9dGhpcy5zaGFkZXJNb2R1bGVTZXJ2aWNlLmdldE1vZHVsZShcImxpbmVcIiksbj1lLnZzLHI9ZS5mcyxpPWUudW5pZm9ybXMsbz10aGlzLm1hdGVyaWFsU3lzdGVtLmNyZWF0ZVNoYWRlck1hdGVyaWFsKHt2ZXJ0ZXhTaGFkZXI6bixmcmFnbWVudFNoYWRlcjpyfSksYT1mdW5jdGlvbih0LGUsbil7dmFyIHI9WzAsMF0saT1bMCwwXSxvPVswLDBdLGE9WzAsMF0scz0tMSx1PSExLGM9bnVsbCxmPU9iamVjdChVZi5jcmVhdGUpKCksbD1ufHwwLGg9W10sZD1bXSxwPVtdLGc9WzAsMF07ZSYmKHQ9dC5zbGljZSgpKS5wdXNoKHRbMF0pO2Zvcih2YXIgdj10Lmxlbmd0aCx5PTE7eTx2O3krKyl7dmFyIG09bCxiPXRbeS0xXSx4PXRbeV0sdz15PHQubGVuZ3RoLTE/dFt5KzFdOm51bGw7aWYoZy5wdXNoKHkvdix5L3YpLE9iamVjdCh6Zi5kaXJlY3Rpb24pKHIseCxiKSxjfHwoYz1bMCwwXSxPYmplY3QoemYubm9ybWFsKShjLHIpKSx1fHwodT0hMCxWZihkLGgsYixjLDEpKSxwLnB1c2goW20rMCxtKzEsbSsyXSksdyl7T2JqZWN0KHpmLmRpcmVjdGlvbikoaSx3LHgpO3ZhciBTPU9iamVjdCh6Zi5jb21wdXRlTWl0ZXIpKG8sYSxyLGksMSksRT1PYmplY3QoVWYuZG90KShvLGMpPDA/LTE6MSxfPVM+MztpZighaXNGaW5pdGUoUykpe09iamVjdCh6Zi5ub3JtYWwpKGMsciksVmYoZCxoLHgsYywxKSxwLnB1c2goMT09PXM/W20sbSsyLG0rM106W20rMixtKzEsbSszXSksbCs9MixzPUU7Y29udGludWV9Xz8oUz0zLGcucHVzaCh5L3YpLFdmKGgsYywtRSksZC5wdXNoKHgpLFdmKGgsYSxTKkUpLGQucHVzaCh4KSxwLnB1c2gocyE9PS1FP1ttLG0rMixtKzNdOlttKzIsbSsxLG0rM10pLHAucHVzaChbbSsyLG0rMyxtKzRdKSxPYmplY3QoemYubm9ybWFsKShmLGkpLE9iamVjdChVZi5jb3B5KShjLGYpLFdmKGgsYywtRSksZC5wdXNoKHgpLGwrPTMpOihWZihkLGgseCxhLFMpLHAucHVzaCgxPT09cz9bbSxtKzIsbSszXTpbbSsyLG0rMSxtKzNdKSxFPS0xLE9iamVjdChVZi5jb3B5KShjLGEpLGwrPTIpLHM9RX1lbHNlIE9iamVjdCh6Zi5ub3JtYWwpKGMsciksVmYoZCxoLHgsYywxKSxwLnB1c2goMT09PXM/W20sbSsyLG0rM106W20rMixtKzEsbSszXSksbCs9Mn1yZXR1cm57bm9ybWFsczpoLGF0dHJJbmRleDpwLGF0dHJQb3M6ZCxhdHRyQ291bnRlcnM6Z319KHRoaXMuY29uZmlnLnBvaW50cywhMSkscz1hLm5vcm1hbHMsdT1hLmF0dHJJbmRleCxjPWEuYXR0clBvcyxmPWEuYXR0ckNvdW50ZXJzLGw9Yy5sZW5ndGg7dGhpcy52ZXJ0ZXhDb3VudD1sO3ZhciBoPXRoaXMuZ2VvbWV0cnlTeXN0ZW0uY3JlYXRlQnVmZmVyR2VvbWV0cnkoe3ZlcnRleENvdW50Omx9KTt0aGlzLnNldE1hdGVyaWFsKG8pLHRoaXMuc2V0R2VvbWV0cnkoaCksby5zZXRDdWxsKHtlbmFibGU6ITEsZmFjZTpKYS5nbC5CQUNLfSkuc2V0VW5pZm9ybShpKSx0aGlzLnNldEF0dHJpYnV0ZXMoe2Rhc2hBcnJheTp0aGlzLmNvbmZpZy5kYXNoQXJyYXksZGFzaE9mZnNldDp0aGlzLmNvbmZpZy5kYXNoT2Zmc2V0LGRhc2hSYXRpbzp0aGlzLmNvbmZpZy5kYXNoUmF0aW8sdGhpY2tuZXNzOnRoaXMuY29uZmlnLnRoaWNrbmVzc30pO3ZhciBkPVtdLHA9W107cy5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10WzBdLG49dFsxXTtkLnB1c2goW2VbMF0sZVsxXV0pLHAucHVzaChuKX0pKSxoLnNldEluZGV4KHUucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybltdLmNvbmNhdChadSgpKHQpLFp1KCkoZSkpfSksW10pKSxoLnNldEF0dHJpYnV0ZShcImFfcG9zXCIsRmxvYXQzMkFycmF5LmZyb20oYy5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuW10uY29uY2F0KFp1KCkodCksWnUoKShlKSl9KSxbXSkpLHthcnJheVN0cmlkZTo4LHN0ZXBNb2RlOlwidmVydGV4XCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjAsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXQyXCJ9XX0pO3ZhciBnPW5ldyBBcnJheShsKS5maWxsKHZvaWQgMCkubWFwKChmdW5jdGlvbigpe3JldHVybiBadSgpKHQuY29uZmlnLmNvbG9yKX0pKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuW10uY29uY2F0KFp1KCkodCksWnUoKShlKSl9KSxbXSk7aC5zZXRBdHRyaWJ1dGUoXCJhX2NvbG9yXCIsRmxvYXQzMkFycmF5LmZyb20oZykse2FycmF5U3RyaWRlOjE2LHN0ZXBNb2RlOlwidmVydGV4XCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjEsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXQ0XCJ9XX0pLGguc2V0QXR0cmlidXRlKFwiYV9saW5lX21pdGVyXCIsRmxvYXQzMkFycmF5LmZyb20ocCkse2FycmF5U3RyaWRlOjQsc3RlcE1vZGU6XCJ2ZXJ0ZXhcIixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MixvZmZzZXQ6MCxmb3JtYXQ6XCJmbG9hdFwifV19KSxoLnNldEF0dHJpYnV0ZShcImFfbGluZV9ub3JtYWxcIixGbG9hdDMyQXJyYXkuZnJvbShkLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm5bXS5jb25jYXQoWnUoKSh0KSxadSgpKGUpKX0pLFtdKSkse2FycmF5U3RyaWRlOjgsc3RlcE1vZGU6XCJ2ZXJ0ZXhcIixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MyxvZmZzZXQ6MCxmb3JtYXQ6XCJmbG9hdDJcIn1dfSksaC5zZXRBdHRyaWJ1dGUoXCJhX2NvdW50ZXJzXCIsRmxvYXQzMkFycmF5LmZyb20oZikse2FycmF5U3RyaWRlOjQsc3RlcE1vZGU6XCJ2ZXJ0ZXhcIixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246NCxvZmZzZXQ6MCxmb3JtYXQ6XCJmbG9hdFwifV19KX19XSksbn0oQ3UpLCRmPVFhKCkoSmYucHJvdG90eXBlLFwibWF0ZXJpYWxTeXN0ZW1cIixbWWYsSGZdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksdGw9UWEoKShKZi5wcm90b3R5cGUsXCJnZW9tZXRyeVN5c3RlbVwiLFtxZixLZl0se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxlbD1RYSgpKEpmLnByb3RvdHlwZSxcInNoYWRlck1vZHVsZVNlcnZpY2VcIixbWmZdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksUWY9SmYpKXx8UWYpO2Z1bmN0aW9uIGdsKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiB2bCh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPW9mKCkodCk7aWYoZSl7dmFyIGk9b2YoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbmYoKSh0aGlzLG4pfX12YXIgeWwsbWwsYmwseGwsd2wsU2wsRWwsX2wsT2wsa2w9W1wiY2lyY2xlXCIsXCJ0cmlhbmdsZVwiLFwic3F1YXJlXCIsXCJwZW50YWdvblwiLFwiaGV4YWdvblwiLFwib2N0b2dvblwiLFwiaGV4YWdyYW1cIixcInJob21idXNcIixcInZlc2ljYVwiXSxNbD0ocmw9T2JqZWN0KCRhLmluamVjdGFibGUpKCksaWw9T2JqZWN0KCRhLmluamVjdCkoSmEuSURFTlRJRklFUi5TeXN0ZW1zKSxvbD1PYmplY3QoJGEubmFtZWQpKEphLklERU5USUZJRVIuTWF0ZXJpYWxTeXN0ZW0pLGFsPU9iamVjdCgkYS5pbmplY3QpKEphLklERU5USUZJRVIuU3lzdGVtcyksc2w9T2JqZWN0KCRhLm5hbWVkKShKYS5JREVOVElGSUVSLkdlb21ldHJ5U3lzdGVtKSx1bD1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLlNoYWRlck1vZHVsZVNlcnZpY2UpLHJsKChmbD1mdW5jdGlvbih0KXt0ZigpKG4sdCk7dmFyIGU9dmwobik7ZnVuY3Rpb24gbigpe3ZhciB0O0hhKCkodGhpcyxuKTtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxpPW5ldyBBcnJheShyKSxvPTA7bzxyO28rKylpW29dPWFyZ3VtZW50c1tvXTtyZXR1cm4gdD1lLmNhbGwuYXBwbHkoZSxbdGhpc10uY29uY2F0KGkpKSxYYSgpKHQsXCJtYXRlcmlhbFN5c3RlbVwiLGxsLE9mKCkodCkpLFhhKCkodCxcImdlb21ldHJ5U3lzdGVtXCIsaGwsT2YoKSh0KSksWGEoKSh0LFwic2hhZGVyTW9kdWxlU2VydmljZVwiLGRsLE9mKCkodCkpLHR9cmV0dXJuIEthKCkobixbe2tleTpcIm9uQXR0cmlidXRlQ2hhbmdlZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZSxuPXQuZGF0YSxyPXRoaXMuZ2V0TWVzaENvbXBvbmVudCgpO3ImJnIubWF0ZXJpYWwmJihcInN0cm9rZVdpZHRoXCI9PT1lP3IubWF0ZXJpYWwuc2V0VW5pZm9ybShcInVfc3Ryb2tlX3dpZHRoXCIsbik6XCJzdHJva2VDb2xvclwiPT09ZT9yLm1hdGVyaWFsLnNldFVuaWZvcm0oXCJ1X3N0cm9rZV9jb2xvclwiLG4pOlwic3Ryb2tlT3BhY2l0eVwiPT09ZT9yLm1hdGVyaWFsLnNldFVuaWZvcm0oXCJ1X3N0cm9rZV9vcGFjaXR5XCIsbik6XCJvcGFjaXR5XCI9PT1lP3IubWF0ZXJpYWwuc2V0VW5pZm9ybShcInVfb3BhY2l0eVwiLG4pOlwiYmx1clwiPT09ZSYmci5tYXRlcmlhbC5zZXRVbmlmb3JtKFwidV9ibHVyXCIsbikpfX0se2tleTpcIm9uRW50aXR5Q3JlYXRlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zaGFkZXJNb2R1bGVTZXJ2aWNlLnJlZ2lzdGVyTW9kdWxlKFwiZ3JpZFwiLHt2czonYXR0cmlidXRlIHZlYzIgcG9zaXRpb247XFxuYXR0cmlidXRlIHZlYzQgY29sb3I7XFxuYXR0cmlidXRlIGZsb2F0IHNoYXBlO1xcbmF0dHJpYnV0ZSB2ZWMyIG9mZnNldDtcXG5hdHRyaWJ1dGUgZmxvYXQgc2l6ZTtcXG5cXG51bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDtcXG51bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4O1xcblxcbnVuaWZvcm0gZmxvYXQgdV9zdHJva2Vfd2lkdGggOiAwLjAxO1xcbnVuaWZvcm0gZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87XFxudW5pZm9ybSB2ZWMyIHVfdmlld3BvcnQ7XFxuXFxudmFyeWluZyB2ZWM0IHZfY29sb3I7XFxudmFyeWluZyB2ZWM0IHZfZGF0YTtcXG52YXJ5aW5nIGZsb2F0IHZfcmFkaXVzO1xcblxcbiNwcmFnbWEgaW5jbHVkZSBcInBpY2tpbmdcIlxcblxcbnZvaWQgbWFpbigpIHtcXG4gIHZfY29sb3IgPSBjb2xvcjtcXG4gIHZfcmFkaXVzID0gc2l6ZTtcXG5cXG4gIGxvd3AgZmxvYXQgYW50aWFsaWFzYmx1ciA9IDEuMCAvIHVfZGV2aWNlX3BpeGVsX3JhdGlvICogKHNpemUgKyB1X3N0cm9rZV93aWR0aCk7XFxuXFxuICAvLyBjb25zdHJ1Y3QgcG9pbnQgY29vcmRzXFxuICB2X2RhdGEgPSB2ZWM0KHBvc2l0aW9uLCBhbnRpYWxpYXNibHVyLCBzaGFwZSk7XFxuXFxuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXhcXG4gICAgKiB2ZWM0KHBvc2l0aW9uICogc2l6ZSArIG9mZnNldCwgMC4wLCAxLjApO1xcblxcbiAgc2V0UGlja2luZ0NvbG9yKGFfUGlja2luZ0NvbG9yKTtcXG59JyxmczpcInVuaWZvcm0gZmxvYXQgdV9ibHVyIDogMC4wNTtcXG51bmlmb3JtIGZsb2F0IHVfb3BhY2l0eSA6IDAuNztcXG51bmlmb3JtIGZsb2F0IHVfc3Ryb2tlX3dpZHRoIDogMC4wMTtcXG51bmlmb3JtIHZlYzQgdV9zdHJva2VfY29sb3IgOiBbMCwgMCwgMCwgMF07XFxudW5pZm9ybSBmbG9hdCB1X3N0cm9rZV9vcGFjaXR5IDogMTtcXG5cXG52YXJ5aW5nIHZlYzQgdl9jb2xvcjtcXG52YXJ5aW5nIHZlYzQgdl9kYXRhO1xcbnZhcnlpbmcgZmxvYXQgdl9yYWRpdXM7XFxuXFxuI3ByYWdtYSBpbmNsdWRlIFxcXCJzZGYyZFxcXCJcXG4jcHJhZ21hIGluY2x1ZGUgXFxcInBpY2tpbmdcXFwiXFxuXFxudm9pZCBtYWluKCkge1xcbiAgaW50IHNoYXBlID0gaW50KGZsb29yKHZfZGF0YS53ICsgMC41KSk7XFxuXFxuICBmbG9hdCBhbnRpYWxpYXNibHVyID0gdl9kYXRhLno7XFxuICBmbG9hdCBhbnRpYWxpYXNlZF9ibHVyID0gLW1heCh1X2JsdXIsIGFudGlhbGlhc2JsdXIpO1xcbiAgZmxvYXQgciA9IHZfcmFkaXVzIC8gKHZfcmFkaXVzICsgdV9zdHJva2Vfd2lkdGgpO1xcblxcbiAgZmxvYXQgb3V0ZXJfZGY7XFxuICBmbG9hdCBpbm5lcl9kZjtcXG4gIC8vICdjaXJjbGUnLCAndHJpYW5nbGUnLCAnc3F1YXJlJywgJ3BlbnRhZ29uJywgJ2hleGFnb24nLCAnb2N0b2dvbicsICdoZXhhZ3JhbScsICdyaG9tYnVzJywgJ3Zlc2ljYSdcXG4gIC8vIGlmIChzaGFwZSA9PSAwKSB7XFxuICAgIG91dGVyX2RmID0gc2RDaXJjbGUodl9kYXRhLnh5LCAxLjApO1xcbiAgICBpbm5lcl9kZiA9IHNkQ2lyY2xlKHZfZGF0YS54eSwgcik7XFxuICAvLyB9IGVsc2UgaWYgKHNoYXBlID09IDEpIHtcXG4gIC8vICAgb3V0ZXJfZGYgPSBzZEVxdWlsYXRlcmFsVHJpYW5nbGUoMS4xICogdl9kYXRhLnh5KTtcXG4gIC8vICAgaW5uZXJfZGYgPSBzZEVxdWlsYXRlcmFsVHJpYW5nbGUoMS4xIC8gciAqIHZfZGF0YS54eSk7XFxuICAvLyB9IGVsc2UgaWYgKHNoYXBlID09IDIpIHtcXG4gIC8vICAgb3V0ZXJfZGYgPSBzZEJveCh2X2RhdGEueHksIHZlYzIoMS4pKTtcXG4gIC8vICAgaW5uZXJfZGYgPSBzZEJveCh2X2RhdGEueHksIHZlYzIocikpO1xcbiAgLy8gfSBlbHNlIGlmIChzaGFwZSA9PSAzKSB7XFxuICAvLyAgIG91dGVyX2RmID0gc2RQZW50YWdvbih2X2RhdGEueHksIDAuOCk7XFxuICAvLyAgIGlubmVyX2RmID0gc2RQZW50YWdvbih2X2RhdGEueHksIHIgKiAwLjgpO1xcbiAgLy8gfSBlbHNlIGlmIChzaGFwZSA9PSA0KSB7XFxuICAvLyAgIG91dGVyX2RmID0gc2RIZXhhZ29uKHZfZGF0YS54eSwgMC44KTtcXG4gIC8vICAgaW5uZXJfZGYgPSBzZEhleGFnb24odl9kYXRhLnh5LCByICogMC44KTtcXG4gIC8vIH0gZWxzZSBpZiAoc2hhcGUgPT0gNSkge1xcbiAgLy8gICBvdXRlcl9kZiA9IHNkT2N0b2dvbih2X2RhdGEueHksIDEuMCk7XFxuICAvLyAgIGlubmVyX2RmID0gc2RPY3RvZ29uKHZfZGF0YS54eSwgcik7XFxuICAvLyB9IGVsc2UgaWYgKHNoYXBlID09IDYpIHtcXG4gIC8vICAgb3V0ZXJfZGYgPSBzZEhleGFncmFtKHZfZGF0YS54eSwgMC41Mik7XFxuICAvLyAgIGlubmVyX2RmID0gc2RIZXhhZ3JhbSh2X2RhdGEueHksIHIgKiAwLjUyKTtcXG4gIC8vIH0gZWxzZSBpZiAoc2hhcGUgPT0gNykge1xcbiAgLy8gICBvdXRlcl9kZiA9IHNkUmhvbWJ1cyh2X2RhdGEueHksIHZlYzIoMS4wKSk7XFxuICAvLyAgIGlubmVyX2RmID0gc2RSaG9tYnVzKHZfZGF0YS54eSwgdmVjMihyKSk7XFxuICAvLyB9IGVsc2UgaWYgKHNoYXBlID09IDgpIHtcXG4gIC8vICAgb3V0ZXJfZGYgPSBzZFZlc2ljYSh2X2RhdGEueHksIDEuMSwgMC44KTtcXG4gIC8vICAgaW5uZXJfZGYgPSBzZFZlc2ljYSh2X2RhdGEueHksIHIgKiAxLjEsIHIgKiAwLjgpO1xcbiAgLy8gfVxcblxcbiAgZmxvYXQgb3BhY2l0eV90ID0gc21vb3Roc3RlcCgwLjAsIGFudGlhbGlhc2VkX2JsdXIsIG91dGVyX2RmKTtcXG5cXG4gIGZsb2F0IGNvbG9yX3QgPSB1X3N0cm9rZV93aWR0aCA8IDAuMDEgPyAwLjAgOiBzbW9vdGhzdGVwKFxcbiAgICBhbnRpYWxpYXNlZF9ibHVyLFxcbiAgICAwLjAsXFxuICAgIGlubmVyX2RmXFxuICApO1xcbiAgdmVjNCBzdHJva2VDb2xvciA9IHVfc3Ryb2tlX2NvbG9yID09IHZlYzQoMCkgPyB2X2NvbG9yIDogdV9zdHJva2VfY29sb3I7XFxuXFxuICBnbF9GcmFnQ29sb3IgPSBtaXgodmVjNCh2X2NvbG9yLnJnYiwgdl9jb2xvci5hICogdV9vcGFjaXR5KSwgc3Ryb2tlQ29sb3IgKiB1X3N0cm9rZV9vcGFjaXR5LCBjb2xvcl90KTtcXG4gIGdsX0ZyYWdDb2xvci5hID0gZ2xfRnJhZ0NvbG9yLmEgKiBvcGFjaXR5X3Q7XFxuXFxuICBnbF9GcmFnQ29sb3IgPSBmaWx0ZXJDb2xvcihnbF9GcmFnQ29sb3IpO1xcbn1cIn0pO3ZhciB0PXRoaXMuc2hhZGVyTW9kdWxlU2VydmljZS5nZXRNb2R1bGUoXCJncmlkXCIpLGU9dC52cyxuPXQuZnMscj10LnVuaWZvcm1zLGk9dGhpcy5tYXRlcmlhbFN5c3RlbS5jcmVhdGVTaGFkZXJNYXRlcmlhbCh7dmVydGV4U2hhZGVyOmUsZnJhZ21lbnRTaGFkZXI6bixjdWxsOntlbmFibGU6ITF9LGRlcHRoOntlbmFibGU6ITF9LGJsZW5kOntlbmFibGU6ITAsZnVuYzp7c3JjUkdCOkphLmdsLlNSQ19BTFBIQSxkc3RSR0I6SmEuZ2wuT05FX01JTlVTX1NSQ19BTFBIQSxzcmNBbHBoYToxLGRzdEFscGhhOjF9fX0pO2kuc2V0VW5pZm9ybShmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9nbChPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe0JzKCkodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOmdsKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fSh7dV9kZXZpY2VfcGl4ZWxfcmF0aW86d2luZG93LmRldmljZVBpeGVsUmF0aW99LHIpKTt2YXIgbz10aGlzLmJ1aWxkQXR0cmlidXRlcygpLGE9dGhpcy5nZW9tZXRyeVN5c3RlbS5jcmVhdGVJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSh7bWF4SW5zdGFuY2VkQ291bnQ6by5pbnN0YW5jZWRPZmZzZXRzLmxlbmd0aC8yLHZlcnRleENvdW50OjZ9KTthLnNldEluZGV4KFswLDIsMSwwLDMsMl0pLGEuc2V0QXR0cmlidXRlKFwicG9zaXRpb25cIixGbG9hdDMyQXJyYXkuZnJvbShvLnBvc2l0aW9ucykse2FycmF5U3RyaWRlOjgsc3RlcE1vZGU6XCJ2ZXJ0ZXhcIixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MCxvZmZzZXQ6MCxmb3JtYXQ6XCJmbG9hdDJcIn1dfSksYS5zZXRBdHRyaWJ1dGUoXCJvZmZzZXRcIixGbG9hdDMyQXJyYXkuZnJvbShvLmluc3RhbmNlZE9mZnNldHMpLHthcnJheVN0cmlkZTo4LHN0ZXBNb2RlOlwiaW5zdGFuY2VcIixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246MSxvZmZzZXQ6MCxmb3JtYXQ6XCJmbG9hdDJcIn1dfSksYS5zZXRBdHRyaWJ1dGUoXCJjb2xvclwiLEZsb2F0MzJBcnJheS5mcm9tKG8uaW5zdGFuY2VkQ29sb3JzKSx7YXJyYXlTdHJpZGU6MTYsc3RlcE1vZGU6XCJpbnN0YW5jZVwiLGF0dHJpYnV0ZXM6W3tzaGFkZXJMb2NhdGlvbjoyLG9mZnNldDowLGZvcm1hdDpcImZsb2F0NFwifV19KSxhLnNldEF0dHJpYnV0ZShcInNpemVcIixGbG9hdDMyQXJyYXkuZnJvbShvLmluc3RhbmNlZFNpemVzKSx7YXJyYXlTdHJpZGU6NCxzdGVwTW9kZTpcImluc3RhbmNlXCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjMsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXRcIn1dfSksYS5zZXRBdHRyaWJ1dGUoXCJzaGFwZVwiLEZsb2F0MzJBcnJheS5mcm9tKG8uaW5zdGFuY2VkU2hhcGVzKSx7YXJyYXlTdHJpZGU6NCxzdGVwTW9kZTpcImluc3RhbmNlXCIsYXR0cmlidXRlczpbe3NoYWRlckxvY2F0aW9uOjQsb2Zmc2V0OjAsZm9ybWF0OlwiZmxvYXRcIn1dfSksYS5zZXRBdHRyaWJ1dGUoXCJhX1BpY2tpbmdDb2xvclwiLEZsb2F0MzJBcnJheS5mcm9tKG8uaW5zdGFuY2VkUGlja2luZ0NvbG9ycykse2FycmF5U3RyaWRlOjEyLHN0ZXBNb2RlOlwiaW5zdGFuY2VcIixhdHRyaWJ1dGVzOlt7c2hhZGVyTG9jYXRpb246NixvZmZzZXQ6MCxmb3JtYXQ6XCJmbG9hdDNcIn1dfSksdGhpcy5zZXRNYXRlcmlhbChpKSx0aGlzLnNldEdlb21ldHJ5KGEpfX0se2tleTpcImJ1aWxkQXR0cmlidXRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbyxhLHM7KHI9ZS5pbnN0YW5jZWRQaWNraW5nQ29sb3JzKS5wdXNoLmFwcGx5KHIsWnUoKShbKHM9dC5pZHx8bikrMSYyNTUscysxPj44JjI1NSxzKzE+Pjg+PjgmMjU1XSkpLGUuaW5zdGFuY2VkU2hhcGVzLnB1c2goa2wuaW5kZXhPZih0LnNoYXBlfHxcImNpcmNsZVwiKSksKGk9ZS5pbnN0YW5jZWRDb2xvcnMpLnB1c2guYXBwbHkoaSxadSgpKHQuY29sb3J8fFsxLDAsMCwxXSkpLChvPWUuaW5zdGFuY2VkT2Zmc2V0cykucHVzaC5hcHBseShvLFp1KCkodC5wb3NpdGlvbnx8WzAsMF0pKSwoYT1lLmluc3RhbmNlZFNpemVzKS5wdXNoLmFwcGx5KGEsWnUoKSh0LnNpemV8fFsuMiwuMl0pKX19LHtrZXk6XCJidWlsZEF0dHJpYnV0ZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT17cG9zaXRpb25zOlsxLDEsMSwtMSwtMSwtMSwtMSwxXSxpbnN0YW5jZWRPZmZzZXRzOltdLGluc3RhbmNlZENvbG9yczpbXSxpbnN0YW5jZWRTaXplczpbXSxpbnN0YW5jZWRTaGFwZXM6W10saW5zdGFuY2VkUGlja2luZ0NvbG9yczpbXX07cmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5jb25maWcpP3RoaXMuY29uZmlnLmZvckVhY2goKGZ1bmN0aW9uKG4scil7dC5idWlsZEF0dHJpYnV0ZShuLGUscil9KSk6dGhpcy5idWlsZEF0dHJpYnV0ZSh0aGlzLmNvbmZpZyxlLDApLGV9fV0pLG59KEN1KSxsbD1RYSgpKGZsLnByb3RvdHlwZSxcIm1hdGVyaWFsU3lzdGVtXCIsW2lsLG9sXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLGhsPVFhKCkoZmwucHJvdG90eXBlLFwiZ2VvbWV0cnlTeXN0ZW1cIixbYWwsc2xdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksZGw9UWEoKShmbC5wcm90b3R5cGUsXCJzaGFkZXJNb2R1bGVTZXJ2aWNlXCIsW3VsXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLGNsPWZsKSl8fGNsKTtmdW5jdGlvbiBBbCh0LGUpe3ZhciBuO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PXRbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheSh0KXx8KG49ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpcmV0dXJuIFRsKHQsZSk7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO1wiT2JqZWN0XCI9PT1uJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKFwiTWFwXCI9PT1ufHxcIlNldFwiPT09bilyZXR1cm4gQXJyYXkuZnJvbSh0KTtpZihcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIFRsKHQsZSl9KHQpKXx8ZSYmdCYmXCJudW1iZXJcIj09dHlwZW9mIHQubGVuZ3RoKXtuJiYodD1uKTt2YXIgcj0wLGk9ZnVuY3Rpb24oKXt9O3JldHVybntzOmksbjpmdW5jdGlvbigpe3JldHVybiByPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtyKytdfX0sZTpmdW5jdGlvbih0KXt0aHJvdyB0fSxmOml9fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX12YXIgbyxhPSEwLHM9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPXRbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7cz0hMCxvPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IG99fX19ZnVuY3Rpb24gVGwodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn12YXIgQ2wsSWwsUGwsamwsRGwsTmwsUmwsTGwsQmwsR2w9KHlsPU9iamVjdCgkYS5pbmplY3RhYmxlKSgpLG1sPU9iamVjdCgkYS5pbmplY3QpKEphLklERU5USUZJRVIuUmVuZGVyRW5naW5lKSxibD1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLlNoYWRlck1vZHVsZVNlcnZpY2UpLHhsPU9iamVjdCgkYS5pbmplY3QpKEphLklERU5USUZJRVIuQ29uZmlnU2VydmljZSkseWwoKFNsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe0hhKCkodGhpcyx0KSx0aGlzLmNvbnRhaW5lcj12b2lkIDAsWGEoKSh0aGlzLFwiZW5naW5lXCIsRWwsdGhpcyksWGEoKSh0aGlzLFwic2hhZGVyTW9kdWxlXCIsX2wsdGhpcyksWGEoKSh0aGlzLFwiY29uZmlnU2VydmljZVwiLE9sLHRoaXMpLHRoaXMuaW5pdGVkPSExLHRoaXMucmVuZGVyaW5nPSExLHRoaXMucGVuZGluZ3M9W10sdGhpcy52aWV3cz1bXSx0aGlzLnNpemU9dm9pZCAwfXZhciBlLG47cmV0dXJuIEthKCkodCxbe2tleTpcImluaXRcIix2YWx1ZToobj1ScygpKERzLmEubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBlLG4scixpLG87cmV0dXJuIERzLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYodGhpcy5zaGFkZXJNb2R1bGUucmVnaXN0ZXJCdWlsdGluTW9kdWxlcygpLHRoaXMuc2hhZGVyTW9kdWxlLnJlZ2lzdGVyTW9kdWxlKFwidXYudmVydC5kZWNsYXJhdGlvblwiLHt2czpcIiNpZmRlZiBVU0VfVVZcXG4gIGF0dHJpYnV0ZSB2ZWMyIHV2O1xcblxcdCNpZmRlZiBVVlNfVkVSVEVYX09OTFlcXG4gICAgdmVjMiB2VXY7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2YXJ5aW5nIHZlYzIgdlV2O1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcXG4jZW5kaWZcIn0pLHRoaXMuc2hhZGVyTW9kdWxlLnJlZ2lzdGVyTW9kdWxlKFwidXYudmVydC5tYWluXCIse3ZzOlwiI2lmZGVmIFVTRV9VVlxcbiAgdlV2ID0gKHV2VHJhbnNmb3JtICogdmVjMyh1diwgMSkpLnh5O1xcbiNlbmRpZlwifSksdGhpcy5zaGFkZXJNb2R1bGUucmVnaXN0ZXJNb2R1bGUoXCJ1di5mcmFnLmRlY2xhcmF0aW9uXCIse2ZzOlwiI2lmIChkZWZpbmVkKCBVU0VfVVYgKSAmJiAhIGRlZmluZWQoIFVWU19WRVJURVhfT05MWSApKVxcbiAgdmFyeWluZyB2ZWMyIHZVdjtcXG4jZW5kaWZcIn0pLHRoaXMuc2hhZGVyTW9kdWxlLnJlZ2lzdGVyTW9kdWxlKFwibWFwLmZyYWcuZGVjbGFyYXRpb25cIix7ZnM6XCIjaWZkZWYgVVNFX01BUFxcbiAgdW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xcbiNlbmRpZlwifSksdGhpcy5zaGFkZXJNb2R1bGUucmVnaXN0ZXJNb2R1bGUoXCJtYXAuZnJhZy5tYWluXCIse2ZzOlwiI2lmZGVmIFVTRV9NQVBcXG4gIHZlYzQgdGV4ZWxDb2xvciA9IHRleHR1cmUyRChtYXAsIHZVdik7XFxuICAvLyB0ZXhlbENvbG9yID0gbWFwVGV4ZWxUb0xpbmVhcih0ZXhlbENvbG9yKTtcXG4gIGRpZmZ1c2VDb2xvciAqPSB0ZXhlbENvbG9yO1xcbiNlbmRpZlwifSksZT10aGlzLmNvbnRhaW5lci5nZXRBbGwoSmEuSURFTlRJRklFUi5TeXN0ZW1zKSwhKG49dGhpcy5jb25maWdTZXJ2aWNlLmdldCgpKS5jYW52YXMpe3QubmV4dD0zMDticmVha31yZXR1cm4gdC5uZXh0PTExLHRoaXMuZW5naW5lLmluaXQoe2NhbnZhczpuLmNhbnZhcyxzd2FwQ2hhaW5Gb3JtYXQ6VnMuVGV4dHVyZUZvcm1hdC5CR1JBOFVub3JtLGFudGlhbGlhc2luZzohMX0pO2Nhc2UgMTE6cj1BbChlKSx0LnByZXY9MTIsci5zKCk7Y2FzZSAxNDppZigoaT1yLm4oKSkuZG9uZSl7dC5uZXh0PTIxO2JyZWFrfWlmKCEobz1pLnZhbHVlKS5pbml0aWFsaXplKXt0Lm5leHQ9MTk7YnJlYWt9cmV0dXJuIHQubmV4dD0xOSxvLmluaXRpYWxpemUoKTtjYXNlIDE5OnQubmV4dD0xNDticmVhaztjYXNlIDIxOnQubmV4dD0yNjticmVhaztjYXNlIDIzOnQucHJldj0yMyx0LnQwPXQuY2F0Y2goMTIpLHIuZSh0LnQwKTtjYXNlIDI2OnJldHVybiB0LnByZXY9MjYsci5mKCksdC5maW5pc2goMjYpO2Nhc2UgMjk6dGhpcy5pbml0ZWQ9ITA7Y2FzZSAzMDpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzLFtbMTIsMjMsMjYsMjldXSl9KSkpLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6XCJyZW5kZXJcIix2YWx1ZTooZT1ScygpKERzLmEubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBlLG4scixpLG8sYSxzLHU9YXJndW1lbnRzO3JldHVybiBEcy5hLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmlmKHRoaXMuaW5pdGVkJiYhdGhpcy5yZW5kZXJpbmcpe3QubmV4dD0yO2JyZWFrfXJldHVybiB0LmFicnVwdChcInJldHVyblwiKTtjYXNlIDI6Zm9yKHRoaXMucGVuZGluZ3MubGVuZ3RoJiZ0aGlzLnBlbmRpbmdzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QoKX0pKSx0aGlzLnJlbmRlcmluZz0hMCx0aGlzLmVuZ2luZS5iZWdpbkZyYW1lKCksZT10aGlzLmNvbnRhaW5lci5nZXRBbGwoSmEuSURFTlRJRklFUi5TeXN0ZW1zKSxuPXUubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGk9MDtpPG47aSsrKXJbaV09dVtpXTtvPUFsKGUpLHQucHJldj04LG8ucygpO2Nhc2UgMTA6aWYoKGE9by5uKCkpLmRvbmUpe3QubmV4dD0xNzticmVha31pZighKHM9YS52YWx1ZSkuZXhlY3V0ZSl7dC5uZXh0PTE1O2JyZWFrfXJldHVybiB0Lm5leHQ9MTUscy5leGVjdXRlKHIpO2Nhc2UgMTU6dC5uZXh0PTEwO2JyZWFrO2Nhc2UgMTc6dC5uZXh0PTIyO2JyZWFrO2Nhc2UgMTk6dC5wcmV2PTE5LHQudDA9dC5jYXRjaCg4KSxvLmUodC50MCk7Y2FzZSAyMjpyZXR1cm4gdC5wcmV2PTIyLG8uZigpLHQuZmluaXNoKDIyKTtjYXNlIDI1OnRoaXMuZW5naW5lLmVuZEZyYW1lKCksdGhpcy5yZW5kZXJpbmc9ITE7Y2FzZSAyNzpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzLFtbOCwxOSwyMiwyNV1dKX0pKSksZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleTpcImNsZWFyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5pbml0ZWQ/dGhpcy5lbmdpbmUuY2xlYXIodCk6dGhpcy5wZW5kaW5ncy51bnNoaWZ0KChmdW5jdGlvbigpe2UuZW5naW5lLmNsZWFyKHQpLGUucGVuZGluZ3Muc2hpZnQoKX0pKSx0aGlzfX0se2tleTpcInNldFNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LndpZHRoLG49dC5oZWlnaHQscj10aGlzLmVuZ2luZS5nZXRDYW52YXMoKTtyZXR1cm4gdGhpcy5zaXplPXt3aWR0aDplLGhlaWdodDpufSxyLndpZHRoPWUsci5oZWlnaHQ9bix0aGlzfX0se2tleTpcImdldFNpemVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemV9fV0pLHR9KCksRWw9UWEoKShTbC5wcm90b3R5cGUsXCJlbmdpbmVcIixbbWxdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksX2w9UWEoKShTbC5wcm90b3R5cGUsXCJzaGFkZXJNb2R1bGVcIixbYmxdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksT2w9UWEoKShTbC5wcm90b3R5cGUsXCJjb25maWdTZXJ2aWNlXCIsW3hsXSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsaW5pdGlhbGl6ZXI6bnVsbH0pLHdsPVNsKSl8fHdsKSxGbD1PYmplY3QoJGEuaW5qZWN0YWJsZSkoKShDbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtIYSgpKHRoaXMsdCksdGhpcy5lbnRpdGllcz1bXX1yZXR1cm4gS2EoKSh0LFt7a2V5OlwiZ2V0RW50aXRpZXNcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVudGl0aWVzfX0se2tleTpcImFkZFJlbmRlcmFibGVcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGRFbnRpdHkodC5nZXRFbnRpdHkoKSksdGhpc319LHtrZXk6XCJyZW1vdmVSZW5kZXJhYmxlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVtb3ZlRW50aXR5KHQuZ2V0RW50aXR5KCkpLHRoaXN9fSx7a2V5OlwiYWRkTGlnaHRcIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6XCJhZGRFbnRpdHlcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4tMT09PXRoaXMuZW50aXRpZXMuaW5kZXhPZih0KSYmdGhpcy5lbnRpdGllcy5wdXNoKHQpLHRoaXN9fSx7a2V5OlwicmVtb3ZlRW50aXR5XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbnRpdGllcy5pbmRleE9mKHQpO3JldHVybiB0aGlzLmVudGl0aWVzLnNwbGljZShlLDEpLHRoaXN9fV0pLHR9KCkpfHxDbCxVbD1PYmplY3QoJGEuaW5qZWN0YWJsZSkoKShJbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtIYSgpKHRoaXMsdCksdGhpcy5jYWNoZT17fX1yZXR1cm4gS2EoKSh0LFt7a2V5OlwiZ2V0XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2FjaGVbdF19fSx7a2V5Olwic2V0XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLmNhY2hlW3RdPWV9fV0pLHR9KCkpfHxJbDtmdW5jdGlvbiB6bCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gVmwodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/emwoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtCcygpKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTp6bChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH12YXIgV2wsWGwsWWwsSGwscWwsS2wsWmwsUWwsSmwsJGwsdGgsZWg9KFBsPU9iamVjdCgkYS5pbmplY3RhYmxlKSgpLGpsPU9iamVjdCgkYS5pbmplY3QpKFVsKSxEbD1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLlJlbmRlckVuZ2luZSksUGwoKFJsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe0hhKCkodGhpcyx0KSxYYSgpKHRoaXMsXCJ0ZXh0dXJlQ2FjaGVcIixMbCx0aGlzKSxYYSgpKHRoaXMsXCJlbmdpbmVcIixCbCx0aGlzKSx0aGlzLmNvbmZpZz12b2lkIDAsdGhpcy5sb2FkZWQ9ITEsdGhpcy50ZXh0dXJlPXZvaWQgMH12YXIgZTtyZXR1cm4gS2EoKSh0LFt7a2V5Olwic2V0Q29uZmlnXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5jb25maWc9dH19LHtrZXk6XCJpc0xvYWRlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9hZGVkfX0se2tleTpcImxvYWRcIix2YWx1ZTooZT1ScygpKERzLmEubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBlPXRoaXM7cmV0dXJuIERzLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYoIXRoaXMuY29uZmlnLnVybCl7dC5uZXh0PTQ7YnJlYWt9cmV0dXJuIHQuYWJydXB0KFwicmV0dXJuXCIsbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7dmFyIHI9ZS50ZXh0dXJlQ2FjaGUuZ2V0KGUuY29uZmlnLnVybCk7aWYocil0KHIpO2Vsc2V7dmFyIGk9bmV3IEltYWdlO2kuY3Jvc3NPcmlnaW49XCJBbm9ueW1vdXNcIixpLnNyYz1lLmNvbmZpZy51cmwsaS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgbj1lLmVuZ2luZS5jcmVhdGVUZXh0dXJlMkQoVmwoVmwoe30sZS5jb25maWcpLHt9LHtkYXRhOmksd2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHQsZmxpcFk6ITB9KSk7ZS50ZXh0dXJlQ2FjaGUuc2V0KGUuY29uZmlnLnVybCxuKSxlLnRleHR1cmU9bixlLmxvYWRlZD0hMCx0KG4pfSxpLm9uZXJyb3I9ZnVuY3Rpb24oKXtuKCl9fX0pKSk7Y2FzZSA0OnJldHVybiB0aGlzLmxvYWRlZD0hMCx0aGlzLnRleHR1cmU9dGhpcy5lbmdpbmUuY3JlYXRlVGV4dHVyZTJEKHRoaXMuY29uZmlnKSx0LmFicnVwdChcInJldHVyblwiLHRoaXMudGV4dHVyZSk7Y2FzZSA3OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKSxmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfV0pLHR9KCksTGw9UWEoKShSbC5wcm90b3R5cGUsXCJ0ZXh0dXJlQ2FjaGVcIixbamxdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksQmw9UWEoKShSbC5wcm90b3R5cGUsXCJlbmdpbmVcIixbRGxdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksTmw9UmwpKXx8TmwpLG5oPShXbD1PYmplY3QoJGEuaW5qZWN0YWJsZSkoKSxYbD1PYmplY3QoJGEuaW5qZWN0KShKYS5JREVOVElGSUVSLlN5c3RlbXMpLFlsPU9iamVjdCgkYS5uYW1lZCkoSmEuSURFTlRJRklFUi5SZW5kZXJlclN5c3RlbSksV2woKHFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe0hhKCkodGhpcyx0KSxYYSgpKHRoaXMsXCJyZW5kZXJlclN5c3RlbVwiLEtsLHRoaXMpLHRoaXMuY2FtZXJhPXZvaWQgMCx0aGlzLnNjZW5lPXZvaWQgMCx0aGlzLnZpZXdwb3J0PXt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9LHRoaXMuY2xlYXJDb2xvcj1bMSwxLDEsMV19cmV0dXJuIEthKCkodCxbe2tleTpcImdldENhbWVyYVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FtZXJhfX0se2tleTpcImdldFNjZW5lXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY2VuZX19LHtrZXk6XCJnZXRWaWV3cG9ydFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlld3BvcnR9fSx7a2V5OlwiZ2V0Q2xlYXJDb2xvclwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xlYXJDb2xvcn19LHtrZXk6XCJzZXRDYW1lcmFcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jYW1lcmE9dCx0aGlzfX0se2tleTpcInNldFNjZW5lXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2NlbmU9dCx0aGlzfX0se2tleTpcInNldFZpZXdwb3J0XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudmlld3BvcnQ9dCx0aGlzfX0se2tleTpcInNldENsZWFyQ29sb3JcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbGVhckNvbG9yPXQsdGhpc319LHtrZXk6XCJwaWNrXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVuZGVyZXJTeXN0ZW0ucGljayh0LHRoaXMpfX1dKSx0fSgpLEtsPVFhKCkocWwucHJvdG90eXBlLFwicmVuZGVyZXJTeXN0ZW1cIixbWGwsWWxdLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxpbml0aWFsaXplcjpudWxsfSksSGw9cWwpKXx8SGwpO2Z1bmN0aW9uIHJoKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBpaCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9yaChPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe0JzKCkodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOnJoKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fXZhciBvaD0oWmw9T2JqZWN0KCRhLmluamVjdGFibGUpKCksUWw9T2JqZWN0KCRhLmluamVjdCkoSmEuSURFTlRJRklFUi5Db25maWdTZXJ2aWNlKSxabCgoJGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7SGEoKSh0aGlzLHQpLFhhKCkodGhpcyxcImNvbmZpZ1NlcnZpY2VcIix0aCx0aGlzKSx0aGlzLmNvbnRhaW5lcj12b2lkIDB9dmFyIGU7cmV0dXJuIEthKCkodCxbe2tleTpcImdldEVuZ2luZVwiLHZhbHVlOihlPVJzKCkoRHMuYS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIGUsbixyLGk7cmV0dXJuIERzLmEud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIGU9dGhpcy5jb250YWluZXIuZ2V0KEphLklERU5USUZJRVIuUmVuZGVyRW5naW5lKSxuPXRoaXMuY29uZmlnU2VydmljZS5nZXQoKSxyPW4uY2FudmFzLGk9bi5lbmdpbmVPcHRpb25zLHQubmV4dD00LGUuaW5pdChpaCh7Y2FudmFzOnJ8fFdzKCksc3dhcENoYWluRm9ybWF0OlZzLlRleHR1cmVGb3JtYXQuQkdSQThVbm9ybSxhbnRpYWxpYXNpbmc6ITF9LGkpKTtjYXNlIDQ6cmV0dXJuIHQuYWJydXB0KFwicmV0dXJuXCIsZSk7Y2FzZSA1OmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKSxmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OlwiZ2V0VHJhbnNmb3JtQ29tcG9uZW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29udGFpbmVyLmdldChKYS5JREVOVElGSUVSLlRyYW5zZm9ybUNvbXBvbmVudE1hbmFnZXIpLmdldENvbXBvbmVudEJ5RW50aXR5KHQpfX0se2tleTpcImdldE1lc2hDb21wb25lbnRcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb250YWluZXIuZ2V0KEphLklERU5USUZJRVIuTWVzaENvbXBvbmVudE1hbmFnZXIpLmdldENvbXBvbmVudEJ5RW50aXR5KHQpfX0se2tleTpcInNldENvbmZpZ1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuY29uZmlnU2VydmljZS5zZXQodCl9fSx7a2V5Olwic2V0Q29udGFpbmVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5jb250YWluZXI9dH19LHtrZXk6XCJnZXRDb250YWluZXJcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcn19LHtrZXk6XCJjcmVhdGVFbnRpdHlcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBPYmplY3QoSmEuY3JlYXRlRW50aXR5KSgpfX0se2tleTpcImNyZWF0ZVNjZW5lXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWluZXIuZ2V0KEZsKX19LHtrZXk6XCJjcmVhdGVDYW1lcmFcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lci5nZXQoSXMpfX0se2tleTpcImNyZWF0ZVZpZXdcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lci5nZXQobmgpfX0se2tleTpcImNyZWF0ZVJlbmRlcmFibGVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXQ/dGhpcy5jb250YWluZXIuZ2V0TmFtZWQoSmEuSURFTlRJRklFUi5SZW5kZXJhYmxlLHQpOnRoaXMuY29udGFpbmVyLmdldChDdSkscj1PYmplY3QoSmEuY3JlYXRlRW50aXR5KSgpO3JldHVybiBuLnNldENvbmZpZyhlfHx7fSksbi5zZXRFbnRpdHkociksbn19LHtrZXk6XCJjcmVhdGVHZW9tZXRyeVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb250YWluZXIuZ2V0TmFtZWQoSmEuSURFTlRJRklFUi5HZW9tZXRyeSx0KSxyPU9iamVjdChKYS5jcmVhdGVFbnRpdHkpKCk7cmV0dXJuIG4uc2V0Q29uZmlnKGV8fHt9KSxuLnNldEVudGl0eShyKSxuLmdldENvbXBvbmVudCgpfX0se2tleTpcImNyZWF0ZU1hdGVyaWFsXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRhaW5lci5nZXROYW1lZChKYS5JREVOVElGSUVSLk1hdGVyaWFsLHQpLHI9T2JqZWN0KEphLmNyZWF0ZUVudGl0eSkoKTtyZXR1cm4gbi5zZXRDb25maWcoZXx8e30pLG4uc2V0RW50aXR5KHIsdCksbi5nZXRDb21wb25lbnQoKX19LHtrZXk6XCJjcmVhdGVUZXh0dXJlMkRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRhaW5lci5nZXQoZWgpO3JldHVybiBlLnNldENvbmZpZyh0KSxlfX0se2tleTpcImNyZWF0ZUJ1ZmZlckdlb21ldHJ5XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29udGFpbmVyLmdldE5hbWVkKEphLklERU5USUZJRVIuU3lzdGVtcyxKYS5JREVOVElGSUVSLkdlb21ldHJ5U3lzdGVtKS5jcmVhdGVCdWZmZXJHZW9tZXRyeSh0KX19LHtrZXk6XCJjcmVhdGVJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbnRhaW5lci5nZXROYW1lZChKYS5JREVOVElGSUVSLlN5c3RlbXMsSmEuSURFTlRJRklFUi5HZW9tZXRyeVN5c3RlbSkuY3JlYXRlSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkodCl9fSx7a2V5OlwiY3JlYXRlU2hhZGVyTWF0ZXJpYWxcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb250YWluZXIuZ2V0TmFtZWQoSmEuSURFTlRJRklFUi5TeXN0ZW1zLEphLklERU5USUZJRVIuTWF0ZXJpYWxTeXN0ZW0pLmNyZWF0ZVNoYWRlck1hdGVyaWFsKHQpfX0se2tleTpcImNyZWF0ZUtlcm5lbFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGFpbmVyLmdldChBdSk7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/ZS5zZXRCdW5kbGUoSlNPTi5wYXJzZSh0KSk6ZS5zZXRCdW5kbGUodCksZS5pbml0KCksZX19LHtrZXk6XCJjcmVhdGVSZW5kZXJlclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250YWluZXIuZ2V0KEdsKTtyZXR1cm4gdC5jb250YWluZXI9dGhpcy5jb250YWluZXIsdC5pbml0KCksdH19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmNvbnRhaW5lci5nZXRBbGwoSmEuSURFTlRJRklFUi5TeXN0ZW1zKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnRlYXJEb3duJiZ0LnRlYXJEb3duKCl9KSksdGhpcy5jb250YWluZXIuZ2V0KEphLklERU5USUZJRVIuUmVuZGVyRW5naW5lKS5kZXN0cm95KCksdGhpcy5jb250YWluZXIuZ2V0KEphLklERU5USUZJRVIuSW50ZXJhY3RvclNlcnZpY2UpLmRlc3Ryb3koKX19XSxbe2tleTpcImNyZWF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LG49T2JqZWN0KEphLmNyZWF0ZVdvcmxkQ29udGFpbmVyKSgpLHI9bmF2aWdhdG9yLmdwdT9aYzpwYztuLmlzQm91bmQoSmEuSURFTlRJRklFUi5SZW5kZXJFbmdpbmUpfHxuLmJpbmQoSmEuSURFTlRJRklFUi5SZW5kZXJFbmdpbmUpLnRvKHIpLmluU2luZ2xldG9uU2NvcGUoKSxuLmJpbmQoR2wpLnRvU2VsZigpLG4uYmluZChBdSkudG9TZWxmKCksbi5iaW5kKEN1KS50b1NlbGYoKSxuLmJpbmQobmgpLnRvU2VsZigpLG4uYmluZChJcykudG9TZWxmKCksbi5iaW5kKEZsKS50b1NlbGYoKSxuLmJpbmQodCkudG9TZWxmKCksbi5iaW5kKFVsKS50b1NlbGYoKSxuLmJpbmQoZWgpLnRvU2VsZigpLG4uYmluZChKYS5JREVOVElGSUVSLkdlb21ldHJ5KS50byh1Zikud2hlblRhcmdldE5hbWVkKFBzLkJPWCksbi5iaW5kKEphLklERU5USUZJRVIuR2VvbWV0cnkpLnRvKEVmKS53aGVuVGFyZ2V0TmFtZWQoUHMuU1BIRVJFKSxuLmJpbmQoSmEuSURFTlRJRklFUi5HZW9tZXRyeSkudG8ocGYpLndoZW5UYXJnZXROYW1lZChQcy5QTEFORSksbi5iaW5kKEphLklERU5USUZJRVIuR2VvbWV0cnkpLnRvKGxmKS53aGVuVGFyZ2V0TmFtZWQoUHMuTUVSR0VEKSxuLmJpbmQoSmEuSURFTlRJRklFUi5NYXRlcmlhbCkudG8oQmYpLndoZW5UYXJnZXROYW1lZChUdS5CQVNJQyksbi5iaW5kKEphLklERU5USUZJRVIuUmVuZGVyYWJsZSkudG8oTWwpLndoZW5UYXJnZXROYW1lZChDdS5QT0lOVCksbi5iaW5kKEphLklERU5USUZJRVIuUmVuZGVyYWJsZSkudG8ocGwpLndoZW5UYXJnZXROYW1lZChDdS5MSU5FKSxuLmJpbmQoSmEuSURFTlRJRklFUi5SZW5kZXJhYmxlKS50byhGZikud2hlblRhcmdldE5hbWVkKEN1LkdSSUQpO3ZhciBpPW4uZ2V0KHQpO3JldHVybiBpLnNldENvbnRhaW5lcihuKSxpLnNldENvbmZpZyhlKSxpfX1dKSx0fSgpLHRoPVFhKCkoJGwucHJvdG90eXBlLFwiY29uZmlnU2VydmljZVwiLFtRbF0se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGluaXRpYWxpemVyOm51bGx9KSxKbD0kbCkpfHxKbCksYWg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD9Vbih0KT9mdW5jdGlvbigpe3JldHVybiB0fTp0OmZ1bmN0aW9uKCl7cmV0dXJuIGV8fDF9fSxzaD1mdW5jdGlvbih0LGUpe3ZhciBuPVtdLHI9W10saT17fSxvPTA7Zm9yKG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIGE9dFtvXTtpW2EuaWRdPW8sbi5wdXNoKGEueCksbi5wdXNoKGEueSksbi5wdXNoKDApLG4ucHVzaCgwKSxyLnB1c2goW10pfWZvcihvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciBzPWVbb107cltpW3Muc291cmNlXV0ucHVzaChpW3MudGFyZ2V0XSkscltpW3MudGFyZ2V0XV0ucHVzaChpW3Muc291cmNlXSl9dmFyIHU9MDtmb3Iobz0wO288dC5sZW5ndGg7bysrKXt2YXIgYz1uLmxlbmd0aCxmPXJbb10sbD1mLmxlbmd0aDtuWzQqbysyXT1jLG5bNCpvKzNdPWYubGVuZ3RoLHU9TWF0aC5tYXgodSxmLmxlbmd0aCk7Zm9yKHZhciBoPTA7aDxsOysraCl7dmFyIGQ9ZltoXTtuLnB1c2goK2QpfX1mb3IoO24ubGVuZ3RoJTQhPTA7KW4ucHVzaCgwKTtyZXR1cm57bWF4RWRnZVBlclZldGV4OnUsYXJyYXk6bmV3IEZsb2F0MzJBcnJheShuKX19LHVoPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPVtdLG89W10sYT17fSxzPTA7Zm9yKHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHU9dFtzXTthW3UuaWRdPXMsaS5wdXNoKHUueCksaS5wdXNoKHUueSksaS5wdXNoKDApLGkucHVzaCgwKSxvLnB1c2goW10pfWZvcihzPTA7czxlLmxlbmd0aDtzKyspe3ZhciBjPWVbc107b1thW2Muc291cmNlXV0ucHVzaChhW2MudGFyZ2V0XSksb1thW2Muc291cmNlXV0ucHVzaChuKGMpKSxvW2FbYy5zb3VyY2VdXS5wdXNoKHIoYykpLG9bYVtjLnNvdXJjZV1dLnB1c2goMCksb1thW2MudGFyZ2V0XV0ucHVzaChhW2Muc291cmNlXSksb1thW2MudGFyZ2V0XV0ucHVzaChuKGMpKSxvW2FbYy50YXJnZXRdXS5wdXNoKHIoYykpLG9bYVtjLnRhcmdldF1dLnB1c2goMCl9dmFyIGY9MDtmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgbD1pLmxlbmd0aCxoPW9bc10sZD1oLmxlbmd0aDtpWzQqcysyXT1sKzEwNDg1NzYqZC80LGlbNCpzKzNdPTAsZj1NYXRoLm1heChmLGQvNCk7Zm9yKHZhciBwPTA7cDxkOysrcCl7dmFyIGc9aFtwXTtpLnB1c2goK2cpfX1mb3IoO2kubGVuZ3RoJTQhPTA7KWkucHVzaCgwKTtyZXR1cm57bWF4RWRnZVBlclZldGV4OmYsYXJyYXk6bmV3IEZsb2F0MzJBcnJheShpKX19LGNoPWZ1bmN0aW9uKHQsZSl7dmFyIG49W10scj10Lmxlbmd0aCxpPXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCxvKXtpZih2b2lkIDA9PT1pW2VbdF1dJiYoaVtlW3RdXT1PYmplY3Qua2V5cyhpKS5sZW5ndGgpLG4ucHVzaChpW2VbdF1dKSxvPT09ci0xKWZvcig7bi5sZW5ndGglNCE9MDspbi5wdXNoKDApfSkpfSkpLHthcnJheTpuZXcgRmxvYXQzMkFycmF5KG4pLGNvdW50Ok9iamVjdC5rZXlzKGkpLmxlbmd0aH19LGZoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPXQubGVuZ3RoLHI9dFswXS5sZW5ndGgsaT1mdW5jdGlvbihyKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7aWYoZS5wdXNoKHRbcl0pLGk9PT1uLTEpZm9yKDtlLmxlbmd0aCU0IT0wOyllLnB1c2goMCl9KSl9LG89MDtvPHI7bysrKWkobyk7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoZSl9O2Z1bmN0aW9uIGxoKHQpe3JldHVybihsaD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gaGgodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIGRoKHQsZSl7cmV0dXJuKGRoPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiBwaCh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPXZoKHQpO2lmKGUpe3ZhciBpPXZoKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBnaCh0aGlzLG4pfX1mdW5jdGlvbiBnaCh0LGUpe3JldHVybiFlfHxcIm9iamVjdFwiIT09bGgoZSkmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9KHQpOmV9ZnVuY3Rpb24gdmgodCl7cmV0dXJuKHZoPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX12YXIgeWg9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoKGZ1bmN0aW9uKGksbyl7ZnVuY3Rpb24gYSh0KXt0cnl7dShyLm5leHQodCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHModCl7dHJ5e3Uoci50aHJvdyh0KSl9Y2F0Y2godCl7byh0KX19ZnVuY3Rpb24gdSh0KXt2YXIgZTt0LmRvbmU/aSh0LnZhbHVlKTooZT10LnZhbHVlLGUgaW5zdGFuY2VvZiBuP2U6bmV3IG4oKGZ1bmN0aW9uKHQpe3QoZSl9KSkpLnRoZW4oYSxzKX11KChyPXIuYXBwbHkodCxlfHxbXSkpLm5leHQoKSl9KSl9LG1oPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmZGgodCxlKX0obyx0KTt2YXIgZSxuLHIsaT1waChvKTtmdW5jdGlvbiBvKHQpe3ZhciBlO3JldHVybiBmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsbyksKGU9aS5jYWxsKHRoaXMpKS5tYXhJdGVyYXRpb249MWUzLGUuZ3Jhdml0eT0xMCxlLnNwZWVkPTEsZS5jbHVzdGVyaW5nPSExLGUuY2x1c3RlckZpZWxkPVwiY2x1c3RlclwiLGUuY2x1c3RlckdyYXZpdHk9MTAsZS53b3JrZXJFbmFibGVkPSExLGUubm9kZXM9W10sZS5lZGdlcz1bXSxlLndpZHRoPTMwMCxlLmhlaWdodD0zMDAsZS5ub2RlTWFwPXt9LGUubm9kZUlkeE1hcD17fSxlLnVwZGF0ZUNmZyh0KSxlfXJldHVybiBlPW8sKG49W3trZXk6XCJnZXREZWZhdWx0Q2ZnXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57bWF4SXRlcmF0aW9uOjFlMyxncmF2aXR5OjEwLHNwZWVkOjEsY2x1c3RlcmluZzohMSxjbHVzdGVyR3Jhdml0eToxMH19fSx7a2V5OlwiZXhlY3V0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHloKHRoaXMsdm9pZCAwLHZvaWQgMCxyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBlLG4scixpLG8sYT10aGlzO3JldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6aWYoKG49KGU9dGhpcykubm9kZXMpJiYwIT09bi5sZW5ndGgpe3QubmV4dD01O2JyZWFrfXJldHVybiBlLm9uTGF5b3V0RW5kJiZlLm9uTGF5b3V0RW5kKCksdC5hYnJ1cHQoXCJyZXR1cm5cIik7Y2FzZSA1OmlmKGUud2lkdGh8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fChlLndpZHRoPXdpbmRvdy5pbm5lcldpZHRoKSxlLmhlaWdodHx8XCJ1bmRlZmluZWRcIj09dHlwZW9mIHdpbmRvd3x8KGUuaGVpZ2h0PXdpbmRvdy5pbm5lckhlaWdodCksZS5jZW50ZXJ8fChlLmNlbnRlcj1bZS53aWR0aC8yLGUuaGVpZ2h0LzJdKSxyPWUuY2VudGVyLDEhPT1uLmxlbmd0aCl7dC5uZXh0PTE0O2JyZWFrfXJldHVybiBuWzBdLng9clswXSxuWzBdLnk9clsxXSxlLm9uTGF5b3V0RW5kJiZlLm9uTGF5b3V0RW5kKCksdC5hYnJ1cHQoXCJyZXR1cm5cIik7Y2FzZSAxNDpyZXR1cm4gaT17fSxvPXt9LG4uZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtVbih0LngpfHwodC54PU1hdGgucmFuZG9tKCkqYS53aWR0aCksVW4odC55KXx8KHQueT1NYXRoLnJhbmRvbSgpKmEuaGVpZ2h0KSxpW3QuaWRdPXQsb1t0LmlkXT1lfSkpLGUubm9kZU1hcD1pLGUubm9kZUlkeE1hcD1vLHQubmV4dD0yMSxlLnJ1bigpO2Nhc2UgMjE6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleTpcImV4ZWN1dGVXaXRoV29ya2VyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4geWgodGhpcyx2b2lkIDAsdm9pZCAwLHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKChmdW5jdGlvbiBuKCl7dmFyIHIsaSxvLGEscyx1PXRoaXM7cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihuKXtmb3IoOzspc3dpdGNoKG4ucHJldj1uLm5leHQpe2Nhc2UgMDppZihpPShyPXRoaXMpLm5vZGVzLG89ci5jZW50ZXIsaSYmMCE9PWkubGVuZ3RoKXtuLm5leHQ9NTticmVha31yZXR1cm4gbi5hYnJ1cHQoXCJyZXR1cm5cIik7Y2FzZSA1OmlmKDEhPT1pLmxlbmd0aCl7bi5uZXh0PTk7YnJlYWt9cmV0dXJuIGlbMF0ueD1vWzBdLGlbMF0ueT1vWzFdLG4uYWJydXB0KFwicmV0dXJuXCIpO2Nhc2UgOTpyZXR1cm4gYT17fSxzPXt9LGkuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtVbih0LngpfHwodC54PU1hdGgucmFuZG9tKCkqdS53aWR0aCksVW4odC55KXx8KHQueT1NYXRoLnJhbmRvbSgpKnUuaGVpZ2h0KSxhW3QuaWRdPXQsc1t0LmlkXT1lfSkpLHIubm9kZU1hcD1hLHIubm9kZUlkeE1hcD1zLG4ubmV4dD0xNixyLnJ1bih0LGUpO2Nhc2UgMTY6Y2FzZVwiZW5kXCI6cmV0dXJuIG4uc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleTpcInJ1blwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHloKHRoaXMsdm9pZCAwLHZvaWQgMCxyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gbigpe3ZhciByLGksbyxhLHMsdSxjLGYsbCxoLGQscCxnLHYseSxtLGIseCx3LFMsRSxfLE8sayxNLEEsVD10aGlzO3JldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcCgoZnVuY3Rpb24obil7Zm9yKDs7KXN3aXRjaChuLnByZXY9bi5uZXh0KXtjYXNlIDA6Zm9yKGk9KHI9dGhpcykubm9kZXMsbz1yLmVkZ2VzLGE9ci5tYXhJdGVyYXRpb24scz1yLmNlbnRlcix1PXIuaGVpZ2h0KnIud2lkdGgsYz1NYXRoLnNxcnQodSkvMTAsZj11LyhpLmxlbmd0aCsxKSxsPU1hdGguc3FydChmKSxoPXIuc3BlZWQsZD1yLmNsdXN0ZXJpbmcscD1jaChbci5jbHVzdGVyRmllbGRdLGkpLGc9cC5hcnJheSx2PXAuY291bnQseT1pLmxlbmd0aCxtPXNoKGksbyksYj1tLm1heEVkZ2VQZXJWZXRleCx4PW0uYXJyYXksdz1yLndvcmtlckVuYWJsZWQsUz13P29oLmNyZWF0ZSh7Y2FudmFzOnQsZW5naW5lT3B0aW9uczp7c3VwcG9ydENvbXB1dGU6ITB9fSk6b2guY3JlYXRlKHtlbmdpbmVPcHRpb25zOntzdXBwb3J0Q29tcHV0ZTohMH19KSxFPXIub25MYXlvdXRFbmQsXz1bXSxPPTA7Tzx2O08rKylfLnB1c2goMCwwLDAsMCk7cmV0dXJuIGs9Uy5jcmVhdGVLZXJuZWwoJ3tcInNoYWRlcnNcIjp7XCJXR1NMXCI6XCJpbXBvcnQgXFxcXFwiR0xTTC5zdGQuNDUwXFxcXFwiIGFzIHN0ZDtcXFxcblxcXFxuXFxcXG4jIHZhciBnV2ViR1BVRGVidWcgOiBib29sID0gZmFsc2U7XFxcXG4jIHZhciBnV2ViR1BVRGVidWdPdXRwdXQgOiB2ZWM0PGYzMj4gPSB2ZWM0PGYzMj4oMC4wKTtcXFxcblxcXFxuW1tidWlsdGluIGdsb2JhbF9pbnZvY2F0aW9uX2lkXV0gdmFyPGluPiBnbG9iYWxJbnZvY2F0aW9uSUQgOiB2ZWMzPHUzMj47XFxcXG4jIFtbYnVpbHRpbiB3b3JrX2dyb3VwX3NpemVdXSB2YXI8aW4+IHdvcmtHcm91cFNpemUgOiB2ZWMzPHUzMj47XFxcXG4jIFtbYnVpbHRpbiB3b3JrX2dyb3VwX2lkXV0gdmFyPGluPiB3b3JrR3JvdXBJRCA6IHZlYzM8dTMyPjtcXFxcbltbYnVpbHRpbiBsb2NhbF9pbnZvY2F0aW9uX2lkXV0gdmFyPGluPiBsb2NhbEludm9jYXRpb25JRCA6IHZlYzM8dTMyPjtcXFxcbiMgW1tidWlsdGluIG51bV93b3JrX2dyb3Vwc11dIHZhcjxpbj4gbnVtV29ya0dyb3VwcyA6IHZlYzM8dTMyPjtcXFxcbltbYnVpbHRpbiBsb2NhbF9pbnZvY2F0aW9uX2lkeF1dIHZhcjxpbj4gbG9jYWxJbnZvY2F0aW9uSW5kZXggOiB1MzI7XFxcXG5cXFxcbnR5cGUgR1dlYkdQVVBhcmFtcyA9IFtbYmxvY2tdXSBzdHJ1Y3Qge1xcXFxuICBbW29mZnNldCAwXV0gdV9LIDogZjMyO1xcXFxuICBbW29mZnNldCA0XV0gdV9LMiA6IGYzMjtcXFxcbiAgW1tvZmZzZXQgOF1dIHVfQ2VudGVyIDogdmVjMjxmMzI+O1xcXFxuICBbW29mZnNldCAxNl1dIHVfR3Jhdml0eSA6IGYzMjtcXFxcbiAgW1tvZmZzZXQgMjBdXSB1X0NsdXN0ZXJHcmF2aXR5IDogZjMyO1xcXFxuICBbW29mZnNldCAyNF1dIHVfU3BlZWQgOiBmMzI7XFxcXG4gIFtbb2Zmc2V0IDI4XV0gdV9NYXhEaXNwbGFjZSA6IGYzMjtcXFxcbiAgW1tvZmZzZXQgMzJdXSB1X0NsdXN0ZXJpbmcgOiBmMzI7XFxcXG59O1xcXFxuW1tiaW5kaW5nIDAsIHNldCAwXV0gdmFyPHVuaWZvcm0+IGdXZWJHUFVVbmlmb3JtUGFyYW1zIDogR1dlYkdQVVBhcmFtcztcXFxcbnR5cGUgR1dlYkdQVUJ1ZmZlcjAgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfRGF0YSA6IFtbc3RyaWRlIDE2XV0gYXJyYXk8dmVjNDxmMzI+PjtcXFxcbn07XFxcXG5bW2JpbmRpbmcgMSwgc2V0IDBdXSB2YXI8c3RvcmFnZV9idWZmZXI+IGdXZWJHUFVCdWZmZXIwIDogR1dlYkdQVUJ1ZmZlcjA7XFxcXG50eXBlIEdXZWJHUFVCdWZmZXIxID0gW1tibG9ja11dIHN0cnVjdCB7XFxcXG4gIFtbb2Zmc2V0IDBdXSB1X0F0dHJpYnV0ZUFycmF5IDogW1tzdHJpZGUgMTZdXSBhcnJheTx2ZWM0PGYzMj4+O1xcXFxufTtcXFxcbltbYmluZGluZyAyLCBzZXQgMF1dIHZhcjxzdG9yYWdlX2J1ZmZlcj4gZ1dlYkdQVUJ1ZmZlcjEgOiBHV2ViR1BVQnVmZmVyMTtcXFxcbnR5cGUgR1dlYkdQVUJ1ZmZlcjIgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfQ2x1c3RlckNlbnRlcnMgOiBbW3N0cmlkZSAxNl1dIGFycmF5PHZlYzQ8ZjMyPj47XFxcXG59O1xcXFxuW1tiaW5kaW5nIDMsIHNldCAwXV0gdmFyPHN0b3JhZ2VfYnVmZmVyPiBnV2ViR1BVQnVmZmVyMiA6IEdXZWJHUFVCdWZmZXIyO1xcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcbmZuIGNhbGNSZXB1bHNpdmUoaSA6IGkzMiwgY3VycmVudE5vZGUgOiB2ZWM0PGYzMj4pIC0+IHZlYzI8ZjMyPiB7dmFyIGR4IDogZjMyID0gMC4wO1xcXFxudmFyIGR5IDogZjMyID0gMC4wO1xcXFxuZm9yICh2YXIgaiA6IGkzMiA9IDA7IGogPCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX1ZFUlRFWF9DT1VOVDsgaiA9IGogKyAxKSB7aWYgKGkgIT0gaikge3ZhciBuZXh0Tm9kZSA6IHZlYzQ8ZjMyPiA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtqXTtcXFxcbnZhciB4RGlzdCA6IGYzMiA9IGN1cnJlbnROb2RlLnggLSBuZXh0Tm9kZS54O1xcXFxudmFyIHlEaXN0IDogZjMyID0gY3VycmVudE5vZGUueSAtIG5leHROb2RlLnk7XFxcXG52YXIgZGlzdCA6IGYzMiA9ICgoeERpc3QgKiB4RGlzdCkgKyAoeURpc3QgKiB5RGlzdCkpICsgMC4wMTtcXFxcbnZhciBwYXJhbSA6IGYzMiA9IGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfSzIgLyBkaXN0O1xcXFxuaWYgKGRpc3QgPiAwLjApIHtkeCA9IGR4ICsgcGFyYW0gKiB4RGlzdDtcXFxcbmR5ID0gZHkgKyBwYXJhbSAqIHlEaXN0O1xcXFxuaWYgKCh4RGlzdCA9PSAwLjApICYmICh5RGlzdCA9PSAwLjApKSB7dmFyIHNpZ24gOiBmMzIgPSBzZWxlY3QoMS4wLCAtMS4wLCBpIDwgaik7XFxcXG5keCA9IGR4ICsgcGFyYW0gKiBzdGQ6OnNpZ247XFxcXG5keSA9IGR5ICsgcGFyYW0gKiBzdGQ6OnNpZ247fX19fVxcXFxucmV0dXJuIHZlYzI8ZjMyPihkeCwgZHkpO31cXFxcbmZuIGNhbGNHcmF2aXR5KGN1cnJlbnROb2RlIDogdmVjNDxmMzI+LCBub2RlQXR0cmlidXRlcyA6IHZlYzQ8ZjMyPikgLT4gdmVjMjxmMzI+IHt2YXIgZHggOiBmMzIgPSAwLjA7XFxcXG52YXIgZHkgOiBmMzIgPSAwLjA7XFxcXG52YXIgdnggOiBmMzIgPSBjdXJyZW50Tm9kZS54IC0gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9DZW50ZXIueDtcXFxcbnZhciB2eSA6IGYzMiA9IGN1cnJlbnROb2RlLnkgLSBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X0NlbnRlci55O1xcXFxudmFyIGdmIDogZjMyID0gKDAuMDEgKiBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X0spICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9HcmF2aXR5O1xcXFxuZHggPSBnZiAqIHZ4O1xcXFxuZHkgPSBnZiAqIHZ5O1xcXFxuaWYgKGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfQ2x1c3RlcmluZyA9PSAxLjApIHt2YXIgY2x1c3RlcklkeCA6IGkzMiA9IGkzMihub2RlQXR0cmlidXRlcy54KTtcXFxcbnZhciBjZW50ZXIgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMi51X0NsdXN0ZXJDZW50ZXJzW2NsdXN0ZXJJZHhdO1xcXFxudmFyIGN2eCA6IGYzMiA9IGN1cnJlbnROb2RlLnggLSBjZW50ZXIueDtcXFxcbnZhciBjdnkgOiBmMzIgPSBjdXJyZW50Tm9kZS55IC0gY2VudGVyLnk7XFxcXG52YXIgZGlzdCA6IGYzMiA9IHN0ZDo6c3FydCgoY3Z4ICogY3Z4KSArIChjdnkgKiBjdnkpKSArIDAuMDE7XFxcXG52YXIgcGFybWEgOiBmMzIgPSAoZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9LICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9DbHVzdGVyR3Jhdml0eSkgLyBkaXN0O1xcXFxuZHggPSBkeCArIHBhcm1hICogY3Z4O1xcXFxuZHkgPSBkeSArIHBhcm1hICogY3Z5O31cXFxcbnJldHVybiB2ZWMyPGYzMj4oZHgsIGR5KTt9XFxcXG5mbiBjYWxjQXR0cmFjdGl2ZShpIDogaTMyLCBjdXJyZW50Tm9kZSA6IHZlYzQ8ZjMyPikgLT4gdmVjMjxmMzI+IHt2YXIgZHggOiBmMzIgPSAwLjA7XFxcXG52YXIgZHkgOiBmMzIgPSAwLjA7XFxcXG52YXIgYXJyX29mZnNldCA6IGkzMiA9IGkzMihzdGQ6OmZsb29yKGN1cnJlbnROb2RlLnogKyAwLjUpKTtcXFxcbnZhciBsZW5ndGggOiBpMzIgPSBpMzIoc3RkOjpmbG9vcihjdXJyZW50Tm9kZS53ICsgMC41KSk7XFxcXG52YXIgbm9kZV9idWZmZXIgOiB2ZWM0PGYzMj47XFxcXG5mb3IgKHZhciBwIDogaTMyID0gMDsgcCA8IF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fTUFYX0VER0VfUEVSX1ZFUlRFWDsgcCA9IHAgKyAxKSB7aWYgKHAgPj0gbGVuZ3RoKSB7YnJlYWs7fVxcXFxudmFyIGFycl9pZHggOiBpMzIgPSBhcnJfb2Zmc2V0ICsgaTMyKHApO1xcXFxudmFyIGJ1Zl9vZmZzZXQgOiBpMzIgPSBhcnJfaWR4IC0gKChhcnJfaWR4IC8gNCkgKiA0KTtcXFxcbmlmICgocCA9PSAwKSB8fCAoYnVmX29mZnNldCA9PSAwKSkge25vZGVfYnVmZmVyID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2kzMihhcnJfaWR4IC8gNCldO31cXFxcbnZhciBmbG9hdF9qIDogZjMyID0gc2VsZWN0KG5vZGVfYnVmZmVyLngsIHNlbGVjdChub2RlX2J1ZmZlci55LCBzZWxlY3Qobm9kZV9idWZmZXIueiwgbm9kZV9idWZmZXIudywgYnVmX29mZnNldCA9PSAyKSwgYnVmX29mZnNldCA9PSAxKSwgYnVmX29mZnNldCA9PSAwKTtcXFxcbnZhciBuZXh0Tm9kZSA6IHZlYzQ8ZjMyPiA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtpMzIoZmxvYXRfaildO1xcXFxudmFyIHhEaXN0IDogZjMyID0gY3VycmVudE5vZGUueCAtIG5leHROb2RlLng7XFxcXG52YXIgeURpc3QgOiBmMzIgPSBjdXJyZW50Tm9kZS55IC0gbmV4dE5vZGUueTtcXFxcbnZhciBkaXN0IDogZjMyID0gc3RkOjpzcXJ0KCh4RGlzdCAqIHhEaXN0KSArICh5RGlzdCAqIHlEaXN0KSkgKyAwLjAxO1xcXFxudmFyIGF0dHJhY3RpdmVGIDogZjMyID0gZGlzdCAvIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfSztcXFxcbmlmIChkaXN0ID4gMC4wKSB7ZHggPSBkeCAtIHhEaXN0ICogYXR0cmFjdGl2ZUY7XFxcXG5keSA9IGR5IC0geURpc3QgKiBhdHRyYWN0aXZlRjtcXFxcbmlmICgoeERpc3QgPT0gMC4wKSAmJiAoeURpc3QgPT0gMC4wKSkge3ZhciBzaWduIDogZjMyID0gc2VsZWN0KDEuMCwgLTEuMCwgaSA8IGkzMihmbG9hdF9qKSk7XFxcXG5keCA9IGR4IC0gc3RkOjpzaWduICogYXR0cmFjdGl2ZUY7XFxcXG5keSA9IGR5IC0gc3RkOjpzaWduICogYXR0cmFjdGl2ZUY7fX19XFxcXG5yZXR1cm4gdmVjMjxmMzI+KGR4LCBkeSk7fVxcXFxuZm4gbWFpbigpIC0+IHZvaWQge3ZhciBpIDogaTMyID0gZ2xvYmFsSW52b2NhdGlvbklELng7XFxcXG52YXIgY3VycmVudE5vZGUgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbaV07XFxcXG52YXIgZHggOiBmMzIgPSAwLjA7XFxcXG52YXIgZHkgOiBmMzIgPSAwLjA7XFxcXG5pZiAoaSA+PSBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX1ZFUlRFWF9DT1VOVCkge2dXZWJHUFVCdWZmZXIwLnVfRGF0YVtpXSA9IGN1cnJlbnROb2RlO1xcXFxucmV0dXJuIDt9XFxcXG52YXIgcmVwdWxzaXZlIDogdmVjMjxmMzI+ID0gY2FsY1JlcHVsc2l2ZShpLCBjdXJyZW50Tm9kZSk7XFxcXG5keCA9IGR4ICsgcmVwdWxzaXZlLng7XFxcXG5keSA9IGR5ICsgcmVwdWxzaXZlLnk7XFxcXG52YXIgYXR0cmFjdGl2ZSA6IHZlYzI8ZjMyPiA9IGNhbGNBdHRyYWN0aXZlKGksIGN1cnJlbnROb2RlKTtcXFxcbmR4ID0gZHggKyBhdHRyYWN0aXZlLng7XFxcXG5keSA9IGR5ICsgYXR0cmFjdGl2ZS55O1xcXFxudmFyIG5vZGVBdHRyaWJ1dGVzIDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjEudV9BdHRyaWJ1dGVBcnJheVtpXTtcXFxcbnZhciBncmF2aXR5IDogdmVjMjxmMzI+ID0gY2FsY0dyYXZpdHkoY3VycmVudE5vZGUsIG5vZGVBdHRyaWJ1dGVzKTtcXFxcbmR4ID0gZHggLSBncmF2aXR5Lng7XFxcXG5keSA9IGR5IC0gZ3Jhdml0eS55O1xcXFxuZHggPSBkeCAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfU3BlZWQ7XFxcXG5keSA9IGR5ICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9TcGVlZDtcXFxcbnZhciBkaXN0TGVuZ3RoIDogZjMyID0gc3RkOjpzcXJ0KChkeCAqIGR4KSArIChkeSAqIGR5KSk7XFxcXG5pZiAoZGlzdExlbmd0aCA+IDAuMCkge3ZhciBsaW1pdGVkRGlzdCA6IGYzMiA9IHN0ZDo6bWluKGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfTWF4RGlzcGxhY2UgKiBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X1NwZWVkLCBkaXN0TGVuZ3RoKTtcXFxcbmdXZWJHUFVCdWZmZXIwLnVfRGF0YVtpXSA9IHZlYzQ8ZjMyPihjdXJyZW50Tm9kZS54ICsgKChkeCAvIGRpc3RMZW5ndGgpICogbGltaXRlZERpc3QpLCBjdXJyZW50Tm9kZS55ICsgKChkeSAvIGRpc3RMZW5ndGgpICogbGltaXRlZERpc3QpLCBjdXJyZW50Tm9kZS56LCBjdXJyZW50Tm9kZS53KTt9XFxcXG5yZXR1cm47fVxcXFxuXFxcXG5lbnRyeV9wb2ludCBjb21wdXRlIGFzIFxcXFxcIm1haW5cXFxcXCIgPSBtYWluO1xcXFxuXCIsXCJHTFNMNDUwXCI6XCJcXFxcblxcXFxuXFxcXG5ib29sIGdXZWJHUFVEZWJ1ZyA9IGZhbHNlO1xcXFxudmVjNCBnV2ViR1BVRGVidWdPdXRwdXQgPSB2ZWM0KDAuMCk7XFxcXG5cXFxcbml2ZWMzIGdsb2JhbEludm9jYXRpb25JRCA9IGl2ZWMzKGdsX0dsb2JhbEludm9jYXRpb25JRCk7XFxcXG5pdmVjMyB3b3JrR3JvdXBTaXplID0gaXZlYzMoMSwxLDEpO1xcXFxuaXZlYzMgd29ya0dyb3VwSUQgPSBpdmVjMyhnbF9Xb3JrR3JvdXBJRCk7XFxcXG5pdmVjMyBsb2NhbEludm9jYXRpb25JRCA9IGl2ZWMzKGdsX0xvY2FsSW52b2NhdGlvbklEKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMyhnbF9OdW1Xb3JrR3JvdXBzKTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGludChnbF9Mb2NhbEludm9jYXRpb25JbmRleCk7XFxcXG5cXFxcbmxheW91dChzdGQxNDAsIHNldCA9IDAsIGJpbmRpbmcgPSAwKSB1bmlmb3JtIEdXZWJHUFVQYXJhbXMge1xcXFxuICBmbG9hdCB1X0s7XFxcXG4gIGZsb2F0IHVfSzI7XFxcXG4gIHZlYzIgdV9DZW50ZXI7XFxcXG4gIGZsb2F0IHVfR3Jhdml0eTtcXFxcbiAgZmxvYXQgdV9DbHVzdGVyR3Jhdml0eTtcXFxcbiAgZmxvYXQgdV9TcGVlZDtcXFxcbiAgZmxvYXQgdV9NYXhEaXNwbGFjZTtcXFxcbiAgZmxvYXQgdV9DbHVzdGVyaW5nO1xcXFxufSBnV2ViR1BVVW5pZm9ybVBhcmFtcztcXFxcbmxheW91dChzdGQ0MzAsIHNldCA9IDAsIGJpbmRpbmcgPSAxKSBidWZmZXIgICBHV2ViR1BVQnVmZmVyMCB7XFxcXG4gIHZlYzQgdV9EYXRhW107XFxcXG59IGdXZWJHUFVCdWZmZXIwO1xcXFxuXFxcXG5sYXlvdXQoc3RkNDMwLCBzZXQgPSAwLCBiaW5kaW5nID0gMikgYnVmZmVyIHJlYWRvbmx5ICBHV2ViR1BVQnVmZmVyMSB7XFxcXG4gIHZlYzQgdV9BdHRyaWJ1dGVBcnJheVtdO1xcXFxufSBnV2ViR1BVQnVmZmVyMTtcXFxcblxcXFxubGF5b3V0KHN0ZDQzMCwgc2V0ID0gMCwgYmluZGluZyA9IDMpIGJ1ZmZlciByZWFkb25seSAgR1dlYkdQVUJ1ZmZlcjIge1xcXFxuICB2ZWM0IHVfQ2x1c3RlckNlbnRlcnNbXTtcXFxcbn0gZ1dlYkdQVUJ1ZmZlcjI7XFxcXG5cXFxcblxcXFxuXFxcXG4jZGVmaW5lIE1BWF9FREdFX1BFUl9WRVJURVggX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19NQVhfRURHRV9QRVJfVkVSVEVYXFxcXG4jZGVmaW5lIFZFUlRFWF9DT1VOVCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX1ZFUlRFWF9DT1VOVFxcXFxubGF5b3V0IChcXFxcbiAgbG9jYWxfc2l6ZV94ID0gMSxcXFxcbiAgbG9jYWxfc2l6ZV95ID0gMSxcXFxcbiAgbG9jYWxfc2l6ZV96ID0gMVxcXFxuKSBpbjtcXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG52ZWMyIGNhbGNSZXB1bHNpdmUoaW50IGksIHZlYzQgY3VycmVudE5vZGUpIHtmbG9hdCBkeCA9IDAuMDtcXFxcbmZsb2F0IGR5ID0gMC4wO1xcXFxuZm9yIChpbnQgaiA9IDA7IGogPCBWRVJURVhfQ09VTlQ7IGorKykge2lmIChpICE9IGopIHt2ZWM0IG5leHROb2RlID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2pdO1xcXFxuZmxvYXQgeERpc3QgPSBjdXJyZW50Tm9kZS54IC0gbmV4dE5vZGUueDtcXFxcbmZsb2F0IHlEaXN0ID0gY3VycmVudE5vZGUueSAtIG5leHROb2RlLnk7XFxcXG5mbG9hdCBkaXN0ID0gKCh4RGlzdCAqIHhEaXN0KSArICh5RGlzdCAqIHlEaXN0KSkgKyAwLjAxO1xcXFxuZmxvYXQgcGFyYW0gPSBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X0syIC8gZGlzdDtcXFxcbmlmIChkaXN0ID4gMC4wKSB7ZHggKz0gcGFyYW0gKiB4RGlzdDtcXFxcbmR5ICs9IHBhcmFtICogeURpc3Q7XFxcXG5pZiAoKHhEaXN0ID09IDAuMCkgJiYgKHlEaXN0ID09IDAuMCkpIHtmbG9hdCBzaWduID0gKGkgPCBqKSA/ICgxLjApIDogKC0xLjApO1xcXFxuZHggKz0gcGFyYW0gKiBzaWduO1xcXFxuZHkgKz0gcGFyYW0gKiBzaWduO319fX1cXFxcbnJldHVybiB2ZWMyKGR4LCBkeSk7fVxcXFxudmVjMiBjYWxjR3Jhdml0eSh2ZWM0IGN1cnJlbnROb2RlLCB2ZWM0IG5vZGVBdHRyaWJ1dGVzKSB7ZmxvYXQgZHggPSAwLjA7XFxcXG5mbG9hdCBkeSA9IDAuMDtcXFxcbmZsb2F0IHZ4ID0gY3VycmVudE5vZGUueCAtIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfQ2VudGVyLng7XFxcXG5mbG9hdCB2eSA9IGN1cnJlbnROb2RlLnkgLSBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X0NlbnRlci55O1xcXFxuZmxvYXQgZ2YgPSAoMC4wMSAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfSykgKiBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X0dyYXZpdHk7XFxcXG5keCA9IGdmICogdng7XFxcXG5keSA9IGdmICogdnk7XFxcXG5pZiAoZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9DbHVzdGVyaW5nID09IDEuMCkge2ludCBjbHVzdGVySWR4ID0gaW50KG5vZGVBdHRyaWJ1dGVzLngpO1xcXFxudmVjNCBjZW50ZXIgPSBnV2ViR1BVQnVmZmVyMi51X0NsdXN0ZXJDZW50ZXJzW2NsdXN0ZXJJZHhdO1xcXFxuZmxvYXQgY3Z4ID0gY3VycmVudE5vZGUueCAtIGNlbnRlci54O1xcXFxuZmxvYXQgY3Z5ID0gY3VycmVudE5vZGUueSAtIGNlbnRlci55O1xcXFxuZmxvYXQgZGlzdCA9IHNxcnQoKGN2eCAqIGN2eCkgKyAoY3Z5ICogY3Z5KSkgKyAwLjAxO1xcXFxuZmxvYXQgcGFybWEgPSAoZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9LICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9DbHVzdGVyR3Jhdml0eSkgLyBkaXN0O1xcXFxuZHggKz0gcGFybWEgKiBjdng7XFxcXG5keSArPSBwYXJtYSAqIGN2eTt9XFxcXG5yZXR1cm4gdmVjMihkeCwgZHkpO31cXFxcbnZlYzIgY2FsY0F0dHJhY3RpdmUoaW50IGksIHZlYzQgY3VycmVudE5vZGUpIHtmbG9hdCBkeCA9IDAuMDtcXFxcbmZsb2F0IGR5ID0gMC4wO1xcXFxuaW50IGFycl9vZmZzZXQgPSBpbnQoZmxvb3IoY3VycmVudE5vZGUueiArIDAuNSkpO1xcXFxuaW50IGxlbmd0aCA9IGludChmbG9vcihjdXJyZW50Tm9kZS53ICsgMC41KSk7XFxcXG52ZWM0IG5vZGVfYnVmZmVyO1xcXFxuZm9yIChpbnQgcCA9IDA7IHAgPCBNQVhfRURHRV9QRVJfVkVSVEVYOyBwKyspIHtpZiAocCA+PSBsZW5ndGgpIHticmVhazt9XFxcXG5pbnQgYXJyX2lkeCA9IGFycl9vZmZzZXQgKyBpbnQocCk7XFxcXG5pbnQgYnVmX29mZnNldCA9IGFycl9pZHggLSAoKGFycl9pZHggLyA0KSAqIDQpO1xcXFxuaWYgKChwID09IDApIHx8IChidWZfb2Zmc2V0ID09IDApKSB7bm9kZV9idWZmZXIgPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbaW50KGFycl9pZHggLyA0KV07fVxcXFxuZmxvYXQgZmxvYXRfaiA9IChidWZfb2Zmc2V0ID09IDApID8gKG5vZGVfYnVmZmVyLngpIDogKChidWZfb2Zmc2V0ID09IDEpID8gKG5vZGVfYnVmZmVyLnkpIDogKChidWZfb2Zmc2V0ID09IDIpID8gKG5vZGVfYnVmZmVyLnopIDogKG5vZGVfYnVmZmVyLncpKSk7XFxcXG52ZWM0IG5leHROb2RlID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ludChmbG9hdF9qKV07XFxcXG5mbG9hdCB4RGlzdCA9IGN1cnJlbnROb2RlLnggLSBuZXh0Tm9kZS54O1xcXFxuZmxvYXQgeURpc3QgPSBjdXJyZW50Tm9kZS55IC0gbmV4dE5vZGUueTtcXFxcbmZsb2F0IGRpc3QgPSBzcXJ0KCh4RGlzdCAqIHhEaXN0KSArICh5RGlzdCAqIHlEaXN0KSkgKyAwLjAxO1xcXFxuZmxvYXQgYXR0cmFjdGl2ZUYgPSBkaXN0IC8gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9LO1xcXFxuaWYgKGRpc3QgPiAwLjApIHtkeCAtPSB4RGlzdCAqIGF0dHJhY3RpdmVGO1xcXFxuZHkgLT0geURpc3QgKiBhdHRyYWN0aXZlRjtcXFxcbmlmICgoeERpc3QgPT0gMC4wKSAmJiAoeURpc3QgPT0gMC4wKSkge2Zsb2F0IHNpZ24gPSAoaSA8IGludChmbG9hdF9qKSkgPyAoMS4wKSA6ICgtMS4wKTtcXFxcbmR4IC09IHNpZ24gKiBhdHRyYWN0aXZlRjtcXFxcbmR5IC09IHNpZ24gKiBhdHRyYWN0aXZlRjt9fX1cXFxcbnJldHVybiB2ZWMyKGR4LCBkeSk7fVxcXFxudm9pZCBtYWluKCkge2ludCBpID0gZ2xvYmFsSW52b2NhdGlvbklELng7XFxcXG52ZWM0IGN1cnJlbnROb2RlID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ldO1xcXFxuZmxvYXQgZHggPSAwLjA7XFxcXG5mbG9hdCBkeSA9IDAuMDtcXFxcbmlmIChpID49IFZFUlRFWF9DT1VOVCkge2dXZWJHUFVCdWZmZXIwLnVfRGF0YVtpXSA9IGN1cnJlbnROb2RlO1xcXFxucmV0dXJuIDt9XFxcXG52ZWMyIHJlcHVsc2l2ZSA9IGNhbGNSZXB1bHNpdmUoaSwgY3VycmVudE5vZGUpO1xcXFxuZHggKz0gcmVwdWxzaXZlLng7XFxcXG5keSArPSByZXB1bHNpdmUueTtcXFxcbnZlYzIgYXR0cmFjdGl2ZSA9IGNhbGNBdHRyYWN0aXZlKGksIGN1cnJlbnROb2RlKTtcXFxcbmR4ICs9IGF0dHJhY3RpdmUueDtcXFxcbmR5ICs9IGF0dHJhY3RpdmUueTtcXFxcbnZlYzQgbm9kZUF0dHJpYnV0ZXMgPSBnV2ViR1BVQnVmZmVyMS51X0F0dHJpYnV0ZUFycmF5W2ldO1xcXFxudmVjMiBncmF2aXR5ID0gY2FsY0dyYXZpdHkoY3VycmVudE5vZGUsIG5vZGVBdHRyaWJ1dGVzKTtcXFxcbmR4IC09IGdyYXZpdHkueDtcXFxcbmR5IC09IGdyYXZpdHkueTtcXFxcbmR4ICo9IGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfU3BlZWQ7XFxcXG5keSAqPSBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X1NwZWVkO1xcXFxuZmxvYXQgZGlzdExlbmd0aCA9IHNxcnQoKGR4ICogZHgpICsgKGR5ICogZHkpKTtcXFxcbmlmIChkaXN0TGVuZ3RoID4gMC4wKSB7ZmxvYXQgbGltaXRlZERpc3QgPSBtaW4oZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9NYXhEaXNwbGFjZSAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfU3BlZWQsIGRpc3RMZW5ndGgpO1xcXFxuZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ldID0gdmVjNChjdXJyZW50Tm9kZS54ICsgKChkeCAvIGRpc3RMZW5ndGgpICogbGltaXRlZERpc3QpLCBjdXJyZW50Tm9kZS55ICsgKChkeSAvIGRpc3RMZW5ndGgpICogbGltaXRlZERpc3QpLCBjdXJyZW50Tm9kZS56LCBjdXJyZW50Tm9kZS53KTt9fVxcXFxuXCIsXCJHTFNMMTAwXCI6XCJcXFxcblxcXFxuZmxvYXQgZXBzaWxvbiA9IDAuMDAwMDE7XFxcXG52ZWMyIGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoZmxvYXQgYWRkcmVzczFELCB2ZWMyIHRleFNpemUpIHtcXFxcbiAgdmVjMiBjb252X2NvbnN0ID0gdmVjMigxLjAgLyB0ZXhTaXplLngsIDEuMCAvICh0ZXhTaXplLnggKiB0ZXhTaXplLnkpKTtcXFxcbiAgdmVjMiBub3JtQWRkcjJEID0gZmxvYXQoYWRkcmVzczFEKSAqIGNvbnZfY29uc3Q7XFxcXG4gIHJldHVybiB2ZWMyKGZyYWN0KG5vcm1BZGRyMkQueCArIGVwc2lsb24pLCBub3JtQWRkcjJELnkpO1xcXFxufVxcXFxuXFxcXG52b2lkIGJhcnJpZXIoKSB7fVxcXFxuICBcXFxcblxcXFxudW5pZm9ybSB2ZWMyIHVfT3V0cHV0VGV4dHVyZVNpemU7XFxcXG51bmlmb3JtIGludCB1X091dHB1dFRleGVsQ291bnQ7XFxcXG52YXJ5aW5nIHZlYzIgdl9UZXhDb29yZDtcXFxcblxcXFxuYm9vbCBnV2ViR1BVRGVidWcgPSBmYWxzZTtcXFxcbnZlYzQgZ1dlYkdQVURlYnVnT3V0cHV0ID0gdmVjNCgwLjApO1xcXFxuXFxcXG4jZGVmaW5lIE1BWF9FREdFX1BFUl9WRVJURVggX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19NQVhfRURHRV9QRVJfVkVSVEVYXFxcXG4jZGVmaW5lIFZFUlRFWF9DT1VOVCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX1ZFUlRFWF9DT1VOVFxcXFxuXFxcXG51bmlmb3JtIHNhbXBsZXIyRCB1X0RhdGE7XFxcXG51bmlmb3JtIHZlYzIgdV9EYXRhU2l6ZTtcXFxcbnZlYzQgZ2V0RGF0YXVfRGF0YSh2ZWMyIGFkZHJlc3MyRCkge1xcXFxuICByZXR1cm4gdmVjNCh0ZXh0dXJlMkQodV9EYXRhLCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9EYXRhKGZsb2F0IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfRGF0YShhZGRyVHJhbnNsYXRpb25fMUR0bzJEKGFkZHJlc3MxRCwgdV9EYXRhU2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9EYXRhKGludCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0RhdGEoZmxvYXQoYWRkcmVzczFEKSk7XFxcXG59XFxcXG51bmlmb3JtIGZsb2F0IHVfSztcXFxcbnVuaWZvcm0gZmxvYXQgdV9LMjtcXFxcbnVuaWZvcm0gdmVjMiB1X0NlbnRlcjtcXFxcbnVuaWZvcm0gZmxvYXQgdV9HcmF2aXR5O1xcXFxudW5pZm9ybSBmbG9hdCB1X0NsdXN0ZXJHcmF2aXR5O1xcXFxudW5pZm9ybSBmbG9hdCB1X1NwZWVkO1xcXFxudW5pZm9ybSBmbG9hdCB1X01heERpc3BsYWNlO1xcXFxudW5pZm9ybSBmbG9hdCB1X0NsdXN0ZXJpbmc7XFxcXG51bmlmb3JtIHNhbXBsZXIyRCB1X0F0dHJpYnV0ZUFycmF5O1xcXFxudW5pZm9ybSB2ZWMyIHVfQXR0cmlidXRlQXJyYXlTaXplO1xcXFxudmVjNCBnZXREYXRhdV9BdHRyaWJ1dGVBcnJheSh2ZWMyIGFkZHJlc3MyRCkge1xcXFxuICByZXR1cm4gdmVjNCh0ZXh0dXJlMkQodV9BdHRyaWJ1dGVBcnJheSwgYWRkcmVzczJEKS5yZ2JhKTtcXFxcbn1cXFxcbnZlYzQgZ2V0RGF0YXVfQXR0cmlidXRlQXJyYXkoZmxvYXQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9BdHRyaWJ1dGVBcnJheShhZGRyVHJhbnNsYXRpb25fMUR0bzJEKGFkZHJlc3MxRCwgdV9BdHRyaWJ1dGVBcnJheVNpemUpKTtcXFxcbn1cXFxcbnZlYzQgZ2V0RGF0YXVfQXR0cmlidXRlQXJyYXkoaW50IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfQXR0cmlidXRlQXJyYXkoZmxvYXQoYWRkcmVzczFEKSk7XFxcXG59XFxcXG51bmlmb3JtIHNhbXBsZXIyRCB1X0NsdXN0ZXJDZW50ZXJzO1xcXFxudW5pZm9ybSB2ZWMyIHVfQ2x1c3RlckNlbnRlcnNTaXplO1xcXFxudmVjNCBnZXREYXRhdV9DbHVzdGVyQ2VudGVycyh2ZWMyIGFkZHJlc3MyRCkge1xcXFxuICByZXR1cm4gdmVjNCh0ZXh0dXJlMkQodV9DbHVzdGVyQ2VudGVycywgYWRkcmVzczJEKS5yZ2JhKTtcXFxcbn1cXFxcbnZlYzQgZ2V0RGF0YXVfQ2x1c3RlckNlbnRlcnMoZmxvYXQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9DbHVzdGVyQ2VudGVycyhhZGRyVHJhbnNsYXRpb25fMUR0bzJEKGFkZHJlc3MxRCwgdV9DbHVzdGVyQ2VudGVyc1NpemUpKTtcXFxcbn1cXFxcbnZlYzQgZ2V0RGF0YXVfQ2x1c3RlckNlbnRlcnMoaW50IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfQ2x1c3RlckNlbnRlcnMoZmxvYXQoYWRkcmVzczFEKSk7XFxcXG59XFxcXG52ZWMyIGNhbGNSZXB1bHNpdmUoaW50IGksIHZlYzQgY3VycmVudE5vZGUpIHtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLCAxLCAxKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMygxLCAxLCAxKTsgICAgIFxcXFxuaW50IGdsb2JhbEludm9jYXRpb25JbmRleCA9IGludChmbG9vcih2X1RleENvb3JkLnggKiB1X091dHB1dFRleHR1cmVTaXplLngpKVxcXFxuICArIGludChmbG9vcih2X1RleENvb3JkLnkgKiB1X091dHB1dFRleHR1cmVTaXplLnkpKSAqIGludCh1X091dHB1dFRleHR1cmVTaXplLngpO1xcXFxuaW50IHdvcmtHcm91cElETGVuZ3RoID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAqIHdvcmtHcm91cFNpemUueik7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy55IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWiA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWSA9IChnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpIC8gd29ya0dyb3VwU2l6ZS54O1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAtIGxvY2FsSW52b2NhdGlvbklEWSAqIHdvcmtHcm91cFNpemUueDtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMobG9jYWxJbnZvY2F0aW9uSURYLCBsb2NhbEludm9jYXRpb25JRFksIGxvY2FsSW52b2NhdGlvbklEWik7XFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSB3b3JrR3JvdXBJRCAqIHdvcmtHcm91cFNpemUgKyBsb2NhbEludm9jYXRpb25JRDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGxvY2FsSW52b2NhdGlvbklELnogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnlcXFxcbiAgICAgICAgICAgICAgICArIGxvY2FsSW52b2NhdGlvbklELnkgKiB3b3JrR3JvdXBTaXplLnggKyBsb2NhbEludm9jYXRpb25JRC54O1xcXFxuZmxvYXQgZHggPSAwLjA7XFxcXG5mbG9hdCBkeSA9IDAuMDtcXFxcbmZvciAoaW50IGogPSAwOyBqIDwgVkVSVEVYX0NPVU5UOyBqKyspIHtpZiAoaSAhPSBqKSB7dmVjNCBuZXh0Tm9kZSA9IGdldERhdGF1X0RhdGEoaik7XFxcXG5mbG9hdCB4RGlzdCA9IGN1cnJlbnROb2RlLnggLSBuZXh0Tm9kZS54O1xcXFxuZmxvYXQgeURpc3QgPSBjdXJyZW50Tm9kZS55IC0gbmV4dE5vZGUueTtcXFxcbmZsb2F0IGRpc3QgPSAoKHhEaXN0ICogeERpc3QpICsgKHlEaXN0ICogeURpc3QpKSArIDAuMDE7XFxcXG5mbG9hdCBwYXJhbSA9IHVfSzIgLyBkaXN0O1xcXFxuaWYgKGRpc3QgPiAwLjApIHtkeCArPSBwYXJhbSAqIHhEaXN0O1xcXFxuZHkgKz0gcGFyYW0gKiB5RGlzdDtcXFxcbmlmICgoeERpc3QgPT0gMC4wKSAmJiAoeURpc3QgPT0gMC4wKSkge2Zsb2F0IHNpZ24gPSAoaSA8IGopID8gKDEuMCkgOiAoLTEuMCk7XFxcXG5keCArPSBwYXJhbSAqIHNpZ247XFxcXG5keSArPSBwYXJhbSAqIHNpZ247fX19fVxcXFxucmV0dXJuIHZlYzIoZHgsIGR5KTt9XFxcXG52ZWMyIGNhbGNHcmF2aXR5KHZlYzQgY3VycmVudE5vZGUsIHZlYzQgbm9kZUF0dHJpYnV0ZXMpIHtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLCAxLCAxKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMygxLCAxLCAxKTsgICAgIFxcXFxuaW50IGdsb2JhbEludm9jYXRpb25JbmRleCA9IGludChmbG9vcih2X1RleENvb3JkLnggKiB1X091dHB1dFRleHR1cmVTaXplLngpKVxcXFxuICArIGludChmbG9vcih2X1RleENvb3JkLnkgKiB1X091dHB1dFRleHR1cmVTaXplLnkpKSAqIGludCh1X091dHB1dFRleHR1cmVTaXplLngpO1xcXFxuaW50IHdvcmtHcm91cElETGVuZ3RoID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAqIHdvcmtHcm91cFNpemUueik7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy55IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWiA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWSA9IChnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpIC8gd29ya0dyb3VwU2l6ZS54O1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAtIGxvY2FsSW52b2NhdGlvbklEWSAqIHdvcmtHcm91cFNpemUueDtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMobG9jYWxJbnZvY2F0aW9uSURYLCBsb2NhbEludm9jYXRpb25JRFksIGxvY2FsSW52b2NhdGlvbklEWik7XFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSB3b3JrR3JvdXBJRCAqIHdvcmtHcm91cFNpemUgKyBsb2NhbEludm9jYXRpb25JRDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGxvY2FsSW52b2NhdGlvbklELnogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnlcXFxcbiAgICAgICAgICAgICAgICArIGxvY2FsSW52b2NhdGlvbklELnkgKiB3b3JrR3JvdXBTaXplLnggKyBsb2NhbEludm9jYXRpb25JRC54O1xcXFxuZmxvYXQgZHggPSAwLjA7XFxcXG5mbG9hdCBkeSA9IDAuMDtcXFxcbmZsb2F0IHZ4ID0gY3VycmVudE5vZGUueCAtIHVfQ2VudGVyLng7XFxcXG5mbG9hdCB2eSA9IGN1cnJlbnROb2RlLnkgLSB1X0NlbnRlci55O1xcXFxuZmxvYXQgZ2YgPSAoMC4wMSAqIHVfSykgKiB1X0dyYXZpdHk7XFxcXG5keCA9IGdmICogdng7XFxcXG5keSA9IGdmICogdnk7XFxcXG5pZiAodV9DbHVzdGVyaW5nID09IDEuMCkge2ludCBjbHVzdGVySWR4ID0gaW50KG5vZGVBdHRyaWJ1dGVzLngpO1xcXFxudmVjNCBjZW50ZXIgPSBnZXREYXRhdV9DbHVzdGVyQ2VudGVycyhjbHVzdGVySWR4KTtcXFxcbmZsb2F0IGN2eCA9IGN1cnJlbnROb2RlLnggLSBjZW50ZXIueDtcXFxcbmZsb2F0IGN2eSA9IGN1cnJlbnROb2RlLnkgLSBjZW50ZXIueTtcXFxcbmZsb2F0IGRpc3QgPSBzcXJ0KChjdnggKiBjdngpICsgKGN2eSAqIGN2eSkpICsgMC4wMTtcXFxcbmZsb2F0IHBhcm1hID0gKHVfSyAqIHVfQ2x1c3RlckdyYXZpdHkpIC8gZGlzdDtcXFxcbmR4ICs9IHBhcm1hICogY3Z4O1xcXFxuZHkgKz0gcGFybWEgKiBjdnk7fVxcXFxucmV0dXJuIHZlYzIoZHgsIGR5KTt9XFxcXG52ZWMyIGNhbGNBdHRyYWN0aXZlKGludCBpLCB2ZWM0IGN1cnJlbnROb2RlKSB7XFxcXG5pdmVjMyB3b3JrR3JvdXBTaXplID0gaXZlYzMoMSwgMSwgMSk7XFxcXG5pdmVjMyBudW1Xb3JrR3JvdXBzID0gaXZlYzMoMSwgMSwgMSk7ICAgICBcXFxcbmludCBnbG9iYWxJbnZvY2F0aW9uSW5kZXggPSBpbnQoZmxvb3Iodl9UZXhDb29yZC54ICogdV9PdXRwdXRUZXh0dXJlU2l6ZS54KSlcXFxcbiAgKyBpbnQoZmxvb3Iodl9UZXhDb29yZC55ICogdV9PdXRwdXRUZXh0dXJlU2l6ZS55KSkgKiBpbnQodV9PdXRwdXRUZXh0dXJlU2l6ZS54KTtcXFxcbmludCB3b3JrR3JvdXBJRExlbmd0aCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkgKiB3b3JrR3JvdXBTaXplLnopO1xcXFxuaXZlYzMgd29ya0dyb3VwSUQgPSBpdmVjMyh3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueSAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy55KTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFogPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55KTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFkgPSAoZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55KSAvIHdvcmtHcm91cFNpemUueDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkgLSBsb2NhbEludm9jYXRpb25JRFkgKiB3b3JrR3JvdXBTaXplLng7XFxcXG5pdmVjMyBsb2NhbEludm9jYXRpb25JRCA9IGl2ZWMzKGxvY2FsSW52b2NhdGlvbklEWCwgbG9jYWxJbnZvY2F0aW9uSURZLCBsb2NhbEludm9jYXRpb25JRFopO1xcXFxuaXZlYzMgZ2xvYmFsSW52b2NhdGlvbklEID0gd29ya0dyb3VwSUQgKiB3b3JrR3JvdXBTaXplICsgbG9jYWxJbnZvY2F0aW9uSUQ7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSW5kZXggPSBsb2NhbEludm9jYXRpb25JRC56ICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55XFxcXG4gICAgICAgICAgICAgICAgKyBsb2NhbEludm9jYXRpb25JRC55ICogd29ya0dyb3VwU2l6ZS54ICsgbG9jYWxJbnZvY2F0aW9uSUQueDtcXFxcbmZsb2F0IGR4ID0gMC4wO1xcXFxuZmxvYXQgZHkgPSAwLjA7XFxcXG5pbnQgYXJyX29mZnNldCA9IGludChmbG9vcihjdXJyZW50Tm9kZS56ICsgMC41KSk7XFxcXG5pbnQgbGVuZ3RoID0gaW50KGZsb29yKGN1cnJlbnROb2RlLncgKyAwLjUpKTtcXFxcbnZlYzQgbm9kZV9idWZmZXI7XFxcXG5mb3IgKGludCBwID0gMDsgcCA8IE1BWF9FREdFX1BFUl9WRVJURVg7IHArKykge2lmIChwID49IGxlbmd0aCkge2JyZWFrO31cXFxcbmludCBhcnJfaWR4ID0gYXJyX29mZnNldCArIGludChwKTtcXFxcbmludCBidWZfb2Zmc2V0ID0gYXJyX2lkeCAtICgoYXJyX2lkeCAvIDQpICogNCk7XFxcXG5pZiAoKHAgPT0gMCkgfHwgKGJ1Zl9vZmZzZXQgPT0gMCkpIHtub2RlX2J1ZmZlciA9IGdldERhdGF1X0RhdGEoaW50KGFycl9pZHggLyA0KSk7fVxcXFxuZmxvYXQgZmxvYXRfaiA9IChidWZfb2Zmc2V0ID09IDApID8gKG5vZGVfYnVmZmVyLngpIDogKChidWZfb2Zmc2V0ID09IDEpID8gKG5vZGVfYnVmZmVyLnkpIDogKChidWZfb2Zmc2V0ID09IDIpID8gKG5vZGVfYnVmZmVyLnopIDogKG5vZGVfYnVmZmVyLncpKSk7XFxcXG52ZWM0IG5leHROb2RlID0gZ2V0RGF0YXVfRGF0YShpbnQoZmxvYXRfaikpO1xcXFxuZmxvYXQgeERpc3QgPSBjdXJyZW50Tm9kZS54IC0gbmV4dE5vZGUueDtcXFxcbmZsb2F0IHlEaXN0ID0gY3VycmVudE5vZGUueSAtIG5leHROb2RlLnk7XFxcXG5mbG9hdCBkaXN0ID0gc3FydCgoeERpc3QgKiB4RGlzdCkgKyAoeURpc3QgKiB5RGlzdCkpICsgMC4wMTtcXFxcbmZsb2F0IGF0dHJhY3RpdmVGID0gZGlzdCAvIHVfSztcXFxcbmlmIChkaXN0ID4gMC4wKSB7ZHggLT0geERpc3QgKiBhdHRyYWN0aXZlRjtcXFxcbmR5IC09IHlEaXN0ICogYXR0cmFjdGl2ZUY7XFxcXG5pZiAoKHhEaXN0ID09IDAuMCkgJiYgKHlEaXN0ID09IDAuMCkpIHtmbG9hdCBzaWduID0gKGkgPCBpbnQoZmxvYXRfaikpID8gKDEuMCkgOiAoLTEuMCk7XFxcXG5keCAtPSBzaWduICogYXR0cmFjdGl2ZUY7XFxcXG5keSAtPSBzaWduICogYXR0cmFjdGl2ZUY7fX19XFxcXG5yZXR1cm4gdmVjMihkeCwgZHkpO31cXFxcbnZvaWQgbWFpbigpIHtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLCAxLCAxKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMygxLCAxLCAxKTsgICAgIFxcXFxuaW50IGdsb2JhbEludm9jYXRpb25JbmRleCA9IGludChmbG9vcih2X1RleENvb3JkLnggKiB1X091dHB1dFRleHR1cmVTaXplLngpKVxcXFxuICArIGludChmbG9vcih2X1RleENvb3JkLnkgKiB1X091dHB1dFRleHR1cmVTaXplLnkpKSAqIGludCh1X091dHB1dFRleHR1cmVTaXplLngpO1xcXFxuaW50IHdvcmtHcm91cElETGVuZ3RoID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAqIHdvcmtHcm91cFNpemUueik7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy55IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWiA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWSA9IChnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpIC8gd29ya0dyb3VwU2l6ZS54O1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAtIGxvY2FsSW52b2NhdGlvbklEWSAqIHdvcmtHcm91cFNpemUueDtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMobG9jYWxJbnZvY2F0aW9uSURYLCBsb2NhbEludm9jYXRpb25JRFksIGxvY2FsSW52b2NhdGlvbklEWik7XFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSB3b3JrR3JvdXBJRCAqIHdvcmtHcm91cFNpemUgKyBsb2NhbEludm9jYXRpb25JRDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGxvY2FsSW52b2NhdGlvbklELnogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnlcXFxcbiAgICAgICAgICAgICAgICArIGxvY2FsSW52b2NhdGlvbklELnkgKiB3b3JrR3JvdXBTaXplLnggKyBsb2NhbEludm9jYXRpb25JRC54O1xcXFxuaW50IGkgPSBnbG9iYWxJbnZvY2F0aW9uSUQueDtcXFxcbnZlYzQgY3VycmVudE5vZGUgPSBnZXREYXRhdV9EYXRhKGkpO1xcXFxuZmxvYXQgZHggPSAwLjA7XFxcXG5mbG9hdCBkeSA9IDAuMDtcXFxcbmlmIChpID49IFZFUlRFWF9DT1VOVCkge2dsX0ZyYWdDb2xvciA9IHZlYzQoY3VycmVudE5vZGUpO1xcXFxucmV0dXJuIDt9XFxcXG52ZWMyIHJlcHVsc2l2ZSA9IGNhbGNSZXB1bHNpdmUoaSwgY3VycmVudE5vZGUpO1xcXFxuZHggKz0gcmVwdWxzaXZlLng7XFxcXG5keSArPSByZXB1bHNpdmUueTtcXFxcbnZlYzIgYXR0cmFjdGl2ZSA9IGNhbGNBdHRyYWN0aXZlKGksIGN1cnJlbnROb2RlKTtcXFxcbmR4ICs9IGF0dHJhY3RpdmUueDtcXFxcbmR5ICs9IGF0dHJhY3RpdmUueTtcXFxcbnZlYzQgbm9kZUF0dHJpYnV0ZXMgPSBnZXREYXRhdV9BdHRyaWJ1dGVBcnJheShpKTtcXFxcbnZlYzIgZ3Jhdml0eSA9IGNhbGNHcmF2aXR5KGN1cnJlbnROb2RlLCBub2RlQXR0cmlidXRlcyk7XFxcXG5keCAtPSBncmF2aXR5Lng7XFxcXG5keSAtPSBncmF2aXR5Lnk7XFxcXG5keCAqPSB1X1NwZWVkO1xcXFxuZHkgKj0gdV9TcGVlZDtcXFxcbmZsb2F0IGRpc3RMZW5ndGggPSBzcXJ0KChkeCAqIGR4KSArIChkeSAqIGR5KSk7XFxcXG5pZiAoZGlzdExlbmd0aCA+IDAuMCkge2Zsb2F0IGxpbWl0ZWREaXN0ID0gbWluKHVfTWF4RGlzcGxhY2UgKiB1X1NwZWVkLCBkaXN0TGVuZ3RoKTtcXFxcbmdsX0ZyYWdDb2xvciA9IHZlYzQodmVjNChjdXJyZW50Tm9kZS54ICsgKChkeCAvIGRpc3RMZW5ndGgpICogbGltaXRlZERpc3QpLCBjdXJyZW50Tm9kZS55ICsgKChkeSAvIGRpc3RMZW5ndGgpICogbGltaXRlZERpc3QpLCBjdXJyZW50Tm9kZS56LCBjdXJyZW50Tm9kZS53KSk7fWlmIChnV2ViR1BVRGVidWcpIHtcXFxcbiAgZ2xfRnJhZ0NvbG9yID0gZ1dlYkdQVURlYnVnT3V0cHV0O1xcXFxufX1cXFxcblwifSxcImNvbnRleHRcIjp7XCJuYW1lXCI6XCJcIixcImRpc3BhdGNoXCI6WzEsMSwxXSxcInRocmVhZEdyb3VwU2l6ZVwiOlsxLDEsMV0sXCJtYXhJdGVyYXRpb25cIjoxLFwiZGVmaW5lc1wiOlt7XCJuYW1lXCI6XCJNQVhfRURHRV9QRVJfVkVSVEVYXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwicnVudGltZVwiOnRydWV9LHtcIm5hbWVcIjpcIlZFUlRFWF9DT1VOVFwiLFwidHlwZVwiOlwiRmxvYXRcIixcInJ1bnRpbWVcIjp0cnVlfV0sXCJ1bmlmb3Jtc1wiOlt7XCJuYW1lXCI6XCJ1X0RhdGFcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6ZmFsc2UsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9LXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9LMlwiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfQ2VudGVyXCIsXCJ0eXBlXCI6XCJ2ZWMyPGYzMj5cIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfR3Jhdml0eVwiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfQ2x1c3RlckdyYXZpdHlcIixcInR5cGVcIjpcIkZsb2F0XCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlVuaWZvcm1cIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X1NwZWVkXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9NYXhEaXNwbGFjZVwiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfQ2x1c3RlcmluZ1wiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfQXR0cmlidXRlQXJyYXlcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X0NsdXN0ZXJDZW50ZXJzXCIsXCJ0eXBlXCI6XCJ2ZWM0PGYzMj5bXVwiLFwic3RvcmFnZUNsYXNzXCI6XCJTdG9yYWdlQnVmZmVyXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX1dLFwiZ2xvYmFsRGVjbGFyYXRpb25zXCI6W10sXCJvdXRwdXRcIjp7XCJuYW1lXCI6XCJ1X0RhdGFcIixcInNpemVcIjpbMSwxXSxcImxlbmd0aFwiOjF9LFwibmVlZFBpbmdwb25nXCI6dHJ1ZX19Jykuc2V0RGlzcGF0Y2goW3ksMSwxXSkuc2V0QmluZGluZyh7dV9EYXRhOngsdV9LOmwsdV9LMjpmLHVfR3Jhdml0eTpyLmdyYXZpdHksdV9DbHVzdGVyR3Jhdml0eTpyLmNsdXN0ZXJHcmF2aXR5fHxyLmdyYXZpdHl8fDEsdV9TcGVlZDpoLHVfTWF4RGlzcGxhY2U6Yyx1X0NsdXN0ZXJpbmc6ZD8xOjAsdV9DZW50ZXI6cyx1X0F0dHJpYnV0ZUFycmF5OmcsdV9DbHVzdGVyQ2VudGVyczpfLE1BWF9FREdFX1BFUl9WRVJURVg6YixWRVJURVhfQ09VTlQ6eX0pLGQmJihNPVMuY3JlYXRlS2VybmVsKCd7XCJzaGFkZXJzXCI6e1wiV0dTTFwiOlwiaW1wb3J0IFxcXFxcIkdMU0wuc3RkLjQ1MFxcXFxcIiBhcyBzdGQ7XFxcXG5cXFxcblxcXFxuIyB2YXIgZ1dlYkdQVURlYnVnIDogYm9vbCA9IGZhbHNlO1xcXFxuIyB2YXIgZ1dlYkdQVURlYnVnT3V0cHV0IDogdmVjNDxmMzI+ID0gdmVjNDxmMzI+KDAuMCk7XFxcXG5cXFxcbltbYnVpbHRpbiBnbG9iYWxfaW52b2NhdGlvbl9pZF1dIHZhcjxpbj4gZ2xvYmFsSW52b2NhdGlvbklEIDogdmVjMzx1MzI+O1xcXFxuIyBbW2J1aWx0aW4gd29ya19ncm91cF9zaXplXV0gdmFyPGluPiB3b3JrR3JvdXBTaXplIDogdmVjMzx1MzI+O1xcXFxuIyBbW2J1aWx0aW4gd29ya19ncm91cF9pZF1dIHZhcjxpbj4gd29ya0dyb3VwSUQgOiB2ZWMzPHUzMj47XFxcXG5bW2J1aWx0aW4gbG9jYWxfaW52b2NhdGlvbl9pZF1dIHZhcjxpbj4gbG9jYWxJbnZvY2F0aW9uSUQgOiB2ZWMzPHUzMj47XFxcXG4jIFtbYnVpbHRpbiBudW1fd29ya19ncm91cHNdXSB2YXI8aW4+IG51bVdvcmtHcm91cHMgOiB2ZWMzPHUzMj47XFxcXG5bW2J1aWx0aW4gbG9jYWxfaW52b2NhdGlvbl9pZHhdXSB2YXI8aW4+IGxvY2FsSW52b2NhdGlvbkluZGV4IDogdTMyO1xcXFxuXFxcXG5cXFxcbnR5cGUgR1dlYkdQVUJ1ZmZlcjAgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfRGF0YSA6IFtbc3RyaWRlIDE2XV0gYXJyYXk8dmVjNDxmMzI+PjtcXFxcbn07XFxcXG5bW2JpbmRpbmcgMCwgc2V0IDBdXSB2YXI8c3RvcmFnZV9idWZmZXI+IGdXZWJHUFVCdWZmZXIwIDogR1dlYkdQVUJ1ZmZlcjA7XFxcXG50eXBlIEdXZWJHUFVCdWZmZXIxID0gW1tibG9ja11dIHN0cnVjdCB7XFxcXG4gIFtbb2Zmc2V0IDBdXSB1X05vZGVBdHRyaWJ1dGVzIDogW1tzdHJpZGUgMTZdXSBhcnJheTx2ZWM0PGYzMj4+O1xcXFxufTtcXFxcbltbYmluZGluZyAxLCBzZXQgMF1dIHZhcjxzdG9yYWdlX2J1ZmZlcj4gZ1dlYkdQVUJ1ZmZlcjEgOiBHV2ViR1BVQnVmZmVyMTtcXFxcbnR5cGUgR1dlYkdQVUJ1ZmZlcjIgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfQ2x1c3RlckNlbnRlcnMgOiBbW3N0cmlkZSAxNl1dIGFycmF5PHZlYzQ8ZjMyPj47XFxcXG59O1xcXFxuW1tiaW5kaW5nIDIsIHNldCAwXV0gdmFyPHN0b3JhZ2VfYnVmZmVyPiBnV2ViR1BVQnVmZmVyMiA6IEdXZWJHUFVCdWZmZXIyO1xcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuZm4gbWFpbigpIC0+IHZvaWQge3ZhciBpIDogaTMyID0gZ2xvYmFsSW52b2NhdGlvbklELng7XFxcXG52YXIgY2VudGVyIDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjIudV9DbHVzdGVyQ2VudGVyc1tpXTtcXFxcbnZhciBzdW14IDogZjMyID0gMC4wO1xcXFxudmFyIHN1bXkgOiBmMzIgPSAwLjA7XFxcXG52YXIgY291bnQgOiBmMzIgPSAwLjA7XFxcXG5mb3IgKHZhciBqIDogaTMyID0gMDsgaiA8IF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UOyBqID0gaiArIDEpIHt2YXIgYXR0cmlidXRlcyA6IHZlYzQ8ZjMyPiA9IGdXZWJHUFVCdWZmZXIxLnVfTm9kZUF0dHJpYnV0ZXNbal07XFxcXG52YXIgY2x1c3RlcklkeCA6IGkzMiA9IGkzMihhdHRyaWJ1dGVzLngpO1xcXFxudmFyIHZlcnRleCA6IHZlYzQ8ZjMyPiA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtqXTtcXFxcbmlmIChjbHVzdGVySWR4ID09IGkpIHtzdW14ID0gc3VteCArIHZlcnRleC54O1xcXFxuc3VteSA9IHN1bXkgKyB2ZXJ0ZXgueTtcXFxcbmNvdW50ID0gY291bnQgKyAxLjA7fX1cXFxcbmdXZWJHUFVCdWZmZXIyLnVfQ2x1c3RlckNlbnRlcnNbaV0gPSB2ZWM0PGYzMj4oc3VteCAvIGNvdW50LCBzdW15IC8gY291bnQsIGNvdW50LCBpKTtcXFxcbnJldHVybjt9XFxcXG5cXFxcbmVudHJ5X3BvaW50IGNvbXB1dGUgYXMgXFxcXFwibWFpblxcXFxcIiA9IG1haW47XFxcXG5cIixcIkdMU0w0NTBcIjpcIlxcXFxuXFxcXG5cXFxcbmJvb2wgZ1dlYkdQVURlYnVnID0gZmFsc2U7XFxcXG52ZWM0IGdXZWJHUFVEZWJ1Z091dHB1dCA9IHZlYzQoMC4wKTtcXFxcblxcXFxuaXZlYzMgZ2xvYmFsSW52b2NhdGlvbklEID0gaXZlYzMoZ2xfR2xvYmFsSW52b2NhdGlvbklEKTtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLDEsMSk7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKGdsX1dvcmtHcm91cElEKTtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMoZ2xfTG9jYWxJbnZvY2F0aW9uSUQpO1xcXFxuaXZlYzMgbnVtV29ya0dyb3VwcyA9IGl2ZWMzKGdsX051bVdvcmtHcm91cHMpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbkluZGV4ID0gaW50KGdsX0xvY2FsSW52b2NhdGlvbkluZGV4KTtcXFxcblxcXFxuXFxcXG5sYXlvdXQoc3RkNDMwLCBzZXQgPSAwLCBiaW5kaW5nID0gMCkgYnVmZmVyIHJlYWRvbmx5ICBHV2ViR1BVQnVmZmVyMCB7XFxcXG4gIHZlYzQgdV9EYXRhW107XFxcXG59IGdXZWJHUFVCdWZmZXIwO1xcXFxuXFxcXG5sYXlvdXQoc3RkNDMwLCBzZXQgPSAwLCBiaW5kaW5nID0gMSkgYnVmZmVyIHJlYWRvbmx5ICBHV2ViR1BVQnVmZmVyMSB7XFxcXG4gIHZlYzQgdV9Ob2RlQXR0cmlidXRlc1tdO1xcXFxufSBnV2ViR1BVQnVmZmVyMTtcXFxcblxcXFxubGF5b3V0KHN0ZDQzMCwgc2V0ID0gMCwgYmluZGluZyA9IDIpIGJ1ZmZlciAgIEdXZWJHUFVCdWZmZXIyIHtcXFxcbiAgdmVjNCB1X0NsdXN0ZXJDZW50ZXJzW107XFxcXG59IGdXZWJHUFVCdWZmZXIyO1xcXFxuXFxcXG5cXFxcblxcXFxuI2RlZmluZSBWRVJURVhfQ09VTlQgX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlRcXFxcbiNkZWZpbmUgQ0xVU1RFUl9DT1VOVCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX0NMVVNURVJfQ09VTlRcXFxcbmxheW91dCAoXFxcXG4gIGxvY2FsX3NpemVfeCA9IDEsXFxcXG4gIGxvY2FsX3NpemVfeSA9IDEsXFxcXG4gIGxvY2FsX3NpemVfeiA9IDFcXFxcbikgaW47XFxcXG5cXFxcblxcXFxuXFxcXG52b2lkIG1haW4oKSB7aW50IGkgPSBnbG9iYWxJbnZvY2F0aW9uSUQueDtcXFxcbnZlYzQgY2VudGVyID0gZ1dlYkdQVUJ1ZmZlcjIudV9DbHVzdGVyQ2VudGVyc1tpXTtcXFxcbmZsb2F0IHN1bXggPSAwLjA7XFxcXG5mbG9hdCBzdW15ID0gMC4wO1xcXFxuZmxvYXQgY291bnQgPSAwLjA7XFxcXG5mb3IgKGludCBqID0gMDsgaiA8IFZFUlRFWF9DT1VOVDsgaisrKSB7dmVjNCBhdHRyaWJ1dGVzID0gZ1dlYkdQVUJ1ZmZlcjEudV9Ob2RlQXR0cmlidXRlc1tqXTtcXFxcbmludCBjbHVzdGVySWR4ID0gaW50KGF0dHJpYnV0ZXMueCk7XFxcXG52ZWM0IHZlcnRleCA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtqXTtcXFxcbmlmIChjbHVzdGVySWR4ID09IGkpIHtzdW14ICs9IHZlcnRleC54O1xcXFxuc3VteSArPSB2ZXJ0ZXgueTtcXFxcbmNvdW50ICs9IDEuMDt9fVxcXFxuZ1dlYkdQVUJ1ZmZlcjIudV9DbHVzdGVyQ2VudGVyc1tpXSA9IHZlYzQoc3VteCAvIGNvdW50LCBzdW15IC8gY291bnQsIGNvdW50LCBpKTt9XFxcXG5cIixcIkdMU0wxMDBcIjpcIlxcXFxuXFxcXG5mbG9hdCBlcHNpbG9uID0gMC4wMDAwMTtcXFxcbnZlYzIgYWRkclRyYW5zbGF0aW9uXzFEdG8yRChmbG9hdCBhZGRyZXNzMUQsIHZlYzIgdGV4U2l6ZSkge1xcXFxuICB2ZWMyIGNvbnZfY29uc3QgPSB2ZWMyKDEuMCAvIHRleFNpemUueCwgMS4wIC8gKHRleFNpemUueCAqIHRleFNpemUueSkpO1xcXFxuICB2ZWMyIG5vcm1BZGRyMkQgPSBmbG9hdChhZGRyZXNzMUQpICogY29udl9jb25zdDtcXFxcbiAgcmV0dXJuIHZlYzIoZnJhY3Qobm9ybUFkZHIyRC54ICsgZXBzaWxvbiksIG5vcm1BZGRyMkQueSk7XFxcXG59XFxcXG5cXFxcbnZvaWQgYmFycmllcigpIHt9XFxcXG4gIFxcXFxuXFxcXG51bmlmb3JtIHZlYzIgdV9PdXRwdXRUZXh0dXJlU2l6ZTtcXFxcbnVuaWZvcm0gaW50IHVfT3V0cHV0VGV4ZWxDb3VudDtcXFxcbnZhcnlpbmcgdmVjMiB2X1RleENvb3JkO1xcXFxuXFxcXG5ib29sIGdXZWJHUFVEZWJ1ZyA9IGZhbHNlO1xcXFxudmVjNCBnV2ViR1BVRGVidWdPdXRwdXQgPSB2ZWM0KDAuMCk7XFxcXG5cXFxcbiNkZWZpbmUgVkVSVEVYX0NPVU5UIF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UXFxcXG4jZGVmaW5lIENMVVNURVJfQ09VTlQgX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19DTFVTVEVSX0NPVU5UXFxcXG5cXFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfRGF0YTtcXFxcbnVuaWZvcm0gdmVjMiB1X0RhdGFTaXplO1xcXFxudmVjNCBnZXREYXRhdV9EYXRhKHZlYzIgYWRkcmVzczJEKSB7XFxcXG4gIHJldHVybiB2ZWM0KHRleHR1cmUyRCh1X0RhdGEsIGFkZHJlc3MyRCkucmdiYSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0RhdGEoZmxvYXQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9EYXRhKGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoYWRkcmVzczFELCB1X0RhdGFTaXplKSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0RhdGEoaW50IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfRGF0YShmbG9hdChhZGRyZXNzMUQpKTtcXFxcbn1cXFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfTm9kZUF0dHJpYnV0ZXM7XFxcXG51bmlmb3JtIHZlYzIgdV9Ob2RlQXR0cmlidXRlc1NpemU7XFxcXG52ZWM0IGdldERhdGF1X05vZGVBdHRyaWJ1dGVzKHZlYzIgYWRkcmVzczJEKSB7XFxcXG4gIHJldHVybiB2ZWM0KHRleHR1cmUyRCh1X05vZGVBdHRyaWJ1dGVzLCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9Ob2RlQXR0cmlidXRlcyhmbG9hdCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X05vZGVBdHRyaWJ1dGVzKGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoYWRkcmVzczFELCB1X05vZGVBdHRyaWJ1dGVzU2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9Ob2RlQXR0cmlidXRlcyhpbnQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9Ob2RlQXR0cmlidXRlcyhmbG9hdChhZGRyZXNzMUQpKTtcXFxcbn1cXFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfQ2x1c3RlckNlbnRlcnM7XFxcXG51bmlmb3JtIHZlYzIgdV9DbHVzdGVyQ2VudGVyc1NpemU7XFxcXG52ZWM0IGdldERhdGF1X0NsdXN0ZXJDZW50ZXJzKHZlYzIgYWRkcmVzczJEKSB7XFxcXG4gIHJldHVybiB2ZWM0KHRleHR1cmUyRCh1X0NsdXN0ZXJDZW50ZXJzLCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9DbHVzdGVyQ2VudGVycyhmbG9hdCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0NsdXN0ZXJDZW50ZXJzKGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoYWRkcmVzczFELCB1X0NsdXN0ZXJDZW50ZXJzU2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9DbHVzdGVyQ2VudGVycyhpbnQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9DbHVzdGVyQ2VudGVycyhmbG9hdChhZGRyZXNzMUQpKTtcXFxcbn1cXFxcbnZvaWQgbWFpbigpIHtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLCAxLCAxKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMygxLCAxLCAxKTsgICAgIFxcXFxuaW50IGdsb2JhbEludm9jYXRpb25JbmRleCA9IGludChmbG9vcih2X1RleENvb3JkLnggKiB1X091dHB1dFRleHR1cmVTaXplLngpKVxcXFxuICArIGludChmbG9vcih2X1RleENvb3JkLnkgKiB1X091dHB1dFRleHR1cmVTaXplLnkpKSAqIGludCh1X091dHB1dFRleHR1cmVTaXplLngpO1xcXFxuaW50IHdvcmtHcm91cElETGVuZ3RoID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAqIHdvcmtHcm91cFNpemUueik7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy55IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWiA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWSA9IChnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpIC8gd29ya0dyb3VwU2l6ZS54O1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAtIGxvY2FsSW52b2NhdGlvbklEWSAqIHdvcmtHcm91cFNpemUueDtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMobG9jYWxJbnZvY2F0aW9uSURYLCBsb2NhbEludm9jYXRpb25JRFksIGxvY2FsSW52b2NhdGlvbklEWik7XFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSB3b3JrR3JvdXBJRCAqIHdvcmtHcm91cFNpemUgKyBsb2NhbEludm9jYXRpb25JRDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGxvY2FsSW52b2NhdGlvbklELnogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnlcXFxcbiAgICAgICAgICAgICAgICArIGxvY2FsSW52b2NhdGlvbklELnkgKiB3b3JrR3JvdXBTaXplLnggKyBsb2NhbEludm9jYXRpb25JRC54O1xcXFxuaW50IGkgPSBnbG9iYWxJbnZvY2F0aW9uSUQueDtcXFxcbnZlYzQgY2VudGVyID0gZ2V0RGF0YXVfQ2x1c3RlckNlbnRlcnMoaSk7XFxcXG5mbG9hdCBzdW14ID0gMC4wO1xcXFxuZmxvYXQgc3VteSA9IDAuMDtcXFxcbmZsb2F0IGNvdW50ID0gMC4wO1xcXFxuZm9yIChpbnQgaiA9IDA7IGogPCBWRVJURVhfQ09VTlQ7IGorKykge3ZlYzQgYXR0cmlidXRlcyA9IGdldERhdGF1X05vZGVBdHRyaWJ1dGVzKGopO1xcXFxuaW50IGNsdXN0ZXJJZHggPSBpbnQoYXR0cmlidXRlcy54KTtcXFxcbnZlYzQgdmVydGV4ID0gZ2V0RGF0YXVfRGF0YShqKTtcXFxcbmlmIChjbHVzdGVySWR4ID09IGkpIHtzdW14ICs9IHZlcnRleC54O1xcXFxuc3VteSArPSB2ZXJ0ZXgueTtcXFxcbmNvdW50ICs9IDEuMDt9fVxcXFxuZ2xfRnJhZ0NvbG9yID0gdmVjNCh2ZWM0KHN1bXggLyBjb3VudCwgc3VteSAvIGNvdW50LCBjb3VudCwgaSkpO2lmIChnV2ViR1BVRGVidWcpIHtcXFxcbiAgZ2xfRnJhZ0NvbG9yID0gZ1dlYkdQVURlYnVnT3V0cHV0O1xcXFxufX1cXFxcblwifSxcImNvbnRleHRcIjp7XCJuYW1lXCI6XCJcIixcImRpc3BhdGNoXCI6WzEsMSwxXSxcInRocmVhZEdyb3VwU2l6ZVwiOlsxLDEsMV0sXCJtYXhJdGVyYXRpb25cIjoxLFwiZGVmaW5lc1wiOlt7XCJuYW1lXCI6XCJWRVJURVhfQ09VTlRcIixcInR5cGVcIjpcIkZsb2F0XCIsXCJydW50aW1lXCI6dHJ1ZX0se1wibmFtZVwiOlwiQ0xVU1RFUl9DT1VOVFwiLFwidHlwZVwiOlwiRmxvYXRcIixcInJ1bnRpbWVcIjp0cnVlfV0sXCJ1bmlmb3Jtc1wiOlt7XCJuYW1lXCI6XCJ1X0RhdGFcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X05vZGVBdHRyaWJ1dGVzXCIsXCJ0eXBlXCI6XCJ2ZWM0PGYzMj5bXVwiLFwic3RvcmFnZUNsYXNzXCI6XCJTdG9yYWdlQnVmZmVyXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9DbHVzdGVyQ2VudGVyc1wiLFwidHlwZVwiOlwidmVjNDxmMzI+W11cIixcInN0b3JhZ2VDbGFzc1wiOlwiU3RvcmFnZUJ1ZmZlclwiLFwicmVhZG9ubHlcIjpmYWxzZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfV0sXCJnbG9iYWxEZWNsYXJhdGlvbnNcIjpbXSxcIm91dHB1dFwiOntcIm5hbWVcIjpcInVfQ2x1c3RlckNlbnRlcnNcIixcInNpemVcIjpbMSwxXSxcImxlbmd0aFwiOjF9LFwibmVlZFBpbmdwb25nXCI6dHJ1ZX19Jykuc2V0RGlzcGF0Y2goW3YsMSwxXSkuc2V0QmluZGluZyh7dV9EYXRhOngsdV9Ob2RlQXR0cmlidXRlczpnLHVfQ2x1c3RlckNlbnRlcnM6XyxWRVJURVhfQ09VTlQ6eSxDTFVTVEVSX0NPVU5UOnZ9KSksQT1mdW5jdGlvbigpe3JldHVybiB5aChULHZvaWQgMCx2b2lkIDAscmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgcixvO3JldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcCgoZnVuY3Rpb24obil7Zm9yKDs7KXN3aXRjaChuLnByZXY9bi5uZXh0KXtjYXNlIDA6cj0wO2Nhc2UgMTppZighKHI8YSkpe24ubmV4dD0xMzticmVha31yZXR1cm4gbi5uZXh0PTQsay5leGVjdXRlKCk7Y2FzZSA0OmlmKCFkKXtuLm5leHQ9OTticmVha31yZXR1cm4gTS5zZXRCaW5kaW5nKHt1X0RhdGE6a30pLG4ubmV4dD04LE0uZXhlY3V0ZSgpO2Nhc2UgODprLnNldEJpbmRpbmcoe3VfQ2x1c3RlckNlbnRlcnM6TX0pO2Nhc2UgOTprLnNldEJpbmRpbmcoe3VfTWF4RGlzcGxhY2U6Yyo9Ljk5fSk7Y2FzZSAxMDpyKyssbi5uZXh0PTE7YnJlYWs7Y2FzZSAxMzpyZXR1cm4gbi5uZXh0PTE1LGsuZ2V0T3V0cHV0KCk7Y2FzZSAxNTpvPW4uc2VudCx0P2UucG9zdE1lc3NhZ2Uoe3R5cGU6d2ksdmVydGV4RWRnZURhdGE6b30pOmkuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgbj1vWzQqZV0scj1vWzQqZSsxXTt0Lng9bix0Lnk9cn0pKSxFJiZFKCk7Y2FzZSAxODpjYXNlXCJlbmRcIjpyZXR1cm4gbi5zdG9wKCl9fSksbil9KSkpfSxuLm5leHQ9MjQsQSgpO2Nhc2UgMjQ6Y2FzZVwiZW5kXCI6cmV0dXJuIG4uc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleTpcImdldFR5cGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblwiZnJ1Y2h0ZXJtYW4tZ3B1XCJ9fV0pJiZoaChlLnByb3RvdHlwZSxuKSxyJiZoaChlLHIpLG99KFFuKTtmdW5jdGlvbiBiaCh0KXtyZXR1cm4oYmg9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIHhoKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiB3aCh0LGUpe3JldHVybih3aD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gU2godCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1faCh0KTtpZihlKXt2YXIgaT1faCh0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gRWgodGhpcyxuKX19ZnVuY3Rpb24gRWgodCxlKXtyZXR1cm4hZXx8XCJvYmplY3RcIiE9PWJoKGUpJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP2Z1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiB0fSh0KTplfWZ1bmN0aW9uIF9oKHQpe3JldHVybihfaD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9dmFyIE9oPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIGEodCl7dHJ5e3Uoci5uZXh0KHQpKX1jYXRjaCh0KXtvKHQpfX1mdW5jdGlvbiBzKHQpe3RyeXt1KHIudGhyb3codCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHUodCl7dmFyIGU7dC5kb25lP2kodC52YWx1ZSk6KGU9dC52YWx1ZSxlIGluc3RhbmNlb2Ygbj9lOm5ldyBuKChmdW5jdGlvbih0KXt0KGUpfSkpKS50aGVuKGEscyl9dSgocj1yLmFwcGx5KHQsZXx8W10pKS5uZXh0KCkpfSkpfSxraD1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJndoKHQsZSl9KG8sdCk7dmFyIGUsbixyLGk9U2gobyk7ZnVuY3Rpb24gbyh0KXt2YXIgZTtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLG8pLChlPWkuY2FsbCh0aGlzKSkubWF4SXRlcmF0aW9uPTFlMyxlLmVkZ2VTdHJlbmd0aD0yMDAsZS5ub2RlU3RyZW5ndGg9MWUzLGUuY291bG9tYkRpc1NjYWxlPS4wMDUsZS5kYW1waW5nPS45LGUubWF4U3BlZWQ9MWUzLGUubWluTW92ZW1lbnQ9MSxlLmludGVydmFsPS4wMixlLmZhY3Rvcj0xLGUubGlua0Rpc3RhbmNlPTEsZS5ncmF2aXR5PTEwLGUud29ya2VyRW5hYmxlZD0hMSxlLm5vZGVzPVtdLGUuZWRnZXM9W10sZS53aWR0aD0zMDAsZS5oZWlnaHQ9MzAwLGUubm9kZU1hcD17fSxlLm5vZGVJZHhNYXA9e30sZS51cGRhdGVDZmcodCksZX1yZXR1cm4gZT1vLChuPVt7a2V5OlwiZ2V0RGVmYXVsdENmZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue21heEl0ZXJhdGlvbjoyZTMsZ3Jhdml0eToxMCxjbHVzdGVyaW5nOiExLGNsdXN0ZXJHcmF2aXR5OjEwfX19LHtrZXk6XCJleGVjdXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gT2godGhpcyx2b2lkIDAsdm9pZCAwLHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIGUsbixyLGksbztyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmlmKChuPShlPXRoaXMpLm5vZGVzKSYmMCE9PW4ubGVuZ3RoKXt0Lm5leHQ9NTticmVha31yZXR1cm4gZS5vbkxheW91dEVuZCYmZS5vbkxheW91dEVuZCgpLHQuYWJydXB0KFwicmV0dXJuXCIpO2Nhc2UgNTppZihlLndpZHRofHxcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwoZS53aWR0aD13aW5kb3cuaW5uZXJXaWR0aCksZS5oZWlnaHR8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fChlLmhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHQpLGUuY2VudGVyfHwoZS5jZW50ZXI9W2Uud2lkdGgvMixlLmhlaWdodC8yXSkscj1lLmNlbnRlciwxIT09bi5sZW5ndGgpe3QubmV4dD0xNDticmVha31yZXR1cm4gblswXS54PXJbMF0sblswXS55PXJbMV0sZS5vbkxheW91dEVuZCYmZS5vbkxheW91dEVuZCgpLHQuYWJydXB0KFwicmV0dXJuXCIpO2Nhc2UgMTQ6cmV0dXJuIGk9e30sbz17fSxuLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7VW4odC54KXx8KHQueD1NYXRoLnJhbmRvbSgpKmUud2lkdGgpLFVuKHQueSl8fCh0Lnk9TWF0aC5yYW5kb20oKSplLmhlaWdodCksaVt0LmlkXT10LG9bdC5pZF09bn0pKSxlLm5vZGVNYXA9aSxlLm5vZGVJZHhNYXA9byxlLm5vZGVTdHJlbmd0aD1haChlLm5vZGVTdHJlbmd0aCwxKSxlLmVkZ2VTdHJlbmd0aD1haChlLmVkZ2VTdHJlbmd0aCwxKSx0Lm5leHQ9MjMsZS5ydW4oKTtjYXNlIDIzOmNhc2VcImVuZFwiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6XCJleGVjdXRlV2l0aFdvcmtlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPW4ubm9kZXMsaT1uLmNlbnRlcjtpZihyJiYwIT09ci5sZW5ndGgpe2lmKDE9PT1yLmxlbmd0aClyZXR1cm4gclswXS54PWlbMF0sdm9pZChyWzBdLnk9aVsxXSk7dmFyIG89e30sYT17fTtyLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7VW4odC54KXx8KHQueD1NYXRoLnJhbmRvbSgpKm4ud2lkdGgpLFVuKHQueSl8fCh0Lnk9TWF0aC5yYW5kb20oKSpuLmhlaWdodCksb1t0LmlkXT10LGFbdC5pZF09ZX0pKSxuLm5vZGVNYXA9byxuLm5vZGVJZHhNYXA9YSxuLm5vZGVTdHJlbmd0aD1haChuLm5vZGVTdHJlbmd0aCwxKSxuLmVkZ2VTdHJlbmd0aD1haChuLmVkZ2VTdHJlbmd0aCwxKSxuLnJ1bih0LGUpfX19LHtrZXk6XCJydW5cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBPaCh0aGlzLHZvaWQgMCx2b2lkIDAscmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgcixpLG8sYSxzLHUsYyxmLGwsaCxkLHAsZyx2LHksbSxiLHgsdyxTLEUsXyxPLGssTSxBPXRoaXM7cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihuKXtmb3IoOzspc3dpdGNoKG4ucHJldj1uLm5leHQpe2Nhc2UgMDpmb3IoaT0ocj10aGlzKS5ub2RlcyxvPXIuZWRnZXMsYT1yLm1heEl0ZXJhdGlvbixyLndpZHRofHxcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwoci53aWR0aD13aW5kb3cuaW5uZXJXaWR0aCksci5oZWlnaHR8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fChyLmhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHQpLHM9aS5sZW5ndGgsci5saW5rRGlzdGFuY2U9YWgoci5saW5rRGlzdGFuY2UpLHIuZWRnZVN0cmVuZ3RoPWFoKHIuZWRnZVN0cmVuZ3RoKSx1PXVoKGksbyxyLmxpbmtEaXN0YW5jZSxyLmVkZ2VTdHJlbmd0aCksYz11Lm1heEVkZ2VQZXJWZXRleCxmPXUuYXJyYXksci5kZWdyZWVzPVZuKGkubGVuZ3RoLHIubm9kZUlkeE1hcCxvKSxsPVtdLGg9W10sZD1bXSxwPVtdLGc9W10sci5nZXRNYXNzfHwoci5nZXRNYXNzPWZ1bmN0aW9uKHQpe3JldHVybiByLmRlZ3JlZXNbci5ub2RlSWR4TWFwW3QuaWRdXXx8MX0pLHY9ci5ncmF2aXR5LHk9ci5jZW50ZXIsaS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe2wucHVzaChyLmdldE1hc3ModCkpLGgucHVzaChyLm5vZGVTdHJlbmd0aCh0KSksci5kZWdyZWVzW2VdfHwoci5kZWdyZWVzW2VdPTApO3ZhciBuPVt5WzBdLHlbMV0sdl07aWYoci5nZXRDZW50ZXIpe3ZhciBpPXIuZ2V0Q2VudGVyKHQsci5kZWdyZWVzW2VdKTtpJiZVbihpWzBdKSYmVW4oaVsxXSkmJlVuKGlbMl0pJiYobj1pKX1kLnB1c2goblswXSkscC5wdXNoKG5bMV0pLGcucHVzaChuWzJdKX0pKSxtPWZoKFtsLHIuZGVncmVlcyxoXSksYj1maChbZCxwLGddKSx4PXIud29ya2VyRW5hYmxlZCx3PXg/b2guY3JlYXRlKHtjYW52YXM6dCxlbmdpbmVPcHRpb25zOntzdXBwb3J0Q29tcHV0ZTohMH19KTpvaC5jcmVhdGUoe2VuZ2luZU9wdGlvbnM6e3N1cHBvcnRDb21wdXRlOiEwfX0pLFM9ci5vbkxheW91dEVuZCxFPVtdLGYuZm9yRWFjaCgoZnVuY3Rpb24odCl7RS5wdXNoKHQpfSkpLF89MDtfPDQ7XysrKUUucHVzaCgwKTtyZXR1cm4gTz13LmNyZWF0ZUtlcm5lbCgne1wic2hhZGVyc1wiOntcIldHU0xcIjpcImltcG9ydCBcXFxcXCJHTFNMLnN0ZC40NTBcXFxcXCIgYXMgc3RkO1xcXFxuXFxcXG5cXFxcbiMgdmFyIGdXZWJHUFVEZWJ1ZyA6IGJvb2wgPSBmYWxzZTtcXFxcbiMgdmFyIGdXZWJHUFVEZWJ1Z091dHB1dCA6IHZlYzQ8ZjMyPiA9IHZlYzQ8ZjMyPigwLjApO1xcXFxuXFxcXG5bW2J1aWx0aW4gZ2xvYmFsX2ludm9jYXRpb25faWRdXSB2YXI8aW4+IGdsb2JhbEludm9jYXRpb25JRCA6IHZlYzM8dTMyPjtcXFxcbiMgW1tidWlsdGluIHdvcmtfZ3JvdXBfc2l6ZV1dIHZhcjxpbj4gd29ya0dyb3VwU2l6ZSA6IHZlYzM8dTMyPjtcXFxcbiMgW1tidWlsdGluIHdvcmtfZ3JvdXBfaWRdXSB2YXI8aW4+IHdvcmtHcm91cElEIDogdmVjMzx1MzI+O1xcXFxuW1tidWlsdGluIGxvY2FsX2ludm9jYXRpb25faWRdXSB2YXI8aW4+IGxvY2FsSW52b2NhdGlvbklEIDogdmVjMzx1MzI+O1xcXFxuIyBbW2J1aWx0aW4gbnVtX3dvcmtfZ3JvdXBzXV0gdmFyPGluPiBudW1Xb3JrR3JvdXBzIDogdmVjMzx1MzI+O1xcXFxuW1tidWlsdGluIGxvY2FsX2ludm9jYXRpb25faWR4XV0gdmFyPGluPiBsb2NhbEludm9jYXRpb25JbmRleCA6IHUzMjtcXFxcblxcXFxudHlwZSBHV2ViR1BVUGFyYW1zID0gW1tibG9ja11dIHN0cnVjdCB7XFxcXG4gIFtbb2Zmc2V0IDBdXSB1X2RhbXBpbmcgOiBmMzI7XFxcXG4gIFtbb2Zmc2V0IDRdXSB1X21heFNwZWVkIDogZjMyO1xcXFxuICBbW29mZnNldCA4XV0gdV9taW5Nb3ZlbWVudCA6IGYzMjtcXFxcbiAgXFxcXG4gIFtbb2Zmc2V0IDEyXV0gdV9jb3Vsb21iRGlzU2NhbGUgOiBmMzI7XFxcXG4gIFtbb2Zmc2V0IDE2XV0gdV9mYWN0b3IgOiBmMzI7XFxcXG4gIFxcXFxuICBcXFxcbiAgW1tvZmZzZXQgMjBdXSB1X2ludGVydmFsIDogZjMyO1xcXFxufTtcXFxcbltbYmluZGluZyAwLCBzZXQgMF1dIHZhcjx1bmlmb3JtPiBnV2ViR1BVVW5pZm9ybVBhcmFtcyA6IEdXZWJHUFVQYXJhbXM7XFxcXG50eXBlIEdXZWJHUFVCdWZmZXIwID0gW1tibG9ja11dIHN0cnVjdCB7XFxcXG4gIFtbb2Zmc2V0IDBdXSB1X0RhdGEgOiBbW3N0cmlkZSAxNl1dIGFycmF5PHZlYzQ8ZjMyPj47XFxcXG59O1xcXFxuW1tiaW5kaW5nIDEsIHNldCAwXV0gdmFyPHN0b3JhZ2VfYnVmZmVyPiBnV2ViR1BVQnVmZmVyMCA6IEdXZWJHUFVCdWZmZXIwO1xcXFxudHlwZSBHV2ViR1BVQnVmZmVyMSA9IFtbYmxvY2tdXSBzdHJ1Y3Qge1xcXFxuICBbW29mZnNldCAwXV0gdV9BdmVNb3ZlbWVudCA6IFtbc3RyaWRlIDE2XV0gYXJyYXk8dmVjNDxmMzI+PjtcXFxcbn07XFxcXG5bW2JpbmRpbmcgMiwgc2V0IDBdXSB2YXI8c3RvcmFnZV9idWZmZXI+IGdXZWJHUFVCdWZmZXIxIDogR1dlYkdQVUJ1ZmZlcjE7XFxcXG50eXBlIEdXZWJHUFVCdWZmZXIyID0gW1tibG9ja11dIHN0cnVjdCB7XFxcXG4gIFtbb2Zmc2V0IDBdXSB1X05vZGVBdHRyaWJ1dGVBcnJheTEgOiBbW3N0cmlkZSAxNl1dIGFycmF5PHZlYzQ8ZjMyPj47XFxcXG59O1xcXFxuW1tiaW5kaW5nIDMsIHNldCAwXV0gdmFyPHN0b3JhZ2VfYnVmZmVyPiBnV2ViR1BVQnVmZmVyMiA6IEdXZWJHUFVCdWZmZXIyO1xcXFxudHlwZSBHV2ViR1BVQnVmZmVyMyA9IFtbYmxvY2tdXSBzdHJ1Y3Qge1xcXFxuICBbW29mZnNldCAwXV0gdV9Ob2RlQXR0cmlidXRlQXJyYXkyIDogW1tzdHJpZGUgMTZdXSBhcnJheTx2ZWM0PGYzMj4+O1xcXFxufTtcXFxcbltbYmluZGluZyA0LCBzZXQgMF1dIHZhcjxzdG9yYWdlX2J1ZmZlcj4gZ1dlYkdQVUJ1ZmZlcjMgOiBHV2ViR1BVQnVmZmVyMztcXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5mbiB1bnBhY2tfZmxvYXQocGFja2VkVmFsdWUgOiBmMzIpIC0+IHZlYzI8aTMyPiB7dmFyIHBhY2tlZEludFZhbHVlIDogaTMyID0gaTMyKHBhY2tlZFZhbHVlKTtcXFxcbnZhciB2MCA6IGkzMiA9IHBhY2tlZEludFZhbHVlIC8gMTA0ODU3NjtcXFxcbnJldHVybiB2ZWMyPGkzMj4odjAsIHBhY2tlZEludFZhbHVlIC0gKHYwICogMTA0ODU3NikpO31cXFxcbmZuIGNhbGNSZXB1bHNpdmUoaSA6IGkzMiwgY3VycmVudE5vZGUgOiB2ZWM0PGYzMj4pIC0+IHZlYzI8ZjMyPiB7dmFyIGF4IDogZjMyID0gMC4wO1xcXFxudmFyIGF5IDogZjMyID0gMC4wO1xcXFxuZm9yICh2YXIgaiA6IGkzMiA9IDA7IGogPCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX1ZFUlRFWF9DT1VOVDsgaiA9IGogKyAxKSB7aWYgKGkgIT0gaikge3ZhciBuZXh0Tm9kZSA6IHZlYzQ8ZjMyPiA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtqXTtcXFxcbnZhciB2eCA6IGYzMiA9IGN1cnJlbnROb2RlLnggLSBuZXh0Tm9kZS54O1xcXFxudmFyIHZ5IDogZjMyID0gY3VycmVudE5vZGUueSAtIG5leHROb2RlLnk7XFxcXG52YXIgZGlzdCA6IGYzMiA9IHN0ZDo6c3FydCgodnggKiB2eCkgKyAodnkgKiB2eSkpICsgMC4wMTtcXFxcbnZhciBuX2Rpc3QgOiBmMzIgPSBkaXN0ICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9jb3Vsb21iRGlzU2NhbGU7XFxcXG52YXIgZGlyZXggOiBmMzIgPSB2eCAvIGRpc3Q7XFxcXG52YXIgZGlyZXkgOiBmMzIgPSB2eSAvIGRpc3Q7XFxcXG52YXIgYXR0cmlidXRlc2kgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMi51X05vZGVBdHRyaWJ1dGVBcnJheTFbaV07XFxcXG52YXIgYXR0cmlidXRlc2ogOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMi51X05vZGVBdHRyaWJ1dGVBcnJheTFbal07XFxcXG52YXIgbWFzc2kgOiBmMzIgPSBhdHRyaWJ1dGVzaS54O1xcXFxudmFyIG5vZGVTdHJlbmd0aGkgOiBmMzIgPSBhdHRyaWJ1dGVzaS56O1xcXFxudmFyIG5vZGVTdHJlbmd0aGogOiBmMzIgPSBhdHRyaWJ1dGVzai56O1xcXFxudmFyIG5vZGVTdHJlbmd0aCA6IGYzMiA9IChub2RlU3RyZW5ndGhpICsgbm9kZVN0cmVuZ3RoaikgLyAyLjA7XFxcXG52YXIgcGFyYW0gOiBmMzIgPSAoMTAwMC4wICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9mYWN0b3IpIC8gKG5fZGlzdCAqIG5fZGlzdCk7XFxcXG5heCA9IGF4ICsgZGlyZXggKiBwYXJhbTtcXFxcbmF5ID0gYXkgKyBkaXJleSAqIHBhcmFtO319XFxcXG5yZXR1cm4gdmVjMjxmMzI+KGF4LCBheSk7fVxcXFxuZm4gY2FsY0dyYXZpdHkoaSA6IGkzMiwgY3VycmVudE5vZGUgOiB2ZWM0PGYzMj4sIGF0dHJpYnV0ZXMyIDogdmVjNDxmMzI+KSAtPiB2ZWMyPGYzMj4ge3ZhciB2eCA6IGYzMiA9IGN1cnJlbnROb2RlLnggLSBhdHRyaWJ1dGVzMi54O1xcXFxudmFyIHZ5IDogZjMyID0gY3VycmVudE5vZGUueSAtIGF0dHJpYnV0ZXMyLnk7XFxcXG52YXIgYXggOiBmMzIgPSB2eCAqIGF0dHJpYnV0ZXMyLnc7XFxcXG52YXIgYXkgOiBmMzIgPSB2eSAqIGF0dHJpYnV0ZXMyLnc7XFxcXG5yZXR1cm4gdmVjMjxmMzI+KGF4LCBheSk7fVxcXFxuZm4gY2FsY0F0dHJhY3RpdmUoaSA6IGkzMiwgY3VycmVudE5vZGUgOiB2ZWM0PGYzMj4sIGF0dHJpYnV0ZXMxIDogdmVjNDxmMzI+KSAtPiB2ZWMyPGYzMj4ge3ZhciBtYXNzIDogZjMyID0gYXR0cmlidXRlczEueDtcXFxcbnZhciBheCA6IGYzMiA9IDAuMDtcXFxcbnZhciBheSA6IGYzMiA9IDAuMDtcXFxcbnZhciBjb21wcmVzc2VkIDogdmVjMjxpMzI+ID0gdW5wYWNrX2Zsb2F0KGN1cnJlbnROb2RlLnopO1xcXFxudmFyIGxlbmd0aCA6IGkzMiA9IGNvbXByZXNzZWQueDtcXFxcbnZhciBhcnJfb2Zmc2V0IDogaTMyID0gY29tcHJlc3NlZC55O1xcXFxudmFyIG5vZGVfYnVmZmVyIDogdmVjNDxmMzI+O1xcXFxuZm9yICh2YXIgcCA6IGkzMiA9IDA7IHAgPCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX01BWF9FREdFX1BFUl9WRVJURVg7IHAgPSBwICsgMSkge2lmIChwID49IGxlbmd0aCkge2JyZWFrO31cXFxcbnZhciBhcnJfaWR4IDogaTMyID0gYXJyX29mZnNldCArICg0ICogcCk7XFxcXG52YXIgYnVmX29mZnNldCA6IGkzMiA9IGFycl9pZHggLSAoKGFycl9pZHggLyA0KSAqIDQpO1xcXFxuaWYgKChwID09IDApIHx8IChidWZfb2Zmc2V0ID09IDApKSB7bm9kZV9idWZmZXIgPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbaTMyKGFycl9pZHggLyA0KV07fVxcXFxudmFyIGZsb2F0X2ogOiBmMzIgPSBub2RlX2J1ZmZlci54O1xcXFxudmFyIG5leHROb2RlIDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2kzMihmbG9hdF9qKV07XFxcXG52YXIgdnggOiBmMzIgPSBuZXh0Tm9kZS54IC0gY3VycmVudE5vZGUueDtcXFxcbnZhciB2eSA6IGYzMiA9IG5leHROb2RlLnkgLSBjdXJyZW50Tm9kZS55O1xcXFxudmFyIGRpc3QgOiBmMzIgPSBzdGQ6OnNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDE7XFxcXG52YXIgZGlyZXggOiBmMzIgPSB2eCAvIGRpc3Q7XFxcXG52YXIgZGlyZXkgOiBmMzIgPSB2eSAvIGRpc3Q7XFxcXG52YXIgZWRnZUxlbmd0aCA6IGYzMiA9IG5vZGVfYnVmZmVyLnk7XFxcXG52YXIgZWRnZVN0cmVuZ3RoIDogZjMyID0gbm9kZV9idWZmZXIuejtcXFxcbnZhciBkaWZmIDogZjMyID0gZWRnZUxlbmd0aCAtIGRpc3Q7XFxcXG52YXIgcGFyYW0gOiBmMzIgPSAoZGlmZiAqIGVkZ2VTdHJlbmd0aCkgLyBtYXNzO1xcXFxuYXggPSBheCAtIGRpcmV4ICogcGFyYW07XFxcXG5heSA9IGF5IC0gZGlyZXkgKiBwYXJhbTt9XFxcXG5yZXR1cm4gdmVjMjxmMzI+KGF4LCBheSk7fVxcXFxuZm4gbWFpbigpIC0+IHZvaWQge3ZhciBpIDogaTMyID0gZ2xvYmFsSW52b2NhdGlvbklELng7XFxcXG52YXIgY3VycmVudE5vZGUgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbaV07XFxcXG52YXIgbW92ZW1lbnQgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMS51X0F2ZU1vdmVtZW50WzBdO1xcXFxudmFyIGF4IDogZjMyID0gMC4wO1xcXFxudmFyIGF5IDogZjMyID0gMC4wO1xcXFxuaWYgKChpID49IF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UKSB8fCAobW92ZW1lbnQueCA8IGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfbWluTW92ZW1lbnQpKSB7Z1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ldID0gY3VycmVudE5vZGU7XFxcXG5yZXR1cm4gO31cXFxcbnZhciBub2RlQXR0cmlidXRlczEgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMi51X05vZGVBdHRyaWJ1dGVBcnJheTFbaV07XFxcXG52YXIgbm9kZUF0dHJpYnV0ZXMyIDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjMudV9Ob2RlQXR0cmlidXRlQXJyYXkyW2ldO1xcXFxudmFyIHJlcHVsc2l2ZSA6IHZlYzI8ZjMyPiA9IGNhbGNSZXB1bHNpdmUoaSwgY3VycmVudE5vZGUpO1xcXFxuYXggPSBheCArIHJlcHVsc2l2ZS54O1xcXFxuYXkgPSBheSArIHJlcHVsc2l2ZS55O1xcXFxudmFyIGF0dHJhY3RpdmUgOiB2ZWMyPGYzMj4gPSBjYWxjQXR0cmFjdGl2ZShpLCBjdXJyZW50Tm9kZSwgbm9kZUF0dHJpYnV0ZXMxKTtcXFxcbmF4ID0gYXggKyBhdHRyYWN0aXZlLng7XFxcXG5heSA9IGF5ICsgYXR0cmFjdGl2ZS55O1xcXFxudmFyIGdyYXZpdHkgOiB2ZWMyPGYzMj4gPSBjYWxjR3Jhdml0eShpLCBjdXJyZW50Tm9kZSwgbm9kZUF0dHJpYnV0ZXMyKTtcXFxcbmF4ID0gYXggLSBncmF2aXR5Lng7XFxcXG5heSA9IGF5IC0gZ3Jhdml0eS55O1xcXFxudmFyIHBhcmFtIDogZjMyID0gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9pbnRlcnZhbCAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfZGFtcGluZztcXFxcbnZhciB2eCA6IGYzMiA9IGF4ICogcGFyYW07XFxcXG52YXIgdnkgOiBmMzIgPSBheSAqIHBhcmFtO1xcXFxudmFyIHZsZW5ndGggOiBmMzIgPSBzdGQ6OnNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDAwMTtcXFxcbmlmICh2bGVuZ3RoID4gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9tYXhTcGVlZCkge3ZhciBwYXJhbTIgOiBmMzIgPSBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X21heFNwZWVkIC8gdmxlbmd0aDtcXFxcbnZ4ID0gcGFyYW0yICogdng7XFxcXG52eSA9IHBhcmFtMiAqIHZ5O31cXFxcbnZhciBkaXN0eCA6IGYzMiA9IHZ4ICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9pbnRlcnZhbDtcXFxcbnZhciBkaXN0eSA6IGYzMiA9IHZ5ICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9pbnRlcnZhbDtcXFxcbnZhciBkaXN0TGVuZ3RoIDogZjMyID0gc3RkOjpzcXJ0KChkaXN0eCAqIGRpc3R4KSArIChkaXN0eSAqIGRpc3R5KSk7XFxcXG5nV2ViR1BVQnVmZmVyMC51X0RhdGFbaV0gPSB2ZWM0PGYzMj4oY3VycmVudE5vZGUueCArIGRpc3R4LCBjdXJyZW50Tm9kZS55ICsgZGlzdHksIGN1cnJlbnROb2RlLnosIGRpc3RMZW5ndGgpO1xcXFxucmV0dXJuO31cXFxcblxcXFxuZW50cnlfcG9pbnQgY29tcHV0ZSBhcyBcXFxcXCJtYWluXFxcXFwiID0gbWFpbjtcXFxcblwiLFwiR0xTTDQ1MFwiOlwiXFxcXG5cXFxcblxcXFxuYm9vbCBnV2ViR1BVRGVidWcgPSBmYWxzZTtcXFxcbnZlYzQgZ1dlYkdQVURlYnVnT3V0cHV0ID0gdmVjNCgwLjApO1xcXFxuXFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhnbF9HbG9iYWxJbnZvY2F0aW9uSUQpO1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsMSwxKTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMoZ2xfV29ya0dyb3VwSUQpO1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhnbF9Mb2NhbEludm9jYXRpb25JRCk7XFxcXG5pdmVjMyBudW1Xb3JrR3JvdXBzID0gaXZlYzMoZ2xfTnVtV29ya0dyb3Vwcyk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSW5kZXggPSBpbnQoZ2xfTG9jYWxJbnZvY2F0aW9uSW5kZXgpO1xcXFxuXFxcXG5sYXlvdXQoc3RkMTQwLCBzZXQgPSAwLCBiaW5kaW5nID0gMCkgdW5pZm9ybSBHV2ViR1BVUGFyYW1zIHtcXFxcbiAgZmxvYXQgdV9kYW1waW5nO1xcXFxuICBmbG9hdCB1X21heFNwZWVkO1xcXFxuICBmbG9hdCB1X21pbk1vdmVtZW50O1xcXFxuICBcXFxcbiAgZmxvYXQgdV9jb3Vsb21iRGlzU2NhbGU7XFxcXG4gIGZsb2F0IHVfZmFjdG9yO1xcXFxuICBcXFxcbiAgXFxcXG4gIGZsb2F0IHVfaW50ZXJ2YWw7XFxcXG59IGdXZWJHUFVVbmlmb3JtUGFyYW1zO1xcXFxubGF5b3V0KHN0ZDQzMCwgc2V0ID0gMCwgYmluZGluZyA9IDEpIGJ1ZmZlciAgIEdXZWJHUFVCdWZmZXIwIHtcXFxcbiAgdmVjNCB1X0RhdGFbXTtcXFxcbn0gZ1dlYkdQVUJ1ZmZlcjA7XFxcXG5cXFxcbmxheW91dChzdGQ0MzAsIHNldCA9IDAsIGJpbmRpbmcgPSAyKSBidWZmZXIgcmVhZG9ubHkgIEdXZWJHUFVCdWZmZXIxIHtcXFxcbiAgdmVjNCB1X0F2ZU1vdmVtZW50W107XFxcXG59IGdXZWJHUFVCdWZmZXIxO1xcXFxuXFxcXG5sYXlvdXQoc3RkNDMwLCBzZXQgPSAwLCBiaW5kaW5nID0gMykgYnVmZmVyIHJlYWRvbmx5ICBHV2ViR1BVQnVmZmVyMiB7XFxcXG4gIHZlYzQgdV9Ob2RlQXR0cmlidXRlQXJyYXkxW107XFxcXG59IGdXZWJHUFVCdWZmZXIyO1xcXFxuXFxcXG5sYXlvdXQoc3RkNDMwLCBzZXQgPSAwLCBiaW5kaW5nID0gNCkgYnVmZmVyIHJlYWRvbmx5ICBHV2ViR1BVQnVmZmVyMyB7XFxcXG4gIHZlYzQgdV9Ob2RlQXR0cmlidXRlQXJyYXkyW107XFxcXG59IGdXZWJHUFVCdWZmZXIzO1xcXFxuXFxcXG5cXFxcblxcXFxuI2RlZmluZSBNQVhfRURHRV9QRVJfVkVSVEVYIF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fTUFYX0VER0VfUEVSX1ZFUlRFWFxcXFxuI2RlZmluZSBWRVJURVhfQ09VTlQgX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlRcXFxcbiNkZWZpbmUgU0hJRlRfMjAgMTA0ODU3Ni4wXFxcXG5sYXlvdXQgKFxcXFxuICBsb2NhbF9zaXplX3ggPSAxLFxcXFxuICBsb2NhbF9zaXplX3kgPSAxLFxcXFxuICBsb2NhbF9zaXplX3ogPSAxXFxcXG4pIGluO1xcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5pdmVjMiB1bnBhY2tfZmxvYXQoZmxvYXQgcGFja2VkVmFsdWUpIHtpbnQgcGFja2VkSW50VmFsdWUgPSBpbnQocGFja2VkVmFsdWUpO1xcXFxuaW50IHYwID0gcGFja2VkSW50VmFsdWUgLyBpbnQoU0hJRlRfMjApO1xcXFxucmV0dXJuIGl2ZWMyKHYwLCBwYWNrZWRJbnRWYWx1ZSAtICh2MCAqIGludChTSElGVF8yMCkpKTt9XFxcXG52ZWMyIGNhbGNSZXB1bHNpdmUoaW50IGksIHZlYzQgY3VycmVudE5vZGUpIHtmbG9hdCBheCA9IDAuMDtcXFxcbmZsb2F0IGF5ID0gMC4wO1xcXFxuZm9yIChpbnQgaiA9IDA7IGogPCBWRVJURVhfQ09VTlQ7IGorKykge2lmIChpICE9IGopIHt2ZWM0IG5leHROb2RlID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2pdO1xcXFxuZmxvYXQgdnggPSBjdXJyZW50Tm9kZS54IC0gbmV4dE5vZGUueDtcXFxcbmZsb2F0IHZ5ID0gY3VycmVudE5vZGUueSAtIG5leHROb2RlLnk7XFxcXG5mbG9hdCBkaXN0ID0gc3FydCgodnggKiB2eCkgKyAodnkgKiB2eSkpICsgMC4wMTtcXFxcbmZsb2F0IG5fZGlzdCA9IGRpc3QgKiBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X2NvdWxvbWJEaXNTY2FsZTtcXFxcbmZsb2F0IGRpcmV4ID0gdnggLyBkaXN0O1xcXFxuZmxvYXQgZGlyZXkgPSB2eSAvIGRpc3Q7XFxcXG52ZWM0IGF0dHJpYnV0ZXNpID0gZ1dlYkdQVUJ1ZmZlcjIudV9Ob2RlQXR0cmlidXRlQXJyYXkxW2ldO1xcXFxudmVjNCBhdHRyaWJ1dGVzaiA9IGdXZWJHUFVCdWZmZXIyLnVfTm9kZUF0dHJpYnV0ZUFycmF5MVtqXTtcXFxcbmZsb2F0IG1hc3NpID0gYXR0cmlidXRlc2kueDtcXFxcbmZsb2F0IG5vZGVTdHJlbmd0aGkgPSBhdHRyaWJ1dGVzaS56O1xcXFxuZmxvYXQgbm9kZVN0cmVuZ3RoaiA9IGF0dHJpYnV0ZXNqLno7XFxcXG5mbG9hdCBub2RlU3RyZW5ndGggPSAobm9kZVN0cmVuZ3RoaSArIG5vZGVTdHJlbmd0aGopIC8gMi4wO1xcXFxuZmxvYXQgcGFyYW0gPSAoMTAwMC4wICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9mYWN0b3IpIC8gKG5fZGlzdCAqIG5fZGlzdCk7XFxcXG5heCArPSBkaXJleCAqIHBhcmFtO1xcXFxuYXkgKz0gZGlyZXkgKiBwYXJhbTt9fVxcXFxucmV0dXJuIHZlYzIoYXgsIGF5KTt9XFxcXG52ZWMyIGNhbGNHcmF2aXR5KGludCBpLCB2ZWM0IGN1cnJlbnROb2RlLCB2ZWM0IGF0dHJpYnV0ZXMyKSB7ZmxvYXQgdnggPSBjdXJyZW50Tm9kZS54IC0gYXR0cmlidXRlczIueDtcXFxcbmZsb2F0IHZ5ID0gY3VycmVudE5vZGUueSAtIGF0dHJpYnV0ZXMyLnk7XFxcXG5mbG9hdCBheCA9IHZ4ICogYXR0cmlidXRlczIudztcXFxcbmZsb2F0IGF5ID0gdnkgKiBhdHRyaWJ1dGVzMi53O1xcXFxucmV0dXJuIHZlYzIoYXgsIGF5KTt9XFxcXG52ZWMyIGNhbGNBdHRyYWN0aXZlKGludCBpLCB2ZWM0IGN1cnJlbnROb2RlLCB2ZWM0IGF0dHJpYnV0ZXMxKSB7ZmxvYXQgbWFzcyA9IGF0dHJpYnV0ZXMxLng7XFxcXG5mbG9hdCBheCA9IDAuMDtcXFxcbmZsb2F0IGF5ID0gMC4wO1xcXFxuaXZlYzIgY29tcHJlc3NlZCA9IHVucGFja19mbG9hdChjdXJyZW50Tm9kZS56KTtcXFxcbmludCBsZW5ndGggPSBjb21wcmVzc2VkLng7XFxcXG5pbnQgYXJyX29mZnNldCA9IGNvbXByZXNzZWQueTtcXFxcbnZlYzQgbm9kZV9idWZmZXI7XFxcXG5mb3IgKGludCBwID0gMDsgcCA8IE1BWF9FREdFX1BFUl9WRVJURVg7IHArKykge2lmIChwID49IGxlbmd0aCkge2JyZWFrO31cXFxcbmludCBhcnJfaWR4ID0gYXJyX29mZnNldCArICg0ICogcCk7XFxcXG5pbnQgYnVmX29mZnNldCA9IGFycl9pZHggLSAoKGFycl9pZHggLyA0KSAqIDQpO1xcXFxuaWYgKChwID09IDApIHx8IChidWZfb2Zmc2V0ID09IDApKSB7bm9kZV9idWZmZXIgPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbaW50KGFycl9pZHggLyA0KV07fVxcXFxuZmxvYXQgZmxvYXRfaiA9IG5vZGVfYnVmZmVyLng7XFxcXG52ZWM0IG5leHROb2RlID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ludChmbG9hdF9qKV07XFxcXG5mbG9hdCB2eCA9IG5leHROb2RlLnggLSBjdXJyZW50Tm9kZS54O1xcXFxuZmxvYXQgdnkgPSBuZXh0Tm9kZS55IC0gY3VycmVudE5vZGUueTtcXFxcbmZsb2F0IGRpc3QgPSBzcXJ0KCh2eCAqIHZ4KSArICh2eSAqIHZ5KSkgKyAwLjAxO1xcXFxuZmxvYXQgZGlyZXggPSB2eCAvIGRpc3Q7XFxcXG5mbG9hdCBkaXJleSA9IHZ5IC8gZGlzdDtcXFxcbmZsb2F0IGVkZ2VMZW5ndGggPSBub2RlX2J1ZmZlci55O1xcXFxuZmxvYXQgZWRnZVN0cmVuZ3RoID0gbm9kZV9idWZmZXIuejtcXFxcbmZsb2F0IGRpZmYgPSBlZGdlTGVuZ3RoIC0gZGlzdDtcXFxcbmZsb2F0IHBhcmFtID0gKGRpZmYgKiBlZGdlU3RyZW5ndGgpIC8gbWFzcztcXFxcbmF4IC09IGRpcmV4ICogcGFyYW07XFxcXG5heSAtPSBkaXJleSAqIHBhcmFtO31cXFxcbnJldHVybiB2ZWMyKGF4LCBheSk7fVxcXFxudm9pZCBtYWluKCkge2ludCBpID0gZ2xvYmFsSW52b2NhdGlvbklELng7XFxcXG52ZWM0IGN1cnJlbnROb2RlID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ldO1xcXFxudmVjNCBtb3ZlbWVudCA9IGdXZWJHUFVCdWZmZXIxLnVfQXZlTW92ZW1lbnRbMF07XFxcXG5mbG9hdCBheCA9IDAuMDtcXFxcbmZsb2F0IGF5ID0gMC4wO1xcXFxuaWYgKChpID49IFZFUlRFWF9DT1VOVCkgfHwgKG1vdmVtZW50LnggPCBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X21pbk1vdmVtZW50KSkge2dXZWJHUFVCdWZmZXIwLnVfRGF0YVtpXSA9IGN1cnJlbnROb2RlO1xcXFxucmV0dXJuIDt9XFxcXG52ZWM0IG5vZGVBdHRyaWJ1dGVzMSA9IGdXZWJHUFVCdWZmZXIyLnVfTm9kZUF0dHJpYnV0ZUFycmF5MVtpXTtcXFxcbnZlYzQgbm9kZUF0dHJpYnV0ZXMyID0gZ1dlYkdQVUJ1ZmZlcjMudV9Ob2RlQXR0cmlidXRlQXJyYXkyW2ldO1xcXFxudmVjMiByZXB1bHNpdmUgPSBjYWxjUmVwdWxzaXZlKGksIGN1cnJlbnROb2RlKTtcXFxcbmF4ICs9IHJlcHVsc2l2ZS54O1xcXFxuYXkgKz0gcmVwdWxzaXZlLnk7XFxcXG52ZWMyIGF0dHJhY3RpdmUgPSBjYWxjQXR0cmFjdGl2ZShpLCBjdXJyZW50Tm9kZSwgbm9kZUF0dHJpYnV0ZXMxKTtcXFxcbmF4ICs9IGF0dHJhY3RpdmUueDtcXFxcbmF5ICs9IGF0dHJhY3RpdmUueTtcXFxcbnZlYzIgZ3Jhdml0eSA9IGNhbGNHcmF2aXR5KGksIGN1cnJlbnROb2RlLCBub2RlQXR0cmlidXRlczIpO1xcXFxuYXggLT0gZ3Jhdml0eS54O1xcXFxuYXkgLT0gZ3Jhdml0eS55O1xcXFxuZmxvYXQgcGFyYW0gPSBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X2ludGVydmFsICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9kYW1waW5nO1xcXFxuZmxvYXQgdnggPSBheCAqIHBhcmFtO1xcXFxuZmxvYXQgdnkgPSBheSAqIHBhcmFtO1xcXFxuZmxvYXQgdmxlbmd0aCA9IHNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDAwMTtcXFxcbmlmICh2bGVuZ3RoID4gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9tYXhTcGVlZCkge2Zsb2F0IHBhcmFtMiA9IGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfbWF4U3BlZWQgLyB2bGVuZ3RoO1xcXFxudnggPSBwYXJhbTIgKiB2eDtcXFxcbnZ5ID0gcGFyYW0yICogdnk7fVxcXFxuZmxvYXQgZGlzdHggPSB2eCAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfaW50ZXJ2YWw7XFxcXG5mbG9hdCBkaXN0eSA9IHZ5ICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9pbnRlcnZhbDtcXFxcbmZsb2F0IGRpc3RMZW5ndGggPSBzcXJ0KChkaXN0eCAqIGRpc3R4KSArIChkaXN0eSAqIGRpc3R5KSk7XFxcXG5nV2ViR1BVQnVmZmVyMC51X0RhdGFbaV0gPSB2ZWM0KGN1cnJlbnROb2RlLnggKyBkaXN0eCwgY3VycmVudE5vZGUueSArIGRpc3R5LCBjdXJyZW50Tm9kZS56LCBkaXN0TGVuZ3RoKTt9XFxcXG5cIixcIkdMU0wxMDBcIjpcIlxcXFxuXFxcXG5mbG9hdCBlcHNpbG9uID0gMC4wMDAwMTtcXFxcbnZlYzIgYWRkclRyYW5zbGF0aW9uXzFEdG8yRChmbG9hdCBhZGRyZXNzMUQsIHZlYzIgdGV4U2l6ZSkge1xcXFxuICB2ZWMyIGNvbnZfY29uc3QgPSB2ZWMyKDEuMCAvIHRleFNpemUueCwgMS4wIC8gKHRleFNpemUueCAqIHRleFNpemUueSkpO1xcXFxuICB2ZWMyIG5vcm1BZGRyMkQgPSBmbG9hdChhZGRyZXNzMUQpICogY29udl9jb25zdDtcXFxcbiAgcmV0dXJuIHZlYzIoZnJhY3Qobm9ybUFkZHIyRC54ICsgZXBzaWxvbiksIG5vcm1BZGRyMkQueSk7XFxcXG59XFxcXG5cXFxcbnZvaWQgYmFycmllcigpIHt9XFxcXG4gIFxcXFxuXFxcXG51bmlmb3JtIHZlYzIgdV9PdXRwdXRUZXh0dXJlU2l6ZTtcXFxcbnVuaWZvcm0gaW50IHVfT3V0cHV0VGV4ZWxDb3VudDtcXFxcbnZhcnlpbmcgdmVjMiB2X1RleENvb3JkO1xcXFxuXFxcXG5ib29sIGdXZWJHUFVEZWJ1ZyA9IGZhbHNlO1xcXFxudmVjNCBnV2ViR1BVRGVidWdPdXRwdXQgPSB2ZWM0KDAuMCk7XFxcXG5cXFxcbiNkZWZpbmUgTUFYX0VER0VfUEVSX1ZFUlRFWCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX01BWF9FREdFX1BFUl9WRVJURVhcXFxcbiNkZWZpbmUgVkVSVEVYX0NPVU5UIF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UXFxcXG4jZGVmaW5lIFNISUZUXzIwIDEwNDg1NzYuMFxcXFxuXFxcXG51bmlmb3JtIHNhbXBsZXIyRCB1X0RhdGE7XFxcXG51bmlmb3JtIHZlYzIgdV9EYXRhU2l6ZTtcXFxcbnZlYzQgZ2V0RGF0YXVfRGF0YSh2ZWMyIGFkZHJlc3MyRCkge1xcXFxuICByZXR1cm4gdmVjNCh0ZXh0dXJlMkQodV9EYXRhLCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9EYXRhKGZsb2F0IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfRGF0YShhZGRyVHJhbnNsYXRpb25fMUR0bzJEKGFkZHJlc3MxRCwgdV9EYXRhU2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9EYXRhKGludCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0RhdGEoZmxvYXQoYWRkcmVzczFEKSk7XFxcXG59XFxcXG51bmlmb3JtIGZsb2F0IHVfZGFtcGluZztcXFxcbnVuaWZvcm0gZmxvYXQgdV9tYXhTcGVlZDtcXFxcbnVuaWZvcm0gZmxvYXQgdV9taW5Nb3ZlbWVudDtcXFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfQXZlTW92ZW1lbnQ7XFxcXG51bmlmb3JtIHZlYzIgdV9BdmVNb3ZlbWVudFNpemU7XFxcXG52ZWM0IGdldERhdGF1X0F2ZU1vdmVtZW50KHZlYzIgYWRkcmVzczJEKSB7XFxcXG4gIHJldHVybiB2ZWM0KHRleHR1cmUyRCh1X0F2ZU1vdmVtZW50LCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9BdmVNb3ZlbWVudChmbG9hdCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0F2ZU1vdmVtZW50KGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoYWRkcmVzczFELCB1X0F2ZU1vdmVtZW50U2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9BdmVNb3ZlbWVudChpbnQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9BdmVNb3ZlbWVudChmbG9hdChhZGRyZXNzMUQpKTtcXFxcbn1cXFxcbnVuaWZvcm0gZmxvYXQgdV9jb3Vsb21iRGlzU2NhbGU7XFxcXG51bmlmb3JtIGZsb2F0IHVfZmFjdG9yO1xcXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9Ob2RlQXR0cmlidXRlQXJyYXkxO1xcXFxudW5pZm9ybSB2ZWMyIHVfTm9kZUF0dHJpYnV0ZUFycmF5MVNpemU7XFxcXG52ZWM0IGdldERhdGF1X05vZGVBdHRyaWJ1dGVBcnJheTEodmVjMiBhZGRyZXNzMkQpIHtcXFxcbiAgcmV0dXJuIHZlYzQodGV4dHVyZTJEKHVfTm9kZUF0dHJpYnV0ZUFycmF5MSwgYWRkcmVzczJEKS5yZ2JhKTtcXFxcbn1cXFxcbnZlYzQgZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZUFycmF5MShmbG9hdCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X05vZGVBdHRyaWJ1dGVBcnJheTEoYWRkclRyYW5zbGF0aW9uXzFEdG8yRChhZGRyZXNzMUQsIHVfTm9kZUF0dHJpYnV0ZUFycmF5MVNpemUpKTtcXFxcbn1cXFxcbnZlYzQgZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZUFycmF5MShpbnQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9Ob2RlQXR0cmlidXRlQXJyYXkxKGZsb2F0KGFkZHJlc3MxRCkpO1xcXFxufVxcXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9Ob2RlQXR0cmlidXRlQXJyYXkyO1xcXFxudW5pZm9ybSB2ZWMyIHVfTm9kZUF0dHJpYnV0ZUFycmF5MlNpemU7XFxcXG52ZWM0IGdldERhdGF1X05vZGVBdHRyaWJ1dGVBcnJheTIodmVjMiBhZGRyZXNzMkQpIHtcXFxcbiAgcmV0dXJuIHZlYzQodGV4dHVyZTJEKHVfTm9kZUF0dHJpYnV0ZUFycmF5MiwgYWRkcmVzczJEKS5yZ2JhKTtcXFxcbn1cXFxcbnZlYzQgZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZUFycmF5MihmbG9hdCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X05vZGVBdHRyaWJ1dGVBcnJheTIoYWRkclRyYW5zbGF0aW9uXzFEdG8yRChhZGRyZXNzMUQsIHVfTm9kZUF0dHJpYnV0ZUFycmF5MlNpemUpKTtcXFxcbn1cXFxcbnZlYzQgZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZUFycmF5MihpbnQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9Ob2RlQXR0cmlidXRlQXJyYXkyKGZsb2F0KGFkZHJlc3MxRCkpO1xcXFxufVxcXFxudW5pZm9ybSBmbG9hdCB1X2ludGVydmFsO1xcXFxuaXZlYzIgdW5wYWNrX2Zsb2F0KGZsb2F0IHBhY2tlZFZhbHVlKSB7XFxcXG5pdmVjMyB3b3JrR3JvdXBTaXplID0gaXZlYzMoMSwgMSwgMSk7XFxcXG5pdmVjMyBudW1Xb3JrR3JvdXBzID0gaXZlYzMoMSwgMSwgMSk7ICAgICBcXFxcbmludCBnbG9iYWxJbnZvY2F0aW9uSW5kZXggPSBpbnQoZmxvb3Iodl9UZXhDb29yZC54ICogdV9PdXRwdXRUZXh0dXJlU2l6ZS54KSlcXFxcbiAgKyBpbnQoZmxvb3Iodl9UZXhDb29yZC55ICogdV9PdXRwdXRUZXh0dXJlU2l6ZS55KSkgKiBpbnQodV9PdXRwdXRUZXh0dXJlU2l6ZS54KTtcXFxcbmludCB3b3JrR3JvdXBJRExlbmd0aCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkgKiB3b3JrR3JvdXBTaXplLnopO1xcXFxuaXZlYzMgd29ya0dyb3VwSUQgPSBpdmVjMyh3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueSAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy55KTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFogPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55KTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFkgPSAoZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55KSAvIHdvcmtHcm91cFNpemUueDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkgLSBsb2NhbEludm9jYXRpb25JRFkgKiB3b3JrR3JvdXBTaXplLng7XFxcXG5pdmVjMyBsb2NhbEludm9jYXRpb25JRCA9IGl2ZWMzKGxvY2FsSW52b2NhdGlvbklEWCwgbG9jYWxJbnZvY2F0aW9uSURZLCBsb2NhbEludm9jYXRpb25JRFopO1xcXFxuaXZlYzMgZ2xvYmFsSW52b2NhdGlvbklEID0gd29ya0dyb3VwSUQgKiB3b3JrR3JvdXBTaXplICsgbG9jYWxJbnZvY2F0aW9uSUQ7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSW5kZXggPSBsb2NhbEludm9jYXRpb25JRC56ICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55XFxcXG4gICAgICAgICAgICAgICAgKyBsb2NhbEludm9jYXRpb25JRC55ICogd29ya0dyb3VwU2l6ZS54ICsgbG9jYWxJbnZvY2F0aW9uSUQueDtcXFxcbmludCBwYWNrZWRJbnRWYWx1ZSA9IGludChwYWNrZWRWYWx1ZSk7XFxcXG5pbnQgdjAgPSBwYWNrZWRJbnRWYWx1ZSAvIGludChTSElGVF8yMCk7XFxcXG5yZXR1cm4gaXZlYzIodjAsIHBhY2tlZEludFZhbHVlIC0gKHYwICogaW50KFNISUZUXzIwKSkpO31cXFxcbnZlYzIgY2FsY1JlcHVsc2l2ZShpbnQgaSwgdmVjNCBjdXJyZW50Tm9kZSkge1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsIDEsIDEpO1xcXFxuaXZlYzMgbnVtV29ya0dyb3VwcyA9IGl2ZWMzKDEsIDEsIDEpOyAgICAgXFxcXG5pbnQgZ2xvYmFsSW52b2NhdGlvbkluZGV4ID0gaW50KGZsb29yKHZfVGV4Q29vcmQueCAqIHVfT3V0cHV0VGV4dHVyZVNpemUueCkpXFxcXG4gICsgaW50KGZsb29yKHZfVGV4Q29vcmQueSAqIHVfT3V0cHV0VGV4dHVyZVNpemUueSkpICogaW50KHVfT3V0cHV0VGV4dHVyZVNpemUueCk7XFxcXG5pbnQgd29ya0dyb3VwSURMZW5ndGggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55ICogd29ya0dyb3VwU2l6ZS56KTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMod29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnkgLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURaID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURZID0gKGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSkgLyB3b3JrR3JvdXBTaXplLng7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURYID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55IC0gbG9jYWxJbnZvY2F0aW9uSURZICogd29ya0dyb3VwU2l6ZS54O1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhsb2NhbEludm9jYXRpb25JRFgsIGxvY2FsSW52b2NhdGlvbklEWSwgbG9jYWxJbnZvY2F0aW9uSURaKTtcXFxcbml2ZWMzIGdsb2JhbEludm9jYXRpb25JRCA9IHdvcmtHcm91cElEICogd29ya0dyb3VwU2l6ZSArIGxvY2FsSW52b2NhdGlvbklEO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbkluZGV4ID0gbG9jYWxJbnZvY2F0aW9uSUQueiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueVxcXFxuICAgICAgICAgICAgICAgICsgbG9jYWxJbnZvY2F0aW9uSUQueSAqIHdvcmtHcm91cFNpemUueCArIGxvY2FsSW52b2NhdGlvbklELng7XFxcXG5mbG9hdCBheCA9IDAuMDtcXFxcbmZsb2F0IGF5ID0gMC4wO1xcXFxuZm9yIChpbnQgaiA9IDA7IGogPCBWRVJURVhfQ09VTlQ7IGorKykge2lmIChpICE9IGopIHt2ZWM0IG5leHROb2RlID0gZ2V0RGF0YXVfRGF0YShqKTtcXFxcbmZsb2F0IHZ4ID0gY3VycmVudE5vZGUueCAtIG5leHROb2RlLng7XFxcXG5mbG9hdCB2eSA9IGN1cnJlbnROb2RlLnkgLSBuZXh0Tm9kZS55O1xcXFxuZmxvYXQgZGlzdCA9IHNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDE7XFxcXG5mbG9hdCBuX2Rpc3QgPSBkaXN0ICogdV9jb3Vsb21iRGlzU2NhbGU7XFxcXG5mbG9hdCBkaXJleCA9IHZ4IC8gZGlzdDtcXFxcbmZsb2F0IGRpcmV5ID0gdnkgLyBkaXN0O1xcXFxudmVjNCBhdHRyaWJ1dGVzaSA9IGdldERhdGF1X05vZGVBdHRyaWJ1dGVBcnJheTEoaSk7XFxcXG52ZWM0IGF0dHJpYnV0ZXNqID0gZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZUFycmF5MShqKTtcXFxcbmZsb2F0IG1hc3NpID0gYXR0cmlidXRlc2kueDtcXFxcbmZsb2F0IG5vZGVTdHJlbmd0aGkgPSBhdHRyaWJ1dGVzaS56O1xcXFxuZmxvYXQgbm9kZVN0cmVuZ3RoaiA9IGF0dHJpYnV0ZXNqLno7XFxcXG5mbG9hdCBub2RlU3RyZW5ndGggPSAobm9kZVN0cmVuZ3RoaSArIG5vZGVTdHJlbmd0aGopIC8gMi4wO1xcXFxuZmxvYXQgcGFyYW0gPSAoMTAwMC4wICogdV9mYWN0b3IpIC8gKG5fZGlzdCAqIG5fZGlzdCk7XFxcXG5heCArPSBkaXJleCAqIHBhcmFtO1xcXFxuYXkgKz0gZGlyZXkgKiBwYXJhbTt9fVxcXFxucmV0dXJuIHZlYzIoYXgsIGF5KTt9XFxcXG52ZWMyIGNhbGNHcmF2aXR5KGludCBpLCB2ZWM0IGN1cnJlbnROb2RlLCB2ZWM0IGF0dHJpYnV0ZXMyKSB7XFxcXG5pdmVjMyB3b3JrR3JvdXBTaXplID0gaXZlYzMoMSwgMSwgMSk7XFxcXG5pdmVjMyBudW1Xb3JrR3JvdXBzID0gaXZlYzMoMSwgMSwgMSk7ICAgICBcXFxcbmludCBnbG9iYWxJbnZvY2F0aW9uSW5kZXggPSBpbnQoZmxvb3Iodl9UZXhDb29yZC54ICogdV9PdXRwdXRUZXh0dXJlU2l6ZS54KSlcXFxcbiAgKyBpbnQoZmxvb3Iodl9UZXhDb29yZC55ICogdV9PdXRwdXRUZXh0dXJlU2l6ZS55KSkgKiBpbnQodV9PdXRwdXRUZXh0dXJlU2l6ZS54KTtcXFxcbmludCB3b3JrR3JvdXBJRExlbmd0aCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkgKiB3b3JrR3JvdXBTaXplLnopO1xcXFxuaXZlYzMgd29ya0dyb3VwSUQgPSBpdmVjMyh3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueSAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy55KTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFogPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55KTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFkgPSAoZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55KSAvIHdvcmtHcm91cFNpemUueDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkgLSBsb2NhbEludm9jYXRpb25JRFkgKiB3b3JrR3JvdXBTaXplLng7XFxcXG5pdmVjMyBsb2NhbEludm9jYXRpb25JRCA9IGl2ZWMzKGxvY2FsSW52b2NhdGlvbklEWCwgbG9jYWxJbnZvY2F0aW9uSURZLCBsb2NhbEludm9jYXRpb25JRFopO1xcXFxuaXZlYzMgZ2xvYmFsSW52b2NhdGlvbklEID0gd29ya0dyb3VwSUQgKiB3b3JrR3JvdXBTaXplICsgbG9jYWxJbnZvY2F0aW9uSUQ7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSW5kZXggPSBsb2NhbEludm9jYXRpb25JRC56ICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55XFxcXG4gICAgICAgICAgICAgICAgKyBsb2NhbEludm9jYXRpb25JRC55ICogd29ya0dyb3VwU2l6ZS54ICsgbG9jYWxJbnZvY2F0aW9uSUQueDtcXFxcbmZsb2F0IHZ4ID0gY3VycmVudE5vZGUueCAtIGF0dHJpYnV0ZXMyLng7XFxcXG5mbG9hdCB2eSA9IGN1cnJlbnROb2RlLnkgLSBhdHRyaWJ1dGVzMi55O1xcXFxuZmxvYXQgYXggPSB2eCAqIGF0dHJpYnV0ZXMyLnc7XFxcXG5mbG9hdCBheSA9IHZ5ICogYXR0cmlidXRlczIudztcXFxcbnJldHVybiB2ZWMyKGF4LCBheSk7fVxcXFxudmVjMiBjYWxjQXR0cmFjdGl2ZShpbnQgaSwgdmVjNCBjdXJyZW50Tm9kZSwgdmVjNCBhdHRyaWJ1dGVzMSkge1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsIDEsIDEpO1xcXFxuaXZlYzMgbnVtV29ya0dyb3VwcyA9IGl2ZWMzKDEsIDEsIDEpOyAgICAgXFxcXG5pbnQgZ2xvYmFsSW52b2NhdGlvbkluZGV4ID0gaW50KGZsb29yKHZfVGV4Q29vcmQueCAqIHVfT3V0cHV0VGV4dHVyZVNpemUueCkpXFxcXG4gICsgaW50KGZsb29yKHZfVGV4Q29vcmQueSAqIHVfT3V0cHV0VGV4dHVyZVNpemUueSkpICogaW50KHVfT3V0cHV0VGV4dHVyZVNpemUueCk7XFxcXG5pbnQgd29ya0dyb3VwSURMZW5ndGggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55ICogd29ya0dyb3VwU2l6ZS56KTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMod29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnkgLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURaID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURZID0gKGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSkgLyB3b3JrR3JvdXBTaXplLng7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURYID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55IC0gbG9jYWxJbnZvY2F0aW9uSURZICogd29ya0dyb3VwU2l6ZS54O1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhsb2NhbEludm9jYXRpb25JRFgsIGxvY2FsSW52b2NhdGlvbklEWSwgbG9jYWxJbnZvY2F0aW9uSURaKTtcXFxcbml2ZWMzIGdsb2JhbEludm9jYXRpb25JRCA9IHdvcmtHcm91cElEICogd29ya0dyb3VwU2l6ZSArIGxvY2FsSW52b2NhdGlvbklEO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbkluZGV4ID0gbG9jYWxJbnZvY2F0aW9uSUQueiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueVxcXFxuICAgICAgICAgICAgICAgICsgbG9jYWxJbnZvY2F0aW9uSUQueSAqIHdvcmtHcm91cFNpemUueCArIGxvY2FsSW52b2NhdGlvbklELng7XFxcXG5mbG9hdCBtYXNzID0gYXR0cmlidXRlczEueDtcXFxcbmZsb2F0IGF4ID0gMC4wO1xcXFxuZmxvYXQgYXkgPSAwLjA7XFxcXG5pdmVjMiBjb21wcmVzc2VkID0gdW5wYWNrX2Zsb2F0KGN1cnJlbnROb2RlLnopO1xcXFxuaW50IGxlbmd0aCA9IGNvbXByZXNzZWQueDtcXFxcbmludCBhcnJfb2Zmc2V0ID0gY29tcHJlc3NlZC55O1xcXFxudmVjNCBub2RlX2J1ZmZlcjtcXFxcbmZvciAoaW50IHAgPSAwOyBwIDwgTUFYX0VER0VfUEVSX1ZFUlRFWDsgcCsrKSB7aWYgKHAgPj0gbGVuZ3RoKSB7YnJlYWs7fVxcXFxuaW50IGFycl9pZHggPSBhcnJfb2Zmc2V0ICsgKDQgKiBwKTtcXFxcbmludCBidWZfb2Zmc2V0ID0gYXJyX2lkeCAtICgoYXJyX2lkeCAvIDQpICogNCk7XFxcXG5pZiAoKHAgPT0gMCkgfHwgKGJ1Zl9vZmZzZXQgPT0gMCkpIHtub2RlX2J1ZmZlciA9IGdldERhdGF1X0RhdGEoaW50KGFycl9pZHggLyA0KSk7fVxcXFxuZmxvYXQgZmxvYXRfaiA9IG5vZGVfYnVmZmVyLng7XFxcXG52ZWM0IG5leHROb2RlID0gZ2V0RGF0YXVfRGF0YShpbnQoZmxvYXRfaikpO1xcXFxuZmxvYXQgdnggPSBuZXh0Tm9kZS54IC0gY3VycmVudE5vZGUueDtcXFxcbmZsb2F0IHZ5ID0gbmV4dE5vZGUueSAtIGN1cnJlbnROb2RlLnk7XFxcXG5mbG9hdCBkaXN0ID0gc3FydCgodnggKiB2eCkgKyAodnkgKiB2eSkpICsgMC4wMTtcXFxcbmZsb2F0IGRpcmV4ID0gdnggLyBkaXN0O1xcXFxuZmxvYXQgZGlyZXkgPSB2eSAvIGRpc3Q7XFxcXG5mbG9hdCBlZGdlTGVuZ3RoID0gbm9kZV9idWZmZXIueTtcXFxcbmZsb2F0IGVkZ2VTdHJlbmd0aCA9IG5vZGVfYnVmZmVyLno7XFxcXG5mbG9hdCBkaWZmID0gZWRnZUxlbmd0aCAtIGRpc3Q7XFxcXG5mbG9hdCBwYXJhbSA9IChkaWZmICogZWRnZVN0cmVuZ3RoKSAvIG1hc3M7XFxcXG5heCAtPSBkaXJleCAqIHBhcmFtO1xcXFxuYXkgLT0gZGlyZXkgKiBwYXJhbTt9XFxcXG5yZXR1cm4gdmVjMihheCwgYXkpO31cXFxcbnZvaWQgbWFpbigpIHtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLCAxLCAxKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMygxLCAxLCAxKTsgICAgIFxcXFxuaW50IGdsb2JhbEludm9jYXRpb25JbmRleCA9IGludChmbG9vcih2X1RleENvb3JkLnggKiB1X091dHB1dFRleHR1cmVTaXplLngpKVxcXFxuICArIGludChmbG9vcih2X1RleENvb3JkLnkgKiB1X091dHB1dFRleHR1cmVTaXplLnkpKSAqIGludCh1X091dHB1dFRleHR1cmVTaXplLngpO1xcXFxuaW50IHdvcmtHcm91cElETGVuZ3RoID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAqIHdvcmtHcm91cFNpemUueik7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy55IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWiA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWSA9IChnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpIC8gd29ya0dyb3VwU2l6ZS54O1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAtIGxvY2FsSW52b2NhdGlvbklEWSAqIHdvcmtHcm91cFNpemUueDtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMobG9jYWxJbnZvY2F0aW9uSURYLCBsb2NhbEludm9jYXRpb25JRFksIGxvY2FsSW52b2NhdGlvbklEWik7XFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSB3b3JrR3JvdXBJRCAqIHdvcmtHcm91cFNpemUgKyBsb2NhbEludm9jYXRpb25JRDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGxvY2FsSW52b2NhdGlvbklELnogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnlcXFxcbiAgICAgICAgICAgICAgICArIGxvY2FsSW52b2NhdGlvbklELnkgKiB3b3JrR3JvdXBTaXplLnggKyBsb2NhbEludm9jYXRpb25JRC54O1xcXFxuaW50IGkgPSBnbG9iYWxJbnZvY2F0aW9uSUQueDtcXFxcbnZlYzQgY3VycmVudE5vZGUgPSBnZXREYXRhdV9EYXRhKGkpO1xcXFxudmVjNCBtb3ZlbWVudCA9IGdldERhdGF1X0F2ZU1vdmVtZW50KDAuMCk7XFxcXG5mbG9hdCBheCA9IDAuMDtcXFxcbmZsb2F0IGF5ID0gMC4wO1xcXFxuaWYgKChpID49IFZFUlRFWF9DT1VOVCkgfHwgKG1vdmVtZW50LnggPCB1X21pbk1vdmVtZW50KSkge2dsX0ZyYWdDb2xvciA9IHZlYzQoY3VycmVudE5vZGUpO1xcXFxucmV0dXJuIDt9XFxcXG52ZWM0IG5vZGVBdHRyaWJ1dGVzMSA9IGdldERhdGF1X05vZGVBdHRyaWJ1dGVBcnJheTEoaSk7XFxcXG52ZWM0IG5vZGVBdHRyaWJ1dGVzMiA9IGdldERhdGF1X05vZGVBdHRyaWJ1dGVBcnJheTIoaSk7XFxcXG52ZWMyIHJlcHVsc2l2ZSA9IGNhbGNSZXB1bHNpdmUoaSwgY3VycmVudE5vZGUpO1xcXFxuYXggKz0gcmVwdWxzaXZlLng7XFxcXG5heSArPSByZXB1bHNpdmUueTtcXFxcbnZlYzIgYXR0cmFjdGl2ZSA9IGNhbGNBdHRyYWN0aXZlKGksIGN1cnJlbnROb2RlLCBub2RlQXR0cmlidXRlczEpO1xcXFxuYXggKz0gYXR0cmFjdGl2ZS54O1xcXFxuYXkgKz0gYXR0cmFjdGl2ZS55O1xcXFxudmVjMiBncmF2aXR5ID0gY2FsY0dyYXZpdHkoaSwgY3VycmVudE5vZGUsIG5vZGVBdHRyaWJ1dGVzMik7XFxcXG5heCAtPSBncmF2aXR5Lng7XFxcXG5heSAtPSBncmF2aXR5Lnk7XFxcXG5mbG9hdCBwYXJhbSA9IHVfaW50ZXJ2YWwgKiB1X2RhbXBpbmc7XFxcXG5mbG9hdCB2eCA9IGF4ICogcGFyYW07XFxcXG5mbG9hdCB2eSA9IGF5ICogcGFyYW07XFxcXG5mbG9hdCB2bGVuZ3RoID0gc3FydCgodnggKiB2eCkgKyAodnkgKiB2eSkpICsgMC4wMDAxO1xcXFxuaWYgKHZsZW5ndGggPiB1X21heFNwZWVkKSB7ZmxvYXQgcGFyYW0yID0gdV9tYXhTcGVlZCAvIHZsZW5ndGg7XFxcXG52eCA9IHBhcmFtMiAqIHZ4O1xcXFxudnkgPSBwYXJhbTIgKiB2eTt9XFxcXG5mbG9hdCBkaXN0eCA9IHZ4ICogdV9pbnRlcnZhbDtcXFxcbmZsb2F0IGRpc3R5ID0gdnkgKiB1X2ludGVydmFsO1xcXFxuZmxvYXQgZGlzdExlbmd0aCA9IHNxcnQoKGRpc3R4ICogZGlzdHgpICsgKGRpc3R5ICogZGlzdHkpKTtcXFxcbmdsX0ZyYWdDb2xvciA9IHZlYzQodmVjNChjdXJyZW50Tm9kZS54ICsgZGlzdHgsIGN1cnJlbnROb2RlLnkgKyBkaXN0eSwgY3VycmVudE5vZGUueiwgZGlzdExlbmd0aCkpO2lmIChnV2ViR1BVRGVidWcpIHtcXFxcbiAgZ2xfRnJhZ0NvbG9yID0gZ1dlYkdQVURlYnVnT3V0cHV0O1xcXFxufX1cXFxcblwifSxcImNvbnRleHRcIjp7XCJuYW1lXCI6XCJcIixcImRpc3BhdGNoXCI6WzEsMSwxXSxcInRocmVhZEdyb3VwU2l6ZVwiOlsxLDEsMV0sXCJtYXhJdGVyYXRpb25cIjoxLFwiZGVmaW5lc1wiOlt7XCJuYW1lXCI6XCJNQVhfRURHRV9QRVJfVkVSVEVYXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwicnVudGltZVwiOnRydWV9LHtcIm5hbWVcIjpcIlZFUlRFWF9DT1VOVFwiLFwidHlwZVwiOlwiRmxvYXRcIixcInJ1bnRpbWVcIjp0cnVlfSx7XCJuYW1lXCI6XCJTSElGVF8yMFwiLFwidHlwZVwiOlwiRmxvYXRcIixcInZhbHVlXCI6MTA0ODU3NixcInJ1bnRpbWVcIjpmYWxzZX1dLFwidW5pZm9ybXNcIjpbe1wibmFtZVwiOlwidV9EYXRhXCIsXCJ0eXBlXCI6XCJ2ZWM0PGYzMj5bXVwiLFwic3RvcmFnZUNsYXNzXCI6XCJTdG9yYWdlQnVmZmVyXCIsXCJyZWFkb25seVwiOmZhbHNlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfZGFtcGluZ1wiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfbWF4U3BlZWRcIixcInR5cGVcIjpcIkZsb2F0XCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlVuaWZvcm1cIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X21pbk1vdmVtZW50XCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9BdmVNb3ZlbWVudFwiLFwidHlwZVwiOlwidmVjNDxmMzI+W11cIixcInN0b3JhZ2VDbGFzc1wiOlwiU3RvcmFnZUJ1ZmZlclwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfY291bG9tYkRpc1NjYWxlXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9mYWN0b3JcIixcInR5cGVcIjpcIkZsb2F0XCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlVuaWZvcm1cIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X05vZGVBdHRyaWJ1dGVBcnJheTFcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X05vZGVBdHRyaWJ1dGVBcnJheTJcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X2ludGVydmFsXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX1dLFwiZ2xvYmFsRGVjbGFyYXRpb25zXCI6W10sXCJvdXRwdXRcIjp7XCJuYW1lXCI6XCJ1X0RhdGFcIixcInNpemVcIjpbMSwxXSxcImxlbmd0aFwiOjF9LFwibmVlZFBpbmdwb25nXCI6dHJ1ZX19Jykuc2V0RGlzcGF0Y2goW3MsMSwxXSkuc2V0QmluZGluZyh7dV9EYXRhOmYsdV9kYW1waW5nOnIuZGFtcGluZyx1X21heFNwZWVkOnIubWF4U3BlZWQsdV9taW5Nb3ZlbWVudDpyLm1pbk1vdmVtZW50LHVfY291bG9tYkRpc1NjYWxlOnIuY291bG9tYkRpc1NjYWxlLHVfZmFjdG9yOnIuZmFjdG9yLHVfTm9kZUF0dHJpYnV0ZUFycmF5MTptLHVfTm9kZUF0dHJpYnV0ZUFycmF5MjpiLE1BWF9FREdFX1BFUl9WRVJURVg6YyxWRVJURVhfQ09VTlQ6cyx1X0F2ZU1vdmVtZW50OkUsdV9pbnRlcnZhbDpyLmludGVydmFsfSksaz13LmNyZWF0ZUtlcm5lbCgne1wic2hhZGVyc1wiOntcIldHU0xcIjpcImltcG9ydCBcXFxcXCJHTFNMLnN0ZC40NTBcXFxcXCIgYXMgc3RkO1xcXFxuXFxcXG5cXFxcbiMgdmFyIGdXZWJHUFVEZWJ1ZyA6IGJvb2wgPSBmYWxzZTtcXFxcbiMgdmFyIGdXZWJHUFVEZWJ1Z091dHB1dCA6IHZlYzQ8ZjMyPiA9IHZlYzQ8ZjMyPigwLjApO1xcXFxuXFxcXG5bW2J1aWx0aW4gZ2xvYmFsX2ludm9jYXRpb25faWRdXSB2YXI8aW4+IGdsb2JhbEludm9jYXRpb25JRCA6IHZlYzM8dTMyPjtcXFxcbiMgW1tidWlsdGluIHdvcmtfZ3JvdXBfc2l6ZV1dIHZhcjxpbj4gd29ya0dyb3VwU2l6ZSA6IHZlYzM8dTMyPjtcXFxcbiMgW1tidWlsdGluIHdvcmtfZ3JvdXBfaWRdXSB2YXI8aW4+IHdvcmtHcm91cElEIDogdmVjMzx1MzI+O1xcXFxuW1tidWlsdGluIGxvY2FsX2ludm9jYXRpb25faWRdXSB2YXI8aW4+IGxvY2FsSW52b2NhdGlvbklEIDogdmVjMzx1MzI+O1xcXFxuIyBbW2J1aWx0aW4gbnVtX3dvcmtfZ3JvdXBzXV0gdmFyPGluPiBudW1Xb3JrR3JvdXBzIDogdmVjMzx1MzI+O1xcXFxuW1tidWlsdGluIGxvY2FsX2ludm9jYXRpb25faWR4XV0gdmFyPGluPiBsb2NhbEludm9jYXRpb25JbmRleCA6IHUzMjtcXFxcblxcXFxudHlwZSBHV2ViR1BVUGFyYW1zID0gW1tibG9ja11dIHN0cnVjdCB7XFxcXG4gIFtbb2Zmc2V0IDBdXSB1X2l0ZXIgOiBmMzI7XFxcXG59O1xcXFxuW1tiaW5kaW5nIDAsIHNldCAwXV0gdmFyPHVuaWZvcm0+IGdXZWJHUFVVbmlmb3JtUGFyYW1zIDogR1dlYkdQVVBhcmFtcztcXFxcbnR5cGUgR1dlYkdQVUJ1ZmZlcjAgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfRGF0YSA6IFtbc3RyaWRlIDE2XV0gYXJyYXk8dmVjNDxmMzI+PjtcXFxcbn07XFxcXG5bW2JpbmRpbmcgMSwgc2V0IDBdXSB2YXI8c3RvcmFnZV9idWZmZXI+IGdXZWJHUFVCdWZmZXIwIDogR1dlYkdQVUJ1ZmZlcjA7XFxcXG50eXBlIEdXZWJHUFVCdWZmZXIxID0gW1tibG9ja11dIHN0cnVjdCB7XFxcXG4gIFtbb2Zmc2V0IDBdXSB1X0F2ZU1vdmVtZW50IDogW1tzdHJpZGUgMTZdXSBhcnJheTx2ZWM0PGYzMj4+O1xcXFxufTtcXFxcbltbYmluZGluZyAyLCBzZXQgMF1dIHZhcjxzdG9yYWdlX2J1ZmZlcj4gZ1dlYkdQVUJ1ZmZlcjEgOiBHV2ViR1BVQnVmZmVyMTtcXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5mbiBtYWluKCkgLT4gdm9pZCB7dmFyIG1vdmVtZW50IDogZjMyID0gMC4wO1xcXFxuZm9yICh2YXIgaiA6IGkzMiA9IDA7IGogPCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX1ZFUlRFWF9DT1VOVDsgaiA9IGogKyAxKSB7dmFyIHZlcnRleCA6IHZlYzQ8ZjMyPiA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtqXTtcXFxcbm1vdmVtZW50ID0gbW92ZW1lbnQgKyB2ZXJ0ZXgudzt9XFxcXG5tb3ZlbWVudCA9IG1vdmVtZW50IC8gZjMyKF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UKTtcXFxcbmdXZWJHUFVCdWZmZXIxLnVfQXZlTW92ZW1lbnRbMF0gPSB2ZWM0PGYzMj4obW92ZW1lbnQsIDAuMCwgMC4wLCAwLjApO1xcXFxucmV0dXJuO31cXFxcblxcXFxuZW50cnlfcG9pbnQgY29tcHV0ZSBhcyBcXFxcXCJtYWluXFxcXFwiID0gbWFpbjtcXFxcblwiLFwiR0xTTDQ1MFwiOlwiXFxcXG5cXFxcblxcXFxuYm9vbCBnV2ViR1BVRGVidWcgPSBmYWxzZTtcXFxcbnZlYzQgZ1dlYkdQVURlYnVnT3V0cHV0ID0gdmVjNCgwLjApO1xcXFxuXFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhnbF9HbG9iYWxJbnZvY2F0aW9uSUQpO1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsMSwxKTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMoZ2xfV29ya0dyb3VwSUQpO1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhnbF9Mb2NhbEludm9jYXRpb25JRCk7XFxcXG5pdmVjMyBudW1Xb3JrR3JvdXBzID0gaXZlYzMoZ2xfTnVtV29ya0dyb3Vwcyk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSW5kZXggPSBpbnQoZ2xfTG9jYWxJbnZvY2F0aW9uSW5kZXgpO1xcXFxuXFxcXG5sYXlvdXQoc3RkMTQwLCBzZXQgPSAwLCBiaW5kaW5nID0gMCkgdW5pZm9ybSBHV2ViR1BVUGFyYW1zIHtcXFxcbiAgZmxvYXQgdV9pdGVyO1xcXFxufSBnV2ViR1BVVW5pZm9ybVBhcmFtcztcXFxcbmxheW91dChzdGQ0MzAsIHNldCA9IDAsIGJpbmRpbmcgPSAxKSBidWZmZXIgcmVhZG9ubHkgIEdXZWJHUFVCdWZmZXIwIHtcXFxcbiAgdmVjNCB1X0RhdGFbXTtcXFxcbn0gZ1dlYkdQVUJ1ZmZlcjA7XFxcXG5cXFxcbmxheW91dChzdGQ0MzAsIHNldCA9IDAsIGJpbmRpbmcgPSAyKSBidWZmZXIgICBHV2ViR1BVQnVmZmVyMSB7XFxcXG4gIHZlYzQgdV9BdmVNb3ZlbWVudFtdO1xcXFxufSBnV2ViR1BVQnVmZmVyMTtcXFxcblxcXFxuXFxcXG5cXFxcbiNkZWZpbmUgVkVSVEVYX0NPVU5UIF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UXFxcXG5sYXlvdXQgKFxcXFxuICBsb2NhbF9zaXplX3ggPSAxLFxcXFxuICBsb2NhbF9zaXplX3kgPSAxLFxcXFxuICBsb2NhbF9zaXplX3ogPSAxXFxcXG4pIGluO1xcXFxuXFxcXG5cXFxcblxcXFxudm9pZCBtYWluKCkge2Zsb2F0IG1vdmVtZW50ID0gMC4wO1xcXFxuZm9yIChpbnQgaiA9IDA7IGogPCBWRVJURVhfQ09VTlQ7IGorKykge3ZlYzQgdmVydGV4ID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2pdO1xcXFxubW92ZW1lbnQgKz0gdmVydGV4Lnc7fVxcXFxubW92ZW1lbnQgPSBtb3ZlbWVudCAvIGZsb2F0KFZFUlRFWF9DT1VOVCk7XFxcXG5nV2ViR1BVQnVmZmVyMS51X0F2ZU1vdmVtZW50WzBdID0gdmVjNChtb3ZlbWVudCwgMC4wLCAwLjAsIDAuMCk7fVxcXFxuXCIsXCJHTFNMMTAwXCI6XCJcXFxcblxcXFxuZmxvYXQgZXBzaWxvbiA9IDAuMDAwMDE7XFxcXG52ZWMyIGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoZmxvYXQgYWRkcmVzczFELCB2ZWMyIHRleFNpemUpIHtcXFxcbiAgdmVjMiBjb252X2NvbnN0ID0gdmVjMigxLjAgLyB0ZXhTaXplLngsIDEuMCAvICh0ZXhTaXplLnggKiB0ZXhTaXplLnkpKTtcXFxcbiAgdmVjMiBub3JtQWRkcjJEID0gZmxvYXQoYWRkcmVzczFEKSAqIGNvbnZfY29uc3Q7XFxcXG4gIHJldHVybiB2ZWMyKGZyYWN0KG5vcm1BZGRyMkQueCArIGVwc2lsb24pLCBub3JtQWRkcjJELnkpO1xcXFxufVxcXFxuXFxcXG52b2lkIGJhcnJpZXIoKSB7fVxcXFxuICBcXFxcblxcXFxudW5pZm9ybSB2ZWMyIHVfT3V0cHV0VGV4dHVyZVNpemU7XFxcXG51bmlmb3JtIGludCB1X091dHB1dFRleGVsQ291bnQ7XFxcXG52YXJ5aW5nIHZlYzIgdl9UZXhDb29yZDtcXFxcblxcXFxuYm9vbCBnV2ViR1BVRGVidWcgPSBmYWxzZTtcXFxcbnZlYzQgZ1dlYkdQVURlYnVnT3V0cHV0ID0gdmVjNCgwLjApO1xcXFxuXFxcXG4jZGVmaW5lIFZFUlRFWF9DT1VOVCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX1ZFUlRFWF9DT1VOVFxcXFxuXFxcXG51bmlmb3JtIHNhbXBsZXIyRCB1X0RhdGE7XFxcXG51bmlmb3JtIHZlYzIgdV9EYXRhU2l6ZTtcXFxcbnZlYzQgZ2V0RGF0YXVfRGF0YSh2ZWMyIGFkZHJlc3MyRCkge1xcXFxuICByZXR1cm4gdmVjNCh0ZXh0dXJlMkQodV9EYXRhLCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9EYXRhKGZsb2F0IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfRGF0YShhZGRyVHJhbnNsYXRpb25fMUR0bzJEKGFkZHJlc3MxRCwgdV9EYXRhU2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9EYXRhKGludCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0RhdGEoZmxvYXQoYWRkcmVzczFEKSk7XFxcXG59XFxcXG51bmlmb3JtIGZsb2F0IHVfaXRlcjtcXFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfQXZlTW92ZW1lbnQ7XFxcXG51bmlmb3JtIHZlYzIgdV9BdmVNb3ZlbWVudFNpemU7XFxcXG52ZWM0IGdldERhdGF1X0F2ZU1vdmVtZW50KHZlYzIgYWRkcmVzczJEKSB7XFxcXG4gIHJldHVybiB2ZWM0KHRleHR1cmUyRCh1X0F2ZU1vdmVtZW50LCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9BdmVNb3ZlbWVudChmbG9hdCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0F2ZU1vdmVtZW50KGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoYWRkcmVzczFELCB1X0F2ZU1vdmVtZW50U2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9BdmVNb3ZlbWVudChpbnQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9BdmVNb3ZlbWVudChmbG9hdChhZGRyZXNzMUQpKTtcXFxcbn1cXFxcbnZvaWQgbWFpbigpIHtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLCAxLCAxKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMygxLCAxLCAxKTsgICAgIFxcXFxuaW50IGdsb2JhbEludm9jYXRpb25JbmRleCA9IGludChmbG9vcih2X1RleENvb3JkLnggKiB1X091dHB1dFRleHR1cmVTaXplLngpKVxcXFxuICArIGludChmbG9vcih2X1RleENvb3JkLnkgKiB1X091dHB1dFRleHR1cmVTaXplLnkpKSAqIGludCh1X091dHB1dFRleHR1cmVTaXplLngpO1xcXFxuaW50IHdvcmtHcm91cElETGVuZ3RoID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAqIHdvcmtHcm91cFNpemUueik7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy55IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWiA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWSA9IChnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpIC8gd29ya0dyb3VwU2l6ZS54O1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAtIGxvY2FsSW52b2NhdGlvbklEWSAqIHdvcmtHcm91cFNpemUueDtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMobG9jYWxJbnZvY2F0aW9uSURYLCBsb2NhbEludm9jYXRpb25JRFksIGxvY2FsSW52b2NhdGlvbklEWik7XFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSB3b3JrR3JvdXBJRCAqIHdvcmtHcm91cFNpemUgKyBsb2NhbEludm9jYXRpb25JRDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGxvY2FsSW52b2NhdGlvbklELnogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnlcXFxcbiAgICAgICAgICAgICAgICArIGxvY2FsSW52b2NhdGlvbklELnkgKiB3b3JrR3JvdXBTaXplLnggKyBsb2NhbEludm9jYXRpb25JRC54O1xcXFxuZmxvYXQgbW92ZW1lbnQgPSAwLjA7XFxcXG5mb3IgKGludCBqID0gMDsgaiA8IFZFUlRFWF9DT1VOVDsgaisrKSB7dmVjNCB2ZXJ0ZXggPSBnZXREYXRhdV9EYXRhKGopO1xcXFxubW92ZW1lbnQgKz0gdmVydGV4Lnc7fVxcXFxubW92ZW1lbnQgPSBtb3ZlbWVudCAvIGZsb2F0KFZFUlRFWF9DT1VOVCk7XFxcXG5nbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzQobW92ZW1lbnQsIDAuMCwgMC4wLCAwLjApKTtpZiAoZ1dlYkdQVURlYnVnKSB7XFxcXG4gIGdsX0ZyYWdDb2xvciA9IGdXZWJHUFVEZWJ1Z091dHB1dDtcXFxcbn19XFxcXG5cIn0sXCJjb250ZXh0XCI6e1wibmFtZVwiOlwiXCIsXCJkaXNwYXRjaFwiOlsxLDEsMV0sXCJ0aHJlYWRHcm91cFNpemVcIjpbMSwxLDFdLFwibWF4SXRlcmF0aW9uXCI6MSxcImRlZmluZXNcIjpbe1wibmFtZVwiOlwiVkVSVEVYX0NPVU5UXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwicnVudGltZVwiOnRydWV9XSxcInVuaWZvcm1zXCI6W3tcIm5hbWVcIjpcInVfRGF0YVwiLFwidHlwZVwiOlwidmVjNDxmMzI+W11cIixcInN0b3JhZ2VDbGFzc1wiOlwiU3RvcmFnZUJ1ZmZlclwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfaXRlclwiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfQXZlTW92ZW1lbnRcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6ZmFsc2UsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX1dLFwiZ2xvYmFsRGVjbGFyYXRpb25zXCI6W10sXCJvdXRwdXRcIjp7XCJuYW1lXCI6XCJ1X0F2ZU1vdmVtZW50XCIsXCJzaXplXCI6WzEsMV0sXCJsZW5ndGhcIjoxfSxcIm5lZWRQaW5ncG9uZ1wiOnRydWV9fScpLnNldERpc3BhdGNoKFsxLDEsMV0pLnNldEJpbmRpbmcoe3VfRGF0YTpmLFZFUlRFWF9DT1VOVDpzLHVfQXZlTW92ZW1lbnQ6WzAsMCwwLDBdfSksTT1mdW5jdGlvbigpe3JldHVybiBPaChBLHZvaWQgMCx2b2lkIDAscmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgbyxzLHU7cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihuKXtmb3IoOzspc3dpdGNoKG4ucHJldj1uLm5leHQpe2Nhc2UgMDpvPTA7Y2FzZSAxOmlmKCEobzxhKSl7bi5uZXh0PTEyO2JyZWFrfXJldHVybiBuLm5leHQ9NCxPLmV4ZWN1dGUoKTtjYXNlIDQ6cmV0dXJuIGsuc2V0QmluZGluZyh7dV9EYXRhOk99KSxuLm5leHQ9NyxrLmV4ZWN1dGUoKTtjYXNlIDc6cz1NYXRoLm1heCguMDIsci5pbnRlcnZhbC0uMDAyKm8pLE8uc2V0QmluZGluZyh7dV9pbnRlcnZhbDpzLHVfQXZlTW92ZW1lbnQ6a30pO2Nhc2UgOTpvKyssbi5uZXh0PTE7YnJlYWs7Y2FzZSAxMjpyZXR1cm4gbi5uZXh0PTE0LE8uZ2V0T3V0cHV0KCk7Y2FzZSAxNDp1PW4uc2VudCx0P2UucG9zdE1lc3NhZ2Uoe3R5cGU6d2ksdmVydGV4RWRnZURhdGE6dX0pOmkuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgbj11WzQqZV0scj11WzQqZSsxXTt0Lng9bix0Lnk9cn0pKSxTJiZTKCk7Y2FzZSAxNzpjYXNlXCJlbmRcIjpyZXR1cm4gbi5zdG9wKCl9fSksbil9KSkpfSxuLm5leHQ9MzMsTSgpO2Nhc2UgMzM6Y2FzZVwiZW5kXCI6cmV0dXJuIG4uc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleTpcImdldFR5cGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblwiZ0ZvcmNlLWdwdVwifX1dKSYmeGgoZS5wcm90b3R5cGUsbiksciYmeGgoZSxyKSxvfShRbik7ZnVuY3Rpb24gTWgodCl7cmV0dXJuKE1oPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBBaCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gVGgodCxlKXtyZXR1cm4oVGg9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIENoKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9UGgodCk7aWYoZSl7dmFyIGk9UGgodGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIEloKHRoaXMsbil9fWZ1bmN0aW9uIEloKHQsZSl7cmV0dXJuIWV8fFwib2JqZWN0XCIhPT1NaChlKSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZT9mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4gdH0odCk6ZX1mdW5jdGlvbiBQaCh0KXtyZXR1cm4oUGg9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfXZhciBqaD1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlRoKHQsZSl9KG8sdCk7dmFyIGUsbixyLGk9Q2gobyk7ZnVuY3Rpb24gbyh0KXt2YXIgZTtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLG8pLChlPWkuY2FsbCh0aGlzKSkuY2VudGVyPVswLDBdLGUubWF4SXRlcmF0aW9uPTEwMCxlLmdyYXZpdHk9MTAsZS5jb21ib0dyYXZpdHk9MTAsZS5saW5rRGlzdGFuY2U9MTAsZS5hbHBoYT0xLGUuYWxwaGFNaW49LjAwMSxlLmFscGhhRGVjYXk9MS1NYXRoLnBvdyhlLmFscGhhTWluLDEvMzAwKSxlLmFscGhhVGFyZ2V0PTAsZS52ZWxvY2l0eURlY2F5PS42LGUuZWRnZVN0cmVuZ3RoPS42LGUubm9kZVN0cmVuZ3RoPTMwLGUucHJldmVudE92ZXJsYXA9ITEsZS5wcmV2ZW50Tm9kZU92ZXJsYXA9ITEsZS5wcmV2ZW50Q29tYm9PdmVybGFwPSExLGUuY29sbGlkZVN0cmVuZ3RoPXZvaWQgMCxlLm5vZGVDb2xsaWRlU3RyZW5ndGg9LjUsZS5jb21ib0NvbGxpZGVTdHJlbmd0aD0uNSxlLmNvbWJvU3BhY2luZz0yMCxlLmNvbWJvUGFkZGluZz0xMCxlLm9wdGltaXplUmFuZ2VGYWN0b3I9MSxlLm9uVGljaz1mdW5jdGlvbigpe30sZS5vbkxheW91dEVuZD1mdW5jdGlvbigpe30sZS5kZXB0aEF0dHJhY3RpdmVGb3JjZVNjYWxlPTEsZS5kZXB0aFJlcHVsc2l2ZUZvcmNlU2NhbGU9MixlLm5vZGVzPVtdLGUuZWRnZXM9W10sZS5jb21ib3M9W10sZS5jb21ib1RyZWVzPVtdLGUud2lkdGg9MzAwLGUuaGVpZ2h0PTMwMCxlLmJpYXM9W10sZS5ub2RlTWFwPXt9LGUub3JpQ29tYm9NYXA9e30sZS5pbmRleE1hcD17fSxlLmNvbWJvTWFwPXt9LGUucHJldmlvdXNMYXlvdXRlZD0hMSxlLnVwZGF0ZUNmZyh0KSxlfXJldHVybiBlPW8sKG49W3trZXk6XCJnZXREZWZhdWx0Q2ZnXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57bWF4SXRlcmF0aW9uOjEwMCxjZW50ZXI6WzAsMF0sZ3Jhdml0eToxMCxzcGVlZDoxLGNvbWJvR3Jhdml0eTozMCxwcmV2ZW50T3ZlcmxhcDohMSxwcmV2ZW50Q29tYm9PdmVybGFwOiEwLHByZXZlbnROb2RlT3ZlcmxhcDohMCxub2RlU3BhY2luZzp2b2lkIDAsY29sbGlkZVN0cmVuZ3RoOnZvaWQgMCxub2RlQ29sbGlkZVN0cmVuZ3RoOi41LGNvbWJvQ29sbGlkZVN0cmVuZ3RoOi41LGNvbWJvU3BhY2luZzoyMCxjb21ib1BhZGRpbmc6MTAsZWRnZVN0cmVuZ3RoOi42LG5vZGVTdHJlbmd0aDozMCxsaW5rRGlzdGFuY2U6MTB9fX0se2tleTpcImV4ZWN1dGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMubm9kZXMsZT10aGlzLmNlbnRlcjtpZih0aGlzLmNvbWJvVHJlZT17aWQ6XCJjb21ib1RyZWVSb290XCIsZGVwdGg6LTEsY2hpbGRyZW46dGhpcy5jb21ib1RyZWVzfSx0JiYwIT09dC5sZW5ndGgpe2lmKDE9PT10Lmxlbmd0aClyZXR1cm4gdFswXS54PWVbMF0sdFswXS55PWVbMV0sdm9pZCh0aGlzLm9uTGF5b3V0RW5kJiZ0aGlzLm9uTGF5b3V0RW5kKCkpO3RoaXMuaW5pdFZhbHMoKSx0aGlzLnJ1bigpLHRoaXMub25MYXlvdXRFbmQmJnRoaXMub25MYXlvdXRFbmQoKX1lbHNlIHRoaXMub25MYXlvdXRFbmQmJnRoaXMub25MYXlvdXRFbmQoKX19LHtrZXk6XCJydW5cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10Lm5vZGVzLG49dC5wcmV2aW91c0xheW91dGVkP3QubWF4SXRlcmF0aW9uLzU6dC5tYXhJdGVyYXRpb247dC53aWR0aHx8XCJ1bmRlZmluZWRcIj09dHlwZW9mIHdpbmRvd3x8KHQud2lkdGg9d2luZG93LmlubmVyV2lkdGgpLHQuaGVpZ2h0fHxcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwodC5oZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0KTt2YXIgcj10LmNlbnRlcixpPXQudmVsb2NpdHlEZWNheSxvPXQuY29tYm9NYXA7dC5wcmV2aW91c0xheW91dGVkfHx0LmluaXRQb3Mobyk7Zm9yKHZhciBhPWZ1bmN0aW9uKG4pe3ZhciByPVtdO2UuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtyW2VdPXt4OjAseTowfX0pKSx0LmFwcGx5Q2FsY3VsYXRlKHIpLHQuYXBwbHlDb21ib0NlbnRlckZvcmNlKHIpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtVbih0LngpJiZVbih0LnkpJiYodC54Kz1yW2VdLngqaSx0LnkrPXJbZV0ueSppKX0pKSx0LmFscGhhKz0odC5hbHBoYVRhcmdldC10LmFscGhhKSp0LmFscGhhRGVjYXksdC5vblRpY2soKX0scz0wO3M8bjtzKyspYSgpO3ZhciB1PVswLDBdO2UuZm9yRWFjaCgoZnVuY3Rpb24odCl7VW4odC54KSYmVW4odC55KSYmKHVbMF0rPXQueCx1WzFdKz10LnkpfSkpLHVbMF0vPWUubGVuZ3RoLHVbMV0vPWUubGVuZ3RoO3ZhciBjPVtyWzBdLXVbMF0sclsxXS11WzFdXTtlLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7VW4odC54KSYmVW4odC55KSYmKHQueCs9Y1swXSx0LnkrPWNbMV0pfSkpLHQuY29tYm9zLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPW9bdC5pZF07ZSYmZS5lbXB0eSYmKHQueD1lLmN4fHx0LngsdC55PWUuY3l8fHQueSl9KSksdC5wcmV2aW91c0xheW91dGVkPSEwfX0se2tleTpcImluaXRWYWxzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2VzLGU9dGhpcy5ub2RlcyxuPXRoaXMuY29tYm9zLHI9e30saT17fSxvPXt9O2UuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtpW3QuaWRdPXQsb1t0LmlkXT1lfSkpLHRoaXMubm9kZU1hcD1pLHRoaXMuaW5kZXhNYXA9bzt2YXIgYT17fTtuLmZvckVhY2goKGZ1bmN0aW9uKHQpe2FbdC5pZF09dH0pKSx0aGlzLm9yaUNvbWJvTWFwPWEsdGhpcy5jb21ib01hcD10aGlzLmdldENvbWJvTWFwKCk7dmFyIHM9dGhpcy5wcmV2ZW50T3ZlcmxhcDt0aGlzLnByZXZlbnRDb21ib092ZXJsYXA9dGhpcy5wcmV2ZW50Q29tYm9PdmVybGFwfHxzLHRoaXMucHJldmVudE5vZGVPdmVybGFwPXRoaXMucHJldmVudE5vZGVPdmVybGFwfHxzO3ZhciB1PXRoaXMuY29sbGlkZVN0cmVuZ3RoO3UmJih0aGlzLmNvbWJvQ29sbGlkZVN0cmVuZ3RoPXUsdGhpcy5ub2RlQ29sbGlkZVN0cmVuZ3RoPXUpLHRoaXMuY29tYm9Db2xsaWRlU3RyZW5ndGg9dGhpcy5jb21ib0NvbGxpZGVTdHJlbmd0aD90aGlzLmNvbWJvQ29sbGlkZVN0cmVuZ3RoOjAsdGhpcy5ub2RlQ29sbGlkZVN0cmVuZ3RoPXRoaXMubm9kZUNvbGxpZGVTdHJlbmd0aD90aGlzLm5vZGVDb2xsaWRlU3RyZW5ndGg6MDtmb3IodmFyIGM9MDtjPHQubGVuZ3RoOysrYylyW3RbY10uc291cmNlXT9yW3RbY10uc291cmNlXSsrOnJbdFtjXS5zb3VyY2VdPTEsclt0W2NdLnRhcmdldF0/clt0W2NdLnRhcmdldF0rKzpyW3RbY10udGFyZ2V0XT0xO2Zvcih2YXIgZj1bXSxsPTA7bDx0Lmxlbmd0aDsrK2wpZltsXT1yW3RbbF0uc291cmNlXS8oclt0W2xdLnNvdXJjZV0rclt0W2xdLnRhcmdldF0pO3RoaXMuYmlhcz1mO3ZhciBoLGQscD10aGlzLm5vZGVTaXplLGc9dGhpcy5ub2RlU3BhY2luZztpZihkPVVuKGcpP2Z1bmN0aW9uKCl7cmV0dXJuIGd9OktuKGcpP2c6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdGhpcy5ub2RlU3BhY2luZz1kLHApaWYoS24ocCkpaD1mdW5jdGlvbih0KXtyZXR1cm4gcCh0KX07ZWxzZSBpZihGbihwKSl7dmFyIHY9KHBbMF0+cFsxXT9wWzBdOnBbMV0pLzI7aD1mdW5jdGlvbih0KXtyZXR1cm4gdn19ZWxzZXt2YXIgeT1wLzI7aD1mdW5jdGlvbih0KXtyZXR1cm4geX19ZWxzZSBoPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNpemU/Rm4odC5zaXplKT8odC5zaXplWzBdPnQuc2l6ZVsxXT90LnNpemVbMF06dC5zaXplWzFdKS8yOnQuc2l6ZS8yOjEwfTt0aGlzLm5vZGVTaXplPWg7dmFyIG0sYj10aGlzLmNvbWJvU3BhY2luZzttPVVuKGIpP2Z1bmN0aW9uKCl7cmV0dXJuIGJ9OktuKGIpP2I6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdGhpcy5jb21ib1NwYWNpbmc9bTt2YXIgeCx3PXRoaXMuY29tYm9QYWRkaW5nO3g9VW4odyk/ZnVuY3Rpb24oKXtyZXR1cm4gd306Rm4odyk/ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCx3KX06S24odyk/dzpmdW5jdGlvbigpe3JldHVybiAwfSx0aGlzLmNvbWJvUGFkZGluZz14O3ZhciBTLEU9dGhpcy5saW5rRGlzdGFuY2U7RXx8KEU9MTApLFM9VW4oRSk/ZnVuY3Rpb24odCl7cmV0dXJuIEV9OkUsdGhpcy5saW5rRGlzdGFuY2U9Uzt2YXIgXyxPPXRoaXMuZWRnZVN0cmVuZ3RoO098fChPPTEpLF89VW4oTyk/ZnVuY3Rpb24odCl7cmV0dXJuIE99Ok8sdGhpcy5lZGdlU3RyZW5ndGg9Xzt2YXIgayxNPXRoaXMubm9kZVN0cmVuZ3RoO018fChNPTMwKSxrPVVuKE0pP2Z1bmN0aW9uKHQpe3JldHVybiBNfTpNLHRoaXMubm9kZVN0cmVuZ3RoPWt9fSx7a2V5OlwiaW5pdFBvc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMubm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt2YXIgcj1lLmNvbWJvSWQsaT10W3JdO3ImJmk/KGUueD1pLmN4KzEwMC8obisxKSxlLnk9aS5jeSsxMDAvKG4rMSkpOihlLng9MTAwLyhuKzEpLGUueT0xMDAvKG4rMSkpfSkpfX0se2tleTpcImdldENvbWJvTWFwXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5ub2RlTWFwLG49dC5pbmRleE1hcCxyPXQuY29tYm9UcmVlcyxpPXQub3JpQ29tYm9NYXAsbz17fTtyZXR1cm4ocnx8W10pLmZvckVhY2goKGZ1bmN0aW9uKHIpe3ZhciBhPVtdO1luKHIsKGZ1bmN0aW9uKHIpe2lmKFwibm9kZVwiPT09ci5pdGVtVHlwZSlyZXR1cm4hMDtpZighaVtyLmlkXSlyZXR1cm4hMDtpZih2b2lkIDA9PT1vW3IuaWRdKXt2YXIgcz17aWQ6ci5pZCxuYW1lOnIuaWQsY3g6MCxjeTowLGNvdW50OjAsZGVwdGg6dC5vcmlDb21ib01hcFtyLmlkXS5kZXB0aCxjaGlsZHJlbjpbXX07b1tyLmlkXT1zfXZhciB1PXIuY2hpbGRyZW47dSYmdS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighb1t0LmlkXSYmIWVbdC5pZF0pcmV0dXJuITA7YS5wdXNoKHQpfSkpO3ZhciBjPW9bci5pZF07aWYoYy5jeD0wLGMuY3k9MCwwPT09YS5sZW5ndGgpe2MuZW1wdHk9ITA7dmFyIGY9aVtyLmlkXSxsPU9iamVjdC5rZXlzKGUpLmxlbmd0aCxoPVwiXCIuY29uY2F0KHIuaWQsXCItdmlzdWFsLWNoaWxkLVwiKS5jb25jYXQobCksZD17aWQ6aCx4OmYueCx5OmYueSxkZXB0aDpjLmRlcHRoKzEsaXRlbVR5cGU6XCJub2RlXCJ9O3Qubm9kZXMucHVzaChkKSxlW2hdPWQsbltoXT1sLGMuY3g9Zi54LGMuY3k9Zi55LGEucHVzaChkKX1yZXR1cm4gYS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZihjLmNvdW50KyssXCJub2RlXCIhPT10Lml0ZW1UeXBlKXt2YXIgbj1vW3QuaWRdO3JldHVybiBVbihuLmN4KSYmKGMuY3grPW4uY3gpLHZvaWQoVW4obi5jeSkmJihjLmN5Kz1uLmN5KSl9dmFyIHI9ZVt0LmlkXTtyJiYoVW4oci54KSYmKGMuY3grPXIueCksVW4oci55KSYmKGMuY3krPXIueSkpfSkpLGMuY3gvPWMuY291bnQsYy5jeS89Yy5jb3VudCxjLmNoaWxkcmVuPWEsITB9KSl9KSksb319LHtrZXk6XCJhcHBseUNvbWJvQ2VudGVyRm9yY2VcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdyYXZpdHksbj10aGlzLmNvbWJvR3Jhdml0eXx8ZSxyPXRoaXMuYWxwaGEsaT10aGlzLmNvbWJvVHJlZXMsbz10aGlzLmluZGV4TWFwLGE9dGhpcy5ub2RlTWFwLHM9dGhpcy5jb21ib01hcDsoaXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKGUpe1luKGUsKGZ1bmN0aW9uKGUpe2lmKFwibm9kZVwiPT09ZS5pdGVtVHlwZSlyZXR1cm4hMDtpZighc1tlLmlkXSlyZXR1cm4hMDt2YXIgaT1zW2UuaWRdLHU9KGkuZGVwdGgrMSkvMTAqLjUsYz1pLmN4LGY9aS5jeTtyZXR1cm4gaS5jeD0wLGkuY3k9MCxpLmNoaWxkcmVuLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKFwibm9kZVwiIT09ZS5pdGVtVHlwZSl7dmFyIGw9c1tlLmlkXTtyZXR1cm4gbCYmVW4obC5jeCkmJihpLmN4Kz1sLmN4KSx2b2lkKGwmJlVuKGwuY3kpJiYoaS5jeSs9bC5jeSkpfXZhciBoPWFbZS5pZF0sZD1oLngtY3x8LjAwNSxwPWgueS1mfHwuMDA1LGc9TWF0aC5zcXJ0KGQqZCtwKnApLHY9b1toLmlkXSx5PW4qci9nKnU7dFt2XS54LT1kKnksdFt2XS55LT1wKnksVW4oaC54KSYmKGkuY3grPWgueCksVW4oaC55KSYmKGkuY3krPWgueSl9KSksaS5jeC89aS5jb3VudCxpLmN5Lz1pLmNvdW50LCEwfSkpfSkpfX0se2tleTpcImFwcGx5Q2FsY3VsYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb21ib01hcCxuPXRoaXMubm9kZXMscj17fTtuLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7bi5mb3JFYWNoKChmdW5jdGlvbihuLGkpe2lmKCEoZTxpKSl7dmFyIG89dC54LW4ueHx8LjAwNSxhPXQueS1uLnl8fC4wMDUscz1vKm8rYSphLHU9TWF0aC5zcXJ0KHMpO3M8MSYmKHM9dSkscltcIlwiLmNvbmNhdCh0LmlkLFwiLVwiKS5jb25jYXQobi5pZCldPXt2eDpvLHZ5OmEsdmwyOnMsdmw6dX0scltcIlwiLmNvbmNhdChuLmlkLFwiLVwiKS5jb25jYXQodC5pZCldPXt2bDI6cyx2bDp1LHZ4Oi1vLHZ5Oi1hfX19KSl9KSksdGhpcy51cGRhdGVDb21ib1NpemVzKGUpLHRoaXMuY2FsUmVwdWxzaXZlKHQsciksdGhpcy5jYWxBdHRyYWN0aXZlKHQsciksdGhpcy5wcmV2ZW50Q29tYm9PdmVybGFwJiZ0aGlzLmNvbWJvTm9uT3ZlcmxhcHBpbmcodCxlKX19LHtrZXk6XCJ1cGRhdGVDb21ib1NpemVzXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWUuY29tYm9UcmVlcyxyPWUubm9kZU1hcCxpPWUubm9kZVNpemUsbz1lLmNvbWJvU3BhY2luZyxhPWUuY29tYm9QYWRkaW5nOyhufHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHM9W107WW4obiwoZnVuY3Rpb24obil7aWYoXCJub2RlXCI9PT1uLml0ZW1UeXBlKXJldHVybiEwO3ZhciB1PXRbbi5pZF07aWYoIXUpcmV0dXJuITE7dmFyIGM9bi5jaGlsZHJlbjtjJiZjLmZvckVhY2goKGZ1bmN0aW9uKGUpeyh0W2UuaWRdfHxyW2UuaWRdKSYmcy5wdXNoKGUpfSkpLHUubWluWD0xLzAsdS5taW5ZPTEvMCx1Lm1heFg9LTEvMCx1Lm1heFk9LTEvMCxzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKFwibm9kZVwiIT09dC5pdGVtVHlwZSlyZXR1cm4hMDt2YXIgZT1yW3QuaWRdO2lmKCFlKXJldHVybiEwO3ZhciBuPWkoZSksbz1lLngtbixhPWUueS1uLHM9ZS54K24sYz1lLnkrbjt1Lm1pblg+byYmKHUubWluWD1vKSx1Lm1pblk+YSYmKHUubWluWT1hKSx1Lm1heFg8cyYmKHUubWF4WD1zKSx1Lm1heFk8YyYmKHUubWF4WT1jKX0pKTt2YXIgZj1lLm9yaUNvbWJvTWFwW24uaWRdLnNpemV8fDEwO0ZuKGYpJiYoZj1mWzBdKTt2YXIgbD1NYXRoLm1heCh1Lm1heFgtdS5taW5YLHUubWF4WS11Lm1pblksZik7cmV0dXJuIHUucj1sLzIrbyh1KS8yK2EodSksITB9KSl9KSl9fSx7a2V5OlwiY29tYm9Ob25PdmVybGFwcGluZ1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb21ib1RyZWUscj10aGlzLmNvbWJvQ29sbGlkZVN0cmVuZ3RoLGk9dGhpcy5pbmRleE1hcCxvPXRoaXMubm9kZU1hcDtZbihuLChmdW5jdGlvbihuKXtpZighZVtuLmlkXSYmIW9bbi5pZF0mJlwiY29tYm9UcmVlUm9vdFwiIT09bi5pZClyZXR1cm4hMTt2YXIgYT1uLmNoaWxkcmVuO3JldHVybiBhJiZhLmxlbmd0aD4xJiZhLmZvckVhY2goKGZ1bmN0aW9uKG4scyl7aWYoXCJub2RlXCI9PT1uLml0ZW1UeXBlKXJldHVybiExO3ZhciB1PWVbbi5pZF07dSYmYS5mb3JFYWNoKChmdW5jdGlvbihhLGMpe2lmKHM8PWMpcmV0dXJuITE7aWYoXCJub2RlXCI9PT1hLml0ZW1UeXBlKXJldHVybiExO3ZhciBmPWVbYS5pZF07aWYoIWYpcmV0dXJuITE7dmFyIGw9dS5jeC1mLmN4fHwuMDA1LGg9dS5jeS1mLmN5fHwuMDA1LGQ9bCpsK2gqaCxwPXUucixnPWYucix2PXArZyx5PWcqZyxtPXAqcDtpZihkPHYqdil7dmFyIGI9bi5jaGlsZHJlbjtpZighYnx8MD09PWIubGVuZ3RoKXJldHVybiExO3ZhciB4PWEuY2hpbGRyZW47aWYoIXh8fDA9PT14Lmxlbmd0aClyZXR1cm4hMTt2YXIgdz1NYXRoLnNxcnQoZCksUz0odi13KS93KnIsRT1sKlMsXz1oKlMsTz15LyhtK3kpLGs9MS1PO2IuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoXCJub2RlXCIhPT1lLml0ZW1UeXBlKXJldHVybiExO2lmKG9bZS5pZF0pe3ZhciBuPWlbZS5pZF07eC5mb3JFYWNoKChmdW5jdGlvbihlKXtpZihcIm5vZGVcIiE9PWUuaXRlbVR5cGUpcmV0dXJuITE7aWYoIW9bZS5pZF0pcmV0dXJuITE7dmFyIHI9aVtlLmlkXTt0W25dLngrPUUqTyx0W25dLnkrPV8qTyx0W3JdLngtPUUqayx0W3JdLnktPV8qa30pKX19KSl9fSkpfSkpLCEwfSkpfX0se2tleTpcImNhbFJlcHVsc2l2ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPW4ubm9kZXMsaT1uLndpZHRoKm4ub3B0aW1pemVSYW5nZUZhY3RvcixvPW4ubm9kZVN0cmVuZ3RoLGE9bi5hbHBoYSxzPW4ubm9kZUNvbGxpZGVTdHJlbmd0aCx1PW4ucHJldmVudE5vZGVPdmVybGFwLGM9bi5ub2RlU2l6ZSxmPW4ubm9kZVNwYWNpbmcsbD1uLmRlcHRoUmVwdWxzaXZlRm9yY2VTY2FsZSxoPW4uY2VudGVyO3IuZm9yRWFjaCgoZnVuY3Rpb24oZCxwKXtpZihkLngmJmQueSl7aWYoaCl7dmFyIGc9bi5ncmF2aXR5LHY9ZC54LWhbMF18fC4wMDUseT1kLnktaFsxXXx8LjAwNSxtPU1hdGguc3FydCh2KnYreSp5KTt0W3BdLngtPXYqZyphL20sdFtwXS55LT15KmcqYS9tfXIuZm9yRWFjaCgoZnVuY3Rpb24obixyKXtpZihwIT09ciYmbi54JiZuLnkpe3ZhciBoPWVbXCJcIi5jb25jYXQoZC5pZCxcIi1cIikuY29uY2F0KG4uaWQpXSxnPWgudmwyLHY9aC52bDtpZighKHY+aSkpe3ZhciB5PWVbXCJcIi5jb25jYXQoZC5pZCxcIi1cIikuY29uY2F0KG4uaWQpXSxtPXkudngsYj15LnZ5LHg9TWF0aC5sb2coTWF0aC5hYnMobi5kZXB0aC1kLmRlcHRoKS8xMCkrMXx8MTt4PXg8MT8xOngsbi5jb21ib0lkIT09ZC5jb21ib0lkJiYoeCs9MSk7dmFyIHc9eD9NYXRoLnBvdyhsLHgpOjEsUz1vKG4pKmEvZyp3O2lmKHRbcF0ueCs9bSpTLHRbcF0ueSs9YipTLHA8ciYmdSl7dmFyIEU9YyhkKStmKGQpLF89YyhuKStmKG4pLE89RStfO2lmKGc8TypPKXt2YXIgaz0oTy12KS92KnMsTT1fKl8sQT1NLyhFKkUrTSksVD1tKmssQz1iKms7dFtwXS54Kz1UKkEsdFtwXS55Kz1DKkEsQT0xLUEsdFtyXS54LT1UKkEsdFtyXS55LT1DKkF9fX19fSkpfX0pKX19LHtrZXk6XCJjYWxBdHRyYWN0aXZlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9bi5lZGdlcyxpPW4ubGlua0Rpc3RhbmNlLG89bi5hbHBoYSxhPW4uZWRnZVN0cmVuZ3RoLHM9bi5iaWFzLHU9bi5kZXB0aEF0dHJhY3RpdmVGb3JjZVNjYWxlO3IuZm9yRWFjaCgoZnVuY3Rpb24ocixjKXtpZihyLnNvdXJjZSYmci50YXJnZXQmJnIuc291cmNlIT09ci50YXJnZXQpe3ZhciBmPW4uaW5kZXhNYXBbci5zb3VyY2VdLGw9bi5pbmRleE1hcFtyLnRhcmdldF0saD1uLm5vZGVNYXBbci5zb3VyY2VdLGQ9bi5ub2RlTWFwW3IudGFyZ2V0XTtpZihoJiZkKXt2YXIgcD1NYXRoLmxvZyhNYXRoLmFicyhoLmRlcHRoLWQuZGVwdGgpLzEwKTtoLmNvbWJvSWQ9PT1kLmNvbWJvSWQmJihwLz0yKTt2YXIgZz1wP01hdGgucG93KHUscCk6MTtpZihoLmNvbWJvSWQhPT1kLmNvbWJvSWQmJjE9PT1nP2c9dS8yOmguY29tYm9JZD09PWQuY29tYm9JZCYmKGc9MiksVW4oZC54KSYmVW4oaC54KSYmVW4oZC55KSYmVW4oaC55KSl7dmFyIHY9ZVtcIlwiLmNvbmNhdChyLnRhcmdldCxcIi1cIikuY29uY2F0KHIuc291cmNlKV0seT12LnZsLG09di52eCxiPXYudnkseD0oeS1pKHIpKS95Km8qYShyKSpnLHc9bSp4LFM9Yip4LEU9c1tjXTt0W2xdLngtPXcqRSx0W2xdLnktPVMqRSx0W2ZdLngrPXcqKDEtRSksdFtmXS55Kz1TKigxLUUpfX19fSkpfX0se2tleTpcImdldFR5cGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblwiY29tYm9Gb3JjZVwifX1dKSYmQWgoZS5wcm90b3R5cGUsbiksciYmQWgoZSxyKSxvfShRbik7dmFyIERoLE5oPW5ldyBQcm94eSh7fSx7Z2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFNhKGUpfSxzZXQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB3YShlLG4pLCEwfX0pO0RofHwoRGg9e30pLHdhKFwiZ3JpZFwiLGlyKSx3YShcInJhbmRvbVwiLGxyKSx3YShcImZvcmNlXCIsQWkpLHdhKFwiY2lyY3VsYXJcIixHaSksd2EoXCJkYWdyZVwiLHFpKSx3YShcInJhZGlhbFwiLGRhKSx3YShcImNvbmNlbnRyaWNcIixUYSksd2EoXCJtZHNcIixSYSksd2EoXCJmcnVjaHRlcm1hblwiLFZhKSx3YShcImZydWNodGVybWFuLWdwdVwiLG1oKSx3YShcImdGb3JjZVwiLGJyKSx3YShcImdGb3JjZS1ncHVcIixraCksd2EoXCJjb21ib0ZvcmNlXCIsamgpO3ZhciBSaD1zZWxmO1JoLm9ubWVzc2FnZT1mdW5jdGlvbih0KXsoZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRhLnR5cGU7cmV0dXJuIGU9PT12aXx8ZT09PXhpfSkodCkmJmZ1bmN0aW9uKHQpe3N3aXRjaCh0LmRhdGEudHlwZSl7Y2FzZSB2aTp2YXIgZT10LmRhdGEsbj1lLm5vZGVzLHI9ZS5lZGdlcyxpPWUubGF5b3V0Q2ZnLG89dm9pZCAwPT09aT97fTppLGE9by50eXBlLHM9U2EoYSk7aWYoIXMpe1JoLnBvc3RNZXNzYWdlKHt0eXBlOm1pLG1lc3NhZ2U6XCJsYXlvdXQgXCIuY29uY2F0KGEsXCIgbm90IGZvdW5kXCIpfSk7YnJlYWt9dmFyIHU9bmV3IHMobyk7dS5pbml0KHtub2RlczpuLGVkZ2VzOnJ9KSx1LmV4ZWN1dGUoKSxSaC5wb3N0TWVzc2FnZSh7bm9kZXM6bix0eXBlOnlpfSksdS5kZXN0cm95KCk7YnJlYWs7Y2FzZSB4aTp2YXIgYz10LmRhdGEsZj1jLm5vZGVzLGw9Yy5lZGdlcyxoPWMubGF5b3V0Q2ZnLGQ9dm9pZCAwPT09aD97fTpoLHA9Yy5jYW52YXMsZz1kLnR5cGUsdj1TYShnKTtpZighdil7UmgucG9zdE1lc3NhZ2Uoe3R5cGU6bWksbWVzc2FnZTpcImxheW91dCBcIi5jb25jYXQoZyxcIiBub3QgZm91bmRcIil9KTticmVha31pZihcImdwdVwiIT09Zy5zcGxpdChcIi1cIilbMV0pe1JoLnBvc3RNZXNzYWdlKHt0eXBlOm1pLG1lc3NhZ2U6XCJsYXlvdXQgXCIuY29uY2F0KGcsXCIgZG9lcyBub3Qgc3VwcG9ydCBHUFVcIil9KTticmVha312YXIgeT1uZXcgdihkKTt5LmluaXQoe25vZGVzOmYsZWRnZXM6bH0pLHkuZXhlY3V0ZVdpdGhXb3JrZXIocCxSaCl9fSh0KX07dmFyIExoPWZ1bmN0aW9uKHQsZSl7ZS5pc0N1c3RvbUxheW91dD0hMCx3YSh0LGUpfTt2YXIgQmg9bmV3IGZ1bmN0aW9uKHQpe3ZhciBlPXQudG9TdHJpbmcoKSxuPW5ldyBCbG9iKFtcIihcIitlK1wiKSgpXCJdLHt0eXBlOlwidGV4dC9qYXZhc2NyaXB0XCJ9KTtyZXR1cm4gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKG4pKX0oKGZ1bmN0aW9uKCl7aW1wb3J0U2NyaXB0cyhcImh0dHBzOi8vdW5wa2cuY29tL0BhbnR2L2xheW91dEBsYXRlc3QvZGlzdC9sYXlvdXQubWluLmpzXCIpO3ZhciB0PVwiTEFZT1VUX1JVTlwiLGU9XCJMQVlPVVRfRU5EXCIsbj1cIkxBWU9VVF9FUlJPUlwiLHI9XCJHUFVfTEFZT1VUX1JVTlwiO29ubWVzc2FnZT1mdW5jdGlvbihpKXsoZnVuY3Rpb24oZSl7dmFyIG49ZS5kYXRhLnR5cGU7cmV0dXJuIG49PT10fHxuPT09cn0pKGkpJiZmdW5jdGlvbihpKXtzd2l0Y2goaS5kYXRhLnR5cGUpe2Nhc2UgdDp2YXIgbz1pLmRhdGEsYT1vLm5vZGVzLHM9by5lZGdlcyx1PW8ubGF5b3V0Q2ZnLGM9KHA9dm9pZCAwPT09dT97fTp1KS50eXBlO2lmKCEoZj1sYXlvdXQuZ2V0TGF5b3V0QnlOYW1lKGMpKSl7dGhpcy5wb3N0TWVzc2FnZSh7dHlwZTpuLG1lc3NhZ2U6XCJsYXlvdXQgXCIrYytcIiBub3QgZm91bmRcIn0pO2JyZWFrfShsPW5ldyBmKHApKS5pbml0KHtub2RlczphLGVkZ2VzOnN9KSxsLmV4ZWN1dGUoKSx0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOmUsbm9kZXM6YX0pLGwuZGVzdHJveSgpO2JyZWFrO2Nhc2Ugcjp2YXIgZixsLGg9aS5kYXRhLGQ9KGE9aC5ub2RlcyxzPWguZWRnZXMsaC5sYXlvdXRDZmcpLHA9dm9pZCAwPT09ZD97fTpkLGc9aC5jYW52YXM7Yz1wLnR5cGU7aWYoIShmPWxheW91dC5nZXRMYXlvdXRCeU5hbWUoYykpKXt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOm4sbWVzc2FnZTpcImxheW91dCBcIitjK1wiIG5vdCBmb3VuZFwifSk7YnJlYWt9aWYoXCJncHVcIiE9PWMuc3BsaXQoXCItXCIpWzFdKXt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOm4sbWVzc2FnZTpcImxheW91dCBcIitjK1wiIGRvZXMgbm90IHN1cHBvcnQgR1BVXCJ9KTticmVha30obD1uZXcgZihwKSkuaW5pdCh7bm9kZXM6YSxlZGdlczpzfSksbC5leGVjdXRlV2l0aFdvcmtlcihnLHRoaXMpfX0oaSl9fSkpLEdoPVwiTEFZT1VUX1JVTlwiLEZoPVwiTEFZT1VUX0VORFwiLFVoPVwiTEFZT1VUX0VSUk9SXCIsemg9XCJMQVlPVVRfVElDS1wiLFZoPVwiR1BVX0xBWU9VVF9SVU5cIixXaD1cIkdQVV9MQVlPVVRfRU5EXCIsWGg9ZnVuY3Rpb24gdCgpe3JldHVyblwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBkb2N1bWVudD97fTp7Y2FudmFzOiEhd2luZG93LkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCx3ZWJnbDpmdW5jdGlvbigpe3RyeXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO3JldHVybiEoIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHR8fCF0LmdldENvbnRleHQoXCJ3ZWJnbFwiKSYmIXQuZ2V0Q29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiKSl9Y2F0Y2godCl7cmV0dXJuITF9fSgpLHdvcmtlcnM6ISF3aW5kb3cuV29ya2VyLGZpbGVhcGk6d2luZG93LkZpbGUmJndpbmRvdy5GaWxlUmVhZGVyJiZ3aW5kb3cuRmlsZUxpc3QmJndpbmRvdy5CbG9iLGdldFdlYkdMRXJyb3JNZXNzYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gdC5pZD1cIndlYmdsLWVycm9yLW1lc3NhZ2VcIix0LnN0eWxlLmZvbnRGYW1pbHk9XCJtb25vc3BhY2VcIix0LnN0eWxlLmZvbnRTaXplPVwiMTNweFwiLHQuc3R5bGUuZm9udFdlaWdodD1cIm5vcm1hbFwiLHQuc3R5bGUudGV4dEFsaWduPVwiY2VudGVyXCIsdC5zdHlsZS5iYWNrZ3JvdW5kPVwiI2ZmZlwiLHQuc3R5bGUuY29sb3I9XCIjMDAwXCIsdC5zdHlsZS5wYWRkaW5nPVwiMS41ZW1cIix0LnN0eWxlLndpZHRoPVwiNDAwcHhcIix0LnN0eWxlLm1hcmdpbj1cIjVlbSBhdXRvIDBcIix0aGlzLndlYmdsfHwodC5pbm5lckhUTUw9d2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dD9bJ1lvdXIgZ3JhcGhpY3MgY2FyZCBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgPGEgaHJlZj1cImh0dHA6Ly9raHJvbm9zLm9yZy93ZWJnbC93aWtpL0dldHRpbmdfYV9XZWJHTF9JbXBsZW1lbnRhdGlvblwiIHJlbD1cImV4dGVybmFsIG5vZm9sbG93XCIgcmVsPVwiZXh0ZXJuYWwgbm9mb2xsb3dcIiBzdHlsZT1cImNvbG9yOiMwMDBcIj5XZWJHTDwvYT4uPGJyIC8+JywnRmluZCBvdXQgaG93IHRvIGdldCBpdCA8YSBocmVmPVwiaHR0cDovL2dldC53ZWJnbC5vcmcvXCIgcmVsPVwiZXh0ZXJuYWwgbm9mb2xsb3dcIiByZWw9XCJleHRlcm5hbCBub2ZvbGxvd1wiIHN0eWxlPVwiY29sb3I6IzAwMFwiPmhlcmU8L2E+LiddLmpvaW4oXCJcXG5cIik6WydZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc2VlbSB0byBzdXBwb3J0IDxhIGhyZWY9XCJodHRwOi8va2hyb25vcy5vcmcvd2ViZ2wvd2lraS9HZXR0aW5nX2FfV2ViR0xfSW1wbGVtZW50YXRpb25cIiByZWw9XCJleHRlcm5hbCBub2ZvbGxvd1wiIHJlbD1cImV4dGVybmFsIG5vZm9sbG93XCIgc3R5bGU9XCJjb2xvcjojMDAwXCI+V2ViR0w8L2E+Ljxici8+JywnRmluZCBvdXQgaG93IHRvIGdldCBpdCA8YSBocmVmPVwiaHR0cDovL2dldC53ZWJnbC5vcmcvXCIgcmVsPVwiZXh0ZXJuYWwgbm9mb2xsb3dcIiByZWw9XCJleHRlcm5hbCBub2ZvbGxvd1wiIHN0eWxlPVwiY29sb3I6IzAwMFwiPmhlcmU8L2E+LiddLmpvaW4oXCJcXG5cIikpLHR9LGFkZEdldFdlYkdMTWVzc2FnZTpmdW5jdGlvbihlKXt2YXIgbj12b2lkIDAhPT0oZT1lfHx7fSkucGFyZW50P2UucGFyZW50OmRvY3VtZW50LmJvZHkscj12b2lkIDAhPT1lLmlkP2UuaWQ6XCJvbGRpZVwiLGk9dCgpLmdldFdlYkdMRXJyb3JNZXNzYWdlKCk7aS5pZD1yLG4uYXBwZW5kQ2hpbGQoaSl9fX07ZnVuY3Rpb24gWWgodCl7cmV0dXJuKFloPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX12YXIgSGg9ZnVuY3Rpb24odCl7cmV0dXJuIHNldFRpbWVvdXQodCwxNil9LHFoPWZ1bmN0aW9uKHQpe3JldHVybiBjbGVhclRpbWVvdXQodCl9LEtoPWZ1bmN0aW9uKHQpe3JldHVybihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSl8fEhoKSh0KX0sWmg9ZnVuY3Rpb24odCl7cmV0dXJuKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSl8fHFoKSh0KX0sUWg9W1wiZnJ1Y2h0ZXJtYW5cIixcImdGb3JjZVwiXSxKaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLmdyYXBoPWUsbi5sYXlvdXRDZmc9ZS5nZXQoXCJsYXlvdXRcIil8fHt9LG4ubGF5b3V0VHlwZT1uLmxheW91dENmZy50eXBlLG4ud29ya2VyPW51bGwsbi53b3JrZXJEYXRhPXt9LG4uaW5pdExheW91dCgpLG59cmV0dXJuIE9iamVjdCh2LmIpKGUsdCksZS5wcm90b3R5cGUuaW5pdExheW91dD1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuZ2V0V29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud29ya2VyfHwoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFdvcmtlcj8oY29uc29sZS53YXJuKFwiV2ViIHdvcmtlciBpcyBub3Qgc3VwcG9ydGVkIGluIGN1cnJlbnQgYnJvd3Nlci5cIiksdGhpcy53b3JrZXI9bnVsbCk6dGhpcy53b3JrZXI9QmgpLHRoaXMud29ya2VyfSxlLnByb3RvdHlwZS5zdG9wV29ya2VyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53b3JrZXJEYXRhO3RoaXMud29ya2VyJiYodGhpcy53b3JrZXIudGVybWluYXRlKCksdGhpcy53b3JrZXI9bnVsbCx0LnJlcXVlc3RJZCYmKFpoKHQucmVxdWVzdElkKSx0LnJlcXVlc3RJZD1udWxsKSx0LnJlcXVlc3RJZDImJihaaCh0LnJlcXVlc3RJZDIpLHQucmVxdWVzdElkMj1udWxsKSl9LGUucHJvdG90eXBlLmxheW91dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5ncmFwaDt0aGlzLmRhdGE9dGhpcy5zZXREYXRhRnJvbUdyYXBoKCk7dmFyIHI9dGhpcy5kYXRhLm5vZGVzO2lmKCFyKXJldHVybiExO3ZhciBpPW4uZ2V0KFwid2lkdGhcIiksbz1uLmdldChcImhlaWdodFwiKSxhPXt9O09iamVjdC5hc3NpZ24oYSx7d2lkdGg6aSxoZWlnaHQ6byxjZW50ZXI6W2kvMixvLzJdfSx0aGlzLmxheW91dENmZyksdGhpcy5sYXlvdXRDZmc9YTt2YXIgcz0hIXRoaXMubGF5b3V0VHlwZSx1PXRoaXMubGF5b3V0TWV0aG9kO3UmJnUuZGVzdHJveSgpLG4uZW1pdChcImJlZm9yZWxheW91dFwiKTt0aGlzLmluaXRQb3NpdGlvbnMoYS5jZW50ZXIscik7dmFyIGM9dGhpcy5sYXlvdXRUeXBlLGY9ITE7aWYoYyYmXCJncHVcIj09PWMuc3BsaXQoXCItXCIpWzFdJiYoYz1jLnNwbGl0KFwiLVwiKVswXSxhLmdwdUVuYWJsZWQ9ITApLGMmJmEuZ3B1RW5hYmxlZCl7dmFyIGw9ITA7WGgoKS53ZWJnbHx8KGNvbnNvbGUud2FybihcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHdlYkdMIG9yIEdQR1BVLiBUaGUgbGF5b3V0IHdpbGwgcnVuIGluIENQVS5cIiksbD0hMSksdGhpcy5oYXNHUFVWZXJzaW9uKGMpfHwoY29uc29sZS53YXJuKFwiVGhlICdcIitjK1wiJyBsYXlvdXQgZG9lcyBub3Qgc3VwcG9ydCBHUFUgY2FsY3VsYXRpb24gZm9yIG5vdywgaXQgd2lsbCBydW4gaW4gQ1BVLlwiKSxsPSExKSxsJiYoYys9XCItZ3B1XCIsZj0hMCl9aWYodGhpcy5pc0dQVT1mLHRoaXMuc3RvcFdvcmtlcigpLGEud29ya2VyRW5hYmxlZCYmdGhpcy5sYXlvdXRXaXRoV29ya2VyKHRoaXMuZGF0YSx0KSlyZXR1cm4hMDt2YXIgaD1hLm9uTGF5b3V0RW5kO2lmKGEubGF5b3V0RW5kRm9ybWF0dGVkfHwoYS5sYXlvdXRFbmRGb3JtYXR0ZWQ9ITAsYS5vbkxheW91dEVuZD1mdW5jdGlvbigpe2gmJmgoKSxuLmVtaXQoXCJhZnRlcmxheW91dFwiKSxlLnJlZnJlc2hMYXlvdXQoKSx0JiZ0KCl9KSxcImZvcmNlXCI9PT1jfHxcImc2Zm9yY2VcIj09PWN8fFwiZ0ZvcmNlXCI9PT1jKXt2YXIgZD1hLm9uVGljayxwPWZ1bmN0aW9uKCl7ZCYmZCgpLG4ucmVmcmVzaFBvc2l0aW9ucygpfTthLnRpY2s9cH1lbHNlXCJjb21ib0ZvcmNlXCI9PT10aGlzLmxheW91dFR5cGUmJihhLmNvbWJvVHJlZXM9bi5nZXQoXCJjb21ib1RyZWVzXCIpKTtpZih2b2lkIDAhPT1jKXt0cnl7dT1uZXcgTmhbY10oYSl9Y2F0Y2godCl7cmV0dXJuIGNvbnNvbGUud2FybihcIlRoZSBsYXlvdXQgbWV0aG9kOiAnXCIrYytcIicgZG9lcyBub3QgZXhpc3QhIFBsZWFzZSBzcGVjaWZ5IGl0IGZpcnN0LlwiKSwhMX1pZih1LmVuYWJsZVRpY2spe3ZhciBnPWEub25UaWNrO3A9ZnVuY3Rpb24oKXtnJiZnKCksbi5yZWZyZXNoUG9zaXRpb25zKCl9O3UudGljaz1wfXUuaW5pdCh0aGlzLmRhdGEpLHMmJihuLmVtaXQoXCJiZWdpbmxheW91dFwiKSx1LmV4ZWN1dGUoKSx1LmlzQ3VzdG9tTGF5b3V0JiZhLm9uTGF5b3V0RW5kJiZhLm9uTGF5b3V0RW5kKCkpLHRoaXMubGF5b3V0TWV0aG9kPXV9ZWxzZSBhLm9uTGF5b3V0RW5kJiZhLm9uTGF5b3V0RW5kKCk7cmV0dXJuITF9LGUucHJvdG90eXBlLmxheW91dFdpdGhXb3JrZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dC5ub2RlcyxpPXQuZWRnZXMsbz10aGlzLmxheW91dENmZyxhPXRoaXMuZ3JhcGgscz10aGlzLmlzR1BVLHU9dGhpcy5nZXRXb3JrZXIoKSxjPXRoaXMud29ya2VyRGF0YTtpZighdSlyZXR1cm4hMTtjLnJlcXVlc3RJZD1udWxsLGMucmVxdWVzdElkMj1udWxsLGMuY3VycmVudFRpY2s9bnVsbCxjLmN1cnJlbnRUaWNrRGF0YT1udWxsLGEuZW1pdChcImJlZm9yZWxheW91dFwiKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLGw9cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lm5hdmlnYXRvciYmIW5hdmlnYXRvci5ncHUmJlwiT2Zmc2NyZWVuQ2FudmFzXCJpbiB3aW5kb3cmJlwidHJhbnNmZXJDb250cm9sVG9PZmZzY3JlZW5cImluIGYsaD1mdW5jdGlvbih0LGUpe3ZhciBuPXt9O2lmKHQmJlwib2JqZWN0XCI9PT1ZaCh0KSlyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dC5oYXNPd25Qcm9wZXJ0eShyKSYmZSh0W3JdKSYmKG5bcl09dFtyXSl9KSksbjtyZXR1cm4gdH0obywoZnVuY3Rpb24odCl7cmV0dXJuXCJmdW5jdGlvblwiIT10eXBlb2YgdH0pKTtpZihsKXt2YXIgZD1mLnRyYW5zZmVyQ29udHJvbFRvT2Zmc2NyZWVuKCk7aC50eXBlPWgudHlwZStcIi1ncHVcIix1LnBvc3RNZXNzYWdlKHt0eXBlOlZoLG5vZGVzOnIsZWRnZXM6aSxsYXlvdXRDZmc6aCxjYW52YXM6ZH0sW2RdKX1lbHNlIHUucG9zdE1lc3NhZ2Uoe3R5cGU6R2gsbm9kZXM6cixlZGdlczppLGxheW91dENmZzpofSk7cmV0dXJuIHUub25tZXNzYWdlPWZ1bmN0aW9uKHIpe24uaGFuZGxlV29ya2VyTWVzc2FnZShyLHQsZSl9LCEwfSxlLnByb3RvdHlwZS5oYW5kbGVXb3JrZXJNZXNzYWdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLmdyYXBoLGk9dGhpcy53b3JrZXJEYXRhLG89dGhpcy5sYXlvdXRDZmcsYT10LmRhdGEscz1hLnR5cGUsdT1mdW5jdGlvbigpe28ub25UaWNrJiZvLm9uVGljaygpfSxjPWZ1bmN0aW9uKCl7by5vbkxheW91dEVuZCYmby5vbkxheW91dEVuZCgpLHIuZW1pdChcImFmdGVybGF5b3V0XCIpfTtzd2l0Y2gocyl7Y2FzZSB6aDppLmN1cnJlbnRUaWNrPWEuY3VycmVudFRpY2ssaS5jdXJyZW50VGlja0RhdGE9YSxpLnJlcXVlc3RJZHx8KGkucmVxdWVzdElkPUtoKChmdW5jdGlvbigpeyRoKGUsYSksci5yZWZyZXNoUG9zaXRpb25zKCksdSgpLDE9PT1hLmN1cnJlbnRUaWNrJiZuJiZuKCksYS5jdXJyZW50VGljaz09PWEudG90YWxUaWNrcz9jKCk6aS5jdXJyZW50VGljaz09PWEudG90YWxUaWNrcyYmKGkucmVxdWVzdElkMj1LaCgoZnVuY3Rpb24oKXskaChlLGkuY3VycmVudFRpY2tEYXRhKSxyLnJlZnJlc2hQb3NpdGlvbnMoKSxpLnJlcXVlc3RJZDI9bnVsbCx1KCksYygpfSkpKSxpLnJlcXVlc3RJZD1udWxsfSkpKTticmVhaztjYXNlIEZoOm51bGw9PWkuY3VycmVudFRpY2smJigkaChlLGEpLHRoaXMucmVmcmVzaExheW91dCgpLG4mJm4oKSxyLmVtaXQoXCJhZnRlcmxheW91dFwiKSk7YnJlYWs7Y2FzZSBXaDpudWxsPT1pLmN1cnJlbnRUaWNrJiYoIWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubm9kZXMscj1lLnZlcnRleEVkZ2VEYXRhLGk9bi5sZW5ndGgsbz0wO288aTtvKyspe3ZhciBhPW5bb10scz1yWzQqb10sdT1yWzQqbysxXTthLng9cyxhLnk9dX19KGUsYSksdGhpcy5yZWZyZXNoTGF5b3V0KCksbiYmbigpLHIuZW1pdChcImFmdGVybGF5b3V0XCIpKTticmVhaztjYXNlIFVoOmNvbnNvbGUud2FybihcIldlYi1Xb3JrZXIgbGF5b3V0IGVycm9yIVwiLGEubWVzc2FnZSl9fSxlLnByb3RvdHlwZS51cGRhdGVMYXlvdXRDZmc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ncmFwaCxuPXRoaXMubGF5b3V0TWV0aG9kLHI9KHRoaXMubGF5b3V0VHlwZSx0aGlzLmxheW91dENmZyk7aWYodGhpcy5sYXlvdXRUeXBlPXQudHlwZSwhbnx8bi5kZXN0cm95ZWQpcmV0dXJuIHRoaXMubGF5b3V0Q2ZnPU9iamVjdChoLkEpKHt9LHIsdCksdm9pZCB0aGlzLmxheW91dCgpO3RoaXMuZGF0YT10aGlzLnNldERhdGFGcm9tR3JhcGgoKSx0aGlzLnN0b3BXb3JrZXIoKSx0LndvcmtlckVuYWJsZWQmJnRoaXMubGF5b3V0V2l0aFdvcmtlcih0aGlzLmRhdGEsbnVsbCl8fChuLmluaXQodGhpcy5kYXRhKSxuLnVwZGF0ZUNmZyh0KSxlLmVtaXQoXCJiZWZvcmVsYXlvdXRcIiksbi5leGVjdXRlKCksbi5pc0N1c3RvbUxheW91dCYmci5vbkxheW91dEVuZCYmci5vbkxheW91dEVuZCgpKX0sZS5wcm90b3R5cGUuaGFzR1BVVmVyc2lvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9UWgubGVuZ3RoLG49MDtuPGU7bisrKWlmKFFoW25dPT09dClyZXR1cm4hMDtyZXR1cm4hMX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGF5b3V0TWV0aG9kO3QmJih0LmRlc3Ryb3koKSx0LmRlc3Ryb3llZD0hMCk7dmFyIGU9dGhpcy53b3JrZXI7ZSYmKGUudGVybWluYXRlKCksdGhpcy53b3JrZXI9bnVsbCksdGhpcy5kZXN0cm95ZWQ9ITAsdGhpcy5ncmFwaC5zZXQoXCJsYXlvdXRcIix2b2lkIDApLHRoaXMubGF5b3V0Q2ZnPXZvaWQgMCx0aGlzLmxheW91dFR5cGU9dm9pZCAwLHRoaXMubGF5b3V0TWV0aG9kPXZvaWQgMCx0aGlzLmdyYXBoPW51bGx9LGV9KEplKTtmdW5jdGlvbiAkaCh0LGUpe2Zvcih2YXIgbj10Lm5vZGVzLHI9ZS5ub2RlcyxpPW4ubGVuZ3RoLG89MDtvPGk7bysrKXt2YXIgYT1uW29dO2EueD1yW29dLngsYS55PXJbb10ueX19dmFyIHRkLGVkPXMudHJhbnNmb3JtLG5kPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXMscj1uLmdldChcImRlZmF1bHROb2RlXCIpO3JldHVybiByfHxuLnNldChcImRlZmF1bHROb2RlXCIse3R5cGU6XCJjaXJjbGVcIn0pLHIudHlwZXx8KHIudHlwZT1cImNpcmNsZVwiLG4uc2V0KFwiZGVmYXVsdE5vZGVcIixyKSksbi5kZXN0cm95ZWQ9ITEsbn1yZXR1cm4gT2JqZWN0KHYuYikoZSx0KSxlLnByb3RvdHlwZS5pbml0TGF5b3V0Q29udHJvbGxlcj1mdW5jdGlvbigpe3ZhciB0PW5ldyBKaCh0aGlzKTt0aGlzLnNldCh7bGF5b3V0Q29udHJvbGxlcjp0fSl9LGUucHJvdG90eXBlLmluaXRFdmVudENvbnRyb2xsZXI9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgTG4odGhpcyk7dGhpcy5zZXQoe2V2ZW50Q29udHJvbGxlcjp0fSl9LGUucHJvdG90eXBlLmluaXRDYW52YXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImNvbnRhaW5lclwiKTtpZihcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCksdGhpcy5zZXQoXCJjb250YWluZXJcIix0KSksIXQpdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBjb250YWluZXJcIik7dmFyIGUsbj10aGlzLmdldChcIndpZHRoXCIpLHI9dGhpcy5nZXQoXCJoZWlnaHRcIik7aWYoXCJzdmdcIj09PXRoaXMuZ2V0KFwicmVuZGVyZXJcIikpZT1uZXcgc24uQ2FudmFzKHtjb250YWluZXI6dCx3aWR0aDpuLGhlaWdodDpyfSk7ZWxzZXt2YXIgaT17Y29udGFpbmVyOnQsd2lkdGg6bixoZWlnaHQ6cn0sbz10aGlzLmdldChcInBpeGVsUmF0aW9cIik7byYmKGkucGl4ZWxSYXRpbz1vKSxlPW5ldyBhbi5DYW52YXMoaSl9dGhpcy5zZXQoXCJjYW52YXNcIixlKX0sZS5wcm90b3R5cGUuaW5pdFBsdWdpbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO09iamVjdChoLmYpKHQuZ2V0KFwicGx1Z2luc1wiKSwoZnVuY3Rpb24oZSl7IWUuZGVzdHJveWVkJiZlLmluaXRQbHVnaW4mJmUuaW5pdFBsdWdpbih0KX0pKX0sZS5wcm90b3R5cGUudG9EYXRhVVJMPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXQoXCJjYW52YXNcIikscj1uLmdldFJlbmRlcmVyKCksaT1uLmdldChcImVsXCIpO3R8fCh0PVwiaW1hZ2UvcG5nXCIpO3ZhciBvPVwiXCI7aWYoXCJzdmdcIj09PXIpe3ZhciBhPWkuY2xvbmVOb2RlKCEwKSxzPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50VHlwZShcInN2Z1wiLFwiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU5cIixcImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZFwiKSx1PWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcInN2Z1wiLHMpO3UucmVwbGFjZUNoaWxkKGEsdS5kb2N1bWVudEVsZW1lbnQpO3ZhciBjPShuZXcgWE1MU2VyaWFsaXplcikuc2VyaWFsaXplVG9TdHJpbmcodSk7bz1cImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsXCIrZW5jb2RlVVJJQ29tcG9uZW50KGMpfWVsc2V7dmFyIGY9dm9pZCAwLGw9aS5nZXRDb250ZXh0KFwiMmRcIiksaD10aGlzLmdldChcIndpZHRoXCIpLGQ9dGhpcy5nZXQoXCJoZWlnaHRcIikscD12b2lkIDA7aWYoZSl7dmFyIGc9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzoxO2Y9bC5nZXRJbWFnZURhdGEoMCwwLGgqZyxkKmcpLHA9bC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24sbC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249XCJkZXN0aW5hdGlvbi1vdmVyXCIsbC5maWxsU3R5bGU9ZSxsLmZpbGxSZWN0KDAsMCxoLGQpfW89aS50b0RhdGFVUkwodCksZSYmKGwuY2xlYXJSZWN0KDAsMCxoLGQpLGwucHV0SW1hZ2VEYXRhKGYsMCwwKSxsLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1wKX1yZXR1cm4gb30sZS5wcm90b3R5cGUudG9GdWxsRGF0YVVSTD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5nZXQoXCJncm91cFwiKS5nZXRDYW52YXNCQm94KCksaT1yLmhlaWdodCxvPXIud2lkdGgsYT10aGlzLmdldChcInJlbmRlcmVyXCIpLHM9Z3QoJzxpZD1cInZpcnR1YWwtaW1hZ2VcIj48L2Rpdj4nKSx1PW4/bi5iYWNrZ3JvdW5kQ29sb3I6dm9pZCAwLGM9bj9uLnBhZGRpbmc6dm9pZCAwO2M/T2JqZWN0KGgudCkoYykmJihjPVtjLGMsYyxjXSk6Yz1bMCwwLDAsMF07dmFyIGY9aStjWzBdK2NbMl0sbD1vK2NbMV0rY1szXSxkPXtjb250YWluZXI6cyxoZWlnaHQ6Zix3aWR0aDpsLHF1aWNrSGl0OiEwfSxwPVwic3ZnXCI9PT1hP25ldyBzbi5DYW52YXMoZCk6bmV3IGFuLkNhbnZhcyhkKSxnPXRoaXMuZ2V0KFwiZ3JvdXBcIikuY2xvbmUoKSx2PU9iamVjdChoLmMpKGcuZ2V0TWF0cml4KCkpO3Z8fCh2PVsxLDAsMCwwLDEsMCwwLDAsMV0pO3ZhciB5PShyLm1heFgrci5taW5YKS8yLG09KHIubWF4WStyLm1pblkpLzI7dj1lZCh2LFtbXCJ0XCIsLXksLW1dLFtcInRcIixvLzIrY1szXSxpLzIrY1swXV1dKSxnLnJlc2V0TWF0cml4KCksZy5zZXRNYXRyaXgodikscC5hZGQoZyk7dmFyIGI9cC5nZXQoXCJlbFwiKSx4PVwiXCI7ZXx8KGU9XCJpbWFnZS9wbmdcIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpZihcInN2Z1wiPT09YSl7dmFyIG49Yi5jbG9uZU5vZGUoITApLHI9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnRUeXBlKFwic3ZnXCIsXCItLy9XM0MvL0RURCBTVkcgMS4xLy9FTlwiLFwiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkXCIpLGk9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFwic3ZnXCIscik7aS5yZXBsYWNlQ2hpbGQobixpLmRvY3VtZW50RWxlbWVudCk7dmFyIG89KG5ldyBYTUxTZXJpYWxpemVyKS5zZXJpYWxpemVUb1N0cmluZyhpKTt4PVwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmOCxcIitlbmNvZGVVUklDb21wb25lbnQobyl9ZWxzZXt2YXIgcz12b2lkIDAsYz1iLmdldENvbnRleHQoXCIyZFwiKSxoPXZvaWQgMDtpZih1KXt2YXIgZD1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOjE7cz1jLmdldEltYWdlRGF0YSgwLDAsbCpkLGYqZCksaD1jLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbixjLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cImRlc3RpbmF0aW9uLW92ZXJcIixjLmZpbGxTdHlsZT11LGMuZmlsbFJlY3QoMCwwLGwsZil9eD1iLnRvRGF0YVVSTChlKSx1JiYoYy5jbGVhclJlY3QoMCwwLGwsZiksYy5wdXRJbWFnZURhdGEocywwLDApLGMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWgpfXQmJnQoeCl9KSwxNil9LGUucHJvdG90eXBlLmRvd25sb2FkRnVsbEltYWdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLGk9dGhpcy5nZXQoXCJncm91cFwiKS5nZXRDYW52YXNCQm94KCksbz1pLmhlaWdodCxhPWkud2lkdGgscz10aGlzLmdldChcInJlbmRlcmVyXCIpLHU9Z3QoJzxpZD1cInZpcnR1YWwtaW1hZ2VcIj48L2Rpdj4nKSxjPW4/bi5iYWNrZ3JvdW5kQ29sb3I6dm9pZCAwLGY9bj9uLnBhZGRpbmc6dm9pZCAwO2Y/T2JqZWN0KGgudCkoZikmJihmPVtmLGYsZixmXSk6Zj1bMCwwLDAsMF07dmFyIGw9bytmWzBdK2ZbMl0sZD1hK2ZbMV0rZlszXSxwPXtjb250YWluZXI6dSxoZWlnaHQ6bCx3aWR0aDpkfSxnPVwic3ZnXCI9PT1zP25ldyBzbi5DYW52YXMocCk6bmV3IGFuLkNhbnZhcyhwKSx2PXRoaXMuZ2V0KFwiZ3JvdXBcIikuY2xvbmUoKSx5PU9iamVjdChoLmMpKHYuZ2V0TWF0cml4KCkpO3l8fCh5PVsxLDAsMCwwLDEsMCwwLDAsMV0pO3ZhciBtPShpLm1heFgraS5taW5YKS8yLGI9KGkubWF4WStpLm1pblkpLzI7eT1lZCh5LFtbXCJ0XCIsLW0sLWJdLFtcInRcIixhLzIrZlszXSxvLzIrZlswXV1dKSx2LnJlc2V0TWF0cml4KCksdi5zZXRNYXRyaXgoeSksZy5hZGQodik7dmFyIHg9Zy5nZXQoXCJlbFwiKTtlfHwoZT1cImltYWdlL3BuZ1wiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciBuPVwiXCI7aWYoXCJzdmdcIj09PXMpe3ZhciBpPXguY2xvbmVOb2RlKCEwKSxvPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50VHlwZShcInN2Z1wiLFwiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU5cIixcImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZFwiKSxhPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcInN2Z1wiLG8pO2EucmVwbGFjZUNoaWxkKGksYS5kb2N1bWVudEVsZW1lbnQpO3ZhciB1PShuZXcgWE1MU2VyaWFsaXplcikuc2VyaWFsaXplVG9TdHJpbmcoYSk7bj1cImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsXCIrZW5jb2RlVVJJQ29tcG9uZW50KHUpfWVsc2V7dmFyIGY9dm9pZCAwLGg9eC5nZXRDb250ZXh0KFwiMmRcIikscD12b2lkIDA7aWYoYyl7dmFyIGc9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzoxO2Y9aC5nZXRJbWFnZURhdGEoMCwwLGQqZyxsKmcpLHA9aC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24saC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249XCJkZXN0aW5hdGlvbi1vdmVyXCIsaC5maWxsU3R5bGU9YyxoLmZpbGxSZWN0KDAsMCxkLGwpfW49eC50b0RhdGFVUkwoZSksYyYmKGguY2xlYXJSZWN0KDAsMCxkLGwpLGgucHV0SW1hZ2VEYXRhKGYsMCwwKSxoLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1wKX12YXIgdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKSx5PSh0fHxcImdyYXBoXCIpKyhcInN2Z1wiPT09cz9cIi5zdmdcIjpcIi5cIitlLnNwbGl0KFwiL1wiKVsxXSk7ci5kYXRhVVJMVG9JbWFnZShuLHMsdix5KTt2YXIgbT1kb2N1bWVudC5jcmVhdGVFdmVudChcIk1vdXNlRXZlbnRzXCIpO20uaW5pdEV2ZW50KFwiY2xpY2tcIiwhMSwhMSksdi5kaXNwYXRjaEV2ZW50KG0pfSksMTYpfSxlLnByb3RvdHlwZS5kb3dubG9hZEltYWdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLGk9dGhpcztpLmlzQW5pbWF0aW5nKCkmJmkuc3RvcEFuaW1hdGUoKTt2YXIgbz1pLmdldChcImNhbnZhc1wiKS5nZXRSZW5kZXJlcigpO2V8fChlPVwiaW1hZ2UvcG5nXCIpO3ZhciBhPSh0fHxcImdyYXBoXCIpKyhcInN2Z1wiPT09bz9cIi5zdmdcIjplLnNwbGl0KFwiL1wiKVsxXSkscz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciB0PWkudG9EYXRhVVJMKGUsbik7ci5kYXRhVVJMVG9JbWFnZSh0LG8scyxhKTt2YXIgdT1kb2N1bWVudC5jcmVhdGVFdmVudChcIk1vdXNlRXZlbnRzXCIpO3UuaW5pdEV2ZW50KFwiY2xpY2tcIiwhMSwhMSkscy5kaXNwYXRjaEV2ZW50KHUpfSksMTYpfSxlLnByb3RvdHlwZS5kYXRhVVJMVG9JbWFnZT1mdW5jdGlvbih0LGUsbixyKXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93KWlmKHdpbmRvdy5CbG9iJiZ3aW5kb3cuVVJMJiZcInN2Z1wiIT09ZSl7dmFyIGk9dC5zcGxpdChcIixcIiksbz1cIlwiO2lmKGkmJmkubGVuZ3RoPjApe3ZhciBhPWlbMF0ubWF0Y2goLzooLio/KTsvKTthJiZhLmxlbmd0aD49MiYmKG89YVsxXSl9Zm9yKHZhciBzPWF0b2IoaVsxXSksdT1zLmxlbmd0aCxjPW5ldyBVaW50OEFycmF5KHUpO3UtLTspY1t1XT1zLmNoYXJDb2RlQXQodSk7dmFyIGY9bmV3IEJsb2IoW2NdLHt0eXBlOm99KTt3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2I/d2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGYscik6bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwoZnVuY3Rpb24oKXtuLmRvd25sb2FkPXIsbi5ocmVmPXdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGYpfSkpfWVsc2Ugbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwoZnVuY3Rpb24oKXtuLmRvd25sb2FkPXIsbi5ocmVmPXR9KSl9LGUucHJvdG90eXBlLmFkZFBsdWdpbj1mdW5jdGlvbih0KXt0LmRlc3Ryb3llZHx8KHRoaXMuZ2V0KFwicGx1Z2luc1wiKS5wdXNoKHQpLHQuaW5pdFBsdWdpbih0aGlzKSl9LGUucHJvdG90eXBlLnJlbW92ZVBsdWdpbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcInBsdWdpbnNcIiksbj1lLmluZGV4T2YodCk7bj49MCYmKHQuZGVzdHJveVBsdWdpbigpLGUuc3BsaWNlKG4sMSkpfSxlLnByb3RvdHlwZS5zZXRJbWFnZVdhdGVyTWFya2VyPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dCYmKHQ9RG4ud2F0ZXJNYXJrZXJJbWFnZSk7dmFyIG49dGhpcy5nZXQoXCJjb250YWluZXJcIik7T2JqZWN0KGgueCkobikmJihuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG4pKSxuLnN0eWxlLnBvc2l0aW9ufHwobi5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCIpO3ZhciByPXRoaXMuZ2V0KFwiZ3JhcGhXYXRlck1hcmtlclwiKSxpPU9iamVjdChoLmUpKHt9LERuLmltYWdlV2F0ZXJNYXJrZXJDb25maWcsZSksbz1pLndpZHRoLGE9aS5oZWlnaHQscz1pLmNvbXBhdGlibGUsdT1pLmltYWdlO2lmKCFyKXt2YXIgYz17Y29udGFpbmVyOm4sd2lkdGg6byxoZWlnaHQ6YSxjYXB0dXJlOiExfSxmPXRoaXMuZ2V0KFwicGl4ZWxSYXRpb1wiKTtmJiYoYy5waXhlbFJhdGlvPWYpLHI9bmV3IGFuLkNhbnZhcyhjKSx0aGlzLnNldChcImdyYXBoV2F0ZXJNYXJrZXJcIixyKX1yLmdldChcImVsXCIpLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7dmFyIGw9ci5nZXQoXCJjb250ZXh0XCIpLGQ9dS5yb3RhdGUscD11LngsZz11Lnk7bC5yb3RhdGUoLWQqTWF0aC5QSS8xODApO3ZhciB2PW5ldyBJbWFnZTt2LmNyb3NzT3JpZ2luPVwiYW5vbnltb3VzXCIsdi5zcmM9dCx2Lm9ubG9hZD1mdW5jdGlvbigpe2lmKGwuZHJhd0ltYWdlKHYscCxnLHUud2lkdGgsdS5oZWlnaHQpLGwucm90YXRlKGQqTWF0aC5QSS8xODApLHMpbi5zdHlsZS5jc3NUZXh0PVwiYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiK3IuZ2V0KFwiZWxcIikudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpK1wiKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQ7XCI7ZWxzZXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmc2LWdyYXBoLXdhdGVybWFya2VyXCIpO3R8fCgodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5jbGFzc05hbWU9XCJnNi1ncmFwaC13YXRlcm1hcmtlclwiKSx0LmNsYXNzTmFtZT1cImc2LWdyYXBoLXdhdGVybWFya2VyXCIsci5kZXN0cm95ZWR8fCh0LnN0eWxlLmNzc1RleHQ9XCJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIrci5nZXQoXCJlbFwiKS50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIikrXCIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6LTE7XCIsbi5hcHBlbmRDaGlsZCh0KSl9fX0sZS5wcm90b3R5cGUuc2V0VGV4dFdhdGVyTWFya2VyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXQoXCJjb250YWluZXJcIik7T2JqZWN0KGgueCkobikmJihuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG4pKSxuLnN0eWxlLnBvc2l0aW9ufHwobi5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCIpO3ZhciByPXRoaXMuZ2V0KFwiZ3JhcGhXYXRlck1hcmtlclwiKSxpPU9iamVjdChoLmUpKHt9LERuLnRleHRXYXRlck1hcmtlckNvbmZpZyxlKSxvPWkud2lkdGgsYT1pLmhlaWdodCxzPWkuY29tcGF0aWJsZSx1PWkudGV4dDtpZighcil7dmFyIGM9e2NvbnRhaW5lcjpuLHdpZHRoOm8saGVpZ2h0OmEsY2FwdHVyZTohMX0sZj10aGlzLmdldChcInBpeGVsUmF0aW9cIik7ZiYmKGMucGl4ZWxSYXRpbz1mKSxyPW5ldyBhbi5DYW52YXMoYyksdGhpcy5zZXQoXCJncmFwaFdhdGVyTWFya2VyXCIscil9ci5nZXQoXCJlbFwiKS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO3ZhciBsPXIuZ2V0KFwiY29udGV4dFwiKSxkPXUucm90YXRlLHA9dS5maWxsLGc9dS5mb250RmFtaWx5LHY9dS5mb250U2l6ZSx5PXUuYmFzZWxpbmUsbT11LngsYj11LnkseD11LmxpbmVIZWlnaHQ7bC5yb3RhdGUoLWQqTWF0aC5QSS8xODApLGwuZm9udD12K1wicHggXCIrZyxsLmZpbGxTdHlsZT1wLGwudGV4dEJhc2VsaW5lPXk7Zm9yKHZhciB3PXQubGVuZ3RoLTE7dz49MDt3LS0pbC5maWxsVGV4dCh0W3ddLG0sYit3KngpO2lmKGwucm90YXRlKGQqTWF0aC5QSS8xODApLHMpbi5zdHlsZS5jc3NUZXh0PVwiYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiK3IuZ2V0KFwiZWxcIikudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpK1wiKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQ7XCI7ZWxzZXt2YXIgUz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmc2LWdyYXBoLXdhdGVybWFya2VyXCIpO1N8fCgoUz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5jbGFzc05hbWU9XCJnNi1ncmFwaC13YXRlcm1hcmtlclwiKSxTLnN0eWxlLmNzc1RleHQ9XCJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIrci5nZXQoXCJlbFwiKS50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIikrXCIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6OTk7XCIsbi5hcHBlbmRDaGlsZChTKX19LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtPYmplY3QoaC5mKSh0aGlzLmdldChcInBsdWdpbnNcIiksKGZ1bmN0aW9uKHQpe3QuZGVzdHJveVBsdWdpbigpfSkpO3ZhciBlPXRoaXMuZ2V0KFwidG9vbHRpcHNcIik7aWYoZSlmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtpZihyKXt2YXIgaT1yLnBhcmVudEVsZW1lbnQ7aSYmaS5yZW1vdmVDaGlsZChyKX19dGhpcy5nZXQoXCJldmVudENvbnRyb2xsZXJcIikuZGVzdHJveSgpLHRoaXMuZ2V0KFwibGF5b3V0Q29udHJvbGxlclwiKS5kZXN0cm95KCksdGhpcy5nZXQoXCJncmFwaFdhdGVyTWFya2VyXCIpJiZ0aGlzLmdldChcImdyYXBoV2F0ZXJNYXJrZXJcIikuZGVzdHJveSgpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZzYtZ3JhcGgtd2F0ZXJtYXJrZXJcIikmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZzYtZ3JhcGgtd2F0ZXJtYXJrZXJcIikucmVtb3ZlKCksdC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfSxlfShqZSkscmQ9bigxNzApLGlkPW4ubihyZCksb2Q9UWUudHJhdmVyc2VUcmVlLGFkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ/T2JqZWN0KGgudCkodCk/ZnVuY3Rpb24oZSl7cmV0dXJuIHR9OnQ6ZnVuY3Rpb24odCl7cmV0dXJuIGV8fDF9fSxzZD1mdW5jdGlvbih0LGUpe3ZhciBuPVtdLHI9W10saT17fSxvPTA7Zm9yKG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIGE9dFtvXTtpW2EuaWRdPW8sbi5wdXNoKGEueCksbi5wdXNoKGEueSksbi5wdXNoKDApLG4ucHVzaCgwKSxyLnB1c2goW10pfWZvcihvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciBzPWVbb107cltpW3Muc291cmNlXV0ucHVzaChpW3MudGFyZ2V0XSkscltpW3MudGFyZ2V0XV0ucHVzaChpW3Muc291cmNlXSl9dmFyIHU9MDtmb3Iobz0wO288dC5sZW5ndGg7bysrKXt2YXIgYz1uLmxlbmd0aCxmPXJbb10sbD1mLmxlbmd0aDtuWzQqbysyXT1jLG5bNCpvKzNdPWYubGVuZ3RoLHU9TWF0aC5tYXgodSxmLmxlbmd0aCk7Zm9yKHZhciBoPTA7aDxsOysraCl7dmFyIGQ9ZltoXTtuLnB1c2goK2QpfX1mb3IoO24ubGVuZ3RoJTQhPTA7KW4ucHVzaCgwKTtyZXR1cm57YXJyYXk6bmV3IEZsb2F0MzJBcnJheShuKSxtYXhFZGdlUGVyVmV0ZXg6dX19LHVkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1bXSxpPVtdLG89e30sYT0wO2ZvcihhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBzPXRbYV07b1tzLmlkXT1hLHIucHVzaChzLngpLHIucHVzaChzLnkpLHIucHVzaCgwKSxyLnB1c2goMCksaS5wdXNoKFtdKX1mb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKXt2YXIgdT1lW2FdO2lbb1t1LnNvdXJjZV1dLnB1c2gob1t1LnRhcmdldF0pLGlbb1t1LnNvdXJjZV1dLnB1c2gobih1KSksaVtvW3UudGFyZ2V0XV0ucHVzaChvW3Uuc291cmNlXSksaVtvW3UudGFyZ2V0XV0ucHVzaChuKHUpKX12YXIgYz0wO2ZvcihhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBmPXIubGVuZ3RoLGw9aVthXSxoPWwubGVuZ3RoO3JbNCphKzJdPWYscls0KmErM109aC8yLGM9TWF0aC5tYXgoYyxoLzIpO2Zvcih2YXIgZD0wO2Q8aDsrK2Qpe3ZhciBwPWxbZF07ci5wdXNoKCtwKX19Zm9yKDtyLmxlbmd0aCU0IT0wOylyLnB1c2goMCk7cmV0dXJue2FycmF5Om5ldyBGbG9hdDMyQXJyYXkociksbWF4RWRnZVBlclZldGV4OmN9fSxjZD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1bXSxvPVtdLGE9e30scz0wO2ZvcihzPTA7czx0Lmxlbmd0aDtzKyspe3ZhciB1PXRbc107YVt1LmlkXT1zLGkucHVzaCh1LngpLGkucHVzaCh1LnkpLGkucHVzaCgwKSxpLnB1c2goMCksby5wdXNoKFtdKX1mb3Iocz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgYz1lW3NdO29bYVtjLnNvdXJjZV1dLnB1c2goYVtjLnRhcmdldF0pLG9bYVtjLnNvdXJjZV1dLnB1c2gobihjKSksb1thW2Muc291cmNlXV0ucHVzaChyKGMpKSxvW2FbYy5zb3VyY2VdXS5wdXNoKDApLG9bYVtjLnRhcmdldF1dLnB1c2goYVtjLnNvdXJjZV0pLG9bYVtjLnRhcmdldF1dLnB1c2gobihjKSksb1thW2MudGFyZ2V0XV0ucHVzaChyKGMpKSxvW2FbYy50YXJnZXRdXS5wdXNoKDApfXZhciBmPTA7Zm9yKHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIGw9aS5sZW5ndGgsaD1vW3NdLGQ9aC5sZW5ndGg7aVs0KnMrMl09bCsxMDQ4NTc2KmQvNCxpWzQqcyszXT0wLGY9TWF0aC5tYXgoZixkLzQpO2Zvcih2YXIgcD0wO3A8ZDsrK3Ape3ZhciBnPWhbcF07aS5wdXNoKCtnKX19Zm9yKDtpLmxlbmd0aCU0IT0wOylpLnB1c2goMCk7cmV0dXJue2FycmF5Om5ldyBGbG9hdDMyQXJyYXkoaSksbWF4RWRnZVBlclZldGV4OmZ9fSxmZD1mdW5jdGlvbih0LGUpe3ZhciBuPVtdLHI9dC5sZW5ndGgsaT17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQsbyl7aWYodm9pZCAwPT09aVtlW3RdXSYmKGlbZVt0XV09T2JqZWN0LmtleXMoaSkubGVuZ3RoKSxuLnB1c2goaVtlW3RdXSksbz09PXItMSlmb3IoO24ubGVuZ3RoJTQhPTA7KW4ucHVzaCgwKX0pKX0pKSx7YXJyYXk6bmV3IEZsb2F0MzJBcnJheShuKSxjb3VudDpPYmplY3Qua2V5cyhpKS5sZW5ndGh9fSxsZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj10Lmxlbmd0aCxyPXRbMF0ubGVuZ3RoLGk9ZnVuY3Rpb24ocil7dC5mb3JFYWNoKChmdW5jdGlvbih0LGkpe2lmKGUucHVzaCh0W3JdKSxpPT09bi0xKWZvcig7ZS5sZW5ndGglNCE9MDspZS5wdXNoKDApfSkpfSxvPTA7bzxyO28rKylpKG8pO3JldHVybiBuZXcgRmxvYXQzMkFycmF5KGUpfSxoZD1mdW5jdGlvbih0LGUpe3ZhciBuPXt4OjEvMCx5OjEvMH0scj17eDotMS8wLHk6LTEvMH0saT1cInhcIixvPVwieVwiO2UmJltcIlZcIixcIlRCXCIsXCJCVFwiXS5pbmRleE9mKGUpPj0wJiYobz1cInhcIixpPVwieVwiKTt2YXIgYT0wO29kKHQsKGZ1bmN0aW9uKHQpe3JldHVybiBhKyssdC54PnIueCYmKHIueD10LngpLHQueDxuLngmJihuLng9dC54KSx0Lnk+ci55JiYoci55PXQueSksdC55PG4ueSYmKG4ueT10LnkpLCEwfSkpO3ZhciBzPTIqTWF0aC5QSS9hLHU9cltvXS1uW29dO3JldHVybiAwPT09dXx8b2QodCwoZnVuY3Rpb24oZSl7dmFyIHI9KGVbb10tbltvXSkvdSooMipNYXRoLlBJLXMpK3MsYT1NYXRoLmFicyhcInhcIj09PWk/ZS54LXQueDplLnktdC55KTtyZXR1cm4gZS54PWEqTWF0aC5jb3MociksZS55PWEqTWF0aC5zaW4ociksITB9KSksdH0sZGQ9T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sUWUpLHUpLGYpLGMpLHBkPWRkLnJhZGlhbExheW91dCxnZD1kZC50cmF2ZXJzZVRyZWUsdmQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gbi5sYXlvdXRBbmltYXRpbmc9ITEsbi5zZXQoXCJyZW1vdmVMaXN0XCIsW10pLG4uc2V0KFwibGF5b3V0TWV0aG9kXCIsbi5nZXRMYXlvdXQoKSksbn1yZXR1cm4gT2JqZWN0KHYuYikoZSx0KSxlLnByb3RvdHlwZS5nZXRMYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImxheW91dFwiKTtyZXR1cm4gdD9cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3Q6KHQudHlwZXx8KHQudHlwZT1cImRlbmRyb2dyYW1cIiksdC5kaXJlY3Rpb258fCh0LmRpcmVjdGlvbj1cIlRCXCIpLHQucmFkaWFsP2Z1bmN0aW9uKGUpe3ZhciBuPWlkLmFbdC50eXBlXShlLHQpO3JldHVybiBwZChuKSxufTpmdW5jdGlvbihlKXtyZXR1cm4gaWQuYVt0LnR5cGVdKGUsdCl9KTpudWxsfSxlLmluZGV4T2ZDaGlsZD1mdW5jdGlvbih0LGUpe3ZhciBuPS0xO3JldHVybiBPYmplY3QoaC5mKSh0LChmdW5jdGlvbih0LHIpe2lmKGU9PT10LmlkKXJldHVybiBuPXIsITF9KSksbn0sZS5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmdldERlZmF1bHRDZmcuY2FsbCh0aGlzKTtyZXR1cm4gZS5hbmltYXRlPSEwLGV9LGUucHJvdG90eXBlLmlubmVyQWRkQ2hpbGQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsaT10LmRhdGE7aSYmKGkueD10LngsaS55PXQueSxpLmRlcHRoPXQuZGVwdGgpO3ZhciBvPXIuYWRkSXRlbShcIm5vZGVcIixpLCExKTtpZihlKXtpZihvLnNldChcInBhcmVudFwiLGUpLG4pe3ZhciBhPWUuZ2V0KFwib3JpZ2luQXR0cnNcIik7aWYoYSlvLnNldChcIm9yaWdpbkF0dHJzXCIsYSk7ZWxzZXt2YXIgcz1lLmdldE1vZGVsKCk7by5zZXQoXCJvcmlnaW5BdHRyc1wiLHt4OnMueCx5OnMueX0pfX12YXIgdT1lLmdldChcImNoaWxkcmVuXCIpO3U/dS5wdXNoKG8pOmUuc2V0KFwiY2hpbGRyZW5cIixbb10pLHIuYWRkSXRlbShcImVkZ2VcIix7c291cmNlOmUsdGFyZ2V0Om8saWQ6ZS5nZXQoXCJpZFwiKStcIjpcIitvLmdldChcImlkXCIpfSwhMSl9cmV0dXJuIE9iamVjdChoLmYpKHQuY2hpbGRyZW58fFtdLChmdW5jdGlvbih0KXtyLmlubmVyQWRkQ2hpbGQodCxvLG4pfSkpLHIuZW1pdChcImFmdGVyYWRkY2hpbGRcIix7aXRlbTpvLHBhcmVudDplfSksb30sZS5wcm90b3R5cGUuaW5uZXJVcGRhdGVDaGlsZD1mdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcyxvPWkuZmluZEJ5SWQodC5pZCk7aWYobyl7T2JqZWN0KGguZikodC5jaGlsZHJlbnx8W10sKGZ1bmN0aW9uKHQpe2kuaW5uZXJVcGRhdGVDaGlsZCh0LG8scil9KSk7dmFyIGEscyx1PW8uZ2V0KFwiY2hpbGRyZW5cIik7aWYodSlpZih1Lmxlbmd0aD4wKWZvcih2YXIgYz11Lmxlbmd0aC0xO2M+PTA7Yy0tKXt2YXIgZj11W2NdLmdldE1vZGVsKCk7LTE9PT1lLmluZGV4T2ZDaGlsZCh0LmNoaWxkcmVufHxbXSxmLmlkKSYmKGkuaW5uZXJSZW1vdmVDaGlsZChmLmlkLHt4OnQueCx5OnQueX0sciksdS5zcGxpY2UoYywxKSl9by5nZXQoXCJvcmlnaW5BdHRyc1wiKSYmKGE9by5nZXQoXCJvcmlnaW5BdHRyc1wiKS54LHM9by5nZXQoXCJvcmlnaW5BdHRyc1wiKS55KTt2YXIgbD1vLmdldE1vZGVsKCk7ciYmby5zZXQoXCJvcmlnaW5BdHRyc1wiLHt4OmwueCx5OmwueX0pLG8uc2V0KFwibW9kZWxcIix0LmRhdGEpLGE9PT10LngmJnM9PT10Lnl8fG8udXBkYXRlUG9zaXRpb24oe3g6dC54LHk6dC55fSl9ZWxzZSBpLmlubmVyQWRkQ2hpbGQodCxuLHIpfSxlLnByb3RvdHlwZS5pbm5lclJlbW92ZUNoaWxkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLGk9ci5maW5kQnlJZCh0KTtpZihpKWlmKE9iamVjdChoLmYpKGkuZ2V0KFwiY2hpbGRyZW5cIiksKGZ1bmN0aW9uKHQpe3IuaW5uZXJSZW1vdmVDaGlsZCh0LmdldE1vZGVsKCkuaWQsZSxuKX0pKSxuKXt2YXIgbz1pLmdldE1vZGVsKCk7aS5zZXQoXCJ0b1wiLGUpLGkuc2V0KFwib3JpZ2luQXR0cnNcIix7eDpvLngseTpvLnl9KSxyLmdldChcInJlbW92ZUxpc3RcIikucHVzaChpKX1lbHNlIHIucmVtb3ZlSXRlbShpKX0sZS5wcm90b3R5cGUuY2hhbmdlRGF0YT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuZ2V0Tm9kZXMoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNsZWFySXRlbVN0YXRlcyh0KX0pKSx0aGlzLmdldEVkZ2VzKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGVhckl0ZW1TdGF0ZXModCl9KSksdD8oZS5kYXRhKHQpLGUucmVuZGVyKCkpOmUubGF5b3V0KHRoaXMuZ2V0KFwiZml0Vmlld1wiKSl9LGUucHJvdG90eXBlLmNoYW5nZUxheW91dD1mdW5jdGlvbih0KXtjb25zb2xlLndhcm4oXCJQbGVhc2UgY2FsbCB1cGRhdGVMYXlvdXQgaW5zdGVhZCBvZiBjaGFuZ2VMYXlvdXQuIGNoYW5nZUxheW91dCB3aWxsIGJlIGRpc2NhcmRlZCBzb29uXCIpO3RoaXMudXBkYXRlTGF5b3V0KHQpfSxlLnByb3RvdHlwZS51cGRhdGVMYXlvdXQ9ZnVuY3Rpb24odCl7dD8odGhpcy5zZXQoXCJsYXlvdXRcIix0KSx0aGlzLnNldChcImxheW91dE1ldGhvZFwiLHRoaXMuZ2V0TGF5b3V0KCkpLHRoaXMubGF5b3V0KCkpOmNvbnNvbGUud2FybihcImxheW91dCBjYW5ub3QgYmUgbnVsbFwiKX0sZS5wcm90b3R5cGUucmVmcmVzaExheW91dD1mdW5jdGlvbih0KXtjb25zb2xlLndhcm4oXCJQbGVhc2UgY2FsbCBsYXlvdXQgaW5zdGVhZCBvZiByZWZyZXNoTGF5b3V0LiByZWZyZXNoTGF5b3V0IHdpbGwgYmUgZGlzY2FyZGVkIHNvb25cIik7dGhpcy5sYXlvdXQodCl9LGUucHJvdG90eXBlLmxheW91dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcImRhdGFcIiksbj10aGlzLmdldChcImxheW91dE1ldGhvZFwiKShlLHRoaXMuZ2V0KFwibGF5b3V0XCIpKSxyPXRoaXMuZ2V0KFwiYW5pbWF0ZVwiKTsodGhpcy5lbWl0KFwiYmVmb3JlcmVmcmVzaGxheW91dFwiLHtkYXRhOmUsbGF5b3V0RGF0YTpufSksdGhpcy5lbWl0KFwiYmVmb3JlbGF5b3V0XCIpLHRoaXMuaW5uZXJVcGRhdGVDaGlsZChuLHZvaWQgMCxyKSx0KSYmdGhpcy5nZXQoXCJ2aWV3Q29udHJvbGxlclwiKS5maXRWaWV3KCk7cj90aGlzLmxheW91dEFuaW1hdGUobik6KHRoaXMucmVmcmVzaCgpLHRoaXMucGFpbnQoKSksdGhpcy5lbWl0KFwiYWZ0ZXJyZWZyZXNobGF5b3V0XCIse2RhdGE6ZSxsYXlvdXREYXRhOm59KSx0aGlzLmVtaXQoXCJhZnRlcmxheW91dFwiKX0sZS5wcm90b3R5cGUuYWRkQ2hpbGQ9ZnVuY3Rpb24odCxlKXt0aGlzLmVtaXQoXCJiZWZvcmVhZGRjaGlsZFwiLHttb2RlbDp0LHBhcmVudDplfSksT2JqZWN0KGgueCkoZSl8fChlPWUuZ2V0KFwiaWRcIikpO3ZhciBuPXRoaXMuZmluZERhdGFCeUlkKGUpO24mJihuLmNoaWxkcmVufHwobi5jaGlsZHJlbj1bXSksbi5jaGlsZHJlbi5wdXNoKHQpLHRoaXMuY2hhbmdlRGF0YSgpKX0sZS5wcm90b3R5cGUudXBkYXRlQ2hpbGRyZW49ZnVuY3Rpb24odCxlKXtlJiZ0aGlzLmZpbmRCeUlkKGUpPyh0aGlzLmZpbmREYXRhQnlJZChlKS5jaGlsZHJlbj10LHRoaXMuY2hhbmdlRGF0YSgpKTpjb25zb2xlLndhcm4oXCJVcGRhdGUgY2hpbGRyZW4gZmFpbGVkISBUaGVyZSBpcyBubyBub2RlIHdpdGggaWQgJ1wiK2UrXCInXCIpfSxlLnByb3RvdHlwZS51cGRhdGVDaGlsZD1mdW5jdGlvbih0LG4pe2lmKG4mJnRoaXMuZmluZEJ5SWQobikpe3ZhciByPXRoaXMuZmluZERhdGFCeUlkKG4pLGk9dGhpcy5maW5kQnlJZCh0LmlkKTtpZihyLmNoaWxkcmVufHwoci5jaGlsZHJlbj1bXSksaSl7dmFyIG89ZS5pbmRleE9mQ2hpbGQoci5jaGlsZHJlbix0LmlkKTtyLmNoaWxkcmVuW29dPXR9ZWxzZSByLmNoaWxkcmVuLnB1c2godCk7dGhpcy5jaGFuZ2VEYXRhKCl9ZWxzZSB0aGlzLmNoYW5nZURhdGEodCl9LGUucHJvdG90eXBlLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZmluZEJ5SWQodCk7aWYobil7dmFyIHI9bi5nZXQoXCJwYXJlbnRcIik7aWYociYmIXIuZGVzdHJveWVkKXt2YXIgaT10aGlzLmZpbmREYXRhQnlJZChyLmdldChcImlkXCIpKSxvPWkmJmkuY2hpbGRyZW58fFtdLGE9bi5nZXRNb2RlbCgpLHM9ZS5pbmRleE9mQ2hpbGQobyxhLmlkKTtvLnNwbGljZShzLDEpfXRoaXMuY2hhbmdlRGF0YSgpfX0sZS5wcm90b3R5cGUuZmluZERhdGFCeUlkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZihlfHwoZT1uLmdldChcImRhdGFcIikpLHQ9PT1lLmlkKXJldHVybiBlO3ZhciByPW51bGw7cmV0dXJuIE9iamVjdChoLmYpKGUuY2hpbGRyZW58fFtdLChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PXQ/KHI9ZSwhMSk6IShyPW4uZmluZERhdGFCeUlkKHQsZSkpJiZ2b2lkIDB9KSkscn0sZS5wcm90b3R5cGUubGF5b3V0QW5pbWF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldChcImFuaW1hdGVDZmdcIik7bi5lbWl0KFwiYmVmb3JlYW5pbWF0ZVwiLHtkYXRhOnR9KSxuLmdldEVkZ2VzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoXCJtb2RlbFwiKTtlLnNvdXJjZUFuY2hvcnx8KGUuc291cmNlQW5jaG9yPXQuZ2V0KFwic291cmNlQW5jaG9ySW5kZXhcIikpfSkpLHRoaXMuZ2V0KFwiY2FudmFzXCIpLmFuaW1hdGUoKGZ1bmN0aW9uKHIpe2dkKHQsKGZ1bmN0aW9uKGkpe3ZhciBvPW4uZmluZEJ5SWQoaS5pZCk7aWYobyl7dmFyIGE9by5nZXQoXCJvcmlnaW5BdHRyc1wiKSxzPW8uZ2V0KFwibW9kZWxcIik7aWYoYXx8KGE9e3g6cy54LHk6cy55fSxvLnNldChcIm9yaWdpbkF0dHJzXCIsYSkpLGUpe3ZhciB1PWUobyxyLGEsdCk7by5zZXQoXCJtb2RlbFwiLE9iamVjdC5hc3NpZ24ocyx1KSl9ZWxzZSBzLng9YS54KyhpLngtYS54KSpyLHMueT1hLnkrKGkueS1hLnkpKnJ9cmV0dXJuITB9KSksT2JqZWN0KGguZikobi5nZXQoXCJyZW1vdmVMaXN0XCIpLChmdW5jdGlvbih0KXt2YXIgZT10LmdldE1vZGVsKCksbj10LmdldChcIm9yaWdpbkF0dHJzXCIpLGk9dC5nZXQoXCJ0b1wiKTtlLng9bi54KyhpLngtbi54KSpyLGUueT1uLnkrKGkueS1uLnkpKnJ9KSksbi5yZWZyZXNoUG9zaXRpb25zKCl9KSx7ZHVyYXRpb246ci5kdXJhdGlvbixlYXNpbmc6ci5lYXNlLGNhbGxiYWNrOmZ1bmN0aW9uKCl7T2JqZWN0KGguZikobi5nZXROb2RlcygpLChmdW5jdGlvbih0KXt0LnNldChcIm9yaWdpbkF0dHJzXCIsbnVsbCl9KSksT2JqZWN0KGguZikobi5nZXQoXCJyZW1vdmVMaXN0XCIpLChmdW5jdGlvbih0KXtuLnJlbW92ZUl0ZW0odCl9KSksbi5zZXQoXCJyZW1vdmVMaXN0XCIsW10pLHIuY2FsbGJhY2smJnIuY2FsbGJhY2soKSxuLmVtaXQoXCJhZnRlcmFuaW1hdGVcIix7ZGF0YTp0fSl9LGRlbGF5OnIuZGVsYXl9KX0sZS5wcm90b3R5cGUuc3RvcExheW91dEFuaW1hdGU9ZnVuY3Rpb24oKXt0aGlzLmdldChcImNhbnZhc1wiKS5zdG9wQW5pbWF0ZSgpLHRoaXMuZW1pdChcImxheW91dGFuaW1hdGVlbmRcIix7ZGF0YTp0aGlzLmdldChcImRhdGFcIil9KSx0aGlzLmxheW91dEFuaW1hdGluZz0hMX0sZS5wcm90b3R5cGUuaXNMYXlvdXRBbmltYXRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXRBbmltYXRpbmd9LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe2lmKCF0aGlzLmdldChcImRhdGFcIikpdGhyb3cgbmV3IEVycm9yKFwiZGF0YSBtdXN0IGJlIGRlZmluZWQgZmlyc3RcIik7dGhpcy5jbGVhcigpLHRoaXMuZW1pdChcImJlZm9yZXJlbmRlclwiKSx0aGlzLmxheW91dCh0aGlzLmdldChcImZpdFZpZXdcIikpLHRoaXMuZW1pdChcImFmdGVycmVuZGVyXCIpfSxlLnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwiZGF0YVwiKX0sZX0obmQpLHlkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9jZmdzPU9iamVjdChoLmUpKHRoaXMuZ2V0RGVmYXVsdENmZ3MoKSx0KSx0aGlzLl9ldmVudHM9e30sdGhpcy5kZXN0cm95ZWQ9ITF9cmV0dXJuIHQucHJvdG90eXBlLmdldERlZmF1bHRDZmdzPWZ1bmN0aW9uKCl7cmV0dXJue319LHQucHJvdG90eXBlLmluaXRQbHVnaW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztlLnNldChcImdyYXBoXCIsdCk7dmFyIG49ZS5nZXRFdmVudHMoKSxyPXt9O09iamVjdChoLmYpKG4sKGZ1bmN0aW9uKG4saSl7dmFyIG89T2JqZWN0KGguSikoZSxuKTtyW2ldPW8sdC5vbihpLG8pfSkpLHRoaXMuX2V2ZW50cz1yLHRoaXMuaW5pdCgpfSx0LnByb3RvdHlwZS5nZXRFdmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57fX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jZmdzW3RdfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9jZmdzW3RdPWV9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmRlc3Ryb3lQbHVnaW49ZnVuY3Rpb24oKXt0aGlzLmRlc3Ryb3koKTt2YXIgdD10aGlzLmdldChcImdyYXBoXCIpLGU9dGhpcy5fZXZlbnRzO09iamVjdChoLmYpKGUsKGZ1bmN0aW9uKGUsbil7dC5vZmYobixlKX0pKSx0aGlzLl9ldmVudHM9bnVsbCx0aGlzLl9jZmdzPW51bGwsdGhpcy5kZXN0cm95ZWQ9ITB9LHR9KCksbWQ9KHRkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHRkPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH10ZCh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLGJkPVwidXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5EQWlJR2hsYVdkb2REMGlOREFpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEdSbFpuTStQSEJoZEhSbGNtNGdhV1E5SW1keWFXUWlJSGRwWkhSb1BTSTBNQ0lnYUdWcFoyaDBQU0kwTUNJZ2NHRjBkR1Z5YmxWdWFYUnpQU0oxYzJWeVUzQmhZMlZQYmxWelpTSStQSEJoZEdnZ1pEMGlUU0F3SURFd0lFd2dOREFnTVRBZ1RTQXhNQ0F3SUV3Z01UQWdOREFnVFNBd0lESXdJRXdnTkRBZ01qQWdUU0F5TUNBd0lFd2dNakFnTkRBZ1RTQXdJRE13SUV3Z05EQWdNekFnVFNBek1DQXdJRXdnTXpBZ05EQWlJR1pwYkd3OUltNXZibVVpSUhOMGNtOXJaVDBpSTJVd1pUQmxNQ0lnYjNCaFkybDBlVDBpTUM0eUlpQnpkSEp2YTJVdGQybGtkR2c5SWpFaUx6NDhjR0YwYUNCa1BTSk5JRFF3SURBZ1RDQXdJREFnTUNBME1DSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxQU0lqWlRCbE1HVXdJaUJ6ZEhKdmEyVXRkMmxrZEdnOUlqRWlMejQ4TDNCaGRIUmxjbTQrUEM5a1pXWnpQanh5WldOMElIZHBaSFJvUFNJeE1EQWxJaUJvWldsbmFIUTlJakV3TUNVaUlHWnBiR3c5SW5WeWJDZ2paM0pwWkNraUx6NDhMM04yWno0PSlcIix4ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbWQoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0Q2Zncz1mdW5jdGlvbigpe3JldHVybntpbWc6YmR9fSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJncmFwaFwiKSxlPXQuZ2V0KFwibWluWm9vbVwiKSxuPXQuZ2V0KFwiY29udGFpbmVyXCIpLHI9dC5nZXQoXCJjYW52YXNcIikuZ2V0KFwiZWxcIiksaT10LmdldChcIndpZHRoXCIpLG89dC5nZXQoXCJoZWlnaHRcIiksYT10aGlzLmdldChcImltZ1wiKXx8YmQscz1ndChcIjxkaXYgY2xhc3M9J2c2LWdyaWQtY29udGFpbmVyJyBzdHlsZT1cXFwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OjA7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtvdmVyZmxvdzogaGlkZGVuO3otaW5kZXg6IC0xO1xcXCI+PC9kaXY+XCIpLHU9Z3QoXCI8ZGl2IFxcbiAgICAgICAgY2xhc3M9J2c2LWdyaWQnIFxcbiAgICAgICAgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO1xcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMCUgMCUgMHB4O1xcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogXCIrYStcIjtcXG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lXFxuICAgICAgICAnPjwvZGl2PlwiKTtzLmFwcGVuZENoaWxkKHUpLHZ0KHMse3dpZHRoOmkrXCJweFwiLGhlaWdodDpvK1wicHhcIixsZWZ0Om4ub2Zmc2V0TGVmdCtcInB4XCIsdG9wOm4ub2Zmc2V0VG9wK1wicHhcIn0pLHZ0KHUse3dpZHRoOmkvZStcInB4XCIsaGVpZ2h0Om8vZStcInB4XCIsbGVmdDpcIjBweFwiLHRvcDpcIjBweFwifSksbi5pbnNlcnRCZWZvcmUocyxyKSx0aGlzLnNldChcImNvbnRhaW5lclwiLHMpLHRoaXMuc2V0KFwiZ3JpZENvbnRhaW5lclwiLHUpfSxlLnByb3RvdHlwZS5nZXRFdmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57dmlld3BvcnRjaGFuZ2U6XCJ1cGRhdGVHcmlkXCJ9fSxlLnByb3RvdHlwZS51cGRhdGVHcmlkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0KFwiZ3JpZENvbnRhaW5lclwiKSxuPXQubWF0cml4O258fChuPVsxLDAsMCwwLDEsMCwwLDAsMV0pLHZ0KGUse3RyYW5zZm9ybTpcIm1hdHJpeChcIituWzBdK1wiLCBcIituWzFdK1wiLCBcIituWzNdK1wiLCBcIituWzRdK1wiLCAwLCAwKVwifSl9LGUucHJvdG90eXBlLmdldENvbnRhaW5lcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcImNvbnRhaW5lclwiKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwiZ3JhcGhcIikuZ2V0KFwiY29udGFpbmVyXCIpLGU9dGhpcy5nZXQoXCJjb250YWluZXJcIik7dC5yZW1vdmVDaGlsZChlKX0sZX0oeWQpLHdkPW4oODMpLFNkPW4ubih3ZCksRWQ9ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbihlLG4pe3JldHVybih0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiYodFtuXT1lW25dKX0pKGUsbil9O3JldHVybiBmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPWV9dChlLG4pLGUucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCk7U2QoKShcIlxcbiAgLmc2LWNvbXBvbmVudC1jb250ZXh0bWVudSB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMmUyZTI7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgZm9udC1zaXplOiAxMnB4O1xcbiAgICBjb2xvcjogIzU0NTQ1NDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbiAgICBwYWRkaW5nOiAxMHB4IDhweDtcXG4gICAgYm94LXNoYWRvdzogcmdiKDE3NCwgMTc0LCAxNzQpIDBweCAwcHggMTBweDtcXG4gIH1cXG4gIC5nNi1jb250ZXh0bWVudS11bCB7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgbGlzdC1zdHlsZTogbm9uZTtcXG4gIH1cXG5cXG5cIik7dmFyIF9kPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBFZChlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRDZmdzPWZ1bmN0aW9uKCl7cmV0dXJue29mZnNldFg6NixvZmZzZXRZOjYsaGFuZGxlTWVudUNsaWNrOnZvaWQgMCxnZXRDb250ZW50OmZ1bmN0aW9uKHQpe3JldHVyblwiXFxuICAgICAgICAgIDx1bCBjbGFzcz0nZzYtY29udGV4dG1lbnUtdWwnPlxcbiAgICAgICAgICAgIDxsaT7DqMKPxZPDpcKN4oCiw6nCocK5MTwvbGk+XFxuICAgICAgICAgICAgPGxpPsOowo/Fk8Olwo3igKLDqcKhwrkyPC9saT5cXG4gICAgICAgICAgPC91bD5cXG4gICAgICAgIFwifSxzaG91bGRCZWdpbjpmdW5jdGlvbih0KXtyZXR1cm4hMH0sb25IaWRlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGl0ZW1UeXBlczpbXCJub2RlXCIsXCJlZGdlXCIsXCJjb21ib1wiXX19LGUucHJvdG90eXBlLmdldEV2ZW50cz1mdW5jdGlvbigpe3JldHVybntjb250ZXh0bWVudTpcIm9uTWVudVNob3dcIn19LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgdD1ndChcIjxkaXYgY2xhc3M9XCIrKHRoaXMuZ2V0KFwiY2xhc3NOYW1lXCIpfHxcImc2LWNvbXBvbmVudC1jb250ZXh0bWVudVwiKStcIj48L2Rpdj5cIik7dnQodCx7dG9wOlwiMHB4XCIscG9zaXRpb246XCJhYnNvbHV0ZVwiLHZpc2liaWxpdHk6XCJoaWRkZW5cIn0pO3ZhciBlPXRoaXMuZ2V0KFwiY29udGFpbmVyXCIpO2V8fChlPXRoaXMuZ2V0KFwiZ3JhcGhcIikuZ2V0KFwiY29udGFpbmVyXCIpKSxPYmplY3QoaC54KShlKSYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkpLGUuYXBwZW5kQ2hpbGQodCksdGhpcy5zZXQoXCJtZW51XCIsdCl9LGUucHJvdG90eXBlLm9uTWVudVNob3c9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgbj10aGlzLmdldChcIml0ZW1UeXBlc1wiKTtpZih0Lml0ZW0pe2lmKHQuaXRlbSYmdC5pdGVtLmdldFR5cGUmJi0xPT09bi5pbmRleE9mKHQuaXRlbS5nZXRUeXBlKCkpKXJldHVybiB2b2lkIGUub25NZW51SGlkZSgpfWVsc2UgaWYoLTE9PT1uLmluZGV4T2YoXCJjYW52YXNcIikpcmV0dXJuO2lmKHRoaXMuZ2V0KFwic2hvdWxkQmVnaW5cIikodCkpe3ZhciByPXRoaXMuZ2V0KFwibWVudVwiKSxpPXRoaXMuZ2V0KFwiZ2V0Q29udGVudFwiKSxvPXRoaXMuZ2V0KFwiZ3JhcGhcIiksYT1pKHQsbyk7T2JqZWN0KGgueCkoYSk/ci5pbm5lckhUTUw9YTpyLmlubmVySFRNTD1hLm91dGVySFRNTCx0aGlzLnJlbW92ZU1lbnVFdmVudExpc3RlbmVyKCk7dmFyIHM9dGhpcy5nZXQoXCJoYW5kbGVNZW51Q2xpY2tcIik7aWYocyl7dmFyIHU9ZnVuY3Rpb24oZSl7cyhlLnRhcmdldCx0Lml0ZW0sbyl9O3RoaXMuc2V0KFwiaGFuZGxlTWVudUNsaWNrV3JhcHBlclwiLHUpLHIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdSl9dmFyIGM9by5nZXQoXCJ3aWR0aFwiKSxmPW8uZ2V0KFwiaGVpZ2h0XCIpLGw9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPXRoaXMuZ2V0KFwib2Zmc2V0WFwiKXx8MCxwPXRoaXMuZ2V0KFwib2Zmc2V0WVwiKXx8MCxnPW8uZ2V0Q29udGFpbmVyKCkub2Zmc2V0VG9wLHY9by5nZXRDb250YWluZXIoKS5vZmZzZXRMZWZ0LHk9dC5jYW52YXNYK3YrZCxtPXQuY2FudmFzWStnK3A7eStsLndpZHRoPmMmJih5PXQuY2FudmFzWC1sLndpZHRoLWQrdiksbStsLmhlaWdodD5mJiYobT10LmNhbnZhc1ktbC5oZWlnaHQtcCtnKSx2dChyLHt0b3A6bStcInB4XCIsbGVmdDp5K1wicHhcIix2aXNpYmlsaXR5OlwidmlzaWJsZVwifSk7dmFyIGI9ZnVuY3Rpb24odCl7ZS5vbk1lbnVIaWRlKCl9O2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsYiksdGhpcy5zZXQoXCJoYW5kbGVyXCIsYil9fSxlLnByb3RvdHlwZS5yZW1vdmVNZW51RXZlbnRMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwiaGFuZGxlTWVudUNsaWNrV3JhcHBlclwiKSxlPXRoaXMuZ2V0KFwiaGFuZGxlclwiKTt0JiYodGhpcy5nZXQoXCJtZW51XCIpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHQpLHRoaXMuc2V0KFwiaGFuZGxlTWVudUNsaWNrV3JhcHBlclwiLG51bGwpKTtlJiZkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGUpfSxlLnByb3RvdHlwZS5vbk1lbnVIaWRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJtZW51XCIpO3QmJnZ0KHQse3Zpc2liaWxpdHk6XCJoaWRkZW5cIn0pLHRoaXMucmVtb3ZlTWVudUV2ZW50TGlzdGVuZXIoKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwibWVudVwiKTtpZih0aGlzLnJlbW92ZU1lbnVFdmVudExpc3RlbmVyKCksdCl7dmFyIGU9dGhpcy5nZXQoXCJjb250YWluZXJcIik7ZXx8KGU9dGhpcy5nZXQoXCJncmFwaFwiKS5nZXQoXCJjb250YWluZXJcIikpLE9iamVjdChoLngpKGUpJiYoZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKSksZS5yZW1vdmVDaGlsZCh0KX19LGV9KHlkKSxPZD1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKGUsbil7cmV0dXJuKHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJih0W25dPWVbbl0pfSkoZSxuKX07cmV0dXJuIGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9ZX10KGUsbiksZS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooci5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHIpfX0oKSxrZD1mdW5jdGlvbigpe3JldHVybihrZD1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgaSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LE1kPU1hdGgubWF4LEFkPXMudHJhbnNmb3JtLFRkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuaGFuZGxlVXBkYXRlQ2FudmFzPU9iamVjdChoLmQpKChmdW5jdGlvbih0KXt2YXIgbj1lO24uZGVzdHJveWVkfHxuLnVwZGF0ZUNhbnZhcygpfSksMTAwLCExKSxlfXJldHVybiBPZChlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRDZmdzPWZ1bmN0aW9uKCl7cmV0dXJue2NvbnRhaW5lcjpudWxsLGNsYXNzTmFtZTpcImc2LW1pbmltYXBcIix2aWV3cG9ydENsYXNzTmFtZTpcImc2LW1pbmltYXAtdmlld3BvcnRcIix0eXBlOlwiZGVmYXVsdFwiLHBhZGRpbmc6NTAsc2l6ZTpbMjAwLDEyMF0sZGVsZWdhdGVTdHlsZTp7ZmlsbDpcIiM0MGE5ZmZcIixzdHJva2U6XCIjMDk2ZGQ5XCJ9LHJlZnJlc2g6ITB9fSxlLnByb3RvdHlwZS5nZXRFdmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57YmVmb3JlcGFpbnQ6XCJ1cGRhdGVWaWV3cG9ydFwiLGJlZm9yZWFuaW1hdGU6XCJkaXNhYmxlUmVmcmVzaFwiLGFmdGVyYW5pbWF0ZTpcImVuYWJsZVJlZnJlc2hcIix2aWV3cG9ydGNoYW5nZTpcImRpc2FibGVPbmVSZWZyZXNoXCJ9fSxlLnByb3RvdHlwZS5kaXNhYmxlUmVmcmVzaD1mdW5jdGlvbigpe3RoaXMuc2V0KFwicmVmcmVzaFwiLCExKX0sZS5wcm90b3R5cGUuZW5hYmxlUmVmcmVzaD1mdW5jdGlvbigpe3RoaXMuc2V0KFwicmVmcmVzaFwiLCEwKSx0aGlzLnVwZGF0ZUNhbnZhcygpfSxlLnByb3RvdHlwZS5kaXNhYmxlT25lUmVmcmVzaD1mdW5jdGlvbigpe3RoaXMuc2V0KFwidmlld3BvcnRDaGFuZ2VcIiwhMCl9LGUucHJvdG90eXBlLmluaXRWaWV3cG9ydD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9jZmdzLG49ZS5zaXplLHI9ZS5ncmFwaDtpZighdGhpcy5kZXN0cm95ZWQpe3ZhciBpPXRoaXMuZ2V0KFwiY2FudmFzXCIpLmdldChcImNvbnRhaW5lclwiKSxvPWd0KFwiXFxuICAgICAgPGRpdlxcbiAgICAgICAgY2xhc3M9XCIrZS52aWV3cG9ydENsYXNzTmFtZStcIlxcbiAgICAgICAgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO1xcbiAgICAgICAgICBsZWZ0OjA7XFxuICAgICAgICAgIHRvcDowO1xcbiAgICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XFxuICAgICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCAjMTk4MGZmJ1xcbiAgICAgICAgZHJhZ2dhYmxlPXRydWU+XFxuICAgICAgPC9kaXY+XCIpLGE9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJmaXJlZm94XCIpPi0xLHM9MCx1PTAsYz0hMSxmPTAsbD0wLGQ9MCxwPTAsZz0wLHY9MDtvLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnc3RhcnRcIiwoZnVuY3Rpb24oaSl7dmFyIGEsaDtpZihpLmRhdGFUcmFuc2Zlcil7dmFyIHk9bmV3IEltYWdlO3kuc3JjPVwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnICUzRSUzQ3BhdGggLyUzRSUzQy9zdmclM0VcIixudWxsPT09KGg9KGE9aS5kYXRhVHJhbnNmZXIpLnNldERyYWdJbWFnZSl8fHZvaWQgMD09PWh8fGguY2FsbChhLHksMCwwKTt0cnl7aS5kYXRhVHJhbnNmZXIuc2V0RGF0YShcInRleHQvaHRtbFwiLFwidmlldy1wb3J0LW1pbmltYXBcIil9Y2F0Y2godCl7aS5kYXRhVHJhbnNmZXIuc2V0RGF0YShcInRleHRcIixcInZpZXctcG9ydC1taW5pbWFwXCIpfX1pZihlLnJlZnJlc2g9ITEsaS50YXJnZXQ9PT1vKXt2YXIgbT1vLnN0eWxlO2Y9cGFyc2VJbnQobS5sZWZ0LDEwKSxsPXBhcnNlSW50KG0udG9wLDEwKSxkPXBhcnNlSW50KG0ud2lkdGgsMTApLHA9cGFyc2VJbnQobS5oZWlnaHQsMTApLGQ+blswXXx8cD5uWzFdfHwodj1yLmdldFpvb20oKSxnPXQuZ2V0KFwicmF0aW9cIiksYz0hMCxzPWkuY2xpZW50WCx1PWkuY2xpZW50WSl9fSksITEpLG8uYWRkRXZlbnRMaXN0ZW5lcihhP1wiZHJhZ292ZXJcIjpcImRyYWdcIiwoZnVuY3Rpb24odCl7aWYoYyYmIU9iamVjdChoLnMpKHQuY2xpZW50WCkmJiFPYmplY3QoaC5zKSh0LmNsaWVudFkpKXt2YXIgZT1zLXQuY2xpZW50WCxpPXUtdC5jbGllbnRZOyhmLWU8MHx8Zi1lK2Q+PW5bMF0pJiYoZT0wKSwobC1pPDB8fGwtaStwPj1uWzFdKSYmKGk9MCksdnQobyx7bGVmdDooZi09ZSkrXCJweFwiLHRvcDoobC09aSkrXCJweFwifSksci50cmFuc2xhdGUoZSp2L2csaSp2L2cpLHM9dC5jbGllbnRYLHU9dC5jbGllbnRZfX0pLCExKSxvLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnZW5kXCIsKGZ1bmN0aW9uKCl7Yz0hMSxlLnJlZnJlc2g9ITB9KSwhMSksdGhpcy5zZXQoXCJ2aWV3cG9ydFwiLG8pLGkuYXBwZW5kQ2hpbGQobyl9fSxlLnByb3RvdHlwZS51cGRhdGVWaWV3cG9ydD1mdW5jdGlvbigpe2lmKCF0aGlzLmRlc3Ryb3llZCl7dmFyIHQ9dGhpcy5nZXQoXCJyYXRpb1wiKSxlPSh0aGlzLmdldChcImR4XCIpLHRoaXMuZ2V0KFwiZHlcIiksdGhpcy5nZXQoXCJ0b3RhbGR4XCIpKSxuPXRoaXMuZ2V0KFwidG90YWxkeVwiKSxyPXRoaXMuZ2V0KFwiZ3JhcGhcIiksaT10aGlzLmdldChcInNpemVcIiksbz1yLmdldChcIndpZHRoXCIpLGE9ci5nZXQoXCJoZWlnaHRcIikscz1yLmdldFBvaW50QnlDYW52YXMoMCwwKSx1PXIuZ2V0UG9pbnRCeUNhbnZhcyhvLGEpLGM9dGhpcy5nZXQoXCJ2aWV3cG9ydFwiKTtjfHx0aGlzLmluaXRWaWV3cG9ydCgpO3IuZ2V0Wm9vbSgpO3ZhciBmPSh1Lngtcy54KSp0LGw9KHUueS1zLnkpKnQsaD1zLngqdCtlLGQ9cy55KnQrbixwPWgrZixnPWQrbDtoPDAmJihmKz1oLGg9MCkscD5pWzBdJiYoZi09cC1pWzBdKSxkPDAmJihsKz1kLGQ9MCksZz5pWzFdJiYobC09Zy1pWzFdKSx0aGlzLnNldChcInJhdGlvXCIsdCksdnQoYyx7bGVmdDpoK1wicHhcIix0b3A6ZCtcInB4XCIsd2lkdGg6ZitcInB4XCIsaGVpZ2h0OmwrXCJweFwifSl9fSxlLnByb3RvdHlwZS51cGRhdGVHcmFwaFNoYXBlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NmZ3MuZ3JhcGgsZT10aGlzLmdldChcImNhbnZhc1wiKSxuPXQuZ2V0KFwiZ3JvdXBcIik7aWYoIW4uZGVzdHJveWVkKXt2YXIgcj1uLmNsb25lKCk7ci5yZXNldE1hdHJpeCgpLGUuY2xlYXIoKSxlLmFkZChyKSxcInN2Z1wiPT09dC5nZXQoXCJyZW5kZXJlclwiKSYmdGhpcy51cGRhdGVWaXNpYmxlKHIpfX0sZS5wcm90b3R5cGUudXBkYXRlVmlzaWJsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHQuaXNHcm91cCgpfHx0LmdldChcInZpc2libGVcIikpe3ZhciBuPXQuZ2V0KFwiY2hpbGRyZW5cIik7aWYoIW58fCFuLmxlbmd0aClyZXR1cm47bi5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmdldChcInZpc2libGVcIil8fHQuaGlkZSgpLGUudXBkYXRlVmlzaWJsZSh0KX0pKX1lbHNlIHQuaGlkZSgpfSxlLnByb3RvdHlwZS51cGRhdGVLZXlTaGFwZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fY2Zncy5ncmFwaDtPYmplY3QoaC5mKShlLmdldEVkZ2VzKCksKGZ1bmN0aW9uKGUpe3QudXBkYXRlT25lRWRnZUtleVNoYXBlKGUpfSkpLE9iamVjdChoLmYpKGUuZ2V0Tm9kZXMoKSwoZnVuY3Rpb24oZSl7dC51cGRhdGVPbmVOb2RlS2V5U2hhcGUoZSl9KSksdGhpcy5jbGVhckRlc3Ryb3llZFNoYXBlcygpfSxlLnByb3RvdHlwZS51cGRhdGVPbmVOb2RlS2V5U2hhcGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXQoXCJjYW52YXNcIiksbj1lLmdldChcImNoaWxkcmVuXCIpWzBdfHxlLmFkZEdyb3VwKCkscj10aGlzLmdldChcIml0ZW1NYXBcIil8fHt9LGk9clt0LmdldChcImlkXCIpXSxvPXQuZ2V0QkJveCgpLGE9dC5nZXQoXCJrZXlTaGFwZVwiKS5jbG9uZSgpLHM9YS5hdHRyKCksdT17eDpvLmNlbnRlclgseTpvLmNlbnRlcll9O2k/dT1PYmplY3QuYXNzaWduKHMsdSk6KGk9YSxuLmFkZChpKSk7dmFyIGM9aS5nZXQoXCJ0eXBlXCIpO1wicmVjdFwiIT09YyYmXCJpbWFnZVwiIT09Y3x8KHUueD1vLm1pblgsdS55PW8ubWluWSksaS5hdHRyKHUpLHQuaXNWaXNpYmxlKCl8fGkuaGlkZSgpLGkuZXhpc3Q9ITAsclt0LmdldChcImlkXCIpXT1pLHRoaXMuc2V0KFwiaXRlbU1hcFwiLHIpfSxlLnByb3RvdHlwZS51cGRhdGVEZWxlZ2F0ZVNoYXBlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9jZmdzLmdyYXBoO09iamVjdChoLmYpKGUuZ2V0RWRnZXMoKSwoZnVuY3Rpb24oZSl7dC51cGRhdGVPbmVFZGdlS2V5U2hhcGUoZSl9KSksT2JqZWN0KGguZikoZS5nZXROb2RlcygpLChmdW5jdGlvbihlKXt0LnVwZGF0ZU9uZU5vZGVEZWxlZ2F0ZVNoYXBlKGUpfSkpLHRoaXMuY2xlYXJEZXN0cm95ZWRTaGFwZXMoKX0sZS5wcm90b3R5cGUuY2xlYXJEZXN0cm95ZWRTaGFwZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcIml0ZW1NYXBcIil8fHt9LGU9T2JqZWN0LmtleXModCk7aWYoZSYmMCE9PWUubGVuZ3RoKWZvcih2YXIgbj1lLmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgcj10W2Vbbl1dLGk9ci5leGlzdDtyLmV4aXN0PSExLGl8fChyLnJlbW92ZSgpLGRlbGV0ZSB0W2Vbbl1dKX19LGUucHJvdG90eXBlLnVwZGF0ZU9uZUVkZ2VLZXlTaGFwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcImNhbnZhc1wiKSxuPWUuZ2V0KFwiY2hpbGRyZW5cIilbMF18fGUuYWRkR3JvdXAoKSxyPXRoaXMuZ2V0KFwiaXRlbU1hcFwiKXx8e30saT1yW3QuZ2V0KFwiaWRcIildO2lmKGkpe3ZhciBvPXQuZ2V0KFwia2V5U2hhcGVcIikuYXR0cihcInBhdGhcIik7aS5hdHRyKFwicGF0aFwiLG8pfWVsc2UgaT10LmdldChcImtleVNoYXBlXCIpLmNsb25lKCksbi5hZGQoaSksaS50b0JhY2soKTt0LmlzVmlzaWJsZSgpfHxpLmhpZGUoKSxpLmV4aXN0PSEwLHJbdC5nZXQoXCJpZFwiKV09aSx0aGlzLnNldChcIml0ZW1NYXBcIixyKX0sZS5wcm90b3R5cGUudXBkYXRlT25lTm9kZURlbGVnYXRlU2hhcGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXQoXCJjYW52YXNcIiksbj1lLmdldChcImNoaWxkcmVuXCIpWzBdfHxlLmFkZEdyb3VwKCkscj10aGlzLmdldChcImRlbGVnYXRlU3R5bGVcIiksaT10aGlzLmdldChcIml0ZW1NYXBcIil8fHt9LG89aVt0LmdldChcImlkXCIpXSxhPXQuZ2V0QkJveCgpO2lmKG8pe3ZhciBzPXt4OmEubWluWCx5OmEubWluWSx3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH07by5hdHRyKHMpfWVsc2Ugbz1uLmFkZFNoYXBlKFwicmVjdFwiLHthdHRyczprZCh7eDphLm1pblgseTphLm1pblksd2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHR9LHIpLG5hbWU6XCJtaW5pbWFwLW5vZGUtc2hhcGVcIn0pO3QuaXNWaXNpYmxlKCl8fG8uaGlkZSgpLG8uZXhpc3Q9ITAsaVt0LmdldChcImlkXCIpXT1vLHRoaXMuc2V0KFwiaXRlbU1hcFwiLGkpfSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5pbml0Q29udGFpbmVyKCksdGhpcy5nZXQoXCJncmFwaFwiKS5vbihcImFmdGVydXBkYXRlaXRlbVwiLHRoaXMuaGFuZGxlVXBkYXRlQ2FudmFzKSx0aGlzLmdldChcImdyYXBoXCIpLm9uKFwiYWZ0ZXJpdGVtc3RhdGVjaGFuZ2VcIix0aGlzLmhhbmRsZVVwZGF0ZUNhbnZhcyksdGhpcy5nZXQoXCJncmFwaFwiKS5vbihcImFmdGVyYWRkaXRlbVwiLHRoaXMuaGFuZGxlVXBkYXRlQ2FudmFzKSx0aGlzLmdldChcImdyYXBoXCIpLm9uKFwiYWZ0ZXJyZW1vdmVpdGVtXCIsdGhpcy5oYW5kbGVVcGRhdGVDYW52YXMpLHRoaXMuZ2V0KFwiZ3JhcGhcIikub24oXCJhZnRlcnJlbmRlclwiLHRoaXMuaGFuZGxlVXBkYXRlQ2FudmFzKSx0aGlzLmdldChcImdyYXBoXCIpLm9uKFwiYWZ0ZXJsYXlvdXRcIix0aGlzLmhhbmRsZVVwZGF0ZUNhbnZhcyl9LGUucHJvdG90eXBlLmluaXRDb250YWluZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImdyYXBoXCIpLGU9dGhpcy5nZXQoXCJzaXplXCIpLG49dGhpcy5nZXQoXCJjbGFzc05hbWVcIikscj10aGlzLmdldChcImNvbnRhaW5lclwiKSxpPWd0KFwiPGRpdiBjbGFzcz0nXCIrbitcIicgc3R5bGU9J3dpZHRoOiBcIitlWzBdK1wicHg7IGhlaWdodDogXCIrZVsxXStcInB4OyBvdmVyZmxvdzogaGlkZGVuJz48L2Rpdj5cIik7T2JqZWN0KGgueCkocikmJihyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIpKSxyP3IuYXBwZW5kQ2hpbGQoaSk6dC5nZXQoXCJjb250YWluZXJcIikuYXBwZW5kQ2hpbGQoaSksdGhpcy5zZXQoXCJjb250YWluZXJcIixpKTt2YXIgbyxhPWd0KCc8ZGl2IGNsYXNzPVwiZzYtbWluaW1hcC1jb250YWluZXJcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj48L2Rpdj4nKTtpLmFwcGVuZENoaWxkKGEpLG89XCJzdmdcIj09PXQuZ2V0KFwicmVuZGVyZXJcIik/bmV3IHNuLkNhbnZhcyh7Y29udGFpbmVyOmEsd2lkdGg6ZVswXSxoZWlnaHQ6ZVsxXX0pOm5ldyBhbi5DYW52YXMoe2NvbnRhaW5lcjphLHdpZHRoOmVbMF0saGVpZ2h0OmVbMV19KSx0aGlzLnNldChcImNhbnZhc1wiLG8pLHRoaXMudXBkYXRlQ2FudmFzKCl9LGUucHJvdG90eXBlLnVwZGF0ZUNhbnZhcz1mdW5jdGlvbigpe2lmKHRoaXMuZ2V0KFwicmVmcmVzaFwiKSl7dmFyIHQ9dGhpcy5nZXQoXCJncmFwaFwiKTtpZighdC5nZXQoXCJkZXN0cm95ZWRcIikpe3RoaXMuZ2V0KFwidmlld3BvcnRDaGFuZ2VcIikmJih0aGlzLnNldChcInZpZXdwb3J0Q2hhbmdlXCIsITEpLHRoaXMudXBkYXRlVmlld3BvcnQoKSk7dmFyIGU9dGhpcy5nZXQoXCJzaXplXCIpLG49dGhpcy5nZXQoXCJjYW52YXNcIikscj10aGlzLmdldChcInR5cGVcIiksaT10aGlzLmdldChcInBhZGRpbmdcIik7aWYoIW4uZGVzdHJveWVkKXtzd2l0Y2gocil7Y2FzZVwiZGVmYXVsdFwiOnRoaXMudXBkYXRlR3JhcGhTaGFwZXMoKTticmVhaztjYXNlXCJrZXlTaGFwZVwiOnRoaXMudXBkYXRlS2V5U2hhcGVzKCk7YnJlYWs7Y2FzZVwiZGVsZWdhdGVcIjp0aGlzLnVwZGF0ZURlbGVnYXRlU2hhcGVzKCl9dmFyIG89bi5nZXQoXCJjaGlsZHJlblwiKVswXTtpZihvKXtvLnJlc2V0TWF0cml4KCk7dmFyIGE9by5nZXRDYW52YXNCQm94KCkscz10LmdldChcImNhbnZhc1wiKS5nZXRDYW52YXNCQm94KCksdT1zLndpZHRoLGM9cy5oZWlnaHQ7TnVtYmVyLmlzRmluaXRlKGEud2lkdGgpJiYodT1NZChhLndpZHRoLHUpLGM9TWQoYS5oZWlnaHQsYykpLHUrPTIqaSxjKz0yKmk7dmFyIGY9TWF0aC5taW4oZVswXS91LGVbMV0vYyksbD1bMSwwLDAsMCwxLDAsMCwwLDFdLGg9MCxkPTA7TnVtYmVyLmlzRmluaXRlKGEubWluWCkmJihoPS1hLm1pblgpLE51bWJlci5pc0Zpbml0ZShhLm1pblkpJiYoZD0tYS5taW5ZKTt2YXIgcD0oZVswXS0odS0yKmkpKmYpLzIsZz0oZVsxXS0oYy0yKmkpKmYpLzI7bD1BZChsLFtbXCJ0XCIsaCxkXSxbXCJzXCIsZixmXSxbXCJ0XCIscCxnXV0pLG8uc2V0TWF0cml4KGwpLHRoaXMuc2V0KFwicmF0aW9cIixmKSx0aGlzLnNldChcInRvdGFsZHhcIixwK2gqZiksdGhpcy5zZXQoXCJ0b3RhbGR5XCIsZytkKmYpLHRoaXMuc2V0KFwiZHhcIixwKSx0aGlzLnNldChcImR5XCIsZyksdGhpcy51cGRhdGVWaWV3cG9ydCgpfX19fX0sZS5wcm90b3R5cGUuZ2V0Q2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwiY2FudmFzXCIpfSxlLnByb3RvdHlwZS5nZXRWaWV3cG9ydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcInZpZXdwb3J0XCIpfSxlLnByb3RvdHlwZS5nZXRDb250YWluZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJjb250YWluZXJcIil9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmdldChcImNhbnZhc1wiKS5kZXN0cm95KCk7dmFyIHQ9dGhpcy5nZXQoXCJjb250YWluZXJcIik7dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfSxlfSh5ZCksQ2Q9ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbihlLG4pe3JldHVybih0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiYodFtuXT1lW25dKX0pKGUsbil9O3JldHVybiBmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPWV9dChlLG4pLGUucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCk7ZnVuY3Rpb24gSWQodCxlLG4pe3ZhciByPXQueC1lLngsaT10LnktZS55O3JldHVybiFufHxNYXRoLmFicyhyKT5ufHxNYXRoLmFicyhpKT5uP01hdGguc3FydChyKnIraSppKTpufWZ1bmN0aW9uIFBkKHQsZSl7dmFyIG49KGUuc291cmNlLnktZS50YXJnZXQueSkvKGUuc291cmNlLngtZS50YXJnZXQueCkscj0obipuKmUuc291cmNlLngrbioodC55LWUuc291cmNlLnkpK3QueCkvKG4qbisxKTtyZXR1cm57eDpyLHk6biooci1lLnNvdXJjZS54KStlLnNvdXJjZS55fX12YXIgamQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIENkKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZ3M9ZnVuY3Rpb24oKXtyZXR1cm57ZWRnZUJ1bmRsZXM6W10sZWRnZVBvaW50czpbXSxLOi4xLGxhbWJkYTouMSxkaXZpc2lvbnM6MSxkaXZSYXRlOjIsY3ljbGVzOjYsaXRlcmF0aW9uczo5MCxpdGVyUmF0ZTouNjY2NjY2NyxidW5kbGVUaHJlc2hvbGQ6LjYsZXBzOjFlLTYsb25MYXlvdXRFbmQ6ZnVuY3Rpb24oKXt9LG9uVGljazpmdW5jdGlvbigpe319fSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJncmFwaFwiKSxlPXRoaXMuZ2V0KFwib25UaWNrXCIpO3RoaXMuc2V0KFwidGlja1wiLChmdW5jdGlvbigpe2UmJmUoKSx0LnJlZnJlc2hQb3NpdGlvbnMoKX0pKX0sZS5wcm90b3R5cGUuYnVuZGxpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihlLnNldChcImRhdGFcIix0KSwhZS5pc1RpY2tpbmcoKSl7dmFyIG49dC5lZGdlc3x8W10scj10Lm5vZGVzfHxbXSxpPXt9LG89ITE7aWYoci5mb3JFYWNoKChmdW5jdGlvbih0KXtudWxsIT09dC54JiZudWxsIT09IXQueSYmdm9pZCAwIT09dC54JiZ2b2lkIDAhPT0hdC55fHwobz0hMCksaVt0LmlkXT10fSkpLG8pdGhyb3cgbmV3IEVycm9yKFwicGxlYXNlIGxheW91dCB0aGUgZ3JhcGggb3IgYXNzaWduIHggYW5kIHkgZm9yIG5vZGVzIGZpcnN0XCIpO2Uuc2V0KFwibm9kZUlkTWFwXCIsaSk7dmFyIGE9ZS5nZXQoXCJkaXZpc2lvbnNcIikscz1lLmdldChcImRpdlJhdGVcIiksdT1lLmRpdmlkZUVkZ2VzKGEpO2Uuc2V0KFwiZWRnZVBvaW50c1wiLHUpO3ZhciBjPWUuZ2V0RWRnZUJ1bmRsZXMoKTtlLnNldChcImVkZ2VCdW5kbGVzXCIsYyk7Zm9yKHZhciBmPWUuZ2V0KFwiY3ljbGVzXCIpLGw9ZS5nZXQoXCJpdGVyYXRpb25zXCIpLGg9ZS5nZXQoXCJpdGVyUmF0ZVwiKSxkPWUuZ2V0KFwibGFtYmRhXCIpLHA9MDtwPGY7cCsrKXtmb3IodmFyIGc9ZnVuY3Rpb24odCl7dmFyIHI9W107bi5mb3JFYWNoKChmdW5jdGlvbih0LG4pe2lmKHQuc291cmNlIT09dC50YXJnZXQpe3ZhciBvPWlbdC5zb3VyY2VdLHM9aVt0LnRhcmdldF07cltuXT1lLmdldEVkZ2VGb3JjZXMoe3NvdXJjZTpvLHRhcmdldDpzfSxuLGEsZCk7Zm9yKHZhciBjPTA7YzxhKzE7YysrKXVbbl1bY10ueCs9cltuXVtjXS54LHVbbl1bY10ueSs9cltuXVtjXS55fX0pKX0sdj0wO3Y8bDt2KyspZygpO2QvPTIsYSo9cyxsKj1oLHU9ZS5kaXZpZGVFZGdlcyhhKSxlLnNldChcImVkZ2VQb2ludHNcIix1KX1uLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dC5zb3VyY2UhPT10LnRhcmdldCYmKHQudHlwZT1cInBvbHlsaW5lXCIsdC5jb250cm9sUG9pbnRzPXVbZV0uc2xpY2UoMSx1W2VdLmxlbmd0aC0xKSl9KSksZS5nZXQoXCJncmFwaFwiKS5yZWZyZXNoKCl9fSxlLnByb3RvdHlwZS51cGRhdGVCdW5kbGluZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dC5kYXRhO2lmKG4mJmUuc2V0KFwiZGF0YVwiLG4pLGUuZ2V0KFwidGlja2luZ1wiKSYmZS5zZXQoXCJ0aWNraW5nXCIsITEpLE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe2Uuc2V0KG4sdFtuXSl9KSksdC5vblRpY2spe3ZhciByPXRoaXMuZ2V0KFwiZ3JhcGhcIik7ZS5zZXQoXCJ0aWNrXCIsKGZ1bmN0aW9uKCl7dC5vblRpY2soKSxyLnJlZnJlc2goKX0pKX1lLmJ1bmRsaW5nKG4pfSxlLnByb3RvdHlwZS5kaXZpZGVFZGdlcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZS5nZXQoXCJkYXRhXCIpLmVkZ2VzLHI9ZS5nZXQoXCJub2RlSWRNYXBcIiksaT1lLmdldChcImVkZ2VQb2ludHNcIik7cmV0dXJuIGkmJnZvaWQgMCE9PWl8fChpPVtdKSxuLmZvckVhY2goKGZ1bmN0aW9uKG4sbyl7aVtvXSYmdm9pZCAwIT09aVtvXXx8KGlbb109W10pO3ZhciBhPXJbbi5zb3VyY2VdLHM9cltuLnRhcmdldF07aWYoMT09PXQpaVtvXS5wdXNoKHt4OmEueCx5OmEueX0pLGlbb10ucHVzaCh7eDouNSooYS54K3MueCkseTouNSooYS55K3MueSl9KSxpW29dLnB1c2goe3g6cy54LHk6cy55fSk7ZWxzZXt2YXIgdT0oaVtvXSYmaVtvXSE9PVtdP2UuZ2V0RWRnZUxlbmd0aChpW29dKTpJZCh7eDphLngseTphLnl9LHt4OnMueCx5OnMueX0pKS8odCsxKSxjPXUsZj1be3g6YS54LHk6YS55fV07aVtvXS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe2lmKDAhPT1lKXtmb3IodmFyIG49SWQodCxpW29dW2UtMV0pO24+Yzspe3ZhciByPWMvbixhPXt4Omlbb11bZS0xXS54LHk6aVtvXVtlLTFdLnl9O2EueCs9cioodC54LWlbb11bZS0xXS54KSxhLnkrPXIqKHQueS1pW29dW2UtMV0ueSksZi5wdXNoKGEpLG4tPWMsYz11fWMtPW59fSkpLGYucHVzaCh7eDpzLngseTpzLnl9KSxpW29dPWZ9fSkpLGl9LGUucHJvdG90eXBlLmdldEVkZ2VMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9MDtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbihuLHIpezAhPT1yJiYoZSs9SWQobix0W3ItMV0pKX0pKSxlfSxlLnByb3RvdHlwZS5nZXRFZGdlQnVuZGxlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LmdldChcImRhdGFcIikuZWRnZXN8fFtdLG49dC5nZXQoXCJidW5kbGVUaHJlc2hvbGRcIikscj10LmdldChcIm5vZGVJZE1hcFwiKSxpPXQuZ2V0KFwiZWRnZUJ1bmRsZXNcIik7cmV0dXJuIGl8fChpPVtdKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7aVtlXSYmdm9pZCAwIT09aVtlXXx8KGlbZV09W10pfSkpLGUuZm9yRWFjaCgoZnVuY3Rpb24obyxhKXt2YXIgcz1yW28uc291cmNlXSx1PXJbby50YXJnZXRdO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSxvKXtpZighKG88PWEpKXt2YXIgYz1yW2Uuc291cmNlXSxmPXJbZS50YXJnZXRdO3QuZ2V0QnVuZGxlU2NvcmUoe3NvdXJjZTpzLHRhcmdldDp1fSx7c291cmNlOmMsdGFyZ2V0OmZ9KT49biYmKGlbYV0ucHVzaChvKSxpW29dLnB1c2goYSkpfX0pKX0pKSxpfSxlLnByb3RvdHlwZS5nZXRCdW5kbGVTY29yZT1mdW5jdGlvbih0LGUpe3JldHVybiB0LnZ4PXQudGFyZ2V0LngtdC5zb3VyY2UueCx0LnZ5PXQudGFyZ2V0LnktdC5zb3VyY2UueSxlLnZ4PWUudGFyZ2V0LngtZS5zb3VyY2UueCxlLnZ5PWUudGFyZ2V0LnktZS5zb3VyY2UueSx0Lmxlbmd0aD1JZCh7eDp0LnNvdXJjZS54LHk6dC5zb3VyY2UueX0se3g6dC50YXJnZXQueCx5OnQudGFyZ2V0Lnl9KSxlLmxlbmd0aD1JZCh7eDplLnNvdXJjZS54LHk6ZS5zb3VyY2UueX0se3g6ZS50YXJnZXQueCx5OmUudGFyZ2V0Lnl9KSx0aGlzLmdldEFuZ2xlU2NvcmUodCxlKSp0aGlzLmdldFNjYWxlU2NvcmUodCxlKSp0aGlzLmdldFBvc2l0aW9uU2NvcmUodCxlKSp0aGlzLmdldFZpc2liaWxpdHlTY29yZSh0LGUpfSxlLnByb3RvdHlwZS5nZXRBbmdsZVNjb3JlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueCplLngrdC55KmUueX0oe3g6dC52eCx5OnQudnl9LHt4OmUudngseTplLnZ5fSkvKHQubGVuZ3RoKmUubGVuZ3RoKX0sZS5wcm90b3R5cGUuZ2V0U2NhbGVTY29yZT1mdW5jdGlvbih0LGUpe3ZhciBuPSh0Lmxlbmd0aCtlLmxlbmd0aCkvMjtyZXR1cm4gMi8obi9NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCkrTWF0aC5tYXgodC5sZW5ndGgsZS5sZW5ndGgpL24pfSxlLnByb3RvdHlwZS5nZXRQb3NpdGlvblNjb3JlPWZ1bmN0aW9uKHQsZSl7dmFyIG49KHQubGVuZ3RoK2UubGVuZ3RoKS8yO3JldHVybiBuLyhuK0lkKHt4Oih0LnNvdXJjZS54K3QudGFyZ2V0LngpLzIseToodC5zb3VyY2UueSt0LnRhcmdldC55KS8yfSx7eDooZS5zb3VyY2UueCtlLnRhcmdldC54KS8yLHk6KGUuc291cmNlLnkrZS50YXJnZXQueSkvMn0pKX0sZS5wcm90b3R5cGUuZ2V0VmlzaWJpbGl0eVNjb3JlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRFZGdlVmlzaWJpbGl0eSh0LGUpLHI9dGhpcy5nZXRFZGdlVmlzaWJpbGl0eShlLHQpO3JldHVybiBuPHI/bjpyfSxlLnByb3RvdHlwZS5nZXRFZGdlVmlzaWJpbGl0eT1mdW5jdGlvbih0LGUpe3ZhciBuPVBkKGUuc291cmNlLHQpLHI9UGQoZS50YXJnZXQsdCksaT17eDoobi54K3IueCkvMix5OihuLnkrci55KS8yfSxvPXt4Oih0LnNvdXJjZS54K3QudGFyZ2V0LngpLzIseToodC5zb3VyY2UueSt0LnRhcmdldC55KS8yfTtyZXR1cm4gTWF0aC5tYXgoMCwxLTIqSWQoaSxvKS9JZChuLHIpKX0sZS5wcm90b3R5cGUuZ2V0RWRnZUZvcmNlcz1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9dGhpcy5nZXQoXCJlZGdlUG9pbnRzXCIpLG89dGhpcy5nZXQoXCJLXCIpLyhJZCh0LnNvdXJjZSx0LnRhcmdldCkqKG4rMSkpLGE9W3t4OjAseTowfV0scz0xO3M8bjtzKyspe3ZhciB1PXt4OjAseTowfSxjPXRoaXMuZ2V0U3ByaW5nRm9yY2Uoe3ByZTppW2VdW3MtMV0sY3VyOmlbZV1bc10sbmV4dDppW2VdW3MrMV19LG8pLGY9dGhpcy5nZXRFbGVjdHJvc3RhdGljRm9yY2UocyxlKTt1Lng9ciooYy54K2YueCksdS55PXIqKGMueStmLnkpLGEucHVzaCh1KX1yZXR1cm4gYS5wdXNoKHt4OjAseTowfSksYX0sZS5wcm90b3R5cGUuZ2V0U3ByaW5nRm9yY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnByZS54K3QubmV4dC54LTIqdC5jdXIueCxyPXQucHJlLnkrdC5uZXh0LnktMip0LmN1ci55O3JldHVybnt4Om4qPWUseTpyKj1lfX0sZS5wcm90b3R5cGUuZ2V0RWxlY3Ryb3N0YXRpY0ZvcmNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXQoXCJlcHNcIikscj10aGlzLmdldChcImVkZ2VCdW5kbGVzXCIpLGk9dGhpcy5nZXQoXCJlZGdlUG9pbnRzXCIpLG89cltlXSxhPXt4OjAseTowfTtyZXR1cm4gby5mb3JFYWNoKChmdW5jdGlvbihyKXt2YXIgbz17eDppW3JdW3RdLngtaVtlXVt0XS54LHk6aVtyXVt0XS55LWlbZV1bdF0ueX07aWYoTWF0aC5hYnMoby54KT5ufHxNYXRoLmFicyhvLnkpPm4pe3ZhciBzPTEvSWQoaVtyXVt0XSxpW2VdW3RdKTthLngrPW8ueCpzLGEueSs9by55KnN9fSkpLGF9LGUucHJvdG90eXBlLmlzVGlja2luZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChcInRpY2tpbmdcIil9LGUucHJvdG90eXBlLmdldFNpbXVsYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJmb3JjZVNpbXVsYXRpb25cIil9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmdldChcInRpY2tpbmdcIikmJnRoaXMuZ2V0U2ltdWxhdGlvbigpLnN0b3AoKSx0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LGV9KHlkKSxEZD1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKGUsbil7cmV0dXJuKHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJih0W25dPWVbbl0pfSkoZSxuKX07cmV0dXJuIGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9ZX10KGUsbiksZS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooci5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHIpfX0oKSxOZD1mdW5jdGlvbigpe3JldHVybihOZD1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgaSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LFJkPXtzdHJva2U6XCIjMDAwXCIsc3Ryb2tlT3BhY2l0eTouOCxsaW5lV2lkdGg6MixmaWxsT3BhY2l0eTouMSxmaWxsOlwiI2NjY1wifSxMZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gRGQoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0Q2Zncz1mdW5jdGlvbigpe3JldHVybnt0cmlnZ2VyOlwibW91c2Vtb3ZlXCIsZDoxLjUscjozMDAsZGVsZWdhdGVTdHlsZTpPYmplY3QoaC5jKShSZCksc2hvd0xhYmVsOiExLG1heEQ6NSxtaW5EOjAsc2NhbGVSQnk6XCJ1bnNldFwiLHNjYWxlREJ5OlwidW5zZXRcIixzaG93RFBlcmNlbnQ6ITB9fSxlLnByb3RvdHlwZS5nZXRFdmVudHM9ZnVuY3Rpb24oKXt2YXIgdDtzd2l0Y2godGhpcy5nZXQoXCJ0cmlnZ2VyXCIpKXtjYXNlXCJjbGlja1wiOnQ9e2NsaWNrOlwibWFnbmlmeVwifTticmVhaztjYXNlXCJkcmFnXCI6dD17Y2xpY2s6XCJjcmVhdGVEZWxlZ2F0ZVwifTticmVhaztkZWZhdWx0OnQ9e21vdXNlbW92ZTpcIm1hZ25pZnlcIn19cmV0dXJuIHR9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcInJcIik7dGhpcy5zZXQoXCJjYWNoZWRNYWduaWZpZWRNb2RlbHNcIixbXSksdGhpcy5zZXQoXCJjYWNoZWRPcmlnaW5Qb3NpdGlvbnNcIix7fSksdGhpcy5zZXQoXCJyMlwiLHQqdCk7dmFyIGU9dGhpcy5nZXQoXCJkXCIpO3RoaXMuc2V0KFwibW9sZWN1bGFyUGFyYW1cIiwoZSsxKSp0KX0sZS5wcm90b3R5cGUuY3JlYXRlRGVsZWdhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMscj1uLmdldChcImRlbGVnYXRlXCIpO3ImJiFyLmRlc3Ryb3llZHx8KG4ubWFnbmlmeSh0KSwocj1uLmdldChcImRlbGVnYXRlXCIpKS5vbihcImRyYWdzdGFydFwiLChmdW5jdGlvbih0KXtuLnNldChcImRlbGVnYXRlQ2VudGVyRGlmZlwiLHt4OnIuYXR0cihcInhcIiktdC54LHk6ci5hdHRyKFwieVwiKS10Lnl9KX0pKSxyLm9uKFwiZHJhZ1wiLChmdW5jdGlvbih0KXtuLm1hZ25pZnkodCl9KSksXCJ3aGVlbFwiPT09dGhpcy5nZXQoXCJzY2FsZURCeVwiKSYmci5vbihcIm1vdXNld2hlZWxcIiwoZnVuY3Rpb24odCl7ZS5zY2FsZURCeVdoZWVsKHQpfSkpLFwid2hlZWxcIj09PXRoaXMuZ2V0KFwic2NhbGVSQnlcIikmJnIub24oXCJtb3VzZXdoZWVsXCIsKGZ1bmN0aW9uKHQpe24uc2NhbGVSQnlXaGVlbCh0KX0pKSl9LGUucHJvdG90eXBlLnNjYWxlUkJ5V2hlZWw9ZnVuY3Rpb24odCl7aWYodCYmdC5vcmlnaW5hbEV2ZW50KXt0LnByZXZlbnREZWZhdWx0JiZ0LnByZXZlbnREZWZhdWx0KCk7dmFyIGUsbj10aGlzLmdldChcImdyYXBoXCIpLHI9dGhpcy5nZXQoXCJkZWxlZ2F0ZVwiKSxpPShyP3t4OnIuYXR0cihcInhcIikseTpyLmF0dHIoXCJ5XCIpfTp2b2lkIDApfHxuLmdldFBvaW50QnlDbGllbnQodC5jbGllbnRYLHQuY2xpZW50WSk7ZT10Lm9yaWdpbmFsRXZlbnQud2hlZWxEZWx0YTwwPy45NToxLy45NTt2YXIgbz10aGlzLmdldChcIm1heFJcIiksYT10aGlzLmdldChcIm1pblJcIikscz10aGlzLmdldChcInJcIik7KHM+KG98fG4uZ2V0KFwiaGVpZ2h0XCIpKSYmZT4xfHxzPChhfHwuMDUqbi5nZXQoXCJoZWlnaHRcIikpJiZlPDEpJiYoZT0xKSxzKj1lLHRoaXMuc2V0KFwiclwiLHMpLHRoaXMuc2V0KFwicjJcIixzKnMpO3ZhciB1PXRoaXMuZ2V0KFwiZFwiKTt0aGlzLnNldChcIm1vbGVjdWxhclBhcmFtXCIsKHUrMSkqcyksdGhpcy5zZXQoXCJkZWxlZ2F0ZUNlbnRlckRpZmZcIix2b2lkIDApLHRoaXMubWFnbmlmeSh0LGkpfX0sZS5wcm90b3R5cGUuc2NhbGVSQnlEcmFnPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlLG49dGhpcy5nZXQoXCJkcmFnUHJlUG9zXCIpLHI9dGhpcy5nZXQoXCJncmFwaFwiKSxpPXIuZ2V0UG9pbnRCeUNsaWVudCh0LmNsaWVudFgsdC5jbGllbnRZKTtlPXQueC1uLng8MD8uOTU6MS8uOTU7dmFyIG89dGhpcy5nZXQoXCJtYXhSXCIpLGE9dGhpcy5nZXQoXCJtaW5SXCIpLHM9dGhpcy5nZXQoXCJyXCIpOyhzPihvfHxyLmdldChcImhlaWdodFwiKSkmJmU+MXx8czwoYXx8LjA1KnIuZ2V0KFwiaGVpZ2h0XCIpKSYmZTwxKSYmKGU9MSkscyo9ZSx0aGlzLnNldChcInJcIixzKSx0aGlzLnNldChcInIyXCIscypzKTt2YXIgdT10aGlzLmdldChcImRcIik7dGhpcy5zZXQoXCJtb2xlY3VsYXJQYXJhbVwiLCh1KzEpKnMpLHRoaXMubWFnbmlmeSh0LGkpLHRoaXMuc2V0KFwiZHJhZ1ByZVBvc1wiLHt4OnQueCx5OnQueX0pfX0sZS5wcm90b3R5cGUuc2NhbGVEQnlXaGVlbD1mdW5jdGlvbih0KXtpZih0fHx0Lm9yaWdpbmFsRXZlbnQpe3QucHJldmVudERlZmF1bHQmJnQucHJldmVudERlZmF1bHQoKTt2YXIgZT0wO2U9dC5vcmlnaW5hbEV2ZW50LndoZWVsRGVsdGE8MD8tLjE6LjE7dmFyIG49dGhpcy5nZXQoXCJkXCIpK2Uscj10aGlzLmdldChcIm1heERcIiksaT10aGlzLmdldChcIm1pbkRcIik7aWYobjxyJiZuPmkpe3RoaXMuc2V0KFwiZFwiLG4pO3ZhciBvPXRoaXMuZ2V0KFwiclwiKTt0aGlzLnNldChcIm1vbGVjdWxhclBhcmFtXCIsKG4rMSkqbyk7dmFyIGE9dGhpcy5nZXQoXCJkZWxlZ2F0ZVwiKSxzPWE/e3g6YS5hdHRyKFwieFwiKSx5OmEuYXR0cihcInlcIil9OnZvaWQgMDt0aGlzLnNldChcImRlbGVnYXRlQ2VudGVyRGlmZlwiLHZvaWQgMCksdGhpcy5tYWduaWZ5KHQscyl9fX0sZS5wcm90b3R5cGUuc2NhbGVEQnlEcmFnPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0KFwiZHJhZ1ByZVBvc1wiKSxuPXQueC1lLng+MD8uMTotLjEscj10aGlzLmdldChcImRcIikrbixpPXRoaXMuZ2V0KFwibWF4RFwiKSxvPXRoaXMuZ2V0KFwibWluRFwiKTtpZihyPGkmJnI+byl7dGhpcy5zZXQoXCJkXCIscik7dmFyIGE9dGhpcy5nZXQoXCJyXCIpO3RoaXMuc2V0KFwibW9sZWN1bGFyUGFyYW1cIiwocisxKSphKSx0aGlzLm1hZ25pZnkodCl9dGhpcy5zZXQoXCJkcmFnUHJlUG9zXCIse3g6dC54LHk6dC55fSl9LGUucHJvdG90eXBlLm1hZ25pZnk9ZnVuY3Rpb24odCxlKXt0aGlzLnJlc3RvcmVDYWNoZSgpO3ZhciBuPXRoaXMuZ2V0KFwiZ3JhcGhcIikscj10aGlzLmdldChcImNhY2hlZE1hZ25pZmllZE1vZGVsc1wiKSxpPXRoaXMuZ2V0KFwiY2FjaGVkT3JpZ2luUG9zaXRpb25zXCIpLG89dGhpcy5nZXQoXCJzaG93TGFiZWxcIiksYT10aGlzLmdldChcInJcIikscz10aGlzLmdldChcInIyXCIpLHU9dGhpcy5nZXQoXCJkXCIpLGM9dGhpcy5nZXQoXCJtb2xlY3VsYXJQYXJhbVwiKSxmPW4uZ2V0Tm9kZXMoKSxsPWYubGVuZ3RoLGg9ZT97eDplLngseTplLnl9Ont4OnQueCx5OnQueX07IXRoaXMuZ2V0KFwiZHJhZ2dpbmdcIil8fFwibW91c2Vtb3ZlXCIhPT10aGlzLmdldChcInRyaWdnZXJcIikmJlwiY2xpY2tcIiE9PXRoaXMuZ2V0KFwidHJpZ2dlclwiKXx8KGg9dGhpcy5nZXQoXCJjYWNoZUNlbnRlclwiKSk7dmFyIGQ9dGhpcy5nZXQoXCJkZWxlZ2F0ZUNlbnRlckRpZmZcIik7ZCYmKGgueCs9ZC54LGgueSs9ZC55KSx0aGlzLnVwZGF0ZURlbGVnYXRlKGgsYSk7Zm9yKHZhciBwPTA7cDxsO3ArKyl7dmFyIGc9ZltwXS5nZXRNb2RlbCgpLHY9Zy54LHk9Zy55O2lmKCFpc05hTih2KSYmIWlzTmFOKHkpKXt2YXIgbT0odi1oLngpKih2LWgueCkrKHktaC55KSooeS1oLnkpO2lmKCFpc05hTihtKSYmbTxzJiYwIT09bSl7dmFyIGI9TWF0aC5zcXJ0KG0pLHg9YypiLyh1KmIrYSksdz0odi1oLngpL2IsUz0oeS1oLnkpL2I7aWYoZy54PXcqeCtoLngsZy55PVMqeCtoLnksaVtnLmlkXXx8KGlbZy5pZF09e3g6dix5OnksdGV4dHM6W119KSxyLnB1c2goZyksbyYmMipiPGEpZm9yKHZhciBFPWZbcF0uZ2V0Q29udGFpbmVyKCkuZ2V0Q2hpbGRyZW4oKSxfPUUubGVuZ3RoLE89MDtPPF87TysrKXt2YXIgaz1FW09dO1widGV4dFwiPT09ay5nZXQoXCJ0eXBlXCIpJiYoaVtnLmlkXS50ZXh0cy5wdXNoKHt2aXNpYmxlOmsuZ2V0KFwidmlzaWJsZVwiKSxzaGFwZTprfSksay5zZXQoXCJ2aXNpYmxlXCIsITApKX19fX1uLnJlZnJlc2hQb3NpdGlvbnMoKX0sZS5wcm90b3R5cGUucmVzdG9yZUNhY2hlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZ2V0KFwiY2FjaGVkTWFnbmlmaWVkTW9kZWxzXCIpLGU9dGhpcy5nZXQoXCJjYWNoZWRPcmlnaW5Qb3NpdGlvbnNcIiksbj10Lmxlbmd0aCxyPTA7cjxuO3IrKyl7dmFyIGk9dFtyXSxvPWVbaS5pZF07aS54PW8ueCxpLnk9by55O2Zvcih2YXIgYT1vLnRleHRzLmxlbmd0aCxzPTA7czxhO3MrKyl7dmFyIHU9by50ZXh0c1tzXTt1LnNoYXBlLnNldChcInZpc2libGVcIix1LnZpc2libGUpfX10aGlzLnNldChcImNhY2hlZE1hZ25pZmllZE1vZGVsc1wiLFtdKSx0aGlzLnNldChcImNhY2hlZE9yaWdpblBvc2l0aW9uc1wiLHt9KX0sZS5wcm90b3R5cGUudXBkYXRlUGFyYW1zPWZ1bmN0aW9uKHQpe3ZhciBlPXQucixuPXQuZCxyPXQudHJpZ2dlcixpPXQubWluRCxvPXQubWF4RCxhPXQubWluUixzPXQubWF4Uix1PXQuc2NhbGVEQnksYz10LnNjYWxlUkJ5O2lzTmFOKHQucil8fCh0aGlzLnNldChcInJcIixlKSx0aGlzLnNldChcInIyXCIsZSplKSksaXNOYU4obil8fHRoaXMuc2V0KFwiZFwiLG4pLGlzTmFOKG8pfHx0aGlzLnNldChcIm1heERcIixvKSxpc05hTihpKXx8dGhpcy5zZXQoXCJtaW5EXCIsaSksaXNOYU4ocyl8fHRoaXMuc2V0KFwibWF4UlwiLHMpLGlzTmFOKGEpfHx0aGlzLnNldChcIm1pblJcIixhKTt2YXIgZixsPXRoaXMuZ2V0KFwiZFwiKSxoPXRoaXMuZ2V0KFwiclwiKTsodGhpcy5zZXQoXCJtb2xlY3VsYXJQYXJhbVwiLChsKzEpKmgpLFwibW91c2Vtb3ZlXCIhPT1yJiZcImNsaWNrXCIhPT1yJiZcImRyYWdcIiE9PXJ8fHRoaXMuc2V0KFwidHJpZ2dlclwiLHIpLFwiZHJhZ1wiPT09dXx8XCJ3aGVlbFwiPT09dXx8XCJ1bnNldFwiPT09dSkmJih0aGlzLnNldChcInNjYWxlREJ5XCIsdSksdGhpcy5nZXQoXCJkZWxlZ2F0ZVwiKS5yZW1vdmUoKSx0aGlzLmdldChcImRlbGVnYXRlXCIpLmRlc3Ryb3koKSwoZj10aGlzLmdldChcImRQZXJjZW50VGV4dFwiKSkmJihmLnJlbW92ZSgpLGYuZGVzdHJveSgpKSk7XCJkcmFnXCIhPT1jJiZcIndoZWVsXCIhPT1jJiZcInVuc2V0XCIhPT1jfHwodGhpcy5zZXQoXCJzY2FsZVJCeVwiLGMpLHRoaXMuZ2V0KFwiZGVsZWdhdGVcIikucmVtb3ZlKCksdGhpcy5nZXQoXCJkZWxlZ2F0ZVwiKS5kZXN0cm95KCksKGY9dGhpcy5nZXQoXCJkUGVyY2VudFRleHRcIikpJiYoZi5yZW1vdmUoKSxmLmRlc3Ryb3koKSkpfSxlLnByb3RvdHlwZS51cGRhdGVEZWxlZ2F0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLGk9ci5nZXQoXCJncmFwaFwiKSxvPXIuZ2V0KFwiZGVsZWdhdGVcIik7aWYoIW98fG8uZGVzdHJveWVkKXt2YXIgYT1pLmdldChcImdyb3VwXCIpLHM9ci5nZXQoXCJkZWxlZ2F0ZVN0eWxlXCIpfHxSZDtvPWEuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6TmQoe3I6ZS8xLjUseDp0LngseTp0Lnl9LHMpLG5hbWU6XCJsZW5zLXNoYXBlXCIsZHJhZ2dhYmxlOiEwfSksXCJkcmFnXCIhPT10aGlzLmdldChcInRyaWdnZXJcIikmJihcIndoZWVsXCI9PT10aGlzLmdldChcInNjYWxlUkJ5XCIpP28ub24oXCJtb3VzZXdoZWVsXCIsKGZ1bmN0aW9uKHQpe3Iuc2NhbGVSQnlXaGVlbCh0KX0pKTpcImRyYWdcIj09PXRoaXMuZ2V0KFwic2NhbGVSQnlcIikmJihvLm9uKFwiZHJhZ3N0YXJ0XCIsKGZ1bmN0aW9uKHQpe3Iuc2V0KFwiZHJhZ2dpbmdcIiwhMCksci5zZXQoXCJjYWNoZUNlbnRlclwiLHt4OnQueCx5OnQueX0pLHIuc2V0KFwiZHJhZ1ByZVBvc1wiLHt4OnQueCx5OnQueX0pfSkpLG8ub24oXCJkcmFnXCIsKGZ1bmN0aW9uKHQpe3Iuc2NhbGVSQnlEcmFnKHQpfSkpLG8ub24oXCJkcmFnZW5kXCIsKGZ1bmN0aW9uKHQpe3Iuc2V0KFwiZHJhZ2dpbmdcIiwhMSl9KSkpLFwid2hlZWxcIj09PXRoaXMuZ2V0KFwic2NhbGVEQnlcIik/by5vbihcIm1vdXNld2hlZWxcIiwoZnVuY3Rpb24odCl7bi5zY2FsZURCeVdoZWVsKHQpfSkpOlwiZHJhZ1wiPT09dGhpcy5nZXQoXCJzY2FsZURCeVwiKSYmKG8ub24oXCJkcmFnc3RhcnRcIiwoZnVuY3Rpb24odCl7ci5zZXQoXCJkcmFnZ2luZ1wiLCEwKSxyLnNldChcImNhY2hlQ2VudGVyXCIse3g6dC54LHk6dC55fSksci5zZXQoXCJkcmFnUHJlUG9zXCIse3g6dC54LHk6dC55fSl9KSksby5vbihcImRyYWdcIiwoZnVuY3Rpb24odCl7bi5zY2FsZURCeURyYWcodCl9KSksby5vbihcImRyYWdlbmRcIiwoZnVuY3Rpb24odCl7ci5zZXQoXCJkcmFnZ2luZ1wiLCExKX0pKSkpfWVsc2Ugby5hdHRyKHt4OnQueCx5OnQueSxyOmUvMS41fSk7aWYoci5nZXQoXCJzaG93RFBlcmNlbnRcIikpe3ZhciB1PU1hdGgucm91bmQoKHIuZ2V0KFwiZFwiKS1yLmdldChcIm1pbkRcIikpLyhyLmdldChcIm1heERcIiktci5nZXQoXCJtaW5EXCIpKSoxMDApLGM9ci5nZXQoXCJkUGVyY2VudFRleHRcIiksZj10LnkrZS8xLjUrMTY7aWYoIWN8fGMuZGVzdHJveWVkKWM9aS5nZXQoXCJncm91cFwiKS5hZGRTaGFwZShcInRleHRcIix7YXR0cnM6e3RleHQ6dStcIiVcIix4OnQueCx5OmYsZmlsbDpcIiNhYWFcIixzdHJva2U6XCIjZmZmXCIsbGluZVdpZHRoOjEsZm9udFNpemU6MTJ9fSksci5zZXQoXCJkUGVyY2VudFRleHRcIixjKTtlbHNlIGMuYXR0cih7dGV4dDp1K1wiJVwiLHg6dC54LHk6Zn0pfXIuc2V0KFwiZGVsZWdhdGVcIixvKX0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImdyYXBoXCIpO3RoaXMucmVzdG9yZUNhY2hlKCksdC5yZWZyZXNoUG9zaXRpb25zKCk7dmFyIGU9dGhpcy5nZXQoXCJkZWxlZ2F0ZVwiKTtlJiYhZS5kZXN0cm95ZWQmJihlLnJlbW92ZSgpLGUuZGVzdHJveSgpKTt2YXIgbj10aGlzLmdldChcImRQZXJjZW50VGV4dFwiKTtuJiYhbi5kZXN0cm95ZWQmJihuLnJlbW92ZSgpLG4uZGVzdHJveSgpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuY2xlYXIoKX0sZX0oeWQpLEJkPWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4odD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmKHRbbl09ZVtuXSl9KShlLG4pfTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXQoZSxuKSxlLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcil9fSgpO1NkKCkoXCJcXG4gIC5nNi1jb21wb25lbnQtdG9vbGJhciB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xcbiAgICBwYWRkaW5nOiA2cHg7XFxuICAgIGxlZnQ6IDBweDtcXG4gICAgdG9wOiAwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2UyZTJlMjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBmb250LXNpemU6IDEycHg7XFxuICAgIGNvbG9yOiAjNTQ1NDU0O1xcbiAgICBtYXJnaW46IDA7XFxuICB9XFxuICAuZzYtY29tcG9uZW50LXRvb2xiYXIgbGkge1xcbiAgICBmbG9hdDogbGVmdDtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICB3aWR0aDogMzVweDtcXG4gICAgaGVpZ2h0OiAyNHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuXFx0XFx0bGlzdC1zdHlsZS10eXBlOm5vbmU7XFxuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XFxuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XFxuICB9XFxuICAuZzYtY29tcG9uZW50LXRvb2xiYXIgbGkgLmljb24ge1xcbiAgICBvcGFjaXR5OiAwLjc7XFxuICB9XFxuICAuZzYtY29tcG9uZW50LXRvb2xiYXIgbGkgLmljb246aG92ZXIge1xcbiAgICBvcGFjaXR5OiAxO1xcbiAgfVxcblwiKTt2YXIgR2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIEJkKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZ3M9ZnVuY3Rpb24oKXtyZXR1cm57aGFuZGxlQ2xpY2s6dm9pZCAwLGdldENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuJ1xcbiAgICAgICAgICA8dWwgY2xhc3M9XFwnZzYtY29tcG9uZW50LXRvb2xiYXJcXCc+XFxuICAgICAgICAgICAgPGxpIGNvZGU9XFwncmVkb1xcJz5cXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiPlxcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTI1NiA2ODIuNjY2NjY3YzAtMTAyLjc0MTMzMyA2Ni43MzA2NjctMjEzLjMzMzMzMyAyMTMuMzMzMzMzLTIxMy4zMzMzMzQgMTA3LjAwOCAwIDE5MC43NjI2NjcgNTYuNTc2IDIzMC41NzA2NjcgMTI1LjM1NDY2N0w2MTEuOTY4IDY4Mi42NjY2NjdIODUzLjMzMzMzM3YtMjQxLjM2NTMzNGwtOTEuNTYyNjY2IDkxLjU2MjY2N0M3MDQuNzY4IDQ0OC40NjkzMzMgNjAxLjEzMDY2NyAzODQgNDY5LjMzMzMzMyAzODRjLTE5Ni4wOTYgMC0yOTguNjY2NjY3IDE1MC4yMjkzMzMtMjk4LjY2NjY2NiAyOTguNjY2NjY3aDg1LjMzMzMzM3pcIiBmaWxsPVwiXCIgcC1pZD1cIjIwNDFcIj48L3BhdGg+XFxuICAgICAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgIDxsaSBjb2RlPVxcJ3VuZG9cXCc+XFxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIj5cXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNzAuNjY2NjY3IDY4Mi42NjY2NjdoMjQxLjM2NTMzM2wtODcuOTM2LTg3Ljk3ODY2N0MzNjMuOTA0IDUyNS45MDkzMzMgNDQ3LjY1ODY2NyA0NjkuMzMzMzMzIDU1NC42NjY2NjcgNDY5LjMzMzMzM2MxNDYuNjAyNjY3IDAgMjEzLjMzMzMzMyAxMTAuNTkyIDIxMy4zMzMzMzMgMjEzLjMzMzMzNGg4NS4zMzMzMzNjMC0xNDguNDM3MzMzLTEwMi41NzA2NjctMjk4LjY2NjY2Ny0yOTguNjY2NjY2LTI5OC42NjY2NjctMTMxLjc5NzMzMyAwLTIzNS4zOTIgNjQuNDY5MzMzLTI5Mi40OCAxNDguODIxMzMzTDE3MC42NjY2NjcgNDQxLjMwMTMzM1Y2ODIuNjY2NjY3elwiIGZpbGw9XCJcIiBwLWlkPVwiMjc2NFwiPjwvcGF0aD5cXG4gICAgICAgICAgICAgIDwvc3ZnPlxcbiAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgPGxpICBjb2RlPVxcJ3pvb21PdXRcXCc+XFxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIj5cXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk02NTguNDMyIDQyOC43MzZhMzMuMjE2IDMzLjIxNiAwIDAgMS0zMy4xNTIgMzMuMTUySDUyNS44MjR2OTkuNDU2YTMzLjIxNiAzMy4yMTYgMCAwIDEtNjYuMzA0IDBWNDYxLjg4OEgzNjAuMDY0YTMzLjE1MiAzMy4xNTIgMCAwIDEgMC02Ni4zMDRINDU5LjUyVjI5Ni4xMjhhMzMuMTUyIDMzLjE1MiAwIDAgMSA2Ni4zMDQgMFYzOTUuNTJINjI1LjI4YzE4LjI0IDAgMzMuMTUyIDE0Ljg0OCAzMy4xNTIgMzMuMTUyeiBtMjk5Ljc3NiA1MjEuNzkyYTQzLjMyOCA0My4zMjggMCAwIDEtNjAuODY0LTYuOTEybC0xODkuMjQ4LTIyMC45OTJhMzYyLjM2OCAzNjIuMzY4IDAgMCAxLTIxNS4zNiA3MC44NDggMzY0LjggMzY0LjggMCAxIDEgMzY0LjgtMzY0LjczNiAzNjMuMDcyIDM2My4wNzIgMCAwIDEtODYuOTEyIDIzNS45NjhsMTkyLjM4NCAyMjQuNjRhNDMuMzkyIDQzLjM5MiAwIDAgMS00LjggNjEuMTg0eiBtLTQ2NS41MzYtMjIzLjM2YTI5OC44MTYgMjk4LjgxNiAwIDAgMCAyOTguNDMyLTI5OC40MzIgMjk4LjgxNiAyOTguODE2IDAgMCAwLTI5OC40MzItMjk4LjQzMkEyOTguODE2IDI5OC44MTYgMCAwIDAgMTk0LjI0IDQyOC44YTI5OC44MTYgMjk4LjgxNiAwIDAgMCAyOTguNDMyIDI5OC40MzJ6XCI+PC9wYXRoPlxcbiAgICAgICAgICAgICAgPC9zdmc+XFxuICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICA8bGkgY29kZT1cXCd6b29tSW5cXCc+XFxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIj5cXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk02MzkuOTM2IDQxNmEzMiAzMiAwIDAgMS0zMiAzMmgtMjU2YTMyIDMyIDAgMCAxIDAtNjRoMjU2YTMyIDMyIDAgMCAxIDMyIDMyeiBtMjg5LjI4IDUwMy41NTJhNDEuNzkyIDQxLjc5MiAwIDAgMS01OC43NTItNi42NTZsLTE4Mi42NTYtMjEzLjI0OEEzNDkuNzYgMzQ5Ljc2IDAgMCAxIDQ4MCA3NjggMzUyIDM1MiAwIDEgMSA4MzIgNDE2YTM1MC40IDM1MC40IDAgMCAxLTgzLjg0IDIyNy43MTJsMTg1LjY2NCAyMTYuNzY4YTQxLjg1NiA0MS44NTYgMCAwIDEtNC42MDggNTkuMDcyek00NzkuOTM2IDcwNGMxNTguNzg0IDAgMjg4LTEyOS4yMTYgMjg4LTI4OFM2MzguNzIgMTI4IDQ3OS45MzYgMTI4YTI4OC4zMiAyODguMzIgMCAwIDAtMjg4IDI4OGMwIDE1OC43ODQgMTI5LjIxNiAyODggMjg4IDI4OHpcIiBwLWlkPVwiMzg1M1wiPjwvcGF0aD5cXG4gICAgICAgICAgICAgIDwvc3ZnPlxcbiAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgPGxpIGNvZGU9XFwncmVhbFpvb21cXCc+XFxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjRcIj5cXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zODQgMzIwdjM4NEgzMjBWMzIwaDY0eiBtMjU2IDB2Mzg0SDU3NlYzMjBoNjR6TTUxMiA1NzZ2NjRINDQ4VjU3Nmg2NHogbTAtMTkydjY0SDQ0OFYzODRoNjR6IG0zNTUuOTY4IDU3Nkg5Mi4wMzJBMjguMTYgMjguMTYgMCAwIDEgNjQgOTMxLjk2OFYyOC4wMzJDNjQgMTIuNjA4IDc2LjYwOCAwIDk1LjE2OCAwaDYxMC4zNjhMODk2IDE5MnY3MzkuOTY4YTI4LjE2IDI4LjE2IDAgMCAxLTI4LjAzMiAyOC4wMzJ6TTcwNCA2NHYxMjhoMTI4bC0xMjgtMTI4eiBtMTI4IDE5MmgtMTkwLjQ2NFY2NEgxMjh2ODMyaDcwNFYyNTZ6XCI+PC9wYXRoPlxcbiAgICAgICAgICAgICAgPC9zdmc+XFxuICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICA8bGkgY29kZT1cXCdhdXRvWm9vbVxcJz5cXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyNFwiPlxcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTY4NC4yODggMzA1LjI4bDAuMTI4LTAuNjQtMC4xMjgtMC42NFY5OS43MTJjMC0xOS44NCAxNS41NTItMzUuOTA0IDM0LjQ5Ni0zNS43MTJhMzUuMDcyIDM1LjA3MiAwIDAgMSAzNC41NiAzNS43NzZ2MTcxLjAwOGgxNzAuOTQ0YzE5LjY0OCAwIDM1Ljg0IDE1LjQ4OCAzNS43MTIgMzQuNDMyYTM1LjA3MiAzNS4wNzIgMCAwIDEtMzUuODQgMzQuNDk2aC0yMDQuMTZsLTAuNjQtMC4xMjhhMzIuNzY4IDMyLjc2OCAwIDAgMS0yMC44NjQtNy41NTJjLTEuMzQ0LTEuMDI0LTIuODE2LTEuNjY0LTMuOTY4LTIuODE2LTAuMzg0LTAuMzItMC41MTItMC43NjgtMC44MzItMS4wODhhMzMuNDcyIDMzLjQ3MiAwIDAgMS05LjQwOC0yMi44NDh6TTMwNS4yOCA2NGEzNS4wNzIgMzUuMDcyIDAgMCAwLTM0LjU2IDM1Ljc3NnYxNzEuMDA4SDk5Ljc3NkEzNS4wNzIgMzUuMDcyIDAgMCAwIDY0IDMwNS4yMTZjMCAxOC45NDQgMTUuODcyIDM0LjQ5NiAzNS44NCAzNC40OTZoMjA0LjE2bDAuNjQtMC4xMjhhMzIuODk2IDMyLjg5NiAwIDAgMCAyMC44NjQtNy41NTJjMS4zNDQtMS4wMjQgMi44MTYtMS42NjQgMy45MDQtMi44MTYgMC4zODQtMC4zMiAwLjUxMi0wLjc2OCAwLjc2OC0xLjA4OGEzMy4wMjQgMzMuMDI0IDAgMCAwIDkuNTM2LTIyLjg0OGwtMC4xMjgtMC42NCAwLjEyOC0wLjcwNFY5OS43MTJBMzUuMDA4IDM1LjAwOCAwIDAgMCAzMDUuMjE2IDY0eiBtNjE4Ljk0NCA2MjAuMjg4aC0yMDQuMTZsLTAuNjQgMC4xMjgtMC41MTItMC4xMjhjLTcuODA4IDAtMTQuNzIgMy4yLTIwLjQ4IDcuNjgtMS4yOCAxLjAyNC0yLjc1MiAxLjY2NC0zLjg0IDIuNzUyLTAuMzg0IDAuMzItMC41MTIgMC43NjgtMC44MzIgMS4wODhhMzMuNjY0IDMzLjY2NCAwIDAgMC05LjQwOCAyMi45MTJsMC4xMjggMC42NC0wLjEyOCAwLjcwNHYyMDQuMjg4YzAgMTkuNzEyIDE1LjU1MiAzNS45MDQgMzQuNDk2IDM1LjcxMmEzNS4wNzIgMzUuMDcyIDAgMCAwIDM0LjU2LTM1Ljc3NlY3NTMuMjhoMTcwLjk0NGMxOS42NDggMCAzNS44NC0xNS40ODggMzUuNzEyLTM0LjQzMmEzNS4wNzIgMzUuMDcyIDAgMCAwLTM1Ljg0LTM0LjQ5NnogbS01OTMuOTIgMTEuNTJjLTAuMjU2LTAuMzItMC4zODQtMC43NjgtMC43NjgtMS4wODgtMS4wODgtMS4wODgtMi41Ni0xLjcyOC0zLjg0LTIuNjg4YTMzLjA4OCAzMy4wODggMCAwIDAtMjAuNDgtNy42OGwtMC41MTIgMC4wNjQtMC42NC0wLjEyOEg5OS44NGEzNS4wNzIgMzUuMDcyIDAgMCAwLTM1Ljg0IDM0LjQ5NiAzNS4wNzIgMzUuMDcyIDAgMCAwIDM1LjcxMiAzNC40MzJIMjcwLjcydjE3MS4wMDhjMCAxOS44NCAxNS41NTIgMzUuODQgMzQuNTYgMzUuNzc2YTM1LjAwOCAzNS4wMDggMCAwIDAgMzQuNDMyLTM1LjcxMlY3MjBsLTAuMTI4LTAuNjQgMC4xMjgtMC43MDRhMzMuMzQ0IDMzLjM0NCAwIDAgMC05LjQ3Mi0yMi44NDh6TTUxMiAzNzQuMTQ0YTEzNy45MiAxMzcuOTIgMCAxIDAgMC4xMjggMjc1Ljg0QTEzNy45MiAxMzcuOTIgMCAwIDAgNTEyIDM3NC4wOHpcIj48L3BhdGg+XFxuICAgICAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICA8L3VsPlxcbiAgICAgICAgJ30sem9vbVNlbnNpdGl2aXR5OjJ9fSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuZ2V0KFwiZ3JhcGhcIiksbj10aGlzLmdldChcImdldENvbnRlbnRcIikoZSkscj1uO09iamVjdChoLngpKG4pJiYocj1ndChuKSk7dmFyIGk9dGhpcy5nZXQoXCJjbGFzc05hbWVcIik7ci5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLGl8fFwiZzYtY29tcG9uZW50LXRvb2xiYXJcIik7dmFyIG89dGhpcy5nZXQoXCJjb250YWluZXJcIik7b3x8KG89dGhpcy5nZXQoXCJncmFwaFwiKS5nZXQoXCJjb250YWluZXJcIikpLE9iamVjdChoLngpKG8pJiYobz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChvKSksby5hcHBlbmRDaGlsZChyKSx0aGlzLnNldChcInRvb2xCYXJcIixyKTt2YXIgYT10aGlzLmdldChcImhhbmRsZUNsaWNrXCIpO3IuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsKGZ1bmN0aW9uKG4pe3ZhciByPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybltdO2lmKHQuY29tcG9zZWRQYXRoKXJldHVybiB0LmNvbXBvc2VkUGF0aCgpO2Zvcih2YXIgZT1bXSxuPXQudGFyZ2V0O247KXtpZihlLnB1c2gobiksXCJIVE1MXCI9PT1uLnRhZ05hbWUpcmV0dXJuIGUucHVzaChkb2N1bWVudCx3aW5kb3cpLGU7bj1uLnBhcmVudEVsZW1lbnR9cmV0dXJuIGV9KG4pLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuXCJMSVwiPT09dC5ub2RlTmFtZX0pKTtpZigwIT09ci5sZW5ndGgpe3ZhciBpPXJbMF0uZ2V0QXR0cmlidXRlKFwiY29kZVwiKTtpJiYoYT9hKGksZSk6dC5oYW5kbGVEZWZhdWx0T3BlcmF0b3IoaSxlKSl9fSkpO3ZhciBzPXRoaXMuZ2V0KFwicG9zaXRpb25cIik7cyYmdnQocix7dG9wOnMueStcInB4XCIsbGVmdDpzLngrXCJweFwifSksdGhpcy5iaW5kVW5kb1JlZG8oKX0sZS5wcm90b3R5cGUuYmluZFVuZG9SZWRvPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJncmFwaFwiKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5nNi1jb21wb25lbnQtdG9vbGJhciBsaVtjb2RlPVwidW5kb1wiXScpLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmc2LWNvbXBvbmVudC10b29sYmFyIGxpW2NvZGU9XCJ1bmRvXCJdIHN2ZycpLHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmc2LWNvbXBvbmVudC10b29sYmFyIGxpW2NvZGU9XCJyZWRvXCJdJyksaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZzYtY29tcG9uZW50LXRvb2xiYXIgbGlbY29kZT1cInJlZG9cIl0gc3ZnJyk7ZSYmbiYmciYmaSYmdC5vbihcInN0YWNrY2hhbmdlXCIsKGZ1bmN0aW9uKHQpe3ZhciBvPXQudW5kb1N0YWNrLGE9dC5yZWRvU3RhY2sscz1vLmxlbmd0aCx1PWEubGVuZ3RoOzE9PT1zPyhlLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsXCJjdXJzb3I6IG5vdC1hbGxvd2VkXCIpLG4uc2V0QXR0cmlidXRlKFwic3R5bGVcIixcIm9wYWNpdHk6IDAuNFwiKSk6KGUucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIiksbi5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKSksMD09PXU/KHIuc2V0QXR0cmlidXRlKFwic3R5bGVcIixcImN1cnNvcjogbm90LWFsbG93ZWRcIiksaS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLFwib3BhY2l0eTogMC40XCIpKTooci5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKSxpLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpKX0pKX0sZS5wcm90b3R5cGUudW5kbz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwiZ3JhcGhcIiksZT10LmdldFVuZG9TdGFjaygpO2lmKGUmJjAhPT1lLmxlbmd0aCl7dmFyIG49ZS5wb3AoKTtpZihuKXt2YXIgcj1uLmFjdGlvbjt0LnB1c2hTdGFjayhyLE9iamVjdChoLmMpKG4uZGF0YSksXCJyZWRvXCIpO3ZhciBpPW4uZGF0YS5iZWZvcmU7aWYoXCJhZGRcIj09PXImJihpPW4uZGF0YS5hZnRlciksIWkpcmV0dXJuO3N3aXRjaChyKXtjYXNlXCJ2aXNpYmxlXCI6T2JqZWN0LmtleXMoaSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49aVtlXTtuJiZuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZmluZEJ5SWQoZS5pZCk7ZS52aXNpYmxlP3Quc2hvd0l0ZW0obiwhMSk6dC5oaWRlSXRlbShuLCExKX0pKX0pKTticmVhaztjYXNlXCJyZW5kZXJcIjpjYXNlXCJ1cGRhdGVcIjpPYmplY3Qua2V5cyhpKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1pW2VdO24mJm4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC51cGRhdGVJdGVtKGUuaWQsZSwhMSl9KSl9KSk7YnJlYWs7Y2FzZVwiY2hhbmdlZGF0YVwiOnQuY2hhbmdlRGF0YShpLCExKTticmVhaztjYXNlXCJkZWxldGVcIjpPYmplY3Qua2V5cyhpKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1pW2VdO24mJm4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5pdGVtVHlwZTtkZWxldGUgZS5pdGVtVHlwZSx0LmFkZEl0ZW0obixlLCExKX0pKX0pKTticmVhaztjYXNlXCJhZGRcIjpPYmplY3Qua2V5cyhpKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1pW2VdO24mJm4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5yZW1vdmVJdGVtKGUuaWQsITEpfSkpfSkpO2JyZWFrO2Nhc2VcInVwZGF0ZUNvbWJvVHJlZVwiOk9iamVjdC5rZXlzKGkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWlbZV07biYmbi5mb3JFYWNoKChmdW5jdGlvbihlKXt0LnVwZGF0ZUNvbWJvVHJlZShlLmlkLGUucGFyZW50SWQsITEpfSkpfSkpfX19fSxlLnByb3RvdHlwZS5yZWRvPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJncmFwaFwiKSxlPXQuZ2V0UmVkb1N0YWNrKCk7aWYoZSYmMCE9PWUubGVuZ3RoKXt2YXIgbj1lLnBvcCgpO2lmKG4pe3ZhciByPW4uYWN0aW9uLGk9bi5kYXRhLmFmdGVyO2lmKHQucHVzaFN0YWNrKHIsT2JqZWN0KGguYykobi5kYXRhKSksXCJkZWxldGVcIj09PXImJihpPW4uZGF0YS5iZWZvcmUpLCFpKXJldHVybjtzd2l0Y2gocil7Y2FzZVwidmlzaWJsZVwiOk9iamVjdC5rZXlzKGkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWlbZV07biYmbi5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj10LmZpbmRCeUlkKGUuaWQpO2UudmlzaWJsZT90LnNob3dJdGVtKG4sITEpOnQuaGlkZUl0ZW0obiwhMSl9KSl9KSk7YnJlYWs7Y2FzZVwicmVuZGVyXCI6Y2FzZVwidXBkYXRlXCI6T2JqZWN0LmtleXMoaSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49aVtlXTtuJiZuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QudXBkYXRlSXRlbShlLmlkLGUsITEpfSkpfSkpO2JyZWFrO2Nhc2VcImNoYW5nZWRhdGFcIjp0LmNoYW5nZURhdGEoaSwhMSk7YnJlYWs7Y2FzZVwiZGVsZXRlXCI6aS5lZGdlcyYmaS5lZGdlcy5mb3JFYWNoKChmdW5jdGlvbihlKXt0LnJlbW92ZUl0ZW0oZS5pZCwhMSl9KSksaS5ub2RlcyYmaS5ub2Rlcy5mb3JFYWNoKChmdW5jdGlvbihlKXt0LnJlbW92ZUl0ZW0oZS5pZCwhMSl9KSksaS5jb21ib3MmJmkuY29tYm9zLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QucmVtb3ZlSXRlbShlLmlkLCExKX0pKTticmVhaztjYXNlXCJhZGRcIjpPYmplY3Qua2V5cyhpKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1pW2VdO24mJm4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5pdGVtVHlwZTtkZWxldGUgZS5pdGVtVHlwZSx0LmFkZEl0ZW0obixlLCExKX0pKX0pKTticmVhaztjYXNlXCJ1cGRhdGVDb21ib1RyZWVcIjpPYmplY3Qua2V5cyhpKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1pW2VdO24mJm4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC51cGRhdGVDb21ib1RyZWUoZS5pZCxlLnBhcmVudElkLCExKX0pKX0pKX19fX0sZS5wcm90b3R5cGUuaGFuZGxlRGVmYXVsdE9wZXJhdG9yPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5nZXRab29tKCk7c3dpdGNoKHQpe2Nhc2VcInJlZG9cIjp0aGlzLnJlZG8oKTticmVhaztjYXNlXCJ1bmRvXCI6dGhpcy51bmRvKCk7YnJlYWs7Y2FzZVwiem9vbU91dFwiOnZhciByPTEvKDEtLjA1KnRoaXMuZ2V0KFwiem9vbVNlbnNpdGl2aXR5XCIpKTtpZihyKm4+KHRoaXMuZ2V0KFwibWF4Wm9vbVwiKXx8ZS5nZXQoXCJtYXhab29tXCIpKSlyZXR1cm47ZS56b29tVG8obipyKTticmVhaztjYXNlXCJ6b29tSW5cIjp2YXIgaT0xLS4wNSp0aGlzLmdldChcInpvb21TZW5zaXRpdml0eVwiKTtpZihpKm48KHRoaXMuZ2V0KFwibWluWm9vbVwiKXx8ZS5nZXQoXCJtaW5ab29tXCIpKSlyZXR1cm47ZS56b29tVG8obippKTticmVhaztjYXNlXCJyZWFsWm9vbVwiOmUuem9vbVRvKDEpO2JyZWFrO2Nhc2VcImF1dG9ab29tXCI6ZS5maXRWaWV3KFsyMCwyMF0pfX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KFwidG9vbEJhclwiKTtpZih0KXt2YXIgZT10aGlzLmdldChcImNvbnRhaW5lclwiKTtlfHwoZT10aGlzLmdldChcImdyYXBoXCIpLmdldChcImNvbnRhaW5lclwiKSksT2JqZWN0KGgueCkoZSkmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpKSxlLnJlbW92ZUNoaWxkKHQpfXZhciBuPXRoaXMuZ2V0KFwiaGFuZGxlQ2xpY2tcIik7biYmdC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIixuKX0sZX0oeWQpLEZkPWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4odD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmKHRbbl09ZVtuXSl9KShlLG4pfTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXQoZSxuKSxlLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcil9fSgpO1NkKCkoXCJcXG4gIC5nNi1jb21wb25lbnQtdG9vbHRpcCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMmUyZTI7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgZm9udC1zaXplOiAxMnB4O1xcbiAgICBjb2xvcjogIzU0NTQ1NDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbiAgICBwYWRkaW5nOiAxMHB4IDhweDtcXG4gICAgYm94LXNoYWRvdzogcmdiKDE3NCwgMTc0LCAxNzQpIDBweCAwcHggMTBweDtcXG4gIH1cXG4gIC50b29sdGlwLXR5cGUge1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICB9XFxuICAudG9vbHRpcC1pZCB7XFxuICAgIGNvbG9yOiAjNTMxZGFiO1xcbiAgfVxcblwiKTt2YXIgVWQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIEZkKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZ3M9ZnVuY3Rpb24oKXtyZXR1cm57b2Zmc2V0WDo2LG9mZnNldFk6NixnZXRDb250ZW50OmZ1bmN0aW9uKHQpe3JldHVyblwiXFxuICAgICAgICAgIDxoNCBjbGFzcz0ndG9vbHRpcC10eXBlJz7Dp8KxwrvDpcW+4oC5w6/CvMWhXCIrdC5pdGVtLmdldFR5cGUoKStcIjwvaDQ+XFxuICAgICAgICAgIDxzcGFuIGNsYXNzPSd0b29sdGlwLWlkJz5JRMOvwrzFoVwiK3QuaXRlbS5nZXRJRCgpK1wiPC9zcGFuPlxcbiAgICAgICAgXCJ9LHNob3VsZEJlZ2luOmZ1bmN0aW9uKHQpe3JldHVybiEwfSxpdGVtVHlwZXM6W1wibm9kZVwiLFwiZWRnZVwiLFwiY29tYm9cIl19fSxlLnByb3RvdHlwZS5nZXRFdmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57XCJub2RlOm1vdXNlZW50ZXJcIjpcIm9uTW91c2VFbnRlclwiLFwibm9kZTptb3VzZWxlYXZlXCI6XCJvbk1vdXNlTGVhdmVcIixcIm5vZGU6bW91c2Vtb3ZlXCI6XCJvbk1vdXNlTW92ZVwiLFwiZWRnZTptb3VzZWVudGVyXCI6XCJvbk1vdXNlRW50ZXJcIixcImVkZ2U6bW91c2VsZWF2ZVwiOlwib25Nb3VzZUxlYXZlXCIsXCJlZGdlOm1vdXNlbW92ZVwiOlwib25Nb3VzZU1vdmVcIixcImNvbWJvOm1vdXNlZW50ZXJcIjpcIm9uTW91c2VFbnRlclwiLFwiY29tYm86bW91c2VsZWF2ZVwiOlwib25Nb3VzZUxlYXZlXCIsXCJjb21ibzptb3VzZW1vdmVcIjpcIm9uTW91c2VNb3ZlXCIsYWZ0ZXJyZW1vdmVpdGVtOlwib25Nb3VzZUxlYXZlXCIsY29udGV4dG1lbnU6XCJvbk1vdXNlTGVhdmVcIixcIm5vZGU6ZHJhZ1wiOlwib25Nb3VzZUxlYXZlXCJ9fSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9Z3QoXCI8ZGl2IGNsYXNzPVwiKyh0aGlzLmdldChcImNsYXNzTmFtZVwiKXx8XCJnNi1jb21wb25lbnQtdG9vbHRpcFwiKStcIj48L2Rpdj5cIiksZT10aGlzLmdldChcImNvbnRhaW5lclwiKTtlfHwoZT10aGlzLmdldChcImdyYXBoXCIpLmdldChcImNvbnRhaW5lclwiKSksT2JqZWN0KGgueCkoZSkmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpKSx2dCh0LHtwb3NpdGlvbjpcImFic29sdXRlXCIsdmlzaWJpbGl0eTpcImhpZGRlblwifSksZS5hcHBlbmRDaGlsZCh0KSx0aGlzLnNldChcInRvb2x0aXBcIix0KX0sZS5wcm90b3R5cGUub25Nb3VzZUVudGVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0KFwiaXRlbVR5cGVzXCIpO2lmKCF0Lml0ZW18fCF0Lml0ZW0uZ2V0VHlwZXx8LTEhPT1lLmluZGV4T2YodC5pdGVtLmdldFR5cGUoKSkpe3ZhciBuPXQuaXRlbSxyPXRoaXMuZ2V0KFwiZ3JhcGhcIik7dGhpcy5jdXJyZW50VGFyZ2V0PW4sdGhpcy5zaG93VG9vbHRpcCh0KSxyLmVtaXQoXCJ0b29sdGlwY2hhbmdlXCIse2l0ZW06dC5pdGVtLGFjdGlvbjpcInNob3dcIn0pfX0sZS5wcm90b3R5cGUub25Nb3VzZU1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXQoXCJpdGVtVHlwZXNcIik7dC5pdGVtJiZ0Lml0ZW0uZ2V0VHlwZSYmLTE9PT1lLmluZGV4T2YodC5pdGVtLmdldFR5cGUoKSl8fHRoaXMuY3VycmVudFRhcmdldCYmdC5pdGVtPT09dGhpcy5jdXJyZW50VGFyZ2V0JiZ0aGlzLnNob3dUb29sdGlwKHQpfSxlLnByb3RvdHlwZS5vbk1vdXNlTGVhdmU9ZnVuY3Rpb24oKXt0aGlzLmhpZGVUb29sdGlwKCksdGhpcy5nZXQoXCJncmFwaFwiKS5lbWl0KFwidG9vbHRpcGNoYW5nZVwiLHtpdGVtOnRoaXMuY3VycmVudFRhcmdldCxhY3Rpb246XCJoaWRlXCJ9KSx0aGlzLmN1cnJlbnRUYXJnZXQ9bnVsbH0sZS5wcm90b3R5cGUuc2hvd1Rvb2x0aXA9ZnVuY3Rpb24odCl7aWYodC5pdGVtKXt2YXIgZT10aGlzLmdldChcIml0ZW1UeXBlc1wiKTtpZighdC5pdGVtLmdldFR5cGV8fC0xIT09ZS5pbmRleE9mKHQuaXRlbS5nZXRUeXBlKCkpKXt2YXIgbj10aGlzLmdldChcInRvb2x0aXBcIikscj10aGlzLmdldChcImdldENvbnRlbnRcIikodCk7T2JqZWN0KGgueCkocik/bi5pbm5lckhUTUw9cjpuLmlubmVySFRNTD1yLm91dGVySFRNTCx0aGlzLnVwZGF0ZVBvc2l0aW9uKHQpfX19LGUucHJvdG90eXBlLmhpZGVUb29sdGlwPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJ0b29sdGlwXCIpO3QmJnZ0KHQse3Zpc2liaWxpdHk6XCJoaWRkZW5cIn0pfSxlLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcInNob3VsZEJlZ2luXCIpLG49dGhpcy5nZXQoXCJ0b29sdGlwXCIpO2lmKGUodCkpe3ZhciByPXRoaXMuZ2V0KFwiZ3JhcGhcIiksaT1yLmdldChcIndpZHRoXCIpLG89ci5nZXQoXCJoZWlnaHRcIiksYT10aGlzLmdldChcIm9mZnNldFhcIil8fDAscz10aGlzLmdldChcIm9mZnNldFlcIil8fDAsdT1yLmdldFBvaW50QnlDbGllbnQodC5jbGllbnRYLHQuY2xpZW50WSksYz1yLmdldENhbnZhc0J5UG9pbnQodS54LHUueSksZj1jLngsbD1jLnk7Zis9YSxsKz1zO3ZhciBoPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZitoLndpZHRoPmkmJihmPWYtaC53aWR0aC1hKSxsK2guaGVpZ2h0Pm8mJihsPWwtaC5oZWlnaHQtcyksdnQobix7bGVmdDpmK1wicHhcIix0b3A6bCtcInB4XCIsdmlzaWJpbGl0eTpcInZpc2libGVcIn0pfWVsc2UgdnQobix7dmlzaWJpbGl0eTpcImhpZGRlblwifSl9LGUucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLm9uTW91c2VMZWF2ZSgpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJ0b29sdGlwXCIpO2lmKHQpe3ZhciBlPXRoaXMuZ2V0KFwiY29udGFpbmVyXCIpO2V8fChlPXRoaXMuZ2V0KFwiZ3JhcGhcIikuZ2V0KFwiY29udGFpbmVyXCIpKSxPYmplY3QoaC54KShlKSYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkpLGUucmVtb3ZlQ2hpbGQodCl9fSxlfSh5ZCksemQ9e307ZnVuY3Rpb24gVmQodCxlKXt6ZFt0XT1lfXZhciBXZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy50eXBlPVwiYmFzZVwiLHRoaXMuaXNDYXRlZ29yeT0hMSx0aGlzLmlzTGluZWFyPSExLHRoaXMuaXNDb250aW51b3VzPSExLHRoaXMuaXNJZGVudGl0eT0hMSx0aGlzLnZhbHVlcz1bXSx0aGlzLnJhbmdlPVswLDFdLHRoaXMudGlja3M9W10sdGhpcy5fX2NmZ19fPXQsdGhpcy5pbml0Q2ZnKCksdGhpcy5pbml0KCl9cmV0dXJuIHQucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdC5wcm90b3R5cGUuY2hhbmdlPWZ1bmN0aW9uKHQpe09iamVjdChoLmEpKHRoaXMuX19jZmdfXyx0KSx0aGlzLmluaXQoKX0sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl9fY2ZnX18pfSx0LnByb3RvdHlwZS5nZXRUaWNrcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIE9iamVjdChoLnopKHRoaXMudGlja3MsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIE9iamVjdChoLnYpKGUpP2U6e3RleHQ6dC5nZXRUZXh0KGUsbiksdGlja1ZhbHVlOmUsdmFsdWU6dC5zY2FsZShlKX19KSl9LHQucHJvdG90eXBlLmdldFRleHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmZvcm1hdHRlcixyPW4/bih0LGUpOnQ7cmV0dXJuIE9iamVjdChoLnMpKHIpfHwhT2JqZWN0KGgucikoci50b1N0cmluZyk/XCJcIjpyLnRvU3RyaW5nKCl9LHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2NmZ19fW3RdfSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7T2JqZWN0KGguYSkodGhpcyx0aGlzLl9fY2ZnX18pLHRoaXMuc2V0RG9tYWluKCksT2JqZWN0KGgucCkodGhpcy5nZXRDb25maWcoXCJ0aWNrc1wiKSkmJih0aGlzLnRpY2tzPXRoaXMuY2FsY3VsYXRlVGlja3MoKSl9LHQucHJvdG90eXBlLmluaXRDZmc9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLnNldERvbWFpbj1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuY2FsY3VsYXRlVGlja3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRpY2tNZXRob2QsZT1bXTtpZihPYmplY3QoaC54KSh0KSl7dmFyIG49emRbdF07aWYoIW4pdGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgbm8gbWV0aG9kIHRvIHRvIGNhbGN1bGF0ZSB0aWNrcyFcIik7ZT1uKHRoaXMpfWVsc2UgT2JqZWN0KGgucikodCkmJihlPXQodGhpcykpO3JldHVybiBlfSx0LnByb3RvdHlwZS5yYW5nZU1pbj1mdW5jdGlvbigpe3JldHVybiBPYmplY3QoaC5rKSh0aGlzLnJhbmdlKX0sdC5wcm90b3R5cGUucmFuZ2VNYXg9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0KGgueSkodGhpcy5yYW5nZSl9LHQucHJvdG90eXBlLmNhbGNQZXJjZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gT2JqZWN0KGgudCkodCk/KHQtZSkvKG4tZSk6TmFOfSx0LnByb3RvdHlwZS5jYWxjVmFsdWU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlK3QqKG4tZSl9LHR9KCksWGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPVwiY2F0XCIsZS5pc0NhdGVnb3J5PSEwLGV9cmV0dXJuIE9iamVjdCh2LmIpKGUsdCksZS5wcm90b3R5cGUuYnVpbGRJbmRleE1hcD1mdW5jdGlvbigpe2lmKCF0aGlzLnRyYW5zbGF0ZUluZGV4TWFwKXt0aGlzLnRyYW5zbGF0ZUluZGV4TWFwPW5ldyBNYXA7Zm9yKHZhciB0PTA7dDx0aGlzLnZhbHVlcy5sZW5ndGg7dCsrKXRoaXMudHJhbnNsYXRlSW5kZXhNYXAuc2V0KHRoaXMudmFsdWVzW3RdLHQpfX0sZS5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3RoaXMuYnVpbGRJbmRleE1hcCgpO3ZhciBlPXRoaXMudHJhbnNsYXRlSW5kZXhNYXAuZ2V0KHQpO3JldHVybiB2b2lkIDA9PT1lJiYoZT1PYmplY3QoaC50KSh0KT90Ok5hTiksZX0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy50cmFuc2xhdGUodCksbj10aGlzLmNhbGNQZXJjZW50KGUsdGhpcy5taW4sdGhpcy5tYXgpO3JldHVybiB0aGlzLmNhbGNWYWx1ZShuLHRoaXMucmFuZ2VNaW4oKSx0aGlzLnJhbmdlTWF4KCkpfSxlLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tYXgtdGhpcy5taW4sbj10aGlzLmNhbGNQZXJjZW50KHQsdGhpcy5yYW5nZU1pbigpLHRoaXMucmFuZ2VNYXgoKSkscj1NYXRoLnJvdW5kKGUqbikrdGhpcy5taW47cmV0dXJuIHI8dGhpcy5taW58fHI+dGhpcy5tYXg/TmFOOnRoaXMudmFsdWVzW3JdfSxlLnByb3RvdHlwZS5nZXRUZXh0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgbj1bXSxyPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3ZhciBpPWU7cmV0dXJuIE9iamVjdChoLnQpKGUpJiYhdGhpcy52YWx1ZXMuaW5jbHVkZXMoZSkmJihpPXRoaXMudmFsdWVzW2ldKSx0LnByb3RvdHlwZS5nZXRUZXh0LmFwcGx5KHRoaXMsT2JqZWN0KHYuZCkoW2ldLG4pKX0sZS5wcm90b3R5cGUuaW5pdENmZz1mdW5jdGlvbigpe3RoaXMudGlja01ldGhvZD1cImNhdFwifSxlLnByb3RvdHlwZS5zZXREb21haW49ZnVuY3Rpb24oKXtpZihPYmplY3QoaC5zKSh0aGlzLmdldENvbmZpZyhcIm1pblwiKSkmJih0aGlzLm1pbj0wKSxPYmplY3QoaC5zKSh0aGlzLmdldENvbmZpZyhcIm1heFwiKSkpe3ZhciB0PXRoaXMudmFsdWVzLmxlbmd0aDt0aGlzLm1heD10PjE/dC0xOnR9dGhpcy50cmFuc2xhdGVJbmRleE1hcCYmKHRoaXMudHJhbnNsYXRlSW5kZXhNYXA9dm9pZCAwKX0sZX0oV2QpLFlkPS9kezEsNH18TXsxLDR9fFlZKD86WVkpP3xTezEsM318RG98Wlp8WnwoW0hoTXNEbV0pXFwxP3xbYUFdfFwiW15cIl0qXCJ8J1teJ10qJy9nLEhkPVwiW15cXFxcc10rXCIscWQ9L1xcWyhbXl0qPylcXF0vZ207ZnVuY3Rpb24gS2QodCxlKXtmb3IodmFyIG49W10scj0wLGk9dC5sZW5ndGg7cjxpO3IrKyluLnB1c2godFtyXS5zdWJzdHIoMCxlKSk7cmV0dXJuIG59dmFyIFpkPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciByPW5bdF0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfSkpLmluZGV4T2YoZS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gcj4tMT9yOm51bGx9fTtmdW5jdGlvbiBRZCh0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtmb3IodmFyIHI9MCxpPWU7cjxpLmxlbmd0aDtyKyspe3ZhciBvPWlbcl07Zm9yKHZhciBhIGluIG8pdFthXT1vW2FdfXJldHVybiB0fXZhciBKZD1bXCJTdW5kYXlcIixcIk1vbmRheVwiLFwiVHVlc2RheVwiLFwiV2VkbmVzZGF5XCIsXCJUaHVyc2RheVwiLFwiRnJpZGF5XCIsXCJTYXR1cmRheVwiXSwkZD1bXCJKYW51YXJ5XCIsXCJGZWJydWFyeVwiLFwiTWFyY2hcIixcIkFwcmlsXCIsXCJNYXlcIixcIkp1bmVcIixcIkp1bHlcIixcIkF1Z3VzdFwiLFwiU2VwdGVtYmVyXCIsXCJPY3RvYmVyXCIsXCJOb3ZlbWJlclwiLFwiRGVjZW1iZXJcIl0sdHA9S2QoJGQsMyksZXA9e2RheU5hbWVzU2hvcnQ6S2QoSmQsMyksZGF5TmFtZXM6SmQsbW9udGhOYW1lc1Nob3J0OnRwLG1vbnRoTmFtZXM6JGQsYW1QbTpbXCJhbVwiLFwicG1cIl0sRG9GbjpmdW5jdGlvbih0KXtyZXR1cm4gdCtbXCJ0aFwiLFwic3RcIixcIm5kXCIsXCJyZFwiXVt0JTEwPjM/MDoodC10JTEwIT0xMD8xOjApKnQlMTBdfX0sbnA9UWQoe30sZXApLHJwPWZ1bmN0aW9uKHQpe3JldHVybiBucD1RZChucCx0KX0saXA9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvW3xcXFxceygpW14kKyo/Li1dL2csXCJcXFxcJCZcIil9LG9wPWZ1bmN0aW9uKHQsZSl7Zm9yKHZvaWQgMD09PWUmJihlPTIpLHQ9U3RyaW5nKHQpO3QubGVuZ3RoPGU7KXQ9XCIwXCIrdDtyZXR1cm4gdH0sYXA9e0Q6ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0LmdldERhdGUoKSl9LEREOmZ1bmN0aW9uKHQpe3JldHVybiBvcCh0LmdldERhdGUoKSl9LERvOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuRG9Gbih0LmdldERhdGUoKSl9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0LmdldERheSgpKX0sZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIG9wKHQuZ2V0RGF5KCkpfSxkZGQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5kYXlOYW1lc1Nob3J0W3QuZ2V0RGF5KCldfSxkZGRkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZGF5TmFtZXNbdC5nZXREYXkoKV19LE06ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0LmdldE1vbnRoKCkrMSl9LE1NOmZ1bmN0aW9uKHQpe3JldHVybiBvcCh0LmdldE1vbnRoKCkrMSl9LE1NTTpmdW5jdGlvbih0LGUpe3JldHVybiBlLm1vbnRoTmFtZXNTaG9ydFt0LmdldE1vbnRoKCldfSxNTU1NOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUubW9udGhOYW1lc1t0LmdldE1vbnRoKCldfSxZWTpmdW5jdGlvbih0KXtyZXR1cm4gb3AoU3RyaW5nKHQuZ2V0RnVsbFllYXIoKSksNCkuc3Vic3RyKDIpfSxZWVlZOmZ1bmN0aW9uKHQpe3JldHVybiBvcCh0LmdldEZ1bGxZZWFyKCksNCl9LGg6ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0LmdldEhvdXJzKCklMTJ8fDEyKX0saGg6ZnVuY3Rpb24odCl7cmV0dXJuIG9wKHQuZ2V0SG91cnMoKSUxMnx8MTIpfSxIOmZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodC5nZXRIb3VycygpKX0sSEg6ZnVuY3Rpb24odCl7cmV0dXJuIG9wKHQuZ2V0SG91cnMoKSl9LG06ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0LmdldE1pbnV0ZXMoKSl9LG1tOmZ1bmN0aW9uKHQpe3JldHVybiBvcCh0LmdldE1pbnV0ZXMoKSl9LHM6ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0LmdldFNlY29uZHMoKSl9LHNzOmZ1bmN0aW9uKHQpe3JldHVybiBvcCh0LmdldFNlY29uZHMoKSl9LFM6ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyhNYXRoLnJvdW5kKHQuZ2V0TWlsbGlzZWNvbmRzKCkvMTAwKSl9LFNTOmZ1bmN0aW9uKHQpe3JldHVybiBvcChNYXRoLnJvdW5kKHQuZ2V0TWlsbGlzZWNvbmRzKCkvMTApLDIpfSxTU1M6ZnVuY3Rpb24odCl7cmV0dXJuIG9wKHQuZ2V0TWlsbGlzZWNvbmRzKCksMyl9LGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5nZXRIb3VycygpPDEyP2UuYW1QbVswXTplLmFtUG1bMV19LEE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5nZXRIb3VycygpPDEyP2UuYW1QbVswXS50b1VwcGVyQ2FzZSgpOmUuYW1QbVsxXS50b1VwcGVyQ2FzZSgpfSxaWjpmdW5jdGlvbih0KXt2YXIgZT10LmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKGU+MD9cIi1cIjpcIitcIikrb3AoMTAwKk1hdGguZmxvb3IoTWF0aC5hYnMoZSkvNjApK01hdGguYWJzKGUpJTYwLDQpfSxaOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4oZT4wP1wiLVwiOlwiK1wiKStvcChNYXRoLmZsb29yKE1hdGguYWJzKGUpLzYwKSwyKStcIjpcIitvcChNYXRoLmFicyhlKSU2MCwyKX19LHNwPWZ1bmN0aW9uKHQpe3JldHVybit0LTF9LHVwPVtudWxsLFwiWzEtOV1cXFxcZD9cIl0sY3A9W251bGwsSGRdLGZwPVtcImlzUG1cIixIZCxmdW5jdGlvbih0LGUpe3ZhciBuPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gbj09PWUuYW1QbVswXT8wOm49PT1lLmFtUG1bMV0/MTpudWxsfV0sbHA9W1widGltZXpvbmVPZmZzZXRcIixcIlteXFxcXHNdKj9bXFxcXCtcXFxcLV1cXFxcZFxcXFxkOj9cXFxcZFxcXFxkfFteXFxcXHNdKj9aP1wiLGZ1bmN0aW9uKHQpe3ZhciBlPSh0K1wiXCIpLm1hdGNoKC8oWystXXxcXGRcXGQpL2dpKTtpZihlKXt2YXIgbj02MCorZVsxXStwYXJzZUludChlWzJdLDEwKTtyZXR1cm5cIitcIj09PWVbMF0/bjotbn1yZXR1cm4gMH1dLGhwPXtEOltcImRheVwiLFwiWzEtOV1cXFxcZD9cIl0sREQ6W1wiZGF5XCIsXCJcXFxcZFxcXFxkXCJdLERvOltcImRheVwiLFwiWzEtOV1cXFxcZD9cIitIZCxmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VJbnQodCwxMCl9XSxNOltcIm1vbnRoXCIsXCJbMS05XVxcXFxkP1wiLHNwXSxNTTpbXCJtb250aFwiLFwiXFxcXGRcXFxcZFwiLHNwXSxZWTpbXCJ5ZWFyXCIsXCJcXFxcZFxcXFxkXCIsZnVuY3Rpb24odCl7dmFyIGU9KyhcIlwiKyhuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSkuc3Vic3RyKDAsMik7cmV0dXJuKyhcIlwiKygrdD42OD9lLTE6ZSkrdCl9XSxoOltcImhvdXJcIixcIlsxLTldXFxcXGQ/XCIsdm9pZCAwLFwiaXNQbVwiXSxoaDpbXCJob3VyXCIsXCJcXFxcZFxcXFxkXCIsdm9pZCAwLFwiaXNQbVwiXSxIOltcImhvdXJcIixcIlsxLTldXFxcXGQ/XCJdLEhIOltcImhvdXJcIixcIlxcXFxkXFxcXGRcIl0sbTpbXCJtaW51dGVcIixcIlsxLTldXFxcXGQ/XCJdLG1tOltcIm1pbnV0ZVwiLFwiXFxcXGRcXFxcZFwiXSxzOltcInNlY29uZFwiLFwiWzEtOV1cXFxcZD9cIl0sc3M6W1wic2Vjb25kXCIsXCJcXFxcZFxcXFxkXCJdLFlZWVk6W1wieWVhclwiLFwiXFxcXGR7NH1cIl0sUzpbXCJtaWxsaXNlY29uZFwiLFwiXFxcXGRcIixmdW5jdGlvbih0KXtyZXR1cm4gMTAwKit0fV0sU1M6W1wibWlsbGlzZWNvbmRcIixcIlxcXFxkXFxcXGRcIixmdW5jdGlvbih0KXtyZXR1cm4gMTAqK3R9XSxTU1M6W1wibWlsbGlzZWNvbmRcIixcIlxcXFxkezN9XCJdLGQ6dXAsZGQ6dXAsZGRkOmNwLGRkZGQ6Y3AsTU1NOltcIm1vbnRoXCIsSGQsWmQoXCJtb250aE5hbWVzU2hvcnRcIildLE1NTU06W1wibW9udGhcIixIZCxaZChcIm1vbnRoTmFtZXNcIildLGE6ZnAsQTpmcCxaWjpscCxaOmxwfSxkcD17ZGVmYXVsdDpcImRkZCBNTU0gREQgWVlZWSBISDptbTpzc1wiLHNob3J0RGF0ZTpcIk0vRC9ZWVwiLG1lZGl1bURhdGU6XCJNTU0gRCwgWVlZWVwiLGxvbmdEYXRlOlwiTU1NTSBELCBZWVlZXCIsZnVsbERhdGU6XCJkZGRkLCBNTU1NIEQsIFlZWVlcIixpc29EYXRlOlwiWVlZWS1NTS1ERFwiLGlzb0RhdGVUaW1lOlwiWVlZWS1NTS1ERFRISDptbTpzc1pcIixzaG9ydFRpbWU6XCJISDptbVwiLG1lZGl1bVRpbWU6XCJISDptbTpzc1wiLGxvbmdUaW1lOlwiSEg6bW06c3MuU1NTXCJ9LHBwPWZ1bmN0aW9uKHQpe3JldHVybiBRZChkcCx0KX0sZ3A9ZnVuY3Rpb24odCxlLG4pe2lmKHZvaWQgMD09PWUmJihlPWRwLmRlZmF1bHQpLHZvaWQgMD09PW4mJihuPXt9KSxcIm51bWJlclwiPT10eXBlb2YgdCYmKHQ9bmV3IERhdGUodCkpLFwiW29iamVjdCBEYXRlXVwiIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfHxpc05hTih0LmdldFRpbWUoKSkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBEYXRlIHBhc3MgdG8gZm9ybWF0XCIpO3ZhciByPVtdO2U9KGU9ZHBbZV18fGUpLnJlcGxhY2UocWQsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIucHVzaChlKSxcIkBAQFwifSkpO3ZhciBpPVFkKFFkKHt9LG5wKSxuKTtyZXR1cm4oZT1lLnJlcGxhY2UoWWQsKGZ1bmN0aW9uKGUpe3JldHVybiBhcFtlXSh0LGkpfSkpKS5yZXBsYWNlKC9AQEAvZywoZnVuY3Rpb24oKXtyZXR1cm4gci5zaGlmdCgpfSkpfTtmdW5jdGlvbiB2cCh0LGUsbil7aWYodm9pZCAwPT09biYmKG49e30pLFwic3RyaW5nXCIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZm9ybWF0IGluIGZlY2hhIHBhcnNlXCIpO2lmKGU9ZHBbZV18fGUsdC5sZW5ndGg+MWUzKXJldHVybiBudWxsO3ZhciByPXt5ZWFyOihuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxtb250aDowLGRheToxLGhvdXI6MCxtaW51dGU6MCxzZWNvbmQ6MCxtaWxsaXNlY29uZDowLGlzUG06bnVsbCx0aW1lem9uZU9mZnNldDpudWxsfSxpPVtdLG89W10sYT1lLnJlcGxhY2UocWQsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8ucHVzaChpcChlKSksXCJAQEBcIn0pKSxzPXt9LHU9e307YT1pcChhKS5yZXBsYWNlKFlkLChmdW5jdGlvbih0KXt2YXIgZT1ocFt0XSxuPWVbMF0scj1lWzFdLG89ZVszXTtpZihzW25dKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZm9ybWF0LiBcIituK1wiIHNwZWNpZmllZCB0d2ljZSBpbiBmb3JtYXRcIik7cmV0dXJuIHNbbl09ITAsbyYmKHVbb109ITApLGkucHVzaChlKSxcIihcIityK1wiKVwifSkpLE9iamVjdC5rZXlzKHUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFzW3RdKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZm9ybWF0LiBcIit0K1wiIGlzIHJlcXVpcmVkIGluIHNwZWNpZmllZCBmb3JtYXRcIil9KSksYT1hLnJlcGxhY2UoL0BAQC9nLChmdW5jdGlvbigpe3JldHVybiBvLnNoaWZ0KCl9KSk7dmFyIGM9dC5tYXRjaChuZXcgUmVnRXhwKGEsXCJpXCIpKTtpZighYylyZXR1cm4gbnVsbDtmb3IodmFyIGY9UWQoUWQoe30sbnApLG4pLGw9MTtsPGMubGVuZ3RoO2wrKyl7dmFyIGg9aVtsLTFdLGQ9aFswXSxwPWhbMl0sZz1wP3AoY1tsXSxmKTorY1tsXTtpZihudWxsPT1nKXJldHVybiBudWxsO3JbZF09Z30xPT09ci5pc1BtJiZudWxsIT1yLmhvdXImJjEyIT0rci5ob3VyP3IuaG91cj0rci5ob3VyKzEyOjA9PT1yLmlzUG0mJjEyPT0rci5ob3VyJiYoci5ob3VyPTApO2Zvcih2YXIgdj1uZXcgRGF0ZShyLnllYXIsci5tb250aCxyLmRheSxyLmhvdXIsci5taW51dGUsci5zZWNvbmQsci5taWxsaXNlY29uZCkseT1bW1wibW9udGhcIixcImdldE1vbnRoXCJdLFtcImRheVwiLFwiZ2V0RGF0ZVwiXSxbXCJob3VyXCIsXCJnZXRIb3Vyc1wiXSxbXCJtaW51dGVcIixcImdldE1pbnV0ZXNcIl0sW1wic2Vjb25kXCIsXCJnZXRTZWNvbmRzXCJdXSxtPShsPTAseS5sZW5ndGgpO2w8bTtsKyspaWYoc1t5W2xdWzBdXSYmclt5W2xdWzBdXSE9PXZbeVtsXVsxXV0oKSlyZXR1cm4gbnVsbDtyZXR1cm4gbnVsbD09ci50aW1lem9uZU9mZnNldD92Om5ldyBEYXRlKERhdGUuVVRDKHIueWVhcixyLm1vbnRoLHIuZGF5LHIuaG91cixyLm1pbnV0ZS1yLnRpbWV6b25lT2Zmc2V0LHIuc2Vjb25kLHIubWlsbGlzZWNvbmQpKX12YXIgeXA9e2Zvcm1hdDpncCxwYXJzZTp2cCxkZWZhdWx0STE4bjplcCxzZXRHbG9iYWxEYXRlSTE4bjpycCxzZXRHbG9iYWxEYXRlTWFza3M6cHB9O2Z1bmN0aW9uIG1wKHQsZSl7cmV0dXJuKGwuZm9ybWF0fHx5cC5mb3JtYXQpKHQsZSl9ZnVuY3Rpb24gYnAodCl7cmV0dXJuIE9iamVjdChoLngpKHQpJiYodD10LmluZGV4T2YoXCJUXCIpPjA/bmV3IERhdGUodCkuZ2V0VGltZSgpOm5ldyBEYXRlKHQucmVwbGFjZSgvLS9naSxcIi9cIikpLmdldFRpbWUoKSksT2JqZWN0KGgubykodCkmJih0PXQuZ2V0VGltZSgpKSx0fXZhciB4cD0zNmU1LHdwPTI0KnhwLFNwPTMxKndwLEVwPVtbXCJISDptbTpzc1wiLDFlM10sW1wiSEg6bW06c3NcIiwxZTRdLFtcIkhIOm1tOnNzXCIsM2U0XSxbXCJISDptbVwiLDZlNF0sW1wiSEg6bW1cIiw2ZTVdLFtcIkhIOm1tXCIsMThlNV0sW1wiSEhcIix4cF0sW1wiSEhcIiw2KnhwXSxbXCJISFwiLDEyKnhwXSxbXCJZWVlZLU1NLUREXCIsd3BdLFtcIllZWVktTU0tRERcIiw0KndwXSxbXCJZWVlZLVdXXCIsNyp3cF0sW1wiWVlZWS1NTVwiLFNwXSxbXCJZWVlZLU1NXCIsNCpTcF0sW1wiWVlZWS1NTVwiLDYqU3BdLFtcIllZWVlcIiwzODAqd3BdXTtmdW5jdGlvbiBfcCh0LGUsbil7dmFyIHIsaT0ocj1mdW5jdGlvbih0KXtyZXR1cm4gdFsxXX0sZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciBvPU9iamVjdChoLnMpKG4pPzA6bixhPU9iamVjdChoLnMpKGkpP3QubGVuZ3RoOmk7bzxhOyl7dmFyIHM9bythPj4+MTtyKHRbc10pPmU/YT1zOm89cysxfXJldHVybiBvfSkoRXAsKGUtdCkvbiktMSxvPUVwW2ldO3JldHVybiBpPDA/bz1FcFswXTppPj1FcC5sZW5ndGgmJihvPU9iamVjdChoLnkpKEVwKSksb312YXIgT3A9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPVwidGltZUNhdFwiLGV9cmV0dXJuIE9iamVjdCh2LmIpKGUsdCksZS5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3Q9YnAodCk7dmFyIGU9dGhpcy52YWx1ZXMuaW5kZXhPZih0KTtyZXR1cm4tMT09PWUmJihlPU9iamVjdChoLnQpKHQpJiZ0PHRoaXMudmFsdWVzLmxlbmd0aD90Ok5hTiksZX0sZS5wcm90b3R5cGUuZ2V0VGV4dD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudHJhbnNsYXRlKHQpO2lmKG4+LTEpe3ZhciByPXRoaXMudmFsdWVzW25dLGk9dGhpcy5mb3JtYXR0ZXI7cmV0dXJuIHI9aT9pKHIsZSk6bXAocix0aGlzLm1hc2spfXJldHVybiB0fSxlLnByb3RvdHlwZS5pbml0Q2ZnPWZ1bmN0aW9uKCl7dGhpcy50aWNrTWV0aG9kPVwidGltZS1jYXRcIix0aGlzLm1hc2s9XCJZWVlZLU1NLUREXCIsdGhpcy50aWNrQ291bnQ9N30sZS5wcm90b3R5cGUuc2V0RG9tYWluPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy52YWx1ZXM7T2JqZWN0KGguZikoZSwoZnVuY3Rpb24odCxuKXtlW25dPWJwKHQpfSkpLGUuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSkpLHQucHJvdG90eXBlLnNldERvbWFpbi5jYWxsKHRoaXMpfSxlfShYZCksa3A9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5pc0NvbnRpbnVvdXM9ITAsZX1yZXR1cm4gT2JqZWN0KHYuYikoZSx0KSxlLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXtpZihPYmplY3QoaC5zKSh0KSlyZXR1cm4gTmFOO3ZhciBlPXRoaXMucmFuZ2VNaW4oKSxuPXRoaXMucmFuZ2VNYXgoKTtyZXR1cm4gdGhpcy5tYXg9PT10aGlzLm1pbj9lOmUrdGhpcy5nZXRTY2FsZVBlcmNlbnQodCkqKG4tZSl9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5pbml0LmNhbGwodGhpcyk7dmFyIGU9dGhpcy50aWNrcyxuPU9iamVjdChoLmspKGUpLHI9T2JqZWN0KGgueSkoZSk7bjx0aGlzLm1pbiYmKHRoaXMubWluPW4pLHI+dGhpcy5tYXgmJih0aGlzLm1heD1yKSxPYmplY3QoaC5zKSh0aGlzLm1pbkxpbWl0KXx8KHRoaXMubWluPW4pLE9iamVjdChoLnMpKHRoaXMubWF4TGltaXQpfHwodGhpcy5tYXg9cil9LGUucHJvdG90eXBlLnNldERvbWFpbj1mdW5jdGlvbigpe3ZhciB0PU9iamVjdChoLmopKHRoaXMudmFsdWVzKSxlPXQubWluLG49dC5tYXg7T2JqZWN0KGgucykodGhpcy5taW4pJiYodGhpcy5taW49ZSksT2JqZWN0KGgucykodGhpcy5tYXgpJiYodGhpcy5tYXg9biksdGhpcy5taW4+dGhpcy5tYXgmJih0aGlzLm1pbj1lLHRoaXMubWF4PW4pfSxlLnByb3RvdHlwZS5jYWxjdWxhdGVUaWNrcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10LnByb3RvdHlwZS5jYWxjdWxhdGVUaWNrcy5jYWxsKHRoaXMpO3JldHVybiB0aGlzLm5pY2V8fChuPU9iamVjdChoLmcpKG4sKGZ1bmN0aW9uKHQpe3JldHVybiB0Pj1lLm1pbiYmdDw9ZS5tYXh9KSkpLG59LGUucHJvdG90eXBlLmdldFNjYWxlUGVyY2VudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm1heCxuPXRoaXMubWluO3JldHVybih0LW4pLyhlLW4pfSxlLnByb3RvdHlwZS5nZXRJbnZlcnRQZXJjZW50PWZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMucmFuZ2VNaW4oKSkvKHRoaXMucmFuZ2VNYXgoKS10aGlzLnJhbmdlTWluKCkpfSxlfShXZCksTXA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPVwibGluZWFyXCIsZS5pc0xpbmVhcj0hMCxlfXJldHVybiBPYmplY3Qodi5iKShlLHQpLGUucHJvdG90eXBlLmludmVydD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEludmVydFBlcmNlbnQodCk7cmV0dXJuIHRoaXMubWluK2UqKHRoaXMubWF4LXRoaXMubWluKX0sZS5wcm90b3R5cGUuaW5pdENmZz1mdW5jdGlvbigpe3RoaXMudGlja01ldGhvZD1cIndpbGtpbnNvbi1leHRlbmRlZFwiLHRoaXMubmljZT0hMX0sZX0oa3ApO2Z1bmN0aW9uIEFwKHQsZSl7dmFyIG49TWF0aC5FO3JldHVybiBlPj0wP01hdGgucG93KG4sTWF0aC5sb2coZSkvdCk6LTEqTWF0aC5wb3cobixNYXRoLmxvZygtZSkvdCl9ZnVuY3Rpb24gVHAodCxlKXtyZXR1cm4gMT09PXQ/MTpNYXRoLmxvZyhlKS9NYXRoLmxvZyh0KX1mdW5jdGlvbiBDcCh0LGUsbil7T2JqZWN0KGgucykobikmJihuPU1hdGgubWF4LmFwcGx5KG51bGwsdCkpO3ZhciByPW47cmV0dXJuIE9iamVjdChoLmYpKHQsKGZ1bmN0aW9uKHQpe3Q+MCYmdDxyJiYocj10KX0pKSxyPT09biYmKHI9bi9lKSxyPjEmJihyPTEpLHJ9dmFyIElwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT1cImxvZ1wiLGV9cmV0dXJuIE9iamVjdCh2LmIpKGUsdCksZS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5iYXNlLHI9VHAobix0aGlzLm1heCksaT10aGlzLnJhbmdlTWluKCksbz10aGlzLnJhbmdlTWF4KCktaSxhPXRoaXMucG9zaXRpdmVNaW47aWYoYSl7aWYoMD09PXQpcmV0dXJuIDA7dmFyIHM9MS8oci0oZT1UcChuLGEvbikpKSpvO2lmKHQ8cylyZXR1cm4gdC9zKmF9ZWxzZSBlPVRwKG4sdGhpcy5taW4pO3ZhciB1PSh0LWkpL28qKHItZSkrZTtyZXR1cm4gTWF0aC5wb3cobix1KX0sZS5wcm90b3R5cGUuaW5pdENmZz1mdW5jdGlvbigpe3RoaXMudGlja01ldGhvZD1cImxvZ1wiLHRoaXMuYmFzZT0xMCx0aGlzLnRpY2tDb3VudD02LHRoaXMubmljZT0hMH0sZS5wcm90b3R5cGUuc2V0RG9tYWluPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuc2V0RG9tYWluLmNhbGwodGhpcyk7dmFyIGU9dGhpcy5taW47aWYoZTwwKXRocm93IG5ldyBFcnJvcihcIldoZW4geW91IHVzZSBsb2cgc2NhbGUsIHRoZSBtaW5pbXVtIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8hXCIpOzA9PT1lJiYodGhpcy5wb3NpdGl2ZU1pbj1DcCh0aGlzLnZhbHVlcyx0aGlzLmJhc2UsdGhpcy5tYXgpKX0sZS5wcm90b3R5cGUuZ2V0U2NhbGVQZXJjZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWF4LG49dGhpcy5taW47aWYoZT09PW4pcmV0dXJuIDA7aWYodDw9MClyZXR1cm4gMDt2YXIgcj10aGlzLmJhc2UsaT10aGlzLnBvc2l0aXZlTWluO3JldHVybiBpJiYobj0xKmkvciksdDxpP3QvaS8oVHAocixlKS1UcChyLG4pKTooVHAocix0KS1UcChyLG4pKS8oVHAocixlKS1UcChyLG4pKX0sZX0oa3ApLFBwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT1cInBvd1wiLGV9cmV0dXJuIE9iamVjdCh2LmIpKGUsdCksZS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0SW52ZXJ0UGVyY2VudCh0KSxuPXRoaXMuZXhwb25lbnQscj1BcChuLHRoaXMubWF4KSxpPUFwKG4sdGhpcy5taW4pLG89ZSooci1pKStpLGE9bz49MD8xOi0xO3JldHVybiBNYXRoLnBvdyhvLG4pKmF9LGUucHJvdG90eXBlLmluaXRDZmc9ZnVuY3Rpb24oKXt0aGlzLnRpY2tNZXRob2Q9XCJwb3dcIix0aGlzLmV4cG9uZW50PTIsdGhpcy50aWNrQ291bnQ9NSx0aGlzLm5pY2U9ITB9LGUucHJvdG90eXBlLmdldFNjYWxlUGVyY2VudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm1heCxuPXRoaXMubWluO2lmKGU9PT1uKXJldHVybiAwO3ZhciByPXRoaXMuZXhwb25lbnQ7cmV0dXJuKEFwKHIsdCktQXAocixuKSkvKEFwKHIsZSktQXAocixuKSl9LGV9KGtwKSxqcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLnR5cGU9XCJ0aW1lXCIsZX1yZXR1cm4gT2JqZWN0KHYuYikoZSx0KSxlLnByb3RvdHlwZS5nZXRUZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy50cmFuc2xhdGUodCkscj10aGlzLmZvcm1hdHRlcjtyZXR1cm4gcj9yKG4sZSk6bXAobix0aGlzLm1hc2spfSxlLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihlKXt2YXIgbj1lO3JldHVybihPYmplY3QoaC54KShuKXx8T2JqZWN0KGgubykobikpJiYobj10aGlzLnRyYW5zbGF0ZShuKSksdC5wcm90b3R5cGUuc2NhbGUuY2FsbCh0aGlzLG4pfSxlLnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGJwKHQpfSxlLnByb3RvdHlwZS5pbml0Q2ZnPWZ1bmN0aW9uKCl7dGhpcy50aWNrTWV0aG9kPVwidGltZS1wcmV0dHlcIix0aGlzLm1hc2s9XCJZWVlZLU1NLUREXCIsdGhpcy50aWNrQ291bnQ9Nyx0aGlzLm5pY2U9ITF9LGUucHJvdG90eXBlLnNldERvbWFpbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmFsdWVzLGU9dGhpcy5nZXRDb25maWcoXCJtaW5cIiksbj10aGlzLmdldENvbmZpZyhcIm1heFwiKTtpZihPYmplY3QoaC5zKShlKSYmT2JqZWN0KGgudCkoZSl8fCh0aGlzLm1pbj10aGlzLnRyYW5zbGF0ZSh0aGlzLm1pbikpLE9iamVjdChoLnMpKG4pJiZPYmplY3QoaC50KShuKXx8KHRoaXMubWF4PXRoaXMudHJhbnNsYXRlKHRoaXMubWF4KSksdCYmdC5sZW5ndGgpe3ZhciByPVtdLGk9MS8wLG89aSxhPTA7T2JqZWN0KGguZikodCwoZnVuY3Rpb24odCl7dmFyIGU9YnAodCk7aWYoaXNOYU4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgVGltZTogXCIrdCtcIiBpbiB0aW1lIHNjYWxlIVwiKTtpPmU/KG89aSxpPWUpOm8+ZSYmKG89ZSksYTxlJiYoYT1lKSxyLnB1c2goZSl9KSksdC5sZW5ndGg+MSYmKHRoaXMubWluVGlja0ludGVydmFsPW8taSksT2JqZWN0KGgucykoZSkmJih0aGlzLm1pbj1pKSxPYmplY3QoaC5zKShuKSYmKHRoaXMubWF4PWEpfX0sZX0oTXApLERwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT1cInF1YW50aXplXCIsZX1yZXR1cm4gT2JqZWN0KHYuYikoZSx0KSxlLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy50aWNrcyxuPWUubGVuZ3RoLHI9dGhpcy5nZXRJbnZlcnRQZXJjZW50KHQpLGk9TWF0aC5mbG9vcihyKihuLTEpKTtpZihpPj1uLTEpcmV0dXJuIE9iamVjdChoLnkpKGUpO2lmKGk8MClyZXR1cm4gT2JqZWN0KGguaykoZSk7dmFyIG89ZVtpXSxhPWkvKG4tMSk7cmV0dXJuIG8rKHItYSkvKChpKzEpLyhuLTEpLWEpKihlW2krMV0tbyl9LGUucHJvdG90eXBlLmluaXRDZmc9ZnVuY3Rpb24oKXt0aGlzLnRpY2tNZXRob2Q9XCJyLXByZXR0eVwiLHRoaXMudGlja0NvdW50PTUsdGhpcy5uaWNlPSEwfSxlLnByb3RvdHlwZS5jYWxjdWxhdGVUaWNrcz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmNhbGN1bGF0ZVRpY2tzLmNhbGwodGhpcyk7cmV0dXJuIHRoaXMubmljZXx8KE9iamVjdChoLnkpKGUpIT09dGhpcy5tYXgmJmUucHVzaCh0aGlzLm1heCksT2JqZWN0KGguaykoZSkhPT10aGlzLm1pbiYmZS51bnNoaWZ0KHRoaXMubWluKSksZX0sZS5wcm90b3R5cGUuZ2V0U2NhbGVQZXJjZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudGlja3M7aWYodDxPYmplY3QoaC5rKShlKSlyZXR1cm4gMDtpZih0Pk9iamVjdChoLnkpKGUpKXJldHVybiAxO3ZhciBuPTA7cmV0dXJuIE9iamVjdChoLmYpKGUsKGZ1bmN0aW9uKGUscil7aWYoISh0Pj1lKSlyZXR1cm4hMTtuPXJ9KSksbi8oZS5sZW5ndGgtMSl9LGV9KGtwKSxOcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLnR5cGU9XCJxdWFudGlsZVwiLGV9cmV0dXJuIE9iamVjdCh2LmIpKGUsdCksZS5wcm90b3R5cGUuaW5pdENmZz1mdW5jdGlvbigpe3RoaXMudGlja01ldGhvZD1cInF1YW50aWxlXCIsdGhpcy50aWNrQ291bnQ9NSx0aGlzLm5pY2U9ITB9LGV9KERwKSxScD17fTtmdW5jdGlvbiBMcCh0LGUpe2lmKGZ1bmN0aW9uKHQpe3JldHVybiBScFt0XX0odCkpdGhyb3cgbmV3IEVycm9yKFwidHlwZSAnXCIrdCtcIicgZXhpc3RlZC5cIik7UnBbdF09ZX12YXIgQnA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPVwiaWRlbnRpdHlcIixlLmlzSWRlbnRpdHk9ITAsZX1yZXR1cm4gT2JqZWN0KHYuYikoZSx0KSxlLnByb3RvdHlwZS5jYWxjdWxhdGVUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlc30sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudmFsdWVzWzBdIT09dCYmT2JqZWN0KGgudCkodCk/dDp0aGlzLnJhbmdlWzBdfSxlLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yYW5nZTtyZXR1cm4gdDxlWzBdfHx0PmVbMV0/TmFOOnRoaXMudmFsdWVzWzBdfSxlfShXZCksR3A9WzEsNSwyLDIuNSw0LDNdLEZwPTEwMCpOdW1iZXIuRVBTSUxPTjtmdW5jdGlvbiBVcCh0LGUsbixyLGksbyl7dmFyIGE9T2JqZWN0KGguRSkoZSkscz1PYmplY3QoaC5sKShlLHQpLHU9MCxjPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQlZStlKSVlfShyLG8pO3JldHVybihjPEZwfHxvLWM8RnApJiZyPD0wJiZpPj0wJiYodT0xKSwxLXMvKGEtMSktbit1fWZ1bmN0aW9uIHpwKHQsZSxuKXt2YXIgcj1PYmplY3QoaC5FKShlKTtyZXR1cm4gMS1PYmplY3QoaC5sKShlLHQpLyhyLTEpLW4rMX1mdW5jdGlvbiBWcCh0LGUsbixyLGksbyl7dmFyIGE9KHQtMSkvKG8taSkscz0oZS0xKS8oTWF0aC5tYXgobyxyKS1NYXRoLm1pbihuLGkpKTtyZXR1cm4gMi1NYXRoLm1heChhL3Mscy9hKX1mdW5jdGlvbiBXcCh0LGUpe3JldHVybiB0Pj1lPzItKHQtMSkvKGUtMSk6MX1mdW5jdGlvbiBYcCh0LGUsbixyKXt2YXIgaT1lLXQ7cmV0dXJuIDEtLjUqKE1hdGgucG93KGUtciwyKStNYXRoLnBvdyh0LW4sMikpL01hdGgucG93KC4xKmksMil9ZnVuY3Rpb24gWXAodCxlLG4pe3ZhciByPWUtdDtpZihuPnIpe3ZhciBpPShuLXIpLzI7cmV0dXJuIDEtTWF0aC5wb3coaSwyKS9NYXRoLnBvdyguMSpyLDIpfXJldHVybiAxfWZ1bmN0aW9uIEhwKHQsZSxuLHIsaSxvKXtpZih2b2lkIDA9PT1uJiYobj01KSx2b2lkIDA9PT1yJiYocj0hMCksdm9pZCAwPT09aSYmKGk9R3ApLHZvaWQgMD09PW8mJihvPVsuMjUsLjIsLjUsLjA1XSksXCJudW1iZXJcIiE9dHlwZW9mIHR8fFwibnVtYmVyXCIhPXR5cGVvZiBlfHwhbilyZXR1cm57bWluOjAsbWF4OjAsdGlja3M6W119O2lmKGUtdDwxZS0xNXx8MT09PW4pcmV0dXJue21pbjp0LG1heDplLHRpY2tzOlt0XX07Zm9yKHZhciBhPXtzY29yZTotMixsbWluOjAsbG1heDowLGxzdGVwOjB9LHM9MTtzPDEvMDspe2Zvcih2YXIgdT0wLGM9aTt1PGMubGVuZ3RoO3UrKyl7dmFyIGY9Y1t1XSxsPXpwKGYsaSxzKTtpZihOdW1iZXIuaXNOYU4obCkpdGhyb3cgbmV3IEVycm9yKFwiTmFOXCIpO2lmKG9bMF0qbCtvWzFdK29bMl0rb1szXTxhLnNjb3JlKXtzPTEvMDticmVha31mb3IodmFyIGQ9MjtkPDEvMDspe3ZhciBwPVdwKGQsbik7aWYob1swXSpsK29bMV0rb1syXSpwK29bM108YS5zY29yZSlicmVhaztmb3IodmFyIGc9KGUtdCkvKGQrMSkvcy9mLHY9TWF0aC5jZWlsKE1hdGgubG9nMTAoZykpO3Y8MS8wOyl7dmFyIHk9cypmKk1hdGgucG93KDEwLHYpLG09WXAodCxlLHkqKGQtMSkpO2lmKG9bMF0qbCtvWzFdKm0rb1syXSpwK29bM108YS5zY29yZSlicmVhazt2YXIgYj1NYXRoLmZsb29yKGUveSkqcy0oZC0xKSpzLHg9TWF0aC5jZWlsKHQveSkqcztpZihiPngpdis9MTtlbHNle2Zvcih2YXIgdz1iO3c8PXg7dys9MSl7dmFyIFM9dyooeS9zKSxFPVMreSooZC0xKSxfPXksTz1VcChmLGkscyxTLEUsXyksaz1YcCh0LGUsUyxFKSxNPVZwKGQsbix0LGUsUyxFKSxBPW9bMF0qTytvWzFdKmsrb1syXSpNKzEqb1szXTtBPmEuc2NvcmUmJighcnx8Uzw9dCYmRT49ZSkmJihhLmxtaW49UyxhLmxtYXg9RSxhLmxzdGVwPV8sYS5zY29yZT1BKX12Kz0xfX1kKz0xfX1zKz0xfWZvcih2YXIgVD1OdW1iZXIuaXNJbnRlZ2VyKGEubHN0ZXApPzA6TWF0aC5jZWlsKE1hdGguYWJzKE1hdGgubG9nMTAoYS5sc3RlcCkpKSxDPVtdLEk9YS5sbWluO0k8PWEubG1heDtJKz1hLmxzdGVwKUMucHVzaChJKTt2YXIgUD1UP09iamVjdChoLnopKEMsKGZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIucGFyc2VGbG9hdCh0LnRvRml4ZWQoVCkpfSkpOkM7cmV0dXJue21pbjpNYXRoLm1pbih0LE9iamVjdChoLmspKFApKSxtYXg6TWF0aC5tYXgoZSxPYmplY3QoaC55KShQKSksdGlja3M6UH19ZnVuY3Rpb24gcXAodCl7dmFyIGU9dC52YWx1ZXMsbj10LnRpY2tJbnRlcnZhbCxyPXQudGlja0NvdW50LGk9ZTtpZihPYmplY3QoaC50KShuKSlyZXR1cm4gT2JqZWN0KGguZykoaSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZSVuPT0wfSkpO3ZhciBvPXQubWluLGE9dC5tYXg7aWYoT2JqZWN0KGgucykobykmJihvPTApLE9iamVjdChoLnMpKGEpJiYoYT1lLmxlbmd0aC0xKSxPYmplY3QoaC50KShyKSYmcjxhLW8pe3ZhciBzPUhwKG8sYSxyLCExLFsxLDIsNSwzLDQsNyw2LDgsOV0pLnRpY2tzO3JldHVybiBPYmplY3QoaC5nKShzLChmdW5jdGlvbih0KXtyZXR1cm4gdD49byYmdDw9YX0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSkpfXJldHVybiBlLnNsaWNlKG8sYSsxKX12YXIgS3A9TWF0aC5zcXJ0KDUwKSxacD1NYXRoLnNxcnQoMTApLFFwPU1hdGguc3FydCgyKSxKcD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9kb21haW49WzAsMV19cmV0dXJuIHQucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gdD8odGhpcy5fZG9tYWluPUFycmF5LmZyb20odCxOdW1iZXIpLHRoaXMpOnRoaXMuX2RvbWFpbi5zbGljZSgpfSx0LnByb3RvdHlwZS5uaWNlPWZ1bmN0aW9uKHQpe3ZhciBlLG47dm9pZCAwPT09dCYmKHQ9NSk7dmFyIHIsaT10aGlzLl9kb21haW4uc2xpY2UoKSxvPTAsYT10aGlzLl9kb21haW4ubGVuZ3RoLTEscz10aGlzLl9kb21haW5bb10sdT10aGlzLl9kb21haW5bYV07cmV0dXJuIHU8cyYmKHM9KGU9W3Usc10pWzBdLHU9ZVsxXSxvPShuPVthLG9dKVswXSxhPW5bMV0pLChyPSRwKHMsdSx0KSk+MD9yPSRwKHM9TWF0aC5mbG9vcihzL3IpKnIsdT1NYXRoLmNlaWwodS9yKSpyLHQpOnI8MCYmKHI9JHAocz1NYXRoLmNlaWwocypyKS9yLHU9TWF0aC5mbG9vcih1KnIpL3IsdCkpLHI+MD8oaVtvXT1NYXRoLmZsb29yKHMvcikqcixpW2FdPU1hdGguY2VpbCh1L3IpKnIsdGhpcy5kb21haW4oaSkpOnI8MCYmKGlbb109TWF0aC5jZWlsKHMqcikvcixpW2FdPU1hdGguZmxvb3IodSpyKS9yLHRoaXMuZG9tYWluKGkpKSx0aGlzfSx0LnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9NSksZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbyxhLHM9LTE7aWYobj0rbiwodD0rdCk9PT0oZT0rZSkmJm4+MClyZXR1cm5bdF07KHI9ZTx0KSYmKGk9dCx0PWUsZT1pKTtpZigwPT09KGE9JHAodCxlLG4pKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxlPU1hdGguZmxvb3IoZS9hKSxvPW5ldyBBcnJheShpPU1hdGguY2VpbChlLXQrMSkpOysrczxpOylvW3NdPSh0K3MpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksZT1NYXRoLmNlaWwoZSphKSxvPW5ldyBBcnJheShpPU1hdGguY2VpbCh0LWUrMSkpOysrczxpOylvW3NdPSh0LXMpL2E7ciYmby5yZXZlcnNlKCk7cmV0dXJuIG99KHRoaXMuX2RvbWFpblswXSx0aGlzLl9kb21haW5bdGhpcy5fZG9tYWluLmxlbmd0aC0xXSx0fHw1KX0sdH0oKTtmdW5jdGlvbiAkcCh0LGUsbil7dmFyIHI9KGUtdCkvTWF0aC5tYXgoMCxuKSxpPU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjEwKSxvPXIvTWF0aC5wb3coMTAsaSk7cmV0dXJuIGk+PTA/KG8+PUtwPzEwOm8+PVpwPzU6bz49UXA/MjoxKSpNYXRoLnBvdygxMCxpKTotTWF0aC5wb3coMTAsLWkpLyhvPj1LcD8xMDpvPj1acD81Om8+PVFwPzI6MSl9ZnVuY3Rpb24gdGcodCxlLG4pe3JldHVybihcImNlaWxcIj09PW4/TWF0aC5jZWlsKHQvZSk6XCJmbG9vclwiPT09bj9NYXRoLmZsb29yKHQvZSk6TWF0aC5yb3VuZCh0L2UpKSplfWZ1bmN0aW9uIGVnKHQsZSxuKXt2YXIgcj10Zyh0LG4sXCJmbG9vclwiKSxpPXRnKGUsbixcImNlaWxcIik7cj1PYmplY3QoaC5oKShyLG4pLGk9T2JqZWN0KGguaCkoaSxuKTtmb3IodmFyIG89W10sYT1yO2E8PWk7YSs9bil7dmFyIHM9T2JqZWN0KGguaCkoYSxuKTtvLnB1c2gocyl9cmV0dXJue21pbjpyLG1heDppLHRpY2tzOm99fWZ1bmN0aW9uIG5nKHQsZSxuKXt2YXIgcixpPXQubWluTGltaXQsbz10Lm1heExpbWl0LGE9dC5taW4scz10Lm1heCx1PXQudGlja0NvdW50LGM9dm9pZCAwPT09dT81OnUsZj1PYmplY3QoaC5zKShpKT9PYmplY3QoaC5zKShlKT9hOmU6aSxsPU9iamVjdChoLnMpKG8pP09iamVjdChoLnMpKG4pP3M6bjpvO2lmKGY+bCYmKGw9KHI9W2YsbF0pWzBdLGY9clsxXSksYzw9MilyZXR1cm5bZixsXTtmb3IodmFyIGQ9KGwtZikvKGMtMSkscD1bXSxnPTA7ZzxjO2crKylwLnB1c2goZitkKmcpO3JldHVybiBwfWZ1bmN0aW9uIHJnKHQsZSxuKXt2b2lkIDA9PT1uJiYobj01KTt2YXIgcj17bWF4OjAsbWluOjAsdGlja3M6W119O2lmKHQ9PT1lKXJldHVybnttYXg6ZSxtaW46dCx0aWNrczpbdF19O3ZhciBpPShlLXQpL24sbz1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nMTAoaSkpKSxhPW88MT9NYXRoLmNlaWwoTWF0aC5hYnMoTWF0aC5sb2cxMChvKSkpOjAscz1vOzIqby1pPDEuNSooaS1zKSYmNSpvLWk8Mi43NSooaS0ocz0yKm8pKSYmMTAqby1pPDEuNSooaS0ocz01Km8pKSYmKHM9MTAqbyk7dmFyIHU9TWF0aC5jZWlsKGUvcyksYz1NYXRoLmZsb29yKHQvcyk7ci5tYXg9TWF0aC5tYXgodSpzLGUpLHIubWluPU1hdGgubWluKGMqcyx0KTtmb3IodmFyIGY9TnVtYmVyLnBhcnNlRmxvYXQoKGMqcykudG9GaXhlZChhKSk7ZjxlOylyLnRpY2tzLnB1c2goZiksZis9cyxhJiYoZj1OdW1iZXIucGFyc2VGbG9hdChmLnRvRml4ZWQoYSkpKTtyZXR1cm4gci50aWNrcy5wdXNoKGYpLHJ9ZnVuY3Rpb24gaWcodCxlKXt2YXIgbj10Lmxlbmd0aCplO3JldHVybiAxPT09ZT90W3QubGVuZ3RoLTFdOjA9PT1lP3RbMF06biUxIT0wP3RbTWF0aC5jZWlsKG4pLTFdOnQubGVuZ3RoJTI9PTA/KHRbbi0xXSt0W25dKS8yOnRbbl19ZnVuY3Rpb24gb2codCl7cmV0dXJuIG5ldyBEYXRlKHQpLmdldEZ1bGxZZWFyKCl9ZnVuY3Rpb24gYWcodCl7cmV0dXJuIG5ldyBEYXRlKHQsMCwxKS5nZXRUaW1lKCl9ZnVuY3Rpb24gc2codCl7cmV0dXJuIG5ldyBEYXRlKHQpLmdldE1vbnRoKCl9ZnVuY3Rpb24gdWcodCxlKXtyZXR1cm4gbmV3IERhdGUodCxlLDEpLmdldFRpbWUoKX1WZChcImNhdFwiLHFwKSxWZChcInRpbWUtY2F0XCIsKGZ1bmN0aW9uKHQpe3ZhciBlPXFwKHQpLG49T2JqZWN0KGgueSkodC52YWx1ZXMpO3JldHVybiBuIT09T2JqZWN0KGgueSkoZSkmJmUucHVzaChuKSxlfSkpLFZkKFwid2lsa2luc29uLWV4dGVuZGVkXCIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQubWluLG49dC5tYXgscj10LnRpY2tDb3VudCxpPXQubmljZSxvPXQudGlja0ludGVydmFsLGE9dC5taW5MaW1pdCxzPXQubWF4TGltaXQsdT1IcChlLG4scixpKS50aWNrcztyZXR1cm4gT2JqZWN0KGgucykoYSkmJk9iamVjdChoLnMpKHMpP28/ZWcoZSxuLG8pLnRpY2tzOnU6bmcodCxPYmplY3QoaC5rKSh1KSxPYmplY3QoaC55KSh1KSl9KSksVmQoXCJyLXByZXR0eVwiLChmdW5jdGlvbih0KXt2YXIgZT10Lm1pbixuPXQubWF4LHI9dC50aWNrQ291bnQsaT10LnRpY2tJbnRlcnZhbCxvPXQubWluTGltaXQsYT10Lm1heExpbWl0LHM9cmcoZSxuLHIpLnRpY2tzO3JldHVybiBPYmplY3QoaC5zKShvKSYmT2JqZWN0KGgucykoYSk/aT9lZyhlLG4saSkudGlja3M6czpuZyh0LE9iamVjdChoLmspKHMpLE9iamVjdChoLnkpKHMpKX0pKSxWZChcInRpbWVcIiwoZnVuY3Rpb24odCl7dmFyIGU9dC5taW4sbj10Lm1heCxyPXQubWluVGlja0ludGVydmFsLGk9dC50aWNrSW50ZXJ2YWwsbz10LnRpY2tDb3VudDtpZihpKW89TWF0aC5jZWlsKChuLWUpL2kpO2Vsc2V7dmFyIGE9KG4tZSkvKGk9X3AoZSxuLG8pWzFdKS9vO2E+MSYmKGkqPU1hdGguY2VpbChhKSksciYmaTxyJiYoaT1yKX1mb3IodmFyIHM9W10sdT1lO3U8bitpO3UrPWkpcy5wdXNoKHUpO3JldHVybiBzfSkpLFZkKFwidGltZS1wcmV0dHlcIiwoZnVuY3Rpb24odCl7dmFyIGU9dC5taW4sbj10Lm1heCxyPXQubWluVGlja0ludGVydmFsLGk9dC50aWNrQ291bnQsbz10LnRpY2tJbnRlcnZhbCxhPVtdO298fChvPShuLWUpL2ksciYmbzxyJiYobz1yKSk7dmFyIHM9b2coZSk7aWYobz4zMTUzNmU2KWZvcih2YXIgdT1vZyhuKSxjPU1hdGguY2VpbChvLzMxNTM2ZTYpLGY9cztmPD11K2M7Zis9YylhLnB1c2goYWcoZikpO2Vsc2UgaWYobz5TcCl7dmFyIGw9TWF0aC5jZWlsKG8vU3ApLGg9c2coZSksZD1mdW5jdGlvbih0LGUpe3ZhciBuPW9nKHQpLHI9b2coZSksaT1zZyh0KTtyZXR1cm4gMTIqKHItbikrKHNnKGUpLWkpJTEyfShlLG4pO2ZvcihmPTA7Zjw9ZCtsO2YrPWwpYS5wdXNoKHVnKHMsZitoKSl9ZWxzZSBpZihvPndwKXt2YXIgcD0oYj1uZXcgRGF0ZShlKSkuZ2V0RnVsbFllYXIoKSxnPWIuZ2V0TW9udGgoKSx2PWIuZ2V0RGF0ZSgpLHk9TWF0aC5jZWlsKG8vd3ApLG09ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5jZWlsKChlLXQpL3dwKX0oZSxuKTtmb3IoZj0wO2Y8bSt5O2YrPXkpYS5wdXNoKG5ldyBEYXRlKHAsZyx2K2YpLmdldFRpbWUoKSl9ZWxzZSBpZihvPnhwKXtwPShiPW5ldyBEYXRlKGUpKS5nZXRGdWxsWWVhcigpLGc9Yi5nZXRNb250aCgpLHk9Yi5nZXREYXRlKCk7dmFyIGIseD1iLmdldEhvdXJzKCksdz1NYXRoLmNlaWwoby94cCksUz1mdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLmNlaWwoKGUtdCkveHApfShlLG4pO2ZvcihmPTA7Zjw9Uyt3O2YrPXcpYS5wdXNoKG5ldyBEYXRlKHAsZyx5LHgrZikuZ2V0VGltZSgpKX1lbHNlIGlmKG8+NmU0KXt2YXIgRT1mdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLmNlaWwoKGUtdCkvNmU0KX0oZSxuKSxfPU1hdGguY2VpbChvLzZlNCk7Zm9yKGY9MDtmPD1FK187Zis9XylhLnB1c2goZSs2ZTQqZil9ZWxzZXt2YXIgTz1vO088MWUzJiYoTz0xZTMpO3ZhciBrPTFlMypNYXRoLmZsb29yKGUvMWUzKSxNPU1hdGguY2VpbCgobi1lKS8xZTMpLEE9TWF0aC5jZWlsKE8vMWUzKTtmb3IoZj0wO2Y8TStBO2YrPUEpYS5wdXNoKGsrMWUzKmYpfXJldHVybiBhLmxlbmd0aD49NTEyJiZjb25zb2xlLndhcm4oXCJOb3RpY2U6IGN1cnJlbnQgdGlja3MgbGVuZ3RoKFwiK2EubGVuZ3RoKycpID49IDUxMiwgbWF5IGNhdXNlIHBlcmZvcm1hbmNlIGlzc3VlcywgZXZlbiBvdXQgb2YgbWVtb3J5LiBCZWNhdXNlIG9mIHRoZSBjb25maWd1cmUgXCJ0aWNrSW50ZXJ2YWxcIihpbiBtaWxsaXNlY29uZHMsIGN1cnJlbnQgaXMgJytvK1wiKSBpcyB0b28gc21hbGwsIGluY3JlYXNlIHRoZSB2YWx1ZSB0byBzb2x2ZSB0aGUgcHJvYmxlbSFcIiksYX0pKSxWZChcImxvZ1wiLChmdW5jdGlvbih0KXt2YXIgZSxuPXQuYmFzZSxyPXQudGlja0NvdW50LGk9dC5taW4sbz10Lm1heCxhPXQudmFsdWVzLHM9VHAobixvKTtpZihpPjApZT1NYXRoLmZsb29yKFRwKG4saSkpO2Vsc2V7dmFyIHU9Q3AoYSxuLG8pO2U9TWF0aC5mbG9vcihUcChuLHUpKX1mb3IodmFyIGM9cy1lLGY9TWF0aC5jZWlsKGMvciksbD1bXSxoPWU7aDxzK2Y7aCs9ZilsLnB1c2goTWF0aC5wb3cobixoKSk7cmV0dXJuIGk8PTAmJmwudW5zaGlmdCgwKSxsfSkpLFZkKFwicG93XCIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZXhwb25lbnQsbj10LnRpY2tDb3VudCxyPU1hdGguY2VpbChBcChlLHQubWF4KSk7cmV0dXJuIHJnKE1hdGguZmxvb3IoQXAoZSx0Lm1pbikpLHIsbikudGlja3MubWFwKChmdW5jdGlvbih0KXt2YXIgbj10Pj0wPzE6LTE7cmV0dXJuIE1hdGgucG93KHQsZSkqbn0pKX0pKSxWZChcInF1YW50aWxlXCIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQudGlja0NvdW50LG49dC52YWx1ZXM7aWYoIW58fCFuLmxlbmd0aClyZXR1cm5bXTtmb3IodmFyIHI9bi5zbGljZSgpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pKSxpPVtdLG89MDtvPGU7bysrKXt2YXIgYT1vLyhlLTEpO2kucHVzaChpZyhyLGEpKX1yZXR1cm4gaX0pKSxWZChcImQzLWxpbmVhclwiLChmdW5jdGlvbih0KXt2YXIgZT10Lm1pbixuPXQubWF4LHI9dC50aWNrSW50ZXJ2YWwsaT10Lm1pbkxpbWl0LG89dC5tYXhMaW1pdCxhPWZ1bmN0aW9uKHQpe3ZhciBlPXQubWluLG49dC5tYXgscj10Lm5pY2UsaT10LnRpY2tDb3VudCxvPW5ldyBKcDtyZXR1cm4gby5kb21haW4oW2Usbl0pLHImJm8ubmljZShpKSxvLnRpY2tzKGkpfSh0KTtyZXR1cm4gT2JqZWN0KGgucykoaSkmJk9iamVjdChoLnMpKG8pP3I/ZWcoZSxuLHIpLnRpY2tzOmE6bmcodCxPYmplY3QoaC5rKShhKSxPYmplY3QoaC55KShhKSl9KSksTHAoXCJjYXRcIixYZCksTHAoXCJjYXRlZ29yeVwiLFhkKSxMcChcImlkZW50aXR5XCIsQnApLExwKFwibGluZWFyXCIsTXApLExwKFwibG9nXCIsSXApLExwKFwicG93XCIsUHApLExwKFwidGltZVwiLGpwKSxMcChcInRpbWVDYXRcIixPcCksTHAoXCJxdWFudGl6ZVwiLERwKSxMcChcInF1YW50aWxlXCIsTnApO3ZhciBjZz1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MCxuPWFyZ3VtZW50cy5sZW5ndGg7ZTxuO2UrKyl0Kz1hcmd1bWVudHNbZV0ubGVuZ3RoO3ZhciByPUFycmF5KHQpLGk9MDtmb3IoZT0wO2U8bjtlKyspZm9yKHZhciBvPWFyZ3VtZW50c1tlXSxhPTAscz1vLmxlbmd0aDthPHM7YSsrLGkrKylyW2ldPW9bYV07cmV0dXJuIHJ9O2Z1bmN0aW9uIGZnKHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KGgueikodCwoZnVuY3Rpb24odCxlKXtyZXR1cm5bMD09PWU/XCJNXCI6XCJMXCIsdFswXSx0WzFdXX0pKX0odCl9ZnVuY3Rpb24gbGcodCxlLG4scil7dm9pZCAwPT09ciYmKHI9ITApO3ZhciBpPW5ldyBNcCh7dmFsdWVzOnR9KSxvPW5ldyBYZCh7dmFsdWVzOk9iamVjdChoLnopKHQsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9KSl9KSxhPU9iamVjdChoLnopKHQsKGZ1bmN0aW9uKHQscil7cmV0dXJuW28uc2NhbGUocikqZSxuLWkuc2NhbGUodCkqbl19KSk7cmV0dXJuIHI/ZnVuY3Rpb24odCl7aWYodC5sZW5ndGg8PTIpcmV0dXJuIGZnKHQpO3ZhciBlPVtdO09iamVjdChoLmYpKHQsKGZ1bmN0aW9uKHQpe09iamVjdChoLnEpKHQsZS5zbGljZShlLmxlbmd0aC0yKSl8fGUucHVzaCh0WzBdLHRbMV0pfSkpO3ZhciBuPWZlLmEoZSwhMSkscj1PYmplY3QoaC5rKSh0KSxpPXJbMF0sbz1yWzFdO3JldHVybiBuLnVuc2hpZnQoW1wiTVwiLGksb10pLG59KGEpOmZnKGEpfWZ1bmN0aW9uIGhnKHQsZSxuKXtmb3IodmFyIHI9bmV3IE1wKHt2YWx1ZXM6dH0pLGk9bmV3IFhkKHt2YWx1ZXM6T2JqZWN0KGgueikodCwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0pKX0pLG89T2JqZWN0KGgueikodCwoZnVuY3Rpb24odCxvKXtyZXR1cm5baS5zY2FsZShvKSplLG4tci5zY2FsZSh0KSpuXX0pKSxhPVtdLHM9MDtzPG8ubGVuZ3RoO3MrKyl7dmFyIHU9b1tzXSxjPXBnKHt4OnVbMF0seTp1WzFdLHkwOm4sc2l6ZTo1fSk7YS5wdXNoLmFwcGx5KGEsYyl9cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9ITApO3ZhciBuPVtdLHI9dFswXTtuLnB1c2goW1wiTVwiLHIueCxyLnldKTtmb3IodmFyIGk9MSxvPXQubGVuZ3RoO2k8bztpKyspbi5wdXNoKFtcIkxcIix0W2ldLngsdFtpXS55XSk7ZSYmKG4ucHVzaChbXCJMXCIsci54LHIueV0pLG4ucHVzaChbXCJ6XCJdKSk7cmV0dXJuIG59KGEpfWZ1bmN0aW9uIGRnKHQsZSxuLHIpe3ZhciBpPWNnKHQpLG89ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgTXAoe3ZhbHVlczp0fSkscj1NYXRoLm1heCgwLG4ubWluKTtyZXR1cm4gZS1uLnNjYWxlKHIpKmV9KHIsbik7cmV0dXJuIGkucHVzaChbXCJMXCIsZSxvXSksaS5wdXNoKFtcIkxcIiwwLG9dKSxpLnB1c2goW1wiWlwiXSksaX1mdW5jdGlvbiBwZyh0KXt2YXIgZSxuLHIsaSxvPXQueCxhPXQueSxzPXQueTAsdT10LnNpemU7T2JqZWN0KGgubSkoYSk/KGU9YVswXSxuPWFbMV0pOihlPXMsbj1hKSxPYmplY3QoaC5tKShvKT8ocj1vWzBdLGk9b1sxXSk6KHI9by11LzIsaT1vK3UvMik7dmFyIGM9W3t4OnIseTplfSx7eDpyLHk6bn1dO3JldHVybiBjLnB1c2goe3g6aSx5Om59LHt4OmkseTplfSksY312YXIgZ2c9ZnVuY3Rpb24oKXtyZXR1cm4oZ2c9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaSkmJih0W2ldPWVbaV0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx2Zz17c3Ryb2tlOlwiI0M1QzVDNVwiLHN0cm9rZU9wYWNpdHk6Ljg1fSx5Zz17ZmlsbDpcIiNDQUNFRDRcIixvcGFjaXR5Oi44NX0sbWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlPXQueCxuPXZvaWQgMD09PWU/MDplLHI9dC55LGk9dm9pZCAwPT09cj8wOnIsbz10LndpZHRoLGE9dm9pZCAwPT09bz8yMDA6byxzPXQuaGVpZ2h0LHU9dm9pZCAwPT09cz8yNjpzLGM9dC5zbW9vdGgsZj12b2lkIDA9PT1jfHxjLGw9dC5pc0FyZWEsaD12b2lkIDAhPT1sJiZsLGQ9dC5kYXRhLHA9dm9pZCAwPT09ZD9bXTpkLGc9dC5saW5lU3R5bGUsdj10LmFyZWFTdHlsZSx5PXQuZ3JvdXAsbT10LmludGVydmFsLGI9dm9pZCAwPT09bT9udWxsOm07dGhpcy5ncm91cD15LHRoaXMueD1uLHRoaXMueT1pLHRoaXMud2lkdGg9YSx0aGlzLmhlaWdodD11LHRoaXMuZGF0YT1wLHRoaXMuc21vb3RoPWYsdGhpcy5pc0FyZWE9aCx0aGlzLmxpbmVTdHlsZT1PYmplY3QuYXNzaWduKHt9LHZnLGcpLHRoaXMuYXJlYVN0eWxlPU9iamVjdC5hc3NpZ24oe30seWcsdiksdGhpcy5pbnRlcnZhbENvbmZpZz1iLHRoaXMucmVuZGVyTGluZSgpfXJldHVybiB0LnByb3RvdHlwZS5yZW5kZXJMaW5lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQueCxuPXQueSxyPXQud2lkdGgsaT10LmhlaWdodCxvPXQuZGF0YSxhPXQuc21vb3RoLHM9dC5pc0FyZWEsdT0odC5iYWNrZ3JvdW5kU3R5bGUsdC5saW5lU3R5bGUpLGM9dC5hcmVhU3R5bGUsZj10aGlzLmdyb3VwLmFkZEdyb3VwKHtuYW1lOlwidHJlbmQtZ3JvdXBcIn0pO2lmKG8pe3ZhciBsPWxnKG8scixpLGEpO2lmKGYuYWRkU2hhcGUoXCJwYXRoXCIse2F0dHJzOmdnKHtwYXRoOmx9LHUpfSkscyl7dmFyIGg9ZGcobCxyLGksbyk7Zi5hZGRTaGFwZShcInBhdGhcIix7YXR0cnM6Z2coe3BhdGg6aH0sYyl9KX19dGhpcy5pbnRlcnZhbENvbmZpZyYmZi5hZGRTaGFwZShcInBhdGhcIix7YXR0cnM6Z2coe3BhdGg6aGcodGhpcy5pbnRlcnZhbENvbmZpZy5kYXRhLHIsaSl9LHRoaXMuaW50ZXJ2YWxDb25maWcuc3R5bGUpfSksZi5tb3ZlKGUsbil9LHQucHJvdG90eXBlLmRlc3Rvcnk9ZnVuY3Rpb24oKXt0aGlzLmdyb3VwLmRlc3Ryb3koKX0sdH0oKSxiZz1mdW5jdGlvbigpe3JldHVybihiZz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgaSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHhnPXtmaWxsOlwiIzE4OTBmZlwiLHN0cm9rZTpcIiMxODkwZmZcIix0eXBlOlwidHJlbmRcIixyYWRpdXM6MixvcGFjaXR5OjEsY3Vyc29yOlwiZXctcmVzaXplXCIsaGlnaExpZ2h0RmlsbDpcIiMwMDUwYjNcIn0sd2c9e2ZpbGw6XCIjZmZmXCIsc3Ryb2tlOlwiIzE4OTBmZlwiLHJhZGl1czoyLG9wYWNpdHk6MSxjdXJzb3I6XCJldy1yZXNpemVcIn0sU2c9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlPXQuZ3JvdXAsbj10Lm5hbWUscj10LnR5cGUsaT10Lngsbz12b2lkIDA9PT1pPzA6aSxhPXQueSxzPXZvaWQgMD09PWE/MDphLHU9dC53aWR0aCxjPXZvaWQgMD09PXU/Mjp1LGY9dC5oZWlnaHQsbD12b2lkIDA9PT1mPzI0OmYsaD10LnN0eWxlLGQ9dm9pZCAwPT09aD97fTpoO3RoaXMuZ3JvdXA9ZSx0aGlzLm5hbWU9bix0aGlzLmhhbmRsZVR5cGU9cix0aGlzLng9byx0aGlzLnk9cyx0aGlzLndpZHRoPWMsdGhpcy5oZWlnaHQ9bCxcInRyZW5kXCI9PT1yP3RoaXMuc3R5bGU9YmcoYmcoe30seGcpLGQpOlwic2ltcGxlXCI9PT1yJiYodGhpcy5zdHlsZT1iZyhiZyh7fSx3ZyksZCkpLHRoaXMucmVuZGVySGFuZGxlKCl9cmV0dXJuIHQucHJvdG90eXBlLnNldFg9ZnVuY3Rpb24odCl7dGhpcy5zZXRYWSh0LHZvaWQgMCl9LHQucHJvdG90eXBlLnNldFk9ZnVuY3Rpb24odCl7dGhpcy5zZXRYWSh2b2lkIDAsdCl9LHQucHJvdG90eXBlLnNldFhZPWZ1bmN0aW9uKHQsZSl7T2JqZWN0KGgudCkodCkmJih0aGlzLng9dCksT2JqZWN0KGgudCkoZSkmJih0aGlzLnk9ZSksdGhpcy51cGRhdGVYWSgpfSx0LnByb3RvdHlwZS5yZW5kZXJIYW5kbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLndpZHRoLGU9dGhpcy5oZWlnaHQsbj10aGlzLnN0eWxlLHI9dGhpcy5uYW1lLGk9bi5maWxsLG89bi5zdHJva2UsYT1uLnJhZGl1cyxzPW4ub3BhY2l0eSx1PW4uY3Vyc29yO3RoaXMuaGFuZGxlR3JvdXA9dGhpcy5ncm91cC5hZGRHcm91cCgpLFwidHJlbmRcIj09PXRoaXMuaGFuZGxlVHlwZT8odGhpcy5iYWNrZ3JvdW5kPXRoaXMuaGFuZGxlR3JvdXAuYWRkU2hhcGUoXCJyZWN0XCIse2F0dHJzOnt4OjAseTowLHdpZHRoOnQsaGVpZ2h0OmUsZmlsbDppLHN0cm9rZTpvLHJhZGl1czphLG9wYWNpdHk6cyxjdXJzb3I6dX0sbmFtZTpyK1wiLWhhbmRsZXJcIn0pLHRoaXMuaGFuZGxlR3JvdXAuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6e3g6dC8yLHk6MCxyOjIqdCxmaWxsOmksc3Ryb2tlOm8scmFkaXVzOmEsb3BhY2l0eTpzLGN1cnNvcjp1fSxuYW1lOnIrXCItaGFuZGxlclwifSksdGhpcy5oYW5kbGVHcm91cC5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczp7eDp0LzIseTplLHI6Mip0LGZpbGw6aSxzdHJva2U6byxyYWRpdXM6YSxvcGFjaXR5OnMsY3Vyc29yOnV9LG5hbWU6citcIi1oYW5kbGVyXCJ9KSk6XCJzaW1wbGVcIj09PXRoaXMuaGFuZGxlVHlwZSYmKHRoaXMuaGFuZGxlR3JvdXAuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6e3g6dC8yLHk6ZS8yLHI6Mip0LGZpbGw6aSxzdHJva2U6byxyYWRpdXM6YSxvcGFjaXR5OnMsY3Vyc29yOnV9LG5hbWU6citcIi1oYW5kbGVyXCJ9KSx0aGlzLmhhbmRsZUdyb3VwLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOnt4OnQvMix5OmUvMixyOjIqdCxmaWxsOmksc3Ryb2tlOm8scmFkaXVzOmEsb3BhY2l0eTpzLGN1cnNvcjp1fSxuYW1lOnIrXCItaGFuZGxlclwifSkpLHRoaXMudXBkYXRlWFkoKSxcInRyZW5kXCI9PT10aGlzLmhhbmRsZVR5cGUmJnRoaXMuYmluZEV2ZW50cygpfSx0LnByb3RvdHlwZS5iaW5kRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMubmFtZTt0aGlzLmhhbmRsZUdyb3VwLm9uKGUrXCItaGFuZGxlcjptb3VzZWVudGVyXCIsKGZ1bmN0aW9uKCl7dmFyIGU9dC5zdHlsZS5oaWdoTGlnaHRGaWxsO3QuYmFja2dyb3VuZC5hdHRyKFwiZmlsbFwiLGUpfSkpLHRoaXMuaGFuZGxlR3JvdXAub24oZStcIi1oYW5kbGVyOm1vdXNlbGVhdmVcIiwoZnVuY3Rpb24oKXt2YXIgZT10LnN0eWxlLmZpbGw7dC5iYWNrZ3JvdW5kLmF0dHIoXCJmaWxsXCIsZSl9KSl9LHQucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZUdyb3VwLnNob3coKX0sdC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuaGFuZGxlR3JvdXAuaGlkZSgpfSx0LnByb3RvdHlwZS51cGRhdGVYWT1mdW5jdGlvbigpe3RoaXMuaGFuZGxlR3JvdXAuc2V0TWF0cml4KFsxLDAsMCwwLDEsMCx0aGlzLngsdGhpcy55LDFdKX0sdH0oKSxFZz1mdW5jdGlvbigpe3JldHVybihFZz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgaSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9nPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmNvbmZpZz1PYmplY3QoaC5lKSh7fSx0KSx0aGlzLmluaXQoKX1yZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuY29uZmlnPU9iamVjdChoLmUpKHt9LHRoaXMuY29uZmlnLHQpLHRoaXMudXBkYXRlRWxlbWVudCgpLHRoaXMucmVuZGVyTWFya2VyKCl9LHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmluaXRFbGVtZW50KCksdGhpcy5yZW5kZXJNYXJrZXIoKX0sdC5wcm90b3R5cGUuaW5pdEVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbmZpZyxlPXQuZ3JvdXAsbj10LnN0eWxlO3RoaXMuY2lyY2xlPWUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6RWcoe3g6dGhpcy5jb25maWcueCx5OnRoaXMuY29uZmlnLnkscjp0aGlzLmNvbmZpZy5yfSxuKX0pLHRoaXMuc3RhcnRNYXJrZXI9ZS5hZGRTaGFwZShcInBhdGhcIix7YXR0cnM6e3BhdGg6dGhpcy5nZXRTdGFydE1hcmtlclBhdGgoKSxmaWxsOlwiI2NjY1wifSxuYW1lOlwicGxheVBhdXNlQnRuXCJ9KSx0aGlzLnBhdXNlR3JvdXBNYXJrZXI9ZS5hZGRHcm91cCgpO3ZhciByPTEvNCp0aGlzLmNvbmZpZy5yLGk9LjUqdGhpcy5jb25maWcucipNYXRoLnNxcnQoMyk7dGhpcy5wYXVzZUdyb3VwTWFya2VyLmFkZFNoYXBlKFwicmVjdFwiLHthdHRyczp7eDp0aGlzLmNvbmZpZy54LS4zNzUqdGhpcy5jb25maWcucix5OnRoaXMuY29uZmlnLnktaS8yLHdpZHRoOjIuNSpyLGhlaWdodDppLGZpbGw6XCIjZmZmXCJ9LG5hbWU6XCJwbGF5UGF1c2VCdG5cIn0pLHRoaXMucGF1c2VMZWZ0TWFya2VyPXRoaXMucGF1c2VHcm91cE1hcmtlci5hZGRTaGFwZShcInJlY3RcIix7YXR0cnM6e3g6dGhpcy5jb25maWcueC0uMzc1KnRoaXMuY29uZmlnLnIseTp0aGlzLmNvbmZpZy55LWkvMix3aWR0aDpyLGhlaWdodDppLGZpbGw6XCIjY2NjXCJ9LG5hbWU6XCJwbGF5UGF1c2VCdG5cIn0pLHRoaXMucGF1c2VSaWdodE1hcmtlcj10aGlzLnBhdXNlR3JvdXBNYXJrZXIuYWRkU2hhcGUoXCJyZWN0XCIse2F0dHJzOnt4OnRoaXMuY29uZmlnLngrMS84KnRoaXMuY29uZmlnLnIseTp0aGlzLmNvbmZpZy55LWkvMix3aWR0aDpyLGhlaWdodDppLGZpbGw6XCIjY2NjXCJ9LG5hbWU6XCJwbGF5UGF1c2VCdG5cIn0pfSx0LnByb3RvdHlwZS51cGRhdGVFbGVtZW50PWZ1bmN0aW9uKCl7dGhpcy5jaXJjbGUuYXR0cihcInhcIix0aGlzLmNvbmZpZy54KSx0aGlzLmNpcmNsZS5hdHRyKFwieVwiLHRoaXMuY29uZmlnLnkpLHRoaXMuY2lyY2xlLmF0dHIoXCJyXCIsdGhpcy5jb25maWcuciksdGhpcy5zdGFydE1hcmtlci5hdHRyKFwicGF0aFwiLHRoaXMuZ2V0U3RhcnRNYXJrZXJQYXRoKCkpO3ZhciB0PTEvNCp0aGlzLmNvbmZpZy5yLGU9LjUqdGhpcy5jb25maWcucipNYXRoLnNxcnQoMyk7dGhpcy5wYXVzZUxlZnRNYXJrZXIuYXR0cihcInhcIix0aGlzLmNvbmZpZy54LS4zNzUqdGhpcy5jb25maWcuciksdGhpcy5wYXVzZUxlZnRNYXJrZXIuYXR0cihcInlcIix0aGlzLmNvbmZpZy55LWUvMiksdGhpcy5wYXVzZUxlZnRNYXJrZXIuYXR0cihcIndpZHRoXCIsdCksdGhpcy5wYXVzZUxlZnRNYXJrZXIuYXR0cihcImhlaWdodFwiLGUpLHRoaXMucGF1c2VSaWdodE1hcmtlci5hdHRyKFwieFwiLHRoaXMuY29uZmlnLngrMS84KnRoaXMuY29uZmlnLnIpLHRoaXMucGF1c2VSaWdodE1hcmtlci5hdHRyKFwieVwiLHRoaXMuY29uZmlnLnktZS8yKSx0aGlzLnBhdXNlUmlnaHRNYXJrZXIuYXR0cihcIndpZHRoXCIsdCksdGhpcy5wYXVzZVJpZ2h0TWFya2VyLmF0dHIoXCJoZWlnaHRcIixlKX0sdC5wcm90b3R5cGUucmVuZGVyTWFya2VyPWZ1bmN0aW9uKCl7dGhpcy5jb25maWcuaXNQbGF5Pyh0aGlzLnN0YXJ0TWFya2VyLmhpZGUoKSx0aGlzLnBhdXNlR3JvdXBNYXJrZXIuc2hvdygpKToodGhpcy5zdGFydE1hcmtlci5zaG93KCksdGhpcy5wYXVzZUdyb3VwTWFya2VyLmhpZGUoKSl9LHQucHJvdG90eXBlLmdldFN0YXJ0TWFya2VyUGF0aD1mdW5jdGlvbigpe3ZhciB0PS41KnRoaXMuY29uZmlnLnIqTWF0aC5zcXJ0KDMpO3JldHVybltbXCJNXCIsdGhpcy5jb25maWcueC10L01hdGguc3FydCgzKS8yLHRoaXMuY29uZmlnLnktdC8yXSxbXCJMXCIsdGhpcy5jb25maWcueCt0L01hdGguc3FydCgzKSx0aGlzLmNvbmZpZy55XSxbXCJMXCIsdGhpcy5jb25maWcueC10L01hdGguc3FydCgzKS8yLHRoaXMuY29uZmlnLnkrdC8yXV19LHR9KCksT2c9ZnVuY3Rpb24oKXtyZXR1cm4oT2c9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaSkmJih0W2ldPWVbaV0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxrZz17ZmlsbDpcIiM2MDc4ODlcIixzdHJva2U6XCIjNjA3ODg5XCJ9LE1nPXtmaWxsOlwiI2ZmZlwifSxBZz17ZmlsbDpcImdyZWVuXCJ9LFRnPXtzcGVlZDoyLGxvb3A6ITEsZmlsbDpcIiNmZmZcIixzdHJva2U6XCIjZmZmXCIsaGlkZGxlVG9nZ2xlOiExLHByZUJ0blN0eWxlOntmaWxsOlwiI2NjY1wiLHN0cm9rZTpcIiNjY2NcIn0sbmV4dEJ0blN0eWxlOntmaWxsOlwiI2NjY1wiLHN0cm9rZTpcIiNjY2NcIn0scGxheUJ0blN0eWxlOntmaWxsOlwiI2ZmZlwiLHN0cm9rZTpcIiNjY2NcIn19LENnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmNvbnRyb2xsZXJDZmc9T2JqZWN0KGguZSkoe30sVGcsdCksdGhpcy5ncm91cD10Lmdyb3VwLHRoaXMuc3BlZWRBeGlzWT1bXSx0aGlzLmN1cnJlbnRTcGVlZD10aGlzLmNvbnRyb2xsZXJDZmcuc3BlZWQsdGhpcy5jdXJyZW50VHlwZT1cInJhbmdlXCIsdGhpcy5mb250RmFtaWx5PXQuZm9udEZhbWlseXx8XCJBcmlhbCwgc2Fucy1zZXJpZlwiLHRoaXMuaW5pdCgpfXJldHVybiB0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJQbGF5QnV0dG9uKCl9LHQucHJvdG90eXBlLmdldE5leHRNYXJrZXJQYXRoPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bW1wiTVwiLHQsZS1uXSxbXCJMXCIsdCtuLGVdLFtcIkxcIix0LGUrbl1dfSx0LnByb3RvdHlwZS5nZXRQcmVNYXJrZXJQYXRoPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bW1wiTVwiLHQsZS1uXSxbXCJMXCIsdC1uLGVdLFtcIkxcIix0LGUrbl1dfSx0LnByb3RvdHlwZS5yZW5kZXJQbGF5QnV0dG9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250cm9sbGVyQ2ZnLGU9dC53aWR0aCxuPXQuaGVpZ2h0LHI9dC54LGk9dC55LG89dC5oaWRkbGVUb2dnbGUsYT10LmZpbGwscz12b2lkIDA9PT1hP1wiI2NjY1wiOmEsdT10LnN0cm9rZSxjPXZvaWQgMD09PXU/XCJncmVlblwiOnUsZj10LnBsYXlCdG5TdHlsZSxsPXZvaWQgMD09PWY/a2c6ZixoPXQucHJlQnRuU3R5bGUsZD12b2lkIDA9PT1oP01nOmgscD10Lm5leHRCdG5TdHlsZSxnPXZvaWQgMD09PXA/QWc6cCx2PW4vMi01LHk9aSsxMCxtPXRoaXMuZ3JvdXAuYWRkU2hhcGUoXCJyZWN0XCIse2F0dHJzOnt4OnIseTp5LHdpZHRoOmUsaGVpZ2h0Om4sc3Ryb2tlOmMsZmlsbDpzfSxuYW1lOlwiY29udGFpbmVyLXJlY3RcIn0pO3RoaXMucGxheUJ1dHRvbj90aGlzLnBsYXlCdXR0b24udXBkYXRlKHt4OmUvMix5Onkscjp2fSk6dGhpcy5wbGF5QnV0dG9uPW5ldyBfZyh7Z3JvdXA6dGhpcy5ncm91cCx4OmUvMix5Onkrdis1LHI6dixpc1BsYXk6dGhpcy5pc1BsYXksc3R5bGU6bH0pLHRoaXMuZ3JvdXAuYWRkU2hhcGUoXCJwYXRoXCIse2F0dHJzOk9nKHtwYXRoOnRoaXMuZ2V0UHJlTWFya2VyUGF0aChlLzItNSp2LHkrdis1LC41KnYpfSxkKSxuYW1lOlwicHJlU3RlcEJ0blwifSksdGhpcy5ncm91cC5hZGRTaGFwZShcInBhdGhcIix7YXR0cnM6T2coe3BhdGg6dGhpcy5nZXRQcmVNYXJrZXJQYXRoKGUvMi00LjUqdix5K3YrNSwuNSp2KX0sZCksbmFtZTpcInByZVN0ZXBCdG5cIn0pLHRoaXMuZ3JvdXAuYWRkU2hhcGUoXCJwYXRoXCIse2F0dHJzOk9nKHtwYXRoOnRoaXMuZ2V0TmV4dE1hcmtlclBhdGgoZS8yKzUqdix5K3YrNSwuNSp2KX0sZyksbmFtZTpcIm5leHRTdGVwQnRuXCJ9KSx0aGlzLmdyb3VwLmFkZFNoYXBlKFwicGF0aFwiLHthdHRyczpPZyh7cGF0aDp0aGlzLmdldE5leHRNYXJrZXJQYXRoKGUvMis0LjUqdix5K3YrNSwuNSp2KX0sZyksbmFtZTpcIm5leHRTdGVwQnRuXCJ9KSxtLnRvQmFjaygpLHRoaXMucmVuZGVyU3BlZWRCdG4oKSxvfHx0aGlzLnJlbmRlclRvZ2dsZVRpbWUoKSx0aGlzLmJpbmRFdmVudCgpfSx0LnByb3RvdHlwZS5yZW5kZXJTcGVlZEJ0bj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udHJvbGxlckNmZyxlPXQueSxuPXQud2lkdGgscj10LmhpZGRsZVRvZ2dsZSxpPXRoaXMuZ3JvdXAuYWRkR3JvdXAoe25hbWU6XCJzcGVlZC1ncm91cFwifSk7dGhpcy5zcGVlZEdyb3VwPWk7Zm9yKHZhciBvPTEsYT1bXSxzPTksdT0wO3U8NTt1Kyspe3ZhciBjPWUrMTUrdSoodSsxKStvO2kuYWRkU2hhcGUoXCJyZWN0XCIse2F0dHJzOnt4Om4tKHI/NTA6MTEwKSx5OmMsd2lkdGg6MTUsaGVpZ2h0OjIsZmlsbDpcIiNjY2NcIn0sc3BlZWQ6cyxuYW1lOlwic3BlZWQtcmVjdFwifSksdGhpcy5zcGVlZEF4aXNZLnB1c2goYyksYS5wdXNoKHMpLHMtPTIsbysrfWZvcih1PTA7dTw0O3UrKylpLmFkZFNoYXBlKFwicmVjdFwiLHthdHRyczp7eDpuLShyPzUwOjExMCkseTp0aGlzLnNwZWVkQXhpc1lbdV0rMix3aWR0aDoxNSxoZWlnaHQ6Mip1KzEsZmlsbDpcIiNmZmZcIixvcGFjaXR5Oi4zfSxzcGVlZDphW3VdLTEsbmFtZTpcInNwZWVkLXJlY3RcIn0pO3RoaXMuc3BlZWRUZXh0PWkuYWRkU2hhcGUoXCJ0ZXh0XCIse2F0dHJzOnt4Om4tKHI/NTA6MTEwKSsyMCx5OnRoaXMuc3BlZWRBeGlzWVsxXSsxNSx0ZXh0OlwiMS4wWFwiLGZpbGw6XCIjY2NjXCIsZm9udEZhbWlseTp0aGlzLmZvbnRGYW1pbHl8fFwiQXJpYWwsIHNhbnMtc2VyaWZcIn19KSx0aGlzLnNwZWVkUG9pbnQ9aS5hZGRTaGFwZShcInBhdGhcIix7YXR0cnM6e3BhdGg6dGhpcy5nZXRQYXRoKG4tKHI/NTA6MTEwKSx0aGlzLnNwZWVkQXhpc1lbNF0pLGZpbGw6XCIjY2NjXCJ9fSl9LHQucHJvdG90eXBlLmdldFBhdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm5bW1wiTVwiLHQsZV0sW1wiTFwiLHQtMTIsZS02XSxbXCJMXCIsdC0xMixlKzZdLFtcIlpcIl1dfSx0LnByb3RvdHlwZS5yZW5kZXJUb2dnbGVUaW1lPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmNvbnRyb2xsZXJDZmcud2lkdGg7dGhpcy50b2dnbGVHcm91cD10aGlzLmdyb3VwLmFkZEdyb3VwKHtuYW1lOlwidG9nZ2xlLWdyb3VwXCJ9KSx0aGlzLnRvZ2dsZUdyb3VwLmFkZFNoYXBlKFwicmVjdFwiLHthdHRyczp7d2lkdGg6MTQsaGVpZ2h0OjE0LHg6ZS01MCx5OnRoaXMuc3BlZWRBeGlzWVsxXSxmaWxsOlwiI2ZmZlwiLHN0cm9rZTpcIiNjY2NcIixsaW5lV2lkdGg6MixyYWRpdXM6M30saXNDaGVja2VkOiExLG5hbWU6XCJ0b2dnbGUtbW9kZWxcIn0pLHRoaXMuY2hlY2tlZEljb249dGhpcy50b2dnbGVHcm91cC5hZGRTaGFwZShcInBhdGhcIix7YXR0cnM6e3BhdGg6W1tcIk1cIixlLTUwKzMsdGhpcy5zcGVlZEF4aXNZWzFdKzZdLFtcIkxcIixlLTUwKzcsdGhpcy5zcGVlZEF4aXNZWzFdKzEwXSxbXCJMXCIsZS01MCsxMix0aGlzLnNwZWVkQXhpc1lbMV0rNF1dLHN0cm9rZTpcImdyZWVuXCIsbGluZVdpZHRoOjN9LGNhcHR1cmU6ITF9KSx0aGlzLmNoZWNrZWRJY29uLmhpZGUoKSx0aGlzLmNoZWNrZWRUZXh0PXRoaXMudG9nZ2xlR3JvdXAuYWRkU2hhcGUoXCJ0ZXh0XCIse2F0dHJzOnt0ZXh0OihudWxsPT09KHQ9dGhpcy5jb250cm9sbGVyQ2ZnKXx8dm9pZCAwPT09dD92b2lkIDA6dC50aW1lUG9pbnRDb250cm9sbGVyVGV4dCl8fFwiw6XCjeKAosOkwrjigqzDpuKAlMK2w6nigJTCtFwiLHg6ZS01MCsyMCx5OnRoaXMuc3BlZWRBeGlzWVsxXSsxNSxmaWxsOlwiI2NjY1wiLGZvbnRGYW1pbHk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9udC1mYW1pbHlcIil8fFwiQXJpYWwsIHNhbnMtc2VyaWZcIn19KX0sdC5wcm90b3R5cGUuYmluZEV2ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuY29udHJvbGxlckNmZyxuPWUud2lkdGgscj1lLmhpZGRsZVRvZ2dsZTt0aGlzLnNwZWVkR3JvdXAub24oXCJzcGVlZC1yZWN0OmNsaWNrXCIsKGZ1bmN0aW9uKGUpe3Quc3BlZWRQb2ludC5hdHRyKFwicGF0aFwiLHQuZ2V0UGF0aChuLShyPzUwOjExMCksZS55KSksdC5jdXJyZW50U3BlZWQ9ZS50YXJnZXQuZ2V0KFwic3BlZWRcIiksdC5zcGVlZFRleHQuYXR0cihcInRleHRcIix0LmN1cnJlbnRTcGVlZCtcIi4wWFwiKSx0Lmdyb3VwLmVtaXQoXCJ0aW1lYmFyQ29uZmlnQ2hhbmdlZFwiLHtzcGVlZDp0LmN1cnJlbnRTcGVlZCx0eXBlOnQuY3VycmVudFR5cGV9KX0pKSx0aGlzLnRvZ2dsZUdyb3VwJiZ0aGlzLnRvZ2dsZUdyb3VwLm9uKFwidG9nZ2xlLW1vZGVsOmNsaWNrXCIsKGZ1bmN0aW9uKGUpe3ZhciBuLHIsaT1lLnRhcmdldC5nZXQoXCJpc0NoZWNrZWRcIik7aT8odC5jaGVja2VkSWNvbi5oaWRlKCksdC5jaGVja2VkVGV4dC5hdHRyKFwidGV4dFwiLChudWxsPT09KHI9dC5jb250cm9sbGVyQ2ZnKXx8dm9pZCAwPT09cj92b2lkIDA6ci50aW1lUG9pbnRDb250cm9sbGVyVGV4dCl8fFwiw6XCjeKAosOkwrjigqzDpuKAlMK2w6nigJTCtFwiKSx0LmN1cnJlbnRUeXBlPVwicmFuZ2VcIik6KHQuY2hlY2tlZEljb24uc2hvdygpLHQuY2hlY2tlZFRleHQuYXR0cihcInRleHRcIiwobnVsbD09PShuPXQuY29udHJvbGxlckNmZyl8fHZvaWQgMD09PW4/dm9pZCAwOm4udGltZVJhbmdlQ29udHJvbGxlclRleHQpfHxcIsOm4oCUwrbDqeKAlMK0w6jFksaSw6XigLrCtFwiKSx0LmN1cnJlbnRUeXBlPVwic2luZ2xlXCIpLGUudGFyZ2V0LnNldChcImlzQ2hlY2tlZFwiLCFpKSx0Lmdyb3VwLmVtaXQoXCJ0aW1lYmFyQ29uZmlnQ2hhbmdlZFwiLHt0eXBlOnQuY3VycmVudFR5cGUsc3BlZWQ6dC5jdXJyZW50U3BlZWR9KX0pKX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuc3BlZWRHcm91cC5vZmYoXCJzcGVlZC1yZWN0OmNsaWNrXCIpLHRoaXMudG9nZ2xlR3JvdXAmJih0aGlzLnRvZ2dsZUdyb3VwLm9mZihcInRvZ2dsZS1tb2RlbDpjbGlja1wiKSx0aGlzLnRvZ2dsZUdyb3VwLmRlc3Ryb3koKSksdGhpcy5zcGVlZEdyb3VwLmRlc3Ryb3koKX0sdH0oKSxJZz1mdW5jdGlvbigpe3JldHVybihJZz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgaSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LFBnPXtmaWxsOlwiIzQxNjE4MFwiLG9wYWNpdHk6LjA1fSxqZz17ZmlsbDpcIiM0MTYxODBcIixvcGFjaXR5Oi4xNSxyYWRpdXM6NX0sRGc9e2ZpbGw6XCIjNUI4RkY5XCIsb3BhY2l0eTouMyxjdXJzb3I6XCJtb3ZlXCJ9LE5nPXt3aWR0aDoyLGhlaWdodDoyNH0sUmc9e3RleHRCYXNlbGluZTpcIm1pZGRsZVwiLGZpbGw6XCIjMDAwXCIsb3BhY2l0eTouNDV9LExnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgZT10aGlzO3RoaXMucHJldlg9MCx0aGlzLm9uTW91c2VEb3duPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtlLmN1cnJlbnRIYW5kbGVyPXQ7dmFyIHI9bi5vcmlnaW5hbEV2ZW50O3Iuc3RvcFByb3BhZ2F0aW9uKCksci5wcmV2ZW50RGVmYXVsdCgpLGUucHJldlg9T2JqZWN0KGguaSkocixcInRvdWNoZXMuMC5wYWdlWFwiLHIucGFnZVgpO3ZhciBpPWUuY2FudmFzLmdldChcImNvbnRhaW5lclwiKTtpLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIixlLm9uTW91c2VNb3ZlKSxpLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsZS5vbk1vdXNlVXApLGkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIixlLm9uTW91c2VVcCksaS5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsZS5vbk1vdXNlTW92ZSksaS5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIixlLm9uTW91c2VVcCksaS5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hjYW5jZWxcIixlLm9uTW91c2VVcCl9fSx0aGlzLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBuPU9iamVjdChoLmkpKHQsXCJ0b3VjaGVzLjAucGFnZVhcIix0LnBhZ2VYKSxyPW4tZS5wcmV2WCxpPWUuYWRqdXN0T2Zmc2V0UmFuZ2Uoci9lLndpZHRoKTtlLnVwZGF0ZVN0YXJ0RW5kKGkpLGUudXBkYXRlVUkoKSxlLnByZXZYPW59LHRoaXMub25Nb3VzZVVwPWZ1bmN0aW9uKCl7ZS5jdXJyZW50SGFuZGxlciYmKGUuY3VycmVudEhhbmRsZXI9dm9pZCAwKTt2YXIgdD1lLmNhbnZhcy5nZXQoXCJjb250YWluZXJcIik7dCYmKHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLGUub25Nb3VzZU1vdmUpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIixlLm9uTW91c2VVcCksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLGUub25Nb3VzZVVwKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIixlLm9uTW91c2VNb3ZlKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLGUub25Nb3VzZVVwKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGNhbmNlbFwiLGUub25Nb3VzZVVwKSl9O3ZhciBuPXQueCxyPXZvaWQgMD09PW4/MDpuLGk9dC55LG89dm9pZCAwPT09aT8wOmksYT10LndpZHRoLHM9dm9pZCAwPT09YT8xMDA6YSx1PXQuaGVpZ2h0LGM9dC5wYWRkaW5nLGY9dm9pZCAwPT09Yz8xMDpjLGw9dC50cmVuZENmZyxkPXQuY29udHJvbGxlckNmZyxwPXZvaWQgMD09PWQ/e3NwZWVkOjF9OmQsZz10LmJhY2tncm91bmRTdHlsZSx2PXZvaWQgMD09PWc/e306Zyx5PXQuZm9yZWdyb3VuZFN0eWxlLG09dm9pZCAwPT09eT97fTp5LGI9dC5oYW5kbGVyU3R5bGUseD12b2lkIDA9PT1iP3t9OmIsdz10LnRleHRTdHlsZSxTPXZvaWQgMD09PXc/e306dyxFPXQuc3RhcnQsXz12b2lkIDA9PT1FPzA6RSxPPXQuZW5kLGs9dm9pZCAwPT09Tz8xOk8sTT10Lm1pblRleHQsQT12b2lkIDA9PT1NP1wiXCI6TSxUPXQubWF4VGV4dCxDPXZvaWQgMD09PVQ/XCJcIjpULEk9dC5ncm91cCxQPXQuZ3JhcGgsaj10LmNhbnZhcyxEPXQudGlja3MsTj10LnR5cGU7dGhpcy5ncmFwaD1QLHRoaXMuY2FudmFzPWosdGhpcy5ncm91cD1JLHRoaXMudGltZUJhclR5cGU9Tix0aGlzLng9cix0aGlzLnk9byx0aGlzLndpZHRoPXMsdGhpcy5oZWlnaHQ9dSx0aGlzLnBhZGRpbmc9Zix0aGlzLnRpY2tzPUQsdGhpcy50cmVuZENmZz1sLHRoaXMuY29udHJvbGxlckNmZz1wLHRoaXMuY3VycmVudFNwZWVkPXAuc3BlZWR8fDEsXCJ0cmVuZFwiPT09Tj90aGlzLmJhY2tncm91bmRTdHlsZT1JZyhJZyh7fSxQZyksdik6XCJzaW1wbGVcIj09PU4mJih0aGlzLmJhY2tncm91bmRTdHlsZT1JZyhJZyh7fSxqZyksdikpLHRoaXMuZm9yZWdyb3VuZFN0eWxlPUlnKElnKHt9LERnKSxtKSx0aGlzLmhhbmRsZXJTdHlsZT1JZyhJZyh7fSxOZykseCksdGhpcy50ZXh0U3R5bGU9SWcoSWcoe30sUmcpLFMpLHRoaXMuY3VycmVudE1vZGU9XCJyYW5nZVwiLHRoaXMuc3RhcnQ9Xyx0aGlzLmVuZD1rLHRoaXMubWluVGV4dD1BLHRoaXMubWF4VGV4dD1DLHRoaXMuZm9udEZhbWlseT1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5LG51bGwpLmdldFByb3BlcnR5VmFsdWUoXCJmb250LWZhbWlseVwiKXx8XCJBcmlhbCwgc2Fucy1zZXJpZlwiLHRoaXMucmVuZGVyU2xpZGVyKCl9cmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10Lngsbj10Lnkscj10LndpZHRoLGk9dC5oZWlnaHQsbz10Lm1pblRleHQsYT10Lm1heFRleHQscz10LnN0YXJ0LHU9dC5lbmQ7dGhpcy5zdGFydD1NYXRoLm1pbigxLE1hdGgubWF4KHMsMCkpLHRoaXMuZW5kPU1hdGgubWluKDEsTWF0aC5tYXgodSwwKSksT2JqZWN0KGguYSkodGhpcyx7eDplLHk6bix3aWR0aDpyLGhlaWdodDppLG1pblRleHQ6byxtYXhUZXh0OmF9KSx0aGlzLnVwZGF0ZVVJKCl9LHQucHJvdG90eXBlLnNldFRleHQ9ZnVuY3Rpb24odCxlKXt0aGlzLm1pblRleHRTaGFwZS5hdHRyKFwidGV4dFwiLHQpLHRoaXMubWF4VGV4dFNoYXBlLmF0dHIoXCJ0ZXh0XCIsZSl9LHQucHJvdG90eXBlLnJlbmRlclNsaWRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLndpZHRoLG49dGhpcy5oZWlnaHQscj10aGlzLnRpbWVCYXJUeXBlO2lmKFwidHJlbmRcIj09PXImJk9iamVjdChoLkUpKE9iamVjdChoLmkpKHRoaXMudHJlbmRDZmcsXCJkYXRhXCIpKSl7dmFyIGk9bmV3IG1nKElnKElnKHt4OnRoaXMueCx5OnRoaXMueSx3aWR0aDplLGhlaWdodDpufSx0aGlzLnRyZW5kQ2ZnKSx7Z3JvdXA6dGhpcy5ncm91cH0pKTt0aGlzLnRyZW5kQ29tcG9uZW50PWl9dmFyIG89dGhpcy5ncm91cC5hZGRHcm91cCh7bmFtZTpcInNsaWRlci1ncm91cFwifSk7by5hZGRTaGFwZShcInJlY3RcIix7YXR0cnM6SWcoe3g6MCx5OjAsd2lkdGg6ZSxoZWlnaHQ6bn0sdGhpcy5iYWNrZ3JvdW5kU3R5bGUpfSk7dmFyIGE9dGhpcy5ncm91cC5hZGRHcm91cCgpO1widHJlbmRcIj09PXI/KHRoaXMubWluVGV4dFNoYXBlPWEuYWRkU2hhcGUoXCJ0ZXh0XCIse2F0dHJzOklnKHt4OjAseTpuLzIrdGhpcy55LHRleHRBbGlnbjpcInJpZ2h0XCIsdGV4dDp0aGlzLm1pblRleHQsc2lsZW50OiExLGZvbnRGYW1pbHk6dGhpcy5mb250RmFtaWx5fHxcIkFyaWFsLCBzYW5zLXNlcmlmXCJ9LHRoaXMudGV4dFN0eWxlKSxjYXB0dXJlOiExfSksdGhpcy5tYXhUZXh0U2hhcGU9YS5hZGRTaGFwZShcInRleHRcIix7YXR0cnM6SWcoe3k6bi8yK3RoaXMueSx0ZXh0QWxpZ246XCJsZWZ0XCIsdGV4dDp0aGlzLm1heFRleHQsc2lsZW50OiExLGZvbnRGYW1pbHk6dGhpcy5mb250RmFtaWx5fHxcIkFyaWFsLCBzYW5zLXNlcmlmXCJ9LHRoaXMudGV4dFN0eWxlKSxjYXB0dXJlOiExfSkpOih0aGlzLm1pblRleHRTaGFwZT1hLmFkZFNoYXBlKFwidGV4dFwiLHthdHRyczpJZyh7eDowLHk6dGhpcy55LTEwLHRleHRBbGlnbjpcImNlbnRlclwiLHRleHQ6dGhpcy5taW5UZXh0LHNpbGVudDohMSxmb250RmFtaWx5OnRoaXMuZm9udEZhbWlseXx8XCJBcmlhbCwgc2Fucy1zZXJpZlwifSx0aGlzLnRleHRTdHlsZSksY2FwdHVyZTohMX0pLHRoaXMubWF4VGV4dFNoYXBlPWEuYWRkU2hhcGUoXCJ0ZXh0XCIse2F0dHJzOklnKHt5OnRoaXMueS0xMCx0ZXh0QWxpZ246XCJjZW50ZXJcIix0ZXh0OnRoaXMubWF4VGV4dCxzaWxlbnQ6ITEsZm9udEZhbWlseTp0aGlzLmZvbnRGYW1pbHl8fFwiQXJpYWwsIHNhbnMtc2VyaWZcIn0sdGhpcy50ZXh0U3R5bGUpLGNhcHR1cmU6ITF9KSksdGhpcy5mb3JlZ3JvdW5kU2hhcGU9dGhpcy5ncm91cC5hZGRHcm91cCgpLmFkZFNoYXBlKFwicmVjdFwiLHthdHRyczpJZyh7eDowLHk6dGhpcy55LGhlaWdodDpufSx0aGlzLmZvcmVncm91bmRTdHlsZSl9KTt2YXIgcz1PYmplY3QoaC5pKSh0aGlzLmhhbmRsZXJTdHlsZSxcIndpZHRoXCIsMiksdT1PYmplY3QoaC5pKSh0aGlzLmhhbmRsZXJTdHlsZSxcImhlaWdodFwiLDI0KSxjPXRoaXMuZ3JvdXAuYWRkR3JvdXAoe25hbWU6XCJtaW5IYW5kbGVyU2hhcGVcIn0pO3RoaXMubWluSGFuZGxlclNoYXBlPW5ldyBTZyhJZyh7bmFtZTpcIm1pbkhhbmRsZXJTaGFwZVwiLGdyb3VwOmMsdHlwZTpyLHg6dGhpcy54LHk6dGhpcy55LHdpZHRoOnMsaGVpZ2h0OnUsY3Vyc29yOlwiZXctcmVzaXplXCJ9LHRoaXMuaGFuZGxlclN0eWxlKSk7dmFyIGY9dGhpcy5ncm91cC5hZGRHcm91cCh7bmFtZTpcIm1heEhhbmRsZXJTaGFwZVwifSk7dGhpcy5tYXhIYW5kbGVyU2hhcGU9bmV3IFNnKElnKHtuYW1lOlwibWF4SGFuZGxlclNoYXBlXCIsZ3JvdXA6Zix0eXBlOnIseDp0aGlzLngseTp0aGlzLnksd2lkdGg6cyxoZWlnaHQ6dSxjdXJzb3I6XCJldy1yZXNpemVcIn0sdGhpcy5oYW5kbGVyU3R5bGUpKTt2YXIgbD10aGlzLnRpY2tzLGQ9ZS8obC5sZW5ndGgtMSk7dGhpcy50aWNrUG9zTGlzdD1bXSx0aGlzLnRleHRMaXN0JiZ0aGlzLnRleHRMaXN0Lmxlbmd0aCYmdGhpcy50ZXh0TGlzdC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmRlc3Ryb3koKX0pKTt2YXIgcD0tMS8wO3RoaXMudGV4dExpc3Q9bC5tYXAoKGZ1bmN0aW9uKGUscil7dC50aWNrUG9zTGlzdC5wdXNoKHQueCtyKmQpO3ZhciBpPXQuZ3JvdXAuYWRkU2hhcGUoXCJ0ZXh0XCIse2F0dHJzOnt4OnQueCtyKmQseTp0Lnkrbis1LHRleHQ6ZSx0ZXh0QWxpZ246XCJjZW50ZXJcIix0ZXh0QmFzZWxpbmU6XCJ0b3BcIixmaWxsOlwiIzYwNzg4OVwiLG9wYWNpdHk6LjM1LGZvbnRGYW1pbHk6dC5mb250RmFtaWx5fHxcIkFyaWFsLCBzYW5zLXNlcmlmXCJ9fSksbz10Lmdyb3VwLmFkZFNoYXBlKFwibGluZVwiLHthdHRyczp7eDE6dC54K3IqZCx5MTp0LnkrbisyLHgyOnQueCtyKmQseTI6dC55K24rNixsaW5lV2lkdGg6MSxzdHJva2U6XCIjY2NjXCJ9fSksYT1pLmdldEJCb3goKTtyZXR1cm4gYS5taW5YPnA/KGkuc2hvdygpLG8uc2hvdygpLHA9YS5taW5YK2Eud2lkdGgrMTApOihpLmhpZGUoKSxvLmhpZGUoKSksaX0pKSx0aGlzLmNvbnRyb2xsZXJCdG5Hcm91cD1uZXcgQ2coSWcoe2dyb3VwOnRoaXMuZ3JvdXAseDp0aGlzLngseTp0aGlzLnkrbisyNSx3aWR0aDplLGhlaWdodDo0MH0sdGhpcy5jb250cm9sbGVyQ2ZnKSksdGhpcy51cGRhdGVVSSgpLG8ubW92ZSh0aGlzLngsdGhpcy55KSx0aGlzLmJpbmRFdmVudHMoKX0sdC5wcm90b3R5cGUuYmluZEV2ZW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLmdyb3VwLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwibWluSGFuZGxlclNoYXBlXCI9PT10LmdldChcIm5hbWVcIil9KSk7ZSYmKGUub24oXCJtaW5IYW5kbGVyU2hhcGUtaGFuZGxlcjptb3VzZWRvd25cIix0aGlzLm9uTW91c2VEb3duKHRoaXMubWluSGFuZGxlclNoYXBlKSksZS5vbihcIm1pbkhhbmRsZXJTaGFwZS1oYW5kbGVyOnRvdWNoc3RhcnRcIix0aGlzLm9uTW91c2VEb3duKHRoaXMubWluSGFuZGxlclNoYXBlKSkpO3ZhciBuPXRoaXMuZ3JvdXAuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuXCJtYXhIYW5kbGVyU2hhcGVcIj09PXQuZ2V0KFwibmFtZVwiKX0pKTtuJiYobi5vbihcIm1heEhhbmRsZXJTaGFwZS1oYW5kbGVyOm1vdXNlZG93blwiLHRoaXMub25Nb3VzZURvd24odGhpcy5tYXhIYW5kbGVyU2hhcGUpKSxuLm9uKFwibWF4SGFuZGxlclNoYXBlLWhhbmRsZXI6dG91Y2hzdGFydFwiLHRoaXMub25Nb3VzZURvd24odGhpcy5tYXhIYW5kbGVyU2hhcGUpKSksdGhpcy5mb3JlZ3JvdW5kU2hhcGUub24oXCJtb3VzZWRvd25cIix0aGlzLm9uTW91c2VEb3duKHRoaXMuZm9yZWdyb3VuZFNoYXBlKSksdGhpcy5mb3JlZ3JvdW5kU2hhcGUub24oXCJ0b3VjaHN0YXJ0XCIsdGhpcy5vbk1vdXNlRG93bih0aGlzLmZvcmVncm91bmRTaGFwZSkpLHRoaXMuZ3JvdXAub24oXCJwbGF5UGF1c2VCdG46Y2xpY2tcIiwoZnVuY3Rpb24oKXt0LmlzUGxheT0hdC5pc1BsYXksdC5jdXJyZW50SGFuZGxlcj10Lm1heEhhbmRsZXJTaGFwZSx0LmNoYW5nZVBsYXlTdGF0dXMoKX0pKSx0aGlzLmdyb3VwLm9uKFwibmV4dFN0ZXBCdG46Y2xpY2tcIiwoZnVuY3Rpb24oKXt0LmN1cnJlbnRIYW5kbGVyPXQubWF4SGFuZGxlclNoYXBlLHQudXBkYXRlU3RhcnRFbmQoLjAxKSx0LnVwZGF0ZVVJKCl9KSksdGhpcy5ncm91cC5vbihcInByZVN0ZXBCdG46Y2xpY2tcIiwoZnVuY3Rpb24oKXt0LmN1cnJlbnRIYW5kbGVyPXQubWF4SGFuZGxlclNoYXBlLHQudXBkYXRlU3RhcnRFbmQoLS4wMSksdC51cGRhdGVVSSgpfSkpLHRoaXMuZ3JvdXAub24oXCJ0aW1lYmFyQ29uZmlnQ2hhbmdlZFwiLChmdW5jdGlvbihlKXt2YXIgbj1lLnR5cGUscj1lLnNwZWVkO3QuY3VycmVudFNwZWVkPXIsdC5jdXJyZW50TW9kZT1uLFwic2luZ2xlXCI9PT1uPyh0Lm1pbkhhbmRsZXJTaGFwZS5oaWRlKCksdC5mb3JlZ3JvdW5kU2hhcGUuaGlkZSgpLHQubWluVGV4dFNoYXBlLmhpZGUoKSk6XCJyYW5nZVwiPT09biYmKHQubWluSGFuZGxlclNoYXBlLnNob3coKSx0LmZvcmVncm91bmRTaGFwZS5zaG93KCksdC5taW5UZXh0U2hhcGUuc2hvdygpKX0pKX0sdC5wcm90b3R5cGUuYWRqdXN0VGlja0luZGV4PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy50aWNrUG9zTGlzdC5sZW5ndGgtMTtlKyspaWYodGhpcy50aWNrUG9zTGlzdFtlXTw9dCYmdDw9dGhpcy50aWNrUG9zTGlzdFtlKzFdKXJldHVybiBNYXRoLmFicyh0aGlzLnRpY2tQb3NMaXN0W2VdLXQpPE1hdGguYWJzKHQtdGhpcy50aWNrUG9zTGlzdFtlKzFdKT9lOmUrMX0sdC5wcm90b3R5cGUuYWRqdXN0T2Zmc2V0UmFuZ2U9ZnVuY3Rpb24odCl7c3dpdGNoKHRoaXMuY3VycmVudEhhbmRsZXIpe2Nhc2UgdGhpcy5taW5IYW5kbGVyU2hhcGU6dmFyIGU9MC10aGlzLnN0YXJ0LG49MS10aGlzLnN0YXJ0O3JldHVybiBNYXRoLm1pbihuLE1hdGgubWF4KGUsdCkpO2Nhc2UgdGhpcy5tYXhIYW5kbGVyU2hhcGU6ZT0wLXRoaXMuZW5kLG49MS10aGlzLmVuZDtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heChlLHQpKTtjYXNlIHRoaXMuZm9yZWdyb3VuZFNoYXBlOmU9MC10aGlzLnN0YXJ0LG49MS10aGlzLmVuZDtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heChlLHQpKTtkZWZhdWx0OnJldHVybiAwfX0sdC5wcm90b3R5cGUudXBkYXRlU3RhcnRFbmQ9ZnVuY3Rpb24odCl7c3dpdGNoKHRoaXMuY3VycmVudEhhbmRsZXIpe2Nhc2UgdGhpcy5taW5IYW5kbGVyU2hhcGU6dGhpcy5tYXhUZXh0PXRoaXMubWF4VGV4dFNoYXBlLmF0dHIoXCJ0ZXh0XCIpLHRoaXMuc3RhcnQrPXQsdGhpcy5taW5UZXh0PXRoaXMudGlja3NbdGhpcy5hZGp1c3RUaWNrSW5kZXgodGhpcy5zdGFydCp0aGlzLndpZHRoKV07YnJlYWs7Y2FzZSB0aGlzLm1heEhhbmRsZXJTaGFwZTp0aGlzLm1pblRleHQ9dGhpcy5taW5UZXh0U2hhcGUuYXR0cihcInRleHRcIiksdGhpcy5lbmQrPXQsdGhpcy5tYXhUZXh0PXRoaXMudGlja3NbdGhpcy5hZGp1c3RUaWNrSW5kZXgodGhpcy5lbmQqdGhpcy53aWR0aCldO2JyZWFrO2Nhc2UgdGhpcy5mb3JlZ3JvdW5kU2hhcGU6dGhpcy5zdGFydCs9dCx0aGlzLmVuZCs9dCx0aGlzLm1pblRleHQ9dGhpcy50aWNrc1t0aGlzLmFkanVzdFRpY2tJbmRleCh0aGlzLnN0YXJ0KnRoaXMud2lkdGgpXSx0aGlzLm1heFRleHQ9dGhpcy50aWNrc1t0aGlzLmFkanVzdFRpY2tJbmRleCh0aGlzLmVuZCp0aGlzLndpZHRoKV19fSx0LnByb3RvdHlwZS51cGRhdGVVST1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5zdGFydDwwJiYodGhpcy5zdGFydD0wKSx0aGlzLmVuZD4xJiYodGhpcy5lbmQ9MSk7dmFyIGU9dGhpcy5zdGFydCp0aGlzLndpZHRoLG49dGhpcy5lbmQqdGhpcy53aWR0aDt0aGlzLmZvcmVncm91bmRTaGFwZS5hdHRyKFwieFwiLGUpLHRoaXMuZm9yZWdyb3VuZFNoYXBlLmF0dHIoXCJ3aWR0aFwiLG4tZSk7dmFyIHI9T2JqZWN0KGguaSkodGhpcy5oYW5kbGVyU3R5bGUsXCJ3aWR0aFwiLDIpO3RoaXMuc2V0VGV4dCh0aGlzLm1pblRleHQsdGhpcy5tYXhUZXh0KTt2YXIgaT10aGlzLmRvZGdlVGV4dChbZSxuXSksbz1pWzBdLGE9aVsxXTt0aGlzLm1pbkhhbmRsZXJTaGFwZS5zZXRYKGUtci8yKSxPYmplY3QoaC5mKShvLChmdW5jdGlvbihlLG4pe3JldHVybiB0Lm1pblRleHRTaGFwZS5hdHRyKG4sZSl9KSksdGhpcy5tYXhIYW5kbGVyU2hhcGUuc2V0WChuLXIvMiksT2JqZWN0KGguZikoYSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5tYXhUZXh0U2hhcGUuYXR0cihuLGUpfSkpLFwicmFuZ2VcIj09PXRoaXMuY3VycmVudE1vZGU/dGhpcy5ncmFwaC5lbWl0KFwidmFsdWVDaGFuZ2VcIix7dmFsdWU6W3RoaXMuc3RhcnQsdGhpcy5lbmRdLnNvcnQoKX0pOlwic2luZ2xlXCI9PT10aGlzLmN1cnJlbnRNb2RlJiZ0aGlzLmdyYXBoLmVtaXQoXCJ2YWx1ZUNoYW5nZVwiLHt2YWx1ZTpbdGhpcy5lbmQsdGhpcy5lbmRdfSl9LHQucHJvdG90eXBlLmRvZGdlVGV4dD1mdW5jdGlvbih0KXt2YXIgZSxuLHI9T2JqZWN0KGguaSkodGhpcy5oYW5kbGVyU3R5bGUsXCJ3aWR0aFwiLDIpLGk9dGhpcy5taW5UZXh0U2hhcGUsbz10aGlzLm1heFRleHRTaGFwZSxhPXRbMF0scz10WzFdLHU9ITE7YT5zJiYoYT0oZT1bcyxhXSlbMF0scz1lWzFdLGk9KG49W28saV0pWzBdLG89blsxXSx1PSEwKTt2YXIgYz1pLmdldEJCb3goKSxmPW8uZ2V0QkJveCgpLGw9bnVsbCxkPW51bGw7cmV0dXJuXCJ0cmVuZFwiPT09dGhpcy50aW1lQmFyVHlwZT8obD1jLndpZHRoPmEtMj97eDphK3IvMisyLHRleHRBbGlnbjpcImxlZnRcIn06e3g6YS1yLzItMix0ZXh0QWxpZ246XCJyaWdodFwifSxkPWYud2lkdGg+dGhpcy53aWR0aC1zLTI/e3g6cy1yLzItMix0ZXh0QWxpZ246XCJyaWdodFwifTp7eDpzK3IvMisyLHRleHRBbGlnbjpcImxlZnRcIn0pOlwic2ltcGxlXCI9PT10aGlzLnRpbWVCYXJUeXBlJiYobD1jLndpZHRoPmEtMj97eDphK3IvMisyLHRleHRBbGlnbjpcImNlbnRlclwifTp7eDphLXIvMi0yLHRleHRBbGlnbjpcImNlbnRlclwifSxkPWYud2lkdGg+dGhpcy53aWR0aC1zLTI/e3g6cy1yLzItMix0ZXh0QWxpZ246XCJjZW50ZXJcIn06e3g6cytyLzIrMix0ZXh0QWxpZ246XCJjZW50ZXJcIn0pLHU/W2QsbF06W2wsZF19LHQucHJvdG90eXBlLnN0YXJ0UGxheT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3ZhciBlPXQsbj1lLnRpY2tzLHI9ZS53aWR0aCxpPXQuY3VycmVudFNwZWVkLG89ci9uLmxlbmd0aC8oMWUzKigxMC1pKS82MCksYT10LmFkanVzdE9mZnNldFJhbmdlKG8vdC53aWR0aCk7dC51cGRhdGVTdGFydEVuZChhKSx0LnVwZGF0ZVVJKCksdC5pc1BsYXkmJih0LnBsYXlIYW5kbGVyPXQuc3RhcnRQbGF5KCkpfSkpOnZvaWQgMH0sdC5wcm90b3R5cGUuY2hhbmdlUGxheVN0YXR1cz1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMCksdGhpcy5jb250cm9sbGVyQnRuR3JvdXAucGxheUJ1dHRvbi51cGRhdGUoe2lzUGxheTp0aGlzLmlzUGxheX0pLHRoaXMuaXNQbGF5Pyh0aGlzLnBsYXlIYW5kbGVyPXRoaXMuc3RhcnRQbGF5KCksdGhpcy5ncmFwaC5lbWl0KFwidGltZWxpbmVzdGFydFwiLG51bGwpKTp0aGlzLnBsYXlIYW5kbGVyJiYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucGxheUhhbmRsZXIpLHQmJnRoaXMuZ3JhcGguZW1pdChcInRpbWVsaW5lZW5kXCIsbnVsbCkpfSx0LnByb3RvdHlwZS5kZXN0b3J5PWZ1bmN0aW9uKCl7dGhpcy5ncmFwaC5vZmYoXCJ2YWx1ZUNoYW5nZVwiKTt2YXIgdD10aGlzLmdyb3VwLGU9dC5maW5kKChmdW5jdGlvbih0KXtyZXR1cm5cIm1pbkhhbmRsZXJTaGFwZVwiPT09dC5nZXQoXCJuYW1lXCIpfSkpO2UmJihlLm9mZihcIm1pbkhhbmRsZXJTaGFwZS1oYW5kbGVyOm1vdXNlZG93blwiKSxlLm9mZihcIm1pbkhhbmRsZXJTaGFwZS1oYW5kbGVyOnRvdWNoc3RhcnRcIiksZS5kZXN0cm95KCkpO3ZhciBuPXQuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuXCJtYXhIYW5kbGVyU2hhcGVcIj09PXQuZ2V0KFwibmFtZVwiKX0pKTtuJiYobi5vZmYoXCJtYXhIYW5kbGVyU2hhcGUtaGFuZGxlcjptb3VzZWRvd25cIiksbi5vZmYoXCJtYXhIYW5kbGVyU2hhcGUtaGFuZGxlcjp0b3VjaHN0YXJ0XCIpLG4uZGVzdHJveSgpKSx0aGlzLmZvcmVncm91bmRTaGFwZS5vZmYoXCJtb3VzZWRvd25cIiksdGhpcy5mb3JlZ3JvdW5kU2hhcGUub2ZmKFwidG91Y2hzdGFydFwiKSx0aGlzLmZvcmVncm91bmRTaGFwZS5kZXN0cm95KCksdC5vZmYoXCJwbGF5UGF1c2VCdG46Y2xpY2tcIiksdC5vZmYoXCJuZXh0U3RlcEJ0bjpjbGlja1wiKSx0Lm9mZihcInByZVN0ZXBCdG46Y2xpY2tcIiksdC5vZmYoXCJ0aW1lYmFyQ29uZmlnQ2hhbmdlZFwiKSx0LmRlc3Ryb3koKSx0aGlzLnRyZW5kQ29tcG9uZW50JiZ0aGlzLnRyZW5kQ29tcG9uZW50LmRlc3RvcnkoKX0sdH0oKSxCZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGU9dC54LG49dm9pZCAwPT09ZT8wOmUscj10LnksaT12b2lkIDA9PT1yPzA6cixvPXQuY29udGFpbmVyLGE9dC50ZXh0LHM9dC5wYWRkaW5nLHU9dm9pZCAwPT09cz9bNCw0LDQsNF06cyxjPXQuY2xhc3NOYW1lLGY9dm9pZCAwPT09Yz9cImc2LWNvbXBvbmVudC10aW1lYmFyLXRvb2x0aXBcIjpjLGw9dC5iYWNrZ3JvdW5kQ29sb3IsaD12b2lkIDA9PT1sP1wiIzAwMFwiOmwsZD10LnRleHRDb2xvcixwPXZvaWQgMD09PWQ/XCIjZmZmXCI6ZCxnPXQub3BhY2l0eSx2PXZvaWQgMD09PWc/Ljg6Zyx5PXQuZm9udFNpemUsbT12b2lkIDA9PT15PzEyOnk7dGhpcy5jb250YWluZXI9byx0aGlzLmNsYXNzTmFtZT1mLHRoaXMuYmFja2dyb3VuZENvbG9yPWgsdGhpcy50ZXh0Q29sb3I9cCx0aGlzLng9bix0aGlzLnk9aSx0aGlzLnRleHQ9YSx0aGlzLnBhZGRpbmc9dSx0aGlzLm9wYWNpdHk9dix0aGlzLmZvbnRTaXplPW0sdGhpcy5yZW5kZXIoKX1yZXR1cm4gdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jbGFzc05hbWUsZT0odGhpcy54LHRoaXMueSx0aGlzLmJhY2tncm91bmRDb2xvciksbj10aGlzLnRleHRDb2xvcixyPXRoaXMudGV4dCxpPXRoaXMucGFkZGluZyxvPXRoaXMub3BhY2l0eSxhPXRoaXMuZm9udFNpemUscz10aGlzLmNvbnRhaW5lcix1PWd0KFwiPGRpdiBjbGFzcz0nXCIrdCtcIicgc3R5bGU9XFxcInBvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IGZpdC1jb250ZW50OyBoZWlnaHQ6IGZpdC1jb250ZW50OyBvcGFjaXR5OiBcIitvKydcIj48L2Rpdj4nKTtPYmplY3QoaC54KShzKSYmKHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocykpLHMuYXBwZW5kQ2hpbGQodSksdGhpcy5wYXJlbnRIZWlnaHQ9cy5vZmZzZXRIZWlnaHQsdGhpcy5wYXJlbnRXaWR0aD1zLm9mZnNldFdpZHRoLHZ0KHUse3Zpc2liaWxpdHk6XCJoaWRkZW5cIix0b3A6MCxsZWZ0OjB9KTt2YXIgYz1ndChcIlxcbiAgICAgIDxkaXYgc3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTsgd2hpdGUtc3BhY2U6bm93cmFwOyBiYWNrZ3JvdW5kLWNvbG9yOiBcIitlK1wiOyBmb250LXNpemU6IFwiK2ErXCJweDsgYm9yZGVyLXJhZGl1czogNHB4OyB3aWR0aDogZml0LWNvbnRlbnQ7IGhlaWdodDogZml0LWNvbnRlbnQ7IGNvbG9yOiBcIituK1wiOyBwYWRkaW5nOiBcIitpWzBdK1wicHggXCIraVsxXStcInB4IFwiK2lbMl0rXCJweCBcIitpWzNdK1wicHgnPjwvZGl2PlwiKTtjLmlubmVySFRNTD1yLHUuYXBwZW5kQ2hpbGQoYyksdGhpcy5iYWNrZ3JvdW5kRE9NPWM7dmFyIGY9Z3QoXCI8ZGl2IHN0eWxlPSdwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAwcHg7IGhlaWdodDogMHB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OyBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsgYm9yZGVyLXRvcDogMTBweCBzb2xpZCBcIitlK1wiJz48L2Rpdj5cIik7dS5hcHBlbmRDaGlsZChmKSx0aGlzLmFycm93RE9NPWYsdGhpcy5jb250YWluZXI9dX0sdC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbih0KXt2YXIgZT10LnRleHQsbj10Lng7dC55LHQuY2xpZW50WCx0LmNsaWVudFk7dGhpcy5iYWNrZ3JvdW5kRE9NLmlubmVySFRNTD1lO3ZhciByPXRoaXMuYmFja2dyb3VuZERPTS5vZmZzZXRXaWR0aCxpPXRoaXMuYmFja2dyb3VuZERPTS5vZmZzZXRIZWlnaHQsbz10aGlzLmFycm93RE9NLm9mZnNldFdpZHRoLGE9dGhpcy5hcnJvd0RPTS5vZmZzZXRIZWlnaHQ7dnQodGhpcy5jb250YWluZXIse3RvcDotaS1hK1wicHhcIixsZWZ0Om4rXCJweFwiLHZpc2liaWxpdHk6XCJ2aXNpYmxlXCJ9KSx2dCh0aGlzLmJhY2tncm91bmRET00se21hcmdpbkxlZnQ6LXIvMitcInB4XCJ9KSx2dCh0aGlzLmFycm93RE9NLHttYXJnaW5MZWZ0Oi1vLzIrXCJweFwiLHRvcDppK1wicHhcIn0pO3ZhciBzPW4tci8yLHU9bityLzI7czwwP3Z0KHRoaXMuYmFja2dyb3VuZERPTSx7bWFyZ2luTGVmdDotci8yLXMrXCJweFwifSk6dT50aGlzLnBhcmVudFdpZHRoJiZ2dCh0aGlzLmJhY2tncm91bmRET00se21hcmdpbkxlZnQ6LXIvMi11K3RoaXMucGFyZW50V2lkdGgrMTIrXCJweFwifSl9LHQucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt2dCh0aGlzLmNvbnRhaW5lcix7dG9wOjAsbGVmdDowLHZpc2liaWxpdHk6XCJoaWRkZW5cIn0pfSx0fSgpLEdnPWZ1bmN0aW9uKCl7cmV0dXJuKEdnPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBpIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sRmc9e2ZpbGw6XCIjNUI4RkY5XCJ9LFVnPXtmaWxsOlwiI2U2ZThlOVwifSx6Zz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5mcmFtZUNvdW50PTAsdGhpcy5mb250RmFtaWx5PVwiQXJpYWwsIHNhbnMtc2VyaWZcIjt2YXIgZT10LmdyYXBoLG49dC5jYW52YXMscj10Lmdyb3VwLGk9dC53aWR0aCxvPXQuaGVpZ2h0LGE9dC5wYWRkaW5nLHM9dC5kYXRhLHU9dC5zdGFydCxjPXQuZW5kLGY9dC54LGw9dm9pZCAwPT09Zj8wOmYsaD10LnksZD12b2lkIDA9PT1oPzA6aCxwPXQudGlja0xhYmVsRm9ybWF0dGVyLGc9dC5zZWxlY3RlZFRpY2tTdHlsZSx2PXZvaWQgMD09PWc/Rmc6Zyx5PXQudW5zZWxlY3RlZFRpY2tTdHlsZSxtPXZvaWQgMD09PXk/VWc6eSxiPXQudG9vbHRpcEJhY2tncm91bmRDb2xvcix4PXQudG9vbHRpcEZvbWF0dGVyO3RoaXMuZ3JhcGg9ZSx0aGlzLmdyb3VwPXIsdGhpcy5zbGljZUdyb3VwPXIuYWRkR3JvdXAoe25hbWU6XCJzbGljZS1ncm91cFwifSksdGhpcy5jYW52YXM9bix0aGlzLndpZHRoPWksdGhpcy5oZWlnaHQ9byx0aGlzLnBhZGRpbmc9YSx0aGlzLmRhdGE9cyx0aGlzLnN0YXJ0PXUsdGhpcy5lbmQ9Yyx0aGlzLnRpY2tMYWJlbEZvcm1hdHRlcj1wLHRoaXMuc2VsZWN0ZWRUaWNrU3R5bGU9dix0aGlzLnVuc2VsZWN0ZWRUaWNrU3R5bGU9bSx0aGlzLng9bCx0aGlzLnk9ZCx0aGlzLnRvb2x0aXBCYWNrZ3JvdW5kQ29sb3I9Yix0aGlzLnRvb2x0aXBGb21hdHRlcj14LHRoaXMuZm9udEZhbWlseT1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5LG51bGwpLmdldFByb3BlcnR5VmFsdWUoXCJmb250LWZhbWlseVwiKXx8XCJBcmlhbCwgc2Fucy1zZXJpZlwiLHRoaXMucmVuZGVyU2xpY2VzKCksdGhpcy5pbml0RXZlbnQoKX1yZXR1cm4gdC5wcm90b3R5cGUucmVuZGVyU2xpY2VzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMsbj1lLndpZHRoLHI9ZS5oZWlnaHQsaT1lLnBhZGRpbmcsbz1lLmRhdGEsYT1lLnN0YXJ0LHM9ZS5lbmQsdT1lLnRpY2tMYWJlbEZvcm1hdHRlcixjPWUuc2VsZWN0ZWRUaWNrU3R5bGUsZj1lLnVuc2VsZWN0ZWRUaWNrU3R5bGUsbD1uLTIqaSxkPXItKDMqaSs0KzEwKS0yKmkscD1vLmxlbmd0aCxnPShsLTIqKHAtMSkpL3A7dGhpcy50aWNrV2lkdGg9Zzt2YXIgdj10aGlzLnNsaWNlR3JvdXAseT1bXSxtPVtdLGI9TWF0aC5yb3VuZChwKmEpLHg9TWF0aC5yb3VuZChwKnMpO3RoaXMuc3RhcnRUaWNrUmVjdElkPWIsdGhpcy5lbmRUaWNrUmVjdElkPXgsby5mb3JFYWNoKChmdW5jdGlvbihlLHIpe3ZhciBvPXI+PWImJnI8PXg/YzpmLGE9di5hZGRTaGFwZShcInJlY3RcIix7YXR0cnM6R2coe3g6aStyKihnKzIpLHk6aSx3aWR0aDpnLGhlaWdodDpkfSxvKSxkcmFnZ2FibGU6ITAsbmFtZTpcInRpY2stcmVjdC1cIityfSkscz12LmFkZFNoYXBlKFwicmVjdFwiLHthdHRyczp7eDppK3IqZysyKigyKnItMSkvMix5Omksd2lkdGg6MD09PXJ8fHI9PT1wLTE/ZysxOmcrMixoZWlnaHQ6ZCxmaWxsOlwiI2ZmZlwiLG9wYWNpdHk6MH0sZHJhZ2dhYmxlOiEwLG5hbWU6XCJwaWNrLXJlY3QtXCIrcn0pO3MudG9Gcm9udCgpO3ZhciBsLHc9YS5nZXRCQm94KCksUz0ody5taW5YK3cubWF4WCkvMjtpZih5LnB1c2goe3JlY3Q6YSxwaWNrUmVjdDpzLHZhbHVlOmUuZGF0ZSx4OlMseTp3Lm1pbll9KSx1PyhsPXUoZSksIU9iamVjdChoLngpKGwpJiZsJiYobD1lLmRhdGUpKTpyJU1hdGgucm91bmQocC8xMCk9PTAmJihsPWUuZGF0ZSksbCl7bS5wdXNoKGwpO3ZhciBFPXcubWF4WSsyKmk7di5hZGRTaGFwZShcImxpbmVcIix7YXR0cnM6e3N0cm9rZTpcIiNCRkJGQkZcIix4MTpTLHkxOkUseDI6Uyx5MjpFKzR9fSk7dmFyIF89RSs0K2ksTz12LmFkZFNoYXBlKFwidGV4dFwiLHthdHRyczp7ZmlsbDpcIiM4YzhjOGNcIixzdHJva2U6XCIjZmZmXCIsbGluZVdpZHRoOjEseDpTLHk6Xyx0ZXh0QWxpZ246XCJjZW50ZXJcIix0ZXh0OmwsdGV4dEJhc2VsaW5lOlwidG9wXCIsZm9udFNpemU6MTAsZm9udEZhbWlseTp0LmZvbnRGYW1pbHl8fFwiQXJpYWwsIHNhbnMtc2VyaWZcIn0sY2FwdHVyZTohMX0pLGs9Ty5nZXRCQm94KCk7ay5tYXhYPm4/Ty5hdHRyKFwidGV4dEFsaWduXCIsXCJyaWdodFwiKTprLm1pblg8MCYmTy5hdHRyKFwidGV4dEFsaWduXCIsXCJsZWZ0XCIpfX0pKSx0aGlzLnRpY2tSZWN0cz15O3ZhciB3PXRoaXMuZ3JvdXA7dGhpcy5jdXJyZW50U3BlZWQ9MSx0aGlzLmNvbnRyb2xsZXJCdG5Hcm91cD1uZXcgQ2coe2dyb3VwOncseDp0aGlzLngseTp0aGlzLnkrcis1LHdpZHRoOm4saGVpZ2h0OjQwLGhpZGRsZVRvZ2dsZTohMCxzcGVlZDp0aGlzLmN1cnJlbnRTcGVlZCxmb250RmFtaWx5OnRoaXMuZm9udEZhbWlseXx8XCJBcmlhbCwgc2Fucy1zZXJpZlwifSl9LHQucHJvdG90eXBlLmluaXRFdmVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnNsaWNlR3JvdXA7ZS5vbihcImNsaWNrXCIsKGZ1bmN0aW9uKGUpe3ZhciBuPWUudGFyZ2V0O2lmKFwicmVjdFwiPT09bi5nZXQoXCJ0eXBlXCIpJiZuLmdldChcIm5hbWVcIikpe3ZhciByPXBhcnNlSW50KG4uZ2V0KFwibmFtZVwiKS5zcGxpdChcIi1cIilbMl0sMTApO2lmKCFpc05hTihyKSl7dmFyIGk9dC50aWNrUmVjdHMsbz10LnVuc2VsZWN0ZWRUaWNrU3R5bGU7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlY3QuYXR0cihvKX0pKTt2YXIgYT10LnNlbGVjdGVkVGlja1N0eWxlO2lbcl0ucmVjdC5hdHRyKGEpLHQuc3RhcnRUaWNrUmVjdElkPXIsdC5lbmRUaWNrUmVjdElkPXI7dmFyIHM9ci9pLmxlbmd0aDt0LmdyYXBoLmVtaXQoXCJ2YWx1ZUNoYW5nZVwiLHt2YWx1ZTpbcyxzXX0pfX19KSksZS5vbihcImRyYWdzdGFydFwiLChmdW5jdGlvbihlKXt2YXIgbj10LnRpY2tSZWN0cyxyPXQudW5zZWxlY3RlZFRpY2tTdHlsZTtuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucmVjdC5hdHRyKHIpfSkpO3ZhciBpPWUudGFyZ2V0LG89cGFyc2VJbnQoaS5nZXQoXCJuYW1lXCIpLnNwbGl0KFwiLVwiKVsyXSwxMCksYT10LnNlbGVjdGVkVGlja1N0eWxlO25bb10ucmVjdC5hdHRyKGEpLHQuc3RhcnRUaWNrUmVjdElkPW87dmFyIHM9by9uLmxlbmd0aDt0LmdyYXBoLmVtaXQoXCJ2YWx1ZUNoYW5nZVwiLHt2YWx1ZTpbcyxzXX0pLHQuZHJhZ2dpbmc9ITB9KSksZS5vbihcImRyYWdvdmVyXCIsKGZ1bmN0aW9uKGUpe2lmKHQuZHJhZ2dpbmcmJlwicmVjdFwiPT09ZS50YXJnZXQuZ2V0KFwidHlwZVwiKSl7Zm9yKHZhciBuPXBhcnNlSW50KGUudGFyZ2V0LmdldChcIm5hbWVcIikuc3BsaXQoXCItXCIpWzJdLDEwKSxyPXQuc3RhcnRUaWNrUmVjdElkLGk9dC50aWNrUmVjdHMsbz10LnNlbGVjdGVkVGlja1N0eWxlLGE9dC51bnNlbGVjdGVkVGlja1N0eWxlLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIHU9cz49ciYmczw9bj9vOmE7aVtzXS5yZWN0LmF0dHIodSl9dmFyIGM9aS5sZW5ndGg7dC5lbmRUaWNrUmVjdElkPW47dmFyIGY9ci9jLGw9bi9jO3QuZ3JhcGguZW1pdChcInZhbHVlQ2hhbmdlXCIse3ZhbHVlOltmLGxdfSl9fSkpLGUub24oXCJkcm9wXCIsKGZ1bmN0aW9uKGUpe2lmKHQuZHJhZ2dpbmcmJih0LmRyYWdnaW5nPSExLFwicmVjdFwiPT09ZS50YXJnZXQuZ2V0KFwidHlwZVwiKSkpe3ZhciBuPXQuc3RhcnRUaWNrUmVjdElkLHI9cGFyc2VJbnQoZS50YXJnZXQuZ2V0KFwibmFtZVwiKS5zcGxpdChcIi1cIilbMl0sMTApO2lmKCEocjxuKSl7dmFyIGk9dC5zZWxlY3RlZFRpY2tTdHlsZSxvPXQudGlja1JlY3RzO29bcl0ucmVjdC5hdHRyKGkpLHQuZW5kVGlja1JlY3RJZD1yO3ZhciBhPW8ubGVuZ3RoLHM9bi9hLHU9ci9hO3QuZ3JhcGguZW1pdChcInZhbHVlQ2hhbmdlXCIse3ZhbHVlOltzLHVdfSl9fX0pKTt2YXIgbj10aGlzLnRvb2x0aXBCYWNrZ3JvdW5kQ29sb3Iscj10aGlzLnRvb2x0aXBGb21hdHRlcixpPXRoaXMuY2FudmFzLG89bmV3IEJnKHtjb250YWluZXI6aS5nZXQoXCJjb250YWluZXJcIiksYmFja2dyb3VuZENvbG9yOm59KSxhPXRoaXMudGlja1JlY3RzO2EuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5waWNrUmVjdDtlLm9uKFwibW91c2VlbnRlclwiLChmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtpZihcInJlY3RcIj09PWUuZ2V0KFwidHlwZVwiKSl7dmFyIG49cGFyc2VJbnQoZS5nZXQoXCJuYW1lXCIpLnNwbGl0KFwiLVwiKVsyXSwxMCkscz1pLmdldENsaWVudEJ5UG9pbnQoYVtuXS54LGFbbl0ueSk7by5zaG93KHt4OmFbbl0ueCx5OmFbbl0ueSxjbGllbnRYOnMueCxjbGllbnRZOnMueSx0ZXh0OnI/cihhW25dLnZhbHVlKTphW25dLnZhbHVlfSl9fSkpLGUub24oXCJtb3VzZWxlYXZlXCIsKGZ1bmN0aW9uKHQpe28uaGlkZSgpfSkpfSkpO3ZhciBzPXRoaXMuZ3JvdXA7cy5vbihcInBsYXlQYXVzZUJ0bjpjbGlja1wiLChmdW5jdGlvbigpe3QuaXNQbGF5PSF0LmlzUGxheSx0LmNoYW5nZVBsYXlTdGF0dXMoKX0pKSxzLm9uKFwibmV4dFN0ZXBCdG46Y2xpY2tcIiwoZnVuY3Rpb24oKXt0LnVwZGF0ZVN0YXJ0RW5kKDEpfSkpLHMub24oXCJwcmVTdGVwQnRuOmNsaWNrXCIsKGZ1bmN0aW9uKCl7dC51cGRhdGVTdGFydEVuZCgtMSl9KSkscy5vbihcInRpbWViYXJDb25maWdDaGFuZ2VkXCIsKGZ1bmN0aW9uKGUpe2UudHlwZTt2YXIgbj1lLnNwZWVkO3QuY3VycmVudFNwZWVkPW59KSl9LHQucHJvdG90eXBlLmNoYW5nZVBsYXlTdGF0dXM9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ITApLHRoaXMuY29udHJvbGxlckJ0bkdyb3VwLnBsYXlCdXR0b24udXBkYXRlKHtpc1BsYXk6dGhpcy5pc1BsYXl9KSx0aGlzLmlzUGxheT8odGhpcy5wbGF5SGFuZGxlcj10aGlzLnN0YXJ0UGxheSgpLHRoaXMuZ3JhcGguZW1pdChcInRpbWVsaW5lc3RhcnRcIixudWxsKSk6dGhpcy5wbGF5SGFuZGxlciYmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnBsYXlIYW5kbGVyKSx0JiZ0aGlzLmdyYXBoLmVtaXQoXCJ0aW1lbGluZWVuZFwiLG51bGwpKX0sdC5wcm90b3R5cGUuc3RhcnRQbGF5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIGU9dC5jdXJyZW50U3BlZWQ7dC5mcmFtZUNvdW50JSg2MC9lKT09MCYmKHQuZnJhbWVDb3VudD0wLHQudXBkYXRlU3RhcnRFbmQoMSkpLHQuZnJhbWVDb3VudCsrLHQuaXNQbGF5JiYodC5wbGF5SGFuZGxlcj10LnN0YXJ0UGxheSgpKX0pKTp2b2lkIDB9LHQucHJvdG90eXBlLnVwZGF0ZVN0YXJ0RW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudGlja1JlY3RzLG49ZS5sZW5ndGgscj10aGlzLnVuc2VsZWN0ZWRUaWNrU3R5bGUsaT10aGlzLnNlbGVjdGVkVGlja1N0eWxlLG89dGhpcy5lbmRUaWNrUmVjdElkO2lmKHQ+MD90aGlzLmVuZFRpY2tSZWN0SWQrKzooZVt0aGlzLmVuZFRpY2tSZWN0SWRdLnJlY3QuYXR0cihyKSx0aGlzLmVuZFRpY2tSZWN0SWQtLSksbyE9PXRoaXMuc3RhcnRUaWNrUmVjdElkKXRoaXMuZW5kVGlja1JlY3RJZDx0aGlzLnN0YXJ0VGlja1JlY3RJZCYmKHRoaXMuc3RhcnRUaWNrUmVjdElkPXRoaXMuZW5kVGlja1JlY3RJZCk7ZWxzZXtmb3IodmFyIGE9dGhpcy5zdGFydFRpY2tSZWN0SWQ7YTw9dGhpcy5lbmRUaWNrUmVjdElkLTE7YSsrKWVbYV0ucmVjdC5hdHRyKHIpO3RoaXMuc3RhcnRUaWNrUmVjdElkPXRoaXMuZW5kVGlja1JlY3RJZH1pZihlW3RoaXMuZW5kVGlja1JlY3RJZF0pe2VbdGhpcy5lbmRUaWNrUmVjdElkXS5yZWN0LmF0dHIoaSk7dmFyIHM9dGhpcy5zdGFydFRpY2tSZWN0SWQvbix1PXRoaXMuZW5kVGlja1JlY3RJZC9uO3RoaXMuZ3JhcGguZW1pdChcInZhbHVlQ2hhbmdlXCIse3ZhbHVlOltzLHVdfSl9fSx0LnByb3RvdHlwZS5kZXN0b3J5PWZ1bmN0aW9uKCl7dGhpcy5ncmFwaC5vZmYoXCJ2YWx1ZUNoYW5nZVwiKTt2YXIgdD10aGlzLnNsaWNlR3JvdXA7dC5vZmYoXCJjbGlja1wiKSx0Lm9mZihcImRyYWdzdGFydFwiKSx0Lm9mZihcImRyYWdvdmVyXCIpLHQub2ZmKFwiZHJvcFwiKSx0aGlzLnRpY2tSZWN0cy5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnBpY2tSZWN0O2Uub2ZmKFwibW91c2VlbnRlclwiKSxlLm9mZihcIm1vdXNlbGVhdmVcIil9KSksdGhpcy50aWNrUmVjdHMubGVuZ3RoPTAsdC5vZmYoXCJwbGF5UGF1c2VCdG46Y2xpY2tcIiksdC5vZmYoXCJuZXh0U3RlcEJ0bjpjbGlja1wiKSx0Lm9mZihcInByZVN0ZXBCdG46Y2xpY2tcIiksdC5vZmYoXCJ0aW1lYmFyQ29uZmlnQ2hhbmdlZFwiKSx0aGlzLnNsaWNlR3JvdXAuZGVzdHJveSgpfSx0fSgpLFZnPWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4odD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmKHRbbl09ZVtuXSl9KShlLG4pfTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXQoZSxuKSxlLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcil9fSgpLFdnPWZ1bmN0aW9uKCl7cmV0dXJuKFdnPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBpIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sWGc9ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmZS5pbmRleE9mKHIpPDAmJihuW3JdPXRbcl0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPTA7Zm9yKHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtpPHIubGVuZ3RoO2krKyllLmluZGV4T2YocltpXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQscltpXSkmJihuW3JbaV1dPXRbcltpXV0pfXJldHVybiBufSxZZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gVmcoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0Q2Zncz1mdW5jdGlvbigpe3JldHVybntjb250YWluZXI6bnVsbCxjbGFzc05hbWU6XCJnNi1jb21wb25lbnQtdGltZWJhclwiLHBhZGRpbmc6MTAsdHlwZTpcInRyZW5kXCIsdHJlbmQ6e2RhdGE6W10saXNBcmVhOiExLHNtb290aDohMH0sY29udHJvbGxlckNmZzp7c3BlZWQ6Mixsb29wOiExfSxzbGlkZXI6e3N0YXJ0Oi4xLGVuZDouOSxtaW5UZXh0OlwibWluXCIsbWF4VGV4dDpcIm1heFwifSx0aWNrOntzdGFydDouMSxlbmQ6LjksZGF0YTpbXX0sdGV4dFN0eWxlOnt9fX0sZS5wcm90b3R5cGUuaW5pdENvbnRhaW5lcj1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLmdldChcImdyYXBoXCIpLHI9dGhpcy5fY2ZncyxpPXIud2lkdGgsbz1yLmhlaWdodCxhPXRoaXMuZ2V0KFwiY2xhc3NOYW1lXCIpfHxcImc2LWNvbXBvbmVudC10aW1lYmFyXCIscz10aGlzLmdldChcImNvbnRhaW5lclwiKSx1PXRoaXMuZ2V0KFwiZ3JhcGhcIikuZ2V0KFwiY29udGFpbmVyXCIpO3M/KE9iamVjdChoLngpKHMpJiYocz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChzKSksdD1zKTp2dCh0PWd0KFwiPGRpdiBjbGFzcz0nXCIrYStcIic+PC9kaXY+XCIpLHtwb3NpdGlvbjpcInJlbGF0aXZlXCJ9KSx1LmFwcGVuZENoaWxkKHQpLHRoaXMuc2V0KFwidGltZUJhckNvbnRhaW5lclwiLHQpLGU9XCJTVkdcIj09PW4uZ2V0KFwicmVuZGVyZXJcIik/bmV3IHNuLkNhbnZhcyh7Y29udGFpbmVyOnQsd2lkdGg6aSxoZWlnaHQ6b30pOm5ldyBhbi5DYW52YXMoe2NvbnRhaW5lcjp0LHdpZHRoOmksaGVpZ2h0Om99KSx0aGlzLnNldChcImNhbnZhc1wiLGUpfSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5pbml0Q29udGFpbmVyKCk7dmFyIHQ9dGhpcy5nZXQoXCJjYW52YXNcIikuYWRkR3JvdXAoe25hbWU6XCJ0aW1lYmFyLWdyb3VwXCJ9KTt0aGlzLnNldChcInRpbWVCYXJHcm91cFwiLHQpLHRoaXMucmVuZGVyVHJlbmQoKSx0aGlzLmluaXRFdmVudCgpO3ZhciBlPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtZmFtaWx5XCIpfHxcIkFyaWFsLCBzYW5zLXNlcmlmXCI7dGhpcy5zZXQoXCJmb250RmFtaWx5XCIsZSl9LGUucHJvdG90eXBlLnJlbmRlclRyZW5kPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY2ZncyxlPXQud2lkdGgsbj10Lngscj10LnksaT10LnBhZGRpbmcsbz10LnR5cGUsYT10LnRyZW5kLHM9dC5zbGlkZXIsdT10LmNvbnRyb2xsZXJDZmcsYz10LnRleHRTdHlsZSxmPWEuZGF0YSxsPVhnKGEsW1wiZGF0YVwiXSksaD1lLTIqaSxkPVwidHJlbmRcIj09PW8/MjY6OCxwPXRoaXMuZ2V0KFwiZ3JhcGhcIiksZz10aGlzLmdldChcInRpbWVCYXJHcm91cFwiKSx2PXRoaXMuZ2V0KFwiY2FudmFzXCIpLHk9bnVsbDtpZihcInRyZW5kXCI9PT1vfHxcInNpbXBsZVwiPT09byl5PW5ldyBMZyhXZyhXZyh7Z3JhcGg6cCxjYW52YXM6dixncm91cDpnLHR5cGU6byx4Om4raSx5OlwidHJlbmRcIj09PW8/citpOnIraSsxNSx3aWR0aDpoLGhlaWdodDpkLHBhZGRpbmc6aSx0cmVuZENmZzpXZyhXZyh7fSxsKSx7ZGF0YTpmLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWV9KSl9KX0scykse3RpY2tzOmYubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5kYXRlfSkpLGhhbmRsZXJTdHlsZTpXZyhXZyh7fSxzLmhhbmRsZXJTdHlsZSkse2hlaWdodDpzLmhlaWdodHx8ZH0pLGNvbnRyb2xsZXJDZmc6dSx0ZXh0U3R5bGU6Y30pKTtlbHNlIGlmKFwidGlja1wiPT09byl7dmFyIG09dGhpcy5fY2Zncy50aWNrO3k9bmV3IHpnKFdnKHtncmFwaDpwLGNhbnZhczp2LGdyb3VwOmcseDpuK2kseTpyK2l9LG0pKX10aGlzLnNldChcInRpbWViYXJcIix5KX0sZS5wcm90b3R5cGUuZmlsdGVyRGF0YT1mdW5jdGlvbih0KXt2YXIgZT10LnZhbHVlLG49bnVsbCxyPXRoaXMuX2NmZ3MudHlwZTtpZihcInRyZW5kXCI9PT1yfHxcInNpbXBsZVwiPT09cj9uPXRoaXMuX2NmZ3MudHJlbmQuZGF0YTpcInRpY2tcIj09PXImJihuPXRoaXMuX2NmZ3MudGljay5kYXRhKSxuJiYwIT09bi5sZW5ndGgpe3ZhciBpPXRoaXMuZ2V0KFwicmFuZ2VDaGFuZ2VcIiksbz10aGlzLmdldChcImdyYXBoXCIpLGE9TWF0aC5yb3VuZChuLmxlbmd0aCplWzBdKSxzPU1hdGgucm91bmQobi5sZW5ndGgqZVsxXSk7cz1zPj1uLmxlbmd0aD9uLmxlbmd0aC0xOnM7dmFyIHU9blthXS5kYXRlLGM9bltzXS5kYXRlO2lmKFwidGlja1wiIT09cil0aGlzLmdldChcInRpbWViYXJcIikuc2V0VGV4dCh1LGMpO2lmKGkpaShvLHUsYyk7ZWxzZXt2YXIgZj1vLnNhdmUoKTsoIXRoaXMuY2FjaGVHcmFwaERhdGF8fHRoaXMuY2FjaGVHcmFwaERhdGEubm9kZXMmJjA9PT10aGlzLmNhY2hlR3JhcGhEYXRhLm5vZGVzLmxlbmd0aCkmJih0aGlzLmNhY2hlR3JhcGhEYXRhPWYpO3ZhciBsPXRoaXMuY2FjaGVHcmFwaERhdGEubm9kZXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5kYXRlPj11JiZ0LmRhdGU8PWN9KSksaD1sLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuaWR9KSksZD10aGlzLmNhY2hlR3JhcGhEYXRhLmVkZ2VzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIGguaW5jbHVkZXModC5zb3VyY2UpJiZoLmluY2x1ZGVzKHQudGFyZ2V0KX0pKTtvLmNoYW5nZURhdGEoe25vZGVzOmwsZWRnZXM6ZH0pfX1lbHNlIGNvbnNvbGUud2FybihcIsOowq/Ct8Op4oCmwo3Dp8K9wq4gVGltZUJhciDDp8K74oCew6TCu8K2w6fFoeKAnsOm4oCiwrDDpsKNwq5cIil9LGUucHJvdG90eXBlLmluaXRFdmVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT0wLG49MCxyPXRoaXMuX2NmZ3MudHlwZTtyJiZcInRyZW5kXCIhPT1yJiZcInNpbXBsZVwiIT09cj9cInRpY2tcIj09PXImJihlPXRoaXMuX2NmZ3MudGljay5zdGFydCxuPXRoaXMuX2NmZ3MudGljay5lbmQpOihlPXRoaXMuX2NmZ3Muc2xpZGVyLnN0YXJ0LG49dGhpcy5fY2Zncy5zbGlkZXIuZW5kKTt2YXIgaT10aGlzLmdldChcImdyYXBoXCIpO2kub24oXCJhZnRlcnJlbmRlclwiLChmdW5jdGlvbigpe3QuZmlsdGVyRGF0YSh7dmFsdWU6W2Usbl19KX0pKSxpLm9uKFwidmFsdWVDaGFuZ2VcIiwoZnVuY3Rpb24oZSl7dC5maWx0ZXJEYXRhKGUpfSkpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXQoXCJ0aW1lYmFyXCIpO2UmJmUuZGVzdG9yeSYmZS5kZXN0b3J5KCksdC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3ZhciBuPXRoaXMuZ2V0KFwidGltZUJhckNvbnRhaW5lclwiKTtpZihuKXt2YXIgcj10aGlzLmdldChcImNvbnRhaW5lclwiKTtyfHwocj10aGlzLmdldChcImdyYXBoXCIpLmdldChcImNvbnRhaW5lclwiKSksT2JqZWN0KGgueCkocikmJihyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIpKSxyLnJlbW92ZUNoaWxkKG4pfX0sZX0oeWQpLEhnPWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4odD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmKHRbbl09ZVtuXSl9KShlLG4pfTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXQoZSxuKSxlLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcil9fSgpLHFnPVFlLmFwcGx5TWF0cml4O3ZhciBLZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gSGcoZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0Q2Zncz1mdW5jdGlvbigpe3JldHVybntjb250YWluZXI6bnVsbCxjbGFzc05hbWU6XCJnNi1taW5pbWFwXCIsdmlld3BvcnRDbGFzc05hbWU6XCJnNi1taW5pbWFwLXZpZXdwb3J0XCIsd2lkdGg6MjAwLGRlbGVnYXRlU3R5bGU6e2ZpbGw6XCIjNDBhOWZmXCIsc3Ryb2tlOlwiIzA5NmRkOVwifSxyZWZyZXNoOiEwfX0sZS5wcm90b3R5cGUuZ2V0RXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJue2JlZm9yZXBhaW50OlwidXBkYXRlVmlld3BvcnRcIixiZWZvcmVhbmltYXRlOlwiZGlzYWJsZVJlZnJlc2hcIixhZnRlcmFuaW1hdGU6XCJlbmFibGVSZWZyZXNoXCIsdmlld3BvcnRjaGFuZ2U6XCJkaXNhYmxlT25lUmVmcmVzaFwifX0sZS5wcm90b3R5cGUuZGlzYWJsZVJlZnJlc2g9ZnVuY3Rpb24oKXt0aGlzLnNldChcInJlZnJlc2hcIiwhMSl9LGUucHJvdG90eXBlLmVuYWJsZVJlZnJlc2g9ZnVuY3Rpb24oKXt0aGlzLnNldChcInJlZnJlc2hcIiwhMCksdGhpcy51cGRhdGVDYW52YXMoKX0sZS5wcm90b3R5cGUuZGlzYWJsZU9uZVJlZnJlc2g9ZnVuY3Rpb24oKXt0aGlzLnNldChcInZpZXdwb3J0Q2hhbmdlXCIsITApfSxlLnByb3RvdHlwZS5pbml0Vmlld3BvcnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fY2ZncyxuPWUuZ3JhcGg7aWYoIXRoaXMuZGVzdHJveWVkKXt2YXIgcj10aGlzLmdldChcImNvbnRhaW5lclwiKTtPYmplY3QoaC54KShyKSYmKHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocikpO3ZhciBpPWd0KFwiPGRpdiBjbGFzcz1cIitlLnZpZXdwb3J0Q2xhc3NOYW1lK1wiXFxuICAgICAgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO1xcbiAgICAgICAgbGVmdDowO1xcbiAgICAgICAgdG9wOjA7XFxuICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XFxuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjMTk4MGZmJz5cXG4gICAgICA8L2Rpdj5cIiksbz0wLGE9MCxzPSExLHU9MCxjPTAsZj0wLGw9MCxkPTAscD0wO3IuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLChmdW5jdGlvbihyKXtpZihlLnJlZnJlc2g9ITEsci50YXJnZXQ9PT1pKXt2YXIgdT1pLnN0eWxlO2Y9cGFyc2VJbnQodS53aWR0aCwxMCksbD1wYXJzZUludCh1LmhlaWdodCwxMCk7dmFyIGM9dC5nZXQoXCJ3aWR0aFwiKSxoPXQuZ2V0KFwiaGVpZ2h0XCIpO2Y+Y3x8bD5ofHwocD1uLmdldFpvb20oKSxkPXQuZ2V0KFwicmF0aW9cIikscz0hMCxvPXIuY2xpZW50WCxhPXIuY2xpZW50WSl9fSksITEpLHIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLChmdW5jdGlvbihlKXtpZihzJiYhT2JqZWN0KGgucykoZS5jbGllbnRYKSYmIU9iamVjdChoLnMpKGUuY2xpZW50WSkpe3ZhciByPXQuZ2V0KFwid2lkdGhcIiksZz10LmdldChcImhlaWdodFwiKSx2PWkuc3R5bGU7dT1wYXJzZUludCh2LmxlZnQsMTApLGM9cGFyc2VJbnQodi50b3AsMTApLGY9cGFyc2VJbnQodi53aWR0aCwxMCksbD1wYXJzZUludCh2LmhlaWdodCwxMCk7dmFyIHk9by1lLmNsaWVudFgsbT1hLWUuY2xpZW50WTt1LXk8MD95PXU6dS15K2Y+PXImJih5PTApLGMtbTwwP209YzpjLW0rbD49ZyYmKG09MCksdnQoaSx7bGVmdDoodS09eSkrXCJweFwiLHRvcDooYy09bSkrXCJweFwifSksbi50cmFuc2xhdGUoeSpwL2QsbSpwL2QpLG89ZS5jbGllbnRYLGE9ZS5jbGllbnRZfX0pLCExKSxyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsKGZ1bmN0aW9uKCl7cz0hMSxlLnJlZnJlc2g9ITB9KSwhMSksci5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLChmdW5jdGlvbigpe3M9ITEsZS5yZWZyZXNoPSEwfSksITEpLHRoaXMuc2V0KFwidmlld3BvcnRcIixpKSxyLmFwcGVuZENoaWxkKGkpfX0sZS5wcm90b3R5cGUudXBkYXRlVmlld3BvcnQ9ZnVuY3Rpb24oKXtpZighdGhpcy5kZXN0cm95ZWQpe3ZhciB0PXRoaXMuZ2V0KFwicmF0aW9cIiksZT10aGlzLmdldChcIndpZHRoXCIpLG49dGhpcy5nZXQoXCJoZWlnaHRcIikscj10aGlzLmdldChcImdyYXBoXCIpLGk9ci5nZXQoXCJ3aWR0aFwiKSxvPWkvci5nZXQoXCJoZWlnaHRcIiksYT1yLmdldEdyb3VwKCkscz1hLmdldENhbnZhc0JCb3goKSx1PVsocy5taW5YK3MubWF4WCkvMiwocy5taW5ZK3MubWF4WSkvMl0sYz1bcy5tYXhYLXMubWluWCxzLm1heFktcy5taW5ZXSxmPXtjZW50ZXJYOnVbMF0sY2VudGVyWTp1WzFdLHdpZHRoOjAsaGVpZ2h0OjAsbWluWDowLG1pblk6MH07c1swXS9zWzFdPm8/KGYud2lkdGg9Y1swXSxmLmhlaWdodD1mLndpZHRoL28pOihmLmhlaWdodD1jWzFdLGYud2lkdGg9Zi5oZWlnaHQqbyksZi5taW5YPXVbMF0tZi53aWR0aC8yLGYubWluWT11WzFdLWYuaGVpZ2h0LzI7dmFyIGw9YS5nZXRNYXRyaXgoKTtsfHwobD1bMSwwLDAsMCwxLDAsMCwwLDFdKTt2YXIgaD11bi5hLmludmVydChbMSwwLDAsMCwxLDAsMCwwLDFdLGwpLGQ9cWcoe3g6Zi5taW5YLHk6Zi5taW5ZfSxoKSxwPXIuZ2V0Q2FudmFzQnlQb2ludChkLngsZC55KSxnPXRoaXMuZ2V0KFwidmlld3BvcnRcIik7Z3x8dGhpcy5pbml0Vmlld3BvcnQoKTt2YXIgdj1pL2Yud2lkdGgseT12KmUsbT12Km4sYj1lKi1wLngvZi53aWR0aCx4PW4qLXAueS9mLmhlaWdodCx3PWIreSxTPXgrbTtiPDAmJih5Kz1iLGI9MCksdz5lJiYoeS09dy1lKSx4PDAmJihtKz14LHg9MCksUz5uJiYobS09Uy1uKSx0aGlzLnNldChcInJhdGlvXCIsdCksdnQoZyx7bGVmdDpiK1wicHhcIix0b3A6eCtcInB4XCIsd2lkdGg6eStcInB4XCIsaGVpZ2h0Om0rXCJweFwifSl9fSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5pbml0Q29udGFpbmVyKCl9LGUucHJvdG90eXBlLmluaXRDb250YWluZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImdyYXBoXCIpLGU9dC5nZXQoXCJ3aWR0aFwiKSxuPXQuZ2V0KFwiaGVpZ2h0XCIpL2Uscj10aGlzLmdldChcImNsYXNzTmFtZVwiKSxpPXRoaXMuZ2V0KFwiY29udGFpbmVyXCIpLG89dGhpcy5nZXQoXCJ3aWR0aFwiKSxhPXRoaXMuZ2V0KFwiaGVpZ2h0XCIpO298fGF8fChvPTIwMCksbz8oYT1uKm8sdGhpcy5zZXQoXCJoZWlnaHRcIixhKSk6KG89MS9uKmEsdGhpcy5zZXQoXCJ3aWR0aFwiLG8pKTt2YXIgcz1ndChcIjxkaXYgY2xhc3M9J1wiK3IrXCInIHN0eWxlPSd3aWR0aDogXCIrbytcInB4OyBoZWlnaHQ6IFwiK2ErXCJweDsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyc+PC9kaXY+XCIpO09iamVjdChoLngpKGkpJiYoaT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKSksaT9pLmFwcGVuZENoaWxkKHMpOnQuZ2V0KFwiY29udGFpbmVyXCIpLmFwcGVuZENoaWxkKHMpLHRoaXMuc2V0KFwiY29udGFpbmVyXCIscyk7dmFyIHU9Z3QoJzxkaXYgY2xhc3M9XCJnNi1taW5pbWFwLWNvbnRhaW5lclwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGRpc3BsYXk6IHRhYmxlO1wiPjwvZGl2PicpO3MuYXBwZW5kQ2hpbGQodSk7dmFyIGM9Z3QoJzxzcGFuIHN0eWxlPVwiZGlzcGxheTogdGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgXCI+PC9zcGFuPicpO3UuYXBwZW5kQ2hpbGQoYyksdGhpcy5zZXQoXCJjb250YWluZXJET01cIix1KSx0aGlzLnNldChcImNvbnRhaW5lclNwYW5cIixjKTt2YXIgZj1ndCgnPGltZyBhbHQ9XCJcIiBzcmM9XCInK3RoaXMuZ2V0KFwiZ3JhcGhJbWdcIikrJ1wiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiIG9uZHJhZ3N0YXJ0PVwicmV0dXJuIGZhbHNlO1wiIG9uc2VsZWN0c3RhcnQ9XCJyZXR1cm4gZmFsc2U7XCIvPicpO3RoaXMuc2V0KFwiaW1nRE9NXCIsZiksdGhpcy51cGRhdGVJbWdTaXplKCksYy5hcHBlbmRDaGlsZChmKSx0aGlzLnVwZGF0ZUNhbnZhcygpfSxlLnByb3RvdHlwZS51cGRhdGVJbWdTaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJpbWdET01cIiksZT10aGlzLmdldChcIndpZHRoXCIpLG49dGhpcy5nZXQoXCJoZWlnaHRcIik7dC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgcj1mdW5jdGlvbih0LGUpe3ZhciBuLHI7aWYodC5uYXR1cmFsV2lkdGgpbj10Lm5hdHVyYWxXaWR0aCxyPXQubmF0dXJhbEhlaWdodDtlbHNle3ZhciBpPW5ldyBJbWFnZTtpLnNyYz10LnNyYyxpLm9ubG9hZD1mdW5jdGlvbigpe2UmJmUoaS53aWR0aCxpLmhlaWdodCl9fXJldHVybltuLHJdfSh0KTtyWzBdPnJbMV0/dC53aWR0aD1lOnQuaGVpZ2h0PW59fSxlLnByb3RvdHlwZS51cGRhdGVDYW52YXM9ZnVuY3Rpb24oKXtpZih0aGlzLmdldChcInJlZnJlc2hcIikpe3ZhciB0PXRoaXMuZ2V0KFwiZ3JhcGhcIik7aWYoIXQuZ2V0KFwiZGVzdHJveWVkXCIpKXt0aGlzLmdldChcInZpZXdwb3J0Q2hhbmdlXCIpJiYodGhpcy5zZXQoXCJ2aWV3cG9ydENoYW5nZVwiLCExKSx0aGlzLnVwZGF0ZVZpZXdwb3J0KCkpO3ZhciBlPXRoaXMuZ2V0KFwid2lkdGhcIikvdC5nZXQoXCJjYW52YXNcIikuZ2V0Q2FudmFzQkJveCgpLndpZHRoO3RoaXMuc2V0KFwicmF0aW9cIixlKSx0aGlzLnVwZGF0ZVZpZXdwb3J0KCl9fX0sZS5wcm90b3R5cGUuZ2V0Vmlld3BvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoXCJ2aWV3cG9ydFwiKX0sZS5wcm90b3R5cGUuZ2V0Q29udGFpbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFwiY29udGFpbmVyXCIpfSxlLnByb3RvdHlwZS51cGRhdGVHcmFwaEltZz1mdW5jdGlvbih0KXt0aGlzLmdldChcImltZ0RPTVwiKS5yZW1vdmUoKSx0aGlzLnNldChcImdyYXBoSW1nXCIsdCk7dmFyIGU9Z3QoJzxpbWcgYWx0PVwiXCIgc3JjPVwiJyt0KydcIiBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1ibG9jaztcIiBvbmRyYWdzdGFydD1cInJldHVybiBmYWxzZTtcIiBvbnNlbGVjdHN0YXJ0PVwicmV0dXJuIGZhbHNlO1wiLz4nKTt0aGlzLnNldChcImltZ0RPTVwiLGUpLGUuc3JjPXQsdGhpcy51cGRhdGVJbWdTaXplKCksdGhpcy5nZXQoXCJjb250YWluZXJTcGFuXCIpLmFwcGVuZENoaWxkKGUpLHRoaXMudXBkYXRlQ2FudmFzKCl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcImNvbnRhaW5lclwiKTt0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9LGV9KHlkKSxaZz1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKGUsbil7cmV0dXJuKHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJih0W25dPWVbbl0pfSkoZSxuKX07cmV0dXJuIGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9ZX10KGUsbiksZS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooci5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHIpfX0oKSxRZz1mdW5jdGlvbigpe3JldHVybihRZz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgaSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LEpnPVFlLmRpc3RhbmNlLCRnPXtzdHJva2U6XCIjMDAwXCIsc3Ryb2tlT3BhY2l0eTouOCxsaW5lV2lkdGg6MixmaWxsT3BhY2l0eToxLGZpbGw6XCIjZmZmXCJ9LHR2PXtQbHVnaW5CYXNlOnlkLE1lbnU6X2QsR3JpZDp4ZCxNaW5pbWFwOlRkLEJ1bmRsaW5nOmpkLFRvb2xCYXI6R2QsVG9vbHRpcDpVZCxGaXNoZXllOkxkLFRpbWVCYXI6WWcsSW1hZ2VNaW5pbWFwOktnLEVkZ2VGaWx0ZXJMZW5zOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBaZyhlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRDZmdzPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6XCJib3RoXCIsdHJpZ2dlcjpcIm1vdXNlbW92ZVwiLHI6NjAsZGVsZWdhdGVTdHlsZTpPYmplY3QoaC5jKSgkZyksc2hvd0xhYmVsOlwiZWRnZVwiLHNjYWxlUkJ5Olwid2hlZWxcIn19LGUucHJvdG90eXBlLmdldEV2ZW50cz1mdW5jdGlvbigpe3ZhciB0O3N3aXRjaCh0aGlzLmdldChcInRyaWdnZXJcIikpe2Nhc2VcImNsaWNrXCI6dD17Y2xpY2s6XCJmaWx0ZXJcIn07YnJlYWs7Y2FzZVwiZHJhZ1wiOnQ9e2NsaWNrOlwiY3JlYXRlRGVsZWdhdGVcIn07YnJlYWs7ZGVmYXVsdDp0PXttb3VzZW1vdmU6XCJmaWx0ZXJcIn19cmV0dXJuIHR9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldChcInNob3dMYWJlbFwiKSxlPVwibm9kZVwiPT09dHx8XCJib3RoXCI9PT10LG49XCJlZGdlXCI9PT10fHxcImJvdGhcIj09PXQ7dGhpcy5zZXQoXCJzaG93Tm9kZUxhYmVsXCIsZSksdGhpcy5zZXQoXCJzaG93RWRnZUxhYmVsXCIsbiksdGhpcy5nZXQoXCJzaG91bGRTaG93XCIpfHx0aGlzLnNldChcInNob3VsZFNob3dcIiwoZnVuY3Rpb24oKXtyZXR1cm4hMH0pKX0sZS5wcm90b3R5cGUuY3JlYXRlRGVsZWdhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWUuZ2V0KFwiZGVsZWdhdGVcIik7biYmIW4uZGVzdHJveWVkfHwoZS5maWx0ZXIodCksKG49ZS5nZXQoXCJkZWxlZ2F0ZVwiKSkub24oXCJkcmFnc3RhcnRcIiwoZnVuY3Rpb24odCl7fSkpLG4ub24oXCJkcmFnXCIsKGZ1bmN0aW9uKHQpe2UuZmlsdGVyKHQpfSkpLFwid2hlZWxcIj09PXRoaXMuZ2V0KFwic2NhbGVSQnlcIikmJm4ub24oXCJtb3VzZXdoZWVsXCIsKGZ1bmN0aW9uKHQpe2Uuc2NhbGVSQnlXaGVlbCh0KX0pKSl9LGUucHJvdG90eXBlLnNjYWxlUkJ5V2hlZWw9ZnVuY3Rpb24odCl7aWYodCYmdC5vcmlnaW5hbEV2ZW50KXt0LnByZXZlbnREZWZhdWx0JiZ0LnByZXZlbnREZWZhdWx0KCk7dmFyIGUsbj10aGlzLmdldChcImdyYXBoXCIpLHI9dGhpcy5nZXQoXCJkZWxlZ2F0ZVwiKTsocj97eDpyLmF0dHIoXCJ4XCIpLHk6ci5hdHRyKFwieVwiKX06dm9pZCAwKXx8bi5nZXRQb2ludEJ5Q2xpZW50KHQuY2xpZW50WCx0LmNsaWVudFkpO2U9dC5vcmlnaW5hbEV2ZW50LndoZWVsRGVsdGE8MD8uOTU6MS8uOTU7dmFyIGk9dGhpcy5nZXQoXCJtYXhSXCIpLG89dGhpcy5nZXQoXCJtaW5SXCIpLGE9dGhpcy5nZXQoXCJyXCIpOyhhPihpfHxuLmdldChcImhlaWdodFwiKSkmJmU+MXx8YTwob3x8LjA1Km4uZ2V0KFwiaGVpZ2h0XCIpKSYmZTwxKSYmKGU9MSksYSo9ZSx0aGlzLnNldChcInJcIixhKSx0aGlzLmZpbHRlcih0KX19LGUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcImdyYXBoXCIpLG49ZS5nZXROb2RlcygpLHI9e30saT10aGlzLmdldChcInJcIiksbz10aGlzLmdldChcInR5cGVcIiksYT17eDp0LngseTp0Lnl9O3RoaXMudXBkYXRlRGVsZWdhdGUoYSxpKTt2YXIgcz10aGlzLmdldChcInNob3VsZFNob3dcIiksdT10aGlzLmdldChcInZTaGFwZXNcIik7dSYmdS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlbW92ZSgpLHQuZGVzdHJveSgpfSkpLHU9W10sbi5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LmdldE1vZGVsKCksbj1lLngsbz1lLnk7Smcoe3g6bix5Om99LGEpPGkmJihyW2UuaWRdPXQpfSkpO3ZhciBjPWUuZ2V0RWRnZXMoKSxmPVtdO2MuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRNb2RlbCgpLG49ZS5zb3VyY2UsaT1lLnRhcmdldDtzKGUpJiYoXCJvbmx5LXNvdXJjZVwiPT09b3x8XCJvbmVcIj09PW8/cltuXSYmIXJbaV0mJmYucHVzaCh0KTpcIm9ubHktdGFyZ2V0XCI9PT1vfHxcIm9uZVwiPT09bz9yW2ldJiYhcltuXSYmZi5wdXNoKHQpOlwiYm90aFwiPT09byYmcltuXSYmcltpXSYmZi5wdXNoKHQpKX0pKTt2YXIgbD10aGlzLmdldChcInNob3dOb2RlTGFiZWxcIiksaD10aGlzLmdldChcInNob3dFZGdlbGFiZWxcIiksZD1lLmdldChcImdyb3VwXCIpO2YuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5nZXQoXCJncm91cFwiKS5nZXQoXCJjaGlsZHJlblwiKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LmdldChcInR5cGVcIiksbj1kLmFkZFNoYXBlKGUse2F0dHJzOnQuYXR0cigpfSk7dS5wdXNoKG4pLGwmJlwidGV4dFwiPT09ZSYmbi5zZXQoXCJ2aXNpYmxlXCIsITApfSkpfSkpLE9iamVjdC5rZXlzKHIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXJbdF0uZ2V0KFwiZ3JvdXBcIikuY2xvbmUoKTtpZihkLmFkZChlKSx1LnB1c2goZSksaClmb3IodmFyIG49ZS5nZXQoXCJjaGlsZHJlblwiKSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciBvPW5baV07XCJ0ZXh0XCI9PT1vLmdldChcInR5cGVcIikmJm8uc2V0KFwidmlzaWJsZVwiLCEwKX19KSksdGhpcy5zZXQoXCJ2U2hhcGVzXCIsdSl9LGUucHJvdG90eXBlLnVwZGF0ZVBhcmFtcz1mdW5jdGlvbih0KXt2YXIgZT10LnIsbj10LnRyaWdnZXIscj10Lm1pblIsaT10Lm1heFIsbz10LnNjYWxlUkJ5LGE9dC5zaG93TGFiZWwscz10LnNob3VsZFNob3c7aWYoaXNOYU4odC5yKXx8dGhpcy5zZXQoXCJyXCIsZSksaXNOYU4oaSl8fHRoaXMuc2V0KFwibWF4UlwiLGkpLGlzTmFOKHIpfHx0aGlzLnNldChcIm1pblJcIixyKSxcIm1vdXNlbW92ZVwiIT09biYmXCJjbGlja1wiIT09bnx8dGhpcy5zZXQoXCJ0cmlnZ2VyXCIsbiksXCJ3aGVlbFwiPT09b3x8XCJ1bnNldFwiPT09byl7dGhpcy5zZXQoXCJzY2FsZVJCeVwiLG8pLHRoaXMuZ2V0KFwiZGVsZWdhdGVcIikucmVtb3ZlKCksdGhpcy5nZXQoXCJkZWxlZ2F0ZVwiKS5kZXN0cm95KCk7dmFyIHU9dGhpcy5nZXQoXCJkUGVyY2VudFRleHRcIik7dSYmKHUucmVtb3ZlKCksdS5kZXN0cm95KCkpfVwibm9kZVwiIT09YSYmXCJib3RoXCIhPT1hfHx0aGlzLnNldChcInNob3dOb2RlTGFiZWxcIiwhMCksXCJlZGdlXCIhPT1hJiZcImJvdGhcIiE9PWF8fHRoaXMuc2V0KFwic2hvd0VkZ2VMYWJlbFwiLCEwKSxzJiZ0aGlzLnNldChcInNob3VsZFNob3dcIixzKX0sZS5wcm90b3R5cGUudXBkYXRlRGVsZWdhdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9bi5nZXQoXCJncmFwaFwiKSxpPW4uZ2V0KFwiZGVsZWdhdGVcIik7aWYoIWl8fGkuZGVzdHJveWVkKXt2YXIgbz1yLmdldChcImdyb3VwXCIpLGE9bi5nZXQoXCJkZWxlZ2F0ZVN0eWxlXCIpfHwkZztpPW8uYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6UWcoe3I6ZSx4OnQueCx5OnQueX0sYSksbmFtZTpcImxlbnMtc2hhcGVcIixkcmFnZ2FibGU6ITB9KSxcImRyYWdcIiE9PXRoaXMuZ2V0KFwidHJpZ2dlclwiKSYmXCJ3aGVlbFwiPT09dGhpcy5nZXQoXCJzY2FsZVJCeVwiKSYmaS5vbihcIm1vdXNld2hlZWxcIiwoZnVuY3Rpb24odCl7bi5zY2FsZVJCeVdoZWVsKHQpfSkpfWVsc2UgaS5hdHRyKHt4OnQueCx5OnQueSxyOmV9KTtuLnNldChcImRlbGVnYXRlXCIsaSl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoXCJ2U2hhcGVzXCIpO3QmJnQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZW1vdmUoKSx0LmRlc3Ryb3koKX0pKSx0PVtdLHRoaXMuc2V0KFwidlNoYXBlc1wiLHQpO3ZhciBlPXRoaXMuZ2V0KFwiZGVsZWdhdGVcIik7ZSYmIWUuZGVzdHJveWVkJiYoZS5yZW1vdmUoKSxlLmRlc3Ryb3koKSl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCl9LGV9KHlkKX07ZnVuY3Rpb24gZXYodCl7cmV0dXJuKGV2PVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX10bihcImNpcmNsZVwiLHtvcHRpb25zOntzaXplOm9uLmRlZmF1bHROb2RlLnNpemUsc3R5bGU6e3g6MCx5OjAsc3Ryb2tlOm9uLmRlZmF1bHROb2RlLnN0eWxlLnN0cm9rZSxmaWxsOm9uLmRlZmF1bHROb2RlLnN0eWxlLmZpbGwsbGluZVdpZHRoOm9uLmRlZmF1bHROb2RlLnN0eWxlLmxpbmVXaWR0aH0sbGFiZWxDZmc6e3N0eWxlOntmaWxsOm9uLm5vZGVMYWJlbC5zdHlsZS5maWxsLGZvbnRTaXplOm9uLm5vZGVMYWJlbC5zdHlsZS5mb250U2l6ZX19LGxpbmtQb2ludHM6e3RvcDohMSxyaWdodDohMSxib3R0b206ITEsbGVmdDohMSxzaXplOm9uLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuc2l6ZSxsaW5lV2lkdGg6b24uZGVmYXVsdE5vZGUubGlua1BvaW50cy5saW5lV2lkdGgsZmlsbDpvbi5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLmZpbGwsc3Ryb2tlOm9uLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuc3Ryb2tlfSxpY29uOntzaG93OiExLGltZzpcImh0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL2Jtdy1wcm9kLzVkMDE1MDY1LTg1MDUtNGU3YS1iYWVjLTk3NmY4MWUzYzQxZC5zdmdcIix3aWR0aDoyMCxoZWlnaHQ6MjB9LHN0YXRlU3R5bGVzOk9iamVjdCh2LmEpKHt9LG9uLm5vZGVTdGF0ZVN0eWxlcyl9LHNoYXBlVHlwZTpcImNpcmNsZVwiLGxhYmVsUG9zaXRpb246XCJjZW50ZXJcIixkcmF3U2hhcGU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldE9wdGlvbnModCkuaWNvbixyPXZvaWQgMD09PW4/e306bixpPXRoaXMuZ2V0U2hhcGVTdHlsZSh0KSxvPU9iamVjdChoLmUpKHt9LHIsdC5pY29uKSxhPWUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6aSxjbGFzc05hbWU6dGhpcy50eXBlK1wiLWtleVNoYXBlXCIsZHJhZ2dhYmxlOiEwfSkscz1vLndpZHRoLHU9by5oZWlnaHQ7cmV0dXJuIG8uc2hvdyYmZS5hZGRTaGFwZShcImltYWdlXCIse2F0dHJzOk9iamVjdCh2LmEpKHt4Oi1zLzIseTotdS8yfSxvKSxjbGFzc05hbWU6dGhpcy50eXBlK1wiLWljb25cIixuYW1lOnRoaXMudHlwZStcIi1pY29uXCIsZHJhZ2dhYmxlOiEwfSksdGhpcy5kcmF3TGlua1BvaW50cyh0LGUpLGF9LGRyYXdMaW5rUG9pbnRzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRPcHRpb25zKHQpLmxpbmtQb2ludHMscj12b2lkIDA9PT1uP3t9Om4saT1yLnRvcCxvPXIubGVmdCxhPXIucmlnaHQscz1yLmJvdHRvbSx1PXIuc2l6ZSxjPXIucixmPU9iamVjdCh2LmMpKHIsW1widG9wXCIsXCJsZWZ0XCIsXCJyaWdodFwiLFwiYm90dG9tXCIsXCJzaXplXCIsXCJyXCJdKSxsPXRoaXMuZ2V0U2l6ZSh0KVswXS8yO28mJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sZikse3g6LWwseTowLHI6dS8yfHxjfHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1sZWZ0XCIsbmFtZTpcImxpbmstcG9pbnQtbGVmdFwiLGlzQW5jaG9yUG9pbnQ6ITB9KSxhJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGYpLHt4OmwseTowLHI6dS8yfHxjfHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1yaWdodFwiLG5hbWU6XCJsaW5rLXBvaW50LXJpZ2h0XCIsaXNBbmNob3JQb2ludDohMH0pLGkmJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sZikse3g6MCx5Oi1sLHI6dS8yfHxjfHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC10b3BcIixuYW1lOlwibGluay1wb2ludC10b3BcIixpc0FuY2hvclBvaW50OiEwfSkscyYmZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxmKSx7eDowLHk6bCxyOnUvMnx8Y3x8NX0pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtYm90dG9tXCIsbmFtZTpcImxpbmstcG9pbnQtYm90dG9tXCIsaXNBbmNob3JQb2ludDohMH0pfSxnZXRTaGFwZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0T3B0aW9ucyh0KS5zdHlsZSxuPXtzdHJva2U6dC5jb2xvcn0scj1PYmplY3QoaC5lKSh7fSxlLG4pLGk9dGhpcy5nZXRTaXplKHQpWzBdLzI7cmV0dXJuIE9iamVjdCh2LmEpKHt4OjAseTowLHI6aX0scil9LHVwZGF0ZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUuZ2V0Q29udGFpbmVyKCkscj10aGlzLmdldFNpemUodCksaT17c3Ryb2tlOnQuY29sb3IscjpyWzBdLzJ9LG89ZS5nZXQoXCJrZXlTaGFwZVwiKSxhPU9iamVjdChoLmUpKHt9LG8uYXR0cigpLGksdC5zdHlsZSk7dGhpcy51cGRhdGVTaGFwZSh0LGUsYSwhMCksdGhpcy51cGRhdGVMaW5rUG9pbnRzKHQsbil9fSxcInNpbmdsZS1ub2RlXCIpLHRuKFwicmVjdFwiLHtvcHRpb25zOntzaXplOlsxMDAsMzBdLHN0eWxlOntyYWRpdXM6MCxzdHJva2U6b24uZGVmYXVsdE5vZGUuc3R5bGUuc3Ryb2tlLGZpbGw6b24uZGVmYXVsdE5vZGUuc3R5bGUuZmlsbCxsaW5lV2lkdGg6b24uZGVmYXVsdE5vZGUuc3R5bGUubGluZVdpZHRofSxsYWJlbENmZzp7c3R5bGU6e2ZpbGw6b24ubm9kZUxhYmVsLnN0eWxlLmZpbGwsZm9udFNpemU6b24ubm9kZUxhYmVsLnN0eWxlLmZvbnRTaXplfX0sbGlua1BvaW50czp7dG9wOiExLHJpZ2h0OiExLGJvdHRvbTohMSxsZWZ0OiExLHNpemU6b24uZGVmYXVsdE5vZGUubGlua1BvaW50cy5zaXplLGxpbmVXaWR0aDpvbi5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLmxpbmVXaWR0aCxmaWxsOm9uLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuZmlsbCxzdHJva2U6b24uZGVmYXVsdE5vZGUubGlua1BvaW50cy5zdHJva2V9LGljb246e3Nob3c6ITEsaW1nOlwiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3MvYm13LXByb2QvNWQwMTUwNjUtODUwNS00ZTdhLWJhZWMtOTc2ZjgxZTNjNDFkLnN2Z1wiLHdpZHRoOjIwLGhlaWdodDoyMH0sYW5jaG9yUG9pbnRzOltbMCwuNV0sWzEsLjVdXSxzdGF0ZVN0eWxlczpPYmplY3Qodi5hKSh7fSxvbi5ub2RlU3RhdGVTdHlsZXMpfSxzaGFwZVR5cGU6XCJyZWN0XCIsbGFiZWxQb3NpdGlvbjpcImNlbnRlclwiLGRyYXdTaGFwZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0U2hhcGVTdHlsZSh0KSxyPWUuYWRkU2hhcGUoXCJyZWN0XCIse2F0dHJzOm4sY2xhc3NOYW1lOnRoaXMudHlwZStcIi1rZXlTaGFwZVwiLG5hbWU6dGhpcy50eXBlK1wiLWtleVNoYXBlXCIsZHJhZ2dhYmxlOiEwfSk7cmV0dXJuIHRoaXMuZHJhd0xpbmtQb2ludHModCxlKSxyfSxkcmF3TGlua1BvaW50czpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0T3B0aW9ucyh0KS5saW5rUG9pbnRzLHI9dm9pZCAwPT09bj97fTpuLGk9ci50b3Asbz1yLmxlZnQsYT1yLnJpZ2h0LHM9ci5ib3R0b20sdT1yLnNpemUsYz1yLnIsZj1PYmplY3Qodi5jKShyLFtcInRvcFwiLFwibGVmdFwiLFwicmlnaHRcIixcImJvdHRvbVwiLFwic2l6ZVwiLFwiclwiXSksbD10aGlzLmdldFNpemUodCksaD1sWzBdLGQ9bFsxXTtvJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGYpLHt4Oi1oLzIseTowLHI6dS8yfHxjfHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1sZWZ0XCIsbmFtZTpcImxpbmstcG9pbnQtbGVmdFwiLGlzQW5jaG9yUG9pbnQ6ITB9KSxhJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGYpLHt4OmgvMix5OjAscjp1LzJ8fGN8fDV9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LXJpZ2h0XCIsbmFtZTpcImxpbmstcG9pbnQtcmlnaHRcIixpc0FuY2hvclBvaW50OiEwfSksaSYmZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxmKSx7eDowLHk6LWQvMixyOnUvMnx8Y3x8NX0pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtdG9wXCIsbmFtZTpcImxpbmstcG9pbnQtdG9wXCIsaXNBbmNob3JQb2ludDohMH0pLHMmJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sZikse3g6MCx5OmQvMixyOnUvMnx8Y3x8NX0pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtYm90dG9tXCIsbmFtZTpcImxpbmstcG9pbnQtYm90dG9tXCIsaXNBbmNob3JQb2ludDohMH0pfSxnZXRTaGFwZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0T3B0aW9ucyh0KS5zdHlsZSxuPXtzdHJva2U6dC5jb2xvcn0scj1PYmplY3QoaC5BKSh7fSxlLG4pLGk9dGhpcy5nZXRTaXplKHQpLG89ci53aWR0aHx8aVswXSxhPXIuaGVpZ2h0fHxpWzFdO3JldHVybiBPYmplY3Qodi5hKSh7eDotby8yLHk6LWEvMix3aWR0aDpvLGhlaWdodDphfSxyKX0sdXBkYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5nZXRDb250YWluZXIoKSxyPXRoaXMuZ2V0T3B0aW9ucyh7fSkuc3R5bGUsaT10aGlzLmdldFNpemUodCksbz1lLmdldChcImtleVNoYXBlXCIpO3Quc2l6ZXx8KGlbMF09by5hdHRyKFwid2lkdGhcIil8fHIud2lkdGgsaVsxXT1vLmF0dHIoXCJoZWlnaHRcIil8fHIuaGVpZ2h0KTt2YXIgYT17c3Ryb2tlOnQuY29sb3IseDotaVswXS8yLHk6LWlbMV0vMix3aWR0aDppWzBdLGhlaWdodDppWzFdfSxzPU9iamVjdChoLkEpKHt9LHIsby5hdHRyKCksYSk7cz1PYmplY3QoaC5BKShzLHQuc3R5bGUpLHRoaXMudXBkYXRlU2hhcGUodCxlLHMsITEpLHRoaXMudXBkYXRlTGlua1BvaW50cyh0LG4pfX0sXCJzaW5nbGUtbm9kZVwiKSx0bihcImVsbGlwc2VcIix7b3B0aW9uczp7c2l6ZTpbODAsNDBdLHN0eWxlOnt4OjAseTowLHN0cm9rZTpvbi5kZWZhdWx0Tm9kZS5zdHlsZS5zdHJva2UsZmlsbDpvbi5kZWZhdWx0Tm9kZS5zdHlsZS5maWxsLGxpbmVXaWR0aDpvbi5kZWZhdWx0Tm9kZS5zdHlsZS5saW5lV2lkdGh9LGxhYmVsQ2ZnOntzdHlsZTp7ZmlsbDpvbi5ub2RlTGFiZWwuc3R5bGUuZmlsbCxmb250U2l6ZTpvbi5ub2RlTGFiZWwuc3R5bGUuZm9udFNpemV9fSxsaW5rUG9pbnRzOnt0b3A6ITEscmlnaHQ6ITEsYm90dG9tOiExLGxlZnQ6ITEsc2l6ZTpvbi5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLnNpemUsbGluZVdpZHRoOm9uLmRlZmF1bHROb2RlLmxpbmtQb2ludHMubGluZVdpZHRoLGZpbGw6b24uZGVmYXVsdE5vZGUubGlua1BvaW50cy5maWxsLHN0cm9rZTpvbi5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLnN0cm9rZX0saWNvbjp7c2hvdzohMSxpbWc6XCJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ibXctcHJvZC81ZDAxNTA2NS04NTA1LTRlN2EtYmFlYy05NzZmODFlM2M0MWQuc3ZnXCIsd2lkdGg6MjAsaGVpZ2h0OjIwfSxzdGF0ZVN0eWxlczpPYmplY3Qodi5hKSh7fSxvbi5ub2RlU3RhdGVTdHlsZXMpfSxzaGFwZVR5cGU6XCJlbGxpcHNlXCIsbGFiZWxQb3NpdGlvbjpcImNlbnRlclwiLGRyYXdTaGFwZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0T3B0aW9ucyh0KS5pY29uLHI9dm9pZCAwPT09bj97fTpuLGk9dGhpcy5nZXRTaGFwZVN0eWxlKHQpLG89ZS5hZGRTaGFwZShcImVsbGlwc2VcIix7YXR0cnM6aSxjbGFzc05hbWU6XCJlbGxpcHNlLWtleVNoYXBlXCIsbmFtZTpcImVsbGlwc2Uta2V5U2hhcGVcIixkcmFnZ2FibGU6ITB9KSxhPXIud2lkdGgscz1yLmhlaWdodDtpZihyLnNob3cpZS5hZGRTaGFwZShcImltYWdlXCIse2F0dHJzOk9iamVjdCh2LmEpKHt4Oi1hLzIseTotcy8yfSxyKSxjbGFzc05hbWU6dGhpcy50eXBlK1wiLWljb25cIixuYW1lOnRoaXMudHlwZStcIi1pY29uXCIsZHJhZ2dhYmxlOiEwfSk7cmV0dXJuIHRoaXMuZHJhd0xpbmtQb2ludHModCxlKSxvfSxkcmF3TGlua1BvaW50czpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0T3B0aW9ucyh0KS5saW5rUG9pbnRzLHI9dm9pZCAwPT09bj97fTpuLGk9ci50b3Asbz1yLmxlZnQsYT1yLnJpZ2h0LHM9ci5ib3R0b20sdT1yLnNpemUsYz1yLnIsZj1PYmplY3Qodi5jKShyLFtcInRvcFwiLFwibGVmdFwiLFwicmlnaHRcIixcImJvdHRvbVwiLFwic2l6ZVwiLFwiclwiXSksbD10aGlzLmdldFNpemUodCksaD1sWzBdLzIsZD1sWzFdLzI7byYmZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxmKSx7eDotaCx5OjAscjp1LzJ8fGN8fDV9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LWxlZnRcIixuYW1lOlwibGluay1wb2ludC1sZWZ0XCIsaXNBbmNob3JQb2ludDohMH0pLGEmJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sZikse3g6aCx5OjAscjp1LzJ8fGN8fDV9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LXJpZ2h0XCIsbmFtZTpcImxpbmstcG9pbnQtcmlnaHRcIixpc0FuY2hvclBvaW50OiEwfSksaSYmZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxmKSx7eDowLHk6LWQscjp1LzJ8fGN8fDV9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LXRvcFwiLG5hbWU6XCJsaW5rLXBvaW50LXRvcFwiLGlzQW5jaG9yUG9pbnQ6ITB9KSxzJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGYpLHt4OjAseTpkLHI6dS8yfHxjfHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1ib3R0b21cIixuYW1lOlwibGluay1wb2ludC1ib3R0b21cIixpc0FuY2hvclBvaW50OiEwfSl9LGdldFNoYXBlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRPcHRpb25zKHQpLnN0eWxlLG49e3N0cm9rZTp0LmNvbG9yfSxyPU9iamVjdChoLkEpKHt9LGUsbiksaT10aGlzLmdldFNpemUodCksbz1pWzBdLzIsYT1pWzFdLzI7cmV0dXJuIE9iamVjdCh2LmEpKHt4OjAseTowLHJ4Om8scnk6YX0scil9LHVwZGF0ZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUuZ2V0Q29udGFpbmVyKCkscj10aGlzLmdldE9wdGlvbnMoe30pLnN0eWxlLGk9dGhpcy5nZXRTaXplKHQpLG89e3N0cm9rZTp0LmNvbG9yLHJ4OmlbMF0vMixyeTppWzFdLzJ9LGE9ZS5nZXQoXCJrZXlTaGFwZVwiKSxzPU9iamVjdChoLkEpKHt9LHIsYS5hdHRyKCksbyk7cz1PYmplY3QoaC5BKShzLHQuc3R5bGUpLHRoaXMudXBkYXRlU2hhcGUodCxlLHMsITApLHRoaXMudXBkYXRlTGlua1BvaW50cyh0LG4pfX0sXCJzaW5nbGUtbm9kZVwiKSx0bihcImRpYW1vbmRcIix7b3B0aW9uczp7c2l6ZTpbODAsODBdLHN0eWxlOntzdHJva2U6b24uZGVmYXVsdE5vZGUuc3R5bGUuc3Ryb2tlLGZpbGw6b24uZGVmYXVsdE5vZGUuc3R5bGUuZmlsbCxsaW5lV2lkdGg6b24uZGVmYXVsdE5vZGUuc3R5bGUubGluZVdpZHRofSxsYWJlbENmZzp7c3R5bGU6e2ZpbGw6b24ubm9kZUxhYmVsLnN0eWxlLmZpbGwsZm9udFNpemU6b24ubm9kZUxhYmVsLnN0eWxlLmZvbnRTaXplfX0sbGlua1BvaW50czp7dG9wOiExLHJpZ2h0OiExLGJvdHRvbTohMSxsZWZ0OiExLHNpemU6b24uZGVmYXVsdE5vZGUubGlua1BvaW50cy5zaXplLGxpbmVXaWR0aDpvbi5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLmxpbmVXaWR0aCxmaWxsOm9uLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuZmlsbCxzdHJva2U6b24uZGVmYXVsdE5vZGUubGlua1BvaW50cy5zdHJva2V9LGljb246e3Nob3c6ITEsaW1nOlwiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3MvYm13LXByb2QvNWQwMTUwNjUtODUwNS00ZTdhLWJhZWMtOTc2ZjgxZTNjNDFkLnN2Z1wiLHdpZHRoOjIwLGhlaWdodDoyMH0sc3RhdGVTdHlsZXM6T2JqZWN0KHYuYSkoe30sb24ubm9kZVN0YXRlU3R5bGVzKX0sc2hhcGVUeXBlOlwiZGlhbW9uZFwiLGxhYmVsUG9zaXRpb246XCJjZW50ZXJcIixkcmF3U2hhcGU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldE9wdGlvbnModCkuaWNvbixyPXZvaWQgMD09PW4/e306bixpPXRoaXMuZ2V0U2hhcGVTdHlsZSh0KSxvPWUuYWRkU2hhcGUoXCJwYXRoXCIse2F0dHJzOmksY2xhc3NOYW1lOnRoaXMudHlwZStcIi1rZXlTaGFwZVwiLG5hbWU6dGhpcy50eXBlK1wiLWtleVNoYXBlXCIsZHJhZ2dhYmxlOiEwfSksYT1yLndpZHRoLHM9ci5oZWlnaHQ7aWYoci5zaG93KWUuYWRkU2hhcGUoXCJpbWFnZVwiLHthdHRyczpPYmplY3Qodi5hKSh7eDotYS8yLHk6LXMvMn0sciksY2xhc3NOYW1lOnRoaXMudHlwZStcIi1pY29uXCIsbmFtZTp0aGlzLnR5cGUrXCItaWNvblwiLGRyYWdnYWJsZTohMH0pO3JldHVybiB0aGlzLmRyYXdMaW5rUG9pbnRzKHQsZSksb30sZHJhd0xpbmtQb2ludHM6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldE9wdGlvbnModCkubGlua1BvaW50cyxyPXZvaWQgMD09PW4/e306bixpPXIudG9wLG89ci5sZWZ0LGE9ci5yaWdodCxzPXIuYm90dG9tLHU9ci5zaXplLGM9ci5yLGY9T2JqZWN0KHYuYykocixbXCJ0b3BcIixcImxlZnRcIixcInJpZ2h0XCIsXCJib3R0b21cIixcInNpemVcIixcInJcIl0pLGw9dGhpcy5nZXRTaXplKHQpLGg9bFswXSxkPWxbMV07byYmZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxmKSx7eDotaC8yLHk6MCxyOnUvMnx8Y3x8NX0pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtbGVmdFwiLG5hbWU6XCJsaW5rLXBvaW50LWxlZnRcIixpc0FuY2hvclBvaW50OiEwfSksYSYmZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxmKSx7eDpoLzIseTowLHI6dS8yfHxjfHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1yaWdodFwiLG5hbWU6XCJsaW5rLXBvaW50LXJpZ2h0XCIsaXNBbmNob3JQb2ludDohMH0pLGkmJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sZikse3g6MCx5Oi1kLzIscjp1LzJ8fGN8fDV9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LXRvcFwiLG5hbWU6XCJsaW5rLXBvaW50LXRvcFwiLGlzQW5jaG9yUG9pbnQ6ITB9KSxzJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGYpLHt4OjAseTpkLzIscjp1LzJ8fGN8fDV9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LWJvdHRvbVwiLG5hbWU6XCJsaW5rLXBvaW50LWJvdHRvbVwiLGlzQW5jaG9yUG9pbnQ6ITB9KX0sZ2V0UGF0aDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFNpemUodCksbj1lWzBdLHI9ZVsxXTtyZXR1cm5bW1wiTVwiLDAsLXIvMl0sW1wiTFwiLG4vMiwwXSxbXCJMXCIsMCxyLzJdLFtcIkxcIiwtbi8yLDBdLFtcIlpcIl1dfSxnZXRTaGFwZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0T3B0aW9ucyh0KS5zdHlsZSxuPXtzdHJva2U6dC5jb2xvcn0scj1PYmplY3QoaC5BKSh7fSxlLG4pLGk9dGhpcy5nZXRQYXRoKHQpO3JldHVybiBPYmplY3Qodi5hKSh7cGF0aDppfSxyKX0sdXBkYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5nZXRDb250YWluZXIoKSxyPXRoaXMuZ2V0T3B0aW9ucyh7fSkuc3R5bGUsaT10aGlzLmdldFBhdGgodCksbz17c3Ryb2tlOnQuY29sb3IscGF0aDppfSxhPWUuZ2V0KFwia2V5U2hhcGVcIikscz1PYmplY3QoaC5BKSh7fSxyLGEuYXR0cigpLG8pO3M9T2JqZWN0KGguQSkocyx0LnN0eWxlKSx0aGlzLnVwZGF0ZVNoYXBlKHQsZSxzLCEwKSx0aGlzLnVwZGF0ZUxpbmtQb2ludHModCxuKX19LFwic2luZ2xlLW5vZGVcIiksdG4oXCJ0cmlhbmdsZVwiLHtvcHRpb25zOntzaXplOjQwLGRpcmVjdGlvbjpcInVwXCIsc3R5bGU6e3N0cm9rZTpvbi5kZWZhdWx0Tm9kZS5zdHlsZS5zdHJva2UsZmlsbDpvbi5kZWZhdWx0Tm9kZS5zdHlsZS5maWxsLGxpbmVXaWR0aDpvbi5kZWZhdWx0Tm9kZS5zdHlsZS5saW5lV2lkdGh9LGxhYmVsQ2ZnOntzdHlsZTp7ZmlsbDpvbi5ub2RlTGFiZWwuc3R5bGUuZmlsbCxmb250U2l6ZTpvbi5ub2RlTGFiZWwuc3R5bGUuZm9udFNpemV9LG9mZnNldDoxNX0sbGlua1BvaW50czp7dG9wOiExLHJpZ2h0OiExLGJvdHRvbTohMSxsZWZ0OiExLHNpemU6b24uZGVmYXVsdE5vZGUubGlua1BvaW50cy5zaXplLGxpbmVXaWR0aDpvbi5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLmxpbmVXaWR0aCxmaWxsOm9uLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuZmlsbCxzdHJva2U6b24uZGVmYXVsdE5vZGUubGlua1BvaW50cy5zdHJva2V9LGljb246e3Nob3c6ITEsaW1nOlwiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3MvYm13LXByb2QvNWQwMTUwNjUtODUwNS00ZTdhLWJhZWMtOTc2ZjgxZTNjNDFkLnN2Z1wiLHdpZHRoOjIwLGhlaWdodDoyMCxvZmZzZXQ6Nn0sc3RhdGVTdHlsZXM6T2JqZWN0KHYuYSkoe30sb24ubm9kZVN0YXRlU3R5bGVzKX0sc2hhcGVUeXBlOlwidHJpYW5nbGVcIixsYWJlbFBvc2l0aW9uOlwiYm90dG9tXCIsZHJhd1NoYXBlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRPcHRpb25zKHQpLHI9bi5pY29uLGk9dm9pZCAwPT09cj97fTpyLG89bi5kaXJlY3Rpb24sYT10aGlzLmdldFNoYXBlU3R5bGUodCkscz10LmRpcmVjdGlvbnx8byx1PWUuYWRkU2hhcGUoXCJwYXRoXCIse2F0dHJzOmEsY2xhc3NOYW1lOnRoaXMudHlwZStcIi1rZXlTaGFwZVwiLG5hbWU6dGhpcy50eXBlK1wiLWtleVNoYXBlXCIsZHJhZ2dhYmxlOiEwfSksYz1pLndpZHRoLGY9aS5oZWlnaHQsbD1pLnNob3csaD1pLm9mZnNldDtpZihsKXt2YXIgZD0tYy8yLHA9LWYvMjtcInVwXCIhPT1zJiZcImRvd25cIiE9PXN8fChwKz1oKSxcImxlZnRcIiE9PXMmJlwicmlnaHRcIiE9PXN8fChkKz1oKSxlLmFkZFNoYXBlKFwiaW1hZ2VcIix7YXR0cnM6T2JqZWN0KHYuYSkoe3g6ZCx5OnB9LGkpLGNsYXNzTmFtZTp0aGlzLnR5cGUrXCItaWNvblwiLG5hbWU6dGhpcy50eXBlK1wiLWljb25cIixkcmFnZ2FibGU6ITB9KX1yZXR1cm4gdGhpcy5kcmF3TGlua1BvaW50cyh0LGUpLHV9LGRyYXdMaW5rUG9pbnRzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRPcHRpb25zKHQpLHI9bi5saW5rUG9pbnRzLGk9dm9pZCAwPT09cj97fTpyLG89bi5kaXJlY3Rpb24sYT10LmRpcmVjdGlvbnx8byxzPWkudG9wLHU9aS5sZWZ0LGM9aS5yaWdodCxmPWkuYm90dG9tLGw9aS5zaXplLGg9aS5yLGQ9T2JqZWN0KHYuYykoaSxbXCJ0b3BcIixcImxlZnRcIixcInJpZ2h0XCIsXCJib3R0b21cIixcInNpemVcIixcInJcIl0pLHA9dGhpcy5nZXRTaXplKHQpWzBdO2lmKHUpe3ZhciBnPW51bGwseT1wKk1hdGguc2luKDEvMypNYXRoLlBJKSxtPXAqTWF0aC5zaW4oMS8zKk1hdGguUEkpO1widXBcIj09PWE/Zz1bLW0seV06XCJkb3duXCI9PT1hP2c9Wy1tLC15XTpcImxlZnRcIj09PWEmJihnPVstbSxtLXldKSxnJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGQpLHt4OmdbMF0seTpnWzFdLHI6bC8yfHxofHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1sZWZ0XCIsbmFtZTpcImxpbmstcG9pbnQtbGVmdFwifSl9aWYoYyl7dmFyIGI9bnVsbDt5PXAqTWF0aC5zaW4oMS8zKk1hdGguUEkpLG09cCpNYXRoLnNpbigxLzMqTWF0aC5QSSk7XCJ1cFwiPT09YT9iPVttLHldOlwiZG93blwiPT09YT9iPVttLC15XTpcInJpZ2h0XCI9PT1hJiYoYj1bbSxtLXldKSxiJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGQpLHt4OmJbMF0seTpiWzFdLHI6bC8yfHxofHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1yaWdodFwiLG5hbWU6XCJsaW5rLXBvaW50LXJpZ2h0XCJ9KX1pZihzKXt2YXIgeD1udWxsO3k9cCpNYXRoLnNpbigxLzMqTWF0aC5QSSksbT1wKk1hdGguc2luKDEvMypNYXRoLlBJKTtcInVwXCI9PT1hP3g9W20teSwteV06XCJsZWZ0XCI9PT1hP3g9W20sLXldOlwicmlnaHRcIj09PWEmJih4PVstbSwteV0pLHgmJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sZCkse3g6eFswXSx5OnhbMV0scjpsLzJ8fGh8fDV9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LXRvcFwiLG5hbWU6XCJsaW5rLXBvaW50LXRvcFwifSl9aWYoZil7dmFyIHc9bnVsbDt5PXAqTWF0aC5zaW4oMS8zKk1hdGguUEkpLG09cCpNYXRoLnNpbigxLzMqTWF0aC5QSSk7XCJkb3duXCI9PT1hP3c9Wy1tK3kseV06XCJsZWZ0XCI9PT1hP3c9W20seV06XCJyaWdodFwiPT09YSYmKHc9Wy1tLHldKSx3JiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGQpLHt4OndbMF0seTp3WzFdLHI6bC8yfHxofHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1ib3R0b21cIixuYW1lOlwibGluay1wb2ludC1ib3R0b21cIn0pfX0sZ2V0UGF0aDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldE9wdGlvbnModCkuZGlyZWN0aW9uLG49dC5kaXJlY3Rpb258fGUscj10aGlzLmdldFNpemUodClbMF0saT1yKk1hdGguc2luKDEvMypNYXRoLlBJKSxvPXIqTWF0aC5zaW4oMS8zKk1hdGguUEkpLGE9W1tcIk1cIiwtbyxpXSxbXCJMXCIsMCwtaV0sW1wiTFwiLG8saV0sW1wiWlwiXV07cmV0dXJuXCJkb3duXCI9PT1uP2E9W1tcIk1cIiwtbywtaV0sW1wiTFwiLG8sLWldLFtcIkxcIiwwLGldLFtcIlpcIl1dOlwibGVmdFwiPT09bj9hPVtbXCJNXCIsLW8sby1pXSxbXCJMXCIsbywtb10sW1wiTFwiLG8sb10sW1wiWlwiXV06XCJyaWdodFwiPT09biYmKGE9W1tcIk1cIixvLG8taV0sW1wiTFwiLC1vLG9dLFtcIkxcIiwtbywtb10sW1wiWlwiXV0pLGF9LGdldFNoYXBlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRPcHRpb25zKHQpLnN0eWxlLG49e3N0cm9rZTp0LmNvbG9yfSxyPU9iamVjdChoLkEpKHt9LGUsbiksaT10aGlzLmdldFBhdGgodCk7cmV0dXJuIE9iamVjdCh2LmEpKHtwYXRoOml9LHIpfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmdldENvbnRhaW5lcigpLHI9dGhpcy5nZXRPcHRpb25zKHt9KS5zdHlsZSxpPXRoaXMuZ2V0UGF0aCh0KSxvPXtzdHJva2U6dC5jb2xvcixwYXRoOml9LGE9ZS5nZXQoXCJrZXlTaGFwZVwiKSxzPU9iamVjdChoLkEpKHt9LHIsYS5hdHRyKCksbyk7cz1PYmplY3QoaC5BKShzLHQuc3R5bGUpLHRoaXMudXBkYXRlU2hhcGUodCxlLHMsITApLHRoaXMudXBkYXRlTGlua1BvaW50cyh0LG4pfSx1cGRhdGVMaW5rUG9pbnRzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRPcHRpb25zKHt9KSxyPW4ubGlua1BvaW50cyxpPW4uZGlyZWN0aW9uLG89dC5kaXJlY3Rpb258fGksYT1lLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwibGluay1wb2ludC1sZWZ0XCI9PT10LmdldChcImNsYXNzTmFtZVwiKX0pKSxzPWUuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuXCJsaW5rLXBvaW50LXJpZ2h0XCI9PT10LmdldChcImNsYXNzTmFtZVwiKX0pKSx1PWUuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuXCJsaW5rLXBvaW50LXRvcFwiPT09dC5nZXQoXCJjbGFzc05hbWVcIil9KSksYz1lLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwibGluay1wb2ludC1ib3R0b21cIj09PXQuZ2V0KFwiY2xhc3NOYW1lXCIpfSkpLGY9cixsPWF8fHN8fHV8fGM7bCYmKGY9bC5hdHRyKCkpO3ZhciBkPU9iamVjdChoLkEpKHt9LGYsdC5saW5rUG9pbnRzKSxwPWQuZmlsbCxnPWQuc3Ryb2tlLHk9ZC5saW5lV2lkdGgsbT1kLnNpemUvMjttfHwobT1kLnIpO3ZhciBiPXQubGlua1BvaW50cz90LmxpbmtQb2ludHM6e2xlZnQ6dm9pZCAwLHJpZ2h0OnZvaWQgMCx0b3A6dm9pZCAwLGJvdHRvbTp2b2lkIDB9LHg9Yi5sZWZ0LHc9Yi5yaWdodCxTPWIudG9wLEU9Yi5ib3R0b20sXz10aGlzLmdldFNpemUodClbMF0sTz17cjptLGZpbGw6cCxzdHJva2U6ZyxsaW5lV2lkdGg6eX0saz1udWxsLE09XypNYXRoLnNpbigxLzMqTWF0aC5QSSksQT1fKk1hdGguc2luKDEvMypNYXRoLlBJKTtcInVwXCI9PT1vP2s9Wy1BLE1dOlwiZG93blwiPT09bz9rPVstQSwtTV06XCJsZWZ0XCI9PT1vJiYoaz1bLUEsQS1NXSksayYmKGE/eHx8dm9pZCAwPT09eD9hLmF0dHIoT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sTykse3g6a1swXSx5OmtbMV19KSk6YS5yZW1vdmUoKTp4JiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LE8pLHt4OmtbMF0seTprWzFdfSksY2xhc3NOYW1lOlwibGluay1wb2ludC1sZWZ0XCIsbmFtZTpcImxpbmstcG9pbnQtbGVmdFwiLGlzQW5jaG9yUG9pbnQ6ITB9KSk7dmFyIFQ9bnVsbDtcInVwXCI9PT1vP1Q9W0EsTV06XCJkb3duXCI9PT1vP1Q9W0EsLU1dOlwicmlnaHRcIj09PW8mJihUPVtBLEEtTV0pLFQmJihzP3d8fHZvaWQgMD09PXc/cy5hdHRyKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LE8pLHt4OlRbMF0seTpUWzFdfSkpOnMucmVtb3ZlKCk6dyYmZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxPKSx7eDpUWzBdLHk6VFsxXX0pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtcmlnaHRcIixuYW1lOlwibGluay1wb2ludC1yaWdodFwiLGlzQW5jaG9yUG9pbnQ6ITB9KSk7dmFyIEM9bnVsbDtcInVwXCI9PT1vP0M9W0EtTSwtTV06XCJsZWZ0XCI9PT1vP0M9W0EsLU1dOlwicmlnaHRcIj09PW8mJihDPVstQSwtTV0pLEMmJih1P1N8fHZvaWQgMD09PVM/dS5hdHRyKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LE8pLHt4OkNbMF0seTpDWzFdfSkpOnUucmVtb3ZlKCk6UyYmZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxPKSx7eDpDWzBdLHk6Q1sxXX0pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtdG9wXCIsbmFtZTpcImxpbmstcG9pbnQtdG9wXCIsaXNBbmNob3JQb2ludDohMH0pKTt2YXIgST1udWxsO1wiZG93blwiPT09bz9JPVstQStNLE1dOlwibGVmdFwiPT09bz9JPVtBLE1dOlwicmlnaHRcIj09PW8mJihJPVstQSxNXSksSSYmKGM/RXx8dm9pZCAwPT09RT9jLmF0dHIoT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sTykse3g6SVswXSx5OklbMV19KSk6Yy5yZW1vdmUoKTpFJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LE8pLHt4OklbMF0seTpJWzFdfSksY2xhc3NOYW1lOlwibGluay1wb2ludC1ib3R0b21cIixuYW1lOlwibGluay1wb2ludC1ib3R0b21cIixpc0FuY2hvclBvaW50OiEwfSkpfX0sXCJzaW5nbGUtbm9kZVwiKSx0bihcIm1vZGVsUmVjdFwiLHtvcHRpb25zOntzaXplOlsxODUsNzBdLHN0eWxlOntyYWRpdXM6NSxzdHJva2U6XCIjNjljMGZmXCIsZmlsbDpcIiNmZmZmZmZcIixsaW5lV2lkdGg6b24uZGVmYXVsdE5vZGUuc3R5bGUubGluZVdpZHRoLGZpbGxPcGFjaXR5OjF9LGxhYmVsQ2ZnOntzdHlsZTp7ZmlsbDpcIiM1OTU5NTlcIixmb250U2l6ZToxNH0sb2Zmc2V0OjMwfSxkZXNjcmlwdGlvbkNmZzp7c3R5bGU6e2ZvbnRTaXplOjEyLGZpbGw6XCIjYmZiZmJmXCJ9LHBhZGRpbmdUb3A6MH0scHJlUmVjdDp7c2hvdzohMCx3aWR0aDo0LGZpbGw6XCIjNDBhOWZmXCIscmFkaXVzOjJ9LGxpbmtQb2ludHM6e3RvcDohMSxyaWdodDohMSxib3R0b206ITEsbGVmdDohMSxzaXplOjEwLGxpbmVXaWR0aDoxLGZpbGw6XCIjNzJDQzRBXCIsc3Ryb2tlOlwiIzcyQ0M0QVwifSxsb2dvSWNvbjp7c2hvdzohMCx4OjAseTowLGltZzpcImh0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL2Jhc2VtZW50X3Byb2QvNGY4MTg5M2MtMTgwNi00ZGU0LWFmZjMtOWE2YjI2NmJjOGEyLnN2Z1wiLHdpZHRoOjE2LGhlaWdodDoxNixvZmZzZXQ6MH0sc3RhdGVJY29uOntzaG93OiEwLHg6MCx5OjAsaW1nOlwiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3MvYmFzZW1lbnRfcHJvZC8zMDBhMjUyMy02N2UwLTRjYmYtOWQ0YS02N2MwNzdiNDAzOTUuc3ZnXCIsd2lkdGg6MTYsaGVpZ2h0OjE2LG9mZnNldDotNX0sYW5jaG9yUG9pbnRzOltbMCwuNV0sWzEsLjVdXX0sc2hhcGVUeXBlOlwibW9kZWxSZWN0XCIsZHJhd1NoYXBlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRPcHRpb25zKHQpLnByZVJlY3Qscj12b2lkIDA9PT1uP3t9Om4saT10aGlzLmdldFNoYXBlU3R5bGUodCksbz10aGlzLmdldFNpemUodCksYT1vWzBdLHM9b1sxXSx1PWUuYWRkU2hhcGUoXCJyZWN0XCIse2F0dHJzOmksY2xhc3NOYW1lOnRoaXMudHlwZStcIi1rZXlTaGFwZVwiLG5hbWU6dGhpcy50eXBlK1wiLWtleVNoYXBlXCIsZHJhZ2dhYmxlOiEwfSksYz1yLnNob3csZj1PYmplY3Qodi5jKShyLFtcInNob3dcIl0pO3JldHVybiBjJiZlLmFkZFNoYXBlKFwicmVjdFwiLHthdHRyczpPYmplY3Qodi5hKSh7eDotYS8yLHk6LXMvMixoZWlnaHQ6c30sZiksY2xhc3NOYW1lOlwicHJlLXJlY3RcIixuYW1lOlwicHJlLXJlY3RcIixkcmFnZ2FibGU6ITB9KSx0aGlzLmRyYXdMb2dvSWNvbih0LGUpLHRoaXMuZHJhd1N0YXRlSWNvbih0LGUpLHRoaXMuZHJhd0xpbmtQb2ludHModCxlKSx1fSxkcmF3TG9nb0ljb246ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldE9wdGlvbnModCkubG9nb0ljb24scj12b2lkIDA9PT1uP3t9Om4saT10aGlzLmdldFNpemUodClbMF07aWYoci5zaG93KXt2YXIgbz1yLndpZHRoLGE9ci5oZWlnaHQscz1yLngsdT1yLnksYz1yLm9mZnNldCxmPU9iamVjdCh2LmMpKHIsW1wid2lkdGhcIixcImhlaWdodFwiLFwieFwiLFwieVwiLFwib2Zmc2V0XCJdKTtlLmFkZFNoYXBlKFwiaW1hZ2VcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sZikse3g6c3x8LWkvMitvK2MseTp1fHwtYS8yLHdpZHRoOm8saGVpZ2h0OmF9KSxjbGFzc05hbWU6XCJyZWN0LWxvZ28taWNvblwiLG5hbWU6XCJyZWN0LWxvZ28taWNvblwiLGRyYWdnYWJsZTohMH0pfX0sZHJhd1N0YXRlSWNvbjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0T3B0aW9ucyh0KS5zdGF0ZUljb24scj12b2lkIDA9PT1uP3t9Om4saT10aGlzLmdldFNpemUodClbMF07aWYoci5zaG93KXt2YXIgbz1yLndpZHRoLGE9ci5oZWlnaHQscz1yLngsdT1yLnksYz1yLm9mZnNldCxmPU9iamVjdCh2LmMpKHIsW1wid2lkdGhcIixcImhlaWdodFwiLFwieFwiLFwieVwiLFwib2Zmc2V0XCJdKTtlLmFkZFNoYXBlKFwiaW1hZ2VcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sZikse3g6c3x8aS8yLW8rYyx5OnV8fC1hLzIsd2lkdGg6byxoZWlnaHQ6YX0pLGNsYXNzTmFtZTpcInJlY3Qtc3RhdGUtaWNvblwiLG5hbWU6XCJyZWN0LXN0YXRlLWljb25cIixkcmFnZ2FibGU6ITB9KX19LGRyYXdMaW5rUG9pbnRzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRPcHRpb25zKHQpLmxpbmtQb2ludHMscj12b2lkIDA9PT1uP3t9Om4saT1yLnRvcCxvPXIubGVmdCxhPXIucmlnaHQscz1yLmJvdHRvbSx1PXIuc2l6ZSxjPXIucixmPU9iamVjdCh2LmMpKHIsW1widG9wXCIsXCJsZWZ0XCIsXCJyaWdodFwiLFwiYm90dG9tXCIsXCJzaXplXCIsXCJyXCJdKSxsPXRoaXMuZ2V0U2l6ZSh0KSxoPWxbMF0sZD1sWzFdO28mJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sZikse3g6LWgvMix5OjAscjp1LzJ8fGN8fDV9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LWxlZnRcIixuYW1lOlwibGluay1wb2ludC1sZWZ0XCIsaXNBbmNob3JQb2ludDohMH0pLGEmJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sZikse3g6aC8yLHk6MCxyOnUvMnx8Y3x8NX0pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtcmlnaHRcIixuYW1lOlwibGluay1wb2ludC1yaWdodFwiLGlzQW5jaG9yUG9pbnQ6ITB9KSxpJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGYpLHt4OjAseTotZC8yLHI6dS8yfHxjfHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC10b3BcIixuYW1lOlwibGluay1wb2ludC10b3BcIixpc0FuY2hvclBvaW50OiEwfSkscyYmZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxmKSx7eDowLHk6ZC8yLHI6dS8yfHxjfHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1ib3R0b21cIixuYW1lOlwibGluay1wb2ludC1ib3R0b21cIixpc0FuY2hvclBvaW50OiEwfSl9LGRyYXdMYWJlbDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0T3B0aW9ucyh0KSxyPW4ubGFiZWxDZmcsaT12b2lkIDA9PT1yP3t9OnIsbz1uLmxvZ29JY29uLGE9dm9pZCAwPT09bz97fTpvLHM9bi5kZXNjcmlwdGlvbkNmZyx1PXZvaWQgMD09PXM/e306cyxjPXRoaXMuZ2V0U2l6ZSh0KVswXSxmPW51bGwsbD1hLnNob3csZD1hLndpZHRoLHA9LWMvMitpLm9mZnNldDtsJiYocD0tYy8yK2QraS5vZmZzZXQpO3ZhciBnPWkuc3R5bGUseT11LnN0eWxlLG09dS5wYWRkaW5nVG9wO3JldHVybiBPYmplY3QoaC54KSh0LmRlc2NyaXB0aW9uKT8oZj1lLmFkZFNoYXBlKFwidGV4dFwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxnKSx7eDpwLHk6LTUsdGV4dDp0LmxhYmVsfSksY2xhc3NOYW1lOlwidGV4dC1zaGFwZVwiLG5hbWU6XCJ0ZXh0LXNoYXBlXCIsZHJhZ2dhYmxlOiEwfSksZS5hZGRTaGFwZShcInRleHRcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30seSkse3g6cCx5OjE3KyhtfHwwKSx0ZXh0OnQuZGVzY3JpcHRpb259KSxjbGFzc05hbWU6XCJyZWN0LWRlc2NyaXB0aW9uXCIsbmFtZTpcInJlY3QtZGVzY3JpcHRpb25cIixkcmFnZ2FibGU6ITB9KSk6Zj1lLmFkZFNoYXBlKFwidGV4dFwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxnKSx7eDpwLHk6Nyx0ZXh0OnQubGFiZWx9KSxjbGFzc05hbWU6XCJ0ZXh0LXNoYXBlXCIsbmFtZTpcInRleHQtc2hhcGVcIixkcmFnZ2FibGU6ITB9KSxmfSxnZXRTaGFwZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0T3B0aW9ucyh0KS5zdHlsZSxuPXtzdHJva2U6dC5jb2xvcn0scj1PYmplY3QoaC5BKSh7fSxlLG4pLGk9dGhpcy5nZXRTaXplKHQpLG89ci53aWR0aHx8aVswXSxhPXIuaGVpZ2h0fHxpWzFdO3JldHVybiBPYmplY3Qodi5hKSh7eDotby8yLHk6LWEvMix3aWR0aDpvLGhlaWdodDphfSxyKX0sdXBkYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRPcHRpb25zKHQpLHI9bi5zdHlsZSxpPXZvaWQgMD09PXI/e306cixvPW4ubGFiZWxDZmcsYT12b2lkIDA9PT1vP3t9Om8scz1uLmRlc2NyaXB0aW9uQ2ZnLHU9dm9pZCAwPT09cz97fTpzLGM9dGhpcy5nZXRTaXplKHQpLGY9Y1swXSxsPWNbMV07ZS5nZXQoXCJrZXlTaGFwZVwiKS5hdHRyKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGkpLHt4Oi1mLzIseTotbC8yLHdpZHRoOmYsaGVpZ2h0Omx9KSk7dmFyIGQ9ZS5nZXRDb250YWluZXIoKSxwPWQuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuXCJyZWN0LWxvZ28taWNvblwiPT09dC5nZXQoXCJjbGFzc05hbWVcIil9KSksZz1wP3AuYXR0cigpOnt9LHk9T2JqZWN0KGguQSkoe30sZyx0LmxvZ29JY29uKSxtPXkud2lkdGg7dm9pZCAwPT09bSYmKG09dGhpcy5vcHRpb25zLmxvZ29JY29uLndpZHRoKTt2YXIgYj10LmxvZ29JY29uP3QubG9nb0ljb24uc2hvdzp2b2lkIDAseD1hLm9mZnNldCx3PS1mLzIrbSt4O2J8fHZvaWQgMD09PWJ8fCh3PS1mLzIreCk7dmFyIFM9ZC5maW5kKChmdW5jdGlvbih0KXtyZXR1cm5cIm5vZGUtbGFiZWxcIj09PXQuZ2V0KFwiY2xhc3NOYW1lXCIpfSkpLEU9ZC5maW5kKChmdW5jdGlvbih0KXtyZXR1cm5cInJlY3QtZGVzY3JpcHRpb25cIj09PXQuZ2V0KFwiY2xhc3NOYW1lXCIpfSkpO2lmKHQubGFiZWwpaWYoUyl7dmFyIF89dC5sYWJlbENmZz90LmxhYmVsQ2ZnLnN0eWxlOnt9LE89T2JqZWN0KGguQSkoe30sUy5hdHRyKCksXyk7dC5sYWJlbCYmKE8udGV4dD10LmxhYmVsKSxPLng9dyxPYmplY3QoaC54KSh0LmRlc2NyaXB0aW9uKSYmKE8ueT0tNSksRSYmKEUucmVzZXRNYXRyaXgoKSxFLmF0dHIoe3g6d30pKSxTLnJlc2V0TWF0cml4KCksUy5hdHRyKE8pfWVsc2UgZC5hZGRTaGFwZShcInRleHRcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sYS5zdHlsZSkse3g6dyx5OnQuZGVzY3JpcHRpb24/LTU6Nyx0ZXh0OnQubGFiZWx9KSxjbGFzc05hbWU6XCJub2RlLWxhYmVsXCIsbmFtZTpcIm5vZGUtbGFiZWxcIixkcmFnZ2FibGU6ITB9KTtpZihPYmplY3QoaC54KSh0LmRlc2NyaXB0aW9uKSl7dmFyIGs9dS5wYWRkaW5nVG9wO2lmKEUpe189dC5kZXNjcmlwdGlvbkNmZz90LmRlc2NyaXB0aW9uQ2ZnLnN0eWxlOnt9O3ZhciBNPU9iamVjdChoLkEpKHt9LEUuYXR0cigpLF8pO09iamVjdChoLngpKHQuZGVzY3JpcHRpb24pJiYoTS50ZXh0PXQuZGVzY3JpcHRpb24pLE0ueD13LEUucmVzZXRNYXRyaXgoKSxFLmF0dHIoT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sTSkse3k6MTcrKGt8fDApfSkpfWVsc2UgZC5hZGRTaGFwZShcInRleHRcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sdS5zdHlsZSkse3g6dyx5OjE3KyhrfHwwKSx0ZXh0OnQuZGVzY3JpcHRpb259KSxjbGFzc05hbWU6XCJyZWN0LWRlc2NyaXB0aW9uXCIsbmFtZTpcInJlY3QtZGVzY3JpcHRpb25cIixkcmFnZ2FibGU6ITB9KX12YXIgQT1kLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwicHJlLXJlY3RcIj09PXQuZ2V0KFwiY2xhc3NOYW1lXCIpfSkpO2lmKEEpe3ZhciBUPU9iamVjdChoLkEpKHt9LEEuYXR0cigpLHQucHJlUmVjdCk7QS5hdHRyKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LFQpLHt4Oi1mLzIseTotbC8yLGhlaWdodDpsfSkpfWlmKHApaWYoYnx8dm9pZCAwPT09Yil7dmFyIEM9eS53aWR0aCxJPXkuaGVpZ2h0LFA9eS54LGo9eS55LEQ9eS5vZmZzZXQsTj1PYmplY3Qodi5jKSh5LFtcIndpZHRoXCIsXCJoZWlnaHRcIixcInhcIixcInlcIixcIm9mZnNldFwiXSk7cC5hdHRyKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LE4pLHt4OlB8fC1mLzIrQytELHk6anx8LUkvMix3aWR0aDpDLGhlaWdodDpJfSkpfWVsc2UgcC5yZW1vdmUoKTtlbHNlIGImJnRoaXMuZHJhd0xvZ29JY29uKHQsZCk7dmFyIFI9ZC5maW5kKChmdW5jdGlvbih0KXtyZXR1cm5cInJlY3Qtc3RhdGUtaWNvblwiPT09dC5nZXQoXCJjbGFzc05hbWVcIil9KSksTD1SP1IuYXR0cigpOnt9LEI9T2JqZWN0KGguQSkoe30sTCx0LnN0YXRlSWNvbik7aWYoUil7Qi5zaG93fHx2b2lkIDA9PT1CLnNob3d8fFIucmVtb3ZlKCk7dmFyIEc9Qi53aWR0aCxGPShJPUIuaGVpZ2h0LFA9Qi54LGo9Qi55LEIub2Zmc2V0KSxVPU9iamVjdCh2LmMpKEIsW1wid2lkdGhcIixcImhlaWdodFwiLFwieFwiLFwieVwiLFwib2Zmc2V0XCJdKTtSLmF0dHIoT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sVSkse3g6UHx8Zi8yLUcrRix5Omp8fC1JLzIsd2lkdGg6RyxoZWlnaHQ6SX0pKX1lbHNlIEIuc2hvdyYmdGhpcy5kcmF3U3RhdGVJY29uKHQsZCk7dGhpcy51cGRhdGVMaW5rUG9pbnRzKHQsZCl9fSxcInNpbmdsZS1ub2RlXCIpLHRuKFwic3RhclwiLHtvcHRpb25zOntzaXplOjYwLHN0eWxlOntzdHJva2U6b24uZGVmYXVsdE5vZGUuc3R5bGUuc3Ryb2tlLGZpbGw6b24uZGVmYXVsdE5vZGUuc3R5bGUuZmlsbCxsaW5lV2lkdGg6b24uZGVmYXVsdE5vZGUuc3R5bGUubGluZVdpZHRofSxsYWJlbENmZzp7c3R5bGU6e2ZpbGw6b24ubm9kZUxhYmVsLnN0eWxlLmZpbGwsZm9udFNpemU6b24ubm9kZUxhYmVsLnN0eWxlLmZvbnRTaXplfX0sbGlua1BvaW50czp7dG9wOiExLHJpZ2h0OiExLGJvdHRvbTohMSxsZWZ0OiExLHNpemU6b24uZGVmYXVsdE5vZGUubGlua1BvaW50cy5zaXplLGxpbmVXaWR0aDpvbi5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLmxpbmVXaWR0aCxmaWxsOm9uLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuZmlsbCxzdHJva2U6b24uZGVmYXVsdE5vZGUubGlua1BvaW50cy5zdHJva2V9LGljb246e3Nob3c6ITEsaW1nOlwiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3MvYm13LXByb2QvNWQwMTUwNjUtODUwNS00ZTdhLWJhZWMtOTc2ZjgxZTNjNDFkLnN2Z1wiLHdpZHRoOjIwLGhlaWdodDoyMH0sc3RhdGVTdHlsZXM6T2JqZWN0KHYuYSkoe30sb24ubm9kZVN0YXRlU3R5bGVzKX0sc2hhcGVUeXBlOlwic3RhclwiLGxhYmVsUG9zaXRpb246XCJjZW50ZXJcIixkcmF3U2hhcGU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldE9wdGlvbnModCkuaWNvbixyPXZvaWQgMD09PW4/e306bixpPXRoaXMuZ2V0U2hhcGVTdHlsZSh0KSxvPWUuYWRkU2hhcGUoXCJwYXRoXCIse2F0dHJzOmksY2xhc3NOYW1lOnRoaXMudHlwZStcIi1rZXlTaGFwZVwiLG5hbWU6dGhpcy50eXBlK1wiLWtleVNoYXBlXCIsZHJhZ2dhYmxlOiEwfSksYT1yLndpZHRoLHM9ci5oZWlnaHQ7aWYoci5zaG93KWUuYWRkU2hhcGUoXCJpbWFnZVwiLHthdHRyczpPYmplY3Qodi5hKSh7eDotYS8yLHk6LXMvMn0sciksY2xhc3NOYW1lOnRoaXMudHlwZStcIi1pY29uXCIsbmFtZTp0aGlzLnR5cGUrXCItaWNvblwiLGRyYWdnYWJsZTohMH0pO3JldHVybiB0aGlzLmRyYXdMaW5rUG9pbnRzKHQsZSksb30sZHJhd0xpbmtQb2ludHM6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldE9wdGlvbnModCkubGlua1BvaW50cyxyPXZvaWQgMD09PW4/e306bixpPXIudG9wLG89ci5sZWZ0LGE9ci5yaWdodCxzPXIubGVmdEJvdHRvbSx1PXIucmlnaHRCb3R0b20sYz1yLnNpemUsZj1yLnIsbD1PYmplY3Qodi5jKShyLFtcInRvcFwiLFwibGVmdFwiLFwicmlnaHRcIixcImxlZnRCb3R0b21cIixcInJpZ2h0Qm90dG9tXCIsXCJzaXplXCIsXCJyXCJdKSxoPXRoaXMuZ2V0U2l6ZSh0KVswXTtpZihhKXt2YXIgZD1NYXRoLmNvcyguMSpNYXRoLlBJKSpoLHA9TWF0aC5zaW4oLjEqTWF0aC5QSSkqaDtlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGwpLHt4OmQseTotcCxyOmMvMnx8Znx8NX0pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtcmlnaHRcIixuYW1lOlwibGluay1wb2ludC1yaWdodFwifSl9aWYoaSl7ZD1NYXRoLmNvcyguNSpNYXRoLlBJKSpoLHA9TWF0aC5zaW4oLjUqTWF0aC5QSSkqaDtlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LGwpLHt4OmQseTotcCxyOmMvMnx8Znx8NX0pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtdG9wXCIsbmFtZTpcImxpbmstcG9pbnQtdG9wXCJ9KX1pZihvKXtkPU1hdGguY29zKC45Kk1hdGguUEkpKmgscD1NYXRoLnNpbiguOSpNYXRoLlBJKSpoO2UuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sbCkse3g6ZCx5Oi1wLHI6Yy8yfHxmfHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1sZWZ0XCIsbmFtZTpcImxpbmstcG9pbnQtbGVmdFwifSl9aWYocyl7ZD1NYXRoLmNvcygxLjMqTWF0aC5QSSkqaCxwPU1hdGguc2luKDEuMypNYXRoLlBJKSpoO2UuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sbCkse3g6ZCx5Oi1wLHI6Yy8yfHxmfHw1fSksY2xhc3NOYW1lOlwibGluay1wb2ludC1sZWZ0LWJvdHRvbVwiLG5hbWU6XCJsaW5rLXBvaW50LWxlZnQtYm90dG9tXCJ9KX1pZih1KXtkPU1hdGguY29zKDEuNypNYXRoLlBJKSpoLHA9TWF0aC5zaW4oMS43Kk1hdGguUEkpKmg7ZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxsKSx7eDpkLHk6LXAscjpjLzJ8fGZ8fDV9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LXJpZ2h0LWJvdHRvbVwiLG5hbWU6XCJsaW5rLXBvaW50LXJpZ2h0LWJvdHRvbVwifSl9fSxnZXRQYXRoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmdldFNpemUodClbMF0sbj0zKmUvOCxyPXQuaW5uZXJSfHxuLGk9W10sbz0wO288NTtvKyspe3ZhciBhPU1hdGguY29zKCgxOCs3MipvKS8xODAqTWF0aC5QSSkqZSxzPU1hdGguc2luKCgxOCs3MipvKS8xODAqTWF0aC5QSSkqZSx1PU1hdGguY29zKCg1NCs3MipvKS8xODAqTWF0aC5QSSkqcixjPU1hdGguc2luKCg1NCs3MipvKS8xODAqTWF0aC5QSSkqcjswPT09bz9pLnB1c2goW1wiTVwiLGEsLXNdKTppLnB1c2goW1wiTFwiLGEsLXNdKSxpLnB1c2goW1wiTFwiLHUsLWNdKX1yZXR1cm4gaS5wdXNoKFtcIlpcIl0pLGl9LGdldFNoYXBlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRPcHRpb25zKHQpLnN0eWxlLG49e3N0cm9rZTp0LmNvbG9yfSxyPU9iamVjdChoLkEpKHt9LGUsbiksaT10aGlzLmdldFBhdGgodCk7cmV0dXJuIE9iamVjdCh2LmEpKHtwYXRoOml9LHIpfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmdldENvbnRhaW5lcigpLHI9dGhpcy5nZXRPcHRpb25zKHt9KS5zdHlsZSxpPXRoaXMuZ2V0UGF0aCh0KSxvPXtzdHJva2U6dC5jb2xvcixwYXRoOml9LGE9ZS5nZXQoXCJrZXlTaGFwZVwiKSxzPU9iamVjdChoLkEpKHt9LHIsYS5hdHRyKCksbyk7cz1PYmplY3QoaC5BKShzLHQuc3R5bGUpLHRoaXMudXBkYXRlU2hhcGUodCxlLHMsITApLHRoaXMudXBkYXRlTGlua1BvaW50cyh0LG4pfSx1cGRhdGVMaW5rUG9pbnRzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRPcHRpb25zKHt9KS5saW5rUG9pbnRzLHI9ZS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm5cImxpbmstcG9pbnQtbGVmdFwiPT09dC5nZXQoXCJjbGFzc05hbWVcIil9KSksaT1lLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwibGluay1wb2ludC1yaWdodFwiPT09dC5nZXQoXCJjbGFzc05hbWVcIil9KSksbz1lLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVyblwibGluay1wb2ludC10b3BcIj09PXQuZ2V0KFwiY2xhc3NOYW1lXCIpfSkpLGE9ZS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm5cImxpbmstcG9pbnQtbGVmdC1ib3R0b21cIj09PXQuZ2V0KFwiY2xhc3NOYW1lXCIpfSkpLHM9ZS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm5cImxpbmstcG9pbnQtcmlnaHQtYm90dG9tXCI9PT10LmdldChcImNsYXNzTmFtZVwiKX0pKSx1PW4sYz1yfHxpfHxvfHxhfHxzO2MmJih1PWMuYXR0cigpKTt2YXIgZj1PYmplY3QoaC5BKSh7fSx1LHQubGlua1BvaW50cyksbD1mLmZpbGwsZD1mLnN0cm9rZSxwPWYubGluZVdpZHRoLGc9Zi5zaXplLzI7Z3x8KGc9Zi5yKTt2YXIgeT10LmxpbmtQb2ludHM/dC5saW5rUG9pbnRzOntsZWZ0OnZvaWQgMCxyaWdodDp2b2lkIDAsdG9wOnZvaWQgMCxsZWZ0Qm90dG9tOnZvaWQgMCxyaWdodEJvdHRvbTp2b2lkIDB9LG09eS5sZWZ0LGI9eS5yaWdodCx4PXkudG9wLHc9eS5sZWZ0Qm90dG9tLFM9eS5yaWdodEJvdHRvbSxFPXRoaXMuZ2V0U2l6ZSh0KVswXSxfPXtyOmcsZmlsbDpsLHN0cm9rZTpkLGxpbmVXaWR0aDpwfSxPPU1hdGguY29zKC4xKk1hdGguUEkpKkUsaz1NYXRoLnNpbiguMSpNYXRoLlBJKSpFO2k/Ynx8dm9pZCAwPT09Yj9pLmF0dHIoT2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sXykse3g6Tyx5Oi1rfSkpOmkucmVtb3ZlKCk6YiYmZS5hZGRTaGFwZShcImNpcmNsZVwiLHthdHRyczpPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxfKSx7eDpPLHk6LWt9KSxjbGFzc05hbWU6XCJsaW5rLXBvaW50LXJpZ2h0XCIsbmFtZTpcImxpbmstcG9pbnQtcmlnaHRcIixpc0FuY2hvclBvaW50OiEwfSksTz1NYXRoLmNvcyguNSpNYXRoLlBJKSpFLGs9TWF0aC5zaW4oLjUqTWF0aC5QSSkqRSxvP3h8fHZvaWQgMD09PXg/by5hdHRyKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LF8pLHt4Ok8seTota30pKTpvLnJlbW92ZSgpOngmJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sXykse3g6Tyx5Oi1rfSksY2xhc3NOYW1lOlwibGluay1wb2ludC10b3BcIixuYW1lOlwibGluay1wb2ludC10b3BcIixpc0FuY2hvclBvaW50OiEwfSksTz1NYXRoLmNvcyguOSpNYXRoLlBJKSpFLGs9TWF0aC5zaW4oLjkqTWF0aC5QSSkqRSxyP218fHZvaWQgMD09PW0/ci5hdHRyKE9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LF8pLHt4Ok8seTota30pKTpyLnJlbW92ZSgpOm0mJmUuYWRkU2hhcGUoXCJjaXJjbGVcIix7YXR0cnM6T2JqZWN0KHYuYSkoT2JqZWN0KHYuYSkoe30sXykse3g6Tyx5Oi1rfSksY2xhc3NOYW1lOlwibGluay1wb2ludC1sZWZ0XCIsbmFtZTpcImxpbmstcG9pbnQtbGVmdFwiLGlzQW5jaG9yUG9pbnQ6ITB9KSxPPU1hdGguY29zKDEuMypNYXRoLlBJKSpFLGs9TWF0aC5zaW4oMS4zKk1hdGguUEkpKkUsYT93fHx2b2lkIDA9PT13P2EuYXR0cihPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxfKSx7eDpPLHk6LWt9KSk6YS5yZW1vdmUoKTp3JiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LF8pLHt4Ok8seTota30pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtbGVmdC1ib3R0b21cIixuYW1lOlwibGluay1wb2ludC1sZWZ0LWJvdHRvbVwiLGlzQW5jaG9yUG9pbnQ6ITB9KSxPPU1hdGguY29zKDEuNypNYXRoLlBJKSpFLGs9TWF0aC5zaW4oMS43Kk1hdGguUEkpKkUscz9TfHx2b2lkIDA9PT1TP3MuYXR0cihPYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxfKSx7eDpPLHk6LWt9KSk6YS5yZW1vdmUoKTpTJiZlLmFkZFNoYXBlKFwiY2lyY2xlXCIse2F0dHJzOk9iamVjdCh2LmEpKE9iamVjdCh2LmEpKHt9LF8pLHt4Ok8seTota30pLGNsYXNzTmFtZTpcImxpbmstcG9pbnQtcmlnaHQtYm90dG9tXCIsbmFtZTpcImxpbmstcG9pbnQtcmlnaHQtYm90dG9tXCIsaXNBbmNob3JQb2ludDohMH0pfX0sXCJzaW5nbGUtbm9kZVwiKTt2YXIgbnY9ZnVuY3Rpb24odCl7dmFyIGU9dC54LG49dC55O3JldHVybnt4OmUseTpuLGNlbnRlclg6ZSxjZW50ZXJZOm4sbWluWDplLG1pblk6bixtYXhYOmUsbWF4WTpuLGhlaWdodDowLHdpZHRoOjB9fSxydj1mdW5jdGlvbih0LGUpe3JldHVybiAyKk1hdGguYWJzKHQuY2VudGVyWC1lLmNlbnRlclgpPHQud2lkdGgrZS53aWR0aCYmMipNYXRoLmFicyh0LmNlbnRlclktZS5jZW50ZXJZKTx0LmhlaWdodCtlLmhlaWdodH0saXY9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49e30scj10Lmxlbmd0aCxpPTA7aTxyO2krKyl7dmFyIG89dFtpXTtvLmlkPW8ueCtcInx8fFwiK28ueSxuW28uaWRdPW8sZS5wdXNoKG8pfXJldHVybiBlfSxvdj1mdW5jdGlvbih0KXtyZXR1cm4gdD1pdih0KX0sYXY9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdCx7eDp0LngseTplLnl9LGVdfSxzdj1mdW5jdGlvbih0LGUpe3JldHVybiAwPT09dC53aWR0aCYmMD09PXQuaGVpZ2h0P3Q6e2NlbnRlclg6dC5jZW50ZXJYLGNlbnRlclk6dC5jZW50ZXJZLG1pblg6dC5taW5YLWUsbWluWTp0Lm1pblktZSxtYXhYOnQubWF4WCtlLG1heFk6dC5tYXhZK2UsaGVpZ2h0OnQuaGVpZ2h0KzIqZSx3aWR0aDp0LndpZHRoKzIqZX19LHV2PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguYWJzKHQueC1lLmNlbnRlclgpLHI9TWF0aC5hYnModC55LWUuY2VudGVyWSk7cmV0dXJuIDA9PT1uJiYwPT09cj8wOm4vZS53aWR0aD5yL2UuaGVpZ2h0fShlLHQpO2lmKDA9PT1yKXt2YXIgaT10LmNlbnRlclgsbz10LmNlbnRlclk7cmV0dXJuIG4ueTxlLnk/bz10Lm1pblk6bi54PmUueD9pPXQubWF4WDpuLng8ZS54P2k9dC5taW5YOm4ueD09PWUueCYmKG89dC5tYXhZKSx7eDppLHk6b319cmV0dXJuIHI/e3g6ZS54PnQuY2VudGVyWD90Lm1heFg6dC5taW5YLHk6ZS55fTp7eDplLngseTplLnk+dC5jZW50ZXJZP3QubWF4WTp0Lm1pbll9fSxjdj1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGgubWluKHQubWluWCxlLm1pblgpLHI9TWF0aC5taW4odC5taW5ZLGUubWluWSksaT1NYXRoLm1heCh0Lm1heFgsZS5tYXhYKSxvPU1hdGgubWF4KHQubWF4WSxlLm1heFkpO3JldHVybntjZW50ZXJYOihuK2kpLzIsY2VudGVyWToocitvKS8yLG1pblg6bixtaW5ZOnIsbWF4WDppLG1heFk6byxoZWlnaHQ6by1yLHdpZHRoOmktbn19LGZ2PWZ1bmN0aW9uKHQpe3ZhciBlPXQubWluWCxuPXQubWluWSxyPXQubWF4WCxpPXQubWF4WTtyZXR1cm5be3g6ZSx5Om59LHt4OnIseTpufSx7eDpyLHk6aX0se3g6ZSx5Oml9XX0sbHY9ZnVuY3Rpb24odCxlKXt2YXIgbj10Lngscj10Lnk7cmV0dXJuIG48ZS5taW5YfHxuPmUubWF4WHx8cjxlLm1pbll8fHI+ZS5tYXhZfSxodj1mdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLmFicyh0LngtZS54KStNYXRoLmFicyh0LnktZS55KX0sZHY9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gaHYodCxlKStodih0LG4pK2Z1bmN0aW9uKHQsZSl7dmFyIG49MDtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlJiYodC54PT09ZS54JiYobis9LTIpLHQueT09PWUueSYmKG4rPS0yKSl9KSksbn0odCxbZSxuLHIsaV0pfSxwdj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLngtdC54LG89bi55LXQueSxhPXIueC10Lngscz1yLnktdC55LHU9bi54LWUueCxjPW4ueS1lLnksZj1yLngtZS54LGw9ci55LWUueTtyZXR1cm4oaSpzLW8qYSkqKHUqbC1jKmYpPD0wJiYoaSpjLW8qdSkqKGEqbC1zKmYpPD0wfSxndj1mdW5jdGlvbih0LGUsbil7aWYoMD09PW4ud2lkdGgmJjA9PT1uLmhlaWdodClyZXR1cm4hMTt2YXIgcj1mdihuKSxpPXJbMF0sbz1yWzFdLGE9clsyXSxzPXJbM107cmV0dXJuIHB2KHQsZSxpLG8pfHxwdih0LGUsaSxzKXx8cHYodCxlLG8sYSl8fHB2KHQsZSxhLHMpfSx2dj1mdW5jdGlvbih0LGUsbixyLGksbyxhKXt2YXIgcz1bXSx1PVtlXSxjPXt9LGY9e30sbD17fTtmW2UuaWRdPTAsbFtlLmlkXT1kdihlLG4sZSk7dmFyIGg9e307dC5mb3JFYWNoKChmdW5jdGlvbih0KXtoW3QuaWRdPXR9KSk7Zm9yKHZhciBkPWZ1bmN0aW9uKCl7dmFyIGQscCxnLHYseT0xLzA7aWYodS5mb3JFYWNoKChmdW5jdGlvbih0KXtsW3QuaWRdPHkmJih5PWxbdC5pZF0sZD10KX0pKSxkPT09bil7dmFyIG09W107cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLHIsaSxvKXt2b2lkIDA9PT1vJiYobz0wKSxlLnVuc2hpZnQobltpXSkscltpXSYmcltpXSE9PWkmJm88PTEwMCYmdChlLG4scixyW2ldLG8rMSl9KG0saCxjLG4uaWQpLHt2YWx1ZTptfX1nPWQsKHY9KHA9dSkuaW5kZXhPZihnKSk+LTEmJnAuc3BsaWNlKHYsMSkscy5wdXNoKGQpLGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QhPT1lJiYodC54IT09ZS54JiZ0LnkhPT1lLnl8fGd2KHQsZSxuKXx8Z3YodCxlLHIpfHxpLnB1c2godCkpfSkpLGl2KGkpfSh0LGQscixpKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZigtMT09PXMuaW5kZXhPZih0KSl7LTE9PT11LmluZGV4T2YodCkmJnUucHVzaCh0KTt2YXIgcj1sW2QuaWRdK2h2KGQsdCk7Zlt0LmlkXSYmcj49Zlt0LmlkXXx8KGNbdC5pZF09ZC5pZCxmW3QuaWRdPXIsbFt0LmlkXT1mW3QuaWRdK2R2KHQsbixlLG8sYSkpfX0pKX07dS5sZW5ndGg7KXt2YXIgcD1kKCk7aWYoXCJvYmplY3RcIj09PWV2KHApKXJldHVybiBwLnZhbHVlfXJldHVybltlLG5dfSx5dj1mdW5jdGlvbih0LGUpe3ZhciBuPVtdLHI9dFswXTtyZXR1cm4gbi5wdXNoKFwiTVwiK3IueCtcIiBcIityLnkpLHQuZm9yRWFjaCgoZnVuY3Rpb24ocixpKXt2YXIgbz10W2krMV0sYT10W2krMl07aWYobyYmYSlpZihmdW5jdGlvbih0LGUsbil7cmV0dXJuISh0Lng9PT1lLngmJmUueD09PW4ueHx8dC55PT09ZS55JiZlLnk9PT1uLnkpfShyLG8sYSkpe3ZhciBzPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWh2KHQsZSksbz1odihuLGUpO3JldHVybiBpPHImJihyPWkpLG88ciYmKHI9byksW3t4OmUueC1yL2kqKGUueC10LngpLHk6ZS55LXIvaSooZS55LXQueSl9LHt4OmUueC1yL28qKGUueC1uLngpLHk6ZS55LXIvbyooZS55LW4ueSl9XX0ocixvLGEsZSksdT1zWzBdLGM9c1sxXTtuLnB1c2goXCJMXCIrdS54K1wiIFwiK3UueSksbi5wdXNoKFwiUVwiK28ueCtcIiBcIitvLnkrXCIgXCIrYy54K1wiIFwiK2MueSksbi5wdXNoKFwiTFwiK2MueCtcIiBcIitjLnkpfWVsc2Ugbi5wdXNoKFwiTFwiK28ueCtcIiBcIitvLnkpO2Vsc2UgbyYmbi5wdXNoKFwiTFwiK28ueCtcIiBcIitvLnkpfSkpLG4uam9pbihcIlwiKX0sbXY9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbyxhO2lmKG4mJm4uZ2V0VHlwZSgpKWlmKFwiY29tYm9cIj09PW4uZ2V0VHlwZSgpKXsobz1uLmdldEtleVNoYXBlKCkuZ2V0Q2FudmFzQkJveCgpfHxudih0KSkuY2VudGVyWD0oby5taW5YK28ubWF4WCkvMixvLmNlbnRlclk9KG8ubWluWStvLm1heFkpLzJ9ZWxzZSBvPW4uZ2V0QkJveCgpO2Vsc2Ugbz1udih0KTtpZihyJiZyLmdldFR5cGUoKSlpZihcImNvbWJvXCI9PT1yLmdldFR5cGUoKSl7KGE9ci5nZXRLZXlTaGFwZSgpLmdldENhbnZhc0JCb3goKXx8bnYoZSkpLmNlbnRlclg9KGEubWluWCthLm1heFgpLzIsYS5jZW50ZXJZPShhLm1pblkrYS5tYXhZKS8yfWVsc2UgYT1yJiZyLmdldEJCb3goKTtlbHNlIGE9bnYoZSk7aWYocnYobyxhKSlyZXR1cm4gb3YoYXYodCxlKSk7dmFyIHM9c3YobyxpKSx1PXN2KGEsaSk7aWYocnYocyx1KSlyZXR1cm4gb3YoYXYodCxlKSk7dmFyIGM9dXYocyx0LGUpLGY9dXYodSxlLHQpLGw9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9W10pO3ZhciBlPVtdLG49W107dC5mb3JFYWNoKChmdW5jdGlvbih0KXtlLnB1c2godC54KSxuLnB1c2godC55KX0pKTt2YXIgcj1NYXRoLm1pbi5hcHBseShNYXRoLGUpLGk9TWF0aC5tYXguYXBwbHkoTWF0aCxlKSxvPU1hdGgubWluLmFwcGx5KE1hdGgsbiksYT1NYXRoLm1heC5hcHBseShNYXRoLG4pO3JldHVybntjZW50ZXJYOihyK2kpLzIsY2VudGVyWToobythKS8yLG1heFg6aSxtYXhZOmEsbWluWDpyLG1pblk6byxoZWlnaHQ6YS1vLHdpZHRoOmktcn19KFtjLGZdKSxoPWN2KHMsbCksZD1jdih1LGwpLHA9W107cD0ocD1wLmNvbmNhdChmdihoKSkpLmNvbmNhdChmdihkKSk7dmFyIGc9e3g6KHQueCtlLngpLzIseToodC55K2UueSkvMn07W2wsaCxkXS5mb3JFYWNoKChmdW5jdGlvbih0KXtwPXAuY29uY2F0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU8dC5taW5YfHxlPnQubWF4WD9bXTpbe3g6ZSx5OnQubWluWX0se3g6ZSx5OnQubWF4WX1dfSh0LGUueCkuY29uY2F0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU8dC5taW5ZfHxlPnQubWF4WT9bXTpbe3g6dC5taW5YLHk6ZX0se3g6dC5tYXhYLHk6ZX1dfSh0LGUueSkpfSh0LGcpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIGx2KHQscykmJmx2KHQsdSl9KSkpfSkpLFt7eDpjLngseTpmLnl9LHt4OmYueCx5OmMueX1dLmZvckVhY2goKGZ1bmN0aW9uKHQpe2x2KHQscykmJmx2KHQsdSkmJnAucHVzaCh0KX0pKSxwLnVuc2hpZnQoYykscC5wdXNoKGYpLHA9aXYocCk7dmFyIHY9dnYocCxjLGYsbyxhLHQsZSk7cmV0dXJuIHYudW5zaGlmdCh0KSx2LnB1c2goZSksb3Yodil9O2Z1bmN0aW9uIGJ2KHQpe3JldHVybihidj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9dmFyIHh2PXtvZmZzZXQ6MjAsbWF4QWxsb3dlZERpcmVjdGlvbkNoYW5nZTo5MCxtYXhpbXVtTG9vcHM6MmUzLGdyaWRTaXplOjEwLGRpcmVjdGlvbnM6W3tzdGVwWDoxLHN0ZXBZOjB9LHtzdGVwWDotMSxzdGVwWTowfSx7c3RlcFg6MCxzdGVwWToxfSx7c3RlcFg6MCxzdGVwWTotMX1dLGdldCBwZW5hbHRpZXMoKXtyZXR1cm57MDowLDQ1OnRoaXMuZ3JpZFNpemUvMiw5MDp0aGlzLmdyaWRTaXplLzJ9fSxkaXN0RnVuYzpmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLmFicyh0LngtZS54KStNYXRoLmFicyh0LnktZS55KX0sZmFsbGJhY2tSb3V0ZTpmdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBvdihtdih0LGUsbixyLGkub2Zmc2V0KSl9fSx3dj1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguZmxvb3IoTWF0aC5hYnModC9lKSk7cmV0dXJuIG48MD8wOih0PDA/LTE6MSkqbn0sU3Y9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLngtdC54LHI9ZS55LXQueTtyZXR1cm4gbnx8cj8oMzYwKzE4MCpNYXRoLmF0YW4yKHIsbikvTWF0aC5QSSklMzYwOjB9LEV2PWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5hYnModC1lKTtyZXR1cm4gbj4xODA/MzYwLW46bn0sX3Y9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0xLzAsaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl7dmFyIGE9bih0LGVbaV0pO2E8ciYmKHI9YSl9cmV0dXJuIHJ9LE92PWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89W107aWYoIW4pcmV0dXJuIG87dmFyIGE9aS5kaXJlY3Rpb25zLHM9aS5vZmZzZXQsdT1uLmdldEJCb3goKSxjPWUueD51Lm1pblgmJmUueDx1Lm1heFgmJmUueT51Lm1pblkmJmUueTx1Lm1heFksZj1zdih1LHMpO2Zvcih2YXIgbCBpbiBmKWZbbF09d3YoZltsXSxpLmdyaWRTaXplKTtpZihjKWZvcih2YXIgaD0wLGQ9YTtoPGQubGVuZ3RoO2grKyl7dmFyIHA9ZFtoXSxnPVtbe3g6Zi5taW5YLHk6Zi5taW5ZfSx7eDpmLm1heFgseTpmLm1pbll9XSxbe3g6Zi5taW5YLHk6Zi5taW5ZfSx7eDpmLm1pblgseTpmLm1heFl9XSxbe3g6Zi5tYXhYLHk6Zi5taW5ZfSx7eDpmLm1heFgseTpmLm1heFl9XSxbe3g6Zi5taW5YLHk6Zi5tYXhZfSx7eDpmLm1heFgseTpmLm1heFl9XV07Zm9yKGw9MDtsPDQ7bCsrKXt2YXIgdix5PWdbbF07KHY9UWUuZ2V0TGluZUludGVyc2VjdCh0LHt4OnQueCtwLnN0ZXBYKmYud2lkdGgseTp0LnkrcC5zdGVwWSpmLmhlaWdodH0seVswXSx5WzFdKSkmJiFndih0LHYsdSkmJih2LmlkPXYueCtcInx8fFwiK3YueSxvLnB1c2godikpfX1lbHNlKHY9dXYoZix0LHIpKS5pZD12LngrXCJ8fHxcIit2Lnksby5wdXNoKHYpO3JldHVybiBvfSxrdj1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPU9iamVjdChoLmUpKHh2LGkpO28ub2JzdGFjbGVzPW8ub2JzdGFjbGVzfHxbXTt2YXIgYT1mdW5jdGlvbih0LGUsbil7dmFyIHI9e307cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodClmb3IodmFyIGk9c3YodC5nZXRCQm94KCksbiksbz13dihpLm1pblgsZSk7bzw9d3YoaS5tYXhYLGUpO28rPTEpZm9yKHZhciBhPXd2KGkubWluWSxlKTthPD13dihpLm1heFksZSk7YSs9MSl7cltvK1wifHx8XCIrYV09ITB9fSkpLHJ9KG8ub2JzdGFjbGVzLmNvbmNhdChbbixyXSksby5ncmlkU2l6ZSxvLm9mZnNldCkscz17eDp3dih0Lngsby5ncmlkU2l6ZSkseTp3dih0Lnksby5ncmlkU2l6ZSl9LHU9e3g6d3YoZS54LG8uZ3JpZFNpemUpLHk6d3YoZS55LG8uZ3JpZFNpemUpfTt0LmlkPXMueCtcInx8fFwiK3MueSxlLmlkPXUueCtcInx8fFwiK3UueTt2YXIgYz1PdihzLHQsbix1LG8pLGY9T3YodSxlLHIscyxvKTtjLmZvckVhY2goKGZ1bmN0aW9uKHQpe2RlbGV0ZSBhW3QuaWRdfSkpLGYuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZGVsZXRlIGFbdC5pZF19KSk7Zm9yKHZhciBsPXt9LGQ9e30scD17fSxnPXt9LHY9e30seT0wO3k8Yy5sZW5ndGg7eSsrKXt2YXIgbT1jW3ldO2xbbS5pZF09bSxnW20uaWRdPTAsdlttLmlkXT1fdihtLGYsby5kaXN0RnVuYyl9Zm9yKHZhciBiPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1Tdih0LGUpO2lmKHBbdC5pZF0pe3ZhciBpPVN2KHt4OnBhcnNlRmxvYXQocFt0LmlkXS5zcGxpdChcInx8fFwiKVswXSkseTpwYXJzZUZsb2F0KHBbdC5pZF0uc3BsaXQoXCJ8fHxcIilbMV0pfSx0KTtuPUV2KGkscil9ZWxzZXt2YXIgbz1TdihzLHQpO249RXYobyxyKX1yZXR1cm4gbn0seD1vLm1heGltdW1Mb29wcyx3PWZ1bmN0aW9uKCl7dmFyIG4scj0xLzA7Zm9yKHZhciBpIGluIGwpdltpXTw9ciYmKHI9dltpXSxuPWxbaV0pO2lmKCFuKXJldHVyblwiYnJlYWtcIjtpZihmLmZpbmRJbmRleCgoZnVuY3Rpb24odCl7cmV0dXJuIHQueD09PW4ueCYmdC55PT09bi55fSkpPi0xKXJldHVybnt2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj1bZV0saT17eDpwYXJzZUZsb2F0KG4uc3BsaXQoXCJ8fHxcIilbMF0pLHk6cGFyc2VGbG9hdChuLnNwbGl0KFwifHx8XCIpWzFdKSxpZDpufTtmb3IoYihpLHUpJiZyLnVuc2hpZnQoe3g6aS54PT09dS54P2UueDppLngqby5ncmlkU2l6ZSx5OmkueT09PXUueT9lLnk6aS55Km8uZ3JpZFNpemV9KTtwW25dJiZwW25dIT09bjspe3ZhciBhPXt4OnBhcnNlRmxvYXQobi5zcGxpdChcInx8fFwiKVswXSkseTpwYXJzZUZsb2F0KG4uc3BsaXQoXCJ8fHxcIilbMV0pLGlkOm59LGM9cFtuXSxmPXt4OnBhcnNlRmxvYXQoYy5zcGxpdChcInx8fFwiKVswXSkseTpwYXJzZUZsb2F0KGMuc3BsaXQoXCJ8fHxcIilbMV0pLGlkOmN9O2IoZixhKSYmci51bnNoaWZ0KHt4OmYueD09PWEueD9yWzBdLng6Zi54Km8uZ3JpZFNpemUseTpmLnk9PT1hLnk/clswXS55OmYueSpvLmdyaWRTaXplfSksbj1jfXZhciBsPXBhcnNlRmxvYXQobi5zcGxpdChcInx8fFwiKVswXSksaD1wYXJzZUZsb2F0KG4uc3BsaXQoXCJ8fHxcIilbMV0pO3JldHVybiByWzBdLng9bD09PXMueD90Lng6clswXS54LHJbMF0ueT1oPT09cy55P3QueTpyWzBdLnksci51bnNoaWZ0KHQpLHJ9KG4uaWQpfTtkZWxldGUgbFtuLmlkXSxkW24uaWRdPSEwO2Zvcih2YXIgYz0wO2M8by5kaXJlY3Rpb25zLmxlbmd0aDtjKyspe3ZhciBoPW8uZGlyZWN0aW9uc1tjXSx5PXt4Om4ueCtoLnN0ZXBYLHk6bi55K2guc3RlcFksaWQ6bi54K2guc3RlcFgrXCJ8fHxcIisobi55K2guc3RlcFkpfTtpZighZFt5LmlkXSl7dmFyIG09YihuLHkpO2lmKCEobT5vLm1heEFsbG93ZWREaXJlY3Rpb25DaGFuZ2V8fGFbeS5pZF0pKXtsW3kuaWRdfHwobFt5LmlkXT15KTt2YXIgdz1vLmRpc3RGdW5jKG4seSkrKGlzTmFOKG8ucGVuYWx0aWVzW21dKT9vLmdyaWRTaXplOm8ucGVuYWx0aWVzW21dKSxTPWdbbi5pZF0rdztnW3kuaWRdJiZTPj1nW3kuaWRdfHwocFt5LmlkXT1uLmlkLGdbeS5pZF09Uyx2W3kuaWRdPVMrX3YoeSxmLG8uZGlzdEZ1bmMpKX19fXgtPTF9O09iamVjdC5rZXlzKGwpLmxlbmd0aD4wJiZ4PjA7KXt2YXIgUz13KCk7aWYoXCJvYmplY3RcIj09PWJ2KFMpKXJldHVybiBTLnZhbHVlO2lmKFwiYnJlYWtcIj09PVMpYnJlYWt9cmV0dXJuIG8uZmFsbGJhY2tSb3V0ZSh0LGUsbixyLG8pfTtlbihcInBvbHlsaW5lXCIse29wdGlvbnM6e2NvbG9yOm9uLmRlZmF1bHRFZGdlLmNvbG9yLHNpemU6b24uZGVmYXVsdEVkZ2Uuc2l6ZSxzdHlsZTp7cmFkaXVzOjAsb2Zmc2V0OjE1LHg6MCx5OjAsc3Ryb2tlOm9uLmRlZmF1bHRFZGdlLnN0eWxlLnN0cm9rZSxsaW5lQXBwZW5kV2lkdGg6b24uZGVmYXVsdEVkZ2Uuc3R5bGUubGluZUFwcGVuZFdpZHRofSxsYWJlbENmZzp7c3R5bGU6e2ZpbGw6b24uZWRnZUxhYmVsLnN0eWxlLmZpbGwsZm9udFNpemU6b24uZWRnZUxhYmVsLnN0eWxlLmZvbnRTaXplfX0scm91dGVDZmc6e29ic3RhY2xlczpbXSxtYXhBbGxvd2VkRGlyZWN0aW9uQ2hhbmdlOjkwLG1heGltdW1Mb29wczo1MDAsZ3JpZFNpemU6MTB9LHN0YXRlU3R5bGVzOk9iamVjdCh2LmEpKHt9LG9uLmVkZ2VTdGF0ZVN0eWxlcyl9LHNoYXBlVHlwZTpcInBvbHlsaW5lXCIsbGFiZWxQb3NpdGlvbjpcImNlbnRlclwiLGRyYXdTaGFwZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0U2hhcGVTdHlsZSh0KTtyZXR1cm4gMD09PW4ucmFkaXVzJiZkZWxldGUgbi5yYWRpdXMsZS5hZGRTaGFwZShcInBhdGhcIix7Y2xhc3NOYW1lOlwiZWRnZS1zaGFwZVwiLG5hbWU6XCJlZGdlLXNoYXBlXCIsYXR0cnM6bn0pfSxnZXRTaGFwZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5zdHlsZSxuPXtzdHJva2U6dC5jb2xvcn0scj1PYmplY3QoaC5BKSh7fSxlLG4sdC5zdHlsZSk7dD10aGlzLmdldFBhdGhQb2ludHModCksdGhpcy5yYWRpdXM9ci5yYWRpdXMsdGhpcy5vZmZzZXQ9ci5vZmZzZXQ7dmFyIGk9dC5zdGFydFBvaW50LG89dC5lbmRQb2ludCxhPXRoaXMuZ2V0Q29udHJvbFBvaW50cyh0KSxzPVtpXTthJiYocz1zLmNvbmNhdChhKSkscy5wdXNoKG8pO3ZhciB1PXQuc291cmNlTm9kZSxjPXQudGFyZ2V0Tm9kZSxmPXIucmFkaXVzLGw9dGhpcy5vcHRpb25zLnJvdXRlQ2ZnO2x8fChsPXt9KSxsLm9mZnNldD1yLm9mZnNldDt2YXIgZD10aGlzLmdldFBhdGgocyx1LGMsZixsKTtyZXR1cm4oT2JqZWN0KGgubSkoZCkmJmQubGVuZ3RoPD0xfHxPYmplY3QoaC54KShkKSYmLTE9PT1kLmluZGV4T2YoXCJMXCIpKSYmKGQ9XCJNMCAwLCBMMCAwXCIpLChpc05hTihpLngpfHxpc05hTihpLnkpfHxpc05hTihvLngpfHxpc05hTihvLnkpKSYmKGQ9XCJNMCAwLCBMMCAwXCIpLE9iamVjdChoLkEpKHt9LG9uLmRlZmF1bHRFZGdlLnN0eWxlLHIse2xpbmVXaWR0aDp0LnNpemUscGF0aDpkfSl9LHVwZGF0ZVNoYXBlU3R5bGU6ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmdldENvbnRhaW5lcigpLHI9e3N0cm9rZTp0LmNvbG9yfSxpPW4uZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuXCJlZGdlLXNoYXBlXCI9PT10LmdldChcImNsYXNzTmFtZVwiKX0pKXx8ZS5nZXRLZXlTaGFwZSgpLG89dC5zaXplLGE9KHQ9dGhpcy5nZXRQYXRoUG9pbnRzKHQpKS5zdGFydFBvaW50LHM9dC5lbmRQb2ludCx1PXRoaXMuZ2V0Q29udHJvbFBvaW50cyh0KSxjPVthXTt1JiYoYz1jLmNvbmNhdCh1KSksYy5wdXNoKHMpO3ZhciBmPWkuYXR0cigpLGw9T2JqZWN0KGguQSkoe30scixmLHQuc3R5bGUpLGQ9dC5zb3VyY2VOb2RlLHA9dC50YXJnZXROb2RlLGc9bC5yYWRpdXMsdj10aGlzLm9wdGlvbnMucm91dGVDZmc7dnx8KHY9e30pLHYub2Zmc2V0PWwub2Zmc2V0O3ZhciB5PXRoaXMuZ2V0UGF0aChjLGQscCxnLHYpOyhPYmplY3QoaC5tKSh5KSYmeS5sZW5ndGg8PTF8fE9iamVjdChoLngpKHkpJiYtMT09PXkuaW5kZXhPZihcIkxcIikpJiYoeT1cIk0wIDAsIEwwIDBcIiksKGlzTmFOKGEueCl8fGlzTmFOKGEueSl8fGlzTmFOKHMueCl8fGlzTmFOKHMueSkpJiYoeT1cIk0wIDAsIEwwIDBcIiksZi5lbmRBcnJvdyYmITE9PT1sLmVuZEFycm93JiYodC5zdHlsZS5lbmRBcnJvdz17cGF0aDpcIlwifSksZi5zdGFydEFycm93JiYhMT09PWwuc3RhcnRBcnJvdyYmKHQuc3R5bGUuc3RhcnRBcnJvdz17cGF0aDpcIlwifSk7dmFyIG09T2JqZWN0KGguQSkocixpLmF0dHIoKSx7bGluZVdpZHRoOm8scGF0aDp5fSx0LnN0eWxlKTtpJiZpLmF0dHIobSl9LGdldFBhdGg6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbztpZighaS5vZmZzZXR8fHQubGVuZ3RoPjIpe2lmKHIpcmV0dXJuIHl2KHQscik7dmFyIGE9W107cmV0dXJuIE9iamVjdChoLmYpKHQsKGZ1bmN0aW9uKHQsZSl7MD09PWU/YS5wdXNoKFtcIk1cIix0LngsdC55XSk6YS5wdXNoKFtcIkxcIix0LngsdC55XSl9KSksYX1yZXR1cm4gcj8obz1rdih0WzBdLHRbdC5sZW5ndGgtMV0sZSxuLGkpLHl2KG8scikpOihvPWt2KHRbMF0sdFt0Lmxlbmd0aC0xXSxlLG4saSksUWUucG9pbnRzVG9Qb2x5Z29uKG8pKX19LFwic2luZ2xlLWVkZ2VcIik7dmFyIE12PWRkLmNsb25lRXZlbnQsQXY9ZGQuaXNOYU4sVHY9TWF0aC5hYnMsQ3Y9W1wic2hpZnRcIixcImN0cmxcIixcImFsdFwiLFwiY29udHJvbFwiXSxJdj17Z2V0RGVmYXVsdENmZzpmdW5jdGlvbigpe3JldHVybntkaXJlY3Rpb246XCJib3RoXCIsZW5hYmxlT3B0aW1pemU6ITEsc2NhbGFibGVSYW5nZTowLGFsbG93RHJhZ09uSXRlbTohMX19LGdldEV2ZW50czpmdW5jdGlvbigpe3JldHVybntkcmFnc3RhcnQ6XCJvbk1vdXNlRG93blwiLGRyYWc6XCJvbk1vdXNlTW92ZVwiLGRyYWdlbmQ6XCJvbk1vdXNlVXBcIixcImNhbnZhczpjbGlja1wiOlwib25Nb3VzZVVwXCIsa2V5dXA6XCJvbktleVVwXCIsZm9jdXM6XCJvbktleVVwXCIsa2V5ZG93bjpcIm9uS2V5RG93blwiLHRvdWNoc3RhcnQ6XCJvblRvdWNoU3RhcnRcIix0b3VjaG1vdmU6XCJvblRvdWNoTW92ZVwiLHRvdWNoZW5kOlwib25Nb3VzZVVwXCJ9fSx1cGRhdGVWaWV3cG9ydDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9yaWdpbixuPSt0LmNsaWVudFgscj0rdC5jbGllbnRZO2lmKCFBdihuKSYmIUF2KHIpKXt2YXIgaT1uLWUueCxvPXItZS55O1wieFwiPT09dGhpcy5nZXQoXCJkaXJlY3Rpb25cIik/bz0wOlwieVwiPT09dGhpcy5nZXQoXCJkaXJlY3Rpb25cIikmJihpPTApLHRoaXMub3JpZ2luPXt4Om4seTpyfTt2YXIgYT10aGlzLmdyYXBoLmdldChcIndpZHRoXCIpLHM9dGhpcy5ncmFwaC5nZXQoXCJoZWlnaHRcIiksdT10aGlzLmdyYXBoLmdldChcImNhbnZhc1wiKS5nZXRDYW52YXNCQm94KCk7KHUubWluWDw9YSt0aGlzLnNjYWxhYmxlUmFuZ2UmJnUubWluWCtpPmErdGhpcy5zY2FsYWJsZVJhbmdlfHx1Lm1heFgrdGhpcy5zY2FsYWJsZVJhbmdlPj0wJiZ1Lm1heFgrdGhpcy5zY2FsYWJsZVJhbmdlK2k8MCkmJihpPTApLCh1Lm1pblk8PXMrdGhpcy5zY2FsYWJsZVJhbmdlJiZ1Lm1pblkrbz5zK3RoaXMuc2NhbGFibGVSYW5nZXx8dS5tYXhZK3RoaXMuc2NhbGFibGVSYW5nZT49MCYmdS5tYXhZK3RoaXMuc2NhbGFibGVSYW5nZStvPDApJiYobz0wKSx0aGlzLmdyYXBoLnRyYW5zbGF0ZShpLG8pfX0sb25Ub3VjaFN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBlPXQub3JpZ2luYWxFdmVudC50b3VjaGVzLG49ZVswXSxyPWVbMV07biYmcnx8KHQucHJldmVudERlZmF1bHQoKSx0aGlzLm9uTW91c2VEb3duKHQpKX0sb25Nb3VzZURvd246ZnVuY3Rpb24odCl7dmFyIGU9dC5vcmlnaW5hbEV2ZW50O2lmKCghZXx8dC5uYW1lPT09WWUuVE9VQ0hTVEFSVHx8MD09PWUuYnV0dG9uKSYmKHQubmFtZT09PVllLlRPVUNIU1RBUlR8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fCF3aW5kb3cuZXZlbnR8fHdpbmRvdy5ldmVudC5idXR0b25zfHx3aW5kb3cuZXZlbnQuYnV0dG9uKSYmdGhpcy5zaG91bGRCZWdpbi5jYWxsKHRoaXMsdCkmJiF0aGlzLmtleWRvd24pe3ZhciBuPXQudGFyZ2V0LHI9biYmbi5pc0NhbnZhcyYmbi5pc0NhbnZhcygpO2lmKCh0aGlzLmFsbG93RHJhZ09uSXRlbXx8cikmJih0aGlzLm9yaWdpbj17eDp0LmNsaWVudFgseTp0LmNsaWVudFl9LHRoaXMuZHJhZ2dpbmc9ITEsdGhpcy5lbmFibGVPcHRpbWl6ZSkpe2Zvcih2YXIgaT10aGlzLmdyYXBoLG89aS5nZXRFZGdlcygpLGE9MCxzPW8ubGVuZ3RoO2E8czthKyspe3ZhciB1PW9bYV0uZ2V0KFwiZ3JvdXBcIikuZ2V0KFwiY2hpbGRyZW5cIik7dSYmdS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnNldChcIm9yaS12aXNpYmlsaXR5XCIsdC5nZXQoXCJvcmktdmlzaWJpbGl0eVwiKXx8dC5nZXQoXCJ2aXNpYmxlXCIpKSx0LmhpZGUoKX0pKX1mb3IodmFyIGM9aS5nZXROb2RlcygpLGY9MCxsPWMubGVuZ3RoO2Y8bDtmKyspZm9yKHZhciBoPTAsZD1jW2ZdLmdldENvbnRhaW5lcigpLmdldChcImNoaWxkcmVuXCIpO2g8ZC5sZW5ndGg7aCsrKXt2YXIgcD1kW2hdO3AuZ2V0KFwiaXNLZXlTaGFwZVwiKXx8KHAuc2V0KFwib3JpLXZpc2liaWxpdHlcIixwLmdldChcIm9yaS12aXNpYmlsaXR5XCIpfHxwLmdldChcInZpc2libGVcIikpLHAuaGlkZSgpKX19fX0sb25Ub3VjaE1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMsbj1lWzBdLHI9ZVsxXTtuJiZyP3RoaXMub25Nb3VzZVVwKHQpOih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5vbk1vdXNlTW92ZSh0KSl9LG9uTW91c2VNb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JhcGg7aWYoIXRoaXMua2V5ZG93bil7dmFyIG49dC50YXJnZXQscj1uJiZuLmlzQ2FudmFzJiZuLmlzQ2FudmFzKCk7aWYoKHRoaXMuYWxsb3dEcmFnT25JdGVtfHxyKSYmKHQ9TXYodCksdGhpcy5vcmlnaW4pKXtpZih0aGlzLmRyYWdnaW5nKXQudHlwZT1cImRyYWdcIixlLmVtaXQoXCJjYW52YXM6ZHJhZ1wiLHQpO2Vsc2V7aWYoVHYodGhpcy5vcmlnaW4ueC10LmNsaWVudFgpK1R2KHRoaXMub3JpZ2luLnktdC5jbGllbnRZKTwxMClyZXR1cm47dGhpcy5zaG91bGRCZWdpbi5jYWxsKHRoaXMsdCkmJih0LnR5cGU9XCJkcmFnc3RhcnRcIixlLmVtaXQoXCJjYW52YXM6ZHJhZ3N0YXJ0XCIsdCksdGhpcy5kcmFnZ2luZz0hMCl9dGhpcy5zaG91bGRVcGRhdGUuY2FsbCh0aGlzLHQpJiZ0aGlzLnVwZGF0ZVZpZXdwb3J0KHQpfX19LG9uTW91c2VVcDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdyYXBoO2lmKCF0aGlzLmtleWRvd24pe2lmKHRoaXMuZW5hYmxlT3B0aW1pemUpe2Zvcih2YXIgbj1lLmdldEVkZ2VzKCkscj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bltyXS5nZXQoXCJncm91cFwiKS5nZXQoXCJjaGlsZHJlblwiKTtvJiZvLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZ2V0KFwib3JpLXZpc2liaWxpdHlcIikmJnQuc2hvdygpfSkpfWZvcih2YXIgYT1lLmdldE5vZGVzKCkscz0wLHU9YS5sZW5ndGg7czx1O3MrKylmb3IodmFyIGM9MCxmPWFbc10uZ2V0Q29udGFpbmVyKCkuZ2V0KFwiY2hpbGRyZW5cIik7YzxmLmxlbmd0aDtjKyspe3ZhciBsPWZbY107aWYoIWwuZ2V0KFwiaXNLZXlTaGFwZVwiKSlsLmdldChcIm9yaS12aXNpYmlsaXR5XCIpJiZsLnNob3coKX19dGhpcy5kcmFnZ2luZz8odD1Ndih0KSx0aGlzLnNob3VsZEVuZC5jYWxsKHRoaXMsdCkmJnRoaXMudXBkYXRlVmlld3BvcnQodCksdC50eXBlPVwiZHJhZ2VuZFwiLGUuZW1pdChcImNhbnZhczpkcmFnZW5kXCIsdCksdGhpcy5lbmREcmFnKCkpOnRoaXMub3JpZ2luPW51bGx9fSxlbmREcmFnOmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW49bnVsbCx0aGlzLmRyYWdnaW5nPSExLHRoaXMuZHJhZ2JlZ2luPSExfSxvbktleURvd246ZnVuY3Rpb24odCl7dmFyIGU9dC5rZXk7ZSYmKEN2LmluZGV4T2YoZS50b0xvd2VyQ2FzZSgpKT4tMT90aGlzLmtleWRvd249ITA6dGhpcy5rZXlkb3duPSExKX0sb25LZXlVcDpmdW5jdGlvbigpe3RoaXMua2V5ZG93bj0hMSx0aGlzLm9yaWdpbj1udWxsLHRoaXMuZHJhZ2dpbmc9ITEsdGhpcy5kcmFnYmVnaW49ITF9fSxQdj17Z2V0RGVmYXVsdENmZzpmdW5jdGlvbigpe3JldHVybnt1cGRhdGVFZGdlOiEwLGRlbGVnYXRlU3R5bGU6e30sZW5hYmxlRGVsZWdhdGU6ITEsb25seUNoYW5nZUNvbWJvU2l6ZTohMSxjb21ib0FjdGl2ZVN0YXRlOlwiXCIsc2VsZWN0ZWRTdGF0ZTpcInNlbGVjdGVkXCJ9fSxnZXRFdmVudHM6ZnVuY3Rpb24oKXtyZXR1cm57XCJub2RlOmRyYWdzdGFydFwiOlwib25EcmFnU3RhcnRcIixcIm5vZGU6ZHJhZ1wiOlwib25EcmFnXCIsXCJub2RlOmRyYWdlbmRcIjpcIm9uRHJhZ0VuZFwiLFwiY29tYm86ZHJhZ2VudGVyXCI6XCJvbkRyYWdFbnRlclwiLFwiY29tYm86ZHJhZ2xlYXZlXCI6XCJvbkRyYWdMZWF2ZVwiLFwiY29tYm86ZHJvcFwiOlwib25Ecm9wQ29tYm9cIixcIm5vZGU6ZHJvcFwiOlwib25Ecm9wTm9kZVwiLFwiY2FudmFzOmRyb3BcIjpcIm9uRHJvcENhbnZhc1wifX0sdmFsaWRhdGlvbkNvbWJvOmZ1bmN0aW9uKHQpe3JldHVybiEoIXRoaXMub3JpZ2lufHwhdHx8dC5kZXN0cm95ZWQpJiZcImNvbWJvXCI9PT10LmdldFR5cGUoKX0sb25EcmFnU3RhcnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0aGlzLnNob3VsZEJlZ2luLmNhbGwodGhpcyx0KSl7dmFyIG49dC5pdGVtO2lmKG4mJiFuLmRlc3Ryb3llZCYmIW4uaGFzTG9ja2VkKCkpe24uZ2V0Q29udGFpbmVyKCkuc2V0KFwiY2FwdHVyZVwiLCExKTt2YXIgcj10LnRhcmdldDtpZihyKWlmKHIuZ2V0KFwiaXNBbmNob3JQb2ludFwiKSlyZXR1cm47dmFyIGk9dGhpcy5ncmFwaDt0aGlzLnRhcmdldHM9W10sdGhpcy50YXJnZXRDb21ibz1udWxsO3ZhciBvPWkuZmluZEFsbEJ5U3RhdGUoXCJub2RlXCIsdGhpcy5zZWxlY3RlZFN0YXRlKSxhPW4uZ2V0KFwiaWRcIik7MD09PW8uZmlsdGVyKChmdW5jdGlvbih0KXt2YXIgZT10LmdldChcImlkXCIpO3JldHVybiBhPT09ZX0pKS5sZW5ndGg/dGhpcy50YXJnZXRzLnB1c2gobik6by5sZW5ndGg+MT9vLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaGFzTG9ja2VkKCl8fGUudGFyZ2V0cy5wdXNoKHQpfSkpOnRoaXMudGFyZ2V0cy5wdXNoKG4pO3ZhciBzPVtdO3RoaXMudGFyZ2V0cy5mb3JFYWNoKChmdW5jdGlvbih0KXtzLnB1c2goT2JqZWN0KGguYykodC5nZXRNb2RlbCgpKSl9KSksdGhpcy5zZXQoXCJiZWZvcmVEcmFnTm9kZXNcIixzKSx0aGlzLm9yaWdpbj17eDp0LngseTp0Lnl9LHRoaXMucG9pbnQ9e30sdGhpcy5vcmlnaW5Qb2ludD17fX19fSxvbkRyYWc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLm9yaWdpbiYmdGhpcy5zaG91bGRVcGRhdGUodGhpcyx0KSYmKHRoaXMuZ2V0KFwiZW5hYmxlRGVsZWdhdGVcIik/dGhpcy51cGRhdGVEZWxlZ2F0ZSh0KTp0aGlzLnRhcmdldHMubWFwKChmdW5jdGlvbihuKXtlLnVwZGF0ZShuLHQpfSkpKX0sb25EcmFnRW5kOmZ1bmN0aW9uKHQpe2lmKHRoaXMub3JpZ2luJiZ0aGlzLnNob3VsZEVuZC5jYWxsKHRoaXMsdCkpe3ZhciBlPXQuaXRlbTtpZihlKWUuZ2V0Q29udGFpbmVyKCkuc2V0KFwiY2FwdHVyZVwiLCEwKTt0aGlzLmRlbGVnYXRlUmVjdCYmKHRoaXMuZGVsZWdhdGVSZWN0LnJlbW92ZSgpLHRoaXMuZGVsZWdhdGVSZWN0PW51bGwpLHRoaXMudXBkYXRlUG9zaXRpb25zKHQpO3ZhciBuPXRoaXMuZ3JhcGg7aWYobi5nZXQoXCJlbmFibGVkU3RhY2tcIikpe3ZhciByPXtiZWZvcmU6e25vZGVzOnRoaXMuZ2V0KFwiYmVmb3JlRHJhZ05vZGVzXCIpLGVkZ2VzOltdLGNvbWJvczpbXX0sYWZ0ZXI6e25vZGVzOltdLGVkZ2VzOltdLGNvbWJvczpbXX19O3RoaXMudGFyZ2V0cy5mb3JFYWNoKChmdW5jdGlvbih0KXtyLmFmdGVyLm5vZGVzLnB1c2godC5nZXRNb2RlbCgpKX0pKSxuLnB1c2hTdGFjayhcInVwZGF0ZVwiLE9iamVjdChoLmMpKHIpKX1uLmVtaXQoXCJkcmFnbm9kZWVuZFwiLHtpdGVtczp0aGlzLnRhcmdldHMsdGFyZ2V0SXRlbTpudWxsfSksdGhpcy5wb2ludD17fSx0aGlzLm9yaWdpbj1udWxsLHRoaXMub3JpZ2luUG9pbnQ9e30sdGhpcy50YXJnZXRzLmxlbmd0aD0wLHRoaXMudGFyZ2V0Q29tYm89bnVsbH19LG9uRHJvcENvbWJvOmZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbTtpZih0aGlzLnZhbGlkYXRpb25Db21ibyhlKSl7dGhpcy51cGRhdGVQb3NpdGlvbnModCk7dmFyIG49dGhpcy5ncmFwaDtpZih0aGlzLmNvbWJvQWN0aXZlU3RhdGUmJm4uc2V0SXRlbVN0YXRlKGUsdGhpcy5jb21ib0FjdGl2ZVN0YXRlLCExKSx0aGlzLnRhcmdldENvbWJvPWUsdGhpcy5vbmx5Q2hhbmdlQ29tYm9TaXplKW4udXBkYXRlQ29tYm9zKCk7ZWxzZXt2YXIgcj1lLmdldE1vZGVsKCk7dGhpcy50YXJnZXRzLm1hcCgoZnVuY3Rpb24odCl7dC5nZXRNb2RlbCgpLmNvbWJvSWQhPT1yLmlkJiZuLnVwZGF0ZUNvbWJvVHJlZSh0LHIuaWQpfSkpLG4udXBkYXRlQ29tYm8oZSl9bi5lbWl0KFwiZHJhZ25vZGVlbmRcIix7aXRlbXM6dGhpcy50YXJnZXRzLHRhcmdldEl0ZW06dGhpcy50YXJnZXRDb21ib30pfX0sb25Ecm9wQ2FudmFzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JhcGg7dGhpcy50YXJnZXRzJiYwIT09dGhpcy50YXJnZXRzLmxlbmd0aCYmKHRoaXMudXBkYXRlUG9zaXRpb25zKHQpLHRoaXMub25seUNoYW5nZUNvbWJvU2l6ZT9lLnVwZGF0ZUNvbWJvcygpOnRoaXMudGFyZ2V0cy5tYXAoKGZ1bmN0aW9uKHQpe3QuZ2V0TW9kZWwoKS5jb21ib0lkJiZlLnVwZGF0ZUNvbWJvVHJlZSh0KX0pKSl9LG9uRHJvcE5vZGU6ZnVuY3Rpb24odCl7aWYodGhpcy50YXJnZXRzJiYwIT09dGhpcy50YXJnZXRzLmxlbmd0aCl7dmFyIGU9dC5pdGVtO3RoaXMudXBkYXRlUG9zaXRpb25zKHQpO3ZhciBuPXRoaXMuZ3JhcGgscj1lLmdldE1vZGVsKCkuY29tYm9JZDtpZihyKXt2YXIgaT1uLmZpbmRCeUlkKHIpO3RoaXMuY29tYm9BY3RpdmVTdGF0ZSYmbi5zZXRJdGVtU3RhdGUoaSx0aGlzLmNvbWJvQWN0aXZlU3RhdGUsITEpLHRoaXMudGFyZ2V0cy5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0TW9kZWwoKTtyIT09ZS5jb21ib0lkJiZuLnVwZGF0ZUNvbWJvVHJlZSh0LHIpfSkpLG4udXBkYXRlQ29tYm8oaSl9ZWxzZSB0aGlzLnRhcmdldHMubWFwKChmdW5jdGlvbih0KXt0LmdldE1vZGVsKCkuY29tYm9JZCYmbi51cGRhdGVDb21ib1RyZWUodCl9KSk7bi5lbWl0KFwiZHJhZ25vZGVlbmRcIix7aXRlbXM6dGhpcy50YXJnZXRzLHRhcmdldEl0ZW06ZX0pfX0sb25EcmFnRW50ZXI6ZnVuY3Rpb24odCl7dmFyIGU9dC5pdGVtO2lmKHRoaXMudmFsaWRhdGlvbkNvbWJvKGUpKXt2YXIgbj10aGlzLmdyYXBoO3RoaXMuY29tYm9BY3RpdmVTdGF0ZSYmbi5zZXRJdGVtU3RhdGUoZSx0aGlzLmNvbWJvQWN0aXZlU3RhdGUsITApfX0sb25EcmFnTGVhdmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5pdGVtO2lmKHRoaXMudmFsaWRhdGlvbkNvbWJvKGUpKXt2YXIgbj10aGlzLmdyYXBoO3RoaXMuY29tYm9BY3RpdmVTdGF0ZSYmbi5zZXRJdGVtU3RhdGUoZSx0aGlzLmNvbWJvQWN0aXZlU3RhdGUsITEpfX0sdXBkYXRlUG9zaXRpb25zOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy50YXJnZXRzJiYwIT09dGhpcy50YXJnZXRzLmxlbmd0aCYmdGhpcy5nZXQoXCJlbmFibGVEZWxlZ2F0ZVwiKSYmdGhpcy50YXJnZXRzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIGUudXBkYXRlKG4sdCl9KSl9LHVwZGF0ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3JpZ2luLHI9dC5nZXQoXCJtb2RlbFwiKSxpPXQuZ2V0KFwiaWRcIik7dGhpcy5wb2ludFtpXXx8KHRoaXMucG9pbnRbaV09e3g6ci54fHwwLHk6ci55fHwwfSk7dmFyIG89e3g6ZS54LW4ueCt0aGlzLnBvaW50W2ldLngseTplLnktbi55K3RoaXMucG9pbnRbaV0ueX07dGhpcy5nZXQoXCJ1cGRhdGVFZGdlXCIpP3RoaXMuZ3JhcGgudXBkYXRlSXRlbSh0LG8sITEpOnQudXBkYXRlUG9zaXRpb24obyl9LHVwZGF0ZURlbGVnYXRlOmZ1bmN0aW9uKHQpe3RoaXMuZ3JhcGg7aWYodGhpcy5kZWxlZ2F0ZVJlY3Qpe3ZhciBlPXQueC10aGlzLm9yaWdpbi54K3RoaXMub3JpZ2luUG9pbnQubWluWCxuPXQueS10aGlzLm9yaWdpbi55K3RoaXMub3JpZ2luUG9pbnQubWluWTt0aGlzLmRlbGVnYXRlUmVjdC5hdHRyKHt4OmUseTpufSl9ZWxzZXt2YXIgcj10aGlzLmdyYXBoLmdldChcImdyb3VwXCIpLGk9T2JqZWN0KGguZSkoe30sRG4uZGVsZWdhdGVTdHlsZSx0aGlzLmRlbGVnYXRlU3R5bGUpLG89dGhpcy5jYWxjdWxhdGlvbkdyb3VwUG9zaXRpb24odCksYT1vLngscz1vLnksdT1vLndpZHRoLGM9by5oZWlnaHQsZj1vLm1pblgsbD1vLm1pblk7dGhpcy5vcmlnaW5Qb2ludD17eDphLHk6cyx3aWR0aDp1LGhlaWdodDpjLG1pblg6ZixtaW5ZOmx9LHRoaXMuZGVsZWdhdGVSZWN0PXIuYWRkU2hhcGUoXCJyZWN0XCIse2F0dHJzOk9iamVjdCh2LmEpKHt3aWR0aDp1LGhlaWdodDpjLHg6YSx5OnN9LGkpLG5hbWU6XCJyZWN0LWRlbGVnYXRlLXNoYXBlXCJ9KSx0aGlzLmRlbGVnYXRlPXRoaXMuZGVsZWdhdGVSZWN0LHRoaXMuZGVsZWdhdGVSZWN0LnNldChcImNhcHR1cmVcIiwhMSl9fSxjYWxjdWxhdGlvbkdyb3VwUG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ncmFwaC5maW5kQWxsQnlTdGF0ZShcIm5vZGVcIix0aGlzLnNlbGVjdGVkU3RhdGUpOzA9PT1lLmxlbmd0aCYmZS5wdXNoKHQuaXRlbSk7Zm9yKHZhciBuPTEvMCxyPS0xLzAsaT0xLzAsbz0tMS8wLGE9MDthPGUubGVuZ3RoO2ErKyl7dmFyIHM9ZVthXS5nZXRCQm94KCksdT1zLm1pblgsYz1zLm1pblksZj1zLm1heFgsbD1zLm1heFk7dTxuJiYobj11KSxjPGkmJihpPWMpLGY+ciYmKHI9ZiksbD5vJiYobz1sKX1yZXR1cm57eDpNYXRoLmZsb29yKG4pLHk6TWF0aC5mbG9vcihpKSx3aWR0aDpNYXRoLmNlaWwociktTWF0aC5mbG9vcihuKSxoZWlnaHQ6TWF0aC5jZWlsKG8pLU1hdGguZmxvb3IoaSksbWluWDpuLG1pblk6aX19fSxqdj1NYXRoLm1pbixEdj1NYXRoLm1heCxOdj1NYXRoLmFicyxSdj1bXCJkcmFnXCIsXCJzaGlmdFwiLFwiY3RybFwiLFwiYWx0XCIsXCJjb250cm9sXCJdLEx2PXtnZXREZWZhdWx0Q2ZnOmZ1bmN0aW9uKCl7cmV0dXJue2JydXNoU3R5bGU6e2ZpbGw6XCIjRUVGNkZGXCIsZmlsbE9wYWNpdHk6LjQsc3Ryb2tlOlwiI0RERUVGRVwiLGxpbmVXaWR0aDoxfSxvblNlbGVjdDpmdW5jdGlvbigpe30sb25EZXNlbGVjdDpmdW5jdGlvbigpe30sc2VsZWN0ZWRTdGF0ZTpcInNlbGVjdGVkXCIsdHJpZ2dlcjpcInNoaWZ0XCIsaW5jbHVkZUVkZ2VzOiEwLHNlbGVjdGVkRWRnZXM6W10sc2VsZWN0ZWROb2RlczpbXX19LGdldEV2ZW50czpmdW5jdGlvbigpe3JldHVybiBSdi5pbmRleE9mKHRoaXMudHJpZ2dlci50b0xvd2VyQ2FzZSgpKT4tMXx8KHRoaXMudHJpZ2dlcj1cInNoaWZ0XCIsY29uc29sZS53YXJuKFwiQmVoYXZpb3IgYnJ1c2gtc2VsZWN0IMOnxaHigJ4gdHJpZ2dlciDDpcKP4oCaw6bigKLCsMOkwrjCjcOlwpDLhsOmwrPigKLDr8K8xZLDqMKvwrfDqMK+4oCcw6XigKbCpSAnZHJhZyfDo+KCrMKBJ3NoaWZ0J8Oj4oKswoEnY3RybCcgw6bLhuKAkyAnYWx0J1wiKSksXCJkcmFnXCI9PT10aGlzLnRyaWdnZXI/e2RyYWdzdGFydDpcIm9uTW91c2VEb3duXCIsZHJhZzpcIm9uTW91c2VNb3ZlXCIsZHJhZ2VuZDpcIm9uTW91c2VVcFwiLFwiY2FudmFzOmNsaWNrXCI6XCJjbGVhclN0YXRlc1wifTp7ZHJhZ3N0YXJ0Olwib25Nb3VzZURvd25cIixkcmFnOlwib25Nb3VzZU1vdmVcIixkcmFnZW5kOlwib25Nb3VzZVVwXCIsXCJjYW52YXM6Y2xpY2tcIjpcImNsZWFyU3RhdGVzXCIsa2V5dXA6XCJvbktleVVwXCIsa2V5ZG93bjpcIm9uS2V5RG93blwifX0sb25Nb3VzZURvd246ZnVuY3Rpb24odCl7dmFyIGU9dC5pdGVtLG49dGhpcy5icnVzaDtlfHwoXCJkcmFnXCI9PT10aGlzLnRyaWdnZXJ8fHRoaXMua2V5ZG93bikmJih0aGlzLnNlbGVjdGVkTm9kZXMmJjAhPT10aGlzLnNlbGVjdGVkTm9kZXMubGVuZ3RoJiZ0aGlzLmNsZWFyU3RhdGVzKCksbnx8KG49dGhpcy5jcmVhdGVCcnVzaCgpKSx0aGlzLm9yaWdpblBvaW50PXt4OnQuY2FudmFzWCx5OnQuY2FudmFzWX0sbi5hdHRyKHt3aWR0aDowLGhlaWdodDowfSksbi5zaG93KCksdGhpcy5kcmFnZ2luZz0hMCl9LG9uTW91c2VNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMuZHJhZ2dpbmcmJihcImRyYWdcIj09PXRoaXMudHJpZ2dlcnx8dGhpcy5rZXlkb3duKSYmdGhpcy51cGRhdGVCcnVzaCh0KX0sb25Nb3VzZVVwOmZ1bmN0aW9uKHQpe3RoaXMuZ3JhcGg7KHRoaXMuYnJ1c2h8fHRoaXMuZHJhZ2dpbmcpJiYoXCJkcmFnXCI9PT10aGlzLnRyaWdnZXJ8fHRoaXMua2V5ZG93bikmJih0aGlzLmJydXNoLnJlbW92ZSghMCksdGhpcy5icnVzaD1udWxsLHRoaXMuZ2V0U2VsZWN0ZWROb2Rlcyh0KSx0aGlzLmRyYWdnaW5nPSExKX0sY2xlYXJTdGF0ZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdyYXBoLGU9dGhpcy5zZWxlY3RlZFN0YXRlLG49dC5maW5kQWxsQnlTdGF0ZShcIm5vZGVcIixlKSxyPXQuZmluZEFsbEJ5U3RhdGUoXCJlZGdlXCIsZSk7bi5mb3JFYWNoKChmdW5jdGlvbihuKXtyZXR1cm4gdC5zZXRJdGVtU3RhdGUobixlLCExKX0pKSxyLmZvckVhY2goKGZ1bmN0aW9uKG4pe3JldHVybiB0LnNldEl0ZW1TdGF0ZShuLGUsITEpfSkpLHRoaXMuc2VsZWN0ZWROb2Rlcz1bXSx0aGlzLnNlbGVjdGVkRWRnZXM9W10sdGhpcy5vbkRlc2VsZWN0JiZ0aGlzLm9uRGVzZWxlY3QodGhpcy5zZWxlY3RlZE5vZGVzLHRoaXMuc2VsZWN0ZWRFZGdlcyksdC5lbWl0KFwibm9kZXNlbGVjdGNoYW5nZVwiLHtzZWxlY3RlZEl0ZW1zOntub2RlczpbXSxlZGdlczpbXX0sc2VsZWN0OiExfSl9LGdldFNlbGVjdGVkTm9kZXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuZ3JhcGgscj10aGlzLm9yaWdpblBvaW50LGk9dGhpcy5zaG91bGRVcGRhdGUsbz10aGlzLnNlbGVjdGVkU3RhdGUsYT17eDp0LngseTp0Lnl9LHM9bi5nZXRQb2ludEJ5Q2FudmFzKHIueCxyLnkpLHU9anYoYS54LHMueCksYz1EdihhLngscy54KSxmPWp2KGEueSxzLnkpLGw9RHYoYS55LHMueSksaD1bXSxkPVtdO24uZ2V0Tm9kZXMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LmdldEJCb3goKTtpZihlLmNlbnRlclg+PXUmJmUuY2VudGVyWDw9YyYmZS5jZW50ZXJZPj1mJiZlLmNlbnRlclk8PWwmJmkodCxcInNlbGVjdFwiKSl7aC5wdXNoKHQpO3ZhciByPXQuZ2V0TW9kZWwoKTtkLnB1c2goci5pZCksbi5zZXRJdGVtU3RhdGUodCxvLCEwKX19KSk7dmFyIHA9W107dGhpcy5pbmNsdWRlRWRnZXMmJmguZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5nZXRPdXRFZGdlcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPXQuZ2V0TW9kZWwoKSxvPXIuc291cmNlLGE9ci50YXJnZXQ7ZC5pbmNsdWRlcyhvKSYmZC5pbmNsdWRlcyhhKSYmaSh0LFwic2VsZWN0XCIpJiYocC5wdXNoKHQpLG4uc2V0SXRlbVN0YXRlKHQsZS5zZWxlY3RlZFN0YXRlLCEwKSl9KSl9KSksdGhpcy5zZWxlY3RlZEVkZ2VzPXAsdGhpcy5zZWxlY3RlZE5vZGVzPWgsdGhpcy5vblNlbGVjdCYmdGhpcy5vblNlbGVjdChoLHApLG4uZW1pdChcIm5vZGVzZWxlY3RjaGFuZ2VcIix7c2VsZWN0ZWRJdGVtczp7bm9kZXM6aCxlZGdlczpwfSxzZWxlY3Q6ITB9KX0sY3JlYXRlQnJ1c2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdyYXBoLmdldChcImNhbnZhc1wiKS5hZGRTaGFwZShcInJlY3RcIix7YXR0cnM6dGhpcy5icnVzaFN0eWxlLGNhcHR1cmU6ITEsbmFtZTpcImJydXNoLXNoYXBlXCJ9KTtyZXR1cm4gdGhpcy5icnVzaD10LHRoaXMuZGVsZWdhdGU9dCx0fSx1cGRhdGVCcnVzaDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9yaWdpblBvaW50O3RoaXMuYnJ1c2guYXR0cih7d2lkdGg6TnYodC5jYW52YXNYLWUueCksaGVpZ2h0Ok52KHQuY2FudmFzWS1lLnkpLHg6anYodC5jYW52YXNYLGUueCkseTpqdih0LmNhbnZhc1ksZS55KX0pfSxvbktleURvd246ZnVuY3Rpb24odCl7dmFyIGU9dC5rZXk7aWYoZSl7dmFyIG49dGhpcy50cmlnZ2VyLnRvTG93ZXJDYXNlKCkscj1lLnRvTG93ZXJDYXNlKCk7dGhpcy5rZXlkb3duPXI9PT1ufHxcImNvbnRyb2xcIj09PXImJlwiY3RybFwiPT09bnx8XCJjdHJsXCI9PT1yJiZcImNvbnRyb2xcIj09PW59fSxvbktleVVwOmZ1bmN0aW9uKCl7dGhpcy5icnVzaCYmKHRoaXMuYnJ1c2gucmVtb3ZlKCEwKSx0aGlzLmJydXNoPW51bGwsdGhpcy5kcmFnZ2luZz0hMSksdGhpcy5rZXlkb3duPSExfX0sQnY9W1wic2hpZnRcIixcImN0cmxcIixcImFsdFwiLFwiY29udHJvbFwiXSxHdj17Z2V0RGVmYXVsdENmZzpmdW5jdGlvbigpe3JldHVybnttdWx0aXBsZTohMCx0cmlnZ2VyOlwic2hpZnRcIixzZWxlY3RlZFN0YXRlOlwic2VsZWN0ZWRcIn19LGdldEV2ZW50czpmdW5jdGlvbigpe3JldHVybiBCdi5pbmRleE9mKHRoaXMudHJpZ2dlci50b0xvd2VyQ2FzZSgpKT4tMXx8KHRoaXMudHJpZ2dlcj1cInNoaWZ0XCIsY29uc29sZS53YXJuKFwiQmVoYXZpb3IgYnJ1c2gtc2VsZWN0IMOnxaHigJ4gdHJpZ2dlciDDpcKP4oCaw6bigKLCsMOkwrjCjcOlwpDLhsOmwrPigKLDr8K8xZLDqMKvwrfDqMK+4oCcw6XigKbCpSAnZHJhZyfDo+KCrMKBJ3NoaWZ0J8Oj4oKswoEnY3RybCcgw6bLhuKAkyAnYWx0J1wiKSksdGhpcy5tdWx0aXBsZT97XCJub2RlOmNsaWNrXCI6XCJvbkNsaWNrXCIsXCJjb21ibzpjbGlja1wiOlwib25DbGlja1wiLFwiY2FudmFzOmNsaWNrXCI6XCJvbkNhbnZhc0NsaWNrXCIsa2V5dXA6XCJvbktleVVwXCIsa2V5ZG93bjpcIm9uS2V5RG93blwifTp7XCJub2RlOmNsaWNrXCI6XCJvbkNsaWNrXCIsXCJjb21ibzpjbGlja1wiOlwib25DbGlja1wiLFwiY2FudmFzOmNsaWNrXCI6XCJvbkNhbnZhc0NsaWNrXCJ9fSxvbkNsaWNrOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10Lml0ZW07aWYobiYmIW4uZGVzdHJveWVkKXt2YXIgcj1uLmdldFR5cGUoKSxpPWUuZ3JhcGgsbz1lLmtleWRvd24sYT1lLm11bHRpcGxlLHM9ZS5zaG91bGRVcGRhdGU7aWYoZS5zaG91bGRCZWdpbi5jYWxsKGUsdCkpe2lmKCFvfHwhYSl7dmFyIHU9aS5maW5kQWxsQnlTdGF0ZShyLGUuc2VsZWN0ZWRTdGF0ZSk7T2JqZWN0KGguZikodSwoZnVuY3Rpb24odCl7dCE9PW4mJmkuc2V0SXRlbVN0YXRlKHQsZS5zZWxlY3RlZFN0YXRlLCExKX0pKX1pZihuLmhhc1N0YXRlKGUuc2VsZWN0ZWRTdGF0ZSkpe3MuY2FsbChlLHQpJiZpLnNldEl0ZW1TdGF0ZShuLGUuc2VsZWN0ZWRTdGF0ZSwhMSk7dmFyIGM9aS5maW5kQWxsQnlTdGF0ZShcIm5vZGVcIixlLnNlbGVjdGVkU3RhdGUpLGY9aS5maW5kQWxsQnlTdGF0ZShcImNvbWJvXCIsZS5zZWxlY3RlZFN0YXRlKTtpLmVtaXQoXCJub2Rlc2VsZWN0Y2hhbmdlXCIse3RhcmdldDpuLHNlbGVjdGVkSXRlbXM6e25vZGVzOmMsY29tYm9zOmZ9LHNlbGVjdDohMX0pfWVsc2V7cy5jYWxsKGUsdCkmJmkuc2V0SXRlbVN0YXRlKG4sZS5zZWxlY3RlZFN0YXRlLCEwKTtjPWkuZmluZEFsbEJ5U3RhdGUoXCJub2RlXCIsZS5zZWxlY3RlZFN0YXRlKSxmPWkuZmluZEFsbEJ5U3RhdGUoXCJjb21ib1wiLGUuc2VsZWN0ZWRTdGF0ZSk7aS5lbWl0KFwibm9kZXNlbGVjdGNoYW5nZVwiLHt0YXJnZXQ6bixzZWxlY3RlZEl0ZW1zOntub2RlczpjLGNvbWJvczpmfSxzZWxlY3Q6ITB9KX19fX0sb25DYW52YXNDbGljazpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLmdyYXBoLG49ZS5maW5kQWxsQnlTdGF0ZShcIm5vZGVcIix0aGlzLnNlbGVjdGVkU3RhdGUpO09iamVjdChoLmYpKG4sKGZ1bmN0aW9uKG4pe2Uuc2V0SXRlbVN0YXRlKG4sdC5zZWxlY3RlZFN0YXRlLCExKX0pKTt2YXIgcj1lLmZpbmRBbGxCeVN0YXRlKFwiY29tYm9cIix0aGlzLnNlbGVjdGVkU3RhdGUpO09iamVjdChoLmYpKHIsKGZ1bmN0aW9uKG4pe2Uuc2V0SXRlbVN0YXRlKG4sdC5zZWxlY3RlZFN0YXRlLCExKX0pKSxlLmVtaXQoXCJub2Rlc2VsZWN0Y2hhbmdlXCIse3NlbGVjdGVkSXRlbXM6e25vZGVzOltdLGVkZ2VzOltdLGNvbWJvczpbXX0sc2VsZWN0OiExfSl9LG9uS2V5RG93bjpmdW5jdGlvbih0KXt2YXIgZT10LmtleTtlJiYoZS50b0xvd2VyQ2FzZSgpPT09dGhpcy50cmlnZ2VyLnRvTG93ZXJDYXNlKCl8fFwiY29udHJvbFwiPT09ZS50b0xvd2VyQ2FzZSgpP3RoaXMua2V5ZG93bj0hMDp0aGlzLmtleWRvd249ITEpfSxvbktleVVwOmZ1bmN0aW9uKCl7dGhpcy5rZXlkb3duPSExfX0sRnY9cy50cmFuc2Zvcm0sVXY9e2dldERlZmF1bHRDZmc6ZnVuY3Rpb24oKXtyZXR1cm57c2Vuc2l0aXZpdHk6MixtaW5ab29tOnZvaWQgMCxtYXhab29tOnZvaWQgMCxlbmFibGVPcHRpbWl6ZTohMSxvcHRpbWl6ZVpvb206LjEsZml4U2VsZWN0ZWRJdGVtczp7Zml4QWxsOiExLGZpeExpbmVXaWR0aDohMSxmaXhMYWJlbDohMSxmaXhTdGF0ZTpcInNlbGVjdGVkXCJ9fX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5maXhTZWxlY3RlZEl0ZW1zO3JldHVybiB0LmZpeFN0YXRlfHwodC5maXhTdGF0ZT1cInNlbGVjdGVkXCIpLHQuZml4QWxsJiYodC5maXhMaW5lV2lkdGg9ITAsdC5maXhMYWJlbD0hMCkse3doZWVsOlwib25XaGVlbFwiLHRvdWNoc3RhcnQ6XCJvblRvdWNoU3RhcnRcIix0b3VjaG1vdmU6XCJvblRvdWNoTW92ZVwiLHRvdWNoZW5kOlwib25Ub3VjaEVuZFwifX0sb25Ub3VjaFN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBlPXQub3JpZ2luYWxFdmVudC50b3VjaGVzLG49ZVswXSxyPWVbMV07dC5wcmV2ZW50RGVmYXVsdCgpLHImJih0aGlzLnNob3VsZEJlZ2luJiYhdGhpcy5zaG91bGRCZWdpbi5jYWxsKHRoaXMsdCl8fCh0aGlzLnN0YXJ0UG9pbnQ9e3BhZ2VYOm4ucGFnZVgscGFnZVk6bi5wYWdlWX0sdGhpcy5tb3ZlYWJsZT0hMCxyJiYodGhpcy5lbmRQb2ludD17cGFnZVg6ci5wYWdlWCxwYWdlWTpyLnBhZ2VZfSksdGhpcy5vcmlnaW5TY2FsZT10aGlzLmdyYXBoLmdldFpvb20oKXx8dGhpcy5jdXJyZW50U2NhbGV8fDEpKX0sb25Ub3VjaE1vdmU6ZnVuY3Rpb24odCl7aWYodGhpcy5tb3ZlYWJsZSl7dC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBlPXQub3JpZ2luYWxFdmVudC50b3VjaGVzLG49ZVswXSxyPWVbMV07aWYocil7dGhpcy5lbmRQb2ludHx8KHRoaXMuZW5kUG9pbnQ9e3BhZ2VYOnIucGFnZVgscGFnZVk6ci5wYWdlWX0pO3ZhciBpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGguaHlwb3QoZS54LXQueCxlLnktdC55KX0sbz1pKHt4Om4ucGFnZVgseTpuLnBhZ2VZfSx7eDpyLnBhZ2VYLHk6ci5wYWdlWX0pL2koe3g6dGhpcy5zdGFydFBvaW50LnBhZ2VYLHk6dGhpcy5zdGFydFBvaW50LnBhZ2VZfSx7eDp0aGlzLmVuZFBvaW50LnBhZ2VYLHk6dGhpcy5lbmRQb2ludC5wYWdlWX0pLGE9dGhpcy5vcmlnaW5TY2FsZSpvO3RoaXMuY3VycmVudFNjYWxlPWE7dmFyIHM9dGhpcy5nZXQoXCJtaW5ab29tXCIpfHx0aGlzLmdyYXBoLmdldChcIm1pblpvb21cIik7aWYoIShhPih0aGlzLmdldChcIm1heFpvb21cIil8fHRoaXMuZ3JhcGguZ2V0KFwibWF4Wm9vbVwiKSl8fGE8cykpe3ZhciB1PXRoaXMuZ3JhcGguZ2V0KFwiY2FudmFzXCIpLmdldFBvaW50QnlDbGllbnQodC5jbGllbnRYLHQuY2xpZW50WSk7dGhpcy5ncmFwaC56b29tVG8oYSx7eDp1LngseTp1Lnl9KSx0aGlzLmdyYXBoLmVtaXQoXCJ3aGVlbHpvb21cIix0KX19fX0sb25Ub3VjaEVuZDpmdW5jdGlvbigpe3RoaXMubW92ZWFibGU9ITEsdGhpcy5lbmRQb2ludD1udWxsfSxvbldoZWVsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLmdyYXBoLHI9dGhpcy5maXhTZWxlY3RlZEl0ZW1zO2lmKCghdGhpcy5zaG91bGRCZWdpbnx8dGhpcy5zaG91bGRCZWdpbi5jYWxsKHRoaXMsdCkpJiZ0aGlzLnNob3VsZFVwZGF0ZS5jYWxsKHRoaXMsdCkpe3QucHJldmVudERlZmF1bHQoKTt2YXIgaSxvPW4uZ2V0KFwiY2FudmFzXCIpLmdldFBvaW50QnlDbGllbnQodC5jbGllbnRYLHQuY2xpZW50WSksYT10aGlzLmdldChcInNlbnNpdGl2aXR5XCIpLHM9bi5nZXRab29tKCk7aT1zKih0LndoZWVsRGVsdGE8MD8xLS4wNSphOjEvKDEtLjA1KmEpKTt2YXIgdT10aGlzLmdldChcIm1pblpvb21cIil8fG4uZ2V0KFwibWluWm9vbVwiKTtpZighKGk+KHRoaXMuZ2V0KFwibWF4Wm9vbVwiKXx8bi5nZXQoXCJtYXhab29tXCIpKXx8aTx1KSl7aWYodGhpcy5nZXQoXCJlbmFibGVPcHRpbWl6ZVwiKSl7dmFyIGM9dGhpcy5nZXQoXCJvcHRpbWl6ZVpvb21cIiksZj10aGlzLmdldChcIm9wdGltaXplZFwiKSxsPW4uZ2V0Tm9kZXMoKSxkPW4uZ2V0RWRnZXMoKSxwPWwubGVuZ3RoLGc9ZC5sZW5ndGg7aWYoIWYpe2Zvcih2YXIgdj0wO3Y8cDt2Kyspe2lmKCEoaz1sW3ZdKS5kZXN0cm95ZWQpZm9yKHZhciB5PShxPWsuZ2V0KFwiZ3JvdXBcIikuZ2V0KFwiY2hpbGRyZW5cIikpLmxlbmd0aCxtPTA7bTx5O20rKyl7KFI9cVttXSkuZGVzdG9yeWVkfHxSLmdldChcImlzS2V5U2hhcGVcIil8fChSLnNldChcIm9yaS12aXNpYmlsaXR5XCIsUi5nZXQoXCJvcmktdmlzaWJpbGl0eVwiKXx8Ui5nZXQoXCJ2aXNpYmxlXCIpKSxSLmhpZGUoKSl9fWZvcih2YXIgYj0wO2I8ZztiKyspZm9yKHk9KHE9KEg9ZFtiXSkuZ2V0KFwiZ3JvdXBcIikuZ2V0KFwiY2hpbGRyZW5cIikpLmxlbmd0aCxtPTA7bTx5O20rKyl7KFI9cVttXSkuc2V0KFwib3JpLXZpc2liaWxpdHlcIixSLmdldChcIm9yaS12aXNpYmlsaXR5XCIpfHxSLmdldChcInZpc2libGVcIikpLFIuaGlkZSgpfXRoaXMuc2V0KFwib3B0aW1pemVkXCIsITApfWNsZWFyVGltZW91dCh0aGlzLmdldChcInRpbWVvdXRcIikpO3ZhciB4PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHQ9bi5nZXRab29tKCk7aWYoZS5nZXQoXCJvcHRpbWl6ZWRcIikpe2Uuc2V0KFwib3B0aW1pemVkXCIsITEpO2Zvcih2YXIgcj0wO3I8cDtyKyspe3ZhciBpPWxbcl0sbz0oZj1pLmdldChcImdyb3VwXCIpLmdldChcImNoaWxkcmVuXCIpKS5sZW5ndGg7aWYodDxjKShzPShoPWkuZ2V0S2V5U2hhcGUoKSkuZ2V0KFwib3JpLXZpc2liaWxpdHlcIikpJiZoLnNob3coKTtlbHNlIGZvcih2YXIgYT0wO2E8bzthKyspe3ZhciBzPSh5PWZbYV0pLmdldChcIm9yaS12aXNpYmlsaXR5XCIpOyF5LmdldChcInZpc2libGVcIikmJnMmJnMmJnkuc2hvdygpfX1mb3IodmFyIHU9MDt1PGc7dSsrKXt2YXIgZixoLHY9ZFt1XTtvPShmPXYuZ2V0KFwiZ3JvdXBcIikuZ2V0KFwiY2hpbGRyZW5cIikpLmxlbmd0aDtpZih0PGMpKHM9KGg9di5nZXRLZXlTaGFwZSgpKS5nZXQoXCJvcmktdmlzaWJpbGl0eVwiKSkmJmguc2hvdygpO2Vsc2UgZm9yKGE9MDthPG87YSsrKXt2YXIgeTtpZighKHk9ZlthXSkuZ2V0KFwidmlzaWJsZVwiKSkocz15LmdldChcIm9yaS12aXNpYmlsaXR5XCIpKSYmeS5zaG93KCl9fX19KSwxMDApO3RoaXMuc2V0KFwidGltZW91dFwiLHgpfWlmKHM8PTEpe3ZhciB3PXZvaWQgMCxTPXZvaWQgMDtpZihyLmZpeEFsbHx8ci5maXhMaW5lV2lkdGh8fHIuZml4TGFiZWwpe3c9bi5maW5kQWxsQnlTdGF0ZShcIm5vZGVcIixyLmZpeFN0YXRlKSxTPW4uZmluZEFsbEJ5U3RhdGUoXCJlZGdlXCIsci5maXhTdGF0ZSk7Zm9yKHZhciBFPXMvaSxfPXcubGVuZ3RoLE89MDtPPF87TysrKXt2YXIgayxNPShrPXdbT10pLmdldENvbnRhaW5lcigpLEE9ay5nZXRNb2RlbCgpLFQ9ay5nZXRPcmlnaW5TdHlsZSgpLEM9ay5nZXRTdGF0ZVN0eWxlKHIuZml4U3RhdGUpLEk9ay5nZXQoXCJzaGFwZUZhY3RvcnlcIikuZ2V0U2hhcGUoQS50eXBlKS5nZXRTdGF0ZVN0eWxlKHIuZml4U3RhdGUsaylbci5maXhTdGF0ZV07aWYoci5maXhBbGwpe2lmKGk8PTEpe3ZhciBQPU9iamVjdChoLmMpKE0uZ2V0TWF0cml4KCkpO1B8fChQPVsxLDAsMCwwLDEsMCwwLDAsMV0pO3ZhciBqPWsuZ2V0TW9kZWwoKSxEPWoueCxOPWoueTtQPUZ2KFAsW1tcInRcIiwtRCwtTl0sW1wic1wiLEUsRV0sW1widFwiLEQsTl1dKSxNLnNldE1hdHJpeChQKX19ZWxzZSBmb3IoeT0ocT1NLmdldChcImNoaWxkcmVuXCIpKS5sZW5ndGgsbT0wO208eTttKyspe3ZhciBSPXFbbV0sTD12b2lkIDAsQj12b2lkIDA7aWYoci5maXhMYWJlbClpZihcInRleHRcIj09PVIuZ2V0KFwidHlwZVwiKSl7TD1SLmF0dHIoXCJmb250U2l6ZVwiKXx8MTI7dmFyIEc9Q1tSLmdldChcIm5hbWVcIildLEY9SVtSLmdldChcIm5hbWVcIildLFU9Rz9HLmZvbnRTaXplOjEyLHo9Rj9GLmZvbnRTaXplOjEyLFY9VXx8enx8MTI7aWYoaTw9MSYmUi5hdHRyKFwiZm9udFNpemVcIixWL2kpLEIpYnJlYWt9aWYoci5maXhMaW5lV2lkdGgmJlIuZ2V0KFwiaXNLZXlTaGFwZVwiKSl7Qj1SLmF0dHIoXCJsaW5lV2lkdGhcIil8fDA7dmFyIFc9Qy5saW5lV2lkdGh8fEkubGluZVdpZHRofHxULmxpbmVXaWR0aHx8MDtpZihpPD0xJiZSLmF0dHIoXCJsaW5lV2lkdGhcIixXL2kpLEwpYnJlYWt9fX1mb3IodmFyIFg9Uy5sZW5ndGgsWT0wO1k8WDtZKyspe3ZhciBILHE9KE09KEg9U1tZXSkuZ2V0Q29udGFpbmVyKCkpLmdldChcImNoaWxkcmVuXCIpO2ZvcihBPUguZ2V0TW9kZWwoKSxDPUguZ2V0U3RhdGVTdHlsZShyLmZpeFN0YXRlKSxJPUguZ2V0KFwic2hhcGVGYWN0b3J5XCIpLmdldFNoYXBlKEEudHlwZSkuZ2V0U3RhdGVTdHlsZShyLmZpeFN0YXRlLEgpW3IuZml4U3RhdGVdLHk9cS5sZW5ndGgsbT0wO208eTttKyspe1I9cVttXSxMPXZvaWQgMCxCPXZvaWQgMDtpZihyLmZpeExhYmVsfHxyLmZpeEFsbClpZihcInRleHRcIj09PVIuZ2V0KFwidHlwZVwiKSl7TD1SLmF0dHIoXCJmb250U2l6ZVwiKXx8MTI7Rz1DW1IuZ2V0KFwibmFtZVwiKV0sRj1JW1IuZ2V0KFwibmFtZVwiKV0sVT1HP0cuZm9udFNpemU6MTIsej1GP0YuZm9udFNpemU6MTIsVj1VfHx6fHwxMjtpZihpPD0xJiZSLmF0dHIoXCJmb250U2l6ZVwiLFYvaSksQilicmVha31pZigoci5maXhMaW5lV2lkdGh8fHIuZml4QWxsKSYmUi5nZXQoXCJpc0tleVNoYXBlXCIpKXtCPVIuYXR0cihcImxpbmVXaWR0aFwiKXx8MDtXPUMubGluZVdpZHRofHxJLmxpbmVXaWR0aHx8MTtpZihpPD0xJiZSLmF0dHIoXCJsaW5lV2lkdGhcIixXL2kpLEwpYnJlYWt9fX19fW4uem9vbVRvKGkse3g6by54LHk6by55fSksbi5lbWl0KFwid2hlZWx6b29tXCIsdCl9fX19LHp2PXtvbk1vdXNlRW50ZXI6ZnVuY3Rpb24odCl7dmFyIGU9dC5pdGVtO3RoaXMuY3VycmVudFRhcmdldD1lLHRoaXMuc2hvd1Rvb2x0aXAodCksdGhpcy5ncmFwaC5lbWl0KFwidG9vbHRpcGNoYW5nZVwiLHtpdGVtOnQuaXRlbSxhY3Rpb246XCJzaG93XCJ9KX0sb25Nb3VzZU1vdmU6ZnVuY3Rpb24odCl7dGhpcy5zaG91bGRVcGRhdGUodCk/dGhpcy5jdXJyZW50VGFyZ2V0JiZ0Lml0ZW09PT10aGlzLmN1cnJlbnRUYXJnZXQmJnRoaXMudXBkYXRlUG9zaXRpb24odCk6dGhpcy5oaWRlVG9vbHRpcCgpfSxvbk1vdXNlTGVhdmU6ZnVuY3Rpb24odCl7dGhpcy5zaG91bGRFbmQodCkmJih0aGlzLmhpZGVUb29sdGlwKCksdGhpcy5ncmFwaC5lbWl0KFwidG9vbHRpcGNoYW5nZVwiLHtpdGVtOnRoaXMuY3VycmVudFRhcmdldCxhY3Rpb246XCJoaWRlXCJ9KSx0aGlzLmN1cnJlbnRUYXJnZXQ9bnVsbCl9LHNob3dUb29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGFpbmVyO2lmKHQuaXRlbSYmIXQuaXRlbS5kZXN0cm95ZWQpe2V8fChlPXRoaXMuY3JlYXRlVG9vbHRpcCh0aGlzLmdyYXBoLmdldChcImNhbnZhc1wiKSksdGhpcy5jb250YWluZXI9ZSk7dmFyIG49dGhpcy5mb3JtYXRUZXh0KHQuaXRlbS5nZXQoXCJtb2RlbFwiKSx0KTtlLmlubmVySFRNTD1uLHZ0KHRoaXMuY29udGFpbmVyLHt2aXNpYmlsaXR5OlwidmlzaWJsZVwifSksdGhpcy51cGRhdGVQb3NpdGlvbih0KX19LGhpZGVUb29sdGlwOmZ1bmN0aW9uKCl7dnQodGhpcy5jb250YWluZXIse3Zpc2liaWxpdHk6XCJoaWRkZW5cIn0pfSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldChcInNob3VsZEJlZ2luXCIpLG49dGhpcy53aWR0aCxyPXRoaXMuaGVpZ2h0LGk9dGhpcy5jb250YWluZXIsbz10aGlzLmdyYXBoO2lmKGUodCkpe3ZhciBhPW8uZ2V0UG9pbnRCeUNsaWVudCh0LmNsaWVudFgsdC5jbGllbnRZKSxzPW8uZ2V0Q2FudmFzQnlQb2ludChhLngsYS55KSx1PXMueCxjPXMueSxmPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dT5uLzI/dS09Zi53aWR0aDp1Kz10aGlzLm9mZnNldCxjPnIvMj9jLT1mLmhlaWdodDpjKz10aGlzLm9mZnNldDt2YXIgbD11K1wicHhcIixoPWMrXCJweFwiO3Z0KHRoaXMuY29udGFpbmVyLHtsZWZ0OmwsdG9wOmgsdmlzaWJpbGl0eTpcInZpc2libGVcIn0pfWVsc2UgdnQoaSx7dmlzaWJpbGl0eTpcImhpZGRlblwifSl9LGNyZWF0ZVRvb2x0aXA6ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoXCJlbFwiKTtlLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIjt2YXIgbj1ndCgnPGRpdiBjbGFzcz1cImc2LXRvb2x0aXAgZzYtJyt0aGlzLml0ZW0rJy10b29sdGlwXCI+PC9kaXY+Jyk7cmV0dXJuIGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChuKSx2dChuLHtwb3NpdGlvbjpcImFic29sdXRlXCIsdmlzaWJpbGl0eTpcInZpc2libGVcIn0pLHRoaXMud2lkdGg9dC5nZXQoXCJ3aWR0aFwiKSx0aGlzLmhlaWdodD10LmdldChcImhlaWdodFwiKSx0aGlzLmNvbnRhaW5lcj1uLHRoaXMuZ3JhcGguZ2V0KFwidG9vbHRpcHNcIikucHVzaChuKSxufX0sVnY9T2JqZWN0KHYuYSkoe2dldERlZmF1bHRDZmc6ZnVuY3Rpb24oKXtyZXR1cm57aXRlbTpcIm5vZGVcIixvZmZzZXQ6MTIsZm9ybWF0VGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5sYWJlbH19fSxnZXRFdmVudHM6ZnVuY3Rpb24oKXtyZXR1cm57XCJub2RlOm1vdXNlZW50ZXJcIjpcIm9uTW91c2VFbnRlclwiLFwibm9kZTptb3VzZWxlYXZlXCI6XCJvbk1vdXNlTGVhdmVcIixcIm5vZGU6bW91c2Vtb3ZlXCI6XCJvbk1vdXNlTW92ZVwiLGFmdGVycmVtb3ZlaXRlbTpcIm9uTW91c2VMZWF2ZVwifX19LHp2KSxXdj1PYmplY3Qodi5hKSh7Z2V0RGVmYXVsdENmZzpmdW5jdGlvbigpe3JldHVybntpdGVtOlwiZWRnZVwiLG9mZnNldDoxMixmb3JtYXRUZXh0OmZ1bmN0aW9uKHQpe3JldHVyblwic291cmNlOiBcIit0LnNvdXJjZStcIiB0YXJnZXQ6IFwiK3QudGFyZ2V0fX19LGdldEV2ZW50czpmdW5jdGlvbigpe3JldHVybntcImVkZ2U6bW91c2VlbnRlclwiOlwib25Nb3VzZUVudGVyXCIsXCJlZGdlOm1vdXNlbGVhdmVcIjpcIm9uTW91c2VMZWF2ZVwiLFwiZWRnZTptb3VzZW1vdmVcIjpcIm9uTW91c2VNb3ZlXCIsYWZ0ZXJyZW1vdmVpdGVtOlwib25Nb3VzZUxlYXZlXCJ9fX0senYpLFh2PVtcImNsaWNrXCIsXCJkYmxjbGlja1wiXSxZdj17Z2V0RGVmYXVsdENmZzpmdW5jdGlvbigpe3JldHVybnt0cmlnZ2VyOlwiY2xpY2tcIixvbkNoYW5nZTpmdW5jdGlvbigpe319fSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdCxlO3JldHVybiBYdi5pbmNsdWRlcyh0aGlzLnRyaWdnZXIpP2U9dGhpcy50cmlnZ2VyOihlPVwiY2xpY2tcIixjb25zb2xlLndhcm4oXCJCZWhhdmlvciBjb2xsYXBzZS1leHBhbmQgw6fFoeKAniB0cmlnZ2VyIMOlwo/igJrDpuKAosKww6TCuMKNw6XCkMuGw6bCs+KAosOvwrzFksOowq/Ct8Oowr7igJzDpeKApsKlICdjbGljaycgw6bLhuKAkyAnZGJsY2xpY2snXCIpKSwodD17fSlbXCJub2RlOlwiK2VdPVwib25Ob2RlQ2xpY2tcIix0LnRvdWNoc3RhcnQ9XCJvbk5vZGVDbGlja1wiLHR9LG9uTm9kZUNsaWNrOmZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbTtpZihlKXt2YXIgbj10aGlzLmdyYXBoLmZpbmREYXRhQnlJZChlLmdldChcImlkXCIpKTtpZihuKXt2YXIgcj1uLmNoaWxkcmVuO2lmKHImJjAhPT1yLmxlbmd0aCl7dmFyIGk9IW4uY29sbGFwc2VkO3RoaXMuc2hvdWxkQmVnaW4odCxpKSYmKG4uY29sbGFwc2VkPWksZS5nZXRNb2RlbCgpLmNvbGxhcHNlZD1pLHRoaXMuZ3JhcGguZW1pdChcIml0ZW1jb2xsYXBzZWRcIix7aXRlbTp0Lml0ZW0sY29sbGFwc2VkOml9KSx0aGlzLnNob3VsZFVwZGF0ZSh0LGkpJiYodGhpcy5vbkNoYW5nZShlLGkpLHRoaXMuZ3JhcGgubGF5b3V0KCkpKX19fX19LEh2PWRkLmNhbGN1bGF0aW9uSXRlbXNCQm94LHF2PXtnZXREZWZhdWx0Q2ZnOmZ1bmN0aW9uKCl7cmV0dXJue2VuYWJsZURlbGVnYXRlOiExLGRlbGVnYXRlU3R5bGU6e30sb25seUNoYW5nZUNvbWJvU2l6ZTohMSxhY3RpdmVTdGF0ZTpcIlwiLHNlbGVjdGVkU3RhdGU6XCJzZWxlY3RlZFwifX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7cmV0dXJue1wiY29tYm86ZHJhZ3N0YXJ0XCI6XCJvbkRyYWdTdGFydFwiLFwiY29tYm86ZHJhZ1wiOlwib25EcmFnXCIsXCJjb21ibzpkcmFnZW5kXCI6XCJvbkRyYWdFbmRcIixcImNvbWJvOmRyb3BcIjpcIm9uRHJvcFwiLFwibm9kZTpkcm9wXCI6XCJvbk5vZGVEcm9wXCIsXCJjb21ibzpkcmFnZW50ZXJcIjpcIm9uRHJhZ0VudGVyXCIsXCJjb21ibzpkcmFnbGVhdmVcIjpcIm9uRHJhZ0xlYXZlXCJ9fSx2YWxpZGF0aW9uQ29tYm86ZnVuY3Rpb24odCl7dmFyIGU9dC5pdGVtO3JldHVybiEoIWV8fGUuZGVzdHJveWVkKSYmKCEhdGhpcy5zaG91bGRVcGRhdGUodGhpcyx0KSYmXCJjb21ib1wiPT09ZS5nZXRUeXBlKCkpfSxvbkRyYWdTdGFydDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5ncmFwaCxyPXQuaXRlbTtpZih0aGlzLnZhbGlkYXRpb25Db21ibyh0KSl7dGhpcy50YXJnZXRzPVtdO3ZhciBpPW4uZmluZEFsbEJ5U3RhdGUoXCJjb21ib1wiLHRoaXMuc2VsZWN0ZWRTdGF0ZSksbz1yLmdldChcImlkXCIpOzA9PT1pLmZpbHRlcigoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoXCJpZFwiKTtyZXR1cm4gbz09PWV9KSkubGVuZ3RoP3RoaXMudGFyZ2V0cy5wdXNoKHIpOnRoaXMudGFyZ2V0cz1pLHRoaXMuYWN0aXZlU3RhdGUmJnRoaXMudGFyZ2V0cy5tYXAoKGZ1bmN0aW9uKHQpe3ZhciByPXQuZ2V0TW9kZWwoKTtpZihyLnBhcmVudElkKXt2YXIgaT1uLmZpbmRCeUlkKHIucGFyZW50SWQpO2kmJm4uc2V0SXRlbVN0YXRlKGksZS5hY3RpdmVTdGF0ZSwhMCl9fSkpLHRoaXMucG9pbnQ9e30sdGhpcy5vcmlnaW5Qb2ludD17fSx0aGlzLm9yaWdpbj17eDp0LngseTp0Lnl9LHRoaXMuY3VycmVudEl0ZW1DaGlsZENvbWJvcz1bXSxmdW5jdGlvbiB0KGUsbil7aWYoITEhPT1uKGUpJiZlKXt2YXIgcj1lLmdldChcImNvbWJvc1wiKTtpZigwPT09ci5sZW5ndGgpcmV0dXJuITE7T2JqZWN0KGguZikociwoZnVuY3Rpb24oZSl7dChlLG4pfSkpfX0ociwoZnVuY3Rpb24odCl7aWYodC5kZXN0cm95ZWQpcmV0dXJuITE7dmFyIG49dC5nZXRNb2RlbCgpO3JldHVybiBlLmN1cnJlbnRJdGVtQ2hpbGRDb21ib3MucHVzaChuLmlkKSwhMH0pKX19LG9uRHJhZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHRoaXMub3JpZ2luJiZ0aGlzLnZhbGlkYXRpb25Db21ibyh0KSlpZih0aGlzLmVuYWJsZURlbGVnYXRlKXRoaXMudXBkYXRlRGVsZWdhdGUodCk7ZWxzZXtpZih0aGlzLmFjdGl2ZVN0YXRlKXt2YXIgbj10aGlzLmdyYXBoLHI9dC5pdGVtLGk9ci5nZXRNb2RlbCgpLG89bi5nZXRDb21ib3MoKSxhPXIuZ2V0QkJveCgpLHM9YS5jZW50ZXJYLHU9YS5jZW50ZXJZLGM9YS53aWR0aDtvLmZpbHRlcigoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRNb2RlbCgpO3JldHVybiBpLnBhcmVudElkLG4uaWQhPT1pLmlkJiYhZS5jdXJyZW50SXRlbUNoaWxkQ29tYm9zLmluY2x1ZGVzKG4uaWQpfSkpLm1hcCgoZnVuY3Rpb24odCl7dmFyIHI9dC5nZXRCQm94KCksaT1yLmNlbnRlclgsbz1yLmNlbnRlclksYT1yLndpZHRoLGY9cy1pLGw9dS1vLGg9MipNYXRoLnNxcnQoZipmK2wqbCk7YythLWg+LjgqYz9uLnNldEl0ZW1TdGF0ZSh0LGUuYWN0aXZlU3RhdGUsITApOm4uc2V0SXRlbVN0YXRlKHQsZS5hY3RpdmVTdGF0ZSwhMSl9KSl9T2JqZWN0KGguZikodGhpcy50YXJnZXRzLChmdW5jdGlvbihuKXtlLnVwZGF0ZUNvbWJvKG4sdCl9KSl9fSx1cGRhdGVQb3NpdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLmVuYWJsZURlbGVnYXRlJiZPYmplY3QoaC5mKSh0aGlzLnRhcmdldHMsKGZ1bmN0aW9uKG4pe2UudXBkYXRlQ29tYm8obix0KX0pKX0sb25Ecm9wOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10Lml0ZW07aWYobiYmdGhpcy50YXJnZXRzJiYhbi5kZXN0cm95ZWQpe3RoaXMudXBkYXRlUG9zaXRpb25zKHQpO3ZhciByPXRoaXMuZ3JhcGgsaT1uLmdldE1vZGVsKCk7dGhpcy50YXJnZXRzLm1hcCgoZnVuY3Rpb24odCl7dC5nZXRNb2RlbCgpLnBhcmVudElkIT09aS5pZD8oZS5hY3RpdmVTdGF0ZSYmci5zZXRJdGVtU3RhdGUobixlLmFjdGl2ZVN0YXRlLCExKSxlLm9ubHlDaGFuZ2VDb21ib1NpemU/ci51cGRhdGVDb21ibyh0KTpyLnVwZGF0ZUNvbWJvVHJlZSh0LGkuaWQpKTpyLnVwZGF0ZUNvbWJvKG4pfSkpLHRoaXMuZW5kKG4sdCksdGhpcy5lbmRDb21wYXJpc29uPSEwfX0sb25Ob2RlRHJvcDpmdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHRoaXMudGFyZ2V0cyYmMCE9PXRoaXMudGFyZ2V0cy5sZW5ndGgpe3RoaXMudXBkYXRlUG9zaXRpb25zKHQpO3ZhciBuLHI9dGhpcy5ncmFwaCxpPXQuaXRlbS5nZXRNb2RlbCgpLmNvbWJvSWQ7aWYoaSl7aWYodGhpcy5hY3RpdmVTdGF0ZSl7dmFyIG89ci5maW5kQnlJZChpKTtyLnNldEl0ZW1TdGF0ZShvLHRoaXMuYWN0aXZlU3RhdGUsITEpfXRoaXMudGFyZ2V0cy5tYXAoKGZ1bmN0aW9uKHQpe2Uub25seUNoYW5nZUNvbWJvU2l6ZT9yLnVwZGF0ZUNvbWJvKHQpOmkhPT10LmdldElEKCkmJihuPXIuZmluZEJ5SWQoaSksaSE9PXQuZ2V0TW9kZWwoKS5wYXJlbnRJZCYmci51cGRhdGVDb21ib1RyZWUodCxpKSl9KSl9ZWxzZSB0aGlzLnRhcmdldHMubWFwKChmdW5jdGlvbih0KXtlLm9ubHlDaGFuZ2VDb21ib1NpemU/ci51cGRhdGVDb21ibyh0KTp0LmdldE1vZGVsKCkuY29tYm9JZCYmci51cGRhdGVDb21ib1RyZWUodCl9KSk7dGhpcy5lbmRDb21wYXJpc29uPSEwLHRoaXMuZW5kKG4sdCl9fSxvbkRyYWdFbnRlcjpmdW5jdGlvbih0KXtpZih0aGlzLm9yaWdpbiYmdGhpcy52YWxpZGF0aW9uQ29tYm8odCkpe3ZhciBlPXQuaXRlbSxuPXRoaXMuZ3JhcGg7dGhpcy5hY3RpdmVTdGF0ZSYmbi5zZXRJdGVtU3RhdGUoZSx0aGlzLmFjdGl2ZVN0YXRlLCEwKX19LG9uRHJhZ0xlYXZlOmZ1bmN0aW9uKHQpe2lmKHRoaXMub3JpZ2luJiZ0aGlzLnZhbGlkYXRpb25Db21ibyh0KSl7dmFyIGU9dC5pdGVtLG49dGhpcy5ncmFwaDt0aGlzLmFjdGl2ZVN0YXRlJiZuLnNldEl0ZW1TdGF0ZShlLHRoaXMuYWN0aXZlU3RhdGUsITEpfX0sb25EcmFnRW5kOmZ1bmN0aW9uKHQpe2lmKHRoaXMudGFyZ2V0cyYmMCE9PXRoaXMudGFyZ2V0cy5sZW5ndGgpe3ZhciBlPXQuaXRlbTt0aGlzLnVwZGF0ZVBvc2l0aW9ucyh0KTt2YXIgbj10aGlzLmdldFBhcmVudENvbWJvKGUuZ2V0TW9kZWwoKS5wYXJlbnRJZCkscj10aGlzLmdyYXBoO24mJnRoaXMuYWN0aXZlU3RhdGUmJnIuc2V0SXRlbVN0YXRlKG4sdGhpcy5hY3RpdmVTdGF0ZSwhMSksdGhpcy5lbmQodm9pZCAwLHQpfX0sZW5kOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZih0aGlzLm9yaWdpbil7dmFyIHI9dGhpcy5ncmFwaDtpZih0aGlzLmRlbGVnYXRlU2hhcGUpci5nZXQoXCJkZWxlZ2F0ZUdyb3VwXCIpLmNsZWFyKCksdGhpcy5kZWxlZ2F0ZVNoYXBlPW51bGw7dCYmdGhpcy5hY3RpdmVTdGF0ZSYmci5zZXRJdGVtU3RhdGUodCx0aGlzLmFjdGl2ZVN0YXRlLCExKSx0fHx0aGlzLnRhcmdldHMubWFwKChmdW5jdGlvbih0KXtuLm9ubHlDaGFuZ2VDb21ib1NpemU/ci51cGRhdGVDb21ibyh0KTpyLnVwZGF0ZUNvbWJvVHJlZSh0KX0pKSx0aGlzLnBvaW50PVtdLHRoaXMub3JpZ2luPW51bGwsdGhpcy5vcmlnaW5Qb2ludD1udWxsLHRoaXMudGFyZ2V0cy5sZW5ndGg9MH19LHRyYXZlcnNlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZighMSE9PWUodCkmJnQpe3ZhciByPXQuZ2V0KFwiY29tYm9zXCIpO09iamVjdChoLmYpKHIsKGZ1bmN0aW9uKHQpe24udHJhdmVyc2UodCxlKX0pKTt2YXIgaT10LmdldChcIm5vZGVzXCIpO09iamVjdChoLmYpKGksKGZ1bmN0aW9uKHQpe24udHJhdmVyc2UodCxlKX0pKX19LHVwZGF0ZUNvbWJvOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpczt0aGlzLnRyYXZlcnNlKHQsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmRlc3Ryb3llZCYmKG4udXBkYXRlU2lnbmxlSXRlbSh0LGUpLCEwKX0pKX0sdXBkYXRlU2lnbmxlSXRlbTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3JpZ2luLHI9dGhpcy5ncmFwaCxpPXQuZ2V0TW9kZWwoKSxvPXQuZ2V0KFwiaWRcIik7dGhpcy5wb2ludFtvXXx8KHRoaXMucG9pbnRbb109e3g6aS54LHk6aS55fSk7dmFyIGE9ZS54LW4ueCt0aGlzLnBvaW50W29dLngscz1lLnktbi55K3RoaXMucG9pbnRbb10ueTtyLnVwZGF0ZUl0ZW0odCx7eDphLHk6c30pfSxnZXRQYXJlbnRDb21ibzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdyYXBoO2lmKHQpe3ZhciBuPWUuZmluZEJ5SWQodCk7aWYobilyZXR1cm4gbn19LHVwZGF0ZURlbGVnYXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JhcGg7aWYodGhpcy5kZWxlZ2F0ZVNoYXBlKXt2YXIgbj10LngtdGhpcy5vcmlnaW4ueCt0aGlzLm9yaWdpblBvaW50Lm1pblgscj10LnktdGhpcy5vcmlnaW4ueSt0aGlzLm9yaWdpblBvaW50Lm1pblk7dGhpcy5kZWxlZ2F0ZVNoYXBlLmF0dHIoe3g6bix5OnJ9KX1lbHNle3ZhciBpPWUuZ2V0KFwiZGVsZWdhdGVHcm91cFwiKSxvPW51bGwsYT0obz10aGlzLnRhcmdldHMubGVuZ3RoPjE/SHYodGhpcy50YXJnZXRzKTp0aGlzLnRhcmdldHNbMF0uZ2V0QkJveCgpKS54LHM9by55LHU9by53aWR0aCxjPW8uaGVpZ2h0LGY9by5taW5YLGw9by5taW5ZO3RoaXMub3JpZ2luUG9pbnQ9e3g6YSx5OnMsd2lkdGg6dSxoZWlnaHQ6YyxtaW5YOmYsbWluWTpsfTt2YXIgaD1PYmplY3Qodi5hKShPYmplY3Qodi5hKSh7fSxEbi5kZWxlZ2F0ZVN0eWxlKSx0aGlzLmRlbGVnYXRlU3R5bGUpO3RoaXMuZGVsZWdhdGVTaGFwZT1pLmFkZFNoYXBlKFwicmVjdFwiLHthdHRyczpPYmplY3Qodi5hKSh7d2lkdGg6by53aWR0aCxoZWlnaHQ6by5oZWlnaHQseDpvLngseTpvLnl9LGgpLG5hbWU6XCJjb21iby1kZWxlZ2F0ZS1zaGFwZVwifSksdGhpcy5kZWxlZ2F0ZT10aGlzLmRlbGVnYXRlU2hhcGV9fX0sS3Y9W1wiY2xpY2tcIixcImRibGNsaWNrXCJdLFp2PXtnZXREZWZhdWx0Q2ZnOmZ1bmN0aW9uKCl7cmV0dXJue3RyaWdnZXI6XCJkYmxjbGlja1wiLHJlbGF5b3V0OiEwfX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQsZTtyZXR1cm4gS3YuaW5jbHVkZXModGhpcy50cmlnZ2VyKT9lPXRoaXMudHJpZ2dlcjooZT1cImRibGNsaWNrXCIsY29uc29sZS53YXJuKFwiQmVoYXZpb3IgY29sbGFwc2UtZXhwYW5kLWdyb3VwIMOnxaHigJ4gdHJpZ2dlciDDpcKP4oCaw6bigKLCsMOkwrjCjcOlwpDLhsOmwrPigKLDr8K8xZLDqMKvwrfDqMK+4oCcw6XigKbCpSAnY2xpY2snIMOmy4bigJMgJ2RibGNsaWNrJ1wiKSksKHQ9e30pW1wiY29tYm86XCIrZV09XCJvbkNvbWJvQ2xpY2tcIix0fSxvbkNvbWJvQ2xpY2s6ZnVuY3Rpb24odCl7dmFyIGU9dC5pdGVtLG49dGhpcy5ncmFwaCxyPXRoaXMucmVsYXlvdXQ7aWYoZSYmIWUuZGVzdHJveWVkJiZcImNvbWJvXCI9PT1lLmdldFR5cGUoKSl7dmFyIGk9ZS5nZXRNb2RlbCgpLmlkO2kmJihuLmNvbGxhcHNlRXhwYW5kQ29tYm8oaSksciYmbi5nZXQoXCJsYXlvdXRcIik/bi5sYXlvdXQoKTpuLnJlZnJlc2hQb3NpdGlvbnMoKSl9fX0sUXY9ZGQuaXNQb2x5Z29uc0ludGVyc2VjdCxKdj1kZC5wYXRoVG9Qb2ludHMsJHY9W1wiZHJhZ1wiLFwic2hpZnRcIixcImN0cmxcIixcImFsdFwiLFwiY29udHJvbFwiXSx0eT1bXCJjbGlja1wiLFwiZHJhZ1wiXSxleT1bXCJzaGlmdFwiLFwiY3RybFwiLFwiY29udHJvbFwiLFwiYWx0XCIsXCJtZXRhXCIsdm9pZCAwXSxueT1bXCJzaGlmdFwiLFwiY3RybFwiLFwiYWx0XCIsXCJjb250cm9sXCJdLHJ5PXtcImRyYWctY2FudmFzXCI6SXYsXCJ6b29tLWNhbnZhc1wiOlV2LFwiZHJhZy1ub2RlXCI6UHYsXCJhY3RpdmF0ZS1yZWxhdGlvbnNcIjp7Z2V0RGVmYXVsdENmZzpmdW5jdGlvbigpe3JldHVybnt0cmlnZ2VyOlwibW91c2VlbnRlclwiLGFjdGl2ZVN0YXRlOlwiYWN0aXZlXCIsaW5hY3RpdmVTdGF0ZTpcImluYWN0aXZlXCIscmVzZXRTZWxlY3RlZDohMSxzaG91bGRVcGRhdGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19fSxnZXRFdmVudHM6ZnVuY3Rpb24oKXtyZXR1cm5cIm1vdXNlZW50ZXJcIj09PXRoaXMuZ2V0KFwidHJpZ2dlclwiKT97XCJub2RlOm1vdXNlZW50ZXJcIjpcInNldEFsbEl0ZW1TdGF0ZXNcIixcIm5vZGU6bW91c2VsZWF2ZVwiOlwiY2xlYXJBY3RpdmVTdGF0ZVwifTp7XCJub2RlOmNsaWNrXCI6XCJzZXRBbGxJdGVtU3RhdGVzXCIsXCJjYW52YXM6Y2xpY2tcIjpcImNsZWFyQWxsSXRlbVN0YXRlc1wifX0sc2V0QWxsSXRlbVN0YXRlczpmdW5jdGlvbih0KXt2YXIgZT10Lml0ZW0sbj10aGlzLmdyYXBoO2lmKHRoaXMuaXRlbT1lLHRoaXMuc2hvdWxkVXBkYXRlKHQuaXRlbSx7ZXZlbnQ6dCxhY3Rpb246XCJhY3RpdmF0ZVwifSkpe2Zvcih2YXIgcj10aGlzLmFjdGl2ZVN0YXRlLGk9dGhpcy5pbmFjdGl2ZVN0YXRlLG89bi5nZXROb2RlcygpLGE9bi5nZXRFZGdlcygpLHM9by5sZW5ndGgsdT1hLmxlbmd0aCxjPTA7YzxzO2MrKyl7dmFyIGY9b1tjXSxsPWYuaGFzU3RhdGUoXCJzZWxlY3RlZFwiKTt0aGlzLnJlc2V0U2VsZWN0ZWQmJmwmJm4uc2V0SXRlbVN0YXRlKGYsXCJzZWxlY3RlZFwiLCExKSxuLnNldEl0ZW1TdGF0ZShmLHIsITEpLGkmJm4uc2V0SXRlbVN0YXRlKGYsaSwhMCl9Zm9yKGM9MDtjPHU7YysrKXt2YXIgaD1hW2NdO24uc2V0SXRlbVN0YXRlKGgsciwhMSksaSYmbi5zZXRJdGVtU3RhdGUoaCxpLCEwKX1pJiZuLnNldEl0ZW1TdGF0ZShlLGksITEpLG4uc2V0SXRlbVN0YXRlKGUsciwhMCk7dmFyIGQ9ZS5nZXRFZGdlcygpLHA9ZC5sZW5ndGg7Zm9yKGM9MDtjPHA7YysrKXt2YXIgZz12b2lkIDA7Zz0oaD1kW2NdKS5nZXRTb3VyY2UoKT09PWU/aC5nZXRUYXJnZXQoKTpoLmdldFNvdXJjZSgpLGkmJm4uc2V0SXRlbVN0YXRlKGcsaSwhMSksbi5zZXRJdGVtU3RhdGUoZyxyLCEwKSxuLnNldEl0ZW1TdGF0ZShoLGksITEpLG4uc2V0SXRlbVN0YXRlKGgsciwhMCksaC50b0Zyb250KCl9bi5lbWl0KFwiYWZ0ZXJhY3RpdmF0ZXJlbGF0aW9uc1wiLHtpdGVtOnQuaXRlbSxhY3Rpb246XCJhY3RpdmF0ZVwifSl9fSxjbGVhckFjdGl2ZVN0YXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0KFwiZ3JhcGhcIik7aWYodGhpcy5zaG91bGRVcGRhdGUodC5pdGVtLHtldmVudDp0LGFjdGlvbjpcImRlYWN0aXZhdGVcIn0pKXt2YXIgbj10aGlzLmFjdGl2ZVN0YXRlLHI9dGhpcy5pbmFjdGl2ZVN0YXRlLGk9ZS5nZXQoXCJhdXRvUGFpbnRcIik7ZS5zZXRBdXRvUGFpbnQoITEpO2Zvcih2YXIgbz1lLmdldE5vZGVzKCksYT1lLmdldEVkZ2VzKCkscz1vLmxlbmd0aCx1PWEubGVuZ3RoLGM9MDtjPHM7YysrKXt2YXIgZj1vW2NdO2UuY2xlYXJJdGVtU3RhdGVzKGYsW24scl0pfWZvcihjPTA7Yzx1O2MrKyl7dmFyIGw9YVtjXTtlLmNsZWFySXRlbVN0YXRlcyhsLFtuLHIsXCJkZWFjdGl2YXRlXCJdKX1lLnBhaW50KCksZS5zZXRBdXRvUGFpbnQoaSksZS5lbWl0KFwiYWZ0ZXJhY3RpdmF0ZXJlbGF0aW9uc1wiLHtpdGVtOnQuaXRlbXx8dGhpcy5nZXQoXCJpdGVtXCIpLGFjdGlvbjpcImRlYWN0aXZhdGVcIn0pfX0sY2xlYXJBbGxJdGVtU3RhdGVzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JhcGg7aWYodGhpcy5zaG91bGRVcGRhdGUodC5pdGVtLHtldmVudDp0LGFjdGlvbjpcImRlYWN0aXZhdGVcIn0pKXtmb3IodmFyIG49dGhpcy5hY3RpdmVTdGF0ZSxyPXRoaXMuaW5hY3RpdmVTdGF0ZSxpPWUuZ2V0Tm9kZXMoKSxvPWUuZ2V0RWRnZXMoKSxhPWkubGVuZ3RoLHM9by5sZW5ndGgsdT0wO3U8YTt1Kyspe3ZhciBjPWlbdV07ZS5jbGVhckl0ZW1TdGF0ZXMoYyxbbixyXSl9Zm9yKHU9MDt1PHM7dSsrKXt2YXIgZj1vW3VdO2UuY2xlYXJJdGVtU3RhdGVzKGYsW24scixcImRlYWN0aXZhdGVcIl0pfWUuZW1pdChcImFmdGVyYWN0aXZhdGVyZWxhdGlvbnNcIix7aXRlbTp0Lml0ZW18fHRoaXMuZ2V0KFwiaXRlbVwiKSxhY3Rpb246XCJkZWFjdGl2YXRlXCJ9KX19fSxcImJydXNoLXNlbGVjdFwiOkx2LFwiY2xpY2stc2VsZWN0XCI6R3YsXCJsYXNzby1zZWxlY3RcIjp7Z2V0RGVmYXVsdENmZzpmdW5jdGlvbigpe3JldHVybntkZWxlZ2F0ZVN0eWxlOntmaWxsOlwiI0VFRjZGRlwiLGZpbGxPcGFjaXR5Oi40LHN0cm9rZTpcIiNEREVFRkVcIixsaW5lV2lkdGg6MX0sb25TZWxlY3Q6ZnVuY3Rpb24oKXt9LG9uRGVzZWxlY3Q6ZnVuY3Rpb24oKXt9LHNlbGVjdGVkU3RhdGU6XCJzZWxlY3RlZFwiLHRyaWdnZXI6XCJzaGlmdFwiLGluY2x1ZGVFZGdlczohMCxzZWxlY3RlZEVkZ2VzOltdLHNlbGVjdGVkTm9kZXM6W119fSxnZXRFdmVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gJHYuaW5kZXhPZih0aGlzLnRyaWdnZXIudG9Mb3dlckNhc2UoKSk+LTF8fCh0aGlzLnRyaWdnZXI9XCJzaGlmdFwiLGNvbnNvbGUud2FybihcIkJlaGF2aW9yIGxhc3NvLXNlbGVjdCDDp8Wh4oCeIHRyaWdnZXIgw6XCj+KAmsOm4oCiwrDDpMK4wo3DpcKQy4bDpsKz4oCiw6/CvMWSw6jCr8K3w6jCvuKAnMOl4oCmwqUgJ2RyYWcnw6PigqzCgSdzaGlmdCfDo+KCrMKBJ2N0cmwnIMOmy4bigJMgJ2FsdCdcIikpLFwiZHJhZ1wiPT09dGhpcy50cmlnZ2VyP3tkcmFnc3RhcnQ6XCJvbkRyYWdTdGFydFwiLGRyYWc6XCJvbkRyYWdNb3ZlXCIsZHJhZ2VuZDpcIm9uRHJhZ0VuZFwiLFwiY2FudmFzOmNsaWNrXCI6XCJjbGVhclN0YXRlc1wifTp7ZHJhZ3N0YXJ0Olwib25EcmFnU3RhcnRcIixkcmFnOlwib25EcmFnTW92ZVwiLGRyYWdlbmQ6XCJvbkRyYWdFbmRcIixrZXl1cDpcIm9uS2V5VXBcIixrZXlkb3duOlwib25LZXlEb3duXCIsXCJjYW52YXM6Y2xpY2tcIjpcImNsZWFyU3RhdGVzXCJ9fSxvbkRyYWdTdGFydDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmxhc3NvO3QuaXRlbXx8KFwiZHJhZ1wiPT09dGhpcy50cmlnZ2VyfHx0aGlzLmtleWRvd24pJiYodGhpcy5zZWxlY3RlZE5vZGVzJiYwIT09dGhpcy5zZWxlY3RlZE5vZGVzLmxlbmd0aCYmdGhpcy5jbGVhclN0YXRlcygpLGV8fChlPXRoaXMuY3JlYXRlTGFzc28oKSksdGhpcy5kcmFnZ2luZz0hMCx0aGlzLm9yaWdpblBvaW50PXt4OnQueCx5OnQueX0sdGhpcy5wb2ludHMucHVzaCh0aGlzLm9yaWdpblBvaW50KSxlLnNob3coKSl9LG9uRHJhZ01vdmU6ZnVuY3Rpb24odCl7dGhpcy5kcmFnZ2luZyYmKFwiZHJhZ1wiPT09dGhpcy50cmlnZ2VyfHx0aGlzLmtleWRvd24pJiYodGhpcy5wb2ludHMucHVzaCh7eDp0LngseTp0Lnl9KSx0aGlzLnVwZGF0ZUxhc3NvKHQpKX0sb25EcmFnRW5kOmZ1bmN0aW9uKHQpeyh0aGlzLmxhc3NvfHx0aGlzLmRyYWdnaW5nKSYmKFwiZHJhZ1wiPT09dGhpcy50cmlnZ2VyfHx0aGlzLmtleWRvd24pJiYodGhpcy5wb2ludHMucHVzaCh0aGlzLm9yaWdpblBvaW50KSx0aGlzLmdldFNlbGVjdGVkSXRlbXMoKSx0aGlzLmxhc3NvLnJlbW92ZSghMCksdGhpcy5sYXNzbz1udWxsLHRoaXMucG9pbnRzPVtdLHRoaXMuZHJhZ2dpbmc9ITEpfSxnZXRMYXNzb1BhdGg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBvaW50cyxlPVtdO3JldHVybiB0Lmxlbmd0aCYmKHQuZm9yRWFjaCgoZnVuY3Rpb24odCxuKXswPT09bj9lLnB1c2goW1wiTVwiLHQueCx0LnldKTplLnB1c2goW1wiTFwiLHQueCx0LnldKX0pKSxlLnB1c2goW1wiTFwiLHRbMF0ueCx0WzBdLnldKSksZX0sY2xlYXJTdGF0ZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdyYXBoLGU9dGhpcy5zZWxlY3RlZFN0YXRlLG49dC5maW5kQWxsQnlTdGF0ZShcIm5vZGVcIixlKSxyPXQuZmluZEFsbEJ5U3RhdGUoXCJlZGdlXCIsZSk7bi5mb3JFYWNoKChmdW5jdGlvbihuKXtyZXR1cm4gdC5zZXRJdGVtU3RhdGUobixlLCExKX0pKSxyLmZvckVhY2goKGZ1bmN0aW9uKG4pe3JldHVybiB0LnNldEl0ZW1TdGF0ZShuLGUsITEpfSkpLHRoaXMub25EZXNlbGVjdCYmdGhpcy5vbkRlc2VsZWN0KHRoaXMuc2VsZWN0ZWROb2Rlcyx0aGlzLnNlbGVjdGVkRWRnZXMpLHRoaXMuc2VsZWN0ZWROb2Rlcz1bXSx0aGlzLnNlbGVjdGVkRWRnZXM9W10sdC5lbWl0KFwibm9kZXNlbGVjdGNoYW5nZVwiLHtzZWxlY3RlZEl0ZW1zOntub2RlczpbXSxlZGdlczpbXX0sc2VsZWN0OiExfSl9LGdldFNlbGVjdGVkSXRlbXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5ncmFwaCxuPXRoaXMuc2hvdWxkVXBkYXRlLHI9dGhpcy5wb2ludHMubWFwKChmdW5jdGlvbih0KXtyZXR1cm5bZS5nZXRDYW52YXNCeVBvaW50KHQueCx0LnkpLngsZS5nZXRDYW52YXNCeVBvaW50KHQueCx0LnkpLnldfSkpLGk9dGhpcy5zZWxlY3RlZFN0YXRlLG89W10sYT1bXTtlLmdldE5vZGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoZnVuY3Rpb24odCxlKXt2YXIgbixyPXQuZ2V0S2V5U2hhcGUoKTtpZihcInBhdGhcIj09PXQuZ2V0KFwidHlwZVwiKSluPUp2KHIuYXR0cihcInBhdGhcIikpO2Vsc2V7dmFyIGk9ci5nZXRDYW52YXNCQm94KCk7bj1bW2kubWluWCxpLm1pblldLFtpLm1heFgsaS5taW5ZXSxbaS5tYXhYLGkubWF4WV0sW2kubWluWCxpLm1heFldXX1yZXR1cm4gUXYoZSxuKX0odCxyKSYmbih0LFwic2VsZWN0XCIpKXtvLnB1c2godCk7dmFyIHM9dC5nZXRNb2RlbCgpO2EucHVzaChzLmlkKSxlLnNldEl0ZW1TdGF0ZSh0LGksITApfX0pKTt2YXIgcz1bXTt0aGlzLmluY2x1ZGVFZGdlcyYmby5mb3JFYWNoKChmdW5jdGlvbihyKXtyLmdldE91dEVkZ2VzKCkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIGk9ci5nZXRNb2RlbCgpLG89aS5zb3VyY2UsdT1pLnRhcmdldDthLmluY2x1ZGVzKG8pJiZhLmluY2x1ZGVzKHUpJiZuKHIsXCJzZWxlY3RcIikmJihzLnB1c2gociksZS5zZXRJdGVtU3RhdGUocix0LnNlbGVjdGVkU3RhdGUsITApKX0pKX0pKSx0aGlzLnNlbGVjdGVkRWRnZXM9cyx0aGlzLnNlbGVjdGVkTm9kZXM9byx0aGlzLm9uU2VsZWN0JiZ0aGlzLm9uU2VsZWN0KG8scyksZS5lbWl0KFwibm9kZXNlbGVjdGNoYW5nZVwiLHtzZWxlY3RlZEl0ZW1zOntub2RlczpvLGVkZ2VzOnN9LHNlbGVjdDohMH0pfSxjcmVhdGVMYXNzbzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ3JhcGguZ2V0KFwiZGVsZWdhdGVHcm91cFwiKS5hZGRTaGFwZShcInBhdGhcIix7YXR0cnM6T2JqZWN0KHYuYSkoe3BhdGg6W119LHRoaXMuZGVsZWdhdGVTdHlsZSksY2FwdHVyZTohMSxuYW1lOlwibGFzc28tc2hhcGVcIn0pO3JldHVybiB0aGlzLmxhc3NvPXQsdGhpcy5kZWxlZ2F0ZT10LHRoaXMucG9pbnRzPVtdLHR9LHVwZGF0ZUxhc3NvOmZ1bmN0aW9uKHQpe3RoaXMubGFzc28uYXR0cih7cGF0aDp0aGlzLmdldExhc3NvUGF0aCgpfSl9LG9uS2V5RG93bjpmdW5jdGlvbih0KXt2YXIgZT10LmtleTtlJiYoZS50b0xvd2VyQ2FzZSgpPT09dGhpcy50cmlnZ2VyLnRvTG93ZXJDYXNlKCk/dGhpcy5rZXlkb3duPSEwOnRoaXMua2V5ZG93bj0hMSl9LG9uS2V5VXA6ZnVuY3Rpb24oKXt0aGlzLmxhc3NvJiYodGhpcy5sYXNzby5yZW1vdmUoITApLHRoaXMubGFzc289bnVsbCx0aGlzLnBvaW50cz1bXSx0aGlzLmRyYWdnaW5nPSExKSx0aGlzLmtleWRvd249ITF9fSx0b29sdGlwOlZ2LFwiZWRnZS10b29sdGlwXCI6V3YsXCJjb2xsYXBzZS1leHBhbmRcIjpZdixcImRyYWctY29tYm9cIjpxdixcImNvbGxhcHNlLWV4cGFuZC1jb21ib1wiOlp2LFwiY3JlYXRlLWVkZ2VcIjp7Z2V0RGVmYXVsdENmZzpmdW5jdGlvbigpe3JldHVybnt0cmlnZ2VyOlwiY2xpY2tcIixrZXk6dm9pZCAwLGVkZ2VDb25maWc6e30sZ2V0RWRnZUNvbmZpZzp2b2lkIDB9fSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdHkuaW5kZXhPZih0aGlzLnRyaWdnZXIudG9Mb3dlckNhc2UoKSk+LTF8fCh0aGlzLnRyaWdnZXI9XCJjbGlja1wiLGNvbnNvbGUud2FybihcIkJlaGF2aW9yIGNyZWF0ZS1lZGdlIMOnxaHigJ4gdHJpZ2dlciDDpcKP4oCaw6bigKLCsMOkwrjCjcOlwpDLhsOmwrPigKLDr8K8xZLDqMKvwrfDqMK+4oCcw6XigKbCpSAnY2xpY2snw6/CvMWSJ2RyYWcnXCIpKSx0aGlzLmtleSYmLTE9PT1leS5pbmRleE9mKHRoaXMua2V5LnRvTG93ZXJDYXNlKCkpJiYodGhpcy50cmlnZ2VyPXZvaWQgMCxjb25zb2xlLndhcm4oXCJCZWhhdmlvciBjcmVhdGUtZWRnZSDDp8Wh4oCeIGtleSDDpcKP4oCaw6bigKLCsMOkwrjCjcOlwpDLhsOmwrPigKLDr8K8xZLDqMKvwrfDqMK+4oCcw6XigKbCpSAnc2hpZnQnw6/CvMWSJ2N0cmwnw6/CvMWSJ2FsdCfDr8K8xZInY29udHJvbCfDr8K8xZLDpsuG4oCTIHVuZGVmaW5lZFwiKSksXCJkcmFnXCI9PT10aGlzLnRyaWdnZXI/dD17XCJub2RlOmRyYWdzdGFydFwiOlwib25DbGlja1wiLFwiY29tYm86ZHJhZ3N0YXJ0XCI6XCJvbkNsaWNrXCIsZHJhZzpcInVwZGF0ZUVuZFBvaW50XCIsXCJub2RlOmRyb3BcIjpcIm9uQ2xpY2tcIixcImNvbWJvOmRyb3BcIjpcIm9uQ2xpY2tcIixkcmFnZW5kOlwib25EcmFnRW5kXCJ9OlwiY2xpY2tcIj09PXRoaXMudHJpZ2dlciYmKHQ9e1wibm9kZTpjbGlja1wiOlwib25DbGlja1wiLG1vdXNlbW92ZTpcInVwZGF0ZUVuZFBvaW50XCIsXCJlZGdlOmNsaWNrXCI6XCJjYW5jZWxDcmVhdGluZ1wiLFwiY2FudmFzOmNsaWNrXCI6XCJjYW5jZWxDcmVhdGluZ1wiLFwiY29tYm86Y2xpY2tcIjpcIm9uQ2xpY2tcIn0pLHRoaXMua2V5JiYodC5rZXlkb3duPVwib25LZXlEb3duXCIsdC5rZXl1cD1cIm9uS2V5VXBcIiksdH0sb25EcmFnRW5kOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLmtleXx8dGhpcy5rZXlkb3duKXt2YXIgZT10Lml0ZW07ZSYmZS5nZXRJRCgpIT09dGhpcy5zb3VyY2UmJlwibm9kZVwiPT09ZS5nZXRUeXBlKCl8fHRoaXMuY2FuY2VsQ3JlYXRpbmcoe2l0ZW06dGhpcy5lZGdlLHg6dC54LHk6dC55fSl9fSxvbkNsaWNrOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLmtleXx8dGhpcy5rZXlkb3duKXt2YXIgZT10Lml0ZW0sbj10aGlzLmdyYXBoLHI9ZS5nZXRNb2RlbCgpLGk9dGhpcy5nZXRFZGdlQ29uZmlnO2lmKHRoaXMuYWRkaW5nRWRnZSYmdGhpcy5lZGdlKXtpZighdGhpcy5zaG91bGRFbmQuY2FsbCh0aGlzLHQpKXJldHVybjt2YXIgbz12b2lkIDA7bz1pJiZPYmplY3QoaC5yKShpKT9pKHtzb3VyY2U6dGhpcy5zb3VyY2UsdGFyZ2V0OnIuaWR9KTp0aGlzLmVkZ2VDb25maWc7dmFyIGE9T2JqZWN0KHYuYSkoe3RhcmdldDpyLmlkfSxvKTt0aGlzLnNvdXJjZT09PXIuaWQmJihhLnR5cGU9XCJsb29wXCIpLG4uZW1pdChcImJlZm9yZWNyZWF0ZWVkZ2VcIix7fSksbi51cGRhdGVJdGVtKHRoaXMuZWRnZSxhKSxuLmVtaXQoXCJhZnRlcmNyZWF0ZWVkZ2VcIix7ZWRnZTp0aGlzLmVkZ2V9KSx0aGlzLmVkZ2UuZ2V0S2V5U2hhcGUoKS5zZXQoXCJjYXB0dXJlXCIsITApLHRoaXMuZWRnZT1udWxsLHRoaXMuYWRkaW5nRWRnZT0hMX1lbHNle2lmKCF0aGlzLnNob3VsZEJlZ2luLmNhbGwodGhpcyx0KSlyZXR1cm47bz12b2lkIDA7bz1pJiZPYmplY3QoaC5yKShpKT9pKHtzb3VyY2U6ci5pZCx0YXJnZXQ6ci5pZH0pOnRoaXMuZWRnZUNvbmZpZyx0aGlzLmVkZ2U9bi5hZGRJdGVtKFwiZWRnZVwiLE9iamVjdCh2LmEpKHtzb3VyY2U6ci5pZCx0YXJnZXQ6ci5pZH0sbyksITEpLHRoaXMuc291cmNlPXIuaWQsdGhpcy5hZGRpbmdFZGdlPSEwLHRoaXMuZWRnZS5nZXRLZXlTaGFwZSgpLnNldChcImNhcHR1cmVcIiwhMSl9fX0sdXBkYXRlRW5kUG9pbnQ6ZnVuY3Rpb24odCl7aWYoIXRoaXMua2V5fHx0aGlzLmtleWRvd24pe3ZhciBlPXt4OnQueCx5OnQueX07dGhpcy5ncmFwaC5maW5kQnlJZCh0aGlzLnNvdXJjZSk/dGhpcy5hZGRpbmdFZGdlJiZ0aGlzLmVkZ2UmJnRoaXMuZ3JhcGgudXBkYXRlSXRlbSh0aGlzLmVkZ2Use3RhcmdldDplfSwhMSk6dGhpcy5hZGRpbmdFZGdlPSExfX0sY2FuY2VsQ3JlYXRpbmc6ZnVuY3Rpb24odCl7aWYoIXRoaXMua2V5fHx0aGlzLmtleWRvd24pe3ZhciBlPXRoaXMuZ3JhcGgsbj10Lml0ZW07aWYodGhpcy5hZGRpbmdFZGdlJiZ0LnRhcmdldCYmdC50YXJnZXQuaXNDYW52YXMmJnQudGFyZ2V0LmlzQ2FudmFzKCkpcmV0dXJuIGUucmVtb3ZlSXRlbSh0aGlzLmVkZ2UsITEpLHRoaXMuZWRnZT1udWxsLHZvaWQodGhpcy5hZGRpbmdFZGdlPSExKTt0aGlzLmFkZGluZ0VkZ2UmJnRoaXMuZWRnZT09PW4mJihlLnJlbW92ZUl0ZW0odGhpcy5lZGdlLCExKSx0aGlzLmVkZ2U9bnVsbCx0aGlzLmFkZGluZ0VkZ2U9ITEpfX0sb25LZXlEb3duOmZ1bmN0aW9uKHQpe3ZhciBlPXQua2V5O2UmJihlLnRvTG93ZXJDYXNlKCk9PT10aGlzLmtleS50b0xvd2VyQ2FzZSgpP3RoaXMua2V5ZG93bj0hMDp0aGlzLmtleWRvd249ITEpfSxvbktleVVwOmZ1bmN0aW9uKCl7dGhpcy5hZGRpbmdFZGdlJiZ0aGlzLmVkZ2UmJih0aGlzLmdyYXBoLnJlbW92ZUl0ZW0odGhpcy5lZGdlLCExKSx0aGlzLmFkZGluZ0VkZ2U9ITEsdGhpcy5lZGdlPW51bGwpLHRoaXMua2V5ZG93bj0hMX19LFwic2hvcnRjdXRzLWNhbGxcIjp7Z2V0RGVmYXVsdENmZzpmdW5jdGlvbigpe3JldHVybnt0cmlnZ2VyOlwiY3RybFwiLGNvbWJpbmVkS2V5OlwiMVwiLGZ1bmN0aW9uTmFtZTpcImZpdFZpZXdcIixmdW5jdGlvblBhcmFtczpbXX19LGdldEV2ZW50czpmdW5jdGlvbigpe3JldHVybiBueS5pbmRleE9mKHRoaXMudHJpZ2dlci50b0xvd2VyQ2FzZSgpKT4tMXx8KHRoaXMudHJpZ2dlcj1cImN0cmxcIixjb25zb2xlLndhcm4oXCJCZWhhdmlvciBzaG9ydGN1dHMtZml0LXZpZXcgw6fFoeKAniB0cmlnZ2VyIMOlwo/igJrDpuKAosKwICdcIit0aGlzLnRyaWdnZXIrXCInIMOkwrjCjcOlwpDLhsOmwrPigKLDr8K8xZLDqMKvwrfDqMK+4oCcw6XigKbCpSAnZHJhZyfDo+KCrMKBJ3NoaWZ0J8Oj4oKswoEnY3RybCcgw6bLhuKAkyAnYWx0J1wiKSksdGhpcy5jb21iaW5lZEtleT09PXRoaXMudHJpZ2dlciYmKHRoaXMuY29tYmluZWRLZXk9dm9pZCAwKSx7a2V5dXA6XCJvbktleVVwXCIsa2V5ZG93bjpcIm9uS2V5RG93blwifX0sb25LZXlEb3duOmZ1bmN0aW9uKHQpe3ZhciBlPXQua2V5O2lmKGUpe3ZhciBuPXRoaXMudHJpZ2dlci50b0xvd2VyQ2FzZSgpLHI9ZS50b0xvd2VyQ2FzZSgpO3RoaXMudHJpZ2dlcktleWRvd258fCh0aGlzLnRyaWdnZXJLZXlkb3duPXI9PT1ufHxcImNvbnRyb2xcIj09PXImJlwiY3RybFwiPT09bnx8XCJjdHJsXCI9PT1yJiZcImNvbnRyb2xcIj09PW4pO3ZhciBpPXRoaXMuZ3JhcGg7aWYoIWlbdGhpcy5mdW5jdGlvbk5hbWVdKXJldHVybiBjb25zb2xlLndhcm4oXCJCZWhhdmlvciBzaG9ydGN1dHMtZml0LXZpZXcgw6fFoeKAniBmdW5jdGlvbk5hbWUgw6XCj+KAmsOm4oCiwrAgJ1wiK3RoaXMuZnVuY3Rpb25OYW1lK1wiJyDDpMK4wo3DpcKQy4bDpsKz4oCiw6/CvMWSw6XCrsaSw6TCuMKNw6bLnMKvIEdyYXBoIMOnxaHigJ7DpMK44oKsw6TCuMKqw6XigKHCvcOm4oCiwrDDpcKQwo1cIikse307aWYoIXRoaXMudHJpZ2dlcktleWRvd258fHRoaXMuY29tYmluZWRLZXkpe3ZhciBvPXRoaXMuY29tYmluZWRLZXkudG9Mb3dlckNhc2UoKTt0aGlzLnRyaWdnZXJLZXlkb3duJiYocj09PW98fFwiY29udHJvbFwiPT09ciYmXCJjdHJsXCI9PT1vfHxcImN0cmxcIj09PXImJlwiY29udHJvbFwiPT09bykmJih0aGlzLmZ1bmN0aW9uUGFyYW1zJiZ0aGlzLmZ1bmN0aW9uUGFyYW1zLmxlbmd0aD9pW3RoaXMuZnVuY3Rpb25OYW1lXS5hcHBseShpLHRoaXMuZnVuY3Rpb25QYXJhbXMpOmlbdGhpcy5mdW5jdGlvbk5hbWVdKCkpfWVsc2UgdGhpcy5mdW5jdGlvblBhcmFtcyYmdGhpcy5mdW5jdGlvblBhcmFtcy5sZW5ndGg/aVt0aGlzLmZ1bmN0aW9uTmFtZV0uYXBwbHkoaSx0aGlzLmZ1bmN0aW9uUGFyYW1zKTppW3RoaXMuZnVuY3Rpb25OYW1lXSgpfX0sb25LZXlVcDpmdW5jdGlvbigpe3RoaXMuYnJ1c2gmJih0aGlzLmJydXNoLnJlbW92ZSghMCksdGhpcy5icnVzaD1udWxsLHRoaXMuZHJhZ2dpbmc9ITEpLHRoaXMudHJpZ2dlcktleWRvd249ITF9fX07T2JqZWN0KGguZikocnksKGZ1bmN0aW9uKHQsZSl7cm4oZSx0KX0pKTt2YXIgaXk9dHYuTWluaW1hcCxveT10di5HcmlkLGF5PXR2LkJ1bmRsaW5nLHN5PXR2Lk1lbnUsdXk9dHYuRmlzaGV5ZSxjeT10di5Ub29sQmFyLGZ5PXR2LlRvb2x0aXAsbHk9dHYuVGltZUJhcixoeT10di5JbWFnZU1pbmltYXAsZHk9dHYuRWRnZUZpbHRlckxlbnMscHk9e3ZlcnNpb246RG4udmVyc2lvbixHcmFwaDpuZCxUcmVlR3JhcGg6dmQsVXRpbDpkZCxMYXlvdXQ6TmgscmVnaXN0ZXJMYXlvdXQ6TGgsR2xvYmFsOkRuLHJlZ2lzdGVyQmVoYXZpb3I6cm4scmVnaXN0ZXJDb21ibzpubixyZWdpc3RlckVkZ2U6ZW4scmVnaXN0ZXJOb2RlOnRuLE1pbmltYXA6dHYuTWluaW1hcCxHcmlkOnR2LkdyaWQsQnVuZGxpbmc6dHYuQnVuZGxpbmcsTWVudTp0di5NZW51LFRvb2xCYXI6dHYuVG9vbEJhcixUb29sdGlwOnR2LlRvb2x0aXAsVGltZUJhcjpseSxGaXNoZXllOnV5LEltYWdlTWluaW1hcDpoeSxFZGdlRmlsdGVyTGVuczpkeSxBbGdvcml0aG06YixBcnJvdzpIZSxNYXJrZXI6cWUsU2hhcGU6S2V9O3B5LnZlcnNpb249XCI0LjEuMTJcIjtlLmRlZmF1bHQ9cHk7dmFyIGd5PVwiNC4xLjEyXCJ9XSkuZGVmYXVsdH0pKTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZzYubWluLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1\n')},function(module,exports,__webpack_require__){"use strict";eval('\r\nObject.defineProperty(exports, "__esModule", { value: true });\r\nexports.SV = void 0;\r\nconst engine_1 = __webpack_require__(5);\r\nconst boundingRect_1 = __webpack_require__(3);\r\nconst group_1 = __webpack_require__(12);\r\nconst externalPointer_1 = __webpack_require__(13);\r\nconst G6 = __webpack_require__(1);\r\nconst linkListNode_1 = __webpack_require__(14);\r\nconst binaryTreeNode_1 = __webpack_require__(15);\r\nconst twoCellNode_1 = __webpack_require__(16);\r\nconst vector_1 = __webpack_require__(4);\r\nexports.SV = {\r\n Engine: engine_1.Engine,\r\n Group: group_1.Group,\r\n Bound: boundingRect_1.Bound,\r\n Vector: vector_1.Vector,\r\n G6,\r\n registeredShape: [\r\n externalPointer_1.default, linkListNode_1.default, binaryTreeNode_1.default, twoCellNode_1.default\r\n ]\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvU3RydWN0Vi50cz9iMTNkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHdDQUFrQztBQUNsQyw4Q0FBNEM7QUFDNUMsd0NBQXFDO0FBQ3JDLGtEQUFnRTtBQUNoRSxrQ0FBa0M7QUFDbEMsK0NBQTBEO0FBQzFELGlEQUE4RDtBQUM5RCw4Q0FBd0Q7QUFDeEQsd0NBQXlDO0FBRzVCLFVBQUUsR0FBRztJQUNkLE1BQU0sRUFBRSxlQUFNO0lBQ2QsS0FBSyxFQUFFLGFBQUs7SUFDWixLQUFLLEVBQUUsb0JBQUs7SUFDWixNQUFNLEVBQUUsZUFBTTtJQUNkLEVBQUU7SUFDRixlQUFlLEVBQUU7UUFDYix5QkFBZSxFQUFFLHNCQUFZLEVBQUUsd0JBQWMsRUFBRSxxQkFBVztLQUM3RDtDQUNKLENBQUMiLCJmaWxlIjoiMi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVuZ2luZSB9IGZyb20gXCIuL2VuZ2luZVwiO1xyXG5pbXBvcnQgeyBCb3VuZCB9IGZyb20gXCIuL1ZpZXcvYm91bmRpbmdSZWN0XCI7XHJcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSBcIi4vVmlldy9ncm91cFwiO1xyXG5pbXBvcnQgZXh0ZXJuYWxQb2ludGVyIGZyb20gXCIuL1JlZ2lzdGVyZWRTaGFwZS9leHRlcm5hbFBvaW50ZXJcIjtcclxuaW1wb3J0ICogYXMgRzYgZnJvbSBcIi4vTGliL2c2LmpzXCI7XHJcbmltcG9ydCBsaW5rTGlzdE5vZGUgZnJvbSBcIi4vUmVnaXN0ZXJlZFNoYXBlL2xpbmtMaXN0Tm9kZVwiO1xyXG5pbXBvcnQgYmluYXJ5VHJlZU5vZGUgZnJvbSBcIi4vUmVnaXN0ZXJlZFNoYXBlL2JpbmFyeVRyZWVOb2RlXCI7XHJcbmltcG9ydCB0d29DZWxsTm9kZSBmcm9tIFwiLi9SZWdpc3RlcmVkU2hhcGUvdHdvQ2VsbE5vZGVcIjtcclxuaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSBcIi4vQ29tbW9uL3ZlY3RvclwiO1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBTViA9IHtcclxuICAgIEVuZ2luZTogRW5naW5lLFxyXG4gICAgR3JvdXA6IEdyb3VwLFxyXG4gICAgQm91bmQ6IEJvdW5kLFxyXG4gICAgVmVjdG9yOiBWZWN0b3IsXHJcbiAgICBHNixcclxuICAgIHJlZ2lzdGVyZWRTaGFwZTogW1xyXG4gICAgICAgIGV4dGVybmFsUG9pbnRlciwgbGlua0xpc3ROb2RlLCBiaW5hcnlUcmVlTm9kZSwgdHdvQ2VsbE5vZGVcclxuICAgIF1cclxufTtcclxuXHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2\n')},function(module,exports,__webpack_require__){"use strict";eval('\r\nObject.defineProperty(exports, "__esModule", { value: true });\r\nexports.Bound = void 0;\r\nconst vector_1 = __webpack_require__(4);\r\nexports.Bound = {\r\n fromPoints(points) {\r\n let maxX = -Infinity, minX = Infinity, maxY = -Infinity, minY = Infinity;\r\n points.map(item => {\r\n if (item[0] > maxX)\r\n maxX = item[0];\r\n if (item[0] < minX)\r\n minX = item[0];\r\n if (item[1] > maxY)\r\n maxY = item[1];\r\n if (item[1] < minY)\r\n minY = item[1];\r\n });\r\n return {\r\n x: minX,\r\n y: minY,\r\n width: maxX - minX,\r\n height: maxY - minY\r\n };\r\n },\r\n toPoints(bound) {\r\n return [\r\n [bound.x, bound.y],\r\n [bound.x + bound.width, bound.y],\r\n [bound.x + bound.width, bound.y + bound.height],\r\n [bound.x, bound.y + bound.height]\r\n ];\r\n },\r\n union(...arg) {\r\n return arg.length > 1 ?\r\n arg.reduce((total, cur) => {\r\n let minX = total.x < cur.x ? total.x : cur.x, maxX = total.x + total.width < cur.x + cur.width ? cur.x + cur.width : total.x + total.width, minY = total.y < cur.y ? total.y : cur.y, maxY = total.y + total.height < cur.y + cur.height ? cur.y + cur.height : total.y + total.height;\r\n return {\r\n x: minX,\r\n y: minY,\r\n width: maxX - minX,\r\n height: maxY - minY\r\n };\r\n }) : arg[0];\r\n },\r\n intersect(b1, b2) {\r\n let x, y, maxX, maxY, overlapsX, overlapsY;\r\n if (b1.x < b2.x + b2.width && b1.x + b1.width > b2.x) {\r\n x = b1.x < b2.x ? b2.x : b1.x;\r\n maxX = b1.x + b1.width < b2.x + b2.width ? b1.x + b1.width : b2.x + b2.width;\r\n overlapsX = maxX - x;\r\n }\r\n if (b1.y < b2.y + b2.height && b1.y + b1.height > b2.y) {\r\n y = b1.y < b2.y ? b2.y : b1.y;\r\n maxY = b1.y + b1.height < b2.y + b2.height ? b1.y + b1.height : b2.y + b2.height;\r\n overlapsY = maxY - y;\r\n }\r\n if (!overlapsX || !overlapsY)\r\n return null;\r\n return {\r\n x,\r\n y,\r\n width: overlapsX,\r\n height: overlapsY\r\n };\r\n },\r\n rotation(bound, rot) {\r\n let cx = bound.x + bound.width / 2, cy = bound.y + bound.height / 2;\r\n return exports.Bound.fromPoints(exports.Bound.toPoints(bound).map(item => vector_1.Vector.rotation(rot, item, [cx, cy])));\r\n },\r\n isOverlap(b1, b2) {\r\n let maxX1 = b1.x + b1.width, maxY1 = b1.y + b1.height, maxX2 = b2.x + b2.width, maxY2 = b2.y + b2.height;\r\n if (b1.x < maxX2 && b2.x < maxX1 && b1.y < maxY2 && b2.y < maxY1) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy9ib3VuZGluZ1JlY3QudHM/MjQ0ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx3Q0FBMEM7QUFjN0IsYUFBSyxHQUFHO0lBTWpCLFVBQVUsQ0FBQyxNQUErQjtRQUN0QyxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsRUFDaEIsSUFBSSxHQUFHLFFBQVEsRUFDZixJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQ2hCLElBQUksR0FBRyxRQUFRLENBQUM7UUFFcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNkLElBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7Z0JBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxJQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO2dCQUFFLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtnQkFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7Z0JBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU87WUFDSCxDQUFDLEVBQUUsSUFBSTtZQUNQLENBQUMsRUFBRSxJQUFJO1lBQ1AsS0FBSyxFQUFFLElBQUksR0FBRyxJQUFJO1lBQ2xCLE1BQU0sRUFBRSxJQUFJLEdBQUcsSUFBSTtTQUN0QixDQUFDO0lBQ04sQ0FBQztJQU1ELFFBQVEsQ0FBQyxLQUFtQjtRQUN4QixPQUFPO1lBQ0gsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVB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RUFBRSxDQUFDLEtBQUssRUFDdkIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFDeEIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFDdkIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUU3QixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFO1lBQzlELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0osQ0FBQyIsImZpbGUiOiIzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSBcIi4uL0NvbW1vbi92ZWN0b3JcIjtcclxuXHJcblxyXG5cclxuLy8g5YyF5Zu055uS57G75Z6LXHJcbmV4cG9ydCB0eXBlIEJvdW5kaW5nUmVjdCA9IHtcclxuICAgIHg6IG51bWJlcjtcclxuICAgIHk6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufTtcclxuXHJcblxyXG4vLyDljIXlm7Tnm5Lmk43kvZxcclxuZXhwb3J0IGNvbnN0IEJvdW5kID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO54K56ZuG55Sf5oiQ5YyF5Zu055uSXHJcbiAgICAgKiBAcGFyYW0gcG9pbnRzIFxyXG4gICAgICovXHJcbiAgICBmcm9tUG9pbnRzKHBvaW50czogQXJyYXk8W251bWJlciwgbnVtYmVyXT4pOiBCb3VuZGluZ1JlY3Qge1xyXG4gICAgICAgIGxldCBtYXhYID0gLUluZmluaXR5LFxyXG4gICAgICAgICAgICBtaW5YID0gSW5maW5pdHksXHJcbiAgICAgICAgICAgIG1heFkgPSAtSW5maW5pdHksXHJcbiAgICAgICAgICAgIG1pblkgPSBJbmZpbml0eTtcclxuXHJcbiAgICAgICAgcG9pbnRzLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYoaXRlbVswXSA+IG1heFgpIG1heFggPSBpdGVtWzBdO1xyXG4gICAgICAgICAgICBpZihpdGVtWzBdIDwgbWluWCkgbWluWCA9IGl0ZW1bMF07XHJcbiAgICAgICAgICAgIGlmKGl0ZW1bMV0gPiBtYXhZKSBtYXhZID0gaXRlbVsxXTtcclxuICAgICAgICAgICAgaWYoaXRlbVsxXSA8IG1pblkpIG1pblkgPSBpdGVtWzFdO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB4OiBtaW5YLFxyXG4gICAgICAgICAgICB5OiBtaW5ZLFxyXG4gICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXHJcbiAgICAgICAgICAgIGhlaWdodDogbWF4WSAtIG1pbllcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOeUseWMheWbtOebkui9rOWMluS4uuWbm+S4qumhtueCue+8iOmhuuaXtumSiO+8iVxyXG4gICAgICogQHBhcmFtIGJvdW5kIFxyXG4gICAgICovXHJcbiAgICB0b1BvaW50cyhib3VuZDogQm91bmRpbmdSZWN0KTogQXJyYXk8W251bWJlciwgbnVtYmVyXT4ge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIFtib3VuZC54LCBib3VuZC55XSxcclxuICAgICAgICAgICAgW2JvdW5kLnggKyBib3VuZC53aWR0aCwgYm91bmQueV0sXHJcbiAgICAgICAgICAgIFtib3VuZC54ICsgYm91bmQud2lkdGgsIGJvdW5kLnkgKyBib3VuZC5oZWlnaHRdLFxyXG4gICAgICAgICAgICBbYm91bmQueCwgYm91bmQueSArIGJvdW5kLmhlaWdodF1cclxuICAgICAgICBdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaxguWMheWbtOebkuW5tumbhlxyXG4gICAgICogQHBhcmFtIGFyZyBcclxuICAgICAqL1xyXG4gICAgdW5pb24oLi4uYXJnOiBCb3VuZGluZ1JlY3RbXSk6IEJvdW5kaW5nUmVjdCB7XHJcbiAgICAgICAgcmV0dXJuIGFyZy5sZW5ndGggPiAxPyBcclxuICAgICAgICAgICAgYXJnLnJlZHVjZSgodG90YWwsIGN1cikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbWluWCA9IHRvdGFsLnggPCBjdXIueD8gdG90YWwueDogY3VyLngsXHJcbiAgICAgICAgICAgICAgICBtYXhYID0gdG90YWwueCArIHRvdGFsLndpZHRoIDwgY3VyLnggKyBjdXIud2lkdGg/IGN1ci54ICsgY3VyLndpZHRoOiB0b3RhbC54ICsgdG90YWwud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBtaW5ZID0gdG90YWwueSA8IGN1ci55PyB0b3RhbC55OiBjdXIueSxcclxuICAgICAgICAgICAgICAgIG1heFkgPSB0b3RhbC55ICsgdG90YWwuaGVpZ2h0IDwgY3VyLnkgKyBjdXIuaGVpZ2h0PyBjdXIueSArIGN1ci5oZWlnaHQ6IHRvdGFsLnkgKyB0b3RhbC5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgeDogbWluWCxcclxuICAgICAgICAgICAgICAgIHk6IG1pblksXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk6IGFyZ1swXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDljIXlm7Tnm5LmsYLkuqTpm4ZcclxuICAgICAqIEBwYXJhbSBiMSBcclxuICAgICAqIEBwYXJhbSBiMiBcclxuICAgICAqL1xyXG4gICAgaW50ZXJzZWN0KGIxOiBCb3VuZGluZ1JlY3QsIGIyOiBCb3VuZGluZ1JlY3QpOiBCb3VuZGluZ1JlY3Qge1xyXG4gICAgICAgIGxldCB4LCB5LCBcclxuICAgICAgICAgICAgbWF4WCwgbWF4WSxcclxuICAgICAgICAgICAgb3ZlcmxhcHNYLFxyXG4gICAgICAgICAgICBvdmVybGFwc1k7XHJcblxyXG4gICAgICAgIGlmKGIxLnggPCBiMi54ICsgYjIud2lkdGggJiYgYjEueCArIGIxLndpZHRoID4gYjIueCkge1xyXG4gICAgICAgICAgICB4ID0gYjEueCA8IGIyLng/IGIyLng6IGIxLng7XHJcbiAgICAgICAgICAgIG1heFggPSBiMS54ICsgYjEud2lkdGggPCBiMi54ICsgYjIud2lkdGg/IGIxLnggKyBiMS53aWR0aDogYjIueCArIGIyLndpZHRoO1xyXG4gICAgICAgICAgICBvdmVybGFwc1ggPSBtYXhYIC0geDtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYoYjEueSA8IGIyLnkgKyBiMi5oZWlnaHQgJiYgYjEueSArIGIxLmhlaWdodCA+IGIyLnkpIHtcclxuICAgICAgICAgICAgeSA9IGIxLnkgPCBiMi55PyBiMi55OiBiMS55O1xyXG4gICAgICAgICAgICBtYXhZID0gYjEueSArIGIxLmhlaWdodCA8IGIyLnkgKyBiMi5oZWlnaHQ/IGIxLnkgKyBiMS5oZWlnaHQ6IGIyLnkgKyBiMi5oZWlnaHQ7XHJcbiAgICAgICAgICAgIG92ZXJsYXBzWSA9IG1heFkgLSB5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIW92ZXJsYXBzWCB8fCAhb3ZlcmxhcHNZKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeCxcclxuICAgICAgICAgICAgeSxcclxuICAgICAgICAgICAgd2lkdGg6IG92ZXJsYXBzWCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBvdmVybGFwc1lcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaxguWMheWbtOebkuaXi+i9rOWQjuaWsOW9ouaIkOeahOWMheWbtOebklxyXG4gICAgICogQHBhcmFtIGJvdW5kIFxyXG4gICAgICogQHBhcmFtIHJvdFxyXG4gICAgICovXHJcbiAgICByb3RhdGlvbihib3VuZDogQm91bmRpbmdSZWN0LCByb3Q6IG51bWJlcik6IEJvdW5kaW5nUmVjdCB7XHJcbiAgICAgICAgbGV0IGN4ID0gYm91bmQueCArIGJvdW5kLndpZHRoIC8gMixcclxuICAgICAgICAgICAgY3kgPSBib3VuZC55ICsgYm91bmQuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgcmV0dXJuIEJvdW5kLmZyb21Qb2ludHMoQm91bmQudG9Qb2ludHMoYm91bmQpLm1hcChpdGVtID0+IFZlY3Rvci5yb3RhdGlvbihyb3QsIGl0ZW0sIFtjeCwgY3ldKSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIpOaWreS4pOS4quWMheWbtOebkuaYr+WQpuebuOS6pFxyXG4gICAgICogQHBhcmFtIGIxIFxyXG4gICAgICogQHBhcmFtIGIyIFxyXG4gICAgICovXHJcbiAgICBpc092ZXJsYXAoYjE6IEJvdW5kaW5nUmVjdCwgYjI6IEJvdW5kaW5nUmVjdCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBtYXhYMSA9IGIxLnggKyBiMS53aWR0aCxcclxuICAgICAgICAgICAgbWF4WTEgPSBiMS55ICsgYjEuaGVpZ2h0LFxyXG4gICAgICAgICAgICBtYXhYMiA9IGIyLnggKyBiMi53aWR0aCxcclxuICAgICAgICAgICAgbWF4WTIgPSBiMi55ICsgYjIuaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAoYjEueCA8IG1heFgyICYmIGIyLnggPCBtYXhYMSAmJiBiMS55IDwgbWF4WTIgJiYgYjIueSA8IG1heFkxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3\n')},function(module,exports,__webpack_require__){"use strict";eval('\r\nObject.defineProperty(exports, "__esModule", { value: true });\r\nexports.Vector = void 0;\r\nexports.Vector = {\r\n add(v1, v2) {\r\n return [v1[0] + v2[0], v1[1] + v2[1]];\r\n },\r\n subtract(v1, v2) {\r\n return [v1[0] - v2[0], v1[1] - v2[1]];\r\n },\r\n dot(v1, v2) {\r\n return v1[0] * v2[0] + v1[1] * v2[1];\r\n },\r\n scale(v, n) {\r\n return [v[0] * n, v[1] * n];\r\n },\r\n length(v) {\r\n return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2));\r\n },\r\n rotation(radian, point, center = [0, 0]) {\r\n if (radian === 0)\r\n return point;\r\n radian = -radian;\r\n let cos = Math.cos(radian), sin = Math.sin(radian), dv = [point[0] - center[0], point[1] - center[1]], v = [0, 0];\r\n v[0] = center[0] + (dv[0] * cos - dv[1] * sin);\r\n v[1] = center[1] + (dv[0] * sin + dv[1] * cos);\r\n return v;\r\n },\r\n tangent(v) {\r\n return [-v[1], v[0]];\r\n },\r\n normalize(v) {\r\n let len = exports.Vector.length(v);\r\n if (len === 0) {\r\n return [0, 0];\r\n }\r\n else if (len === 1) {\r\n return v;\r\n }\r\n else {\r\n return [v[0] / len, v[1] / len];\r\n }\r\n },\r\n location(v, direction, len) {\r\n return exports.Vector.add(v, exports.Vector.scale(exports.Vector.normalize(direction), len));\r\n },\r\n negative(v) {\r\n return exports.Vector.scale(v, -1);\r\n }\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQ29tbW9uL3ZlY3Rvci50cz82ODkxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdhLGNBQU0sR0FBRztJQU9sQixHQUFHLENBQUMsRUFBb0IsRUFBRSxFQUFvQjtRQUMxQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQU9ELFFBQVEsQ0FBQyxFQUFvQixFQUFFLEVBQW9CO1FBQy9DLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBT0QsR0FBRyxDQUFDLEVBQW9CLEVBQUUsRUFBb0I7UUFDMUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQU9ELEtBQUssQ0FBQyxDQUFtQixFQUFFLENBQVM7UUFDaEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFNRCxNQUFNLENBQUMsQ0FBbUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUcsVUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ3hDLENBQUM7SUFRRCxRQUFRLENBQUMsTUFBYyxFQUFFLEtBQXVCLEVBQUUsU0FBMkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLElBQUcsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUU5QixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFFakIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFDdEIsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQ3RCLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNqRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRW5ELE9BQU8sQ0FBcUIsQ0FBQztJQUNqQyxDQUFDO0lBS0QsT0FBTyxDQUFDLENBQW1CO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBS0QsU0FBUyxDQUFDLENBQW1CO1FBQ3pCLElBQUksR0FBRyxHQUFHLGNBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsSUFBRyxHQUFHLEtBQUssQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNqQjthQUNJLElBQUcsR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNmLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7YUFDSTtZQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUNuQztJQUNMLENBQUM7SUFRRCxRQUFRLENBQUMsQ0FBbUIsRUFBRSxTQUEyQixFQUFFLEdBQVc7UUFDbEUsT0FBTyxjQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxjQUFNLENBQUMsS0FBSyxDQUFDLGNBQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBS0QsUUFBUSxDQUFDLENBQW1CO1FBQ3hCLE9BQU8sY0FBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0osQ0FBQyIsImZpbGUiOiI0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IFZlY3RvciA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQkemHj+ebuOWKoFxyXG4gICAgICogQHBhcmFtIHYxIFxyXG4gICAgICogQHBhcmFtIHYyIFxyXG4gICAgICovXHJcbiAgICBhZGQodjE6IFtudW1iZXIsIG51bWJlcl0sIHYyOiBbbnVtYmVyLCBudW1iZXJdKTogW251bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgICAgcmV0dXJuIFt2MVswXSArIHYyWzBdLCB2MVsxXSArIHYyWzFdXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlkJHph4/nm7jlh49cclxuICAgICAqIEBwYXJhbSB2MSBcclxuICAgICAqIEBwYXJhbSB2MiBcclxuICAgICAqL1xyXG4gICAgc3VidHJhY3QodjE6IFtudW1iZXIsIG51bWJlcl0sIHYyOiBbbnVtYmVyLCBudW1iZXJdKTogW251bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgICAgcmV0dXJuIFt2MVswXSAtIHYyWzBdLCB2MVsxXSAtIHYyWzFdXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlkJHph4/ngrnnp69cclxuICAgICAqIEBwYXJhbSB2MSBcclxuICAgICAqIEBwYXJhbSB2MiBcclxuICAgICAqL1xyXG4gICAgZG90KHYxOiBbbnVtYmVyLCBudW1iZXJdLCB2MjogW251bWJlciwgbnVtYmVyXSk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHYxWzBdICogdjJbMF0gKyB2MVsxXSAqIHYyWzFdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQkemHj+e8qeaUvlxyXG4gICAgICogQHBhcmFtIHYgXHJcbiAgICAgKiBAcGFyYW0gbiBcclxuICAgICAqL1xyXG4gICAgc2NhbGUodjogW251bWJlciwgbnVtYmVyXSwgbjogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgICAgcmV0dXJuIFt2WzBdICogbiwgdlsxXSAqIG5dO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQkemHj+axguaooemVv1xyXG4gICAgICogQHBhcmFtIHYgXHJcbiAgICAgKi9cclxuICAgIGxlbmd0aCh2OiBbbnVtYmVyLCBudW1iZXJdKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHZbMF0qKjIgKyB2WzFdKioyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnu5Xmn5Dngrnml4vovazlkJHph49cclxuICAgICAqIEBwYXJhbSByYWRpYW4g6KeS5bqm77yI5byn5bqm5Yi277yJXHJcbiAgICAgKiBAcGFyYW0gcG9pbnQg5peL6L2s55qE54K5XHJcbiAgICAgKiBAcGFyYW0gY2VudGVyIOe7leeahOeCuVxyXG4gICAgICovXHJcbiAgICByb3RhdGlvbihyYWRpYW46IG51bWJlciwgcG9pbnQ6IFtudW1iZXIsIG51bWJlcl0sIGNlbnRlcjogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXSk6IFtudW1iZXIsIG51bWJlcl0ge1xyXG4gICAgICAgIGlmKHJhZGlhbiA9PT0gMCkgcmV0dXJuIHBvaW50O1xyXG5cclxuICAgICAgICByYWRpYW4gPSAtcmFkaWFuO1xyXG5cclxuICAgICAgICBsZXQgY29zID0gTWF0aC5jb3MocmFkaWFuKSxcclxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4ocmFkaWFuKSxcclxuICAgICAgICAgICAgZHYgPSBbcG9pbnRbMF0gLSBjZW50ZXJbMF0sIHBvaW50WzFdIC0gY2VudGVyWzFdXSxcclxuICAgICAgICAgICAgdiA9IFswLCAwXTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB2WzBdID0gY2VudGVyWzBdICsgKGR2WzBdICogY29zIC0gZHZbMV0gKiBzaW4pO1xyXG4gICAgICAgICAgICB2WzFdID0gY2VudGVyWzFdICsgKGR2WzBdICogc2luICsgZHZbMV0gKiBjb3MpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB2IGFzIFtudW1iZXIsIG51bWJlcl07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rGC5ZCR6YeP5rOV5ZCRXHJcbiAgICAgKi9cclxuICAgIHRhbmdlbnQodjogW251bWJlciwgbnVtYmVyXSk6IFtudW1iZXIsIG51bWJlcl0ge1xyXG4gICAgICAgIHJldHVybiBbLXZbMV0sIHZbMF1dO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQkemHj+WNleS9jeWMllxyXG4gICAgICovXHJcbiAgICBub3JtYWxpemUodjogW251bWJlciwgbnVtYmVyXSk6IFtudW1iZXIsIG51bWJlcl0ge1xyXG4gICAgICAgIGxldCBsZW4gPSBWZWN0b3IubGVuZ3RoKHYpO1xyXG5cclxuICAgICAgICBpZihsZW4gPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFswLCAwXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihsZW4gPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gW3ZbMF0gLyBsZW4sIHZbMV0gLyBsZW5dO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmsYLkuIDkuKrlkJHph4/vvIjngrnvvInmjInnhadkaXJlY3Rpb27mlrnlkJHvvIzlu7bplb9sZW7plb/luqblkI7nmoTlnZDmoIdcclxuICAgICAqIEBwYXJhbSB2XHJcbiAgICAgKiBAcGFyYW0gZGlyZWN0aW9uXHJcbiAgICAgKiBAcGFyYW0gbGVuIFxyXG4gICAgICovXHJcbiAgICBsb2NhdGlvbih2OiBbbnVtYmVyLCBudW1iZXJdLCBkaXJlY3Rpb246IFtudW1iZXIsIG51bWJlcl0sIGxlbjogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgICAgcmV0dXJuIFZlY3Rvci5hZGQodiwgVmVjdG9yLnNjYWxlKFZlY3Rvci5ub3JtYWxpemUoZGlyZWN0aW9uKSwgbGVuKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ZCR6YeP5Y+W5Y+NXHJcbiAgICAgKi9cclxuICAgIG5lZ2F0aXZlKHY6IFtudW1iZXIsIG51bWJlcl0pOiBbbnVtYmVyLCBudW1iZXJdIHtcclxuICAgICAgICByZXR1cm4gVmVjdG9yLnNjYWxlKHYsIC0xKTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG5cclxuXHJcblxyXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4\n')},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Engine = void 0;\r\nconst modelConstructor_1 = __webpack_require__(6);\r\nconst renderer_1 = __webpack_require__(8);\r\nconst layouter_1 = __webpack_require__(10);\r\nconst behavior_1 = __webpack_require__(11);\r\nconst util_1 = __webpack_require__(0);\r\nclass Engine {\r\n constructor(DOMContainer) {\r\n this.stringifySources = null;\r\n this.modelConstructor = null;\r\n this.layouter = null;\r\n this.renderer = null;\r\n this.elementOptions = {};\r\n this.linkOptions = {};\r\n this.pointerOptions = {};\r\n this.layoutOptions = null;\r\n this.animationOptions = null;\r\n this.interactionOptions = null;\r\n const options = this.defineOptions();\r\n this.elementOptions = options.element;\r\n this.linkOptions = options.link || {};\r\n this.pointerOptions = options.pointer || {};\r\n this.layoutOptions = Object.assign({\r\n fitCenter: true,\r\n fitView: false\r\n }, options.layout);\r\n this.animationOptions = Object.assign({\r\n enable: true,\r\n duration: 750,\r\n timingFunction: 'easePolyOut'\r\n }, options.animation);\r\n this.interactionOptions = Object.assign({\r\n drag: true,\r\n zoom: true,\r\n dragNode: true,\r\n selectNode: true\r\n }, options.interaction);\r\n this.modelConstructor = new modelConstructor_1.ModelConstructor(this);\r\n this.layouter = new layouter_1.Layouter(this);\r\n this.renderer = new renderer_1.Renderer(this, DOMContainer);\r\n this.graphInstance = this.renderer.getGraphInstance();\r\n this.behavior = new behavior_1.Behavior(this, this.renderer.getGraphInstance());\r\n }\r\n render(sourceData) {\r\n if (sourceData === undefined || sourceData === null) {\r\n return;\r\n }\r\n let stringifySources = JSON.stringify(sourceData);\r\n if (stringifySources === this.stringifySources)\r\n return;\r\n this.stringifySources = stringifySources;\r\n this.constructedData = this.modelConstructor.construct(sourceData);\r\n this.renderer.build(this.constructedData);\r\n this.layouter.layout(this.constructedData, this.renderer.getModelList(), this.layout);\r\n this.renderer.render(this.constructedData);\r\n }\r\n defineOptions() {\r\n return null;\r\n }\r\n layout(elementContainer, layoutOptions) { }\r\n reLayout() {\r\n const modelList = this.renderer.getModelList();\r\n this.layouter.layout(this.constructedData, modelList, this.layout);\r\n modelList.forEach(item => {\r\n if (item.modelType === 'link')\r\n return;\r\n let model = item.G6Item.getModel(), x = item.get('x'), y = item.get('y');\r\n model.x = x;\r\n model.y = y;\r\n });\r\n this.graphInstance.refresh();\r\n }\r\n getGraphInstance() {\r\n return this.graphInstance;\r\n }\r\n getElements() {\r\n return util_1.Util.converterList(this.constructedData.element);\r\n }\r\n getPointers() {\r\n return util_1.Util.converterList(this.constructedData.pointer);\r\n }\r\n getLinks() {\r\n return util_1.Util.converterList(this.constructedData.link);\r\n }\r\n resize(width, height) {\r\n this.graphInstance.changeSize(width, height);\r\n }\r\n on(eventName, callback) {\r\n this.behavior.on(eventName, callback);\r\n }\r\n destroy() {\r\n this.graphInstance.destroy();\r\n this.modelConstructor = null;\r\n this.layouter = null;\r\n this.renderer = null;\r\n this.behavior = null;\r\n this.graphInstance = null;\r\n }\r\n}\r\nexports.Engine = Engine;\r\n;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvZW5naW5lLnRzPzIyZWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQTZFO0FBQzdFLDBDQUEyQztBQUUzQywyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLHNDQUFxQztBQUdyQyxNQUFhLE1BQU07SUFpQmYsWUFBWSxZQUF5QjtRQWhCN0IscUJBQWdCLEdBQVcsSUFBSSxDQUFDO1FBRWhDLHFCQUFnQixHQUFxQixJQUFJLENBQUM7UUFDMUMsYUFBUSxHQUFhLElBQUksQ0FBQztRQUMxQixhQUFRLEdBQWEsSUFBSSxDQUFDO1FBSzNCLG1CQUFjLEdBQXFDLEVBQUksQ0FBQztRQUN4RCxnQkFBVyxHQUFrQyxFQUFJLENBQUM7UUFDbEQsbUJBQWMsR0FBcUMsRUFBSSxDQUFDO1FBQ3hELGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUNwQyxxQkFBZ0IsR0FBcUIsSUFBSSxDQUFDO1FBQzFDLHVCQUFrQixHQUF1QixJQUFJLENBQUM7UUFHakQsTUFBTSxPQUFPLEdBQVksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFHLENBQUM7UUFFN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQy9CLFNBQVMsRUFBRSxJQUFJO1lBQ2YsT0FBTyxFQUFFLEtBQUs7U0FDakIsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDbEMsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsR0FBRztZQUNiLGNBQWMsRUFBRSxhQUFhO1NB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QU8sV0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFLTSxXQUFXO1FBQ2QsT0FBTyxXQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUtNLFFBQVE7UUFDWCxPQUFPLFdBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBT00sTUFBTSxDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBT00sRUFBRSxDQUFDLFNBQWlCLEVBQUUsUUFBa0I7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFLTSxPQUFPO1FBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7Q0FDSjtBQXBLRCx3QkFvS0M7QUFBQSxDQUFDIiwiZmlsZSI6IjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50LCBQb2ludGVyIH0gZnJvbSBcIi4vTW9kZWwvbW9kZWxEYXRhXCI7XHJcbmltcG9ydCB7IFNvdXJjZXMgfSBmcm9tIFwiLi9zb3VyY2VzXCI7XHJcbmltcG9ydCB7IENvbnN0cnVjdGVkRGF0YSwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCIuL01vZGVsL21vZGVsQ29uc3RydWN0b3JcIjtcclxuaW1wb3J0IHsgUmVuZGVyZXIgfSBmcm9tIFwiLi9WaWV3L3JlbmRlcmVyXCI7XHJcbmltcG9ydCB7IEFuaW1hdGlvbk9wdGlvbnMsIEVsZW1lbnRPcHRpb24sIEludGVyYWN0aW9uT3B0aW9ucywgTGF5b3V0T3B0aW9ucywgTGlua09wdGlvbiwgT3B0aW9ucywgUG9pbnRlck9wdGlvbiB9IGZyb20gXCIuL29wdGlvbnNcIjtcclxuaW1wb3J0IHsgTGF5b3V0ZXIgfSBmcm9tIFwiLi9WaWV3L2xheW91dGVyXCI7XHJcbmltcG9ydCB7IEJlaGF2aW9yIH0gZnJvbSBcIi4vVmlldy9iZWhhdmlvclwiO1xyXG5pbXBvcnQgeyBVdGlsIH0gZnJvbSBcIi4vQ29tbW9uL3V0aWxcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgRW5naW5lIHsgXHJcbiAgICBwcml2YXRlIHN0cmluZ2lmeVNvdXJjZXM6IHN0cmluZyA9IG51bGw7IC8vIOW6j+WIl+WMlueahOa6kOaVsOaNrlxyXG5cclxuICAgIHByaXZhdGUgbW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3RvciA9IG51bGw7XHJcbiAgICBwcml2YXRlIGxheW91dGVyOiBMYXlvdXRlciA9IG51bGw7XHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlciA9IG51bGw7XHJcbiAgICBwcml2YXRlIGJlaGF2aW9yOiBCZWhhdmlvcjtcclxuICAgIHByaXZhdGUgZ3JhcGhJbnN0YW5jZTtcclxuICAgIHByaXZhdGUgY29uc3RydWN0ZWREYXRhOiBDb25zdHJ1Y3RlZERhdGE7XHJcbiAgICBcclxuICAgIHB1YmxpYyBlbGVtZW50T3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBFbGVtZW50T3B0aW9uIH0gPSB7ICB9O1xyXG4gICAgcHVibGljIGxpbmtPcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IExpbmtPcHRpb24gfSA9IHsgIH07XHJcbiAgICBwdWJsaWMgcG9pbnRlck9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogUG9pbnRlck9wdGlvbiB9ID0geyAgfTtcclxuICAgIHB1YmxpYyBsYXlvdXRPcHRpb25zOiBMYXlvdXRPcHRpb25zID0gbnVsbDtcclxuICAgIHB1YmxpYyBhbmltYXRpb25PcHRpb25zOiBBbmltYXRpb25PcHRpb25zID0gbnVsbDtcclxuICAgIHB1YmxpYyBpbnRlcmFjdGlvbk9wdGlvbnM6IEludGVyYWN0aW9uT3B0aW9ucyA9IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoRE9NQ29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnMgPSB0aGlzLmRlZmluZU9wdGlvbnMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbGVtZW50T3B0aW9ucyA9IG9wdGlvbnMuZWxlbWVudDtcclxuICAgICAgICB0aGlzLmxpbmtPcHRpb25zID0gb3B0aW9ucy5saW5rIHx8IHsgfTtcclxuICAgICAgICB0aGlzLnBvaW50ZXJPcHRpb25zID0gb3B0aW9ucy5wb2ludGVyIHx8IHsgfTtcclxuXHJcbiAgICAgICAgdGhpcy5sYXlvdXRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgICAgIGZpdENlbnRlcjogdHJ1ZSxcclxuICAgICAgICAgICAgZml0VmlldzogZmFsc2VcclxuICAgICAgICB9LCBvcHRpb25zLmxheW91dCk7XHJcblxyXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiA3NTAsXHJcbiAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9uOiAnZWFzZVBvbHlPdXQnXHJcbiAgICAgICAgfSwgb3B0aW9ucy5hbmltYXRpb24pO1xyXG5cclxuICAgICAgICB0aGlzLmludGVyYWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICBkcmFnOiB0cnVlLFxyXG4gICAgICAgICAgICB6b29tOiB0cnVlLFxyXG4gICAgICAgICAgICBkcmFnTm9kZTogdHJ1ZSxcclxuICAgICAgICAgICAgc2VsZWN0Tm9kZTogdHJ1ZVxyXG4gICAgICAgIH0sIG9wdGlvbnMuaW50ZXJhY3Rpb24pO1xyXG5cclxuICAgICAgICB0aGlzLm1vZGVsQ29uc3RydWN0b3IgPSBuZXcgTW9kZWxDb25zdHJ1Y3Rvcih0aGlzKTtcclxuICAgICAgICB0aGlzLmxheW91dGVyID0gbmV3IExheW91dGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIodGhpcywgRE9NQ29udGFpbmVyKTtcclxuICAgICAgICB0aGlzLmdyYXBoSW5zdGFuY2UgPSB0aGlzLnJlbmRlcmVyLmdldEdyYXBoSW5zdGFuY2UoKTtcclxuICAgICAgICB0aGlzLmJlaGF2aW9yID0gbmV3IEJlaGF2aW9yKHRoaXMsIHRoaXMucmVuZGVyZXIuZ2V0R3JhcGhJbnN0YW5jZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOi+k+WFpeaVsOaNrui/m+ihjOa4suafk1xyXG4gICAgICogQHBhcmFtIHNvdXJjZURhdGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXIoc291cmNlRGF0YTogU291cmNlcykge1xyXG4gICAgICAgIGlmKHNvdXJjZURhdGEgPT09IHVuZGVmaW5lZCB8fCBzb3VyY2VEYXRhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOiLpeWJjeWQjuaVsOaNruayoeacieWPkeeUn+WPmOWMlu+8jOS7gOS5iOS5n+S4jeW5su+8iOWwhmpzb27lrZfnrKbkuLLljJblkI7mr5TovoPvvIlcclxuICAgICAgICBsZXQgc3RyaW5naWZ5U291cmNlcyA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZURhdGEpO1xyXG4gICAgICAgIGlmKHN0cmluZ2lmeVNvdXJjZXMgPT09IHRoaXMuc3RyaW5naWZ5U291cmNlcykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuc3RyaW5naWZ5U291cmNlcyA9IHN0cmluZ2lmeVNvdXJjZXM7XHJcblxyXG4gICAgICAgIHRoaXMuY29uc3RydWN0ZWREYXRhID0gdGhpcy5tb2RlbENvbnN0cnVjdG9yLmNvbnN0cnVjdChzb3VyY2VEYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5idWlsZCh0aGlzLmNvbnN0cnVjdGVkRGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0ZXIubGF5b3V0KHRoaXMuY29uc3RydWN0ZWREYXRhLCB0aGlzLnJlbmRlcmVyLmdldE1vZGVsTGlzdCgpLCB0aGlzLmxheW91dCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuY29uc3RydWN0ZWREYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWumuS5iemFjee9rumhuVxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBkZWZpbmVPcHRpb25zKCk6IE9wdGlvbnMge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6+572u5biD5bGA5Ye95pWwXHJcbiAgICAgKiBAb3ZlcndyaXRlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBsYXlvdXQoZWxlbWVudENvbnRhaW5lcjogeyBba2V0OiBzdHJpbmddOiBFbGVtZW50W10gfSwgbGF5b3V0T3B0aW9uczogTGF5b3V0T3B0aW9ucykgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDph43mlrDluIPlsYBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlTGF5b3V0KCkge1xyXG4gICAgICAgIGNvbnN0IG1vZGVsTGlzdCA9IHRoaXMucmVuZGVyZXIuZ2V0TW9kZWxMaXN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0ZXIubGF5b3V0KHRoaXMuY29uc3RydWN0ZWREYXRhLCBtb2RlbExpc3QsIHRoaXMubGF5b3V0KTtcclxuICAgICAgICBtb2RlbExpc3QuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYoaXRlbS5tb2RlbFR5cGUgPT09ICdsaW5rJykgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgbGV0IG1vZGVsID0gaXRlbS5HNkl0ZW0uZ2V0TW9kZWwoKSxcclxuICAgICAgICAgICAgICAgIHggPSBpdGVtLmdldCgneCcpLFxyXG4gICAgICAgICAgICAgICAgeSA9IGl0ZW0uZ2V0KCd5Jyk7XHJcblxyXG4gICAgICAgICAgICBtb2RlbC54ID0geDtcclxuICAgICAgICAgICAgbW9kZWwueSA9IHk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JhcGhJbnN0YW5jZS5yZWZyZXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5YgRzYg5a6e5L6LXHJcbiAgICAgKi9cclxuICAgICBwdWJsaWMgZ2V0R3JhcGhJbnN0YW5jZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncmFwaEluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5omA5pyJIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEVsZW1lbnRzKCk6IEVsZW1lbnRbXSB7XHJcbiAgICAgICAgcmV0dXJuIFV0aWwuY29udmVydGVyTGlzdCh0aGlzLmNvbnN0cnVjdGVkRGF0YS5lbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluaJgOaciSBwb2ludGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQb2ludGVycygpOiBQb2ludGVyW10ge1xyXG4gICAgICAgIHJldHVybiBVdGlsLmNvbnZlcnRlckxpc3QodGhpcy5jb25zdHJ1Y3RlZERhdGEucG9pbnRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmiYDmnIkgbGlua1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TGlua3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIFV0aWwuY29udmVydGVyTGlzdCh0aGlzLmNvbnN0cnVjdGVkRGF0YS5saW5rKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiwg+aVtOWuueWZqOWwuuWvuFxyXG4gICAgICogQHBhcmFtIHdpZHRoIFxyXG4gICAgICogQHBhcmFtIGhlaWdodCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuZ3JhcGhJbnN0YW5jZS5jaGFuZ2VTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog57uR5a6aIEc2IOS6i+S7tlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSBcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmJlaGF2aW9yLm9uKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZSA5q+B5byV5pOOXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuZ3JhcGhJbnN0YW5jZS5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5tb2RlbENvbnN0cnVjdG9yID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxheW91dGVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmJlaGF2aW9yID0gbnVsbDtcclxuICAgICAgICB0aGlzLmdyYXBoSW5zdGFuY2UgPSBudWxsO1xyXG4gICAgfVxyXG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.ModelConstructor = void 0;\r\nconst util_1 = __webpack_require__(0);\r\nconst modelData_1 = __webpack_require__(7);\r\n;\r\nclass ModelConstructor {\r\n constructor(engine) {\r\n this.engine = engine;\r\n this.constructedData = null;\r\n }\r\n construct(sourceData) {\r\n let elementContainer = this.constructElements(sourceData), linkContainer = this.constructLinks(this.engine.linkOptions, elementContainer), pointerContainer = this.constructPointers(this.engine.pointerOptions, elementContainer);\r\n this.constructedData = {\r\n element: elementContainer,\r\n link: linkContainer,\r\n pointer: pointerContainer\r\n };\r\n return this.constructedData;\r\n }\r\n constructElements(sourceData) {\r\n let defaultElementName = 'default', elementContainer = {};\r\n if (Array.isArray(sourceData)) {\r\n elementContainer[defaultElementName] = [];\r\n sourceData.forEach(item => {\r\n if (item) {\r\n let ele = this.createElement(item, defaultElementName);\r\n elementContainer[defaultElementName].push(ele);\r\n }\r\n });\r\n }\r\n else {\r\n Object.keys(sourceData).forEach(prop => {\r\n elementContainer[prop] = [];\r\n sourceData[prop].forEach(item => {\r\n if (item) {\r\n let element = this.createElement(item, prop);\r\n elementContainer[prop].push(element);\r\n }\r\n });\r\n });\r\n }\r\n return elementContainer;\r\n }\r\n constructLinks(linkOptions, elementContainer) {\r\n let linkContainer = {}, elementList = Object\r\n .keys(elementContainer)\r\n .map(item => elementContainer[item])\r\n .reduce((prev, cur) => [...prev, ...cur]), linkNames = Object.keys(linkOptions);\r\n linkNames.forEach(name => {\r\n linkContainer[name] = [];\r\n });\r\n linkNames.forEach(name => {\r\n for (let i = 0; i < elementList.length; i++) {\r\n let element = elementList[i], sourceLinkData = element.sourceElement[name], targetElement = null, link = null;\r\n if (sourceLinkData === undefined || sourceLinkData === null) {\r\n element[name] = null;\r\n continue;\r\n }\r\n if (Array.isArray(sourceLinkData)) {\r\n element[name] = sourceLinkData.map((item, index) => {\r\n targetElement = this.fetchTargetElements(elementContainer, element, item);\r\n if (targetElement) {\r\n link = this.createLink(name, element, targetElement, index);\r\n linkContainer[name].push(link);\r\n }\r\n return targetElement;\r\n });\r\n }\r\n else {\r\n targetElement = this.fetchTargetElements(elementContainer, element, sourceLinkData);\r\n if (targetElement) {\r\n link = this.createLink(name, element, targetElement, null);\r\n linkContainer[name].push(link);\r\n }\r\n element[name] = targetElement;\r\n }\r\n }\r\n });\r\n return linkContainer;\r\n }\r\n constructPointers(pointerOptions, elementContainer) {\r\n let pointerContainer = {}, elementList = Object\r\n .keys(elementContainer)\r\n .map(item => elementContainer[item])\r\n .reduce((prev, cur) => [...prev, ...cur]), pointerNames = Object.keys(pointerOptions);\r\n pointerNames.forEach(name => {\r\n pointerContainer[name] = [];\r\n });\r\n pointerNames.forEach(name => {\r\n for (let i = 0; i < elementList.length; i++) {\r\n let element = elementList[i], pointerData = element[name];\r\n if (!pointerData)\r\n continue;\r\n let id = name + '.' + (Array.isArray(pointerData) ? pointerData.join('-') : pointerData), pointer = this.createPointer(id, name, pointerData, element);\r\n pointerContainer[name].push(pointer);\r\n }\r\n });\r\n return pointerContainer;\r\n }\r\n createElement(sourceElement, elementName) {\r\n let elementOption = this.engine.elementOptions[elementName], element = undefined, label = elementOption.label ? this.parserElementContent(sourceElement, elementOption.label) : '', id = elementName + '.' + sourceElement.id.toString();\r\n if (label === null || label === undefined) {\r\n label = '';\r\n }\r\n element = new modelData_1.Element(id, elementName, sourceElement);\r\n element.initProps(elementOption);\r\n element.set('label', label);\r\n element.sourceElement = sourceElement;\r\n return element;\r\n }\r\n createPointer(id, pointerName, pointerData, target) {\r\n let options = this.engine.pointerOptions[pointerName], pointer = undefined;\r\n pointer = new modelData_1.Pointer(id, pointerName, pointerData, target);\r\n pointer.initProps(options);\r\n return pointer;\r\n }\r\n ;\r\n createLink(linkName, element, target, index) {\r\n let options = this.engine.linkOptions[linkName], link = undefined, id = `${element.id}-${target.id}`;\r\n link = new modelData_1.Link(id, linkName, element, target, index);\r\n link.initProps(options);\r\n return link;\r\n }\r\n parserElementContent(sourceElement, formatLabel) {\r\n let fields = util_1.Util.textParser(formatLabel);\r\n if (Array.isArray(fields)) {\r\n let values = fields.map(item => sourceElement[item]);\r\n values.map((item, index) => {\r\n formatLabel = formatLabel.replace('[' + fields[index] + ']', item);\r\n });\r\n }\r\n return formatLabel;\r\n }\r\n fetchTargetElements(elementContainer, element, linkTarget) {\r\n let elementName = element.modelName, elementList, targetId = linkTarget, targetElement = null;\r\n if (linkTarget === null || linkTarget === undefined) {\r\n return null;\r\n }\r\n if (typeof linkTarget === 'string' && linkTarget.includes('#')) {\r\n let info = linkTarget.split('#');\r\n elementName = info[0];\r\n targetId = info[1];\r\n }\r\n if (typeof targetId === 'number') {\r\n targetId = targetId.toString();\r\n }\r\n elementList = elementContainer[elementName];\r\n if (elementList === undefined) {\r\n return null;\r\n }\r\n targetElement = elementList.find(item => item.sourceId === targetId);\r\n return targetElement || null;\r\n }\r\n}\r\nexports.ModelConstructor = ModelConstructor;\r\n;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvTW9kZWwvbW9kZWxDb25zdHJ1Y3Rvci50cz82Y2U0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUFzQztBQUl0QywyQ0FBcUQ7QUFPcEQsQ0FBQztBQUdGLE1BQWEsZ0JBQWdCO0lBSXpCLFlBQVksTUFBYztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBTU0sU0FBUyxDQUFDLFVBQW1CO1FBQ2hDLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUNyRCxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxFQUM5RSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUU1RixJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ25CLE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsSUFBSSxFQUFFLGFBQWE7WUFDbkIsT0FBTyxFQUFFLGdCQUFnQjtTQUM1QixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFNTyxpQkFBaUIsQ0FBQyxVQUFtQjtRQUN6QyxJQUFJLGtCQUFrQixHQUFXLFNBQVMsRUFDdEMsZ0JBQWdCLEdBQWlDLEVBQUcsQ0FBQztRQUV6RCxJQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDMUIsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdEIsSUFBRyxJQUFJLEVBQUU7b0JBQ0wsSUFBSSxHQUFHLEdBQUcsSUFBSSxD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O1NBQ2Y7UUFFRCxhQUFhLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDckUsT0FBTyxhQUFhLElBQUksSUFBSSxDQUFDO0lBQ2pDLENBQUM7Q0FDSjtBQWpSRCw0Q0FpUkM7QUFBQSxDQUFDIiwiZmlsZSI6IjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVdGlsIH0gZnJvbSBcIi4uL0NvbW1vbi91dGlsXCI7XHJcbmltcG9ydCB7IEVuZ2luZSB9IGZyb20gXCIuLi9lbmdpbmVcIjtcclxuaW1wb3J0IHsgTGlua09wdGlvbiwgUG9pbnRlck9wdGlvbiB9IGZyb20gXCIuLi9vcHRpb25zXCI7XHJcbmltcG9ydCB7IHNvdXJjZUxpbmtEYXRhLCBTb3VyY2VFbGVtZW50LCBTb3VyY2VzLCBMaW5rVGFyZ2V0IH0gZnJvbSBcIi4uL3NvdXJjZXNcIjtcclxuaW1wb3J0IHsgRWxlbWVudCwgTGluaywgUG9pbnRlciB9IGZyb20gXCIuL21vZGVsRGF0YVwiO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29uc3RydWN0ZWREYXRhIHtcclxuICAgIGVsZW1lbnQ6IHsgW2tleTogc3RyaW5nXTogRWxlbWVudFtdIH07XHJcbiAgICBsaW5rOiB7IFtrZXk6IHN0cmluZ106IExpbmtbXSB9O1xyXG4gICAgcG9pbnRlcjogeyBba2V5OiBzdHJpbmddOiBQb2ludGVyW10gfTtcclxufTtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTW9kZWxDb25zdHJ1Y3RvciB7XHJcbiAgICBwcml2YXRlIGVuZ2luZTogRW5naW5lO1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RlZERhdGE6IENvbnN0cnVjdGVkRGF0YTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihlbmdpbmU6IEVuZ2luZSkge1xyXG4gICAgICAgIHRoaXMuZW5naW5lID0gZW5naW5lO1xyXG4gICAgICAgIHRoaXMuY29uc3RydWN0ZWREYXRhID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaehOW7umVsZW1lbnTvvIxsaW5r5ZKMcG9pbnRlclxyXG4gICAgICogQHBhcmFtIHNvdXJjZURhdGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Qoc291cmNlRGF0YTogU291cmNlcyk6IENvbnN0cnVjdGVkRGF0YSB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRDb250YWluZXIgPSB0aGlzLmNvbnN0cnVjdEVsZW1lbnRzKHNvdXJjZURhdGEpLFxyXG4gICAgICAgICAgICBsaW5rQ29udGFpbmVyID0gdGhpcy5jb25zdHJ1Y3RMaW5rcyh0aGlzLmVuZ2luZS5saW5rT3B0aW9ucywgZWxlbWVudENvbnRhaW5lciksXHJcbiAgICAgICAgICAgIHBvaW50ZXJDb250YWluZXIgPSB0aGlzLmNvbnN0cnVjdFBvaW50ZXJzKHRoaXMuZW5naW5lLnBvaW50ZXJPcHRpb25zLCBlbGVtZW50Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RlZERhdGEgPSB7IFxyXG4gICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50Q29udGFpbmVyLFxyXG4gICAgICAgICAgICBsaW5rOiBsaW5rQ29udGFpbmVyLFxyXG4gICAgICAgICAgICBwb2ludGVyOiBwb2ludGVyQ29udGFpbmVyXHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RlZERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47mupDmlbDmja7mnoTlu7ogZWxlbWVudCDpm4ZcclxuICAgICAqIEBwYXJhbSBzb3VyY2VEYXRhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uc3RydWN0RWxlbWVudHMoc291cmNlRGF0YTogU291cmNlcyk6IHsgW2tleTogc3RyaW5nXTogRWxlbWVudFtdIH0ge1xyXG4gICAgICAgIGxldCBkZWZhdWx0RWxlbWVudE5hbWU6IHN0cmluZyA9ICdkZWZhdWx0JyxcclxuICAgICAgICAgICAgZWxlbWVudENvbnRhaW5lcjogeyBba2V5OiBzdHJpbmddOiBFbGVtZW50W10gfSA9IHsgfTtcclxuXHJcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShzb3VyY2VEYXRhKSkge1xyXG4gICAgICAgICAgICBlbGVtZW50Q29udGFpbmVyW2RlZmF1bHRFbGVtZW50TmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgc291cmNlRGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGUgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoaXRlbSwgZGVmYXVsdEVsZW1lbnROYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50Q29udGFpbmVyW2RlZmF1bHRFbGVtZW50TmFtZV0ucHVzaChlbGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHNvdXJjZURhdGEpLmZvckVhY2gocHJvcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50Q29udGFpbmVyW3Byb3BdID0gW107XHJcbiAgICAgICAgICAgICAgICBzb3VyY2VEYXRhW3Byb3BdLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChpdGVtLCBwcm9wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudENvbnRhaW5lcltwcm9wXS5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbGVtZW50Q29udGFpbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO6YWN572u5ZKMIGVsZW1lbnQg6ZuG5p6E5bu6IGxpbmsg6ZuGXHJcbiAgICAgKiBAcGFyYW0gbGlua09wdGlvbnMgXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudENvbnRhaW5lciBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdExpbmtzKGxpbmtPcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IExpbmtPcHRpb24gfSwgZWxlbWVudENvbnRhaW5lcjogeyBba2V5OiBzdHJpbmddOiBFbGVtZW50W10gfSk6IHsgW2tleTogc3RyaW5nXTogTGlua1tdIH0ge1xyXG4gICAgICAgIGxldCBsaW5rQ29udGFpbmVyOiB7IFtrZXk6IHN0cmluZ106IExpbmtbXSB9ID0geyB9LFxyXG4gICAgICAgICAgICBlbGVtZW50TGlzdDogRWxlbWVudFtdID0gT2JqZWN0XHJcbiAgICAgICAgICAgICAgICAua2V5cyhlbGVtZW50Q29udGFpbmVyKVxyXG4gICAgICAgICAgICAgICAgLm1hcChpdGVtID0+IGVsZW1lbnRDb250YWluZXJbaXRlbV0pXHJcbiAgICAgICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXIpID0+IFsuLi5wcmV2LCAuLi5jdXJdKSxcclxuICAgICAgICAgICAgbGlua05hbWVzID0gT2JqZWN0LmtleXMobGlua09wdGlvbnMpO1xyXG5cclxuICAgICAgICBsaW5rTmFtZXMuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgICAgICAgbGlua0NvbnRhaW5lcltuYW1lXSA9IFtdO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsaW5rTmFtZXMuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGVsZW1lbnRMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudDogRWxlbWVudCA9IGVsZW1lbnRMaXN0W2ldLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUxpbmtEYXRhOiBzb3VyY2VMaW5rRGF0YSA9IGVsZW1lbnQuc291cmNlRWxlbWVudFtuYW1lXSxcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50OiBFbGVtZW50IHwgRWxlbWVudFtdID0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBsaW5rOiBMaW5rID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZihzb3VyY2VMaW5rRGF0YSA9PT0gdW5kZWZpbmVkIHx8IHNvdXJjZUxpbmtEYXRhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFtuYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0g5bCG6L+e5o6l5aOw5piO5a2X5q61IHNvdXJjZUxpbmtEYXRhIOS7jiBpZCDlj5jkuLogRWxlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHNvdXJjZUxpbmtEYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbbmFtZV0gPSBzb3VyY2VMaW5rRGF0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEVsZW1lbnQgPSB0aGlzLmZldGNoVGFyZ2V0RWxlbWVudHMoZWxlbWVudENvbnRhaW5lciwgZWxlbWVudCwgaXRlbSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0YXJnZXRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rID0gdGhpcy5jcmVhdGVMaW5rKG5hbWUsIGVsZW1lbnQsIHRhcmdldEVsZW1lbnQsIGluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtDb250YWluZXJbbmFtZV0ucHVzaChsaW5rKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50ID0gdGhpcy5mZXRjaFRhcmdldEVsZW1lbnRzKGVsZW1lbnRDb250YWluZXIsIGVsZW1lbnQsIHNvdXJjZUxpbmtEYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGFyZ2V0RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rID0gdGhpcy5jcmVhdGVMaW5rKG5hbWUsIGVsZW1lbnQsIHRhcmdldEVsZW1lbnQsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rQ29udGFpbmVyW25hbWVdLnB1c2gobGluayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50W25hbWVdID0gdGFyZ2V0RWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbGlua0NvbnRhaW5lcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS7jumFjee9ruWSjCBlbGVtZW50IOmbhuaehOW7uiBwb2ludGVyIOmbhlxyXG4gICAgICogQHBhcmFtIHBvaW50ZXJPcHRpb25zIFxyXG4gICAgICogQHBhcmFtIGVsZW1lbnRDb250YWluZXIgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RQb2ludGVycyhwb2ludGVyT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBQb2ludGVyT3B0aW9uIH0sIGVsZW1lbnRDb250YWluZXI6IHsgW2tleTogc3RyaW5nXTogRWxlbWVudFtdIH0pOiB7IFtrZXk6IHN0cmluZ106IFBvaW50ZXJbXSB9IHtcclxuICAgICAgICBsZXQgcG9pbnRlckNvbnRhaW5lcjogeyBba2V5OiBzdHJpbmddOiBQb2ludGVyW10gfSA9IHsgfSxcclxuICAgICAgICAgICAgZWxlbWVudExpc3Q6IEVsZW1lbnRbXSA9IE9iamVjdFxyXG4gICAgICAgICAgICAgICAgLmtleXMoZWxlbWVudENvbnRhaW5lcilcclxuICAgICAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBlbGVtZW50Q29udGFpbmVyW2l0ZW1dKVxyXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgocHJldiwgY3VyKSA9PiBbLi4ucHJldiwgLi4uY3VyXSksXHJcbiAgICAgICAgICAgIHBvaW50ZXJOYW1lcyA9IE9iamVjdC5rZXlzKHBvaW50ZXJPcHRpb25zKTtcclxuXHJcbiAgICAgICAgcG9pbnRlck5hbWVzLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgICAgIHBvaW50ZXJDb250YWluZXJbbmFtZV0gPSBbXTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcG9pbnRlck5hbWVzLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGVsZW1lbnRMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGVsZW1lbnRMaXN0W2ldLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXJEYXRhID0gZWxlbWVudFtuYW1lXTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8g6Iul5rKh5pyJ5oyH6ZKI5a2X5q6155qE57uT54K55YiZ6Lez6L+HXHJcbiAgICAgICAgICAgICAgICBpZighcG9pbnRlckRhdGEpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpZCA9IG5hbWUgKyAnLicgKyAoQXJyYXkuaXNBcnJheShwb2ludGVyRGF0YSk/IHBvaW50ZXJEYXRhLmpvaW4oJy0nKTogcG9pbnRlckRhdGEpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgPSB0aGlzLmNyZWF0ZVBvaW50ZXIoaWQsIG5hbWUsIHBvaW50ZXJEYXRhLCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICBwb2ludGVyQ29udGFpbmVyW25hbWVdLnB1c2gocG9pbnRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBvaW50ZXJDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlhYPntKDlt6XljoLvvIzliJvlu7pFbGVtZW50XHJcbiAgICAgKiBAcGFyYW0gc291cmNlRWxlbWVudFxyXG4gICAgICogQHBhcmFtIGVsZW1lbnROYW1lXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRWxlbWVudChzb3VyY2VFbGVtZW50OiBTb3VyY2VFbGVtZW50LCBlbGVtZW50TmFtZTogc3RyaW5nKTogRWxlbWVudCB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRPcHRpb24gPSB0aGlzLmVuZ2luZS5lbGVtZW50T3B0aW9uc1tlbGVtZW50TmFtZV0sXHJcbiAgICAgICAgICAgIGVsZW1lbnQ6IEVsZW1lbnQgPSB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGxhYmVsID0gZWxlbWVudE9wdGlvbi5sYWJlbD8gdGhpcy5wYXJzZXJFbGVtZW50Q29udGVudChzb3VyY2VFbGVtZW50LCBlbGVtZW50T3B0aW9uLmxhYmVsKTogJycsXHJcbiAgICAgICAgICAgIGlkID0gIGVsZW1lbnROYW1lICsgJy4nICsgc291cmNlRWxlbWVudC5pZC50b1N0cmluZygpO1xyXG5cclxuICAgICAgICBpZihsYWJlbCA9PT0gbnVsbCB8fCBsYWJlbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxhYmVsID0gJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoaWQsIGVsZW1lbnROYW1lLCBzb3VyY2VFbGVtZW50KTtcclxuICAgICAgICBlbGVtZW50LmluaXRQcm9wcyhlbGVtZW50T3B0aW9uKTtcclxuICAgICAgICBlbGVtZW50LnNldCgnbGFiZWwnLCBsYWJlbCk7XHJcbiAgICAgICAgZWxlbWVudC5zb3VyY2VFbGVtZW50ID0gc291cmNlRWxlbWVudDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlpJbpg6jmjIfpkojlt6XljoLvvIzliJvlu7pQb2ludGVyXHJcbiAgICAgKiBAcGFyYW0gaWQgXHJcbiAgICAgKiBAcGFyYW0gcG9pbnRlck5hbWUgXHJcbiAgICAgKiBAcGFyYW0gbGFiZWwgXHJcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVBvaW50ZXIoaWQ6IHN0cmluZywgcG9pbnRlck5hbWU6IHN0cmluZywgcG9pbnRlckRhdGE6IHN0cmluZyB8IHN0cmluZ1tdLCB0YXJnZXQ6IEVsZW1lbnQpOiBQb2ludGVyIHtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMuZW5naW5lLnBvaW50ZXJPcHRpb25zW3BvaW50ZXJOYW1lXSxcclxuICAgICAgICAgICAgcG9pbnRlciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgcG9pbnRlciA9IG5ldyBQb2ludGVyKGlkLCBwb2ludGVyTmFtZSwgcG9pbnRlckRhdGEsIHRhcmdldCk7XHJcbiAgICAgICAgcG9pbnRlci5pbml0UHJvcHMob3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHJldHVybiBwb2ludGVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOi/nue6v+W3peWOgu+8jOWIm+W7ukxpbmtcclxuICAgICAqIEBwYXJhbSBsaW5rTmFtZSBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxyXG4gICAgICogQHBhcmFtIHRhcmdldCBcclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVMaW5rKGxpbmtOYW1lOiBzdHJpbmcsIGVsZW1lbnQ6IEVsZW1lbnQsIHRhcmdldDogRWxlbWVudCwgaW5kZXg6IG51bWJlcik6IExpbmsge1xyXG4gICAgICAgIGxldCBvcHRpb25zOiBMaW5rT3B0aW9uID0gdGhpcy5lbmdpbmUubGlua09wdGlvbnNbbGlua05hbWVdLFxyXG4gICAgICAgICAgICBsaW5rID0gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBpZCA9IGAke2VsZW1lbnQuaWR9LSR7dGFyZ2V0LmlkfWA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGluayA9IG5ldyBMaW5rKGlkLCBsaW5rTmFtZSwgZWxlbWVudCwgdGFyZ2V0LCBpbmRleCk7XHJcbiAgICAgICAgbGluay5pbml0UHJvcHMob3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHJldHVybiBsaW5rO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Kej5p6Q5YWD57Sg5paH5pys5YaF5a65XHJcbiAgICAgKiBAcGFyYW0gc291cmNlRWxlbWVudFxyXG4gICAgICogQHBhcmFtIGZvcm1hdExhYmVsXHJcbiAgICAgKi9cclxuICAgICBwcml2YXRlIHBhcnNlckVsZW1lbnRDb250ZW50KHNvdXJjZUVsZW1lbnQ6IFNvdXJjZUVsZW1lbnQsIGZvcm1hdExhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBmaWVsZHMgPSBVdGlsLnRleHRQYXJzZXIoZm9ybWF0TGFiZWwpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZmllbGRzKSkge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWVzID0gZmllbGRzLm1hcChpdGVtID0+IHNvdXJjZUVsZW1lbnRbaXRlbV0pO1xyXG5cclxuICAgICAgICAgICAgdmFsdWVzLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdExhYmVsID0gZm9ybWF0TGFiZWwucmVwbGFjZSgnWycgKyBmaWVsZHNbaW5kZXhdICsgJ10nLCBpdGVtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZm9ybWF0TGFiZWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnlLFzb3VyY2XkuK3nmoTov57mjqXlrZfmrrXojrflj5bnnJ/lrp7nmoTov57mjqXnm67moIflhYPntKBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50Q29udGFpbmVyXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudFxyXG4gICAgICogQHBhcmFtIGxpbmtUYXJnZXQgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmV0Y2hUYXJnZXRFbGVtZW50cyhcclxuICAgICAgICBlbGVtZW50Q29udGFpbmVyOiB7IFtrZXk6IHN0cmluZ106IEVsZW1lbnRbXSB9ICwgXHJcbiAgICAgICAgZWxlbWVudDogRWxlbWVudCwgXHJcbiAgICAgICAgbGlua1RhcmdldDogTGlua1RhcmdldFxyXG4gICAgKTogRWxlbWVudCB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnROYW1lID0gZWxlbWVudC5tb2RlbE5hbWUsXHJcbiAgICAgICAgICAgIGVsZW1lbnRMaXN0OiBFbGVtZW50W10sIFxyXG4gICAgICAgICAgICB0YXJnZXRJZCA9IGxpbmtUYXJnZXQsXHJcbiAgICAgICAgICAgIHRhcmdldEVsZW1lbnQgPSBudWxsO1xyXG5cclxuICAgICAgICBpZihsaW5rVGFyZ2V0ID09PSBudWxsIHx8IGxpbmtUYXJnZXQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHR5cGVvZiBsaW5rVGFyZ2V0ID09PSAnc3RyaW5nJyAmJiBsaW5rVGFyZ2V0LmluY2x1ZGVzKCcjJykpIHtcclxuICAgICAgICAgICAgbGV0IGluZm8gPSBsaW5rVGFyZ2V0LnNwbGl0KCcjJyk7XHJcbiAgICAgICAgICAgIGVsZW1lbnROYW1lID0gaW5mb1swXTtcclxuICAgICAgICAgICAgdGFyZ2V0SWQgPSBpbmZvWzFdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodHlwZW9mIHRhcmdldElkID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICB0YXJnZXRJZCA9IHRhcmdldElkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGVsZW1lbnRMaXN0ID0gZWxlbWVudENvbnRhaW5lcltlbGVtZW50TmFtZV07XHJcblxyXG4gICAgICAgIC8vIOiLpeebruagh2VsZW1lbnTkuI3lrZjlnKjvvIzov5Tlm55udWxsXHJcbiAgICAgICAgaWYoZWxlbWVudExpc3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGFyZ2V0RWxlbWVudCA9IGVsZW1lbnRMaXN0LmZpbmQoaXRlbSA9PiBpdGVtLnNvdXJjZUlkID09PSB0YXJnZXRJZCk7XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldEVsZW1lbnQgfHwgbnVsbDtcclxuICAgIH1cclxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Pointer = exports.Link = exports.Element = exports.Model = void 0;\r\nconst util_1 = __webpack_require__(0);\r\nconst StructV_1 = __webpack_require__(2);\r\n;\r\n;\r\nclass Model {\r\n constructor(id, name) {\r\n this.id = id;\r\n this.modelName = name;\r\n this.shadowG6Item = null;\r\n this.renderG6Item = null;\r\n this.G6Item = null;\r\n this.props = {};\r\n }\r\n defineProps(option) {\r\n return null;\r\n }\r\n initProps(option) {\r\n this.props = this.defineProps(option);\r\n }\r\n cloneProps() {\r\n return util_1.Util.objectClone(this.props);\r\n }\r\n get(attr) {\r\n return this.props[attr];\r\n }\r\n set(attr, value) {\r\n if (typeof attr === 'object') {\r\n Object.keys(attr).map(item => {\r\n this.set(item, attr[item]);\r\n });\r\n return;\r\n }\r\n if (this.props[attr] === undefined) {\r\n return;\r\n }\r\n if (this.props[attr] === value) {\r\n return;\r\n }\r\n if (attr === 'style' || attr === 'labelCfg') {\r\n Object.assign(this.props[attr], value);\r\n }\r\n else {\r\n this.props[attr] = value;\r\n }\r\n if (this.G6Item === null) {\r\n return;\r\n }\r\n if (attr === 'rotation') {\r\n const matrix = util_1.Util.calcRotateMatrix(this.getMatrix(), value);\r\n this.set('style', { matrix });\r\n }\r\n else if (attr === 'x' || attr === 'y') {\r\n this.G6Item.updatePosition({\r\n [attr]: value\r\n });\r\n }\r\n else {\r\n this.G6Item.update(this.props);\r\n }\r\n }\r\n getBound() {\r\n return this.G6Item.getBBox();\r\n }\r\n getMatrix() {\r\n if (this.G6Item === null)\r\n return null;\r\n const Mat3 = StructV_1.SV.G6.Util.mat3;\r\n return Mat3.create();\r\n }\r\n}\r\nexports.Model = Model;\r\nclass Element extends Model {\r\n constructor(id, type, sourceElement) {\r\n super(id, type);\r\n this.modelType = 'element';\r\n Object.keys(sourceElement).map(prop => {\r\n if (prop !== 'id') {\r\n this[prop] = sourceElement[prop];\r\n }\r\n });\r\n this.sourceId = this.id.split('.')[1];\r\n this.free = false;\r\n }\r\n defineProps(option) {\r\n return {\r\n id: this.id,\r\n x: 0,\r\n y: 0,\r\n rotation: option.rotation || 0,\r\n type: option.type,\r\n size: option.size,\r\n anchorPoints: option.anchorPoint,\r\n label: null,\r\n style: util_1.Util.objectClone(option.style),\r\n labelCfg: util_1.Util.objectClone(option.labelOptions),\r\n externalPointerId: null,\r\n modelType: this.modelType,\r\n modelName: this.modelName\r\n };\r\n }\r\n}\r\nexports.Element = Element;\r\n;\r\nclass Link extends Model {\r\n constructor(id, type, element, target, index) {\r\n super(id, type);\r\n this.modelType = 'link';\r\n this.element = element;\r\n this.target = target;\r\n this.index = index;\r\n }\r\n defineProps(option) {\r\n let sourceAnchor = option.sourceAnchor, targetAnchor = option.targetAnchor;\r\n if (option.sourceAnchor && typeof option.sourceAnchor === 'function' && this.index !== null) {\r\n sourceAnchor = option.sourceAnchor(this.index);\r\n }\r\n if (option.targetAnchor && typeof option.targetAnchor === 'function' && this.index !== null) {\r\n targetAnchor = option.targetAnchor(this.index);\r\n }\r\n return {\r\n id: this.id,\r\n type: option.type,\r\n source: this.element.id,\r\n target: this.target.id,\r\n sourceAnchor,\r\n targetAnchor,\r\n label: option.label,\r\n style: util_1.Util.objectClone(option.style),\r\n labelCfg: util_1.Util.objectClone(option.labelOptions),\r\n controlPoints: option.controlPoints,\r\n curveOffset: option.curveOffset,\r\n modelType: this.modelType,\r\n modelName: this.modelName,\r\n zIndex: 20\r\n };\r\n }\r\n}\r\nexports.Link = Link;\r\n;\r\nclass Pointer extends Model {\r\n constructor(id, type, label, target) {\r\n super(id, type);\r\n this.modelType = 'pointer';\r\n this.target = target;\r\n this.label = label;\r\n this.target.set('externalPointerId', id);\r\n }\r\n defineProps(option) {\r\n return {\r\n id: this.id,\r\n x: 0,\r\n y: 0,\r\n rotation: 0,\r\n type: option.type || 'external-pointer',\r\n size: option.size,\r\n anchorPoints: option.anchorPoint,\r\n label: typeof this.label === 'string' ? this.label : this.label.join(', '),\r\n style: util_1.Util.objectClone(option.style),\r\n labelCfg: util_1.Util.objectClone(option.labelOptions),\r\n externalPointerId: null,\r\n modelType: this.modelType,\r\n modelName: this.modelName\r\n };\r\n }\r\n}\r\nexports.Pointer = Pointer;\r\n;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvTW9kZWwvbW9kZWxEYXRhLnRzPzQ5OGYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0NBQXNDO0FBSXRDLHlDQUFrQztBQWlCakMsQ0FBQztBQWVELENBQUM7QUFHRixNQUFhLEtBQUs7SUFVZCxZQUFZLEVBQVUsRUFBRSxJQUFZO1FBQ2hDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBOEIsRUFBRyxDQUFDO0lBQ2hELENBQUM7SUFPUyxXQUFXLENBQUMsTUFBa0Q7UUFDcEUsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQU1ELFNBQVMsQ0FBQyxNQUFrRDtRQUN4RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQU1ELFVBQVU7UUFDTixPQUFPLFdBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXhDLENBQUM7SUFNRCxHQUFHLENBQUMsSUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBUUQsR0FBRyxDQUFDLElBQXFCLEVBQUUsS0FBVztRQUNsQyxJQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFD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QUMsRUFBRSxDQUFDO1lBQ0osUUFBUSxFQUFFLENBQUM7WUFDWCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxrQkFBa0I7WUFDdkMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pCLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVztZQUNoQyxLQUFLLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDeEUsS0FBSyxFQUFFLFdBQUksQ0FBQyxXQUFXLENBQVEsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUM1QyxRQUFRLEVBQUUsV0FBSSxDQUFDLFdBQVcsQ0FBcUIsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUNuRSxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDNUIsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQS9CRCwwQkErQkM7QUFBQSxDQUFDIiwiZmlsZSI6IjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVdGlsIH0gZnJvbSBcIi4uL0NvbW1vbi91dGlsXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRMYWJlbE9wdGlvbiwgRWxlbWVudE9wdGlvbiwgTGlua0xhYmVsT3B0aW9uLCBMaW5rT3B0aW9uLCBQb2ludGVyT3B0aW9uLCBTdHlsZSB9IGZyb20gXCIuLi9vcHRpb25zXCI7XHJcbmltcG9ydCB7IFNvdXJjZUVsZW1lbnQgfSBmcm9tIFwiLi4vc291cmNlc1wiO1xyXG5pbXBvcnQgeyBCb3VuZGluZ1JlY3QgfSBmcm9tIFwiLi4vVmlldy9ib3VuZGluZ1JlY3RcIjtcclxuaW1wb3J0IHsgU1YgfSBmcm9tICcuLy4uL1N0cnVjdFYnO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRzZOb2RlTW9kZWwge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIHg6IG51bWJlcjtcclxuICAgIHk6IG51bWJlcjtcclxuICAgIHJvdGF0aW9uOiBudW1iZXI7XHJcbiAgICB0eXBlOiBzdHJpbmc7XHJcbiAgICBzaXplOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdO1xyXG4gICAgYW5jaG9yUG9pbnRzOiBbbnVtYmVyLCBudW1iZXJdO1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHN0eWxlOiBTdHlsZTtcclxuICAgIGxhYmVsQ2ZnOiBFbGVtZW50TGFiZWxPcHRpb247XHJcbiAgICBleHRlcm5hbFBvaW50ZXJJZDogc3RyaW5nOyBcclxuICAgIG1vZGVsVHlwZTogc3RyaW5nO1xyXG4gICAgbW9kZWxOYW1lOiBzdHJpbmc7XHJcbn07XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHNkVkZ2VNb2RlbCB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgc291cmNlOiBzdHJpbmcgfCBudW1iZXI7XHJcbiAgICB0YXJnZXQ6IHN0cmluZyB8IG51bWJlcjtcclxuICAgIHR5cGU6IHN0cmluZztcclxuICAgIGNvbnRyb2xQb2ludHM6IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfVtdO1xyXG4gICAgY3VydmVPZmZzZXQ6IG51bWJlcjtcclxuICAgIHNvdXJjZUFuY2hvcjogbnVtYmVyIHwgKChpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpO1xyXG4gICAgdGFyZ2V0QW5jaG9yOiBudW1iZXIgfCAoKGluZGV4OiBudW1iZXIpID0+IG51bWJlcik7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgc3R5bGU6IFN0eWxlO1xyXG4gICAgbGFiZWxDZmc6IExpbmtMYWJlbE9wdGlvbjtcclxufTtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTW9kZWwge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIG1vZGVsTmFtZTogc3RyaW5nO1xyXG4gICAgbW9kZWxUeXBlOiBzdHJpbmc7XHJcblxyXG4gICAgcHJvcHM6IEc2Tm9kZU1vZGVsIHwgRzZFZGdlTW9kZWw7XHJcbiAgICBzaGFkb3dHNkl0ZW07XHJcbiAgICByZW5kZXJHNkl0ZW07XHJcbiAgICBHNkl0ZW07XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7IFxyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLm1vZGVsTmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5zaGFkb3dHNkl0ZW0gPSBudWxsO1xyXG4gICAgICAgIHRoaXMucmVuZGVyRzZJdGVtID0gbnVsbDtcclxuICAgICAgICB0aGlzLkc2SXRlbSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wcm9wcyA9IDxHNk5vZGVNb2RlbCB8IEc2RWRnZU1vZGVsPnsgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBvdmVycmlkZVxyXG4gICAgICog5a6a5LmJIEc2IG1vZGVsIOeahOWxnuaAp1xyXG4gICAgICogQHBhcmFtIG9wdGlvbiBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGRlZmluZVByb3BzKG9wdGlvbjogRWxlbWVudE9wdGlvbiB8IExpbmtPcHRpb24gfCBQb2ludGVyT3B0aW9uKTogRzZOb2RlTW9kZWwgfCBHNkVkZ2VNb2RlbCB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJ3lp4vljJYgRzYgbW9kZWwg55qE5bGe5oCnXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFxyXG4gICAgICovXHJcbiAgICBpbml0UHJvcHMob3B0aW9uOiBFbGVtZW50T3B0aW9uIHwgTGlua09wdGlvbiB8IFBvaW50ZXJPcHRpb24pIHsgXHJcbiAgICAgICAgdGhpcy5wcm9wcyA9IHRoaXMuZGVmaW5lUHJvcHMob3B0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWFi+mahiBHNiBtb2RlbCDnmoTlsZ7mgKdcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBjbG9uZVByb3BzKCk6IEc2Tm9kZU1vZGVsIHwgRzZFZGdlTW9kZWwge1xyXG4gICAgICAgIHJldHVybiBVdGlsLm9iamVjdENsb25lKHRoaXMucHJvcHMpO1xyXG4gICAgICAgIC8vIHJldHVybiB0aGlzLnByb3BzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+WIEc2IG1vZGVsIOeahOWxnuaAp1xyXG4gICAgICogQHBhcmFtIGF0dHIgXHJcbiAgICAgKi9cclxuICAgIGdldChhdHRyOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzW2F0dHJdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6+572uIEc2IG1vZGVsIOeahOWxnuaAp1xyXG4gICAgICogQHBhcmFtIGF0dHIgXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgc2V0KGF0dHI6IHN0cmluZyB8IG9iamVjdCwgdmFsdWU/OiBhbnkpIHtcclxuICAgICAgICBpZih0eXBlb2YgYXR0ciA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMoYXR0cikubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoaXRlbSwgYXR0cltpdGVtXSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLnByb3BzW2F0dHJdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodGhpcy5wcm9wc1thdHRyXSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoYXR0ciA9PT0gJ3N0eWxlJyB8fCBhdHRyID09PSAnbGFiZWxDZmcnKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wcm9wc1thdHRyXSwgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9wc1thdHRyXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodGhpcy5HNkl0ZW0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoYXR0ciA9PT0gJ3JvdGF0aW9uJykge1xyXG4gICAgICAgICAgICBjb25zdCBtYXRyaXggPSBVdGlsLmNhbGNSb3RhdGVNYXRyaXgodGhpcy5nZXRNYXRyaXgoKSwgdmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNldCgnc3R5bGUnLCB7IG1hdHJpeCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihhdHRyID09PSAneCcgfHwgYXR0ciA9PT0gJ3knKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRzZJdGVtLnVwZGF0ZVBvc2l0aW9uKHtcclxuICAgICAgICAgICAgICAgIFthdHRyXTogdmFsdWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkc2SXRlbS51cGRhdGUodGhpcy5wcm9wcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5YyF5Zu055uSXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgZ2V0Qm91bmQoKTogQm91bmRpbmdSZWN0IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HNkl0ZW0uZ2V0QkJveCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5Y+Y5o2i55+p6Zi1XHJcbiAgICAgKi9cclxuICAgIGdldE1hdHJpeCgpOiBudW1iZXJbXSB7XHJcbiAgICAgICAgaWYodGhpcy5HNkl0ZW0gPT09IG51bGwpIHJldHVybiBudWxsO1xyXG4gICAgICAgIC8vIHJldHVybiB0aGlzLkc2SXRlbS5nZXRDb250YWluZXIoKS5nZXRNYXRyaXgoKTtcclxuICAgICAgICBjb25zdCBNYXQzID0gU1YuRzYuVXRpbC5tYXQzO1xyXG4gICAgICAgIHJldHVybiBNYXQzLmNyZWF0ZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIEVsZW1lbnQgZXh0ZW5kcyBNb2RlbCB7XHJcbiAgICBtb2RlbFR5cGUgPSAnZWxlbWVudCc7XHJcbiAgICBzb3VyY2VFbGVtZW50OiBTb3VyY2VFbGVtZW50O1xyXG4gICAgc291cmNlSWQ6IHN0cmluZztcclxuICAgIGZyZWU6IGJvb2xlYW47XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBzb3VyY2VFbGVtZW50OiBTb3VyY2VFbGVtZW50KSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIHR5cGUpO1xyXG5cclxuICAgICAgICBPYmplY3Qua2V5cyhzb3VyY2VFbGVtZW50KS5tYXAocHJvcCA9PiB7XHJcbiAgICAgICAgICAgIGlmKHByb3AgIT09ICdpZCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSBzb3VyY2VFbGVtZW50W3Byb3BdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc291cmNlSWQgPSB0aGlzLmlkLnNwbGl0KCcuJylbMV07XHJcbiAgICAgICAgdGhpcy5mcmVlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRlZmluZVByb3BzKG9wdGlvbjogRWxlbWVudE9wdGlvbikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICByb3RhdGlvbjogb3B0aW9uLnJvdGF0aW9uIHx8IDAsXHJcbiAgICAgICAgICAgIHR5cGU6IG9wdGlvbi50eXBlLFxyXG4gICAgICAgICAgICBzaXplOiBvcHRpb24uc2l6ZSxcclxuICAgICAgICAgICAgYW5jaG9yUG9pbnRzOiBvcHRpb24uYW5jaG9yUG9pbnQsXHJcbiAgICAgICAgICAgIGxhYmVsOiBudWxsLFxyXG4gICAgICAgICAgICBzdHlsZTogVXRpbC5vYmplY3RDbG9uZTxTdHlsZT4ob3B0aW9uLnN0eWxlKSxcclxuICAgICAgICAgICAgbGFiZWxDZmc6IFV0aWwub2JqZWN0Q2xvbmU8RWxlbWVudExhYmVsT3B0aW9uPihvcHRpb24ubGFiZWxPcHRpb25zKSxcclxuICAgICAgICAgICAgZXh0ZXJuYWxQb2ludGVySWQ6IG51bGwsXHJcbiAgICAgICAgICAgIG1vZGVsVHlwZTogdGhpcy5tb2RlbFR5cGUsXHJcbiAgICAgICAgICAgIG1vZGVsTmFtZTogdGhpcy5tb2RlbE5hbWVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTGluayBleHRlbmRzIE1vZGVsIHsgXHJcbiAgICBtb2RlbFR5cGUgPSAnbGluayc7XHJcbiAgICBlbGVtZW50OiBFbGVtZW50O1xyXG4gICAgdGFyZ2V0OiBFbGVtZW50O1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGVsZW1lbnQ6IEVsZW1lbnQsIHRhcmdldDogRWxlbWVudCwgaW5kZXg6IG51bWJlcikgeyBcclxuICAgICAgICBzdXBlcihpZCwgdHlwZSk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByb3RlY3RlZCBkZWZpbmVQcm9wcyhvcHRpb246IExpbmtPcHRpb24pIHtcclxuICAgICAgICBsZXQgc291cmNlQW5jaG9yID0gb3B0aW9uLnNvdXJjZUFuY2hvciwgXHJcbiAgICAgICAgICAgIHRhcmdldEFuY2hvciA9IG9wdGlvbi50YXJnZXRBbmNob3I7XHJcblxyXG4gICAgICAgIGlmKG9wdGlvbi5zb3VyY2VBbmNob3IgJiYgdHlwZW9mIG9wdGlvbi5zb3VyY2VBbmNob3IgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5pbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBzb3VyY2VBbmNob3IgPSBvcHRpb24uc291cmNlQW5jaG9yKHRoaXMuaW5kZXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYob3B0aW9uLnRhcmdldEFuY2hvciAmJiB0eXBlb2Ygb3B0aW9uLnRhcmdldEFuY2hvciA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLmluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRhcmdldEFuY2hvciA9IG9wdGlvbi50YXJnZXRBbmNob3IodGhpcy5pbmRleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcclxuICAgICAgICAgICAgdHlwZTogb3B0aW9uLnR5cGUsXHJcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5lbGVtZW50LmlkLFxyXG4gICAgICAgICAgICB0YXJnZXQ6IHRoaXMudGFyZ2V0LmlkLFxyXG4gICAgICAgICAgICBzb3VyY2VBbmNob3IsXHJcbiAgICAgICAgICAgIHRhcmdldEFuY2hvcixcclxuICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCxcclxuICAgICAgICAgICAgc3R5bGU6IFV0aWwub2JqZWN0Q2xvbmU8U3R5bGU+KG9wdGlvbi5zdHlsZSksXHJcbiAgICAgICAgICAgIGxhYmVsQ2ZnOiBVdGlsLm9iamVjdENsb25lPExpbmtMYWJlbE9wdGlvbj4ob3B0aW9uLmxhYmVsT3B0aW9ucyksXHJcbiAgICAgICAgICAgIGNvbnRyb2xQb2ludHM6IG9wdGlvbi5jb250cm9sUG9pbnRzLFxyXG4gICAgICAgICAgICBjdXJ2ZU9mZnNldDogb3B0aW9uLmN1cnZlT2Zmc2V0LFxyXG4gICAgICAgICAgICBtb2RlbFR5cGU6IHRoaXMubW9kZWxUeXBlLFxyXG4gICAgICAgICAgICBtb2RlbE5hbWU6IHRoaXMubW9kZWxOYW1lLFxyXG4gICAgICAgICAgICB6SW5kZXg6IDIwXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFBvaW50ZXIgZXh0ZW5kcyBNb2RlbCB7XHJcbiAgICBtb2RlbFR5cGUgPSAncG9pbnRlcic7XHJcbiAgICB0YXJnZXQ6IEVsZW1lbnQ7XHJcbiAgICBsYWJlbDogc3RyaW5nIHwgc3RyaW5nW107XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBsYWJlbDogc3RyaW5nIHwgc3RyaW5nW10sIHRhcmdldDogRWxlbWVudCkge1xyXG4gICAgICAgIHN1cGVyKGlkLCB0eXBlKTtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XHJcblxyXG4gICAgICAgIHRoaXMudGFyZ2V0LnNldCgnZXh0ZXJuYWxQb2ludGVySWQnLCBcclxuICAgICAgICBpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRlZmluZVByb3BzKG9wdGlvbjogRWxlbWVudE9wdGlvbikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICByb3RhdGlvbjogMCxcclxuICAgICAgICAgICAgdHlwZTogb3B0aW9uLnR5cGUgfHwgJ2V4dGVybmFsLXBvaW50ZXInLFxyXG4gICAgICAgICAgICBzaXplOiBvcHRpb24uc2l6ZSxcclxuICAgICAgICAgICAgYW5jaG9yUG9pbnRzOiBvcHRpb24uYW5jaG9yUG9pbnQsXHJcbiAgICAgICAgICAgIGxhYmVsOiB0eXBlb2YgdGhpcy5sYWJlbCA9PT0gJ3N0cmluZyc/IHRoaXMubGFiZWw6IHRoaXMubGFiZWwuam9pbignLCAnKSxcclxuICAgICAgICAgICAgc3R5bGU6IFV0aWwub2JqZWN0Q2xvbmU8U3R5bGU+KG9wdGlvbi5zdHlsZSksXHJcbiAgICAgICAgICAgIGxhYmVsQ2ZnOiBVdGlsLm9iamVjdENsb25lPEVsZW1lbnRMYWJlbE9wdGlvbj4ob3B0aW9uLmxhYmVsT3B0aW9ucyksXHJcbiAgICAgICAgICAgIGV4dGVybmFsUG9pbnRlcklkOiBudWxsLFxyXG4gICAgICAgICAgICBtb2RlbFR5cGU6IHRoaXMubW9kZWxUeXBlLFxyXG4gICAgICAgICAgICBtb2RlbE5hbWU6IHRoaXMubW9kZWxOYW1lXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Renderer = void 0;\r\nconst util_1 = __webpack_require__(0);\r\nconst animation_1 = __webpack_require__(9);\r\nconst StructV_1 = __webpack_require__(2);\r\n;\r\nclass Renderer {\r\n constructor(engine, DOMContainer) {\r\n this.engine = engine;\r\n this.DOMContainer = DOMContainer;\r\n this.isFirstRender = true;\r\n this.modelList = [];\r\n this.prevRenderData = {\r\n nodes: [],\r\n edges: []\r\n };\r\n const enable = this.engine.animationOptions.enable === undefined ? true : this.engine.animationOptions.enable, duration = this.engine.animationOptions.duration, timingFunction = this.engine.animationOptions.timingFunction;\r\n this.graphInstance = new StructV_1.SV.G6.Graph({\r\n container: DOMContainer,\r\n width: DOMContainer.offsetWidth,\r\n height: DOMContainer.offsetHeight,\r\n groupByTypes: false,\r\n animate: enable,\r\n animateCfg: {\r\n duration: duration,\r\n easing: timingFunction\r\n },\r\n fitView: this.engine.layoutOptions.fitView,\r\n modes: {\r\n default: this.initBehaviors()\r\n }\r\n });\r\n this.shadowGraphInstance = new StructV_1.SV.G6.Graph({\r\n container: DOMContainer.cloneNode()\r\n });\r\n this.animations = new animation_1.Animations(duration, timingFunction);\r\n }\r\n initBehaviors() {\r\n const interactionOptions = this.engine.interactionOptions, dragNode = interactionOptions.dragNode, dragNodeFilter = node => {\r\n let model = node.item.getModel();\r\n if (node.item === null) {\r\n return false;\r\n }\r\n if (model.modelType === 'pointer') {\r\n return false;\r\n }\r\n if (typeof dragNode === 'boolean') {\r\n return dragNode;\r\n }\r\n if (Array.isArray(dragNode) && dragNode.indexOf(model.modelName) > -1) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n const modeMap = {\r\n drag: 'drag-canvas',\r\n zoom: 'zoom-canvas',\r\n dragNode: {\r\n type: 'drag-node',\r\n shouldBegin: node => dragNodeFilter(node)\r\n }\r\n }, defaultModes = [];\r\n Object.keys(interactionOptions).forEach(item => {\r\n if (interactionOptions[item] && modeMap[item] !== undefined) {\r\n defaultModes.push(modeMap[item]);\r\n }\r\n });\r\n return defaultModes;\r\n }\r\n diffAppendItems(prevData, data) {\r\n return {\r\n nodes: data.nodes.filter(item => !prevData.nodes.find(n => n.id === item.id)),\r\n edges: data.edges.filter(item => !prevData.edges.find(e => e.id === item.id))\r\n };\r\n }\r\n diffRemoveItems(prevData, data) {\r\n return {\r\n nodes: prevData.nodes.filter(item => !data.nodes.find(n => n.id === item.id)),\r\n edges: prevData.edges.filter(item => !data.edges.find(e => e.id === item.id))\r\n };\r\n }\r\n findFreedItems(constructedData) {\r\n return util_1.Util.converterList(constructedData.element).filter(item => item.free).map(item => item.G6Item);\r\n }\r\n handleAppendItems(appendData) {\r\n const appendItems = [\r\n ...appendData.nodes.map(item => this.graphInstance.findById(item.id)),\r\n ...appendData.edges.map(item => this.graphInstance.findById(item.id))\r\n ];\r\n appendItems.forEach(item => {\r\n this.animations.append(item);\r\n });\r\n }\r\n handleRemoveItems(removeData) {\r\n const removeItems = [\r\n ...removeData.nodes.map(item => this.graphInstance.findById(item.id)),\r\n ...removeData.edges.map(item => this.graphInstance.findById(item.id))\r\n ];\r\n removeItems.forEach(item => {\r\n this.animations.remove(item, () => {\r\n this.graphInstance.removeItem(item);\r\n });\r\n });\r\n }\r\n handleFreedItems(freedItems) { }\r\n build(constructedData) {\r\n let elementList = util_1.Util.converterList(constructedData.element), linkList = util_1.Util.converterList(constructedData.link), pointerList = util_1.Util.converterList(constructedData.pointer), nodeList = [...elementList.map(item => item.cloneProps()), ...pointerList.map(item => item.cloneProps())], edgeList = linkList.map(item => item.cloneProps());\r\n this.modelList = [...elementList, ...linkList, ...pointerList];\r\n const data = {\r\n nodes: nodeList,\r\n edges: edgeList\r\n };\r\n this.shadowGraphInstance.clear();\r\n this.shadowGraphInstance.read(data);\r\n this.modelList.forEach(item => {\r\n item.shadowG6Item = this.shadowGraphInstance.findById(item.id);\r\n });\r\n }\r\n render(constructedData) {\r\n let data = util_1.Util.convertG6Data(constructedData), freedItems = this.findFreedItems(constructedData), renderData = null, appendData = null, removeData = null;\r\n appendData = this.diffAppendItems(this.prevRenderData, data);\r\n removeData = this.diffRemoveItems(this.prevRenderData, data);\r\n renderData = {\r\n nodes: [...data.nodes, ...removeData.nodes],\r\n edges: [...data.edges, ...removeData.edges]\r\n };\r\n this.prevRenderData = data;\r\n if (this.isFirstRender) {\r\n this.graphInstance.read(renderData);\r\n }\r\n else {\r\n this.graphInstance.changeData(renderData);\r\n }\r\n this.handleAppendItems(appendData);\r\n this.handleRemoveItems(removeData);\r\n if (this.engine.layoutOptions.fitView) {\r\n this.graphInstance.fitView();\r\n }\r\n this.modelList.forEach(item => {\r\n item.renderG6Item = this.graphInstance.findById(item.id);\r\n item.G6Item = item.renderG6Item;\r\n });\r\n if (this.isFirstRender) {\r\n this.graphInstance.getEdges().forEach(item => item.toFront());\r\n this.graphInstance.paint();\r\n }\r\n if (this.isFirstRender) {\r\n this.isFirstRender = false;\r\n }\r\n }\r\n getModelList() {\r\n return this.modelList;\r\n }\r\n getGraphInstance() {\r\n return this.graphInstance;\r\n }\r\n}\r\nexports.Renderer = Renderer;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy9yZW5kZXJlci50cz9jYzA4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHNDQUFzQztBQUN0QywyQ0FBeUM7QUFDekMseUNBQWdDO0FBUS9CLENBQUM7QUFJRixNQUFhLFFBQVE7SUFVakIsWUFBWSxNQUFjLEVBQUUsWUFBeUI7UUFDakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGNBQWMsR0FBRztZQUNsQixLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1NBQ1osQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFZLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBQyxDQUFDLElBQUksRUFBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUM5RyxRQUFRLEdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQ3hELGNBQWMsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQztRQUUzRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksWUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDakMsU0FBUyxFQUFFLFlBQVk7WUFDdkIsS0FBSyxFQUFFLFlBQVksQ0FBQyxXQUFXO1lBQy9CLE1BQU0sRUFBRSxZQUFZLENBQUMsWUFBWTtZQUNqQyxZQUFZLEVBQUUsS0FBSztZQUNuQixPQUFPLEVBQUUsTUFBTTtZQUNmLFVBQVUsRUFBRTtnQkFDUixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsTUFBTSxFQUFFLGNBQWM7YUFDekI7WUFDRCxP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QztJQUtELFlBQVk7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUtNLGdCQUFnQjtRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztDQUNKO0FBN1BELDRCQTZQQyIsImZpbGUiOiI4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW5naW5lIH0gZnJvbSAnLi4vZW5naW5lJztcclxuaW1wb3J0IHsgRWxlbWVudCwgRzZFZGdlTW9kZWwsIEc2Tm9kZU1vZGVsLCBMaW5rLCBQb2ludGVyIH0gZnJvbSAnLi4vTW9kZWwvbW9kZWxEYXRhJztcclxuaW1wb3J0IHsgQ29uc3RydWN0ZWREYXRhIH0gZnJvbSAnLi4vTW9kZWwvbW9kZWxDb25zdHJ1Y3Rvcic7XHJcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi9Db21tb24vdXRpbCc7XHJcbmltcG9ydCB7IEFuaW1hdGlvbnMgfSBmcm9tICcuL2FuaW1hdGlvbic7XHJcbmltcG9ydCB7IFNWIH0gZnJvbSAnLi4vU3RydWN0Vic7XHJcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnLi8uLi9Nb2RlbC9tb2RlbERhdGEnO1xyXG5cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEc2RGF0YSB7XHJcbiAgICBub2RlczogRzZOb2RlTW9kZWxbXTtcclxuICAgIGVkZ2VzOiBHNkVkZ2VNb2RlbFtdO1xyXG59O1xyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgUmVuZGVyZXIge1xyXG4gICAgcHJpdmF0ZSBlbmdpbmU6IEVuZ2luZTtcclxuICAgIHByaXZhdGUgRE9NQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgYW5pbWF0aW9uczogQW5pbWF0aW9ucztcclxuICAgIHByaXZhdGUgaXNGaXJzdFJlbmRlcjogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgcHJldlJlbmRlckRhdGE6IEc2RGF0YTtcclxuICAgIHByaXZhdGUgZ3JhcGhJbnN0YW5jZTtcclxuICAgIHByaXZhdGUgc2hhZG93R3JhcGhJbnN0YW5jZTtcclxuICAgIHByaXZhdGUgbW9kZWxMaXN0OiBNb2RlbFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGVuZ2luZTogRW5naW5lLCBET01Db250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7XHJcbiAgICAgICAgdGhpcy5ET01Db250YWluZXIgPSBET01Db250YWluZXI7XHJcbiAgICAgICAgdGhpcy5pc0ZpcnN0UmVuZGVyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1vZGVsTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMucHJldlJlbmRlckRhdGEgPSB7XHJcbiAgICAgICAgICAgIG5vZGVzOiBbXSxcclxuICAgICAgICAgICAgZWRnZXM6IFtdXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgZW5hYmxlOiBib29sZWFuID0gdGhpcy5lbmdpbmUuYW5pbWF0aW9uT3B0aW9ucy5lbmFibGUgPT09IHVuZGVmaW5lZD8gdHJ1ZTogdGhpcy5lbmdpbmUuYW5pbWF0aW9uT3B0aW9ucy5lbmFibGUsXHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IG51bWJlciA9IHRoaXMuZW5naW5lLmFuaW1hdGlvbk9wdGlvbnMuZHVyYXRpb24sXHJcbiAgICAgICAgICAgICAgdGltaW5nRnVuY3Rpb246IHN0cmluZyA9IHRoaXMuZW5naW5lLmFuaW1hdGlvbk9wdGlvbnMudGltaW5nRnVuY3Rpb247XHJcblxyXG4gICAgICAgIHRoaXMuZ3JhcGhJbnN0YW5jZSA9IG5ldyBTVi5HNi5HcmFwaCh7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcjogRE9NQ29udGFpbmVyLFxyXG4gICAgICAgICAgICB3aWR0aDogRE9NQ29udGFpbmVyLm9mZnNldFdpZHRoLCBcclxuICAgICAgICAgICAgaGVpZ2h0OiBET01Db250YWluZXIub2Zmc2V0SGVpZ2h0LFxyXG4gICAgICAgICAgICBncm91cEJ5VHlwZXM6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbmltYXRlOiBlbmFibGUsXHJcbiAgICAgICAgICAgIGFuaW1hdGVDZmc6IHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcclxuICAgICAgICAgICAgICAgIGVhc2luZzogdGltaW5nRnVuY3Rpb25cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZml0VmlldzogdGhpcy5lbmdpbmUubGF5b3V0T3B0aW9ucy5maXRWaWV3LFxyXG4gICAgICAgICAgICBtb2Rlczoge1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhpcy5pbml0QmVoYXZpb3JzKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNoYWRvd0dyYXBoSW5zdGFuY2UgPSBuZXcgU1YuRzYuR3JhcGgoe1xyXG4gICAgICAgICAgICBjb250YWluZXI6IERPTUNvbnRhaW5lci5jbG9uZU5vZGUoKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFuaW1hdGlvbnMgPSBuZXcgQW5pbWF0aW9ucyhkdXJhdGlvbiwgdGltaW5nRnVuY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5Lqk5LqS6KGM5Li6XHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpbml0QmVoYXZpb3JzKCkge1xyXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uT3B0aW9ucyA9IHRoaXMuZW5naW5lLmludGVyYWN0aW9uT3B0aW9ucyxcclxuICAgICAgICAgICAgICBkcmFnTm9kZTogYm9vbGVhbiB8IHN0cmluZ1tdID0gaW50ZXJhY3Rpb25PcHRpb25zLmRyYWdOb2RlLFxyXG4gICAgICAgICAgICAgIGRyYWdOb2RlRmlsdGVyID0gbm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBtb2RlbCA9IG5vZGUuaXRlbS5nZXRNb2RlbCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYobm9kZS5pdGVtID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmKG1vZGVsLm1vZGVsVHlwZSA9PT0gJ3BvaW50ZXInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBkcmFnTm9kZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHJhZ05vZGU7XHJcbiAgICAgICAgICAgICAgICAgIH0gXHJcblxyXG4gICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KGRyYWdOb2RlKSAmJiBkcmFnTm9kZS5pbmRleE9mKG1vZGVsLm1vZGVsTmFtZSkgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZGVNYXAgPSB7XHJcbiAgICAgICAgICAgIGRyYWc6ICdkcmFnLWNhbnZhcycsXHJcbiAgICAgICAgICAgIHpvb206ICd6b29tLWNhbnZhcycsXHJcbiAgICAgICAgICAgIGRyYWdOb2RlOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZHJhZy1ub2RlJyxcclxuICAgICAgICAgICAgICAgIHNob3VsZEJlZ2luOiBub2RlID0+IGRyYWdOb2RlRmlsdGVyKG5vZGUpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGRlZmF1bHRNb2RlcyA9IFtdO1xyXG5cclxuICAgICAgICBPYmplY3Qua2V5cyhpbnRlcmFjdGlvbk9wdGlvbnMpLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGludGVyYWN0aW9uT3B0aW9uc1tpdGVtXSAmJiBtb2RlTWFwW2l0ZW1dICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNb2Rlcy5wdXNoKG1vZGVNYXBbaXRlbV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkZWZhdWx0TW9kZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlr7nmr5TkuIrkuIDmrKHlkozor6XmrKEgRzZEYXRhIOaJvuWHuuaWsOa3u+WKoOeahOiKgueCueWSjOi+uVxyXG4gICAgICogQHBhcmFtIHByZXZEYXRhIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZGlmZkFwcGVuZEl0ZW1zKHByZXZEYXRhOiBHNkRhdGEsIGRhdGE6IEc2RGF0YSk6IEc2RGF0YSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbm9kZXM6IGRhdGEubm9kZXMuZmlsdGVyKGl0ZW0gPT4gIXByZXZEYXRhLm5vZGVzLmZpbmQobiA9PiBuLmlkID09PSBpdGVtLmlkKSksXHJcbiAgICAgICAgICAgIGVkZ2VzOiBkYXRhLmVkZ2VzLmZpbHRlcihpdGVtID0+ICFwcmV2RGF0YS5lZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gaXRlbS5pZCkpXHJcbiAgICAgICAgfTtcclxuICAgIH0gICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWvueavlOS4iuS4gOasoeWSjOivpeasoSBHNkRhdGEg5om+5Ye66KKr5Yig6Zmk55qE6IqC54K55ZKM6L65XHJcbiAgICAgKiBAcGFyYW0gcHJldkRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkaWZmUmVtb3ZlSXRlbXMocHJldkRhdGE6IEc2RGF0YSwgZGF0YTogRzZEYXRhKTogRzZEYXRhIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBub2RlczogcHJldkRhdGEubm9kZXMuZmlsdGVyKGl0ZW0gPT4gIWRhdGEubm9kZXMuZmluZChuID0+IG4uaWQgPT09IGl0ZW0uaWQpKSxcclxuICAgICAgICAgICAgZWRnZXM6IHByZXZEYXRhLmVkZ2VzLmZpbHRlcihpdGVtID0+ICFkYXRhLmVkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBpdGVtLmlkKSlcclxuICAgICAgICB9O1xyXG4gICAgfSAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5p+l5om+6KKr6YeK5pS+55qE6IqC54K5XHJcbiAgICAgKiBAcGFyYW0gY29uc3RydWN0ZWREYXRhIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpbmRGcmVlZEl0ZW1zKGNvbnN0cnVjdGVkRGF0YTogQ29uc3RydWN0ZWREYXRhKTogRzZOb2RlTW9kZWxbXSB7XHJcbiAgICAgICAgcmV0dXJuIFV0aWwuY29udmVydGVyTGlzdChjb25zdHJ1Y3RlZERhdGEuZWxlbWVudCkuZmlsdGVyKGl0ZW0gPT4gaXRlbS5mcmVlKS5tYXAoaXRlbSA9PiBpdGVtLkc2SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlpITnkIbmlrDlop7nmoQgRzZJdGVt77yI5Li76KaB5piv5Yqo55S777yJXHJcbiAgICAgKiBAcGFyYW0gYXBwZW5kRGF0YSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVBcHBlbmRJdGVtcyhhcHBlbmREYXRhOiBHNkRhdGEpIHtcclxuICAgICAgICBjb25zdCBhcHBlbmRJdGVtcyA9IFtcclxuICAgICAgICAgICAgLi4uYXBwZW5kRGF0YS5ub2Rlcy5tYXAoaXRlbSA9PiB0aGlzLmdyYXBoSW5zdGFuY2UuZmluZEJ5SWQoaXRlbS5pZCkpLFxyXG4gICAgICAgICAgICAuLi5hcHBlbmREYXRhLmVkZ2VzLm1hcChpdGVtID0+IHRoaXMuZ3JhcGhJbnN0YW5jZS5maW5kQnlJZChpdGVtLmlkKSlcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBhcHBlbmRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFuaW1hdGlvbnMuYXBwZW5kKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5aSE55CG6KKr56e76Zmk55qEIEc2SXRlbe+8iOS4u+imgeaYr+WKqOeUu++8iVxyXG4gICAgICogQHBhcmFtIHJlbW92ZURhdGEgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlUmVtb3ZlSXRlbXMocmVtb3ZlRGF0YTogRzZEYXRhKSB7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlSXRlbXMgPSBbXHJcbiAgICAgICAgICAgIC4uLnJlbW92ZURhdGEubm9kZXMubWFwKGl0ZW0gPT4gdGhpcy5ncmFwaEluc3RhbmNlLmZpbmRCeUlkKGl0ZW0uaWQpKSxcclxuICAgICAgICAgICAgLi4ucmVtb3ZlRGF0YS5lZGdlcy5tYXAoaXRlbSA9PiB0aGlzLmdyYXBoSW5zdGFuY2UuZmluZEJ5SWQoaXRlbS5pZCkpXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgcmVtb3ZlSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hbmltYXRpb25zLnJlbW92ZShpdGVtLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyYXBoSW5zdGFuY2UucmVtb3ZlSXRlbShpdGVtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlpITnkIbooqsgZnJlZSDnmoQgRzZJdGVtXHJcbiAgICAgKiBAcGFyYW0gZnJlZWRJdGVtcyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVGcmVlZEl0ZW1zKGZyZWVkSXRlbXM6IEc2Tm9kZU1vZGVsW10pIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5p6E5bu6IEc2IOWFg+e0oFxyXG4gICAgICogQHBhcmFtIGNvbnN0cnVjdGVkRGF0YSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJ1aWxkKGNvbnN0cnVjdGVkRGF0YTogQ29uc3RydWN0ZWREYXRhKSB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRMaXN0OiBFbGVtZW50W10gPSBVdGlsLmNvbnZlcnRlckxpc3QoY29uc3RydWN0ZWREYXRhLmVsZW1lbnQpLFxyXG4gICAgICAgICAgICBsaW5rTGlzdDogTGlua1tdID0gVXRpbC5jb252ZXJ0ZXJMaXN0KGNvbnN0cnVjdGVkRGF0YS5saW5rKSxcclxuICAgICAgICAgICAgcG9pbnRlckxpc3Q6IFBvaW50ZXJbXSA9IFV0aWwuY29udmVydGVyTGlzdChjb25zdHJ1Y3RlZERhdGEucG9pbnRlciksXHJcbiAgICAgICAgICAgIG5vZGVMaXN0ID0gWy4uLmVsZW1lbnRMaXN0Lm1hcChpdGVtID0+IGl0ZW0uY2xvbmVQcm9wcygpKSwgLi4ucG9pbnRlckxpc3QubWFwKGl0ZW0gPT4gaXRlbS5jbG9uZVByb3BzKCkpXSxcclxuICAgICAgICAgICAgZWRnZUxpc3QgPSBsaW5rTGlzdC5tYXAoaXRlbSA9PiBpdGVtLmNsb25lUHJvcHMoKSk7XHJcblxyXG4gICAgICAgIHRoaXMubW9kZWxMaXN0ID0gWy4uLmVsZW1lbnRMaXN0LCAuLi5saW5rTGlzdCwgLi4ucG9pbnRlckxpc3RdO1xyXG5cclxuICAgICAgICBjb25zdCBkYXRhOiBHNkRhdGEgPSB7XHJcbiAgICAgICAgICAgIG5vZGVzOiA8RzZOb2RlTW9kZWxbXT5ub2RlTGlzdCxcclxuICAgICAgICAgICAgZWRnZXM6IDxHNkVkZ2VNb2RlbFtdPmVkZ2VMaXN0XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5zaGFkb3dHcmFwaEluc3RhbmNlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5zaGFkb3dHcmFwaEluc3RhbmNlLnJlYWQoZGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMubW9kZWxMaXN0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uc2hhZG93RzZJdGVtID0gdGhpcy5zaGFkb3dHcmFwaEluc3RhbmNlLmZpbmRCeUlkKGl0ZW0uaWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5riy5p+T5Ye95pWwXHJcbiAgICAgKiBAcGFyYW0gY29uc3RydWN0ZWREYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXIoY29uc3RydWN0ZWREYXRhOiBDb25zdHJ1Y3RlZERhdGEpIHtcclxuICAgICAgICBsZXQgZGF0YTogRzZEYXRhID0gVXRpbC5jb252ZXJ0RzZEYXRhKGNvbnN0cnVjdGVkRGF0YSksXHJcbiAgICAgICAgICAgIGZyZWVkSXRlbXMgPSB0aGlzLmZpbmRGcmVlZEl0ZW1zKGNvbnN0cnVjdGVkRGF0YSksXHJcbiAgICAgICAgICAgIHJlbmRlckRhdGE6IEc2RGF0YSA9IG51bGwsXHJcbiAgICAgICAgICAgIGFwcGVuZERhdGE6IEc2RGF0YSA9IG51bGwsXHJcbiAgICAgICAgICAgIHJlbW92ZURhdGE6IEc2RGF0YSA9IG51bGw7XHJcblxyXG4gICAgICAgIGFwcGVuZERhdGEgPSB0aGlzLmRpZmZBcHBlbmRJdGVtcyh0aGlzLnByZXZSZW5kZXJEYXRhLCBkYXRhKTtcclxuICAgICAgICByZW1vdmVEYXRhID0gdGhpcy5kaWZmUmVtb3ZlSXRlbXModGhpcy5wcmV2UmVuZGVyRGF0YSwgZGF0YSk7XHJcbiAgICAgICAgcmVuZGVyRGF0YSA9IHtcclxuICAgICAgICAgICAgbm9kZXM6IFsuLi5kYXRhLm5vZGVzLCAuLi5yZW1vdmVEYXRhLm5vZGVzXSxcclxuICAgICAgICAgICAgZWRnZXM6IFsuLi5kYXRhLmVkZ2VzLCAuLi5yZW1vdmVEYXRhLmVkZ2VzXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5wcmV2UmVuZGVyRGF0YSA9IGRhdGE7XHJcblxyXG4gICAgICAgIGlmKHRoaXMuaXNGaXJzdFJlbmRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmdyYXBoSW5zdGFuY2UucmVhZChyZW5kZXJEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JhcGhJbnN0YW5jZS5jaGFuZ2VEYXRhKHJlbmRlckRhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVBcHBlbmRJdGVtcyhhcHBlbmREYXRhKTtcclxuICAgICAgICB0aGlzLmhhbmRsZVJlbW92ZUl0ZW1zKHJlbW92ZURhdGEpO1xyXG5cclxuICAgICAgICBpZih0aGlzLmVuZ2luZS5sYXlvdXRPcHRpb25zLmZpdFZpZXcpIHtcclxuICAgICAgICAgICAgdGhpcy5ncmFwaEluc3RhbmNlLmZpdFZpZXcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubW9kZWxMaXN0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0ucmVuZGVyRzZJdGVtID0gdGhpcy5ncmFwaEluc3RhbmNlLmZpbmRCeUlkKGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICBpdGVtLkc2SXRlbSA9IGl0ZW0ucmVuZGVyRzZJdGVtO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZih0aGlzLmlzRmlyc3RSZW5kZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5ncmFwaEluc3RhbmNlLmdldEVkZ2VzKCkuZm9yRWFjaChpdGVtID0+IGl0ZW0udG9Gcm9udCgpKTtcclxuICAgICAgICAgICAgdGhpcy5ncmFwaEluc3RhbmNlLnBhaW50KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLmlzRmlyc3RSZW5kZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0ZpcnN0UmVuZGVyID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+WIG1vZGVsIOmYn+WIl1xyXG4gICAgICovXHJcbiAgICBnZXRNb2RlbExpc3QoKTogTW9kZWxbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxMaXN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+WIEc2IOWunuS+i1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0R3JhcGhJbnN0YW5jZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncmFwaEluc3RhbmNlO1xyXG4gICAgfVxyXG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Animations = void 0;\r\nconst StructV_1 = __webpack_require__(2);\r\nclass Animations {\r\n constructor(duration, timingFunction) {\r\n this.mat3 = StructV_1.SV.G6.Util.mat3;\r\n this.duration = duration;\r\n this.timingFunction = timingFunction;\r\n }\r\n append(G6Item, callback = null) {\r\n const type = G6Item.getType(), group = G6Item.getContainer(), animateCfg = {\r\n duration: this.duration,\r\n easing: this.timingFunction,\r\n callback\r\n };\r\n if (type === 'node') {\r\n let mat3 = this.mat3, matrix = group.getMatrix(), targetMatrix = mat3.clone(matrix);\r\n mat3.scale(matrix, matrix, [0, 0]);\r\n mat3.scale(targetMatrix, targetMatrix, [1, 1]);\r\n group.attr({ opacity: 0, matrix });\r\n group.animate({ opacity: 1, matrix: targetMatrix }, animateCfg);\r\n }\r\n if (type === 'edge') {\r\n const line = group.get('children')[0], length = line.getTotalLength();\r\n line.attr({ lineDash: [0, length], opacity: 0 });\r\n line.animate({ lineDash: [length, 0], opacity: 1 }, animateCfg);\r\n }\r\n }\r\n remove(G6Item, callback = null) {\r\n const type = G6Item.getType(), group = G6Item.getContainer(), animateCfg = {\r\n duration: this.duration,\r\n easing: this.timingFunction,\r\n callback\r\n };\r\n if (type === 'node') {\r\n let mat3 = this.mat3, matrix = mat3.clone(group.getMatrix());\r\n mat3.scale(matrix, matrix, [0, 0]);\r\n group.animate({ opacity: 0, matrix }, animateCfg);\r\n }\r\n if (type === 'edge') {\r\n const line = group.get('children')[0], length = line.getTotalLength();\r\n line.animate({ lineDash: [0, length], opacity: 0 }, animateCfg);\r\n }\r\n }\r\n}\r\nexports.Animations = Animations;\r\n;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy9hbmltYXRpb24udHM/ZmRkYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBZ0M7QUFPaEMsTUFBYSxVQUFVO0lBS25CLFlBQVksUUFBZ0IsRUFBRSxjQUFzQjtRQUY1QyxTQUFJLEdBQUcsWUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3pDLENBQUM7SUFPRCxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQXFCLElBQUk7UUFDcEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUN2QixLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxFQUM3QixVQUFVLEdBQUc7WUFDVCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQzNCLFFBQVE7U0FDWCxDQUFDO1FBRVIsSUFBRyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ2hCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQ2hCLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQzFCLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXRDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRS9DLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ25FO1FBRUQsSUFBRyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQy9CLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFckMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNuRTtJQUNMLENBQUM7SUFPRCxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQXFCLElBQUk7UUFDcEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUN2QixLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxFQUM3QixVQUFVLEdBQUc7WUFDVCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQzNCLFFBQVE7U0FDWCxDQUFDO1FBRVIsSUFBRyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ2hCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQ2hCLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBRTNDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsSUFBRyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQy9CLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDbkU7SUFDTCxDQUFDO0NBRUo7QUEzRUQsZ0NBMkVDO0FBQUEsQ0FBQyIsImZpbGUiOiI5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU1YgfSBmcm9tIFwiLi4vU3RydWN0VlwiO1xyXG5cclxuXHJcblxyXG4vKipcclxuICog5Yqo55S76KGoXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9ucyB7XHJcbiAgICBwcml2YXRlIGR1cmF0aW9uOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRpbWluZ0Z1bmN0aW9uOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIG1hdDMgPSBTVi5HNi5VdGlsLm1hdDM7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZHVyYXRpb246IG51bWJlciwgdGltaW5nRnVuY3Rpb246IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcclxuICAgICAgICB0aGlzLnRpbWluZ0Z1bmN0aW9uID0gdGltaW5nRnVuY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmt7vliqDoioLngrkgLyDovrnml7bnmoTliqjnlLvmlYjmnpxcclxuICAgICAqIEBwYXJhbSBHNkl0ZW0gXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIGFwcGVuZChHNkl0ZW0sIGNhbGxiYWNrOiBGdW5jdGlvbiA9IG51bGwpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gRzZJdGVtLmdldFR5cGUoKSxcclxuICAgICAgICAgICAgICBncm91cCA9IEc2SXRlbS5nZXRDb250YWluZXIoKSxcclxuICAgICAgICAgICAgICBhbmltYXRlQ2ZnID0ge1xyXG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcclxuICAgICAgICAgICAgICAgICAgZWFzaW5nOiB0aGlzLnRpbWluZ0Z1bmN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICBjYWxsYmFja1xyXG4gICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmKHR5cGUgPT09ICdub2RlJykge1xyXG4gICAgICAgICAgICBsZXQgbWF0MyA9IHRoaXMubWF0MyxcclxuICAgICAgICAgICAgICAgIG1hdHJpeCA9IGdyb3VwLmdldE1hdHJpeCgpLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0TWF0cml4ID0gbWF0My5jbG9uZShtYXRyaXgpO1xyXG5cclxuICAgICAgICAgICAgbWF0My5zY2FsZShtYXRyaXgsIG1hdHJpeCwgWzAsIDBdKTtcclxuICAgICAgICAgICAgbWF0My5zY2FsZSh0YXJnZXRNYXRyaXgsIHRhcmdldE1hdHJpeCwgWzEsIDFdKTtcclxuXHJcbiAgICAgICAgICAgIGdyb3VwLmF0dHIoeyBvcGFjaXR5OiAwLCBtYXRyaXggfSk7XHJcbiAgICAgICAgICAgIGdyb3VwLmFuaW1hdGUoeyBvcGFjaXR5OiAxLCBtYXRyaXg6IHRhcmdldE1hdHJpeCB9LCBhbmltYXRlQ2ZnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHR5cGUgPT09ICdlZGdlJykge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lID0gZ3JvdXAuZ2V0KCdjaGlsZHJlbicpWzBdLFxyXG4gICAgICAgICAgICAgICAgICBsZW5ndGggPSBsaW5lLmdldFRvdGFsTGVuZ3RoKCk7XHJcblxyXG4gICAgICAgICAgICBsaW5lLmF0dHIoeyBsaW5lRGFzaDogWzAsIGxlbmd0aF0sIG9wYWNpdHk6IDAgfSk7XHJcbiAgICAgICAgICAgIGxpbmUuYW5pbWF0ZSh7IGxpbmVEYXNoOiBbbGVuZ3RoLCAwXSwgb3BhY2l0eTogMSB9LCBhbmltYXRlQ2ZnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaToioLngrkgLyDovrnml7bnmoTliqjnlLvmlYjmnpxcclxuICAgICAqIEBwYXJhbSBHNkl0ZW0gXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZShHNkl0ZW0sIGNhbGxiYWNrOiBGdW5jdGlvbiA9IG51bGwpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gRzZJdGVtLmdldFR5cGUoKSxcclxuICAgICAgICAgICAgICBncm91cCA9IEc2SXRlbS5nZXRDb250YWluZXIoKSxcclxuICAgICAgICAgICAgICBhbmltYXRlQ2ZnID0ge1xyXG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcclxuICAgICAgICAgICAgICAgICAgZWFzaW5nOiB0aGlzLnRpbWluZ0Z1bmN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICBjYWxsYmFja1xyXG4gICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmKHR5cGUgPT09ICdub2RlJykge1xyXG4gICAgICAgICAgICBsZXQgbWF0MyA9IHRoaXMubWF0MyxcclxuICAgICAgICAgICAgICAgIG1hdHJpeCA9IG1hdDMuY2xvbmUoZ3JvdXAuZ2V0TWF0cml4KCkpO1xyXG5cclxuICAgICAgICAgICAgbWF0My5zY2FsZShtYXRyaXgsIG1hdHJpeCwgWzAsIDBdKTtcclxuICAgICAgICAgICAgZ3JvdXAuYW5pbWF0ZSh7IG9wYWNpdHk6IDAsIG1hdHJpeCB9LCBhbmltYXRlQ2ZnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHR5cGUgPT09ICdlZGdlJykge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lID0gZ3JvdXAuZ2V0KCdjaGlsZHJlbicpWzBdLFxyXG4gICAgICAgICAgICAgICAgICBsZW5ndGggPSBsaW5lLmdldFRvdGFsTGVuZ3RoKCk7XHJcblxyXG4gICAgICAgICAgICBsaW5lLmFuaW1hdGUoeyBsaW5lRGFzaDogWzAsIGxlbmd0aF0sIG9wYWNpdHk6IDAgfSwgYW5pbWF0ZUNmZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbn07XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Layouter = void 0;\r\nconst boundingRect_1 = __webpack_require__(3);\r\nclass Layouter {\r\n constructor(engine) {\r\n this.engine = engine;\r\n }\r\n fitCenter(models) {\r\n const viewBound = models.map(item => item.getBound()).reduce((prev, cur) => boundingRect_1.Bound.union(prev, cur));\r\n let width = this.engine.getGraphInstance().getWidth(), height = this.engine.getGraphInstance().getHeight(), centerX = width / 2, centerY = height / 2, boundCenterX = viewBound.x + viewBound.width / 2, boundCenterY = viewBound.y + viewBound.height / 2, dx = centerX - boundCenterX, dy = centerY - boundCenterY;\r\n models.forEach(item => {\r\n item.set({\r\n x: item.get('x') + dx,\r\n y: item.get('y') + dy\r\n });\r\n });\r\n }\r\n layoutPointer(pointer) {\r\n Object.keys(pointer).map(name => {\r\n const options = this.engine.pointerOptions[name], pointerList = pointer[name], offset = options.offset || 8;\r\n pointerList.forEach(item => {\r\n let targetBound = item.target.getBound();\r\n item.set({\r\n x: targetBound.x + targetBound.width / 2,\r\n y: targetBound.y - offset\r\n });\r\n });\r\n });\r\n }\r\n layout(constructedData, modelList, layoutFn) {\r\n const options = this.engine.layoutOptions;\r\n modelList.forEach(item => {\r\n item.G6Item = item.shadowG6Item;\r\n if (item.modelType === 'element' || item.modelType === 'pointer') {\r\n item.set('rotation', item.get('rotation'));\r\n item.set({ x: 0, y: 0 });\r\n }\r\n });\r\n layoutFn.call(this.engine, constructedData.element, options);\r\n this.layoutPointer(constructedData.pointer);\r\n options.fitCenter && this.fitCenter(modelList);\r\n modelList.forEach(item => {\r\n item.G6Item = item.renderG6Item;\r\n });\r\n }\r\n}\r\nexports.Layouter = Layouter;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy9sYXlvdXRlci50cz84N2M5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLDhDQUFxRDtBQUtyRCxNQUFhLFFBQVE7SUFHakIsWUFBWSxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLENBQUM7SUFNTyxTQUFTLENBQUMsTUFBZTtRQUM3QixNQUFNLFNBQVMsR0FBaUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLG9CQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWxILElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFDakQsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFDbkQsT0FBTyxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLE1BQU0sR0FBRyxDQUFDLEVBQ3pDLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUNoRCxZQUFZLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDakQsRUFBRSxHQUFHLE9BQU8sR0FBRyxZQUFZLEVBQzNCLEVBQUUsR0FBRyxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBRWhDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDTCxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNyQixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2FBQ3hCLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQU1PLGFBQWEsQ0FBQyxPQUFxQztRQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1QixNQUFNLE9BQU8sR0FBa0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQ3pELFdBQVcsR0FBYyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQ3RDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUVuQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN2QixJQUFJLFdBQVcsR0FBaUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFDTCxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUM7b0JBQ3hDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxHQUFHLE1BQU07aUJBQzVCLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBUU0sTUFBTSxDQUFDLGVBQWdDLEVBQUUsU0FBa0IsRUFBRSxRQUF1RjtRQUN2SixNQUFNLE9BQU8sR0FBa0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFHekQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFFaEMsSUFBRyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM1QjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBR0gsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFHN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFHNUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRS9DLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBbEZELDRCQWtGQyIsImZpbGUiOiIxMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVuZ2luZSB9IGZyb20gXCIuLi9lbmdpbmVcIjtcclxuaW1wb3J0IHsgQ29uc3RydWN0ZWREYXRhIH0gZnJvbSBcIi4uL01vZGVsL21vZGVsQ29uc3RydWN0b3JcIjtcclxuaW1wb3J0IHsgRWxlbWVudCwgTW9kZWwsIFBvaW50ZXIgfSBmcm9tIFwiLi4vTW9kZWwvbW9kZWxEYXRhXCI7XHJcbmltcG9ydCB7IExheW91dE9wdGlvbnMsIFBvaW50ZXJPcHRpb24gfSBmcm9tIFwiLi4vb3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBCb3VuZCwgQm91bmRpbmdSZWN0IH0gZnJvbSBcIi4vYm91bmRpbmdSZWN0XCI7XHJcblxyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTGF5b3V0ZXIge1xyXG4gICAgcHJpdmF0ZSBlbmdpbmU6IEVuZ2luZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihlbmdpbmU6IEVuZ2luZSkge1xyXG4gICAgICAgIHRoaXMuZW5naW5lID0gZW5naW5lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5bCG6KeG5Zu+6LCD5pW06Iez55S75biD5Lit5b+DXHJcbiAgICAgKiBAcGFyYW0gbm9kZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaXRDZW50ZXIobW9kZWxzOiBNb2RlbFtdKSB7XHJcbiAgICAgICAgY29uc3Qgdmlld0JvdW5kOiBCb3VuZGluZ1JlY3QgPSBtb2RlbHMubWFwKGl0ZW0gPT4gaXRlbS5nZXRCb3VuZCgpKS5yZWR1Y2UoKHByZXYsIGN1cikgPT4gQm91bmQudW5pb24ocHJldiwgY3VyKSk7XHJcblxyXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuZW5naW5lLmdldEdyYXBoSW5zdGFuY2UoKS5nZXRXaWR0aCgpLFxyXG4gICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmVuZ2luZS5nZXRHcmFwaEluc3RhbmNlKCkuZ2V0SGVpZ2h0KCksXHJcbiAgICAgICAgICAgIGNlbnRlclggPSB3aWR0aCAvIDIsIGNlbnRlclkgPSBoZWlnaHQgLyAyLFxyXG4gICAgICAgICAgICBib3VuZENlbnRlclggPSB2aWV3Qm91bmQueCArIHZpZXdCb3VuZC53aWR0aCAvIDIsXHJcbiAgICAgICAgICAgIGJvdW5kQ2VudGVyWSA9IHZpZXdCb3VuZC55ICsgdmlld0JvdW5kLmhlaWdodCAvIDIsXHJcbiAgICAgICAgICAgIGR4ID0gY2VudGVyWCAtIGJvdW5kQ2VudGVyWCxcclxuICAgICAgICAgICAgZHkgPSBjZW50ZXJZIC0gYm91bmRDZW50ZXJZO1xyXG5cclxuICAgICAgICBtb2RlbHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS5zZXQoe1xyXG4gICAgICAgICAgICAgICAgeDogaXRlbS5nZXQoJ3gnKSArIGR4LFxyXG4gICAgICAgICAgICAgICAgeTogaXRlbS5nZXQoJ3knKSArIGR5XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5biD5bGA5aSW6YOo5oyH6ZKIXHJcbiAgICAgKiBAcGFyYW0gcG9pbnRlciBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsYXlvdXRQb2ludGVyKHBvaW50ZXI6IHsgW2tleTogc3RyaW5nXTogUG9pbnRlcltdIH0pIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhwb2ludGVyKS5tYXAobmFtZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnM6IFBvaW50ZXJPcHRpb24gPSB0aGlzLmVuZ2luZS5wb2ludGVyT3B0aW9uc1tuYW1lXSxcclxuICAgICAgICAgICAgICAgICAgcG9pbnRlckxpc3Q6IFBvaW50ZXJbXSA9IHBvaW50ZXJbbmFtZV0sXHJcbiAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9wdGlvbnMub2Zmc2V0IHx8IDg7XHJcblxyXG4gICAgICAgICAgICBwb2ludGVyTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldEJvdW5kOiBCb3VuZGluZ1JlY3QgPSBpdGVtLnRhcmdldC5nZXRCb3VuZCgpO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IHRhcmdldEJvdW5kLnggKyB0YXJnZXRCb3VuZC53aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTogdGFyZ2V0Qm91bmQueSAtIG9mZnNldFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Li75biD5bGA5Ye95pWwXHJcbiAgICAgKiBAcGFyYW0gY29uc3RydWN0ZWREYXRhIFxyXG4gICAgICogQHBhcmFtIG1vZGVsTGlzdFxyXG4gICAgICogQHBhcmFtIGxheW91dEZuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGF5b3V0KGNvbnN0cnVjdGVkRGF0YTogQ29uc3RydWN0ZWREYXRhLCBtb2RlbExpc3Q6IE1vZGVsW10sIGxheW91dEZuOiAoZWxlbWVudDogeyBba2V0OiBzdHJpbmddOiBFbGVtZW50W10gfSwgbGF5b3V0T3B0aW9uczogTGF5b3V0T3B0aW9ucykgPT4gdm9pZCkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IExheW91dE9wdGlvbnMgPSB0aGlzLmVuZ2luZS5sYXlvdXRPcHRpb25zO1xyXG5cclxuICAgICAgICAvLyDpppblhYjliJ3lp4vljJbmiYDmnInoioLngrnnmoTlnZDmoIfkuLow77yM5LiU6K6+5a6a5peL6L2sXHJcbiAgICAgICAgbW9kZWxMaXN0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uRzZJdGVtID0gaXRlbS5zaGFkb3dHNkl0ZW07XHJcblxyXG4gICAgICAgICAgICBpZihpdGVtLm1vZGVsVHlwZSA9PT0gJ2VsZW1lbnQnIHx8IGl0ZW0ubW9kZWxUeXBlID09PSAncG9pbnRlcicpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2V0KCdyb3RhdGlvbicsIGl0ZW0uZ2V0KCdyb3RhdGlvbicpKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHsgeDogMCwgeTogMCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDluIPlsYDoioLngrlcclxuICAgICAgICBsYXlvdXRGbi5jYWxsKHRoaXMuZW5naW5lLCBjb25zdHJ1Y3RlZERhdGEuZWxlbWVudCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIC8vIOW4g+WxgOWklumDqOaMh+mSiFxyXG4gICAgICAgIHRoaXMubGF5b3V0UG9pbnRlcihjb25zdHJ1Y3RlZERhdGEucG9pbnRlcik7XHJcblxyXG4gICAgICAgIC8vIOWwhuinhuWbvuiwg+aVtOWIsOeUu+W4g+S4reW/g1xyXG4gICAgICAgIG9wdGlvbnMuZml0Q2VudGVyICYmIHRoaXMuZml0Q2VudGVyKG1vZGVsTGlzdCk7XHJcblxyXG4gICAgICAgIG1vZGVsTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpdGVtLkc2SXRlbSA9IGl0ZW0ucmVuZGVyRzZJdGVtO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///10\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Behavior = void 0;\r\nconst util_1 = __webpack_require__(0);\r\nclass Behavior {\r\n constructor(engine, graphInstance) {\r\n this.engine = engine;\r\n this.graphInstance = graphInstance;\r\n const interactionOptions = this.engine.interactionOptions, selectNode = interactionOptions.selectNode;\r\n if (interactionOptions.dragNode) {\r\n this.initDragNode();\r\n }\r\n if (interactionOptions.selectNode) {\r\n this.initSelectNode(selectNode);\r\n }\r\n }\r\n initDragNode() {\r\n let pointer = null, pointerX = null, pointerY = null, dragStartX = null, dragStartY = null;\r\n this.graphInstance.on('node:dragstart', ev => {\r\n pointer = this.graphInstance.findById(ev.item.getModel().externalPointerId);\r\n if (pointer) {\r\n pointerX = pointer.getModel().x,\r\n pointerY = pointer.getModel().y;\r\n dragStartX = ev.canvasX;\r\n dragStartY = ev.canvasY;\r\n }\r\n });\r\n this.graphInstance.on('node:dragend', ev => {\r\n pointer = null;\r\n pointerX = null,\r\n pointerY = null,\r\n dragStartX = null,\r\n dragStartY = null;\r\n });\r\n this.graphInstance.on('node:drag', ev => {\r\n if (!pointer) {\r\n return;\r\n }\r\n let dx = ev.canvasX - dragStartX, dy = ev.canvasY - dragStartY, zoom = this.graphInstance.getZoom();\r\n pointer.updatePosition({\r\n x: pointerX + dx / zoom,\r\n y: pointerY + dy / zoom\r\n });\r\n });\r\n }\r\n initSelectNode(selectNode) {\r\n let defaultHighlightColor = '#f08a5d', curSelectItem = null, curSelectItemStyle = null;\r\n if (selectNode === false) {\r\n return;\r\n }\r\n const selectCallback = ev => {\r\n const item = ev.item, model = item.getModel(), type = item.getType(), name = model.modelName, highlightColor = model.style.selectedColor;\r\n if (Array.isArray(selectNode) && selectNode.find(item => item === name) === undefined) {\r\n return;\r\n }\r\n if (curSelectItem && curSelectItem !== item) {\r\n curSelectItem.update({\r\n style: curSelectItemStyle\r\n });\r\n }\r\n curSelectItem = item;\r\n curSelectItemStyle = util_1.Util.objectClone(curSelectItem.getModel().style);\r\n curSelectItem.update({\r\n style: Object.assign(Object.assign({}, curSelectItemStyle), { [type === 'node' ? 'fill' : 'stroke']: highlightColor || defaultHighlightColor })\r\n });\r\n };\r\n this.graphInstance.on('node:click', selectCallback);\r\n this.graphInstance.on('edge:click', selectCallback);\r\n this.graphInstance.on('click', ev => {\r\n if (curSelectItem === null) {\r\n return;\r\n }\r\n curSelectItem.update({\r\n style: curSelectItemStyle\r\n });\r\n curSelectItem = null;\r\n curSelectItemStyle = null;\r\n });\r\n }\r\n on(eventName, callback) {\r\n if (this.graphInstance) {\r\n this.graphInstance.on(eventName, callback);\r\n }\r\n }\r\n}\r\nexports.Behavior = Behavior;\r\n;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy9iZWhhdmlvci50cz80NzZlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHNDQUF3QztBQUV4QyxNQUFhLFFBQVE7SUFJakIsWUFBWSxNQUFjLEVBQUUsYUFBYTtRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUVuQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQ25ELFVBQVUsR0FBdUIsa0JBQWtCLENBQUMsVUFBVSxDQUFDO1FBRXJFLElBQUcsa0JBQWtCLENBQUMsUUFBUSxFQUFFO1lBQzVCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN2QjtRQUVELElBQUcsa0JBQWtCLENBQUMsVUFBVSxFQUFFO1lBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbkM7SUFDTCxDQUFDO0lBS08sWUFBWTtRQUNoQixJQUFJLE9BQU8sR0FBRyxJQUFJLEVBQ2QsUUFBUSxHQUFHLElBQUksRUFDZixRQUFRLEdBQUcsSUFBSSxFQUNmLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDekMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUU1RSxJQUFHLE9BQU8sRUFBRTtnQkFDUixRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7b0JBQy9CLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxVQUFVLEdBQUcsRUFBRSxDQUFDLE9BQU8s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QztnQkFDakIsS0FBSyxFQUFFLGtCQUFrQjthQUM1QixDQUFDLENBQUM7WUFFSCxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFPTyxFQUFFLENBQUMsU0FBaUIsRUFBRSxRQUFrQjtRQUM1QyxJQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztTQUM3QztJQUNMLENBQUM7Q0FDSjtBQW5JRCw0QkFtSUM7QUFBQSxDQUFDIiwiZmlsZSI6IjExLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uL2VuZ2luZVwiO1xyXG5pbXBvcnQgeyBVdGlsIH0gZnJvbSBcIi4vLi4vQ29tbW9uL3V0aWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBCZWhhdmlvciB7XHJcbiAgICBwcml2YXRlIGVuZ2luZTogRW5naW5lO1xyXG4gICAgcHJpdmF0ZSBncmFwaEluc3RhbmNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGVuZ2luZTogRW5naW5lLCBncmFwaEluc3RhbmNlKSB7XHJcbiAgICAgICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7XHJcbiAgICAgICAgdGhpcy5ncmFwaEluc3RhbmNlID0gZ3JhcGhJbnN0YW5jZTtcclxuXHJcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25PcHRpb25zID0gdGhpcy5lbmdpbmUuaW50ZXJhY3Rpb25PcHRpb25zLFxyXG4gICAgICAgICAgICAgIHNlbGVjdE5vZGU6IGJvb2xlYW4gfCBzdHJpbmdbXSA9IGludGVyYWN0aW9uT3B0aW9ucy5zZWxlY3ROb2RlO1xyXG5cclxuICAgICAgICBpZihpbnRlcmFjdGlvbk9wdGlvbnMuZHJhZ05vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0RHJhZ05vZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYoaW50ZXJhY3Rpb25PcHRpb25zLnNlbGVjdE5vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0U2VsZWN0Tm9kZShzZWxlY3ROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJ3lp4vljJboioLngrnmi5bmi73kuovku7ZcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpbml0RHJhZ05vZGUoKSB7XHJcbiAgICAgICAgbGV0IHBvaW50ZXIgPSBudWxsLFxyXG4gICAgICAgICAgICBwb2ludGVyWCA9IG51bGwsXHJcbiAgICAgICAgICAgIHBvaW50ZXJZID0gbnVsbCxcclxuICAgICAgICAgICAgZHJhZ1N0YXJ0WCA9IG51bGwsXHJcbiAgICAgICAgICAgIGRyYWdTdGFydFkgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmdyYXBoSW5zdGFuY2Uub24oJ25vZGU6ZHJhZ3N0YXJ0JywgZXYgPT4ge1xyXG4gICAgICAgICAgICBwb2ludGVyID0gdGhpcy5ncmFwaEluc3RhbmNlLmZpbmRCeUlkKGV2Lml0ZW0uZ2V0TW9kZWwoKS5leHRlcm5hbFBvaW50ZXJJZCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZihwb2ludGVyKSB7XHJcbiAgICAgICAgICAgICAgICBwb2ludGVyWCA9IHBvaW50ZXIuZ2V0TW9kZWwoKS54LFxyXG4gICAgICAgICAgICAgICAgcG9pbnRlclkgPSBwb2ludGVyLmdldE1vZGVsKCkueTtcclxuICAgICAgICAgICAgICAgIGRyYWdTdGFydFggPSBldi5jYW52YXNYO1xyXG4gICAgICAgICAgICAgICAgZHJhZ1N0YXJ0WSA9IGV2LmNhbnZhc1k7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ncmFwaEluc3RhbmNlLm9uKCdub2RlOmRyYWdlbmQnLCBldiA9PiB7XHJcbiAgICAgICAgICAgIHBvaW50ZXIgPSBudWxsO1xyXG4gICAgICAgICAgICBwb2ludGVyWCA9IG51bGwsXHJcbiAgICAgICAgICAgIHBvaW50ZXJZID0gbnVsbCxcclxuICAgICAgICAgICAgZHJhZ1N0YXJ0WCA9IG51bGwsXHJcbiAgICAgICAgICAgIGRyYWdTdGFydFkgPSBudWxsO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmdyYXBoSW5zdGFuY2Uub24oJ25vZGU6ZHJhZycsIGV2ID0+IHtcclxuICAgICAgICAgICAgaWYoIXBvaW50ZXIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGR4ID0gZXYuY2FudmFzWCAtIGRyYWdTdGFydFgsXHJcbiAgICAgICAgICAgICAgICBkeSA9IGV2LmNhbnZhc1kgLSBkcmFnU3RhcnRZLFxyXG4gICAgICAgICAgICAgICAgem9vbSA9IHRoaXMuZ3JhcGhJbnN0YW5jZS5nZXRab29tKCk7XHJcblxyXG4gICAgICAgICAgICBwb2ludGVyLnVwZGF0ZVBvc2l0aW9uKHtcclxuICAgICAgICAgICAgICAgIHg6IHBvaW50ZXJYICsgZHggLyB6b29tLFxyXG4gICAgICAgICAgICAgICAgeTogcG9pbnRlclkgKyBkeSAvIHpvb21cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJ3lp4vljJboioIv6L656YCJ5LitXHJcbiAgICAgKiBAcGFyYW0gc2VsZWN0Tm9kZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRTZWxlY3ROb2RlKHNlbGVjdE5vZGU6IGJvb2xlYW4gfCBzdHJpbmdbXSkge1xyXG4gICAgICAgIGxldCBkZWZhdWx0SGlnaGxpZ2h0Q29sb3IgPSAnI2YwOGE1ZCcsXHJcbiAgICAgICAgICAgIGN1clNlbGVjdEl0ZW0gPSBudWxsLFxyXG4gICAgICAgICAgICBjdXJTZWxlY3RJdGVtU3R5bGUgPSBudWxsO1xyXG5cclxuICAgICAgICBpZihzZWxlY3ROb2RlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3RDYWxsYmFjayA9IGV2ID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGV2Lml0ZW0sXHJcbiAgICAgICAgICAgICAgICAgIG1vZGVsID0gaXRlbS5nZXRNb2RlbCgpLFxyXG4gICAgICAgICAgICAgICAgICB0eXBlID0gaXRlbS5nZXRUeXBlKCksXHJcbiAgICAgICAgICAgICAgICAgIG5hbWUgPSBtb2RlbC5tb2RlbE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodENvbG9yID0gbW9kZWwuc3R5bGUuc2VsZWN0ZWRDb2xvcjtcclxuXHJcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkoc2VsZWN0Tm9kZSkgJiYgc2VsZWN0Tm9kZS5maW5kKGl0ZW0gPT4gaXRlbSA9PT0gbmFtZSkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZihjdXJTZWxlY3RJdGVtICYmIGN1clNlbGVjdEl0ZW0gIT09IGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGN1clNlbGVjdEl0ZW0udXBkYXRlKHtcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogY3VyU2VsZWN0SXRlbVN0eWxlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VyU2VsZWN0SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgICAgIGN1clNlbGVjdEl0ZW1TdHlsZSA9IFV0aWwub2JqZWN0Q2xvbmUoY3VyU2VsZWN0SXRlbS5nZXRNb2RlbCgpLnN0eWxlKTtcclxuICAgICAgICAgICAgY3VyU2VsZWN0SXRlbS51cGRhdGUoe1xyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi5jdXJTZWxlY3RJdGVtU3R5bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgW3R5cGUgPT09ICdub2RlJz8gJ2ZpbGwnOiAnc3Ryb2tlJ106IGhpZ2hsaWdodENvbG9yIHx8IGRlZmF1bHRIaWdobGlnaHRDb2xvclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmdyYXBoSW5zdGFuY2Uub24oJ25vZGU6Y2xpY2snLCBzZWxlY3RDYWxsYmFjayk7XHJcbiAgICAgICAgdGhpcy5ncmFwaEluc3RhbmNlLm9uKCdlZGdlOmNsaWNrJywgc2VsZWN0Q2FsbGJhY2spO1xyXG4gICAgICAgIHRoaXMuZ3JhcGhJbnN0YW5jZS5vbignY2xpY2snLCBldiA9PiB7XHJcbiAgICAgICAgICAgIGlmKGN1clNlbGVjdEl0ZW0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VyU2VsZWN0SXRlbS51cGRhdGUoe1xyXG4gICAgICAgICAgICAgICAgc3R5bGU6IGN1clNlbGVjdEl0ZW1TdHlsZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGN1clNlbGVjdEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICBjdXJTZWxlY3RJdGVtU3R5bGUgPSBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog57uR5a6aIEc2IOS6i+S7tlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSBcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyBvbihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgaWYodGhpcy5ncmFwaEluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JhcGhJbnN0YW5jZS5vbihldmVudE5hbWUsIGNhbGxiYWNrKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///11\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Group = void 0;\r\nconst util_1 = __webpack_require__(0);\r\nconst boundingRect_1 = __webpack_require__(3);\r\nclass Group {\r\n constructor(...arg) {\r\n this.elements = [];\r\n this.id = util_1.Util.generateId();\r\n if (arg) {\r\n this.add(...arg);\r\n }\r\n }\r\n add(...arg) {\r\n arg.map(ele => {\r\n this.elements.push(ele);\r\n });\r\n }\r\n remove(element) {\r\n util_1.Util.removeFromList(this.elements, item => item.id === element.id);\r\n }\r\n getBound() {\r\n return boundingRect_1.Bound.union(...this.elements.map(item => item.getBound()));\r\n }\r\n translate(dx, dy) {\r\n this.elements.map(item => {\r\n if (item instanceof Group) {\r\n item.translate(dx, dy);\r\n }\r\n else {\r\n item.set('x', item.get('x') + dx);\r\n item.set('y', item.get('y') + dy);\r\n }\r\n });\r\n }\r\n rotate(rotation, center) {\r\n }\r\n clear() {\r\n this.elements.length = 0;\r\n }\r\n}\r\nexports.Group = Group;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy9ncm91cC50cz9iZmE4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUFzQztBQUN0Qyw4Q0FBMkQ7QUFTM0QsTUFBYSxLQUFLO0lBSWQsWUFBWSxHQUFHLEdBQTJCO1FBRmxDLGFBQVEsR0FBMkIsRUFBRSxDQUFDO1FBRzFDLElBQUksQ0FBQyxFQUFFLEdBQUcsV0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTVCLElBQUcsR0FBRyxFQUFFO1lBQ0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO0lBQ0wsQ0FBQztJQU1ELEdBQUcsQ0FBQyxHQUFHLEdBQTJCO1FBQzlCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFNRCxNQUFNLENBQUMsT0FBd0I7UUFDM0IsV0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUtELFFBQVE7UUFDSixPQUFPLG9CQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFPRCxTQUFTLENBQUMsRUFBVSxFQUFFLEVBQVU7UUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDckIsSUFBRyxJQUFJLFlBQVksS0FBSyxFQUFFO2dCQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUMxQjtpQkFDSTtnQkFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2FBQ3JDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBT0QsTUFBTSxDQUFDLFFBQWdCLEVBQUUsTUFBeUI7SUF1QmxELENBQUM7SUFLRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQTFGRCxzQkEwRkMiLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVdGlsIH0gZnJvbSBcIi4uL0NvbW1vbi91dGlsXCI7XHJcbmltcG9ydCB7IEJvdW5kaW5nUmVjdCwgQm91bmQgfSBmcm9tIFwiLi4vVmlldy9ib3VuZGluZ1JlY3RcIjtcclxuaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSBcIi4uL0NvbW1vbi92ZWN0b3JcIjtcclxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gXCIuLi9Nb2RlbC9tb2RlbERhdGFcIjtcclxuXHJcblxyXG5cclxuLyoqXHJcbiAqIGVsZW1lbnTnu4RcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHcm91cCB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBlbGVtZW50czogQXJyYXk8RWxlbWVudCB8IEdyb3VwPiA9IFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKC4uLmFyZzogQXJyYXk8RWxlbWVudCB8IEdyb3VwPikge1xyXG4gICAgICAgIHRoaXMuaWQgPSBVdGlsLmdlbmVyYXRlSWQoKTtcclxuXHJcbiAgICAgICAgaWYoYXJnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkKC4uLmFyZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75YqgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIGFyZyBcclxuICAgICAqL1xyXG4gICAgYWRkKC4uLmFyZzogQXJyYXk8RWxlbWVudCB8IEdyb3VwPikge1xyXG4gICAgICAgIGFyZy5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5wdXNoKGVsZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaRlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlKGVsZW1lbnQ6IEVsZW1lbnQgfCBHcm91cCkge1xyXG4gICAgICAgIFV0aWwucmVtb3ZlRnJvbUxpc3QodGhpcy5lbGVtZW50cywgaXRlbSA9PiBpdGVtLmlkID09PSBlbGVtZW50LmlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPlmdyb3Vw55qE5YyF5Zu055uSXHJcbiAgICAgKi9cclxuICAgIGdldEJvdW5kKCk6IEJvdW5kaW5nUmVjdCB7XHJcbiAgICAgICAgcmV0dXJuIEJvdW5kLnVuaW9uKC4uLnRoaXMuZWxlbWVudHMubWFwKGl0ZW0gPT4gaXRlbS5nZXRCb3VuZCgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkvY3np7tncm91cFxyXG4gICAgICogQHBhcmFtIGR4IFxyXG4gICAgICogQHBhcmFtIGR5IFxyXG4gICAgICovXHJcbiAgICB0cmFuc2xhdGUoZHg6IG51bWJlciwgZHk6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpZihpdGVtIGluc3RhbmNlb2YgR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0udHJhbnNsYXRlKGR4LCBkeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnNldCgneCcsIGl0ZW0uZ2V0KCd4JykgKyBkeCk7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnNldCgneScsIGl0ZW0uZ2V0KCd5JykgKyBkeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaXi+i9rGdyb3VwXHJcbiAgICAgKiBAcGFyYW0gcm90YXRpb24gXHJcbiAgICAgKiBAcGFyYW0gY2VudGVyXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZShyb3RhdGlvbjogbnVtYmVyLCBjZW50ZXI/OiBbbnVtYmVyLCBudW1iZXJdKSB7XHJcbiAgICAgICAgLy8gaWYocm90YXRpb24gPT09IDApIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gbGV0IHt4LCB5LCB3aWR0aCwgaGVpZ2h0fSA9IHRoaXMuZ2V0Qm91bmQoKSxcclxuICAgICAgICAvLyAgICAgY3ggPSB4ICsgd2lkdGggLyAyLCBcclxuICAgICAgICAvLyAgICAgY3kgPSB5ICsgaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgLy8gaWYoY2VudGVyKSB7XHJcbiAgICAgICAgLy8gICAgIGN4ID0gY2VudGVyWzBdO1xyXG4gICAgICAgIC8vICAgICBjeSA9IGNlbnRlclsxXTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIHRoaXMuZWxlbWVudHMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgIC8vICAgICBpZihpdGVtIGluc3RhbmNlb2YgR3JvdXApIHtcclxuICAgICAgICAvLyAgICAgICAgIGl0ZW0ucm90YXRlKHJvdGF0aW9uLCBbY3gsIGN5XSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICBsZXQgZCA9IFZlY3Rvci5yb3RhdGlvbihyb3RhdGlvbiwgW2l0ZW0ueCwgaXRlbS55XSwgW2N4LCBjeV0pO1xyXG4gICAgICAgIC8vICAgICAgICAgaXRlbS54ID0gZFswXTtcclxuICAgICAgICAvLyAgICAgICAgIGl0ZW0ueSA9IGRbMV07XHJcbiAgICAgICAgLy8gICAgICAgICBpdGVtLnNldCgncm90YXRpb24nLCByb3RhdGlvbik7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4heepumdyb3VwXHJcbiAgICAgKi9cclxuICAgIGNsZWFyKCkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubGVuZ3RoID0gMDtcclxuICAgIH1cclxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///12\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst G6 = __webpack_require__(1);\r\nexports.default = G6.registerNode('external-pointer', {\r\n draw(cfg, group) {\r\n cfg.size = cfg.size || [8, 35];\r\n const keyShape = group.addShape('path', {\r\n attrs: {\r\n path: this.getPath(cfg),\r\n fill: cfg.style.fill\r\n },\r\n name: 'pointer-path'\r\n });\r\n if (cfg.label) {\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n group.addShape('text', {\r\n attrs: {\r\n x: cfg.size[0] + 2,\r\n y: -cfg.size[1],\r\n textAlign: 'left',\r\n textBaseline: 'middle',\r\n text: cfg.label,\r\n fill: style.fill || '#000',\r\n fontSize: style.fontSize || 16\r\n },\r\n name: 'pointer-text-shape'\r\n });\r\n }\r\n return keyShape;\r\n },\r\n getPath(cfg) {\r\n let width = cfg.size[0], height = cfg.size[1], arrowWidth = width + 4, arrowHeight = height * 0.3;\r\n const path = [\r\n ['M', 0, 0],\r\n ['L', -width / 2 - (arrowWidth / 2), -arrowHeight],\r\n ['L', -width / 2, -arrowHeight],\r\n ['L', -width / 2, -height],\r\n ['L', width / 2, -height],\r\n ['L', width / 2, -arrowHeight],\r\n ['L', width / 2 + (arrowWidth / 2), -arrowHeight],\r\n ['Z'],\r\n ];\r\n return path;\r\n },\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL2V4dGVybmFsUG9pbnRlci50cz8yNDE3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0NBQXFDO0FBR3JDLGtCQUFlLEVBQUUsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUU7SUFDL0MsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQ1gsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRS9CLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3BDLEtBQUssRUFBRTtnQkFDSCxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUk7YUFDdkI7WUFDRCxJQUFJLEVBQUUsY0FBYztTQUN2QixDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7WUFDWCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ25CLEtBQUssRUFBRTtvQkFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUNsQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDZixTQUFTLEVBQUUsTUFBTTtvQkFDakIsWUFBWSxFQUFFLFFBQVE7b0JBQ3RCLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSztvQkFDZixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNO29CQUMxQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFO2lCQUNqQztnQkFDRCxJQUFJLEVBQUUsb0JBQW9CO2FBQzdCLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHO1FBQ1AsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDbkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUN0QixXQUFXLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUUvQixNQUFNLElBQUksR0FBRztZQUNULENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDWCxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDbEQsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQy9CLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUMxQixDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3pCLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDOUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUNqRCxDQUFDLEdBQUcsQ0FBQztTQUNSLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0osQ0FBQyxDQUFDIiwiZmlsZSI6IjEzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgRzYgZnJvbSBcIi4vLi4vTGliL2c2LmpzXCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRzYucmVnaXN0ZXJOb2RlKCdleHRlcm5hbC1wb2ludGVyJywge1xyXG4gICAgZHJhdyhjZmcsIGdyb3VwKSB7XHJcbiAgICAgICAgY2ZnLnNpemUgPSBjZmcuc2l6ZSB8fCBbOCwgMzVdO1xyXG5cclxuICAgICAgICBjb25zdCBrZXlTaGFwZSA9IGdyb3VwLmFkZFNoYXBlKCdwYXRoJywge1xyXG4gICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgcGF0aDogdGhpcy5nZXRQYXRoKGNmZyksXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBjZmcuc3R5bGUuZmlsbFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lOiAncG9pbnRlci1wYXRoJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoY2ZnLmxhYmVsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gKGNmZy5sYWJlbENmZyAmJiBjZmcubGFiZWxDZmcuc3R5bGUpIHx8IHt9O1xyXG4gICAgICAgICAgICBncm91cC5hZGRTaGFwZSgndGV4dCcsIHtcclxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogY2ZnLnNpemVbMF0gKyAyLCAvLyDlsYXkuK1cclxuICAgICAgICAgICAgICAgICAgICB5OiAtY2ZnLnNpemVbMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZmcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogc3R5bGUuZmlsbCB8fCAnIzAwMCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlLmZvbnRTaXplIHx8IDE2XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3BvaW50ZXItdGV4dC1zaGFwZSdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ga2V5U2hhcGU7XHJcbiAgICB9LFxyXG4gICAgXHJcbiAgICBnZXRQYXRoKGNmZykge1xyXG4gICAgICAgIGxldCB3aWR0aCA9IGNmZy5zaXplWzBdLFxyXG4gICAgICAgICAgICBoZWlnaHQgPSBjZmcuc2l6ZVsxXSxcclxuICAgICAgICAgICAgYXJyb3dXaWR0aCA9IHdpZHRoICsgNCxcclxuICAgICAgICAgICAgYXJyb3dIZWlnaHQgPSBoZWlnaHQgKiAwLjM7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBbXHJcbiAgICAgICAgICAgIFsnTScsIDAsIDBdLCBcclxuICAgICAgICAgICAgWydMJywgLXdpZHRoIC8gMiAtIChhcnJvd1dpZHRoIC8gMiksIC1hcnJvd0hlaWdodF0sXHJcbiAgICAgICAgICAgIFsnTCcsIC13aWR0aCAvIDIsIC1hcnJvd0hlaWdodF0sXHJcbiAgICAgICAgICAgIFsnTCcsIC13aWR0aCAvIDIsIC1oZWlnaHRdLFxyXG4gICAgICAgICAgICBbJ0wnLCB3aWR0aCAvIDIsIC1oZWlnaHRdLFxyXG4gICAgICAgICAgICBbJ0wnLCB3aWR0aCAvIDIsIC1hcnJvd0hlaWdodF0sXHJcbiAgICAgICAgICAgIFsnTCcsIHdpZHRoIC8gMiArIChhcnJvd1dpZHRoIC8gMiksIC1hcnJvd0hlaWdodF0sXHJcbiAgICAgICAgICAgIFsnWiddLCBcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICByZXR1cm4gcGF0aDtcclxuICAgIH0sXHJcbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///13\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst G6 = __webpack_require__(1);\r\nexports.default = G6.registerNode('link-list-node', {\r\n draw(cfg, group) {\r\n cfg.size = cfg.size || [30, 10];\r\n const width = cfg.size[0], height = cfg.size[1];\r\n const wrapperRect = group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width,\r\n height: height,\r\n stroke: cfg.style.stroke,\r\n fill: '#eee'\r\n },\r\n name: 'wrapper'\r\n });\r\n group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width * (2 / 3),\r\n height: height,\r\n fill: cfg.style.fill,\r\n stroke: cfg.style.stroke\r\n },\r\n name: 'main-rect',\r\n draggable: true\r\n });\r\n if (cfg.label) {\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n group.addShape('text', {\r\n attrs: {\r\n x: width * (5 / 6),\r\n y: height,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: cfg.label,\r\n fill: style.fill || '#000',\r\n fontSize: style.fontSize || 16\r\n },\r\n name: 'text',\r\n draggable: true\r\n });\r\n }\r\n return wrapperRect;\r\n },\r\n getAnchorPoints() {\r\n return [\r\n [0, 0.5],\r\n [5 / 6, 0.5],\r\n [5 / 6, 0],\r\n [5 / 6, 1]\r\n ];\r\n }\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL2xpbmtMaXN0Tm9kZS50cz9iMTk2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0NBQXFDO0FBR3JDLGtCQUFlLEVBQUUsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUU7SUFDN0MsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQ1gsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWhDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ25CLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLEtBQUssRUFBRTtnQkFDSCxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUM7Z0JBQ1osQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUNiLEtBQUssRUFBRSxLQUFLO2dCQUNaLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ3hCLElBQUksRUFBRSxNQUFNO2FBQ2Y7WUFDRCxJQUFJLEVBQUUsU0FBUztTQUNsQixDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNuQixLQUFLLEVBQUU7Z0JBQ0gsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDO2dCQUNaLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQztnQkFDYixLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSTtnQkFDcEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTTthQUMzQjtZQUNELElBQUksRUFBRSxXQUFXO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztRQUVILElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtZQUNYLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6RCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtnQkFDbkIsS0FBSyxFQUFFO29CQUNILENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNsQixDQUFDLEVBQUUsTUFBTTtvQkFDVCxTQUFTLEVBQUUsUUFBUTtvQkFDbkIsWUFBWSxFQUFFLFFBQVE7b0JBQ3RCLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSztvQkFDZixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNO29CQUMxQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFO2lCQUNqQztnQkFDRCxJQUFJLEVBQUUsTUFBTTtnQkFDWixTQUFTLEVBQUUsSUFBSTthQUNsQixDQUFDLENBQUM7U0FDTjtRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxlQUFlO1FBQ1gsT0FBTztZQUNILENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNSLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDWixDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1YsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNiLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQyxDQUFDIiwiZmlsZSI6IjE0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgRzYgZnJvbSBcIi4vLi4vTGliL2c2LmpzXCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRzYucmVnaXN0ZXJOb2RlKCdsaW5rLWxpc3Qtbm9kZScsIHtcclxuICAgIGRyYXcoY2ZnLCBncm91cCkge1xyXG4gICAgICAgIGNmZy5zaXplID0gY2ZnLnNpemUgfHwgWzMwLCAxMF07XHJcblxyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gY2ZnLnNpemVbMF0sXHJcbiAgICAgICAgICAgICAgaGVpZ2h0ID0gY2ZnLnNpemVbMV07XHJcblxyXG4gICAgICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gZ3JvdXAuYWRkU2hhcGUoJ3JlY3QnLCB7XHJcbiAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICB4OiB3aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICB5OiBoZWlnaHQgLyAyLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBzdHJva2U6IGNmZy5zdHlsZS5zdHJva2UsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiAnI2VlZSdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbmFtZTogJ3dyYXBwZXInXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xyXG4gICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgeDogd2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgICAgeTogaGVpZ2h0IC8gMixcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCAqICgyIC8gMyksXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcclxuICAgICAgICAgICAgICAgIGZpbGw6IGNmZy5zdHlsZS5maWxsLFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjZmcuc3R5bGUuc3Ryb2tlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5hbWU6ICdtYWluLXJlY3QnLFxyXG4gICAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNmZy5sYWJlbCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IChjZmcubGFiZWxDZmcgJiYgY2ZnLmxhYmVsQ2ZnLnN0eWxlKSB8fCB7fTtcclxuICAgICAgICAgICAgZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XHJcbiAgICAgICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IHdpZHRoICogKDUgLyA2KSwgXHJcbiAgICAgICAgICAgICAgICAgICAgeTogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZmcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogc3R5bGUuZmlsbCB8fCAnIzAwMCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlLmZvbnRTaXplIHx8IDE2XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RleHQnLFxyXG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHdyYXBwZXJSZWN0O1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRBbmNob3JQb2ludHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgWzAsIDAuNV0sXHJcbiAgICAgICAgICAgIFs1IC8gNiwgMC41XSxcclxuICAgICAgICAgICAgWzUgLyA2LCAwXSxcclxuICAgICAgICAgICAgWzUgLyA2LCAxXVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///14\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst G6 = __webpack_require__(1);\r\nexports.default = G6.registerNode('binary-tree-node', {\r\n draw(cfg, group) {\r\n cfg.size = cfg.size || [60, 30];\r\n const width = cfg.size[0], height = cfg.size[1];\r\n const wrapperRect = group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width,\r\n height: height,\r\n stroke: cfg.style.stroke,\r\n cursor: cfg.style.cursor,\r\n fill: '#eee'\r\n },\r\n name: 'wrapper'\r\n });\r\n group.addShape('rect', {\r\n attrs: {\r\n x: width / 4 + width / 2,\r\n y: height / 2,\r\n width: width / 2,\r\n height: height,\r\n fill: cfg.style.fill,\r\n stroke: cfg.style.stroke,\r\n cursor: cfg.style.cursor\r\n },\r\n name: 'mid',\r\n draggable: true\r\n });\r\n if (cfg.label) {\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n group.addShape('text', {\r\n attrs: {\r\n x: width,\r\n y: height,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: cfg.label,\r\n fill: style.fill || '#000',\r\n fontSize: style.fontSize || 16,\r\n cursor: cfg.style.cursor\r\n },\r\n name: 'text',\r\n draggable: true\r\n });\r\n }\r\n return wrapperRect;\r\n },\r\n getAnchorPoints() {\r\n return [\r\n [0.5, 0],\r\n [0.125, 0.5],\r\n [0.875, 0.5],\r\n ];\r\n },\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL2JpbmFyeVRyZWVOb2RlLnRzPzZkMjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBcUM7QUFHckMsa0JBQWUsRUFBRSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRTtJQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUs7UUFDWCxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFaEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDbkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDdkMsS0FBSyxFQUFFO2dCQUNILENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQztnQkFDWixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUM7Z0JBQ2IsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFDeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFDeEIsSUFBSSxFQUFFLE1BQU07YUFDZjtZQUNELElBQUksRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ25CLEtBQUssRUFBRTtnQkFDSCxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQztnQkFDeEIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUNiLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQztnQkFDaEIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSTtnQkFDcEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFDeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTTthQUMzQjtZQUNELElBQUksRUFBRSxLQUFLO1lBQ1gsU0FBUyxFQUFFLElBQUk7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQ1gsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pELEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUNuQixLQUFLLEVBQUU7b0JBQ0gsQ0FBQyxFQUFFLEtBQUs7b0JBQ1IsQ0FBQyxFQUFFLE1BQU07b0JBQ1QsU0FBUyxFQUFFLFFBQVE7b0JBQ25CLFlBQVksRUFBRSxRQUFRO29CQUN0QixJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUs7b0JBQ2YsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksTUFBTTtvQkFDMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRTtvQkFDOUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTTtpQkFDM0I7Z0JBQ0QsSUFBSSxFQUFFLE1BQU07Z0JBQ1osU0FBUyxFQUFFLElBQUk7YUFDbEIsQ0FBQyxDQUFDO1NBQ047UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQsZUFBZTtRQUNYLE9BQU87WUFDSCxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDUixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDWixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7U0FDZixDQUFDO0lBQ04sQ0FBQztDQUNKLENBQUMsQ0FBQyIsImZpbGUiOiIxNS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEc2IGZyb20gXCIuLy4uL0xpYi9nNi5qc1wiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEc2LnJlZ2lzdGVyTm9kZSgnYmluYXJ5LXRyZWUtbm9kZScsIHtcclxuICAgIGRyYXcoY2ZnLCBncm91cCkge1xyXG4gICAgICAgIGNmZy5zaXplID0gY2ZnLnNpemUgfHwgWzYwLCAzMF07XHJcblxyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gY2ZnLnNpemVbMF0sXHJcbiAgICAgICAgICAgICAgaGVpZ2h0ID0gY2ZnLnNpemVbMV07XHJcblxyXG4gICAgICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gZ3JvdXAuYWRkU2hhcGUoJ3JlY3QnLCB7XHJcbiAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICB4OiB3aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICB5OiBoZWlnaHQgLyAyLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBzdHJva2U6IGNmZy5zdHlsZS5zdHJva2UsXHJcbiAgICAgICAgICAgICAgICBjdXJzb3I6IGNmZy5zdHlsZS5jdXJzb3IsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiAnI2VlZSdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbmFtZTogJ3dyYXBwZXInXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xyXG4gICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgeDogd2lkdGggLyA0ICsgd2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgICAgeTogaGVpZ2h0IC8gMixcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcclxuICAgICAgICAgICAgICAgIGZpbGw6IGNmZy5zdHlsZS5maWxsLFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjZmcuc3R5bGUuc3Ryb2tlLFxyXG4gICAgICAgICAgICAgICAgY3Vyc29yOiBjZmcuc3R5bGUuY3Vyc29yXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5hbWU6ICdtaWQnLFxyXG4gICAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNmZy5sYWJlbCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IChjZmcubGFiZWxDZmcgJiYgY2ZnLmxhYmVsQ2ZnLnN0eWxlKSB8fCB7fTtcclxuICAgICAgICAgICAgZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XHJcbiAgICAgICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IHdpZHRoLCAvLyDlsYXkuK1cclxuICAgICAgICAgICAgICAgICAgICB5OiBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGNmZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBzdHlsZS5maWxsIHx8ICcjMDAwJyxcclxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogc3R5bGUuZm9udFNpemUgfHwgMTYsXHJcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBjZmcuc3R5bGUuY3Vyc29yXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RleHQnLFxyXG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHdyYXBwZXJSZWN0O1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRBbmNob3JQb2ludHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgWzAuNSwgMF0sXHJcbiAgICAgICAgICAgIFswLjEyNSwgMC41XSxcclxuICAgICAgICAgICAgWzAuODc1LCAwLjVdLFxyXG4gICAgICAgIF07XHJcbiAgICB9LFxyXG59KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///15\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst G6 = __webpack_require__(1);\r\nexports.default = G6.registerNode('two-cell-node', {\r\n draw(cfg, group) {\r\n cfg.size = cfg.size || [30, 10];\r\n const width = cfg.size[0], height = cfg.size[1];\r\n const wrapperRect = group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width,\r\n height: height,\r\n stroke: cfg.style.stroke,\r\n fill: '#eee'\r\n },\r\n name: 'wrapper'\r\n });\r\n group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width / 2,\r\n height: height,\r\n fill: cfg.style.fill,\r\n stroke: cfg.style.stroke\r\n },\r\n name: 'left-rect',\r\n draggable: true\r\n });\r\n if (cfg.label) {\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n group.addShape('text', {\r\n attrs: {\r\n x: width * (3 / 4),\r\n y: height,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: cfg.label,\r\n fill: style.fill || '#000',\r\n fontSize: style.fontSize || 16\r\n },\r\n name: 'text',\r\n draggable: true\r\n });\r\n }\r\n return wrapperRect;\r\n },\r\n getAnchorPoints() {\r\n return [\r\n [0, 0.5],\r\n [3 / 4, 0.5]\r\n ];\r\n }\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL3R3b0NlbGxOb2RlLnRzP2RlYjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBcUM7QUFJckMsa0JBQWUsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUU7SUFDNUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQ1gsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWhDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ25CLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLEtBQUssRUFBRTtnQkFDSCxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUM7Z0JBQ1osQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUNiLEtBQUssRUFBRSxLQUFLO2dCQUNaLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ3hCLElBQUksRUFBRSxNQUFNO2FBQ2Y7WUFDRCxJQUFJLEVBQUUsU0FBUztTQUNsQixDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNuQixLQUFLLEVBQUU7Z0JBQ0gsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDO2dCQUNaLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQztnQkFDYixLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUM7Z0JBQ2hCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQ3BCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07YUFDM0I7WUFDRCxJQUFJLEVBQUUsV0FBVztZQUNqQixTQUFTLEVBQUUsSUFBSTtTQUNsQixDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7WUFDWCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ25CLEtBQUssRUFBRTtvQkFDSCxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEIsQ0FBQyxFQUFFLE1BQU07b0JBQ1QsU0FBUyxFQUFFLFFBQVE7b0JBQ25CLFlBQVksRUFBRSxRQUFRO29CQUN0QixJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUs7b0JBQ2YsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksTUFBTTtvQkFDMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRTtpQkFDakM7Z0JBQ0QsSUFBSSxFQUFFLE1BQU07Z0JBQ1osU0FBUyxFQUFFLElBQUk7YUFDbEIsQ0FBQyxDQUFDO1NBQ047UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQsZUFBZTtRQUNYLE9BQU87WUFDSCxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDUixDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDO1NBQ2YsQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDLENBQUMiLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBHNiBmcm9tIFwiLi8uLi9MaWIvZzYuanNcIjtcclxuXHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRzYucmVnaXN0ZXJOb2RlKCd0d28tY2VsbC1ub2RlJywge1xyXG4gICAgZHJhdyhjZmcsIGdyb3VwKSB7XHJcbiAgICAgICAgY2ZnLnNpemUgPSBjZmcuc2l6ZSB8fCBbMzAsIDEwXTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBjZmcuc2l6ZVswXSxcclxuICAgICAgICAgICAgICBoZWlnaHQgPSBjZmcuc2l6ZVsxXTtcclxuXHJcbiAgICAgICAgY29uc3Qgd3JhcHBlclJlY3QgPSBncm91cC5hZGRTaGFwZSgncmVjdCcsIHtcclxuICAgICAgICAgICAgYXR0cnM6IHtcclxuICAgICAgICAgICAgICAgIHg6IHdpZHRoIC8gMixcclxuICAgICAgICAgICAgICAgIHk6IGhlaWdodCAvIDIsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcclxuICAgICAgICAgICAgICAgIHN0cm9rZTogY2ZnLnN0eWxlLnN0cm9rZSxcclxuICAgICAgICAgICAgICAgIGZpbGw6ICcjZWVlJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lOiAnd3JhcHBlcidcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ3JvdXAuYWRkU2hhcGUoJ3JlY3QnLCB7XHJcbiAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICB4OiB3aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICB5OiBoZWlnaHQgLyAyLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoIC8gMixcclxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZmlsbDogY2ZnLnN0eWxlLmZpbGwsXHJcbiAgICAgICAgICAgICAgICBzdHJva2U6IGNmZy5zdHlsZS5zdHJva2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbmFtZTogJ2xlZnQtcmVjdCcsXHJcbiAgICAgICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoY2ZnLmxhYmVsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gKGNmZy5sYWJlbENmZyAmJiBjZmcubGFiZWxDZmcuc3R5bGUpIHx8IHt9O1xyXG4gICAgICAgICAgICBncm91cC5hZGRTaGFwZSgndGV4dCcsIHtcclxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogd2lkdGggKiAoMyAvIDQpLCBcclxuICAgICAgICAgICAgICAgICAgICB5OiBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGNmZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBzdHlsZS5maWxsIHx8ICcjMDAwJyxcclxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogc3R5bGUuZm9udFNpemUgfHwgMTZcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gd3JhcHBlclJlY3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEFuY2hvclBvaW50cygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBbMCwgMC41XSxcclxuICAgICAgICAgICAgWzMgLyA0LCAwLjVdXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///16\n")}])}));