From 86a6067977411d0363b06a462409e8db4f2a2618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Sun, 23 Jun 2024 14:40:49 +0900 Subject: [PATCH] [obsidian] vault backup: 2024-06-23 14:40:49[ --- .../.obsidian/plugins/obsidian-git/main.js | 4866 ++++++----------- .../plugins/obsidian-git/manifest.json | 2 +- .../obsidian-zotero-desktop-connector/main.js | 4 +- .../manifest.json | 2 +- 4 files changed, 1558 insertions(+), 3316 deletions(-) diff --git a/content/.obsidian/plugins/obsidian-git/main.js b/content/.obsidian/plugins/obsidian-git/main.js index f778e266..5e45db74 100644 --- a/content/.obsidian/plugins/obsidian-git/main.js +++ b/content/.obsidian/plugins/obsidian-git/main.js @@ -42,9 +42,9 @@ var __publicField = (obj, key2, value) => { return value; }; -// node_modules/base64-js/index.js +// node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js var require_base64_js = __commonJS({ - "node_modules/base64-js/index.js"(exports2) { + "node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js"(exports2) { "use strict"; init_polyfill_buffer(); exports2.byteLength = byteLength; @@ -145,9 +145,9 @@ var require_base64_js = __commonJS({ } }); -// node_modules/ieee754/index.js +// node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js var require_ieee754 = __commonJS({ - "node_modules/ieee754/index.js"(exports2) { + "node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js"(exports2) { init_polyfill_buffer(); exports2.read = function(buffer2, offset, isLE, mLen, nBytes) { var e, m; @@ -229,9 +229,9 @@ var require_ieee754 = __commonJS({ } }); -// node_modules/buffer/index.js +// node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js var require_buffer = __commonJS({ - "node_modules/buffer/index.js"(exports2) { + "node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js"(exports2) { "use strict"; init_polyfill_buffer(); var base64 = require_base64_js(); @@ -1939,9 +1939,9 @@ var init_polyfill_buffer = __esm({ } }); -// node_modules/async-lock/lib/index.js +// node_modules/.pnpm/async-lock@1.4.1/node_modules/async-lock/lib/index.js var require_lib = __commonJS({ - "node_modules/async-lock/lib/index.js"(exports2, module2) { + "node_modules/.pnpm/async-lock@1.4.1/node_modules/async-lock/lib/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var AsyncLock2 = function(opts) { @@ -2165,18 +2165,18 @@ var require_lib = __commonJS({ } }); -// node_modules/async-lock/index.js +// node_modules/.pnpm/async-lock@1.4.1/node_modules/async-lock/index.js var require_async_lock = __commonJS({ - "node_modules/async-lock/index.js"(exports2, module2) { + "node_modules/.pnpm/async-lock@1.4.1/node_modules/async-lock/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = require_lib(); } }); -// node_modules/inherits/inherits_browser.js +// node_modules/.pnpm/inherits@2.0.4/node_modules/inherits/inherits_browser.js var require_inherits_browser = __commonJS({ - "node_modules/inherits/inherits_browser.js"(exports2, module2) { + "node_modules/.pnpm/inherits@2.0.4/node_modules/inherits/inherits_browser.js"(exports2, module2) { init_polyfill_buffer(); if (typeof Object.create === "function") { module2.exports = function inherits(ctor, superCtor) { @@ -2207,9 +2207,9 @@ var require_inherits_browser = __commonJS({ } }); -// node_modules/safe-buffer/index.js +// node_modules/.pnpm/safe-buffer@5.2.1/node_modules/safe-buffer/index.js var require_safe_buffer = __commonJS({ - "node_modules/safe-buffer/index.js"(exports2, module2) { + "node_modules/.pnpm/safe-buffer@5.2.1/node_modules/safe-buffer/index.js"(exports2, module2) { init_polyfill_buffer(); var buffer2 = require_buffer(); var Buffer2 = buffer2.Buffer; @@ -2266,9 +2266,9 @@ var require_safe_buffer = __commonJS({ } }); -// node_modules/sha.js/hash.js +// node_modules/.pnpm/sha.js@2.4.11/node_modules/sha.js/hash.js var require_hash = __commonJS({ - "node_modules/sha.js/hash.js"(exports2, module2) { + "node_modules/.pnpm/sha.js@2.4.11/node_modules/sha.js/hash.js"(exports2, module2) { init_polyfill_buffer(); var Buffer2 = require_safe_buffer().Buffer; function Hash2(blockSize, finalSize) { @@ -2329,9 +2329,9 @@ var require_hash = __commonJS({ } }); -// node_modules/sha.js/sha1.js +// node_modules/.pnpm/sha.js@2.4.11/node_modules/sha.js/sha1.js var require_sha1 = __commonJS({ - "node_modules/sha.js/sha1.js"(exports2, module2) { + "node_modules/.pnpm/sha.js@2.4.11/node_modules/sha.js/sha1.js"(exports2, module2) { init_polyfill_buffer(); var inherits = require_inherits_browser(); var Hash2 = require_hash(); @@ -2412,9 +2412,9 @@ var require_sha1 = __commonJS({ } }); -// node_modules/crc-32/crc32.js +// node_modules/.pnpm/crc-32@1.2.2/node_modules/crc-32/crc32.js var require_crc32 = __commonJS({ - "node_modules/crc-32/crc32.js"(exports2) { + "node_modules/.pnpm/crc-32@1.2.2/node_modules/crc-32/crc32.js"(exports2) { init_polyfill_buffer(); var CRC32; (function(factory) { @@ -2517,9 +2517,9 @@ var require_crc32 = __commonJS({ } }); -// node_modules/pako/lib/utils/common.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/common.js var require_common = __commonJS({ - "node_modules/pako/lib/utils/common.js"(exports2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/common.js"(exports2) { "use strict"; init_polyfill_buffer(); var TYPED_OK = typeof Uint8Array !== "undefined" && typeof Uint16Array !== "undefined" && typeof Int32Array !== "undefined"; @@ -2609,9 +2609,9 @@ var require_common = __commonJS({ } }); -// node_modules/pako/lib/zlib/trees.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/trees.js var require_trees = __commonJS({ - "node_modules/pako/lib/zlib/trees.js"(exports2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/trees.js"(exports2) { "use strict"; init_polyfill_buffer(); var utils = require_common(); @@ -3252,9 +3252,9 @@ var require_trees = __commonJS({ } }); -// node_modules/pako/lib/zlib/adler32.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/adler32.js var require_adler32 = __commonJS({ - "node_modules/pako/lib/zlib/adler32.js"(exports2, module2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/adler32.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); function adler32(adler, buf, len, pos) { @@ -3275,9 +3275,9 @@ var require_adler32 = __commonJS({ } }); -// node_modules/pako/lib/zlib/crc32.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/crc32.js var require_crc322 = __commonJS({ - "node_modules/pako/lib/zlib/crc32.js"(exports2, module2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/crc32.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); function makeTable() { @@ -3304,9 +3304,9 @@ var require_crc322 = __commonJS({ } }); -// node_modules/pako/lib/zlib/messages.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/messages.js var require_messages = __commonJS({ - "node_modules/pako/lib/zlib/messages.js"(exports2, module2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/messages.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = { @@ -3332,9 +3332,9 @@ var require_messages = __commonJS({ } }); -// node_modules/pako/lib/zlib/deflate.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/deflate.js var require_deflate = __commonJS({ - "node_modules/pako/lib/zlib/deflate.js"(exports2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/deflate.js"(exports2) { "use strict"; init_polyfill_buffer(); var utils = require_common(); @@ -4382,9 +4382,9 @@ var require_deflate = __commonJS({ } }); -// node_modules/pako/lib/utils/strings.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/strings.js var require_strings = __commonJS({ - "node_modules/pako/lib/utils/strings.js"(exports2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/strings.js"(exports2) { "use strict"; init_polyfill_buffer(); var utils = require_common(); @@ -4525,9 +4525,9 @@ var require_strings = __commonJS({ } }); -// node_modules/pako/lib/zlib/zstream.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/zstream.js var require_zstream = __commonJS({ - "node_modules/pako/lib/zlib/zstream.js"(exports2, module2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/zstream.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); function ZStream() { @@ -4548,9 +4548,9 @@ var require_zstream = __commonJS({ } }); -// node_modules/pako/lib/deflate.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/deflate.js var require_deflate2 = __commonJS({ - "node_modules/pako/lib/deflate.js"(exports2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/deflate.js"(exports2) { "use strict"; init_polyfill_buffer(); var zlib_deflate = require_deflate(); @@ -4711,9 +4711,9 @@ var require_deflate2 = __commonJS({ } }); -// node_modules/pako/lib/zlib/inffast.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inffast.js var require_inffast = __commonJS({ - "node_modules/pako/lib/zlib/inffast.js"(exports2, module2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inffast.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var BAD = 30; @@ -4941,9 +4941,9 @@ var require_inffast = __commonJS({ } }); -// node_modules/pako/lib/zlib/inftrees.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inftrees.js var require_inftrees = __commonJS({ - "node_modules/pako/lib/zlib/inftrees.js"(exports2, module2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inftrees.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var utils = require_common(); @@ -5258,9 +5258,9 @@ var require_inftrees = __commonJS({ } }); -// node_modules/pako/lib/zlib/inflate.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inflate.js var require_inflate = __commonJS({ - "node_modules/pako/lib/zlib/inflate.js"(exports2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inflate.js"(exports2) { "use strict"; init_polyfill_buffer(); var utils = require_common(); @@ -6475,9 +6475,9 @@ var require_inflate = __commonJS({ } }); -// node_modules/pako/lib/zlib/constants.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/constants.js var require_constants = __commonJS({ - "node_modules/pako/lib/zlib/constants.js"(exports2, module2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/constants.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = { @@ -6523,9 +6523,9 @@ var require_constants = __commonJS({ } }); -// node_modules/pako/lib/zlib/gzheader.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/gzheader.js var require_gzheader = __commonJS({ - "node_modules/pako/lib/zlib/gzheader.js"(exports2, module2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/gzheader.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); function GZheader() { @@ -6544,9 +6544,9 @@ var require_gzheader = __commonJS({ } }); -// node_modules/pako/lib/inflate.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/inflate.js var require_inflate2 = __commonJS({ - "node_modules/pako/lib/inflate.js"(exports2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/inflate.js"(exports2) { "use strict"; init_polyfill_buffer(); var zlib_inflate = require_inflate(); @@ -6720,9 +6720,9 @@ var require_inflate2 = __commonJS({ } }); -// node_modules/pako/index.js +// node_modules/.pnpm/pako@1.0.11/node_modules/pako/index.js var require_pako = __commonJS({ - "node_modules/pako/index.js"(exports2, module2) { + "node_modules/.pnpm/pako@1.0.11/node_modules/pako/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var assign2 = require_common().assign; @@ -6735,9 +6735,9 @@ var require_pako = __commonJS({ } }); -// node_modules/pify/index.js +// node_modules/.pnpm/pify@4.0.1/node_modules/pify/index.js var require_pify = __commonJS({ - "node_modules/pify/index.js"(exports2, module2) { + "node_modules/.pnpm/pify@4.0.1/node_modules/pify/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var processFn = (fn, options) => function(...args) { @@ -6801,9 +6801,9 @@ var require_pify = __commonJS({ } }); -// node_modules/ignore/index.js +// node_modules/.pnpm/ignore@5.3.1/node_modules/ignore/index.js var require_ignore = __commonJS({ - "node_modules/ignore/index.js"(exports2, module2) { + "node_modules/.pnpm/ignore@5.3.1/node_modules/ignore/index.js"(exports2, module2) { init_polyfill_buffer(); function makeArray(subject) { return Array.isArray(subject) ? subject : [subject]; @@ -7182,9 +7182,9 @@ var require_ignore = __commonJS({ } }); -// node_modules/clean-git-ref/lib/index.js +// node_modules/.pnpm/clean-git-ref@2.0.1/node_modules/clean-git-ref/lib/index.js var require_lib2 = __commonJS({ - "node_modules/clean-git-ref/lib/index.js"(exports2, module2) { + "node_modules/.pnpm/clean-git-ref@2.0.1/node_modules/clean-git-ref/lib/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); function escapeRegExp(string) { @@ -7216,9 +7216,9 @@ var require_lib2 = __commonJS({ } }); -// node_modules/diff3/onp.js +// node_modules/.pnpm/diff3@0.0.3/node_modules/diff3/onp.js var require_onp = __commonJS({ - "node_modules/diff3/onp.js"(exports2, module2) { + "node_modules/.pnpm/diff3@0.0.3/node_modules/diff3/onp.js"(exports2, module2) { init_polyfill_buffer(); module2.exports = function(a_, b_) { var a = a_, b = b_, m = a.length, n = b.length, reverse = false, ed = null, offset = m + 1, path2 = [], pathposi = [], ses = [], lcs = "", SES_DELETE = -1, SES_COMMON = 0, SES_ADD = 1; @@ -7346,18 +7346,18 @@ var require_onp = __commonJS({ } }); -// node_modules/diff3/diff3.js +// node_modules/.pnpm/diff3@0.0.3/node_modules/diff3/diff3.js var require_diff3 = __commonJS({ - "node_modules/diff3/diff3.js"(exports2, module2) { + "node_modules/.pnpm/diff3@0.0.3/node_modules/diff3/diff3.js"(exports2, module2) { init_polyfill_buffer(); var onp = require_onp(); - function longestCommonSubsequence(file1, file22) { - var diff3 = new onp(file1, file22); + function longestCommonSubsequence(file1, file2) { + var diff3 = new onp(file1, file2); diff3.compose(); var ses = diff3.getses(); var root2; var prev; - var file1RevIdx = file1.length - 1, file2RevIdx = file22.length - 1; + var file1RevIdx = file1.length - 1, file2RevIdx = file2.length - 1; for (var i = ses.length - 1; i >= 0; --i) { if (ses[i].t === diff3.SES_COMMON) { if (prev) { @@ -7394,11 +7394,11 @@ var require_diff3 = __commonJS({ prev.chain = tail; return root2; } - function diffIndices(file1, file22) { + function diffIndices(file1, file2) { var result = []; var tail1 = file1.length; - var tail2 = file22.length; - for (var candidate = longestCommonSubsequence(file1, file22); candidate !== null; candidate = candidate.chain) { + var tail2 = file2.length; + for (var candidate = longestCommonSubsequence(file1, file2); candidate !== null; candidate = candidate.chain) { var mismatchLength1 = tail1 - candidate.file1index - 1; var mismatchLength2 = tail2 - candidate.file2index - 1; tail1 = candidate.file1index; @@ -7552,9 +7552,9 @@ var require_diff3 = __commonJS({ } }); -// node_modules/ms/index.js +// node_modules/.pnpm/ms@2.1.2/node_modules/ms/index.js var require_ms = __commonJS({ - "node_modules/ms/index.js"(exports2, module2) { + "node_modules/.pnpm/ms@2.1.2/node_modules/ms/index.js"(exports2, module2) { init_polyfill_buffer(); var s = 1e3; var m = s * 60; @@ -7669,9 +7669,9 @@ var require_ms = __commonJS({ } }); -// node_modules/debug/src/common.js +// node_modules/.pnpm/debug@4.3.4_supports-color@9.4.0/node_modules/debug/src/common.js var require_common2 = __commonJS({ - "node_modules/debug/src/common.js"(exports2, module2) { + "node_modules/.pnpm/debug@4.3.4_supports-color@9.4.0/node_modules/debug/src/common.js"(exports2, module2) { init_polyfill_buffer(); function setup(env) { createDebug.debug = createDebug; @@ -7833,9 +7833,9 @@ var require_common2 = __commonJS({ } }); -// node_modules/debug/src/browser.js +// node_modules/.pnpm/debug@4.3.4_supports-color@9.4.0/node_modules/debug/src/browser.js var require_browser = __commonJS({ - "node_modules/debug/src/browser.js"(exports2, module2) { + "node_modules/.pnpm/debug@4.3.4_supports-color@9.4.0/node_modules/debug/src/browser.js"(exports2, module2) { init_polyfill_buffer(); exports2.formatArgs = formatArgs; exports2.save = save; @@ -8003,9 +8003,9 @@ var require_browser = __commonJS({ } }); -// node_modules/@kwsites/file-exists/dist/src/index.js +// node_modules/.pnpm/@kwsites+file-exists@1.1.1_supports-color@9.4.0/node_modules/@kwsites/file-exists/dist/src/index.js var require_src = __commonJS({ - "node_modules/@kwsites/file-exists/dist/src/index.js"(exports2) { + "node_modules/.pnpm/@kwsites+file-exists@1.1.1_supports-color@9.4.0/node_modules/@kwsites/file-exists/dist/src/index.js"(exports2) { "use strict"; init_polyfill_buffer(); var __importDefault = exports2 && exports2.__importDefault || function(mod) { @@ -8048,9 +8048,9 @@ var require_src = __commonJS({ } }); -// node_modules/@kwsites/file-exists/dist/index.js +// node_modules/.pnpm/@kwsites+file-exists@1.1.1_supports-color@9.4.0/node_modules/@kwsites/file-exists/dist/index.js var require_dist = __commonJS({ - "node_modules/@kwsites/file-exists/dist/index.js"(exports2) { + "node_modules/.pnpm/@kwsites+file-exists@1.1.1_supports-color@9.4.0/node_modules/@kwsites/file-exists/dist/index.js"(exports2) { "use strict"; init_polyfill_buffer(); function __export3(m) { @@ -8063,9 +8063,9 @@ var require_dist = __commonJS({ } }); -// node_modules/@kwsites/promise-deferred/dist/index.js +// node_modules/.pnpm/@kwsites+promise-deferred@1.1.1/node_modules/@kwsites/promise-deferred/dist/index.js var require_dist2 = __commonJS({ - "node_modules/@kwsites/promise-deferred/dist/index.js"(exports2) { + "node_modules/.pnpm/@kwsites+promise-deferred@1.1.1/node_modules/@kwsites/promise-deferred/dist/index.js"(exports2) { "use strict"; init_polyfill_buffer(); Object.defineProperty(exports2, "__esModule", { value: true }); @@ -8106,9 +8106,9 @@ var require_dist2 = __commonJS({ } }); -// node_modules/color-name/index.js +// node_modules/.pnpm/color-name@1.1.4/node_modules/color-name/index.js var require_color_name = __commonJS({ - "node_modules/color-name/index.js"(exports2, module2) { + "node_modules/.pnpm/color-name@1.1.4/node_modules/color-name/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = { @@ -8264,9 +8264,9 @@ var require_color_name = __commonJS({ } }); -// node_modules/css-unit-converter/index.js +// node_modules/.pnpm/css-unit-converter@1.1.2/node_modules/css-unit-converter/index.js var require_css_unit_converter = __commonJS({ - "node_modules/css-unit-converter/index.js"(exports2, module2) { + "node_modules/.pnpm/css-unit-converter@1.1.2/node_modules/css-unit-converter/index.js"(exports2, module2) { init_polyfill_buffer(); var conversions = { // length @@ -8393,9 +8393,9 @@ var require_css_unit_converter = __commonJS({ } }); -// node_modules/css-color-converter/lib/index.js +// node_modules/.pnpm/css-color-converter@2.0.0/node_modules/css-color-converter/lib/index.js var require_lib3 = __commonJS({ - "node_modules/css-color-converter/lib/index.js"(exports2) { + "node_modules/.pnpm/css-color-converter@2.0.0/node_modules/css-color-converter/lib/index.js"(exports2) { "use strict"; init_polyfill_buffer(); Object.defineProperty(exports2, "__esModule", { @@ -8668,9 +8668,9 @@ var require_lib3 = __commonJS({ } }); -// node_modules/object-keys/isArguments.js +// node_modules/.pnpm/object-keys@1.1.1/node_modules/object-keys/isArguments.js var require_isArguments = __commonJS({ - "node_modules/object-keys/isArguments.js"(exports2, module2) { + "node_modules/.pnpm/object-keys@1.1.1/node_modules/object-keys/isArguments.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var toStr = Object.prototype.toString; @@ -8685,9 +8685,9 @@ var require_isArguments = __commonJS({ } }); -// node_modules/object-keys/implementation.js +// node_modules/.pnpm/object-keys@1.1.1/node_modules/object-keys/implementation.js var require_implementation = __commonJS({ - "node_modules/object-keys/implementation.js"(exports2, module2) { + "node_modules/.pnpm/object-keys@1.1.1/node_modules/object-keys/implementation.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var keysShim; @@ -8818,9 +8818,9 @@ var require_implementation = __commonJS({ } }); -// node_modules/object-keys/index.js +// node_modules/.pnpm/object-keys@1.1.1/node_modules/object-keys/index.js var require_object_keys = __commonJS({ - "node_modules/object-keys/index.js"(exports2, module2) { + "node_modules/.pnpm/object-keys@1.1.1/node_modules/object-keys/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var slice = Array.prototype.slice; @@ -8853,72 +8853,72 @@ var require_object_keys = __commonJS({ } }); -// node_modules/es-errors/index.js +// node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/index.js var require_es_errors = __commonJS({ - "node_modules/es-errors/index.js"(exports2, module2) { + "node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = Error; } }); -// node_modules/es-errors/eval.js +// node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/eval.js var require_eval = __commonJS({ - "node_modules/es-errors/eval.js"(exports2, module2) { + "node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/eval.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = EvalError; } }); -// node_modules/es-errors/range.js +// node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/range.js var require_range = __commonJS({ - "node_modules/es-errors/range.js"(exports2, module2) { + "node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/range.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = RangeError; } }); -// node_modules/es-errors/ref.js +// node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/ref.js var require_ref = __commonJS({ - "node_modules/es-errors/ref.js"(exports2, module2) { + "node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/ref.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = ReferenceError; } }); -// node_modules/es-errors/syntax.js +// node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/syntax.js var require_syntax = __commonJS({ - "node_modules/es-errors/syntax.js"(exports2, module2) { + "node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/syntax.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = SyntaxError; } }); -// node_modules/es-errors/type.js +// node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/type.js var require_type = __commonJS({ - "node_modules/es-errors/type.js"(exports2, module2) { + "node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/type.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = TypeError; } }); -// node_modules/es-errors/uri.js +// node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/uri.js var require_uri = __commonJS({ - "node_modules/es-errors/uri.js"(exports2, module2) { + "node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/uri.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = URIError; } }); -// node_modules/has-symbols/shams.js +// node_modules/.pnpm/has-symbols@1.0.3/node_modules/has-symbols/shams.js var require_shams = __commonJS({ - "node_modules/has-symbols/shams.js"(exports2, module2) { + "node_modules/.pnpm/has-symbols@1.0.3/node_modules/has-symbols/shams.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); module2.exports = function hasSymbols() { @@ -8969,9 +8969,9 @@ var require_shams = __commonJS({ } }); -// node_modules/has-symbols/index.js +// node_modules/.pnpm/has-symbols@1.0.3/node_modules/has-symbols/index.js var require_has_symbols = __commonJS({ - "node_modules/has-symbols/index.js"(exports2, module2) { + "node_modules/.pnpm/has-symbols@1.0.3/node_modules/has-symbols/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var origSymbol = typeof Symbol !== "undefined" && Symbol; @@ -8994,25 +8994,24 @@ var require_has_symbols = __commonJS({ } }); -// node_modules/has-proto/index.js +// node_modules/.pnpm/has-proto@1.0.1/node_modules/has-proto/index.js var require_has_proto = __commonJS({ - "node_modules/has-proto/index.js"(exports2, module2) { + "node_modules/.pnpm/has-proto@1.0.1/node_modules/has-proto/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var test = { - __proto__: null, foo: {} }; var $Object = Object; module2.exports = function hasProto() { - return { __proto__: test }.foo === test.foo && !(test instanceof $Object); + return { __proto__: test }.foo === test.foo && !({ __proto__: null } instanceof $Object); }; } }); -// node_modules/function-bind/implementation.js +// node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/implementation.js var require_implementation2 = __commonJS({ - "node_modules/function-bind/implementation.js"(exports2, module2) { + "node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/implementation.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var ERROR_MESSAGE = "Function.prototype.bind called on incompatible "; @@ -9087,9 +9086,9 @@ var require_implementation2 = __commonJS({ } }); -// node_modules/function-bind/index.js +// node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/index.js var require_function_bind = __commonJS({ - "node_modules/function-bind/index.js"(exports2, module2) { + "node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var implementation = require_implementation2(); @@ -9097,9 +9096,9 @@ var require_function_bind = __commonJS({ } }); -// node_modules/hasown/index.js +// node_modules/.pnpm/hasown@2.0.1/node_modules/hasown/index.js var require_hasown = __commonJS({ - "node_modules/hasown/index.js"(exports2, module2) { + "node_modules/.pnpm/hasown@2.0.1/node_modules/hasown/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var call = Function.prototype.call; @@ -9109,9 +9108,9 @@ var require_hasown = __commonJS({ } }); -// node_modules/get-intrinsic/index.js +// node_modules/.pnpm/get-intrinsic@1.2.4/node_modules/get-intrinsic/index.js var require_get_intrinsic = __commonJS({ - "node_modules/get-intrinsic/index.js"(exports2, module2) { + "node_modules/.pnpm/get-intrinsic@1.2.4/node_modules/get-intrinsic/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var undefined2; @@ -9424,27 +9423,41 @@ var require_get_intrinsic = __commonJS({ } }); -// node_modules/es-define-property/index.js -var require_es_define_property = __commonJS({ - "node_modules/es-define-property/index.js"(exports2, module2) { +// node_modules/.pnpm/has-property-descriptors@1.0.1/node_modules/has-property-descriptors/index.js +var require_has_property_descriptors = __commonJS({ + "node_modules/.pnpm/has-property-descriptors@1.0.1/node_modules/has-property-descriptors/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var GetIntrinsic = require_get_intrinsic(); - var $defineProperty = GetIntrinsic("%Object.defineProperty%", true) || false; - if ($defineProperty) { - try { - $defineProperty({}, "a", { value: 1 }); - } catch (e) { - $defineProperty = false; + var $defineProperty = GetIntrinsic("%Object.defineProperty%", true); + var hasPropertyDescriptors = function hasPropertyDescriptors2() { + if ($defineProperty) { + try { + $defineProperty({}, "a", { value: 1 }); + return true; + } catch (e) { + return false; + } } - } - module2.exports = $defineProperty; + return false; + }; + hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() { + if (!hasPropertyDescriptors()) { + return null; + } + try { + return $defineProperty([], "length", { value: 1 }).length !== 1; + } catch (e) { + return true; + } + }; + module2.exports = hasPropertyDescriptors; } }); -// node_modules/gopd/index.js +// node_modules/.pnpm/gopd@1.0.1/node_modules/gopd/index.js var require_gopd = __commonJS({ - "node_modules/gopd/index.js"(exports2, module2) { + "node_modules/.pnpm/gopd@1.0.1/node_modules/gopd/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var GetIntrinsic = require_get_intrinsic(); @@ -9460,12 +9473,21 @@ var require_gopd = __commonJS({ } }); -// node_modules/define-data-property/index.js +// node_modules/.pnpm/define-data-property@1.1.2/node_modules/define-data-property/index.js var require_define_data_property = __commonJS({ - "node_modules/define-data-property/index.js"(exports2, module2) { + "node_modules/.pnpm/define-data-property@1.1.2/node_modules/define-data-property/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); - var $defineProperty = require_es_define_property(); + var hasPropertyDescriptors = require_has_property_descriptors()(); + var GetIntrinsic = require_get_intrinsic(); + var $defineProperty = hasPropertyDescriptors && GetIntrinsic("%Object.defineProperty%", true); + if ($defineProperty) { + try { + $defineProperty({}, "a", { value: 1 }); + } catch (e) { + $defineProperty = false; + } + } var $SyntaxError = require_syntax(); var $TypeError = require_type(); var gopd = require_gopd(); @@ -9509,32 +9531,9 @@ var require_define_data_property = __commonJS({ } }); -// node_modules/has-property-descriptors/index.js -var require_has_property_descriptors = __commonJS({ - "node_modules/has-property-descriptors/index.js"(exports2, module2) { - "use strict"; - init_polyfill_buffer(); - var $defineProperty = require_es_define_property(); - var hasPropertyDescriptors = function hasPropertyDescriptors2() { - return !!$defineProperty; - }; - hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() { - if (!$defineProperty) { - return null; - } - try { - return $defineProperty([], "length", { value: 1 }).length !== 1; - } catch (e) { - return true; - } - }; - module2.exports = hasPropertyDescriptors; - } -}); - -// node_modules/define-properties/index.js +// node_modules/.pnpm/define-properties@1.2.1/node_modules/define-properties/index.js var require_define_properties = __commonJS({ - "node_modules/define-properties/index.js"(exports2, module2) { + "node_modules/.pnpm/define-properties@1.2.1/node_modules/define-properties/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var keys = require_object_keys(); @@ -9577,9 +9576,9 @@ var require_define_properties = __commonJS({ } }); -// node_modules/set-function-length/index.js +// node_modules/.pnpm/set-function-length@1.2.1/node_modules/set-function-length/index.js var require_set_function_length = __commonJS({ - "node_modules/set-function-length/index.js"(exports2, module2) { + "node_modules/.pnpm/set-function-length@1.2.1/node_modules/set-function-length/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var GetIntrinsic = require_get_intrinsic(); @@ -9631,9 +9630,9 @@ var require_set_function_length = __commonJS({ } }); -// node_modules/call-bind/index.js +// node_modules/.pnpm/call-bind@1.0.6/node_modules/call-bind/index.js var require_call_bind = __commonJS({ - "node_modules/call-bind/index.js"(exports2, module2) { + "node_modules/.pnpm/call-bind@1.0.6/node_modules/call-bind/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var bind = require_function_bind(); @@ -9643,8 +9642,15 @@ var require_call_bind = __commonJS({ var $apply = GetIntrinsic("%Function.prototype.apply%"); var $call = GetIntrinsic("%Function.prototype.call%"); var $reflectApply = GetIntrinsic("%Reflect.apply%", true) || bind.call($call, $apply); - var $defineProperty = require_es_define_property(); + var $defineProperty = GetIntrinsic("%Object.defineProperty%", true); var $max = GetIntrinsic("%Math.max%"); + if ($defineProperty) { + try { + $defineProperty({}, "a", { value: 1 }); + } catch (e) { + $defineProperty = null; + } + } module2.exports = function callBind(originalFunction) { if (typeof originalFunction !== "function") { throw new $TypeError("a function is required"); @@ -9667,9 +9673,9 @@ var require_call_bind = __commonJS({ } }); -// node_modules/call-bind/callBound.js +// node_modules/.pnpm/call-bind@1.0.6/node_modules/call-bind/callBound.js var require_callBound = __commonJS({ - "node_modules/call-bind/callBound.js"(exports2, module2) { + "node_modules/.pnpm/call-bind@1.0.6/node_modules/call-bind/callBound.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var GetIntrinsic = require_get_intrinsic(); @@ -9685,9 +9691,9 @@ var require_callBound = __commonJS({ } }); -// node_modules/object.assign/implementation.js +// node_modules/.pnpm/object.assign@4.1.5/node_modules/object.assign/implementation.js var require_implementation3 = __commonJS({ - "node_modules/object.assign/implementation.js"(exports2, module2) { + "node_modules/.pnpm/object.assign@4.1.5/node_modules/object.assign/implementation.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var objectKeys = require_object_keys(); @@ -9731,9 +9737,9 @@ var require_implementation3 = __commonJS({ } }); -// node_modules/object.assign/polyfill.js +// node_modules/.pnpm/object.assign@4.1.5/node_modules/object.assign/polyfill.js var require_polyfill = __commonJS({ - "node_modules/object.assign/polyfill.js"(exports2, module2) { + "node_modules/.pnpm/object.assign@4.1.5/node_modules/object.assign/polyfill.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var implementation = require_implementation3(); @@ -9781,9 +9787,9 @@ var require_polyfill = __commonJS({ } }); -// node_modules/object.assign/shim.js +// node_modules/.pnpm/object.assign@4.1.5/node_modules/object.assign/shim.js var require_shim = __commonJS({ - "node_modules/object.assign/shim.js"(exports2, module2) { + "node_modules/.pnpm/object.assign@4.1.5/node_modules/object.assign/shim.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var define2 = require_define_properties(); @@ -9802,9 +9808,9 @@ var require_shim = __commonJS({ } }); -// node_modules/object.assign/index.js +// node_modules/.pnpm/object.assign@4.1.5/node_modules/object.assign/index.js var require_object = __commonJS({ - "node_modules/object.assign/index.js"(exports2, module2) { + "node_modules/.pnpm/object.assign@4.1.5/node_modules/object.assign/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var defineProperties = require_define_properties(); @@ -9825,9 +9831,9 @@ var require_object = __commonJS({ } }); -// node_modules/functions-have-names/index.js +// node_modules/.pnpm/functions-have-names@1.2.3/node_modules/functions-have-names/index.js var require_functions_have_names = __commonJS({ - "node_modules/functions-have-names/index.js"(exports2, module2) { + "node_modules/.pnpm/functions-have-names@1.2.3/node_modules/functions-have-names/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var functionsHaveNames = function functionsHaveNames2() { @@ -9859,15 +9865,15 @@ var require_functions_have_names = __commonJS({ } }); -// node_modules/set-function-name/index.js +// node_modules/.pnpm/set-function-name@2.0.1/node_modules/set-function-name/index.js var require_set_function_name = __commonJS({ - "node_modules/set-function-name/index.js"(exports2, module2) { + "node_modules/.pnpm/set-function-name@2.0.1/node_modules/set-function-name/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var define2 = require_define_data_property(); var hasDescriptors = require_has_property_descriptors()(); var functionsHaveConfigurableNames = require_functions_have_names().functionsHaveConfigurableNames(); - var $TypeError = require_type(); + var $TypeError = TypeError; module2.exports = function setFunctionName(fn, name) { if (typeof fn !== "function") { throw new $TypeError("`fn` is not a function"); @@ -9875,21 +9881,9 @@ var require_set_function_name = __commonJS({ var loose = arguments.length > 2 && !!arguments[2]; if (!loose || functionsHaveConfigurableNames) { if (hasDescriptors) { - define2( - /** @type {Parameters[0]} */ - fn, - "name", - name, - true, - true - ); + define2(fn, "name", name, true, true); } else { - define2( - /** @type {Parameters[0]} */ - fn, - "name", - name - ); + define2(fn, "name", name); } } return fn; @@ -9897,9 +9891,9 @@ var require_set_function_name = __commonJS({ } }); -// node_modules/regexp.prototype.flags/implementation.js +// node_modules/.pnpm/regexp.prototype.flags@1.5.2/node_modules/regexp.prototype.flags/implementation.js var require_implementation4 = __commonJS({ - "node_modules/regexp.prototype.flags/implementation.js"(exports2, module2) { + "node_modules/.pnpm/regexp.prototype.flags@1.5.2/node_modules/regexp.prototype.flags/implementation.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var setFunctionName = require_set_function_name(); @@ -9939,9 +9933,9 @@ var require_implementation4 = __commonJS({ } }); -// node_modules/regexp.prototype.flags/polyfill.js +// node_modules/.pnpm/regexp.prototype.flags@1.5.2/node_modules/regexp.prototype.flags/polyfill.js var require_polyfill2 = __commonJS({ - "node_modules/regexp.prototype.flags/polyfill.js"(exports2, module2) { + "node_modules/.pnpm/regexp.prototype.flags@1.5.2/node_modules/regexp.prototype.flags/polyfill.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var implementation = require_implementation4(); @@ -9973,9 +9967,9 @@ var require_polyfill2 = __commonJS({ } }); -// node_modules/regexp.prototype.flags/shim.js +// node_modules/.pnpm/regexp.prototype.flags@1.5.2/node_modules/regexp.prototype.flags/shim.js var require_shim2 = __commonJS({ - "node_modules/regexp.prototype.flags/shim.js"(exports2, module2) { + "node_modules/.pnpm/regexp.prototype.flags@1.5.2/node_modules/regexp.prototype.flags/shim.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var supportsDescriptors = require_define_properties().supportsDescriptors; @@ -10004,9 +9998,9 @@ var require_shim2 = __commonJS({ } }); -// node_modules/regexp.prototype.flags/index.js +// node_modules/.pnpm/regexp.prototype.flags@1.5.2/node_modules/regexp.prototype.flags/index.js var require_regexp_prototype = __commonJS({ - "node_modules/regexp.prototype.flags/index.js"(exports2, module2) { + "node_modules/.pnpm/regexp.prototype.flags@1.5.2/node_modules/regexp.prototype.flags/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var define2 = require_define_properties(); @@ -10024,9 +10018,9 @@ var require_regexp_prototype = __commonJS({ } }); -// node_modules/has-tostringtag/shams.js +// node_modules/.pnpm/has-tostringtag@1.0.2/node_modules/has-tostringtag/shams.js var require_shams2 = __commonJS({ - "node_modules/has-tostringtag/shams.js"(exports2, module2) { + "node_modules/.pnpm/has-tostringtag@1.0.2/node_modules/has-tostringtag/shams.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var hasSymbols = require_shams(); @@ -10036,9 +10030,9 @@ var require_shams2 = __commonJS({ } }); -// node_modules/is-arguments/index.js +// node_modules/.pnpm/is-arguments@1.1.1/node_modules/is-arguments/index.js var require_is_arguments = __commonJS({ - "node_modules/is-arguments/index.js"(exports2, module2) { + "node_modules/.pnpm/is-arguments@1.1.1/node_modules/is-arguments/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var hasToStringTag = require_shams2()(); @@ -10064,16 +10058,16 @@ var require_is_arguments = __commonJS({ } }); -// (disabled):node_modules/object-inspect/util.inspect +// (disabled):node_modules/.pnpm/object-inspect@1.13.1/node_modules/object-inspect/util.inspect var require_util = __commonJS({ - "(disabled):node_modules/object-inspect/util.inspect"() { + "(disabled):node_modules/.pnpm/object-inspect@1.13.1/node_modules/object-inspect/util.inspect"() { init_polyfill_buffer(); } }); -// node_modules/object-inspect/index.js +// node_modules/.pnpm/object-inspect@1.13.1/node_modules/object-inspect/index.js var require_object_inspect = __commonJS({ - "node_modules/object-inspect/index.js"(exports2, module2) { + "node_modules/.pnpm/object-inspect@1.13.1/node_modules/object-inspect/index.js"(exports2, module2) { init_polyfill_buffer(); var hasMap = typeof Map === "function" && Map.prototype; var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, "size") : null; @@ -10587,9 +10581,9 @@ var require_object_inspect = __commonJS({ } }); -// node_modules/side-channel/index.js +// node_modules/.pnpm/side-channel@1.0.5/node_modules/side-channel/index.js var require_side_channel = __commonJS({ - "node_modules/side-channel/index.js"(exports2, module2) { + "node_modules/.pnpm/side-channel@1.0.5/node_modules/side-channel/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var GetIntrinsic = require_get_intrinsic(); @@ -10605,13 +10599,10 @@ var require_side_channel = __commonJS({ var $mapSet = callBound("Map.prototype.set", true); var $mapHas = callBound("Map.prototype.has", true); var listGetNode = function(list, key2) { - var prev = list; - var curr; - for (; (curr = prev.next) !== null; prev = curr) { + for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) { if (curr.key === key2) { prev.next = curr.next; - curr.next = /** @type {NonNullable} */ - list.next; + curr.next = list.next; list.next = curr; return curr; } @@ -10626,9 +10617,8 @@ var require_side_channel = __commonJS({ if (node) { node.value = value; } else { - objects.next = /** @type {import('.').ListNode} */ - { - // eslint-disable-line no-param-reassign, no-extra-parens + objects.next = { + // eslint-disable-line no-param-reassign key: key2, next: objects.next, value @@ -10703,9 +10693,9 @@ var require_side_channel = __commonJS({ } }); -// node_modules/internal-slot/index.js +// node_modules/.pnpm/internal-slot@1.0.7/node_modules/internal-slot/index.js var require_internal_slot = __commonJS({ - "node_modules/internal-slot/index.js"(exports2, module2) { + "node_modules/.pnpm/internal-slot@1.0.7/node_modules/internal-slot/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var hasOwn = require_hasown(); @@ -10766,9 +10756,9 @@ var require_internal_slot = __commonJS({ } }); -// node_modules/stop-iteration-iterator/index.js +// node_modules/.pnpm/stop-iteration-iterator@1.0.0/node_modules/stop-iteration-iterator/index.js var require_stop_iteration_iterator = __commonJS({ - "node_modules/stop-iteration-iterator/index.js"(exports2, module2) { + "node_modules/.pnpm/stop-iteration-iterator@1.0.0/node_modules/stop-iteration-iterator/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var SLOT = require_internal_slot(); @@ -10806,9 +10796,9 @@ var require_stop_iteration_iterator = __commonJS({ } }); -// node_modules/isarray/index.js +// node_modules/.pnpm/isarray@2.0.5/node_modules/isarray/index.js var require_isarray = __commonJS({ - "node_modules/isarray/index.js"(exports2, module2) { + "node_modules/.pnpm/isarray@2.0.5/node_modules/isarray/index.js"(exports2, module2) { init_polyfill_buffer(); var toString = {}.toString; module2.exports = Array.isArray || function(arr) { @@ -10817,9 +10807,9 @@ var require_isarray = __commonJS({ } }); -// node_modules/is-string/index.js +// node_modules/.pnpm/is-string@1.0.7/node_modules/is-string/index.js var require_is_string = __commonJS({ - "node_modules/is-string/index.js"(exports2, module2) { + "node_modules/.pnpm/is-string@1.0.7/node_modules/is-string/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var strValue = String.prototype.valueOf; @@ -10846,9 +10836,9 @@ var require_is_string = __commonJS({ } }); -// node_modules/is-map/index.js +// node_modules/.pnpm/is-map@2.0.2/node_modules/is-map/index.js var require_is_map = __commonJS({ - "node_modules/is-map/index.js"(exports2, module2) { + "node_modules/.pnpm/is-map@2.0.2/node_modules/is-map/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var $Map = typeof Map === "function" && Map.prototype ? Map : null; @@ -10887,9 +10877,9 @@ var require_is_map = __commonJS({ } }); -// node_modules/is-set/index.js +// node_modules/.pnpm/is-set@2.0.2/node_modules/is-set/index.js var require_is_set = __commonJS({ - "node_modules/is-set/index.js"(exports2, module2) { + "node_modules/.pnpm/is-set@2.0.2/node_modules/is-set/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var $Map = typeof Map === "function" && Map.prototype ? Map : null; @@ -10928,9 +10918,9 @@ var require_is_set = __commonJS({ } }); -// node_modules/es-get-iterator/index.js +// node_modules/.pnpm/es-get-iterator@1.1.3/node_modules/es-get-iterator/index.js var require_es_get_iterator = __commonJS({ - "node_modules/es-get-iterator/index.js"(exports2, module2) { + "node_modules/.pnpm/es-get-iterator@1.1.3/node_modules/es-get-iterator/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var isArguments = require_is_arguments(); @@ -11088,9 +11078,9 @@ var require_es_get_iterator = __commonJS({ } }); -// node_modules/object-is/implementation.js +// node_modules/.pnpm/object-is@1.1.5/node_modules/object-is/implementation.js var require_implementation5 = __commonJS({ - "node_modules/object-is/implementation.js"(exports2, module2) { + "node_modules/.pnpm/object-is@1.1.5/node_modules/object-is/implementation.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var numberIsNaN = function(value) { @@ -11111,9 +11101,9 @@ var require_implementation5 = __commonJS({ } }); -// node_modules/object-is/polyfill.js +// node_modules/.pnpm/object-is@1.1.5/node_modules/object-is/polyfill.js var require_polyfill3 = __commonJS({ - "node_modules/object-is/polyfill.js"(exports2, module2) { + "node_modules/.pnpm/object-is@1.1.5/node_modules/object-is/polyfill.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var implementation = require_implementation5(); @@ -11123,9 +11113,9 @@ var require_polyfill3 = __commonJS({ } }); -// node_modules/object-is/shim.js +// node_modules/.pnpm/object-is@1.1.5/node_modules/object-is/shim.js var require_shim3 = __commonJS({ - "node_modules/object-is/shim.js"(exports2, module2) { + "node_modules/.pnpm/object-is@1.1.5/node_modules/object-is/shim.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var getPolyfill = require_polyfill3(); @@ -11142,9 +11132,9 @@ var require_shim3 = __commonJS({ } }); -// node_modules/object-is/index.js +// node_modules/.pnpm/object-is@1.1.5/node_modules/object-is/index.js var require_object_is = __commonJS({ - "node_modules/object-is/index.js"(exports2, module2) { + "node_modules/.pnpm/object-is@1.1.5/node_modules/object-is/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var define2 = require_define_properties(); @@ -11162,9 +11152,9 @@ var require_object_is = __commonJS({ } }); -// node_modules/is-array-buffer/index.js +// node_modules/.pnpm/is-array-buffer@3.0.4/node_modules/is-array-buffer/index.js var require_is_array_buffer = __commonJS({ - "node_modules/is-array-buffer/index.js"(exports2, module2) { + "node_modules/.pnpm/is-array-buffer@3.0.4/node_modules/is-array-buffer/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var callBind = require_call_bind(); @@ -11197,9 +11187,9 @@ var require_is_array_buffer = __commonJS({ } }); -// node_modules/is-date-object/index.js +// node_modules/.pnpm/is-date-object@1.0.5/node_modules/is-date-object/index.js var require_is_date_object = __commonJS({ - "node_modules/is-date-object/index.js"(exports2, module2) { + "node_modules/.pnpm/is-date-object@1.0.5/node_modules/is-date-object/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var getDay = Date.prototype.getDay; @@ -11223,9 +11213,9 @@ var require_is_date_object = __commonJS({ } }); -// node_modules/is-regex/index.js +// node_modules/.pnpm/is-regex@1.1.4/node_modules/is-regex/index.js var require_is_regex = __commonJS({ - "node_modules/is-regex/index.js"(exports2, module2) { + "node_modules/.pnpm/is-regex@1.1.4/node_modules/is-regex/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var callBound = require_callBound(); @@ -11276,9 +11266,9 @@ var require_is_regex = __commonJS({ } }); -// node_modules/is-shared-array-buffer/index.js +// node_modules/.pnpm/is-shared-array-buffer@1.0.2/node_modules/is-shared-array-buffer/index.js var require_is_shared_array_buffer = __commonJS({ - "node_modules/is-shared-array-buffer/index.js"(exports2, module2) { + "node_modules/.pnpm/is-shared-array-buffer@1.0.2/node_modules/is-shared-array-buffer/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var callBound = require_callBound(); @@ -11299,9 +11289,9 @@ var require_is_shared_array_buffer = __commonJS({ } }); -// node_modules/is-number-object/index.js +// node_modules/.pnpm/is-number-object@1.0.7/node_modules/is-number-object/index.js var require_is_number_object = __commonJS({ - "node_modules/is-number-object/index.js"(exports2, module2) { + "node_modules/.pnpm/is-number-object@1.0.7/node_modules/is-number-object/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var numToStr = Number.prototype.toString; @@ -11328,9 +11318,9 @@ var require_is_number_object = __commonJS({ } }); -// node_modules/is-boolean-object/index.js +// node_modules/.pnpm/is-boolean-object@1.1.2/node_modules/is-boolean-object/index.js var require_is_boolean_object = __commonJS({ - "node_modules/is-boolean-object/index.js"(exports2, module2) { + "node_modules/.pnpm/is-boolean-object@1.1.2/node_modules/is-boolean-object/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var callBound = require_callBound(); @@ -11358,9 +11348,9 @@ var require_is_boolean_object = __commonJS({ } }); -// node_modules/is-symbol/index.js +// node_modules/.pnpm/is-symbol@1.0.4/node_modules/is-symbol/index.js var require_is_symbol = __commonJS({ - "node_modules/is-symbol/index.js"(exports2, module2) { + "node_modules/.pnpm/is-symbol@1.0.4/node_modules/is-symbol/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var toStr = Object.prototype.toString; @@ -11398,9 +11388,9 @@ var require_is_symbol = __commonJS({ } }); -// node_modules/has-bigints/index.js +// node_modules/.pnpm/has-bigints@1.0.2/node_modules/has-bigints/index.js var require_has_bigints = __commonJS({ - "node_modules/has-bigints/index.js"(exports2, module2) { + "node_modules/.pnpm/has-bigints@1.0.2/node_modules/has-bigints/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var $BigInt = typeof BigInt !== "undefined" && BigInt; @@ -11410,9 +11400,9 @@ var require_has_bigints = __commonJS({ } }); -// node_modules/is-bigint/index.js +// node_modules/.pnpm/is-bigint@1.0.4/node_modules/is-bigint/index.js var require_is_bigint = __commonJS({ - "node_modules/is-bigint/index.js"(exports2, module2) { + "node_modules/.pnpm/is-bigint@1.0.4/node_modules/is-bigint/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var hasBigInts = require_has_bigints()(); @@ -11445,9 +11435,9 @@ var require_is_bigint = __commonJS({ } }); -// node_modules/which-boxed-primitive/index.js +// node_modules/.pnpm/which-boxed-primitive@1.0.2/node_modules/which-boxed-primitive/index.js var require_which_boxed_primitive = __commonJS({ - "node_modules/which-boxed-primitive/index.js"(exports2, module2) { + "node_modules/.pnpm/which-boxed-primitive@1.0.2/node_modules/which-boxed-primitive/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var isString = require_is_string(); @@ -11478,9 +11468,9 @@ var require_which_boxed_primitive = __commonJS({ } }); -// node_modules/is-weakmap/index.js +// node_modules/.pnpm/is-weakmap@2.0.1/node_modules/is-weakmap/index.js var require_is_weakmap = __commonJS({ - "node_modules/is-weakmap/index.js"(exports2, module2) { + "node_modules/.pnpm/is-weakmap@2.0.1/node_modules/is-weakmap/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var $WeakMap = typeof WeakMap === "function" && WeakMap.prototype ? WeakMap : null; @@ -11519,9 +11509,9 @@ var require_is_weakmap = __commonJS({ } }); -// node_modules/is-weakset/index.js +// node_modules/.pnpm/is-weakset@2.0.2/node_modules/is-weakset/index.js var require_is_weakset = __commonJS({ - "node_modules/is-weakset/index.js"(exports2, module2) { + "node_modules/.pnpm/is-weakset@2.0.2/node_modules/is-weakset/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var GetIntrinsic = require_get_intrinsic(); @@ -11557,9 +11547,9 @@ var require_is_weakset = __commonJS({ } }); -// node_modules/which-collection/index.js +// node_modules/.pnpm/which-collection@1.0.1/node_modules/which-collection/index.js var require_which_collection = __commonJS({ - "node_modules/which-collection/index.js"(exports2, module2) { + "node_modules/.pnpm/which-collection@1.0.1/node_modules/which-collection/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var isMap = require_is_map(); @@ -11586,9 +11576,9 @@ var require_which_collection = __commonJS({ } }); -// node_modules/is-callable/index.js +// node_modules/.pnpm/is-callable@1.2.7/node_modules/is-callable/index.js var require_is_callable = __commonJS({ - "node_modules/is-callable/index.js"(exports2, module2) { + "node_modules/.pnpm/is-callable@1.2.7/node_modules/is-callable/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var fnToStr = Function.prototype.toString; @@ -11705,9 +11695,9 @@ var require_is_callable = __commonJS({ } }); -// node_modules/for-each/index.js +// node_modules/.pnpm/for-each@0.3.3/node_modules/for-each/index.js var require_for_each = __commonJS({ - "node_modules/for-each/index.js"(exports2, module2) { + "node_modules/.pnpm/for-each@0.3.3/node_modules/for-each/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var isCallable = require_is_callable(); @@ -11764,33 +11754,24 @@ var require_for_each = __commonJS({ } }); -// node_modules/possible-typed-array-names/index.js -var require_possible_typed_array_names = __commonJS({ - "node_modules/possible-typed-array-names/index.js"(exports2, module2) { +// node_modules/.pnpm/available-typed-arrays@1.0.6/node_modules/available-typed-arrays/index.js +var require_available_typed_arrays = __commonJS({ + "node_modules/.pnpm/available-typed-arrays@1.0.6/node_modules/available-typed-arrays/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); - module2.exports = [ + var possibleNames = [ + "BigInt64Array", + "BigUint64Array", "Float32Array", "Float64Array", - "Int8Array", "Int16Array", "Int32Array", - "Uint8Array", - "Uint8ClampedArray", + "Int8Array", "Uint16Array", "Uint32Array", - "BigInt64Array", - "BigUint64Array" + "Uint8Array", + "Uint8ClampedArray" ]; - } -}); - -// node_modules/available-typed-arrays/index.js -var require_available_typed_arrays = __commonJS({ - "node_modules/available-typed-arrays/index.js"(exports2, module2) { - "use strict"; - init_polyfill_buffer(); - var possibleNames = require_possible_typed_array_names(); var g = typeof globalThis === "undefined" ? global : globalThis; module2.exports = function availableTypedArrays() { var out = []; @@ -11804,9 +11785,9 @@ var require_available_typed_arrays = __commonJS({ } }); -// node_modules/which-typed-array/index.js +// node_modules/.pnpm/which-typed-array@1.1.14/node_modules/which-typed-array/index.js var require_which_typed_array = __commonJS({ - "node_modules/which-typed-array/index.js"(exports2, module2) { + "node_modules/.pnpm/which-typed-array@1.1.14/node_modules/which-typed-array/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var forEach2 = require_for_each(); @@ -11820,7 +11801,8 @@ var require_which_typed_array = __commonJS({ var typedArrays = availableTypedArrays(); var $slice = callBound("String.prototype.slice"); var getPrototypeOf = Object.getPrototypeOf; - var $indexOf = callBound("Array.prototype.indexOf", true) || function indexOf(array, value) { + var $indexOf = callBound("Array.prototype.indexOf", true) || /** @type {(array: readonly unknown[], value: unknown) => keyof array} */ + function indexOf(array, value) { for (var i = 0; i < array.length; i += 1) { if (array[i] === value) { return i; @@ -11855,10 +11837,10 @@ var require_which_typed_array = __commonJS({ var found = false; forEach2( // eslint-disable-next-line no-extra-parens - /** @type {Record<`\$${TypedArrayName}`, Getter>} */ + /** @type {Record<`\$${TypedArrayName}`, typeof cache>} */ /** @type {any} */ cache, - /** @type {(getter: Getter, name: `\$${import('.').TypedArrayName}`) => void} */ + /** @type {(getter: typeof cache, name: `\$${TypedArrayName}`) => void} */ function(getter, typedArray) { if (!found) { try { @@ -11876,10 +11858,9 @@ var require_which_typed_array = __commonJS({ var found = false; forEach2( // eslint-disable-next-line no-extra-parens - /** @type {Record<`\$${TypedArrayName}`, Getter>} */ /** @type {any} */ cache, - /** @type {(getter: typeof cache, name: `\$${import('.').TypedArrayName}`) => void} */ + /** @type {(getter: typeof cache, name: `\$${TypedArrayName}`) => void} */ function(getter, name) { if (!found) { try { @@ -11914,9 +11895,9 @@ var require_which_typed_array = __commonJS({ } }); -// node_modules/array-buffer-byte-length/index.js +// node_modules/.pnpm/array-buffer-byte-length@1.0.1/node_modules/array-buffer-byte-length/index.js var require_array_buffer_byte_length = __commonJS({ - "node_modules/array-buffer-byte-length/index.js"(exports2, module2) { + "node_modules/.pnpm/array-buffer-byte-length@1.0.1/node_modules/array-buffer-byte-length/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var callBound = require_callBound(); @@ -11931,9 +11912,9 @@ var require_array_buffer_byte_length = __commonJS({ } }); -// node_modules/deep-equal/index.js +// node_modules/.pnpm/deep-equal@2.2.3/node_modules/deep-equal/index.js var require_deep_equal = __commonJS({ - "node_modules/deep-equal/index.js"(exports2, module2) { + "node_modules/.pnpm/deep-equal@2.2.3/node_modules/deep-equal/index.js"(exports2, module2) { "use strict"; init_polyfill_buffer(); var assign2 = require_object(); @@ -12308,9 +12289,9 @@ var require_deep_equal = __commonJS({ } }); -// node_modules/js-sha256/src/sha256.js +// node_modules/.pnpm/js-sha256@0.9.0/node_modules/js-sha256/src/sha256.js var require_sha256 = __commonJS({ - "node_modules/js-sha256/src/sha256.js"(exports, module) { + "node_modules/.pnpm/js-sha256@0.9.0/node_modules/js-sha256/src/sha256.js"(exports, module) { init_polyfill_buffer(); (function() { "use strict"; @@ -12818,9 +12799,9 @@ var require_sha256 = __commonJS({ } }); -// node_modules/hogan.js/lib/compiler.js +// node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/compiler.js var require_compiler = __commonJS({ - "node_modules/hogan.js/lib/compiler.js"(exports2) { + "node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/compiler.js"(exports2) { init_polyfill_buffer(); (function(Hogan4) { var rIsWhitespace = /\S/, rQuot = /\"/g, rNewline = /\n/g, rCr = /\r/g, rSlash = /\\/g, rLineSep = /\u2028/, rParagraphSep = /\u2029/; @@ -13147,9 +13128,9 @@ var require_compiler = __commonJS({ } }); -// node_modules/hogan.js/lib/template.js +// node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/template.js var require_template = __commonJS({ - "node_modules/hogan.js/lib/template.js"(exports2) { + "node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/template.js"(exports2) { init_polyfill_buffer(); var Hogan4 = {}; (function(Hogan5) { @@ -13413,9 +13394,9 @@ var require_template = __commonJS({ } }); -// node_modules/hogan.js/lib/hogan.js +// node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js var require_hogan = __commonJS({ - "node_modules/hogan.js/lib/hogan.js"(exports2, module2) { + "node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"(exports2, module2) { init_polyfill_buffer(); var Hogan4 = require_compiler(); Hogan4.Template = require_template().Template; @@ -13424,9 +13405,9 @@ var require_hogan = __commonJS({ } }); -// node_modules/feather-icons/dist/feather.js +// node_modules/.pnpm/feather-icons@4.29.1/node_modules/feather-icons/dist/feather.js var require_feather = __commonJS({ - "node_modules/feather-icons/dist/feather.js"(exports2, module2) { + "node_modules/.pnpm/feather-icons@4.29.1/node_modules/feather-icons/dist/feather.js"(exports2, module2) { init_polyfill_buffer(); (function webpackUniversalModuleDefinition(root2, factory) { if (typeof exports2 === "object" && typeof module2 === "object") @@ -16059,7 +16040,7 @@ __export(main_exports, { module.exports = __toCommonJS(main_exports); init_polyfill_buffer(); -// node_modules/isomorphic-git/index.js +// node_modules/.pnpm/isomorphic-git@1.25.3/node_modules/isomorphic-git/index.js init_polyfill_buffer(); var import_async_lock = __toESM(require_async_lock(), 1); var import_sha1 = __toESM(require_sha1(), 1); @@ -16640,7 +16621,7 @@ function flatFileListToDirectoryStructure(files) { }; const mkfile = function(name, metadata) { if (!inodes.has(name)) { - const file9 = { + const file = { type: "blob", fullpath: name, basename: basename(name), @@ -16649,15 +16630,15 @@ function flatFileListToDirectoryStructure(files) { parent: mkdir(dirname(name)), children: [] }; - if (file9.parent) - file9.parent.children.push(file9); - inodes.set(name, file9); + if (file.parent) + file.parent.children.push(file); + inodes.set(name, file); } return inodes.get(name); }; mkdir("."); - for (const file9 of files) { - mkfile(file9.path, file9); + for (const file of files) { + mkfile(file.path, file); } return inodes; } @@ -17246,12 +17227,6 @@ var refpaths = (ref) => [ `refs/remotes/${ref}/HEAD` ]; var GIT_FILES = ["config", "description", "index", "shallow", "commondir"]; -var lock$1; -async function acquireLock(ref, callback) { - if (lock$1 === void 0) - lock$1 = new import_async_lock.default(); - return lock$1.acquire(ref, callback); -} var GitRefManager = class _GitRefManager { static async updateRemoteRefs({ fs, @@ -17321,7 +17296,7 @@ var GitRefManager = class _GitRefManager { fs, gitdir, filepath - })).map((file9) => `${filepath}/${file9}`); + })).map((file) => `${filepath}/${file}`); for (const ref of refs2) { if (!actualRefsToWrite.has(ref)) { pruned.push(ref); @@ -17333,11 +17308,8 @@ var GitRefManager = class _GitRefManager { } } for (const [key2, value] of actualRefsToWrite) { - await acquireLock( - key2, - async () => fs.write(join(gitdir, key2), `${value.trim()} -`, "utf8") - ); + await fs.write(join(gitdir, key2), `${value.trim()} +`, "utf8"); } return { pruned }; } @@ -17346,28 +17318,19 @@ var GitRefManager = class _GitRefManager { if (!value.match(/[0-9a-f]{40}/)) { throw new InvalidOidError(value); } - await acquireLock( - ref, - async () => fs.write(join(gitdir, ref), `${value.trim()} -`, "utf8") - ); + await fs.write(join(gitdir, ref), `${value.trim()} +`, "utf8"); } static async writeSymbolicRef({ fs, gitdir, ref, value }) { - await acquireLock( - ref, - async () => fs.write(join(gitdir, ref), `ref: ${value.trim()} -`, "utf8") - ); + await fs.write(join(gitdir, ref), `ref: ${value.trim()} +`, "utf8"); } static async deleteRef({ fs, gitdir, ref }) { return _GitRefManager.deleteRefs({ fs, gitdir, refs: [ref] }); } static async deleteRefs({ fs, gitdir, refs }) { await Promise.all(refs.map((ref) => fs.rm(join(gitdir, ref)))); - let text2 = await acquireLock( - "packed-refs", - async () => fs.read(`${gitdir}/packed-refs`, { encoding: "utf8" }) - ); + let text2 = await fs.read(`${gitdir}/packed-refs`, { encoding: "utf8" }); const packed = GitPackedRefs.from(text2); const beforeSize = packed.refs.size; for (const ref of refs) { @@ -17377,10 +17340,7 @@ var GitRefManager = class _GitRefManager { } if (packed.refs.size < beforeSize) { text2 = packed.toString(); - await acquireLock( - "packed-refs", - async () => fs.write(`${gitdir}/packed-refs`, text2, { encoding: "utf8" }) - ); + await fs.write(`${gitdir}/packed-refs`, text2, { encoding: "utf8" }); } } /** @@ -17398,6 +17358,7 @@ var GitRefManager = class _GitRefManager { return ref; } } + let sha; if (ref.startsWith("ref: ")) { ref = ref.slice("ref: ".length); return _GitRefManager.resolve({ fs, gitdir, ref, depth }); @@ -17408,10 +17369,7 @@ var GitRefManager = class _GitRefManager { const packedMap = await _GitRefManager.packedRefs({ fs, gitdir }); const allpaths = refpaths(ref).filter((p) => !GIT_FILES.includes(p)); for (const ref2 of allpaths) { - const sha = await acquireLock( - ref2, - async () => await fs.read(`${gitdir}/${ref2}`, { encoding: "utf8" }) || packedMap.get(ref2) - ); + sha = await fs.read(`${gitdir}/${ref2}`, { encoding: "utf8" }) || packedMap.get(ref2); if (sha) { return _GitRefManager.resolve({ fs, gitdir, ref: sha.trim(), depth }); } @@ -17433,11 +17391,7 @@ var GitRefManager = class _GitRefManager { const packedMap = await _GitRefManager.packedRefs({ fs, gitdir }); const allpaths = refpaths(ref); for (const ref2 of allpaths) { - const refExists = await acquireLock( - ref2, - async () => fs.exists(`${gitdir}/${ref2}`) - ); - if (refExists) + if (await fs.exists(`${gitdir}/${ref2}`)) return ref2; if (packedMap.has(ref2)) return ref2; @@ -17481,10 +17435,7 @@ var GitRefManager = class _GitRefManager { throw new NotFoundError(ref); } static async packedRefs({ fs, gitdir }) { - const text2 = await acquireLock( - "packed-refs", - async () => fs.read(`${gitdir}/packed-refs`, { encoding: "utf8" }) - ); + const text2 = await fs.read(`${gitdir}/packed-refs`, { encoding: "utf8" }); const packed = GitPackedRefs.from(text2); return packed.refs; } @@ -17675,11 +17626,11 @@ var GitObject = class { }; async function readObjectLoose({ fs, gitdir, oid }) { const source = `objects/${oid.slice(0, 2)}/${oid.slice(2)}`; - const file9 = await fs.read(`${gitdir}/${source}`); - if (!file9) { + const file = await fs.read(`${gitdir}/${source}`); + if (!file) { return null; } - return { object: file9, format: "deflated", source }; + return { object: file, format: "deflated", source }; } function applyDelta(delta, source) { const reader = new BufferCursor(delta); @@ -18710,7 +18661,7 @@ var IndexResetError = class _IndexResetError extends BaseError { */ constructor(filepath) { super( - `Could not merge index: Entry for '${filepath}' is not up to date. Either reset the index entry to HEAD, or stage your unstaged changes.` + `Could not merge index: Entry for '${filepath}' is not up to date. Either reset the index entry to HEAD, or stage your unstaged chages.` ); this.code = this.name = _IndexResetError.code; this.data = { filepath }; @@ -19507,7 +19458,7 @@ var FileSystem = class { } /** * Return true if a file exists, false if it doesn't exist. - * Rethrows errors that aren't related to file existence. + * Rethrows errors that aren't related to file existance. */ async exists(filepath, options = {}) { try { @@ -19638,7 +19589,7 @@ var FileSystem = class { } /** * Return the Stats of a file/symlink if it exists, otherwise returns null. - * Rethrows errors that aren't related to file existence. + * Rethrows errors that aren't related to file existance. */ async lstat(filename) { try { @@ -19653,7 +19604,7 @@ var FileSystem = class { } /** * Reads the contents of a symlink if it exists, otherwise returns null. - * Rethrows errors that aren't related to file existence. + * Rethrows errors that aren't related to file existance. */ async readlink(filename, opts = { encoding: "buffer" }) { try { @@ -19780,23 +19731,23 @@ var GitIgnoreManager = class { const pieces = filepath.split("/").filter(Boolean); for (let i = 1; i < pieces.length; i++) { const folder = pieces.slice(0, i).join("/"); - const file9 = pieces.slice(i).join("/"); + const file = pieces.slice(i).join("/"); pairs.push({ gitignore: join(dir, folder, ".gitignore"), - filepath: file9 + filepath: file }); } let ignoredStatus = false; for (const p of pairs) { - let file9; + let file; try { - file9 = await fs.read(p.gitignore, "utf8"); + file = await fs.read(p.gitignore, "utf8"); } catch (err) { if (err.code === "NOENT") continue; } const ign = (0, import_ignore.default)().add(excludes); - ign.add(file9); + ign.add(file); const parentdir = dirname(p.filepath); if (parentdir !== "." && ign.ignores(parentdir)) return true; @@ -19835,13 +19786,12 @@ async function browserDeflate(buffer2) { function testCompressionStream() { try { const cs = new CompressionStream("deflate"); - cs.writable.close(); - const stream = new Blob([]).stream(); - stream.cancel(); - return true; + new Blob([]).stream(); + if (cs) + return true; } catch (_) { - return false; } + return false; } async function _writeObject({ fs, @@ -21168,17 +21118,15 @@ async function parseRefsAdResponse(stream, { service }) { } const [firstRef, capabilitiesLine] = splitAndAssert(lineTwo, "\0", "\\x00"); capabilitiesLine.split(" ").map((x) => capabilities.add(x)); - if (firstRef !== "0000000000000000000000000000000000000000 capabilities^{}") { - const [ref, name] = splitAndAssert(firstRef, " ", " "); - refs.set(name, ref); - while (true) { - const line = await read(); - if (line === true) - break; - if (line !== null) { - const [ref2, name2] = splitAndAssert(line.toString("utf8"), " ", " "); - refs.set(name2, ref2); - } + const [ref, name] = splitAndAssert(firstRef, " ", " "); + refs.set(name, ref); + while (true) { + const line = await read(); + if (line === true) + break; + if (line !== null) { + const [ref2, name2] = splitAndAssert(line.toString("utf8"), " ", " "); + refs.set(name2, ref2); } } for (const cap of capabilities) { @@ -21391,14 +21339,14 @@ var GitRemoteManager = class { ); } }; -var lock$2 = null; +var lock$1 = null; var GitShallowManager = class { static async read({ fs, gitdir }) { - if (lock$2 === null) - lock$2 = new import_async_lock.default(); + if (lock$1 === null) + lock$1 = new import_async_lock.default(); const filepath = join(gitdir, "shallow"); const oids = /* @__PURE__ */ new Set(); - await lock$2.acquire(filepath, async function() { + await lock$1.acquire(filepath, async function() { const text2 = await fs.read(filepath, { encoding: "utf8" }); if (text2 === null) return oids; @@ -21409,18 +21357,18 @@ var GitShallowManager = class { return oids; } static async write({ fs, gitdir, oids }) { - if (lock$2 === null) - lock$2 = new import_async_lock.default(); + if (lock$1 === null) + lock$1 = new import_async_lock.default(); const filepath = join(gitdir, "shallow"); if (oids.size > 0) { const text2 = [...oids].join("\n") + "\n"; - await lock$2.acquire(filepath, async function() { + await lock$1.acquire(filepath, async function() { await fs.write(filepath, text2, { encoding: "utf8" }); }); } else { - await lock$2.acquire(filepath, async function() { + await lock$1.acquire(filepath, async function() { await fs.rm(filepath); }); } @@ -21491,8 +21439,8 @@ function filterCapabilities(server, client) { } var pkg = { name: "isomorphic-git", - version: "1.25.7", - agent: "git/isomorphic-git@1.25.7" + version: "1.25.3", + agent: "git/isomorphic-git@1.25.3" }; var FIFO = class { constructor() { @@ -25791,7 +25739,7 @@ var import_obsidian4 = require("obsidian"); var path = __toESM(require("path")); var import_path = require("path"); -// node_modules/simple-git/dist/esm/index.js +// node_modules/.pnpm/simple-git@https+++codeload.github.com+Vinzent03+git-js+tar.gz+6b9a2d899bc8256e38a1d6f0b8a881_rku6lxlylrt42756swupwur2wa/node_modules/simple-git/dist/esm/index.js init_polyfill_buffer(); var import_file_exists = __toESM(require_dist(), 1); var import_debug = __toESM(require_browser(), 1); @@ -26551,7 +26499,7 @@ function configFilePath(filePath) { function* configParser(text2, requestedKey = null) { const lines = text2.split("\0"); for (let i = 0, max = lines.length - 1; i < max; ) { - const file9 = configFilePath(lines[i++]); + const file = configFilePath(lines[i++]); let value = lines[i++]; let key2 = requestedKey; if (value.includes("\n")) { @@ -26559,7 +26507,7 @@ function* configParser(text2, requestedKey = null) { key2 = line[0]; value = line[1]; } - yield { file: file9, key: key2, value }; + yield { file, key: key2, value }; } } var ConfigList; @@ -26573,22 +26521,22 @@ var init_ConfigList = __esm2({ } get all() { if (!this._all) { - this._all = this.files.reduce((all, file9) => { - return Object.assign(all, this.values[file9]); + this._all = this.files.reduce((all, file) => { + return Object.assign(all, this.values[file]); }, {}); } return this._all; } - addFile(file9) { - if (!(file9 in this.values)) { + addFile(file) { + if (!(file in this.values)) { const latest = last(this.files); - this.values[file9] = latest ? Object.create(this.values[latest]) : {}; - this.files.push(file9); + this.values[file] = latest ? Object.create(this.values[latest]) : {}; + this.files.push(file); } - return this.values[file9]; + return this.values[file]; } - addValue(file9, key2, value) { - const values = this.addFile(file9); + addValue(file, key2, value) { + const values = this.addFile(file); if (!values.hasOwnProperty(key2)) { values[key2] = value; } else if (Array.isArray(values[key2])) { @@ -27412,18 +27360,18 @@ var init_parse_diff_summary = __esm2({ init_DiffSummary(); init_utils(); statParser = [ - new LineParser(/(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, (result, [file9, changes, alterations = ""]) => { + new LineParser(/(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, (result, [file, changes, alterations = ""]) => { result.files.push({ - file: file9.trim(), + file: file.trim(), changes: asNumber(changes), insertions: alterations.replace(/[^+]/g, "").length, deletions: alterations.replace(/[^-]/g, "").length, binary: false }); }), - new LineParser(/(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, (result, [file9, before, after]) => { + new LineParser(/(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, (result, [file, before, after]) => { result.files.push({ - file: file9.trim(), + file: file.trim(), before: asNumber(before), after: asNumber(after), binary: true @@ -27438,24 +27386,24 @@ var init_parse_diff_summary = __esm2({ }) ]; numStatParser = [ - new LineParser(/(\d+)\t(\d+)\t(.+)$/, (result, [changesInsert, changesDelete, file9]) => { + new LineParser(/(\d+)\t(\d+)\t(.+)$/, (result, [changesInsert, changesDelete, file]) => { const insertions = asNumber(changesInsert); const deletions = asNumber(changesDelete); result.changed++; result.insertions += insertions; result.deletions += deletions; result.files.push({ - file: file9, + file, changes: insertions + deletions, insertions, deletions, binary: false }); }), - new LineParser(/-\t-\t(.+)$/, (result, [file9]) => { + new LineParser(/-\t-\t(.+)$/, (result, [file]) => { result.changed++; result.files.push({ - file: file9, + file, after: 0, before: 0, binary: true @@ -27463,10 +27411,10 @@ var init_parse_diff_summary = __esm2({ }) ]; nameOnlyParser = [ - new LineParser(/(.+)$/, (result, [file9]) => { + new LineParser(/(.+)$/, (result, [file]) => { result.changed++; result.files.push({ - file: file9, + file, changes: 0, insertions: 0, deletions: 0, @@ -27692,9 +27640,9 @@ var MergeSummaryDetail; var init_MergeSummary = __esm2({ "src/lib/responses/MergeSummary.ts"() { MergeSummaryConflict = class { - constructor(reason, file9 = null, meta) { + constructor(reason, file = null, meta) { this.reason = reason; - this.file = file9; + this.file = file; this.meta = meta; } toString() { @@ -27857,13 +27805,13 @@ var init_parse_pull = __esm2({ SUMMARY_REGEX = /(\d+)\D+((\d+)\D+\(\+\))?(\D+(\d+)\D+\(-\))?/; ACTION_REGEX = /^(create|delete) mode \d+ (.+)/; parsers3 = [ - new LineParser(FILE_UPDATE_REGEX, (result, [file9, insertions, deletions]) => { - result.files.push(file9); + new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => { + result.files.push(file); if (insertions) { - result.insertions[file9] = insertions.length; + result.insertions[file] = insertions.length; } if (deletions) { - result.deletions[file9] = deletions.length; + result.deletions[file] = deletions.length; } }), new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => { @@ -27875,9 +27823,9 @@ var init_parse_pull = __esm2({ } return false; }), - new LineParser(ACTION_REGEX, (result, [action, file9]) => { - append(result.files, file9); - append(action === "create" ? result.created : result.deleted, file9); + new LineParser(ACTION_REGEX, (result, [action, file]) => { + append(result.files, file); + append(action === "create" ? result.created : result.deleted, file); }) ]; errorParsers = [ @@ -27910,11 +27858,11 @@ var init_parse_merge = __esm2({ new LineParser(/^Auto-merging\s+(.+)$/, (summary, [autoMerge]) => { summary.merges.push(autoMerge); }), - new LineParser(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, (summary, [reason, file9]) => { - summary.conflicts.push(new MergeSummaryConflict(reason, file9)); + new LineParser(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, (summary, [reason, file]) => { + summary.conflicts.push(new MergeSummaryConflict(reason, file)); }), - new LineParser(/^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, (summary, [reason, file9, deleteRef2]) => { - summary.conflicts.push(new MergeSummaryConflict(reason, file9, { deleteRef: deleteRef2 })); + new LineParser(/^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, (summary, [reason, file, deleteRef2]) => { + summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef: deleteRef2 })); }), new LineParser(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { summary.conflicts.push(new MergeSummaryConflict(reason, null)); @@ -28079,7 +28027,7 @@ function parser2(indexX, indexY, handler) { return [`${indexX}${indexY}`, handler]; } function conflicts(indexX, ...indexY) { - return indexY.map((y) => parser2(indexX, y, (result, file9) => append(result.conflicted, file9))); + return indexY.map((y) => parser2(indexX, y, (result, file) => append(result.conflicted, file))); } function splitLine(result, lineStr) { const trimmed2 = lineStr.trim(); @@ -28131,26 +28079,26 @@ var init_StatusSummary = __esm2({ } }; parsers6 = new Map([ - parser2(" ", "A", (result, file9) => append(result.created, file9)), - parser2(" ", "D", (result, file9) => append(result.deleted, file9)), - parser2(" ", "M", (result, file9) => append(result.modified, file9)), - parser2("A", " ", (result, file9) => append(result.created, file9) && append(result.staged, file9)), - parser2("A", "M", (result, file9) => append(result.created, file9) && append(result.staged, file9) && append(result.modified, file9)), - parser2("D", " ", (result, file9) => append(result.deleted, file9) && append(result.staged, file9)), - parser2("M", " ", (result, file9) => append(result.modified, file9) && append(result.staged, file9)), - parser2("M", "M", (result, file9) => append(result.modified, file9) && append(result.staged, file9)), - parser2("R", " ", (result, file9) => { - append(result.renamed, renamedFile(file9)); + parser2(" ", "A", (result, file) => append(result.created, file)), + parser2(" ", "D", (result, file) => append(result.deleted, file)), + parser2(" ", "M", (result, file) => append(result.modified, file)), + parser2("A", " ", (result, file) => append(result.created, file) && append(result.staged, file)), + parser2("A", "M", (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file)), + parser2("D", " ", (result, file) => append(result.deleted, file) && append(result.staged, file)), + parser2("M", " ", (result, file) => append(result.modified, file) && append(result.staged, file)), + parser2("M", "M", (result, file) => append(result.modified, file) && append(result.staged, file)), + parser2("R", " ", (result, file) => { + append(result.renamed, renamedFile(file)); }), - parser2("R", "M", (result, file9) => { - const renamed = renamedFile(file9); + parser2("R", "M", (result, file) => { + const renamed = renamedFile(file); append(result.renamed, renamed); append(result.modified, renamed.to); }), parser2("!", "!", (_result, _file) => { append(_result.ignored = _result.ignored || [], _file); }), - parser2("?", "?", (result, file9) => append(result.not_added, file9)), + parser2("?", "?", (result, file) => append(result.not_added, file)), ...conflicts( "A", "A", @@ -28633,7 +28581,7 @@ var parseCheckIgnore; var init_CheckIgnore = __esm2({ "src/lib/responses/CheckIgnore.ts"() { parseCheckIgnore = (text2) => { - return text2.split(/\n/g).map((line) => line.trim()).filter((file9) => !!file9); + return text2.split(/\n/g).map((line) => line.trim()).filter((file) => !!file); }; } }); @@ -29710,22 +29658,6 @@ function mergeSettingsByPriority(low, high) { const lineAuthor = Object.assign({}, low.lineAuthor, high.lineAuthor); return Object.assign({}, low, high, { lineAuthor }); } -var PluginState = /* @__PURE__ */ ((PluginState2) => { - PluginState2[PluginState2["idle"] = 0] = "idle"; - PluginState2[PluginState2["status"] = 1] = "status"; - PluginState2[PluginState2["pull"] = 2] = "pull"; - PluginState2[PluginState2["add"] = 3] = "add"; - PluginState2[PluginState2["commit"] = 4] = "commit"; - PluginState2[PluginState2["push"] = 5] = "push"; - PluginState2[PluginState2["conflicted"] = 6] = "conflicted"; - return PluginState2; -})(PluginState || {}); -var FileType = /* @__PURE__ */ ((FileType2) => { - FileType2[FileType2["staged"] = 0] = "staged"; - FileType2[FileType2["changed"] = 1] = "changed"; - FileType2[FileType2["pulled"] = 2] = "pulled"; - return FileType2; -})(FileType || {}); // src/utils.ts init_polyfill_buffer(); @@ -30425,10 +30357,10 @@ var SimpleGit = class extends GitManager { } } // https://github.com/kometenstaub/obsidian-version-history-diff/issues/3 - async log(file9, relativeToVault = true, limit) { + async log(file, relativeToVault = true, limit) { let path2; - if (file9) { - path2 = this.getRelativeRepoPath(file9, relativeToVault); + if (file) { + path2 = this.getRelativeRepoPath(file, relativeToVault); } const res = await this.git.log( { @@ -30462,8 +30394,8 @@ var SimpleGit = class extends GitManager { }; }); } - async show(commitHash, file9, relativeToVault = true) { - const path2 = this.getRelativeRepoPath(file9, relativeToVault); + async show(commitHash, file, relativeToVault = true) { + const path2 = this.getRelativeRepoPath(file, relativeToVault); return this.git.show( [commitHash + ":" + path2], (err) => this.onError(err) @@ -30603,8 +30535,8 @@ var SimpleGit = class extends GitManager { else return await this.git.diff(["--", filePath]); } - async diff(file9, commit1, commit2) { - return await this.git.diff([`${commit1}..${commit2}`, "--", file9]); + async diff(file, commit1, commit2) { + return await this.git.diff([`${commit1}..${commit2}`, "--", file]); } async getSubmoduleOfFile(repositoryRelativeFile) { let submoduleRoot = await this.git.raw( @@ -30862,7 +30794,7 @@ var import_obsidian8 = require("obsidian"); // src/gitManager/isomorphicGit.ts init_polyfill_buffer(); -// node_modules/diff/lib/index.mjs +// node_modules/.pnpm/diff@5.2.0/node_modules/diff/lib/index.mjs init_polyfill_buffer(); function Diff() { } @@ -31461,10 +31393,10 @@ var MyAdapter = class { var _a2; this.maybeLog("Read: " + path2 + JSON.stringify(opts)); if (opts == "utf8" || opts.encoding == "utf8") { - const file9 = this.vault.getAbstractFileByPath(path2); - if (file9 instanceof import_obsidian6.TFile) { + const file = this.vault.getAbstractFileByPath(path2); + if (file instanceof import_obsidian6.TFile) { this.maybeLog("Reuse"); - return this.vault.read(file9); + return this.vault.read(file); } else { return this.adapter.read(path2); } @@ -31477,10 +31409,10 @@ var MyAdapter = class { } return (_a2 = this.index) != null ? _a2 : this.adapter.readBinary(path2); } - const file9 = this.vault.getAbstractFileByPath(path2); - if (file9 instanceof import_obsidian6.TFile) { + const file = this.vault.getAbstractFileByPath(path2); + if (file instanceof import_obsidian6.TFile) { this.maybeLog("Reuse"); - return this.vault.readBinary(file9); + return this.vault.readBinary(file); } else { return this.adapter.readBinary(path2); } @@ -31489,9 +31421,9 @@ var MyAdapter = class { async writeFile(path2, data) { this.maybeLog("Write: " + path2); if (typeof data === "string") { - const file9 = this.vault.getAbstractFileByPath(path2); - if (file9 instanceof import_obsidian6.TFile) { - return this.vault.modify(file9, data); + const file = this.vault.getAbstractFileByPath(path2); + if (file instanceof import_obsidian6.TFile) { + return this.vault.modify(file, data); } else { return this.adapter.write(path2, data); } @@ -31500,9 +31432,9 @@ var MyAdapter = class { this.index = data; this.indexmtime = Date.now(); } else { - const file9 = this.vault.getAbstractFileByPath(path2); - if (file9 instanceof import_obsidian6.TFile) { - return this.vault.modifyBinary(file9, data); + const file = this.vault.getAbstractFileByPath(path2); + if (file instanceof import_obsidian6.TFile) { + return this.vault.modifyBinary(file, data); } else { return this.adapter.writeBinary(path2, data); } @@ -31563,14 +31495,14 @@ var MyAdapter = class { } if (path2 === ".") path2 = "/"; - const file9 = this.vault.getAbstractFileByPath(path2); + const file = this.vault.getAbstractFileByPath(path2); this.maybeLog("Stat: " + path2); - if (file9 instanceof import_obsidian6.TFile) { + if (file instanceof import_obsidian6.TFile) { this.maybeLog("Reuse stat"); return { - ctimeMs: file9.stat.ctime, - mtimeMs: file9.stat.mtime, - size: file9.stat.size, + ctimeMs: file.stat.ctime, + mtimeMs: file.stat.mtime, + size: file.stat.size, type: "file", isFile: () => true, isDirectory: () => false, @@ -31840,14 +31772,14 @@ var IsomorphicGit = class extends GitManager { if (status2) { await Promise.all( status2.changed.map( - (file9) => file9.working_dir !== "D" ? this.wrapFS( + (file) => file.working_dir !== "D" ? this.wrapFS( isomorphic_git_default.add({ ...this.getRepo(), - filepath: file9.path + filepath: file.path }) ) : isomorphic_git_default.remove({ ...this.getRepo(), - filepath: file9.path + filepath: file.path }) ) ); @@ -31885,7 +31817,7 @@ var IsomorphicGit = class extends GitManager { try { let staged; if (status2) { - staged = status2.staged.map((file9) => file9.path); + staged = status2.staged.map((file) => file.path); } else { const res = await this.getStagedFiles(dir != null ? dir : "."); staged = res.map(({ filepath }) => filepath); @@ -31893,7 +31825,7 @@ var IsomorphicGit = class extends GitManager { await this.wrapFS( Promise.all( staged.map( - (file9) => isomorphic_git_default.resetIndex({ ...this.getRepo(), filepath: file9 }) + (file) => isomorphic_git_default.resetIndex({ ...this.getRepo(), filepath: file }) ) ) ); @@ -31924,9 +31856,9 @@ var IsomorphicGit = class extends GitManager { let files = []; if (status2) { if (dir != void 0) { - files = status2.changed.filter((file9) => file9.path.startsWith(dir)).map((file9) => file9.path); + files = status2.changed.filter((file) => file.path.startsWith(dir)).map((file) => file.path); } else { - files = status2.changed.map((file9) => file9.path); + files = status2.changed.map((file) => file.path); } } else { files = (await this.getUnstagedFiles(dir)).map( @@ -31999,18 +31931,18 @@ var IsomorphicGit = class extends GitManager { upstreamCommit ); this.showNotice("Finished pull", false); - return changedFiles.map((file9) => ({ - path: file9.path, + return changedFiles.map((file) => ({ + path: file.path, working_dir: "P", index: "P", - vault_path: this.getRelativeVaultPath(file9.path) + vault_path: this.getRelativeVaultPath(file.path) })); } catch (error) { progressNotice == null ? void 0 : progressNotice.hide(); if (error instanceof Errors.MergeConflictError) { this.plugin.handleConflict( error.data.filepaths.map( - (file9) => this.getRelativeVaultPath(file9) + (file) => this.getRelativeVaultPath(file) ) ); } @@ -32370,10 +32302,10 @@ var IsomorphicGit = class extends GitManager { walkers: [isomorphic_git_default.TREE({ ref: "HEAD" }), isomorphic_git_default.STAGE()], dir }); - return res.map((file9) => { + return res.map((file) => { return { - vault_path: this.getRelativeVaultPath(file9.path), - filepath: file9.path + vault_path: this.getRelativeVaultPath(file.path), + filepath: file.path }; }); } @@ -32453,8 +32385,8 @@ var IsomorphicGit = class extends GitManager { } async getDiffString(filePath, stagedChanges = false, hash2) { const vaultPath = this.getRelativeVaultPath(filePath); - const map = async (file9, [A]) => { - if (filePath == file9) { + const map = async (file, [A]) => { + if (filePath == file) { const oid = await A.oid(); const contents = await isomorphic_git_default.readBlob({ ...this.getRepo(), @@ -34286,22 +34218,22 @@ var LineAuthorProvider = class { */ this.lineAuthorings = /* @__PURE__ */ new Map(); } - async trackChanged(file9) { - this.trackChangedHelper(file9).catch((reason) => { + async trackChanged(file) { + this.trackChangedHelper(file).catch((reason) => { console.warn("Git: Error in trackChanged." + reason); return Promise.reject(reason); }); } - async trackChangedHelper(file9) { - if (!file9) + async trackChangedHelper(file) { + if (!file) return; - if (file9.path === void 0) { + if (file.path === void 0) { console.warn( "Git: Attempted to track change of undefined filepath. Unforeseen situation." ); return; } - this.computeLineAuthorInfo(file9.path); + this.computeLineAuthorInfo(file.path); } destroy() { this.lineAuthorings.clear(); @@ -34351,16 +34283,16 @@ var LineAuthoringFeature = class { this.codeMirrorExtensions = []; this.handleWorkspaceLeaf = (leaf) => { const obsView = leaf == null ? void 0 : leaf.view; - const file9 = obsView == null ? void 0 : obsView.file; + const file = obsView == null ? void 0 : obsView.file; if (!this.lineAuthorInfoProvider) { console.warn( "Git: undefined lineAuthorInfoProvider. Unexpected situation." ); return; } - if (file9 === void 0 || (obsView == null ? void 0 : obsView.allowNoFile) === true) + if (file === void 0 || (obsView == null ? void 0 : obsView.allowNoFile) === true) return; - this.lineAuthorInfoProvider.trackChanged(file9); + this.lineAuthorInfoProvider.trackChanged(file); }; } // ========================= INIT and DE-INIT ========================== @@ -34457,9 +34389,9 @@ var LineAuthoringFeature = class { createFileOpenEvent() { return this.plg.app.workspace.on( "file-open", - (file9) => { + (file) => { var _a2; - return (_a2 = this.lineAuthorInfoProvider) == null ? void 0 : _a2.trackChanged(file9); + return (_a2 = this.lineAuthorInfoProvider) == null ? void 0 : _a2.trackChanged(file); } ); } @@ -34472,9 +34404,9 @@ var LineAuthoringFeature = class { createFileRenameEvent() { return this.plg.app.vault.on( "rename", - (file9, _old) => { + (file, _old) => { var _a2; - return file9 instanceof import_obsidian12.TFile && ((_a2 = this.lineAuthorInfoProvider) == null ? void 0 : _a2.trackChanged(file9)); + return file instanceof import_obsidian12.TFile && ((_a2 = this.lineAuthorInfoProvider) == null ? void 0 : _a2.trackChanged(file)); } ); } @@ -34721,7 +34653,7 @@ var CustomMessageModal = class extends import_obsidian15.SuggestModal { // src/openInGitHub.ts init_polyfill_buffer(); var import_obsidian16 = require("obsidian"); -async function openLineInGitHub(editor, file9, manager) { +async function openLineInGitHub(editor, file, manager) { const data = await getData(manager); if (data.result === "failure") { new import_obsidian16.Notice(data.reason); @@ -34729,7 +34661,7 @@ async function openLineInGitHub(editor, file9, manager) { } const { isGitHub, branch: branch2, repo, user } = data; if (isGitHub) { - const path2 = manager.getRelativeRepoPath(file9.path); + const path2 = manager.getRelativeRepoPath(file.path); const from = editor.getCursor("from").line + 1; const to = editor.getCursor("to").line + 1; if (from === to) { @@ -34745,14 +34677,14 @@ async function openLineInGitHub(editor, file9, manager) { new import_obsidian16.Notice("It seems like you are not using GitHub"); } } -async function openHistoryInGitHub(file9, manager) { +async function openHistoryInGitHub(file, manager) { const data = await getData(manager); if (data.result === "failure") { new import_obsidian16.Notice(data.reason); return; } const { isGitHub, branch: branch2, repo, user } = data; - const path2 = manager.getRelativeRepoPath(file9.path); + const path2 = manager.getRelativeRepoPath(file.path); if (isGitHub) { window.open( `https://github.com/${user}/${repo}/commits/${branch2}/${path2}` @@ -34899,13 +34831,13 @@ var LocalStorageSettings = class { // src/ui/diff/diffView.ts init_polyfill_buffer(); -// node_modules/diff2html/lib-esm/diff2html.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/diff2html.js init_polyfill_buffer(); -// node_modules/diff2html/lib-esm/diff-parser.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/diff-parser.js init_polyfill_buffer(); -// node_modules/diff2html/lib-esm/types.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/types.js init_polyfill_buffer(); var LineType; (function(LineType2) { @@ -34933,7 +34865,7 @@ var ColorSchemeType; ColorSchemeType2["LIGHT"] = "light"; })(ColorSchemeType || (ColorSchemeType = {})); -// node_modules/diff2html/lib-esm/utils.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/utils.js init_polyfill_buffer(); var specials = [ "-", @@ -34971,7 +34903,7 @@ function hashCode(text2) { return hash2; } -// node_modules/diff2html/lib-esm/diff-parser.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/diff-parser.js function getExtension(filename, language) { const filenameParts = filename.split("."); return filenameParts.length > 1 ? filenameParts[filenameParts.length - 1] : language; @@ -35262,13 +35194,13 @@ function parse(diffInput, config = {}) { return files; } -// node_modules/diff2html/lib-esm/file-list-renderer.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/file-list-renderer.js init_polyfill_buffer(); -// node_modules/diff2html/lib-esm/render-utils.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/render-utils.js init_polyfill_buffer(); -// node_modules/diff2html/node_modules/diff/lib/index.mjs +// node_modules/.pnpm/diff@5.1.0/node_modules/diff/lib/index.mjs init_polyfill_buffer(); function Diff2() { } @@ -35599,7 +35531,7 @@ arrayDiff2.join = arrayDiff2.removeEmpty = function(value) { return value; }; -// node_modules/diff2html/lib-esm/rematch.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/rematch.js init_polyfill_buffer(); function levenshtein(a, b) { if (a.length === 0) { @@ -35684,7 +35616,7 @@ function newMatcherFn(distance2) { return group; } -// node_modules/diff2html/lib-esm/render-utils.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/render-utils.js var CSSLineClass = { INSERTS: "d2h-ins", DELETES: "d2h-del", @@ -35746,9 +35678,9 @@ function deconstructLine(line, isCombined, escape = true) { content: escape ? escapeForHtml(line.substring(indexToSplit)) : line.substring(indexToSplit) }; } -function filenameDiff(file9) { - const oldFilename = unifyPath(file9.oldName); - const newFilename = unifyPath(file9.newName); +function filenameDiff(file) { + const oldFilename = unifyPath(file.oldName); + const newFilename = unifyPath(file.newName); if (oldFilename !== newFilename && !isDevNullName(oldFilename) && !isDevNullName(newFilename)) { const prefixPaths = []; const suffixPaths = []; @@ -35794,20 +35726,20 @@ function filenameDiff(file9) { return oldFilename; } } -function getHtmlId(file9) { - return `d2h-${hashCode(filenameDiff(file9)).toString().slice(-6)}`; +function getHtmlId(file) { + return `d2h-${hashCode(filenameDiff(file)).toString().slice(-6)}`; } -function getFileIcon(file9) { +function getFileIcon(file) { let templateName = "file-changed"; - if (file9.isRename) { + if (file.isRename) { templateName = "file-renamed"; - } else if (file9.isCopy) { + } else if (file.isCopy) { templateName = "file-renamed"; - } else if (file9.isNew) { + } else if (file.isNew) { templateName = "file-added"; - } else if (file9.isDeleted) { + } else if (file.isDeleted) { templateName = "file-deleted"; - } else if (file9.newName !== file9.oldName) { + } else if (file.newName !== file.oldName) { templateName = "file-renamed"; } return templateName; @@ -35862,7 +35794,7 @@ function diffHighlight(diffLine1, diffLine2, isCombined, config = {}) { }; } -// node_modules/diff2html/lib-esm/file-list-renderer.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/file-list-renderer.js var baseTemplatesPath = "file-summary"; var iconsBaseTemplatesPath = "icon"; var defaultFileListRendererConfig = { @@ -35874,15 +35806,15 @@ var FileListRenderer = class { this.config = Object.assign(Object.assign({}, defaultFileListRendererConfig), config); } render(diffFiles) { - const files = diffFiles.map((file9) => this.hoganUtils.render(baseTemplatesPath, "line", { - fileHtmlId: getHtmlId(file9), - oldName: file9.oldName, - newName: file9.newName, - fileName: filenameDiff(file9), - deletedLines: "-" + file9.deletedLines, - addedLines: "+" + file9.addedLines + const files = diffFiles.map((file) => this.hoganUtils.render(baseTemplatesPath, "line", { + fileHtmlId: getHtmlId(file), + oldName: file.oldName, + newName: file.newName, + fileName: filenameDiff(file), + deletedLines: "-" + file.deletedLines, + addedLines: "+" + file.addedLines }, { - fileIcon: this.hoganUtils.template(iconsBaseTemplatesPath, getFileIcon(file9)) + fileIcon: this.hoganUtils.template(iconsBaseTemplatesPath, getFileIcon(file)) })).join("\n"); return this.hoganUtils.render(baseTemplatesPath, "wrapper", { colorScheme: colorSchemeToCss(this.config.colorScheme), @@ -35892,7 +35824,7 @@ var FileListRenderer = class { } }; -// node_modules/diff2html/lib-esm/line-by-line-renderer.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/line-by-line-renderer.js init_polyfill_buffer(); var defaultLineByLineRendererConfig = Object.assign(Object.assign({}, defaultRenderConfig), { renderNothingWhenEmpty: false, matchingMaxComparisons: 2500, maxLineSizeInBlockForComparison: 200 }); var genericTemplatesPath = "generic"; @@ -35905,33 +35837,33 @@ var LineByLineRenderer = class { this.config = Object.assign(Object.assign({}, defaultLineByLineRendererConfig), config); } render(diffFiles) { - const diffsHtml = diffFiles.map((file9) => { + const diffsHtml = diffFiles.map((file) => { let diffs; - if (file9.blocks.length) { - diffs = this.generateFileHtml(file9); + if (file.blocks.length) { + diffs = this.generateFileHtml(file); } else { diffs = this.generateEmptyDiff(); } - return this.makeFileDiffHtml(file9, diffs); + return this.makeFileDiffHtml(file, diffs); }).join("\n"); return this.hoganUtils.render(genericTemplatesPath, "wrapper", { colorScheme: colorSchemeToCss(this.config.colorScheme), content: diffsHtml }); } - makeFileDiffHtml(file9, diffs) { - if (this.config.renderNothingWhenEmpty && Array.isArray(file9.blocks) && file9.blocks.length === 0) + makeFileDiffHtml(file, diffs) { + if (this.config.renderNothingWhenEmpty && Array.isArray(file.blocks) && file.blocks.length === 0) return ""; const fileDiffTemplate = this.hoganUtils.template(baseTemplatesPath2, "file-diff"); const filePathTemplate = this.hoganUtils.template(genericTemplatesPath, "file-path"); const fileIconTemplate = this.hoganUtils.template(iconsBaseTemplatesPath2, "file"); - const fileTagTemplate = this.hoganUtils.template(tagsBaseTemplatesPath, getFileIcon(file9)); + const fileTagTemplate = this.hoganUtils.template(tagsBaseTemplatesPath, getFileIcon(file)); return fileDiffTemplate.render({ - file: file9, - fileHtmlId: getHtmlId(file9), + file, + fileHtmlId: getHtmlId(file), diffs, filePath: filePathTemplate.render({ - fileDiffName: filenameDiff(file9) + fileDiffName: filenameDiff(file) }, { fileIcon: fileIconTemplate, fileTag: fileTagTemplate @@ -35944,26 +35876,26 @@ var LineByLineRenderer = class { CSSLineClass }); } - generateFileHtml(file9) { - const matcher2 = newMatcherFn(newDistanceFn((e) => deconstructLine(e.content, file9.isCombined).content)); - return file9.blocks.map((block) => { + generateFileHtml(file) { + const matcher2 = newMatcherFn(newDistanceFn((e) => deconstructLine(e.content, file.isCombined).content)); + return file.blocks.map((block) => { let lines = this.hoganUtils.render(genericTemplatesPath, "block-header", { CSSLineClass, - blockHeader: file9.isTooBig ? block.header : escapeForHtml(block.header), + blockHeader: file.isTooBig ? block.header : escapeForHtml(block.header), lineClass: "d2h-code-linenumber", contentClass: "d2h-code-line" }); this.applyLineGroupping(block).forEach(([contextLines, oldLines, newLines]) => { if (oldLines.length && newLines.length && !contextLines.length) { this.applyRematchMatching(oldLines, newLines, matcher2).map(([oldLines2, newLines2]) => { - const { left, right } = this.processChangedLines(file9, file9.isCombined, oldLines2, newLines2); + const { left, right } = this.processChangedLines(file, file.isCombined, oldLines2, newLines2); lines += left; lines += right; }); } else if (contextLines.length) { contextLines.forEach((line) => { - const { prefix, content } = deconstructLine(line.content, file9.isCombined); - lines += this.generateSingleLineHtml(file9, { + const { prefix, content } = deconstructLine(line.content, file.isCombined); + lines += this.generateSingleLineHtml(file, { type: CSSLineClass.CONTEXT, prefix, content, @@ -35972,7 +35904,7 @@ var LineByLineRenderer = class { }); }); } else if (oldLines.length || newLines.length) { - const { left, right } = this.processChangedLines(file9, file9.isCombined, oldLines, newLines); + const { left, right } = this.processChangedLines(file, file.isCombined, oldLines, newLines); lines += left; lines += right; } else { @@ -36016,7 +35948,7 @@ var LineByLineRenderer = class { const doMatching = comparisons < this.config.matchingMaxComparisons && maxLineSizeInBlock < this.config.maxLineSizeInBlockForComparison && (this.config.matching === "lines" || this.config.matching === "words"); return doMatching ? matcher2(oldLines, newLines) : [[oldLines, newLines]]; } - processChangedLines(file9, isCombined, oldLines, newLines) { + processChangedLines(file, isCombined, oldLines, newLines) { const fileHtml = { right: "", left: "" @@ -36036,19 +35968,19 @@ var LineByLineRenderer = class { content: diff3.newLine.content, type: CSSLineClass.INSERT_CHANGES } : Object.assign(Object.assign({}, deconstructLine(newLine.content, isCombined)), { type: toCSSClass(newLine.type) })), { oldNumber: newLine.oldNumber, newNumber: newLine.newNumber }) : void 0; - const { left, right } = this.generateLineHtml(file9, preparedOldLine, preparedNewLine); + const { left, right } = this.generateLineHtml(file, preparedOldLine, preparedNewLine); fileHtml.left += left; fileHtml.right += right; } return fileHtml; } - generateLineHtml(file9, oldLine, newLine) { + generateLineHtml(file, oldLine, newLine) { return { - left: this.generateSingleLineHtml(file9, oldLine), - right: this.generateSingleLineHtml(file9, newLine) + left: this.generateSingleLineHtml(file, oldLine), + right: this.generateSingleLineHtml(file, newLine) }; } - generateSingleLineHtml(file9, line) { + generateSingleLineHtml(file, line) { if (line === void 0) return ""; const lineNumberHtml = this.hoganUtils.render(baseTemplatesPath2, "numbers", { @@ -36063,12 +35995,12 @@ var LineByLineRenderer = class { content: line.content, lineNumber: lineNumberHtml, line, - file: file9 + file }); } }; -// node_modules/diff2html/lib-esm/side-by-side-renderer.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/side-by-side-renderer.js init_polyfill_buffer(); var defaultSideBySideRendererConfig = Object.assign(Object.assign({}, defaultRenderConfig), { renderNothingWhenEmpty: false, matchingMaxComparisons: 2500, maxLineSizeInBlockForComparison: 200 }); var genericTemplatesPath2 = "generic"; @@ -36081,33 +36013,33 @@ var SideBySideRenderer = class { this.config = Object.assign(Object.assign({}, defaultSideBySideRendererConfig), config); } render(diffFiles) { - const diffsHtml = diffFiles.map((file9) => { + const diffsHtml = diffFiles.map((file) => { let diffs; - if (file9.blocks.length) { - diffs = this.generateFileHtml(file9); + if (file.blocks.length) { + diffs = this.generateFileHtml(file); } else { diffs = this.generateEmptyDiff(); } - return this.makeFileDiffHtml(file9, diffs); + return this.makeFileDiffHtml(file, diffs); }).join("\n"); return this.hoganUtils.render(genericTemplatesPath2, "wrapper", { colorScheme: colorSchemeToCss(this.config.colorScheme), content: diffsHtml }); } - makeFileDiffHtml(file9, diffs) { - if (this.config.renderNothingWhenEmpty && Array.isArray(file9.blocks) && file9.blocks.length === 0) + makeFileDiffHtml(file, diffs) { + if (this.config.renderNothingWhenEmpty && Array.isArray(file.blocks) && file.blocks.length === 0) return ""; const fileDiffTemplate = this.hoganUtils.template(baseTemplatesPath3, "file-diff"); const filePathTemplate = this.hoganUtils.template(genericTemplatesPath2, "file-path"); const fileIconTemplate = this.hoganUtils.template(iconsBaseTemplatesPath3, "file"); - const fileTagTemplate = this.hoganUtils.template(tagsBaseTemplatesPath2, getFileIcon(file9)); + const fileTagTemplate = this.hoganUtils.template(tagsBaseTemplatesPath2, getFileIcon(file)); return fileDiffTemplate.render({ - file: file9, - fileHtmlId: getHtmlId(file9), + file, + fileHtmlId: getHtmlId(file), diffs, filePath: filePathTemplate.render({ - fileDiffName: filenameDiff(file9) + fileDiffName: filenameDiff(file) }, { fileIcon: fileIconTemplate, fileTag: fileTagTemplate @@ -36123,23 +36055,23 @@ var SideBySideRenderer = class { }) }; } - generateFileHtml(file9) { - const matcher2 = newMatcherFn(newDistanceFn((e) => deconstructLine(e.content, file9.isCombined).content)); - return file9.blocks.map((block) => { + generateFileHtml(file) { + const matcher2 = newMatcherFn(newDistanceFn((e) => deconstructLine(e.content, file.isCombined).content)); + return file.blocks.map((block) => { const fileHtml = { - left: this.makeHeaderHtml(block.header, file9), + left: this.makeHeaderHtml(block.header, file), right: this.makeHeaderHtml("") }; this.applyLineGroupping(block).forEach(([contextLines, oldLines, newLines]) => { if (oldLines.length && newLines.length && !contextLines.length) { this.applyRematchMatching(oldLines, newLines, matcher2).map(([oldLines2, newLines2]) => { - const { left, right } = this.processChangedLines(file9.isCombined, oldLines2, newLines2); + const { left, right } = this.processChangedLines(file.isCombined, oldLines2, newLines2); fileHtml.left += left; fileHtml.right += right; }); } else if (contextLines.length) { contextLines.forEach((line) => { - const { prefix, content } = deconstructLine(line.content, file9.isCombined); + const { prefix, content } = deconstructLine(line.content, file.isCombined); const { left, right } = this.generateLineHtml({ type: CSSLineClass.CONTEXT, prefix, @@ -36155,7 +36087,7 @@ var SideBySideRenderer = class { fileHtml.right += right; }); } else if (oldLines.length || newLines.length) { - const { left, right } = this.processChangedLines(file9.isCombined, oldLines, newLines); + const { left, right } = this.processChangedLines(file.isCombined, oldLines, newLines); fileHtml.left += left; fileHtml.right += right; } else { @@ -36201,10 +36133,10 @@ var SideBySideRenderer = class { const doMatching = comparisons < this.config.matchingMaxComparisons && maxLineSizeInBlock < this.config.maxLineSizeInBlockForComparison && (this.config.matching === "lines" || this.config.matching === "words"); return doMatching ? matcher2(oldLines, newLines) : [[oldLines, newLines]]; } - makeHeaderHtml(blockHeader, file9) { + makeHeaderHtml(blockHeader, file) { return this.hoganUtils.render(genericTemplatesPath2, "block-header", { CSSLineClass, - blockHeader: (file9 === null || file9 === void 0 ? void 0 : file9.isTooBig) ? blockHeader : escapeForHtml(blockHeader), + blockHeader: (file === null || file === void 0 ? void 0 : file.isTooBig) ? blockHeader : escapeForHtml(blockHeader), lineClass: "d2h-code-side-linenumber", contentClass: "d2h-code-side-line" }); @@ -36255,11 +36187,11 @@ var SideBySideRenderer = class { } }; -// node_modules/diff2html/lib-esm/hoganjs-utils.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/hoganjs-utils.js init_polyfill_buffer(); var Hogan3 = __toESM(require_hogan()); -// node_modules/diff2html/lib-esm/diff2html-templates.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/diff2html-templates.js init_polyfill_buffer(); var Hogan2 = __toESM(require_hogan()); var defaultTemplates = {}; @@ -36668,7 +36600,7 @@ defaultTemplates["tag-file-renamed"] = new Hogan2.Template({ code: function(c, p return t.fl(); }, partials: {}, subs: {} }); -// node_modules/diff2html/lib-esm/hoganjs-utils.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/hoganjs-utils.js var HoganJsUtils = class { constructor({ compiledTemplates = {}, rawTemplates = {} }) { const compiledRawTemplates = Object.entries(rawTemplates).reduce((previousTemplates, [name, templateString]) => { @@ -36697,7 +36629,7 @@ var HoganJsUtils = class { } }; -// node_modules/diff2html/lib-esm/diff2html.js +// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/diff2html.js var defaultDiff2HtmlConfig = Object.assign(Object.assign(Object.assign({}, defaultLineByLineRendererConfig), defaultSideBySideRendererConfig), { outputFormat: OutputFormatType.LINE_BY_LINE, drawFileList: true }); function html(diffInput, configuration = {}) { const config = Object.assign(Object.assign({}, defaultDiff2HtmlConfig), configuration); @@ -36810,22 +36742,17 @@ var import_obsidian21 = require("obsidian"); // src/ui/history/historyView.svelte init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/index.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/index.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/animations.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/animations.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/utils.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/utils.js init_polyfill_buffer(); function noop() { } var identity = (x) => x; -function add_location(element2, file9, line, column, char) { - element2.__svelte_meta = { - loc: { file: file9, line, column, char } - }; -} function run(fn) { return fn(); } @@ -36845,13 +36772,13 @@ function is_empty(obj) { return Object.keys(obj).length === 0; } -// node_modules/svelte/src/runtime/internal/environment.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/environment.js init_polyfill_buffer(); var is_client = typeof window !== "undefined"; var now = is_client ? () => window.performance.now() : () => Date.now(); var raf = is_client ? (cb) => requestAnimationFrame(cb) : noop; -// node_modules/svelte/src/runtime/internal/loop.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/loop.js init_polyfill_buffer(); var tasks = /* @__PURE__ */ new Set(); function run_tasks(now2) { @@ -36878,23 +36805,23 @@ function loop(callback) { }; } -// node_modules/svelte/src/runtime/internal/style_manager.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/style_manager.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/dom.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/dom.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/ResizeObserverSingleton.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/ResizeObserverSingleton.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/globals.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/globals.js init_polyfill_buffer(); var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : ( // @ts-ignore Node typings have this global ); -// node_modules/svelte/src/runtime/internal/ResizeObserverSingleton.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/ResizeObserverSingleton.js var ResizeObserverSingleton = class _ResizeObserverSingleton { /** @param {ResizeObserverOptions} options */ constructor(options) { @@ -36942,7 +36869,7 @@ var ResizeObserverSingleton = class _ResizeObserverSingleton { }; ResizeObserverSingleton.entries = "WeakMap" in globals ? /* @__PURE__ */ new WeakMap() : void 0; -// node_modules/svelte/src/runtime/internal/dom.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/dom.js var is_hydrating = false; function start_hydrating() { is_hydrating = true; @@ -37006,9 +36933,6 @@ function destroy_each(iterations, detaching) { function element(name) { return document.createElement(name); } -function svg_element(name) { - return document.createElementNS("http://www.w3.org/2000/svg", name); -} function text(data) { return document.createTextNode(data); } @@ -37037,6 +36961,13 @@ function attr(node, attribute, value) { function children(element2) { return Array.from(element2.childNodes); } +function set_data(text2, data) { + data = "" + data; + if (text2.data === data) + return; + text2.data = /** @type {string} */ + data; +} function set_input_value(input, value) { input.value = value == null ? "" : value; } @@ -37064,7 +36995,7 @@ function get_custom_elements_slots(element2) { return result; } -// node_modules/svelte/src/runtime/internal/style_manager.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/style_manager.js var managed_styles = /* @__PURE__ */ new Map(); var active = 0; function hash(str) { @@ -37128,16 +37059,16 @@ function clear_rules() { }); } -// node_modules/svelte/src/runtime/internal/await_block.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/await_block.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/transitions.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/transitions.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/scheduler.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/scheduler.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/lifecycle.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/lifecycle.js init_polyfill_buffer(); var current_component; function set_current_component(component) { @@ -37158,7 +37089,7 @@ function bubble(component, event) { } } -// node_modules/svelte/src/runtime/internal/scheduler.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/scheduler.js var dirty_components = []; var binding_callbacks = []; var render_callbacks = []; @@ -37233,7 +37164,7 @@ function flush_render_callbacks(fns) { render_callbacks = filtered; } -// node_modules/svelte/src/runtime/internal/transitions.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/transitions.js var promise; function wait() { if (!promise) { @@ -37414,19 +37345,19 @@ function create_bidirectional_transition(node, fn, params, intro) { }; } -// node_modules/svelte/src/runtime/internal/each.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/each.js init_polyfill_buffer(); function ensure_array_like(array_like_or_iterator) { return (array_like_or_iterator == null ? void 0 : array_like_or_iterator.length) !== void 0 ? array_like_or_iterator : Array.from(array_like_or_iterator); } -// node_modules/svelte/src/runtime/internal/spread.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/spread.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/ssr.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/ssr.js init_polyfill_buffer(); -// node_modules/svelte/src/shared/boolean_attributes.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/shared/boolean_attributes.js init_polyfill_buffer(); var _boolean_attributes = ( /** @type {const} */ @@ -37460,10 +37391,10 @@ var _boolean_attributes = ( ); var boolean_attributes = /* @__PURE__ */ new Set([..._boolean_attributes]); -// node_modules/svelte/src/shared/utils/names.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/shared/utils/names.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/internal/Component.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/Component.js init_polyfill_buffer(); function create_component(block) { block && block.c(); @@ -37635,7 +37566,7 @@ if (typeof HTMLElement === "function") { }; }; await Promise.resolve(); - if (!this.$$cn || this.$$c) { + if (!this.$$cn) { return; } const $$slots = {}; @@ -37811,126 +37742,19 @@ var SvelteComponent = class { } }; -// node_modules/svelte/src/runtime/internal/dev.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/dev.js init_polyfill_buffer(); -// node_modules/svelte/src/shared/version.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/shared/version.js init_polyfill_buffer(); -var VERSION = "4.2.14"; var PUBLIC_VERSION = "4"; -// node_modules/svelte/src/runtime/internal/dev.js -function dispatch_dev(type, detail) { - document.dispatchEvent(custom_event(type, { version: VERSION, ...detail }, { bubbles: true })); -} -function append_dev(target, node) { - dispatch_dev("SvelteDOMInsert", { target, node }); - append2(target, node); -} -function insert_dev(target, node, anchor) { - dispatch_dev("SvelteDOMInsert", { target, node, anchor }); - insert(target, node, anchor); -} -function detach_dev(node) { - dispatch_dev("SvelteDOMRemove", { node }); - detach(node); -} -function listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation, has_stop_immediate_propagation) { - const modifiers = options === true ? ["capture"] : options ? Array.from(Object.keys(options)) : []; - if (has_prevent_default) - modifiers.push("preventDefault"); - if (has_stop_propagation) - modifiers.push("stopPropagation"); - if (has_stop_immediate_propagation) - modifiers.push("stopImmediatePropagation"); - dispatch_dev("SvelteDOMAddEventListener", { node, event, handler, modifiers }); - const dispose = listen(node, event, handler, options); - return () => { - dispatch_dev("SvelteDOMRemoveEventListener", { node, event, handler, modifiers }); - dispose(); - }; -} -function attr_dev(node, attribute, value) { - attr(node, attribute, value); - if (value == null) - dispatch_dev("SvelteDOMRemoveAttribute", { node, attribute }); - else - dispatch_dev("SvelteDOMSetAttribute", { node, attribute, value }); -} -function set_data_dev(text2, data) { - data = "" + data; - if (text2.data === data) - return; - dispatch_dev("SvelteDOMSetData", { node: text2, data }); - text2.data = /** @type {string} */ - data; -} -function ensure_array_like_dev(arg) { - if (typeof arg !== "string" && !(arg && typeof arg === "object" && "length" in arg) && !(typeof Symbol === "function" && arg && Symbol.iterator in arg)) { - throw new Error("{#each} only works with iterable values."); - } - return ensure_array_like(arg); -} -function validate_slots(name, slot, keys) { - for (const slot_key of Object.keys(slot)) { - if (!~keys.indexOf(slot_key)) { - console.warn(`<${name}> received an unexpected slot "${slot_key}".`); - } - } -} -var SvelteComponentDev = class extends SvelteComponent { - /** @param {import('./public.js').ComponentConstructorOptions} options */ - constructor(options) { - if (!options || !options.target && !options.$$inline) { - throw new Error("'target' is a required option"); - } - super(); - /** - * For type checking capabilities only. - * Does not exist at runtime. - * ### DO NOT USE! - * - * @type {Props} - */ - __publicField(this, "$$prop_def"); - /** - * For type checking capabilities only. - * Does not exist at runtime. - * ### DO NOT USE! - * - * @type {Events} - */ - __publicField(this, "$$events_def"); - /** - * For type checking capabilities only. - * Does not exist at runtime. - * ### DO NOT USE! - * - * @type {Slots} - */ - __publicField(this, "$$slot_def"); - } - /** @returns {void} */ - $destroy() { - super.$destroy(); - this.$destroy = () => { - console.warn("Component was already destroyed"); - }; - } - /** @returns {void} */ - $capture_state() { - } - /** @returns {void} */ - $inject_state() { - } -}; - -// node_modules/svelte/src/runtime/internal/disclose-version/index.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/disclose-version/index.js init_polyfill_buffer(); if (typeof window !== "undefined") (window.__svelte || (window.__svelte = { v: /* @__PURE__ */ new Set() })).v.add(PUBLIC_VERSION); -// node_modules/tslib/tslib.es6.mjs +// node_modules/.pnpm/tslib@2.6.2/node_modules/tslib/tslib.es6.mjs init_polyfill_buffer(); function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { @@ -37963,24 +37787,24 @@ function __awaiter(thisArg, _arguments, P, generator) { // src/ui/history/historyView.svelte var import_obsidian20 = require("obsidian"); -// node_modules/svelte/src/runtime/index.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/index.js init_polyfill_buffer(); // src/ui/history/components/logComponent.svelte init_polyfill_buffer(); var import_obsidian19 = require("obsidian"); -// node_modules/svelte/src/runtime/transition/index.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/transition/index.js init_polyfill_buffer(); -// node_modules/svelte/src/runtime/easing/index.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/easing/index.js init_polyfill_buffer(); function cubicOut(t) { const f = t - 1; return f * f * f + 1; } -// node_modules/svelte/src/runtime/transition/index.js +// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/transition/index.js function slide(node, { delay: delay2 = 0, duration = 400, easing = cubicOut, axis = "y" } = {}) { const style = getComputedStyle(node); const opacity = +style.opacity; @@ -38011,57 +37835,47 @@ function slide(node, { delay: delay2 = 0, duration = 400, easing = cubicOut, axi // src/ui/history/components/logFileComponent.svelte init_polyfill_buffer(); var import_obsidian18 = require("obsidian"); -var file = "src/ui/history/components/logFileComponent.svelte"; function add_css(target) { - append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nRmlsZUNvbXBvbmVudC5zdmVsdGUiLCJtYXBwaW5ncyI6IkFBNkVrQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJsb2dGaWxlQ29tcG9uZW50LnN2ZWx0ZSJdfQ== */"); + append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}"); } function create_if_block(ctx) { let div; let mounted; let dispose; - const block = { - c: function create() { + return { + c() { div = element("div"); - attr_dev(div, "data-icon", "go-to-file"); - attr_dev(div, "aria-label", "Open File"); - attr_dev(div, "class", "clickable-icon"); - add_location(div, file, 62, 20, 1843); + attr(div, "data-icon", "go-to-file"); + attr(div, "aria-label", "Open File"); + attr(div, "class", "clickable-icon"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); ctx[7](div); if (!mounted) { dispose = [ - listen_dev(div, "auxclick", stop_propagation( + listen(div, "auxclick", stop_propagation( /*open*/ ctx[4] - ), false, false, true, false), - listen_dev(div, "click", stop_propagation( + )), + listen(div, "click", stop_propagation( /*open*/ ctx[4] - ), false, false, true, false) + )) ]; mounted = true; } }, p: noop, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } ctx[7](null); mounted = false; run_all(dispose); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block.name, - type: "if", - source: "(52:16) {#if view.app.vault.getAbstractFileByPath(diff.vault_path)}", - ctx - }); - return block; } function create_fragment(ctx) { let main; @@ -38095,8 +37909,8 @@ function create_fragment(ctx) { let mounted; let dispose; let if_block = show_if && create_if_block(ctx); - const block = { - c: function create() { + return { + c() { var _a2, _b; main = element("main"); div3 = element("div"); @@ -38110,26 +37924,22 @@ function create_fragment(ctx) { t2 = space(); span = element("span"); t3 = text(t3_value); - attr_dev(div0, "class", "tree-item-inner nav-file-title-content"); - add_location(div0, file, 56, 8, 1567); - attr_dev(div1, "class", "buttons"); - add_location(div1, file, 60, 12, 1725); - attr_dev(span, "class", "type"); - attr_dev(span, "data-type", span_data_type_value = /*diff*/ + attr(div0, "class", "tree-item-inner nav-file-title-content"); + attr(div1, "class", "buttons"); + attr(span, "class", "type"); + attr(span, "data-type", span_data_type_value = /*diff*/ ctx[0].status); - add_location(span, file, 72, 12, 2227); - attr_dev(div2, "class", "git-tools"); - add_location(div2, file, 59, 8, 1689); - attr_dev(div3, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp"); - attr_dev(div3, "data-path", div3_data_path_value = /*diff*/ + attr(div2, "class", "git-tools"); + attr(div3, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp"); + attr(div3, "data-path", div3_data_path_value = /*diff*/ ctx[0].vault_path); - attr_dev( + attr( div3, "data-tooltip-position", /*side*/ ctx[3] ); - attr_dev(div3, "aria-label", div3_aria_label_value = /*diff*/ + attr(div3, "aria-label", div3_aria_label_value = /*diff*/ ctx[0].vault_path); toggle_class( div3, @@ -38139,58 +37949,49 @@ function create_fragment(ctx) { ctx[0].vault_path && /*view*/ ((_b = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _b.hash) ); - add_location(div3, file, 48, 4, 1247); - attr_dev(main, "class", "tree-item nav-file svelte-1wbh8tp"); - add_location(main, file, 42, 0, 1108); + attr(main, "class", "tree-item nav-file svelte-1wbh8tp"); }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, main, anchor); - append_dev(main, div3); - append_dev(div3, div0); - append_dev(div0, t0); - append_dev(div3, t1); - append_dev(div3, div2); - append_dev(div2, div1); + m(target, anchor) { + insert(target, main, anchor); + append2(main, div3); + append2(div3, div0); + append2(div0, t0); + append2(div3, t1); + append2(div3, div2); + append2(div2, div1); if (if_block) if_block.m(div1, null); - append_dev(div2, t2); - append_dev(div2, span); - append_dev(span, t3); + append2(div2, t2); + append2(div2, span); + append2(span, t3); if (!mounted) { dispose = [ - listen_dev(main, "click", stop_propagation( + listen(main, "click", stop_propagation( /*showDiff*/ ctx[5] - ), false, false, true, false), - listen_dev(main, "auxclick", stop_propagation( + )), + listen(main, "auxclick", stop_propagation( /*showDiff*/ ctx[5] - ), false, false, true, false), - listen_dev( + )), + listen( main, "focus", /*focus_handler*/ - ctx[6], - false, - false, - false, - false + ctx[6] ) ]; mounted = true; } }, - p: function update2(ctx2, [dirty]) { + p(ctx2, [dirty]) { var _a2, _b; if (dirty & /*diff*/ 1 && t0_value !== (t0_value = getDisplayPath( /*diff*/ ctx2[0].vault_path ) + "")) - set_data_dev(t0, t0_value); + set_data(t0, t0_value); if (dirty & /*view, diff*/ 3) show_if = /*view*/ @@ -38213,20 +38014,20 @@ function create_fragment(ctx) { if (dirty & /*diff*/ 1 && t3_value !== (t3_value = /*diff*/ ctx2[0].status + "")) - set_data_dev(t3, t3_value); + set_data(t3, t3_value); if (dirty & /*diff*/ 1 && span_data_type_value !== (span_data_type_value = /*diff*/ ctx2[0].status)) { - attr_dev(span, "data-type", span_data_type_value); + attr(span, "data-type", span_data_type_value); } if (dirty & /*diff*/ 1 && div3_data_path_value !== (div3_data_path_value = /*diff*/ ctx2[0].vault_path)) { - attr_dev(div3, "data-path", div3_data_path_value); + attr(div3, "data-path", div3_data_path_value); } if (dirty & /*side*/ 8) { - attr_dev( + attr( div3, "data-tooltip-position", /*side*/ @@ -38236,7 +38037,7 @@ function create_fragment(ctx) { if (dirty & /*diff*/ 1 && div3_aria_label_value !== (div3_aria_label_value = /*diff*/ ctx2[0].vault_path)) { - attr_dev(div3, "aria-label", div3_aria_label_value); + attr(div3, "aria-label", div3_aria_label_value); } if (dirty & /*view, diff*/ 3) { @@ -38252,9 +38053,9 @@ function create_fragment(ctx) { }, i: noop, o: noop, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(main); + detach(main); } if (if_block) if_block.d(); @@ -38262,28 +38063,18 @@ function create_fragment(ctx) { run_all(dispose); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment.name, - type: "component", - source: "", - ctx - }); - return block; } function instance($$self, $$props, $$invalidate) { let side; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("LogFileComponent", slots, []); let { diff: diff3 } = $$props; let { view } = $$props; let buttons = []; window.setTimeout(() => buttons.forEach((b) => (0, import_obsidian18.setIcon)(b, b.getAttr("data-icon"))), 0); function open(event) { var _a2; - const file9 = view.app.vault.getAbstractFileByPath(diff3.vault_path); - if (file9 instanceof import_obsidian18.TFile) { - (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file9); + const file = view.app.vault.getAbstractFileByPath(diff3.vault_path); + if (file instanceof import_obsidian18.TFile) { + (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file); } } function showDiff(event) { @@ -38298,19 +38089,6 @@ function instance($$self, $$props, $$invalidate) { } }); } - $$self.$$.on_mount.push(function() { - if (diff3 === void 0 && !("diff" in $$props || $$self.$$.bound[$$self.$$.props["diff"]])) { - console.warn(" was created without expected prop 'diff'"); - } - if (view === void 0 && !("view" in $$props || $$self.$$.bound[$$self.$$.props["view"]])) { - console.warn(" was created without expected prop 'view'"); - } - }); - const writable_props = ["diff", "view"]; - Object.keys($$props).forEach((key2) => { - if (!~writable_props.indexOf(key2) && key2.slice(0, 2) !== "$$" && key2 !== "slot") - console.warn(` was created with unknown prop '${key2}'`); - }); function focus_handler(event) { bubble.call(this, $$self, event); } @@ -38326,32 +38104,6 @@ function instance($$self, $$props, $$invalidate) { if ("view" in $$props2) $$invalidate(1, view = $$props2.view); }; - $$self.$capture_state = () => ({ - setIcon: import_obsidian18.setIcon, - TFile: import_obsidian18.TFile, - DIFF_VIEW_CONFIG, - getDisplayPath, - getNewLeaf, - diff: diff3, - view, - buttons, - open, - showDiff, - side - }); - $$self.$inject_state = ($$props2) => { - if ("diff" in $$props2) - $$invalidate(0, diff3 = $$props2.diff); - if ("view" in $$props2) - $$invalidate(1, view = $$props2.view); - if ("buttons" in $$props2) - $$invalidate(2, buttons = $$props2.buttons); - if ("side" in $$props2) - $$invalidate(3, side = $$props2.side); - }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } $$self.$$.update = () => { if ($$self.$$.dirty & /*view*/ 2) { @@ -38361,37 +38113,18 @@ function instance($$self, $$props, $$invalidate) { }; return [diff3, view, buttons, side, open, showDiff, focus_handler, div_binding]; } -var LogFileComponent = class extends SvelteComponentDev { +var LogFileComponent = class extends SvelteComponent { constructor(options) { - super(options); + super(); init2(this, options, instance, create_fragment, safe_not_equal, { diff: 0, view: 1 }, add_css); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "LogFileComponent", - options, - id: create_fragment.name - }); - } - get diff() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set diff(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get view() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set view(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } }; var logFileComponent_default = LogFileComponent; // src/ui/history/components/logTreeComponent.svelte init_polyfill_buffer(); -var file2 = "src/ui/history/components/logTreeComponent.svelte"; function add_css2(target) { - append_styles(target, "svelte-1lnl15d", "main.svelte-1lnl15d .nav-folder-title-content.svelte-1lnl15d{display:flex;align-items:center}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nVHJlZUNvbXBvbmVudC5zdmVsdGUiLCJtYXBwaW5ncyI6IkFBOEVrQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJsb2dUcmVlQ29tcG9uZW50LnN2ZWx0ZSJdfQ== */"); + append_styles(target, "svelte-1lnl15d", "main.svelte-1lnl15d .nav-folder-title-content.svelte-1lnl15d{display:flex;align-items:center}"); } function get_each_context(ctx, list, i) { const child_ctx = ctx.slice(); @@ -38404,8 +38137,6 @@ function create_else_block(ctx) { let div0; let t0; let div1; - let svg; - let path2; let t1; let div2; let t2_value = ( @@ -38433,15 +38164,14 @@ function create_else_block(ctx) { /*entity*/ ctx[8].title ] && create_if_block_1(ctx); - const block = { - c: function create() { + return { + c() { div4 = element("div"); div3 = element("div"); div0 = element("div"); t0 = space(); div1 = element("div"); - svg = svg_element("svg"); - path2 = svg_element("path"); + div1.innerHTML = ``; t1 = space(); div2 = element("div"); t2 = text(t2_value); @@ -38449,24 +38179,10 @@ function create_else_block(ctx) { if (if_block) if_block.c(); t4 = space(); - attr_dev(div0, "data-icon", "folder"); + attr(div0, "data-icon", "folder"); set_style(div0, "padding-right", "5px"); set_style(div0, "display", "flex"); - add_location(div0, file2, 38, 20, 1141); - attr_dev(path2, "d", "M3 8L12 17L21 8"); - add_location(path2, file2, 57, 29, 2030); - attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg, "width", "24"); - attr_dev(svg, "height", "24"); - attr_dev(svg, "viewBox", "0 0 24 24"); - attr_dev(svg, "fill", "none"); - attr_dev(svg, "stroke", "currentColor"); - attr_dev(svg, "stroke-width", "2"); - attr_dev(svg, "stroke-linecap", "round"); - attr_dev(svg, "stroke-linejoin", "round"); - attr_dev(svg, "class", "svg-icon right-triangle"); - add_location(svg, file2, 46, 24, 1508); - attr_dev(div1, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); + attr(div1, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); toggle_class( div1, "is-collapsed", @@ -38476,20 +38192,17 @@ function create_else_block(ctx) { ctx[8].title ] ); - add_location(div1, file2, 42, 20, 1300); - attr_dev(div2, "class", "tree-item-inner nav-folder-title-content svelte-1lnl15d"); - add_location(div2, file2, 60, 20, 2137); - attr_dev(div3, "class", "tree-item-self is-clickable nav-folder-title"); - attr_dev( + attr(div2, "class", "tree-item-inner nav-folder-title-content svelte-1lnl15d"); + attr(div3, "class", "tree-item-self is-clickable nav-folder-title"); + attr( div3, "data-tooltip-position", /*side*/ ctx[5] ); - attr_dev(div3, "aria-label", div3_aria_label_value = /*entity*/ + attr(div3, "aria-label", div3_aria_label_value = /*entity*/ ctx[8].vaultPath); - add_location(div3, file2, 32, 16, 876); - attr_dev(div4, "class", "tree-item nav-folder"); + attr(div4, "class", "tree-item nav-folder"); toggle_class( div4, "is-collapsed", @@ -38499,30 +38212,27 @@ function create_else_block(ctx) { ctx[8].title ] ); - add_location(div4, file2, 28, 12, 738); }, - m: function mount(target, anchor) { - insert_dev(target, div4, anchor); - append_dev(div4, div3); - append_dev(div3, div0); - append_dev(div3, t0); - append_dev(div3, div1); - append_dev(div1, svg); - append_dev(svg, path2); - append_dev(div3, t1); - append_dev(div3, div2); - append_dev(div2, t2); - append_dev(div4, t3); + m(target, anchor) { + insert(target, div4, anchor); + append2(div4, div3); + append2(div3, div0); + append2(div3, t0); + append2(div3, div1); + append2(div3, t1); + append2(div3, div2); + append2(div2, t2); + append2(div4, t3); if (if_block) if_block.m(div4, null); - append_dev(div4, t4); + append2(div4, t4); current = true; if (!mounted) { - dispose = listen_dev(div3, "click", click_handler, false, false, false, false); + dispose = listen(div3, "click", click_handler); mounted = true; } }, - p: function update2(new_ctx, dirty) { + p(new_ctx, dirty) { ctx = new_ctx; if (!current || dirty & /*closed, hierarchy*/ 17) { @@ -38539,10 +38249,10 @@ function create_else_block(ctx) { if ((!current || dirty & /*hierarchy*/ 1) && t2_value !== (t2_value = /*entity*/ ctx[8].title + "")) - set_data_dev(t2, t2_value); + set_data(t2, t2_value); if (!current || dirty & /*side*/ 32) { - attr_dev( + attr( div3, "data-tooltip-position", /*side*/ @@ -38552,7 +38262,7 @@ function create_else_block(ctx) { if (!current || dirty & /*hierarchy*/ 1 && div3_aria_label_value !== (div3_aria_label_value = /*entity*/ ctx[8].vaultPath)) { - attr_dev(div3, "aria-label", div3_aria_label_value); + attr(div3, "aria-label", div3_aria_label_value); } if (!/*closed*/ ctx[4][ @@ -38591,19 +38301,19 @@ function create_else_block(ctx) { ); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block); current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div4); + detach(div4); } if (if_block) if_block.d(); @@ -38611,14 +38321,6 @@ function create_else_block(ctx) { dispose(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block.name, - type: "else", - source: "(23:8) {:else}", - ctx - }); - return block; } function create_if_block2(ctx) { let div; @@ -38635,23 +38337,21 @@ function create_if_block2(ctx) { /*view*/ ctx[2] ) - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { div = element("div"); create_component(logfilecomponent.$$.fragment); t = space(); - add_location(div, file2, 24, 12, 622); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); mount_component(logfilecomponent, div, null); - append_dev(div, t); + append2(div, t); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const logfilecomponent_changes = {}; if (dirty & /*hierarchy*/ 1) @@ -38663,31 +38363,23 @@ function create_if_block2(ctx) { ctx2[2]; logfilecomponent.$set(logfilecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(logfilecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(logfilecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } destroy_component(logfilecomponent); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block2.name, - type: "if", - source: "(19:8) {#if entity.data}", - ctx - }); - return block; } function create_if_block_1(ctx) { let div; @@ -38708,22 +38400,20 @@ function create_if_block_1(ctx) { /*view*/ ctx[2] ) - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { div = element("div"); create_component(logtreecomponent.$$.fragment); - attr_dev(div, "class", "tree-item-children nav-folder-children"); - add_location(div, file2, 66, 20, 2346); + attr(div, "class", "tree-item-children nav-folder-children"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); mount_component(logtreecomponent, div, null); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const logtreecomponent_changes = {}; if (dirty & /*hierarchy*/ 1) @@ -38739,7 +38429,7 @@ function create_if_block_1(ctx) { ctx2[2]; logtreecomponent.$set(logtreecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(logtreecomponent.$$.fragment, local); @@ -38754,7 +38444,7 @@ function create_if_block_1(ctx) { } current = true; }, - o: function outro(local) { + o(local) { transition_out(logtreecomponent.$$.fragment, local); if (local) { if (!div_transition) @@ -38763,23 +38453,15 @@ function create_if_block_1(ctx) { } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } destroy_component(logtreecomponent); if (detaching && div_transition) div_transition.end(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_1.name, - type: "if", - source: "(61:16) {#if !closed[entity.title]}", - ctx - }); - return block; } function create_each_block(ctx) { let current_block_type_index; @@ -38798,17 +38480,17 @@ function create_each_block(ctx) { } current_block_type_index = select_block_type(ctx, -1); if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - const block = { - c: function create() { + return { + c() { if_block.c(); if_block_anchor = empty(); }, - m: function mount(target, anchor) { + m(target, anchor) { if_blocks[current_block_type_index].m(target, anchor); - insert_dev(target, if_block_anchor, anchor); + insert(target, if_block_anchor, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { let previous_block_index = current_block_type_index; current_block_type_index = select_block_type(ctx2, dirty); if (current_block_type_index === previous_block_index) { @@ -38830,36 +38512,28 @@ function create_each_block(ctx) { if_block.m(if_block_anchor.parentNode, if_block_anchor); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block); current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(if_block_anchor); + detach(if_block_anchor); } if_blocks[current_block_type_index].d(detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block.name, - type: "each", - source: "(18:4) {#each hierarchy.children as entity}", - ctx - }); - return block; } function create_fragment2(ctx) { let main; let current; - let each_value = ensure_array_like_dev( + let each_value = ensure_array_like( /*hierarchy*/ ctx[0].children ); @@ -38870,26 +38544,22 @@ function create_fragment2(ctx) { const out = (i) => transition_out(each_blocks[i], 1, 1, () => { each_blocks[i] = null; }); - const block = { - c: function create() { + return { + c() { main = element("main"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr_dev(main, "class", "svelte-1lnl15d"); + attr(main, "class", "svelte-1lnl15d"); toggle_class( main, "topLevel", /*topLevel*/ ctx[3] ); - add_location(main, file2, 21, 0, 521); }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, main, anchor); + m(target, anchor) { + insert(target, main, anchor); for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(main, null); @@ -38897,10 +38567,10 @@ function create_fragment2(ctx) { } current = true; }, - p: function update2(ctx2, [dirty]) { + p(ctx2, [dirty]) { if (dirty & /*hierarchy, view, closed, plugin, side, fold*/ 119) { - each_value = ensure_array_like_dev( + each_value = ensure_array_like( /*hierarchy*/ ctx2[0].children ); @@ -38933,7 +38603,7 @@ function create_fragment2(ctx) { ); } }, - i: function intro(local) { + i(local) { if (current) return; for (let i = 0; i < each_value.length; i += 1) { @@ -38941,33 +38611,23 @@ function create_fragment2(ctx) { } current = true; }, - o: function outro(local) { + o(local) { each_blocks = each_blocks.filter(Boolean); for (let i = 0; i < each_blocks.length; i += 1) { transition_out(each_blocks[i]); } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(main); + detach(main); } destroy_each(each_blocks, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment2.name, - type: "component", - source: "", - ctx - }); - return block; } function instance2($$self, $$props, $$invalidate) { let side; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("LogTreeComponent", slots, []); let { hierarchy } = $$props; let { plugin } = $$props; let { view } = $$props; @@ -38976,22 +38636,6 @@ function instance2($$self, $$props, $$invalidate) { function fold(item) { $$invalidate(4, closed[item.title] = !closed[item.title], closed); } - $$self.$$.on_mount.push(function() { - if (hierarchy === void 0 && !("hierarchy" in $$props || $$self.$$.bound[$$self.$$.props["hierarchy"]])) { - console.warn(" was created without expected prop 'hierarchy'"); - } - if (plugin === void 0 && !("plugin" in $$props || $$self.$$.bound[$$self.$$.props["plugin"]])) { - console.warn(" was created without expected prop 'plugin'"); - } - if (view === void 0 && !("view" in $$props || $$self.$$.bound[$$self.$$.props["view"]])) { - console.warn(" was created without expected prop 'view'"); - } - }); - const writable_props = ["hierarchy", "plugin", "view", "topLevel"]; - Object.keys($$props).forEach((key2) => { - if (!~writable_props.indexOf(key2) && key2.slice(0, 2) !== "$$" && key2 !== "slot") - console.warn(` was created with unknown prop '${key2}'`); - }); const click_handler = (entity) => fold(entity); $$self.$$set = ($$props2) => { if ("hierarchy" in $$props2) @@ -39003,32 +38647,6 @@ function instance2($$self, $$props, $$invalidate) { if ("topLevel" in $$props2) $$invalidate(3, topLevel = $$props2.topLevel); }; - $$self.$capture_state = () => ({ - slide, - LogFileComponent: logFileComponent_default, - hierarchy, - plugin, - view, - topLevel, - closed, - fold, - side - }); - $$self.$inject_state = ($$props2) => { - if ("hierarchy" in $$props2) - $$invalidate(0, hierarchy = $$props2.hierarchy); - if ("plugin" in $$props2) - $$invalidate(1, plugin = $$props2.plugin); - if ("view" in $$props2) - $$invalidate(2, view = $$props2.view); - if ("topLevel" in $$props2) - $$invalidate(3, topLevel = $$props2.topLevel); - if ("side" in $$props2) - $$invalidate(5, side = $$props2.side); - }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } $$self.$$.update = () => { if ($$self.$$.dirty & /*view*/ 4) { @@ -39038,9 +38656,9 @@ function instance2($$self, $$props, $$invalidate) { }; return [hierarchy, plugin, view, topLevel, closed, side, fold, click_handler]; } -var LogTreeComponent = class extends SvelteComponentDev { +var LogTreeComponent = class extends SvelteComponent { constructor(options) { - super(options); + super(); init2( this, options, @@ -39055,42 +38673,11 @@ var LogTreeComponent = class extends SvelteComponentDev { }, add_css2 ); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "LogTreeComponent", - options, - id: create_fragment2.name - }); - } - get hierarchy() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set hierarchy(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get plugin() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set plugin(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get view() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set view(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get topLevel() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set topLevel(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } }; var logTreeComponent_default = LogTreeComponent; // src/ui/history/components/logComponent.svelte -var file_1 = "src/ui/history/components/logComponent.svelte"; function get_each_context2(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[9] = list[i]; @@ -39103,37 +38690,28 @@ function create_if_block_4(ctx) { ctx[0].refs.join(", ") + "" ); let t; - const block = { - c: function create() { + return { + c() { div = element("div"); t = text(t_value); - attr_dev(div, "class", "git-ref"); - add_location(div, file_1, 67, 20, 2212); + attr(div, "class", "git-ref"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, t); + m(target, anchor) { + insert(target, div, anchor); + append2(div, t); }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if (dirty & /*log*/ 1 && t_value !== (t_value = /*log*/ ctx2[0].refs.join(", ") + "")) - set_data_dev(t, t_value); + set_data(t, t_value); }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_4.name, - type: "if", - source: "(60:16) {#if log.refs.length > 0}", - ctx - }); - return block; } function create_if_block_3(ctx) { let div; @@ -39145,40 +38723,31 @@ function create_if_block_3(ctx) { ) + "" ); let t; - const block = { - c: function create() { + return { + c() { div = element("div"); t = text(t_value); - attr_dev(div, "class", "git-author"); - add_location(div, file_1, 72, 20, 2437); + attr(div, "class", "git-author"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, t); + m(target, anchor) { + insert(target, div, anchor); + append2(div, t); }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if (dirty & /*log*/ 1 && t_value !== (t_value = /*authorToString*/ ctx2[7]( /*log*/ ctx2[0] ) + "")) - set_data_dev(t, t_value); + set_data(t, t_value); }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_3.name, - type: "if", - source: '(65:16) {#if plugin.settings.authorInHistoryView != \\"hide\\" && log.author?.name}', - ctx - }); - return block; } function create_if_block_2(ctx) { let div; @@ -39190,18 +38759,17 @@ function create_if_block_2(ctx) { ctx[3].settings.commitDateFormat ) + ""; let t; - const block = { - c: function create() { + return { + c() { div = element("div"); t = text(t_value); - attr_dev(div, "class", "git-date"); - add_location(div, file_1, 77, 20, 2633); + attr(div, "class", "git-date"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, t); + m(target, anchor) { + insert(target, div, anchor); + append2(div, t); }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if (dirty & /*log, plugin*/ 9 && t_value !== (t_value = (0, import_obsidian19.moment)( /*log*/ @@ -39210,22 +38778,14 @@ function create_if_block_2(ctx) { /*plugin*/ ctx2[3].settings.commitDateFormat ) + "")) - set_data_dev(t, t_value); + set_data(t, t_value); }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_2.name, - type: "if", - source: "(70:16) {#if plugin.settings.dateInHistoryView}", - ctx - }); - return block; } function create_if_block3(ctx) { let div; @@ -39245,19 +38805,18 @@ function create_if_block3(ctx) { } current_block_type_index = select_block_type(ctx, -1); if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - const block = { - c: function create() { + return { + c() { div = element("div"); if_block.c(); - attr_dev(div, "class", "tree-item-children nav-folder-children"); - add_location(div, file_1, 90, 12, 3045); + attr(div, "class", "tree-item-children nav-folder-children"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); if_blocks[current_block_type_index].m(div, null); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { let previous_block_index = current_block_type_index; current_block_type_index = select_block_type(ctx2, dirty); if (current_block_type_index === previous_block_index) { @@ -39279,7 +38838,7 @@ function create_if_block3(ctx) { if_block.m(div, null); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block); @@ -39294,7 +38853,7 @@ function create_if_block3(ctx) { } current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block); if (local) { if (!div_transition) @@ -39303,28 +38862,20 @@ function create_if_block3(ctx) { } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } if_blocks[current_block_type_index].d(); if (detaching && div_transition) div_transition.end(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block3.name, - type: "if", - source: "(83:8) {#if !isCollapsed}", - ctx - }); - return block; } function create_else_block2(ctx) { let each_1_anchor; let current; - let each_value = ensure_array_like_dev( + let each_value = ensure_array_like( /*log*/ ctx[0].diff.files ); @@ -39335,26 +38886,26 @@ function create_else_block2(ctx) { const out = (i) => transition_out(each_blocks[i], 1, 1, () => { each_blocks[i] = null; }); - const block = { - c: function create() { + return { + c() { for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } each_1_anchor = empty(); }, - m: function mount(target, anchor) { + m(target, anchor) { for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(target, anchor); } } - insert_dev(target, each_1_anchor, anchor); + insert(target, each_1_anchor, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if (dirty & /*view, log*/ 3) { - each_value = ensure_array_like_dev( + each_value = ensure_array_like( /*log*/ ctx2[0].diff.files ); @@ -39378,7 +38929,7 @@ function create_else_block2(ctx) { check_outros(); } }, - i: function intro(local) { + i(local) { if (current) return; for (let i = 0; i < each_value.length; i += 1) { @@ -39386,28 +38937,20 @@ function create_else_block2(ctx) { } current = true; }, - o: function outro(local) { + o(local) { each_blocks = each_blocks.filter(Boolean); for (let i = 0; i < each_blocks.length; i += 1) { transition_out(each_blocks[i]); } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(each_1_anchor); + detach(each_1_anchor); } destroy_each(each_blocks, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block2.name, - type: "else", - source: "(95:16) {:else}", - ctx - }); - return block; } function create_if_block_12(ctx) { let logtreecomponent; @@ -39427,18 +38970,17 @@ function create_if_block_12(ctx) { ctx[1] ), topLevel: true - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { create_component(logtreecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(logtreecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const logtreecomponent_changes = {}; if (dirty & /*logsHierarchy*/ 64) @@ -39454,28 +38996,20 @@ function create_if_block_12(ctx) { ctx2[1]; logtreecomponent.$set(logtreecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(logtreecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(logtreecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(logtreecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_12.name, - type: "if", - source: "(88:16) {#if showTree}", - ctx - }); - return block; } function create_each_block2(ctx) { let logfilecomponent; @@ -39490,18 +39024,17 @@ function create_each_block2(ctx) { /*file*/ ctx[9] ) - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { create_component(logfilecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(logfilecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const logfilecomponent_changes = {}; if (dirty & /*view*/ 2) @@ -39513,28 +39046,20 @@ function create_each_block2(ctx) { ctx2[9]; logfilecomponent.$set(logfilecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(logfilecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(logfilecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(logfilecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block2.name, - type: "each", - source: "(96:20) {#each log.diff.files as file}", - ctx - }); - return block; } function create_fragment3(ctx) { var _a2; @@ -39542,8 +39067,6 @@ function create_fragment3(ctx) { let div4; let div3; let div0; - let svg; - let path2; let t0; let div2; let t1; @@ -39575,15 +39098,14 @@ function create_fragment3(ctx) { ); let if_block3 = !/*isCollapsed*/ ctx[4] && create_if_block3(ctx); - const block = { - c: function create() { + return { + c() { var _a3; main = element("main"); div4 = element("div"); div3 = element("div"); div0 = element("div"); - svg = svg_element("svg"); - path2 = svg_element("path"); + div0.innerHTML = ``; t0 = space(); div2 = element("div"); if (if_block0) @@ -39600,32 +39122,16 @@ function create_fragment3(ctx) { t5 = space(); if (if_block3) if_block3.c(); - attr_dev(path2, "d", "M3 8L12 17L21 8"); - add_location(path2, file_1, 62, 21, 2061); - attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg, "width", "24"); - attr_dev(svg, "height", "24"); - attr_dev(svg, "viewBox", "0 0 24 24"); - attr_dev(svg, "fill", "none"); - attr_dev(svg, "stroke", "currentColor"); - attr_dev(svg, "stroke-width", "2"); - attr_dev(svg, "stroke-linecap", "round"); - attr_dev(svg, "stroke-linejoin", "round"); - attr_dev(svg, "class", "svg-icon right-triangle"); - add_location(svg, file_1, 51, 16, 1627); - attr_dev(div0, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); + attr(div0, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); toggle_class( div0, "is-collapsed", /*isCollapsed*/ ctx[4] ); - add_location(div0, file_1, 47, 12, 1460); - attr_dev(div1, "class", "tree-item-inner nav-folder-title-content"); - add_location(div1, file_1, 84, 16, 2860); - add_location(div2, file_1, 65, 12, 2144); - attr_dev(div3, "class", "tree-item-self is-clickable nav-folder-title"); - attr_dev(div3, "aria-label", div3_aria_label_value = `${/*log*/ + attr(div1, "class", "tree-item-inner nav-folder-title-content"); + attr(div3, "class", "tree-item-self is-clickable nav-folder-title"); + attr(div3, "aria-label", div3_aria_label_value = `${/*log*/ ctx[0].refs.length > 0 ? ( /*log*/ ctx[0].refs.join(", ") + "\n" @@ -39640,65 +39146,53 @@ ${(0, import_obsidian19.moment)( )} ${/*log*/ ctx[0].message}`); - attr_dev( + attr( div3, "data-tooltip-position", /*side*/ ctx[5] ); - add_location(div3, file_1, 39, 8, 1090); - attr_dev(div4, "class", "tree-item nav-folder"); + attr(div4, "class", "tree-item nav-folder"); toggle_class( div4, "is-collapsed", /*isCollapsed*/ ctx[4] ); - add_location(div4, file_1, 38, 4, 1014); - add_location(main, file_1, 37, 0, 1003); }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, main, anchor); - append_dev(main, div4); - append_dev(div4, div3); - append_dev(div3, div0); - append_dev(div0, svg); - append_dev(svg, path2); - append_dev(div3, t0); - append_dev(div3, div2); + m(target, anchor) { + insert(target, main, anchor); + append2(main, div4); + append2(div4, div3); + append2(div3, div0); + append2(div3, t0); + append2(div3, div2); if (if_block0) if_block0.m(div2, null); - append_dev(div2, t1); + append2(div2, t1); if (if_block1) if_block1.m(div2, null); - append_dev(div2, t2); + append2(div2, t2); if (if_block2) if_block2.m(div2, null); - append_dev(div2, t3); - append_dev(div2, div1); - append_dev(div1, t4); - append_dev(div4, t5); + append2(div2, t3); + append2(div2, div1); + append2(div1, t4); + append2(div4, t5); if (if_block3) if_block3.m(div4, null); current = true; if (!mounted) { - dispose = listen_dev( + dispose = listen( div3, "click", /*click_handler*/ - ctx[8], - false, - false, - false, - false + ctx[8] ); mounted = true; } }, - p: function update2(ctx2, [dirty]) { + p(ctx2, [dirty]) { var _a3, _b; if (!current || dirty & /*isCollapsed*/ 16) { @@ -39758,7 +39252,7 @@ ${/*log*/ if ((!current || dirty & /*log*/ 1) && t4_value !== (t4_value = /*log*/ ctx2[0].message + "")) - set_data_dev(t4, t4_value); + set_data(t4, t4_value); if (!current || dirty & /*log, plugin*/ 9 && div3_aria_label_value !== (div3_aria_label_value = `${/*log*/ ctx2[0].refs.length > 0 ? ( @@ -39775,11 +39269,11 @@ ${(0, import_obsidian19.moment)( )} ${/*log*/ ctx2[0].message}`)) { - attr_dev(div3, "aria-label", div3_aria_label_value); + attr(div3, "aria-label", div3_aria_label_value); } if (!current || dirty & /*side*/ 32) { - attr_dev( + attr( div3, "data-tooltip-position", /*side*/ @@ -39817,19 +39311,19 @@ ${/*log*/ ); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block3); current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block3); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(main); + detach(main); } if (if_block0) if_block0.d(); @@ -39843,20 +39337,10 @@ ${/*log*/ dispose(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment3.name, - type: "component", - source: "", - ctx - }); - return block; } function instance3($$self, $$props, $$invalidate) { let logsHierarchy; let side; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("LogComponent", slots, []); let { log: log2 } = $$props; let { view } = $$props; let { showTree } = $$props; @@ -39871,25 +39355,6 @@ function instance3($$self, $$props, $$invalidate) { return words.map((word) => word[0].toUpperCase()).join(""); } } - $$self.$$.on_mount.push(function() { - if (log2 === void 0 && !("log" in $$props || $$self.$$.bound[$$self.$$.props["log"]])) { - console.warn(" was created without expected prop 'log'"); - } - if (view === void 0 && !("view" in $$props || $$self.$$.bound[$$self.$$.props["view"]])) { - console.warn(" was created without expected prop 'view'"); - } - if (showTree === void 0 && !("showTree" in $$props || $$self.$$.bound[$$self.$$.props["showTree"]])) { - console.warn(" was created without expected prop 'showTree'"); - } - if (plugin === void 0 && !("plugin" in $$props || $$self.$$.bound[$$self.$$.props["plugin"]])) { - console.warn(" was created without expected prop 'plugin'"); - } - }); - const writable_props = ["log", "view", "showTree", "plugin"]; - Object.keys($$props).forEach((key2) => { - if (!~writable_props.indexOf(key2) && key2.slice(0, 2) !== "$$" && key2 !== "slot") - console.warn(` was created with unknown prop '${key2}'`); - }); const click_handler = () => $$invalidate(4, isCollapsed = !isCollapsed); $$self.$$set = ($$props2) => { if ("log" in $$props2) @@ -39901,39 +39366,6 @@ function instance3($$self, $$props, $$invalidate) { if ("plugin" in $$props2) $$invalidate(3, plugin = $$props2.plugin); }; - $$self.$capture_state = () => ({ - moment: import_obsidian19.moment, - slide, - LogFileComponent: logFileComponent_default, - LogTreeComponent: logTreeComponent_default, - log: log2, - view, - showTree, - plugin, - isCollapsed, - authorToString, - side, - logsHierarchy - }); - $$self.$inject_state = ($$props2) => { - if ("log" in $$props2) - $$invalidate(0, log2 = $$props2.log); - if ("view" in $$props2) - $$invalidate(1, view = $$props2.view); - if ("showTree" in $$props2) - $$invalidate(2, showTree = $$props2.showTree); - if ("plugin" in $$props2) - $$invalidate(3, plugin = $$props2.plugin); - if ("isCollapsed" in $$props2) - $$invalidate(4, isCollapsed = $$props2.isCollapsed); - if ("side" in $$props2) - $$invalidate(5, side = $$props2.side); - if ("logsHierarchy" in $$props2) - $$invalidate(6, logsHierarchy = $$props2.logsHierarchy); - }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } $$self.$$.update = () => { if ($$self.$$.dirty & /*plugin, log*/ 9) { @@ -39963,46 +39395,15 @@ function instance3($$self, $$props, $$invalidate) { click_handler ]; } -var LogComponent = class extends SvelteComponentDev { +var LogComponent = class extends SvelteComponent { constructor(options) { - super(options); + super(); init2(this, options, instance3, create_fragment3, safe_not_equal, { log: 0, view: 1, showTree: 2, plugin: 3 }); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "LogComponent", - options, - id: create_fragment3.name - }); - } - get log() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set log(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get view() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set view(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get showTree() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set showTree(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get plugin() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set plugin(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } }; var logComponent_default = LogComponent; // src/ui/history/historyView.svelte -var file3 = "src/ui/history/historyView.svelte"; function get_each_context3(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[11] = list[i]; @@ -40012,7 +39413,7 @@ function create_if_block4(ctx) { let div1; let div0; let current; - let each_value = ensure_array_like_dev( + let each_value = ensure_array_like( /*logs*/ ctx[6] ); @@ -40023,21 +39424,19 @@ function create_if_block4(ctx) { const out = (i) => transition_out(each_blocks[i], 1, 1, () => { each_blocks[i] = null; }); - const block = { - c: function create() { + return { + c() { div1 = element("div"); div0 = element("div"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr_dev(div0, "class", "tree-item-children nav-folder-children"); - add_location(div0, file3, 84, 16, 2506); - attr_dev(div1, "class", "tree-item nav-folder mod-root"); - add_location(div1, file3, 83, 12, 2446); + attr(div0, "class", "tree-item-children nav-folder-children"); + attr(div1, "class", "tree-item nav-folder mod-root"); }, - m: function mount(target, anchor) { - insert_dev(target, div1, anchor); - append_dev(div1, div0); + m(target, anchor) { + insert(target, div1, anchor); + append2(div1, div0); for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(div0, null); @@ -40045,10 +39444,10 @@ function create_if_block4(ctx) { } current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if (dirty & /*view, showTree, logs, plugin*/ 71) { - each_value = ensure_array_like_dev( + each_value = ensure_array_like( /*logs*/ ctx2[6] ); @@ -40072,7 +39471,7 @@ function create_if_block4(ctx) { check_outros(); } }, - i: function intro(local) { + i(local) { if (current) return; for (let i = 0; i < each_value.length; i += 1) { @@ -40080,28 +39479,20 @@ function create_if_block4(ctx) { } current = true; }, - o: function outro(local) { + o(local) { each_blocks = each_blocks.filter(Boolean); for (let i = 0; i < each_blocks.length; i += 1) { transition_out(each_blocks[i]); } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div1); + detach(div1); } destroy_each(each_blocks, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block4.name, - type: "if", - source: "(74:8) {#if logs}", - ctx - }); - return block; } function create_each_block3(ctx) { let logcomponent; @@ -40124,18 +39515,17 @@ function create_each_block3(ctx) { /*plugin*/ ctx[0] ) - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { create_component(logcomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(logcomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const logcomponent_changes = {}; if (dirty & /*view*/ 2) @@ -40155,28 +39545,20 @@ function create_each_block3(ctx) { ctx2[0]; logcomponent.$set(logcomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(logcomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(logcomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(logcomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block3.name, - type: "each", - source: "(77:20) {#each logs as log}", - ctx - }); - return block; } function create_fragment4(ctx) { let main; @@ -40194,8 +39576,8 @@ function create_fragment4(ctx) { /*logs*/ ctx[6] && create_if_block4(ctx) ); - const block = { - c: function create() { + return { + c() { main = element("main"); div3 = element("div"); div2 = element("div"); @@ -40206,14 +39588,13 @@ function create_fragment4(ctx) { div4 = element("div"); if (if_block) if_block.c(); - attr_dev(div0, "id", "layoutChange"); - attr_dev(div0, "class", "clickable-icon nav-action-button"); - attr_dev(div0, "aria-label", "Change Layout"); - add_location(div0, file3, 57, 12, 1588); - attr_dev(div1, "id", "refresh"); - attr_dev(div1, "class", "clickable-icon nav-action-button"); - attr_dev(div1, "data-icon", "refresh-cw"); - attr_dev(div1, "aria-label", "Refresh"); + attr(div0, "id", "layoutChange"); + attr(div0, "class", "clickable-icon nav-action-button"); + attr(div0, "aria-label", "Change Layout"); + attr(div1, "id", "refresh"); + attr(div1, "class", "clickable-icon nav-action-button"); + attr(div1, "data-icon", "refresh-cw"); + attr(div1, "aria-label", "Refresh"); set_style(div1, "margin", "1px"); toggle_class( div1, @@ -40221,51 +39602,39 @@ function create_fragment4(ctx) { /*loading*/ ctx[4] ); - add_location(div1, file3, 68, 12, 1992); - attr_dev(div2, "class", "nav-buttons-container"); - add_location(div2, file3, 56, 8, 1540); - attr_dev(div3, "class", "nav-header"); - add_location(div3, file3, 55, 4, 1507); - attr_dev(div4, "class", "nav-files-container"); + attr(div2, "class", "nav-buttons-container"); + attr(div3, "class", "nav-header"); + attr(div4, "class", "nav-files-container"); set_style(div4, "position", "relative"); - add_location(div4, file3, 81, 4, 2353); - add_location(main, file3, 54, 0, 1496); }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, main, anchor); - append_dev(main, div3); - append_dev(div3, div2); - append_dev(div2, div0); + m(target, anchor) { + insert(target, main, anchor); + append2(main, div3); + append2(div3, div2); + append2(div2, div0); ctx[7](div0); - append_dev(div2, t0); - append_dev(div2, div1); + append2(div2, t0); + append2(div2, div1); ctx[9](div1); - append_dev(main, t1); - append_dev(main, div4); + append2(main, t1); + append2(main, div4); if (if_block) if_block.m(div4, null); current = true; if (!mounted) { dispose = [ - listen_dev( + listen( div0, "click", /*click_handler*/ - ctx[8], - false, - false, - false, - false + ctx[8] ), - listen_dev(div1, "click", triggerRefresh, false, false, false, false) + listen(div1, "click", triggerRefresh) ]; mounted = true; } }, - p: function update2(ctx2, [dirty]) { + p(ctx2, [dirty]) { if (!current || dirty & /*loading*/ 16) { toggle_class( @@ -40299,19 +39668,19 @@ function create_fragment4(ctx) { check_outros(); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block); current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(main); + detach(main); } ctx[7](null); ctx[9](null); @@ -40321,21 +39690,11 @@ function create_fragment4(ctx) { run_all(dispose); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment4.name, - type: "component", - source: "", - ctx - }); - return block; } function triggerRefresh() { dispatchEvent(new CustomEvent("git-refresh")); } function instance4($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("HistoryView", slots, []); let { plugin } = $$props; let { view } = $$props; let loading; @@ -40364,19 +39723,6 @@ function instance4($$self, $$props, $$invalidate) { $$invalidate(4, loading = false); }); } - $$self.$$.on_mount.push(function() { - if (plugin === void 0 && !("plugin" in $$props || $$self.$$.bound[$$self.$$.props["plugin"]])) { - console.warn(" was created without expected prop 'plugin'"); - } - if (view === void 0 && !("view" in $$props || $$self.$$.bound[$$self.$$.props["view"]])) { - console.warn(" was created without expected prop 'view'"); - } - }); - const writable_props = ["plugin", "view"]; - Object.keys($$props).forEach((key2) => { - if (!~writable_props.indexOf(key2) && key2.slice(0, 2) !== "$$" && key2 !== "slot") - console.warn(` was created with unknown prop '${key2}'`); - }); function div0_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { layoutBtn = $$value; @@ -40400,41 +39746,6 @@ function instance4($$self, $$props, $$invalidate) { if ("view" in $$props2) $$invalidate(1, view = $$props2.view); }; - $$self.$capture_state = () => ({ - __awaiter, - setIcon: import_obsidian20.setIcon, - SimpleGit, - onDestroy, - LogComponent: logComponent_default, - plugin, - view, - loading, - buttons, - logs, - showTree, - layoutBtn, - triggerRefresh, - refresh - }); - $$self.$inject_state = ($$props2) => { - if ("plugin" in $$props2) - $$invalidate(0, plugin = $$props2.plugin); - if ("view" in $$props2) - $$invalidate(1, view = $$props2.view); - if ("loading" in $$props2) - $$invalidate(4, loading = $$props2.loading); - if ("buttons" in $$props2) - $$invalidate(5, buttons = $$props2.buttons); - if ("logs" in $$props2) - $$invalidate(6, logs = $$props2.logs); - if ("showTree" in $$props2) - $$invalidate(2, showTree = $$props2.showTree); - if ("layoutBtn" in $$props2) - $$invalidate(3, layoutBtn = $$props2.layoutBtn); - }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } $$self.$$.update = () => { if ($$self.$$.dirty & /*layoutBtn, showTree*/ 12) { @@ -40459,28 +39770,10 @@ function instance4($$self, $$props, $$invalidate) { div1_binding ]; } -var HistoryView = class extends SvelteComponentDev { +var HistoryView = class extends SvelteComponent { constructor(options) { - super(options); + super(); init2(this, options, instance4, create_fragment4, safe_not_equal, { plugin: 0, view: 1 }); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "HistoryView", - options, - id: create_fragment4.name - }); - } - get plugin() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set plugin(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get view() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set view(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } }; var historyView_default = HistoryView; @@ -40655,10 +39948,10 @@ var DiscardModal = class extends import_obsidian24.Modal { init_polyfill_buffer(); var import_obsidian26 = require("obsidian"); -// node_modules/obsidian-community-lib/dist/index.js +// node_modules/.pnpm/obsidian-community-lib@https+++codeload.github.com+Vinzent03+obsidian-community-lib+tar.gz+e6_dmashd4lm54vdqd2gnfngnqe2m/node_modules/obsidian-community-lib/dist/index.js init_polyfill_buffer(); -// node_modules/obsidian-community-lib/dist/utils.js +// node_modules/.pnpm/obsidian-community-lib@https+++codeload.github.com+Vinzent03+obsidian-community-lib+tar.gz+e6_dmashd4lm54vdqd2gnfngnqe2m/node_modules/obsidian-community-lib/dist/utils.js init_polyfill_buffer(); var feather = __toESM(require_feather()); var import_obsidian25 = require("obsidian"); @@ -40674,58 +39967,47 @@ function hoverPreview(event, view, to) { } // src/ui/sourceControl/components/fileComponent.svelte -var { console: console_1 } = globals; -var file4 = "src/ui/sourceControl/components/fileComponent.svelte"; function add_css3(target) { - append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZUNvbXBvbmVudC5zdmVsdGUiLCJtYXBwaW5ncyI6IkFBNElrQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJmaWxlQ29tcG9uZW50LnN2ZWx0ZSJdfQ== */"); + append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}"); } function create_if_block5(ctx) { let div; let mounted; let dispose; - const block = { - c: function create() { + return { + c() { div = element("div"); - attr_dev(div, "data-icon", "go-to-file"); - attr_dev(div, "aria-label", "Open File"); - attr_dev(div, "class", "clickable-icon"); - add_location(div, file4, 109, 20, 3339); + attr(div, "data-icon", "go-to-file"); + attr(div, "aria-label", "Open File"); + attr(div, "class", "clickable-icon"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); ctx[11](div); if (!mounted) { dispose = [ - listen_dev(div, "auxclick", stop_propagation( + listen(div, "auxclick", stop_propagation( /*open*/ ctx[5] - ), false, false, true, false), - listen_dev(div, "click", stop_propagation( + )), + listen(div, "click", stop_propagation( /*open*/ ctx[5] - ), false, false, true, false) + )) ]; mounted = true; } }, p: noop, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } ctx[11](null); mounted = false; run_all(dispose); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block5.name, - type: "if", - source: "(97:16) {#if view.app.vault.getAbstractFileByPath(change.vault_path)}", - ctx - }); - return block; } function create_fragment5(ctx) { let main; @@ -40763,8 +40045,8 @@ function create_fragment5(ctx) { let mounted; let dispose; let if_block = show_if && create_if_block5(ctx); - const block = { - c: function create() { + return { + c() { var _a2, _b, _c; main = element("main"); div6 = element("div"); @@ -40782,34 +40064,28 @@ function create_fragment5(ctx) { t4 = space(); div4 = element("div"); t5 = text(t5_value); - attr_dev(div0, "class", "tree-item-inner nav-file-title-content"); - add_location(div0, file4, 103, 8, 3059); - attr_dev(div1, "data-icon", "undo"); - attr_dev(div1, "aria-label", "Discard"); - attr_dev(div1, "class", "clickable-icon"); - add_location(div1, file4, 118, 16, 3708); - attr_dev(div2, "data-icon", "plus"); - attr_dev(div2, "aria-label", "Stage"); - attr_dev(div2, "class", "clickable-icon"); - add_location(div2, file4, 125, 16, 3967); - attr_dev(div3, "class", "buttons"); - add_location(div3, file4, 107, 12, 3219); - attr_dev(div4, "class", "type"); - attr_dev(div4, "data-type", div4_data_type_value = /*change*/ + attr(div0, "class", "tree-item-inner nav-file-title-content"); + attr(div1, "data-icon", "undo"); + attr(div1, "aria-label", "Discard"); + attr(div1, "class", "clickable-icon"); + attr(div2, "data-icon", "plus"); + attr(div2, "aria-label", "Stage"); + attr(div2, "class", "clickable-icon"); + attr(div3, "class", "buttons"); + attr(div4, "class", "type"); + attr(div4, "data-type", div4_data_type_value = /*change*/ ctx[0].working_dir); - add_location(div4, file4, 133, 12, 4237); - attr_dev(div5, "class", "git-tools"); - add_location(div5, file4, 106, 8, 3183); - attr_dev(div6, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp"); - attr_dev(div6, "data-path", div6_data_path_value = /*change*/ + attr(div5, "class", "git-tools"); + attr(div6, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp"); + attr(div6, "data-path", div6_data_path_value = /*change*/ ctx[0].vault_path); - attr_dev( + attr( div6, "data-tooltip-position", /*side*/ ctx[3] ); - attr_dev(div6, "aria-label", div6_aria_label_value = /*change*/ + attr(div6, "aria-label", div6_aria_label_value = /*change*/ ctx[0].vault_path); toggle_class( div6, @@ -40820,82 +40096,69 @@ function create_fragment5(ctx) { ((_b = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _b.hash) && !/*view*/ ((_c = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _c.staged) ); - add_location(div6, file4, 88, 4, 2545); - attr_dev(main, "class", "tree-item nav-file svelte-1wbh8tp"); - add_location(main, file4, 81, 0, 2381); + attr(main, "class", "tree-item nav-file svelte-1wbh8tp"); }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, main, anchor); - append_dev(main, div6); - append_dev(div6, div0); - append_dev(div0, t0); - append_dev(div6, t1); - append_dev(div6, div5); - append_dev(div5, div3); + m(target, anchor) { + insert(target, main, anchor); + append2(main, div6); + append2(div6, div0); + append2(div0, t0); + append2(div6, t1); + append2(div6, div5); + append2(div5, div3); if (if_block) if_block.m(div3, null); - append_dev(div3, t2); - append_dev(div3, div1); + append2(div3, t2); + append2(div3, div1); ctx[12](div1); - append_dev(div3, t3); - append_dev(div3, div2); + append2(div3, t3); + append2(div3, div2); ctx[13](div2); - append_dev(div5, t4); - append_dev(div5, div4); - append_dev(div4, t5); + append2(div5, t4); + append2(div5, div4); + append2(div4, t5); if (!mounted) { dispose = [ - listen_dev(div1, "click", stop_propagation( + listen(div1, "click", stop_propagation( /*discard*/ ctx[8] - ), false, false, true, false), - listen_dev(div2, "click", stop_propagation( + )), + listen(div2, "click", stop_propagation( /*stage*/ ctx[6] - ), false, false, true, false), - listen_dev( + )), + listen( main, "mouseover", /*hover*/ - ctx[4], - false, - false, - false, - false + ctx[4] ), - listen_dev(main, "click", stop_propagation( + listen(main, "click", stop_propagation( /*showDiff*/ ctx[7] - ), false, false, true, false), - listen_dev(main, "auxclick", stop_propagation( + )), + listen(main, "auxclick", stop_propagation( /*showDiff*/ ctx[7] - ), false, false, true, false), - listen_dev( + )), + listen( main, "focus", /*focus_handler*/ - ctx[10], - false, - false, - false, - false + ctx[10] ) ]; mounted = true; } }, - p: function update2(ctx2, [dirty]) { + p(ctx2, [dirty]) { var _a2, _b, _c; if (dirty & /*change*/ 1 && t0_value !== (t0_value = getDisplayPath( /*change*/ ctx2[0].vault_path ) + "")) - set_data_dev(t0, t0_value); + set_data(t0, t0_value); if (dirty & /*view, change*/ 3) show_if = /*view*/ @@ -40918,20 +40181,20 @@ function create_fragment5(ctx) { if (dirty & /*change*/ 1 && t5_value !== (t5_value = /*change*/ ctx2[0].working_dir + "")) - set_data_dev(t5, t5_value); + set_data(t5, t5_value); if (dirty & /*change*/ 1 && div4_data_type_value !== (div4_data_type_value = /*change*/ ctx2[0].working_dir)) { - attr_dev(div4, "data-type", div4_data_type_value); + attr(div4, "data-type", div4_data_type_value); } if (dirty & /*change*/ 1 && div6_data_path_value !== (div6_data_path_value = /*change*/ ctx2[0].vault_path)) { - attr_dev(div6, "data-path", div6_data_path_value); + attr(div6, "data-path", div6_data_path_value); } if (dirty & /*side*/ 8) { - attr_dev( + attr( div6, "data-tooltip-position", /*side*/ @@ -40941,7 +40204,7 @@ function create_fragment5(ctx) { if (dirty & /*change*/ 1 && div6_aria_label_value !== (div6_aria_label_value = /*change*/ ctx2[0].vault_path)) { - attr_dev(div6, "aria-label", div6_aria_label_value); + attr(div6, "aria-label", div6_aria_label_value); } if (dirty & /*view, change*/ 3) { @@ -40958,9 +40221,9 @@ function create_fragment5(ctx) { }, i: noop, o: noop, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(main); + detach(main); } if (if_block) if_block.d(); @@ -40970,19 +40233,9 @@ function create_fragment5(ctx) { run_all(dispose); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment5.name, - type: "component", - source: "", - ctx - }); - return block; } function instance5($$self, $$props, $$invalidate) { let side; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("FileComponent", slots, []); let { change } = $$props; let { view } = $$props; let { manager } = $$props; @@ -40995,10 +40248,10 @@ function instance5($$self, $$props, $$invalidate) { } function open(event) { var _a2; - const file9 = view.app.vault.getAbstractFileByPath(change.vault_path); + const file = view.app.vault.getAbstractFileByPath(change.vault_path); console.log(event); - if (file9 instanceof import_obsidian26.TFile) { - (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file9); + if (file instanceof import_obsidian26.TFile) { + (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file); } } function stage() { @@ -41030,22 +40283,6 @@ function instance5($$self, $$props, $$invalidate) { } }); } - $$self.$$.on_mount.push(function() { - if (change === void 0 && !("change" in $$props || $$self.$$.bound[$$self.$$.props["change"]])) { - console_1.warn(" was created without expected prop 'change'"); - } - if (view === void 0 && !("view" in $$props || $$self.$$.bound[$$self.$$.props["view"]])) { - console_1.warn(" was created without expected prop 'view'"); - } - if (manager === void 0 && !("manager" in $$props || $$self.$$.bound[$$self.$$.props["manager"]])) { - console_1.warn(" was created without expected prop 'manager'"); - } - }); - const writable_props = ["change", "view", "manager"]; - Object.keys($$props).forEach((key2) => { - if (!~writable_props.indexOf(key2) && key2.slice(0, 2) !== "$$" && key2 !== "slot") - console_1.warn(` was created with unknown prop '${key2}'`); - }); function focus_handler(event) { bubble.call(this, $$self, event); } @@ -41075,40 +40312,6 @@ function instance5($$self, $$props, $$invalidate) { if ("manager" in $$props2) $$invalidate(9, manager = $$props2.manager); }; - $$self.$capture_state = () => ({ - setIcon: import_obsidian26.setIcon, - TFile: import_obsidian26.TFile, - hoverPreview, - DIFF_VIEW_CONFIG, - DiscardModal, - getDisplayPath, - getNewLeaf, - change, - view, - manager, - buttons, - hover, - open, - stage, - showDiff, - discard, - side - }); - $$self.$inject_state = ($$props2) => { - if ("change" in $$props2) - $$invalidate(0, change = $$props2.change); - if ("view" in $$props2) - $$invalidate(1, view = $$props2.view); - if ("manager" in $$props2) - $$invalidate(9, manager = $$props2.manager); - if ("buttons" in $$props2) - $$invalidate(2, buttons = $$props2.buttons); - if ("side" in $$props2) - $$invalidate(3, side = $$props2.side); - }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } $$self.$$.update = () => { if ($$self.$$.dirty & /*view*/ 2) { @@ -41133,34 +40336,10 @@ function instance5($$self, $$props, $$invalidate) { div2_binding ]; } -var FileComponent = class extends SvelteComponentDev { +var FileComponent = class extends SvelteComponent { constructor(options) { - super(options); + super(); init2(this, options, instance5, create_fragment5, safe_not_equal, { change: 0, view: 1, manager: 9 }, add_css3); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "FileComponent", - options, - id: create_fragment5.name - }); - } - get change() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set change(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get view() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set view(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get manager() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set manager(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } }; var fileComponent_default = FileComponent; @@ -41168,9 +40347,8 @@ var fileComponent_default = FileComponent; // src/ui/sourceControl/components/pulledFileComponent.svelte init_polyfill_buffer(); var import_obsidian27 = require("obsidian"); -var file5 = "src/ui/sourceControl/components/pulledFileComponent.svelte"; function add_css4(target) { - append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbGVkRmlsZUNvbXBvbmVudC5zdmVsdGUiLCJtYXBwaW5ncyI6IkFBcURrQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJwdWxsZWRGaWxlQ29tcG9uZW50LnN2ZWx0ZSJdfQ== */"); + append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}"); } function create_fragment6(ctx) { let main; @@ -41194,8 +40372,8 @@ function create_fragment6(ctx) { let div2_aria_label_value; let mounted; let dispose; - const block = { - c: function create() { + return { + c() { main = element("main"); div2 = element("div"); div0 = element("div"); @@ -41204,99 +40382,83 @@ function create_fragment6(ctx) { div1 = element("div"); span = element("span"); t2 = text(t2_value); - attr_dev(div0, "class", "tree-item-inner nav-file-title-content"); - add_location(div0, file5, 42, 8, 1208); - attr_dev(span, "class", "type"); - attr_dev(span, "data-type", span_data_type_value = /*change*/ + attr(div0, "class", "tree-item-inner nav-file-title-content"); + attr(span, "class", "type"); + attr(span, "data-type", span_data_type_value = /*change*/ ctx[0].working_dir); - add_location(span, file5, 46, 12, 1368); - attr_dev(div1, "class", "git-tools"); - add_location(div1, file5, 45, 8, 1332); - attr_dev(div2, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp"); - attr_dev(div2, "data-path", div2_data_path_value = /*change*/ + attr(div1, "class", "git-tools"); + attr(div2, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp"); + attr(div2, "data-path", div2_data_path_value = /*change*/ ctx[0].vault_path); - attr_dev( + attr( div2, "data-tooltip-position", /*side*/ ctx[1] ); - attr_dev(div2, "aria-label", div2_aria_label_value = /*change*/ + attr(div2, "aria-label", div2_aria_label_value = /*change*/ ctx[0].vault_path); - add_location(div2, file5, 36, 4, 1016); - attr_dev(main, "class", "tree-item nav-file svelte-1wbh8tp"); - add_location(main, file5, 29, 0, 860); + attr(main, "class", "tree-item nav-file svelte-1wbh8tp"); }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, main, anchor); - append_dev(main, div2); - append_dev(div2, div0); - append_dev(div0, t0); - append_dev(div2, t1); - append_dev(div2, div1); - append_dev(div1, span); - append_dev(span, t2); + m(target, anchor) { + insert(target, main, anchor); + append2(main, div2); + append2(div2, div0); + append2(div0, t0); + append2(div2, t1); + append2(div2, div1); + append2(div1, span); + append2(span, t2); if (!mounted) { dispose = [ - listen_dev( + listen( main, "mouseover", /*hover*/ - ctx[2], - false, - false, - false, - false + ctx[2] ), - listen_dev(main, "click", stop_propagation( + listen(main, "click", stop_propagation( /*open*/ ctx[3] - ), false, false, true, false), - listen_dev(main, "auxclick", stop_propagation( + )), + listen(main, "auxclick", stop_propagation( /*open*/ ctx[3] - ), false, false, true, false), - listen_dev( + )), + listen( main, "focus", /*focus_handler*/ - ctx[5], - false, - false, - false, - false + ctx[5] ) ]; mounted = true; } }, - p: function update2(ctx2, [dirty]) { + p(ctx2, [dirty]) { if (dirty & /*change*/ 1 && t0_value !== (t0_value = getDisplayPath( /*change*/ ctx2[0].vault_path ) + "")) - set_data_dev(t0, t0_value); + set_data(t0, t0_value); if (dirty & /*change*/ 1 && t2_value !== (t2_value = /*change*/ ctx2[0].working_dir + "")) - set_data_dev(t2, t2_value); + set_data(t2, t2_value); if (dirty & /*change*/ 1 && span_data_type_value !== (span_data_type_value = /*change*/ ctx2[0].working_dir)) { - attr_dev(span, "data-type", span_data_type_value); + attr(span, "data-type", span_data_type_value); } if (dirty & /*change*/ 1 && div2_data_path_value !== (div2_data_path_value = /*change*/ ctx2[0].vault_path)) { - attr_dev(div2, "data-path", div2_data_path_value); + attr(div2, "data-path", div2_data_path_value); } if (dirty & /*side*/ 2) { - attr_dev( + attr( div2, "data-tooltip-position", /*side*/ @@ -41306,32 +40468,22 @@ function create_fragment6(ctx) { if (dirty & /*change*/ 1 && div2_aria_label_value !== (div2_aria_label_value = /*change*/ ctx2[0].vault_path)) { - attr_dev(div2, "aria-label", div2_aria_label_value); + attr(div2, "aria-label", div2_aria_label_value); } }, i: noop, o: noop, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(main); + detach(main); } mounted = false; run_all(dispose); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment6.name, - type: "component", - source: "", - ctx - }); - return block; } function instance6($$self, $$props, $$invalidate) { let side; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("PulledFileComponent", slots, []); let { change } = $$props; let { view } = $$props; function hover(event) { @@ -41341,24 +40493,11 @@ function instance6($$self, $$props, $$invalidate) { } function open(event) { var _a2; - const file9 = view.app.vault.getAbstractFileByPath(change.vault_path); - if (file9 instanceof import_obsidian27.TFile) { - (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file9); + const file = view.app.vault.getAbstractFileByPath(change.vault_path); + if (file instanceof import_obsidian27.TFile) { + (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file); } } - $$self.$$.on_mount.push(function() { - if (change === void 0 && !("change" in $$props || $$self.$$.bound[$$self.$$.props["change"]])) { - console.warn(" was created without expected prop 'change'"); - } - if (view === void 0 && !("view" in $$props || $$self.$$.bound[$$self.$$.props["view"]])) { - console.warn(" was created without expected prop 'view'"); - } - }); - const writable_props = ["change", "view"]; - Object.keys($$props).forEach((key2) => { - if (!~writable_props.indexOf(key2) && key2.slice(0, 2) !== "$$" && key2 !== "slot") - console.warn(` was created with unknown prop '${key2}'`); - }); function focus_handler(event) { bubble.call(this, $$self, event); } @@ -41368,28 +40507,6 @@ function instance6($$self, $$props, $$invalidate) { if ("view" in $$props2) $$invalidate(4, view = $$props2.view); }; - $$self.$capture_state = () => ({ - TFile: import_obsidian27.TFile, - hoverPreview, - getDisplayPath, - getNewLeaf, - change, - view, - hover, - open, - side - }); - $$self.$inject_state = ($$props2) => { - if ("change" in $$props2) - $$invalidate(0, change = $$props2.change); - if ("view" in $$props2) - $$invalidate(4, view = $$props2.view); - if ("side" in $$props2) - $$invalidate(1, side = $$props2.side); - }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } $$self.$$.update = () => { if ($$self.$$.dirty & /*view*/ 16) { @@ -41399,28 +40516,10 @@ function instance6($$self, $$props, $$invalidate) { }; return [change, side, hover, open, view, focus_handler]; } -var PulledFileComponent = class extends SvelteComponentDev { +var PulledFileComponent = class extends SvelteComponent { constructor(options) { - super(options); + super(); init2(this, options, instance6, create_fragment6, safe_not_equal, { change: 0, view: 4 }, add_css4); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "PulledFileComponent", - options, - id: create_fragment6.name - }); - } - get change() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set change(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get view() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set view(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } }; var pulledFileComponent_default = PulledFileComponent; @@ -41428,51 +40527,41 @@ var pulledFileComponent_default = PulledFileComponent; // src/ui/sourceControl/components/stagedFileComponent.svelte init_polyfill_buffer(); var import_obsidian28 = require("obsidian"); -var file6 = "src/ui/sourceControl/components/stagedFileComponent.svelte"; function add_css5(target) { - append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2VkRmlsZUNvbXBvbmVudC5zdmVsdGUiLCJtYXBwaW5ncyI6IkFBbUdrQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJzdGFnZWRGaWxlQ29tcG9uZW50LnN2ZWx0ZSJdfQ== */"); + append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}"); } function create_if_block6(ctx) { let div; let mounted; let dispose; - const block = { - c: function create() { + return { + c() { div = element("div"); - attr_dev(div, "data-icon", "go-to-file"); - attr_dev(div, "aria-label", "Open File"); - attr_dev(div, "class", "clickable-icon"); - add_location(div, file6, 78, 20, 2339); + attr(div, "data-icon", "go-to-file"); + attr(div, "aria-label", "Open File"); + attr(div, "class", "clickable-icon"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); ctx[10](div); if (!mounted) { - dispose = listen_dev(div, "click", stop_propagation( + dispose = listen(div, "click", stop_propagation( /*open*/ ctx[5] - ), false, false, true, false); + )); mounted = true; } }, p: noop, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } ctx[10](null); mounted = false; dispose(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block6.name, - type: "if", - source: "(67:16) {#if view.app.vault.getAbstractFileByPath(change.vault_path)}", - ctx - }); - return block; } function create_fragment7(ctx) { let main; @@ -41508,8 +40597,8 @@ function create_fragment7(ctx) { let mounted; let dispose; let if_block = show_if && create_if_block6(ctx); - const block = { - c: function create() { + return { + c() { var _a2, _b, _c; main = element("main"); div5 = element("div"); @@ -41525,30 +40614,25 @@ function create_fragment7(ctx) { t3 = space(); div3 = element("div"); t4 = text(t4_value); - attr_dev(div0, "class", "tree-item-inner nav-file-title-content"); - add_location(div0, file6, 72, 8, 2059); - attr_dev(div1, "data-icon", "minus"); - attr_dev(div1, "aria-label", "Unstage"); - attr_dev(div1, "class", "clickable-icon"); - add_location(div1, file6, 86, 16, 2649); - attr_dev(div2, "class", "buttons"); - add_location(div2, file6, 76, 12, 2219); - attr_dev(div3, "class", "type"); - attr_dev(div3, "data-type", div3_data_type_value = /*change*/ + attr(div0, "class", "tree-item-inner nav-file-title-content"); + attr(div1, "data-icon", "minus"); + attr(div1, "aria-label", "Unstage"); + attr(div1, "class", "clickable-icon"); + attr(div2, "class", "buttons"); + attr(div3, "class", "type"); + attr(div3, "data-type", div3_data_type_value = /*change*/ ctx[0].index); - add_location(div3, file6, 94, 12, 2924); - attr_dev(div4, "class", "git-tools"); - add_location(div4, file6, 75, 8, 2183); - attr_dev(div5, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp"); - attr_dev(div5, "data-path", div5_data_path_value = /*change*/ + attr(div4, "class", "git-tools"); + attr(div5, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp"); + attr(div5, "data-path", div5_data_path_value = /*change*/ ctx[0].vault_path); - attr_dev( + attr( div5, "data-tooltip-position", /*side*/ ctx[3] ); - attr_dev(div5, "aria-label", div5_aria_label_value = /*change*/ + attr(div5, "aria-label", div5_aria_label_value = /*change*/ ctx[0].vault_path); toggle_class( div5, @@ -41559,75 +40643,62 @@ function create_fragment7(ctx) { ((_b = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _b.hash) && /*view*/ ((_c = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _c.staged) ); - add_location(div5, file6, 62, 4, 1667); - attr_dev(main, "class", "tree-item nav-file svelte-1wbh8tp"); - add_location(main, file6, 55, 0, 1503); + attr(main, "class", "tree-item nav-file svelte-1wbh8tp"); }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, main, anchor); - append_dev(main, div5); - append_dev(div5, div0); - append_dev(div0, t0); - append_dev(div5, t1); - append_dev(div5, div4); - append_dev(div4, div2); + m(target, anchor) { + insert(target, main, anchor); + append2(main, div5); + append2(div5, div0); + append2(div0, t0); + append2(div5, t1); + append2(div5, div4); + append2(div4, div2); if (if_block) if_block.m(div2, null); - append_dev(div2, t2); - append_dev(div2, div1); + append2(div2, t2); + append2(div2, div1); ctx[11](div1); - append_dev(div4, t3); - append_dev(div4, div3); - append_dev(div3, t4); + append2(div4, t3); + append2(div4, div3); + append2(div3, t4); if (!mounted) { dispose = [ - listen_dev(div1, "click", stop_propagation( + listen(div1, "click", stop_propagation( /*unstage*/ ctx[7] - ), false, false, true, false), - listen_dev( + )), + listen( main, "mouseover", /*hover*/ - ctx[4], - false, - false, - false, - false + ctx[4] ), - listen_dev( + listen( main, "focus", /*focus_handler*/ - ctx[9], - false, - false, - false, - false + ctx[9] ), - listen_dev(main, "click", stop_propagation( + listen(main, "click", stop_propagation( /*showDiff*/ ctx[6] - ), false, false, true, false), - listen_dev(main, "auxclick", stop_propagation( + )), + listen(main, "auxclick", stop_propagation( /*showDiff*/ ctx[6] - ), false, false, true, false) + )) ]; mounted = true; } }, - p: function update2(ctx2, [dirty]) { + p(ctx2, [dirty]) { var _a2, _b, _c; if (dirty & /*change*/ 1 && t0_value !== (t0_value = getDisplayPath( /*change*/ ctx2[0].vault_path ) + "")) - set_data_dev(t0, t0_value); + set_data(t0, t0_value); if (dirty & /*view, change*/ 3) show_if = /*view*/ @@ -41650,20 +40721,20 @@ function create_fragment7(ctx) { if (dirty & /*change*/ 1 && t4_value !== (t4_value = /*change*/ ctx2[0].index + "")) - set_data_dev(t4, t4_value); + set_data(t4, t4_value); if (dirty & /*change*/ 1 && div3_data_type_value !== (div3_data_type_value = /*change*/ ctx2[0].index)) { - attr_dev(div3, "data-type", div3_data_type_value); + attr(div3, "data-type", div3_data_type_value); } if (dirty & /*change*/ 1 && div5_data_path_value !== (div5_data_path_value = /*change*/ ctx2[0].vault_path)) { - attr_dev(div5, "data-path", div5_data_path_value); + attr(div5, "data-path", div5_data_path_value); } if (dirty & /*side*/ 8) { - attr_dev( + attr( div5, "data-tooltip-position", /*side*/ @@ -41673,7 +40744,7 @@ function create_fragment7(ctx) { if (dirty & /*change*/ 1 && div5_aria_label_value !== (div5_aria_label_value = /*change*/ ctx2[0].vault_path)) { - attr_dev(div5, "aria-label", div5_aria_label_value); + attr(div5, "aria-label", div5_aria_label_value); } if (dirty & /*view, change*/ 3) { @@ -41690,9 +40761,9 @@ function create_fragment7(ctx) { }, i: noop, o: noop, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(main); + detach(main); } if (if_block) if_block.d(); @@ -41701,19 +40772,9 @@ function create_fragment7(ctx) { run_all(dispose); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment7.name, - type: "component", - source: "", - ctx - }); - return block; } function instance7($$self, $$props, $$invalidate) { let side; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("StagedFileComponent", slots, []); let { change } = $$props; let { view } = $$props; let { manager } = $$props; @@ -41726,9 +40787,9 @@ function instance7($$self, $$props, $$invalidate) { } function open(event) { var _a2; - const file9 = view.app.vault.getAbstractFileByPath(change.vault_path); - if (file9 instanceof import_obsidian28.TFile) { - (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file9); + const file = view.app.vault.getAbstractFileByPath(change.vault_path); + if (file instanceof import_obsidian28.TFile) { + (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file); } } function showDiff(event) { @@ -41744,22 +40805,6 @@ function instance7($$self, $$props, $$invalidate) { dispatchEvent(new CustomEvent("git-refresh")); }); } - $$self.$$.on_mount.push(function() { - if (change === void 0 && !("change" in $$props || $$self.$$.bound[$$self.$$.props["change"]])) { - console.warn(" was created without expected prop 'change'"); - } - if (view === void 0 && !("view" in $$props || $$self.$$.bound[$$self.$$.props["view"]])) { - console.warn(" was created without expected prop 'view'"); - } - if (manager === void 0 && !("manager" in $$props || $$self.$$.bound[$$self.$$.props["manager"]])) { - console.warn(" was created without expected prop 'manager'"); - } - }); - const writable_props = ["change", "view", "manager"]; - Object.keys($$props).forEach((key2) => { - if (!~writable_props.indexOf(key2) && key2.slice(0, 2) !== "$$" && key2 !== "slot") - console.warn(` was created with unknown prop '${key2}'`); - }); function focus_handler(event) { bubble.call(this, $$self, event); } @@ -41783,38 +40828,6 @@ function instance7($$self, $$props, $$invalidate) { if ("manager" in $$props2) $$invalidate(8, manager = $$props2.manager); }; - $$self.$capture_state = () => ({ - setIcon: import_obsidian28.setIcon, - TFile: import_obsidian28.TFile, - hoverPreview, - DIFF_VIEW_CONFIG, - getDisplayPath, - getNewLeaf, - change, - view, - manager, - buttons, - hover, - open, - showDiff, - unstage, - side - }); - $$self.$inject_state = ($$props2) => { - if ("change" in $$props2) - $$invalidate(0, change = $$props2.change); - if ("view" in $$props2) - $$invalidate(1, view = $$props2.view); - if ("manager" in $$props2) - $$invalidate(8, manager = $$props2.manager); - if ("buttons" in $$props2) - $$invalidate(2, buttons = $$props2.buttons); - if ("side" in $$props2) - $$invalidate(3, side = $$props2.side); - }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } $$self.$$.update = () => { if ($$self.$$.dirty & /*view*/ 2) { @@ -41837,43 +40850,18 @@ function instance7($$self, $$props, $$invalidate) { div1_binding ]; } -var StagedFileComponent = class extends SvelteComponentDev { +var StagedFileComponent = class extends SvelteComponent { constructor(options) { - super(options); + super(); init2(this, options, instance7, create_fragment7, safe_not_equal, { change: 0, view: 1, manager: 8 }, add_css5); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "StagedFileComponent", - options, - id: create_fragment7.name - }); - } - get change() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set change(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get view() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set view(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get manager() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set manager(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } }; var stagedFileComponent_default = StagedFileComponent; // src/ui/sourceControl/components/treeComponent.svelte init_polyfill_buffer(); -var file7 = "src/ui/sourceControl/components/treeComponent.svelte"; function add_css6(target) { - append_styles(target, "svelte-hup5mn", "main.svelte-hup5mn .nav-folder-title.svelte-hup5mn{align-items:center}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZUNvbXBvbmVudC5zdmVsdGUiLCJtYXBwaW5ncyI6IkFBcU5rQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJ0cmVlQ29tcG9uZW50LnN2ZWx0ZSJdfQ== */"); + append_styles(target, "svelte-hup5mn", "main.svelte-hup5mn .nav-folder-title.svelte-hup5mn{align-items:center}"); } function get_each_context4(ctx, list, i) { const child_ctx = ctx.slice(); @@ -41886,8 +40874,6 @@ function create_else_block3(ctx) { let div0; let t0; let div1; - let svg; - let path2; let t1; let div2; let t2_value = ( @@ -41930,15 +40916,14 @@ function create_else_block3(ctx) { ) ); } - const block = { - c: function create() { + return { + c() { div7 = element("div"); div6 = element("div"); div0 = element("div"); t0 = space(); div1 = element("div"); - svg = svg_element("svg"); - path2 = svg_element("path"); + div1.innerHTML = ``; t1 = space(); div2 = element("div"); t2 = text(t2_value); @@ -41952,24 +40937,10 @@ function create_else_block3(ctx) { if (if_block1) if_block1.c(); t6 = space(); - attr_dev(div0, "data-icon", "folder"); + attr(div0, "data-icon", "folder"); set_style(div0, "padding-right", "5px"); set_style(div0, "display", "flex"); - add_location(div0, file7, 82, 20, 2721); - attr_dev(path2, "d", "M3 8L12 17L21 8"); - add_location(path2, file7, 101, 29, 3610); - attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg, "width", "24"); - attr_dev(svg, "height", "24"); - attr_dev(svg, "viewBox", "0 0 24 24"); - attr_dev(svg, "fill", "none"); - attr_dev(svg, "stroke", "currentColor"); - attr_dev(svg, "stroke-width", "2"); - attr_dev(svg, "stroke-linecap", "round"); - attr_dev(svg, "stroke-linejoin", "round"); - attr_dev(svg, "class", "svg-icon right-triangle"); - add_location(svg, file7, 90, 24, 3088); - attr_dev(div1, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); + attr(div1, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); toggle_class( div1, "is-collapsed", @@ -41979,26 +40950,20 @@ function create_else_block3(ctx) { ctx[15].title ] ); - add_location(div1, file7, 86, 20, 2880); - attr_dev(div2, "class", "tree-item-inner nav-folder-title-content"); - add_location(div2, file7, 104, 20, 3717); + attr(div2, "class", "tree-item-inner nav-folder-title-content"); set_style(div3, "width", "11px"); - add_location(div3, file7, 190, 28, 8269); - attr_dev(div4, "class", "buttons"); - add_location(div4, file7, 108, 24, 3906); - attr_dev(div5, "class", "git-tools"); - add_location(div5, file7, 107, 20, 3858); - attr_dev(div6, "class", "tree-item-self is-clickable nav-folder-title svelte-hup5mn"); - attr_dev( + attr(div4, "class", "buttons"); + attr(div5, "class", "git-tools"); + attr(div6, "class", "tree-item-self is-clickable nav-folder-title svelte-hup5mn"); + attr( div6, "data-tooltip-position", /*side*/ ctx[6] ); - attr_dev(div6, "aria-label", div6_aria_label_value = /*entity*/ + attr(div6, "aria-label", div6_aria_label_value = /*entity*/ ctx[15].vaultPath); - add_location(div6, file7, 77, 16, 2506); - attr_dev(div7, "class", "tree-item nav-folder"); + attr(div7, "class", "tree-item nav-folder"); toggle_class( div7, "is-collapsed", @@ -42008,36 +40973,33 @@ function create_else_block3(ctx) { ctx[15].title ] ); - add_location(div7, file7, 72, 12, 2306); }, - m: function mount(target, anchor) { - insert_dev(target, div7, anchor); - append_dev(div7, div6); - append_dev(div6, div0); - append_dev(div6, t0); - append_dev(div6, div1); - append_dev(div1, svg); - append_dev(svg, path2); - append_dev(div6, t1); - append_dev(div6, div2); - append_dev(div2, t2); - append_dev(div6, t3); - append_dev(div6, div5); - append_dev(div5, div4); + m(target, anchor) { + insert(target, div7, anchor); + append2(div7, div6); + append2(div6, div0); + append2(div6, t0); + append2(div6, div1); + append2(div6, t1); + append2(div6, div2); + append2(div2, t2); + append2(div6, t3); + append2(div6, div5); + append2(div5, div4); if_block0.m(div4, null); - append_dev(div4, t4); - append_dev(div4, div3); - append_dev(div7, t5); + append2(div4, t4); + append2(div4, div3); + append2(div7, t5); if (if_block1) if_block1.m(div7, null); - append_dev(div7, t6); + append2(div7, t6); current = true; if (!mounted) { - dispose = listen_dev(div7, "click", stop_propagation(click_handler_3), false, false, true, false); + dispose = listen(div7, "click", stop_propagation(click_handler_3)); mounted = true; } }, - p: function update2(new_ctx, dirty) { + p(new_ctx, dirty) { ctx = new_ctx; if (!current || dirty & /*closed, hierarchy*/ 33) { @@ -42054,7 +41016,7 @@ function create_else_block3(ctx) { if ((!current || dirty & /*hierarchy*/ 1) && t2_value !== (t2_value = /*entity*/ ctx[15].title + "")) - set_data_dev(t2, t2_value); + set_data(t2, t2_value); if (current_block_type === (current_block_type = select_block_type_2(ctx, dirty)) && if_block0) { if_block0.p(ctx, dirty); } else { @@ -42067,7 +41029,7 @@ function create_else_block3(ctx) { } if (!current || dirty & /*side*/ 64) { - attr_dev( + attr( div6, "data-tooltip-position", /*side*/ @@ -42077,7 +41039,7 @@ function create_else_block3(ctx) { if (!current || dirty & /*hierarchy*/ 1 && div6_aria_label_value !== (div6_aria_label_value = /*entity*/ ctx[15].vaultPath)) { - attr_dev(div6, "aria-label", div6_aria_label_value); + attr(div6, "aria-label", div6_aria_label_value); } if (!/*closed*/ ctx[5][ @@ -42116,19 +41078,19 @@ function create_else_block3(ctx) { ); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block1); current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block1); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div7); + detach(div7); } if_block0.d(); if (if_block1) @@ -42137,14 +41099,6 @@ function create_else_block3(ctx) { dispose(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block3.name, - type: "else", - source: "(68:8) {:else}", - ctx - }); - return block; } function create_if_block7(ctx) { let div; @@ -42175,23 +41129,22 @@ function create_if_block7(ctx) { if (~(current_block_type_index = select_block_type_1(ctx, -1))) { if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); } - const block = { - c: function create() { + return { + c() { div = element("div"); if (if_block) if_block.c(); t = space(); - add_location(div, file7, 54, 12, 1620); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); if (~current_block_type_index) { if_blocks[current_block_type_index].m(div, null); } - append_dev(div, t); + append2(div, t); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { let previous_block_index = current_block_type_index; current_block_type_index = select_block_type_1(ctx2, dirty); if (current_block_type_index === previous_block_index) { @@ -42221,44 +41174,30 @@ function create_if_block7(ctx) { } } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block); current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } if (~current_block_type_index) { if_blocks[current_block_type_index].d(); } } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block7.name, - type: "if", - source: "(50:8) {#if entity.data}", - ctx - }); - return block; } function create_else_block_1(ctx) { let div0; - let svg0; - let path0; - let path1; let t; let div1; - let svg1; - let line0; - let line1; let mounted; let dispose; function click_handler_1() { @@ -42279,105 +41218,48 @@ function create_else_block_1(ctx) { ) ); } - const block = { - c: function create() { + return { + c() { div0 = element("div"); - svg0 = svg_element("svg"); - path0 = svg_element("path"); - path1 = svg_element("path"); + div0.innerHTML = ``; t = space(); div1 = element("div"); - svg1 = svg_element("svg"); - line0 = svg_element("line"); - line1 = svg_element("line"); - attr_dev(path0, "d", "M3 7v6h6"); - add_location(path0, file7, 154, 41, 6398); - attr_dev(path1, "d", "M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13"); - add_location(path1, file7, 154, 62, 6419); - attr_dev(svg0, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg0, "width", "24"); - attr_dev(svg0, "height", "24"); - attr_dev(svg0, "viewBox", "0 0 24 24"); - attr_dev(svg0, "fill", "none"); - attr_dev(svg0, "stroke", "currentColor"); - attr_dev(svg0, "stroke-width", "2"); - attr_dev(svg0, "stroke-linecap", "round"); - attr_dev(svg0, "stroke-linejoin", "round"); - attr_dev(svg0, "class", "svg-icon lucide-undo"); - add_location(svg0, file7, 143, 36, 5747); - attr_dev(div0, "data-icon", "undo"); - attr_dev(div0, "aria-label", "Discard"); - attr_dev(div0, "class", "clickable-icon"); - add_location(div0, file7, 136, 32, 5378); - attr_dev(line0, "x1", "9"); - attr_dev(line0, "y1", "4"); - attr_dev(line0, "x2", "9"); - attr_dev(line0, "y2", "14"); - add_location(line0, file7, 176, 41, 7618); - attr_dev(line1, "x1", "4"); - attr_dev(line1, "y1", "9"); - attr_dev(line1, "x2", "14"); - attr_dev(line1, "y2", "9"); - add_location(line1, file7, 181, 42, 7871); - attr_dev(svg1, "width", "18"); - attr_dev(svg1, "height", "18"); - attr_dev(svg1, "viewBox", "0 0 18 18"); - attr_dev(svg1, "fill", "none"); - attr_dev(svg1, "stroke", "currentColor"); - attr_dev(svg1, "stroke-width", "2"); - attr_dev(svg1, "stroke-linecap", "round"); - attr_dev(svg1, "stroke-linejoin", "round"); - attr_dev(svg1, "class", "svg-icon lucide-plus"); - add_location(svg1, file7, 166, 36, 7042); - attr_dev(div1, "data-icon", "plus"); - attr_dev(div1, "aria-label", "Stage"); - attr_dev(div1, "class", "clickable-icon"); - add_location(div1, file7, 159, 32, 6672); + div1.innerHTML = ``; + attr(div0, "data-icon", "undo"); + attr(div0, "aria-label", "Discard"); + attr(div0, "class", "clickable-icon"); + attr(div1, "data-icon", "plus"); + attr(div1, "aria-label", "Stage"); + attr(div1, "class", "clickable-icon"); }, - m: function mount(target, anchor) { - insert_dev(target, div0, anchor); - append_dev(div0, svg0); - append_dev(svg0, path0); - append_dev(svg0, path1); - insert_dev(target, t, anchor); - insert_dev(target, div1, anchor); - append_dev(div1, svg1); - append_dev(svg1, line0); - append_dev(svg1, line1); + m(target, anchor) { + insert(target, div0, anchor); + insert(target, t, anchor); + insert(target, div1, anchor); if (!mounted) { dispose = [ - listen_dev(div0, "click", stop_propagation(click_handler_1), false, false, true, false), - listen_dev(div1, "click", stop_propagation(click_handler_2), false, false, true, false) + listen(div0, "click", stop_propagation(click_handler_1)), + listen(div1, "click", stop_propagation(click_handler_2)) ]; mounted = true; } }, - p: function update2(new_ctx, dirty) { + p(new_ctx, dirty) { ctx = new_ctx; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div0); - detach_dev(t); - detach_dev(div1); + detach(div0); + detach(t); + detach(div1); } mounted = false; run_all(dispose); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block_1.name, - type: "else", - source: "(132:28) {:else}", - ctx - }); - return block; } function create_if_block_5(ctx) { let div; - let svg; - let line; let mounted; let dispose; function click_handler() { @@ -42389,59 +41271,32 @@ function create_if_block_5(ctx) { ) ); } - const block = { - c: function create() { + return { + c() { div = element("div"); - svg = svg_element("svg"); - line = svg_element("line"); - attr_dev(line, "x1", "4"); - attr_dev(line, "y1", "9"); - attr_dev(line, "x2", "14"); - attr_dev(line, "y2", "9"); - add_location(line, file7, 127, 41, 4974); - attr_dev(svg, "width", "18"); - attr_dev(svg, "height", "18"); - attr_dev(svg, "viewBox", "0 0 18 18"); - attr_dev(svg, "fill", "none"); - attr_dev(svg, "stroke", "currentColor"); - attr_dev(svg, "stroke-width", "2"); - attr_dev(svg, "stroke-linecap", "round"); - attr_dev(svg, "stroke-linejoin", "round"); - attr_dev(svg, "class", "svg-icon lucide-minus"); - add_location(svg, file7, 117, 36, 4397); - attr_dev(div, "data-icon", "minus"); - attr_dev(div, "aria-label", "Unstage"); - attr_dev(div, "class", "clickable-icon"); - add_location(div, file7, 110, 32, 4022); + div.innerHTML = ``; + attr(div, "data-icon", "minus"); + attr(div, "aria-label", "Unstage"); + attr(div, "class", "clickable-icon"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, svg); - append_dev(svg, line); + m(target, anchor) { + insert(target, div, anchor); if (!mounted) { - dispose = listen_dev(div, "click", stop_propagation(click_handler), false, false, true, false); + dispose = listen(div, "click", stop_propagation(click_handler)); mounted = true; } }, - p: function update2(new_ctx, dirty) { + p(new_ctx, dirty) { ctx = new_ctx; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } mounted = false; dispose(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_5.name, - type: "if", - source: "(106:28) {#if fileType == FileType.staged}", - ctx - }); - return block; } function create_if_block_42(ctx) { let div; @@ -42466,22 +41321,20 @@ function create_if_block_42(ctx) { /*fileType*/ ctx[3] ) - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { div = element("div"); create_component(treecomponent.$$.fragment); - attr_dev(div, "class", "tree-item-children nav-folder-children"); - add_location(div, file7, 196, 20, 8442); + attr(div, "class", "tree-item-children nav-folder-children"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); mount_component(treecomponent, div, null); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const treecomponent_changes = {}; if (dirty & /*hierarchy*/ 1) @@ -42501,7 +41354,7 @@ function create_if_block_42(ctx) { ctx2[3]; treecomponent.$set(treecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(treecomponent.$$.fragment, local); @@ -42516,7 +41369,7 @@ function create_if_block_42(ctx) { } current = true; }, - o: function outro(local) { + o(local) { transition_out(treecomponent.$$.fragment, local); if (local) { if (!div_transition) @@ -42525,23 +41378,15 @@ function create_if_block_42(ctx) { } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } destroy_component(treecomponent); if (detaching && div_transition) div_transition.end(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_42.name, - type: "if", - source: "(192:16) {#if !closed[entity.title]}", - ctx - }); - return block; } function create_if_block_32(ctx) { let pulledfilecomponent; @@ -42556,18 +41401,17 @@ function create_if_block_32(ctx) { /*view*/ ctx[2] ) - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { create_component(pulledfilecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(pulledfilecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const pulledfilecomponent_changes = {}; if (dirty & /*hierarchy*/ 1) @@ -42579,28 +41423,20 @@ function create_if_block_32(ctx) { ctx2[2]; pulledfilecomponent.$set(pulledfilecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(pulledfilecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(pulledfilecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(pulledfilecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_32.name, - type: "if", - source: "(64:54) ", - ctx - }); - return block; } function create_if_block_22(ctx) { let filecomponent; @@ -42619,18 +41455,17 @@ function create_if_block_22(ctx) { /*view*/ ctx[2] ) - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { create_component(filecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(filecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const filecomponent_changes = {}; if (dirty & /*hierarchy*/ 1) @@ -42646,28 +41481,20 @@ function create_if_block_22(ctx) { ctx2[2]; filecomponent.$set(filecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(filecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(filecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(filecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_22.name, - type: "if", - source: "(58:55) ", - ctx - }); - return block; } function create_if_block_13(ctx) { let stagedfilecomponent; @@ -42686,18 +41513,17 @@ function create_if_block_13(ctx) { /*view*/ ctx[2] ) - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { create_component(stagedfilecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(stagedfilecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const stagedfilecomponent_changes = {}; if (dirty & /*hierarchy*/ 1) @@ -42713,28 +41539,20 @@ function create_if_block_13(ctx) { ctx2[2]; stagedfilecomponent.$set(stagedfilecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(stagedfilecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(stagedfilecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(stagedfilecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_13.name, - type: "if", - source: "(52:16) {#if fileType == FileType.staged}", - ctx - }); - return block; } function create_each_block4(ctx) { let current_block_type_index; @@ -42753,17 +41571,17 @@ function create_each_block4(ctx) { } current_block_type_index = select_block_type(ctx, -1); if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - const block = { - c: function create() { + return { + c() { if_block.c(); if_block_anchor = empty(); }, - m: function mount(target, anchor) { + m(target, anchor) { if_blocks[current_block_type_index].m(target, anchor); - insert_dev(target, if_block_anchor, anchor); + insert(target, if_block_anchor, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { let previous_block_index = current_block_type_index; current_block_type_index = select_block_type(ctx2, dirty); if (current_block_type_index === previous_block_index) { @@ -42785,36 +41603,28 @@ function create_each_block4(ctx) { if_block.m(if_block_anchor.parentNode, if_block_anchor); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block); current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(if_block_anchor); + detach(if_block_anchor); } if_blocks[current_block_type_index].d(detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block4.name, - type: "each", - source: "(49:4) {#each hierarchy.children as entity}", - ctx - }); - return block; } function create_fragment8(ctx) { let main; let current; - let each_value = ensure_array_like_dev( + let each_value = ensure_array_like( /*hierarchy*/ ctx[0].children ); @@ -42825,26 +41635,22 @@ function create_fragment8(ctx) { const out = (i) => transition_out(each_blocks[i], 1, 1, () => { each_blocks[i] = null; }); - const block = { - c: function create() { + return { + c() { main = element("main"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr_dev(main, "class", "svelte-hup5mn"); + attr(main, "class", "svelte-hup5mn"); toggle_class( main, "topLevel", /*topLevel*/ ctx[4] ); - add_location(main, file7, 51, 0, 1519); }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, main, anchor); + m(target, anchor) { + insert(target, main, anchor); for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(main, null); @@ -42852,10 +41658,10 @@ function create_fragment8(ctx) { } current = true; }, - p: function update2(ctx2, [dirty]) { + p(ctx2, [dirty]) { if (dirty & /*hierarchy, plugin, view, fileType, closed, fold, side, unstage, stage, discard*/ 2031) { - each_value = ensure_array_like_dev( + each_value = ensure_array_like( /*hierarchy*/ ctx2[0].children ); @@ -42888,7 +41694,7 @@ function create_fragment8(ctx) { ); } }, - i: function intro(local) { + i(local) { if (current) return; for (let i = 0; i < each_value.length; i += 1) { @@ -42896,33 +41702,23 @@ function create_fragment8(ctx) { } current = true; }, - o: function outro(local) { + o(local) { each_blocks = each_blocks.filter(Boolean); for (let i = 0; i < each_blocks.length; i += 1) { transition_out(each_blocks[i]); } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(main); + detach(main); } destroy_each(each_blocks, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment8.name, - type: "component", - source: "", - ctx - }); - return block; } function instance8($$self, $$props, $$invalidate) { let side; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("TreeComponent", slots, []); let { hierarchy } = $$props; let { plugin } = $$props; let { view } = $$props; @@ -42954,25 +41750,6 @@ function instance8($$self, $$props, $$invalidate) { function fold(item) { $$invalidate(5, closed[item.title] = !closed[item.title], closed); } - $$self.$$.on_mount.push(function() { - if (hierarchy === void 0 && !("hierarchy" in $$props || $$self.$$.bound[$$self.$$.props["hierarchy"]])) { - console.warn(" was created without expected prop 'hierarchy'"); - } - if (plugin === void 0 && !("plugin" in $$props || $$self.$$.bound[$$self.$$.props["plugin"]])) { - console.warn(" was created without expected prop 'plugin'"); - } - if (view === void 0 && !("view" in $$props || $$self.$$.bound[$$self.$$.props["view"]])) { - console.warn(" was created without expected prop 'view'"); - } - if (fileType === void 0 && !("fileType" in $$props || $$self.$$.bound[$$self.$$.props["fileType"]])) { - console.warn(" was created without expected prop 'fileType'"); - } - }); - const writable_props = ["hierarchy", "plugin", "view", "fileType", "topLevel"]; - Object.keys($$props).forEach((key2) => { - if (!~writable_props.indexOf(key2) && key2.slice(0, 2) !== "$$" && key2 !== "slot") - console.warn(` was created with unknown prop '${key2}'`); - }); const click_handler = (entity) => unstage(entity.path); const click_handler_1 = (entity) => discard(entity); const click_handler_2 = (entity) => stage(entity.path); @@ -42989,42 +41766,6 @@ function instance8($$self, $$props, $$invalidate) { if ("topLevel" in $$props2) $$invalidate(4, topLevel = $$props2.topLevel); }; - $$self.$capture_state = () => ({ - FileType, - DiscardModal, - slide, - FileComponent: fileComponent_default, - PulledFileComponent: pulledFileComponent_default, - StagedFileComponent: stagedFileComponent_default, - hierarchy, - plugin, - view, - fileType, - topLevel, - closed, - stage, - unstage, - discard, - fold, - side - }); - $$self.$inject_state = ($$props2) => { - if ("hierarchy" in $$props2) - $$invalidate(0, hierarchy = $$props2.hierarchy); - if ("plugin" in $$props2) - $$invalidate(1, plugin = $$props2.plugin); - if ("view" in $$props2) - $$invalidate(2, view = $$props2.view); - if ("fileType" in $$props2) - $$invalidate(3, fileType = $$props2.fileType); - if ("topLevel" in $$props2) - $$invalidate(4, topLevel = $$props2.topLevel); - if ("side" in $$props2) - $$invalidate(6, side = $$props2.side); - }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } $$self.$$.update = () => { if ($$self.$$.dirty & /*view*/ 4) { @@ -43050,9 +41791,9 @@ function instance8($$self, $$props, $$invalidate) { click_handler_3 ]; } -var TreeComponent = class extends SvelteComponentDev { +var TreeComponent = class extends SvelteComponent { constructor(options) { - super(options); + super(); init2( this, options, @@ -43068,51 +41809,13 @@ var TreeComponent = class extends SvelteComponentDev { }, add_css6 ); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "TreeComponent", - options, - id: create_fragment8.name - }); - } - get hierarchy() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set hierarchy(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get plugin() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set plugin(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get view() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set view(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get fileType() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set fileType(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get topLevel() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set topLevel(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } }; var treeComponent_default = TreeComponent; // src/ui/sourceControl/sourceControl.svelte -var file8 = "src/ui/sourceControl/sourceControl.svelte"; function add_css7(target) { - append_styles(target, "svelte-11adhly", `.commit-msg-input.svelte-11adhly.svelte-11adhly{width:100%;overflow:hidden;resize:none;padding:7px 5px;background-color:var(--background-modifier-form-field)}.git-commit-msg.svelte-11adhly.svelte-11adhly{position:relative;padding:0;width:calc(100% - var(--size-4-8));margin:4px auto}main.svelte-11adhly .git-tools .files-count.svelte-11adhly{padding-left:var(--size-2-1);width:11px;display:flex;align-items:center;justify-content:center}.nav-folder-title.svelte-11adhly.svelte-11adhly{align-items:center}.git-commit-msg-clear-button.svelte-11adhly.svelte-11adhly{position:absolute;background:transparent;border-radius:50%;color:var(--search-clear-button-color);cursor:var(--cursor);top:-4px;right:2px;bottom:0px;line-height:0;height:var(--input-height);width:28px;margin:auto;padding:0 0;text-align:center;display:flex;justify-content:center;align-items:center;transition:color 0.15s ease-in-out}.git-commit-msg-clear-button.svelte-11adhly.svelte-11adhly:after{content:"";height:var(--search-clear-button-size);width:var(--search-clear-button-size);display:block;background-color:currentColor;mask-image:url("data:image/svg+xml,");mask-repeat:no-repeat;-webkit-mask-image:url("data:image/svg+xml,");-webkit-mask-repeat:no-repeat} -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlQ29udHJvbC5zdmVsdGUiLCJtYXBwaW5ncyI6IkFBNGxCa0IiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsic291cmNlQ29udHJvbC5zdmVsdGUiXX0= */`); + append_styles(target, "svelte-11adhly", `.commit-msg-input.svelte-11adhly.svelte-11adhly{width:100%;overflow:hidden;resize:none;padding:7px 5px;background-color:var(--background-modifier-form-field)}.git-commit-msg.svelte-11adhly.svelte-11adhly{position:relative;padding:0;width:calc(100% - var(--size-4-8));margin:4px auto}main.svelte-11adhly .git-tools .files-count.svelte-11adhly{padding-left:var(--size-2-1);width:11px;display:flex;align-items:center;justify-content:center}.nav-folder-title.svelte-11adhly.svelte-11adhly{align-items:center}.git-commit-msg-clear-button.svelte-11adhly.svelte-11adhly{position:absolute;background:transparent;border-radius:50%;color:var(--search-clear-button-color);cursor:var(--cursor);top:-4px;right:2px;bottom:0px;line-height:0;height:var(--input-height);width:28px;margin:auto;padding:0 0;text-align:center;display:flex;justify-content:center;align-items:center;transition:color 0.15s ease-in-out}.git-commit-msg-clear-button.svelte-11adhly.svelte-11adhly:after{content:"";height:var(--search-clear-button-size);width:var(--search-clear-button-size);display:block;background-color:currentColor;mask-image:url("data:image/svg+xml,");mask-repeat:no-repeat;-webkit-mask-image:url("data:image/svg+xml,");-webkit-mask-repeat:no-repeat}`); } function get_each_context5(ctx, list, i) { const child_ctx = ctx.slice(); @@ -43134,46 +41837,33 @@ function create_if_block_8(ctx) { let div_aria_label_value; let mounted; let dispose; - const block = { - c: function create() { + return { + c() { div = element("div"); - attr_dev(div, "class", "git-commit-msg-clear-button svelte-11adhly"); - attr_dev(div, "aria-label", div_aria_label_value = "Clear"); - add_location(div, file8, 312, 12, 9471); + attr(div, "class", "git-commit-msg-clear-button svelte-11adhly"); + attr(div, "aria-label", div_aria_label_value = "Clear"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); if (!mounted) { - dispose = listen_dev( + dispose = listen( div, "click", /*click_handler_1*/ - ctx[33], - false, - false, - false, - false + ctx[33] ); mounted = true; } }, p: noop, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } mounted = false; dispose(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_8.name, - type: "if", - source: "(276:8) {#if commitMessage}", - ctx - }); - return block; } function create_if_block8(ctx) { let div18; @@ -43181,16 +41871,12 @@ function create_if_block8(ctx) { let div7; let div6; let div0; - let svg0; - let path0; let t0; let div1; let t2; let div5; let div3; let div2; - let svg1; - let line0; let t3; let div4; let t4_value = ( @@ -43203,22 +41889,14 @@ function create_if_block8(ctx) { let div16; let div15; let div8; - let svg2; - let path1; let t7; let div9; let t9; let div14; let div12; let div10; - let svg3; - let path2; - let path3; let t10; let div11; - let svg4; - let line1; - let line2; let t11; let div13; let t12_value = ( @@ -43243,15 +41921,14 @@ function create_if_block8(ctx) { /*lastPulledFiles*/ ctx[7].length > 0 && create_if_block_14(ctx) ); - const block = { - c: function create() { + return { + c() { div18 = element("div"); div17 = element("div"); div7 = element("div"); div6 = element("div"); div0 = element("div"); - svg0 = svg_element("svg"); - path0 = svg_element("path"); + div0.innerHTML = ``; t0 = space(); div1 = element("div"); div1.textContent = "Staged Changes"; @@ -43259,8 +41936,7 @@ function create_if_block8(ctx) { div5 = element("div"); div3 = element("div"); div2 = element("div"); - svg1 = svg_element("svg"); - line0 = svg_element("line"); + div2.innerHTML = ``; t3 = space(); div4 = element("div"); t4 = text(t4_value); @@ -43271,8 +41947,7 @@ function create_if_block8(ctx) { div16 = element("div"); div15 = element("div"); div8 = element("div"); - svg2 = svg_element("svg"); - path1 = svg_element("path"); + div8.innerHTML = ``; t7 = space(); div9 = element("div"); div9.textContent = "Changes"; @@ -43280,14 +41955,10 @@ function create_if_block8(ctx) { div14 = element("div"); div12 = element("div"); div10 = element("div"); - svg3 = svg_element("svg"); - path2 = svg_element("path"); - path3 = svg_element("path"); + div10.innerHTML = ``; t10 = space(); div11 = element("div"); - svg4 = svg_element("svg"); - line1 = svg_element("line"); - line2 = svg_element("line"); + div11.innerHTML = ``; t11 = space(); div13 = element("div"); t12 = text(t12_value); @@ -43297,229 +41968,113 @@ function create_if_block8(ctx) { t14 = space(); if (if_block2) if_block2.c(); - attr_dev(path0, "d", "M3 8L12 17L21 8"); - add_location(path0, file8, 347, 37, 11151); - attr_dev(svg0, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg0, "width", "24"); - attr_dev(svg0, "height", "24"); - attr_dev(svg0, "viewBox", "0 0 24 24"); - attr_dev(svg0, "fill", "none"); - attr_dev(svg0, "stroke", "currentColor"); - attr_dev(svg0, "stroke-width", "2"); - attr_dev(svg0, "stroke-linecap", "round"); - attr_dev(svg0, "stroke-linejoin", "round"); - attr_dev(svg0, "class", "svg-icon right-triangle"); - add_location(svg0, file8, 336, 32, 10541); - attr_dev(div0, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); + attr(div0, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); toggle_class(div0, "is-collapsed", !/*stagedOpen*/ ctx[13]); - add_location(div0, file8, 332, 28, 10310); - attr_dev(div1, "class", "tree-item-inner nav-folder-title-content"); - add_location(div1, file8, 350, 28, 11282); - attr_dev(line0, "x1", "4"); - attr_dev(line0, "y1", "9"); - attr_dev(line0, "x2", "14"); - attr_dev(line0, "y2", "9"); - add_location(line0, file8, 375, 45, 12646); - attr_dev(svg1, "width", "18"); - attr_dev(svg1, "height", "18"); - attr_dev(svg1, "viewBox", "0 0 18 18"); - attr_dev(svg1, "fill", "none"); - attr_dev(svg1, "stroke", "currentColor"); - attr_dev(svg1, "stroke-width", "2"); - attr_dev(svg1, "stroke-linecap", "round"); - attr_dev(svg1, "stroke-linejoin", "round"); - attr_dev(svg1, "class", "svg-icon lucide-minus"); - add_location(svg1, file8, 365, 40, 12029); - attr_dev(div2, "data-icon", "minus"); - attr_dev(div2, "aria-label", "Unstage"); - attr_dev(div2, "class", "clickable-icon"); - add_location(div2, file8, 358, 36, 11623); - attr_dev(div3, "class", "buttons"); - add_location(div3, file8, 357, 32, 11565); - attr_dev(div4, "class", "files-count svelte-11adhly"); - add_location(div4, file8, 384, 32, 13081); - attr_dev(div5, "class", "git-tools"); - add_location(div5, file8, 356, 28, 11509); - attr_dev(div6, "class", "tree-item-self is-clickable nav-folder-title svelte-11adhly"); - add_location(div6, file8, 328, 24, 10098); - attr_dev(div7, "class", "staged tree-item nav-folder"); + attr(div1, "class", "tree-item-inner nav-folder-title-content"); + attr(div2, "data-icon", "minus"); + attr(div2, "aria-label", "Unstage"); + attr(div2, "class", "clickable-icon"); + attr(div3, "class", "buttons"); + attr(div4, "class", "files-count svelte-11adhly"); + attr(div5, "class", "git-tools"); + attr(div6, "class", "tree-item-self is-clickable nav-folder-title svelte-11adhly"); + attr(div7, "class", "staged tree-item nav-folder"); toggle_class(div7, "is-collapsed", !/*stagedOpen*/ ctx[13]); - add_location(div7, file8, 324, 20, 9930); - attr_dev(path1, "d", "M3 8L12 17L21 8"); - add_location(path1, file8, 437, 37, 15776); - attr_dev(svg2, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg2, "width", "24"); - attr_dev(svg2, "height", "24"); - attr_dev(svg2, "viewBox", "0 0 24 24"); - attr_dev(svg2, "fill", "none"); - attr_dev(svg2, "stroke", "currentColor"); - attr_dev(svg2, "stroke-width", "2"); - attr_dev(svg2, "stroke-linecap", "round"); - attr_dev(svg2, "stroke-linejoin", "round"); - attr_dev(svg2, "class", "svg-icon right-triangle"); - add_location(svg2, file8, 426, 32, 15166); - attr_dev(div8, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); + attr(div8, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); toggle_class(div8, "is-collapsed", !/*changesOpen*/ ctx[12]); - add_location(div8, file8, 422, 28, 14934); - attr_dev(div9, "class", "tree-item-inner nav-folder-title-content"); - add_location(div9, file8, 441, 28, 15908); - attr_dev(path2, "d", "M3 7v6h6"); - add_location(path2, file8, 465, 45, 17275); - attr_dev(path3, "d", "M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13"); - add_location(path3, file8, 465, 66, 17296); - attr_dev(svg3, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg3, "width", "24"); - attr_dev(svg3, "height", "24"); - attr_dev(svg3, "viewBox", "0 0 24 24"); - attr_dev(svg3, "fill", "none"); - attr_dev(svg3, "stroke", "currentColor"); - attr_dev(svg3, "stroke-width", "2"); - attr_dev(svg3, "stroke-linecap", "round"); - attr_dev(svg3, "stroke-linejoin", "round"); - attr_dev(svg3, "class", "svg-icon lucide-undo"); - add_location(svg3, file8, 454, 40, 16580); - attr_dev(div10, "data-icon", "undo"); - attr_dev(div10, "aria-label", "Discard"); - attr_dev(div10, "class", "clickable-icon"); - add_location(div10, file8, 448, 36, 16241); - attr_dev(line1, "x1", "12"); - attr_dev(line1, "y1", "5"); - attr_dev(line1, "x2", "12"); - attr_dev(line1, "y2", "19"); - add_location(line1, file8, 488, 45, 18665); - attr_dev(line2, "x1", "5"); - attr_dev(line2, "y1", "12"); - attr_dev(line2, "x2", "19"); - attr_dev(line2, "y2", "12"); - add_location(line2, file8, 493, 46, 18940); - attr_dev(svg4, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg4, "width", "24"); - attr_dev(svg4, "height", "24"); - attr_dev(svg4, "viewBox", "0 0 24 24"); - attr_dev(svg4, "fill", "none"); - attr_dev(svg4, "stroke", "currentColor"); - attr_dev(svg4, "stroke-width", "2"); - attr_dev(svg4, "stroke-linecap", "round"); - attr_dev(svg4, "stroke-linejoin", "round"); - attr_dev(svg4, "class", "svg-icon lucide-plus"); - add_location(svg4, file8, 477, 40, 17970); - attr_dev(div11, "data-icon", "plus"); - attr_dev(div11, "aria-label", "Stage"); - attr_dev(div11, "class", "clickable-icon"); - add_location(div11, file8, 470, 36, 17569); - attr_dev(div12, "class", "buttons"); - add_location(div12, file8, 447, 32, 16183); - attr_dev(div13, "class", "files-count svelte-11adhly"); - add_location(div13, file8, 502, 32, 19377); - attr_dev(div14, "class", "git-tools"); - add_location(div14, file8, 446, 28, 16127); - attr_dev(div15, "class", "tree-item-self is-clickable nav-folder-title svelte-11adhly"); - add_location(div15, file8, 418, 24, 14720); - attr_dev(div16, "class", "changes tree-item nav-folder"); + attr(div9, "class", "tree-item-inner nav-folder-title-content"); + attr(div10, "data-icon", "undo"); + attr(div10, "aria-label", "Discard"); + attr(div10, "class", "clickable-icon"); + attr(div11, "data-icon", "plus"); + attr(div11, "aria-label", "Stage"); + attr(div11, "class", "clickable-icon"); + attr(div12, "class", "buttons"); + attr(div13, "class", "files-count svelte-11adhly"); + attr(div14, "class", "git-tools"); + attr(div15, "class", "tree-item-self is-clickable nav-folder-title svelte-11adhly"); + attr(div16, "class", "changes tree-item nav-folder"); toggle_class(div16, "is-collapsed", !/*changesOpen*/ ctx[12]); - add_location(div16, file8, 414, 20, 14550); - attr_dev(div17, "class", "tree-item-children nav-folder-children"); - add_location(div17, file8, 323, 16, 9857); - attr_dev(div18, "class", "tree-item nav-folder mod-root"); - add_location(div18, file8, 322, 12, 9797); + attr(div17, "class", "tree-item-children nav-folder-children"); + attr(div18, "class", "tree-item nav-folder mod-root"); }, - m: function mount(target, anchor) { - insert_dev(target, div18, anchor); - append_dev(div18, div17); - append_dev(div17, div7); - append_dev(div7, div6); - append_dev(div6, div0); - append_dev(div0, svg0); - append_dev(svg0, path0); - append_dev(div6, t0); - append_dev(div6, div1); - append_dev(div6, t2); - append_dev(div6, div5); - append_dev(div5, div3); - append_dev(div3, div2); - append_dev(div2, svg1); - append_dev(svg1, line0); + m(target, anchor) { + insert(target, div18, anchor); + append2(div18, div17); + append2(div17, div7); + append2(div7, div6); + append2(div6, div0); + append2(div6, t0); + append2(div6, div1); + append2(div6, t2); + append2(div6, div5); + append2(div5, div3); + append2(div3, div2); ctx[34](div2); - append_dev(div5, t3); - append_dev(div5, div4); - append_dev(div4, t4); - append_dev(div7, t5); + append2(div5, t3); + append2(div5, div4); + append2(div4, t4); + append2(div7, t5); if (if_block0) if_block0.m(div7, null); - append_dev(div17, t6); - append_dev(div17, div16); - append_dev(div16, div15); - append_dev(div15, div8); - append_dev(div8, svg2); - append_dev(svg2, path1); - append_dev(div15, t7); - append_dev(div15, div9); - append_dev(div15, t9); - append_dev(div15, div14); - append_dev(div14, div12); - append_dev(div12, div10); - append_dev(div10, svg3); - append_dev(svg3, path2); - append_dev(svg3, path3); - append_dev(div12, t10); - append_dev(div12, div11); - append_dev(div11, svg4); - append_dev(svg4, line1); - append_dev(svg4, line2); + append2(div17, t6); + append2(div17, div16); + append2(div16, div15); + append2(div15, div8); + append2(div15, t7); + append2(div15, div9); + append2(div15, t9); + append2(div15, div14); + append2(div14, div12); + append2(div12, div10); + append2(div12, t10); + append2(div12, div11); ctx[36](div11); - append_dev(div14, t11); - append_dev(div14, div13); - append_dev(div13, t12); - append_dev(div16, t13); + append2(div14, t11); + append2(div14, div13); + append2(div13, t12); + append2(div16, t13); if (if_block1) if_block1.m(div16, null); - append_dev(div17, t14); + append2(div17, t14); if (if_block2) if_block2.m(div17, null); current = true; if (!mounted) { dispose = [ - listen_dev(div2, "click", stop_propagation( + listen(div2, "click", stop_propagation( /*unstageAll*/ ctx[19] - ), false, false, true, false), - listen_dev( + )), + listen( div6, "click", /*click_handler_2*/ - ctx[35], - false, - false, - false, - false + ctx[35] ), - listen_dev(div10, "click", stop_propagation( + listen(div10, "click", stop_propagation( /*discard*/ ctx[22] - ), false, false, true, false), - listen_dev(div11, "click", stop_propagation( + )), + listen(div11, "click", stop_propagation( /*stageAll*/ ctx[18] - ), false, false, true, false), - listen_dev( + )), + listen( div15, "click", /*click_handler_3*/ - ctx[37], - false, - false, - false, - false + ctx[37] ) ]; mounted = true; } }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if (!current || dirty[0] & /*stagedOpen*/ 8192) { toggle_class(div0, "is-collapsed", !/*stagedOpen*/ @@ -43528,7 +42083,7 @@ function create_if_block8(ctx) { if ((!current || dirty[0] & /*status*/ 64) && t4_value !== (t4_value = /*status*/ ctx2[6].staged.length + "")) - set_data_dev(t4, t4_value); + set_data(t4, t4_value); if ( /*stagedOpen*/ ctx2[13] @@ -43565,7 +42120,7 @@ function create_if_block8(ctx) { if ((!current || dirty[0] & /*status*/ 64) && t12_value !== (t12_value = /*status*/ ctx2[6].changed.length + "")) - set_data_dev(t12, t12_value); + set_data(t12, t12_value); if ( /*changesOpen*/ ctx2[12] @@ -43618,7 +42173,7 @@ function create_if_block8(ctx) { check_outros(); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block0); @@ -43626,15 +42181,15 @@ function create_if_block8(ctx) { transition_in(if_block2); current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block0); transition_out(if_block1); transition_out(if_block2); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div18); + detach(div18); } ctx[34](null); if (if_block0) @@ -43648,14 +42203,6 @@ function create_if_block8(ctx) { run_all(dispose); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block8.name, - type: "if", - source: "(286:8) {#if status && stagedHierarchy && changeHierarchy}", - ctx - }); - return block; } function create_if_block_6(ctx) { let div; @@ -43675,19 +42222,18 @@ function create_if_block_6(ctx) { } current_block_type_index = select_block_type(ctx, [-1, -1]); if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - const block = { - c: function create() { + return { + c() { div = element("div"); if_block.c(); - attr_dev(div, "class", "tree-item-children nav-folder-children"); - add_location(div, file8, 390, 28, 13340); + attr(div, "class", "tree-item-children nav-folder-children"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); if_blocks[current_block_type_index].m(div, null); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { let previous_block_index = current_block_type_index; current_block_type_index = select_block_type(ctx2, dirty); if (current_block_type_index === previous_block_index) { @@ -43709,7 +42255,7 @@ function create_if_block_6(ctx) { if_block.m(div, null); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block); @@ -43724,7 +42270,7 @@ function create_if_block_6(ctx) { } current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block); if (local) { if (!div_transition) @@ -43733,28 +42279,20 @@ function create_if_block_6(ctx) { } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } if_blocks[current_block_type_index].d(); if (detaching && div_transition) div_transition.end(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_6.name, - type: "if", - source: "(354:24) {#if stagedOpen}", - ctx - }); - return block; } function create_else_block_2(ctx) { let each_1_anchor; let current; - let each_value_2 = ensure_array_like_dev( + let each_value_2 = ensure_array_like( /*status*/ ctx[6].staged ); @@ -43765,26 +42303,26 @@ function create_else_block_2(ctx) { const out = (i) => transition_out(each_blocks[i], 1, 1, () => { each_blocks[i] = null; }); - const block = { - c: function create() { + return { + c() { for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } each_1_anchor = empty(); }, - m: function mount(target, anchor) { + m(target, anchor) { for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(target, anchor); } } - insert_dev(target, each_1_anchor, anchor); + insert(target, each_1_anchor, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if (dirty[0] & /*status, view, plugin*/ 67) { - each_value_2 = ensure_array_like_dev( + each_value_2 = ensure_array_like( /*status*/ ctx2[6].staged ); @@ -43808,7 +42346,7 @@ function create_else_block_2(ctx) { check_outros(); } }, - i: function intro(local) { + i(local) { if (current) return; for (let i = 0; i < each_value_2.length; i += 1) { @@ -43816,28 +42354,20 @@ function create_else_block_2(ctx) { } current = true; }, - o: function outro(local) { + o(local) { each_blocks = each_blocks.filter(Boolean); for (let i = 0; i < each_blocks.length; i += 1) { transition_out(each_blocks[i]); } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(each_1_anchor); + detach(each_1_anchor); } destroy_each(each_blocks, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block_2.name, - type: "else", - source: "(367:32) {:else}", - ctx - }); - return block; } function create_if_block_7(ctx) { let treecomponent; @@ -43858,18 +42388,17 @@ function create_if_block_7(ctx) { ), fileType: 0 /* staged */, topLevel: true - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { create_component(treecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(treecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const treecomponent_changes = {}; if (dirty[0] & /*stagedHierarchy*/ 1024) @@ -43885,28 +42414,20 @@ function create_if_block_7(ctx) { ctx2[1]; treecomponent.$set(treecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(treecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(treecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(treecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_7.name, - type: "if", - source: "(359:32) {#if showTree}", - ctx - }); - return block; } function create_each_block_2(ctx) { let stagedfilecomponent; @@ -43925,18 +42446,17 @@ function create_each_block_2(ctx) { /*plugin*/ ctx[0].gitManager ) - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { create_component(stagedfilecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(stagedfilecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const stagedfilecomponent_changes = {}; if (dirty[0] & /*status*/ 64) @@ -43952,28 +42472,20 @@ function create_each_block_2(ctx) { ctx2[0].gitManager; stagedfilecomponent.$set(stagedfilecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(stagedfilecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(stagedfilecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(stagedfilecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block_2.name, - type: "each", - source: "(368:36) {#each status.staged as stagedFile}", - ctx - }); - return block; } function create_if_block_43(ctx) { let div; @@ -43993,19 +42505,18 @@ function create_if_block_43(ctx) { } current_block_type_index = select_block_type_1(ctx, [-1, -1]); if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - const block = { - c: function create() { + return { + c() { div = element("div"); if_block.c(); - attr_dev(div, "class", "tree-item-children nav-folder-children"); - add_location(div, file8, 508, 28, 19638); + attr(div, "class", "tree-item-children nav-folder-children"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); if_blocks[current_block_type_index].m(div, null); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { let previous_block_index = current_block_type_index; current_block_type_index = select_block_type_1(ctx2, dirty); if (current_block_type_index === previous_block_index) { @@ -44027,7 +42538,7 @@ function create_if_block_43(ctx) { if_block.m(div, null); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block); @@ -44042,7 +42553,7 @@ function create_if_block_43(ctx) { } current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block); if (local) { if (!div_transition) @@ -44051,28 +42562,20 @@ function create_if_block_43(ctx) { } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } if_blocks[current_block_type_index].d(); if (detaching && div_transition) div_transition.end(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_43.name, - type: "if", - source: "(472:24) {#if changesOpen}", - ctx - }); - return block; } function create_else_block_12(ctx) { let each_1_anchor; let current; - let each_value_1 = ensure_array_like_dev( + let each_value_1 = ensure_array_like( /*status*/ ctx[6].changed ); @@ -44083,26 +42586,26 @@ function create_else_block_12(ctx) { const out = (i) => transition_out(each_blocks[i], 1, 1, () => { each_blocks[i] = null; }); - const block = { - c: function create() { + return { + c() { for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } each_1_anchor = empty(); }, - m: function mount(target, anchor) { + m(target, anchor) { for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(target, anchor); } } - insert_dev(target, each_1_anchor, anchor); + insert(target, each_1_anchor, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if (dirty[0] & /*status, view, plugin*/ 67) { - each_value_1 = ensure_array_like_dev( + each_value_1 = ensure_array_like( /*status*/ ctx2[6].changed ); @@ -44126,7 +42629,7 @@ function create_else_block_12(ctx) { check_outros(); } }, - i: function intro(local) { + i(local) { if (current) return; for (let i = 0; i < each_value_1.length; i += 1) { @@ -44134,28 +42637,20 @@ function create_else_block_12(ctx) { } current = true; }, - o: function outro(local) { + o(local) { each_blocks = each_blocks.filter(Boolean); for (let i = 0; i < each_blocks.length; i += 1) { transition_out(each_blocks[i]); } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(each_1_anchor); + detach(each_1_anchor); } destroy_each(each_blocks, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block_12.name, - type: "else", - source: "(485:32) {:else}", - ctx - }); - return block; } function create_if_block_52(ctx) { let treecomponent; @@ -44176,18 +42671,17 @@ function create_if_block_52(ctx) { ), fileType: 1 /* changed */, topLevel: true - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { create_component(treecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(treecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const treecomponent_changes = {}; if (dirty[0] & /*changeHierarchy*/ 512) @@ -44203,28 +42697,20 @@ function create_if_block_52(ctx) { ctx2[1]; treecomponent.$set(treecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(treecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(treecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(treecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_52.name, - type: "if", - source: "(477:32) {#if showTree}", - ctx - }); - return block; } function create_each_block_1(ctx) { let filecomponent; @@ -44243,19 +42729,18 @@ function create_each_block_1(ctx) { /*plugin*/ ctx[0].gitManager ) - }, - $$inline: true + } }); filecomponent.$on("git-refresh", triggerRefresh2); - const block = { - c: function create() { + return { + c() { create_component(filecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(filecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const filecomponent_changes = {}; if (dirty[0] & /*status*/ 64) @@ -44271,35 +42756,25 @@ function create_each_block_1(ctx) { ctx2[0].gitManager; filecomponent.$set(filecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(filecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(filecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(filecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block_1.name, - type: "each", - source: "(486:36) {#each status.changed as change}", - ctx - }); - return block; } function create_if_block_14(ctx) { let div3; let div2; let div0; - let svg; - let path2; let t0; let div1; let t2; @@ -44317,13 +42792,12 @@ function create_if_block_14(ctx) { /*lastPulledFilesOpen*/ ctx[14] && create_if_block_23(ctx) ); - const block = { - c: function create() { + return { + c() { div3 = element("div"); div2 = element("div"); div0 = element("div"); - svg = svg_element("svg"); - path2 = svg_element("path"); + div0.innerHTML = ``; t0 = space(); div1 = element("div"); div1.textContent = "Recently Pulled Files"; @@ -44333,66 +42807,42 @@ function create_if_block_14(ctx) { t4 = space(); if (if_block) if_block.c(); - attr_dev(path2, "d", "M3 8L12 17L21 8"); - add_location(path2, file8, 558, 41, 22299); - attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg, "width", "24"); - attr_dev(svg, "height", "24"); - attr_dev(svg, "viewBox", "0 0 24 24"); - attr_dev(svg, "fill", "none"); - attr_dev(svg, "stroke", "currentColor"); - attr_dev(svg, "stroke-width", "2"); - attr_dev(svg, "stroke-linecap", "round"); - attr_dev(svg, "stroke-linejoin", "round"); - attr_dev(svg, "class", "svg-icon right-triangle"); - add_location(svg, file8, 547, 36, 21645); - attr_dev(div0, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); - add_location(div0, file8, 544, 32, 21467); - attr_dev(div1, "class", "tree-item-inner nav-folder-title-content"); - add_location(div1, file8, 562, 32, 22443); - attr_dev(span, "class", "tree-item-flair"); - add_location(span, file8, 568, 32, 22697); - attr_dev(div2, "class", "tree-item-self is-clickable nav-folder-title svelte-11adhly"); - add_location(div2, file8, 538, 28, 21145); - attr_dev(div3, "class", "pulled nav-folder"); + attr(div0, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon"); + attr(div1, "class", "tree-item-inner nav-folder-title-content"); + attr(span, "class", "tree-item-flair"); + attr(div2, "class", "tree-item-self is-clickable nav-folder-title svelte-11adhly"); + attr(div3, "class", "pulled nav-folder"); toggle_class(div3, "is-collapsed", !/*lastPulledFilesOpen*/ ctx[14]); - add_location(div3, file8, 534, 24, 20962); }, - m: function mount(target, anchor) { - insert_dev(target, div3, anchor); - append_dev(div3, div2); - append_dev(div2, div0); - append_dev(div0, svg); - append_dev(svg, path2); - append_dev(div2, t0); - append_dev(div2, div1); - append_dev(div2, t2); - append_dev(div2, span); - append_dev(span, t3); - append_dev(div3, t4); + m(target, anchor) { + insert(target, div3, anchor); + append2(div3, div2); + append2(div2, div0); + append2(div2, t0); + append2(div2, div1); + append2(div2, t2); + append2(div2, span); + append2(span, t3); + append2(div3, t4); if (if_block) if_block.m(div3, null); current = true; if (!mounted) { - dispose = listen_dev( + dispose = listen( div2, "click", /*click_handler_4*/ - ctx[38], - false, - false, - false, - false + ctx[38] ); mounted = true; } }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if ((!current || dirty[0] & /*lastPulledFiles*/ 128) && t3_value !== (t3_value = /*lastPulledFiles*/ ctx2[7].length + "")) - set_data_dev(t3, t3_value); + set_data(t3, t3_value); if ( /*lastPulledFilesOpen*/ ctx2[14] @@ -44422,19 +42872,19 @@ function create_if_block_14(ctx) { ctx2[14]); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block); current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div3); + detach(div3); } if (if_block) if_block.d(); @@ -44442,14 +42892,6 @@ function create_if_block_14(ctx) { dispose(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_14.name, - type: "if", - source: "(498:20) {#if lastPulledFiles.length > 0}", - ctx - }); - return block; } function create_if_block_23(ctx) { let div; @@ -44469,19 +42911,18 @@ function create_if_block_23(ctx) { } current_block_type_index = select_block_type_2(ctx, [-1, -1]); if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - const block = { - c: function create() { + return { + c() { div = element("div"); if_block.c(); - attr_dev(div, "class", "tree-item-children nav-folder-children"); - add_location(div, file8, 573, 32, 22950); + attr(div, "class", "tree-item-children nav-folder-children"); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + m(target, anchor) { + insert(target, div, anchor); if_blocks[current_block_type_index].m(div, null); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { let previous_block_index = current_block_type_index; current_block_type_index = select_block_type_2(ctx2, dirty); if (current_block_type_index === previous_block_index) { @@ -44503,7 +42944,7 @@ function create_if_block_23(ctx) { if_block.m(div, null); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block); @@ -44518,7 +42959,7 @@ function create_if_block_23(ctx) { } current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block); if (local) { if (!div_transition) @@ -44527,28 +42968,20 @@ function create_if_block_23(ctx) { } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(div); + detach(div); } if_blocks[current_block_type_index].d(); if (detaching && div_transition) div_transition.end(); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_23.name, - type: "if", - source: "(537:28) {#if lastPulledFilesOpen}", - ctx - }); - return block; } function create_else_block4(ctx) { let each_1_anchor; let current; - let each_value = ensure_array_like_dev( + let each_value = ensure_array_like( /*lastPulledFiles*/ ctx[7] ); @@ -44559,26 +42992,26 @@ function create_else_block4(ctx) { const out = (i) => transition_out(each_blocks[i], 1, 1, () => { each_blocks[i] = null; }); - const block = { - c: function create() { + return { + c() { for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } each_1_anchor = empty(); }, - m: function mount(target, anchor) { + m(target, anchor) { for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(target, anchor); } } - insert_dev(target, each_1_anchor, anchor); + insert(target, each_1_anchor, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if (dirty[0] & /*lastPulledFiles, view*/ 130) { - each_value = ensure_array_like_dev( + each_value = ensure_array_like( /*lastPulledFiles*/ ctx2[7] ); @@ -44602,7 +43035,7 @@ function create_else_block4(ctx) { check_outros(); } }, - i: function intro(local) { + i(local) { if (current) return; for (let i = 0; i < each_value.length; i += 1) { @@ -44610,28 +43043,20 @@ function create_else_block4(ctx) { } current = true; }, - o: function outro(local) { + o(local) { each_blocks = each_blocks.filter(Boolean); for (let i = 0; i < each_blocks.length; i += 1) { transition_out(each_blocks[i]); } current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(each_1_anchor); + detach(each_1_anchor); } destroy_each(each_blocks, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block4.name, - type: "else", - source: "(550:36) {:else}", - ctx - }); - return block; } function create_if_block_33(ctx) { let treecomponent; @@ -44652,18 +43077,17 @@ function create_if_block_33(ctx) { ), fileType: 2 /* pulled */, topLevel: true - }, - $$inline: true + } }); - const block = { - c: function create() { + return { + c() { create_component(treecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(treecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const treecomponent_changes = {}; if (dirty[0] & /*lastPulledFilesHierarchy*/ 2048) @@ -44679,28 +43103,20 @@ function create_if_block_33(ctx) { ctx2[1]; treecomponent.$set(treecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(treecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(treecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(treecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_33.name, - type: "if", - source: "(542:36) {#if showTree}", - ctx - }); - return block; } function create_each_block5(ctx) { let pulledfilecomponent; @@ -44715,19 +43131,18 @@ function create_each_block5(ctx) { /*view*/ ctx[1] ) - }, - $$inline: true + } }); pulledfilecomponent.$on("git-refresh", triggerRefresh2); - const block = { - c: function create() { + return { + c() { create_component(pulledfilecomponent.$$.fragment); }, - m: function mount(target, anchor) { + m(target, anchor) { mount_component(pulledfilecomponent, target, anchor); current = true; }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { const pulledfilecomponent_changes = {}; if (dirty[0] & /*lastPulledFiles*/ 128) @@ -44739,28 +43154,20 @@ function create_each_block5(ctx) { ctx2[1]; pulledfilecomponent.$set(pulledfilecomponent_changes); }, - i: function intro(local) { + i(local) { if (current) return; transition_in(pulledfilecomponent.$$.fragment, local); current = true; }, - o: function outro(local) { + o(local) { transition_out(pulledfilecomponent.$$.fragment, local); current = false; }, - d: function destroy(detaching) { + d(detaching) { destroy_component(pulledfilecomponent, detaching); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block5.name, - type: "each", - source: "(551:40) {#each lastPulledFiles as change}", - ctx - }); - return block; } function create_fragment9(ctx) { let main; @@ -44801,8 +43208,8 @@ function create_fragment9(ctx) { ctx[10] && /*changeHierarchy*/ ctx[9] && create_if_block8(ctx) ); - const block = { - c: function create() { + return { + c() { main = element("main"); div9 = element("div"); div8 = element("div"); @@ -44831,44 +43238,37 @@ function create_fragment9(ctx) { div11 = element("div"); if (if_block1) if_block1.c(); - attr_dev(div0, "id", "backup-btn"); - attr_dev(div0, "data-icon", "arrow-up-circle"); - attr_dev(div0, "class", "clickable-icon nav-action-button"); - attr_dev(div0, "aria-label", "Backup"); - add_location(div0, file8, 232, 12, 6838); - attr_dev(div1, "id", "commit-btn"); - attr_dev(div1, "data-icon", "check"); - attr_dev(div1, "class", "clickable-icon nav-action-button"); - attr_dev(div1, "aria-label", "Commit"); - add_location(div1, file8, 240, 12, 7112); - attr_dev(div2, "id", "stage-all"); - attr_dev(div2, "class", "clickable-icon nav-action-button"); - attr_dev(div2, "data-icon", "plus-circle"); - attr_dev(div2, "aria-label", "Stage all"); - add_location(div2, file8, 248, 12, 7376); - attr_dev(div3, "id", "unstage-all"); - attr_dev(div3, "class", "clickable-icon nav-action-button"); - attr_dev(div3, "data-icon", "minus-circle"); - attr_dev(div3, "aria-label", "Unstage all"); - add_location(div3, file8, 256, 12, 7650); - attr_dev(div4, "id", "push"); - attr_dev(div4, "class", "clickable-icon nav-action-button"); - attr_dev(div4, "data-icon", "upload"); - attr_dev(div4, "aria-label", "Push"); - add_location(div4, file8, 264, 12, 7931); - attr_dev(div5, "id", "pull"); - attr_dev(div5, "class", "clickable-icon nav-action-button"); - attr_dev(div5, "data-icon", "download"); - attr_dev(div5, "aria-label", "Pull"); - add_location(div5, file8, 272, 12, 8186); - attr_dev(div6, "id", "layoutChange"); - attr_dev(div6, "class", "clickable-icon nav-action-button"); - attr_dev(div6, "aria-label", "Change Layout"); - add_location(div6, file8, 280, 12, 8443); - attr_dev(div7, "id", "refresh"); - attr_dev(div7, "class", "clickable-icon nav-action-button"); - attr_dev(div7, "data-icon", "refresh-cw"); - attr_dev(div7, "aria-label", "Refresh"); + attr(div0, "id", "backup-btn"); + attr(div0, "data-icon", "arrow-up-circle"); + attr(div0, "class", "clickable-icon nav-action-button"); + attr(div0, "aria-label", "Backup"); + attr(div1, "id", "commit-btn"); + attr(div1, "data-icon", "check"); + attr(div1, "class", "clickable-icon nav-action-button"); + attr(div1, "aria-label", "Commit"); + attr(div2, "id", "stage-all"); + attr(div2, "class", "clickable-icon nav-action-button"); + attr(div2, "data-icon", "plus-circle"); + attr(div2, "aria-label", "Stage all"); + attr(div3, "id", "unstage-all"); + attr(div3, "class", "clickable-icon nav-action-button"); + attr(div3, "data-icon", "minus-circle"); + attr(div3, "aria-label", "Unstage all"); + attr(div4, "id", "push"); + attr(div4, "class", "clickable-icon nav-action-button"); + attr(div4, "data-icon", "upload"); + attr(div4, "aria-label", "Push"); + attr(div5, "id", "pull"); + attr(div5, "class", "clickable-icon nav-action-button"); + attr(div5, "data-icon", "download"); + attr(div5, "aria-label", "Pull"); + attr(div6, "id", "layoutChange"); + attr(div6, "class", "clickable-icon nav-action-button"); + attr(div6, "aria-label", "Change Layout"); + attr(div7, "id", "refresh"); + attr(div7, "class", "clickable-icon nav-action-button"); + attr(div7, "data-icon", "refresh-cw"); + attr(div7, "aria-label", "Refresh"); set_style(div7, "margin", "1px"); toggle_class( div7, @@ -44876,150 +43276,112 @@ function create_fragment9(ctx) { /*loading*/ ctx[5] ); - add_location(div7, file8, 291, 12, 8847); - attr_dev(div8, "class", "nav-buttons-container"); - add_location(div8, file8, 231, 8, 6790); - attr_dev(div9, "class", "nav-header"); - add_location(div9, file8, 230, 4, 6757); - attr_dev( + attr(div8, "class", "nav-buttons-container"); + attr(div9, "class", "nav-header"); + attr( textarea, "rows", /*rows*/ ctx[15] ); - attr_dev(textarea, "class", "commit-msg-input svelte-11adhly"); - attr_dev(textarea, "spellcheck", "true"); - attr_dev(textarea, "placeholder", "Commit Message"); - add_location(textarea, file8, 304, 8, 9244); - attr_dev(div10, "class", "git-commit-msg svelte-11adhly"); - add_location(div10, file8, 303, 4, 9207); - attr_dev(div11, "class", "nav-files-container"); + attr(textarea, "class", "commit-msg-input svelte-11adhly"); + attr(textarea, "spellcheck", "true"); + attr(textarea, "placeholder", "Commit Message"); + attr(div10, "class", "git-commit-msg svelte-11adhly"); + attr(div11, "class", "nav-files-container"); set_style(div11, "position", "relative"); - add_location(div11, file8, 320, 4, 9664); - attr_dev(main, "data-type", main_data_type_value = SOURCE_CONTROL_VIEW_CONFIG.type); - attr_dev(main, "class", "svelte-11adhly"); - add_location(main, file8, 229, 0, 6702); + attr(main, "data-type", main_data_type_value = SOURCE_CONTROL_VIEW_CONFIG.type); + attr(main, "class", "svelte-11adhly"); }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, main, anchor); - append_dev(main, div9); - append_dev(div9, div8); - append_dev(div8, div0); + m(target, anchor) { + insert(target, main, anchor); + append2(main, div9); + append2(div9, div8); + append2(div8, div0); ctx[23](div0); - append_dev(div8, t0); - append_dev(div8, div1); + append2(div8, t0); + append2(div8, div1); ctx[24](div1); - append_dev(div8, t1); - append_dev(div8, div2); + append2(div8, t1); + append2(div8, div2); ctx[25](div2); - append_dev(div8, t2); - append_dev(div8, div3); + append2(div8, t2); + append2(div8, div3); ctx[26](div3); - append_dev(div8, t3); - append_dev(div8, div4); + append2(div8, t3); + append2(div8, div4); ctx[27](div4); - append_dev(div8, t4); - append_dev(div8, div5); + append2(div8, t4); + append2(div8, div5); ctx[28](div5); - append_dev(div8, t5); - append_dev(div8, div6); + append2(div8, t5); + append2(div8, div6); ctx[29](div6); - append_dev(div8, t6); - append_dev(div8, div7); + append2(div8, t6); + append2(div8, div7); ctx[31](div7); - append_dev(main, t7); - append_dev(main, div10); - append_dev(div10, textarea); + append2(main, t7); + append2(main, div10); + append2(div10, textarea); set_input_value( textarea, /*commitMessage*/ ctx[2] ); - append_dev(div10, t8); + append2(div10, t8); if (if_block0) if_block0.m(div10, null); - append_dev(main, t9); - append_dev(main, div11); + append2(main, t9); + append2(main, div11); if (if_block1) if_block1.m(div11, null); current = true; if (!mounted) { dispose = [ - listen_dev( + listen( div0, "click", /*backup*/ - ctx[17], - false, - false, - false, - false + ctx[17] ), - listen_dev( + listen( div1, "click", /*commit*/ - ctx[16], - false, - false, - false, - false + ctx[16] ), - listen_dev( + listen( div2, "click", /*stageAll*/ - ctx[18], - false, - false, - false, - false + ctx[18] ), - listen_dev( + listen( div3, "click", /*unstageAll*/ - ctx[19], - false, - false, - false, - false + ctx[19] ), - listen_dev( + listen( div4, "click", /*push*/ - ctx[20], - false, - false, - false, - false + ctx[20] ), - listen_dev( + listen( div5, "click", /*pull*/ - ctx[21], - false, - false, - false, - false + ctx[21] ), - listen_dev( + listen( div6, "click", /*click_handler*/ - ctx[30], - false, - false, - false, - false + ctx[30] ), - listen_dev(div7, "click", triggerRefresh2, false, false, false, false), - listen_dev( + listen(div7, "click", triggerRefresh2), + listen( textarea, "input", /*textarea_input_handler*/ @@ -45029,7 +43391,7 @@ function create_fragment9(ctx) { mounted = true; } }, - p: function update2(ctx2, dirty) { + p(ctx2, dirty) { if (!current || dirty[0] & /*loading*/ 32) { toggle_class( @@ -45041,7 +43403,7 @@ function create_fragment9(ctx) { } if (!current || dirty[0] & /*rows*/ 32768) { - attr_dev( + attr( textarea, "rows", /*rows*/ @@ -45097,19 +43459,19 @@ function create_fragment9(ctx) { check_outros(); } }, - i: function intro(local) { + i(local) { if (current) return; transition_in(if_block1); current = true; }, - o: function outro(local) { + o(local) { transition_out(if_block1); current = false; }, - d: function destroy(detaching) { + d(detaching) { if (detaching) { - detach_dev(main); + detach(main); } ctx[23](null); ctx[24](null); @@ -45127,22 +43489,12 @@ function create_fragment9(ctx) { run_all(dispose); } }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment9.name, - type: "component", - source: "", - ctx - }); - return block; } function triggerRefresh2() { dispatchEvent(new CustomEvent("git-refresh")); } function instance9($$self, $$props, $$invalidate) { let rows; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("SourceControl", slots, []); let { plugin } = $$props; let { view } = $$props; let loading; @@ -45288,19 +43640,6 @@ function instance9($$self, $$props, $$invalidate) { } }); } - $$self.$$.on_mount.push(function() { - if (plugin === void 0 && !("plugin" in $$props || $$self.$$.bound[$$self.$$.props["plugin"]])) { - console.warn(" was created without expected prop 'plugin'"); - } - if (view === void 0 && !("view" in $$props || $$self.$$.bound[$$self.$$.props["view"]])) { - console.warn(" was created without expected prop 'view'"); - } - }); - const writable_props = ["plugin", "view"]; - Object.keys($$props).forEach((key2) => { - if (!~writable_props.indexOf(key2) && key2.slice(0, 2) !== "$$" && key2 !== "slot") - console.warn(` was created with unknown prop '${key2}'`); - }); function div0_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { buttons[5] = $$value; @@ -45380,84 +43719,6 @@ function instance9($$self, $$props, $$invalidate) { if ("view" in $$props2) $$invalidate(1, view = $$props2.view); }; - $$self.$capture_state = () => ({ - __awaiter, - Platform: import_obsidian29.Platform, - setIcon: import_obsidian29.setIcon, - SOURCE_CONTROL_VIEW_CONFIG, - FileType, - PluginState, - getDisplayPath, - onDestroy, - slide, - DiscardModal, - FileComponent: fileComponent_default, - PulledFileComponent: pulledFileComponent_default, - StagedFileComponent: stagedFileComponent_default, - TreeComponent: treeComponent_default, - plugin, - view, - loading, - status: status2, - lastPulledFiles, - commitMessage, - buttons, - changeHierarchy, - stagedHierarchy, - lastPulledFilesHierarchy, - changesOpen, - stagedOpen, - lastPulledFilesOpen, - showTree, - layoutBtn, - commit: commit2, - backup, - refresh, - triggerRefresh: triggerRefresh2, - stageAll, - unstageAll, - push: push2, - pull: pull2, - discard, - rows - }); - $$self.$inject_state = ($$props2) => { - if ("plugin" in $$props2) - $$invalidate(0, plugin = $$props2.plugin); - if ("view" in $$props2) - $$invalidate(1, view = $$props2.view); - if ("loading" in $$props2) - $$invalidate(5, loading = $$props2.loading); - if ("status" in $$props2) - $$invalidate(6, status2 = $$props2.status); - if ("lastPulledFiles" in $$props2) - $$invalidate(7, lastPulledFiles = $$props2.lastPulledFiles); - if ("commitMessage" in $$props2) - $$invalidate(2, commitMessage = $$props2.commitMessage); - if ("buttons" in $$props2) - $$invalidate(8, buttons = $$props2.buttons); - if ("changeHierarchy" in $$props2) - $$invalidate(9, changeHierarchy = $$props2.changeHierarchy); - if ("stagedHierarchy" in $$props2) - $$invalidate(10, stagedHierarchy = $$props2.stagedHierarchy); - if ("lastPulledFilesHierarchy" in $$props2) - $$invalidate(11, lastPulledFilesHierarchy = $$props2.lastPulledFilesHierarchy); - if ("changesOpen" in $$props2) - $$invalidate(12, changesOpen = $$props2.changesOpen); - if ("stagedOpen" in $$props2) - $$invalidate(13, stagedOpen = $$props2.stagedOpen); - if ("lastPulledFilesOpen" in $$props2) - $$invalidate(14, lastPulledFilesOpen = $$props2.lastPulledFilesOpen); - if ("showTree" in $$props2) - $$invalidate(3, showTree = $$props2.showTree); - if ("layoutBtn" in $$props2) - $$invalidate(4, layoutBtn = $$props2.layoutBtn); - if ("rows" in $$props2) - $$invalidate(15, rows = $$props2.rows); - }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } $$self.$$.update = () => { if ($$self.$$.dirty[0] & /*layoutBtn, showTree*/ 24) { @@ -45516,28 +43777,10 @@ function instance9($$self, $$props, $$invalidate) { click_handler_4 ]; } -var SourceControl = class extends SvelteComponentDev { +var SourceControl = class extends SvelteComponent { constructor(options) { - super(options); + super(); init2(this, options, instance9, create_fragment9, safe_not_equal, { plugin: 0, view: 1 }, add_css7, [-1, -1]); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "SourceControl", - options, - id: create_fragment9.name - }); - } - get plugin() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set plugin(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } - get view() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } - set view(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } }; var sourceControl_default = SourceControl; @@ -45732,9 +43975,9 @@ var ObsidianGit = class extends import_obsidian31.Plugin { name: "Open diff view", checkCallback: (checking) => { var _a2; - const file9 = this.app.workspace.getActiveFile(); + const file = this.app.workspace.getActiveFile(); if (checking) { - return file9 !== null; + return file !== null; } else { (_a2 = getNewLeaf()) == null ? void 0 : _a2.setViewState({ type: DIFF_VIEW_CONFIG.type, @@ -45742,7 +43985,7 @@ var ObsidianGit = class extends import_obsidian31.Plugin { state: { staged: false, file: this.gitManager.getRelativeRepoPath( - file9.path, + file.path, true ) } @@ -45753,17 +43996,17 @@ var ObsidianGit = class extends import_obsidian31.Plugin { this.addCommand({ id: "view-file-on-github", name: "Open file on GitHub", - editorCallback: (editor, { file: file9 }) => { - if (file9) - return openLineInGitHub(editor, file9, this.gitManager); + editorCallback: (editor, { file }) => { + if (file) + return openLineInGitHub(editor, file, this.gitManager); } }); this.addCommand({ id: "view-history-on-github", name: "Open file history on GitHub", - editorCallback: (_, { file: file9 }) => { - if (file9) - return openHistoryInGitHub(file9, this.gitManager); + editorCallback: (_, { file }) => { + if (file) + return openHistoryInGitHub(file, this.gitManager); } }); this.addCommand({ @@ -45785,14 +44028,14 @@ var ObsidianGit = class extends import_obsidian31.Plugin { id: "add-to-gitignore", name: "Add file to gitignore", checkCallback: (checking) => { - const file9 = this.app.workspace.getActiveFile(); + const file = this.app.workspace.getActiveFile(); if (checking) { - return file9 !== null; + return file !== null; } else { this.app.vault.adapter.append( this.gitManager.getRelativeVaultPath(".gitignore"), "\n" + this.gitManager.getRelativeRepoPath( - file9.path, + file.path, true ) ).then(() => { @@ -45881,11 +44124,11 @@ var ObsidianGit = class extends import_obsidian31.Plugin { id: "stage-current-file", name: "Stage current file", checkCallback: (checking) => { - const file9 = this.app.workspace.getActiveFile(); + const file = this.app.workspace.getActiveFile(); if (checking) { - return file9 !== null; + return file !== null; } else { - this.promiseQueue.addTask(() => this.stageFile(file9)); + this.promiseQueue.addTask(() => this.stageFile(file)); } } }); @@ -45893,11 +44136,11 @@ var ObsidianGit = class extends import_obsidian31.Plugin { id: "unstage-current-file", name: "Unstage current file", checkCallback: (checking) => { - const file9 = this.app.workspace.getActiveFile(); + const file = this.app.workspace.getActiveFile(); if (checking) { - return file9 !== null; + return file !== null; } else { - this.promiseQueue.addTask(() => this.unstageFile(file9)); + this.promiseQueue.addTask(() => this.unstageFile(file)); } } }); @@ -46021,8 +44264,8 @@ var ObsidianGit = class extends import_obsidian31.Plugin { } }); this.registerEvent( - this.app.workspace.on("file-menu", (menu, file9, source) => { - this.handleFileMenu(menu, file9, source); + this.app.workspace.on("file-menu", (menu, file, source) => { + this.handleFileMenu(menu, file, source); }) ); if (this.settings.showStatusBar) { @@ -46077,13 +44320,13 @@ var ObsidianGit = class extends import_obsidian31.Plugin { ); } } - handleFileMenu(menu, file9, source) { + handleFileMenu(menu, file, source) { if (!this.settings.showFileMenu) return; if (source !== "file-explorer-context-menu") { return; } - if (!file9) { + if (!file) { return; } if (!this.gitReady) @@ -46091,34 +44334,34 @@ var ObsidianGit = class extends import_obsidian31.Plugin { menu.addItem((item) => { item.setTitle(`Git: Stage`).setIcon("plus-circle").setSection("action").onClick((_) => { this.promiseQueue.addTask(async () => { - if (file9 instanceof import_obsidian31.TFile) { - await this.gitManager.stage(file9.path, true); + if (file instanceof import_obsidian31.TFile) { + await this.gitManager.stage(file.path, true); } else { await this.gitManager.stageAll({ dir: this.gitManager.getRelativeRepoPath( - file9.path, + file.path, true ) }); } - this.displayMessage(`Staged ${file9.path}`); + this.displayMessage(`Staged ${file.path}`); }); }); }); menu.addItem((item) => { item.setTitle(`Git: Unstage`).setIcon("minus-circle").setSection("action").onClick((_) => { this.promiseQueue.addTask(async () => { - if (file9 instanceof import_obsidian31.TFile) { - await this.gitManager.unstage(file9.path, true); + if (file instanceof import_obsidian31.TFile) { + await this.gitManager.unstage(file.path, true); } else { await this.gitManager.unstageAll({ dir: this.gitManager.getRelativeRepoPath( - file9.path, + file.path, true ) }); } - this.displayMessage(`Unstaged ${file9.path}`); + this.displayMessage(`Unstaged ${file.path}`); }); }); }); @@ -46524,11 +44767,11 @@ var ObsidianGit = class extends import_obsidian31.Plugin { const remoteUrl = await this.gitManager.getRemoteUrl(remote); if (remoteUrl == null ? void 0 : remoteUrl.includes("github.com")) { const tooBigFiles = files.filter((f) => { - const file9 = this.app.vault.getAbstractFileByPath( + const file = this.app.vault.getAbstractFileByPath( f.vault_path ); - if (file9 instanceof import_obsidian31.TFile) { - return file9.stat.size >= 1e8; + if (file instanceof import_obsidian31.TFile) { + return file.stat.size >= 1e8; } return false; }); @@ -46610,33 +44853,33 @@ var ObsidianGit = class extends import_obsidian31.Plugin { dispatchEvent(new CustomEvent("git-refresh")); } async mayDeleteConflictFile() { - const file9 = this.app.vault.getAbstractFileByPath( + const file = this.app.vault.getAbstractFileByPath( this.conflictOutputFile ); - if (file9) { + if (file) { this.app.workspace.iterateAllLeaves((leaf) => { var _a2; - if (leaf.view instanceof import_obsidian31.MarkdownView && ((_a2 = leaf.view.file) == null ? void 0 : _a2.path) == file9.path) { + if (leaf.view instanceof import_obsidian31.MarkdownView && ((_a2 = leaf.view.file) == null ? void 0 : _a2.path) == file.path) { leaf.detach(); } }); - await this.app.vault.delete(file9); + await this.app.vault.delete(file); } } - async stageFile(file9) { + async stageFile(file) { if (!await this.isAllInitialized()) return false; - await this.gitManager.stage(file9.path, true); - this.displayMessage(`Staged ${file9.path}`); + await this.gitManager.stage(file.path, true); + this.displayMessage(`Staged ${file.path}`); dispatchEvent(new CustomEvent("git-refresh")); this.setState(0 /* idle */); return true; } - async unstageFile(file9) { + async unstageFile(file) { if (!await this.isAllInitialized()) return false; - await this.gitManager.unstage(file9.path, true); - this.displayMessage(`Unstaged ${file9.path}`); + await this.gitManager.unstage(file.path, true); + this.displayMessage(`Unstaged ${file.path}`); dispatchEvent(new CustomEvent("git-refresh")); this.setState(0 /* idle */); return true; @@ -46898,10 +45141,10 @@ var ObsidianGit = class extends import_obsidian31.Plugin { "[[#Additional Instructions]] available below file list", "", ...conflicted.map((e) => { - const file9 = this.app.vault.getAbstractFileByPath(e); - if (file9 instanceof import_obsidian31.TFile) { + const file = this.app.vault.getAbstractFileByPath(e); + if (file instanceof import_obsidian31.TFile) { const link = this.app.metadataCache.fileToLinktext( - file9, + file, "/" ); return `- [[${link}]]`; @@ -47087,4 +45330,3 @@ feather-icons/dist/feather.js: http://jedwatson.github.io/classnames *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwgInBvbHlmaWxsX2J1ZmZlci5qcyIsICJub2RlX21vZHVsZXMvYXN5bmMtbG9jay9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2FzeW5jLWxvY2svaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCAibm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zaGEuanMvaGFzaC5qcyIsICJub2RlX21vZHVsZXMvc2hhLmpzL3NoYTEuanMiLCAibm9kZV9tb2R1bGVzL2NyYy0zMi9jcmMzMi5qcyIsICJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3RyZWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiLCAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcyIsICJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvc3RyaW5ncy5qcyIsICJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi96c3RyZWFtLmpzIiwgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi9kZWZsYXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcyIsICJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiLCAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMiLCAibm9kZV9tb2R1bGVzL3Bha28vbGliL2luZmxhdGUuanMiLCAibm9kZV9tb2R1bGVzL3Bha28vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3BpZnkvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lnbm9yZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY2xlYW4tZ2l0LXJlZi9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RpZmYzL29ucC5qcyIsICJub2RlX21vZHVsZXMvZGlmZjMvZGlmZjMuanMiLCAibm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvY29tbW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvQGt3c2l0ZXMvZmlsZS1leGlzdHMvc3JjL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9Aa3dzaXRlcy9maWxlLWV4aXN0cy9pbmRleC50cyIsICJub2RlX21vZHVsZXMvQGt3c2l0ZXMvcHJvbWlzZS1kZWZlcnJlZC9zcmMvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2NvbG9yLW5hbWUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2Nzcy11bml0LWNvbnZlcnRlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY3NzLWNvbG9yLWNvbnZlcnRlci9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2lzQXJndW1lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9vYmplY3Qta2V5cy9pbXBsZW1lbnRhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2VzLWVycm9ycy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXMtZXJyb3JzL2V2YWwuanMiLCAibm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yYW5nZS5qcyIsICJub2RlX21vZHVsZXMvZXMtZXJyb3JzL3JlZi5qcyIsICJub2RlX21vZHVsZXMvZXMtZXJyb3JzL3N5bnRheC5qcyIsICJub2RlX21vZHVsZXMvZXMtZXJyb3JzL3R5cGUuanMiLCAibm9kZV9tb2R1bGVzL2VzLWVycm9ycy91cmkuanMiLCAibm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL3NoYW1zLmpzIiwgIm5vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaGFzLXByb3RvL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2ltcGxlbWVudGF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9oYXNvd24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2dldC1pbnRyaW5zaWMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2VzLWRlZmluZS1wcm9wZXJ0eS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZ29wZC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGVmaW5lLWRhdGEtcHJvcGVydHkvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGVmaW5lLXByb3BlcnRpZXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3NldC1mdW5jdGlvbi1sZW5ndGgvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcyIsICJub2RlX21vZHVsZXMvb2JqZWN0LmFzc2lnbi9pbXBsZW1lbnRhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvb2JqZWN0LmFzc2lnbi9wb2x5ZmlsbC5qcyIsICJub2RlX21vZHVsZXMvb2JqZWN0LmFzc2lnbi9zaGltLmpzIiwgIm5vZGVfbW9kdWxlcy9vYmplY3QuYXNzaWduL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9mdW5jdGlvbnMtaGF2ZS1uYW1lcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc2V0LWZ1bmN0aW9uLW5hbWUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3MvaW1wbGVtZW50YXRpb24uanMiLCAibm9kZV9tb2R1bGVzL3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3MvcG9seWZpbGwuanMiLCAibm9kZV9tb2R1bGVzL3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3Mvc2hpbS5qcyIsICJub2RlX21vZHVsZXMvcmVnZXhwLnByb3RvdHlwZS5mbGFncy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaGFzLXRvc3RyaW5ndGFnL3NoYW1zLmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1hcmd1bWVudHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL29iamVjdC1pbnNwZWN0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2ludGVybmFsLXNsb3QvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3N0b3AtaXRlcmF0aW9uLWl0ZXJhdG9yL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1zdHJpbmcvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lzLW1hcC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaXMtc2V0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9lcy1nZXQtaXRlcmF0b3IvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL29iamVjdC1pcy9pbXBsZW1lbnRhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvb2JqZWN0LWlzL3BvbHlmaWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9vYmplY3QtaXMvc2hpbS5qcyIsICJub2RlX21vZHVsZXMvb2JqZWN0LWlzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1hcnJheS1idWZmZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lzLWRhdGUtb2JqZWN0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1yZWdleC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaXMtc2hhcmVkLWFycmF5LWJ1ZmZlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaXMtbnVtYmVyLW9iamVjdC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaXMtYm9vbGVhbi1vYmplY3QvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lzLXN5bWJvbC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaGFzLWJpZ2ludHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lzLWJpZ2ludC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvd2hpY2gtYm94ZWQtcHJpbWl0aXZlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy13ZWFrbWFwL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy13ZWFrc2V0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy93aGljaC1jb2xsZWN0aW9uL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1jYWxsYWJsZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZm9yLWVhY2gvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3Bvc3NpYmxlLXR5cGVkLWFycmF5LW5hbWVzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9hdmFpbGFibGUtdHlwZWQtYXJyYXlzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy93aGljaC10eXBlZC1hcnJheS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYXJyYXktYnVmZmVyLWJ5dGUtbGVuZ3RoL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kZWVwLWVxdWFsL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9qcy1zaGEyNTYvc3JjL3NoYTI1Ni5qcyIsICJub2RlX21vZHVsZXMvaG9nYW4uanMvbGliL2NvbXBpbGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9ob2dhbi5qcy9saWIvdGVtcGxhdGUuanMiLCAibm9kZV9tb2R1bGVzL2hvZ2FuLmpzL2xpYi9ob2dhbi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci93ZWJwYWNrL2Jvb3RzdHJhcCIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NsYXNzbmFtZXMvZGVkdXBlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9mcm9tLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZyb20uanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdG8tc3RyaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGRlbi1rZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LWdsb2JhbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1hdC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtc2V0LXByb3RvdHlwZS1vZi1hcmd1bWVudHMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9zcmMvaWNvbi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL2ljb25zLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9zcmMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL3NyYy9yZXBsYWNlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9zcmMvdG8tc3ZnLmpzIiwgInNyYy9tYWluLnRzIiwgIm5vZGVfbW9kdWxlcy9pc29tb3JwaGljLWdpdC9pbmRleC5qcyIsICJzcmMvbGluZUF1dGhvci9saW5lQXV0aG9ySW50ZWdyYXRpb24udHMiLCAic3JjL2dpdE1hbmFnZXIvc2ltcGxlR2l0LnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZXJyb3JzL2dpdC1lcnJvci50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL2Vycm9ycy9naXQtcmVzcG9uc2UtZXJyb3IudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9lcnJvcnMvdGFzay1jb25maWd1cmF0aW9uLWVycm9yLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdXRpbHMvdXRpbC50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL2FyZ3VtZW50LWZpbHRlcnMudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy9leGl0LWNvZGVzLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdXRpbHMvZ2l0LW91dHB1dC1zdHJlYW1zLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdXRpbHMvbGluZS1wYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy9zaW1wbGUtZ2l0LW9wdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy90YXNrLW9wdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy90YXNrLXBhcnNlci50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvY2hlY2staXMtcmVwby50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9DbGVhblN1bW1hcnkudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy90YXNrLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvY2xlYW4udHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvQ29uZmlnTGlzdC50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2NvbmZpZy50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2dyZXAudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9yZXNldC50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL2dpdC1sb2dnZXIudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9ydW5uZXJzL3Rhc2tzLXBlbmRpbmctcXVldWUudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9ydW5uZXJzL2dpdC1leGVjdXRvci1jaGFpbi50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3J1bm5lcnMvZ2l0LWV4ZWN1dG9yLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFzay1jYWxsYmFjay50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2NoYW5nZS13b3JraW5nLWRpcmVjdG9yeS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2NoZWNrb3V0LnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1jb21taXQudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9jb21taXQudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9oYXNoLW9iamVjdC50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9Jbml0U3VtbWFyeS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2luaXQudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9hcmdzL2xvZy1mb3JtYXQudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvRGlmZlN1bW1hcnkudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLWRpZmYtc3VtbWFyeS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtbGlzdC1sb2ctc3VtbWFyeS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2RpZmYudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9sb2cudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvTWVyZ2VTdW1tYXJ5LnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcmVzcG9uc2VzL1B1bGxTdW1tYXJ5LnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1yZW1vdGUtb2JqZWN0cy50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtcmVtb3RlLW1lc3NhZ2VzLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1wdWxsLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1tZXJnZS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL21lcmdlLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1wdXNoLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvcHVzaC50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9GaWxlU3RhdHVzU3VtbWFyeS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9TdGF0dXNTdW1tYXJ5LnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3Mvc3RhdHVzLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvdmVyc2lvbi50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3NpbXBsZS1naXQtYXBpLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy9zY2hlZHVsZXIudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9hcHBseS1wYXRjaC50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9CcmFuY2hEZWxldGVTdW1tYXJ5LnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1icmFuY2gtZGVsZXRlLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcmVzcG9uc2VzL0JyYW5jaFN1bW1hcnkudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLWJyYW5jaC50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2JyYW5jaC50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9DaGVja0lnbm9yZS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2NoZWNrLWlnbm9yZS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2Nsb25lLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1mZXRjaC50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2ZldGNoLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1tb3ZlLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvbW92ZS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3B1bGwudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvR2V0UmVtb3RlU3VtbWFyeS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3JlbW90ZS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3N0YXNoLWxpc3QudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9zdWItbW9kdWxlLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcmVzcG9uc2VzL1RhZ0xpc3QudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy90YWcudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2dpdC5qcyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL2Vycm9ycy9naXQtY29uc3RydWN0LWVycm9yLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvYXBpLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZXJyb3JzL2dpdC1wbHVnaW4tZXJyb3IudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wbHVnaW5zL2Fib3J0LXBsdWdpbi50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BsdWdpbnMvYmxvY2stdW5zYWZlLW9wZXJhdGlvbnMtcGx1Z2luLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGx1Z2lucy9jb21tYW5kLWNvbmZpZy1wcmVmaXhpbmctcGx1Z2luLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGx1Z2lucy9jb21wbGV0aW9uLWRldGVjdGlvbi5wbHVnaW4udHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wbHVnaW5zL2Vycm9yLWRldGVjdGlvbi5wbHVnaW4udHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wbHVnaW5zL3BsdWdpbi1zdG9yZS50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BsdWdpbnMvcHJvZ3Jlc3MtbW9uaXRvci1wbHVnaW4udHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wbHVnaW5zL3NwYXduLW9wdGlvbnMtcGx1Z2luLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGx1Z2lucy90aW1vdXQtcGx1Z2luLnRzIiwgIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZ2l0LWZhY3RvcnkudHMiLCAibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9ydW5uZXJzL3Byb21pc2Utd3JhcHBlZC50cyIsICJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvZXNtLm1qcyIsICJzcmMvY29uc3RhbnRzLnRzIiwgInNyYy90eXBlcy50cyIsICJzcmMvdXRpbHMudHMiLCAic3JjL2dpdE1hbmFnZXIvZ2l0TWFuYWdlci50cyIsICJzcmMvbGluZUF1dGhvci9saW5lQXV0aG9yUHJvdmlkZXIudHMiLCAic3JjL2xpbmVBdXRob3IvY29udHJvbC50cyIsICJzcmMvbGluZUF1dGhvci9ldmVudHNQZXJGaWxlcGF0aC50cyIsICJzcmMvbGluZUF1dGhvci9tb2RlbC50cyIsICJzcmMvc2V0dGluZy9zZXR0aW5ncy50cyIsICJzcmMvZ2l0TWFuYWdlci9pc29tb3JwaGljR2l0LnRzIiwgIm5vZGVfbW9kdWxlcy9kaWZmL2xpYi9pbmRleC5tanMiLCAic3JjL3VpL21vZGFscy9nZW5lcmFsTW9kYWwudHMiLCAic3JjL2dpdE1hbmFnZXIvbXlBZGFwdGVyLnRzIiwgInNyYy9saW5lQXV0aG9yL3ZpZXcvY2FjaGUudHMiLCAic3JjL2xpbmVBdXRob3Ivdmlldy92aWV3LnRzIiwgInNyYy9saW5lQXV0aG9yL3ZpZXcvZ3V0dGVyL2d1dHRlci50cyIsICJzcmMvbGluZUF1dGhvci92aWV3L2NvbnRleHRNZW51LnRzIiwgInNyYy9saW5lQXV0aG9yL3ZpZXcvZ3V0dGVyL2d1dHRlckVsZW1lbnRTZWFyY2gudHMiLCAic3JjL3BsdWdpbkdsb2JhbFJlZi50cyIsICJzcmMvbGluZUF1dGhvci92aWV3L2d1dHRlci9jb2xvcmluZy50cyIsICJzcmMvbGluZUF1dGhvci92aWV3L2d1dHRlci9jb21taXRDaG9pY2UudHMiLCAic3JjL2xpbmVBdXRob3Ivdmlldy9ndXR0ZXIvaW5pdGlhbC50cyIsICJzcmMvbGluZUF1dGhvci92aWV3L2d1dHRlci91bnRyYWNrZWRGaWxlLnRzIiwgInNyYy9wcm9taXNlUXVldWUudHMiLCAic3JjL3N0YXR1c0Jhci50cyIsICJzcmMvdWkvbW9kYWxzL2NoYW5nZWRGaWxlc01vZGFsLnRzIiwgInNyYy91aS9tb2RhbHMvY3VzdG9tTWVzc2FnZU1vZGFsLnRzIiwgInNyYy9vcGVuSW5HaXRIdWIudHMiLCAic3JjL3NldHRpbmcvbG9jYWxTdG9yYWdlU2V0dGluZ3MudHMiLCAic3JjL3VpL2RpZmYvZGlmZlZpZXcudHMiLCAibm9kZV9tb2R1bGVzL2RpZmYyaHRtbC9zcmMvZGlmZjJodG1sLnRzIiwgIm5vZGVfbW9kdWxlcy9kaWZmMmh0bWwvc3JjL2RpZmYtcGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9kaWZmMmh0bWwvc3JjL3R5cGVzLnRzIiwgIm5vZGVfbW9kdWxlcy9kaWZmMmh0bWwvc3JjL3V0aWxzLnRzIiwgIm5vZGVfbW9kdWxlcy9kaWZmMmh0bWwvc3JjL2ZpbGUtbGlzdC1yZW5kZXJlci50cyIsICJub2RlX21vZHVsZXMvZGlmZjJodG1sL3NyYy9yZW5kZXItdXRpbHMudHMiLCAibm9kZV9tb2R1bGVzL2RpZmYyaHRtbC9ub2RlX21vZHVsZXMvZGlmZi9saWIvaW5kZXgubWpzIiwgIm5vZGVfbW9kdWxlcy9kaWZmMmh0bWwvc3JjL3JlbWF0Y2gudHMiLCAibm9kZV9tb2R1bGVzL2RpZmYyaHRtbC9zcmMvbGluZS1ieS1saW5lLXJlbmRlcmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9kaWZmMmh0bWwvc3JjL3NpZGUtYnktc2lkZS1yZW5kZXJlci50cyIsICJub2RlX21vZHVsZXMvZGlmZjJodG1sL3NyYy9ob2dhbmpzLXV0aWxzLnRzIiwgIm5vZGVfbW9kdWxlcy9kaWZmMmh0bWwvc3JjL2RpZmYyaHRtbC10ZW1wbGF0ZXMudHMiLCAic3JjL3VpL2hpc3RvcnkvaGlzdG9yeVZpZXcudHMiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS9zcmMvcnVudGltZS9pbnRlcm5hbC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9ydW50aW1lL2ludGVybmFsL2FuaW1hdGlvbnMuanMiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS9zcmMvcnVudGltZS9pbnRlcm5hbC91dGlscy5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9ydW50aW1lL2ludGVybmFsL2Vudmlyb25tZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUvc3JjL3J1bnRpbWUvaW50ZXJuYWwvbG9vcC5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9ydW50aW1lL2ludGVybmFsL3N0eWxlX21hbmFnZXIuanMiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS9zcmMvcnVudGltZS9pbnRlcm5hbC9kb20uanMiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS9zcmMvcnVudGltZS9pbnRlcm5hbC9SZXNpemVPYnNlcnZlclNpbmdsZXRvbi5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9ydW50aW1lL2ludGVybmFsL2dsb2JhbHMuanMiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS9zcmMvcnVudGltZS9pbnRlcm5hbC9hd2FpdF9ibG9jay5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9ydW50aW1lL2ludGVybmFsL3RyYW5zaXRpb25zLmpzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUvc3JjL3J1bnRpbWUvaW50ZXJuYWwvc2NoZWR1bGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUvc3JjL3J1bnRpbWUvaW50ZXJuYWwvbGlmZWN5Y2xlLmpzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUvc3JjL3J1bnRpbWUvaW50ZXJuYWwvZWFjaC5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9ydW50aW1lL2ludGVybmFsL3NwcmVhZC5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9ydW50aW1lL2ludGVybmFsL3Nzci5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9zaGFyZWQvYm9vbGVhbl9hdHRyaWJ1dGVzLmpzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUvc3JjL3NoYXJlZC91dGlscy9uYW1lcy5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9ydW50aW1lL2ludGVybmFsL0NvbXBvbmVudC5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9ydW50aW1lL2ludGVybmFsL2Rldi5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9zaGFyZWQvdmVyc2lvbi5qcyIsICJub2RlX21vZHVsZXMvc3ZlbHRlL3NyYy9ydW50aW1lL2ludGVybmFsL2Rpc2Nsb3NlLXZlcnNpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS9zcmMvcnVudGltZS9pbmRleC5qcyIsICJzcmMvdWkvaGlzdG9yeS9jb21wb25lbnRzL2xvZ0NvbXBvbmVudC5zdmVsdGUiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS9zcmMvcnVudGltZS90cmFuc2l0aW9uL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUvc3JjL3J1bnRpbWUvZWFzaW5nL2luZGV4LmpzIiwgInNyYy91aS9oaXN0b3J5L2NvbXBvbmVudHMvbG9nRmlsZUNvbXBvbmVudC5zdmVsdGUiLCAic3JjL3VpL2hpc3RvcnkvY29tcG9uZW50cy9sb2dUcmVlQ29tcG9uZW50LnN2ZWx0ZSIsICJzcmMvdWkvaGlzdG9yeS9oaXN0b3J5Vmlldy5zdmVsdGUiLCAic3JjL3VpL21vZGFscy9icmFuY2hNb2RhbC50cyIsICJzcmMvdWkvbW9kYWxzL2lnbm9yZU1vZGFsLnRzIiwgInNyYy91aS9zb3VyY2VDb250cm9sL3NvdXJjZUNvbnRyb2wudHMiLCAic3JjL3VpL21vZGFscy9kaXNjYXJkTW9kYWwudHMiLCAic3JjL3VpL3NvdXJjZUNvbnRyb2wvY29tcG9uZW50cy9maWxlQ29tcG9uZW50LnN2ZWx0ZSIsICJub2RlX21vZHVsZXMvb2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9vYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHMuanMiLCAic3JjL3VpL3NvdXJjZUNvbnRyb2wvY29tcG9uZW50cy9wdWxsZWRGaWxlQ29tcG9uZW50LnN2ZWx0ZSIsICJzcmMvdWkvc291cmNlQ29udHJvbC9jb21wb25lbnRzL3N0YWdlZEZpbGVDb21wb25lbnQuc3ZlbHRlIiwgInNyYy91aS9zb3VyY2VDb250cm9sL2NvbXBvbmVudHMvdHJlZUNvbXBvbmVudC5zdmVsdGUiLCAic3JjL3VpL3NvdXJjZUNvbnRyb2wvc291cmNlQ29udHJvbC5zdmVsdGUiLCAic3JjL3VpL3N0YXR1c0Jhci9icmFuY2hTdGF0dXNCYXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwgIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCAiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbmNvbnN0IGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbmNvbnN0IGN1c3RvbUluc3BlY3RTeW1ib2wgPVxuICAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sWydmb3InXSA9PT0gJ2Z1bmN0aW9uJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICA/IFN5bWJvbFsnZm9yJ10oJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICA6IG51bGxcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG5jb25zdCBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGNvbnN0IHByb3RvID0geyBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0gfVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90bywgVWludDhBcnJheS5wcm90b3R5cGUpXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGFyciwgcHJvdG8pXG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDJcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAncGFyZW50Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ1ZmZlclxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAobGVuZ3RoKSB7XG4gIGlmIChsZW5ndGggPiBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIGxlbmd0aCArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSlcbiAgcmV0dXJuIGJ1ZlxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKGFyZylcbiAgfVxuICByZXR1cm4gZnJvbShhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbmZ1bmN0aW9uIGZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheVZpZXcodmFsdWUpXG4gIH1cblxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gICAgKVxuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fFxuICAgICAgKHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBBcnJheUJ1ZmZlcikpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIChpc0luc3RhbmNlKHZhbHVlLCBTaGFyZWRBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgU2hhcmVkQXJyYXlCdWZmZXIpKSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgKVxuICB9XG5cbiAgY29uc3QgdmFsdWVPZiA9IHZhbHVlLnZhbHVlT2YgJiYgdmFsdWUudmFsdWVPZigpXG4gIGlmICh2YWx1ZU9mICE9IG51bGwgJiYgdmFsdWVPZiAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVPZiwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgY29uc3QgYiA9IGZyb21PYmplY3QodmFsdWUpXG4gIGlmIChiKSByZXR1cm4gYlxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSgnc3RyaW5nJyksIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIE5vdGU6IENoYW5nZSBwcm90b3R5cGUgKmFmdGVyKiBCdWZmZXIuZnJvbSBpcyBkZWZpbmVkIHRvIHdvcmthcm91bmQgQ2hyb21lIGJ1Zzpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvMTQ4XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLnByb3RvdHlwZSwgVWludDhBcnJheS5wcm90b3R5cGUpXG5PYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLCBVaW50OEFycmF5KVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gIH1cblxuICBjb25zdCBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICBsZXQgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcblxuICBjb25zdCBhY3R1YWwgPSBidWYud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIGJ1ZiA9IGJ1Zi5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKGFycmF5KSB7XG4gIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICBjb25zdCBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgYnVmW2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheVZpZXcgKGFycmF5Vmlldykge1xuICBpZiAoaXNJbnN0YW5jZShhcnJheVZpZXcsIFVpbnQ4QXJyYXkpKSB7XG4gICAgY29uc3QgY29weSA9IG5ldyBVaW50OEFycmF5KGFycmF5VmlldylcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKGNvcHkuYnVmZmVyLCBjb3B5LmJ5dGVPZmZzZXQsIGNvcHkuYnl0ZUxlbmd0aClcbiAgfVxuICByZXR1cm4gZnJvbUFycmF5TGlrZShhcnJheVZpZXcpXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJvZmZzZXRcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBsZXQgYnVmXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVmLCBCdWZmZXIucHJvdG90eXBlKVxuXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAob2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIGNvbnN0IGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgY29uc3QgYnVmID0gY3JlYXRlQnVmZmVyKGxlbilcblxuICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYnVmXG4gICAgfVxuXG4gICAgb2JqLmNvcHkoYnVmLCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoMClcbiAgICB9XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKVxuICB9XG5cbiAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlciA9PT0gdHJ1ZSAmJlxuICAgIGIgIT09IEJ1ZmZlci5wcm90b3R5cGUgLy8gc28gQnVmZmVyLmlzQnVmZmVyKEJ1ZmZlci5wcm90b3R5cGUpIHdpbGwgYmUgZmFsc2Vcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmIChpc0luc3RhbmNlKGEsIFVpbnQ4QXJyYXkpKSBhID0gQnVmZmVyLmZyb20oYSwgYS5vZmZzZXQsIGEuYnl0ZUxlbmd0aClcbiAgaWYgKGlzSW5zdGFuY2UoYiwgVWludDhBcnJheSkpIGIgPSBCdWZmZXIuZnJvbShiLCBiLm9mZnNldCwgYi5ieXRlTGVuZ3RoKVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5J1xuICAgIClcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIGxldCB4ID0gYS5sZW5ndGhcbiAgbGV0IHkgPSBiLmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgbGV0IGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICBsZXQgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIGxldCBidWYgPSBsaXN0W2ldXG4gICAgaWYgKGlzSW5zdGFuY2UoYnVmLCBVaW50OEFycmF5KSkge1xuICAgICAgaWYgKHBvcyArIGJ1Zi5sZW5ndGggPiBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1ZilcbiAgICAgICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgYnVmLFxuICAgICAgICAgIHBvc1xuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIH1cbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBpc0luc3RhbmNlKHN0cmluZywgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgY29uc3QgbXVzdE1hdGNoID0gKGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gdHJ1ZSlcbiAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICBsZXQgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB7XG4gICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA/IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgfVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJjaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCAoYW5kIHRoZSBgaXMtYnVmZmVyYCBucG0gcGFja2FnZSlcbi8vIHRvIGRldGVjdCBhIEJ1ZmZlciBpbnN0YW5jZS4gSXQncyBub3QgcG9zc2libGUgdG8gdXNlIGBpbnN0YW5jZW9mIEJ1ZmZlcmBcbi8vIHJlbGlhYmx5IGluIGEgYnJvd3NlcmlmeSBjb250ZXh0IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50XG4vLyBjb3BpZXMgb2YgdGhlICdidWZmZXInIHBhY2thZ2UgaW4gdXNlLiBUaGlzIG1ldGhvZCB3b3JrcyBldmVuIGZvciBCdWZmZXJcbi8vIGluc3RhbmNlcyB0aGF0IHdlcmUgY3JlYXRlZCBmcm9tIGFub3RoZXIgY29weSBvZiB0aGUgYGJ1ZmZlcmAgcGFja2FnZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE1NFxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgY29uc3QgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nXG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgbGV0IHN0ciA9ICcnXG4gIGNvbnN0IG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5yZXBsYWNlKC8oLnsyfSkvZywgJyQxICcpLnRyaW0oKVxuICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5pZiAoY3VzdG9tSW5zcGVjdFN5bWJvbCkge1xuICBCdWZmZXIucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmIChpc0luc3RhbmNlKHRhcmdldCwgVWludDhBcnJheSkpIHtcbiAgICB0YXJnZXQgPSBCdWZmZXIuZnJvbSh0YXJnZXQsIHRhcmdldC5vZmZzZXQsIHRhcmdldC5ieXRlTGVuZ3RoKVxuICB9XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdGFyZ2V0KVxuICAgIClcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIGxldCB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICBsZXQgeSA9IGVuZCAtIHN0YXJ0XG4gIGNvbnN0IGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgY29uc3QgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgY29uc3QgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgW3ZhbF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIGxldCBpbmRleFNpemUgPSAxXG4gIGxldCBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIGxldCB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIGxldCBpXG4gIGlmIChkaXIpIHtcbiAgICBsZXQgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBsZXQgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIGNvbnN0IHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBsZXQgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPj4+IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICBjb25zdCByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIGxldCBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgY29uc3QgcmVzID0gW11cblxuICBsZXQgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgY29uc3QgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgbGV0IGNvZGVQb2ludCA9IG51bGxcbiAgICBsZXQgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKVxuICAgICAgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKVxuICAgICAgICAgID8gM1xuICAgICAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpXG4gICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIGxldCBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbmNvbnN0IE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICBjb25zdCBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIGxldCByZXMgPSAnJ1xuICBsZXQgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgbGV0IHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGxldCByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGNvbnN0IGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICBsZXQgb3V0ID0gJydcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gaGV4U2xpY2VMb29rdXBUYWJsZVtidWZbaV1dXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBjb25zdCBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICBsZXQgcmVzID0gJydcbiAgLy8gSWYgYnl0ZXMubGVuZ3RoIGlzIG9kZCwgdGhlIGxhc3QgOCBiaXRzIG11c3QgYmUgaWdub3JlZCAoc2FtZSBhcyBub2RlLmpzKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgKGJ5dGVzW2kgKyAxXSAqIDI1NikpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICBjb25zdCBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdCdWYsIEJ1ZmZlci5wcm90b3R5cGUpXG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludExFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0XVxuICBsZXQgbXVsID0gMVxuICBsZXQgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50QkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICBsZXQgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIGxldCBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2TEUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTZCRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDMyQkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NExFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgbG8gPSBmaXJzdCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDI0XG5cbiAgY29uc3QgaGkgPSB0aGlzWysrb2Zmc2V0XSArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgbGFzdCAqIDIgKiogMjRcblxuICByZXR1cm4gQmlnSW50KGxvKSArIChCaWdJbnQoaGkpIDw8IEJpZ0ludCgzMikpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRCaWdVSW50NjRCRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiByZWFkQmlnVUludDY0QkUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCBoaSA9IGZpcnN0ICogMiAqKiAyNCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF1cblxuICBjb25zdCBsbyA9IHRoaXNbKytvZmZzZXRdICogMiAqKiAyNCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgbGFzdFxuXG4gIHJldHVybiAoQmlnSW50KGhpKSA8PCBCaWdJbnQoMzIpKSArIEJpZ0ludChsbylcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldF1cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICBsZXQgaSA9IGJ5dGVMZW5ndGhcbiAgbGV0IG11bCA9IDFcbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIGNvbnN0IHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiByZWFkQmlnSW50NjRMRSAob2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XVxuICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XVxuICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOClcbiAgfVxuXG4gIGNvbnN0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgNF0gK1xuICAgIHRoaXNbb2Zmc2V0ICsgNV0gKiAyICoqIDggK1xuICAgIHRoaXNbb2Zmc2V0ICsgNl0gKiAyICoqIDE2ICtcbiAgICAobGFzdCA8PCAyNCkgLy8gT3ZlcmZsb3dcblxuICByZXR1cm4gKEJpZ0ludCh2YWwpIDw8IEJpZ0ludCgzMikpICtcbiAgICBCaWdJbnQoZmlyc3QgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAyNClcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ0ludDY0QkUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCB2YWwgPSAoZmlyc3QgPDwgMjQpICsgLy8gT3ZlcmZsb3dcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XVxuXG4gIHJldHVybiAoQmlnSW50KHZhbCkgPDwgQmlnSW50KDMyKSkgK1xuICAgIEJpZ0ludCh0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIGxhc3QpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICBsZXQgbXVsID0gMVxuICBsZXQgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludEJFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjb25zdCBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIGxldCBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgbGV0IG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50OCA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQxNkxFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTZCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyTEUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQzMkJFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIHdydEJpZ1VJbnQ2NExFIChidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7XG4gIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNylcblxuICBsZXQgbG8gPSBOdW1iZXIodmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsZXQgaGkgPSBOdW1iZXIodmFsdWUgPj4gQmlnSW50KDMyKSAmIEJpZ0ludCgweGZmZmZmZmZmKSlcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0KytdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIHJldHVybiBvZmZzZXRcbn1cblxuZnVuY3Rpb24gd3J0QmlnVUludDY0QkUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbWluLCBtYXgpIHtcbiAgY2hlY2tJbnRCSSh2YWx1ZSwgbWluLCBtYXgsIGJ1Ziwgb2Zmc2V0LCA3KVxuXG4gIGxldCBsbyA9IE51bWJlcih2YWx1ZSAmIEJpZ0ludCgweGZmZmZmZmZmKSlcbiAgYnVmW29mZnNldCArIDddID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQgKyA2XSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0ICsgNV0gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCArIDRdID0gbG9cbiAgbGV0IGhpID0gTnVtYmVyKHZhbHVlID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQgKyAzXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0ICsgMl0gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCArIDFdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXRdID0gaGlcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnVUludDY0TEUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRMRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBCaWdJbnQoMCksIEJpZ0ludCgnMHhmZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdVSW50NjRCRSAodmFsdWUsIG9mZnNldCA9IDApIHtcbiAgcmV0dXJuIHdydEJpZ1VJbnQ2NEJFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIEJpZ0ludCgwKSwgQmlnSW50KCcweGZmZmZmZmZmZmZmZmZmZmYnKSlcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgbGV0IGkgPSAwXG4gIGxldCBtdWwgPSAxXG4gIGxldCBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgbGV0IGkgPSBieXRlTGVuZ3RoIC0gMVxuICBsZXQgbXVsID0gMVxuICBsZXQgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NExFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0TEUodGhpcywgdmFsdWUsIG9mZnNldCwgLUJpZ0ludCgnMHg4MDAwMDAwMDAwMDAwMDAwJyksIEJpZ0ludCgnMHg3ZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ0ludDY0QkUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRCRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAtQmlnSW50KCcweDgwMDAwMDAwMDAwMDAwMDAnKSwgQmlnSW50KCcweDdmZmZmZmZmZmZmZmZmZmYnKSlcbn0pXG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICBjb25zdCBsZW4gPSBlbmQgLSBzdGFydFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBVc2UgYnVpbHQtaW4gd2hlbiBhdmFpbGFibGUsIG1pc3NpbmcgZnJvbSBJRTExXG4gICAgdGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKChlbmNvZGluZyA9PT0gJ3V0ZjgnICYmIGNvZGUgPCAxMjgpIHx8XG4gICAgICAgICAgZW5jb2RpbmcgPT09ICdsYXRpbjEnKSB7XG4gICAgICAgIC8vIEZhc3QgcGF0aDogSWYgYHZhbGAgZml0cyBpbnRvIGEgc2luZ2xlIGJ5dGUsIHVzZSB0aGF0IG51bWVyaWMgdmFsdWUuXG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICB2YWwgPSBOdW1iZXIodmFsKVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIGxldCBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgICBjb25zdCBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInICsgdmFsICtcbiAgICAgICAgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpXG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIENVU1RPTSBFUlJPUlNcbi8vID09PT09PT09PT09PT1cblxuLy8gU2ltcGxpZmllZCB2ZXJzaW9ucyBmcm9tIE5vZGUsIGNoYW5nZWQgZm9yIEJ1ZmZlci1vbmx5IHVzYWdlXG5jb25zdCBlcnJvcnMgPSB7fVxuZnVuY3Rpb24gRSAoc3ltLCBnZXRNZXNzYWdlLCBCYXNlKSB7XG4gIGVycm9yc1tzeW1dID0gY2xhc3MgTm9kZUVycm9yIGV4dGVuZHMgQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgc3VwZXIoKVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21lc3NhZ2UnLCB7XG4gICAgICAgIHZhbHVlOiBnZXRNZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIC8vIEFkZCB0aGUgZXJyb3IgY29kZSB0byB0aGUgbmFtZSB0byBpbmNsdWRlIGl0IGluIHRoZSBzdGFjayB0cmFjZS5cbiAgICAgIHRoaXMubmFtZSA9IGAke3RoaXMubmFtZX0gWyR7c3ltfV1gXG4gICAgICAvLyBBY2Nlc3MgdGhlIHN0YWNrIHRvIGdlbmVyYXRlIHRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGluZyB0aGUgZXJyb3IgY29kZVxuICAgICAgLy8gZnJvbSB0aGUgbmFtZS5cbiAgICAgIHRoaXMuc3RhY2sgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgIC8vIFJlc2V0IHRoZSBuYW1lIHRvIHRoZSBhY3R1YWwgbmFtZS5cbiAgICAgIGRlbGV0ZSB0aGlzLm5hbWVcbiAgICB9XG5cbiAgICBnZXQgY29kZSAoKSB7XG4gICAgICByZXR1cm4gc3ltXG4gICAgfVxuXG4gICAgc2V0IGNvZGUgKHZhbHVlKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvZGUnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRvU3RyaW5nICgpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske3N5bX1dOiAke3RoaXMubWVzc2FnZX1gXG4gICAgfVxuICB9XG59XG5cbkUoJ0VSUl9CVUZGRVJfT1VUX09GX0JPVU5EUycsXG4gIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiBgJHtuYW1lfSBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHNgXG4gICAgfVxuXG4gICAgcmV0dXJuICdBdHRlbXB0IHRvIGFjY2VzcyBtZW1vcnkgb3V0c2lkZSBidWZmZXIgYm91bmRzJ1xuICB9LCBSYW5nZUVycm9yKVxuRSgnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICBmdW5jdGlvbiAobmFtZSwgYWN0dWFsKSB7XG4gICAgcmV0dXJuIGBUaGUgXCIke25hbWV9XCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAke3R5cGVvZiBhY3R1YWx9YFxuICB9LCBUeXBlRXJyb3IpXG5FKCdFUlJfT1VUX09GX1JBTkdFJyxcbiAgZnVuY3Rpb24gKHN0ciwgcmFuZ2UsIGlucHV0KSB7XG4gICAgbGV0IG1zZyA9IGBUaGUgdmFsdWUgb2YgXCIke3N0cn1cIiBpcyBvdXQgb2YgcmFuZ2UuYFxuICAgIGxldCByZWNlaXZlZCA9IGlucHV0XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5wdXQpICYmIE1hdGguYWJzKGlucHV0KSA+IDIgKiogMzIpIHtcbiAgICAgIHJlY2VpdmVkID0gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKFN0cmluZyhpbnB1dCkpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdiaWdpbnQnKSB7XG4gICAgICByZWNlaXZlZCA9IFN0cmluZyhpbnB1dClcbiAgICAgIGlmIChpbnB1dCA+IEJpZ0ludCgyKSAqKiBCaWdJbnQoMzIpIHx8IGlucHV0IDwgLShCaWdJbnQoMikgKiogQmlnSW50KDMyKSkpIHtcbiAgICAgICAgcmVjZWl2ZWQgPSBhZGROdW1lcmljYWxTZXBhcmF0b3IocmVjZWl2ZWQpXG4gICAgICB9XG4gICAgICByZWNlaXZlZCArPSAnbidcbiAgICB9XG4gICAgbXNnICs9IGAgSXQgbXVzdCBiZSAke3JhbmdlfS4gUmVjZWl2ZWQgJHtyZWNlaXZlZH1gXG4gICAgcmV0dXJuIG1zZ1xuICB9LCBSYW5nZUVycm9yKVxuXG5mdW5jdGlvbiBhZGROdW1lcmljYWxTZXBhcmF0b3IgKHZhbCkge1xuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSB2YWwubGVuZ3RoXG4gIGNvbnN0IHN0YXJ0ID0gdmFsWzBdID09PSAnLScgPyAxIDogMFxuICBmb3IgKDsgaSA+PSBzdGFydCArIDQ7IGkgLT0gMykge1xuICAgIHJlcyA9IGBfJHt2YWwuc2xpY2UoaSAtIDMsIGkpfSR7cmVzfWBcbiAgfVxuICByZXR1cm4gYCR7dmFsLnNsaWNlKDAsIGkpfSR7cmVzfWBcbn1cblxuLy8gQ0hFQ0sgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY2hlY2tCb3VuZHMgKGJ1Ziwgb2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGlmIChidWZbb2Zmc2V0XSA9PT0gdW5kZWZpbmVkIHx8IGJ1ZltvZmZzZXQgKyBieXRlTGVuZ3RoXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCBidWYubGVuZ3RoIC0gKGJ5dGVMZW5ndGggKyAxKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0ludEJJICh2YWx1ZSwgbWluLCBtYXgsIGJ1Ziwgb2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikge1xuICAgIGNvbnN0IG4gPSB0eXBlb2YgbWluID09PSAnYmlnaW50JyA/ICduJyA6ICcnXG4gICAgbGV0IHJhbmdlXG4gICAgaWYgKGJ5dGVMZW5ndGggPiAzKSB7XG4gICAgICBpZiAobWluID09PSAwIHx8IG1pbiA9PT0gQmlnSW50KDApKSB7XG4gICAgICAgIHJhbmdlID0gYD49IDAke259IGFuZCA8IDIke259ICoqICR7KGJ5dGVMZW5ndGggKyAxKSAqIDh9JHtufWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhbmdlID0gYD49IC0oMiR7bn0gKiogJHsoYnl0ZUxlbmd0aCArIDEpICogOCAtIDF9JHtufSkgYW5kIDwgMiAqKiBgICtcbiAgICAgICAgICAgICAgICBgJHsoYnl0ZUxlbmd0aCArIDEpICogOCAtIDF9JHtufWBcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2UgPSBgPj0gJHttaW59JHtufSBhbmQgPD0gJHttYXh9JHtufWBcbiAgICB9XG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKCd2YWx1ZScsIHJhbmdlLCB2YWx1ZSlcbiAgfVxuICBjaGVja0JvdW5kcyhidWYsIG9mZnNldCwgYnl0ZUxlbmd0aClcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIgKHZhbHVlLCBuYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnbnVtYmVyJywgdmFsdWUpXG4gIH1cbn1cblxuZnVuY3Rpb24gYm91bmRzRXJyb3IgKHZhbHVlLCBsZW5ndGgsIHR5cGUpIHtcbiAgaWYgKE1hdGguZmxvb3IodmFsdWUpICE9PSB2YWx1ZSkge1xuICAgIHZhbGlkYXRlTnVtYmVyKHZhbHVlLCB0eXBlKVxuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX09VVF9PRl9SQU5HRSh0eXBlIHx8ICdvZmZzZXQnLCAnYW4gaW50ZWdlcicsIHZhbHVlKVxuICB9XG5cbiAgaWYgKGxlbmd0aCA8IDApIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EUygpXG4gIH1cblxuICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9PVVRfT0ZfUkFOR0UodHlwZSB8fCAnb2Zmc2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA+PSAke3R5cGUgPyAxIDogMH0gYW5kIDw9ICR7bGVuZ3RofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSlcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG5jb25zdCBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHRha2VzIGVxdWFsIHNpZ25zIGFzIGVuZCBvZiB0aGUgQmFzZTY0IGVuY29kaW5nXG4gIHN0ciA9IHN0ci5zcGxpdCgnPScpWzBdXG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgbGV0IGNvZGVQb2ludFxuICBjb25zdCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIGxldCBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICBjb25zdCBieXRlcyA9IFtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIGNvbnN0IGJ5dGVBcnJheSA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgbGV0IGMsIGhpLCBsb1xuICBjb25zdCBieXRlQXJyYXkgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGxldCBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG4vLyBBcnJheUJ1ZmZlciBvciBVaW50OEFycmF5IG9iamVjdHMgZnJvbSBvdGhlciBjb250ZXh0cyAoaS5lLiBpZnJhbWVzKSBkbyBub3QgcGFzc1xuLy8gdGhlIGBpbnN0YW5jZW9mYCBjaGVjayBidXQgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBhcyBvZiB0aGF0IHR5cGUuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNjZcbmZ1bmN0aW9uIGlzSW5zdGFuY2UgKG9iaiwgdHlwZSkge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdHlwZSB8fFxuICAgIChvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmXG4gICAgICBvYmouY29uc3RydWN0b3IubmFtZSA9PT0gdHlwZS5uYW1lKVxufVxuZnVuY3Rpb24gbnVtYmVySXNOYU4gKG9iaikge1xuICAvLyBGb3IgSUUxMSBzdXBwb3J0XG4gIHJldHVybiBvYmogIT09IG9iaiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG4vLyBDcmVhdGUgbG9va3VwIHRhYmxlIGZvciBgdG9TdHJpbmcoJ2hleCcpYFxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMjE5XG5jb25zdCBoZXhTbGljZUxvb2t1cFRhYmxlID0gKGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYWxwaGFiZXQgPSAnMDEyMzQ1Njc4OWFiY2RlZidcbiAgY29uc3QgdGFibGUgPSBuZXcgQXJyYXkoMjU2KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICBjb25zdCBpMTYgPSBpICogMTZcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIHRhYmxlW2kxNiArIGpdID0gYWxwaGFiZXRbaV0gKyBhbHBoYWJldFtqXVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFibGVcbn0pKClcblxuLy8gUmV0dXJuIG5vdCBmdW5jdGlvbiB3aXRoIEVycm9yIGlmIEJpZ0ludCBub3Qgc3VwcG9ydGVkXG5mdW5jdGlvbiBkZWZpbmVCaWdJbnRNZXRob2QgKGZuKSB7XG4gIHJldHVybiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IEJ1ZmZlckJpZ0ludE5vdERlZmluZWQgOiBmblxufVxuXG5mdW5jdGlvbiBCdWZmZXJCaWdJbnROb3REZWZpbmVkICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdCaWdJbnQgbm90IHN1cHBvcnRlZCcpXG59XG4iLCAiaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdvYnNpZGlhbic7XG5sZXQgYnVmZmVyO1xuaWYgKFBsYXRmb3JtLmlzTW9iaWxlQXBwKSB7XG4gICAgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyL2luZGV4LmpzJykuQnVmZmVyXG59IGVsc2Uge1xuICAgIGJ1ZmZlciA9IGdsb2JhbC5CdWZmZXJcbn1cblxuZXhwb3J0IGNvbnN0IEJ1ZmZlciA9IGJ1ZmZlcjtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBBc3luY0xvY2sgPSBmdW5jdGlvbiAob3B0cykge1xuXHRvcHRzID0gb3B0cyB8fCB7fTtcblxuXHR0aGlzLlByb21pc2UgPSBvcHRzLlByb21pc2UgfHwgUHJvbWlzZTtcblxuXHQvLyBmb3JtYXQ6IHtrZXkgOiBbZm4sIGZuXX1cblx0Ly8gcXVldWVzW2tleV0gPSBudWxsIGluZGljYXRlcyBubyBqb2IgcnVubmluZyBmb3Iga2V5XG5cdHRoaXMucXVldWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuXHQvLyBsb2NrIGlzIHJlZW50cmFudCBmb3Igc2FtZSBkb21haW5cblx0dGhpcy5kb21haW5SZWVudHJhbnQgPSBvcHRzLmRvbWFpblJlZW50cmFudCB8fCBmYWxzZTtcblx0aWYgKHRoaXMuZG9tYWluUmVlbnRyYW50KSB7XG5cdFx0aWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgcHJvY2Vzcy5kb21haW4gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdCdEb21haW4tcmVlbnRyYW50IGxvY2tzIHJlcXVpcmUgYHByb2Nlc3MuZG9tYWluYCB0byBleGlzdC4gUGxlYXNlIGZsaXAgYG9wdHMuZG9tYWluUmVlbnRyYW50ID0gZmFsc2VgLCAnICtcblx0XHRcdFx0J3VzZSBhIE5vZGVKUyB2ZXJzaW9uIHRoYXQgc3RpbGwgaW1wbGVtZW50cyBEb21haW4sIG9yIGluc3RhbGwgYSBicm93c2VyIHBvbHlmaWxsLicpO1xuXHRcdH1cblx0XHQvLyBkb21haW4gb2YgY3VycmVudCBydW5uaW5nIGZ1bmMge2tleSA6IGZufVxuXHRcdHRoaXMuZG9tYWlucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdH1cblxuXHR0aGlzLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgfHwgQXN5bmNMb2NrLkRFRkFVTFRfVElNRU9VVDtcblx0dGhpcy5tYXhPY2N1cGF0aW9uVGltZSA9IG9wdHMubWF4T2NjdXBhdGlvblRpbWUgfHwgQXN5bmNMb2NrLkRFRkFVTFRfTUFYX09DQ1VQQVRJT05fVElNRTtcblx0dGhpcy5tYXhFeGVjdXRpb25UaW1lID0gb3B0cy5tYXhFeGVjdXRpb25UaW1lIHx8IEFzeW5jTG9jay5ERUZBVUxUX01BWF9FWEVDVVRJT05fVElNRTtcblx0aWYgKG9wdHMubWF4UGVuZGluZyA9PT0gSW5maW5pdHkgfHwgKE51bWJlci5pc0ludGVnZXIob3B0cy5tYXhQZW5kaW5nKSAmJiBvcHRzLm1heFBlbmRpbmcgPj0gMCkpIHtcblx0XHR0aGlzLm1heFBlbmRpbmcgPSBvcHRzLm1heFBlbmRpbmc7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy5tYXhQZW5kaW5nID0gQXN5bmNMb2NrLkRFRkFVTFRfTUFYX1BFTkRJTkc7XG5cdH1cbn07XG5cbkFzeW5jTG9jay5ERUZBVUxUX1RJTUVPVVQgPSAwOyAvL05ldmVyXG5Bc3luY0xvY2suREVGQVVMVF9NQVhfT0NDVVBBVElPTl9USU1FID0gMDsgLy9OZXZlclxuQXN5bmNMb2NrLkRFRkFVTFRfTUFYX0VYRUNVVElPTl9USU1FID0gMDsgLy9OZXZlclxuQXN5bmNMb2NrLkRFRkFVTFRfTUFYX1BFTkRJTkcgPSAxMDAwO1xuXG4vKipcbiAqIEFjcXVpcmUgTG9ja3NcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0ga2V5IFx0cmVzb3VyY2Uga2V5IG9yIGtleXMgdG8gbG9ja1xuICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gXHRhc3luYyBmdW5jdGlvblxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2IgXHRjYWxsYmFjayBmdW5jdGlvbiwgb3RoZXJ3aXNlIHdpbGwgcmV0dXJuIGEgcHJvbWlzZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgXHRvcHRpb25zXG4gKi9cbkFzeW5jTG9jay5wcm90b3R5cGUuYWNxdWlyZSA9IGZ1bmN0aW9uIChrZXksIGZuLCBjYiwgb3B0cykge1xuXHRpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FjcXVpcmVCYXRjaChrZXksIGZuLCBjYiwgb3B0cyk7XG5cdH1cblxuXHRpZiAodHlwZW9mIChmbikgIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiB0byBleGVjdXRlJyk7XG5cdH1cblxuXHQvLyBmYXV4LWRlZmVycmVkIHByb21pc2UgdXNpbmcgbmV3IFByb21pc2UoKSAoYXMgUHJvbWlzZS5kZWZlciBpcyBkZXByZWNhdGVkKVxuXHR2YXIgZGVmZXJyZWRSZXNvbHZlID0gbnVsbDtcblx0dmFyIGRlZmVycmVkUmVqZWN0ID0gbnVsbDtcblx0dmFyIGRlZmVycmVkID0gbnVsbDtcblxuXHRpZiAodHlwZW9mIChjYikgIT09ICdmdW5jdGlvbicpIHtcblx0XHRvcHRzID0gY2I7XG5cdFx0Y2IgPSBudWxsO1xuXG5cdFx0Ly8gd2lsbCByZXR1cm4gYSBwcm9taXNlXG5cdFx0ZGVmZXJyZWQgPSBuZXcgdGhpcy5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0ZGVmZXJyZWRSZXNvbHZlID0gcmVzb2x2ZTtcblx0XHRcdGRlZmVycmVkUmVqZWN0ID0gcmVqZWN0O1xuXHRcdH0pO1xuXHR9XG5cblx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0dmFyIHJlc29sdmVkID0gZmFsc2U7XG5cdHZhciB0aW1lciA9IG51bGw7XG5cdHZhciBvY2N1cGF0aW9uVGltZXIgPSBudWxsO1xuXHR2YXIgZXhlY3V0aW9uVGltZXIgPSBudWxsO1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0dmFyIGRvbmUgPSBmdW5jdGlvbiAobG9ja2VkLCBlcnIsIHJldCkge1xuXG5cdFx0aWYgKG9jY3VwYXRpb25UaW1lcikge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KG9jY3VwYXRpb25UaW1lcik7XG5cdFx0XHRvY2N1cGF0aW9uVGltZXIgPSBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChleGVjdXRpb25UaW1lcikge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KGV4ZWN1dGlvblRpbWVyKTtcblx0XHRcdGV4ZWN1dGlvblRpbWVyID0gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAobG9ja2VkKSB7XG5cdFx0XHRpZiAoISFzZWxmLnF1ZXVlc1trZXldICYmIHNlbGYucXVldWVzW2tleV0ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGRlbGV0ZSBzZWxmLnF1ZXVlc1trZXldO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNlbGYuZG9tYWluUmVlbnRyYW50KSB7XG5cdFx0XHRcdGRlbGV0ZSBzZWxmLmRvbWFpbnNba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIXJlc29sdmVkKSB7XG5cdFx0XHRpZiAoIWRlZmVycmVkKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgKGNiKSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNiKGVyciwgcmV0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdC8vcHJvbWlzZSBtb2RlXG5cdFx0XHRcdGlmIChlcnIpIHtcblx0XHRcdFx0XHRkZWZlcnJlZFJlamVjdChlcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVycmVkUmVzb2x2ZShyZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXNvbHZlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGxvY2tlZCkge1xuXHRcdFx0Ly9ydW4gbmV4dCBmdW5jXG5cdFx0XHRpZiAoISFzZWxmLnF1ZXVlc1trZXldICYmIHNlbGYucXVldWVzW2tleV0ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRzZWxmLnF1ZXVlc1trZXldLnNoaWZ0KCkoKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0dmFyIGV4ZWMgPSBmdW5jdGlvbiAobG9ja2VkKSB7XG5cdFx0aWYgKHJlc29sdmVkKSB7IC8vIG1heSBkdWUgdG8gdGltZWQgb3V0XG5cdFx0XHRyZXR1cm4gZG9uZShsb2NrZWQpO1xuXHRcdH1cblxuXHRcdGlmICh0aW1lcikge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdHRpbWVyID0gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoc2VsZi5kb21haW5SZWVudHJhbnQgJiYgbG9ja2VkKSB7XG5cdFx0XHRzZWxmLmRvbWFpbnNba2V5XSA9IHByb2Nlc3MuZG9tYWluO1xuXHRcdH1cblxuXHRcdHZhciBtYXhFeGVjdXRpb25UaW1lID0gb3B0cy5tYXhFeGVjdXRpb25UaW1lIHx8IHNlbGYubWF4RXhlY3V0aW9uVGltZTtcblx0XHRpZiAobWF4RXhlY3V0aW9uVGltZSkge1xuXHRcdFx0ZXhlY3V0aW9uVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKCEhc2VsZi5xdWV1ZXNba2V5XSkge1xuXHRcdFx0XHRcdGRvbmUobG9ja2VkLCBuZXcgRXJyb3IoJ01heGltdW0gZXhlY3V0aW9uIHRpbWUgaXMgZXhjZWVkZWQgJyArIGtleSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBtYXhFeGVjdXRpb25UaW1lKTtcblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBtb2RlXG5cdFx0aWYgKGZuLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0dmFyIGNhbGxlZCA9IGZhbHNlO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Zm4oZnVuY3Rpb24gKGVyciwgcmV0KSB7XG5cdFx0XHRcdFx0aWYgKCFjYWxsZWQpIHtcblx0XHRcdFx0XHRcdGNhbGxlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRkb25lKGxvY2tlZCwgZXJyLCByZXQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0Ly8gY2F0Y2hpbmcgZXJyb3IgdGhyb3duIGluIHVzZXIgZnVuY3Rpb24gZm5cblx0XHRcdFx0aWYgKCFjYWxsZWQpIHtcblx0XHRcdFx0XHRjYWxsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGRvbmUobG9ja2VkLCBlcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Ly8gUHJvbWlzZSBtb2RlXG5cdFx0XHRzZWxmLl9wcm9taXNlVHJ5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGZuKCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24ocmV0KXtcblx0XHRcdFx0ZG9uZShsb2NrZWQsIHVuZGVmaW5lZCwgcmV0KTtcblx0XHRcdH0sIGZ1bmN0aW9uKGVycm9yKXtcblx0XHRcdFx0ZG9uZShsb2NrZWQsIGVycm9yKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoc2VsZi5kb21haW5SZWVudHJhbnQgJiYgISFwcm9jZXNzLmRvbWFpbikge1xuXHRcdGV4ZWMgPSBwcm9jZXNzLmRvbWFpbi5iaW5kKGV4ZWMpO1xuXHR9XG5cblx0dmFyIG1heFBlbmRpbmcgPSBvcHRzLm1heFBlbmRpbmcgfHwgc2VsZi5tYXhQZW5kaW5nO1xuXG5cdGlmICghc2VsZi5xdWV1ZXNba2V5XSkge1xuXHRcdHNlbGYucXVldWVzW2tleV0gPSBbXTtcblx0XHRleGVjKHRydWUpO1xuXHR9XG5cdGVsc2UgaWYgKHNlbGYuZG9tYWluUmVlbnRyYW50ICYmICEhcHJvY2Vzcy5kb21haW4gJiYgcHJvY2Vzcy5kb21haW4gPT09IHNlbGYuZG9tYWluc1trZXldKSB7XG5cdFx0Ly8gSWYgY29kZSBpcyBpbiB0aGUgc2FtZSBkb21haW4gb2YgY3VycmVudCBydW5uaW5nIHRhc2ssIHJ1biBpdCBkaXJlY3RseVxuXHRcdC8vIFNpbmNlIGxvY2sgaXMgcmUtZW50ZXJhYmxlXG5cdFx0ZXhlYyhmYWxzZSk7XG5cdH1cblx0ZWxzZSBpZiAoc2VsZi5xdWV1ZXNba2V5XS5sZW5ndGggPj0gbWF4UGVuZGluZykge1xuXHRcdGRvbmUoZmFsc2UsIG5ldyBFcnJvcignVG9vIG1hbnkgcGVuZGluZyB0YXNrcyBpbiBxdWV1ZSAnICsga2V5KSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0dmFyIHRhc2tGbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGV4ZWModHJ1ZSk7XG5cdFx0fTtcblx0XHRpZiAob3B0cy5za2lwUXVldWUpIHtcblx0XHRcdHNlbGYucXVldWVzW2tleV0udW5zaGlmdCh0YXNrRm4pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzZWxmLnF1ZXVlc1trZXldLnB1c2godGFza0ZuKTtcblx0XHR9XG5cblx0XHR2YXIgdGltZW91dCA9IG9wdHMudGltZW91dCB8fCBzZWxmLnRpbWVvdXQ7XG5cdFx0aWYgKHRpbWVvdXQpIHtcblx0XHRcdHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRpbWVyID0gbnVsbDtcblx0XHRcdFx0ZG9uZShmYWxzZSwgbmV3IEVycm9yKCdhc3luYy1sb2NrIHRpbWVkIG91dCBpbiBxdWV1ZSAnICsga2V5KSk7XG5cdFx0XHR9LCB0aW1lb3V0KTtcblx0XHR9XG5cdH1cblxuXHR2YXIgbWF4T2NjdXBhdGlvblRpbWUgPSBvcHRzLm1heE9jY3VwYXRpb25UaW1lIHx8IHNlbGYubWF4T2NjdXBhdGlvblRpbWU7XG5cdFx0aWYgKG1heE9jY3VwYXRpb25UaW1lKSB7XG5cdFx0XHRvY2N1cGF0aW9uVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKCEhc2VsZi5xdWV1ZXNba2V5XSkge1xuXHRcdFx0XHRcdGRvbmUoZmFsc2UsIG5ldyBFcnJvcignTWF4aW11bSBvY2N1cGF0aW9uIHRpbWUgaXMgZXhjZWVkZWQgaW4gcXVldWUgJyArIGtleSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBtYXhPY2N1cGF0aW9uVGltZSk7XG5cdFx0fVxuXG5cdGlmIChkZWZlcnJlZCkge1xuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fVxufTtcblxuLypcbiAqIEJlbG93IGlzIGhvdyB0aGlzIGZ1bmN0aW9uIHdvcmtzOlxuICpcbiAqIEVxdWl2YWxlbnQgY29kZTpcbiAqIHNlbGYuYWNxdWlyZShrZXkxLCBmdW5jdGlvbihjYil7XG4gKiAgICAgc2VsZi5hY3F1aXJlKGtleTIsIGZ1bmN0aW9uKGNiKXtcbiAqICAgICAgICAgc2VsZi5hY3F1aXJlKGtleTMsIGZuLCBjYik7XG4gKiAgICAgfSwgY2IpO1xuICogfSwgY2IpO1xuICpcbiAqIEVxdWl2YWxlbnQgY29kZTpcbiAqIHZhciBmbjMgPSBnZXRGbihrZXkzLCBmbik7XG4gKiB2YXIgZm4yID0gZ2V0Rm4oa2V5MiwgZm4zKTtcbiAqIHZhciBmbjEgPSBnZXRGbihrZXkxLCBmbjIpO1xuICogZm4xKGNiKTtcbiAqL1xuQXN5bmNMb2NrLnByb3RvdHlwZS5fYWNxdWlyZUJhdGNoID0gZnVuY3Rpb24gKGtleXMsIGZuLCBjYiwgb3B0cykge1xuXHRpZiAodHlwZW9mIChjYikgIT09ICdmdW5jdGlvbicpIHtcblx0XHRvcHRzID0gY2I7XG5cdFx0Y2IgPSBudWxsO1xuXHR9XG5cblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR2YXIgZ2V0Rm4gPSBmdW5jdGlvbiAoa2V5LCBmbikge1xuXHRcdHJldHVybiBmdW5jdGlvbiAoY2IpIHtcblx0XHRcdHNlbGYuYWNxdWlyZShrZXksIGZuLCBjYiwgb3B0cyk7XG5cdFx0fTtcblx0fTtcblxuXHR2YXIgZm54ID0ga2V5cy5yZWR1Y2VSaWdodChmdW5jdGlvbiAocHJldiwga2V5KSB7XG5cdFx0cmV0dXJuIGdldEZuKGtleSwgcHJldik7XG5cdH0sIGZuKTtcblxuXHRpZiAodHlwZW9mIChjYikgPT09ICdmdW5jdGlvbicpIHtcblx0XHRmbngoY2IpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdHJldHVybiBuZXcgdGhpcy5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdC8vIGNoZWNrIGZvciBwcm9taXNlIG1vZGUgaW4gY2FzZSBrZXlzIGlzIGVtcHR5IGFycmF5XG5cdFx0XHRpZiAoZm54Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRmbngoZnVuY3Rpb24gKGVyciwgcmV0KSB7XG5cdFx0XHRcdFx0aWYgKGVycikge1xuXHRcdFx0XHRcdFx0cmVqZWN0KGVycik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShyZXQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXNvbHZlKGZueCgpKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufTtcblxuLypcbiAqXHRXaGV0aGVyIHRoZXJlIGlzIGFueSBydW5uaW5nIG9yIHBlbmRpbmcgYXN5bmNGdW5jXG4gKlxuICpcdEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqL1xuQXN5bmNMb2NrLnByb3RvdHlwZS5pc0J1c3kgPSBmdW5jdGlvbiAoa2V5KSB7XG5cdGlmICgha2V5KSB7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucXVldWVzKS5sZW5ndGggPiAwO1xuXHR9XG5cdGVsc2Uge1xuXHRcdHJldHVybiAhIXRoaXMucXVldWVzW2tleV07XG5cdH1cbn07XG5cbi8qKlxuICogUHJvbWlzZS50cnkoKSBpbXBsZW1lbnRhdGlvbiB0byBiZWNvbWUgaW5kZXBlbmRlbnQgb2YgUS1zcGVjaWZpYyBtZXRob2RzXG4gKi9cbkFzeW5jTG9jay5wcm90b3R5cGUuX3Byb21pc2VUcnkgPSBmdW5jdGlvbihmbikge1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZShmbigpKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiB0aGlzLlByb21pc2UucmVqZWN0KGUpO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFzeW5jTG9jaztcbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliJyk7XG4iLCAiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwgIi8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG4vLyBhbHRlcm5hdGl2ZSB0byB1c2luZyBPYmplY3Qua2V5cyBmb3Igb2xkIGJyb3dzZXJzXG5mdW5jdGlvbiBjb3B5UHJvcHMgKHNyYywgZHN0KSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBkc3Rba2V5XSA9IHNyY1trZXldXG4gIH1cbn1cbmlmIChCdWZmZXIuZnJvbSAmJiBCdWZmZXIuYWxsb2MgJiYgQnVmZmVyLmFsbG9jVW5zYWZlICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBidWZmZXJcbn0gZWxzZSB7XG4gIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIHJlcXVpcmUoJ2J1ZmZlcicpXG4gIGNvcHlQcm9wcyhidWZmZXIsIGV4cG9ydHMpXG4gIGV4cG9ydHMuQnVmZmVyID0gU2FmZUJ1ZmZlclxufVxuXG5mdW5jdGlvbiBTYWZlQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQnVmZmVyLnByb3RvdHlwZSlcblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCAidmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbi8vIHByb3RvdHlwZSBjbGFzcyBmb3IgaGFzaCBmdW5jdGlvbnNcbmZ1bmN0aW9uIEhhc2ggKGJsb2NrU2l6ZSwgZmluYWxTaXplKSB7XG4gIHRoaXMuX2Jsb2NrID0gQnVmZmVyLmFsbG9jKGJsb2NrU2l6ZSlcbiAgdGhpcy5fZmluYWxTaXplID0gZmluYWxTaXplXG4gIHRoaXMuX2Jsb2NrU2l6ZSA9IGJsb2NrU2l6ZVxuICB0aGlzLl9sZW4gPSAwXG59XG5cbkhhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkYXRhLCBlbmMpIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGVuYyA9IGVuYyB8fCAndXRmOCdcbiAgICBkYXRhID0gQnVmZmVyLmZyb20oZGF0YSwgZW5jKVxuICB9XG5cbiAgdmFyIGJsb2NrID0gdGhpcy5fYmxvY2tcbiAgdmFyIGJsb2NrU2l6ZSA9IHRoaXMuX2Jsb2NrU2l6ZVxuICB2YXIgbGVuZ3RoID0gZGF0YS5sZW5ndGhcbiAgdmFyIGFjY3VtID0gdGhpcy5fbGVuXG5cbiAgZm9yICh2YXIgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbGVuZ3RoOykge1xuICAgIHZhciBhc3NpZ25lZCA9IGFjY3VtICUgYmxvY2tTaXplXG4gICAgdmFyIHJlbWFpbmRlciA9IE1hdGgubWluKGxlbmd0aCAtIG9mZnNldCwgYmxvY2tTaXplIC0gYXNzaWduZWQpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbWFpbmRlcjsgaSsrKSB7XG4gICAgICBibG9ja1thc3NpZ25lZCArIGldID0gZGF0YVtvZmZzZXQgKyBpXVxuICAgIH1cblxuICAgIGFjY3VtICs9IHJlbWFpbmRlclxuICAgIG9mZnNldCArPSByZW1haW5kZXJcblxuICAgIGlmICgoYWNjdW0gJSBibG9ja1NpemUpID09PSAwKSB7XG4gICAgICB0aGlzLl91cGRhdGUoYmxvY2spXG4gICAgfVxuICB9XG5cbiAgdGhpcy5fbGVuICs9IGxlbmd0aFxuICByZXR1cm4gdGhpc1xufVxuXG5IYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiAoZW5jKSB7XG4gIHZhciByZW0gPSB0aGlzLl9sZW4gJSB0aGlzLl9ibG9ja1NpemVcblxuICB0aGlzLl9ibG9ja1tyZW1dID0gMHg4MFxuXG4gIC8vIHplcm8gKHJlbSArIDEpIHRyYWlsaW5nIGJpdHMsIHdoZXJlIChyZW0gKyAxKSBpcyB0aGUgc21hbGxlc3RcbiAgLy8gbm9uLW5lZ2F0aXZlIHNvbHV0aW9uIHRvIHRoZSBlcXVhdGlvbiAobGVuZ3RoICsgMSArIChyZW0gKyAxKSkgPT09IGZpbmFsU2l6ZSBtb2QgYmxvY2tTaXplXG4gIHRoaXMuX2Jsb2NrLmZpbGwoMCwgcmVtICsgMSlcblxuICBpZiAocmVtID49IHRoaXMuX2ZpbmFsU2l6ZSkge1xuICAgIHRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jaylcbiAgICB0aGlzLl9ibG9jay5maWxsKDApXG4gIH1cblxuICB2YXIgYml0cyA9IHRoaXMuX2xlbiAqIDhcblxuICAvLyB1aW50MzJcbiAgaWYgKGJpdHMgPD0gMHhmZmZmZmZmZikge1xuICAgIHRoaXMuX2Jsb2NrLndyaXRlVUludDMyQkUoYml0cywgdGhpcy5fYmxvY2tTaXplIC0gNClcblxuICAvLyB1aW50NjRcbiAgfSBlbHNlIHtcbiAgICB2YXIgbG93Qml0cyA9IChiaXRzICYgMHhmZmZmZmZmZikgPj4+IDBcbiAgICB2YXIgaGlnaEJpdHMgPSAoYml0cyAtIGxvd0JpdHMpIC8gMHgxMDAwMDAwMDBcblxuICAgIHRoaXMuX2Jsb2NrLndyaXRlVUludDMyQkUoaGlnaEJpdHMsIHRoaXMuX2Jsb2NrU2l6ZSAtIDgpXG4gICAgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShsb3dCaXRzLCB0aGlzLl9ibG9ja1NpemUgLSA0KVxuICB9XG5cbiAgdGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKVxuICB2YXIgaGFzaCA9IHRoaXMuX2hhc2goKVxuXG4gIHJldHVybiBlbmMgPyBoYXNoLnRvU3RyaW5nKGVuYykgOiBoYXNoXG59XG5cbkhhc2gucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRocm93IG5ldyBFcnJvcignX3VwZGF0ZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoXG4iLCAiLypcbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VjdXJlIEhhc2ggQWxnb3JpdGhtLCBTSEEtMSwgYXMgZGVmaW5lZFxuICogaW4gRklQUyBQVUIgMTgwLTFcbiAqIFZlcnNpb24gMi4xYSBDb3B5cmlnaHQgUGF1bCBKb2huc3RvbiAyMDAwIC0gMjAwMi5cbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIGRldGFpbHMuXG4gKi9cblxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbnZhciBLID0gW1xuICAweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjIHwgMCwgMHhjYTYyYzFkNiB8IDBcbl1cblxudmFyIFcgPSBuZXcgQXJyYXkoODApXG5cbmZ1bmN0aW9uIFNoYTEgKCkge1xuICB0aGlzLmluaXQoKVxuICB0aGlzLl93ID0gV1xuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYTEsIEhhc2gpXG5cblNoYTEucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2EgPSAweDY3NDUyMzAxXG4gIHRoaXMuX2IgPSAweGVmY2RhYjg5XG4gIHRoaXMuX2MgPSAweDk4YmFkY2ZlXG4gIHRoaXMuX2QgPSAweDEwMzI1NDc2XG4gIHRoaXMuX2UgPSAweGMzZDJlMWYwXG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuZnVuY3Rpb24gcm90bDEgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAxKSB8IChudW0gPj4+IDMxKVxufVxuXG5mdW5jdGlvbiByb3RsNSAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDUpIHwgKG51bSA+Pj4gMjcpXG59XG5cbmZ1bmN0aW9uIHJvdGwzMCAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDMwKSB8IChudW0gPj4+IDIpXG59XG5cbmZ1bmN0aW9uIGZ0IChzLCBiLCBjLCBkKSB7XG4gIGlmIChzID09PSAwKSByZXR1cm4gKGIgJiBjKSB8ICgofmIpICYgZClcbiAgaWYgKHMgPT09IDIpIHJldHVybiAoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZClcbiAgcmV0dXJuIGIgXiBjIF4gZFxufVxuXG5TaGExLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKE0pIHtcbiAgdmFyIFcgPSB0aGlzLl93XG5cbiAgdmFyIGEgPSB0aGlzLl9hIHwgMFxuICB2YXIgYiA9IHRoaXMuX2IgfCAwXG4gIHZhciBjID0gdGhpcy5fYyB8IDBcbiAgdmFyIGQgPSB0aGlzLl9kIHwgMFxuICB2YXIgZSA9IHRoaXMuX2UgfCAwXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSBXW2ldID0gTS5yZWFkSW50MzJCRShpICogNClcbiAgZm9yICg7IGkgPCA4MDsgKytpKSBXW2ldID0gcm90bDEoV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XSlcblxuICBmb3IgKHZhciBqID0gMDsgaiA8IDgwOyArK2opIHtcbiAgICB2YXIgcyA9IH5+KGogLyAyMClcbiAgICB2YXIgdCA9IChyb3RsNShhKSArIGZ0KHMsIGIsIGMsIGQpICsgZSArIFdbal0gKyBLW3NdKSB8IDBcblxuICAgIGUgPSBkXG4gICAgZCA9IGNcbiAgICBjID0gcm90bDMwKGIpXG4gICAgYiA9IGFcbiAgICBhID0gdFxuICB9XG5cbiAgdGhpcy5fYSA9IChhICsgdGhpcy5fYSkgfCAwXG4gIHRoaXMuX2IgPSAoYiArIHRoaXMuX2IpIHwgMFxuICB0aGlzLl9jID0gKGMgKyB0aGlzLl9jKSB8IDBcbiAgdGhpcy5fZCA9IChkICsgdGhpcy5fZCkgfCAwXG4gIHRoaXMuX2UgPSAoZSArIHRoaXMuX2UpIHwgMFxufVxuXG5TaGExLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBCdWZmZXIuYWxsb2NVbnNhZmUoMjApXG5cbiAgSC53cml0ZUludDMyQkUodGhpcy5fYSB8IDAsIDApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2IgfCAwLCA0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9jIHwgMCwgOClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZCB8IDAsIDEyKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9lIHwgMCwgMTYpXG5cbiAgcmV0dXJuIEhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTaGExXG4iLCAiLyohIGNyYzMyLmpzIChDKSAyMDE0LXByZXNlbnQgU2hlZXRKUyAtLSBodHRwOi8vc2hlZXRqcy5jb20gKi9cbi8qIHZpbTogc2V0IHRzPTI6ICovXG4vKmV4cG9ydGVkIENSQzMyICovXG52YXIgQ1JDMzI7XG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcblx0Lypqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdC8qZXNsaW50LWRpc2FibGUgKi9cblx0aWYodHlwZW9mIERPX05PVF9FWFBPUlRfQ1JDID09PSAndW5kZWZpbmVkJykge1xuXHRcdGlmKCdvYmplY3QnID09PSB0eXBlb2YgZXhwb3J0cykge1xuXHRcdFx0ZmFjdG9yeShleHBvcnRzKTtcblx0XHR9IGVsc2UgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCkge1xuXHRcdFx0ZGVmaW5lKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIG1vZHVsZSA9IHt9O1xuXHRcdFx0XHRmYWN0b3J5KG1vZHVsZSk7XG5cdFx0XHRcdHJldHVybiBtb2R1bGU7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZmFjdG9yeShDUkMzMiA9IHt9KTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeShDUkMzMiA9IHt9KTtcblx0fVxuXHQvKmVzbGludC1lbmFibGUgKi9cblx0Lypqc2hpbnQgaWdub3JlOmVuZCAqL1xufShmdW5jdGlvbihDUkMzMikge1xuQ1JDMzIudmVyc2lvbiA9ICcxLjIuMic7XG4vKmdsb2JhbCBJbnQzMkFycmF5ICovXG5mdW5jdGlvbiBzaWduZWRfY3JjX3RhYmxlKCkge1xuXHR2YXIgYyA9IDAsIHRhYmxlID0gbmV3IEFycmF5KDI1Nik7XG5cblx0Zm9yKHZhciBuID0wOyBuICE9IDI1NjsgKytuKXtcblx0XHRjID0gbjtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHR0YWJsZVtuXSA9IGM7XG5cdH1cblxuXHRyZXR1cm4gdHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnID8gbmV3IEludDMyQXJyYXkodGFibGUpIDogdGFibGU7XG59XG5cbnZhciBUMCA9IHNpZ25lZF9jcmNfdGFibGUoKTtcbmZ1bmN0aW9uIHNsaWNlX2J5XzE2X3RhYmxlcyhUKSB7XG5cdHZhciBjID0gMCwgdiA9IDAsIG4gPSAwLCB0YWJsZSA9IHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IG5ldyBJbnQzMkFycmF5KDQwOTYpIDogbmV3IEFycmF5KDQwOTYpIDtcblxuXHRmb3IobiA9IDA7IG4gIT0gMjU2OyArK24pIHRhYmxlW25dID0gVFtuXTtcblx0Zm9yKG4gPSAwOyBuICE9IDI1NjsgKytuKSB7XG5cdFx0diA9IFRbbl07XG5cdFx0Zm9yKGMgPSAyNTYgKyBuOyBjIDwgNDA5NjsgYyArPSAyNTYpIHYgPSB0YWJsZVtjXSA9ICh2ID4+PiA4KSBeIFRbdiAmIDB4RkZdO1xuXHR9XG5cdHZhciBvdXQgPSBbXTtcblx0Zm9yKG4gPSAxOyBuICE9IDE2OyArK24pIG91dFtuIC0gMV0gPSB0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyB0YWJsZS5zdWJhcnJheShuICogMjU2LCBuICogMjU2ICsgMjU2KSA6IHRhYmxlLnNsaWNlKG4gKiAyNTYsIG4gKiAyNTYgKyAyNTYpO1xuXHRyZXR1cm4gb3V0O1xufVxudmFyIFRUID0gc2xpY2VfYnlfMTZfdGFibGVzKFQwKTtcbnZhciBUMSA9IFRUWzBdLCAgVDIgPSBUVFsxXSwgIFQzID0gVFRbMl0sICBUNCA9IFRUWzNdLCAgVDUgPSBUVFs0XTtcbnZhciBUNiA9IFRUWzVdLCAgVDcgPSBUVFs2XSwgIFQ4ID0gVFRbN10sICBUOSA9IFRUWzhdLCAgVGEgPSBUVFs5XTtcbnZhciBUYiA9IFRUWzEwXSwgVGMgPSBUVFsxMV0sIFRkID0gVFRbMTJdLCBUZSA9IFRUWzEzXSwgVGYgPSBUVFsxNF07XG5mdW5jdGlvbiBjcmMzMl9ic3RyKGJzdHIsIHNlZWQpIHtcblx0dmFyIEMgPSBzZWVkIF4gLTE7XG5cdGZvcih2YXIgaSA9IDAsIEwgPSBic3RyLmxlbmd0aDsgaSA8IEw7KSBDID0gKEM+Pj44KSBeIFQwWyhDXmJzdHIuY2hhckNvZGVBdChpKyspKSYweEZGXTtcblx0cmV0dXJuIH5DO1xufVxuXG5mdW5jdGlvbiBjcmMzMl9idWYoQiwgc2VlZCkge1xuXHR2YXIgQyA9IHNlZWQgXiAtMSwgTCA9IEIubGVuZ3RoIC0gMTUsIGkgPSAwO1xuXHRmb3IoOyBpIDwgTDspIEMgPVxuXHRcdFRmW0JbaSsrXSBeIChDICYgMjU1KV0gXlxuXHRcdFRlW0JbaSsrXSBeICgoQyA+PiA4KSAmIDI1NSldIF5cblx0XHRUZFtCW2krK10gXiAoKEMgPj4gMTYpICYgMjU1KV0gXlxuXHRcdFRjW0JbaSsrXSBeIChDID4+PiAyNCldIF5cblx0XHRUYltCW2krK11dIF4gVGFbQltpKytdXSBeIFQ5W0JbaSsrXV0gXiBUOFtCW2krK11dIF5cblx0XHRUN1tCW2krK11dIF4gVDZbQltpKytdXSBeIFQ1W0JbaSsrXV0gXiBUNFtCW2krK11dIF5cblx0XHRUM1tCW2krK11dIF4gVDJbQltpKytdXSBeIFQxW0JbaSsrXV0gXiBUMFtCW2krK11dO1xuXHRMICs9IDE1O1xuXHR3aGlsZShpIDwgTCkgQyA9IChDPj4+OCkgXiBUMFsoQ15CW2krK10pJjB4RkZdO1xuXHRyZXR1cm4gfkM7XG59XG5cbmZ1bmN0aW9uIGNyYzMyX3N0cihzdHIsIHNlZWQpIHtcblx0dmFyIEMgPSBzZWVkIF4gLTE7XG5cdGZvcih2YXIgaSA9IDAsIEwgPSBzdHIubGVuZ3RoLCBjID0gMCwgZCA9IDA7IGkgPCBMOykge1xuXHRcdGMgPSBzdHIuY2hhckNvZGVBdChpKyspO1xuXHRcdGlmKGMgPCAweDgwKSB7XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDXmMpJjB4RkZdO1xuXHRcdH0gZWxzZSBpZihjIDwgMHg4MDApIHtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMTkyfCgoYz4+NikmMzEpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoYyY2MykpKSYweEZGXTtcblx0XHR9IGVsc2UgaWYoYyA+PSAweEQ4MDAgJiYgYyA8IDB4RTAwMCkge1xuXHRcdFx0YyA9IChjJjEwMjMpKzY0OyBkID0gc3RyLmNoYXJDb2RlQXQoaSsrKSYxMDIzO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgyNDB8KChjPj44KSY3KSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxMjh8KChjPj4yKSY2MykpKSYweEZGXTtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMTI4fCgoZD4+NikmMTUpfCgoYyYzKTw8NCkpKSYweEZGXTtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMTI4fChkJjYzKSkpJjB4RkZdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDIyNHwoKGM+PjEyKSYxNSkpKSYweEZGXTtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMTI4fCgoYz4+NikmNjMpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoYyY2MykpKSYweEZGXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIH5DO1xufVxuQ1JDMzIudGFibGUgPSBUMDtcbi8vICRGbG93SWdub3JlXG5DUkMzMi5ic3RyID0gY3JjMzJfYnN0cjtcbi8vICRGbG93SWdub3JlXG5DUkMzMi5idWYgPSBjcmMzMl9idWY7XG4vLyAkRmxvd0lnbm9yZVxuQ1JDMzIuc3RyID0gY3JjMzJfc3RyO1xufSkpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuXG52YXIgVFlQRURfT0sgPSAgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxuZnVuY3Rpb24gX2hhcyhvYmosIGtleSkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cblxuZXhwb3J0cy5hc3NpZ24gPSBmdW5jdGlvbiAob2JqIC8qZnJvbTEsIGZyb20yLCBmcm9tMywgLi4uKi8pIHtcbiAgdmFyIHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB3aGlsZSAoc291cmNlcy5sZW5ndGgpIHtcbiAgICB2YXIgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICAgIGlmICghc291cmNlKSB7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc291cmNlICsgJ211c3QgYmUgbm9uLW9iamVjdCcpO1xuICAgIH1cblxuICAgIGZvciAodmFyIHAgaW4gc291cmNlKSB7XG4gICAgICBpZiAoX2hhcyhzb3VyY2UsIHApKSB7XG4gICAgICAgIG9ialtwXSA9IHNvdXJjZVtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuXG4vLyByZWR1Y2UgYnVmZmVyIHNpemUsIGF2b2lkaW5nIG1lbSBjb3B5XG5leHBvcnRzLnNocmlua0J1ZiA9IGZ1bmN0aW9uIChidWYsIHNpemUpIHtcbiAgaWYgKGJ1Zi5sZW5ndGggPT09IHNpemUpIHsgcmV0dXJuIGJ1ZjsgfVxuICBpZiAoYnVmLnN1YmFycmF5KSB7IHJldHVybiBidWYuc3ViYXJyYXkoMCwgc2l6ZSk7IH1cbiAgYnVmLmxlbmd0aCA9IHNpemU7XG4gIHJldHVybiBidWY7XG59O1xuXG5cbnZhciBmblR5cGVkID0ge1xuICBhcnJheVNldDogZnVuY3Rpb24gKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbiwgZGVzdF9vZmZzKSB7XG4gICAgaWYgKHNyYy5zdWJhcnJheSAmJiBkZXN0LnN1YmFycmF5KSB7XG4gICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjX29mZnMsIHNyY19vZmZzICsgbGVuKSwgZGVzdF9vZmZzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gb3JkaW5hcnkgYXJyYXlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICB2YXIgaSwgbCwgbGVuLCBwb3MsIGNodW5rLCByZXN1bHQ7XG5cbiAgICAvLyBjYWxjdWxhdGUgZGF0YSBsZW5ndGhcbiAgICBsZW4gPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBsZW4gKz0gY2h1bmtzW2ldLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBqb2luIGNodW5rc1xuICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgcG9zID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY2h1bmsgPSBjaHVua3NbaV07XG4gICAgICByZXN1bHQuc2V0KGNodW5rLCBwb3MpO1xuICAgICAgcG9zICs9IGNodW5rLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG52YXIgZm5VbnR5cGVkID0ge1xuICBhcnJheVNldDogZnVuY3Rpb24gKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbiwgZGVzdF9vZmZzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgY2h1bmtzKTtcbiAgfVxufTtcblxuXG4vLyBFbmFibGUvRGlzYWJsZSB0eXBlZCBhcnJheXMgdXNlLCBmb3IgdGVzdGluZ1xuLy9cbmV4cG9ydHMuc2V0VHlwZWQgPSBmdW5jdGlvbiAob24pIHtcbiAgaWYgKG9uKSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IFVpbnQ4QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IFVpbnQxNkFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBJbnQzMkFycmF5O1xuICAgIGV4cG9ydHMuYXNzaWduKGV4cG9ydHMsIGZuVHlwZWQpO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEFycmF5O1xuICAgIGV4cG9ydHMuYXNzaWduKGV4cG9ydHMsIGZuVW50eXBlZCk7XG4gIH1cbn07XG5cbmV4cG9ydHMuc2V0VHlwZWQoVFlQRURfT0spO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBzcGFjZS11bmFyeS1vcHMgKi9cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5cbnZhciBNQVhfQklUUyAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIEJ1Zl9zaXplICAgICAgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgICAgID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgICA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxudmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqL1xuXG4vLyAhISEhIFVzZSBmbGF0IGFycmF5IGluc3RlYWQgb2Ygc3RydWN0dXJlLCBGcmVxID0gaSoyLCBMZW4gPSBpKjIrMVxudmFyIHN0YXRpY19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpO1xuemVybyhzdGF0aWNfbHRyZWUpO1xuLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm9cbiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyXG4gKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXRcbiAqIGJlbG93KS5cbiAqL1xuXG52YXIgc3RhdGljX2R0cmVlICA9IG5ldyBBcnJheShEX0NPREVTICogMik7XG56ZXJvKHN0YXRpY19kdHJlZSk7XG4vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlXG4gKiA1IGJpdHMuKVxuICovXG5cbnZhciBfZGlzdF9jb2RlICAgID0gbmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO1xuemVybyhfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9NQVRDSCAtIE1JTl9NQVRDSCArIDEpO1xuemVybyhfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggICA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpO1xuemVybyhiYXNlX2xlbmd0aCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9kaXN0ICAgICA9IG5ldyBBcnJheShEX0NPREVTKTtcbnplcm8oYmFzZV9kaXN0KTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovXG5cblxuZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7XG5cbiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzICAgPSBleHRyYV9iaXRzOyAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYmFzZSAgID0gZXh0cmFfYmFzZTsgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovXG4gIHRoaXMubWF4X2xlbmd0aCAgID0gbWF4X2xlbmd0aDsgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlICAgID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufVxuXG5cblxuZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHtcbiAgcmV0dXJuIGRpc3QgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdCA+Pj4gNyldO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uXG4gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuXG4gKi9cbmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXS8qLkNvZGUqLywgdHJlZVtjICogMiArIDFdLyouTGVuKi8pO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGV4dHJhICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlICAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlO1xuICB2YXIgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIHZhciBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgdmFyIG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIHMuYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXlcbiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuXG4gICAqL1xuICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXS8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi9cblxuICAgIGlmIChuID4gbWF4X2NvZGUpIHsgY29udGludWU7IH0gLyogbm90IGEgbGVhZiBub2RlICovXG5cbiAgICBzLmJsX2NvdW50W2JpdHNdKys7XG4gICAgeGJpdHMgPSAwO1xuICAgIGlmIChuID49IGJhc2UpIHtcbiAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdO1xuICAgIH1cbiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovXG4gICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqL1xuICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtcbiAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLFxuICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXVxuICAgICAqL1xuICAgIG92ZXJmbG93IC09IDI7XG4gIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7XG5cbiAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsXG4gICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuXG4gICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKVxuICAgKi9cbiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7XG4gICAgbiA9IHMuYmxfY291bnRbYml0c107XG4gICAgd2hpbGUgKG4gIT09IDApIHtcbiAgICAgIG0gPSBzLmhlYXBbLS1oXTtcbiAgICAgIGlmIChtID4gbWF4X2NvZGUpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KVxuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xue1xuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuICogMiArIDFdLyouTGVuKi87XG4gICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7XG5cbiAgICAvL1RyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsXCJcXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpIFwiLFxuICAgIC8vICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLlxuICovXG5mdW5jdGlvbiB0cl9zdGF0aWNfaW5pdCgpIHtcbiAgdmFyIG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqL1xuICB2YXIgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHtcbiAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAobGVuZ3RoID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NlwiKTtcbiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2VcbiAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOlxuICAgKi9cbiAgX2xlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTZcIik7XG4gIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqL1xuICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA5O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs5XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI3OSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMgKyAxLCBMX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSB7IHMuZHluX2R0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKVxue1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcilcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqL1xuLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovXG4vL2ludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqL1xue1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuLy8gIHdoaWxlIChsZW4tLSkge1xuLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbi8vICB9XG4gIHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7ICAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTtcbiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCBcImJhZCBkX2NvZGVcIik7XG5cbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgc3RyZWUgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGVsZW1zICAgID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7XG4gIHZhciBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqL1xuICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHZhciBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovXG5cbiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpblxuICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS5cbiAgICogaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHMuaGVhcF9sZW4gPSAwO1xuICBzLmhlYXBfbWF4ID0gSEVBUF9TSVpFO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjtcbiAgICAgIHMuZGVwdGhbbl0gPSAwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0vKi5MZW4qLztcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxLyppbnQgLzIqLyk7IG4gPj0gMTsgbi0tKSB7IHBxZG93bmhlYXAocywgdHJlZSwgbik7IH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqL1xuXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtO1xuXG4gICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi9cbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdLyouRnJlcSovICsgdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluXG4gKiBibF90cmVlLlxuICovXG5mdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTtcbiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7XG5cbiAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi9cbiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpO1xuICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0XG4gICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuXG4gICAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdFxuICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5c1xuICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pXG4gICAqL1xuICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0vKi5MZW4qLyAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovXG4gIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZFwiLFxuICAvLyAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpO1xuXG4gIHJldHVybiBtYXhfYmxpbmRleDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZVxuICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuXG4gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi9cbntcbiAgdmFyIHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdCAmIDB4ZmY7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7XG4gIHMubGFzdF9saXQrKztcblxuICBpZiAoZGlzdCA9PT0gMCkge1xuICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqL1xuICAgIHMuZHluX2x0cmVlW2xjICogMl0vKi5GcmVxKi8rKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhdWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcblxuLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbi8vICBpZiAoKHMubGFzdF9saXQgJiAweDFmZmYpID09PSAwICYmIHMubGV2ZWwgPiAyKSB7XG4vLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4vLyAgICBpbl9sZW5ndGggPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDtcbi8vXG4vLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4vLyAgICAgIG91dF9sZW5ndGggKz0gcy5keW5fZHRyZWVbZGNvZGUqMl0vKi5GcmVxKi8gKiAoNSArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7XG4vLyAgICB9XG4vLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbi8vICAgIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgXCIsXG4vLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbi8vICAgIGlmIChzLm1hdGNoZXMgPCAocy5sYXN0X2xpdD4+MSkvKmludCAvMiovICYmIG91dF9sZW5ndGggPCAoaW5fbGVuZ3RoPj4xKS8qaW50IC8yKi8pIHtcbi8vICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICB9XG4vLyAgfVxuLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuZXhwb3J0cy5fdHJfaW5pdCAgPSBfdHJfaW5pdDtcbmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7XG5leHBvcnRzLl90cl9mbHVzaF9ibG9jayAgPSBfdHJfZmx1c2hfYmxvY2s7XG5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTtcbmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2FsaWduO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogYWRsZXIzMiB0YWtlcyAxMiUgZm9yIGxldmVsIDAgYW5kIDIlIGZvciBsZXZlbCA2LlxuLy8gSXQgaXNuJ3Qgd29ydGggaXQgdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gYWRsZXIzMihhZGxlciwgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgczEgPSAoYWRsZXIgJiAweGZmZmYpIHwwLFxuICAgICAgczIgPSAoKGFkbGVyID4+PiAxNikgJiAweGZmZmYpIHwwLFxuICAgICAgbiA9IDA7XG5cbiAgd2hpbGUgKGxlbiAhPT0gMCkge1xuICAgIC8vIFNldCBsaW1pdCB+IHR3aWNlIGxlc3MgdGhhbiA1NTUyLCB0byBrZWVwXG4gICAgLy8gczIgaW4gMzEtYml0cywgYmVjYXVzZSB3ZSBmb3JjZSBzaWduZWQgaW50cy5cbiAgICAvLyBpbiBvdGhlciBjYXNlICU9IHdpbGwgZmFpbC5cbiAgICBuID0gbGVuID4gMjAwMCA/IDIwMDAgOiBsZW47XG4gICAgbGVuIC09IG47XG5cbiAgICBkbyB7XG4gICAgICBzMSA9IChzMSArIGJ1Zltwb3MrK10pIHwwO1xuICAgICAgczIgPSAoczIgKyBzMSkgfDA7XG4gICAgfSB3aGlsZSAoLS1uKTtcblxuICAgIHMxICU9IDY1NTIxO1xuICAgIHMyICU9IDY1NTIxO1xuICB9XG5cbiAgcmV0dXJuIChzMSB8IChzMiA8PCAxNikpIHwwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gYWRsZXIzMjtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IHdlIGNhbid0IGdldCBzaWduaWZpY2FudCBzcGVlZCBib29zdCBoZXJlLlxuLy8gU28gd3JpdGUgY29kZSB0byBtaW5pbWl6ZSBzaXplIC0gbm8gcHJlZ2VuZXJhdGVkIHRhYmxlc1xuLy8gYW5kIGFycmF5IHRvb2xzIGRlcGVuZGVuY2llcy5cblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vLyBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZVxuZnVuY3Rpb24gbWFrZVRhYmxlKCkge1xuICB2YXIgYywgdGFibGUgPSBbXTtcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDI1NjsgbisrKSB7XG4gICAgYyA9IG47XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCA4OyBrKyspIHtcbiAgICAgIGMgPSAoKGMgJiAxKSA/ICgweEVEQjg4MzIwIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG4gICAgfVxuICAgIHRhYmxlW25dID0gYztcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn1cblxuLy8gQ3JlYXRlIHRhYmxlIG9uIGxvYWQuIEp1c3QgMjU1IHNpZ25lZCBsb25ncy4gTm90IGEgcHJvYmxlbS5cbnZhciBjcmNUYWJsZSA9IG1ha2VUYWJsZSgpO1xuXG5cbmZ1bmN0aW9uIGNyYzMyKGNyYywgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgdCA9IGNyY1RhYmxlLFxuICAgICAgZW5kID0gcG9zICsgbGVuO1xuXG4gIGNyYyBePSAtMTtcblxuICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKyspIHtcbiAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIGJ1ZltpXSkgJiAweEZGXTtcbiAgfVxuXG4gIHJldHVybiAoY3JjIF4gKC0xKSk7IC8vID4+PiAwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gY3JjMzI7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciB0cmVlcyAgID0gcmVxdWlyZSgnLi90cmVlcycpO1xudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIG1zZyAgICAgPSByZXF1aXJlKCcuL21lc3NhZ2VzJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xudmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xuLy92YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG4vL3ZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG4vL3ZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG5cbi8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuLy92YXIgWl9OT19DT01QUkVTU0lPTiAgICAgID0gMDtcbi8vdmFyIFpfQkVTVF9TUEVFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0JFU1RfQ09NUFJFU1NJT04gICAgPSA5O1xudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG5cbnZhciBaX0ZJTFRFUkVEICAgICAgICAgICAgPSAxO1xudmFyIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7XG52YXIgWl9STEUgICAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG4vL3ZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgTUFYX01FTV9MRVZFTCA9IDk7XG4vKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi9cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9NRU1fTEVWRUwgPSA4O1xuXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBNSU5fTUFUQ0ggPSAzO1xudmFyIE1BWF9NQVRDSCA9IDI1ODtcbnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpO1xuXG52YXIgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG52YXIgSU5JVF9TVEFURSA9IDQyO1xudmFyIEVYVFJBX1NUQVRFID0gNjk7XG52YXIgTkFNRV9TVEFURSA9IDczO1xudmFyIENPTU1FTlRfU1RBVEUgPSA5MTtcbnZhciBIQ1JDX1NUQVRFID0gMTAzO1xudmFyIEJVU1lfU1RBVEUgPSAxMTM7XG52YXIgRklOSVNIX1NUQVRFID0gNjY2O1xuXG52YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FICAgICA9IDI7IC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqL1xudmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi9cblxudmFyIE9TX0NPREUgPSAweDAzOyAvLyBVbml4IDopIC4gRG9uJ3QgZGV0ZWN0LCB1c2UgdGhpcyBkZWZhdWx0LlxuXG5mdW5jdGlvbiBlcnIoc3RybSwgZXJyb3JDb2RlKSB7XG4gIHN0cm0ubXNnID0gbXNnW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59XG5cbmZ1bmN0aW9uIHJhbmsoZikge1xuICByZXR1cm4gKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApO1xufVxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzXG4gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+b3V0cHV0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LlxuICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLlxuICovXG5mdW5jdGlvbiBmbHVzaF9wZW5kaW5nKHN0cm0pIHtcbiAgdmFyIHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIHZhciBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkge1xuICB0cmVlcy5fdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci5cbiAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpblxuICogcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsIGIpIHtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKGIgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB1cGRhdGUgdGhlIGFkbGVyMzJcbiAqIGFuZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIEFsbCBkZWZsYXRlKCkgaW5wdXQgZ29lcyB0aHJvdWdoXG4gKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZFxuICogYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPmlucHV0IGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LlxuICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRfYnVmKHN0cm0sIGJ1Ziwgc3RhcnQsIHNpemUpIHtcbiAgdmFyIGxlbiA9IHN0cm0uYXZhaWxfaW47XG5cbiAgaWYgKGxlbiA+IHNpemUpIHsgbGVuID0gc2l6ZTsgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybiAwOyB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIHV0aWxzLmFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqL1xuICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovXG4gIHZhciBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi9cbiAgdmFyIGJlc3RfbGVuID0gcy5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgdmFyIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfVxuXG4gIC8vIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsIFwibmVlZCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIC8vIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgXCJubyBmdXR1cmVcIik7XG4gICAgbWF0Y2ggPSBjdXJfbWF0Y2g7XG5cbiAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2VcbiAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3dcbiAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZFxuICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuXG4gICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvXG4gICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuXG4gICAgICovXG5cbiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fFxuICAgICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICAgIF93aW5bbWF0Y2hdICAgICAgICAgICAgICAgICE9PSBfd2luW3NjYW5dIHx8XG4gICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGVcbiAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKVxuICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5XG4gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdFxuICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LlxuICAgICAqL1xuICAgIHNjYW4gKz0gMjtcbiAgICBtYXRjaCsrO1xuICAgIC8vIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsIFwibWF0Y2hbMl0/XCIpO1xuXG4gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjtcbiAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC5cbiAgICAgKi9cbiAgICBkbyB7XG4gICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4vLyAgICB2YXIgY3VyciA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZDtcbi8vICAgIHZhciBpbml0ID0gMDtcbi8vXG4vLyAgICBpZiAocy5oaWdoX3dhdGVyIDwgY3Vycikge1xuLy8gICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVRcbi8vICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gcy53aW5kb3dfc2l6ZSAtIGN1cnI7XG4vLyAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpXG4vLyAgICAgICAgaW5pdCA9IFdJTl9JTklUO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDtcbi8vICAgIH1cbi8vICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkge1xuLy8gICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhXG4vLyAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwXG4vLyAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpXG4vLyAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7XG4vLyAgICB9XG4vLyAgfVxuLy9cbi8vICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsXG4vLyAgICBcIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoXCIpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlXG4gKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZFxuICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLlxuICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbVxuICogd2luZG93IHRvIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkge1xuICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZFxuICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjpcbiAgICovXG4gIHZhciBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjtcblxuICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7XG4gICAgbWF4X2Jsb2NrX3NpemUgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1O1xuICB9XG5cbiAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IDEpIHtcblxuICAgICAgLy9Bc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHxcbiAgICAgIC8vICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsIFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIGlmICghKHMuc3Ryc3RhcnQgPCBzLndfc2l6ZSArIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHx8XG4vLyAgICAgICAgcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSkpIHtcbi8vICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIH1cblxuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDAgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG4gICAgLy9Bc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsIFwiYmxvY2sgZ29uZVwiKTtcbi8vICAgIGlmIChzLmJsb2NrX3N0YXJ0IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgZ29uZVwiKTtcblxuICAgIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gICAgcy5sb29rYWhlYWQgPSAwO1xuXG4gICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovXG4gICAgdmFyIG1heF9zdGFydCA9IHMuYmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTtcblxuICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7XG4gICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqL1xuICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0O1xuICAgICAgcy5zdHJzdGFydCA9IG1heF9zdGFydDtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG5cblxuICAgIH1cbiAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWVcbiAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cblxuICBzLmluc2VydCA9IDA7XG5cbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG5cbiAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX05FRURfTU9SRTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50XG4gKiBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0c1xuICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0XG4gKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSFxuICAgICAqL1xuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmICgocy5zdHJzdGFydCAtIGhhc2hfaGVhZCkgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cbiAgICB9XG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy8gY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGgpOyAvLyBmb3IgZGVidWcgb25seVxuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcblxuICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2gvKm1heF9pbnNlcnRfbGVuZ3RoKi8gJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmVcbiAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLlxuICAgICAgICAgICAqL1xuICAgICAgICB9IHdoaWxlICgtLXMubWF0Y2hfbGVuZ3RoICE9PSAwKTtcbiAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgfSBlbHNlXG4gICAgICB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdO1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0KzFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIHZhciBtYXhfaW5zZXJ0O1xuXG4gIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiZcbiAgICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKS8qTUFYX0RJU1QocykqLykge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG5cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmXG4gICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYvKlRPT19GQVIqLykpKSB7XG5cbiAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZVxuICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LlxuICAgICAgICAgKi9cbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7XG4gICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC5cbiAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3RcbiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW5cbiAgICAgICAqIHRoZSBoYXNoIHRhYmxlLlxuICAgICAgICovXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApO1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICAvKioqL1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGFcbiAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2hcbiAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuXG4gICAgICAgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DS19PTkxZKHMsIDApICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIC8qKiovXG4gICAgICB9XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvclxuICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCBcIm5vIGZsdXNoP1wiKTtcbiAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICB9XG4gIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBtYXRjaGVzIG9ubHkgb2YgZGlzdGFuY2VcbiAqIG9uZS4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuICAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZlxuICogZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gWl9STEUuKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3JsZShzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuICB2YXIgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIHZhciBzY2FuLCBzdHJlbmQ7ICAgICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqL1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7XG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0ID4gMCkge1xuICAgICAgc2NhbiA9IHMuc3Ryc3RhcnQgLSAxO1xuICAgICAgcHJldiA9IF93aW5bc2Nhbl07XG4gICAgICBpZiAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0pIHtcbiAgICAgICAgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHtcbiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuICAgIH1cblxuICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi9cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMuc3Ryc3RhcnQgLSAxLCBzLm1hdGNoX2xlbmd0aCk7XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3QocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX0hVRkZNQU5fT05MWSwgZG8gbm90IGxvb2sgZm9yIG1hdGNoZXMuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLlxuICogKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YgZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gSHVmZm1hbi4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogT3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG4gICAgcy5sb29rYWhlYWQtLTtcbiAgICBzLnN0cnN0YXJ0Kys7XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvblxuICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvXG4gKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmVcbiAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy5cbiAqL1xuZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykge1xuICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7XG4gIHRoaXMubWF4X2xhenkgPSBtYXhfbGF6eTtcbiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoO1xuICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjtcbiAgdGhpcy5mdW5jID0gZnVuYztcbn1cblxudmFyIGNvbmZpZ3VyYXRpb25fdGFibGU7XG5cbmNvbmZpZ3VyYXRpb25fdGFibGUgPSBbXG4gIC8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi9cbiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAgIC8qIDAgc3RvcmUgb25seSAqL1xuICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgLyogMiAqL1xuICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqL1xuXG4gIG5ldyBDb25maWcoNCwgNCwgMTYsIDE2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgICAvKiA0IGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAgICAgLyogOSBtYXggY29tcHJlc3Npb24gKi9cbl07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSBcImxvbmdlc3QgbWF0Y2hcIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gbG1faW5pdChzKSB7XG4gIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7XG5cbiAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICAgKi9cbiAgcy5tYXhfbGF6eV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2xhenk7XG4gIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7XG4gIHMubmljZV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubmljZV9sZW5ndGg7XG4gIHMubWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2NoYWluO1xuXG4gIHMuc3Ryc3RhcnQgPSAwO1xuICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLmluc2VydCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgcy5pbnNfaCA9IDA7XG59XG5cblxuZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkge1xuICB0aGlzLnN0cm0gPSBudWxsOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgICAgICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovXG4gIHRoaXMucGVuZGluZ19idWZfc2l6ZSA9IDA7ICAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAgICAgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuZ3poZWFkID0gbnVsbDsgICAgICAgICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi9cbiAgdGhpcy5tZXRob2QgPSBaX0RFRkxBVEVEOyAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqL1xuICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovXG5cbiAgdGhpcy53X3NpemUgPSAwOyAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovXG4gIHRoaXMud19iaXRzID0gMDsgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqL1xuICB0aGlzLndfbWFzayA9IDA7ICAvKiB3X3NpemUgLSAxICovXG5cbiAgdGhpcy53aW5kb3cgPSBudWxsO1xuICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdyxcbiAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemVcbiAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZlxuICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXNcbiAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuXG4gICAqL1xuXG4gIHRoaXMud2luZG93X3NpemUgPSAwO1xuICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlclxuICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LlxuICAgKi9cblxuICB0aGlzLnByZXYgPSBudWxsO1xuICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpc1xuICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLlxuICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy5cbiAgICovXG5cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqL1xuXG4gIHRoaXMuaW5zX2ggPSAwOyAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqL1xuICB0aGlzLmhhc2hfc2l6ZSA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi9cbiAgdGhpcy5oYXNoX2JpdHMgPSAwOyAgIC8qIGxvZzIoaGFzaF9zaXplKSAqL1xuICB0aGlzLmhhc2hfbWFzayA9IDA7ICAgLyogaGFzaF9zaXplLTEgKi9cblxuICB0aGlzLmhhc2hfc2hpZnQgPSAwO1xuICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dFxuICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3RcbiAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6XG4gICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHNcbiAgICovXG5cbiAgdGhpcy5ibG9ja19zdGFydCA9IDA7XG4gIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0c1xuICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLlxuICAgKi9cblxuICB0aGlzLm1hdGNoX2xlbmd0aCA9IDA7ICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi9cbiAgdGhpcy5wcmV2X21hdGNoID0gMDsgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovXG4gIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovXG4gIHRoaXMuc3Ryc3RhcnQgPSAwOyAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovXG4gIHRoaXMubWF0Y2hfc3RhcnQgPSAwOyAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi9cbiAgdGhpcy5sb29rYWhlYWQgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi9cblxuICB0aGlzLnByZXZfbGVuZ3RoID0gMDtcbiAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLlxuICAgKi9cblxuICB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwO1xuICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpc1xuICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlXG4gICAqIHNwZWVkLlxuICAgKi9cblxuICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDtcbiAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseVxuICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvblxuICAgKiBsZXZlbHMgPj0gNC5cbiAgICovXG4gIC8vIFRoYXQncyBhbGlhcyB0byBtYXhfbGF6eV9tYXRjaCwgZG9uJ3QgdXNlIGRpcmVjdGx5XG4gIC8vdGhpcy5tYXhfaW5zZXJ0X2xlbmd0aCA9IDA7XG4gIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90XG4gICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy5cbiAgICovXG5cbiAgdGhpcy5sZXZlbCA9IDA7ICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi9cbiAgdGhpcy5zdHJhdGVneSA9IDA7ICAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovXG5cbiAgdGhpcy5nb29kX21hdGNoID0gMDtcbiAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovXG5cbiAgdGhpcy5uaWNlX21hdGNoID0gMDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqL1xuXG4gICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi9cblxuICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovXG5cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovXG5cbiAgLy8gVXNlIGZsYXQgYXJyYXkgb2YgRE9VQkxFIHNpemUsIHdpdGggaW50ZXJsZWF2ZWQgZmF0YSxcbiAgLy8gYmVjYXVzZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZVxuICB0aGlzLmR5bl9sdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoSEVBUF9TSVpFICogMik7XG4gIHRoaXMuZHluX2R0cmVlICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIERfQ09ERVMgKyAxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7XG4gIHplcm8odGhpcy5keW5fbHRyZWUpO1xuICB6ZXJvKHRoaXMuZHluX2R0cmVlKTtcbiAgemVybyh0aGlzLmJsX3RyZWUpO1xuXG4gIHRoaXMubF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi9cbiAgdGhpcy5kX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi9cbiAgdGhpcy5ibF9kZXNjICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGJpdCBsZW5ndGggdHJlZSAqL1xuXG4gIC8vdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdO1xuICB0aGlzLmJsX2NvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB6ZXJvKHRoaXMuaGVhcCk7XG5cbiAgdGhpcy5oZWFwX2xlbiA9IDA7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovXG4gIHRoaXMuaGVhcF9tYXggPSAwOyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi9cbiAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy5cbiAgICovXG5cbiAgdGhpcy5kZXB0aCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAvL3VjaCBkZXB0aFsyKkxfQ09ERVMrMV07XG4gIHplcm8odGhpcy5kZXB0aCk7XG4gIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3lcbiAgICovXG5cbiAgdGhpcy5sX2J1ZiA9IDA7ICAgICAgICAgIC8qIGJ1ZmZlciBpbmRleCBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqL1xuXG4gIHRoaXMubGl0X2J1ZnNpemUgPSAwO1xuICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yXG4gICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzpcbiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVyc1xuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0XG4gICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlblxuICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3JcbiAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKVxuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW5cbiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS5cbiAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLlxuICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0XG4gICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yXG4gICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnlcbiAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlXG4gICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmdcbiAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS5cbiAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNFxuICAgKi9cblxuICB0aGlzLmxhc3RfbGl0ID0gMDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG5cbiAgdGhpcy5kX2J1ZiA9IDA7XG4gIC8qIEJ1ZmZlciBpbmRleCBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmVcbiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWdcbiAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LlxuICAgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7ICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovXG5cblxuICB0aGlzLmJpX2J1ZiA9IDA7XG4gIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0XG4gICAqIHNpZ25pZmljYW50IGJpdHMpLlxuICAgKi9cbiAgdGhpcy5iaV92YWxpZCA9IDA7XG4gIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdFxuICAgKiBhcmUgYWx3YXlzIHplcm8uXG4gICAqL1xuXG4gIC8vIFVzZWQgZm9yIHdpbmRvdyBtZW1vcnkgaW5pdC4gV2Ugc2FmZWx5IGlnbm9yZSBpdCBmb3IgSlMuIFRoYXQgbWFrZXNcbiAgLy8gc2Vuc2Ugb25seSBmb3IgcG9pbnRlcnMgYW5kIG1lbW9yeSBjaGVjayB0b29scy5cbiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwO1xuICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmVcbiAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW5cbiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW5cbiAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay5cbiAgICovXG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gMDtcbiAgc3RybS5kYXRhX3R5cGUgPSBaX1VOS05PV047XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHMucGVuZGluZyA9IDA7XG4gIHMucGVuZGluZ19vdXQgPSAwO1xuXG4gIGlmIChzLndyYXAgPCAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgICAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqL1xuICB9XG4gIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwICAvLyBjcmMzMigwLCBaX05VTEwsIDApXG4gIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDtcbiAgdHJlZXMuX3RyX2luaXQocyk7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuICBpZiAocmV0ID09PSBaX09LKSB7XG4gICAgbG1faW5pdChzdHJtLnN0YXRlKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgIT09IDIpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0cm0uc3RhdGUuZ3poZWFkID0gaGVhZDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkge1xuICBpZiAoIXN0cm0pIHsgLy8gPT09IFpfTlVMTFxuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICB2YXIgd3JhcCA9IDE7XG5cbiAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7ICAgICAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCB8fFxuICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8XG4gICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cblxuICBpZiAod2luZG93Qml0cyA9PT0gOCkge1xuICAgIHdpbmRvd0JpdHMgPSA5O1xuICB9XG4gIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi9cblxuICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcblxuICBzLndyYXAgPSB3cmFwO1xuICBzLmd6aGVhZCA9IG51bGw7XG4gIHMud19iaXRzID0gd2luZG93Qml0cztcbiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzO1xuICBzLndfbWFzayA9IHMud19zaXplIC0gMTtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzO1xuICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTtcbiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBNSU5fTUFUQ0gpO1xuXG4gIHMud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUgKiAyKTtcbiAgcy5oZWFkID0gbmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTtcbiAgcy5wcmV2ID0gbmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKTtcblxuICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy5cbiAgLy9zLmhpZ2hfd2F0ZXIgPSAwOyAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi9cblxuICBzLmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcblxuICAvL292ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpO1xuICAvL3MtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7XG4gIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTtcblxuICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgICAgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT09IFpfRklOSVNIKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgcy5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovXG4gIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHtcblxuICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzLmd6aGVhZC5oY3JjID8gMiA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuY29tbWVudCA/IDAgOiAxNilcbiAgICAgICAgKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQudGltZSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAxNikgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMjQpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQub3MgJiAweGZmKTtcbiAgICAgICAgaWYgKHMuZ3poZWFkLmV4dHJhICYmIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkge1xuICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmYpO1xuICAgICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC5leHRyYS5sZW5ndGggPj4gOCkgJiAweGZmKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcsIDApO1xuICAgICAgICB9XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gRVhUUkFfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgLy8gREVGTEFURSBoZWFkZXJcbiAgICB7XG4gICAgICB2YXIgaGVhZGVyID0gKFpfREVGTEFURUQgKyAoKHMud19iaXRzIC0gOCkgPDwgNCkpIDw8IDg7XG4gICAgICB2YXIgbGV2ZWxfZmxhZ3MgPSAtMTtcblxuICAgICAgaWYgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsIDwgNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPT09IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzO1xuICAgICAgfVxuICAgICAgaGVhZGVyIHw9IChsZXZlbF9mbGFncyA8PCA2KTtcbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7IGhlYWRlciB8PSBQUkVTRVRfRElDVDsgfVxuICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTtcblxuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTtcblxuICAgICAgLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovXG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkge1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IDE7IC8vIGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgfVxuICB9XG5cbi8vI2lmZGVmIEdaSVBcbiAgaWYgKHMuc3RhdHVzID09PSBFWFRSQV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5leHRyYS8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG5cbiAgICAgIHdoaWxlIChzLmd6aW5kZXggPCAocy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZmZmKSkge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhW3MuZ3ppbmRleF0gJiAweGZmKTtcbiAgICAgICAgcy5nemluZGV4Kys7XG4gICAgICB9XG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aW5kZXggPT09IHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IE5BTUVfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQubmFtZS8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLm5hbWUubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gQ09NTUVOVF9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5jb21tZW50LyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQuY29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBIQ1JDX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyID4gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICB9XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA8PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICBzdHJtLmFkbGVyID0gMDsgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICB9XG4gIH1cbi8vI2VuZGlmXG5cbiAgLyogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZSAqL1xuICBpZiAocy5wZW5kaW5nICE9PSAwKSB7XG4gICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIC8qIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGhcbiAgICAgICAqIG1vcmUgb3V0cHV0IHNwYWNlLCBidXQgcG9zc2libHkgd2l0aCBib3RoIHBlbmRpbmcgYW5kXG4gICAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbyxcbiAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlXG4gICAgICAgKiByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgYXQgbmV4dCBjYWxsIG9mIGRlZmxhdGU6XG4gICAgICAgKi9cbiAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgcmV0dXJuIFpfT0s7XG4gICAgfVxuXG4gICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWV0aGluZyB0byBkbyBhbmQgYXZvaWQgZHVwbGljYXRlIGNvbnNlY3V0aXZlXG4gICAgICogZmx1c2hlcy4gRm9yIHJlcGVhdGVkIGFuZCB1c2VsZXNzIGNhbGxzIHdpdGggWl9GSU5JU0gsIHdlIGtlZXBcbiAgICAgKiByZXR1cm5pbmcgWl9TVFJFQU1fRU5EIGluc3RlYWQgb2YgWl9CVUZfRVJST1IuXG4gICAgICovXG4gIH0gZWxzZSBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiByYW5rKGZsdXNoKSA8PSByYW5rKG9sZF9mbHVzaCkgJiZcbiAgICBmbHVzaCAhPT0gWl9GSU5JU0gpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SKTtcbiAgfVxuXG4gIC8qIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6ICovXG4gIGlmIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SKTtcbiAgfVxuXG4gIC8qIFN0YXJ0IGEgbmV3IGJsb2NrIG9yIGNvbnRpbnVlIHRoZSBjdXJyZW50IG9uZS5cbiAgICovXG4gIGlmIChzdHJtLmF2YWlsX2luICE9PSAwIHx8IHMubG9va2FoZWFkICE9PSAwIHx8XG4gICAgKGZsdXNoICE9PSBaX05PX0ZMVVNIICYmIHMuc3RhdHVzICE9PSBGSU5JU0hfU1RBVEUpKSB7XG4gICAgdmFyIGJzdGF0ZSA9IChzLnN0cmF0ZWd5ID09PSBaX0hVRkZNQU5fT05MWSkgPyBkZWZsYXRlX2h1ZmYocywgZmx1c2gpIDpcbiAgICAgIChzLnN0cmF0ZWd5ID09PSBaX1JMRSA/IGRlZmxhdGVfcmxlKHMsIGZsdXNoKSA6XG4gICAgICAgIGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZnVuYyhzLCBmbHVzaCkpO1xuXG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfRE9ORSkge1xuICAgICAgcy5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7XG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX05FRURfTU9SRSB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEKSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICAgIC8qIGF2b2lkIEJVRl9FUlJPUiBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqL1xuICAgICAgfVxuICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICAvKiBJZiBmbHVzaCAhPSBaX05PX0ZMVVNIICYmIGF2YWlsX291dCA9PSAwLCB0aGUgbmV4dCBjYWxsXG4gICAgICAgKiBvZiBkZWZsYXRlIHNob3VsZCB1c2UgdGhlIHNhbWUgZmx1c2ggcGFyYW1ldGVyIHRvIG1ha2Ugc3VyZVxuICAgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuXG4gICAgICAgKiBlbXB0eSBibG9jayBoZXJlLCB0aGlzIHdpbGwgYmUgZG9uZSBhdCBuZXh0IGNhbGwuIFRoaXMgYWxzb1xuICAgICAgICogZW5zdXJlcyB0aGF0IGZvciBhIHZlcnkgc21hbGwgb3V0cHV0IGJ1ZmZlciwgd2UgZW1pdCBhdCBtb3N0XG4gICAgICAgKiBvbmUgZW1wdHkgYmxvY2suXG4gICAgICAgKi9cbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfQkxPQ0tfRE9ORSkge1xuICAgICAgaWYgKGZsdXNoID09PSBaX1BBUlRJQUxfRkxVU0gpIHtcbiAgICAgICAgdHJlZXMuX3RyX2FsaWduKHMpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZmx1c2ggIT09IFpfQkxPQ0spIHsgLyogRlVMTF9GTFVTSCBvciBTWU5DX0ZMVVNIICovXG5cbiAgICAgICAgdHJlZXMuX3RyX3N0b3JlZF9ibG9jayhzLCAwLCAwLCBmYWxzZSk7XG4gICAgICAgIC8qIEZvciBhIGZ1bGwgZmx1c2gsIHRoaXMgZW1wdHkgYmxvY2sgd2lsbCBiZSByZWNvZ25pemVkXG4gICAgICAgICAqIGFzIGEgc3BlY2lhbCBtYXJrZXIgYnkgaW5mbGF0ZV9zeW5jKCkuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfRlVMTF9GTFVTSCkge1xuICAgICAgICAgIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqLyAgICAgICAgICAgICAvKiBmb3JnZXQgaGlzdG9yeSAqL1xuICAgICAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICAgICAgcy5zdHJzdGFydCA9IDA7XG4gICAgICAgICAgICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuaW5zZXJ0ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7IC8qIGF2b2lkIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqL1xuICAgICAgICByZXR1cm4gWl9PSztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQoc3RybS0+YXZhaWxfb3V0ID4gMCwgXCJidWcyXCIpO1xuICAvL2lmIChzdHJtLmF2YWlsX291dCA8PSAwKSB7IHRocm93IG5ldyBFcnJvcihcImJ1ZzJcIik7fVxuXG4gIGlmIChmbHVzaCAhPT0gWl9GSU5JU0gpIHsgcmV0dXJuIFpfT0s7IH1cbiAgaWYgKHMud3JhcCA8PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FTkQ7IH1cblxuICAvKiBXcml0ZSB0aGUgdHJhaWxlciAqL1xuICBpZiAocy53cmFwID09PSAyKSB7XG4gICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMTYpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMjQpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDgpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMTYpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMjQpICYgMHhmZik7XG4gIH1cbiAgZWxzZVxuICB7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICB9XG5cbiAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgLyogSWYgYXZhaWxfb3V0IGlzIHplcm8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgZGVmbGF0ZSBhZ2FpblxuICAgKiB0byBmbHVzaCB0aGUgcmVzdC5cbiAgICovXG4gIGlmIChzLndyYXAgPiAwKSB7IHMud3JhcCA9IC1zLndyYXA7IH1cbiAgLyogd3JpdGUgdGhlIHRyYWlsZXIgb25seSBvbmNlISAqL1xuICByZXR1cm4gcy5wZW5kaW5nICE9PSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUVuZChzdHJtKSB7XG4gIHZhciBzdGF0dXM7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0dXMgPSBzdHJtLnN0YXRlLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gSU5JVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRVhUUkFfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IE5BTUVfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IENPTU1FTlRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEhDUkNfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEJVU1lfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEZJTklTSF9TVEFURVxuICApIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuXG4gIHJldHVybiBzdGF0dXMgPT09IEJVU1lfU1RBVEUgPyBlcnIoc3RybSwgWl9EQVRBX0VSUk9SKSA6IFpfT0s7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZVxuICogc2VxdWVuY2Ugd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LlxuICovXG5mdW5jdGlvbiBkZWZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHM7XG4gIHZhciBzdHIsIG47XG4gIHZhciB3cmFwO1xuICB2YXIgYXZhaWw7XG4gIHZhciBuZXh0O1xuICB2YXIgaW5wdXQ7XG4gIHZhciB0bXBEaWN0O1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHdyYXAgPSBzLndyYXA7XG5cbiAgaWYgKHdyYXAgPT09IDIgfHwgKHdyYXAgPT09IDEgJiYgcy5zdGF0dXMgIT09IElOSVRfU1RBVEUpIHx8IHMubG9va2FoZWFkKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogd2hlbiB1c2luZyB6bGliIHdyYXBwZXJzLCBjb21wdXRlIEFkbGVyLTMyIGZvciBwcm92aWRlZCBkaWN0aW9uYXJ5ICovXG4gIGlmICh3cmFwID09PSAxKSB7XG4gICAgLyogYWRsZXIzMihzdHJtLT5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7ICovXG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gIH1cblxuICBzLndyYXAgPSAwOyAgIC8qIGF2b2lkIGNvbXB1dGluZyBBZGxlci0zMiBpbiByZWFkX2J1ZiAqL1xuXG4gIC8qIGlmIGRpY3Rpb25hcnkgd291bGQgZmlsbCB3aW5kb3csIGp1c3QgcmVwbGFjZSB0aGUgaGlzdG9yeSAqL1xuICBpZiAoZGljdExlbmd0aCA+PSBzLndfc2l6ZSkge1xuICAgIGlmICh3cmFwID09PSAwKSB7ICAgICAgICAgICAgLyogYWxyZWFkeSBlbXB0eSBvdGhlcndpc2UgKi9cbiAgICAgIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqL1xuICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuICAgICAgcy5zdHJzdGFydCA9IDA7XG4gICAgICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgICAgIHMuaW5zZXJ0ID0gMDtcbiAgICB9XG4gICAgLyogdXNlIHRoZSB0YWlsICovXG4gICAgLy8gZGljdGlvbmFyeSA9IGRpY3Rpb25hcnkuc2xpY2UoZGljdExlbmd0aCAtIHMud19zaXplKTtcbiAgICB0bXBEaWN0ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUpO1xuICAgIHV0aWxzLmFycmF5U2V0KHRtcERpY3QsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGggLSBzLndfc2l6ZSwgcy53X3NpemUsIDApO1xuICAgIGRpY3Rpb25hcnkgPSB0bXBEaWN0O1xuICAgIGRpY3RMZW5ndGggPSBzLndfc2l6ZTtcbiAgfVxuICAvKiBpbnNlcnQgZGljdGlvbmFyeSBpbnRvIHdpbmRvdyBhbmQgaGFzaCAqL1xuICBhdmFpbCA9IHN0cm0uYXZhaWxfaW47XG4gIG5leHQgPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGRpY3RMZW5ndGg7XG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uaW5wdXQgPSBkaWN0aW9uYXJ5O1xuICBmaWxsX3dpbmRvdyhzKTtcbiAgd2hpbGUgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgIHN0ciA9IHMuc3Ryc3RhcnQ7XG4gICAgbiA9IHMubG9va2FoZWFkIC0gKE1JTl9NQVRDSCAtIDEpO1xuICAgIGRvIHtcbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4gICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuXG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICBzdHIrKztcbiAgICB9IHdoaWxlICgtLW4pO1xuICAgIHMuc3Ryc3RhcnQgPSBzdHI7XG4gICAgcy5sb29rYWhlYWQgPSBNSU5fTUFUQ0ggLSAxO1xuICAgIGZpbGxfd2luZG93KHMpO1xuICB9XG4gIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gIHMuYmxvY2tfc3RhcnQgPSBzLnN0cnN0YXJ0O1xuICBzLmluc2VydCA9IHMubG9va2FoZWFkO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5pbnB1dCA9IGlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gYXZhaWw7XG4gIHMud3JhcCA9IHdyYXA7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmV4cG9ydHMuZGVmbGF0ZUluaXQgPSBkZWZsYXRlSW5pdDtcbmV4cG9ydHMuZGVmbGF0ZUluaXQyID0gZGVmbGF0ZUluaXQyO1xuZXhwb3J0cy5kZWZsYXRlUmVzZXQgPSBkZWZsYXRlUmVzZXQ7XG5leHBvcnRzLmRlZmxhdGVSZXNldEtlZXAgPSBkZWZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5kZWZsYXRlU2V0SGVhZGVyID0gZGVmbGF0ZVNldEhlYWRlcjtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVFbmQgPSBkZWZsYXRlRW5kO1xuZXhwb3J0cy5kZWZsYXRlU2V0RGljdGlvbmFyeSA9IGRlZmxhdGVTZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5kZWZsYXRlSW5mbyA9ICdwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpJztcblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmRlZmxhdGVCb3VuZCA9IGRlZmxhdGVCb3VuZDtcbmV4cG9ydHMuZGVmbGF0ZUNvcHkgPSBkZWZsYXRlQ29weTtcbmV4cG9ydHMuZGVmbGF0ZVBhcmFtcyA9IGRlZmxhdGVQYXJhbXM7XG5leHBvcnRzLmRlZmxhdGVQZW5kaW5nID0gZGVmbGF0ZVBlbmRpbmc7XG5leHBvcnRzLmRlZmxhdGVQcmltZSA9IGRlZmxhdGVQcmltZTtcbmV4cG9ydHMuZGVmbGF0ZVR1bmUgPSBkZWZsYXRlVHVuZTtcbiovXG4iLCAiLy8gU3RyaW5nIGVuY29kZS9kZWNvZGUgaGVscGVyc1xuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuLy8gUXVpY2sgY2hlY2sgaWYgd2UgY2FuIHVzZSBmYXN0IGFycmF5IHRvIGJpbiBzdHJpbmcgY29udmVyc2lvblxuLy9cbi8vIC0gYXBwbHkoQXJyYXkpIGNhbiBmYWlsIG9uIEFuZHJvaWQgMi4yXG4vLyAtIGFwcGx5KFVpbnQ4QXJyYXkpIGNhbiBmYWlsIG9uIGlPUyA1LjEgU2FmYXJpXG4vL1xudmFyIFNUUl9BUFBMWV9PSyA9IHRydWU7XG52YXIgU1RSX0FQUExZX1VJQV9PSyA9IHRydWU7XG5cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgWyAwIF0pOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfT0sgPSBmYWxzZTsgfVxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9VSUFfT0sgPSBmYWxzZTsgfVxuXG5cbi8vIFRhYmxlIHdpdGggdXRmOCBsZW5ndGhzIChjYWxjdWxhdGVkIGJ5IGZpcnN0IGJ5dGUgb2Ygc2VxdWVuY2UpXG4vLyBOb3RlLCB0aGF0IDUgJiA2LWJ5dGUgdmFsdWVzIGFuZCBzb21lIDQtYnl0ZSB2YWx1ZXMgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBpbiBKUyxcbi8vIGJlY2F1c2UgbWF4IHBvc3NpYmxlIGNvZGVwb2ludCBpcyAweDEwZmZmZlxudmFyIF91dGY4bGVuID0gbmV3IHV0aWxzLkJ1ZjgoMjU2KTtcbmZvciAodmFyIHEgPSAwOyBxIDwgMjU2OyBxKyspIHtcbiAgX3V0ZjhsZW5bcV0gPSAocSA+PSAyNTIgPyA2IDogcSA+PSAyNDggPyA1IDogcSA+PSAyNDAgPyA0IDogcSA+PSAyMjQgPyAzIDogcSA+PSAxOTIgPyAyIDogMSk7XG59XG5fdXRmOGxlblsyNTRdID0gX3V0ZjhsZW5bMjU0XSA9IDE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuXG4vLyBjb252ZXJ0IHN0cmluZyB0byBhcnJheSAodHlwZWQsIHdoZW4gcG9zc2libGUpXG5leHBvcnRzLnN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBidWYsIGMsIGMyLCBtX3BvcywgaSwgc3RyX2xlbiA9IHN0ci5sZW5ndGgsIGJ1Zl9sZW4gPSAwO1xuXG4gIC8vIGNvdW50IGJpbmFyeSBzaXplXG4gIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGJ1Zl9sZW4gKz0gYyA8IDB4ODAgPyAxIDogYyA8IDB4ODAwID8gMiA6IGMgPCAweDEwMDAwID8gMyA6IDQ7XG4gIH1cblxuICAvLyBhbGxvY2F0ZSBidWZmZXJcbiAgYnVmID0gbmV3IHV0aWxzLkJ1ZjgoYnVmX2xlbik7XG5cbiAgLy8gY29udmVydFxuICBmb3IgKGkgPSAwLCBtX3BvcyA9IDA7IGkgPCBidWZfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgIC8qIG9uZSBieXRlICovXG4gICAgICBidWZbaSsrXSA9IGM7XG4gICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2UgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweEUwIHwgKGMgPj4+IDEyKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBmb3VyIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4ZjAgfCAoYyA+Pj4gMTgpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDEyICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmO1xufTtcblxuLy8gSGVscGVyICh1c2VkIGluIDIgcGxhY2VzKVxuZnVuY3Rpb24gYnVmMmJpbnN0cmluZyhidWYsIGxlbikge1xuICAvLyBPbiBDaHJvbWUsIHRoZSBhcmd1bWVudHMgaW4gYSBmdW5jdGlvbiBjYWxsIHRoYXQgYXJlIGFsbG93ZWQgaXMgYDY1NTM0YC5cbiAgLy8gSWYgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbiB0aGF0LCB3ZSBjYW4gdXNlIHRoaXMgb3B0aW1pemF0aW9uLFxuICAvLyBvdGhlcndpc2Ugd2Ugd2lsbCB0YWtlIGEgc2xvd2VyIHBhdGguXG4gIGlmIChsZW4gPCA2NTUzNCkge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIFZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgYnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbiIsICIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9kZWZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcblxudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbnZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuXG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qKlxuICogY2xhc3MgRGVmbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2RlZmxhdGVdXSxcbiAqIFtbZGVmbGF0ZVJhd11dIGFuZCBbW2d6aXBdXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIERlZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0RlZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRkZW4uXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5yZXN1bHQgLT4gVWludDhBcnJheXxBcnJheVxuICpcbiAqIENvbXByZXNzZWQgcmVzdWx0LCBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBbW0RlZmxhdGUjb25EYXRhXV1cbiAqIGFuZCBbW0RlZmxhdGUjb25FbmRdXSBoYW5kbGVycy4gRmlsbGVkIGFmdGVyIHlvdSBwdXNoIGxhc3QgY2h1bmtcbiAqIChjYWxsIFtbRGVmbGF0ZSNwdXNoXV0gd2l0aCBgWl9GSU5JU0hgIC8gYHRydWVgIHBhcmFtKSAgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGRlZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBZb3Ugd2lsbCBub3QgbmVlZCBpdCBpbiByZWFsIGxpZmUsIGJlY2F1c2UgZGVmbGF0ZSBlcnJvcnNcbiAqIGFyZSBwb3NzaWJsZSBvbmx5IG9uIHdyb25nIG9wdGlvbnMgb3IgYmFkIGBvbkRhdGFgIC8gYG9uRW5kYFxuICogY3VzdG9tIGhhbmRsZXJzLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUubXNnIC0+IFN0cmluZ1xuICpcbiAqIEVycm9yIG1lc3NhZ2UsIGlmIFtbRGVmbGF0ZS5lcnJdXSAhPSAwXG4gKiovXG5cblxuLyoqXG4gKiBuZXcgRGVmbGF0ZShvcHRpb25zKVxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBDcmVhdGVzIG5ldyBkZWZsYXRvciBpbnN0YW5jZSB3aXRoIHNwZWNpZmllZCBwYXJhbXMuIFRocm93cyBleGNlcHRpb25cbiAqIG9uIGJhZCBwYXJhbXMuIFN1cHBvcnRlZCBvcHRpb25zOlxuICpcbiAqIC0gYGxldmVsYFxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYG1lbUxldmVsYFxuICogLSBgc3RyYXRlZ3lgXG4gKiAtIGBkaWN0aW9uYXJ5YFxuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlLlxuICpcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucywgZm9yIGludGVybmFsIG5lZWRzOlxuICpcbiAqIC0gYGNodW5rU2l6ZWAgLSBzaXplIG9mIGdlbmVyYXRlZCBkYXRhIGNodW5rcyAoMTZLIGJ5IGRlZmF1bHQpXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIGRvIHJhdyBkZWZsYXRlXG4gKiAtIGBnemlwYCAoQm9vbGVhbikgLSBjcmVhdGUgZ3ppcCB3cmFwcGVyXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICogLSBgaGVhZGVyYCAoT2JqZWN0KSAtIGN1c3RvbSBoZWFkZXIgZm9yIGd6aXBcbiAqICAgLSBgdGV4dGAgKEJvb2xlYW4pIC0gdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dFxuICogICAtIGB0aW1lYCAoTnVtYmVyKSAtIG1vZGlmaWNhdGlvbiB0aW1lLCB1bml4IHRpbWVzdGFtcFxuICogICAtIGBvc2AgKE51bWJlcikgLSBvcGVyYXRpb24gc3lzdGVtIGNvZGVcbiAqICAgLSBgZXh0cmFgIChBcnJheSkgLSBhcnJheSBvZiBieXRlcyB3aXRoIGV4dHJhIGRhdGEgKG1heCA2NTUzNilcbiAqICAgLSBgbmFtZWAgKFN0cmluZykgLSBmaWxlIG5hbWUgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGNvbW1lbnRgIChTdHJpbmcpIC0gY29tbWVudCAoYmluYXJ5IHN0cmluZylcbiAqICAgLSBgaGNyY2AgKEJvb2xlYW4pIC0gdHJ1ZSBpZiBoZWFkZXIgY3JjIHNob3VsZCBiZSBhZGRlZFxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgZGVmbGF0ZSA9IG5ldyBwYWtvLkRlZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGRlZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGRlZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGRlZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihkZWZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhkZWZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIERlZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRGVmbGF0ZSkpIHJldHVybiBuZXcgRGVmbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGxldmVsOiBaX0RFRkFVTFRfQ09NUFJFU1NJT04sXG4gICAgbWV0aG9kOiBaX0RFRkxBVEVELFxuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMTUsXG4gICAgbWVtTGV2ZWw6IDgsXG4gICAgc3RyYXRlZ3k6IFpfREVGQVVMVF9TVFJBVEVHWSxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICBpZiAob3B0LnJhdyAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAob3B0Lmd6aXAgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMTY7XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LmxldmVsLFxuICAgIG9wdC5tZXRob2QsXG4gICAgb3B0LndpbmRvd0JpdHMsXG4gICAgb3B0Lm1lbUxldmVsLFxuICAgIG9wdC5zdHJhdGVneVxuICApO1xuXG4gIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgaWYgKG9wdC5oZWFkZXIpIHtcbiAgICB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sIG9wdC5oZWFkZXIpO1xuICB9XG5cbiAgaWYgKG9wdC5kaWN0aW9uYXJ5KSB7XG4gICAgdmFyIGRpY3Q7XG4gICAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgICAgZGljdCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKG9wdC5kaWN0aW9uYXJ5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgICAgZGljdCA9IG5ldyBVaW50OEFycmF5KG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGljdCA9IG9wdC5kaWN0aW9uYXJ5O1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3QpO1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kaWN0X3NldCA9IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YS4gU3RyaW5ncyB3aWxsIGJlXG4gKiAgIGNvbnZlcnRlZCB0byB1dGY4IGJ5dGUgc2VxdWVuY2UuXG4gKiAtIG1vZGUgKE51bWJlcnxCb29sZWFuKTogMC4uNiBmb3IgY29ycmVzcG9uZGluZyBaX05PX0ZMVVNILi5aX1RSRUUgbW9kZXMuXG4gKiAgIFNlZSBjb25zdGFudHMuIFNraXBwZWQgb3IgYGZhbHNlYCBtZWFucyBaX05PX0ZMVVNILCBgdHJ1ZWAgbWVhbnMgWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBkZWZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tEZWZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBjb21wcmVzc2VkIGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbRGVmbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbRGVmbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGFycmF5IGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZShzdHJtLCBfbW9kZSk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBaX0ZJTklTSCB8fCBfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3MuYnVmMmJpbnN0cmluZyh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQpO1xuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IFpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChaX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXRwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIERlZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogZGVmbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgb25jZSBhZnRlciB5b3UgdGVsbCBkZWZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IFpfT0spIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBkZWZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBDb21wcmVzcyBgZGF0YWAgd2l0aCBkZWZsYXRlIGFsZ29yaXRobSBhbmQgYG9wdGlvbnNgLlxuICpcbiAqIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiAqXG4gKiAtIGxldmVsXG4gKiAtIHdpbmRvd0JpdHNcbiAqIC0gbWVtTGV2ZWxcbiAqIC0gc3RyYXRlZ3lcbiAqIC0gZGljdGlvbmFyeVxuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIFwiYmluYXJ5IHN0cmluZ1wiXG4gKiAgICAoZWFjaCBjaGFyIGNvZGUgWzAuLjI1NV0pXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGRhdGEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBha28uZGVmbGF0ZShkYXRhKSk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGRlZmxhdG9yID0gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgZGVmbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGRlZmxhdG9yLmVycikgeyB0aHJvdyBkZWZsYXRvci5tc2cgfHwgbXNnW2RlZmxhdG9yLmVycl07IH1cblxuICByZXR1cm4gZGVmbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogZGVmbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tkZWZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGRlZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogZ3ppcChkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tkZWZsYXRlXV0sIGJ1dCBjcmVhdGUgZ3ppcCB3cmFwcGVyIGluc3RlYWQgb2ZcbiAqIGRlZmxhdGUgb25lLlxuICoqL1xuZnVuY3Rpb24gZ3ppcChpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5nemlwID0gdHJ1ZTtcbiAgcmV0dXJuIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbmV4cG9ydHMuRGVmbGF0ZSA9IERlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlUmF3ID0gZGVmbGF0ZVJhdztcbmV4cG9ydHMuZ3ppcCA9IGd6aXA7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFNlZSBzdGF0ZSBkZWZzIGZyb20gaW5mbGF0ZS5qc1xudmFyIEJBRCA9IDMwOyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cblxuLypcbiAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmdcbiAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpc1xuICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3JcbiAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGVcbiAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLlxuXG4gICBFbnRyeSBhc3N1bXB0aW9uczpcblxuICAgICAgICBzdGF0ZS5tb2RlID09PSBMRU5cbiAgICAgICAgc3RybS5hdmFpbF9pbiA+PSA2XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID49IDI1OFxuICAgICAgICBzdGFydCA+PSBzdHJtLmF2YWlsX291dFxuICAgICAgICBzdGF0ZS5iaXRzIDwgOFxuXG4gICBPbiByZXR1cm4sIHN0YXRlLm1vZGUgaXMgb25lIG9mOlxuXG4gICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dFxuICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9ja1xuICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YVxuXG4gICBOb3RlczpcblxuICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlXG4gICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSxcbiAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuXG4gICAgICBUaGVyZWZvcmUgaWYgc3RybS5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZFxuICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy5cblxuICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OFxuICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpXG4gICAgICByZXF1aXJlcyBzdHJtLmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3JcbiAgICAgIG91dHB1dCBzcGFjZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgX2luOyAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5pbnB1dCAqL1xuICB2YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogaGF2ZSBlbm91Z2ggaW5wdXQgd2hpbGUgaW4gPCBsYXN0ICovXG4gIHZhciBfb3V0OyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgYmVnOyAgICAgICAgICAgICAgICAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovXG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICB2YXIgZG1heDsgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovXG4vLyNlbmRpZlxuICB2YXIgd3NpemU7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHZhciB3aGF2ZTsgICAgICAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHZhciB3bmV4dDsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgLy8gVXNlIGBzX3dpbmRvd2AgaW5zdGVhZCBgd2luZG93YCwgYXZvaWQgY29uZmxpY3Qgd2l0aCBpbnN0cnVtZW50YXRpb24gdG9vbHNcbiAgdmFyIHNfd2luZG93OyAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5ob2xkICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmJpdHMgKi9cbiAgdmFyIGxjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ubGVuY29kZSAqL1xuICB2YXIgZGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5kaXN0Y29kZSAqL1xuICB2YXIgbG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovXG4gIHZhciBkbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuICB2YXIgaGVyZTsgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovXG4gIHZhciBvcDsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB3aW5kb3cgcG9zaXRpb24sIHdpbmRvdyBieXRlcyB0byBjb3B5ICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqL1xuICB2YXIgZGlzdDsgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG5cblxuICB2YXIgaW5wdXQsIG91dHB1dDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuXG4gIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovXG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgLy9oZXJlID0gc3RhdGUuaGVyZTtcbiAgX2luID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGxhc3QgPSBfaW4gKyAoc3RybS5hdmFpbF9pbiAtIDUpO1xuICBfb3V0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGJlZyA9IF9vdXQgLSAoc3RhcnQgLSBzdHJtLmF2YWlsX291dCk7XG4gIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgZG1heCA9IHN0YXRlLmRtYXg7XG4vLyNlbmRpZlxuICB3c2l6ZSA9IHN0YXRlLndzaXplO1xuICB3aGF2ZSA9IHN0YXRlLndoYXZlO1xuICB3bmV4dCA9IHN0YXRlLnduZXh0O1xuICBzX3dpbmRvdyA9IHN0YXRlLndpbmRvdztcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICBsY29kZSA9IHN0YXRlLmxlbmNvZGU7XG4gIGRjb2RlID0gc3RhdGUuZGlzdGNvZGU7XG4gIGxtYXNrID0gKDEgPDwgc3RhdGUubGVuYml0cykgLSAxO1xuICBkbWFzayA9ICgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDE7XG5cblxuICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2hcbiAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgKi9cblxuICB0b3A6XG4gIGRvIHtcbiAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICB9XG5cbiAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTtcblxuICAgIGRvbGVuOlxuICAgIGZvciAoOzspIHsgLy8gR290byBlbXVsYXRpb25cbiAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgYml0cyAtPSBvcDtcbiAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcbiAgICAgIGlmIChvcCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICBvdXRwdXRbX291dCsrXSA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi9cbiAgICAgICAgbGVuID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgaWYgKG9wKSB7XG4gICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgbGVuKSk7XG4gICAgICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTtcblxuICAgICAgICBkb2Rpc3Q6XG4gICAgICAgIGZvciAoOzspIHsgLy8gZ290byBlbXVsYXRpb25cbiAgICAgICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG5cbiAgICAgICAgICBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYXNlICovXG4gICAgICAgICAgICBkaXN0ID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgZGlzdCkpO1xuICAgICAgICAgICAgb3AgPSBfb3V0IC0gYmVnOyAgICAgICAgICAgICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovXG4gICAgICAgICAgICBpZiAoZGlzdCA+IG9wKSB7ICAgICAgICAgICAgICAgIC8qIHNlZSBpZiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgIG9wID0gZGlzdCAtIG9wOyAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICAgICAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTtcbi8vICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCA+IHdoYXZlKTtcbi8vICAgICAgICAgICAgICAgIGlmIChvcCA9PT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZnJvbSA9IDA7IC8vIHdpbmRvdyBpbmRleFxuICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93O1xuICAgICAgICAgICAgICBpZiAod25leHQgPT09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgb3AgLT0gd25leHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gMDtcbiAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0O1xuICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi9cbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgICAgIGhlcmUgPSBkY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICAgICAgY29udGludWUgZG9kaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGhlcmUgPSBsY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICBjb250aW51ZSBkb2xlbjtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICB9XG4gIH0gd2hpbGUgKF9pbiA8IGxhc3QgJiYgX291dCA8IGVuZCk7XG5cbiAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovXG4gIGxlbiA9IGJpdHMgPj4gMztcbiAgX2luIC09IGxlbjtcbiAgYml0cyAtPSBsZW4gPDwgMztcbiAgaG9sZCAmPSAoMSA8PCBiaXRzKSAtIDE7XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi9cbiAgc3RybS5uZXh0X2luID0gX2luO1xuICBzdHJtLm5leHRfb3V0ID0gX291dDtcbiAgc3RybS5hdmFpbF9pbiA9IChfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCkpO1xuICBzdHJtLmF2YWlsX291dCA9IChfb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIF9vdXQpIDogMjU3IC0gKF9vdXQgLSBlbmQpKTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICByZXR1cm47XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxudmFyIE1BWEJJVFMgPSAxNTtcbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbnZhciBsYmFzZSA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi9cbiAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSxcbiAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDBcbl07XG5cbnZhciBsZXh0ID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsXG4gIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCA3MiwgNzhcbl07XG5cbnZhciBkYmFzZSA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqL1xuICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsXG4gIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSxcbiAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMCwgMFxuXTtcblxudmFyIGRleHQgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjIsIDIyLFxuICAyMywgMjMsIDI0LCAyNCwgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNyxcbiAgMjgsIDI4LCAyOSwgMjksIDY0LCA2NFxuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX3RhYmxlKHR5cGUsIGxlbnMsIGxlbnNfaW5kZXgsIGNvZGVzLCB0YWJsZSwgdGFibGVfaW5kZXgsIHdvcmssIG9wdHMpXG57XG4gIHZhciBiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy9oZXJlID0gb3B0cy5oZXJlOyAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi9cblxuICB2YXIgbGVuID0gMDsgICAgICAgICAgICAgICAvKiBhIGNvZGUncyBsZW5ndGggaW4gYml0cyAqL1xuICB2YXIgc3ltID0gMDsgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi9cbiAgdmFyIG1pbiA9IDAsIG1heCA9IDA7ICAgICAgICAgIC8qIG1pbmltdW0gYW5kIG1heGltdW0gY29kZSBsZW5ndGhzICovXG4gIHZhciByb290ID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciByb290IHRhYmxlICovXG4gIHZhciBjdXJyID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciBjdXJyZW50IHRhYmxlICovXG4gIHZhciBkcm9wID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgYml0cyB0byBkcm9wIGZvciBzdWItdGFibGUgKi9cbiAgdmFyIGxlZnQgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcHJlZml4IGNvZGVzIGF2YWlsYWJsZSAqL1xuICB2YXIgdXNlZCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGVudHJpZXMgaW4gdGFibGUgdXNlZCAqL1xuICB2YXIgaHVmZiA9IDA7ICAgICAgICAgICAgICAvKiBIdWZmbWFuIGNvZGUgKi9cbiAgdmFyIGluY3I7ICAgICAgICAgICAgICAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovXG4gIHZhciBmaWxsOyAgICAgICAgICAgICAgLyogaW5kZXggZm9yIHJlcGxpY2F0aW5nIGVudHJpZXMgKi9cbiAgdmFyIGxvdzsgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovXG4gIHZhciBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbG93IHJvb3QgYml0cyAqL1xuICB2YXIgbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi9cbiAgdmFyIGJhc2UgPSBudWxsOyAgICAgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi9cbiAgdmFyIGJhc2VfaW5kZXggPSAwO1xuLy8gIHZhciBzaG9leHRyYTsgICAgLyogZXh0cmEgYml0cyB0YWJsZSB0byB1c2UgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBiYXNlIGFuZCBleHRyYSBmb3Igc3ltYm9sID4gZW5kICovXG4gIHZhciBjb3VudCA9IG5ldyB1dGlscy5CdWYxNihNQVhCSVRTICsgMSk7IC8vW01BWEJJVFMrMV07ICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqL1xuICB2YXIgb2ZmcyA9IG5ldyB1dGlscy5CdWYxNihNQVhCSVRTICsgMSk7IC8vW01BWEJJVFMrMV07ICAgICAvKiBvZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqL1xuICB2YXIgZXh0cmEgPSBudWxsO1xuICB2YXIgZXh0cmFfaW5kZXggPSAwO1xuXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsO1xuXG4gIC8qXG4gICBQcm9jZXNzIGEgc2V0IG9mIGNvZGUgbGVuZ3RocyB0byBjcmVhdGUgYSBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLiAgVGhlXG4gICBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBFYWNoIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGVcbiAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlXG4gICBzeW1ib2xzIGJ5IGxlbmd0aCBmcm9tIHNob3J0IHRvIGxvbmcsIGFuZCByZXRhaW5pbmcgdGhlIHN5bWJvbCBvcmRlclxuICAgZm9yIGNvZGVzIHdpdGggZXF1YWwgbGVuZ3Rocy4gIFRoZW4gdGhlIGNvZGUgc3RhcnRzIHdpdGggYWxsIHplcm8gYml0c1xuICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXJcbiAgIGluY3JlbWVudHMgZm9yIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHplcm9zIGFyZSBhcHBlbmRlZCBhcyB0aGUgbGVuZ3RoXG4gICBpbmNyZWFzZXMuICBGb3IgdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVzZSBiaXRzIGFyZSBzdG9yZWQgYmFja3dhcmRzXG4gICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlXG4gICBkZWNvZGluZyB0YWJsZXMgYXJlIGJ1aWx0IGluIHRoZSBsYXJnZSBsb29wIGJlbG93LCB0aGUgaW50ZWdlciBjb2Rlc1xuICAgYXJlIGluY3JlbWVudGVkIGJhY2t3YXJkcy5cblxuICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW5cbiAgIGxlbnNbXSBhcmUgaW4gdGhlIHJhbmdlIDAuLk1BWEJJVFMuICBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoaXMuXG4gICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRoYXQgdGhhdFxuICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS5cblxuICAgVGhlIGNvZGVzIGFyZSBzb3J0ZWQgYnkgY29tcHV0aW5nIGEgY291bnQgb2YgY29kZXMgZm9yIGVhY2ggbGVuZ3RoLFxuICAgY3JlYXRpbmcgZnJvbSB0aGF0IGEgdGFibGUgb2Ygc3RhcnRpbmcgaW5kaWNlcyBmb3IgZWFjaCBsZW5ndGggaW4gdGhlXG4gICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWRcbiAgIHRhYmxlLiAgVGhlIHNvcnRlZCB0YWJsZSBpcyB3b3JrW10sIHdpdGggdGhhdCBzcGFjZSBiZWluZyBwcm92aWRlZCBieVxuICAgdGhlIGNhbGxlci5cblxuICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZ1xuICAgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoIGNvZGVzLCBkZXRlcm1pbmluZyBpZiB0aGVyZSBhcmUgYW55XG4gICBjb2RlcyBhdCBhbGwsIGNoZWNraW5nIGZvciBhIHZhbGlkIHNldCBvZiBsZW5ndGhzLCBhbmQgbG9va2luZyBhaGVhZFxuICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlXG4gICBkZWNvZGluZyB0YWJsZXMuXG4gICAqL1xuXG4gIC8qIGFjY3VtdWxhdGUgbGVuZ3RocyBmb3IgY29kZXMgKGFzc3VtZXMgbGVuc1tdIGFsbCBpbiAwLi5NQVhCSVRTKSAqL1xuICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGNvdW50W2xlbl0gPSAwO1xuICB9XG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgY291bnRbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rKztcbiAgfVxuXG4gIC8qIGJvdW5kIGNvZGUgbGVuZ3RocywgZm9yY2Ugcm9vdCB0byBiZSB3aXRoaW4gY29kZSBsZW5ndGhzICovXG4gIHJvb3QgPSBiaXRzO1xuICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkge1xuICAgIGlmIChjb3VudFttYXhdICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPiBtYXgpIHtcbiAgICByb290ID0gbWF4O1xuICB9XG4gIGlmIChtYXggPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBubyBzeW1ib2xzIHRvIGNvZGUgYXQgYWxsICovXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0OyAgLy9oZXJlLm9wID0gKHZhciBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTsgICAvL2hlcmUuYml0cyA9ICh2YXIgY2hhcikxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwOyAgIC8vaGVyZS52YWwgPSAodmFyIHNob3J0KTA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0O1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuICAgIG9wdHMuYml0cyA9IDE7XG4gICAgcmV0dXJuIDA7ICAgICAvKiBubyBzeW1ib2xzLCBidXQgd2FpdCBmb3IgZGVjb2RpbmcgdG8gcmVwb3J0IGVycm9yICovXG4gIH1cbiAgZm9yIChtaW4gPSAxOyBtaW4gPCBtYXg7IG1pbisrKSB7XG4gICAgaWYgKGNvdW50W21pbl0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA8IG1pbikge1xuICAgIHJvb3QgPSBtaW47XG4gIH1cblxuICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi9cbiAgbGVmdCA9IDE7XG4gIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgbGVmdCA8PD0gMTtcbiAgICBsZWZ0IC09IGNvdW50W2xlbl07XG4gICAgaWYgKGxlZnQgPCAwKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkICovXG4gIH1cbiAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyB8fCBtYXggIT09IDEpKSB7XG4gICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIHNldCAqL1xuICB9XG5cbiAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi9cbiAgb2Zmc1sxXSA9IDA7XG4gIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspIHtcbiAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTtcbiAgfVxuXG4gIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi9cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBpZiAobGVuc1tsZW5zX2luZGV4ICsgc3ltXSAhPT0gMCkge1xuICAgICAgd29ya1tvZmZzW2xlbnNbbGVuc19pbmRleCArIHN5bV1dKytdID0gc3ltO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBDcmVhdGUgYW5kIGZpbGwgaW4gZGVjb2RpbmcgdGFibGVzLiAgSW4gdGhpcyBsb29wLCB0aGUgdGFibGUgYmVpbmdcbiAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmXG4gICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3BcbiAgIGJpdHMgb2ZmIG9mIHRoZSBib3R0b20uICBGb3IgY29kZXMgd2hlcmUgbGVuIGlzIGxlc3MgdGhhbiBkcm9wICsgY3VycixcbiAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG9cbiAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLlxuXG4gICByb290IGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgdGhlIHJvb3QgdGFibGUuICBXaGVuIGxlbiBleGNlZWRzXG4gICByb290LCBzdWItdGFibGVzIGFyZSBjcmVhdGVkIHBvaW50ZWQgdG8gYnkgdGhlIHJvb3QgZW50cnkgd2l0aCBhbiBpbmRleFxuICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGFcbiAgIG5ldyBzdWItdGFibGUgc2hvdWxkIGJlIHN0YXJ0ZWQuICBkcm9wIGlzIHplcm8gd2hlbiB0aGUgcm9vdCB0YWJsZSBpc1xuICAgYmVpbmcgZmlsbGVkLCBhbmQgZHJvcCBpcyByb290IHdoZW4gc3ViLXRhYmxlcyBhcmUgYmVpbmcgZmlsbGVkLlxuXG4gICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZVxuICAgY29kZSBsZW5ndGhzIHRvIGRldGVybWluZSB3aGF0IHNpemUgc3ViLXRhYmxlIGlzIG5lZWRlZC4gIFRoZSBsZW5ndGhcbiAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlXG4gICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuXG5cbiAgIHVzZWQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdGFibGUgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlXG4gICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIGZvciBMRU5TIGFuZCBESVNUIHRhYmxlcyBhZ2FpbnN0XG4gICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluXG4gICB0aGUgaW5pdGlhbCByb290IHRhYmxlIHNpemUgY29uc3RhbnRzLiAgU2VlIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlblxuICAgYWxsIGNvZGVzIG9mIGxlbmd0aCBtYXgsIGkuZS4gYWxsIGNvZGVzLCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpc1xuICAgcm91dGluZSBwZXJtaXRzIGluY29tcGxldGUgY29kZXMsIHNvIGFub3RoZXIgbG9vcCBhZnRlciB0aGlzIG9uZSBmaWxsc1xuICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLlxuICAgKi9cblxuICAvKiBzZXQgdXAgZm9yIGNvZGUgdHlwZSAqL1xuICAvLyBwb29yIG1hbiBvcHRpbWl6YXRpb24gLSB1c2UgaWYtZWxzZSBpbnN0ZWFkIG9mIHN3aXRjaCxcbiAgLy8gdG8gYXZvaWQgZGVvcHRzIGluIG9sZCB2OFxuICBpZiAodHlwZSA9PT0gQ09ERVMpIHtcbiAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi9cbiAgICBlbmQgPSAxOTtcblxuICB9IGVsc2UgaWYgKHR5cGUgPT09IExFTlMpIHtcbiAgICBiYXNlID0gbGJhc2U7XG4gICAgYmFzZV9pbmRleCAtPSAyNTc7XG4gICAgZXh0cmEgPSBsZXh0O1xuICAgIGV4dHJhX2luZGV4IC09IDI1NztcbiAgICBlbmQgPSAyNTY7XG5cbiAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIERJU1RTICovXG4gICAgYmFzZSA9IGRiYXNlO1xuICAgIGV4dHJhID0gZGV4dDtcbiAgICBlbmQgPSAtMTtcbiAgfVxuXG4gIC8qIGluaXRpYWxpemUgb3B0cyBmb3IgbG9vcCAqL1xuICBodWZmID0gMDsgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSAqL1xuICBzeW0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBzeW1ib2wgKi9cbiAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovXG4gIG5leHQgPSB0YWJsZV9pbmRleDsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqL1xuICBjdXJyID0gcm9vdDsgICAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSBpbmRleCBiaXRzICovXG4gIGRyb3AgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgdG8gZHJvcCBmcm9tIGNvZGUgZm9yIGluZGV4ICovXG4gIGxvdyA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovXG4gIHVzZWQgPSAxIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi9cbiAgbWFzayA9IHVzZWQgLSAxOyAgICAgICAgICAgIC8qIG1hc2sgZm9yIGNvbXBhcmluZyBsb3cgKi9cblxuICAvKiBjaGVjayBhdmFpbGFibGUgdGFibGUgc3BhY2UgKi9cbiAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqL1xuICAgIGhlcmVfYml0cyA9IGxlbiAtIGRyb3A7XG4gICAgaWYgKHdvcmtbc3ltXSA8IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IDA7XG4gICAgICBoZXJlX3ZhbCA9IHdvcmtbc3ltXTtcbiAgICB9XG4gICAgZWxzZSBpZiAod29ya1tzeW1dID4gZW5kKSB7XG4gICAgICBoZXJlX29wID0gZXh0cmFbZXh0cmFfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgICAgaGVyZV92YWwgPSBiYXNlW2Jhc2VfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGhlcmVfb3AgPSAzMiArIDY0OyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqL1xuICAgICAgaGVyZV92YWwgPSAwO1xuICAgIH1cblxuICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIGRyb3ApO1xuICAgIGZpbGwgPSAxIDw8IGN1cnI7XG4gICAgbWluID0gZmlsbDsgICAgICAgICAgICAgICAgIC8qIHNhdmUgb2Zmc2V0IHRvIG5leHQgdGFibGUgKi9cbiAgICBkbyB7XG4gICAgICBmaWxsIC09IGluY3I7XG4gICAgICB0YWJsZVtuZXh0ICsgKGh1ZmYgPj4gZHJvcCkgKyBmaWxsXSA9IChoZXJlX2JpdHMgPDwgMjQpIHwgKGhlcmVfb3AgPDwgMTYpIHwgaGVyZV92YWwgfDA7XG4gICAgfSB3aGlsZSAoZmlsbCAhPT0gMCk7XG5cbiAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSAxKTtcbiAgICB3aGlsZSAoaHVmZiAmIGluY3IpIHtcbiAgICAgIGluY3IgPj49IDE7XG4gICAgfVxuICAgIGlmIChpbmNyICE9PSAwKSB7XG4gICAgICBodWZmICY9IGluY3IgLSAxO1xuICAgICAgaHVmZiArPSBpbmNyO1xuICAgIH0gZWxzZSB7XG4gICAgICBodWZmID0gMDtcbiAgICB9XG5cbiAgICAvKiBnbyB0byBuZXh0IHN5bWJvbCwgdXBkYXRlIGNvdW50LCBsZW4gKi9cbiAgICBzeW0rKztcbiAgICBpZiAoLS1jb3VudFtsZW5dID09PSAwKSB7XG4gICAgICBpZiAobGVuID09PSBtYXgpIHsgYnJlYWs7IH1cbiAgICAgIGxlbiA9IGxlbnNbbGVuc19pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuXG4gICAgLyogY3JlYXRlIG5ldyBzdWItdGFibGUgaWYgbmVlZGVkICovXG4gICAgaWYgKGxlbiA+IHJvb3QgJiYgKGh1ZmYgJiBtYXNrKSAhPT0gbG93KSB7XG4gICAgICAvKiBpZiBmaXJzdCB0aW1lLCB0cmFuc2l0aW9uIHRvIHN1Yi10YWJsZXMgKi9cbiAgICAgIGlmIChkcm9wID09PSAwKSB7XG4gICAgICAgIGRyb3AgPSByb290O1xuICAgICAgfVxuXG4gICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovXG4gICAgICBuZXh0ICs9IG1pbjsgICAgICAgICAgICAvKiBoZXJlIG1pbiBpcyAxIDw8IGN1cnIgKi9cblxuICAgICAgLyogZGV0ZXJtaW5lIGxlbmd0aCBvZiBuZXh0IHRhYmxlICovXG4gICAgICBjdXJyID0gbGVuIC0gZHJvcDtcbiAgICAgIGxlZnQgPSAxIDw8IGN1cnI7XG4gICAgICB3aGlsZSAoY3VyciArIGRyb3AgPCBtYXgpIHtcbiAgICAgICAgbGVmdCAtPSBjb3VudFtjdXJyICsgZHJvcF07XG4gICAgICAgIGlmIChsZWZ0IDw9IDApIHsgYnJlYWs7IH1cbiAgICAgICAgY3VycisrO1xuICAgICAgICBsZWZ0IDw8PSAxO1xuICAgICAgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovXG4gICAgICB1c2VkICs9IDEgPDwgY3VycjtcbiAgICAgIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi9cbiAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrO1xuICAgICAgLyp0YWJsZS5vcFtsb3ddID0gY3VycjtcbiAgICAgIHRhYmxlLmJpdHNbbG93XSA9IHJvb3Q7XG4gICAgICB0YWJsZS52YWxbbG93XSA9IG5leHQgLSBvcHRzLnRhYmxlX2luZGV4OyovXG4gICAgICB0YWJsZVtsb3ddID0gKHJvb3QgPDwgMjQpIHwgKGN1cnIgPDwgMTYpIHwgKG5leHQgLSB0YWJsZV9pbmRleCkgfDA7XG4gICAgfVxuICB9XG5cbiAgLyogZmlsbCBpbiByZW1haW5pbmcgdGFibGUgZW50cnkgaWYgY29kZSBpcyBpbmNvbXBsZXRlIChndWFyYW50ZWVkIHRvIGhhdmVcbiAgIGF0IG1vc3Qgb25lIHJlbWFpbmluZyBlbnRyeSwgc2luY2UgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSwgdGhlXG4gICBtYXhpbXVtIGNvZGUgbGVuZ3RoIHRoYXQgd2FzIGFsbG93ZWQgdG8gZ2V0IHRoaXMgZmFyIGlzIG9uZSBiaXQpICovXG4gIGlmIChodWZmICE9PSAwKSB7XG4gICAgLy90YWJsZS5vcFtuZXh0ICsgaHVmZl0gPSA2NDsgICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW25leHQgKyBodWZmXSA9IGxlbiAtIGRyb3A7XG4gICAgLy90YWJsZS52YWxbbmV4dCArIGh1ZmZdID0gMDtcbiAgICB0YWJsZVtuZXh0ICsgaHVmZl0gPSAoKGxlbiAtIGRyb3ApIDw8IDI0KSB8ICg2NCA8PCAxNikgfDA7XG4gIH1cblxuICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi9cbiAgLy9vcHRzLnRhYmxlX2luZGV4ICs9IHVzZWQ7XG4gIG9wdHMuYml0cyA9IHJvb3Q7XG4gIHJldHVybiAwO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzICAgICAgICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gcmVxdWlyZSgnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgICAgY2FzZSBIRUFEOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCA9PT0gMCkge1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmICgoc3RhdGUud3JhcCAmIDIpICYmIGhvbGQgPT09IDB4OGIxZikgeyAgLyogZ3ppcCBoZWFkZXIgKi9cbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cblxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShzdGF0ZS53cmFwICYgMSkgfHwgICAvKiBjaGVjayBpZiB6bGliIGhlYWRlciBhbGxvd2VkICovXG4gICAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChob2xkICYgMHgwZikvKkJJVFMoNCkqLyAhPT0gWl9ERUZMQVRFRCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgICBiaXRzIC09IDQ7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgbGVuID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgODtcbiAgICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmRtYXggPSAxIDw8IGxlbjtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGTEFHUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmZsYWdzID0gaG9sZDtcbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHhlMDAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50ZXh0ID0gKChob2xkID4+IDgpICYgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVElNRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDQsIDApO1xuICAgICAgICAgIC8vPT09XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBPUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRVhMRU47XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhMRU46XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZDtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhUUkE6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmhlYWQuZXh0cmFfbGVuIC0gc3RhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW50IHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbmV3IEFycmF5KHN0YXRlLmhlYWQuZXh0cmFfbGVuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgaXMgbGltaXRlZCB0byA2NTUzNiBieXRlc1xuICAgICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgICAvKmxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA/IHN0YXRlLmhlYWQuZXh0cmFfbWF4IDogY29weSwqL1xuICAgICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvL3ptZW1jcHkoc3RhdGUuaGVhZC5leHRyYSArIGxlbiwgbmV4dCxcbiAgICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE5BTUU6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIFRPRE86IDIgb3IgMSBieXRlcz9cbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT01NRU5UOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBjb3B5ID0gMDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIEhDUkM6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuaGNyYyA9ICgoc3RhdGUuZmxhZ3MgPj4gOSkgJiAxKTtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElDVElEOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0genN3YXAzMihob2xkKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJQ1Q6XG4gICAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRTpcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIFRZUEVETzpcbiAgICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxhc3QgPSAoaG9sZCAmIDB4MDEpLypCSVRTKDEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgICBiaXRzIC09IDE7XG4gICAgICAgIC8vLS0tLy9cblxuICAgICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTVE9SRUQ6XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFlfOlxuICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT1BZOlxuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgICAgdXRpbHMuYXJyYXlTZXQob3V0cHV0LCBpbnB1dCwgbmV4dCwgY29weSwgcHV0KTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUQUJMRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm5sZW4gPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAyNTc7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNTtcbiAgICAgICAgYml0cyAtPSA1O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICAgIGlmIChzdGF0ZS5ubGVuID4gMjg2IHx8IHN0YXRlLm5kaXN0ID4gMzApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5MRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAgIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG4gICAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gNztcblxuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBoZXJlX3ZhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaGVyZV92YWwgPT09IDE2KSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgNyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoNykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi9cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgICBpZiAoc3RhdGUubGVuc1syNTZdID09PSAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUubGVuYml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgICAgLy9zdGF0ZS5kaXN0Y29kZS5jb3B5KHN0YXRlLmNvZGVzKTtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUuZGlzdGJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOXzpcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU46XG4gICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgICAvLy0tLVxuICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgICAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgICAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgICAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gICAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgICAgLy8tLS1cblxuICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7XG4gICAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaGVyZV92YWw7XG4gICAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkVYVDpcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNUOlxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgICBzdGF0ZS5leHRyYSA9IChoZXJlX29wKSAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNURVhUOlxuICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gc3RhdGUuZG1heCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTUFUQ0g7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTUFUQ0g6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5vZmZzZXQgLSBjb3B5O1xuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICBUcmFjZSgoc3RkZXJyLCBcImluZmxhdGUuYyB0b28gZmFyXFxuXCIpKTtcbi8vICAgICAgICAgIGNvcHkgLT0gc3RhdGUud2hhdmU7XG4vLyAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4vLyAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbi8vICAgICAgICAgIGxlZnQgLT0gY29weTtcbi8vICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuLy8gICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gMDtcbi8vICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4vLyAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbi8vICAgICAgICAgIGJyZWFrO1xuLy8jZW5kaWZcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgICAgY29weSAtPSBzdGF0ZS53bmV4dDtcbiAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuICAgICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBvdXRwdXRbcHV0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMSVQ6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBvdXRwdXRbcHV0KytdID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBsZWZ0LS07XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDSEVDSzpcbiAgICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAvLyBVc2UgJ3wnIGluc3RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgX291dCAtPSBsZWZ0O1xuICAgICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgICBpZiAoX291dCkge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkpO1xuXG4gICAgICAgICAgfVxuICAgICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIC8vIE5COiBjcmMzMiBzdG9yZWQgYXMgc2lnbmVkIDMyLWJpdCBpbnQsIHpzd2FwMzIgcmV0dXJucyBzaWduZWQgdG9vXG4gICAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkdUSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5HVEg6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwICYmIHN0YXRlLmZsYWdzKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLnRvdGFsICYgMHhmZmZmZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRE9ORTpcbiAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIEJBRDpcbiAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIE1FTTpcbiAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgICAgY2FzZSBTWU5DOlxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5mX2xlYXZlIDwtIGhlcmUgaXMgcmVhbCBwbGFjZSBmb3IgXCJnb3RvIGluZl9sZWF2ZVwiLCBlbXVsYXRlZCB2aWEgXCJicmVhayBpbmZfbGVhdmVcIlxuXG4gIC8qXG4gICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLlxuICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyXG4gICAgIGVycm9yLiAgQ2FsbCB1cGRhdGV3aW5kb3coKSB0byBjcmVhdGUgYW5kL29yIHVwZGF0ZSB0aGUgd2luZG93IHN0YXRlLlxuICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuXG4gICAqL1xuXG4gIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAvLy0tLVxuXG4gIGlmIChzdGF0ZS53c2l6ZSB8fCAoX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUubW9kZSA8IEJBRCAmJlxuICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT09IFpfRklOSVNIKSkpIHtcbiAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0LCBfb3V0IC0gc3RybS5hdmFpbF9vdXQpKSB7XG4gICAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIH1cbiAgfVxuICBfaW4gLT0gc3RybS5hdmFpbF9pbjtcbiAgX291dCAtPSBzdHJtLmF2YWlsX291dDtcbiAgc3RybS50b3RhbF9pbiArPSBfaW47XG4gIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gIGlmIChzdGF0ZS53cmFwICYmIF9vdXQpIHtcbiAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAvKlVQREFURShzdGF0ZS5jaGVjaywgc3RybS5uZXh0X291dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSk7XG4gIH1cbiAgc3RybS5kYXRhX3R5cGUgPSBzdGF0ZS5iaXRzICsgKHN0YXRlLmxhc3QgPyA2NCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IFRZUEUgPyAxMjggOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBMRU5fIHx8IHN0YXRlLm1vZGUgPT09IENPUFlfID8gMjU2IDogMCk7XG4gIGlmICgoKF9pbiA9PT0gMCAmJiBfb3V0ID09PSAwKSB8fCBmbHVzaCA9PT0gWl9GSU5JU0gpICYmIHJldCA9PT0gWl9PSykge1xuICAgIHJldCA9IFpfQlVGX0VSUk9SO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVFbmQoc3RybSkge1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSAvKnx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKHN0YXRlLndpbmRvdykge1xuICAgIHN0YXRlLndpbmRvdyA9IG51bGw7XG4gIH1cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlR2V0SGVhZGVyKHN0cm0sIGhlYWQpIHtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoKHN0YXRlLndyYXAgJiAyKSA9PT0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cblxuICAvKiBzYXZlIGhlYWRlciBzdHJ1Y3R1cmUgKi9cbiAgc3RhdGUuaGVhZCA9IGhlYWQ7XG4gIGhlYWQuZG9uZSA9IGZhbHNlO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzdGF0ZTtcbiAgdmFyIGRpY3RpZDtcbiAgdmFyIHJldDtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gLyogPT0gWl9OVUxMICovIHx8ICFzdHJtLnN0YXRlIC8qID09IFpfTlVMTCAqLykgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIGlmIChzdGF0ZS53cmFwICE9PSAwICYmIHN0YXRlLm1vZGUgIT09IERJQ1QpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiBjaGVjayBmb3IgY29ycmVjdCBkaWN0aW9uYXJ5IGlkZW50aWZpZXIgKi9cbiAgaWYgKHN0YXRlLm1vZGUgPT09IERJQ1QpIHtcbiAgICBkaWN0aWQgPSAxOyAvKiBhZGxlcjMyKDAsIG51bGwsIDApKi9cbiAgICAvKiBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7ICovXG4gICAgZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICAgIGlmIChkaWN0aWQgIT09IHN0YXRlLmNoZWNrKSB7XG4gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SO1xuICAgIH1cbiAgfVxuICAvKiBjb3B5IGRpY3Rpb25hcnkgdG8gd2luZG93IHVzaW5nIHVwZGF0ZXdpbmRvdygpLCB3aGljaCB3aWxsIGFtZW5kIHRoZVxuICAgZXhpc3RpbmcgZGljdGlvbmFyeSBpZiBhcHByb3ByaWF0ZSAqL1xuICByZXQgPSB1cGRhdGV3aW5kb3coc3RybSwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgZGljdExlbmd0aCk7XG4gIGlmIChyZXQpIHtcbiAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgfVxuICBzdGF0ZS5oYXZlZGljdCA9IDE7XG4gIC8vIFRyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgZGljdGlvbmFyeSBzZXRcXG5cIikpO1xuICByZXR1cm4gWl9PSztcbn1cblxuZXhwb3J0cy5pbmZsYXRlUmVzZXQgPSBpbmZsYXRlUmVzZXQ7XG5leHBvcnRzLmluZmxhdGVSZXNldDIgPSBpbmZsYXRlUmVzZXQyO1xuZXhwb3J0cy5pbmZsYXRlUmVzZXRLZWVwID0gaW5mbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuaW5mbGF0ZUluaXQgPSBpbmZsYXRlSW5pdDtcbmV4cG9ydHMuaW5mbGF0ZUluaXQyID0gaW5mbGF0ZUluaXQyO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZUVuZCA9IGluZmxhdGVFbmQ7XG5leHBvcnRzLmluZmxhdGVHZXRIZWFkZXIgPSBpbmZsYXRlR2V0SGVhZGVyO1xuZXhwb3J0cy5pbmZsYXRlU2V0RGljdGlvbmFyeSA9IGluZmxhdGVTZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlSW5mbyA9ICdwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpJztcblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmluZmxhdGVDb3B5ID0gaW5mbGF0ZUNvcHk7XG5leHBvcnRzLmluZmxhdGVHZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZUdldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVNYXJrID0gaW5mbGF0ZU1hcms7XG5leHBvcnRzLmluZmxhdGVQcmltZSA9IGluZmxhdGVQcmltZTtcbmV4cG9ydHMuaW5mbGF0ZVN5bmMgPSBpbmZsYXRlU3luYztcbmV4cG9ydHMuaW5mbGF0ZVN5bmNQb2ludCA9IGluZmxhdGVTeW5jUG9pbnQ7XG5leHBvcnRzLmluZmxhdGVVbmRlcm1pbmUgPSBpbmZsYXRlVW5kZXJtaW5lO1xuKi9cbiIsICIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuICBaX05PX0ZMVVNIOiAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSDogICAgMSxcbiAgWl9TWU5DX0ZMVVNIOiAgICAgICAyLFxuICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsXG4gIFpfRklOSVNIOiAgICAgICAgICAgNCxcbiAgWl9CTE9DSzogICAgICAgICAgICA1LFxuICBaX1RSRUVTOiAgICAgICAgICAgIDYsXG5cbiAgLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAgKi9cbiAgWl9PSzogICAgICAgICAgICAgICAwLFxuICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsXG4gIFpfTkVFRF9ESUNUOiAgICAgICAgMixcbiAgWl9FUlJOTzogICAgICAgICAgIC0xLFxuICBaX1NUUkVBTV9FUlJPUjogICAgLTIsXG4gIFpfREFUQV9FUlJPUjogICAgICAtMyxcbiAgLy9aX01FTV9FUlJPUjogICAgIC00LFxuICBaX0JVRl9FUlJPUjogICAgICAgLTUsXG4gIC8vWl9WRVJTSU9OX0VSUk9SOiAtNixcblxuICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbiAgWl9OT19DT01QUkVTU0lPTjogICAgICAgICAwLFxuICBaX0JFU1RfU1BFRUQ6ICAgICAgICAgICAgIDEsXG4gIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSxcbiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAgIC0xLFxuXG5cbiAgWl9GSUxURVJFRDogICAgICAgICAgICAgICAxLFxuICBaX0hVRkZNQU5fT05MWTogICAgICAgICAgIDIsXG4gIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMyxcbiAgWl9GSVhFRDogICAgICAgICAgICAgICAgICA0LFxuICBaX0RFRkFVTFRfU1RSQVRFR1k6ICAgICAgIDAsXG5cbiAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuICBaX0JJTkFSWTogICAgICAgICAgICAgICAgIDAsXG4gIFpfVEVYVDogICAgICAgICAgICAgICAgICAgMSxcbiAgLy9aX0FTQ0lJOiAgICAgICAgICAgICAgICAxLCAvLyA9IFpfVEVYVCAoZGVwcmVjYXRlZClcbiAgWl9VTktOT1dOOiAgICAgICAgICAgICAgICAyLFxuXG4gIC8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xuICBaX0RFRkxBVEVEOiAgICAgICAgICAgICAgIDhcbiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5mdW5jdGlvbiBHWmhlYWRlcigpIHtcbiAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqL1xuICB0aGlzLnRleHQgICAgICAgPSAwO1xuICAvKiBtb2RpZmljYXRpb24gdGltZSAqL1xuICB0aGlzLnRpbWUgICAgICAgPSAwO1xuICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLnhmbGFncyAgICAgPSAwO1xuICAvKiBvcGVyYXRpbmcgc3lzdGVtICovXG4gIHRoaXMub3MgICAgICAgICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi9cbiAgdGhpcy5leHRyYSAgICAgID0gbnVsbDtcbiAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovXG4gIHRoaXMuZXh0cmFfbGVuICA9IDA7IC8vIEFjdHVhbGx5LCB3ZSBkb24ndCBuZWVkIGl0IGluIEpTLFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbGVhdmUgZm9yIGZldyBjb2RlIG1vZGlmaWNhdGlvbnNcblxuICAvL1xuICAvLyBTZXR1cCBsaW1pdHMgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5XG4gIC8vIGZvciBpbmZsYXRlIHVzZSBjb25zdGFudCBsaW1pdCBpbiA2NTUzNiBieXRlc1xuICAvL1xuXG4gIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuZXh0cmFfbWF4ICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi9cbiAgdGhpcy5uYW1lICAgICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5uYW1lX21heCAgID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi9cbiAgdGhpcy5jb21tZW50ICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5jb21tX21heCAgID0gMDtcbiAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi9cbiAgdGhpcy5oY3JjICAgICAgID0gMDtcbiAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLmRvbmUgICAgICAgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHWmhlYWRlcjtcbiIsICIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfaW5mbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9pbmZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBjICAgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvY29uc3RhbnRzJyk7XG52YXIgbXNnICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL21lc3NhZ2VzJyk7XG52YXIgWlN0cmVhbSAgICAgID0gcmVxdWlyZSgnLi96bGliL3pzdHJlYW0nKTtcbnZhciBHWmhlYWRlciAgICAgPSByZXF1aXJlKCcuL3psaWIvZ3poZWFkZXInKTtcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBjbGFzcyBJbmZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbaW5mbGF0ZV1dXG4gKiBhbmQgW1tpbmZsYXRlUmF3XV0uXG4gKiovXG5cbi8qIGludGVybmFsXG4gKiBpbmZsYXRlLmNodW5rcyAtPiBBcnJheVxuICpcbiAqIENodW5rcyBvZiBvdXRwdXQgZGF0YSwgaWYgW1tJbmZsYXRlI29uRGF0YV1dIG5vdCBvdmVycmlkZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGluZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBTaG91bGQgYmUgY2hlY2tlZCBpZiBicm9rZW4gZGF0YSBwb3NzaWJsZS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0luZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IEluZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgaW5mbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgaW5mbGF0ZVxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWFcbiAqIHdyYXBwZXIgaGVhZGVyLlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgaW5mbGF0ZSA9IG5ldyBwYWtvLkluZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGluZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhpbmZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMCxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICAvLyBGb3JjZSB3aW5kb3cgc2l6ZSBmb3IgYHJhd2AgZGF0YSwgaWYgbm90IHNldCBkaXJlY3RseSxcbiAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vIGhlYWRlciBmb3IgYXV0b2RldGVjdC5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgeyBvcHQud2luZG93Qml0cyA9IC0xNTsgfVxuICB9XG5cbiAgLy8gSWYgYHdpbmRvd0JpdHNgIG5vdCBkZWZpbmVkIChhbmQgbW9kZSBub3QgcmF3KSAtIHNldCBhdXRvZGV0ZWN0IGZsYWcgZm9yIGd6aXAvZGVmbGF0ZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJlxuICAgICAgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIC8vIEd6aXAgaGVhZGVyIGhhcyBubyBpbmZvIGFib3V0IHdpbmRvd3Mgc2l6ZSwgd2UgY2FuIGRvIGF1dG9kZXRlY3Qgb25seVxuICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNlIGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+IDE1KSAmJiAob3B0LndpbmRvd0JpdHMgPCA0OCkpIHtcbiAgICAvLyBiaXQgMyAoMTYpIC0+IGd6aXBwZWQgZGF0YVxuICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGVcbiAgICBpZiAoKG9wdC53aW5kb3dCaXRzICYgMTUpID09PSAwKSB7XG4gICAgICBvcHQud2luZG93Qml0cyB8PSAxNTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gICA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LndpbmRvd0JpdHNcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTtcblxuICB6bGliX2luZmxhdGUuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sIHRoaXMuaGVhZGVyKTtcblxuICAvLyBTZXR1cCBkaWN0aW9uYXJ5XG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0LmRpY3Rpb25hcnkgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIG9wdC5kaWN0aW9uYXJ5ID0gbmV3IFVpbnQ4QXJyYXkob3B0LmRpY3Rpb25hcnkpO1xuICAgIH1cbiAgICBpZiAob3B0LnJhdykgeyAvL0luIHJhdyBtb2RlIHdlIG5lZWQgdG8gc2V0IHRoZSBkaWN0aW9uYXJ5IGVhcmx5XG4gICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBvcHQuZGljdGlvbmFyeSk7XG4gICAgICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YVxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zIFpfRklOSVNILlxuICpcbiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gaW5mbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtbSW5mbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoXG4gKiBuZXcgb3V0cHV0IGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbSW5mbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGRlY29tcHJlc3Npb24gY29udGV4dC5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tJbmZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgZGljdGlvbmFyeSA9IHRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5O1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcbiAgdmFyIG5leHRfb3V0X3V0ZjgsIHRhaWwsIHV0ZjhzdHI7XG5cbiAgLy8gRmxhZyB0byBwcm9wZXJseSBwcm9jZXNzIFpfQlVGX0VSUk9SIG9uIHRlc3RpbmcgaW5mbGF0ZSBjYWxsXG4gIC8vIHdoZW4gd2UgY2hlY2sgdGhhdCBhbGwgb3V0cHV0IGRhdGEgd2FzIGZsdXNoZWQuXG4gIHZhciBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IGMuWl9GSU5JU0ggOiBjLlpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIE9ubHkgYmluYXJ5IHN0cmluZ3MgY2FuIGJlIGRlY29tcHJlc3NlZCBvbiBwcmFjdGljZVxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIGMuWl9OT19GTFVTSCk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkge1xuICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdGlvbmFyeSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX0JVRl9FUlJPUiAmJiBhbGxvd0J1ZkVycm9yID09PSB0cnVlKSB7XG4gICAgICBzdGF0dXMgPSBjLlpfT0s7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHJtLm5leHRfb3V0KSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IGMuWl9GSU5JU0ggfHwgX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSkpIHtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgICAgbmV4dF9vdXRfdXRmOCA9IHN0cmluZ3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7XG5cbiAgICAgICAgICB0YWlsID0gc3RybS5uZXh0X291dCAtIG5leHRfb3V0X3V0Zjg7XG4gICAgICAgICAgdXRmOHN0ciA9IHN0cmluZ3MuYnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7XG5cbiAgICAgICAgICAvLyBtb3ZlIHRhaWxcbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZSAtIHRhaWw7XG4gICAgICAgICAgaWYgKHRhaWwpIHsgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4LCB0YWlsLCAwKTsgfVxuXG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRmOHN0cik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gbm8gbW9yZSBpbnB1dCBkYXRhLCB3ZSBzaG91bGQgY2hlY2sgdGhhdCBpbnRlcm5hbCBpbmZsYXRlIGJ1ZmZlcnNcbiAgICAvLyBhcmUgZmx1c2hlZC4gVGhlIG9ubHkgd2F5IHRvIGRvIGl0IHdoZW4gYXZhaWxfb3V0ID0gMCAtIHJ1biBvbmUgbW9yZVxuICAgIC8vIGluZmxhdGUgcGFzcy4gQnV0IGlmIG91dHB1dCBkYXRhIG5vdCBleGlzdHMsIGluZmxhdGUgcmV0dXJuIFpfQlVGX0VSUk9SLlxuICAgIC8vIEhlcmUgd2Ugc2V0IGZsYWcgdG8gcHJvY2VzcyB0aGlzIGVycm9yIHByb3Blcmx5LlxuICAgIC8vXG4gICAgLy8gTk9URS4gRGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkcyBzdWNoXG4gICAgLy8gbG9naWMuXG4gICAgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIGFsbG93QnVmRXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQpO1xuXG4gIGlmIChzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EKSB7XG4gICAgX21vZGUgPSBjLlpfRklOSVNIO1xuICB9XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IGMuWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKGMuWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3V0cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGluZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIGVpdGhlciBhZnRlciB5b3UgdGVsbCBpbmZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IGMuWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBHbHVlICYgY29udmVydCBoZXJlLCB1bnRpbCB3ZSB0ZWFjaCBwYWtvIHRvIHNlbmRcbiAgICAgIC8vIHV0ZjggYWxpZ25lZCBzdHJpbmdzIHRvIG9uRGF0YVxuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBpbmZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIERlY29tcHJlc3MgYGRhdGFgIHdpdGggaW5mbGF0ZS91bmd6aXAgYW5kIGBvcHRpb25zYC4gQXV0b2RldGVjdFxuICogZm9ybWF0IHZpYSB3cmFwcGVyIGhlYWRlciBieSBkZWZhdWx0LiBUaGF0J3Mgd2h5IHdlIGRvbid0IHByb3ZpZGVcbiAqIHNlcGFyYXRlIGB1bmd6aXBgIG1ldGhvZC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSB3aW5kb3dCaXRzXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGlucHV0ID0gcGFrby5kZWZsYXRlKFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgb3V0cHV0O1xuICpcbiAqIHRyeSB7XG4gKiAgIG91dHB1dCA9IHBha28uaW5mbGF0ZShpbnB1dCk7XG4gKiB9IGNhdGNoIChlcnIpXG4gKiAgIGNvbnNvbGUubG9nKGVycik7XG4gKiB9XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGluZmxhdG9yID0gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgaW5mbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGluZmxhdG9yLmVycikgeyB0aHJvdyBpbmZsYXRvci5tc2cgfHwgbXNnW2luZmxhdG9yLmVycl07IH1cblxuICByZXR1cm4gaW5mbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogaW5mbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2luZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiB1bmd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogSnVzdCBzaG9ydGN1dCB0byBbW2luZmxhdGVdXSwgYmVjYXVzZSBpdCBhdXRvZGV0ZWN0cyBmb3JtYXRcbiAqIGJ5IGhlYWRlci5jb250ZW50LiBEb25lIGZvciBjb252ZW5pZW5jZS5cbiAqKi9cblxuXG5leHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7XG5leHBvcnRzLnVuZ3ppcCAgPSBpbmZsYXRlO1xuIiwgIi8vIFRvcCBsZXZlbCBmaWxlIGlzIGp1c3QgYSBtaXhpbiBvZiBzdWJtb2R1bGVzICYgY29uc3RhbnRzXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gICAgPSByZXF1aXJlKCcuL2xpYi91dGlscy9jb21tb24nKS5hc3NpZ247XG5cbnZhciBkZWZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9kZWZsYXRlJyk7XG52YXIgaW5mbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvaW5mbGF0ZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbnZhciBwYWtvID0ge307XG5cbmFzc2lnbihwYWtvLCBkZWZsYXRlLCBpbmZsYXRlLCBjb25zdGFudHMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBha287XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwcm9jZXNzRm4gPSAoZm4sIG9wdGlvbnMpID0+IGZ1bmN0aW9uICguLi5hcmdzKSB7XG5cdGNvbnN0IFAgPSBvcHRpb25zLnByb21pc2VNb2R1bGU7XG5cblx0cmV0dXJuIG5ldyBQKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRpZiAob3B0aW9ucy5tdWx0aUFyZ3MpIHtcblx0XHRcdGFyZ3MucHVzaCgoLi4ucmVzdWx0KSA9PiB7XG5cdFx0XHRcdGlmIChvcHRpb25zLmVycm9yRmlyc3QpIHtcblx0XHRcdFx0XHRpZiAocmVzdWx0WzBdKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QocmVzdWx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVzdWx0LnNoaWZ0KCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChvcHRpb25zLmVycm9yRmlyc3QpIHtcblx0XHRcdGFyZ3MucHVzaCgoZXJyb3IsIHJlc3VsdCkgPT4ge1xuXHRcdFx0XHRpZiAoZXJyb3IpIHtcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFyZ3MucHVzaChyZXNvbHZlKTtcblx0XHR9XG5cblx0XHRmbi5hcHBseSh0aGlzLCBhcmdzKTtcblx0fSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IChpbnB1dCwgb3B0aW9ucykgPT4ge1xuXHRvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG5cdFx0ZXhjbHVkZTogWy8uKyhTeW5jfFN0cmVhbSkkL10sXG5cdFx0ZXJyb3JGaXJzdDogdHJ1ZSxcblx0XHRwcm9taXNlTW9kdWxlOiBQcm9taXNlXG5cdH0sIG9wdGlvbnMpO1xuXG5cdGNvbnN0IG9ialR5cGUgPSB0eXBlb2YgaW5wdXQ7XG5cdGlmICghKGlucHV0ICE9PSBudWxsICYmIChvYmpUeXBlID09PSAnb2JqZWN0JyB8fCBvYmpUeXBlID09PSAnZnVuY3Rpb24nKSkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBpbnB1dFxcYCB0byBiZSBhIFxcYEZ1bmN0aW9uXFxgIG9yIFxcYE9iamVjdFxcYCwgZ290IFxcYCR7aW5wdXQgPT09IG51bGwgPyAnbnVsbCcgOiBvYmpUeXBlfVxcYGApO1xuXHR9XG5cblx0Y29uc3QgZmlsdGVyID0ga2V5ID0+IHtcblx0XHRjb25zdCBtYXRjaCA9IHBhdHRlcm4gPT4gdHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnID8ga2V5ID09PSBwYXR0ZXJuIDogcGF0dGVybi50ZXN0KGtleSk7XG5cdFx0cmV0dXJuIG9wdGlvbnMuaW5jbHVkZSA/IG9wdGlvbnMuaW5jbHVkZS5zb21lKG1hdGNoKSA6ICFvcHRpb25zLmV4Y2x1ZGUuc29tZShtYXRjaCk7XG5cdH07XG5cblx0bGV0IHJldDtcblx0aWYgKG9ialR5cGUgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXQgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMuZXhjbHVkZU1haW4gPyBpbnB1dCguLi5hcmdzKSA6IHByb2Nlc3NGbihpbnB1dCwgb3B0aW9ucykuYXBwbHkodGhpcywgYXJncyk7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRyZXQgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnB1dCkpO1xuXHR9XG5cblx0Zm9yIChjb25zdCBrZXkgaW4gaW5wdXQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBndWFyZC1mb3ItaW5cblx0XHRjb25zdCBwcm9wZXJ0eSA9IGlucHV0W2tleV07XG5cdFx0cmV0W2tleV0gPSB0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgZmlsdGVyKGtleSkgPyBwcm9jZXNzRm4ocHJvcGVydHksIG9wdGlvbnMpIDogcHJvcGVydHk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufTtcbiIsICIvLyBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBtYWtlLWFycmF5XG5mdW5jdGlvbiBtYWtlQXJyYXkgKHN1YmplY3QpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc3ViamVjdClcbiAgICA/IHN1YmplY3RcbiAgICA6IFtzdWJqZWN0XVxufVxuXG5jb25zdCBFTVBUWSA9ICcnXG5jb25zdCBTUEFDRSA9ICcgJ1xuY29uc3QgRVNDQVBFID0gJ1xcXFwnXG5jb25zdCBSRUdFWF9URVNUX0JMQU5LX0xJTkUgPSAvXlxccyskL1xuY29uc3QgUkVHRVhfSU5WQUxJRF9UUkFJTElOR19CQUNLU0xBU0ggPSAvKD86W15cXFxcXXxeKVxcXFwkL1xuY29uc3QgUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfRVhDTEFNQVRJT04gPSAvXlxcXFwhL1xuY29uc3QgUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfSEFTSCA9IC9eXFxcXCMvXG5jb25zdCBSRUdFWF9TUExJVEFMTF9DUkxGID0gL1xccj9cXG4vZ1xuLy8gL2Zvbyxcbi8vIC4vZm9vLFxuLy8gLi4vZm9vLFxuLy8gLlxuLy8gLi5cbmNvbnN0IFJFR0VYX1RFU1RfSU5WQUxJRF9QQVRIID0gL15cXC4qXFwvfF5cXC4rJC9cblxuY29uc3QgU0xBU0ggPSAnLydcblxuLy8gRG8gbm90IHVzZSB0ZXJuYXJ5IGV4cHJlc3Npb24gaGVyZSwgc2luY2UgXCJpc3RhbmJ1bCBpZ25vcmUgbmV4dFwiIGlzIGJ1Z2d5XG5sZXQgVE1QX0tFWV9JR05PUkUgPSAnbm9kZS1pZ25vcmUnXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKSB7XG4gIFRNUF9LRVlfSUdOT1JFID0gU3ltYm9sLmZvcignbm9kZS1pZ25vcmUnKVxufVxuY29uc3QgS0VZX0lHTk9SRSA9IFRNUF9LRVlfSUdOT1JFXG5cbmNvbnN0IGRlZmluZSA9IChvYmplY3QsIGtleSwgdmFsdWUpID0+XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge3ZhbHVlfSlcblxuY29uc3QgUkVHRVhfUkVHRVhQX1JBTkdFID0gLyhbMC16XSktKFswLXpdKS9nXG5cbmNvbnN0IFJFVFVSTl9GQUxTRSA9ICgpID0+IGZhbHNlXG5cbi8vIFNhbml0aXplIHRoZSByYW5nZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvblxuLy8gVGhlIGNhc2VzIGFyZSBjb21wbGljYXRlZCwgc2VlIHRlc3QgY2FzZXMgZm9yIGRldGFpbHNcbmNvbnN0IHNhbml0aXplUmFuZ2UgPSByYW5nZSA9PiByYW5nZS5yZXBsYWNlKFxuICBSRUdFWF9SRUdFWFBfUkFOR0UsXG4gIChtYXRjaCwgZnJvbSwgdG8pID0+IGZyb20uY2hhckNvZGVBdCgwKSA8PSB0by5jaGFyQ29kZUF0KDApXG4gICAgPyBtYXRjaFxuICAgIC8vIEludmFsaWQgcmFuZ2UgKG91dCBvZiBvcmRlcikgd2hpY2ggaXMgb2sgZm9yIGdpdGlnbm9yZSBydWxlcyBidXRcbiAgICAvLyAgIGZhdGFsIGZvciBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gZWxpbWluYXRlIGl0LlxuICAgIDogRU1QVFlcbilcblxuLy8gU2VlIGZpeHR1cmVzICM1OVxuY29uc3QgY2xlYW5SYW5nZUJhY2tTbGFzaCA9IHNsYXNoZXMgPT4ge1xuICBjb25zdCB7bGVuZ3RofSA9IHNsYXNoZXNcbiAgcmV0dXJuIHNsYXNoZXMuc2xpY2UoMCwgbGVuZ3RoIC0gbGVuZ3RoICUgMilcbn1cblxuLy8gPiBJZiB0aGUgcGF0dGVybiBlbmRzIHdpdGggYSBzbGFzaCxcbi8vID4gaXQgaXMgcmVtb3ZlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbixcbi8vID4gYnV0IGl0IHdvdWxkIG9ubHkgZmluZCBhIG1hdGNoIHdpdGggYSBkaXJlY3RvcnkuXG4vLyA+IEluIG90aGVyIHdvcmRzLCBmb28vIHdpbGwgbWF0Y2ggYSBkaXJlY3RvcnkgZm9vIGFuZCBwYXRocyB1bmRlcm5lYXRoIGl0LFxuLy8gPiBidXQgd2lsbCBub3QgbWF0Y2ggYSByZWd1bGFyIGZpbGUgb3IgYSBzeW1ib2xpYyBsaW5rIGZvb1xuLy8gPiAgKHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaG93IHBhdGhzcGVjIHdvcmtzIGluIGdlbmVyYWwgaW4gR2l0KS5cbi8vICdgZm9vL2AnIHdpbGwgbm90IG1hdGNoIHJlZ3VsYXIgZmlsZSAnYGZvb2AnIG9yIHN5bWJvbGljIGxpbmsgJ2Bmb29gJ1xuLy8gLT4gaWdub3JlLXJ1bGVzIHdpbGwgbm90IGRlYWwgd2l0aCBpdCwgYmVjYXVzZSBpdCBjb3N0cyBleHRyYSBgZnMuc3RhdGAgY2FsbFxuLy8gICAgICB5b3UgY291bGQgdXNlIG9wdGlvbiBgbWFyazogdHJ1ZWAgd2l0aCBgZ2xvYmBcblxuLy8gJ2Bmb28vYCcgc2hvdWxkIG5vdCBjb250aW51ZSB3aXRoIHRoZSAnYC4uYCdcbmNvbnN0IFJFUExBQ0VSUyA9IFtcblxuICBbXG4gICAgLy8gcmVtb3ZlIEJPTVxuICAgIC8vIFRPRE86XG4gICAgLy8gT3RoZXIgc2ltaWxhciB6ZXJvLXdpZHRoIGNoYXJhY3RlcnM/XG4gICAgL15cXHVGRUZGLyxcbiAgICAoKSA9PiBFTVBUWVxuICBdLFxuXG4gIC8vID4gVHJhaWxpbmcgc3BhY2VzIGFyZSBpZ25vcmVkIHVubGVzcyB0aGV5IGFyZSBxdW90ZWQgd2l0aCBiYWNrc2xhc2ggKFwiXFxcIilcbiAgW1xuICAgIC8vIChhXFwgKSAtPiAoYSApXG4gICAgLy8gKGEgICkgLT4gKGEpXG4gICAgLy8gKGEgXFwgKSAtPiAoYSAgKVxuICAgIC9cXFxcP1xccyskLyxcbiAgICBtYXRjaCA9PiBtYXRjaC5pbmRleE9mKCdcXFxcJykgPT09IDBcbiAgICAgID8gU1BBQ0VcbiAgICAgIDogRU1QVFlcbiAgXSxcblxuICAvLyByZXBsYWNlIChcXCApIHdpdGggJyAnXG4gIFtcbiAgICAvXFxcXFxccy9nLFxuICAgICgpID0+IFNQQUNFXG4gIF0sXG5cbiAgLy8gRXNjYXBlIG1ldGFjaGFyYWN0ZXJzXG4gIC8vIHdoaWNoIGlzIHdyaXR0ZW4gZG93biBieSB1c2VycyBidXQgbWVhbnMgc3BlY2lhbCBmb3IgcmVndWxhciBleHByZXNzaW9ucy5cblxuICAvLyA+IFRoZXJlIGFyZSAxMiBjaGFyYWN0ZXJzIHdpdGggc3BlY2lhbCBtZWFuaW5nczpcbiAgLy8gPiAtIHRoZSBiYWNrc2xhc2ggXFwsXG4gIC8vID4gLSB0aGUgY2FyZXQgXixcbiAgLy8gPiAtIHRoZSBkb2xsYXIgc2lnbiAkLFxuICAvLyA+IC0gdGhlIHBlcmlvZCBvciBkb3QgLixcbiAgLy8gPiAtIHRoZSB2ZXJ0aWNhbCBiYXIgb3IgcGlwZSBzeW1ib2wgfCxcbiAgLy8gPiAtIHRoZSBxdWVzdGlvbiBtYXJrID8sXG4gIC8vID4gLSB0aGUgYXN0ZXJpc2sgb3Igc3RhciAqLFxuICAvLyA+IC0gdGhlIHBsdXMgc2lnbiArLFxuICAvLyA+IC0gdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgKCxcbiAgLy8gPiAtIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzICksXG4gIC8vID4gLSBhbmQgdGhlIG9wZW5pbmcgc3F1YXJlIGJyYWNrZXQgWyxcbiAgLy8gPiAtIHRoZSBvcGVuaW5nIGN1cmx5IGJyYWNlIHssXG4gIC8vID4gVGhlc2Ugc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBvZnRlbiBjYWxsZWQgXCJtZXRhY2hhcmFjdGVyc1wiLlxuICBbXG4gICAgL1tcXFxcJC58KisoKXteXS9nLFxuICAgIG1hdGNoID0+IGBcXFxcJHttYXRjaH1gXG4gIF0sXG5cbiAgW1xuICAgIC8vID4gYSBxdWVzdGlvbiBtYXJrICg/KSBtYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlclxuICAgIC8oPyFcXFxcKVxcPy9nLFxuICAgICgpID0+ICdbXi9dJ1xuICBdLFxuXG4gIC8vIGxlYWRpbmcgc2xhc2hcbiAgW1xuXG4gICAgLy8gPiBBIGxlYWRpbmcgc2xhc2ggbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRobmFtZS5cbiAgICAvLyA+IEZvciBleGFtcGxlLCBcIi8qLmNcIiBtYXRjaGVzIFwiY2F0LWZpbGUuY1wiIGJ1dCBub3QgXCJtb3ppbGxhLXNoYTEvc2hhMS5jXCIuXG4gICAgLy8gQSBsZWFkaW5nIHNsYXNoIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aG5hbWVcbiAgICAvXlxcLy8sXG4gICAgKCkgPT4gJ14nXG4gIF0sXG5cbiAgLy8gcmVwbGFjZSBzcGVjaWFsIG1ldGFjaGFyYWN0ZXIgc2xhc2ggYWZ0ZXIgdGhlIGxlYWRpbmcgc2xhc2hcbiAgW1xuICAgIC9cXC8vZyxcbiAgICAoKSA9PiAnXFxcXC8nXG4gIF0sXG5cbiAgW1xuICAgIC8vID4gQSBsZWFkaW5nIFwiKipcIiBmb2xsb3dlZCBieSBhIHNsYXNoIG1lYW5zIG1hdGNoIGluIGFsbCBkaXJlY3Rvcmllcy5cbiAgICAvLyA+IEZvciBleGFtcGxlLCBcIioqL2Zvb1wiIG1hdGNoZXMgZmlsZSBvciBkaXJlY3RvcnkgXCJmb29cIiBhbnl3aGVyZSxcbiAgICAvLyA+IHRoZSBzYW1lIGFzIHBhdHRlcm4gXCJmb29cIi5cbiAgICAvLyA+IFwiKiovZm9vL2JhclwiIG1hdGNoZXMgZmlsZSBvciBkaXJlY3RvcnkgXCJiYXJcIiBhbnl3aGVyZSB0aGF0IGlzIGRpcmVjdGx5XG4gICAgLy8gPiAgIHVuZGVyIGRpcmVjdG9yeSBcImZvb1wiLlxuICAgIC8vIE5vdGljZSB0aGF0IHRoZSAnKidzIGhhdmUgYmVlbiByZXBsYWNlZCBhcyAnXFxcXConXG4gICAgL15cXF4qXFxcXFxcKlxcXFxcXCpcXFxcXFwvLyxcblxuICAgIC8vICcqKi9mb28nIDwtPiAnZm9vJ1xuICAgICgpID0+ICdeKD86LipcXFxcLyk/J1xuICBdLFxuXG4gIC8vIHN0YXJ0aW5nXG4gIFtcbiAgICAvLyB0aGVyZSB3aWxsIGJlIG5vIGxlYWRpbmcgJy8nXG4gICAgLy8gICAod2hpY2ggaGFzIGJlZW4gcmVwbGFjZWQgYnkgc2VjdGlvbiBcImxlYWRpbmcgc2xhc2hcIilcbiAgICAvLyBJZiBzdGFydHMgd2l0aCAnKionLCBhZGRpbmcgYSAnXicgdG8gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHNvIHdvcmtzXG4gICAgL14oPz1bXl5dKS8sXG4gICAgZnVuY3Rpb24gc3RhcnRpbmdSZXBsYWNlciAoKSB7XG4gICAgICAvLyBJZiBoYXMgYSBzbGFzaCBgL2AgYXQgdGhlIGJlZ2lubmluZyBvciBtaWRkbGVcbiAgICAgIHJldHVybiAhL1xcLyg/ISQpLy50ZXN0KHRoaXMpXG4gICAgICAgIC8vID4gUHJpb3IgdG8gMi4yMi4xXG4gICAgICAgIC8vID4gSWYgdGhlIHBhdHRlcm4gZG9lcyBub3QgY29udGFpbiBhIHNsYXNoIC8sXG4gICAgICAgIC8vID4gICBHaXQgdHJlYXRzIGl0IGFzIGEgc2hlbGwgZ2xvYiBwYXR0ZXJuXG4gICAgICAgIC8vIEFjdHVhbGx5LCBpZiB0aGVyZSBpcyBvbmx5IGEgdHJhaWxpbmcgc2xhc2gsXG4gICAgICAgIC8vICAgZ2l0IGFsc28gdHJlYXRzIGl0IGFzIGEgc2hlbGwgZ2xvYiBwYXR0ZXJuXG5cbiAgICAgICAgLy8gQWZ0ZXIgMi4yMi4xIChjb21wYXRpYmxlIGJ1dCBjbGVhcmVyKVxuICAgICAgICAvLyA+IElmIHRoZXJlIGlzIGEgc2VwYXJhdG9yIGF0IHRoZSBiZWdpbm5pbmcgb3IgbWlkZGxlIChvciBib3RoKVxuICAgICAgICAvLyA+IG9mIHRoZSBwYXR0ZXJuLCB0aGVuIHRoZSBwYXR0ZXJuIGlzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnlcbiAgICAgICAgLy8gPiBsZXZlbCBvZiB0aGUgcGFydGljdWxhciAuZ2l0aWdub3JlIGZpbGUgaXRzZWxmLlxuICAgICAgICAvLyA+IE90aGVyd2lzZSB0aGUgcGF0dGVybiBtYXkgYWxzbyBtYXRjaCBhdCBhbnkgbGV2ZWwgYmVsb3dcbiAgICAgICAgLy8gPiB0aGUgLmdpdGlnbm9yZSBsZXZlbC5cbiAgICAgICAgPyAnKD86XnxcXFxcLyknXG5cbiAgICAgICAgLy8gPiBPdGhlcndpc2UsIEdpdCB0cmVhdHMgdGhlIHBhdHRlcm4gYXMgYSBzaGVsbCBnbG9iIHN1aXRhYmxlIGZvclxuICAgICAgICAvLyA+ICAgY29uc3VtcHRpb24gYnkgZm5tYXRjaCgzKVxuICAgICAgICA6ICdeJ1xuICAgIH1cbiAgXSxcblxuICAvLyB0d28gZ2xvYnN0YXJzXG4gIFtcbiAgICAvLyBVc2UgbG9va2FoZWFkIGFzc2VydGlvbnMgc28gdGhhdCB3ZSBjb3VsZCBtYXRjaCBtb3JlIHRoYW4gb25lIGAnLyoqJ2BcbiAgICAvXFxcXFxcL1xcXFxcXCpcXFxcXFwqKD89XFxcXFxcL3wkKS9nLFxuXG4gICAgLy8gWmVybywgb25lIG9yIHNldmVyYWwgZGlyZWN0b3JpZXNcbiAgICAvLyBzaG91bGQgbm90IHVzZSAnKicsIG9yIGl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5leHQgcmVwbGFjZXJcblxuICAgIC8vIENoZWNrIGlmIGl0IGlzIG5vdCB0aGUgbGFzdCBgJy8qKidgXG4gICAgKF8sIGluZGV4LCBzdHIpID0+IGluZGV4ICsgNiA8IHN0ci5sZW5ndGhcblxuICAgICAgLy8gY2FzZTogLyoqL1xuICAgICAgLy8gPiBBIHNsYXNoIGZvbGxvd2VkIGJ5IHR3byBjb25zZWN1dGl2ZSBhc3Rlcmlza3MgdGhlbiBhIHNsYXNoIG1hdGNoZXNcbiAgICAgIC8vID4gICB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMuXG4gICAgICAvLyA+IEZvciBleGFtcGxlLCBcImEvKiovYlwiIG1hdGNoZXMgXCJhL2JcIiwgXCJhL3gvYlwiLCBcImEveC95L2JcIiBhbmQgc28gb24uXG4gICAgICAvLyAnLyoqLydcbiAgICAgID8gJyg/OlxcXFwvW15cXFxcL10rKSonXG5cbiAgICAgIC8vIGNhc2U6IC8qKlxuICAgICAgLy8gPiBBIHRyYWlsaW5nIGBcIi8qKlwiYCBtYXRjaGVzIGV2ZXJ5dGhpbmcgaW5zaWRlLlxuXG4gICAgICAvLyAjMjE6IGV2ZXJ5dGhpbmcgaW5zaWRlIGJ1dCBpdCBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGN1cnJlbnQgZm9sZGVyXG4gICAgICA6ICdcXFxcLy4rJ1xuICBdLFxuXG4gIC8vIG5vcm1hbCBpbnRlcm1lZGlhdGUgd2lsZGNhcmRzXG4gIFtcbiAgICAvLyBOZXZlciByZXBsYWNlIGVzY2FwZWQgJyonXG4gICAgLy8gaWdub3JlIHJ1bGUgJ1xcKicgd2lsbCBtYXRjaCB0aGUgcGF0aCAnKidcblxuICAgIC8vICdhYmMuKi8nIC0+IGdvXG4gICAgLy8gJ2FiYy4qJyAgLT4gc2tpcCB0aGlzIHJ1bGUsXG4gICAgLy8gICAgY296IHRyYWlsaW5nIHNpbmdsZSB3aWxkY2FyZCB3aWxsIGJlIGhhbmRlZCBieSBbdHJhaWxpbmcgd2lsZGNhcmRdXG4gICAgLyhefFteXFxcXF0rKShcXFxcXFwqKSsoPz0uKykvZyxcblxuICAgIC8vICcqLmpzJyBtYXRjaGVzICcuanMnXG4gICAgLy8gJyouanMnIGRvZXNuJ3QgbWF0Y2ggJ2FiYydcbiAgICAoXywgcDEsIHAyKSA9PiB7XG4gICAgICAvLyAxLlxuICAgICAgLy8gPiBBbiBhc3RlcmlzayBcIipcIiBtYXRjaGVzIGFueXRoaW5nIGV4Y2VwdCBhIHNsYXNoLlxuICAgICAgLy8gMi5cbiAgICAgIC8vID4gT3RoZXIgY29uc2VjdXRpdmUgYXN0ZXJpc2tzIGFyZSBjb25zaWRlcmVkIHJlZ3VsYXIgYXN0ZXJpc2tzXG4gICAgICAvLyA+IGFuZCB3aWxsIG1hdGNoIGFjY29yZGluZyB0byB0aGUgcHJldmlvdXMgcnVsZXMuXG4gICAgICBjb25zdCB1bmVzY2FwZWQgPSBwMi5yZXBsYWNlKC9cXFxcXFwqL2csICdbXlxcXFwvXSonKVxuICAgICAgcmV0dXJuIHAxICsgdW5lc2NhcGVkXG4gICAgfVxuICBdLFxuXG4gIFtcbiAgICAvLyB1bmVzY2FwZSwgcmV2ZXJ0IHN0ZXAgMyBleGNlcHQgZm9yIGJhY2sgc2xhc2hcbiAgICAvLyBGb3IgZXhhbXBsZSwgaWYgYSB1c2VyIGVzY2FwZSBhICdcXFxcKicsXG4gICAgLy8gYWZ0ZXIgc3RlcCAzLCB0aGUgcmVzdWx0IHdpbGwgYmUgJ1xcXFxcXFxcXFxcXConXG4gICAgL1xcXFxcXFxcXFxcXCg/PVskLnwqKygpe15dKS9nLFxuICAgICgpID0+IEVTQ0FQRVxuICBdLFxuXG4gIFtcbiAgICAvLyAnXFxcXFxcXFwnIC0+ICdcXFxcJ1xuICAgIC9cXFxcXFxcXC9nLFxuICAgICgpID0+IEVTQ0FQRVxuICBdLFxuXG4gIFtcbiAgICAvLyA+IFRoZSByYW5nZSBub3RhdGlvbiwgZS5nLiBbYS16QS1aXSxcbiAgICAvLyA+IGNhbiBiZSB1c2VkIHRvIG1hdGNoIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBpbiBhIHJhbmdlLlxuXG4gICAgLy8gYFxcYCBpcyBlc2NhcGVkIGJ5IHN0ZXAgM1xuICAgIC8oXFxcXCk/XFxbKFteXFxdL10qPykoXFxcXCopKCR8XFxdKS9nLFxuICAgIChtYXRjaCwgbGVhZEVzY2FwZSwgcmFuZ2UsIGVuZEVzY2FwZSwgY2xvc2UpID0+IGxlYWRFc2NhcGUgPT09IEVTQ0FQRVxuICAgICAgLy8gJ1xcXFxbYmFyXScgLT4gJ1xcXFxcXFxcW2JhclxcXFxdJ1xuICAgICAgPyBgXFxcXFske3JhbmdlfSR7Y2xlYW5SYW5nZUJhY2tTbGFzaChlbmRFc2NhcGUpfSR7Y2xvc2V9YFxuICAgICAgOiBjbG9zZSA9PT0gJ10nXG4gICAgICAgID8gZW5kRXNjYXBlLmxlbmd0aCAlIDIgPT09IDBcbiAgICAgICAgICAvLyBBIG5vcm1hbCBjYXNlLCBhbmQgaXQgaXMgYSByYW5nZSBub3RhdGlvblxuICAgICAgICAgIC8vICdbYmFyXSdcbiAgICAgICAgICAvLyAnW2JhclxcXFxcXFxcXSdcbiAgICAgICAgICA/IGBbJHtzYW5pdGl6ZVJhbmdlKHJhbmdlKX0ke2VuZEVzY2FwZX1dYFxuICAgICAgICAgIC8vIEludmFsaWQgcmFuZ2Ugbm90YXRvblxuICAgICAgICAgIC8vICdbYmFyXFxcXF0nIC0+ICdbYmFyXFxcXFxcXFxdJ1xuICAgICAgICAgIDogJ1tdJ1xuICAgICAgICA6ICdbXSdcbiAgXSxcblxuICAvLyBlbmRpbmdcbiAgW1xuICAgIC8vICdqcycgd2lsbCBub3QgbWF0Y2ggJ2pzLidcbiAgICAvLyAnYWInIHdpbGwgbm90IG1hdGNoICdhYmMnXG4gICAgLyg/OlteKl0pJC8sXG5cbiAgICAvLyBXVEYhXG4gICAgLy8gaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdGlnbm9yZVxuICAgIC8vIGNoYW5nZXMgaW4gWzIuMjIuMV0oaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdGlnbm9yZS8yLjIyLjEpXG4gICAgLy8gd2hpY2ggcmUtZml4ZXMgIzI0LCAjMzhcblxuICAgIC8vID4gSWYgdGhlcmUgaXMgYSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiB0aGVuIHRoZSBwYXR0ZXJuXG4gICAgLy8gPiB3aWxsIG9ubHkgbWF0Y2ggZGlyZWN0b3JpZXMsIG90aGVyd2lzZSB0aGUgcGF0dGVybiBjYW4gbWF0Y2ggYm90aFxuICAgIC8vID4gZmlsZXMgYW5kIGRpcmVjdG9yaWVzLlxuXG4gICAgLy8gJ2pzKicgd2lsbCBub3QgbWF0Y2ggJ2EuanMnXG4gICAgLy8gJ2pzLycgd2lsbCBub3QgbWF0Y2ggJ2EuanMnXG4gICAgLy8gJ2pzJyB3aWxsIG1hdGNoICdhLmpzJyBhbmQgJ2EuanMvJ1xuICAgIG1hdGNoID0+IC9cXC8kLy50ZXN0KG1hdGNoKVxuICAgICAgLy8gZm9vLyB3aWxsIG5vdCBtYXRjaCAnZm9vJ1xuICAgICAgPyBgJHttYXRjaH0kYFxuICAgICAgLy8gZm9vIG1hdGNoZXMgJ2ZvbycgYW5kICdmb28vJ1xuICAgICAgOiBgJHttYXRjaH0oPz0kfFxcXFwvJClgXG4gIF0sXG5cbiAgLy8gdHJhaWxpbmcgd2lsZGNhcmRcbiAgW1xuICAgIC8oXFxefFxcXFxcXC8pP1xcXFxcXCokLyxcbiAgICAoXywgcDEpID0+IHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHAxXG4gICAgICAgIC8vICdcXF4nOlxuICAgICAgICAvLyAnLyonIGRvZXMgbm90IG1hdGNoIEVNUFRZXG4gICAgICAgIC8vICcvKicgZG9lcyBub3QgbWF0Y2ggZXZlcnl0aGluZ1xuXG4gICAgICAgIC8vICdcXFxcXFwvJzpcbiAgICAgICAgLy8gJ2FiYy8qJyBkb2VzIG5vdCBtYXRjaCAnYWJjLydcbiAgICAgICAgPyBgJHtwMX1bXi9dK2BcblxuICAgICAgICAvLyAnYSonIG1hdGNoZXMgJ2EnXG4gICAgICAgIC8vICdhKicgbWF0Y2hlcyAnYWEnXG4gICAgICAgIDogJ1teL10qJ1xuXG4gICAgICByZXR1cm4gYCR7cHJlZml4fSg/PSR8XFxcXC8kKWBcbiAgICB9XG4gIF0sXG5dXG5cbi8vIEEgc2ltcGxlIGNhY2hlLCBiZWNhdXNlIGFuIGlnbm9yZSBydWxlIG9ubHkgaGFzIG9ubHkgb25lIGNlcnRhaW4gbWVhbmluZ1xuY29uc3QgcmVnZXhDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuLy8gQHBhcmFtIHtwYXR0ZXJufVxuY29uc3QgbWFrZVJlZ2V4ID0gKHBhdHRlcm4sIGlnbm9yZUNhc2UpID0+IHtcbiAgbGV0IHNvdXJjZSA9IHJlZ2V4Q2FjaGVbcGF0dGVybl1cblxuICBpZiAoIXNvdXJjZSkge1xuICAgIHNvdXJjZSA9IFJFUExBQ0VSUy5yZWR1Y2UoXG4gICAgICAocHJldiwgY3VycmVudCkgPT4gcHJldi5yZXBsYWNlKGN1cnJlbnRbMF0sIGN1cnJlbnRbMV0uYmluZChwYXR0ZXJuKSksXG4gICAgICBwYXR0ZXJuXG4gICAgKVxuICAgIHJlZ2V4Q2FjaGVbcGF0dGVybl0gPSBzb3VyY2VcbiAgfVxuXG4gIHJldHVybiBpZ25vcmVDYXNlXG4gICAgPyBuZXcgUmVnRXhwKHNvdXJjZSwgJ2knKVxuICAgIDogbmV3IFJlZ0V4cChzb3VyY2UpXG59XG5cbmNvbnN0IGlzU3RyaW5nID0gc3ViamVjdCA9PiB0eXBlb2Ygc3ViamVjdCA9PT0gJ3N0cmluZydcblxuLy8gPiBBIGJsYW5rIGxpbmUgbWF0Y2hlcyBubyBmaWxlcywgc28gaXQgY2FuIHNlcnZlIGFzIGEgc2VwYXJhdG9yIGZvciByZWFkYWJpbGl0eS5cbmNvbnN0IGNoZWNrUGF0dGVybiA9IHBhdHRlcm4gPT4gcGF0dGVyblxuICAmJiBpc1N0cmluZyhwYXR0ZXJuKVxuICAmJiAhUkVHRVhfVEVTVF9CTEFOS19MSU5FLnRlc3QocGF0dGVybilcbiAgJiYgIVJFR0VYX0lOVkFMSURfVFJBSUxJTkdfQkFDS1NMQVNILnRlc3QocGF0dGVybilcblxuICAvLyA+IEEgbGluZSBzdGFydGluZyB3aXRoICMgc2VydmVzIGFzIGEgY29tbWVudC5cbiAgJiYgcGF0dGVybi5pbmRleE9mKCcjJykgIT09IDBcblxuY29uc3Qgc3BsaXRQYXR0ZXJuID0gcGF0dGVybiA9PiBwYXR0ZXJuLnNwbGl0KFJFR0VYX1NQTElUQUxMX0NSTEYpXG5cbmNsYXNzIElnbm9yZVJ1bGUge1xuICBjb25zdHJ1Y3RvciAoXG4gICAgb3JpZ2luLFxuICAgIHBhdHRlcm4sXG4gICAgbmVnYXRpdmUsXG4gICAgcmVnZXhcbiAgKSB7XG4gICAgdGhpcy5vcmlnaW4gPSBvcmlnaW5cbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuXG4gICAgdGhpcy5uZWdhdGl2ZSA9IG5lZ2F0aXZlXG4gICAgdGhpcy5yZWdleCA9IHJlZ2V4XG4gIH1cbn1cblxuY29uc3QgY3JlYXRlUnVsZSA9IChwYXR0ZXJuLCBpZ25vcmVDYXNlKSA9PiB7XG4gIGNvbnN0IG9yaWdpbiA9IHBhdHRlcm5cbiAgbGV0IG5lZ2F0aXZlID0gZmFsc2VcblxuICAvLyA+IEFuIG9wdGlvbmFsIHByZWZpeCBcIiFcIiB3aGljaCBuZWdhdGVzIHRoZSBwYXR0ZXJuO1xuICBpZiAocGF0dGVybi5pbmRleE9mKCchJykgPT09IDApIHtcbiAgICBuZWdhdGl2ZSA9IHRydWVcbiAgICBwYXR0ZXJuID0gcGF0dGVybi5zdWJzdHIoMSlcbiAgfVxuXG4gIHBhdHRlcm4gPSBwYXR0ZXJuXG4gIC8vID4gUHV0IGEgYmFja3NsYXNoIChcIlxcXCIpIGluIGZyb250IG9mIHRoZSBmaXJzdCBcIiFcIiBmb3IgcGF0dGVybnMgdGhhdFxuICAvLyA+ICAgYmVnaW4gd2l0aCBhIGxpdGVyYWwgXCIhXCIsIGZvciBleGFtcGxlLCBgXCJcXCFpbXBvcnRhbnQhLnR4dFwiYC5cbiAgLnJlcGxhY2UoUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfRVhDTEFNQVRJT04sICchJylcbiAgLy8gPiBQdXQgYSBiYWNrc2xhc2ggKFwiXFxcIikgaW4gZnJvbnQgb2YgdGhlIGZpcnN0IGhhc2ggZm9yIHBhdHRlcm5zIHRoYXRcbiAgLy8gPiAgIGJlZ2luIHdpdGggYSBoYXNoLlxuICAucmVwbGFjZShSRUdFWF9SRVBMQUNFX0xFQURJTkdfRVhDQVBFRF9IQVNILCAnIycpXG5cbiAgY29uc3QgcmVnZXggPSBtYWtlUmVnZXgocGF0dGVybiwgaWdub3JlQ2FzZSlcblxuICByZXR1cm4gbmV3IElnbm9yZVJ1bGUoXG4gICAgb3JpZ2luLFxuICAgIHBhdHRlcm4sXG4gICAgbmVnYXRpdmUsXG4gICAgcmVnZXhcbiAgKVxufVxuXG5jb25zdCB0aHJvd0Vycm9yID0gKG1lc3NhZ2UsIEN0b3IpID0+IHtcbiAgdGhyb3cgbmV3IEN0b3IobWVzc2FnZSlcbn1cblxuY29uc3QgY2hlY2tQYXRoID0gKHBhdGgsIG9yaWdpbmFsUGF0aCwgZG9UaHJvdykgPT4ge1xuICBpZiAoIWlzU3RyaW5nKHBhdGgpKSB7XG4gICAgcmV0dXJuIGRvVGhyb3coXG4gICAgICBgcGF0aCBtdXN0IGJlIGEgc3RyaW5nLCBidXQgZ290IFxcYCR7b3JpZ2luYWxQYXRofVxcYGAsXG4gICAgICBUeXBlRXJyb3JcbiAgICApXG4gIH1cblxuICAvLyBXZSBkb24ndCBrbm93IGlmIHdlIHNob3VsZCBpZ25vcmUgRU1QVFksIHNvIHRocm93XG4gIGlmICghcGF0aCkge1xuICAgIHJldHVybiBkb1Rocm93KGBwYXRoIG11c3Qgbm90IGJlIGVtcHR5YCwgVHlwZUVycm9yKVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQgaXMgYSByZWxhdGl2ZSBwYXRoXG4gIGlmIChjaGVja1BhdGguaXNOb3RSZWxhdGl2ZShwYXRoKSkge1xuICAgIGNvbnN0IHIgPSAnYHBhdGgucmVsYXRpdmUoKWBkJ1xuICAgIHJldHVybiBkb1Rocm93KFxuICAgICAgYHBhdGggc2hvdWxkIGJlIGEgJHtyfSBzdHJpbmcsIGJ1dCBnb3QgXCIke29yaWdpbmFsUGF0aH1cImAsXG4gICAgICBSYW5nZUVycm9yXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgaXNOb3RSZWxhdGl2ZSA9IHBhdGggPT4gUkVHRVhfVEVTVF9JTlZBTElEX1BBVEgudGVzdChwYXRoKVxuXG5jaGVja1BhdGguaXNOb3RSZWxhdGl2ZSA9IGlzTm90UmVsYXRpdmVcbmNoZWNrUGF0aC5jb252ZXJ0ID0gcCA9PiBwXG5cbmNsYXNzIElnbm9yZSB7XG4gIGNvbnN0cnVjdG9yICh7XG4gICAgaWdub3JlY2FzZSA9IHRydWUsXG4gICAgaWdub3JlQ2FzZSA9IGlnbm9yZWNhc2UsXG4gICAgYWxsb3dSZWxhdGl2ZVBhdGhzID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgZGVmaW5lKHRoaXMsIEtFWV9JR05PUkUsIHRydWUpXG5cbiAgICB0aGlzLl9ydWxlcyA9IFtdXG4gICAgdGhpcy5faWdub3JlQ2FzZSA9IGlnbm9yZUNhc2VcbiAgICB0aGlzLl9hbGxvd1JlbGF0aXZlUGF0aHMgPSBhbGxvd1JlbGF0aXZlUGF0aHNcbiAgICB0aGlzLl9pbml0Q2FjaGUoKVxuICB9XG5cbiAgX2luaXRDYWNoZSAoKSB7XG4gICAgdGhpcy5faWdub3JlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5fdGVzdENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICB9XG5cbiAgX2FkZFBhdHRlcm4gKHBhdHRlcm4pIHtcbiAgICAvLyAjMzJcbiAgICBpZiAocGF0dGVybiAmJiBwYXR0ZXJuW0tFWV9JR05PUkVdKSB7XG4gICAgICB0aGlzLl9ydWxlcyA9IHRoaXMuX3J1bGVzLmNvbmNhdChwYXR0ZXJuLl9ydWxlcylcbiAgICAgIHRoaXMuX2FkZGVkID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNoZWNrUGF0dGVybihwYXR0ZXJuKSkge1xuICAgICAgY29uc3QgcnVsZSA9IGNyZWF0ZVJ1bGUocGF0dGVybiwgdGhpcy5faWdub3JlQ2FzZSlcbiAgICAgIHRoaXMuX2FkZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fcnVsZXMucHVzaChydWxlKVxuICAgIH1cbiAgfVxuXG4gIC8vIEBwYXJhbSB7QXJyYXk8c3RyaW5nPiB8IHN0cmluZyB8IElnbm9yZX0gcGF0dGVyblxuICBhZGQgKHBhdHRlcm4pIHtcbiAgICB0aGlzLl9hZGRlZCA9IGZhbHNlXG5cbiAgICBtYWtlQXJyYXkoXG4gICAgICBpc1N0cmluZyhwYXR0ZXJuKVxuICAgICAgICA/IHNwbGl0UGF0dGVybihwYXR0ZXJuKVxuICAgICAgICA6IHBhdHRlcm5cbiAgICApLmZvckVhY2godGhpcy5fYWRkUGF0dGVybiwgdGhpcylcblxuICAgIC8vIFNvbWUgcnVsZXMgaGF2ZSBqdXN0IGFkZGVkIHRvIHRoZSBpZ25vcmUsXG4gICAgLy8gbWFraW5nIHRoZSBiZWhhdmlvciBjaGFuZ2VkLlxuICAgIGlmICh0aGlzLl9hZGRlZCkge1xuICAgICAgdGhpcy5faW5pdENhY2hlKClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gbGVnYWN5XG4gIGFkZFBhdHRlcm4gKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQocGF0dGVybilcbiAgfVxuXG4gIC8vICAgICAgICAgIHwgICAgICAgICAgIGlnbm9yZWQgOiB1bmlnbm9yZWRcbiAgLy8gbmVnYXRpdmUgfCAgIDA6MCAgIHwgICAwOjEgICB8ICAgMTowICAgfCAgIDE6MVxuICAvLyAtLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0tXG4gIC8vICAgICAwICAgIHwgIFRFU1QgICB8ICBURVNUICAgfCAgU0tJUCAgIHwgICAgWFxuICAvLyAgICAgMSAgICB8ICBURVNUSUYgfCAgU0tJUCAgIHwgIFRFU1QgICB8ICAgIFhcblxuICAvLyAtIFNLSVA6IGFsd2F5cyBza2lwXG4gIC8vIC0gVEVTVDogYWx3YXlzIHRlc3RcbiAgLy8gLSBURVNUSUY6IG9ubHkgdGVzdCBpZiBjaGVja1VuaWdub3JlZFxuICAvLyAtIFg6IHRoYXQgbmV2ZXIgaGFwcGVuXG5cbiAgLy8gQHBhcmFtIHtib29sZWFufSB3aGV0aGVyIHNob3VsZCBjaGVjayBpZiB0aGUgcGF0aCBpcyB1bmlnbm9yZWQsXG4gIC8vICAgc2V0dGluZyBgY2hlY2tVbmlnbm9yZWRgIHRvIGBmYWxzZWAgY291bGQgcmVkdWNlIGFkZGl0aW9uYWxcbiAgLy8gICBwYXRoIG1hdGNoaW5nLlxuXG4gIC8vIEByZXR1cm5zIHtUZXN0UmVzdWx0fSB0cnVlIGlmIGEgZmlsZSBpcyBpZ25vcmVkXG4gIF90ZXN0T25lIChwYXRoLCBjaGVja1VuaWdub3JlZCkge1xuICAgIGxldCBpZ25vcmVkID0gZmFsc2VcbiAgICBsZXQgdW5pZ25vcmVkID0gZmFsc2VcblxuICAgIHRoaXMuX3J1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICBjb25zdCB7bmVnYXRpdmV9ID0gcnVsZVxuICAgICAgaWYgKFxuICAgICAgICB1bmlnbm9yZWQgPT09IG5lZ2F0aXZlICYmIGlnbm9yZWQgIT09IHVuaWdub3JlZFxuICAgICAgICB8fCBuZWdhdGl2ZSAmJiAhaWdub3JlZCAmJiAhdW5pZ25vcmVkICYmICFjaGVja1VuaWdub3JlZFxuICAgICAgKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaGVkID0gcnVsZS5yZWdleC50ZXN0KHBhdGgpXG5cbiAgICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgIGlnbm9yZWQgPSAhbmVnYXRpdmVcbiAgICAgICAgdW5pZ25vcmVkID0gbmVnYXRpdmVcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlnbm9yZWQsXG4gICAgICB1bmlnbm9yZWRcbiAgICB9XG4gIH1cblxuICAvLyBAcmV0dXJucyB7VGVzdFJlc3VsdH1cbiAgX3Rlc3QgKG9yaWdpbmFsUGF0aCwgY2FjaGUsIGNoZWNrVW5pZ25vcmVkLCBzbGljZXMpIHtcbiAgICBjb25zdCBwYXRoID0gb3JpZ2luYWxQYXRoXG4gICAgICAvLyBTdXBwb3J0cyBudWxsYWJsZSBwYXRoXG4gICAgICAmJiBjaGVja1BhdGguY29udmVydChvcmlnaW5hbFBhdGgpXG5cbiAgICBjaGVja1BhdGgoXG4gICAgICBwYXRoLFxuICAgICAgb3JpZ2luYWxQYXRoLFxuICAgICAgdGhpcy5fYWxsb3dSZWxhdGl2ZVBhdGhzXG4gICAgICAgID8gUkVUVVJOX0ZBTFNFXG4gICAgICAgIDogdGhyb3dFcnJvclxuICAgIClcblxuICAgIHJldHVybiB0aGlzLl90KHBhdGgsIGNhY2hlLCBjaGVja1VuaWdub3JlZCwgc2xpY2VzKVxuICB9XG5cbiAgX3QgKHBhdGgsIGNhY2hlLCBjaGVja1VuaWdub3JlZCwgc2xpY2VzKSB7XG4gICAgaWYgKHBhdGggaW4gY2FjaGUpIHtcbiAgICAgIHJldHVybiBjYWNoZVtwYXRoXVxuICAgIH1cblxuICAgIGlmICghc2xpY2VzKSB7XG4gICAgICAvLyBwYXRoL3RvL2EuanNcbiAgICAgIC8vIFsncGF0aCcsICd0bycsICdhLmpzJ11cbiAgICAgIHNsaWNlcyA9IHBhdGguc3BsaXQoU0xBU0gpXG4gICAgfVxuXG4gICAgc2xpY2VzLnBvcCgpXG5cbiAgICAvLyBJZiB0aGUgcGF0aCBoYXMgbm8gcGFyZW50IGRpcmVjdG9yeSwganVzdCB0ZXN0IGl0XG4gICAgaWYgKCFzbGljZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY2FjaGVbcGF0aF0gPSB0aGlzLl90ZXN0T25lKHBhdGgsIGNoZWNrVW5pZ25vcmVkKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX3QoXG4gICAgICBzbGljZXMuam9pbihTTEFTSCkgKyBTTEFTSCxcbiAgICAgIGNhY2hlLFxuICAgICAgY2hlY2tVbmlnbm9yZWQsXG4gICAgICBzbGljZXNcbiAgICApXG5cbiAgICAvLyBJZiB0aGUgcGF0aCBjb250YWlucyBhIHBhcmVudCBkaXJlY3RvcnksIGNoZWNrIHRoZSBwYXJlbnQgZmlyc3RcbiAgICByZXR1cm4gY2FjaGVbcGF0aF0gPSBwYXJlbnQuaWdub3JlZFxuICAgICAgLy8gPiBJdCBpcyBub3QgcG9zc2libGUgdG8gcmUtaW5jbHVkZSBhIGZpbGUgaWYgYSBwYXJlbnQgZGlyZWN0b3J5IG9mXG4gICAgICAvLyA+ICAgdGhhdCBmaWxlIGlzIGV4Y2x1ZGVkLlxuICAgICAgPyBwYXJlbnRcbiAgICAgIDogdGhpcy5fdGVzdE9uZShwYXRoLCBjaGVja1VuaWdub3JlZClcbiAgfVxuXG4gIGlnbm9yZXMgKHBhdGgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVzdChwYXRoLCB0aGlzLl9pZ25vcmVDYWNoZSwgZmFsc2UpLmlnbm9yZWRcbiAgfVxuXG4gIGNyZWF0ZUZpbHRlciAoKSB7XG4gICAgcmV0dXJuIHBhdGggPT4gIXRoaXMuaWdub3JlcyhwYXRoKVxuICB9XG5cbiAgZmlsdGVyIChwYXRocykge1xuICAgIHJldHVybiBtYWtlQXJyYXkocGF0aHMpLmZpbHRlcih0aGlzLmNyZWF0ZUZpbHRlcigpKVxuICB9XG5cbiAgLy8gQHJldHVybnMge1Rlc3RSZXN1bHR9XG4gIHRlc3QgKHBhdGgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVzdChwYXRoLCB0aGlzLl90ZXN0Q2FjaGUsIHRydWUpXG4gIH1cbn1cblxuY29uc3QgZmFjdG9yeSA9IG9wdGlvbnMgPT4gbmV3IElnbm9yZShvcHRpb25zKVxuXG5jb25zdCBpc1BhdGhWYWxpZCA9IHBhdGggPT5cbiAgY2hlY2tQYXRoKHBhdGggJiYgY2hlY2tQYXRoLmNvbnZlcnQocGF0aCksIHBhdGgsIFJFVFVSTl9GQUxTRSlcblxuZmFjdG9yeS5pc1BhdGhWYWxpZCA9IGlzUGF0aFZhbGlkXG5cbi8vIEZpeGVzIHR5cGVzY3JpcHRcbmZhY3RvcnkuZGVmYXVsdCA9IGZhY3RvcnlcblxubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5XG5cbi8vIFdpbmRvd3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChcbiAgLy8gRGV0ZWN0IGBwcm9jZXNzYCBzbyB0aGF0IGl0IGNhbiBydW4gaW4gYnJvd3NlcnMuXG4gIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJ1xuICAmJiAoXG4gICAgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuSUdOT1JFX1RFU1RfV0lOMzJcbiAgICB8fCBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gIClcbikge1xuICAvKiBlc2xpbnQgbm8tY29udHJvbC1yZWdleDogXCJvZmZcIiAqL1xuICBjb25zdCBtYWtlUG9zaXggPSBzdHIgPT4gL15cXFxcXFxcXFxcP1xcXFwvLnRlc3Qoc3RyKVxuICB8fCAvW1wiPD58XFx1MDAwMC1cXHUwMDFGXSsvdS50ZXN0KHN0cilcbiAgICA/IHN0clxuICAgIDogc3RyLnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuXG4gIGNoZWNrUGF0aC5jb252ZXJ0ID0gbWFrZVBvc2l4XG5cbiAgLy8gJ0M6XFxcXGZvbycgICAgIDwtICdDOlxcXFxmb28nIGhhcyBiZWVuIGNvbnZlcnRlZCB0byAnQzovJ1xuICAvLyAnZDpcXFxcZm9vJ1xuICBjb25zdCBSRUdJWF9JU19XSU5ET1dTX1BBVEhfQUJTT0xVVEUgPSAvXlthLXpdOlxcLy9pXG4gIGNoZWNrUGF0aC5pc05vdFJlbGF0aXZlID0gcGF0aCA9PlxuICAgIFJFR0lYX0lTX1dJTkRPV1NfUEFUSF9BQlNPTFVURS50ZXN0KHBhdGgpXG4gICAgfHwgaXNOb3RSZWxhdGl2ZShwYXRoKVxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7IC8vICQmIG1lYW5zIHRoZSB3aG9sZSBtYXRjaGVkIHN0cmluZ1xufVxuXG5mdW5jdGlvbiByZXBsYWNlQWxsKHN0ciwgc2VhcmNoLCByZXBsYWNlbWVudCkge1xuICBzZWFyY2ggPSBzZWFyY2ggaW5zdGFuY2VvZiBSZWdFeHAgPyBzZWFyY2ggOiBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cChzZWFyY2gpLCAnZycpO1xuXG4gIHJldHVybiBzdHIucmVwbGFjZShzZWFyY2gsIHJlcGxhY2VtZW50KTtcbn1cblxudmFyIENsZWFuR2l0UmVmID0ge1xuICBjbGVhbjogZnVuY3Rpb24gY2xlYW4odmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIHN0cmluZywgcmVjZWl2ZWQ6ICcgKyB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdmFsdWUgPSByZXBsYWNlQWxsKHZhbHVlLCAnLi8nLCAnLycpO1xuICAgIHZhbHVlID0gcmVwbGFjZUFsbCh2YWx1ZSwgJy4uJywgJy4nKTtcbiAgICB2YWx1ZSA9IHJlcGxhY2VBbGwodmFsdWUsICcgJywgJy0nKTtcbiAgICB2YWx1ZSA9IHJlcGxhY2VBbGwodmFsdWUsIC9eW35eOj8qXFxcXFxcLV0vZywgJycpO1xuICAgIHZhbHVlID0gcmVwbGFjZUFsbCh2YWx1ZSwgL1t+Xjo/KlxcXFxdL2csICctJyk7XG4gICAgdmFsdWUgPSByZXBsYWNlQWxsKHZhbHVlLCAvW35eOj8qXFxcXFxcLV0kL2csICcnKTtcbiAgICB2YWx1ZSA9IHJlcGxhY2VBbGwodmFsdWUsICdAeycsICctJyk7XG4gICAgdmFsdWUgPSByZXBsYWNlQWxsKHZhbHVlLCAvXFwuJC9nLCAnJyk7XG4gICAgdmFsdWUgPSByZXBsYWNlQWxsKHZhbHVlLCAvXFwvJC9nLCAnJyk7XG4gICAgdmFsdWUgPSByZXBsYWNlQWxsKHZhbHVlLCAvXFwubG9jayQvZywgJycpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDbGVhbkdpdFJlZjsiLCAiLypcbiAqIFVSTDogaHR0cHM6Ly9naXRodWIuY29tL2N1YmljZGFpeWEvb25wXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzIFRhdHN1aGlrbyBLdWJvIDxjdWJpY2RhaXlhQGdtYWlsLmNvbT5cbiAqXG4gKiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiAgVEhFIFNPRlRXQVJFLlxuICovXG5cbi8qKlxuICogVGhlIGFsZ29yaXRobSBpbXBsZW1lbnRlZCBoZXJlIGlzIGJhc2VkIG9uIFwiQW4gTyhOUCkgU2VxdWVuY2UgQ29tcGFyaXNvbiBBbGdvcml0aG1cIlxuICogYnkgZGVzY3JpYmVkIGJ5IFN1biBXdSwgVWRpIE1hbmJlciBhbmQgR2VuZSBNeWVyc1xuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFfLCBiXykge1xuICAgIHZhciBhICAgICAgICAgID0gYV8sXG4gICAgICAgIGIgICAgICAgICAgPSBiXyxcbiAgICAgICAgbSAgICAgICAgICA9IGEubGVuZ3RoLFxuICAgICAgICBuICAgICAgICAgID0gYi5sZW5ndGgsXG4gICAgICAgIHJldmVyc2UgICAgPSBmYWxzZSxcbiAgICAgICAgZWQgICAgICAgICA9IG51bGwsXG4gICAgICAgIG9mZnNldCAgICAgPSBtICsgMSxcbiAgICAgICAgcGF0aCAgICAgICA9IFtdLFxuICAgICAgICBwYXRocG9zaSAgID0gW10sXG4gICAgICAgIHNlcyAgICAgICAgPSBbXSxcbiAgICAgICAgbGNzICAgICAgICA9IFwiXCIsXG4gICAgICAgIFNFU19ERUxFVEUgPSAtMSxcbiAgICAgICAgU0VTX0NPTU1PTiA9IDAsXG4gICAgICAgIFNFU19BREQgICAgPSAxO1xuXG4gICAgdmFyIHRtcDEsXG4gICAgICAgIHRtcDI7XG5cbiAgICB2YXIgaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG0gPj0gbikge1xuICAgICAgICAgICAgdG1wMSAgICA9IGE7XG4gICAgICAgICAgICB0bXAyICAgID0gbTtcbiAgICAgICAgICAgIGEgICAgICAgPSBiO1xuICAgICAgICAgICAgYiAgICAgICA9IHRtcDE7XG4gICAgICAgICAgICBtICAgICAgID0gbjtcbiAgICAgICAgICAgIG4gICAgICAgPSB0bXAyO1xuICAgICAgICAgICAgcmV2ZXJzZSA9IHRydWU7XG4gICAgICAgICAgICBvZmZzZXQgPSBtICsgMTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgUCA9IGZ1bmN0aW9uICh4LCB5LCBrKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAneCcgOiB4LFxuICAgICAgICAgICAgJ3knIDogeSxcbiAgICAgICAgICAgICdrJyA6IGssXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBzZXNlbGVtID0gZnVuY3Rpb24gKGVsZW0sIHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdlbGVtJyA6IGVsZW0sXG4gICAgICAgICAgICAndCcgICAgOiB0LFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICB2YXIgc25ha2UgPSBmdW5jdGlvbiAoaywgcCwgcHApIHtcbiAgICAgICAgdmFyIHIsIHgsIHk7XG4gICAgICAgIGlmIChwID4gcHApIHtcbiAgICAgICAgICAgIHIgPSBwYXRoW2stMStvZmZzZXRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgciA9IHBhdGhbaysxK29mZnNldF07XG4gICAgICAgIH1cblxuICAgICAgICB5ID0gTWF0aC5tYXgocCwgcHApO1xuICAgICAgICB4ID0geSAtIGs7XG4gICAgICAgIHdoaWxlICh4IDwgbSAmJiB5IDwgbiAmJiBhW3hdID09PSBiW3ldKSB7XG4gICAgICAgICAgICArK3g7XG4gICAgICAgICAgICArK3k7XG4gICAgICAgIH1cblxuICAgICAgICBwYXRoW2srb2Zmc2V0XSA9IHBhdGhwb3NpLmxlbmd0aDtcbiAgICAgICAgcGF0aHBvc2lbcGF0aHBvc2kubGVuZ3RoXSA9IG5ldyBQKHgsIHksIHIpO1xuICAgICAgICByZXR1cm4geTtcbiAgICB9O1xuXG4gICAgdmFyIHJlY29yZHNlcSA9IGZ1bmN0aW9uIChlcGMpIHtcbiAgICAgICAgdmFyIHhfaWR4LCB5X2lkeCwgcHhfaWR4LCBweV9pZHgsIGk7XG4gICAgICAgIHhfaWR4ICA9IHlfaWR4ICA9IDE7XG4gICAgICAgIHB4X2lkeCA9IHB5X2lkeCA9IDA7XG4gICAgICAgIGZvciAoaT1lcGMubGVuZ3RoLTE7aT49MDstLWkpIHtcbiAgICAgICAgICAgIHdoaWxlKHB4X2lkeCA8IGVwY1tpXS54IHx8IHB5X2lkeCA8IGVwY1tpXS55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVwY1tpXS55IC0gZXBjW2ldLnggPiBweV9pZHggLSBweF9pZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc1tzZXMubGVuZ3RoXSA9IG5ldyBzZXNlbGVtKGJbcHlfaWR4XSwgU0VTX0RFTEVURSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXNbc2VzLmxlbmd0aF0gPSBuZXcgc2VzZWxlbShiW3B5X2lkeF0sIFNFU19BREQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICsreV9pZHg7XG4gICAgICAgICAgICAgICAgICAgICsrcHlfaWR4O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXBjW2ldLnkgLSBlcGNbaV0ueCA8IHB5X2lkeCAtIHB4X2lkeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VzW3Nlcy5sZW5ndGhdID0gbmV3IHNlc2VsZW0oYVtweF9pZHhdLCBTRVNfQUREKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc1tzZXMubGVuZ3RoXSA9IG5ldyBzZXNlbGVtKGFbcHhfaWR4XSwgU0VTX0RFTEVURSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKyt4X2lkeDtcbiAgICAgICAgICAgICAgICAgICAgKytweF9pZHg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VzW3Nlcy5sZW5ndGhdID0gbmV3IHNlc2VsZW0oYVtweF9pZHhdLCBTRVNfQ09NTU9OKTtcbiAgICAgICAgICAgICAgICAgICAgbGNzICs9IGFbcHhfaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgKyt4X2lkeDtcbiAgICAgICAgICAgICAgICAgICAgKyt5X2lkeDtcbiAgICAgICAgICAgICAgICAgICAgKytweF9pZHg7XG4gICAgICAgICAgICAgICAgICAgICsrcHlfaWR4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpbml0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBTRVNfREVMRVRFIDogLTEsXG4gICAgICAgIFNFU19DT01NT04gOiAgMCxcbiAgICAgICAgU0VTX0FERCAgICA6ICAxLFxuICAgICAgICBlZGl0ZGlzdGFuY2UgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldGxjcyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBsY3M7XG4gICAgICAgIH0sXG4gICAgICAgIGdldHNlcyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXM7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBvc2UgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGVsdGEsIHNpemUsIGZwLCBwLCByLCBlcGMsIGksIGs7XG4gICAgICAgICAgICBkZWx0YSAgPSBuIC0gbTtcbiAgICAgICAgICAgIHNpemUgICA9IG0gKyBuICsgMztcbiAgICAgICAgICAgIGZwICAgICA9IHt9O1xuICAgICAgICAgICAgZm9yIChpPTA7aTxzaXplOysraSkge1xuICAgICAgICAgICAgICAgIGZwW2ldID0gLTE7XG4gICAgICAgICAgICAgICAgcGF0aFtpXSA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcCA9IC0xO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICsrcDtcbiAgICAgICAgICAgICAgICBmb3IgKGs9LXA7azw9ZGVsdGEtMTsrK2spIHtcbiAgICAgICAgICAgICAgICAgICAgZnBbaytvZmZzZXRdID0gc25ha2UoaywgZnBbay0xK29mZnNldF0rMSwgZnBbaysxK29mZnNldF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGs9ZGVsdGErcDtrPj1kZWx0YSsxOy0taykge1xuICAgICAgICAgICAgICAgICAgICBmcFtrK29mZnNldF0gPSBzbmFrZShrLCBmcFtrLTErb2Zmc2V0XSsxLCBmcFtrKzErb2Zmc2V0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZwW2RlbHRhK29mZnNldF0gPSBzbmFrZShkZWx0YSwgZnBbZGVsdGEtMStvZmZzZXRdKzEsIGZwW2RlbHRhKzErb2Zmc2V0XSk7XG4gICAgICAgICAgICB9IHdoaWxlIChmcFtkZWx0YStvZmZzZXRdICE9PSBuKTtcblxuICAgICAgICAgICAgZWQgPSBkZWx0YSArIDIgKiBwO1xuXG4gICAgICAgICAgICByID0gcGF0aFtkZWx0YStvZmZzZXRdO1xuXG4gICAgICAgICAgICBlcGMgID0gW107XG4gICAgICAgICAgICB3aGlsZSAociAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBlcGNbZXBjLmxlbmd0aF0gPSBuZXcgUChwYXRocG9zaVtyXS54LCBwYXRocG9zaVtyXS55LCBudWxsKTtcbiAgICAgICAgICAgICAgICByID0gcGF0aHBvc2lbcl0uaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY29yZHNlcShlcGMpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IFRvbnkgR2Fybm9jay1Kb25lcyA8dG9ueWdAbHNoaWZ0Lm5ldD5cbi8vIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBMU2hpZnQgTHRkLiA8cXVlcnlAbHNoaWZ0Lm5ldD5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSU1xuLy8gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOXG4vLyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTlxuLy8gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuXG5cbnZhciBvbnAgPSByZXF1aXJlKCcuL29ucCcpO1xuXG5mdW5jdGlvbiBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UoZmlsZTEsIGZpbGUyKSB7XG4gIHZhciBkaWZmID0gbmV3IG9ucChmaWxlMSwgZmlsZTIpO1xuICBkaWZmLmNvbXBvc2UoKTtcbiAgdmFyIHNlcyA9IGRpZmYuZ2V0c2VzKCk7XG5cbiAgdmFyIHJvb3Q7XG4gIHZhciBwcmV2O1xuICB2YXIgZmlsZTFSZXZJZHggPSBmaWxlMS5sZW5ndGggLSAxLFxuICAgICAgZmlsZTJSZXZJZHggPSBmaWxlMi5sZW5ndGggLSAxO1xuICBmb3IgKHZhciBpID0gc2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBpZiAoc2VzW2ldLnQgPT09IGRpZmYuU0VTX0NPTU1PTikge1xuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIHByZXYuY2hhaW4gPSB7XG4gICAgICAgICAgICBmaWxlMWluZGV4OiBmaWxlMVJldklkeCxcbiAgICAgICAgICAgIGZpbGUyaW5kZXg6IGZpbGUyUmV2SWR4LFxuICAgICAgICAgICAgY2hhaW46IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHByZXYgPSBwcmV2LmNoYWluO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvb3QgPSB7XG4gICAgICAgICAgICBmaWxlMWluZGV4OiBmaWxlMVJldklkeCxcbiAgICAgICAgICAgIGZpbGUyaW5kZXg6IGZpbGUyUmV2SWR4LFxuICAgICAgICAgICAgY2hhaW46IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHByZXYgPSByb290O1xuICAgICAgICB9XG4gICAgICAgIGZpbGUxUmV2SWR4LS07XG4gICAgICAgIGZpbGUyUmV2SWR4LS07XG4gICAgICB9IGVsc2UgaWYgKHNlc1tpXS50ID09PSBkaWZmLlNFU19ERUxFVEUpIHtcbiAgICAgICAgZmlsZTFSZXZJZHgtLTtcbiAgICAgIH0gZWxzZSBpZiAoc2VzW2ldLnQgPT09IGRpZmYuU0VTX0FERCkge1xuICAgICAgICBmaWxlMlJldklkeC0tO1xuICAgICAgfVxuICB9XG5cbiAgdmFyIHRhaWwgPSB7XG4gICAgZmlsZTFpbmRleDogLTEsXG4gICAgZmlsZTJpbmRleDogLTEsXG4gICAgY2hhaW46IG51bGxcbiAgfTtcblxuICBpZiAoIXByZXYpIHtcbiAgICByZXR1cm4gdGFpbDtcbiAgfVxuXG4gIHByZXYuY2hhaW4gPSB0YWlsO1xuXG4gIHJldHVybiByb290O1xufVxuXG5mdW5jdGlvbiBkaWZmSW5kaWNlcyhmaWxlMSwgZmlsZTIpIHtcbiAgLy8gV2UgYXBwbHkgdGhlIExDUyB0byBnaXZlIGEgc2ltcGxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuICAvLyBvZmZzZXRzIGFuZCBsZW5ndGhzIG9mIG1pc21hdGNoZWQgY2h1bmtzIGluIHRoZSBpbnB1dFxuICAvLyBmaWxlcy4gVGhpcyBpcyB1c2VkIGJ5IGRpZmYzX21lcmdlX2luZGljZXMgYmVsb3cuXG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgdGFpbDEgPSBmaWxlMS5sZW5ndGg7XG4gIHZhciB0YWlsMiA9IGZpbGUyLmxlbmd0aDtcblxuICBmb3IgKHZhciBjYW5kaWRhdGUgPSBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UoZmlsZTEsIGZpbGUyKTsgY2FuZGlkYXRlICE9PSBudWxsOyBjYW5kaWRhdGUgPSBjYW5kaWRhdGUuY2hhaW4pIHtcbiAgICB2YXIgbWlzbWF0Y2hMZW5ndGgxID0gdGFpbDEgLSBjYW5kaWRhdGUuZmlsZTFpbmRleCAtIDE7XG4gICAgdmFyIG1pc21hdGNoTGVuZ3RoMiA9IHRhaWwyIC0gY2FuZGlkYXRlLmZpbGUyaW5kZXggLSAxO1xuICAgIHRhaWwxID0gY2FuZGlkYXRlLmZpbGUxaW5kZXg7XG4gICAgdGFpbDIgPSBjYW5kaWRhdGUuZmlsZTJpbmRleDtcblxuICAgIGlmIChtaXNtYXRjaExlbmd0aDEgfHwgbWlzbWF0Y2hMZW5ndGgyKSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGZpbGUxOiBbdGFpbDEgKyAxLCBtaXNtYXRjaExlbmd0aDFdLFxuICAgICAgICBmaWxlMjogW3RhaWwyICsgMSwgbWlzbWF0Y2hMZW5ndGgyXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVzdWx0LnJldmVyc2UoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZGlmZjNNZXJnZUluZGljZXMoYSwgbywgYikge1xuICAvLyBHaXZlbiB0aHJlZSBmaWxlcywgQSwgTywgYW5kIEIsIHdoZXJlIGJvdGggQSBhbmQgQiBhcmVcbiAgLy8gaW5kZXBlbmRlbnRseSBkZXJpdmVkIGZyb20gTywgcmV0dXJucyBhIGZhaXJseSBjb21wbGljYXRlZFxuICAvLyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBtZXJnZSBkZWNpc2lvbnMgaXQncyB0YWtlbi4gVGhlXG4gIC8vIGludGVyZXN0ZWQgcmVhZGVyIG1heSB3aXNoIHRvIGNvbnN1bHRcbiAgLy9cbiAgLy8gU2FuamVldiBLaGFubmEsIEtlc2hhdiBLdW5hbCwgYW5kIEJlbmphbWluIEMuIFBpZXJjZS4gXCJBXG4gIC8vIEZvcm1hbCBJbnZlc3RpZ2F0aW9uIG9mIERpZmYzLlwiIEluIEFydmluZCBhbmQgUHJhc2FkLFxuICAvLyBlZGl0b3JzLCBGb3VuZGF0aW9ucyBvZiBTb2Z0d2FyZSBUZWNobm9sb2d5IGFuZCBUaGVvcmV0aWNhbFxuICAvLyBDb21wdXRlciBTY2llbmNlIChGU1RUQ1MpLCBEZWNlbWJlciAyMDA3LlxuICAvL1xuICAvLyAoaHR0cDovL3d3dy5jaXMudXBlbm4uZWR1L35iY3BpZXJjZS9wYXBlcnMvZGlmZjMtc2hvcnQucGRmKVxuICB2YXIgaTtcblxuICB2YXIgbTEgPSBkaWZmSW5kaWNlcyhvLCBhKTtcbiAgdmFyIG0yID0gZGlmZkluZGljZXMobywgYik7XG5cbiAgdmFyIGh1bmtzID0gW107XG5cbiAgZnVuY3Rpb24gYWRkSHVuayhoLCBzaWRlKSB7XG4gICAgaHVua3MucHVzaChbaC5maWxlMVswXSwgc2lkZSwgaC5maWxlMVsxXSwgaC5maWxlMlswXSwgaC5maWxlMlsxXV0pO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBtMS5sZW5ndGg7IGkrKykge1xuICAgIGFkZEh1bmsobTFbaV0sIDApO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBtMi5sZW5ndGg7IGkrKykge1xuICAgIGFkZEh1bmsobTJbaV0sIDIpO1xuICB9XG4gIGh1bmtzLnNvcnQoZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB4WzBdIC0geVswXVxuICB9KTtcblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBjb21tb25PZmZzZXQgPSAwO1xuXG4gIGZ1bmN0aW9uIGNvcHlDb21tb24odGFyZ2V0T2Zmc2V0KSB7XG4gICAgaWYgKHRhcmdldE9mZnNldCA+IGNvbW1vbk9mZnNldCkge1xuICAgICAgcmVzdWx0LnB1c2goWzEsIGNvbW1vbk9mZnNldCwgdGFyZ2V0T2Zmc2V0IC0gY29tbW9uT2Zmc2V0XSk7XG4gICAgICBjb21tb25PZmZzZXQgPSB0YXJnZXRPZmZzZXQ7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaHVua0luZGV4ID0gMDsgaHVua0luZGV4IDwgaHVua3MubGVuZ3RoOyBodW5rSW5kZXgrKykge1xuICAgIHZhciBmaXJzdEh1bmtJbmRleCA9IGh1bmtJbmRleDtcbiAgICB2YXIgaHVuayA9IGh1bmtzW2h1bmtJbmRleF07XG4gICAgdmFyIHJlZ2lvbkxocyA9IGh1bmtbMF07XG4gICAgdmFyIHJlZ2lvblJocyA9IHJlZ2lvbkxocyArIGh1bmtbMl07XG4gICAgd2hpbGUgKGh1bmtJbmRleCA8IGh1bmtzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHZhciBtYXliZU92ZXJsYXBwaW5nID0gaHVua3NbaHVua0luZGV4ICsgMV07XG4gICAgICB2YXIgbWF5YmVMaHMgPSBtYXliZU92ZXJsYXBwaW5nWzBdO1xuICAgICAgaWYgKG1heWJlTGhzID4gcmVnaW9uUmhzKSBicmVhaztcbiAgICAgIHJlZ2lvblJocyA9IE1hdGgubWF4KHJlZ2lvblJocywgbWF5YmVMaHMgKyBtYXliZU92ZXJsYXBwaW5nWzJdKTtcbiAgICAgIGh1bmtJbmRleCsrO1xuICAgIH1cblxuICAgIGNvcHlDb21tb24ocmVnaW9uTGhzKTtcbiAgICBpZiAoZmlyc3RIdW5rSW5kZXggPT0gaHVua0luZGV4KSB7XG4gICAgICAvLyBUaGUgXCJvdmVybGFwXCIgd2FzIG9ubHkgb25lIGh1bmsgbG9uZywgbWVhbmluZyB0aGF0XG4gICAgICAvLyB0aGVyZSdzIG5vIGNvbmZsaWN0IGhlcmUuIEVpdGhlciBhIGFuZCBvIHdlcmUgdGhlXG4gICAgICAvLyBzYW1lLCBvciBiIGFuZCBvIHdlcmUgdGhlIHNhbWUuXG4gICAgICBpZiAoaHVua1s0XSA+IDApIHtcbiAgICAgICAgcmVzdWx0LnB1c2goW2h1bmtbMV0sIGh1bmtbM10sIGh1bmtbNF1dKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQSBwcm9wZXIgY29uZmxpY3QuIERldGVybWluZSB0aGUgZXh0ZW50cyBvZiB0aGVcbiAgICAgIC8vIHJlZ2lvbnMgaW52b2x2ZWQgZnJvbSBhLCBvIGFuZCBiLiBFZmZlY3RpdmVseSBtZXJnZVxuICAgICAgLy8gYWxsIHRoZSBodW5rcyBvbiB0aGUgbGVmdCBpbnRvIG9uZSBnaWFudCBodW5rLCBhbmRcbiAgICAgIC8vIGRvIHRoZSBzYW1lIGZvciB0aGUgcmlnaHQ7IHRoZW4sIGNvcnJlY3QgZm9yIHNrZXdcbiAgICAgIC8vIGluIHRoZSByZWdpb25zIG9mIG8gdGhhdCBlYWNoIHNpZGUgY2hhbmdlZCwgYW5kXG4gICAgICAvLyByZXBvcnQgYXBwcm9wcmlhdGUgc3BhbnMgZm9yIHRoZSB0aHJlZSBzaWRlcy5cbiAgICAgIHZhciByZWdpb25zID0ge1xuICAgICAgICAwOiBbYS5sZW5ndGgsIC0xLCBvLmxlbmd0aCwgLTFdLFxuICAgICAgICAyOiBbYi5sZW5ndGgsIC0xLCBvLmxlbmd0aCwgLTFdXG4gICAgICB9O1xuICAgICAgZm9yIChpID0gZmlyc3RIdW5rSW5kZXg7IGkgPD0gaHVua0luZGV4OyBpKyspIHtcbiAgICAgICAgaHVuayA9IGh1bmtzW2ldO1xuICAgICAgICB2YXIgc2lkZSA9IGh1bmtbMV07XG4gICAgICAgIHZhciByID0gcmVnaW9uc1tzaWRlXTtcbiAgICAgICAgdmFyIG9MaHMgPSBodW5rWzBdO1xuICAgICAgICB2YXIgb1JocyA9IG9MaHMgKyBodW5rWzJdO1xuICAgICAgICB2YXIgYWJMaHMgPSBodW5rWzNdO1xuICAgICAgICB2YXIgYWJSaHMgPSBhYkxocyArIGh1bmtbNF07XG4gICAgICAgIHJbMF0gPSBNYXRoLm1pbihhYkxocywgclswXSk7XG4gICAgICAgIHJbMV0gPSBNYXRoLm1heChhYlJocywgclsxXSk7XG4gICAgICAgIHJbMl0gPSBNYXRoLm1pbihvTGhzLCByWzJdKTtcbiAgICAgICAgclszXSA9IE1hdGgubWF4KG9SaHMsIHJbM10pO1xuICAgICAgfVxuICAgICAgdmFyIGFMaHMgPSByZWdpb25zWzBdWzBdICsgKHJlZ2lvbkxocyAtIHJlZ2lvbnNbMF1bMl0pO1xuICAgICAgdmFyIGFSaHMgPSByZWdpb25zWzBdWzFdICsgKHJlZ2lvblJocyAtIHJlZ2lvbnNbMF1bM10pO1xuICAgICAgdmFyIGJMaHMgPSByZWdpb25zWzJdWzBdICsgKHJlZ2lvbkxocyAtIHJlZ2lvbnNbMl1bMl0pO1xuICAgICAgdmFyIGJSaHMgPSByZWdpb25zWzJdWzFdICsgKHJlZ2lvblJocyAtIHJlZ2lvbnNbMl1bM10pO1xuICAgICAgcmVzdWx0LnB1c2goWy0xLFxuICAgICAgICBhTGhzLCBhUmhzIC0gYUxocyxcbiAgICAgICAgcmVnaW9uTGhzLCByZWdpb25SaHMgLSByZWdpb25MaHMsXG4gICAgICAgIGJMaHMsIGJSaHMgLSBiTGhzXG4gICAgICBdKTtcbiAgICB9XG4gICAgY29tbW9uT2Zmc2V0ID0gcmVnaW9uUmhzO1xuICB9XG5cbiAgY29weUNvbW1vbihvLmxlbmd0aCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGRpZmYzTWVyZ2UoYSwgbywgYikge1xuICAvLyBBcHBsaWVzIHRoZSBvdXRwdXQgb2YgRGlmZi5kaWZmM19tZXJnZV9pbmRpY2VzIHRvIGFjdHVhbGx5XG4gIC8vIGNvbnN0cnVjdCB0aGUgbWVyZ2VkIGZpbGU7IHRoZSByZXR1cm5lZCByZXN1bHQgYWx0ZXJuYXRlc1xuICAvLyBiZXR3ZWVuIFwib2tcIiBhbmQgXCJjb25mbGljdFwiIGJsb2Nrcy5cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBmaWxlcyA9IFthLCBvLCBiXTtcbiAgdmFyIGluZGljZXMgPSBkaWZmM01lcmdlSW5kaWNlcyhhLCBvLCBiKTtcblxuICB2YXIgb2tMaW5lcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGZsdXNoT2soKSB7XG4gICAgaWYgKG9rTGluZXMubGVuZ3RoKSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIG9rOiBva0xpbmVzXG4gICAgICB9KTtcbiAgICB9XG4gICAgb2tMaW5lcyA9IFtdO1xuICB9XG5cbiAgZnVuY3Rpb24gcHVzaE9rKHhzKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB4cy5sZW5ndGg7IGorKykge1xuICAgICAgb2tMaW5lcy5wdXNoKHhzW2pdKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1RydWVDb25mbGljdChyZWMpIHtcbiAgICBpZiAocmVjWzJdICE9IHJlY1s2XSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIGFvZmYgPSByZWNbMV07XG4gICAgdmFyIGJvZmYgPSByZWNbNV07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByZWNbMl07IGorKykge1xuICAgICAgaWYgKGFbaiArIGFvZmZdICE9IGJbaiArIGJvZmZdKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHggPSBpbmRpY2VzW2ldO1xuICAgIHZhciBzaWRlID0geFswXTtcbiAgICBpZiAoc2lkZSA9PSAtMSkge1xuICAgICAgaWYgKCFpc1RydWVDb25mbGljdCh4KSkge1xuICAgICAgICBwdXNoT2soZmlsZXNbMF0uc2xpY2UoeFsxXSwgeFsxXSArIHhbMl0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsdXNoT2soKTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICBhOiBhLnNsaWNlKHhbMV0sIHhbMV0gKyB4WzJdKSxcbiAgICAgICAgICAgIGFJbmRleDogeFsxXSxcbiAgICAgICAgICAgIG86IG8uc2xpY2UoeFszXSwgeFszXSArIHhbNF0pLFxuICAgICAgICAgICAgb0luZGV4OiB4WzNdLFxuICAgICAgICAgICAgYjogYi5zbGljZSh4WzVdLCB4WzVdICsgeFs2XSksXG4gICAgICAgICAgICBiSW5kZXg6IHhbNV1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoT2soZmlsZXNbc2lkZV0uc2xpY2UoeFsxXSwgeFsxXSArIHhbMl0pKTtcbiAgICB9XG4gIH1cblxuICBmbHVzaE9rKCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZjNNZXJnZTtcbiIsICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsICJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zbGljZSgxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwgIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCBudWxsLCBudWxsLCBudWxsLCAiJ3VzZSBzdHJpY3QnXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXHJcblx0XCJhbnRpcXVld2hpdGVcIjogWzI1MCwgMjM1LCAyMTVdLFxyXG5cdFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXHJcblx0XCJhenVyZVwiOiBbMjQwLCAyNTUsIDI1NV0sXHJcblx0XCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXHJcblx0XCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxyXG5cdFwiYmxhY2tcIjogWzAsIDAsIDBdLFxyXG5cdFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxyXG5cdFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcclxuXHRcImJsdWV2aW9sZXRcIjogWzEzOCwgNDMsIDIyNl0sXHJcblx0XCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxyXG5cdFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcclxuXHRcImNhZGV0Ymx1ZVwiOiBbOTUsIDE1OCwgMTYwXSxcclxuXHRcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcclxuXHRcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcclxuXHRcImNvcmFsXCI6IFsyNTUsIDEyNywgODBdLFxyXG5cdFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxyXG5cdFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxyXG5cdFwiY3JpbXNvblwiOiBbMjIwLCAyMCwgNjBdLFxyXG5cdFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXHJcblx0XCJkYXJrY3lhblwiOiBbMCwgMTM5LCAxMzldLFxyXG5cdFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcclxuXHRcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtncmVlblwiOiBbMCwgMTAwLCAwXSxcclxuXHRcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXHJcblx0XCJkYXJrbWFnZW50YVwiOiBbMTM5LCAwLCAxMzldLFxyXG5cdFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcclxuXHRcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcclxuXHRcImRhcmtvcmNoaWRcIjogWzE1MywgNTAsIDIwNF0sXHJcblx0XCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxyXG5cdFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXHJcblx0XCJkYXJrc2VhZ3JlZW5cIjogWzE0MywgMTg4LCAxNDNdLFxyXG5cdFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxyXG5cdFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrc2xhdGVncmV5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcclxuXHRcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcclxuXHRcImRlZXBwaW5rXCI6IFsyNTUsIDIwLCAxNDddLFxyXG5cdFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcclxuXHRcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZGltZ3JleVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxyXG5cdFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXHJcblx0XCJmbG9yYWx3aGl0ZVwiOiBbMjU1LCAyNTAsIDI0MF0sXHJcblx0XCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxyXG5cdFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwiZ2FpbnNib3JvXCI6IFsyMjAsIDIyMCwgMjIwXSxcclxuXHRcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxyXG5cdFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxyXG5cdFwiZ29sZGVucm9kXCI6IFsyMTgsIDE2NSwgMzJdLFxyXG5cdFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJncmVlblwiOiBbMCwgMTI4LCAwXSxcclxuXHRcImdyZWVueWVsbG93XCI6IFsxNzMsIDI1NSwgNDddLFxyXG5cdFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXHJcblx0XCJob3RwaW5rXCI6IFsyNTUsIDEwNSwgMTgwXSxcclxuXHRcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxyXG5cdFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcclxuXHRcIml2b3J5XCI6IFsyNTUsIDI1NSwgMjQwXSxcclxuXHRcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcclxuXHRcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcclxuXHRcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwgMjQwLCAyNDVdLFxyXG5cdFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXHJcblx0XCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxyXG5cdFwibGlnaHRibHVlXCI6IFsxNzMsIDIxNiwgMjMwXSxcclxuXHRcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxyXG5cdFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcclxuXHRcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsIDI1MCwgMjEwXSxcclxuXHRcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcclxuXHRcImxpZ2h0Z3JleVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxyXG5cdFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxyXG5cdFwibGlnaHRzZWFncmVlblwiOiBbMzIsIDE3OCwgMTcwXSxcclxuXHRcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXHJcblx0XCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXHJcblx0XCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXHJcblx0XCJsaW1lXCI6IFswLCAyNTUsIDBdLFxyXG5cdFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXHJcblx0XCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXHJcblx0XCJtYWdlbnRhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXHJcblx0XCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcclxuXHRcIm1lZGl1bWJsdWVcIjogWzAsIDAsIDIwNV0sXHJcblx0XCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXHJcblx0XCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxyXG5cdFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLCAxNzksIDExM10sXHJcblx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxyXG5cdFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcclxuXHRcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsIDIwOSwgMjA0XSxcclxuXHRcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcclxuXHRcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxyXG5cdFwibWludGNyZWFtXCI6IFsyNDUsIDI1NSwgMjUwXSxcclxuXHRcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXHJcblx0XCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXHJcblx0XCJuYXZham93aGl0ZVwiOiBbMjU1LCAyMjIsIDE3M10sXHJcblx0XCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxyXG5cdFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXHJcblx0XCJvbGl2ZVwiOiBbMTI4LCAxMjgsIDBdLFxyXG5cdFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxyXG5cdFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXHJcblx0XCJvcmFuZ2VyZWRcIjogWzI1NSwgNjksIDBdLFxyXG5cdFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcclxuXHRcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxyXG5cdFwicGFsZWdyZWVuXCI6IFsxNTIsIDI1MSwgMTUyXSxcclxuXHRcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxyXG5cdFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXHJcblx0XCJwYXBheWF3aGlwXCI6IFsyNTUsIDIzOSwgMjEzXSxcclxuXHRcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXHJcblx0XCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxyXG5cdFwicGlua1wiOiBbMjU1LCAxOTIsIDIwM10sXHJcblx0XCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcclxuXHRcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxyXG5cdFwicHVycGxlXCI6IFsxMjgsIDAsIDEyOF0sXHJcblx0XCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxyXG5cdFwicmVkXCI6IFsyNTUsIDAsIDBdLFxyXG5cdFwicm9zeWJyb3duXCI6IFsxODgsIDE0MywgMTQzXSxcclxuXHRcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcclxuXHRcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXHJcblx0XCJzYWxtb25cIjogWzI1MCwgMTI4LCAxMTRdLFxyXG5cdFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcclxuXHRcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXHJcblx0XCJzZWFzaGVsbFwiOiBbMjU1LCAyNDUsIDIzOF0sXHJcblx0XCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcclxuXHRcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXHJcblx0XCJza3libHVlXCI6IFsxMzUsIDIwNiwgMjM1XSxcclxuXHRcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcclxuXHRcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbGF0ZWdyZXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXHJcblx0XCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxyXG5cdFwic3RlZWxibHVlXCI6IFs3MCwgMTMwLCAxODBdLFxyXG5cdFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcclxuXHRcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcclxuXHRcInRoaXN0bGVcIjogWzIxNiwgMTkxLCAyMTZdLFxyXG5cdFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXHJcblx0XCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXHJcblx0XCJ2aW9sZXRcIjogWzIzOCwgMTMwLCAyMzhdLFxyXG5cdFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxyXG5cdFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxyXG5cdFwid2hpdGVzbW9rZVwiOiBbMjQ1LCAyNDUsIDI0NV0sXHJcblx0XCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcclxuXHRcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXHJcbn07XHJcbiIsICJ2YXIgY29udmVyc2lvbnMgPSB7XHJcbiAgICAvLyBsZW5ndGhcclxuICAgICdweCc6IHtcclxuICAgICAgICAncHgnOiAxLFxyXG4gICAgICAgICdjbSc6IDk2LjAvMi41NCxcclxuICAgICAgICAnbW0nOiA5Ni4wLzI1LjQsXHJcbiAgICAgICAgJ2luJzogOTYsXHJcbiAgICAgICAgJ3B0JzogOTYuMC83Mi4wLFxyXG4gICAgICAgICdwYyc6IDE2XHJcbiAgICB9LFxyXG4gICAgJ2NtJzoge1xyXG4gICAgICAgICdweCc6IDIuNTQvOTYuMCxcclxuICAgICAgICAnY20nOiAxLFxyXG4gICAgICAgICdtbSc6IDAuMSxcclxuICAgICAgICAnaW4nOiAyLjU0LFxyXG4gICAgICAgICdwdCc6IDIuNTQvNzIuMCxcclxuICAgICAgICAncGMnOiAyLjU0LzYuMFxyXG4gICAgfSxcclxuICAgICdtbSc6IHtcclxuICAgICAgICAncHgnOiAyNS40Lzk2LjAsXHJcbiAgICAgICAgJ2NtJzogMTAsXHJcbiAgICAgICAgJ21tJzogMSxcclxuICAgICAgICAnaW4nOiAyNS40LFxyXG4gICAgICAgICdwdCc6IDI1LjQvNzIuMCxcclxuICAgICAgICAncGMnOiAyNS40LzYuMFxyXG4gICAgfSxcclxuICAgICdpbic6IHtcclxuICAgICAgICAncHgnOiAxLjAvOTYuMCxcclxuICAgICAgICAnY20nOiAxLjAvMi41NCxcclxuICAgICAgICAnbW0nOiAxLjAvMjUuNCxcclxuICAgICAgICAnaW4nOiAxLFxyXG4gICAgICAgICdwdCc6IDEuMC83Mi4wLFxyXG4gICAgICAgICdwYyc6IDEuMC82LjBcclxuICAgIH0sXHJcbiAgICAncHQnOiB7XHJcbiAgICAgICAgJ3B4JzogMC43NSxcclxuICAgICAgICAnY20nOiA3Mi4wLzIuNTQsXHJcbiAgICAgICAgJ21tJzogNzIuMC8yNS40LFxyXG4gICAgICAgICdpbic6IDcyLFxyXG4gICAgICAgICdwdCc6IDEsXHJcbiAgICAgICAgJ3BjJzogMTJcclxuICAgIH0sXHJcbiAgICAncGMnOiB7XHJcbiAgICAgICAgJ3B4JzogNi4wLzk2LjAsXHJcbiAgICAgICAgJ2NtJzogNi4wLzIuNTQsXHJcbiAgICAgICAgJ21tJzogNi4wLzI1LjQsXHJcbiAgICAgICAgJ2luJzogNixcclxuICAgICAgICAncHQnOiA2LjAvNzIuMCxcclxuICAgICAgICAncGMnOiAxXHJcbiAgICB9LFxyXG4gICAgLy8gYW5nbGVcclxuICAgICdkZWcnOiB7XHJcbiAgICAgICAgJ2RlZyc6IDEsXHJcbiAgICAgICAgJ2dyYWQnOiAwLjksXHJcbiAgICAgICAgJ3JhZCc6IDE4MC9NYXRoLlBJLFxyXG4gICAgICAgICd0dXJuJzogMzYwXHJcbiAgICB9LFxyXG4gICAgJ2dyYWQnOiB7XHJcbiAgICAgICAgJ2RlZyc6IDQwMC8zNjAsXHJcbiAgICAgICAgJ2dyYWQnOiAxLFxyXG4gICAgICAgICdyYWQnOiAyMDAvTWF0aC5QSSxcclxuICAgICAgICAndHVybic6IDQwMFxyXG4gICAgfSxcclxuICAgICdyYWQnOiB7XHJcbiAgICAgICAgJ2RlZyc6IE1hdGguUEkvMTgwLFxyXG4gICAgICAgICdncmFkJzogTWF0aC5QSS8yMDAsXHJcbiAgICAgICAgJ3JhZCc6IDEsXHJcbiAgICAgICAgJ3R1cm4nOiBNYXRoLlBJKjJcclxuICAgIH0sXHJcbiAgICAndHVybic6IHtcclxuICAgICAgICAnZGVnJzogMS8zNjAsXHJcbiAgICAgICAgJ2dyYWQnOiAxLzQwMCxcclxuICAgICAgICAncmFkJzogMC41L01hdGguUEksXHJcbiAgICAgICAgJ3R1cm4nOiAxXHJcbiAgICB9LFxyXG4gICAgLy8gdGltZVxyXG4gICAgJ3MnOiB7XHJcbiAgICAgICAgJ3MnOiAxLFxyXG4gICAgICAgICdtcyc6IDEvMTAwMFxyXG4gICAgfSxcclxuICAgICdtcyc6IHtcclxuICAgICAgICAncyc6IDEwMDAsXHJcbiAgICAgICAgJ21zJzogMVxyXG4gICAgfSxcclxuICAgIC8vIGZyZXF1ZW5jeVxyXG4gICAgJ0h6Jzoge1xyXG4gICAgICAgICdIeic6IDEsXHJcbiAgICAgICAgJ2tIeic6IDEwMDBcclxuICAgIH0sXHJcbiAgICAna0h6Jzoge1xyXG4gICAgICAgICdIeic6IDEvMTAwMCxcclxuICAgICAgICAna0h6JzogMVxyXG4gICAgfSxcclxuICAgIC8vIHJlc29sdXRpb25cclxuICAgICdkcGknOiB7XHJcbiAgICAgICAgJ2RwaSc6IDEsXHJcbiAgICAgICAgJ2RwY20nOiAxLjAvMi41NCxcclxuICAgICAgICAnZHBweCc6IDEvOTZcclxuICAgIH0sXHJcbiAgICAnZHBjbSc6IHtcclxuICAgICAgICAnZHBpJzogMi41NCxcclxuICAgICAgICAnZHBjbSc6IDEsXHJcbiAgICAgICAgJ2RwcHgnOiAyLjU0Lzk2LjBcclxuICAgIH0sXHJcbiAgICAnZHBweCc6IHtcclxuICAgICAgICAnZHBpJzogOTYsXHJcbiAgICAgICAgJ2RwY20nOiA5Ni4wLzIuNTQsXHJcbiAgICAgICAgJ2RwcHgnOiAxXHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSwgc291cmNlVW5pdCwgdGFyZ2V0VW5pdCwgcHJlY2lzaW9uKSB7XHJcbiAgICBpZiAoIWNvbnZlcnNpb25zLmhhc093blByb3BlcnR5KHRhcmdldFVuaXQpKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb252ZXJ0IHRvIFwiICsgdGFyZ2V0VW5pdCk7XHJcblxyXG4gICAgaWYgKCFjb252ZXJzaW9uc1t0YXJnZXRVbml0XS5oYXNPd25Qcm9wZXJ0eShzb3VyY2VVbml0KSlcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29udmVydCBmcm9tIFwiICsgc291cmNlVW5pdCArIFwiIHRvIFwiICsgdGFyZ2V0VW5pdCk7XHJcbiAgICBcclxuICAgIHZhciBjb252ZXJ0ZWQgPSBjb252ZXJzaW9uc1t0YXJnZXRVbml0XVtzb3VyY2VVbml0XSAqIHZhbHVlO1xyXG4gICAgXHJcbiAgICBpZiAocHJlY2lzaW9uICE9PSBmYWxzZSkge1xyXG4gICAgICAgIHByZWNpc2lvbiA9IE1hdGgucG93KDEwLCBwYXJzZUludChwcmVjaXNpb24pIHx8IDUpO1xyXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGNvbnZlcnRlZCAqIHByZWNpc2lvbikgLyBwcmVjaXNpb247XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBjb252ZXJ0ZWQ7XHJcbn07XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZnJvbVJnYmEgPSBmcm9tUmdiYTtcbmV4cG9ydHMuZnJvbVJnYiA9IGZyb21SZ2I7XG5leHBvcnRzLmZyb21Ic2xhID0gZnJvbUhzbGE7XG5leHBvcnRzLmZyb21Ic2wgPSBmcm9tSHNsO1xuZXhwb3J0cy5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2NvbG9yTmFtZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNvbG9yLW5hbWVcIikpO1xuXG52YXIgX2Nzc1VuaXRDb252ZXJ0ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjc3MtdW5pdC1jb252ZXJ0ZXJcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG52YXIgaGV4ID0gL14jKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KT8kLztcbnZhciBzaG9ydEhleCA9IC9eIyhbMC05YS1mQS1GXSkoWzAtOWEtZkEtRl0pKFswLTlhLWZBLUZdKShbMC05YS1mQS1GXSk/JC87XG52YXIgcmdiID0gL15yZ2JhP1xcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKykoPzpcXHMqLFxccyooMHwxfDA/XFwuXFxkK3xcXGQrJSkpP1xccypcXCkkLztcbnZhciByZ2JmbiA9IC9ecmdiYT9cXChcXHMqKFxcZCspXFxzKyhcXGQrKVxccysoXFxkKykoPzpcXHMqXFwvXFxzKigwfDF8MD9cXC5cXGQrfFxcZCslKSk/XFxzKlxcKSQvO1xudmFyIHJnYnBlcmMgPSAvXnJnYmE/XFwoXFxzKihcXGQrJSlcXHMqLFxccyooXFxkKyUpXFxzKixcXHMqKFxcZCslKSg/OlxccyosXFxzKigwfDF8MD9cXC5cXGQrfFxcZCslKSk/XFxzKlxcKSQvO1xudmFyIHJnYnBlcmNmbiA9IC9ecmdiYT9cXChcXHMqKFxcZCslKVxccysoXFxkKyUpXFxzKyhcXGQrJSkoPzpcXHMqXFwvXFxzKigwfDF8MD9cXC5cXGQrfFxcZCslKSk/XFxzKlxcKSQvO1xudmFyIGhzbCA9IC9eaHNsYT9cXChcXHMqKFxcZCspKGRlZ3xyYWR8Z3JhZHx0dXJuKT9cXHMqLFxccyooXFxkKyklXFxzKixcXHMqKFxcZCspJSg/OlxccyosXFxzKigwfDF8MD9cXC5cXGQrfFxcZCslKSk/XFxzKlxcKSQvO1xuXG5mdW5jdGlvbiBjb250YWlucyhoYXlzdGFjaywgbmVlZGxlKSB7XG4gIHJldHVybiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSkgPiAtMTtcbn1cblxuZnVuY3Rpb24gcmdiVG9Ic2wociwgZywgYikge1xuICB2YXIgcnByaW0gPSByIC8gMjU1O1xuICB2YXIgZ3ByaW0gPSBnIC8gMjU1O1xuICB2YXIgYnByaW0gPSBiIC8gMjU1O1xuICB2YXIgY21heCA9IE1hdGgubWF4KHJwcmltLCBncHJpbSwgYnByaW0pO1xuICB2YXIgY21pbiA9IE1hdGgubWluKHJwcmltLCBncHJpbSwgYnByaW0pO1xuICB2YXIgZGVsdGEgPSBjbWF4IC0gY21pbjtcbiAgdmFyIGwgPSAoY21heCArIGNtaW4pIC8gMjtcblxuICBpZiAoZGVsdGEgPT09IDApIHtcbiAgICByZXR1cm4gWzAsIDAsIGwgKiAxMDBdO1xuICB9XG5cbiAgdmFyIHMgPSBkZWx0YSAvICgxIC0gTWF0aC5hYnMoMiAqIGwgLSAxKSk7XG5cbiAgdmFyIGggPSBmdW5jdGlvbiAoKSB7XG4gICAgc3dpdGNoIChjbWF4KSB7XG4gICAgICBjYXNlIHJwcmltOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIChncHJpbSAtIGJwcmltKSAvIGRlbHRhICUgNjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIGdwcmltOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIChicHJpbSAtIHJwcmltKSAvIGRlbHRhICsgMjtcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIChycHJpbSAtIGdwcmltKSAvIGRlbHRhICsgNDtcbiAgICAgICAgfVxuICAgIH1cbiAgfSgpO1xuXG4gIHJldHVybiBbaCAqIDYwLCBzICogMTAwLCBsICogMTAwXTtcbn1cblxuZnVuY3Rpb24gaHNsVG9SZ2IoaCwgcywgbCkge1xuICB2YXIgaHByaW0gPSBoIC8gNjA7XG4gIHZhciBzcHJpbSA9IHMgLyAxMDA7XG4gIHZhciBscHJpbSA9IGwgLyAxMDA7XG4gIHZhciBjID0gKDEgLSBNYXRoLmFicygyICogbHByaW0gLSAxKSkgKiBzcHJpbTtcbiAgdmFyIHggPSBjICogKDEgLSBNYXRoLmFicyhocHJpbSAlIDIgLSAxKSk7XG4gIHZhciBtID0gbHByaW0gLSBjIC8gMjtcblxuICB2YXIgX3JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaHByaW0gPCAxKSByZXR1cm4gW2MsIHgsIDBdO1xuICAgIGlmIChocHJpbSA8IDIpIHJldHVybiBbeCwgYywgMF07XG4gICAgaWYgKGhwcmltIDwgMykgcmV0dXJuIFswLCBjLCB4XTtcbiAgICBpZiAoaHByaW0gPCA0KSByZXR1cm4gWzAsIHgsIGNdO1xuICAgIGlmIChocHJpbSA8IDUpIHJldHVybiBbeCwgMCwgY107XG4gICAgcmV0dXJuIFtjLCAwLCB4XTtcbiAgfSgpLFxuICAgICAgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAzKSxcbiAgICAgIHJwcmltID0gX3JlZjJbMF0sXG4gICAgICBncHJpbSA9IF9yZWYyWzFdLFxuICAgICAgYnByaW0gPSBfcmVmMlsyXTtcblxuICByZXR1cm4gWyhycHJpbSArIG0pICogMjU1LCAoZ3ByaW0gKyBtKSAqIDI1NSwgKGJwcmltICsgbSkgKiAyNTVdO1xufVxuXG52YXIgQ29sb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb2xvcihfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCA0KSxcbiAgICAgICAgciA9IF9yZWY0WzBdLFxuICAgICAgICBnID0gX3JlZjRbMV0sXG4gICAgICAgIGIgPSBfcmVmNFsyXSxcbiAgICAgICAgYSA9IF9yZWY0WzNdO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbG9yKTtcblxuICAgIHRoaXMudmFsdWVzID0gW01hdGgubWF4KE1hdGgubWluKHBhcnNlSW50KHIsIDEwKSwgMjU1KSwgMCksIE1hdGgubWF4KE1hdGgubWluKHBhcnNlSW50KGcsIDEwKSwgMjU1KSwgMCksIE1hdGgubWF4KE1hdGgubWluKHBhcnNlSW50KGIsIDEwKSwgMjU1KSwgMCksIGEgPT0gbnVsbCA/IDEgOiBNYXRoLm1heChNYXRoLm1pbihwYXJzZUZsb2F0KGEpLCAyNTUpLCAwKV07XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29sb3IsIFt7XG4gICAga2V5OiBcInRvUmdiU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvUmdiU3RyaW5nKCkge1xuICAgICAgdmFyIF90aGlzJHZhbHVlcyA9IF9zbGljZWRUb0FycmF5KHRoaXMudmFsdWVzLCA0KSxcbiAgICAgICAgICByID0gX3RoaXMkdmFsdWVzWzBdLFxuICAgICAgICAgIGcgPSBfdGhpcyR2YWx1ZXNbMV0sXG4gICAgICAgICAgYiA9IF90aGlzJHZhbHVlc1syXSxcbiAgICAgICAgICBhID0gX3RoaXMkdmFsdWVzWzNdO1xuXG4gICAgICBpZiAoYSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gXCJyZ2IoXCIuY29uY2F0KHIsIFwiLCBcIikuY29uY2F0KGcsIFwiLCBcIikuY29uY2F0KGIsIFwiKVwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwicmdiYShcIi5jb25jYXQociwgXCIsIFwiKS5jb25jYXQoZywgXCIsIFwiKS5jb25jYXQoYiwgXCIsIFwiKS5jb25jYXQoYSwgXCIpXCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0hzbFN0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0hzbFN0cmluZygpIHtcbiAgICAgIHZhciBfdGhpcyR0b0hzbGFBcnJheSA9IHRoaXMudG9Ic2xhQXJyYXkoKSxcbiAgICAgICAgICBfdGhpcyR0b0hzbGFBcnJheTIgPSBfc2xpY2VkVG9BcnJheShfdGhpcyR0b0hzbGFBcnJheSwgNCksXG4gICAgICAgICAgaCA9IF90aGlzJHRvSHNsYUFycmF5MlswXSxcbiAgICAgICAgICBzID0gX3RoaXMkdG9Ic2xhQXJyYXkyWzFdLFxuICAgICAgICAgIGwgPSBfdGhpcyR0b0hzbGFBcnJheTJbMl0sXG4gICAgICAgICAgYSA9IF90aGlzJHRvSHNsYUFycmF5MlszXTtcblxuICAgICAgaWYgKGEgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIFwiaHNsKFwiLmNvbmNhdChoLCBcIiwgXCIpLmNvbmNhdChzLCBcIiUsIFwiKS5jb25jYXQobCwgXCIlKVwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiaHNsYShcIi5jb25jYXQoaCwgXCIsIFwiKS5jb25jYXQocywgXCIlLCBcIikuY29uY2F0KGwsIFwiJSwgXCIpLmNvbmNhdChhLCBcIilcIik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvSGV4U3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSGV4U3RyaW5nKCkge1xuICAgICAgdmFyIF90aGlzJHZhbHVlczIgPSBfc2xpY2VkVG9BcnJheSh0aGlzLnZhbHVlcywgNCksXG4gICAgICAgICAgciA9IF90aGlzJHZhbHVlczJbMF0sXG4gICAgICAgICAgZyA9IF90aGlzJHZhbHVlczJbMV0sXG4gICAgICAgICAgYiA9IF90aGlzJHZhbHVlczJbMl0sXG4gICAgICAgICAgYSA9IF90aGlzJHZhbHVlczJbM107XG5cbiAgICAgIHIgPSBOdW1iZXIocikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBnID0gTnVtYmVyKGcpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgYiA9IE51bWJlcihiKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGEgPSBhIDwgMSA/IHBhcnNlSW50KGEgKiAyNTUsIDEwKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSA6ICcnO1xuICAgICAgcmV0dXJuIFwiI1wiLmNvbmNhdChyKS5jb25jYXQoZykuY29uY2F0KGIpLmNvbmNhdChhKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9SZ2JhQXJyYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9SZ2JhQXJyYXkoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvSHNsYUFycmF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSHNsYUFycmF5KCkge1xuICAgICAgdmFyIF90aGlzJHZhbHVlczMgPSBfc2xpY2VkVG9BcnJheSh0aGlzLnZhbHVlcywgNCksXG4gICAgICAgICAgciA9IF90aGlzJHZhbHVlczNbMF0sXG4gICAgICAgICAgZyA9IF90aGlzJHZhbHVlczNbMV0sXG4gICAgICAgICAgYiA9IF90aGlzJHZhbHVlczNbMl0sXG4gICAgICAgICAgYSA9IF90aGlzJHZhbHVlczNbM107XG5cbiAgICAgIHZhciBfcmdiVG9Ic2wgPSByZ2JUb0hzbChyLCBnLCBiKSxcbiAgICAgICAgICBfcmdiVG9Ic2wyID0gX3NsaWNlZFRvQXJyYXkoX3JnYlRvSHNsLCAzKSxcbiAgICAgICAgICBoID0gX3JnYlRvSHNsMlswXSxcbiAgICAgICAgICBzID0gX3JnYlRvSHNsMlsxXSxcbiAgICAgICAgICBsID0gX3JnYlRvSHNsMlsyXTtcblxuICAgICAgcmV0dXJuIFtoLCBzLCBsLCBhXTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29sb3I7XG59KCk7XG5cbmZ1bmN0aW9uIGZyb21SZ2JhKF9yZWY1KSB7XG4gIHZhciBfcmVmNiA9IF9zbGljZWRUb0FycmF5KF9yZWY1LCA0KSxcbiAgICAgIHIgPSBfcmVmNlswXSxcbiAgICAgIGcgPSBfcmVmNlsxXSxcbiAgICAgIGIgPSBfcmVmNlsyXSxcbiAgICAgIGEgPSBfcmVmNlszXTtcblxuICByZXR1cm4gbmV3IENvbG9yKFtyLCBnLCBiLCBhXSk7XG59XG5cbmZ1bmN0aW9uIGZyb21SZ2IoX3JlZjcpIHtcbiAgdmFyIF9yZWY4ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjcsIDMpLFxuICAgICAgciA9IF9yZWY4WzBdLFxuICAgICAgZyA9IF9yZWY4WzFdLFxuICAgICAgYiA9IF9yZWY4WzJdO1xuXG4gIHJldHVybiBmcm9tUmdiYShbciwgZywgYiwgMV0pO1xufVxuXG5mdW5jdGlvbiBmcm9tSHNsYShfcmVmOSkge1xuICB2YXIgX3JlZjEwID0gX3NsaWNlZFRvQXJyYXkoX3JlZjksIDQpLFxuICAgICAgaCA9IF9yZWYxMFswXSxcbiAgICAgIHMgPSBfcmVmMTBbMV0sXG4gICAgICBsID0gX3JlZjEwWzJdLFxuICAgICAgYSA9IF9yZWYxMFszXTtcblxuICB2YXIgX2hzbFRvUmdiID0gaHNsVG9SZ2IoaCwgcywgbCksXG4gICAgICBfaHNsVG9SZ2IyID0gX3NsaWNlZFRvQXJyYXkoX2hzbFRvUmdiLCAzKSxcbiAgICAgIHIgPSBfaHNsVG9SZ2IyWzBdLFxuICAgICAgZyA9IF9oc2xUb1JnYjJbMV0sXG4gICAgICBiID0gX2hzbFRvUmdiMlsyXTtcblxuICByZXR1cm4gZnJvbVJnYmEoW3IsIGcsIGIsIGFdKTtcbn1cblxuZnVuY3Rpb24gZnJvbUhzbChfcmVmMTEpIHtcbiAgdmFyIF9yZWYxMiA9IF9zbGljZWRUb0FycmF5KF9yZWYxMSwgMyksXG4gICAgICBoID0gX3JlZjEyWzBdLFxuICAgICAgcyA9IF9yZWYxMlsxXSxcbiAgICAgIGwgPSBfcmVmMTJbMl07XG5cbiAgcmV0dXJuIGZyb21Ic2xhKFtoLCBzLCBsLCAxXSk7XG59XG5cbmZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKSB7XG4gIHZhciBfcmVmMTMgPSBoZXguZXhlYyhzdHIpIHx8IHNob3J0SGV4LmV4ZWMoc3RyKSxcbiAgICAgIF9yZWYxNCA9IF9zbGljZWRUb0FycmF5KF9yZWYxMywgNSksXG4gICAgICByID0gX3JlZjE0WzFdLFxuICAgICAgZyA9IF9yZWYxNFsyXSxcbiAgICAgIGIgPSBfcmVmMTRbM10sXG4gICAgICBhID0gX3JlZjE0WzRdO1xuXG4gIHIgPSBwYXJzZUludChyLmxlbmd0aCA8IDIgPyByLnJlcGVhdCgyKSA6IHIsIDE2KTtcbiAgZyA9IHBhcnNlSW50KGcubGVuZ3RoIDwgMiA/IGcucmVwZWF0KDIpIDogZywgMTYpO1xuICBiID0gcGFyc2VJbnQoYi5sZW5ndGggPCAyID8gYi5yZXBlYXQoMikgOiBiLCAxNik7XG4gIGEgPSBhICYmIChwYXJzZUludChhLmxlbmd0aCA8IDIgPyBhLnJlcGVhdCgyKSA6IGEsIDE2KSAvIDI1NSkudG9QcmVjaXNpb24oMSkgfHwgMTtcbiAgcmV0dXJuIGZyb21SZ2JhKFtyLCBnLCBiLCBhXSk7XG59XG5cbmZ1bmN0aW9uIGZyb21SZ2JTdHJpbmcoc3RyKSB7XG4gIHZhciBfcmVmMTUgPSByZ2IuZXhlYyhzdHIpIHx8IHJnYnBlcmMuZXhlYyhzdHIpIHx8IHJnYmZuLmV4ZWMoc3RyKSB8fCByZ2JwZXJjZm4uZXhlYyhzdHIpLFxuICAgICAgX3JlZjE2ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjE1LCA1KSxcbiAgICAgIHIgPSBfcmVmMTZbMV0sXG4gICAgICBnID0gX3JlZjE2WzJdLFxuICAgICAgYiA9IF9yZWYxNlszXSxcbiAgICAgIGEgPSBfcmVmMTZbNF07XG5cbiAgciA9IGNvbnRhaW5zKHIsICclJykgPyBwYXJzZUludChyLCAxMCkgKiAyNTUgLyAxMDAgOiBwYXJzZUludChyLCAxMCk7XG4gIGcgPSBjb250YWlucyhnLCAnJScpID8gcGFyc2VJbnQoZywgMTApICogMjU1IC8gMTAwIDogcGFyc2VJbnQoZywgMTApO1xuICBiID0gY29udGFpbnMoYiwgJyUnKSA+IDAgPyBwYXJzZUludChiLCAxMCkgKiAyNTUgLyAxMDAgOiBwYXJzZUludChiLCAxMCk7XG4gIGEgPSBhID09PSB1bmRlZmluZWQgPyAxIDogcGFyc2VGbG9hdChhKSAvIChjb250YWlucyhhLCAnJScpID8gMTAwIDogMSk7XG4gIHJldHVybiBmcm9tUmdiYShbciwgZywgYiwgYV0pO1xufVxuXG5mdW5jdGlvbiBmcm9tSHNsU3RyaW5nKHN0cikge1xuICB2YXIgX2hzbCRleGVjID0gaHNsLmV4ZWMoc3RyKSxcbiAgICAgIF9oc2wkZXhlYzIgPSBfc2xpY2VkVG9BcnJheShfaHNsJGV4ZWMsIDYpLFxuICAgICAgaCA9IF9oc2wkZXhlYzJbMV0sXG4gICAgICB1bml0ID0gX2hzbCRleGVjMlsyXSxcbiAgICAgIHMgPSBfaHNsJGV4ZWMyWzNdLFxuICAgICAgbCA9IF9oc2wkZXhlYzJbNF0sXG4gICAgICBhID0gX2hzbCRleGVjMls1XTtcblxuICB1bml0ID0gdW5pdCB8fCAnZGVnJztcbiAgaCA9ICgwLCBfY3NzVW5pdENvbnZlcnRlcltcImRlZmF1bHRcIl0pKHBhcnNlRmxvYXQoaCksIHVuaXQsICdkZWcnKTtcbiAgcyA9IHBhcnNlRmxvYXQocyk7XG4gIGwgPSBwYXJzZUZsb2F0KGwpO1xuICBhID0gYSA9PT0gdW5kZWZpbmVkID8gMSA6IHBhcnNlRmxvYXQoYSkgLyAoY29udGFpbnMoYSwgJyUnKSA/IDEwMCA6IDEpO1xuICByZXR1cm4gZnJvbUhzbGEoW2gsIHMsIGwsIGFdKTtcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHIpIHtcbiAgaWYgKF9jb2xvck5hbWVbXCJkZWZhdWx0XCJdW3N0cl0pIHtcbiAgICByZXR1cm4gZnJvbVJnYihfY29sb3JOYW1lW1wiZGVmYXVsdFwiXVtzdHJdKTtcbiAgfVxuXG4gIGlmIChoZXgudGVzdChzdHIpIHx8IHNob3J0SGV4LnRlc3Qoc3RyKSkge1xuICAgIHJldHVybiBmcm9tSGV4U3RyaW5nKHN0cik7XG4gIH1cblxuICBpZiAocmdiLnRlc3Qoc3RyKSB8fCByZ2JwZXJjLnRlc3Qoc3RyKSB8fCByZ2Jmbi50ZXN0KHN0cikgfHwgcmdicGVyY2ZuLnRlc3Qoc3RyKSkge1xuICAgIHJldHVybiBmcm9tUmdiU3RyaW5nKHN0cik7XG4gIH1cblxuICBpZiAoaHNsLnRlc3Qoc3RyKSkge1xuICAgIHJldHVybiBmcm9tSHNsU3RyaW5nKHN0cik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIF9kZWZhdWx0ID0ge1xuICBmcm9tU3RyaW5nOiBmcm9tU3RyaW5nLFxuICBmcm9tUmdiOiBmcm9tUmdiLFxuICBmcm9tUmdiYTogZnJvbVJnYmEsXG4gIGZyb21Ic2w6IGZyb21Ic2wsXG4gIGZyb21Ic2xhOiBmcm9tSHNsYVxufTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHR2YXIgc3RyID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG5cdHZhciBpc0FyZ3MgPSBzdHIgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXHRpZiAoIWlzQXJncykge1xuXHRcdGlzQXJncyA9IHN0ciAhPT0gJ1tvYmplY3QgQXJyYXldJyAmJlxuXHRcdFx0dmFsdWUgIT09IG51bGwgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG5cdFx0XHR2YWx1ZS5sZW5ndGggPj0gMCAmJlxuXHRcdFx0dG9TdHIuY2FsbCh2YWx1ZS5jYWxsZWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXHR9XG5cdHJldHVybiBpc0FyZ3M7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXNTaGltO1xuaWYgKCFPYmplY3Qua2V5cykge1xuXHQvLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbVxuXHR2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblx0dmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIGlzQXJncyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnbG9iYWwtcmVxdWlyZVxuXHR2YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0dmFyIGhhc0RvbnRFbnVtQnVnID0gIWlzRW51bWVyYWJsZS5jYWxsKHsgdG9TdHJpbmc6IG51bGwgfSwgJ3RvU3RyaW5nJyk7XG5cdHZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xuXHR2YXIgZG9udEVudW1zID0gW1xuXHRcdCd0b1N0cmluZycsXG5cdFx0J3RvTG9jYWxlU3RyaW5nJyxcblx0XHQndmFsdWVPZicsXG5cdFx0J2hhc093blByb3BlcnR5Jyxcblx0XHQnaXNQcm90b3R5cGVPZicsXG5cdFx0J3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcblx0XHQnY29uc3RydWN0b3InXG5cdF07XG5cdHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIChvKSB7XG5cdFx0dmFyIGN0b3IgPSBvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xuXHR9O1xuXHR2YXIgZXhjbHVkZWRLZXlzID0ge1xuXHRcdCRhcHBsaWNhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdCRjb25zb2xlOiB0cnVlLFxuXHRcdCRleHRlcm5hbDogdHJ1ZSxcblx0XHQkZnJhbWU6IHRydWUsXG5cdFx0JGZyYW1lRWxlbWVudDogdHJ1ZSxcblx0XHQkZnJhbWVzOiB0cnVlLFxuXHRcdCRpbm5lckhlaWdodDogdHJ1ZSxcblx0XHQkaW5uZXJXaWR0aDogdHJ1ZSxcblx0XHQkb25tb3pmdWxsc2NyZWVuY2hhbmdlOiB0cnVlLFxuXHRcdCRvbm1vemZ1bGxzY3JlZW5lcnJvcjogdHJ1ZSxcblx0XHQkb3V0ZXJIZWlnaHQ6IHRydWUsXG5cdFx0JG91dGVyV2lkdGg6IHRydWUsXG5cdFx0JHBhZ2VYT2Zmc2V0OiB0cnVlLFxuXHRcdCRwYWdlWU9mZnNldDogdHJ1ZSxcblx0XHQkcGFyZW50OiB0cnVlLFxuXHRcdCRzY3JvbGxMZWZ0OiB0cnVlLFxuXHRcdCRzY3JvbGxUb3A6IHRydWUsXG5cdFx0JHNjcm9sbFg6IHRydWUsXG5cdFx0JHNjcm9sbFk6IHRydWUsXG5cdFx0JHNlbGY6IHRydWUsXG5cdFx0JHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcblx0XHQkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG5cdFx0JHdpbmRvdzogdHJ1ZVxuXHR9O1xuXHR2YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGZvciAodmFyIGsgaW4gd2luZG93KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoIWV4Y2x1ZGVkS2V5c1snJCcgKyBrXSAmJiBoYXMuY2FsbCh3aW5kb3csIGspICYmIHdpbmRvd1trXSAhPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93W2tdID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSh3aW5kb3dba10pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KCkpO1xuXHR2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gKG8pIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpIHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXG5cdGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0XHR2YXIgaXNPYmplY3QgPSBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCc7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSB0b1N0ci5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdFx0dmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG5cdFx0dmFyIGlzU3RyaW5nID0gaXNPYmplY3QgJiYgdG9TdHIuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBTdHJpbmddJztcblx0XHR2YXIgdGhlS2V5cyA9IFtdO1xuXG5cdFx0aWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QnKTtcblx0XHR9XG5cblx0XHR2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cdFx0aWYgKGlzU3RyaW5nICYmIG9iamVjdC5sZW5ndGggPiAwICYmICFoYXMuY2FsbChvYmplY3QsIDApKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgb2JqZWN0Lmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcoaikpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKHZhciBuYW1lIGluIG9iamVjdCkge1xuXHRcdFx0XHRpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKG5hbWUpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNEb250RW51bUJ1Zykge1xuXHRcdFx0dmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG5cdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGRvbnRFbnVtcy5sZW5ndGg7ICsraykge1xuXHRcdFx0XHRpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW1zW2tdID09PSAnY29uc3RydWN0b3InKSAmJiBoYXMuY2FsbChvYmplY3QsIGRvbnRFbnVtc1trXSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhlS2V5cztcblx0fTtcbn1cbm1vZHVsZS5leHBvcnRzID0ga2V5c1NoaW07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaXNBcmdzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpO1xuXG52YXIgb3JpZ0tleXMgPSBPYmplY3Qua2V5cztcbnZhciBrZXlzU2hpbSA9IG9yaWdLZXlzID8gZnVuY3Rpb24ga2V5cyhvKSB7IHJldHVybiBvcmlnS2V5cyhvKTsgfSA6IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxudmFyIG9yaWdpbmFsS2V5cyA9IE9iamVjdC5rZXlzO1xuXG5rZXlzU2hpbS5zaGltID0gZnVuY3Rpb24gc2hpbU9iamVjdEtleXMoKSB7XG5cdGlmIChPYmplY3Qua2V5cykge1xuXHRcdHZhciBrZXlzV29ya3NXaXRoQXJndW1lbnRzID0gKGZ1bmN0aW9uICgpIHtcblx0XHRcdC8vIFNhZmFyaSA1LjAgYnVnXG5cdFx0XHR2YXIgYXJncyA9IE9iamVjdC5rZXlzKGFyZ3VtZW50cyk7XG5cdFx0XHRyZXR1cm4gYXJncyAmJiBhcmdzLmxlbmd0aCA9PT0gYXJndW1lbnRzLmxlbmd0aDtcblx0XHR9KDEsIDIpKTtcblx0XHRpZiAoIWtleXNXb3Jrc1dpdGhBcmd1bWVudHMpIHtcblx0XHRcdE9iamVjdC5rZXlzID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcblx0XHRcdFx0aWYgKGlzQXJncyhvYmplY3QpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9yaWdpbmFsS2V5cyhzbGljZS5jYWxsKG9iamVjdCkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvcmlnaW5hbEtleXMob2JqZWN0KTtcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdE9iamVjdC5rZXlzID0ga2V5c1NoaW07XG5cdH1cblx0cmV0dXJuIE9iamVjdC5rZXlzIHx8IGtleXNTaGltO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzU2hpbTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEVycm9yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZXZhbCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBFdmFsRXJyb3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yYW5nZScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSYW5nZUVycm9yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vcmVmJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFJlZmVyZW5jZUVycm9yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc3ludGF4Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRheEVycm9yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vdHlwZScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBUeXBlRXJyb3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi91cmknKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gVVJJRXJyb3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgY29tcGxleGl0eTogWzIsIDE4XSwgbWF4LXN0YXRlbWVudHM6IFsyLCAzM10gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJykgeyByZXR1cm4gdHJ1ZTsgfVxuXG5cdHZhciBvYmogPSB7fTtcblx0dmFyIHN5bSA9IFN5bWJvbCgndGVzdCcpO1xuXHR2YXIgc3ltT2JqID0gT2JqZWN0KHN5bSk7XG5cdGlmICh0eXBlb2Ygc3ltID09PSAnc3RyaW5nJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bU9iaikgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvb2JqZWN0LmFzc2lnbi9pc3N1ZXMvMTdcblx0Ly8gaWYgKHN5bSBpbnN0YW5jZW9mIFN5bWJvbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzL2lzc3Vlcy80XG5cdC8vIGlmICghKHN5bU9iaiBpbnN0YW5jZW9mIFN5bWJvbCkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gaWYgKHR5cGVvZiBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyBpZiAoU3RyaW5nKHN5bSkgIT09IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1WYWwgPSA0Mjtcblx0b2JqW3N5bV0gPSBzeW1WYWw7XG5cdGZvciAoc3ltIGluIG9iaikgeyByZXR1cm4gZmFsc2U7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tdW5yZWFjaGFibGUtbG9vcFxuXHRpZiAodHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG5cdGlmIChzeW1zLmxlbmd0aCAhPT0gMSB8fCBzeW1zWzBdICE9PSBzeW0pIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqLCBzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bSk7XG5cdFx0aWYgKGRlc2NyaXB0b3IudmFsdWUgIT09IHN5bVZhbCB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUgIT09IHRydWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3JpZ1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbDtcbnZhciBoYXNTeW1ib2xTaGFtID0gcmVxdWlyZSgnLi9zaGFtcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc05hdGl2ZVN5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCgnZm9vJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCgnYmFyJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHJldHVybiBoYXNTeW1ib2xTaGFtKCk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHRlc3QgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0Zm9vOiB7fVxufTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1Byb3RvKCkge1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yOiBUUyBlcnJvcnMgb24gYW4gaW5oZXJpdGVkIHByb3BlcnR5IGZvciBzb21lIHJlYXNvblxuXHRyZXR1cm4geyBfX3Byb3RvX186IHRlc3QgfS5mb28gPT09IHRlc3QuZm9vXG5cdFx0JiYgISh0ZXN0IGluc3RhbmNlb2YgJE9iamVjdCk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxudmFyIGNvbmNhdHR5ID0gZnVuY3Rpb24gY29uY2F0dHkoYSwgYikge1xuICAgIHZhciBhcnIgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJbaV0gPSBhW2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGIubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgYXJyW2ogKyBhLmxlbmd0aF0gPSBiW2pdO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG59O1xuXG52YXIgc2xpY3kgPSBmdW5jdGlvbiBzbGljeShhcnJMaWtlLCBvZmZzZXQpIHtcbiAgICB2YXIgYXJyID0gW107XG4gICAgZm9yICh2YXIgaSA9IG9mZnNldCB8fCAwLCBqID0gMDsgaSA8IGFyckxpa2UubGVuZ3RoOyBpICs9IDEsIGogKz0gMSkge1xuICAgICAgICBhcnJbal0gPSBhcnJMaWtlW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xufTtcblxudmFyIGpvaW55ID0gZnVuY3Rpb24gKGFyciwgam9pbmVyKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHN0ciArPSBhcnJbaV07XG4gICAgICAgIGlmIChpICsgMSA8IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0ciArPSBqb2luZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7XG4gICAgdmFyIHRhcmdldCA9IHRoaXM7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicgfHwgdG9TdHIuYXBwbHkodGFyZ2V0KSAhPT0gZnVuY1R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJPUl9NRVNTQUdFICsgdGFyZ2V0KTtcbiAgICB9XG4gICAgdmFyIGFyZ3MgPSBzbGljeShhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBjb25jYXR0eShhcmdzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldC5hcHBseShcbiAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICBjb25jYXR0eShhcmdzLCBhcmd1bWVudHMpXG4gICAgICAgICk7XG5cbiAgICB9O1xuXG4gICAgdmFyIGJvdW5kTGVuZ3RoID0gbWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG4gICAgdmFyIGJvdW5kQXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgICAgICBib3VuZEFyZ3NbaV0gPSAnJCcgKyBpO1xuICAgIH1cblxuICAgIGJvdW5kID0gRnVuY3Rpb24oJ2JpbmRlcicsICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBqb2lueShib3VuZEFyZ3MsICcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBpbXBsZW1lbnRhdGlvbjtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG52YXIgJGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKGNhbGwsICRoYXNPd24pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHVuZGVmaW5lZDtcblxudmFyICRFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycycpO1xudmFyICRFdmFsRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvZXZhbCcpO1xudmFyICRSYW5nZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3JhbmdlJyk7XG52YXIgJFJlZmVyZW5jZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3JlZicpO1xudmFyICRTeW50YXhFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9zeW50YXgnKTtcbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkVVJJRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdXJpJyk7XG5cbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG52YXIgZ2V0RXZhbGxlZENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKGV4cHJlc3Npb25TeW50YXgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gJEZ1bmN0aW9uKCdcInVzZSBzdHJpY3RcIjsgcmV0dXJuICgnICsgZXhwcmVzc2lvblN5bnRheCArICcpLmNvbnN0cnVjdG9yOycpKCk7XG5cdH0gY2F0Y2ggKGUpIHt9XG59O1xuXG52YXIgJGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuaWYgKCRnT1BEKSB7XG5cdHRyeSB7XG5cdFx0JGdPUEQoe30sICcnKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdCRnT1BEID0gbnVsbDsgLy8gdGhpcyBpcyBJRSA4LCB3aGljaCBoYXMgYSBicm9rZW4gZ09QRFxuXHR9XG59XG5cbnZhciB0aHJvd1R5cGVFcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoKTtcbn07XG52YXIgVGhyb3dUeXBlRXJyb3IgPSAkZ09QRFxuXHQ/IChmdW5jdGlvbiAoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMsIG5vLWNhbGxlciwgbm8tcmVzdHJpY3RlZC1wcm9wZXJ0aWVzXG5cdFx0XHRhcmd1bWVudHMuY2FsbGVlOyAvLyBJRSA4IGRvZXMgbm90IHRocm93IGhlcmVcblx0XHRcdHJldHVybiB0aHJvd1R5cGVFcnJvcjtcblx0XHR9IGNhdGNoIChjYWxsZWVUaHJvd3MpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIElFIDggdGhyb3dzIG9uIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXJndW1lbnRzLCAnJylcblx0XHRcdFx0cmV0dXJuICRnT1BEKGFyZ3VtZW50cywgJ2NhbGxlZScpLmdldDtcblx0XHRcdH0gY2F0Y2ggKGdPUER0aHJvd3MpIHtcblx0XHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fSgpKVxuXHQ6IHRocm93VHlwZUVycm9yO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcbnZhciBoYXNQcm90byA9IHJlcXVpcmUoJ2hhcy1wcm90bycpKCk7XG5cbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCAoXG5cdGhhc1Byb3RvXG5cdFx0PyBmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5fX3Byb3RvX187IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuXHRcdDogbnVsbFxuKTtcblxudmFyIG5lZWRzRXZhbCA9IHt9O1xuXG52YXIgVHlwZWRBcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhVaW50OEFycmF5KTtcblxudmFyIElOVFJJTlNJQ1MgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBZ2dyZWdhdGVFcnJvciUnOiB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQWdncmVnYXRlRXJyb3IsXG5cdCclQXJyYXklJzogQXJyYXksXG5cdCclQXJyYXlCdWZmZXIlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFycmF5QnVmZmVyLFxuXHQnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Z1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiBuZWVkc0V2YWwsXG5cdCclQXRvbWljcyUnOiB0eXBlb2YgQXRvbWljcyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBdG9taWNzLFxuXHQnJUJpZ0ludCUnOiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludCxcblx0JyVCaWdJbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdJbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludDY0QXJyYXksXG5cdCclQmlnVWludDY0QXJyYXklJzogdHlwZW9mIEJpZ1VpbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ1VpbnQ2NEFycmF5LFxuXHQnJUJvb2xlYW4lJzogQm9vbGVhbixcblx0JyVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcsXG5cdCclRGF0ZSUnOiBEYXRlLFxuXHQnJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG5cdCclZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuXHQnJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG5cdCclRXJyb3IlJzogJEVycm9yLFxuXHQnJWV2YWwlJzogZXZhbCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1ldmFsXG5cdCclRXZhbEVycm9yJSc6ICRFdmFsRXJyb3IsXG5cdCclRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LFxuXHQnJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheSxcblx0JyVGaW5hbGl6YXRpb25SZWdpc3RyeSUnOiB0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmluYWxpemF0aW9uUmVnaXN0cnksXG5cdCclRnVuY3Rpb24lJzogJEZ1bmN0aW9uLFxuXHQnJUdlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVJbnQ4QXJyYXklJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXksXG5cdCclSW50MTZBcnJheSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQxNkFycmF5LFxuXHQnJUludDMyQXJyYXklJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MzJBcnJheSxcblx0JyVpc0Zpbml0ZSUnOiBpc0Zpbml0ZSxcblx0JyVpc05hTiUnOiBpc05hTixcblx0JyVJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkgOiB1bmRlZmluZWQsXG5cdCclSlNPTiUnOiB0eXBlb2YgSlNPTiA9PT0gJ29iamVjdCcgPyBKU09OIDogdW5kZWZpbmVkLFxuXHQnJU1hcCUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcCxcblx0JyVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgTWFwKClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVNYXRoJSc6IE1hdGgsXG5cdCclTnVtYmVyJSc6IE51bWJlcixcblx0JyVPYmplY3QlJzogT2JqZWN0LFxuXHQnJXBhcnNlRmxvYXQlJzogcGFyc2VGbG9hdCxcblx0JyVwYXJzZUludCUnOiBwYXJzZUludCxcblx0JyVQcm9taXNlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UsXG5cdCclUHJveHklJzogdHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb3h5LFxuXHQnJVJhbmdlRXJyb3IlJzogJFJhbmdlRXJyb3IsXG5cdCclUmVmZXJlbmNlRXJyb3IlJzogJFJlZmVyZW5jZUVycm9yLFxuXHQnJVJlZmxlY3QlJzogdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUmVmbGVjdCxcblx0JyVSZWdFeHAlJzogUmVnRXhwLFxuXHQnJVNldCUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNldCxcblx0JyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgU2V0KClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlciUnOiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2hhcmVkQXJyYXlCdWZmZXIsXG5cdCclU3RyaW5nJSc6IFN0cmluZyxcblx0JyVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oJydbU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyVTeW1ib2wlJzogaGFzU3ltYm9scyA/IFN5bWJvbCA6IHVuZGVmaW5lZCxcblx0JyVTeW50YXhFcnJvciUnOiAkU3ludGF4RXJyb3IsXG5cdCclVGhyb3dUeXBlRXJyb3IlJzogVGhyb3dUeXBlRXJyb3IsXG5cdCclVHlwZWRBcnJheSUnOiBUeXBlZEFycmF5LFxuXHQnJVR5cGVFcnJvciUnOiAkVHlwZUVycm9yLFxuXHQnJVVpbnQ4QXJyYXklJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhBcnJheSxcblx0JyVVaW50OENsYW1wZWRBcnJheSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhDbGFtcGVkQXJyYXksXG5cdCclVWludDE2QXJyYXklJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQxNkFycmF5LFxuXHQnJVVpbnQzMkFycmF5JSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MzJBcnJheSxcblx0JyVVUklFcnJvciUnOiAkVVJJRXJyb3IsXG5cdCclV2Vha01hcCUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrTWFwLFxuXHQnJVdlYWtSZWYlJzogdHlwZW9mIFdlYWtSZWYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1JlZixcblx0JyVXZWFrU2V0JSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtTZXRcbn07XG5cbmlmIChnZXRQcm90bykge1xuXHR0cnkge1xuXHRcdG51bGwuZXJyb3I7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zaGFkb3dyZWFsbS9wdWxsLzM4NCNpc3N1ZWNvbW1lbnQtMTM2NDI2NDIyOVxuXHRcdHZhciBlcnJvclByb3RvID0gZ2V0UHJvdG8oZ2V0UHJvdG8oZSkpO1xuXHRcdElOVFJJTlNJQ1NbJyVFcnJvci5wcm90b3R5cGUlJ10gPSBlcnJvclByb3RvO1xuXHR9XG59XG5cbnZhciBkb0V2YWwgPSBmdW5jdGlvbiBkb0V2YWwobmFtZSkge1xuXHR2YXIgdmFsdWU7XG5cdGlmIChuYW1lID09PSAnJUFzeW5jRnVuY3Rpb24lJykge1xuXHRcdHZhbHVlID0gZ2V0RXZhbGxlZENvbnN0cnVjdG9yKCdhc3luYyBmdW5jdGlvbiAoKSB7fScpO1xuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclR2VuZXJhdG9yRnVuY3Rpb24lJykge1xuXHRcdHZhbHVlID0gZ2V0RXZhbGxlZENvbnN0cnVjdG9yKCdmdW5jdGlvbiogKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJykge1xuXHRcdHZhbHVlID0gZ2V0RXZhbGxlZENvbnN0cnVjdG9yKCdhc3luYyBmdW5jdGlvbiogKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jR2VuZXJhdG9yJScpIHtcblx0XHR2YXIgZm4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpO1xuXHRcdGlmIChmbikge1xuXHRcdFx0dmFsdWUgPSBmbi5wcm90b3R5cGU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnKSB7XG5cdFx0dmFyIGdlbiA9IGRvRXZhbCgnJUFzeW5jR2VuZXJhdG9yJScpO1xuXHRcdGlmIChnZW4gJiYgZ2V0UHJvdG8pIHtcblx0XHRcdHZhbHVlID0gZ2V0UHJvdG8oZ2VuLnByb3RvdHlwZSk7XG5cdFx0fVxuXHR9XG5cblx0SU5UUklOU0lDU1tuYW1lXSA9IHZhbHVlO1xuXG5cdHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBMRUdBQ1lfQUxJQVNFUyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnJUFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b3R5cGUlJzogWydBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvX2VudHJpZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZW50cmllcyddLFxuXHQnJUFycmF5UHJvdG9fZm9yRWFjaCUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdmb3JFYWNoJ10sXG5cdCclQXJyYXlQcm90b19rZXlzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2tleXMnXSxcblx0JyVBcnJheVByb3RvX3ZhbHVlcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICd2YWx1ZXMnXSxcblx0JyVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSc6IFsnQXN5bmNGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVCb29sZWFuUHJvdG90eXBlJSc6IFsnQm9vbGVhbicsICdwcm90b3R5cGUnXSxcblx0JyVEYXRhVmlld1Byb3RvdHlwZSUnOiBbJ0RhdGFWaWV3JywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGVQcm90b3R5cGUlJzogWydEYXRlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUVycm9yUHJvdG90eXBlJSc6IFsnRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRXZhbEVycm9yUHJvdG90eXBlJSc6IFsnRXZhbEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0MzJBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDY0QXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDY0QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRnVuY3Rpb25Qcm90b3R5cGUlJzogWydGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVHZW5lcmF0b3IlJzogWydHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVHZW5lcmF0b3JQcm90b3R5cGUlJzogWydHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclSW50OEFycmF5UHJvdG90eXBlJSc6IFsnSW50OEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDE2QXJyYXlQcm90b3R5cGUlJzogWydJbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDMyQXJyYXlQcm90b3R5cGUlJzogWydJbnQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUpTT05QYXJzZSUnOiBbJ0pTT04nLCAncGFyc2UnXSxcblx0JyVKU09OU3RyaW5naWZ5JSc6IFsnSlNPTicsICdzdHJpbmdpZnknXSxcblx0JyVNYXBQcm90b3R5cGUlJzogWydNYXAnLCAncHJvdG90eXBlJ10sXG5cdCclTnVtYmVyUHJvdG90eXBlJSc6IFsnTnVtYmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJU9iamVjdFByb3RvdHlwZSUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnXSxcblx0JyVPYmpQcm90b190b1N0cmluZyUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndG9TdHJpbmcnXSxcblx0JyVPYmpQcm90b192YWx1ZU9mJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd2YWx1ZU9mJ10sXG5cdCclUHJvbWlzZVByb3RvdHlwZSUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJ10sXG5cdCclUHJvbWlzZVByb3RvX3RoZW4lJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZScsICd0aGVuJ10sXG5cdCclUHJvbWlzZV9hbGwlJzogWydQcm9taXNlJywgJ2FsbCddLFxuXHQnJVByb21pc2VfcmVqZWN0JSc6IFsnUHJvbWlzZScsICdyZWplY3QnXSxcblx0JyVQcm9taXNlX3Jlc29sdmUlJzogWydQcm9taXNlJywgJ3Jlc29sdmUnXSxcblx0JyVSYW5nZUVycm9yUHJvdG90eXBlJSc6IFsnUmFuZ2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWZlcmVuY2VFcnJvclByb3RvdHlwZSUnOiBbJ1JlZmVyZW5jZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZ0V4cFByb3RvdHlwZSUnOiBbJ1JlZ0V4cCcsICdwcm90b3R5cGUnXSxcblx0JyVTZXRQcm90b3R5cGUlJzogWydTZXQnLCAncHJvdG90eXBlJ10sXG5cdCclU2hhcmVkQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydTaGFyZWRBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVTdHJpbmdQcm90b3R5cGUlJzogWydTdHJpbmcnLCAncHJvdG90eXBlJ10sXG5cdCclU3ltYm9sUHJvdG90eXBlJSc6IFsnU3ltYm9sJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bnRheEVycm9yUHJvdG90eXBlJSc6IFsnU3ludGF4RXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVHlwZWRBcnJheVByb3RvdHlwZSUnOiBbJ1R5cGVkQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVHlwZUVycm9yUHJvdG90eXBlJSc6IFsnVHlwZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQ4QXJyYXlQcm90b3R5cGUlJzogWydVaW50OEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhDbGFtcGVkQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDE2QXJyYXlQcm90b3R5cGUlJzogWydVaW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVSSUVycm9yUHJvdG90eXBlJSc6IFsnVVJJRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclV2Vha01hcFByb3RvdHlwZSUnOiBbJ1dlYWtNYXAnLCAncHJvdG90eXBlJ10sXG5cdCclV2Vha1NldFByb3RvdHlwZSUnOiBbJ1dlYWtTZXQnLCAncHJvdG90eXBlJ11cbn07XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJ2hhc293bicpO1xudmFyICRjb25jYXQgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgQXJyYXkucHJvdG90eXBlLmNvbmNhdCk7XG52YXIgJHNwbGljZUFwcGx5ID0gYmluZC5jYWxsKEZ1bmN0aW9uLmFwcGx5LCBBcnJheS5wcm90b3R5cGUuc3BsaWNlKTtcbnZhciAkcmVwbGFjZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xudmFyICRzdHJTbGljZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnNsaWNlKTtcbnZhciAkZXhlYyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBSZWdFeHAucHJvdG90eXBlLmV4ZWMpO1xuXG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nOyAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG5cdHZhciBmaXJzdCA9ICRzdHJTbGljZShzdHJpbmcsIDAsIDEpO1xuXHR2YXIgbGFzdCA9ICRzdHJTbGljZShzdHJpbmcsIC0xKTtcblx0aWYgKGZpcnN0ID09PSAnJScgJiYgbGFzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBjbG9zaW5nIGAlYCcpO1xuXHR9IGVsc2UgaWYgKGxhc3QgPT09ICclJyAmJiBmaXJzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSBbXTtcblx0JHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuXHRcdHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogbnVtYmVyIHx8IG1hdGNoO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKiBlbmQgYWRhcHRhdGlvbiAqL1xuXG52YXIgZ2V0QmFzZUludHJpbnNpYyA9IGZ1bmN0aW9uIGdldEJhc2VJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWNOYW1lID0gbmFtZTtcblx0dmFyIGFsaWFzO1xuXHRpZiAoaGFzT3duKExFR0FDWV9BTElBU0VTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdGFsaWFzID0gTEVHQUNZX0FMSUFTRVNbaW50cmluc2ljTmFtZV07XG5cdFx0aW50cmluc2ljTmFtZSA9ICclJyArIGFsaWFzWzBdICsgJyUnO1xuXHR9XG5cblx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdHZhciB2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljTmFtZV07XG5cdFx0aWYgKHZhbHVlID09PSBuZWVkc0V2YWwpIHtcblx0XHRcdHZhbHVlID0gZG9FdmFsKGludHJpbnNpY05hbWUpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyAmJiAhYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YWxpYXM6IGFsaWFzLFxuXHRcdFx0bmFtZTogaW50cmluc2ljTmFtZSxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH1cblxuXHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBHZXRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdGlmICgkZXhlYygvXiU/W14lXSolPyQvLCBuYW1lKSA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2AlYCBtYXkgbm90IGJlIHByZXNlbnQgYW55d2hlcmUgYnV0IGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgaW50cmluc2ljIG5hbWUnKTtcblx0fVxuXHR2YXIgcGFydHMgPSBzdHJpbmdUb1BhdGgobmFtZSk7XG5cdHZhciBpbnRyaW5zaWNCYXNlTmFtZSA9IHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0c1swXSA6ICcnO1xuXG5cdHZhciBpbnRyaW5zaWMgPSBnZXRCYXNlSW50cmluc2ljKCclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnLCBhbGxvd01pc3NpbmcpO1xuXHR2YXIgaW50cmluc2ljUmVhbE5hbWUgPSBpbnRyaW5zaWMubmFtZTtcblx0dmFyIHZhbHVlID0gaW50cmluc2ljLnZhbHVlO1xuXHR2YXIgc2tpcEZ1cnRoZXJDYWNoaW5nID0gZmFsc2U7XG5cblx0dmFyIGFsaWFzID0gaW50cmluc2ljLmFsaWFzO1xuXHRpZiAoYWxpYXMpIHtcblx0XHRpbnRyaW5zaWNCYXNlTmFtZSA9IGFsaWFzWzBdO1xuXHRcdCRzcGxpY2VBcHBseShwYXJ0cywgJGNvbmNhdChbMCwgMV0sIGFsaWFzKSk7XG5cdH1cblxuXHRmb3IgKHZhciBpID0gMSwgaXNPd24gPSB0cnVlOyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHR2YXIgcGFydCA9IHBhcnRzW2ldO1xuXHRcdHZhciBmaXJzdCA9ICRzdHJTbGljZShwYXJ0LCAwLCAxKTtcblx0XHR2YXIgbGFzdCA9ICRzdHJTbGljZShwYXJ0LCAtMSk7XG5cdFx0aWYgKFxuXHRcdFx0KFxuXHRcdFx0XHQoZmlyc3QgPT09ICdcIicgfHwgZmlyc3QgPT09IFwiJ1wiIHx8IGZpcnN0ID09PSAnYCcpXG5cdFx0XHRcdHx8IChsYXN0ID09PSAnXCInIHx8IGxhc3QgPT09IFwiJ1wiIHx8IGxhc3QgPT09ICdgJylcblx0XHRcdClcblx0XHRcdCYmIGZpcnN0ICE9PSBsYXN0XG5cdFx0KSB7XG5cdFx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdwcm9wZXJ0eSBuYW1lcyB3aXRoIHF1b3RlcyBtdXN0IGhhdmUgbWF0Y2hpbmcgcXVvdGVzJyk7XG5cdFx0fVxuXHRcdGlmIChwYXJ0ID09PSAnY29uc3RydWN0b3InIHx8ICFpc093bikge1xuXHRcdFx0c2tpcEZ1cnRoZXJDYWNoaW5nID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpbnRyaW5zaWNCYXNlTmFtZSArPSAnLicgKyBwYXJ0O1xuXHRcdGludHJpbnNpY1JlYWxOYW1lID0gJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJSc7XG5cblx0XHRpZiAoaGFzT3duKElOVFJJTlNJQ1MsIGludHJpbnNpY1JlYWxOYW1lKSkge1xuXHRcdFx0dmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcblx0XHRcdGlmICghKHBhcnQgaW4gdmFsdWUpKSB7XG5cdFx0XHRcdGlmICghYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Jhc2UgaW50cmluc2ljIGZvciAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgdGhlIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUuJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZvaWQgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCRnT1BEICYmIChpICsgMSkgPj0gcGFydHMubGVuZ3RoKSB7XG5cdFx0XHRcdHZhciBkZXNjID0gJGdPUEQodmFsdWUsIHBhcnQpO1xuXHRcdFx0XHRpc093biA9ICEhZGVzYztcblxuXHRcdFx0XHQvLyBCeSBjb252ZW50aW9uLCB3aGVuIGEgZGF0YSBwcm9wZXJ0eSBpcyBjb252ZXJ0ZWQgdG8gYW4gYWNjZXNzb3Jcblx0XHRcdFx0Ly8gcHJvcGVydHkgdG8gZW11bGF0ZSBhIGRhdGEgcHJvcGVydHkgdGhhdCBkb2VzIG5vdCBzdWZmZXIgZnJvbVxuXHRcdFx0XHQvLyB0aGUgb3ZlcnJpZGUgbWlzdGFrZSwgdGhhdCBhY2Nlc3NvcidzIGdldHRlciBpcyBtYXJrZWQgd2l0aFxuXHRcdFx0XHQvLyBhbiBgb3JpZ2luYWxWYWx1ZWAgcHJvcGVydHkuIEhlcmUsIHdoZW4gd2UgZGV0ZWN0IHRoaXMsIHdlXG5cdFx0XHRcdC8vIHVwaG9sZCB0aGUgaWxsdXNpb24gYnkgcHJldGVuZGluZyB0byBzZWUgdGhhdCBvcmlnaW5hbCBkYXRhXG5cdFx0XHRcdC8vIHByb3BlcnR5LCBpLmUuLCByZXR1cm5pbmcgdGhlIHZhbHVlIHJhdGhlciB0aGFuIHRoZSBnZXR0ZXJcblx0XHRcdFx0Ly8gaXRzZWxmLlxuXHRcdFx0XHRpZiAoaXNPd24gJiYgJ2dldCcgaW4gZGVzYyAmJiAhKCdvcmlnaW5hbFZhbHVlJyBpbiBkZXNjLmdldCkpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGRlc2MuZ2V0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlzT3duID0gaGFzT3duKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzT3duICYmICFza2lwRnVydGhlckNhY2hpbmcpIHtcblx0XHRcdFx0SU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgJGRlZmluZVByb3BlcnR5ID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmRlZmluZVByb3BlcnR5JScsIHRydWUpIHx8IGZhbHNlO1xuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHR0cnkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IHZhbHVlOiAxIH0pO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZGVmaW5lUHJvcGVydHlcblx0XHQkZGVmaW5lUHJvcGVydHkgPSBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRkZWZpbmVQcm9wZXJ0eTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbnZhciAkZ09QRCA9IEdldEludHJpbnNpYygnJU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IlJywgdHJ1ZSk7XG5cbmlmICgkZ09QRCkge1xuXHR0cnkge1xuXHRcdCRnT1BEKFtdLCAnbGVuZ3RoJyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBnT1BEXG5cdFx0JGdPUEQgPSBudWxsO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gJGdPUEQ7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciAkU3ludGF4RXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvc3ludGF4Jyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbnZhciBnb3BkID0gcmVxdWlyZSgnZ29wZCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVEYXRhUHJvcGVydHkoXG5cdG9iaixcblx0cHJvcGVydHksXG5cdHZhbHVlXG4pIHtcblx0aWYgKCFvYmogfHwgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmogIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BvYmpgIG11c3QgYmUgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb25gJyk7XG5cdH1cblx0aWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHByb3BlcnR5ICE9PSAnc3ltYm9sJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgcHJvcGVydHlgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2xgJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHR5cGVvZiBhcmd1bWVudHNbM10gIT09ICdib29sZWFuJyAmJiBhcmd1bWVudHNbM10gIT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYG5vbkVudW1lcmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNCAmJiB0eXBlb2YgYXJndW1lbnRzWzRdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzRdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25Xcml0YWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIHR5cGVvZiBhcmd1bWVudHNbNV0gIT09ICdib29sZWFuJyAmJiBhcmd1bWVudHNbNV0gIT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYG5vbkNvbmZpZ3VyYWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA2ICYmIHR5cGVvZiBhcmd1bWVudHNbNl0gIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbG9vc2VgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdHZhciBub25FbnVtZXJhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXHR2YXIgbm9uV3JpdGFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNCA/IGFyZ3VtZW50c1s0XSA6IG51bGw7XG5cdHZhciBub25Db25maWd1cmFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNSA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG5cdHZhciBsb29zZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA2ID8gYXJndW1lbnRzWzZdIDogZmFsc2U7XG5cblx0LyogQHR5cGUge2ZhbHNlIHwgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj59ICovXG5cdHZhciBkZXNjID0gISFnb3BkICYmIGdvcGQob2JqLCBwcm9wZXJ0eSk7XG5cblx0aWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5LCB7XG5cdFx0XHRjb25maWd1cmFibGU6IG5vbkNvbmZpZ3VyYWJsZSA9PT0gbnVsbCAmJiBkZXNjID8gZGVzYy5jb25maWd1cmFibGUgOiAhbm9uQ29uZmlndXJhYmxlLFxuXHRcdFx0ZW51bWVyYWJsZTogbm9uRW51bWVyYWJsZSA9PT0gbnVsbCAmJiBkZXNjID8gZGVzYy5lbnVtZXJhYmxlIDogIW5vbkVudW1lcmFibGUsXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHR3cml0YWJsZTogbm9uV3JpdGFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2Mud3JpdGFibGUgOiAhbm9uV3JpdGFibGVcblx0XHR9KTtcblx0fSBlbHNlIGlmIChsb29zZSB8fCAoIW5vbkVudW1lcmFibGUgJiYgIW5vbldyaXRhYmxlICYmICFub25Db25maWd1cmFibGUpKSB7XG5cdFx0Ly8gbXVzdCBmYWxsIGJhY2sgdG8gW1tTZXRdXSwgYW5kIHdhcyBub3QgZXhwbGljaXRseSBhc2tlZCB0byBtYWtlIG5vbi1lbnVtZXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1jb25maWd1cmFibGVcblx0XHRvYmpbcHJvcGVydHldID0gdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgZGVmaW5pbmcgYSBwcm9wZXJ0eSBhcyBub24tY29uZmlndXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1lbnVtZXJhYmxlLicpO1xuXHR9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9ycyA9IGZ1bmN0aW9uIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnMoKSB7XG5cdHJldHVybiAhISRkZWZpbmVQcm9wZXJ0eTtcbn07XG5cbmhhc1Byb3BlcnR5RGVzY3JpcHRvcnMuaGFzQXJyYXlMZW5ndGhEZWZpbmVCdWcgPSBmdW5jdGlvbiBoYXNBcnJheUxlbmd0aERlZmluZUJ1ZygpIHtcblx0Ly8gbm9kZSB2MC42IGhhcyBhIGJ1ZyB3aGVyZSBhcnJheSBsZW5ndGhzIGNhbiBiZSBTZXQgYnV0IG5vdCBEZWZpbmVkXG5cdGlmICghJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0dHJ5IHtcblx0XHRyZXR1cm4gJGRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB2YWx1ZTogMSB9KS5sZW5ndGggIT09IDE7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJbiBGaXJlZm94IDQtMjIsIGRlZmluaW5nIGxlbmd0aCBvbiBhbiBhcnJheSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvcnM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIga2V5cyA9IHJlcXVpcmUoJ29iamVjdC1rZXlzJyk7XG52YXIgaGFzU3ltYm9scyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbCgnZm9vJykgPT09ICdzeW1ib2wnO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgZGVmaW5lRGF0YVByb3BlcnR5ID0gcmVxdWlyZSgnZGVmaW5lLWRhdGEtcHJvcGVydHknKTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0ci5jYWxsKGZuKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnaGFzLXByb3BlcnR5LWRlc2NyaXB0b3JzJykoKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgdmFsdWUsIHByZWRpY2F0ZSkge1xuXHRpZiAobmFtZSBpbiBvYmplY3QpIHtcblx0XHRpZiAocHJlZGljYXRlID09PSB0cnVlKSB7XG5cdFx0XHRpZiAob2JqZWN0W25hbWVdID09PSB2YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghaXNGdW5jdGlvbihwcmVkaWNhdGUpIHx8ICFwcmVkaWNhdGUoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG5cdFx0ZGVmaW5lRGF0YVByb3BlcnR5KG9iamVjdCwgbmFtZSwgdmFsdWUsIHRydWUpO1xuXHR9IGVsc2Uge1xuXHRcdGRlZmluZURhdGFQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHZhbHVlKTtcblx0fVxufTtcblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqZWN0LCBtYXApIHtcblx0dmFyIHByZWRpY2F0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXHR2YXIgcHJvcHMgPSBrZXlzKG1hcCk7XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0cHJvcHMgPSBjb25jYXQuY2FsbChwcm9wcywgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtYXApKTtcblx0fVxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wc1tpXSwgbWFwW3Byb3BzW2ldXSwgcHJlZGljYXRlc1twcm9wc1tpXV0pO1xuXHR9XG59O1xuXG5kZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIXN1cHBvcnRzRGVzY3JpcHRvcnM7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydGllcztcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLWRhdGEtcHJvcGVydHknKTtcbnZhciBoYXNEZXNjcmlwdG9ycyA9IHJlcXVpcmUoJ2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpKCk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJ2dvcGQnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRmbG9vciA9IEdldEludHJpbnNpYygnJU1hdGguZmxvb3IlJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldEZ1bmN0aW9uTGVuZ3RoKGZuLCBsZW5ndGgpIHtcblx0aWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgZm5gIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG5cdH1cblx0aWYgKHR5cGVvZiBsZW5ndGggIT09ICdudW1iZXInIHx8IGxlbmd0aCA8IDAgfHwgbGVuZ3RoID4gMHhGRkZGRkZGRiB8fCAkZmxvb3IobGVuZ3RoKSAhPT0gbGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BsZW5ndGhgIG11c3QgYmUgYSBwb3NpdGl2ZSAzMi1iaXQgaW50ZWdlcicpO1xuXHR9XG5cblx0dmFyIGxvb3NlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgISFhcmd1bWVudHNbMl07XG5cblx0dmFyIGZ1bmN0aW9uTGVuZ3RoSXNDb25maWd1cmFibGUgPSB0cnVlO1xuXHR2YXIgZnVuY3Rpb25MZW5ndGhJc1dyaXRhYmxlID0gdHJ1ZTtcblx0aWYgKCdsZW5ndGgnIGluIGZuICYmIGdPUEQpIHtcblx0XHR2YXIgZGVzYyA9IGdPUEQoZm4sICdsZW5ndGgnKTtcblx0XHRpZiAoZGVzYyAmJiAhZGVzYy5jb25maWd1cmFibGUpIHtcblx0XHRcdGZ1bmN0aW9uTGVuZ3RoSXNDb25maWd1cmFibGUgPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGRlc2MgJiYgIWRlc2Mud3JpdGFibGUpIHtcblx0XHRcdGZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlmIChmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlIHx8IGZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSB8fCAhbG9vc2UpIHtcblx0XHRpZiAoaGFzRGVzY3JpcHRvcnMpIHtcblx0XHRcdGRlZmluZSgvKiogQHR5cGUge1BhcmFtZXRlcnM8ZGVmaW5lPlswXX0gKi8gKGZuKSwgJ2xlbmd0aCcsIGxlbmd0aCwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlZmluZSgvKiogQHR5cGUge1BhcmFtZXRlcnM8ZGVmaW5lPlswXX0gKi8gKGZuKSwgJ2xlbmd0aCcsIGxlbmd0aCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmbjtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG52YXIgc2V0RnVuY3Rpb25MZW5ndGggPSByZXF1aXJlKCdzZXQtZnVuY3Rpb24tbGVuZ3RoJyk7XG5cbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkYXBwbHkgPSBHZXRJbnRyaW5zaWMoJyVGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHklJyk7XG52YXIgJGNhbGwgPSBHZXRJbnRyaW5zaWMoJyVGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCUnKTtcbnZhciAkcmVmbGVjdEFwcGx5ID0gR2V0SW50cmluc2ljKCclUmVmbGVjdC5hcHBseSUnLCB0cnVlKSB8fCBiaW5kLmNhbGwoJGNhbGwsICRhcHBseSk7XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCdlcy1kZWZpbmUtcHJvcGVydHknKTtcbnZhciAkbWF4ID0gR2V0SW50cmluc2ljKCclTWF0aC5tYXglJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2FsbEJpbmQob3JpZ2luYWxGdW5jdGlvbikge1xuXHRpZiAodHlwZW9mIG9yaWdpbmFsRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYSBmdW5jdGlvbiBpcyByZXF1aXJlZCcpO1xuXHR9XG5cdHZhciBmdW5jID0gJHJlZmxlY3RBcHBseShiaW5kLCAkY2FsbCwgYXJndW1lbnRzKTtcblx0cmV0dXJuIHNldEZ1bmN0aW9uTGVuZ3RoKFxuXHRcdGZ1bmMsXG5cdFx0MSArICRtYXgoMCwgb3JpZ2luYWxGdW5jdGlvbi5sZW5ndGggLSAoYXJndW1lbnRzLmxlbmd0aCAtIDEpKSxcblx0XHR0cnVlXG5cdCk7XG59O1xuXG52YXIgYXBwbHlCaW5kID0gZnVuY3Rpb24gYXBwbHlCaW5kKCkge1xuXHRyZXR1cm4gJHJlZmxlY3RBcHBseShiaW5kLCAkYXBwbHksIGFyZ3VtZW50cyk7XG59O1xuXG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdCRkZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ2FwcGx5JywgeyB2YWx1ZTogYXBwbHlCaW5kIH0pO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMuYXBwbHkgPSBhcHBseUJpbmQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczYtc2hpbVxudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCdvYmplY3Qta2V5cycpO1xudmFyIGhhc1N5bWJvbHMgPSByZXF1aXJlKCdoYXMtc3ltYm9scy9zaGFtcycpKCk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIHRvT2JqZWN0ID0gT2JqZWN0O1xudmFyICRwdXNoID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUucHVzaCcpO1xudmFyICRwcm9wSXNFbnVtZXJhYmxlID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlJyk7XG52YXIgb3JpZ2luYWxHZXRTeW1ib2xzID0gaGFzU3ltYm9scyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgOiBudWxsO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlMSkge1xuXHRpZiAodGFyZ2V0ID09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigndGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Jyk7IH1cblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTsgLy8gc3RlcCAxXG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIHRvOyAvLyBzdGVwIDJcblx0fVxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7ICsrcykge1xuXHRcdHZhciBmcm9tID0gdG9PYmplY3QoYXJndW1lbnRzW3NdKTsgLy8gc3RlcCAzLmEuaVxuXG5cdFx0Ly8gc3RlcCAzLmEuaWk6XG5cdFx0dmFyIGtleXMgPSBvYmplY3RLZXlzKGZyb20pO1xuXHRcdHZhciBnZXRTeW1ib2xzID0gaGFzU3ltYm9scyAmJiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyB8fCBvcmlnaW5hbEdldFN5bWJvbHMpO1xuXHRcdGlmIChnZXRTeW1ib2xzKSB7XG5cdFx0XHR2YXIgc3ltcyA9IGdldFN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHN5bXMubGVuZ3RoOyArK2opIHtcblx0XHRcdFx0dmFyIGtleSA9IHN5bXNbal07XG5cdFx0XHRcdGlmICgkcHJvcElzRW51bWVyYWJsZShmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdFx0JHB1c2goa2V5cywga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHN0ZXAgMy5hLmlpaTpcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcblx0XHRcdHZhciBuZXh0S2V5ID0ga2V5c1tpXTtcblx0XHRcdGlmICgkcHJvcElzRW51bWVyYWJsZShmcm9tLCBuZXh0S2V5KSkgeyAvLyBzdGVwIDMuYS5paWkuMlxuXHRcdFx0XHR2YXIgcHJvcFZhbHVlID0gZnJvbVtuZXh0S2V5XTsgLy8gc3RlcCAzLmEuaWlpLjIuYVxuXHRcdFx0XHR0b1tuZXh0S2V5XSA9IHByb3BWYWx1ZTsgLy8gc3RlcCAzLmEuaWlpLjIuYlxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bzsgLy8gc3RlcCA0XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG52YXIgbGFja3NQcm9wZXJFbnVtZXJhdGlvbk9yZGVyID0gZnVuY3Rpb24gKCkge1xuXHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0Lypcblx0ICogdjgsIHNwZWNpZmljYWxseSBpbiBub2RlIDQueCwgaGFzIGEgYnVnIHdpdGggaW5jb3JyZWN0IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyXG5cdCAqIG5vdGU6IHRoaXMgZG9lcyBub3QgZGV0ZWN0IHRoZSBidWcgdW5sZXNzIHRoZXJlJ3MgMjAgY2hhcmFjdGVyc1xuXHQgKi9cblx0dmFyIHN0ciA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG5cdHZhciBsZXR0ZXJzID0gc3RyLnNwbGl0KCcnKTtcblx0dmFyIG1hcCA9IHt9O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxldHRlcnMubGVuZ3RoOyArK2kpIHtcblx0XHRtYXBbbGV0dGVyc1tpXV0gPSBsZXR0ZXJzW2ldO1xuXHR9XG5cdHZhciBvYmogPSBPYmplY3QuYXNzaWduKHt9LCBtYXApO1xuXHR2YXIgYWN0dWFsID0gJyc7XG5cdGZvciAodmFyIGsgaW4gb2JqKSB7XG5cdFx0YWN0dWFsICs9IGs7XG5cdH1cblx0cmV0dXJuIHN0ciAhPT0gYWN0dWFsO1xufTtcblxudmFyIGFzc2lnbkhhc1BlbmRpbmdFeGNlcHRpb25zID0gZnVuY3Rpb24gKCkge1xuXHRpZiAoIU9iamVjdC5hc3NpZ24gfHwgIU9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHQvKlxuXHQgKiBGaXJlZm94IDM3IHN0aWxsIGhhcyBcInBlbmRpbmcgZXhjZXB0aW9uXCIgbG9naWMgaW4gaXRzIE9iamVjdC5hc3NpZ24gaW1wbGVtZW50YXRpb24sXG5cdCAqIHdoaWNoIGlzIDcyJSBzbG93ZXIgdGhhbiBvdXIgc2hpbSwgYW5kIEZpcmVmb3ggNDAncyBuYXRpdmUgaW1wbGVtZW50YXRpb24uXG5cdCAqL1xuXHR2YXIgdGhyb3dlciA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7IDE6IDIgfSk7XG5cdHRyeSB7XG5cdFx0T2JqZWN0LmFzc2lnbih0aHJvd2VyLCAneHknKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiB0aHJvd2VyWzFdID09PSAneSc7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xuXHR9XG5cdGlmIChsYWNrc1Byb3BlckVudW1lcmF0aW9uT3JkZXIoKSkge1xuXHRcdHJldHVybiBpbXBsZW1lbnRhdGlvbjtcblx0fVxuXHRpZiAoYXNzaWduSGFzUGVuZGluZ0V4Y2VwdGlvbnMoKSkge1xuXHRcdHJldHVybiBpbXBsZW1lbnRhdGlvbjtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbjtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltQXNzaWduKCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoXG5cdFx0T2JqZWN0LFxuXHRcdHsgYXNzaWduOiBwb2x5ZmlsbCB9LFxuXHRcdHsgYXNzaWduOiBmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3QuYXNzaWduICE9PSBwb2x5ZmlsbDsgfSB9XG5cdCk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQnKTtcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyIHBvbHlmaWxsID0gY2FsbEJpbmQuYXBwbHkoZ2V0UG9seWZpbGwoKSk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbnZhciBib3VuZCA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZTEpIHtcblx0cmV0dXJuIHBvbHlmaWxsKE9iamVjdCwgYXJndW1lbnRzKTtcbn07XG5cbmRlZmluZVByb3BlcnRpZXMoYm91bmQsIHtcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJvdW5kO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGZ1bmN0aW9uc0hhdmVOYW1lcyA9IGZ1bmN0aW9uIGZ1bmN0aW9uc0hhdmVOYW1lcygpIHtcblx0cmV0dXJuIHR5cGVvZiBmdW5jdGlvbiBmKCkge30ubmFtZSA9PT0gJ3N0cmluZyc7XG59O1xuXG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5pZiAoZ09QRCkge1xuXHR0cnkge1xuXHRcdGdPUEQoW10sICdsZW5ndGgnKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIElFIDggaGFzIGEgYnJva2VuIGdPUERcblx0XHRnT1BEID0gbnVsbDtcblx0fVxufVxuXG5mdW5jdGlvbnNIYXZlTmFtZXMuZnVuY3Rpb25zSGF2ZUNvbmZpZ3VyYWJsZU5hbWVzID0gZnVuY3Rpb24gZnVuY3Rpb25zSGF2ZUNvbmZpZ3VyYWJsZU5hbWVzKCkge1xuXHRpZiAoIWZ1bmN0aW9uc0hhdmVOYW1lcygpIHx8ICFnT1BEKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHZhciBkZXNjID0gZ09QRChmdW5jdGlvbiAoKSB7fSwgJ25hbWUnKTtcblx0cmV0dXJuICEhZGVzYyAmJiAhIWRlc2MuY29uZmlndXJhYmxlO1xufTtcblxudmFyICRiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ7XG5cbmZ1bmN0aW9uc0hhdmVOYW1lcy5ib3VuZEZ1bmN0aW9uc0hhdmVOYW1lcyA9IGZ1bmN0aW9uIGJvdW5kRnVuY3Rpb25zSGF2ZU5hbWVzKCkge1xuXHRyZXR1cm4gZnVuY3Rpb25zSGF2ZU5hbWVzKCkgJiYgdHlwZW9mICRiaW5kID09PSAnZnVuY3Rpb24nICYmIGZ1bmN0aW9uIGYoKSB7fS5iaW5kKCkubmFtZSAhPT0gJyc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uc0hhdmVOYW1lcztcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtZGF0YS1wcm9wZXJ0eScpO1xudmFyIGhhc0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnaGFzLXByb3BlcnR5LWRlc2NyaXB0b3JzJykoKTtcbnZhciBmdW5jdGlvbnNIYXZlQ29uZmlndXJhYmxlTmFtZXMgPSByZXF1aXJlKCdmdW5jdGlvbnMtaGF2ZS1uYW1lcycpLmZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcygpO1xuXG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldEZ1bmN0aW9uTmFtZShmbiwgbmFtZSkge1xuXHRpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BmbmAgaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0fVxuXHR2YXIgbG9vc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiAhIWFyZ3VtZW50c1syXTtcblx0aWYgKCFsb29zZSB8fCBmdW5jdGlvbnNIYXZlQ29uZmlndXJhYmxlTmFtZXMpIHtcblx0XHRpZiAoaGFzRGVzY3JpcHRvcnMpIHtcblx0XHRcdGRlZmluZSgvKiogQHR5cGUge1BhcmFtZXRlcnM8ZGVmaW5lPlswXX0gKi8gKGZuKSwgJ25hbWUnLCBuYW1lLCB0cnVlLCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVmaW5lKC8qKiBAdHlwZSB7UGFyYW1ldGVyczxkZWZpbmU+WzBdfSAqLyAoZm4pLCAnbmFtZScsIG5hbWUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZm47XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHNldEZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoJ3NldC1mdW5jdGlvbi1uYW1lJyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNldEZ1bmN0aW9uTmFtZShmdW5jdGlvbiBmbGFncygpIHtcblx0aWYgKHRoaXMgPT0gbnVsbCB8fCB0aGlzICE9PSAkT2JqZWN0KHRoaXMpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1JlZ0V4cC5wcm90b3R5cGUuZmxhZ3MgZ2V0dGVyIGNhbGxlZCBvbiBub24tb2JqZWN0Jyk7XG5cdH1cblx0dmFyIHJlc3VsdCA9ICcnO1xuXHRpZiAodGhpcy5oYXNJbmRpY2VzKSB7XG5cdFx0cmVzdWx0ICs9ICdkJztcblx0fVxuXHRpZiAodGhpcy5nbG9iYWwpIHtcblx0XHRyZXN1bHQgKz0gJ2cnO1xuXHR9XG5cdGlmICh0aGlzLmlnbm9yZUNhc2UpIHtcblx0XHRyZXN1bHQgKz0gJ2knO1xuXHR9XG5cdGlmICh0aGlzLm11bHRpbGluZSkge1xuXHRcdHJlc3VsdCArPSAnbSc7XG5cdH1cblx0aWYgKHRoaXMuZG90QWxsKSB7XG5cdFx0cmVzdWx0ICs9ICdzJztcblx0fVxuXHRpZiAodGhpcy51bmljb2RlKSB7XG5cdFx0cmVzdWx0ICs9ICd1Jztcblx0fVxuXHRpZiAodGhpcy51bmljb2RlU2V0cykge1xuXHRcdHJlc3VsdCArPSAndic7XG5cdH1cblx0aWYgKHRoaXMuc3RpY2t5KSB7XG5cdFx0cmVzdWx0ICs9ICd5Jztcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufSwgJ2dldCBmbGFncycsIHRydWUpO1xuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKS5zdXBwb3J0c0Rlc2NyaXB0b3JzO1xudmFyICRnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0aWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMgJiYgKC9hL21pZykuZmxhZ3MgPT09ICdnaW0nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSAkZ09QRChSZWdFeHAucHJvdG90eXBlLCAnZmxhZ3MnKTtcblx0XHRpZiAoXG5cdFx0XHRkZXNjcmlwdG9yXG5cdFx0XHQmJiB0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbidcblx0XHRcdCYmIHR5cGVvZiBSZWdFeHAucHJvdG90eXBlLmRvdEFsbCA9PT0gJ2Jvb2xlYW4nXG5cdFx0XHQmJiB0eXBlb2YgUmVnRXhwLnByb3RvdHlwZS5oYXNJbmRpY2VzID09PSAnYm9vbGVhbidcblx0XHQpIHtcblx0XHRcdC8qIGVzbGludCBnZXR0ZXItcmV0dXJuOiAwICovXG5cdFx0XHR2YXIgY2FsbHMgPSAnJztcblx0XHRcdHZhciBvID0ge307XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobywgJ2hhc0luZGljZXMnLCB7XG5cdFx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGNhbGxzICs9ICdkJztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobywgJ3N0aWNreScsIHtcblx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Y2FsbHMgKz0gJ3knO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChjYWxscyA9PT0gJ2R5Jykge1xuXHRcdFx0XHRyZXR1cm4gZGVzY3JpcHRvci5nZXQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbXBsZW1lbnRhdGlvbjtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3VwcG9ydHNEZXNjcmlwdG9ycyA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJykuc3VwcG9ydHNEZXNjcmlwdG9ycztcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBUeXBlRXJyID0gVHlwZUVycm9yO1xudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyIHJlZ2V4ID0gL2EvO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoaW1GbGFncygpIHtcblx0aWYgKCFzdXBwb3J0c0Rlc2NyaXB0b3JzIHx8ICFnZXRQcm90bykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyKCdSZWdFeHAucHJvdG90eXBlLmZsYWdzIHJlcXVpcmVzIGEgdHJ1ZSBFUzUgZW52aXJvbm1lbnQgdGhhdCBzdXBwb3J0cyBwcm9wZXJ0eSBkZXNjcmlwdG9ycycpO1xuXHR9XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdHZhciBwcm90byA9IGdldFByb3RvKHJlZ2V4KTtcblx0dmFyIGRlc2NyaXB0b3IgPSBnT1BEKHByb3RvLCAnZmxhZ3MnKTtcblx0aWYgKCFkZXNjcmlwdG9yIHx8IGRlc2NyaXB0b3IuZ2V0ICE9PSBwb2x5ZmlsbCkge1xuXHRcdGRlZmluZVByb3BlcnR5KHByb3RvLCAnZmxhZ3MnLCB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogcG9seWZpbGxcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQnKTtcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyIGZsYWdzQm91bmQgPSBjYWxsQmluZChnZXRQb2x5ZmlsbCgpKTtcblxuZGVmaW5lKGZsYWdzQm91bmQsIHtcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYWdzQm91bmQ7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzL3NoYW1zJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1RvU3RyaW5nVGFnU2hhbXMoKSB7XG5cdHJldHVybiBoYXNTeW1ib2xzKCkgJiYgISFTeW1ib2wudG9TdHJpbmdUYWc7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG5cbnZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcblxudmFyIGlzU3RhbmRhcmRBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHRpZiAoaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuICR0b1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufTtcblxudmFyIGlzTGVnYWN5QXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcblx0aWYgKGlzU3RhbmRhcmRBcmd1bWVudHModmFsdWUpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlICE9PSBudWxsICYmXG5cdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG5cdFx0dmFsdWUubGVuZ3RoID49IDAgJiZcblx0XHQkdG9TdHJpbmcodmFsdWUpICE9PSAnW29iamVjdCBBcnJheV0nICYmXG5cdFx0JHRvU3RyaW5nKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA9IChmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBpc1N0YW5kYXJkQXJndW1lbnRzKGFyZ3VtZW50cyk7XG59KCkpO1xuXG5pc1N0YW5kYXJkQXJndW1lbnRzLmlzTGVnYWN5QXJndW1lbnRzID0gaXNMZWdhY3lBcmd1bWVudHM7IC8vIGZvciB0ZXN0c1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN1cHBvcnRzU3RhbmRhcmRBcmd1bWVudHMgPyBpc1N0YW5kYXJkQXJndW1lbnRzIDogaXNMZWdhY3lBcmd1bWVudHM7XG4iLCAidmFyIGhhc01hcCA9IHR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbicgJiYgTWFwLnByb3RvdHlwZTtcbnZhciBtYXBTaXplRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgaGFzTWFwID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihNYXAucHJvdG90eXBlLCAnc2l6ZScpIDogbnVsbDtcbnZhciBtYXBTaXplID0gaGFzTWFwICYmIG1hcFNpemVEZXNjcmlwdG9yICYmIHR5cGVvZiBtYXBTaXplRGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgPyBtYXBTaXplRGVzY3JpcHRvci5nZXQgOiBudWxsO1xudmFyIG1hcEZvckVhY2ggPSBoYXNNYXAgJiYgTWFwLnByb3RvdHlwZS5mb3JFYWNoO1xudmFyIGhhc1NldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbicgJiYgU2V0LnByb3RvdHlwZTtcbnZhciBzZXRTaXplRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgaGFzU2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTZXQucHJvdG90eXBlLCAnc2l6ZScpIDogbnVsbDtcbnZhciBzZXRTaXplID0gaGFzU2V0ICYmIHNldFNpemVEZXNjcmlwdG9yICYmIHR5cGVvZiBzZXRTaXplRGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgPyBzZXRTaXplRGVzY3JpcHRvci5nZXQgOiBudWxsO1xudmFyIHNldEZvckVhY2ggPSBoYXNTZXQgJiYgU2V0LnByb3RvdHlwZS5mb3JFYWNoO1xudmFyIGhhc1dlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrTWFwLnByb3RvdHlwZTtcbnZhciB3ZWFrTWFwSGFzID0gaGFzV2Vha01hcCA/IFdlYWtNYXAucHJvdG90eXBlLmhhcyA6IG51bGw7XG52YXIgaGFzV2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nICYmIFdlYWtTZXQucHJvdG90eXBlO1xudmFyIHdlYWtTZXRIYXMgPSBoYXNXZWFrU2V0ID8gV2Vha1NldC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciBoYXNXZWFrUmVmID0gdHlwZW9mIFdlYWtSZWYgPT09ICdmdW5jdGlvbicgJiYgV2Vha1JlZi5wcm90b3R5cGU7XG52YXIgd2Vha1JlZkRlcmVmID0gaGFzV2Vha1JlZiA/IFdlYWtSZWYucHJvdG90eXBlLmRlcmVmIDogbnVsbDtcbnZhciBib29sZWFuVmFsdWVPZiA9IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2Y7XG52YXIgb2JqZWN0VG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgJG1hdGNoID0gU3RyaW5nLnByb3RvdHlwZS5tYXRjaDtcbnZhciAkc2xpY2UgPSBTdHJpbmcucHJvdG90eXBlLnNsaWNlO1xudmFyICRyZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xudmFyICR0b1VwcGVyQ2FzZSA9IFN0cmluZy5wcm90b3R5cGUudG9VcHBlckNhc2U7XG52YXIgJHRvTG93ZXJDYXNlID0gU3RyaW5nLnByb3RvdHlwZS50b0xvd2VyQ2FzZTtcbnZhciAkdGVzdCA9IFJlZ0V4cC5wcm90b3R5cGUudGVzdDtcbnZhciAkY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciAkam9pbiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xudmFyICRhcnJTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciAkZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGJpZ0ludFZhbHVlT2YgPSB0eXBlb2YgQmlnSW50ID09PSAnZnVuY3Rpb24nID8gQmlnSW50LnByb3RvdHlwZS52YWx1ZU9mIDogbnVsbDtcbnZhciBnT1BTID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBzeW1Ub1N0cmluZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcgPyBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nIDogbnVsbDtcbnZhciBoYXNTaGFtbWVkU3ltYm9scyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ29iamVjdCc7XG4vLyBpZSwgYGhhcy10b3N0cmluZ3RhZy9zaGFtc1xudmFyIHRvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgJiYgKHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IGhhc1NoYW1tZWRTeW1ib2xzID8gJ29iamVjdCcgOiAnc3ltYm9sJylcbiAgICA/IFN5bWJvbC50b1N0cmluZ1RhZ1xuICAgIDogbnVsbDtcbnZhciBpc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG52YXIgZ1BPID0gKHR5cGVvZiBSZWZsZWN0ID09PSAnZnVuY3Rpb24nID8gUmVmbGVjdC5nZXRQcm90b3R5cGVPZiA6IE9iamVjdC5nZXRQcm90b3R5cGVPZikgfHwgKFxuICAgIFtdLl9fcHJvdG9fXyA9PT0gQXJyYXkucHJvdG90eXBlIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cbiAgICAgICAgPyBmdW5jdGlvbiAoTykge1xuICAgICAgICAgICAgcmV0dXJuIE8uX19wcm90b19fOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsXG4pO1xuXG5mdW5jdGlvbiBhZGROdW1lcmljU2VwYXJhdG9yKG51bSwgc3RyKSB7XG4gICAgaWYgKFxuICAgICAgICBudW0gPT09IEluZmluaXR5XG4gICAgICAgIHx8IG51bSA9PT0gLUluZmluaXR5XG4gICAgICAgIHx8IG51bSAhPT0gbnVtXG4gICAgICAgIHx8IChudW0gJiYgbnVtID4gLTEwMDAgJiYgbnVtIDwgMTAwMClcbiAgICAgICAgfHwgJHRlc3QuY2FsbCgvZS8sIHN0cilcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgdmFyIHNlcFJlZ2V4ID0gL1swLTldKD89KD86WzAtOV17M30pKyg/IVswLTldKSkvZztcbiAgICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFyIGludCA9IG51bSA8IDAgPyAtJGZsb29yKC1udW0pIDogJGZsb29yKG51bSk7IC8vIHRydW5jKG51bSlcbiAgICAgICAgaWYgKGludCAhPT0gbnVtKSB7XG4gICAgICAgICAgICB2YXIgaW50U3RyID0gU3RyaW5nKGludCk7XG4gICAgICAgICAgICB2YXIgZGVjID0gJHNsaWNlLmNhbGwoc3RyLCBpbnRTdHIubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICByZXR1cm4gJHJlcGxhY2UuY2FsbChpbnRTdHIsIHNlcFJlZ2V4LCAnJCZfJykgKyAnLicgKyAkcmVwbGFjZS5jYWxsKCRyZXBsYWNlLmNhbGwoZGVjLCAvKFswLTldezN9KS9nLCAnJCZfJyksIC9fJC8sICcnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJHJlcGxhY2UuY2FsbChzdHIsIHNlcFJlZ2V4LCAnJCZfJyk7XG59XG5cbnZhciB1dGlsSW5zcGVjdCA9IHJlcXVpcmUoJy4vdXRpbC5pbnNwZWN0Jyk7XG52YXIgaW5zcGVjdEN1c3RvbSA9IHV0aWxJbnNwZWN0LmN1c3RvbTtcbnZhciBpbnNwZWN0U3ltYm9sID0gaXNTeW1ib2woaW5zcGVjdEN1c3RvbSkgPyBpbnNwZWN0Q3VzdG9tIDogbnVsbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbnNwZWN0XyhvYmosIG9wdGlvbnMsIGRlcHRoLCBzZWVuKSB7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgaWYgKGhhcyhvcHRzLCAncXVvdGVTdHlsZScpICYmIChvcHRzLnF1b3RlU3R5bGUgIT09ICdzaW5nbGUnICYmIG9wdHMucXVvdGVTdHlsZSAhPT0gJ2RvdWJsZScpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcInF1b3RlU3R5bGVcIiBtdXN0IGJlIFwic2luZ2xlXCIgb3IgXCJkb3VibGVcIicpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnbWF4U3RyaW5nTGVuZ3RoJykgJiYgKHR5cGVvZiBvcHRzLm1heFN0cmluZ0xlbmd0aCA9PT0gJ251bWJlcidcbiAgICAgICAgICAgID8gb3B0cy5tYXhTdHJpbmdMZW5ndGggPCAwICYmIG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBJbmZpbml0eVxuICAgICAgICAgICAgOiBvcHRzLm1heFN0cmluZ0xlbmd0aCAhPT0gbnVsbFxuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm1heFN0cmluZ0xlbmd0aFwiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIEluZmluaXR5LCBvciBgbnVsbGAnKTtcbiAgICB9XG4gICAgdmFyIGN1c3RvbUluc3BlY3QgPSBoYXMob3B0cywgJ2N1c3RvbUluc3BlY3QnKSA/IG9wdHMuY3VzdG9tSW5zcGVjdCA6IHRydWU7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21JbnNwZWN0ICE9PSAnYm9vbGVhbicgJiYgY3VzdG9tSW5zcGVjdCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwiY3VzdG9tSW5zcGVjdFwiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBgdHJ1ZWAsIGBmYWxzZWAsIG9yIGBcXCdzeW1ib2xcXCdgJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICBoYXMob3B0cywgJ2luZGVudCcpXG4gICAgICAgICYmIG9wdHMuaW5kZW50ICE9PSBudWxsXG4gICAgICAgICYmIG9wdHMuaW5kZW50ICE9PSAnXFx0J1xuICAgICAgICAmJiAhKHBhcnNlSW50KG9wdHMuaW5kZW50LCAxMCkgPT09IG9wdHMuaW5kZW50ICYmIG9wdHMuaW5kZW50ID4gMClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwiaW5kZW50XCIgbXVzdCBiZSBcIlxcXFx0XCIsIGFuIGludGVnZXIgPiAwLCBvciBgbnVsbGAnKTtcbiAgICB9XG4gICAgaWYgKGhhcyhvcHRzLCAnbnVtZXJpY1NlcGFyYXRvcicpICYmIHR5cGVvZiBvcHRzLm51bWVyaWNTZXBhcmF0b3IgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJudW1lcmljU2VwYXJhdG9yXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCBvciBgZmFsc2VgJyk7XG4gICAgfVxuICAgIHZhciBudW1lcmljU2VwYXJhdG9yID0gb3B0cy5udW1lcmljU2VwYXJhdG9yO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBvYmogPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaW5zcGVjdFN0cmluZyhvYmosIG9wdHMpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKG9iaiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5IC8gb2JqID4gMCA/ICcwJyA6ICctMCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0ciA9IFN0cmluZyhvYmopO1xuICAgICAgICByZXR1cm4gbnVtZXJpY1NlcGFyYXRvciA/IGFkZE51bWVyaWNTZXBhcmF0b3Iob2JqLCBzdHIpIDogc3RyO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgdmFyIGJpZ0ludFN0ciA9IFN0cmluZyhvYmopICsgJ24nO1xuICAgICAgICByZXR1cm4gbnVtZXJpY1NlcGFyYXRvciA/IGFkZE51bWVyaWNTZXBhcmF0b3Iob2JqLCBiaWdJbnRTdHIpIDogYmlnSW50U3RyO1xuICAgIH1cblxuICAgIHZhciBtYXhEZXB0aCA9IHR5cGVvZiBvcHRzLmRlcHRoID09PSAndW5kZWZpbmVkJyA/IDUgOiBvcHRzLmRlcHRoO1xuICAgIGlmICh0eXBlb2YgZGVwdGggPT09ICd1bmRlZmluZWQnKSB7IGRlcHRoID0gMDsgfVxuICAgIGlmIChkZXB0aCA+PSBtYXhEZXB0aCAmJiBtYXhEZXB0aCA+IDAgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkob2JqKSA/ICdbQXJyYXldJyA6ICdbT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgdmFyIGluZGVudCA9IGdldEluZGVudChvcHRzLCBkZXB0aCk7XG5cbiAgICBpZiAodHlwZW9mIHNlZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlZW4gPSBbXTtcbiAgICB9IGVsc2UgaWYgKGluZGV4T2Yoc2Vlbiwgb2JqKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zcGVjdCh2YWx1ZSwgZnJvbSwgbm9JbmRlbnQpIHtcbiAgICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgICAgIHNlZW4gPSAkYXJyU2xpY2UuY2FsbChzZWVuKTtcbiAgICAgICAgICAgIHNlZW4ucHVzaChmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9JbmRlbnQpIHtcbiAgICAgICAgICAgIHZhciBuZXdPcHRzID0ge1xuICAgICAgICAgICAgICAgIGRlcHRoOiBvcHRzLmRlcHRoXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGhhcyhvcHRzLCAncXVvdGVTdHlsZScpKSB7XG4gICAgICAgICAgICAgICAgbmV3T3B0cy5xdW90ZVN0eWxlID0gb3B0cy5xdW90ZVN0eWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBuZXdPcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnNwZWN0Xyh2YWx1ZSwgb3B0cywgZGVwdGggKyAxLCBzZWVuKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNSZWdFeHAob2JqKSkgeyAvLyBpbiBvbGRlciBlbmdpbmVzLCByZWdleGVzIGFyZSBjYWxsYWJsZVxuICAgICAgICB2YXIgbmFtZSA9IG5hbWVPZihvYmopO1xuICAgICAgICB2YXIga2V5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgcmV0dXJuICdbRnVuY3Rpb24nICsgKG5hbWUgPyAnOiAnICsgbmFtZSA6ICcgKGFub255bW91cyknKSArICddJyArIChrZXlzLmxlbmd0aCA+IDAgPyAnIHsgJyArICRqb2luLmNhbGwoa2V5cywgJywgJykgKyAnIH0nIDogJycpO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wob2JqKSkge1xuICAgICAgICB2YXIgc3ltU3RyaW5nID0gaGFzU2hhbW1lZFN5bWJvbHMgPyAkcmVwbGFjZS5jYWxsKFN0cmluZyhvYmopLCAvXihTeW1ib2xcXCguKlxcKSlfW14pXSokLywgJyQxJykgOiBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAhaGFzU2hhbW1lZFN5bWJvbHMgPyBtYXJrQm94ZWQoc3ltU3RyaW5nKSA6IHN5bVN0cmluZztcbiAgICB9XG4gICAgaWYgKGlzRWxlbWVudChvYmopKSB7XG4gICAgICAgIHZhciBzID0gJzwnICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpO1xuICAgICAgICB2YXIgYXR0cnMgPSBvYmouYXR0cmlidXRlcyB8fCBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcyArPSAnICcgKyBhdHRyc1tpXS5uYW1lICsgJz0nICsgd3JhcFF1b3RlcyhxdW90ZShhdHRyc1tpXS52YWx1ZSksICdkb3VibGUnLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBzICs9ICc+JztcbiAgICAgICAgaWYgKG9iai5jaGlsZE5vZGVzICYmIG9iai5jaGlsZE5vZGVzLmxlbmd0aCkgeyBzICs9ICcuLi4nOyB9XG4gICAgICAgIHMgKz0gJzwvJyArICR0b0xvd2VyQ2FzZS5jYWxsKFN0cmluZyhvYmoubm9kZU5hbWUpKSArICc+JztcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKG9iai5sZW5ndGggPT09IDApIHsgcmV0dXJuICdbXSc7IH1cbiAgICAgICAgdmFyIHhzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICBpZiAoaW5kZW50ICYmICFzaW5nbGVMaW5lVmFsdWVzKHhzKSkge1xuICAgICAgICAgICAgcmV0dXJuICdbJyArIGluZGVudGVkSm9pbih4cywgaW5kZW50KSArICddJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ1sgJyArICRqb2luLmNhbGwoeHMsICcsICcpICsgJyBdJztcbiAgICB9XG4gICAgaWYgKGlzRXJyb3Iob2JqKSkge1xuICAgICAgICB2YXIgcGFydHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmICghKCdjYXVzZScgaW4gRXJyb3IucHJvdG90eXBlKSAmJiAnY2F1c2UnIGluIG9iaiAmJiAhaXNFbnVtZXJhYmxlLmNhbGwob2JqLCAnY2F1c2UnKSkge1xuICAgICAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoJ1tjYXVzZV06ICcgKyBpbnNwZWN0KG9iai5jYXVzZSksIHBhcnRzKSwgJywgJykgKyAnIH0nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHsgcmV0dXJuICdbJyArIFN0cmluZyhvYmopICsgJ10nOyB9XG4gICAgICAgIHJldHVybiAneyBbJyArIFN0cmluZyhvYmopICsgJ10gJyArICRqb2luLmNhbGwocGFydHMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIGN1c3RvbUluc3BlY3QpIHtcbiAgICAgICAgaWYgKGluc3BlY3RTeW1ib2wgJiYgdHlwZW9mIG9ialtpbnNwZWN0U3ltYm9sXSA9PT0gJ2Z1bmN0aW9uJyAmJiB1dGlsSW5zcGVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxJbnNwZWN0KG9iaiwgeyBkZXB0aDogbWF4RGVwdGggLSBkZXB0aCB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJyAmJiB0eXBlb2Ygb2JqLmluc3BlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmouaW5zcGVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc01hcChvYmopKSB7XG4gICAgICAgIHZhciBtYXBQYXJ0cyA9IFtdO1xuICAgICAgICBpZiAobWFwRm9yRWFjaCkge1xuICAgICAgICAgICAgbWFwRm9yRWFjaC5jYWxsKG9iaiwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICBtYXBQYXJ0cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmosIHRydWUpICsgJyA9PiAnICsgaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdNYXAnLCBtYXBTaXplLmNhbGwob2JqKSwgbWFwUGFydHMsIGluZGVudCk7XG4gICAgfVxuICAgIGlmIChpc1NldChvYmopKSB7XG4gICAgICAgIHZhciBzZXRQYXJ0cyA9IFtdO1xuICAgICAgICBpZiAoc2V0Rm9yRWFjaCkge1xuICAgICAgICAgICAgc2V0Rm9yRWFjaC5jYWxsKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2V0UGFydHMucHVzaChpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ1NldCcsIHNldFNpemUuY2FsbChvYmopLCBzZXRQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha01hcChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrTWFwJyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtTZXQob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1NldCcpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrUmVmKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtSZWYnKTtcbiAgICB9XG4gICAgaWYgKGlzTnVtYmVyKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KE51bWJlcihvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0JpZ0ludChvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChiaWdJbnRWYWx1ZU9mLmNhbGwob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoaXNCb29sZWFuKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChib29sZWFuVmFsdWVPZi5jYWxsKG9iaikpO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoU3RyaW5nKG9iaikpKTtcbiAgICB9XG4gICAgLy8gbm90ZTogaW4gSUUgOCwgc29tZXRpbWVzIGBnbG9iYWwgIT09IHdpbmRvd2AgYnV0IGJvdGggYXJlIHRoZSBwcm90b3R5cGVzIG9mIGVhY2ggb3RoZXJcbiAgICAvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSB3aW5kb3cpIHtcbiAgICAgICAgcmV0dXJuICd7IFtvYmplY3QgV2luZG93XSB9JztcbiAgICB9XG4gICAgaWYgKG9iaiA9PT0gZ2xvYmFsKSB7XG4gICAgICAgIHJldHVybiAneyBbb2JqZWN0IGdsb2JhbFRoaXNdIH0nO1xuICAgIH1cbiAgICBpZiAoIWlzRGF0ZShvYmopICYmICFpc1JlZ0V4cChvYmopKSB7XG4gICAgICAgIHZhciB5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgdmFyIGlzUGxhaW5PYmplY3QgPSBnUE8gPyBnUE8ob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZSA6IG9iaiBpbnN0YW5jZW9mIE9iamVjdCB8fCBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICAgICAgdmFyIHByb3RvVGFnID0gb2JqIGluc3RhbmNlb2YgT2JqZWN0ID8gJycgOiAnbnVsbCBwcm90b3R5cGUnO1xuICAgICAgICB2YXIgc3RyaW5nVGFnID0gIWlzUGxhaW5PYmplY3QgJiYgdG9TdHJpbmdUYWcgJiYgT2JqZWN0KG9iaikgPT09IG9iaiAmJiB0b1N0cmluZ1RhZyBpbiBvYmogPyAkc2xpY2UuY2FsbCh0b1N0cihvYmopLCA4LCAtMSkgOiBwcm90b1RhZyA/ICdPYmplY3QnIDogJyc7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvclRhZyA9IGlzUGxhaW5PYmplY3QgfHwgdHlwZW9mIG9iai5jb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJyA/ICcnIDogb2JqLmNvbnN0cnVjdG9yLm5hbWUgPyBvYmouY29uc3RydWN0b3IubmFtZSArICcgJyA6ICcnO1xuICAgICAgICB2YXIgdGFnID0gY29uc3RydWN0b3JUYWcgKyAoc3RyaW5nVGFnIHx8IHByb3RvVGFnID8gJ1snICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoW10sIHN0cmluZ1RhZyB8fCBbXSwgcHJvdG9UYWcgfHwgW10pLCAnOiAnKSArICddICcgOiAnJyk7XG4gICAgICAgIGlmICh5cy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHRhZyArICd7fSc7IH1cbiAgICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhZyArICd7JyArIGluZGVudGVkSm9pbih5cywgaW5kZW50KSArICd9JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnICsgJ3sgJyArICRqb2luLmNhbGwoeXMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhvYmopO1xufTtcblxuZnVuY3Rpb24gd3JhcFF1b3RlcyhzLCBkZWZhdWx0U3R5bGUsIG9wdHMpIHtcbiAgICB2YXIgcXVvdGVDaGFyID0gKG9wdHMucXVvdGVTdHlsZSB8fCBkZWZhdWx0U3R5bGUpID09PSAnZG91YmxlJyA/ICdcIicgOiBcIidcIjtcbiAgICByZXR1cm4gcXVvdGVDaGFyICsgcyArIHF1b3RlQ2hhcjtcbn1cblxuZnVuY3Rpb24gcXVvdGUocykge1xuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKFN0cmluZyhzKSwgL1wiL2csICcmcXVvdDsnKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0RhdGUob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBEYXRlXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc1JlZ0V4cChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNFcnJvcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEVycm9yXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc1N0cmluZyhvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEJvb2xlYW5dJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cblxuLy8gU3ltYm9sIGFuZCBCaWdJbnQgZG8gaGF2ZSBTeW1ib2wudG9TdHJpbmdUYWcgYnkgc3BlYywgc28gdGhhdCBjYW4ndCBiZSB1c2VkIHRvIGVsaW1pbmF0ZSBmYWxzZSBwb3NpdGl2ZXNcbmZ1bmN0aW9uIGlzU3ltYm9sKG9iaikge1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiBpbnN0YW5jZW9mIFN5bWJvbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhc3ltVG9TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0JpZ0ludChvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhYmlnSW50VmFsdWVPZikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGJpZ0ludFZhbHVlT2YuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgfHwgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5IGluIHRoaXM7IH07XG5mdW5jdGlvbiBoYXMob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBrZXkpO1xufVxuXG5mdW5jdGlvbiB0b1N0cihvYmopIHtcbiAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiBuYW1lT2YoZikge1xuICAgIGlmIChmLm5hbWUpIHsgcmV0dXJuIGYubmFtZTsgfVxuICAgIHZhciBtID0gJG1hdGNoLmNhbGwoZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGYpLCAvXmZ1bmN0aW9uXFxzKihbXFx3JF0rKS8pO1xuICAgIGlmIChtKSB7IHJldHVybiBtWzFdOyB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgICBpZiAoeHMuaW5kZXhPZikgeyByZXR1cm4geHMuaW5kZXhPZih4KTsgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh4c1tpXSA9PT0geCkgeyByZXR1cm4gaTsgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzTWFwKHgpIHtcbiAgICBpZiAoIW1hcFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha01hcCh4KSB7XG4gICAgaWYgKCF3ZWFrTWFwSGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrUmVmKHgpIHtcbiAgICBpZiAoIXdlYWtSZWZEZXJlZiB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrUmVmRGVyZWYuY2FsbCh4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2V0KHgpIHtcbiAgICBpZiAoIXNldFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFNldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG4gICAgaWYgKCF3ZWFrU2V0SGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB4Lm5vZGVOYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgeC5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyLCBvcHRzKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPiBvcHRzLm1heFN0cmluZ0xlbmd0aCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gc3RyLmxlbmd0aCAtIG9wdHMubWF4U3RyaW5nTGVuZ3RoO1xuICAgICAgICB2YXIgdHJhaWxlciA9ICcuLi4gJyArIHJlbWFpbmluZyArICcgbW9yZSBjaGFyYWN0ZXInICsgKHJlbWFpbmluZyA+IDEgPyAncycgOiAnJyk7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKCRzbGljZS5jYWxsKHN0ciwgMCwgb3B0cy5tYXhTdHJpbmdMZW5ndGgpLCBvcHRzKSArIHRyYWlsZXI7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgdmFyIHMgPSAkcmVwbGFjZS5jYWxsKCRyZXBsYWNlLmNhbGwoc3RyLCAvKFsnXFxcXF0pL2csICdcXFxcJDEnKSwgL1tcXHgwMC1cXHgxZl0vZywgbG93Ynl0ZSk7XG4gICAgcmV0dXJuIHdyYXBRdW90ZXMocywgJ3NpbmdsZScsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBsb3dieXRlKGMpIHtcbiAgICB2YXIgbiA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgeCA9IHtcbiAgICAgICAgODogJ2InLFxuICAgICAgICA5OiAndCcsXG4gICAgICAgIDEwOiAnbicsXG4gICAgICAgIDEyOiAnZicsXG4gICAgICAgIDEzOiAncidcbiAgICB9W25dO1xuICAgIGlmICh4KSB7IHJldHVybiAnXFxcXCcgKyB4OyB9XG4gICAgcmV0dXJuICdcXFxceCcgKyAobiA8IDB4MTAgPyAnMCcgOiAnJykgKyAkdG9VcHBlckNhc2UuY2FsbChuLnRvU3RyaW5nKDE2KSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtCb3hlZChzdHIpIHtcbiAgICByZXR1cm4gJ09iamVjdCgnICsgc3RyICsgJyknO1xufVxuXG5mdW5jdGlvbiB3ZWFrQ29sbGVjdGlvbk9mKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSArICcgeyA/IH0nO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0aW9uT2YodHlwZSwgc2l6ZSwgZW50cmllcywgaW5kZW50KSB7XG4gICAgdmFyIGpvaW5lZEVudHJpZXMgPSBpbmRlbnQgPyBpbmRlbnRlZEpvaW4oZW50cmllcywgaW5kZW50KSA6ICRqb2luLmNhbGwoZW50cmllcywgJywgJyk7XG4gICAgcmV0dXJuIHR5cGUgKyAnICgnICsgc2l6ZSArICcpIHsnICsgam9pbmVkRW50cmllcyArICd9Jztcbn1cblxuZnVuY3Rpb24gc2luZ2xlTGluZVZhbHVlcyh4cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGluZGV4T2YoeHNbaV0sICdcXG4nKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEluZGVudChvcHRzLCBkZXB0aCkge1xuICAgIHZhciBiYXNlSW5kZW50O1xuICAgIGlmIChvcHRzLmluZGVudCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICdcXHQnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdHMuaW5kZW50ID09PSAnbnVtYmVyJyAmJiBvcHRzLmluZGVudCA+IDApIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICRqb2luLmNhbGwoQXJyYXkob3B0cy5pbmRlbnQgKyAxKSwgJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZTogYmFzZUluZGVudCxcbiAgICAgICAgcHJldjogJGpvaW4uY2FsbChBcnJheShkZXB0aCArIDEpLCBiYXNlSW5kZW50KVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGluZGVudGVkSm9pbih4cywgaW5kZW50KSB7XG4gICAgaWYgKHhzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cbiAgICB2YXIgbGluZUpvaW5lciA9ICdcXG4nICsgaW5kZW50LnByZXYgKyBpbmRlbnQuYmFzZTtcbiAgICByZXR1cm4gbGluZUpvaW5lciArICRqb2luLmNhbGwoeHMsICcsJyArIGxpbmVKb2luZXIpICsgJ1xcbicgKyBpbmRlbnQucHJldjtcbn1cblxuZnVuY3Rpb24gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iaik7XG4gICAgdmFyIHhzID0gW107XG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHhzLmxlbmd0aCA9IG9iai5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB4c1tpXSA9IGhhcyhvYmosIGkpID8gaW5zcGVjdChvYmpbaV0sIG9iaikgOiAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgc3ltcyA9IHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nID8gZ09QUyhvYmopIDogW107XG4gICAgdmFyIHN5bU1hcDtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgc3ltTWFwID0ge307XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc3ltcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgc3ltTWFwWyckJyArIHN5bXNba11dID0gc3ltc1trXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBpZiAoIWhhcyhvYmosIGtleSkpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGlzQXJyICYmIFN0cmluZyhOdW1iZXIoa2V5KSkgPT09IGtleSAmJiBrZXkgPCBvYmoubGVuZ3RoKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scyAmJiBzeW1NYXBbJyQnICsga2V5XSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBwcmV2ZW50IHNoYW1tZWQgU3ltYm9scywgd2hpY2ggYXJlIHN0b3JlZCBhcyBzdHJpbmdzLCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcga2V5IHNlY3Rpb25cbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKCR0ZXN0LmNhbGwoL1teXFx3JF0vLCBrZXkpKSB7XG4gICAgICAgICAgICB4cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmopICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHMucHVzaChrZXkgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ltcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltc1tqXSkpIHtcbiAgICAgICAgICAgICAgICB4cy5wdXNoKCdbJyArIGluc3BlY3Qoc3ltc1tqXSkgKyAnXTogJyArIGluc3BlY3Qob2JqW3N5bXNbal1dLCBvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geHM7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnb2JqZWN0LWluc3BlY3QnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRXZWFrTWFwID0gR2V0SW50cmluc2ljKCclV2Vha01hcCUnLCB0cnVlKTtcbnZhciAkTWFwID0gR2V0SW50cmluc2ljKCclTWFwJScsIHRydWUpO1xuXG52YXIgJHdlYWtNYXBHZXQgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLmdldCcsIHRydWUpO1xudmFyICR3ZWFrTWFwU2V0ID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5zZXQnLCB0cnVlKTtcbnZhciAkd2Vha01hcEhhcyA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG52YXIgJG1hcEdldCA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5nZXQnLCB0cnVlKTtcbnZhciAkbWFwU2V0ID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLnNldCcsIHRydWUpO1xudmFyICRtYXBIYXMgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG5cbi8qXG4qIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBsaXN0IHJldHVybmluZyB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXkuXG4qXG4qIFRoYXQgbm9kZSBpcyBhbHNvIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyB0aGF0IGlmIGl0J3MgYWNjZXNzZWQgYWdhaW4gd2UgZG9uJ3QgbmVlZCB0byB0cmF2ZXJzZSB0aGUgd2hvbGUgbGlzdC4gQnkgZG9pbmcgc28sIGFsbCB0aGUgcmVjZW50bHkgdXNlZCBub2RlcyBjYW4gYmUgYWNjZXNzZWQgcmVsYXRpdmVseSBxdWlja2x5LlxuKi9cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJykubGlzdEdldE5vZGV9ICovXG52YXIgbGlzdEdldE5vZGUgPSBmdW5jdGlvbiAobGlzdCwga2V5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0LyoqIEB0eXBlIHt0eXBlb2YgbGlzdCB8IE5vbk51bGxhYmxlPCh0eXBlb2YgbGlzdClbJ25leHQnXT59ICovXG5cdHZhciBwcmV2ID0gbGlzdDtcblx0LyoqIEB0eXBlIHsodHlwZW9mIGxpc3QpWyduZXh0J119ICovXG5cdHZhciBjdXJyO1xuXHRmb3IgKDsgKGN1cnIgPSBwcmV2Lm5leHQpICE9PSBudWxsOyBwcmV2ID0gY3Vycikge1xuXHRcdGlmIChjdXJyLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRwcmV2Lm5leHQgPSBjdXJyLm5leHQ7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG5cdFx0XHRjdXJyLm5leHQgPSAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiBsaXN0Lm5leHQ+fSAqLyAobGlzdC5uZXh0KTtcblx0XHRcdGxpc3QubmV4dCA9IGN1cnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0XHRcdHJldHVybiBjdXJyO1xuXHRcdH1cblx0fVxufTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5saXN0R2V0fSAqL1xudmFyIGxpc3RHZXQgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZTtcbn07XG4vKiogQHR5cGUge2ltcG9ydCgnLicpLmxpc3RTZXR9ICovXG52YXIgbGlzdFNldCA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXksIHZhbHVlKSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0aWYgKG5vZGUpIHtcblx0XHRub2RlLnZhbHVlID0gdmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gUHJlcGVuZCB0aGUgbmV3IG5vZGUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXHRcdG9iamVjdHMubmV4dCA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuJykuTGlzdE5vZGU8dHlwZW9mIHZhbHVlPn0gKi8gKHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnbiwgbm8tZXh0cmEtcGFyZW5zXG5cdFx0XHRrZXk6IGtleSxcblx0XHRcdG5leHQ6IG9iamVjdHMubmV4dCxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH0pO1xuXHR9XG59O1xuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5saXN0SGFzfSAqL1xudmFyIGxpc3RIYXMgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHJldHVybiAhIWxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG59O1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRTaWRlQ2hhbm5lbCgpIHtcblx0LyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgdW5rbm93bj59ICovIHZhciAkd207XG5cdC8qKiBAdHlwZSB7TWFwPG9iamVjdCwgdW5rbm93bj59ICovIHZhciAkbTtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5Sb290Tm9kZTx1bmtub3duPn0gKi8gdmFyICRvO1xuXG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuJykuQ2hhbm5lbH0gKi9cblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0OiBmdW5jdGlvbiAoa2V5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBHZXQoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBHZXQoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0R2V0KCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBIYXMoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBIYXMoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0SGFzKCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoISR3bSkge1xuXHRcdFx0XHRcdCR3bSA9IG5ldyAkV2Vha01hcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCR3ZWFrTWFwU2V0KCR3bSwga2V5LCB2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCEkbSkge1xuXHRcdFx0XHRcdCRtID0gbmV3ICRNYXAoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkbWFwU2V0KCRtLCBrZXksIHZhbHVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghJG8pIHtcblx0XHRcdFx0XHQvLyBJbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdCBhcyBhbiBlbXB0eSBub2RlLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIGhhbmRsaW5nIG9mIHRoZSBmaXJzdCBub2RlOiB3ZSBjYW4gYWx3YXlzIHJlZmVyIHRvIGl0IGFzIChwcmV2aW91cyBub2RlKS5uZXh0LCBpbnN0ZWFkIG9mIHNvbWV0aGluZyBsaWtlIChsaXN0KS5oZWFkXG5cdFx0XHRcdFx0JG8gPSB7IGtleToge30sIG5leHQ6IG51bGwgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaXN0U2V0KCRvLCBrZXksIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHJldHVybiBjaGFubmVsO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd24gPSByZXF1aXJlKCdoYXNvd24nKTtcbnZhciBjaGFubmVsID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsJykoKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xuXG52YXIgU0xPVCA9IHtcblx0YXNzZXJ0OiBmdW5jdGlvbiAoTywgc2xvdCkge1xuXHRcdGlmICghTyB8fCAodHlwZW9mIE8gIT09ICdvYmplY3QnICYmIHR5cGVvZiBPICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BPYCBpcyBub3QgYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2Ygc2xvdCAhPT0gJ3N0cmluZycpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgc2xvdGAgbXVzdCBiZSBhIHN0cmluZycpO1xuXHRcdH1cblx0XHRjaGFubmVsLmFzc2VydChPKTtcblx0XHRpZiAoIVNMT1QuaGFzKE8sIHNsb3QpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYCcgKyBzbG90ICsgJ2AgaXMgbm90IHByZXNlbnQgb24gYE9gJyk7XG5cdFx0fVxuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uIChPLCBzbG90KSB7XG5cdFx0aWYgKCFPIHx8ICh0eXBlb2YgTyAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIE8gIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYE9gIGlzIG5vdCBhbiBvYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBzbG90ICE9PSAnc3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BzbG90YCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cdFx0fVxuXHRcdHZhciBzbG90cyA9IGNoYW5uZWwuZ2V0KE8pO1xuXHRcdHJldHVybiBzbG90cyAmJiBzbG90c1snJCcgKyBzbG90XTtcblx0fSxcblx0aGFzOiBmdW5jdGlvbiAoTywgc2xvdCkge1xuXHRcdGlmICghTyB8fCAodHlwZW9mIE8gIT09ICdvYmplY3QnICYmIHR5cGVvZiBPICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BPYCBpcyBub3QgYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2Ygc2xvdCAhPT0gJ3N0cmluZycpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgc2xvdGAgbXVzdCBiZSBhIHN0cmluZycpO1xuXHRcdH1cblx0XHR2YXIgc2xvdHMgPSBjaGFubmVsLmdldChPKTtcblx0XHRyZXR1cm4gISFzbG90cyAmJiBoYXNPd24oc2xvdHMsICckJyArIHNsb3QpO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uIChPLCBzbG90LCBWKSB7XG5cdFx0aWYgKCFPIHx8ICh0eXBlb2YgTyAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIE8gIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYE9gIGlzIG5vdCBhbiBvYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBzbG90ICE9PSAnc3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BzbG90YCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cdFx0fVxuXHRcdHZhciBzbG90cyA9IGNoYW5uZWwuZ2V0KE8pO1xuXHRcdGlmICghc2xvdHMpIHtcblx0XHRcdHNsb3RzID0ge307XG5cdFx0XHRjaGFubmVsLnNldChPLCBzbG90cyk7XG5cdFx0fVxuXHRcdHNsb3RzWyckJyArIHNsb3RdID0gVjtcblx0fVxufTtcblxuaWYgKE9iamVjdC5mcmVlemUpIHtcblx0T2JqZWN0LmZyZWV6ZShTTE9UKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTTE9UO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFNMT1QgPSByZXF1aXJlKCdpbnRlcm5hbC1zbG90Jyk7XG5cbnZhciAkU3ludGF4RXJyb3IgPSBTeW50YXhFcnJvcjtcbnZhciAkU3RvcEl0ZXJhdGlvbiA9IHR5cGVvZiBTdG9wSXRlcmF0aW9uID09PSAnb2JqZWN0JyA/IFN0b3BJdGVyYXRpb24gOiBudWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFN0b3BJdGVyYXRpb25JdGVyYXRvcihvcmlnSXRlcmF0b3IpIHtcblx0aWYgKCEkU3RvcEl0ZXJhdGlvbikge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3RoaXMgZW52aXJvbm1lbnQgbGFja3MgU3RvcEl0ZXJhdGlvbicpO1xuXHR9XG5cblx0U0xPVC5zZXQob3JpZ0l0ZXJhdG9yLCAnW1tEb25lXV0nLCBmYWxzZSk7XG5cblx0dmFyIHNpSXRlcmF0b3IgPSB7XG5cdFx0bmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0XHRcdHZhciBpdGVyYXRvciA9IFNMT1QuZ2V0KHRoaXMsICdbW0l0ZXJhdG9yXV0nKTtcblx0XHRcdHZhciBkb25lID0gU0xPVC5nZXQoaXRlcmF0b3IsICdbW0RvbmVdXScpO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRkb25lOiBkb25lLFxuXHRcdFx0XHRcdHZhbHVlOiBkb25lID8gdm9pZCB1bmRlZmluZWQgOiBpdGVyYXRvci5uZXh0KClcblx0XHRcdFx0fTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0U0xPVC5zZXQoaXRlcmF0b3IsICdbW0RvbmVdXScsIHRydWUpO1xuXHRcdFx0XHRpZiAoZSAhPT0gJFN0b3BJdGVyYXRpb24pIHtcblx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZG9uZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogdm9pZCB1bmRlZmluZWRcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0U0xPVC5zZXQoc2lJdGVyYXRvciwgJ1tbSXRlcmF0b3JdXScsIG9yaWdJdGVyYXRvcik7XG5cblx0cmV0dXJuIHNpSXRlcmF0b3I7XG59O1xuIiwgInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHN0clZhbHVlID0gU3RyaW5nLnByb3RvdHlwZS52YWx1ZU9mO1xudmFyIHRyeVN0cmluZ09iamVjdCA9IGZ1bmN0aW9uIHRyeVN0cmluZ09iamVjdCh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdHN0clZhbHVlLmNhbGwodmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBzdHJDbGFzcyA9ICdbb2JqZWN0IFN0cmluZ10nO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiBoYXNUb1N0cmluZ1RhZyA/IHRyeVN0cmluZ09iamVjdCh2YWx1ZSkgOiB0b1N0ci5jYWxsKHZhbHVlKSA9PT0gc3RyQ2xhc3M7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEBjb25zdCAqL1xudmFyICRNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIE1hcC5wcm90b3R5cGUgPyBNYXAgOiBudWxsO1xudmFyICRTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIFNldC5wcm90b3R5cGUgPyBTZXQgOiBudWxsO1xuXG52YXIgZXhwb3J0ZWQ7XG5cbmlmICghJE1hcCkge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0ZXhwb3J0ZWQgPSBmdW5jdGlvbiBpc01hcCh4KSB7XG5cdFx0Ly8gYE1hcGAgaXMgbm90IHByZXNlbnQgaW4gdGhpcyBlbnZpcm9ubWVudC5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbnZhciAkbWFwSGFzID0gJE1hcCA/IE1hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciAkc2V0SGFzID0gJFNldCA/IFNldC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbmlmICghZXhwb3J0ZWQgJiYgISRtYXBIYXMpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdGV4cG9ydGVkID0gZnVuY3Rpb24gaXNNYXAoeCkge1xuXHRcdC8vIGBNYXBgIGRvZXMgbm90IGhhdmUgYSBgaGFzYCBtZXRob2Rcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydGVkIHx8IGZ1bmN0aW9uIGlzTWFwKHgpIHtcblx0aWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHR0cnkge1xuXHRcdCRtYXBIYXMuY2FsbCh4KTtcblx0XHRpZiAoJHNldEhhcykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0JHNldEhhcy5jYWxsKHgpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBmaWd1cmUgb3V0IHRoYXQgJE1hcCBpcyBhbHdheXMgdHJ1dGh5IGhlcmVcblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mICRNYXA7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuXHR9IGNhdGNoIChlKSB7fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyICRNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIE1hcC5wcm90b3R5cGUgPyBNYXAgOiBudWxsO1xudmFyICRTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIFNldC5wcm90b3R5cGUgPyBTZXQgOiBudWxsO1xuXG52YXIgZXhwb3J0ZWQ7XG5cbmlmICghJFNldCkge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0ZXhwb3J0ZWQgPSBmdW5jdGlvbiBpc1NldCh4KSB7XG5cdFx0Ly8gYFNldGAgaXMgbm90IHByZXNlbnQgaW4gdGhpcyBlbnZpcm9ubWVudC5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbnZhciAkbWFwSGFzID0gJE1hcCA/IE1hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciAkc2V0SGFzID0gJFNldCA/IFNldC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbmlmICghZXhwb3J0ZWQgJiYgISRzZXRIYXMpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdGV4cG9ydGVkID0gZnVuY3Rpb24gaXNTZXQoeCkge1xuXHRcdC8vIGBTZXRgIGRvZXMgbm90IGhhdmUgYSBgaGFzYCBtZXRob2Rcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydGVkIHx8IGZ1bmN0aW9uIGlzU2V0KHgpIHtcblx0aWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHR0cnkge1xuXHRcdCRzZXRIYXMuY2FsbCh4KTtcblx0XHRpZiAoJG1hcEhhcykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0JG1hcEhhcy5jYWxsKHgpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBmaWd1cmUgb3V0IHRoYXQgJFNldCBpcyBhbHdheXMgdHJ1dGh5IGhlcmVcblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mICRTZXQ7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuXHR9IGNhdGNoIChlKSB7fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IGdsb2JhbC1yZXF1aXJlOiAwICovXG4vLyB0aGUgY29kZSBpcyBzdHJ1Y3R1cmVkIHRoaXMgd2F5IHNvIHRoYXQgYnVuZGxlcnMgY2FuXG4vLyBhbGlhcyBvdXQgYGhhcy1zeW1ib2xzYCB0byBgKCkgPT4gdHJ1ZWAgb3IgYCgpID0+IGZhbHNlYCBpZiB5b3VyIHRhcmdldFxuLy8gZW52aXJvbm1lbnRzJyBTeW1ib2wgY2FwYWJpbGl0aWVzIGFyZSBrbm93biwgYW5kIHRoZW4gdXNlXG4vLyBkZWFkIGNvZGUgZWxpbWluYXRpb24gb24gdGhlIHJlc3Qgb2YgdGhpcyBtb2R1bGUuXG4vL1xuLy8gU2ltaWxhcmx5LCBgaXNhcnJheWAgY2FuIGJlIGFsaWFzZWQgdG8gYEFycmF5LmlzQXJyYXlgIGlmXG4vLyBhdmFpbGFibGUgaW4gYWxsIHRhcmdldCBlbnZpcm9ubWVudHMuXG5cbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJ2lzLWFyZ3VtZW50cycpO1xudmFyIGdldFN0b3BJdGVyYXRpb25JdGVyYXRvciA9IHJlcXVpcmUoJ3N0b3AtaXRlcmF0aW9uLWl0ZXJhdG9yJyk7XG5cbmlmIChyZXF1aXJlKCdoYXMtc3ltYm9scycpKCkgfHwgcmVxdWlyZSgnaGFzLXN5bWJvbHMvc2hhbXMnKSgpKSB7XG5cdHZhciAkaXRlcmF0b3IgPSBTeW1ib2wuaXRlcmF0b3I7XG5cdC8vIFN5bWJvbCBpcyBhdmFpbGFibGUgbmF0aXZlbHkgb3Igc2hhbW1lZFxuXHQvLyBuYXRpdmVseTpcblx0Ly8gIC0gQ2hyb21lID49IDM4XG5cdC8vICAtIEVkZ2UgMTItMTQ/LCBFZGdlID49IDE1IGZvciBzdXJlXG5cdC8vICAtIEZGID49IDM2XG5cdC8vICAtIFNhZmFyaSA+PSA5XG5cdC8vICAtIG5vZGUgPj0gMC4xMlxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldEl0ZXJhdG9yKGl0ZXJhYmxlKSB7XG5cdFx0Ly8gYWx0ZXJuYXRpdmVseSwgYGl0ZXJhYmxlWyRpdGVyYXRvcl0/LigpYFxuXHRcdGlmIChpdGVyYWJsZSAhPSBudWxsICYmIHR5cGVvZiBpdGVyYWJsZVskaXRlcmF0b3JdICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGl0ZXJhYmxlWyRpdGVyYXRvcl0oKTtcblx0XHR9XG5cdFx0aWYgKGlzQXJndW1lbnRzKGl0ZXJhYmxlKSkge1xuXHRcdFx0Ly8gYXJndW1lbnRzIG9iamVjdHMgbGFjayBTeW1ib2wuaXRlcmF0b3Jcblx0XHRcdC8vIC0gbm9kZSAwLjEyXG5cdFx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlWyRpdGVyYXRvcl0uY2FsbChpdGVyYWJsZSk7XG5cdFx0fVxuXHR9O1xufSBlbHNlIHtcblx0Ly8gU3ltYm9sIGlzIG5vdCBhdmFpbGFibGUsIG5hdGl2ZSBvciBzaGFtbWVkXG5cdHZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuXHR2YXIgaXNTdHJpbmcgPSByZXF1aXJlKCdpcy1zdHJpbmcnKTtcblx0dmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblx0dmFyICRNYXAgPSBHZXRJbnRyaW5zaWMoJyVNYXAlJywgdHJ1ZSk7XG5cdHZhciAkU2V0ID0gR2V0SW50cmluc2ljKCclU2V0JScsIHRydWUpO1xuXHR2YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xuXHR2YXIgJGFycmF5UHVzaCA9IGNhbGxCb3VuZCgnQXJyYXkucHJvdG90eXBlLnB1c2gnKTtcblx0dmFyICRjaGFyQ29kZUF0ID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLmNoYXJDb2RlQXQnKTtcblx0dmFyICRzdHJpbmdTbGljZSA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zbGljZScpO1xuXG5cdHZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSBmdW5jdGlvbiBhZHZhbmNlU3RyaW5nSW5kZXgoUywgaW5kZXgpIHtcblx0XHR2YXIgbGVuZ3RoID0gUy5sZW5ndGg7XG5cdFx0aWYgKChpbmRleCArIDEpID49IGxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGluZGV4ICsgMTtcblx0XHR9XG5cblx0XHR2YXIgZmlyc3QgPSAkY2hhckNvZGVBdChTLCBpbmRleCk7XG5cdFx0aWYgKGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHZhciBzZWNvbmQgPSAkY2hhckNvZGVBdChTLCBpbmRleCArIDEpO1xuXHRcdGlmIChzZWNvbmQgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBpbmRleCArIDI7XG5cdH07XG5cblx0dmFyIGdldEFycmF5SXRlcmF0b3IgPSBmdW5jdGlvbiBnZXRBcnJheUl0ZXJhdG9yKGFycmF5bGlrZSkge1xuXHRcdHZhciBpID0gMDtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0XHRcdFx0dmFyIGRvbmUgPSBpID49IGFycmF5bGlrZS5sZW5ndGg7XG5cdFx0XHRcdHZhciB2YWx1ZTtcblx0XHRcdFx0aWYgKCFkb25lKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBhcnJheWxpa2VbaV07XG5cdFx0XHRcdFx0aSArPSAxO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZG9uZTogZG9uZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdHZhciBnZXROb25Db2xsZWN0aW9uSXRlcmF0b3IgPSBmdW5jdGlvbiBnZXROb25Db2xsZWN0aW9uSXRlcmF0b3IoaXRlcmFibGUsIG5vUHJpbW9yZGlhbENvbGxlY3Rpb25zKSB7XG5cdFx0aWYgKGlzQXJyYXkoaXRlcmFibGUpIHx8IGlzQXJndW1lbnRzKGl0ZXJhYmxlKSkge1xuXHRcdFx0cmV0dXJuIGdldEFycmF5SXRlcmF0b3IoaXRlcmFibGUpO1xuXHRcdH1cblx0XHRpZiAoaXNTdHJpbmcoaXRlcmFibGUpKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuXHRcdFx0XHRcdHZhciBuZXh0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoaXRlcmFibGUsIGkpO1xuXHRcdFx0XHRcdHZhciB2YWx1ZSA9ICRzdHJpbmdTbGljZShpdGVyYWJsZSwgaSwgbmV4dEluZGV4KTtcblx0XHRcdFx0XHRpID0gbmV4dEluZGV4O1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRkb25lOiBuZXh0SW5kZXggPiBpdGVyYWJsZS5sZW5ndGgsXG5cdFx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIGVzNi1zaGltIGFuZCBlcy1zaGltcycgZXMtbWFwIHVzZSBhIHN0cmluZyBcIl9lczYtc2hpbSBpdGVyYXRvcl9cIiBwcm9wZXJ0eSBvbiBkaWZmZXJlbnQgaXRlcmFibGVzLCBzdWNoIGFzIE1hcEl0ZXJhdG9yLlxuXHRcdGlmIChub1ByaW1vcmRpYWxDb2xsZWN0aW9ucyAmJiB0eXBlb2YgaXRlcmFibGVbJ19lczYtc2hpbSBpdGVyYXRvcl8nXSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBpdGVyYWJsZVsnX2VzNi1zaGltIGl0ZXJhdG9yXyddKCk7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICghJE1hcCAmJiAhJFNldCkge1xuXHRcdC8vIHRoZSBvbmx5IGxhbmd1YWdlIGl0ZXJhYmxlcyBhcmUgQXJyYXksIFN0cmluZywgYXJndW1lbnRzXG5cdFx0Ly8gLSBTYWZhcmkgPD0gNi4wXG5cdFx0Ly8gLSBDaHJvbWUgPCAzOFxuXHRcdC8vIC0gbm9kZSA8IDAuMTJcblx0XHQvLyAtIEZGIDwgMTNcblx0XHQvLyAtIElFIDwgMTFcblx0XHQvLyAtIEVkZ2UgPCAxMVxuXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRJdGVyYXRvcihpdGVyYWJsZSkge1xuXHRcdFx0aWYgKGl0ZXJhYmxlICE9IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIGdldE5vbkNvbGxlY3Rpb25JdGVyYXRvcihpdGVyYWJsZSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHQvLyBlaXRoZXIgTWFwIG9yIFNldCBhcmUgYXZhaWxhYmxlLCBidXQgU3ltYm9sIGlzIG5vdFxuXHRcdC8vIC0gZXM2LXNoaW0gb24gYW4gRVM1IGJyb3dzZXJcblx0XHQvLyAtIFNhZmFyaSA2LjIgKG1heWJlIDYuMT8pXG5cdFx0Ly8gLSBGRiB2WzEzLCAzNilcblx0XHQvLyAtIElFIDExXG5cdFx0Ly8gLSBFZGdlIDExXG5cdFx0Ly8gLSBTYWZhcmkgdls2LCA5KVxuXG5cdFx0dmFyIGlzTWFwID0gcmVxdWlyZSgnaXMtbWFwJyk7XG5cdFx0dmFyIGlzU2V0ID0gcmVxdWlyZSgnaXMtc2V0Jyk7XG5cblx0XHQvLyBGaXJlZm94ID49IDI3LCBJRSAxMSwgU2FmYXJpIDYuMiAtIDksIEVkZ2UgMTEsIGVzNi1zaGltIGluIG9sZGVyIGVudnMsIGFsbCBoYXZlIGZvckVhY2hcblx0XHR2YXIgJG1hcEZvckVhY2ggPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuZm9yRWFjaCcsIHRydWUpO1xuXHRcdHZhciAkc2V0Rm9yRWFjaCA9IGNhbGxCb3VuZCgnU2V0LnByb3RvdHlwZS5mb3JFYWNoJywgdHJ1ZSk7XG5cdFx0aWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fCAhcHJvY2Vzcy52ZXJzaW9ucyB8fCAhcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSB7IC8vIFwiaWYgaXMgbm90IG5vZGVcIlxuXG5cdFx0XHQvLyBGaXJlZm94IDE3IC0gMjYgaGFzIGAuaXRlcmF0b3IoKWAsIHdob3NlIGl0ZXJhdG9yIGAubmV4dCgpYCBlaXRoZXJcblx0XHRcdC8vIHJldHVybnMgYSB2YWx1ZSwgb3IgdGhyb3dzIGEgU3RvcEl0ZXJhdGlvbiBvYmplY3QuIFRoZXNlIGJyb3dzZXJzXG5cdFx0XHQvLyBkbyBub3QgaGF2ZSBhbnkgb3RoZXIgbWVjaGFuaXNtIGZvciBpdGVyYXRpb24uXG5cdFx0XHR2YXIgJG1hcEl0ZXJhdG9yID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLml0ZXJhdG9yJywgdHJ1ZSk7XG5cdFx0XHR2YXIgJHNldEl0ZXJhdG9yID0gY2FsbEJvdW5kKCdTZXQucHJvdG90eXBlLml0ZXJhdG9yJywgdHJ1ZSk7XG5cdFx0fVxuXHRcdC8vIEZpcmVmb3ggMjctMzUsIGFuZCBzb21lIG9sZGVyIGVzNi1zaGltIHZlcnNpb25zLCB1c2UgYSBzdHJpbmcgXCJAQGl0ZXJhdG9yXCIgcHJvcGVydHlcblx0XHQvLyB0aGlzIHJldHVybnMgYSBwcm9wZXIgaXRlcmF0b3Igb2JqZWN0LCBzbyB3ZSBzaG91bGQgdXNlIGl0IGluc3RlYWQgb2YgZm9yRWFjaC5cblx0XHQvLyBuZXdlciBlczYtc2hpbSB2ZXJzaW9ucyB1c2UgYSBzdHJpbmcgXCJfZXM2LXNoaW0gaXRlcmF0b3JfXCIgcHJvcGVydHkuXG5cdFx0dmFyICRtYXBBdEF0SXRlcmF0b3IgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuQEBpdGVyYXRvcicsIHRydWUpIHx8IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5fZXM2LXNoaW0gaXRlcmF0b3JfJywgdHJ1ZSk7XG5cdFx0dmFyICRzZXRBdEF0SXRlcmF0b3IgPSBjYWxsQm91bmQoJ1NldC5wcm90b3R5cGUuQEBpdGVyYXRvcicsIHRydWUpIHx8IGNhbGxCb3VuZCgnU2V0LnByb3RvdHlwZS5fZXM2LXNoaW0gaXRlcmF0b3JfJywgdHJ1ZSk7XG5cblx0XHR2YXIgZ2V0Q29sbGVjdGlvbkl0ZXJhdG9yID0gZnVuY3Rpb24gZ2V0Q29sbGVjdGlvbkl0ZXJhdG9yKGl0ZXJhYmxlKSB7XG5cdFx0XHRpZiAoaXNNYXAoaXRlcmFibGUpKSB7XG5cdFx0XHRcdGlmICgkbWFwSXRlcmF0b3IpIHtcblx0XHRcdFx0XHRyZXR1cm4gZ2V0U3RvcEl0ZXJhdGlvbkl0ZXJhdG9yKCRtYXBJdGVyYXRvcihpdGVyYWJsZSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkbWFwQXRBdEl0ZXJhdG9yKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBBdEF0SXRlcmF0b3IoaXRlcmFibGUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkbWFwRm9yRWFjaCkge1xuXHRcdFx0XHRcdHZhciBlbnRyaWVzID0gW107XG5cdFx0XHRcdFx0JG1hcEZvckVhY2goaXRlcmFibGUsIGZ1bmN0aW9uICh2LCBrKSB7XG5cdFx0XHRcdFx0XHQkYXJyYXlQdXNoKGVudHJpZXMsIFtrLCB2XSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIGdldEFycmF5SXRlcmF0b3IoZW50cmllcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChpc1NldChpdGVyYWJsZSkpIHtcblx0XHRcdFx0aWYgKCRzZXRJdGVyYXRvcikge1xuXHRcdFx0XHRcdHJldHVybiBnZXRTdG9wSXRlcmF0aW9uSXRlcmF0b3IoJHNldEl0ZXJhdG9yKGl0ZXJhYmxlKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCRzZXRBdEF0SXRlcmF0b3IpIHtcblx0XHRcdFx0XHRyZXR1cm4gJHNldEF0QXRJdGVyYXRvcihpdGVyYWJsZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCRzZXRGb3JFYWNoKSB7XG5cdFx0XHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXHRcdFx0XHRcdCRzZXRGb3JFYWNoKGl0ZXJhYmxlLCBmdW5jdGlvbiAodikge1xuXHRcdFx0XHRcdFx0JGFycmF5UHVzaCh2YWx1ZXMsIHYpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBnZXRBcnJheUl0ZXJhdG9yKHZhbHVlcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRJdGVyYXRvcihpdGVyYWJsZSkge1xuXHRcdFx0cmV0dXJuIGdldENvbGxlY3Rpb25JdGVyYXRvcihpdGVyYWJsZSkgfHwgZ2V0Tm9uQ29sbGVjdGlvbkl0ZXJhdG9yKGl0ZXJhYmxlKTtcblx0XHR9O1xuXHR9XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbnVtYmVySXNOYU4gPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXMoYSwgYikge1xuXHRpZiAoYSA9PT0gMCAmJiBiID09PSAwKSB7XG5cdFx0cmV0dXJuIDEgLyBhID09PSAxIC8gYjtcblx0fVxuXHRpZiAoYSA9PT0gYikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdGlmIChudW1iZXJJc05hTihhKSAmJiBudW1iZXJJc05hTihiKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0cmV0dXJuIHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpbXBsZW1lbnRhdGlvbjtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltT2JqZWN0SXMoKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShPYmplY3QsIHsgaXM6IHBvbHlmaWxsIH0sIHtcblx0XHRpczogZnVuY3Rpb24gdGVzdE9iamVjdElzKCkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5pcyAhPT0gcG9seWZpbGw7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGNhbGxCaW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kJyk7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBzaGltID0gcmVxdWlyZSgnLi9zaGltJyk7XG5cbnZhciBwb2x5ZmlsbCA9IGNhbGxCaW5kKGdldFBvbHlmaWxsKCksIE9iamVjdCk7XG5cbmRlZmluZShwb2x5ZmlsbCwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9seWZpbGw7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgJEFycmF5QnVmZmVyID0gR2V0SW50cmluc2ljKCclQXJyYXlCdWZmZXIlJywgdHJ1ZSk7XG4vKiogQHR5cGUge3VuZGVmaW5lZCB8ICgocmVjZWl2ZXI6IEFycmF5QnVmZmVyKSA9PiBudW1iZXIpIHwgKChyZWNlaXZlcjogdW5rbm93bikgPT4gbmV2ZXIpfSAqL1xudmFyICRieXRlTGVuZ3RoID0gY2FsbEJvdW5kKCdBcnJheUJ1ZmZlci5wcm90b3R5cGUuYnl0ZUxlbmd0aCcsIHRydWUpO1xudmFyICR0b1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xuXG4vLyBpbiBub2RlIDAuMTAsIEFycmF5QnVmZmVycyBoYXZlIG5vIHByb3RvdHlwZSBtZXRob2RzLCBidXQgaGF2ZSBhbiBvd24gc2xvdC1jaGVja2luZyBgc2xpY2VgIG1ldGhvZFxudmFyIGFiU2xpY2UgPSAhISRBcnJheUJ1ZmZlciAmJiAhJGJ5dGVMZW5ndGggJiYgbmV3ICRBcnJheUJ1ZmZlcigwKS5zbGljZTtcbnZhciAkYWJTbGljZSA9ICEhYWJTbGljZSAmJiBjYWxsQmluZChhYlNsaWNlKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gJGJ5dGVMZW5ndGggfHwgJGFiU2xpY2Vcblx0PyBmdW5jdGlvbiBpc0FycmF5QnVmZmVyKG9iaikge1xuXHRcdGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoJGJ5dGVMZW5ndGgpIHtcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBubyBpZGVhIHdoeSBUUyBjYW4ndCBoYW5kbGUgdGhlIG92ZXJsb2FkXG5cdFx0XHRcdCRieXRlTGVuZ3RoKG9iaik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTIGNob29zZXMgbm90IHRvIHR5cGUtbmFycm93IGluc2lkZSBhIGNsb3N1cmVcblx0XHRcdFx0JGFiU2xpY2Uob2JqLCAwKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0OiAkQXJyYXlCdWZmZXJcblx0XHQvLyBpbiBub2RlIDAuOCwgQXJyYXlCdWZmZXJzIGhhdmUgbm8gcHJvdG90eXBlIG9yIG93biBtZXRob2RzLCBidXQgYWxzbyBubyBTeW1ib2wudG9TdHJpbmdUYWdcblx0XHQ/IGZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIob2JqKSB7XG5cdFx0XHRyZXR1cm4gJHRvU3RyaW5nKG9iaikgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG5cdFx0fVxuXHRcdDogZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcihvYmopIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0RGF5ID0gRGF0ZS5wcm90b3R5cGUuZ2V0RGF5O1xudmFyIHRyeURhdGVPYmplY3QgPSBmdW5jdGlvbiB0cnlEYXRlR2V0RGF5Q2FsbCh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGdldERheS5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRlXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGF0ZU9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gaGFzVG9TdHJpbmdUYWcgPyB0cnlEYXRlT2JqZWN0KHZhbHVlKSA6IHRvU3RyLmNhbGwodmFsdWUpID09PSBkYXRlQ2xhc3M7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG52YXIgaGFzO1xudmFyICRleGVjO1xudmFyIGlzUmVnZXhNYXJrZXI7XG52YXIgYmFkU3RyaW5naWZpZXI7XG5cbmlmIChoYXNUb1N0cmluZ1RhZykge1xuXHRoYXMgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHknKTtcblx0JGV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xuXHRpc1JlZ2V4TWFya2VyID0ge307XG5cblx0dmFyIHRocm93UmVnZXhNYXJrZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dGhyb3cgaXNSZWdleE1hcmtlcjtcblx0fTtcblx0YmFkU3RyaW5naWZpZXIgPSB7XG5cdFx0dG9TdHJpbmc6IHRocm93UmVnZXhNYXJrZXIsXG5cdFx0dmFsdWVPZjogdGhyb3dSZWdleE1hcmtlclxuXHR9O1xuXG5cdGlmICh0eXBlb2YgU3ltYm9sLnRvUHJpbWl0aXZlID09PSAnc3ltYm9sJykge1xuXHRcdGJhZFN0cmluZ2lmaWVyW1N5bWJvbC50b1ByaW1pdGl2ZV0gPSB0aHJvd1JlZ2V4TWFya2VyO1xuXHR9XG59XG5cbnZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciByZWdleENsYXNzID0gJ1tvYmplY3QgUmVnRXhwXSc7XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzVG9TdHJpbmdUYWdcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdD8gZnVuY3Rpb24gaXNSZWdleCh2YWx1ZSkge1xuXHRcdGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHZhciBkZXNjcmlwdG9yID0gZ09QRCh2YWx1ZSwgJ2xhc3RJbmRleCcpO1xuXHRcdHZhciBoYXNMYXN0SW5kZXhEYXRhUHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGhhcyhkZXNjcmlwdG9yLCAndmFsdWUnKTtcblx0XHRpZiAoIWhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHQkZXhlYyh2YWx1ZSwgYmFkU3RyaW5naWZpZXIpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiBlID09PSBpc1JlZ2V4TWFya2VyO1xuXHRcdH1cblx0fVxuXHQ6IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHtcblx0XHQvLyBJbiBvbGRlciBicm93c2VycywgdHlwZW9mIHJlZ2V4IGluY29ycmVjdGx5IHJldHVybnMgJ2Z1bmN0aW9uJ1xuXHRcdGlmICghdmFsdWUgfHwgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiAkdG9TdHJpbmcodmFsdWUpID09PSByZWdleENsYXNzO1xuXHR9O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcblxudmFyICRieXRlTGVuZ3RoID0gY2FsbEJvdW5kKCdTaGFyZWRBcnJheUJ1ZmZlci5wcm90b3R5cGUuYnl0ZUxlbmd0aCcsIHRydWUpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAkYnl0ZUxlbmd0aFxuXHQ/IGZ1bmN0aW9uIGlzU2hhcmVkQXJyYXlCdWZmZXIob2JqKSB7XG5cdFx0aWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdCRieXRlTGVuZ3RoKG9iaik7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdDogZnVuY3Rpb24gaXNTaGFyZWRBcnJheUJ1ZmZlcihvYmopIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBudW1Ub1N0ciA9IE51bWJlci5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgdHJ5TnVtYmVyT2JqZWN0ID0gZnVuY3Rpb24gdHJ5TnVtYmVyT2JqZWN0KHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0bnVtVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG51bUNsYXNzID0gJ1tvYmplY3QgTnVtYmVyXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzTnVtYmVyT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGhhc1RvU3RyaW5nVGFnID8gdHJ5TnVtYmVyT2JqZWN0KHZhbHVlKSA6IHRvU3RyLmNhbGwodmFsdWUpID09PSBudW1DbGFzcztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyICRib29sVG9TdHIgPSBjYWxsQm91bmQoJ0Jvb2xlYW4ucHJvdG90eXBlLnRvU3RyaW5nJyk7XG52YXIgJHRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG5cbnZhciB0cnlCb29sZWFuT2JqZWN0ID0gZnVuY3Rpb24gYm9vbGVhbkJyYW5kQ2hlY2sodmFsdWUpIHtcblx0dHJ5IHtcblx0XHQkYm9vbFRvU3RyKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbnZhciBib29sQ2xhc3MgPSAnW29iamVjdCBCb29sZWFuXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gaGFzVG9TdHJpbmdUYWcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlID8gdHJ5Qm9vbGVhbk9iamVjdCh2YWx1ZSkgOiAkdG9TdHJpbmcodmFsdWUpID09PSBib29sQ2xhc3M7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG5pZiAoaGFzU3ltYm9scykge1xuXHR2YXIgc3ltVG9TdHIgPSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nO1xuXHR2YXIgc3ltU3RyaW5nUmVnZXggPSAvXlN5bWJvbFxcKC4qXFwpJC87XG5cdHZhciBpc1N5bWJvbE9iamVjdCA9IGZ1bmN0aW9uIGlzUmVhbFN5bWJvbE9iamVjdCh2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUudmFsdWVPZigpICE9PSAnc3ltYm9sJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gc3ltU3RyaW5nUmVnZXgudGVzdChzeW1Ub1N0ci5jYWxsKHZhbHVlKSk7XG5cdH07XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHRvU3RyLmNhbGwodmFsdWUpICE9PSAnW29iamVjdCBTeW1ib2xdJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGlzU3ltYm9sT2JqZWN0KHZhbHVlKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xufSBlbHNlIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG5cdFx0Ly8gdGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFN5bWJvbHMuXG5cdFx0cmV0dXJuIGZhbHNlICYmIHZhbHVlO1xuXHR9O1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyICRCaWdJbnQgPSB0eXBlb2YgQmlnSW50ICE9PSAndW5kZWZpbmVkJyAmJiBCaWdJbnQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzTmF0aXZlQmlnSW50cygpIHtcblx0cmV0dXJuIHR5cGVvZiAkQmlnSW50ID09PSAnZnVuY3Rpb24nXG5cdFx0JiYgdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdCYmIHR5cGVvZiAkQmlnSW50KDQyKSA9PT0gJ2JpZ2ludCcgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cdFx0JiYgdHlwZW9mIEJpZ0ludCg0MikgPT09ICdiaWdpbnQnOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzQmlnSW50cyA9IHJlcXVpcmUoJ2hhcy1iaWdpbnRzJykoKTtcblxuaWYgKGhhc0JpZ0ludHMpIHtcblx0dmFyIGJpZ0ludFZhbHVlT2YgPSBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2Y7XG5cdHZhciB0cnlCaWdJbnQgPSBmdW5jdGlvbiB0cnlCaWdJbnRPYmplY3QodmFsdWUpIHtcblx0XHR0cnkge1xuXHRcdFx0YmlnSW50VmFsdWVPZi5jYWxsKHZhbHVlKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCaWdJbnQodmFsdWUpIHtcblx0XHRpZiAoXG5cdFx0XHR2YWx1ZSA9PT0gbnVsbFxuXHRcdFx0fHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJ1xuXHRcdFx0fHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbidcblx0XHRcdHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcblx0XHRcdHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcidcblx0XHRcdHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCdcblx0XHRcdHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyeUJpZ0ludCh2YWx1ZSk7XG5cdH07XG59IGVsc2Uge1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQmlnSW50KHZhbHVlKSB7XG5cdFx0cmV0dXJuIGZhbHNlICYmIHZhbHVlO1xuXHR9O1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzU3RyaW5nID0gcmVxdWlyZSgnaXMtc3RyaW5nJyk7XG52YXIgaXNOdW1iZXIgPSByZXF1aXJlKCdpcy1udW1iZXItb2JqZWN0Jyk7XG52YXIgaXNCb29sZWFuID0gcmVxdWlyZSgnaXMtYm9vbGVhbi1vYmplY3QnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJ2lzLXN5bWJvbCcpO1xudmFyIGlzQmlnSW50ID0gcmVxdWlyZSgnaXMtYmlnaW50Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3aGljaEJveGVkUHJpbWl0aXZlKHZhbHVlKSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKHZhbHVlID09IG51bGwgfHwgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcblx0XHRyZXR1cm4gJ1N0cmluZyc7XG5cdH1cblx0aWYgKGlzTnVtYmVyKHZhbHVlKSkge1xuXHRcdHJldHVybiAnTnVtYmVyJztcblx0fVxuXHRpZiAoaXNCb29sZWFuKHZhbHVlKSkge1xuXHRcdHJldHVybiAnQm9vbGVhbic7XG5cdH1cblx0aWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuXHRcdHJldHVybiAnU3ltYm9sJztcblx0fVxuXHRpZiAoaXNCaWdJbnQodmFsdWUpKSB7XG5cdFx0cmV0dXJuICdCaWdJbnQnO1xuXHR9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyICRXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgV2Vha01hcC5wcm90b3R5cGUgPyBXZWFrTWFwIDogbnVsbDtcbnZhciAkV2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nICYmIFdlYWtTZXQucHJvdG90eXBlID8gV2Vha1NldCA6IG51bGw7XG5cbnZhciBleHBvcnRlZDtcblxuaWYgKCEkV2Vha01hcCkge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0ZXhwb3J0ZWQgPSBmdW5jdGlvbiBpc1dlYWtNYXAoeCkge1xuXHRcdC8vIGBXZWFrTWFwYCBpcyBub3QgcHJlc2VudCBpbiB0aGlzIGVudmlyb25tZW50LlxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxudmFyICRtYXBIYXMgPSAkV2Vha01hcCA/ICRXZWFrTWFwLnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyICRzZXRIYXMgPSAkV2Vha1NldCA/ICRXZWFrU2V0LnByb3RvdHlwZS5oYXMgOiBudWxsO1xuaWYgKCFleHBvcnRlZCAmJiAhJG1hcEhhcykge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0ZXhwb3J0ZWQgPSBmdW5jdGlvbiBpc1dlYWtNYXAoeCkge1xuXHRcdC8vIGBXZWFrTWFwYCBkb2VzIG5vdCBoYXZlIGEgYGhhc2AgbWV0aG9kXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xufVxuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlZCB8fCBmdW5jdGlvbiBpc1dlYWtNYXAoeCkge1xuXHRpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHRyeSB7XG5cdFx0JG1hcEhhcy5jYWxsKHgsICRtYXBIYXMpO1xuXHRcdGlmICgkc2V0SGFzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQkc2V0SGFzLmNhbGwoeCwgJHNldEhhcyk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTIGNhbid0IGZpZ3VyZSBvdXQgdGhhdCAkV2Vha01hcCBpcyBhbHdheXMgdHJ1dGh5IGhlcmVcblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mICRXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12M1xuXHR9IGNhdGNoIChlKSB7fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG5cbnZhciAkV2Vha1NldCA9IEdldEludHJpbnNpYygnJVdlYWtTZXQlJywgdHJ1ZSk7XG5cbnZhciAkc2V0SGFzID0gY2FsbEJvdW5kKCdXZWFrU2V0LnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcblxuaWYgKCRzZXRIYXMpIHtcblx0dmFyICRtYXBIYXMgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xuXG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNXZWFrU2V0KHgpIHtcblx0XHRpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHQkc2V0SGFzKHgsICRzZXRIYXMpO1xuXHRcdFx0aWYgKCRtYXBIYXMpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHQkbWFwSGFzKHgsICRtYXBIYXMpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgY2FuJ3QgZmlndXJlIG91dCB0aGF0ICRXZWFrU2V0IGlzIGFsd2F5cyB0cnV0aHkgaGVyZVxuXHRcdFx0cmV0dXJuIHggaW5zdGFuY2VvZiAkV2Vha1NldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjNcblx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn0gZWxzZSB7XG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG5cdFx0Ly8gYFdlYWtTZXRgIGRvZXMgbm90IGV4aXN0LCBvciBkb2VzIG5vdCBoYXZlIGEgYGhhc2AgbWV0aG9kXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzTWFwID0gcmVxdWlyZSgnaXMtbWFwJyk7XG52YXIgaXNTZXQgPSByZXF1aXJlKCdpcy1zZXQnKTtcbnZhciBpc1dlYWtNYXAgPSByZXF1aXJlKCdpcy13ZWFrbWFwJyk7XG52YXIgaXNXZWFrU2V0ID0gcmVxdWlyZSgnaXMtd2Vha3NldCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3aGljaENvbGxlY3Rpb24oLyoqIEB0eXBlIHt1bmtub3dufSAqLyB2YWx1ZSkge1xuXHRpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuXHRcdGlmIChpc01hcCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiAnTWFwJztcblx0XHR9XG5cdFx0aWYgKGlzU2V0KHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuICdTZXQnO1xuXHRcdH1cblx0XHRpZiAoaXNXZWFrTWFwKHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuICdXZWFrTWFwJztcblx0XHR9XG5cdFx0aWYgKGlzV2Vha1NldCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiAnV2Vha1NldCc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZm5Ub1N0ciA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWZsZWN0QXBwbHkgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdCAhPT0gbnVsbCAmJiBSZWZsZWN0LmFwcGx5O1xudmFyIGJhZEFycmF5TGlrZTtcbnZhciBpc0NhbGxhYmxlTWFya2VyO1xuaWYgKHR5cGVvZiByZWZsZWN0QXBwbHkgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuXHR0cnkge1xuXHRcdGJhZEFycmF5TGlrZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2xlbmd0aCcsIHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBpc0NhbGxhYmxlTWFya2VyO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGlzQ2FsbGFibGVNYXJrZXIgPSB7fTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuXHRcdHJlZmxlY3RBcHBseShmdW5jdGlvbiAoKSB7IHRocm93IDQyOyB9LCBudWxsLCBiYWRBcnJheUxpa2UpO1xuXHR9IGNhdGNoIChfKSB7XG5cdFx0aWYgKF8gIT09IGlzQ2FsbGFibGVNYXJrZXIpIHtcblx0XHRcdHJlZmxlY3RBcHBseSA9IG51bGw7XG5cdFx0fVxuXHR9XG59IGVsc2Uge1xuXHRyZWZsZWN0QXBwbHkgPSBudWxsO1xufVxuXG52YXIgY29uc3RydWN0b3JSZWdleCA9IC9eXFxzKmNsYXNzXFxiLztcbnZhciBpc0VTNkNsYXNzRm4gPSBmdW5jdGlvbiBpc0VTNkNsYXNzRnVuY3Rpb24odmFsdWUpIHtcblx0dHJ5IHtcblx0XHR2YXIgZm5TdHIgPSBmblRvU3RyLmNhbGwodmFsdWUpO1xuXHRcdHJldHVybiBjb25zdHJ1Y3RvclJlZ2V4LnRlc3QoZm5TdHIpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlOyAvLyBub3QgYSBmdW5jdGlvblxuXHR9XG59O1xuXG52YXIgdHJ5RnVuY3Rpb25PYmplY3QgPSBmdW5jdGlvbiB0cnlGdW5jdGlvblRvU3RyKHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0aWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0Zm5Ub1N0ci5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgZGRhQ2xhc3MgPSAnW29iamVjdCBIVE1MQWxsQ29sbGVjdGlvbl0nOyAvLyBJRSAxMVxudmFyIGRkYUNsYXNzMiA9ICdbb2JqZWN0IEhUTUwgZG9jdW1lbnQuYWxsIGNsYXNzXSc7XG52YXIgZGRhQ2xhc3MzID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJzsgLy8gSUUgOS0xMFxudmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZzsgLy8gYmV0dGVyOiB1c2UgYGhhcy10b3N0cmluZ3RhZ2BcblxudmFyIGlzSUU2OCA9ICEoMCBpbiBbLF0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNwYXJzZS1hcnJheXMsIGNvbW1hLXNwYWNpbmdcblxudmFyIGlzRERBID0gZnVuY3Rpb24gaXNEb2N1bWVudERvdEFsbCgpIHsgcmV0dXJuIGZhbHNlOyB9O1xuaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ29iamVjdCcpIHtcblx0Ly8gRmlyZWZveCAzIGNhbm9uaWNhbGl6ZXMgRERBIHRvIHVuZGVmaW5lZCB3aGVuIGl0J3Mgbm90IGFjY2Vzc2VkIGRpcmVjdGx5XG5cdHZhciBhbGwgPSBkb2N1bWVudC5hbGw7XG5cdGlmICh0b1N0ci5jYWxsKGFsbCkgPT09IHRvU3RyLmNhbGwoZG9jdW1lbnQuYWxsKSkge1xuXHRcdGlzRERBID0gZnVuY3Rpb24gaXNEb2N1bWVudERvdEFsbCh2YWx1ZSkge1xuXHRcdFx0LyogZ2xvYmFscyBkb2N1bWVudDogZmFsc2UgKi9cblx0XHRcdC8vIGluIElFIDYtOCwgdHlwZW9mIGRvY3VtZW50LmFsbCBpcyBcIm9iamVjdFwiIGFuZCBpdCdzIHRydXRoeVxuXHRcdFx0aWYgKChpc0lFNjggfHwgIXZhbHVlKSAmJiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0c3RyID09PSBkZGFDbGFzc1xuXHRcdFx0XHRcdFx0fHwgc3RyID09PSBkZGFDbGFzczJcblx0XHRcdFx0XHRcdHx8IHN0ciA9PT0gZGRhQ2xhc3MzIC8vIG9wZXJhIDEyLjE2XG5cdFx0XHRcdFx0XHR8fCBzdHIgPT09IG9iamVjdENsYXNzIC8vIElFIDYtOFxuXHRcdFx0XHRcdCkgJiYgdmFsdWUoJycpID09IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZmxlY3RBcHBseVxuXHQ/IGZ1bmN0aW9uIGlzQ2FsbGFibGUodmFsdWUpIHtcblx0XHRpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0aWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0dHJ5IHtcblx0XHRcdHJlZmxlY3RBcHBseSh2YWx1ZSwgbnVsbCwgYmFkQXJyYXlMaWtlKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoZSAhPT0gaXNDYWxsYWJsZU1hcmtlcikgeyByZXR1cm4gZmFsc2U7IH1cblx0XHR9XG5cdFx0cmV0dXJuICFpc0VTNkNsYXNzRm4odmFsdWUpICYmIHRyeUZ1bmN0aW9uT2JqZWN0KHZhbHVlKTtcblx0fVxuXHQ6IGZ1bmN0aW9uIGlzQ2FsbGFibGUodmFsdWUpIHtcblx0XHRpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0aWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0aWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cblx0XHRpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHR2YXIgc3RyQ2xhc3MgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0XHRpZiAoc3RyQ2xhc3MgIT09IGZuQ2xhc3MgJiYgc3RyQ2xhc3MgIT09IGdlbkNsYXNzICYmICEoL15cXFtvYmplY3QgSFRNTC8pLnRlc3Qoc3RyQ2xhc3MpKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG5cdH07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJ2lzLWNhbGxhYmxlJyk7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZm9yRWFjaEFycmF5ID0gZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFycmF5LCBpdGVyYXRvciwgcmVjZWl2ZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksIGkpKSB7XG4gICAgICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycmF5W2ldLCBpLCBhcnJheSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwocmVjZWl2ZXIsIGFycmF5W2ldLCBpLCBhcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgZm9yRWFjaFN0cmluZyA9IGZ1bmN0aW9uIGZvckVhY2hTdHJpbmcoc3RyaW5nLCBpdGVyYXRvciwgcmVjZWl2ZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIC8vIG5vIHN1Y2ggdGhpbmcgYXMgYSBzcGFyc2Ugc3RyaW5nLlxuICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgaXRlcmF0b3Ioc3RyaW5nLmNoYXJBdChpKSwgaSwgc3RyaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwocmVjZWl2ZXIsIHN0cmluZy5jaGFyQXQoaSksIGksIHN0cmluZyk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgZm9yRWFjaE9iamVjdCA9IGZ1bmN0aW9uIGZvckVhY2hPYmplY3Qob2JqZWN0LCBpdGVyYXRvciwgcmVjZWl2ZXIpIHtcbiAgICBmb3IgKHZhciBrIGluIG9iamVjdCkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGspKSB7XG4gICAgICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG9iamVjdFtrXSwgaywgb2JqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChyZWNlaXZlciwgb2JqZWN0W2tdLCBrLCBvYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoKGxpc3QsIGl0ZXJhdG9yLCB0aGlzQXJnKSB7XG4gICAgaWYgKCFpc0NhbGxhYmxlKGl0ZXJhdG9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpdGVyYXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICB2YXIgcmVjZWl2ZXI7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykge1xuICAgICAgICByZWNlaXZlciA9IHRoaXNBcmc7XG4gICAgfVxuXG4gICAgaWYgKHRvU3RyLmNhbGwobGlzdCkgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgICAgZm9yRWFjaEFycmF5KGxpc3QsIGl0ZXJhdG9yLCByZWNlaXZlcik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZm9yRWFjaFN0cmluZyhsaXN0LCBpdGVyYXRvciwgcmVjZWl2ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvckVhY2hPYmplY3QobGlzdCwgaXRlcmF0b3IsIHJlY2VpdmVyKTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2g7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBbXG5cdCdGbG9hdDMyQXJyYXknLFxuXHQnRmxvYXQ2NEFycmF5Jyxcblx0J0ludDhBcnJheScsXG5cdCdJbnQxNkFycmF5Jyxcblx0J0ludDMyQXJyYXknLFxuXHQnVWludDhBcnJheScsXG5cdCdVaW50OENsYW1wZWRBcnJheScsXG5cdCdVaW50MTZBcnJheScsXG5cdCdVaW50MzJBcnJheScsXG5cdCdCaWdJbnQ2NEFycmF5Jyxcblx0J0JpZ1VpbnQ2NEFycmF5J1xuXTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBwb3NzaWJsZU5hbWVzID0gcmVxdWlyZSgncG9zc2libGUtdHlwZWQtYXJyYXktbmFtZXMnKTtcblxudmFyIGcgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBnbG9iYWxUaGlzO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhdmFpbGFibGVUeXBlZEFycmF5cygpIHtcblx0dmFyIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgYXZhaWxhYmxlVHlwZWRBcnJheXM+fSAqLyBvdXQgPSBbXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwb3NzaWJsZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHR5cGVvZiBnW3Bvc3NpYmxlTmFtZXNbaV1dID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yXG5cdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSBwb3NzaWJsZU5hbWVzW2ldO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3V0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnZm9yLWVhY2gnKTtcbnZhciBhdmFpbGFibGVUeXBlZEFycmF5cyA9IHJlcXVpcmUoJ2F2YWlsYWJsZS10eXBlZC1hcnJheXMnKTtcbnZhciBjYWxsQmluZCA9IHJlcXVpcmUoJ2NhbGwtYmluZCcpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZ29wZCcpO1xuXG4vKiogQHR5cGUgeyhPOiBvYmplY3QpID0+IHN0cmluZ30gKi9cbnZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG5cbnZhciBnID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogZ2xvYmFsVGhpcztcbnZhciB0eXBlZEFycmF5cyA9IGF2YWlsYWJsZVR5cGVkQXJyYXlzKCk7XG5cbnZhciAkc2xpY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUuc2xpY2UnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsgLy8gcmVxdWlyZSgnZ2V0cHJvdG90eXBlb2YnKTtcblxuLyoqIEB0eXBlIHs8VCA9IHVua25vd24+KGFycmF5OiByZWFkb25seSBUW10sIHZhbHVlOiB1bmtub3duKSA9PiBudW1iZXJ9ICovXG52YXIgJGluZGV4T2YgPSBjYWxsQm91bmQoJ0FycmF5LnByb3RvdHlwZS5pbmRleE9mJywgdHJ1ZSkgfHwgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHtcblx0XHRcdHJldHVybiBpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gLTE7XG59O1xuXG4vKiogQHR5cGVkZWYgeyhyZWNlaXZlcjogaW1wb3J0KCcuJykuVHlwZWRBcnJheSkgPT4gc3RyaW5nIHwgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwgfCB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGx9IEdldHRlciAqL1xuLyoqIEB0eXBlIHt7IFtrIGluIGBcXCQke2ltcG9ydCgnLicpLlR5cGVkQXJyYXlOYW1lfWBdPzogR2V0dGVyIH0gJiB7IF9fcHJvdG9fXzogbnVsbCB9fSAqL1xudmFyIGNhY2hlID0geyBfX3Byb3RvX186IG51bGwgfTtcbmlmIChoYXNUb1N0cmluZ1RhZyAmJiBnT1BEICYmIGdldFByb3RvdHlwZU9mKSB7XG5cdGZvckVhY2godHlwZWRBcnJheXMsIGZ1bmN0aW9uICh0eXBlZEFycmF5KSB7XG5cdFx0dmFyIGFyciA9IG5ldyBnW3R5cGVkQXJyYXldKCk7XG5cdFx0aWYgKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBhcnIpIHtcblx0XHRcdHZhciBwcm90byA9IGdldFByb3RvdHlwZU9mKGFycik7XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTIHdvbid0IG5hcnJvdyBpbnNpZGUgYSBjbG9zdXJlXG5cdFx0XHR2YXIgZGVzY3JpcHRvciA9IGdPUEQocHJvdG8sIFN5bWJvbC50b1N0cmluZ1RhZyk7XG5cdFx0XHRpZiAoIWRlc2NyaXB0b3IpIHtcblx0XHRcdFx0dmFyIHN1cGVyUHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgd29uJ3QgbmFycm93IGluc2lkZSBhIGNsb3N1cmVcblx0XHRcdFx0ZGVzY3JpcHRvciA9IGdPUEQoc3VwZXJQcm90bywgU3ltYm9sLnRvU3RyaW5nVGFnKTtcblx0XHRcdH1cblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogZml4XG5cdFx0XHRjYWNoZVsnJCcgKyB0eXBlZEFycmF5XSA9IGNhbGxCaW5kKGRlc2NyaXB0b3IuZ2V0KTtcblx0XHR9XG5cdH0pO1xufSBlbHNlIHtcblx0Zm9yRWFjaCh0eXBlZEFycmF5cywgZnVuY3Rpb24gKHR5cGVkQXJyYXkpIHtcblx0XHR2YXIgYXJyID0gbmV3IGdbdHlwZWRBcnJheV0oKTtcblx0XHR2YXIgZm4gPSBhcnIuc2xpY2UgfHwgYXJyLnNldDtcblx0XHRpZiAoZm4pIHtcblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogZml4XG5cdFx0XHRjYWNoZVsnJCcgKyB0eXBlZEFycmF5XSA9IGNhbGxCaW5kKGZuKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vKiogQHR5cGUgeyh2YWx1ZTogb2JqZWN0KSA9PiBmYWxzZSB8IGltcG9ydCgnLicpLlR5cGVkQXJyYXlOYW1lfSAqL1xudmFyIHRyeVR5cGVkQXJyYXlzID0gZnVuY3Rpb24gdHJ5QWxsVHlwZWRBcnJheXModmFsdWUpIHtcblx0LyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiB0cnlBbGxUeXBlZEFycmF5cz59ICovIHZhciBmb3VuZCA9IGZhbHNlO1xuXHRmb3JFYWNoKFxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblx0XHQvKiogQHR5cGUge1JlY29yZDxgXFwkJHtUeXBlZEFycmF5TmFtZX1gLCBHZXR0ZXI+fSAqLyAvKiogQHR5cGUge2FueX0gKi8gKGNhY2hlKSxcblx0XHQvKiogQHR5cGUgeyhnZXR0ZXI6IEdldHRlciwgbmFtZTogYFxcJCR7aW1wb3J0KCcuJykuVHlwZWRBcnJheU5hbWV9YCkgPT4gdm9pZH0gKi9cblx0XHRmdW5jdGlvbiAoZ2V0dGVyLCB0eXBlZEFycmF5KSB7XG5cdFx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogZml4XG5cdFx0XHRcdFx0aWYgKCckJyArIGdldHRlcih2YWx1ZSkgPT09IHR5cGVkQXJyYXkpIHtcblx0XHRcdFx0XHRcdGZvdW5kID0gJHNsaWNlKHR5cGVkQXJyYXksIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZSkgeyAvKiovIH1cblx0XHRcdH1cblx0XHR9XG5cdCk7XG5cdHJldHVybiBmb3VuZDtcbn07XG5cbi8qKiBAdHlwZSB7KHZhbHVlOiBvYmplY3QpID0+IGZhbHNlIHwgaW1wb3J0KCcuJykuVHlwZWRBcnJheU5hbWV9ICovXG52YXIgdHJ5U2xpY2VzID0gZnVuY3Rpb24gdHJ5QWxsU2xpY2VzKHZhbHVlKSB7XG5cdC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgdHJ5QWxsU2xpY2VzPn0gKi8gdmFyIGZvdW5kID0gZmFsc2U7XG5cdGZvckVhY2goXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdC8qKiBAdHlwZSB7UmVjb3JkPGBcXCQke1R5cGVkQXJyYXlOYW1lfWAsIEdldHRlcj59ICovIC8qKiBAdHlwZSB7YW55fSAqLyAoY2FjaGUpLFxuXHRcdC8qKiBAdHlwZSB7KGdldHRlcjogdHlwZW9mIGNhY2hlLCBuYW1lOiBgXFwkJHtpbXBvcnQoJy4nKS5UeXBlZEFycmF5TmFtZX1gKSA9PiB2b2lkfSAqLyBmdW5jdGlvbiAoZ2V0dGVyLCBuYW1lKSB7XG5cdFx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUT0RPOiBmaXhcblx0XHRcdFx0XHRnZXR0ZXIodmFsdWUpO1xuXHRcdFx0XHRcdGZvdW5kID0gJHNsaWNlKG5hbWUsIDEpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7IC8qKi8gfVxuXHRcdFx0fVxuXHRcdH1cblx0KTtcblx0cmV0dXJuIGZvdW5kO1xufTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSB7XG5cdGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKCFoYXNUb1N0cmluZ1RhZykge1xuXHRcdC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXHRcdHZhciB0YWcgPSAkc2xpY2UoJHRvU3RyaW5nKHZhbHVlKSwgOCwgLTEpO1xuXHRcdGlmICgkaW5kZXhPZih0eXBlZEFycmF5cywgdGFnKSA+IC0xKSB7XG5cdFx0XHRyZXR1cm4gdGFnO1xuXHRcdH1cblx0XHRpZiAodGFnICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvLyBub2RlIDwgMC42IGhpdHMgaGVyZSBvbiByZWFsIFR5cGVkIEFycmF5c1xuXHRcdHJldHVybiB0cnlTbGljZXModmFsdWUpO1xuXHR9XG5cdGlmICghZ09QRCkgeyByZXR1cm4gbnVsbDsgfSAvLyB1bmtub3duIGVuZ2luZVxuXHRyZXR1cm4gdHJ5VHlwZWRBcnJheXModmFsdWUpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgJGJ5dGVMZW5ndGggPSBjYWxsQm91bmQoJ0FycmF5QnVmZmVyLnByb3RvdHlwZS5ieXRlTGVuZ3RoJywgdHJ1ZSk7XG5cbnZhciBpc0FycmF5QnVmZmVyID0gcmVxdWlyZSgnaXMtYXJyYXktYnVmZmVyJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJ5dGVMZW5ndGgoYWIpIHtcblx0aWYgKCFpc0FycmF5QnVmZmVyKGFiKSkge1xuXHRcdHJldHVybiBOYU47XG5cdH1cblx0cmV0dXJuICRieXRlTGVuZ3RoID8gJGJ5dGVMZW5ndGgoYWIpIDogYWIuYnl0ZUxlbmd0aDtcbn07IC8vIGluIG5vZGUgPCAwLjExLCBieXRlTGVuZ3RoIGlzIGFuIG93biBub25jb25maWd1cmFibGUgcHJvcGVydHlcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gPSByZXF1aXJlKCdvYmplY3QuYXNzaWduJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGZsYWdzID0gcmVxdWlyZSgncmVnZXhwLnByb3RvdHlwZS5mbGFncycpO1xudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBnZXRJdGVyYXRvciA9IHJlcXVpcmUoJ2VzLWdldC1pdGVyYXRvcicpO1xudmFyIGdldFNpZGVDaGFubmVsID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsJyk7XG52YXIgaXMgPSByZXF1aXJlKCdvYmplY3QtaXMnKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJ2lzLWFyZ3VtZW50cycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG52YXIgaXNBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJ2lzLWFycmF5LWJ1ZmZlcicpO1xudmFyIGlzRGF0ZSA9IHJlcXVpcmUoJ2lzLWRhdGUtb2JqZWN0Jyk7XG52YXIgaXNSZWdleCA9IHJlcXVpcmUoJ2lzLXJlZ2V4Jyk7XG52YXIgaXNTaGFyZWRBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJ2lzLXNoYXJlZC1hcnJheS1idWZmZXInKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKTtcbnZhciB3aGljaEJveGVkUHJpbWl0aXZlID0gcmVxdWlyZSgnd2hpY2gtYm94ZWQtcHJpbWl0aXZlJyk7XG52YXIgd2hpY2hDb2xsZWN0aW9uID0gcmVxdWlyZSgnd2hpY2gtY29sbGVjdGlvbicpO1xudmFyIHdoaWNoVHlwZWRBcnJheSA9IHJlcXVpcmUoJ3doaWNoLXR5cGVkLWFycmF5Jyk7XG52YXIgYnl0ZUxlbmd0aCA9IHJlcXVpcmUoJ2FycmF5LWJ1ZmZlci1ieXRlLWxlbmd0aCcpO1xuXG52YXIgc2FiQnl0ZUxlbmd0aCA9IGNhbGxCb3VuZCgnU2hhcmVkQXJyYXlCdWZmZXIucHJvdG90eXBlLmJ5dGVMZW5ndGgnLCB0cnVlKTtcblxudmFyICRnZXRUaW1lID0gY2FsbEJvdW5kKCdEYXRlLnByb3RvdHlwZS5nZXRUaW1lJyk7XG52YXIgZ1BPID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyICRvYmpUb1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xuXG52YXIgJFNldCA9IEdldEludHJpbnNpYygnJVNldCUnLCB0cnVlKTtcbnZhciAkbWFwSGFzID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xudmFyICRtYXBHZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG52YXIgJG1hcFNpemUgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuc2l6ZScsIHRydWUpO1xudmFyICRzZXRBZGQgPSBjYWxsQm91bmQoJ1NldC5wcm90b3R5cGUuYWRkJywgdHJ1ZSk7XG52YXIgJHNldERlbGV0ZSA9IGNhbGxCb3VuZCgnU2V0LnByb3RvdHlwZS5kZWxldGUnLCB0cnVlKTtcbnZhciAkc2V0SGFzID0gY2FsbEJvdW5kKCdTZXQucHJvdG90eXBlLmhhcycsIHRydWUpO1xudmFyICRzZXRTaXplID0gY2FsbEJvdW5kKCdTZXQucHJvdG90eXBlLnNpemUnLCB0cnVlKTtcblxuLy8gdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcmlmeS9jb21tb25qcy1hc3NlcnQvYmxvYi9iYmE4MzhlOWJhOWUyOGVkZjMxMjdjZTY5NzQ2MjQyMDg1MDJmNmJjL2ludGVybmFsL3V0aWwvY29tcGFyaXNvbnMuanMjTDQwMS1MNDE0XG5mdW5jdGlvbiBzZXRIYXNFcXVhbEVsZW1lbnQoc2V0LCB2YWwxLCBvcHRzLCBjaGFubmVsKSB7XG4gIHZhciBpID0gZ2V0SXRlcmF0b3Ioc2V0KTtcbiAgdmFyIHJlc3VsdDtcbiAgd2hpbGUgKChyZXN1bHQgPSBpLm5leHQoKSkgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAgaWYgKGludGVybmFsRGVlcEVxdWFsKHZhbDEsIHJlc3VsdC52YWx1ZSwgb3B0cywgY2hhbm5lbCkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgLy8gUmVtb3ZlIHRoZSBtYXRjaGluZyBlbGVtZW50IHRvIG1ha2Ugc3VyZSB3ZSBkbyBub3QgY2hlY2sgdGhhdCBhZ2Fpbi5cbiAgICAgICRzZXREZWxldGUoc2V0LCByZXN1bHQudmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9icm93c2VyaWZ5L2NvbW1vbmpzLWFzc2VydC9ibG9iL2JiYTgzOGU5YmE5ZTI4ZWRmMzEyN2NlNjk3NDYyNDIwODUwMmY2YmMvaW50ZXJuYWwvdXRpbC9jb21wYXJpc29ucy5qcyNMNDE2LUw0MzlcbmZ1bmN0aW9uIGZpbmRMb29zZU1hdGNoaW5nUHJpbWl0aXZlcyhwcmltKSB7XG4gIGlmICh0eXBlb2YgcHJpbSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIHByaW0gPT09ICdvYmplY3QnKSB7IC8vIE9ubHkgcGFzcyBpbiBudWxsIGFzIG9iamVjdCFcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlmICh0eXBlb2YgcHJpbSA9PT0gJ3N5bWJvbCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmltID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJpbSA9PT0gJ251bWJlcicpIHtcbiAgICAvLyBMb29zZSBlcXVhbCBlbnRyaWVzIGV4aXN0IG9ubHkgaWYgdGhlIHN0cmluZyBpcyBwb3NzaWJsZSB0byBjb252ZXJ0IHRvIGEgcmVndWxhciBudW1iZXIgYW5kIG5vdCBOYU4uXG4gICAgcmV0dXJuICtwcmltID09PSArcHJpbTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1pbXBsaWNpdC1jb2VyY2lvblxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9icm93c2VyaWZ5L2NvbW1vbmpzLWFzc2VydC9ibG9iL2JiYTgzOGU5YmE5ZTI4ZWRmMzEyN2NlNjk3NDYyNDIwODUwMmY2YmMvaW50ZXJuYWwvdXRpbC9jb21wYXJpc29ucy5qcyNMNDQ5LUw0NjBcbmZ1bmN0aW9uIG1hcE1pZ2h0SGF2ZUxvb3NlUHJpbShhLCBiLCBwcmltLCBpdGVtLCBvcHRzLCBjaGFubmVsKSB7XG4gIHZhciBhbHRWYWx1ZSA9IGZpbmRMb29zZU1hdGNoaW5nUHJpbWl0aXZlcyhwcmltKTtcbiAgaWYgKGFsdFZhbHVlICE9IG51bGwpIHtcbiAgICByZXR1cm4gYWx0VmFsdWU7XG4gIH1cbiAgdmFyIGN1ckIgPSAkbWFwR2V0KGIsIGFsdFZhbHVlKTtcbiAgdmFyIGxvb3NlT3B0cyA9IGFzc2lnbih7fSwgb3B0cywgeyBzdHJpY3Q6IGZhbHNlIH0pO1xuICBpZiAoXG4gICAgKHR5cGVvZiBjdXJCID09PSAndW5kZWZpbmVkJyAmJiAhJG1hcEhhcyhiLCBhbHRWYWx1ZSkpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgfHwgIWludGVybmFsRGVlcEVxdWFsKGl0ZW0sIGN1ckIsIGxvb3NlT3B0cywgY2hhbm5lbClcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICByZXR1cm4gISRtYXBIYXMoYSwgYWx0VmFsdWUpICYmIGludGVybmFsRGVlcEVxdWFsKGl0ZW0sIGN1ckIsIGxvb3NlT3B0cywgY2hhbm5lbCk7XG59XG5cbi8vIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJpZnkvY29tbW9uanMtYXNzZXJ0L2Jsb2IvYmJhODM4ZTliYTllMjhlZGYzMTI3Y2U2OTc0NjI0MjA4NTAyZjZiYy9pbnRlcm5hbC91dGlsL2NvbXBhcmlzb25zLmpzI0w0NDEtTDQ0N1xuZnVuY3Rpb24gc2V0TWlnaHRIYXZlTG9vc2VQcmltKGEsIGIsIHByaW0pIHtcbiAgdmFyIGFsdFZhbHVlID0gZmluZExvb3NlTWF0Y2hpbmdQcmltaXRpdmVzKHByaW0pO1xuICBpZiAoYWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIHJldHVybiBhbHRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiAkc2V0SGFzKGIsIGFsdFZhbHVlKSAmJiAhJHNldEhhcyhhLCBhbHRWYWx1ZSk7XG59XG5cbi8vIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJpZnkvY29tbW9uanMtYXNzZXJ0L2Jsb2IvYmJhODM4ZTliYTllMjhlZGYzMTI3Y2U2OTc0NjI0MjA4NTAyZjZiYy9pbnRlcm5hbC91dGlsL2NvbXBhcmlzb25zLmpzI0w1MTgtTDUzM1xuZnVuY3Rpb24gbWFwSGFzRXF1YWxFbnRyeShzZXQsIG1hcCwga2V5MSwgaXRlbTEsIG9wdHMsIGNoYW5uZWwpIHtcbiAgdmFyIGkgPSBnZXRJdGVyYXRvcihzZXQpO1xuICB2YXIgcmVzdWx0O1xuICB2YXIga2V5MjtcbiAgd2hpbGUgKChyZXN1bHQgPSBpLm5leHQoKSkgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAga2V5MiA9IHJlc3VsdC52YWx1ZTtcbiAgICBpZiAoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgIGludGVybmFsRGVlcEVxdWFsKGtleTEsIGtleTIsIG9wdHMsIGNoYW5uZWwpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICYmIGludGVybmFsRGVlcEVxdWFsKGl0ZW0xLCAkbWFwR2V0KG1hcCwga2V5MiksIG9wdHMsIGNoYW5uZWwpXG4gICAgKSB7XG4gICAgICAkc2V0RGVsZXRlKHNldCwga2V5Mik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGludGVybmFsRGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG9wdGlvbnMsIGNoYW5uZWwpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIDcuMS4gQWxsIGlkZW50aWNhbCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGRldGVybWluZWQgYnkgPT09LlxuICBpZiAob3B0cy5zdHJpY3QgPyBpcyhhY3R1YWwsIGV4cGVjdGVkKSA6IGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBhY3R1YWxCb3hlZCA9IHdoaWNoQm94ZWRQcmltaXRpdmUoYWN0dWFsKTtcbiAgdmFyIGV4cGVjdGVkQm94ZWQgPSB3aGljaEJveGVkUHJpbWl0aXZlKGV4cGVjdGVkKTtcbiAgaWYgKGFjdHVhbEJveGVkICE9PSBleHBlY3RlZEJveGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gNy4zLiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLCBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQgfHwgKHR5cGVvZiBhY3R1YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiBleHBlY3RlZCAhPT0gJ29iamVjdCcpKSB7XG4gICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gaXMoYWN0dWFsLCBleHBlY3RlZCkgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gIH1cblxuICAvKlxuICAgKiA3LjQuIEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgICogZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gICAqIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgICogKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAgKiBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAgKiBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgICovXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvY29tbWl0L2QzYWFmZDAyZWZkM2E0MDNkNjQ2YTMwNDRhZGNmMTRlNjNhODhkMzIgZm9yIG1lbW9zL2NoYW5uZWwgaW5zcGlyYXRpb25cblxuICB2YXIgaGFzQWN0dWFsID0gY2hhbm5lbC5oYXMoYWN0dWFsKTtcbiAgdmFyIGhhc0V4cGVjdGVkID0gY2hhbm5lbC5oYXMoZXhwZWN0ZWQpO1xuICB2YXIgc2VudGluZWw7XG4gIGlmIChoYXNBY3R1YWwgJiYgaGFzRXhwZWN0ZWQpIHtcbiAgICBpZiAoY2hhbm5lbC5nZXQoYWN0dWFsKSA9PT0gY2hhbm5lbC5nZXQoZXhwZWN0ZWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2VudGluZWwgPSB7fTtcbiAgfVxuICBpZiAoIWhhc0FjdHVhbCkgeyBjaGFubmVsLnNldChhY3R1YWwsIHNlbnRpbmVsKTsgfVxuICBpZiAoIWhhc0V4cGVjdGVkKSB7IGNoYW5uZWwuc2V0KGV4cGVjdGVkLCBzZW50aW5lbCk7IH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgcmV0dXJuIG9iakVxdWl2KGFjdHVhbCwgZXhwZWN0ZWQsIG9wdHMsIGNoYW5uZWwpO1xufVxuXG5mdW5jdGlvbiBpc0J1ZmZlcih4KSB7XG4gIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHgubGVuZ3RoICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHguY29weSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeC5zbGljZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPiAwICYmIHR5cGVvZiB4WzBdICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAhISh4LmNvbnN0cnVjdG9yICYmIHguY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgeC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih4KSk7XG59XG5cbmZ1bmN0aW9uIHNldEVxdWl2KGEsIGIsIG9wdHMsIGNoYW5uZWwpIHtcbiAgaWYgKCRzZXRTaXplKGEpICE9PSAkc2V0U2l6ZShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaUEgPSBnZXRJdGVyYXRvcihhKTtcbiAgdmFyIGlCID0gZ2V0SXRlcmF0b3IoYik7XG4gIHZhciByZXN1bHRBO1xuICB2YXIgcmVzdWx0QjtcbiAgdmFyIHNldDtcbiAgd2hpbGUgKChyZXN1bHRBID0gaUEubmV4dCgpKSAmJiAhcmVzdWx0QS5kb25lKSB7XG4gICAgaWYgKHJlc3VsdEEudmFsdWUgJiYgdHlwZW9mIHJlc3VsdEEudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoIXNldCkgeyBzZXQgPSBuZXcgJFNldCgpOyB9XG4gICAgICAkc2V0QWRkKHNldCwgcmVzdWx0QS52YWx1ZSk7XG4gICAgfSBlbHNlIGlmICghJHNldEhhcyhiLCByZXN1bHRBLnZhbHVlKSkge1xuICAgICAgaWYgKG9wdHMuc3RyaWN0KSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgaWYgKCFzZXRNaWdodEhhdmVMb29zZVByaW0oYSwgYiwgcmVzdWx0QS52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXQpIHsgc2V0ID0gbmV3ICRTZXQoKTsgfVxuICAgICAgJHNldEFkZChzZXQsIHJlc3VsdEEudmFsdWUpO1xuICAgIH1cbiAgfVxuICBpZiAoc2V0KSB7XG4gICAgd2hpbGUgKChyZXN1bHRCID0gaUIubmV4dCgpKSAmJiAhcmVzdWx0Qi5kb25lKSB7XG4gICAgICAvLyBXZSBoYXZlIHRvIGNoZWNrIGlmIGEgcHJpbWl0aXZlIHZhbHVlIGlzIGFscmVhZHkgbWF0Y2hpbmcgYW5kIG9ubHkgaWYgaXQncyBub3QsIGdvIGh1bnRpbmcgZm9yIGl0LlxuICAgICAgaWYgKHJlc3VsdEIudmFsdWUgJiYgdHlwZW9mIHJlc3VsdEIudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICghc2V0SGFzRXF1YWxFbGVtZW50KHNldCwgcmVzdWx0Qi52YWx1ZSwgb3B0cy5zdHJpY3QsIGNoYW5uZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhb3B0cy5zdHJpY3RcbiAgICAgICAgJiYgISRzZXRIYXMoYSwgcmVzdWx0Qi52YWx1ZSlcbiAgICAgICAgJiYgIXNldEhhc0VxdWFsRWxlbWVudChzZXQsIHJlc3VsdEIudmFsdWUsIG9wdHMuc3RyaWN0LCBjaGFubmVsKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICRzZXRTaXplKHNldCkgPT09IDA7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1hcEVxdWl2KGEsIGIsIG9wdHMsIGNoYW5uZWwpIHtcbiAgaWYgKCRtYXBTaXplKGEpICE9PSAkbWFwU2l6ZShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaUEgPSBnZXRJdGVyYXRvcihhKTtcbiAgdmFyIGlCID0gZ2V0SXRlcmF0b3IoYik7XG4gIHZhciByZXN1bHRBO1xuICB2YXIgcmVzdWx0QjtcbiAgdmFyIHNldDtcbiAgdmFyIGtleTtcbiAgdmFyIGl0ZW0xO1xuICB2YXIgaXRlbTI7XG4gIHdoaWxlICgocmVzdWx0QSA9IGlBLm5leHQoKSkgJiYgIXJlc3VsdEEuZG9uZSkge1xuICAgIGtleSA9IHJlc3VsdEEudmFsdWVbMF07XG4gICAgaXRlbTEgPSByZXN1bHRBLnZhbHVlWzFdO1xuICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghc2V0KSB7IHNldCA9IG5ldyAkU2V0KCk7IH1cbiAgICAgICRzZXRBZGQoc2V0LCBrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtMiA9ICRtYXBHZXQoYiwga2V5KTtcbiAgICAgIGlmICgodHlwZW9mIGl0ZW0yID09PSAndW5kZWZpbmVkJyAmJiAhJG1hcEhhcyhiLCBrZXkpKSB8fCAhaW50ZXJuYWxEZWVwRXF1YWwoaXRlbTEsIGl0ZW0yLCBvcHRzLCBjaGFubmVsKSkge1xuICAgICAgICBpZiAob3B0cy5zdHJpY3QpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtYXBNaWdodEhhdmVMb29zZVByaW0oYSwgYiwga2V5LCBpdGVtMSwgb3B0cywgY2hhbm5lbCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZXQpIHsgc2V0ID0gbmV3ICRTZXQoKTsgfVxuICAgICAgICAkc2V0QWRkKHNldCwga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc2V0KSB7XG4gICAgd2hpbGUgKChyZXN1bHRCID0gaUIubmV4dCgpKSAmJiAhcmVzdWx0Qi5kb25lKSB7XG4gICAgICBrZXkgPSByZXN1bHRCLnZhbHVlWzBdO1xuICAgICAgaXRlbTIgPSByZXN1bHRCLnZhbHVlWzFdO1xuICAgICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoIW1hcEhhc0VxdWFsRW50cnkoc2V0LCBhLCBrZXksIGl0ZW0yLCBvcHRzLCBjaGFubmVsKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIW9wdHMuc3RyaWN0XG4gICAgICAgICYmICghYS5oYXMoa2V5KSB8fCAhaW50ZXJuYWxEZWVwRXF1YWwoJG1hcEdldChhLCBrZXkpLCBpdGVtMiwgb3B0cywgY2hhbm5lbCkpXG4gICAgICAgICYmICFtYXBIYXNFcXVhbEVudHJ5KHNldCwgYSwga2V5LCBpdGVtMiwgYXNzaWduKHt9LCBvcHRzLCB7IHN0cmljdDogZmFsc2UgfSksIGNoYW5uZWwpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJHNldFNpemUoc2V0KSA9PT0gMDtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgb3B0cywgY2hhbm5lbCkge1xuICAvKiBlc2xpbnQgbWF4LXN0YXRlbWVudHM6IFsyLCAxMDBdLCBtYXgtbGluZXMtcGVyLWZ1bmN0aW9uOiBbMiwgMTIwXSwgbWF4LWRlcHRoOiBbMiwgNV0sIG1heC1saW5lczogWzIsIDQwMF0gKi9cbiAgdmFyIGksIGtleTtcblxuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBpZiAoJG9ialRvU3RyaW5nKGEpICE9PSAkb2JqVG9TdHJpbmcoYikpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgaWYgKGlzQXJndW1lbnRzKGEpICE9PSBpc0FyZ3VtZW50cyhiKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICB2YXIgYUlzQXJyYXkgPSBpc0FycmF5KGEpO1xuICB2YXIgYklzQXJyYXkgPSBpc0FycmF5KGIpO1xuICBpZiAoYUlzQXJyYXkgIT09IGJJc0FycmF5KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8vIFRPRE86IHJlcGxhY2Ugd2hlbiBhIGNyb3NzLXJlYWxtIGJyYW5kIGNoZWNrIGlzIGF2YWlsYWJsZVxuICB2YXIgYUlzRXJyb3IgPSBhIGluc3RhbmNlb2YgRXJyb3I7XG4gIHZhciBiSXNFcnJvciA9IGIgaW5zdGFuY2VvZiBFcnJvcjtcbiAgaWYgKGFJc0Vycm9yICE9PSBiSXNFcnJvcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKGFJc0Vycm9yIHx8IGJJc0Vycm9yKSB7XG4gICAgaWYgKGEubmFtZSAhPT0gYi5uYW1lIHx8IGEubWVzc2FnZSAhPT0gYi5tZXNzYWdlKSB7IHJldHVybiBmYWxzZTsgfVxuICB9XG5cbiAgdmFyIGFJc1JlZ2V4ID0gaXNSZWdleChhKTtcbiAgdmFyIGJJc1JlZ2V4ID0gaXNSZWdleChiKTtcbiAgaWYgKGFJc1JlZ2V4ICE9PSBiSXNSZWdleCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKChhSXNSZWdleCB8fCBiSXNSZWdleCkgJiYgKGEuc291cmNlICE9PSBiLnNvdXJjZSB8fCBmbGFncyhhKSAhPT0gZmxhZ3MoYikpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGFJc0RhdGUgPSBpc0RhdGUoYSk7XG4gIHZhciBiSXNEYXRlID0gaXNEYXRlKGIpO1xuICBpZiAoYUlzRGF0ZSAhPT0gYklzRGF0ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKGFJc0RhdGUgfHwgYklzRGF0ZSkgeyAvLyAmJiB3b3VsZCB3b3JrIHRvbywgYmVjYXVzZSBib3RoIGFyZSB0cnVlIG9yIGJvdGggZmFsc2UgaGVyZVxuICAgIGlmICgkZ2V0VGltZShhKSAhPT0gJGdldFRpbWUoYikpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIH1cbiAgaWYgKG9wdHMuc3RyaWN0ICYmIGdQTyAmJiBnUE8oYSkgIT09IGdQTyhiKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICB2YXIgYVdoaWNoID0gd2hpY2hUeXBlZEFycmF5KGEpO1xuICB2YXIgYldoaWNoID0gd2hpY2hUeXBlZEFycmF5KGIpO1xuICBpZiAoYVdoaWNoICE9PSBiV2hpY2gpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGFXaGljaCB8fCBiV2hpY2gpIHsgLy8gJiYgd291bGQgd29yayB0b28sIGJlY2F1c2UgYm90aCBhcmUgdHJ1ZSBvciBib3RoIGZhbHNlIGhlcmVcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgYUlzQnVmZmVyID0gaXNCdWZmZXIoYSk7XG4gIHZhciBiSXNCdWZmZXIgPSBpc0J1ZmZlcihiKTtcbiAgaWYgKGFJc0J1ZmZlciAhPT0gYklzQnVmZmVyKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoYUlzQnVmZmVyIHx8IGJJc0J1ZmZlcikgeyAvLyAmJiB3b3VsZCB3b3JrIHRvbywgYmVjYXVzZSBib3RoIGFyZSB0cnVlIG9yIGJvdGggZmFsc2UgaGVyZVxuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBhSXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXIoYSk7XG4gIHZhciBiSXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXIoYik7XG4gIGlmIChhSXNBcnJheUJ1ZmZlciAhPT0gYklzQXJyYXlCdWZmZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhSXNBcnJheUJ1ZmZlciB8fCBiSXNBcnJheUJ1ZmZlcikgeyAvLyAmJiB3b3VsZCB3b3JrIHRvbywgYmVjYXVzZSBib3RoIGFyZSB0cnVlIG9yIGJvdGggZmFsc2UgaGVyZVxuICAgIGlmIChieXRlTGVuZ3RoKGEpICE9PSBieXRlTGVuZ3RoKGIpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnRlcm5hbERlZXBFcXVhbChuZXcgVWludDhBcnJheShhKSwgbmV3IFVpbnQ4QXJyYXkoYiksIG9wdHMsIGNoYW5uZWwpO1xuICB9XG5cbiAgdmFyIGFJc1NBQiA9IGlzU2hhcmVkQXJyYXlCdWZmZXIoYSk7XG4gIHZhciBiSXNTQUIgPSBpc1NoYXJlZEFycmF5QnVmZmVyKGIpO1xuICBpZiAoYUlzU0FCICE9PSBiSXNTQUIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhSXNTQUIgfHwgYklzU0FCKSB7IC8vICYmIHdvdWxkIHdvcmsgdG9vLCBiZWNhdXNlIGJvdGggYXJlIHRydWUgb3IgYm90aCBmYWxzZSBoZXJlXG4gICAgaWYgKHNhYkJ5dGVMZW5ndGgoYSkgIT09IHNhYkJ5dGVMZW5ndGgoYikpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcmV0dXJuIHR5cGVvZiBVaW50OEFycmF5ID09PSAnZnVuY3Rpb24nICYmIGludGVybmFsRGVlcEVxdWFsKG5ldyBVaW50OEFycmF5KGEpLCBuZXcgVWludDhBcnJheShiKSwgb3B0cywgY2hhbm5lbCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIHZhciBrYSA9IG9iamVjdEtleXMoYSk7XG4gIHZhciBrYiA9IG9iamVjdEtleXMoYik7XG4gIC8vIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoa2V5cyBpbmNvcnBvcmF0ZXMgaGFzT3duUHJvcGVydHkpXG4gIGlmIChrYS5sZW5ndGggIT09IGtiLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAvLyB0aGUgc2FtZSBzZXQgb2Yga2V5cyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSxcbiAga2Euc29ydCgpO1xuICBrYi5zb3J0KCk7XG4gIC8vIH5+fmNoZWFwIGtleSB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGthW2ldICE9IGtiW2ldKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICB9XG5cbiAgLy8gZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghaW50ZXJuYWxEZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIG9wdHMsIGNoYW5uZWwpKSB7IHJldHVybiBmYWxzZTsgfVxuICB9XG5cbiAgdmFyIGFDb2xsZWN0aW9uID0gd2hpY2hDb2xsZWN0aW9uKGEpO1xuICB2YXIgYkNvbGxlY3Rpb24gPSB3aGljaENvbGxlY3Rpb24oYik7XG4gIGlmIChhQ29sbGVjdGlvbiAhPT0gYkNvbGxlY3Rpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGFDb2xsZWN0aW9uID09PSAnU2V0JyB8fCBiQ29sbGVjdGlvbiA9PT0gJ1NldCcpIHsgLy8gYUNvbGxlY3Rpb24gPT09IGJDb2xsZWN0aW9uXG4gICAgcmV0dXJuIHNldEVxdWl2KGEsIGIsIG9wdHMsIGNoYW5uZWwpO1xuICB9XG4gIGlmIChhQ29sbGVjdGlvbiA9PT0gJ01hcCcpIHsgLy8gYUNvbGxlY3Rpb24gPT09IGJDb2xsZWN0aW9uXG4gICAgcmV0dXJuIG1hcEVxdWl2KGEsIGIsIG9wdHMsIGNoYW5uZWwpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVlcEVxdWFsKGEsIGIsIG9wdHMpIHtcbiAgcmV0dXJuIGludGVybmFsRGVlcEVxdWFsKGEsIGIsIG9wdHMsIGdldFNpZGVDaGFubmVsKCkpO1xufTtcbiIsICIvKipcbiAqIFtqcy1zaGEyNTZde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhMjU2fVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4wXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE0LTIwMTdcbiAqIEBsaWNlbnNlIE1JVFxuICovXG4vKmpzbGludCBiaXR3aXNlOiB0cnVlICovXG4oZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIEVSUk9SID0gJ2lucHV0IGlzIGludmFsaWQgdHlwZSc7XG4gIHZhciBXSU5ET1cgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JztcbiAgdmFyIHJvb3QgPSBXSU5ET1cgPyB3aW5kb3cgOiB7fTtcbiAgaWYgKHJvb3QuSlNfU0hBMjU2X05PX1dJTkRPVykge1xuICAgIFdJTkRPVyA9IGZhbHNlO1xuICB9XG4gIHZhciBXRUJfV09SS0VSID0gIVdJTkRPVyAmJiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCc7XG4gIHZhciBOT0RFX0pTID0gIXJvb3QuSlNfU0hBMjU2X05PX05PREVfSlMgJiYgdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO1xuICBpZiAoTk9ERV9KUykge1xuICAgIHJvb3QgPSBnbG9iYWw7XG4gIH0gZWxzZSBpZiAoV0VCX1dPUktFUikge1xuICAgIHJvb3QgPSBzZWxmO1xuICB9XG4gIHZhciBDT01NT05fSlMgPSAhcm9vdC5KU19TSEEyNTZfTk9fQ09NTU9OX0pTICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzO1xuICB2YXIgQU1EID0gdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kO1xuICB2YXIgQVJSQVlfQlVGRkVSID0gIXJvb3QuSlNfU0hBMjU2X05PX0FSUkFZX0JVRkZFUiAmJiB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnO1xuICB2YXIgSEVYX0NIQVJTID0gJzAxMjM0NTY3ODlhYmNkZWYnLnNwbGl0KCcnKTtcbiAgdmFyIEVYVFJBID0gWy0yMTQ3NDgzNjQ4LCA4Mzg4NjA4LCAzMjc2OCwgMTI4XTtcbiAgdmFyIFNISUZUID0gWzI0LCAxNiwgOCwgMF07XG4gIHZhciBLID0gW1xuICAgIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gICAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCxcbiAgICAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLCAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLFxuICAgIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gICAgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMywgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSxcbiAgICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLCAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLFxuICAgIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gICAgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMlxuICBdO1xuICB2YXIgT1VUUFVUX1RZUEVTID0gWydoZXgnLCAnYXJyYXknLCAnZGlnZXN0JywgJ2FycmF5QnVmZmVyJ107XG5cbiAgdmFyIGJsb2NrcyA9IFtdO1xuXG4gIGlmIChyb290LkpTX1NIQTI1Nl9OT19OT0RFX0pTIHx8ICFBcnJheS5pc0FycmF5KSB7XG4gICAgQXJyYXkuaXNBcnJheSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9O1xuICB9XG5cbiAgaWYgKEFSUkFZX0JVRkZFUiAmJiAocm9vdC5KU19TSEEyNTZfTk9fQVJSQVlfQlVGRkVSX0lTX1ZJRVcgfHwgIUFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqLmJ1ZmZlciAmJiBvYmouYnVmZmVyLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcjtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGNyZWF0ZU91dHB1dE1ldGhvZCA9IGZ1bmN0aW9uIChvdXRwdXRUeXBlLCBpczIyNCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgcmV0dXJuIG5ldyBTaGEyNTYoaXMyMjQsIHRydWUpLnVwZGF0ZShtZXNzYWdlKVtvdXRwdXRUeXBlXSgpO1xuICAgIH07XG4gIH07XG5cbiAgdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChpczIyNCkge1xuICAgIHZhciBtZXRob2QgPSBjcmVhdGVPdXRwdXRNZXRob2QoJ2hleCcsIGlzMjI0KTtcbiAgICBpZiAoTk9ERV9KUykge1xuICAgICAgbWV0aG9kID0gbm9kZVdyYXAobWV0aG9kLCBpczIyNCk7XG4gICAgfVxuICAgIG1ldGhvZC5jcmVhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IFNoYTI1NihpczIyNCk7XG4gICAgfTtcbiAgICBtZXRob2QudXBkYXRlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBtZXRob2QuY3JlYXRlKCkudXBkYXRlKG1lc3NhZ2UpO1xuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBPVVRQVVRfVFlQRVMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciB0eXBlID0gT1VUUFVUX1RZUEVTW2ldO1xuICAgICAgbWV0aG9kW3R5cGVdID0gY3JlYXRlT3V0cHV0TWV0aG9kKHR5cGUsIGlzMjI0KTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGhvZDtcbiAgfTtcblxuICB2YXIgbm9kZVdyYXAgPSBmdW5jdGlvbiAobWV0aG9kLCBpczIyNCkge1xuICAgIHZhciBjcnlwdG8gPSBldmFsKFwicmVxdWlyZSgnY3J5cHRvJylcIik7XG4gICAgdmFyIEJ1ZmZlciA9IGV2YWwoXCJyZXF1aXJlKCdidWZmZXInKS5CdWZmZXJcIik7XG4gICAgdmFyIGFsZ29yaXRobSA9IGlzMjI0ID8gJ3NoYTIyNCcgOiAnc2hhMjU2JztcbiAgICB2YXIgbm9kZU1ldGhvZCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaChhbGdvcml0aG0pLnVwZGF0ZShtZXNzYWdlLCAndXRmOCcpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1IpO1xuICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UuY29uc3RydWN0b3IgPT09IEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgbWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlKSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcobWVzc2FnZSkgfHxcbiAgICAgICAgbWVzc2FnZS5jb25zdHJ1Y3RvciA9PT0gQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaChhbGdvcml0aG0pLnVwZGF0ZShuZXcgQnVmZmVyKG1lc3NhZ2UpKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG1ldGhvZChtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBub2RlTWV0aG9kO1xuICB9O1xuXG4gIHZhciBjcmVhdGVIbWFjT3V0cHV0TWV0aG9kID0gZnVuY3Rpb24gKG91dHB1dFR5cGUsIGlzMjI0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIG1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBuZXcgSG1hY1NoYTI1NihrZXksIGlzMjI0LCB0cnVlKS51cGRhdGUobWVzc2FnZSlbb3V0cHV0VHlwZV0oKTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBjcmVhdGVIbWFjTWV0aG9kID0gZnVuY3Rpb24gKGlzMjI0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGNyZWF0ZUhtYWNPdXRwdXRNZXRob2QoJ2hleCcsIGlzMjI0KTtcbiAgICBtZXRob2QuY3JlYXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIG5ldyBIbWFjU2hhMjU2KGtleSwgaXMyMjQpO1xuICAgIH07XG4gICAgbWV0aG9kLnVwZGF0ZSA9IGZ1bmN0aW9uIChrZXksIG1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBtZXRob2QuY3JlYXRlKGtleSkudXBkYXRlKG1lc3NhZ2UpO1xuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBPVVRQVVRfVFlQRVMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciB0eXBlID0gT1VUUFVUX1RZUEVTW2ldO1xuICAgICAgbWV0aG9kW3R5cGVdID0gY3JlYXRlSG1hY091dHB1dE1ldGhvZCh0eXBlLCBpczIyNCk7XG4gICAgfVxuICAgIHJldHVybiBtZXRob2Q7XG4gIH07XG5cbiAgZnVuY3Rpb24gU2hhMjU2KGlzMjI0LCBzaGFyZWRNZW1vcnkpIHtcbiAgICBpZiAoc2hhcmVkTWVtb3J5KSB7XG4gICAgICBibG9ja3NbMF0gPSBibG9ja3NbMTZdID0gYmxvY2tzWzFdID0gYmxvY2tzWzJdID0gYmxvY2tzWzNdID1cbiAgICAgICAgYmxvY2tzWzRdID0gYmxvY2tzWzVdID0gYmxvY2tzWzZdID0gYmxvY2tzWzddID1cbiAgICAgICAgYmxvY2tzWzhdID0gYmxvY2tzWzldID0gYmxvY2tzWzEwXSA9IGJsb2Nrc1sxMV0gPVxuICAgICAgICBibG9ja3NbMTJdID0gYmxvY2tzWzEzXSA9IGJsb2Nrc1sxNF0gPSBibG9ja3NbMTVdID0gMDtcbiAgICAgIHRoaXMuYmxvY2tzID0gYmxvY2tzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJsb2NrcyA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICB9XG5cbiAgICBpZiAoaXMyMjQpIHtcbiAgICAgIHRoaXMuaDAgPSAweGMxMDU5ZWQ4O1xuICAgICAgdGhpcy5oMSA9IDB4MzY3Y2Q1MDc7XG4gICAgICB0aGlzLmgyID0gMHgzMDcwZGQxNztcbiAgICAgIHRoaXMuaDMgPSAweGY3MGU1OTM5O1xuICAgICAgdGhpcy5oNCA9IDB4ZmZjMDBiMzE7XG4gICAgICB0aGlzLmg1ID0gMHg2ODU4MTUxMTtcbiAgICAgIHRoaXMuaDYgPSAweDY0Zjk4ZmE3O1xuICAgICAgdGhpcy5oNyA9IDB4YmVmYTRmYTQ7XG4gICAgfSBlbHNlIHsgLy8gMjU2XG4gICAgICB0aGlzLmgwID0gMHg2YTA5ZTY2NztcbiAgICAgIHRoaXMuaDEgPSAweGJiNjdhZTg1O1xuICAgICAgdGhpcy5oMiA9IDB4M2M2ZWYzNzI7XG4gICAgICB0aGlzLmgzID0gMHhhNTRmZjUzYTtcbiAgICAgIHRoaXMuaDQgPSAweDUxMGU1MjdmO1xuICAgICAgdGhpcy5oNSA9IDB4OWIwNTY4OGM7XG4gICAgICB0aGlzLmg2ID0gMHgxZjgzZDlhYjtcbiAgICAgIHRoaXMuaDcgPSAweDViZTBjZDE5O1xuICAgIH1cblxuICAgIHRoaXMuYmxvY2sgPSB0aGlzLnN0YXJ0ID0gdGhpcy5ieXRlcyA9IHRoaXMuaEJ5dGVzID0gMDtcbiAgICB0aGlzLmZpbmFsaXplZCA9IHRoaXMuaGFzaGVkID0gZmFsc2U7XG4gICAgdGhpcy5maXJzdCA9IHRydWU7XG4gICAgdGhpcy5pczIyNCA9IGlzMjI0O1xuICB9XG5cbiAgU2hhMjU2LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbm90U3RyaW5nLCB0eXBlID0gdHlwZW9mIG1lc3NhZ2U7XG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1IpO1xuICAgICAgICB9IGVsc2UgaWYgKEFSUkFZX0JVRkZFUiAmJiBtZXNzYWdlLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgVWludDhBcnJheShtZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShtZXNzYWdlKSkge1xuICAgICAgICAgIGlmICghQVJSQVlfQlVGRkVSIHx8ICFBcnJheUJ1ZmZlci5pc1ZpZXcobWVzc2FnZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1IpO1xuICAgICAgfVxuICAgICAgbm90U3RyaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGNvZGUsIGluZGV4ID0gMCwgaSwgbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGgsIGJsb2NrcyA9IHRoaXMuYmxvY2tzO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5oYXNoZWQpIHtcbiAgICAgICAgdGhpcy5oYXNoZWQgPSBmYWxzZTtcbiAgICAgICAgYmxvY2tzWzBdID0gdGhpcy5ibG9jaztcbiAgICAgICAgYmxvY2tzWzE2XSA9IGJsb2Nrc1sxXSA9IGJsb2Nrc1syXSA9IGJsb2Nrc1szXSA9XG4gICAgICAgICAgYmxvY2tzWzRdID0gYmxvY2tzWzVdID0gYmxvY2tzWzZdID0gYmxvY2tzWzddID1cbiAgICAgICAgICBibG9ja3NbOF0gPSBibG9ja3NbOV0gPSBibG9ja3NbMTBdID0gYmxvY2tzWzExXSA9XG4gICAgICAgICAgYmxvY2tzWzEyXSA9IGJsb2Nrc1sxM10gPSBibG9ja3NbMTRdID0gYmxvY2tzWzE1XSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChub3RTdHJpbmcpIHtcbiAgICAgICAgZm9yIChpID0gdGhpcy5zdGFydDsgaW5kZXggPCBsZW5ndGggJiYgaSA8IDY0OyArK2luZGV4KSB7XG4gICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gbWVzc2FnZVtpbmRleF0gPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IHRoaXMuc3RhcnQ7IGluZGV4IDwgbGVuZ3RoICYmIGkgPCA2NDsgKytpbmRleCkge1xuICAgICAgICAgIGNvZGUgPSBtZXNzYWdlLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAgIGlmIChjb2RlIDwgMHg4MCkge1xuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gY29kZSA8PCBTSElGVFtpKysgJiAzXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCAweDgwMCkge1xuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4YzAgfCAoY29kZSA+PiA2KSkgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8IChjb2RlICYgMHgzZikpIDw8IFNISUZUW2krKyAmIDNdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA8IDB4ZDgwMCB8fCBjb2RlID49IDB4ZTAwMCkge1xuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ZTAgfCAoY29kZSA+PiAxMikpIDw8IFNISUZUW2krKyAmIDNdO1xuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ODAgfCAoKGNvZGUgPj4gNikgJiAweDNmKSkgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8IChjb2RlICYgMHgzZikpIDw8IFNISUZUW2krKyAmIDNdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2RlID0gMHgxMDAwMCArICgoKGNvZGUgJiAweDNmZikgPDwgMTApIHwgKG1lc3NhZ2UuY2hhckNvZGVBdCgrK2luZGV4KSAmIDB4M2ZmKSk7XG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHhmMCB8IChjb2RlID4+IDE4KSkgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8ICgoY29kZSA+PiAxMikgJiAweDNmKSkgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8ICgoY29kZSA+PiA2KSAmIDB4M2YpKSA8PCBTSElGVFtpKysgJiAzXTtcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9ICgweDgwIHwgKGNvZGUgJiAweDNmKSkgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGFzdEJ5dGVJbmRleCA9IGk7XG4gICAgICB0aGlzLmJ5dGVzICs9IGkgLSB0aGlzLnN0YXJ0O1xuICAgICAgaWYgKGkgPj0gNjQpIHtcbiAgICAgICAgdGhpcy5ibG9jayA9IGJsb2Nrc1sxNl07XG4gICAgICAgIHRoaXMuc3RhcnQgPSBpIC0gNjQ7XG4gICAgICAgIHRoaXMuaGFzaCgpO1xuICAgICAgICB0aGlzLmhhc2hlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXJ0ID0gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuYnl0ZXMgPiA0Mjk0OTY3Mjk1KSB7XG4gICAgICB0aGlzLmhCeXRlcyArPSB0aGlzLmJ5dGVzIC8gNDI5NDk2NzI5NiA8PCAwO1xuICAgICAgdGhpcy5ieXRlcyA9IHRoaXMuYnl0ZXMgJSA0Mjk0OTY3Mjk2O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBTaGEyNTYucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgdmFyIGJsb2NrcyA9IHRoaXMuYmxvY2tzLCBpID0gdGhpcy5sYXN0Qnl0ZUluZGV4O1xuICAgIGJsb2Nrc1sxNl0gPSB0aGlzLmJsb2NrO1xuICAgIGJsb2Nrc1tpID4+IDJdIHw9IEVYVFJBW2kgJiAzXTtcbiAgICB0aGlzLmJsb2NrID0gYmxvY2tzWzE2XTtcbiAgICBpZiAoaSA+PSA1Nikge1xuICAgICAgaWYgKCF0aGlzLmhhc2hlZCkge1xuICAgICAgICB0aGlzLmhhc2goKTtcbiAgICAgIH1cbiAgICAgIGJsb2Nrc1swXSA9IHRoaXMuYmxvY2s7XG4gICAgICBibG9ja3NbMTZdID0gYmxvY2tzWzFdID0gYmxvY2tzWzJdID0gYmxvY2tzWzNdID1cbiAgICAgICAgYmxvY2tzWzRdID0gYmxvY2tzWzVdID0gYmxvY2tzWzZdID0gYmxvY2tzWzddID1cbiAgICAgICAgYmxvY2tzWzhdID0gYmxvY2tzWzldID0gYmxvY2tzWzEwXSA9IGJsb2Nrc1sxMV0gPVxuICAgICAgICBibG9ja3NbMTJdID0gYmxvY2tzWzEzXSA9IGJsb2Nrc1sxNF0gPSBibG9ja3NbMTVdID0gMDtcbiAgICB9XG4gICAgYmxvY2tzWzE0XSA9IHRoaXMuaEJ5dGVzIDw8IDMgfCB0aGlzLmJ5dGVzID4+PiAyOTtcbiAgICBibG9ja3NbMTVdID0gdGhpcy5ieXRlcyA8PCAzO1xuICAgIHRoaXMuaGFzaCgpO1xuICB9O1xuXG4gIFNoYTI1Ni5wcm90b3R5cGUuaGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYSA9IHRoaXMuaDAsIGIgPSB0aGlzLmgxLCBjID0gdGhpcy5oMiwgZCA9IHRoaXMuaDMsIGUgPSB0aGlzLmg0LCBmID0gdGhpcy5oNSwgZyA9IHRoaXMuaDYsXG4gICAgICBoID0gdGhpcy5oNywgYmxvY2tzID0gdGhpcy5ibG9ja3MsIGosIHMwLCBzMSwgbWFqLCB0MSwgdDIsIGNoLCBhYiwgZGEsIGNkLCBiYztcblxuICAgIGZvciAoaiA9IDE2OyBqIDwgNjQ7ICsraikge1xuICAgICAgLy8gcmlnaHRyb3RhdGVcbiAgICAgIHQxID0gYmxvY2tzW2ogLSAxNV07XG4gICAgICBzMCA9ICgodDEgPj4+IDcpIHwgKHQxIDw8IDI1KSkgXiAoKHQxID4+PiAxOCkgfCAodDEgPDwgMTQpKSBeICh0MSA+Pj4gMyk7XG4gICAgICB0MSA9IGJsb2Nrc1tqIC0gMl07XG4gICAgICBzMSA9ICgodDEgPj4+IDE3KSB8ICh0MSA8PCAxNSkpIF4gKCh0MSA+Pj4gMTkpIHwgKHQxIDw8IDEzKSkgXiAodDEgPj4+IDEwKTtcbiAgICAgIGJsb2Nrc1tqXSA9IGJsb2Nrc1tqIC0gMTZdICsgczAgKyBibG9ja3NbaiAtIDddICsgczEgPDwgMDtcbiAgICB9XG5cbiAgICBiYyA9IGIgJiBjO1xuICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaiArPSA0KSB7XG4gICAgICBpZiAodGhpcy5maXJzdCkge1xuICAgICAgICBpZiAodGhpcy5pczIyNCkge1xuICAgICAgICAgIGFiID0gMzAwMDMyO1xuICAgICAgICAgIHQxID0gYmxvY2tzWzBdIC0gMTQxMzI1NzgxOTtcbiAgICAgICAgICBoID0gdDEgLSAxNTAwNTQ1OTkgPDwgMDtcbiAgICAgICAgICBkID0gdDEgKyAyNDE3NzA3NyA8PCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFiID0gNzA0NzUxMTA5O1xuICAgICAgICAgIHQxID0gYmxvY2tzWzBdIC0gMjEwMjQ0MjQ4O1xuICAgICAgICAgIGggPSB0MSAtIDE1MjE0ODY1MzQgPDwgMDtcbiAgICAgICAgICBkID0gdDEgKyAxNDM2OTQ1NjUgPDwgMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpcnN0ID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMCA9ICgoYSA+Pj4gMikgfCAoYSA8PCAzMCkpIF4gKChhID4+PiAxMykgfCAoYSA8PCAxOSkpIF4gKChhID4+PiAyMikgfCAoYSA8PCAxMCkpO1xuICAgICAgICBzMSA9ICgoZSA+Pj4gNikgfCAoZSA8PCAyNikpIF4gKChlID4+PiAxMSkgfCAoZSA8PCAyMSkpIF4gKChlID4+PiAyNSkgfCAoZSA8PCA3KSk7XG4gICAgICAgIGFiID0gYSAmIGI7XG4gICAgICAgIG1haiA9IGFiIF4gKGEgJiBjKSBeIGJjO1xuICAgICAgICBjaCA9IChlICYgZikgXiAofmUgJiBnKTtcbiAgICAgICAgdDEgPSBoICsgczEgKyBjaCArIEtbal0gKyBibG9ja3Nbal07XG4gICAgICAgIHQyID0gczAgKyBtYWo7XG4gICAgICAgIGggPSBkICsgdDEgPDwgMDtcbiAgICAgICAgZCA9IHQxICsgdDIgPDwgMDtcbiAgICAgIH1cbiAgICAgIHMwID0gKChkID4+PiAyKSB8IChkIDw8IDMwKSkgXiAoKGQgPj4+IDEzKSB8IChkIDw8IDE5KSkgXiAoKGQgPj4+IDIyKSB8IChkIDw8IDEwKSk7XG4gICAgICBzMSA9ICgoaCA+Pj4gNikgfCAoaCA8PCAyNikpIF4gKChoID4+PiAxMSkgfCAoaCA8PCAyMSkpIF4gKChoID4+PiAyNSkgfCAoaCA8PCA3KSk7XG4gICAgICBkYSA9IGQgJiBhO1xuICAgICAgbWFqID0gZGEgXiAoZCAmIGIpIF4gYWI7XG4gICAgICBjaCA9IChoICYgZSkgXiAofmggJiBmKTtcbiAgICAgIHQxID0gZyArIHMxICsgY2ggKyBLW2ogKyAxXSArIGJsb2Nrc1tqICsgMV07XG4gICAgICB0MiA9IHMwICsgbWFqO1xuICAgICAgZyA9IGMgKyB0MSA8PCAwO1xuICAgICAgYyA9IHQxICsgdDIgPDwgMDtcbiAgICAgIHMwID0gKChjID4+PiAyKSB8IChjIDw8IDMwKSkgXiAoKGMgPj4+IDEzKSB8IChjIDw8IDE5KSkgXiAoKGMgPj4+IDIyKSB8IChjIDw8IDEwKSk7XG4gICAgICBzMSA9ICgoZyA+Pj4gNikgfCAoZyA8PCAyNikpIF4gKChnID4+PiAxMSkgfCAoZyA8PCAyMSkpIF4gKChnID4+PiAyNSkgfCAoZyA8PCA3KSk7XG4gICAgICBjZCA9IGMgJiBkO1xuICAgICAgbWFqID0gY2QgXiAoYyAmIGEpIF4gZGE7XG4gICAgICBjaCA9IChnICYgaCkgXiAofmcgJiBlKTtcbiAgICAgIHQxID0gZiArIHMxICsgY2ggKyBLW2ogKyAyXSArIGJsb2Nrc1tqICsgMl07XG4gICAgICB0MiA9IHMwICsgbWFqO1xuICAgICAgZiA9IGIgKyB0MSA8PCAwO1xuICAgICAgYiA9IHQxICsgdDIgPDwgMDtcbiAgICAgIHMwID0gKChiID4+PiAyKSB8IChiIDw8IDMwKSkgXiAoKGIgPj4+IDEzKSB8IChiIDw8IDE5KSkgXiAoKGIgPj4+IDIyKSB8IChiIDw8IDEwKSk7XG4gICAgICBzMSA9ICgoZiA+Pj4gNikgfCAoZiA8PCAyNikpIF4gKChmID4+PiAxMSkgfCAoZiA8PCAyMSkpIF4gKChmID4+PiAyNSkgfCAoZiA8PCA3KSk7XG4gICAgICBiYyA9IGIgJiBjO1xuICAgICAgbWFqID0gYmMgXiAoYiAmIGQpIF4gY2Q7XG4gICAgICBjaCA9IChmICYgZykgXiAofmYgJiBoKTtcbiAgICAgIHQxID0gZSArIHMxICsgY2ggKyBLW2ogKyAzXSArIGJsb2Nrc1tqICsgM107XG4gICAgICB0MiA9IHMwICsgbWFqO1xuICAgICAgZSA9IGEgKyB0MSA8PCAwO1xuICAgICAgYSA9IHQxICsgdDIgPDwgMDtcbiAgICB9XG5cbiAgICB0aGlzLmgwID0gdGhpcy5oMCArIGEgPDwgMDtcbiAgICB0aGlzLmgxID0gdGhpcy5oMSArIGIgPDwgMDtcbiAgICB0aGlzLmgyID0gdGhpcy5oMiArIGMgPDwgMDtcbiAgICB0aGlzLmgzID0gdGhpcy5oMyArIGQgPDwgMDtcbiAgICB0aGlzLmg0ID0gdGhpcy5oNCArIGUgPDwgMDtcbiAgICB0aGlzLmg1ID0gdGhpcy5oNSArIGYgPDwgMDtcbiAgICB0aGlzLmg2ID0gdGhpcy5oNiArIGcgPDwgMDtcbiAgICB0aGlzLmg3ID0gdGhpcy5oNyArIGggPDwgMDtcbiAgfTtcblxuICBTaGEyNTYucHJvdG90eXBlLmhleCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZpbmFsaXplKCk7XG5cbiAgICB2YXIgaDAgPSB0aGlzLmgwLCBoMSA9IHRoaXMuaDEsIGgyID0gdGhpcy5oMiwgaDMgPSB0aGlzLmgzLCBoNCA9IHRoaXMuaDQsIGg1ID0gdGhpcy5oNSxcbiAgICAgIGg2ID0gdGhpcy5oNiwgaDcgPSB0aGlzLmg3O1xuXG4gICAgdmFyIGhleCA9IEhFWF9DSEFSU1soaDAgPj4gMjgpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGgwID4+IDI0KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDAgPj4gMjApICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGgwID4+IDE2KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDAgPj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGgwID4+IDgpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoMCA+PiA0KSAmIDB4MEZdICsgSEVYX0NIQVJTW2gwICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoMSA+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDEgPj4gMjQpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoMSA+PiAyMCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDEgPj4gMTYpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoMSA+PiAxMikgJiAweDBGXSArIEhFWF9DSEFSU1soaDEgPj4gOCkgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGgxID4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDEgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGgyID4+IDI4KSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoMiA+PiAyNCkgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGgyID4+IDIwKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoMiA+PiAxNikgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGgyID4+IDEyKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoMiA+PiA4KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDIgPj4gNCkgJiAweDBGXSArIEhFWF9DSEFSU1toMiAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDMgPj4gMjgpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGgzID4+IDI0KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDMgPj4gMjApICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGgzID4+IDE2KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDMgPj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGgzID4+IDgpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoMyA+PiA0KSAmIDB4MEZdICsgSEVYX0NIQVJTW2gzICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoNCA+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDQgPj4gMjQpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoNCA+PiAyMCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDQgPj4gMTYpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoNCA+PiAxMikgJiAweDBGXSArIEhFWF9DSEFSU1soaDQgPj4gOCkgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGg0ID4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDQgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGg1ID4+IDI4KSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoNSA+PiAyNCkgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGg1ID4+IDIwKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoNSA+PiAxNikgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGg1ID4+IDEyKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoNSA+PiA4KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDUgPj4gNCkgJiAweDBGXSArIEhFWF9DSEFSU1toNSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDYgPj4gMjgpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGg2ID4+IDI0KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDYgPj4gMjApICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGg2ID4+IDE2KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDYgPj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGg2ID4+IDgpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoNiA+PiA0KSAmIDB4MEZdICsgSEVYX0NIQVJTW2g2ICYgMHgwRl07XG4gICAgaWYgKCF0aGlzLmlzMjI0KSB7XG4gICAgICBoZXggKz0gSEVYX0NIQVJTWyhoNyA+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDcgPj4gMjQpICYgMHgwRl0gK1xuICAgICAgICBIRVhfQ0hBUlNbKGg3ID4+IDIwKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoNyA+PiAxNikgJiAweDBGXSArXG4gICAgICAgIEhFWF9DSEFSU1soaDcgPj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGg3ID4+IDgpICYgMHgwRl0gK1xuICAgICAgICBIRVhfQ0hBUlNbKGg3ID4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDcgJiAweDBGXTtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbiAgfTtcblxuICBTaGEyNTYucHJvdG90eXBlLnRvU3RyaW5nID0gU2hhMjU2LnByb3RvdHlwZS5oZXg7XG5cbiAgU2hhMjU2LnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuXG4gICAgdmFyIGgwID0gdGhpcy5oMCwgaDEgPSB0aGlzLmgxLCBoMiA9IHRoaXMuaDIsIGgzID0gdGhpcy5oMywgaDQgPSB0aGlzLmg0LCBoNSA9IHRoaXMuaDUsXG4gICAgICBoNiA9IHRoaXMuaDYsIGg3ID0gdGhpcy5oNztcblxuICAgIHZhciBhcnIgPSBbXG4gICAgICAoaDAgPj4gMjQpICYgMHhGRiwgKGgwID4+IDE2KSAmIDB4RkYsIChoMCA+PiA4KSAmIDB4RkYsIGgwICYgMHhGRixcbiAgICAgIChoMSA+PiAyNCkgJiAweEZGLCAoaDEgPj4gMTYpICYgMHhGRiwgKGgxID4+IDgpICYgMHhGRiwgaDEgJiAweEZGLFxuICAgICAgKGgyID4+IDI0KSAmIDB4RkYsIChoMiA+PiAxNikgJiAweEZGLCAoaDIgPj4gOCkgJiAweEZGLCBoMiAmIDB4RkYsXG4gICAgICAoaDMgPj4gMjQpICYgMHhGRiwgKGgzID4+IDE2KSAmIDB4RkYsIChoMyA+PiA4KSAmIDB4RkYsIGgzICYgMHhGRixcbiAgICAgIChoNCA+PiAyNCkgJiAweEZGLCAoaDQgPj4gMTYpICYgMHhGRiwgKGg0ID4+IDgpICYgMHhGRiwgaDQgJiAweEZGLFxuICAgICAgKGg1ID4+IDI0KSAmIDB4RkYsIChoNSA+PiAxNikgJiAweEZGLCAoaDUgPj4gOCkgJiAweEZGLCBoNSAmIDB4RkYsXG4gICAgICAoaDYgPj4gMjQpICYgMHhGRiwgKGg2ID4+IDE2KSAmIDB4RkYsIChoNiA+PiA4KSAmIDB4RkYsIGg2ICYgMHhGRlxuICAgIF07XG4gICAgaWYgKCF0aGlzLmlzMjI0KSB7XG4gICAgICBhcnIucHVzaCgoaDcgPj4gMjQpICYgMHhGRiwgKGg3ID4+IDE2KSAmIDB4RkYsIChoNyA+PiA4KSAmIDB4RkYsIGg3ICYgMHhGRik7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH07XG5cbiAgU2hhMjU2LnByb3RvdHlwZS5hcnJheSA9IFNoYTI1Ni5wcm90b3R5cGUuZGlnZXN0O1xuXG4gIFNoYTI1Ni5wcm90b3R5cGUuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuXG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLmlzMjI0ID8gMjggOiAzMik7XG4gICAgdmFyIGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgZGF0YVZpZXcuc2V0VWludDMyKDAsIHRoaXMuaDApO1xuICAgIGRhdGFWaWV3LnNldFVpbnQzMig0LCB0aGlzLmgxKTtcbiAgICBkYXRhVmlldy5zZXRVaW50MzIoOCwgdGhpcy5oMik7XG4gICAgZGF0YVZpZXcuc2V0VWludDMyKDEyLCB0aGlzLmgzKTtcbiAgICBkYXRhVmlldy5zZXRVaW50MzIoMTYsIHRoaXMuaDQpO1xuICAgIGRhdGFWaWV3LnNldFVpbnQzMigyMCwgdGhpcy5oNSk7XG4gICAgZGF0YVZpZXcuc2V0VWludDMyKDI0LCB0aGlzLmg2KTtcbiAgICBpZiAoIXRoaXMuaXMyMjQpIHtcbiAgICAgIGRhdGFWaWV3LnNldFVpbnQzMigyOCwgdGhpcy5oNyk7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG4gIH07XG5cbiAgZnVuY3Rpb24gSG1hY1NoYTI1NihrZXksIGlzMjI0LCBzaGFyZWRNZW1vcnkpIHtcbiAgICB2YXIgaSwgdHlwZSA9IHR5cGVvZiBrZXk7XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgYnl0ZXMgPSBbXSwgbGVuZ3RoID0ga2V5Lmxlbmd0aCwgaW5kZXggPSAwLCBjb2RlO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvZGUgPSBrZXkuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGNvZGUgPCAweDgwKSB7XG4gICAgICAgICAgYnl0ZXNbaW5kZXgrK10gPSBjb2RlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCAweDgwMCkge1xuICAgICAgICAgIGJ5dGVzW2luZGV4KytdID0gKDB4YzAgfCAoY29kZSA+PiA2KSk7XG4gICAgICAgICAgYnl0ZXNbaW5kZXgrK10gPSAoMHg4MCB8IChjb2RlICYgMHgzZikpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCAweGQ4MDAgfHwgY29kZSA+PSAweGUwMDApIHtcbiAgICAgICAgICBieXRlc1tpbmRleCsrXSA9ICgweGUwIHwgKGNvZGUgPj4gMTIpKTtcbiAgICAgICAgICBieXRlc1tpbmRleCsrXSA9ICgweDgwIHwgKChjb2RlID4+IDYpICYgMHgzZikpO1xuICAgICAgICAgIGJ5dGVzW2luZGV4KytdID0gKDB4ODAgfCAoY29kZSAmIDB4M2YpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2RlID0gMHgxMDAwMCArICgoKGNvZGUgJiAweDNmZikgPDwgMTApIHwgKGtleS5jaGFyQ29kZUF0KCsraSkgJiAweDNmZikpO1xuICAgICAgICAgIGJ5dGVzW2luZGV4KytdID0gKDB4ZjAgfCAoY29kZSA+PiAxOCkpO1xuICAgICAgICAgIGJ5dGVzW2luZGV4KytdID0gKDB4ODAgfCAoKGNvZGUgPj4gMTIpICYgMHgzZikpO1xuICAgICAgICAgIGJ5dGVzW2luZGV4KytdID0gKDB4ODAgfCAoKGNvZGUgPj4gNikgJiAweDNmKSk7XG4gICAgICAgICAgYnl0ZXNbaW5kZXgrK10gPSAoMHg4MCB8IChjb2RlICYgMHgzZikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBrZXkgPSBieXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChrZXkgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1IpO1xuICAgICAgICB9IGVsc2UgaWYgKEFSUkFZX0JVRkZFUiAmJiBrZXkuY29uc3RydWN0b3IgPT09IEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAga2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5KTtcbiAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgaWYgKCFBUlJBWV9CVUZGRVIgfHwgIUFycmF5QnVmZmVyLmlzVmlldyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA+IDY0KSB7XG4gICAgICBrZXkgPSAobmV3IFNoYTI1NihpczIyNCwgdHJ1ZSkpLnVwZGF0ZShrZXkpLmFycmF5KCk7XG4gICAgfVxuXG4gICAgdmFyIG9LZXlQYWQgPSBbXSwgaUtleVBhZCA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgKytpKSB7XG4gICAgICB2YXIgYiA9IGtleVtpXSB8fCAwO1xuICAgICAgb0tleVBhZFtpXSA9IDB4NWMgXiBiO1xuICAgICAgaUtleVBhZFtpXSA9IDB4MzYgXiBiO1xuICAgIH1cblxuICAgIFNoYTI1Ni5jYWxsKHRoaXMsIGlzMjI0LCBzaGFyZWRNZW1vcnkpO1xuXG4gICAgdGhpcy51cGRhdGUoaUtleVBhZCk7XG4gICAgdGhpcy5vS2V5UGFkID0gb0tleVBhZDtcbiAgICB0aGlzLmlubmVyID0gdHJ1ZTtcbiAgICB0aGlzLnNoYXJlZE1lbW9yeSA9IHNoYXJlZE1lbW9yeTtcbiAgfVxuICBIbWFjU2hhMjU2LnByb3RvdHlwZSA9IG5ldyBTaGEyNTYoKTtcblxuICBIbWFjU2hhMjU2LnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBTaGEyNTYucHJvdG90eXBlLmZpbmFsaXplLmNhbGwodGhpcyk7XG4gICAgaWYgKHRoaXMuaW5uZXIpIHtcbiAgICAgIHRoaXMuaW5uZXIgPSBmYWxzZTtcbiAgICAgIHZhciBpbm5lckhhc2ggPSB0aGlzLmFycmF5KCk7XG4gICAgICBTaGEyNTYuY2FsbCh0aGlzLCB0aGlzLmlzMjI0LCB0aGlzLnNoYXJlZE1lbW9yeSk7XG4gICAgICB0aGlzLnVwZGF0ZSh0aGlzLm9LZXlQYWQpO1xuICAgICAgdGhpcy51cGRhdGUoaW5uZXJIYXNoKTtcbiAgICAgIFNoYTI1Ni5wcm90b3R5cGUuZmluYWxpemUuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGV4cG9ydHMgPSBjcmVhdGVNZXRob2QoKTtcbiAgZXhwb3J0cy5zaGEyNTYgPSBleHBvcnRzO1xuICBleHBvcnRzLnNoYTIyNCA9IGNyZWF0ZU1ldGhvZCh0cnVlKTtcbiAgZXhwb3J0cy5zaGEyNTYuaG1hYyA9IGNyZWF0ZUhtYWNNZXRob2QoKTtcbiAgZXhwb3J0cy5zaGEyMjQuaG1hYyA9IGNyZWF0ZUhtYWNNZXRob2QodHJ1ZSk7XG5cbiAgaWYgKENPTU1PTl9KUykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cztcbiAgfSBlbHNlIHtcbiAgICByb290LnNoYTI1NiA9IGV4cG9ydHMuc2hhMjU2O1xuICAgIHJvb3Quc2hhMjI0ID0gZXhwb3J0cy5zaGEyMjQ7XG4gICAgaWYgKEFNRCkge1xuICAgICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHM7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn0pKCk7XG4iLCAiLypcbiAqICBDb3B5cmlnaHQgMjAxMSBUd2l0dGVyLCBJbmMuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4oZnVuY3Rpb24gKEhvZ2FuKSB7XG4gIC8vIFNldHVwIHJlZ2V4ICBhc3NpZ25tZW50c1xuICAvLyByZW1vdmUgd2hpdGVzcGFjZSBhY2NvcmRpbmcgdG8gTXVzdGFjaGUgc3BlY1xuICB2YXIgcklzV2hpdGVzcGFjZSA9IC9cXFMvLFxuICAgICAgclF1b3QgPSAvXFxcIi9nLFxuICAgICAgck5ld2xpbmUgPSAgL1xcbi9nLFxuICAgICAgckNyID0gL1xcci9nLFxuICAgICAgclNsYXNoID0gL1xcXFwvZyxcbiAgICAgIHJMaW5lU2VwID0gL1xcdTIwMjgvLFxuICAgICAgclBhcmFncmFwaFNlcCA9IC9cXHUyMDI5LztcblxuICBIb2dhbi50YWdzID0ge1xuICAgICcjJzogMSwgJ14nOiAyLCAnPCc6IDMsICckJzogNCxcbiAgICAnLyc6IDUsICchJzogNiwgJz4nOiA3LCAnPSc6IDgsICdfdic6IDksXG4gICAgJ3snOiAxMCwgJyYnOiAxMSwgJ190JzogMTJcbiAgfTtcblxuICBIb2dhbi5zY2FuID0gZnVuY3Rpb24gc2Nhbih0ZXh0LCBkZWxpbWl0ZXJzKSB7XG4gICAgdmFyIGxlbiA9IHRleHQubGVuZ3RoLFxuICAgICAgICBJTl9URVhUID0gMCxcbiAgICAgICAgSU5fVEFHX1RZUEUgPSAxLFxuICAgICAgICBJTl9UQUcgPSAyLFxuICAgICAgICBzdGF0ZSA9IElOX1RFWFQsXG4gICAgICAgIHRhZ1R5cGUgPSBudWxsLFxuICAgICAgICB0YWcgPSBudWxsLFxuICAgICAgICBidWYgPSAnJyxcbiAgICAgICAgdG9rZW5zID0gW10sXG4gICAgICAgIHNlZW5UYWcgPSBmYWxzZSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIGxpbmVTdGFydCA9IDAsXG4gICAgICAgIG90YWcgPSAne3snLFxuICAgICAgICBjdGFnID0gJ319JztcblxuICAgIGZ1bmN0aW9uIGFkZEJ1ZigpIHtcbiAgICAgIGlmIChidWYubGVuZ3RoID4gMCkge1xuICAgICAgICB0b2tlbnMucHVzaCh7dGFnOiAnX3QnLCB0ZXh0OiBuZXcgU3RyaW5nKGJ1Zil9KTtcbiAgICAgICAgYnVmID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZUlzV2hpdGVzcGFjZSgpIHtcbiAgICAgIHZhciBpc0FsbFdoaXRlc3BhY2UgPSB0cnVlO1xuICAgICAgZm9yICh2YXIgaiA9IGxpbmVTdGFydDsgaiA8IHRva2Vucy5sZW5ndGg7IGorKykge1xuICAgICAgICBpc0FsbFdoaXRlc3BhY2UgPVxuICAgICAgICAgIChIb2dhbi50YWdzW3Rva2Vuc1tqXS50YWddIDwgSG9nYW4udGFnc1snX3YnXSkgfHxcbiAgICAgICAgICAodG9rZW5zW2pdLnRhZyA9PSAnX3QnICYmIHRva2Vuc1tqXS50ZXh0Lm1hdGNoKHJJc1doaXRlc3BhY2UpID09PSBudWxsKTtcbiAgICAgICAgaWYgKCFpc0FsbFdoaXRlc3BhY2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzQWxsV2hpdGVzcGFjZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaWx0ZXJMaW5lKGhhdmVTZWVuVGFnLCBub05ld0xpbmUpIHtcbiAgICAgIGFkZEJ1ZigpO1xuXG4gICAgICBpZiAoaGF2ZVNlZW5UYWcgJiYgbGluZUlzV2hpdGVzcGFjZSgpKSB7XG4gICAgICAgIGZvciAodmFyIGogPSBsaW5lU3RhcnQsIG5leHQ7IGogPCB0b2tlbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAodG9rZW5zW2pdLnRleHQpIHtcbiAgICAgICAgICAgIGlmICgobmV4dCA9IHRva2Vuc1tqKzFdKSAmJiBuZXh0LnRhZyA9PSAnPicpIHtcbiAgICAgICAgICAgICAgLy8gc2V0IGluZGVudCB0byB0b2tlbiB2YWx1ZVxuICAgICAgICAgICAgICBuZXh0LmluZGVudCA9IHRva2Vuc1tqXS50ZXh0LnRvU3RyaW5nKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFub05ld0xpbmUpIHtcbiAgICAgICAgdG9rZW5zLnB1c2goe3RhZzonXFxuJ30pO1xuICAgICAgfVxuXG4gICAgICBzZWVuVGFnID0gZmFsc2U7XG4gICAgICBsaW5lU3RhcnQgPSB0b2tlbnMubGVuZ3RoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoYW5nZURlbGltaXRlcnModGV4dCwgaW5kZXgpIHtcbiAgICAgIHZhciBjbG9zZSA9ICc9JyArIGN0YWcsXG4gICAgICAgICAgY2xvc2VJbmRleCA9IHRleHQuaW5kZXhPZihjbG9zZSwgaW5kZXgpLFxuICAgICAgICAgIGRlbGltaXRlcnMgPSB0cmltKFxuICAgICAgICAgICAgdGV4dC5zdWJzdHJpbmcodGV4dC5pbmRleE9mKCc9JywgaW5kZXgpICsgMSwgY2xvc2VJbmRleClcbiAgICAgICAgICApLnNwbGl0KCcgJyk7XG5cbiAgICAgIG90YWcgPSBkZWxpbWl0ZXJzWzBdO1xuICAgICAgY3RhZyA9IGRlbGltaXRlcnNbZGVsaW1pdGVycy5sZW5ndGggLSAxXTtcblxuICAgICAgcmV0dXJuIGNsb3NlSW5kZXggKyBjbG9zZS5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIGlmIChkZWxpbWl0ZXJzKSB7XG4gICAgICBkZWxpbWl0ZXJzID0gZGVsaW1pdGVycy5zcGxpdCgnICcpO1xuICAgICAgb3RhZyA9IGRlbGltaXRlcnNbMF07XG4gICAgICBjdGFnID0gZGVsaW1pdGVyc1sxXTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChzdGF0ZSA9PSBJTl9URVhUKSB7XG4gICAgICAgIGlmICh0YWdDaGFuZ2Uob3RhZywgdGV4dCwgaSkpIHtcbiAgICAgICAgICAtLWk7XG4gICAgICAgICAgYWRkQnVmKCk7XG4gICAgICAgICAgc3RhdGUgPSBJTl9UQUdfVFlQRTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGZpbHRlckxpbmUoc2VlblRhZyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZiArPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gSU5fVEFHX1RZUEUpIHtcbiAgICAgICAgaSArPSBvdGFnLmxlbmd0aCAtIDE7XG4gICAgICAgIHRhZyA9IEhvZ2FuLnRhZ3NbdGV4dC5jaGFyQXQoaSArIDEpXTtcbiAgICAgICAgdGFnVHlwZSA9IHRhZyA/IHRleHQuY2hhckF0KGkgKyAxKSA6ICdfdic7XG4gICAgICAgIGlmICh0YWdUeXBlID09ICc9Jykge1xuICAgICAgICAgIGkgPSBjaGFuZ2VEZWxpbWl0ZXJzKHRleHQsIGkpO1xuICAgICAgICAgIHN0YXRlID0gSU5fVEVYVDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGFnKSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gSU5fVEFHO1xuICAgICAgICB9XG4gICAgICAgIHNlZW5UYWcgPSBpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRhZ0NoYW5nZShjdGFnLCB0ZXh0LCBpKSkge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHt0YWc6IHRhZ1R5cGUsIG46IHRyaW0oYnVmKSwgb3RhZzogb3RhZywgY3RhZzogY3RhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgaTogKHRhZ1R5cGUgPT0gJy8nKSA/IHNlZW5UYWcgLSBvdGFnLmxlbmd0aCA6IGkgKyBjdGFnLmxlbmd0aH0pO1xuICAgICAgICAgIGJ1ZiA9ICcnO1xuICAgICAgICAgIGkgKz0gY3RhZy5sZW5ndGggLSAxO1xuICAgICAgICAgIHN0YXRlID0gSU5fVEVYVDtcbiAgICAgICAgICBpZiAodGFnVHlwZSA9PSAneycpIHtcbiAgICAgICAgICAgIGlmIChjdGFnID09ICd9fScpIHtcbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2xlYW5UcmlwbGVTdGFjaGUodG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZiArPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZpbHRlckxpbmUoc2VlblRhZywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW5UcmlwbGVTdGFjaGUodG9rZW4pIHtcbiAgICBpZiAodG9rZW4ubi5zdWJzdHIodG9rZW4ubi5sZW5ndGggLSAxKSA9PT0gJ30nKSB7XG4gICAgICB0b2tlbi5uID0gdG9rZW4ubi5zdWJzdHJpbmcoMCwgdG9rZW4ubi5sZW5ndGggLSAxKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cmltKHMpIHtcbiAgICBpZiAocy50cmltKSB7XG4gICAgICByZXR1cm4gcy50cmltKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGFnQ2hhbmdlKHRhZywgdGV4dCwgaW5kZXgpIHtcbiAgICBpZiAodGV4dC5jaGFyQXQoaW5kZXgpICE9IHRhZy5jaGFyQXQoMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMSwgbCA9IHRhZy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXh0LmNoYXJBdChpbmRleCArIGkpICE9IHRhZy5jaGFyQXQoaSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gdGhlIHRhZ3MgYWxsb3dlZCBpbnNpZGUgc3VwZXIgdGVtcGxhdGVzXG4gIHZhciBhbGxvd2VkSW5TdXBlciA9IHsnX3QnOiB0cnVlLCAnXFxuJzogdHJ1ZSwgJyQnOiB0cnVlLCAnLyc6IHRydWV9O1xuXG4gIGZ1bmN0aW9uIGJ1aWxkVHJlZSh0b2tlbnMsIGtpbmQsIHN0YWNrLCBjdXN0b21UYWdzKSB7XG4gICAgdmFyIGluc3RydWN0aW9ucyA9IFtdLFxuICAgICAgICBvcGVuZXIgPSBudWxsLFxuICAgICAgICB0YWlsID0gbnVsbCxcbiAgICAgICAgdG9rZW4gPSBudWxsO1xuXG4gICAgdGFpbCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICB0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXG4gICAgICBpZiAodGFpbCAmJiB0YWlsLnRhZyA9PSAnPCcgJiYgISh0b2tlbi50YWcgaW4gYWxsb3dlZEluU3VwZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBjb250ZW50IGluIDwgc3VwZXIgdGFnLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoSG9nYW4udGFnc1t0b2tlbi50YWddIDw9IEhvZ2FuLnRhZ3NbJyQnXSB8fCBpc09wZW5lcih0b2tlbiwgY3VzdG9tVGFncykpIHtcbiAgICAgICAgc3RhY2sucHVzaCh0b2tlbik7XG4gICAgICAgIHRva2VuLm5vZGVzID0gYnVpbGRUcmVlKHRva2VucywgdG9rZW4udGFnLCBzdGFjaywgY3VzdG9tVGFncyk7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuLnRhZyA9PSAnLycpIHtcbiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2xvc2luZyB0YWcgd2l0aG91dCBvcGVuZXI6IC8nICsgdG9rZW4ubik7XG4gICAgICAgIH1cbiAgICAgICAgb3BlbmVyID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGlmICh0b2tlbi5uICE9IG9wZW5lci5uICYmICFpc0Nsb3Nlcih0b2tlbi5uLCBvcGVuZXIubiwgY3VzdG9tVGFncykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lc3RpbmcgZXJyb3I6ICcgKyBvcGVuZXIubiArICcgdnMuICcgKyB0b2tlbi5uKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVuZXIuZW5kID0gdG9rZW4uaTtcbiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgICAgIH0gZWxzZSBpZiAodG9rZW4udGFnID09ICdcXG4nKSB7XG4gICAgICAgIHRva2VuLmxhc3QgPSAodG9rZW5zLmxlbmd0aCA9PSAwKSB8fCAodG9rZW5zWzBdLnRhZyA9PSAnXFxuJyk7XG4gICAgICB9XG5cbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKHRva2VuKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNsb3NpbmcgdGFnOiAnICsgc3RhY2sucG9wKCkubik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzT3BlbmVyKHRva2VuLCB0YWdzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0YWdzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRhZ3NbaV0ubyA9PSB0b2tlbi5uKSB7XG4gICAgICAgIHRva2VuLnRhZyA9ICcjJztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNDbG9zZXIoY2xvc2UsIG9wZW4sIHRhZ3MpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRhZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGFnc1tpXS5jID09IGNsb3NlICYmIHRhZ3NbaV0ubyA9PSBvcGVuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cmluZ2lmeVN1YnN0aXR1dGlvbnMob2JqKSB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaXRlbXMucHVzaCgnXCInICsgZXNjKGtleSkgKyAnXCI6IGZ1bmN0aW9uKGMscCx0LGkpIHsnICsgb2JqW2tleV0gKyAnfScpO1xuICAgIH1cbiAgICByZXR1cm4gXCJ7IFwiICsgaXRlbXMuam9pbihcIixcIikgKyBcIiB9XCI7XG4gIH1cblxuICBmdW5jdGlvbiBzdHJpbmdpZnlQYXJ0aWFscyhjb2RlT2JqKSB7XG4gICAgdmFyIHBhcnRpYWxzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIGNvZGVPYmoucGFydGlhbHMpIHtcbiAgICAgIHBhcnRpYWxzLnB1c2goJ1wiJyArIGVzYyhrZXkpICsgJ1wiOntuYW1lOlwiJyArIGVzYyhjb2RlT2JqLnBhcnRpYWxzW2tleV0ubmFtZSkgKyAnXCIsICcgKyBzdHJpbmdpZnlQYXJ0aWFscyhjb2RlT2JqLnBhcnRpYWxzW2tleV0pICsgXCJ9XCIpO1xuICAgIH1cbiAgICByZXR1cm4gXCJwYXJ0aWFsczoge1wiICsgcGFydGlhbHMuam9pbihcIixcIikgKyBcIn0sIHN1YnM6IFwiICsgc3RyaW5naWZ5U3Vic3RpdHV0aW9ucyhjb2RlT2JqLnN1YnMpO1xuICB9XG5cbiAgSG9nYW4uc3RyaW5naWZ5ID0gZnVuY3Rpb24oY29kZU9iaiwgdGV4dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBcIntjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgXCIgKyBIb2dhbi53cmFwTWFpbihjb2RlT2JqLmNvZGUpICsgXCIgfSxcIiArIHN0cmluZ2lmeVBhcnRpYWxzKGNvZGVPYmopICsgIFwifVwiO1xuICB9XG5cbiAgdmFyIHNlcmlhbE5vID0gMDtcbiAgSG9nYW4uZ2VuZXJhdGUgPSBmdW5jdGlvbih0cmVlLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgc2VyaWFsTm8gPSAwO1xuICAgIHZhciBjb250ZXh0ID0geyBjb2RlOiAnJywgc3Viczoge30sIHBhcnRpYWxzOiB7fSB9O1xuICAgIEhvZ2FuLndhbGsodHJlZSwgY29udGV4dCk7XG5cbiAgICBpZiAob3B0aW9ucy5hc1N0cmluZykge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyaW5naWZ5KGNvbnRleHQsIHRleHQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VUZW1wbGF0ZShjb250ZXh0LCB0ZXh0LCBvcHRpb25zKTtcbiAgfVxuXG4gIEhvZ2FuLndyYXBNYWluID0gZnVuY3Rpb24oY29kZSkge1xuICAgIHJldHVybiAndmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTsnICsgY29kZSArICdyZXR1cm4gdC5mbCgpOyc7XG4gIH1cblxuICBIb2dhbi50ZW1wbGF0ZSA9IEhvZ2FuLlRlbXBsYXRlO1xuXG4gIEhvZ2FuLm1ha2VUZW1wbGF0ZSA9IGZ1bmN0aW9uKGNvZGVPYmosIHRleHQsIG9wdGlvbnMpIHtcbiAgICB2YXIgdGVtcGxhdGUgPSB0aGlzLm1ha2VQYXJ0aWFscyhjb2RlT2JqKTtcbiAgICB0ZW1wbGF0ZS5jb2RlID0gbmV3IEZ1bmN0aW9uKCdjJywgJ3AnLCAnaScsIHRoaXMud3JhcE1haW4oY29kZU9iai5jb2RlKSk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLnRlbXBsYXRlKHRlbXBsYXRlLCB0ZXh0LCB0aGlzLCBvcHRpb25zKTtcbiAgfVxuXG4gIEhvZ2FuLm1ha2VQYXJ0aWFscyA9IGZ1bmN0aW9uKGNvZGVPYmopIHtcbiAgICB2YXIga2V5LCB0ZW1wbGF0ZSA9IHtzdWJzOiB7fSwgcGFydGlhbHM6IGNvZGVPYmoucGFydGlhbHMsIG5hbWU6IGNvZGVPYmoubmFtZX07XG4gICAgZm9yIChrZXkgaW4gdGVtcGxhdGUucGFydGlhbHMpIHtcbiAgICAgIHRlbXBsYXRlLnBhcnRpYWxzW2tleV0gPSB0aGlzLm1ha2VQYXJ0aWFscyh0ZW1wbGF0ZS5wYXJ0aWFsc1trZXldKTtcbiAgICB9XG4gICAgZm9yIChrZXkgaW4gY29kZU9iai5zdWJzKSB7XG4gICAgICB0ZW1wbGF0ZS5zdWJzW2tleV0gPSBuZXcgRnVuY3Rpb24oJ2MnLCAncCcsICd0JywgJ2knLCBjb2RlT2JqLnN1YnNba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVzYyhzKSB7XG4gICAgcmV0dXJuIHMucmVwbGFjZShyU2xhc2gsICdcXFxcXFxcXCcpXG4gICAgICAgICAgICAucmVwbGFjZShyUXVvdCwgJ1xcXFxcXFwiJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHJOZXdsaW5lLCAnXFxcXG4nKVxuICAgICAgICAgICAgLnJlcGxhY2UockNyLCAnXFxcXHInKVxuICAgICAgICAgICAgLnJlcGxhY2UockxpbmVTZXAsICdcXFxcdTIwMjgnKVxuICAgICAgICAgICAgLnJlcGxhY2UoclBhcmFncmFwaFNlcCwgJ1xcXFx1MjAyOScpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hvb3NlTWV0aG9kKHMpIHtcbiAgICByZXR1cm4gKH5zLmluZGV4T2YoJy4nKSkgPyAnZCcgOiAnZic7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKG5vZGUsIGNvbnRleHQpIHtcbiAgICB2YXIgcHJlZml4ID0gXCI8XCIgKyAoY29udGV4dC5wcmVmaXggfHwgXCJcIik7XG4gICAgdmFyIHN5bSA9IHByZWZpeCArIG5vZGUubiArIHNlcmlhbE5vKys7XG4gICAgY29udGV4dC5wYXJ0aWFsc1tzeW1dID0ge25hbWU6IG5vZGUubiwgcGFydGlhbHM6IHt9fTtcbiAgICBjb250ZXh0LmNvZGUgKz0gJ3QuYih0LnJwKFwiJyArICBlc2Moc3ltKSArICdcIixjLHAsXCInICsgKG5vZGUuaW5kZW50IHx8ICcnKSArICdcIikpOyc7XG4gICAgcmV0dXJuIHN5bTtcbiAgfVxuXG4gIEhvZ2FuLmNvZGVnZW4gPSB7XG4gICAgJyMnOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gJ2lmKHQucyh0LicgKyBjaG9vc2VNZXRob2Qobm9kZS5uKSArICcoXCInICsgZXNjKG5vZGUubikgKyAnXCIsYyxwLDEpLCcgK1xuICAgICAgICAgICAgICAgICAgICAgICdjLHAsMCwnICsgbm9kZS5pICsgJywnICsgbm9kZS5lbmQgKyAnLFwiJyArIG5vZGUub3RhZyArIFwiIFwiICsgbm9kZS5jdGFnICsgJ1wiKSl7JyArXG4gICAgICAgICAgICAgICAgICAgICAgJ3QucnMoYyxwLCcgKyAnZnVuY3Rpb24oYyxwLHQpeyc7XG4gICAgICBIb2dhbi53YWxrKG5vZGUubm9kZXMsIGNvbnRleHQpO1xuICAgICAgY29udGV4dC5jb2RlICs9ICd9KTtjLnBvcCgpO30nO1xuICAgIH0sXG5cbiAgICAnXic6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIGNvbnRleHQuY29kZSArPSAnaWYoIXQucyh0LicgKyBjaG9vc2VNZXRob2Qobm9kZS5uKSArICcoXCInICsgZXNjKG5vZGUubikgKyAnXCIsYyxwLDEpLGMscCwxLDAsMCxcIlwiKSl7JztcbiAgICAgIEhvZ2FuLndhbGsobm9kZS5ub2RlcywgY29udGV4dCk7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gJ307JztcbiAgICB9LFxuXG4gICAgJz4nOiBjcmVhdGVQYXJ0aWFsLFxuICAgICc8JzogZnVuY3Rpb24obm9kZSwgY29udGV4dCkge1xuICAgICAgdmFyIGN0eCA9IHtwYXJ0aWFsczoge30sIGNvZGU6ICcnLCBzdWJzOiB7fSwgaW5QYXJ0aWFsOiB0cnVlfTtcbiAgICAgIEhvZ2FuLndhbGsobm9kZS5ub2RlcywgY3R4KTtcbiAgICAgIHZhciB0ZW1wbGF0ZSA9IGNvbnRleHQucGFydGlhbHNbY3JlYXRlUGFydGlhbChub2RlLCBjb250ZXh0KV07XG4gICAgICB0ZW1wbGF0ZS5zdWJzID0gY3R4LnN1YnM7XG4gICAgICB0ZW1wbGF0ZS5wYXJ0aWFscyA9IGN0eC5wYXJ0aWFscztcbiAgICB9LFxuXG4gICAgJyQnOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgY3R4ID0ge3N1YnM6IHt9LCBjb2RlOiAnJywgcGFydGlhbHM6IGNvbnRleHQucGFydGlhbHMsIHByZWZpeDogbm9kZS5ufTtcbiAgICAgIEhvZ2FuLndhbGsobm9kZS5ub2RlcywgY3R4KTtcbiAgICAgIGNvbnRleHQuc3Vic1tub2RlLm5dID0gY3R4LmNvZGU7XG4gICAgICBpZiAoIWNvbnRleHQuaW5QYXJ0aWFsKSB7XG4gICAgICAgIGNvbnRleHQuY29kZSArPSAndC5zdWIoXCInICsgZXNjKG5vZGUubikgKyAnXCIsYyxwLGkpOyc7XG4gICAgICB9XG4gICAgfSxcblxuICAgICdcXG4nOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gd3JpdGUoJ1wiXFxcXG5cIicgKyAobm9kZS5sYXN0ID8gJycgOiAnICsgaScpKTtcbiAgICB9LFxuXG4gICAgJ192JzogZnVuY3Rpb24obm9kZSwgY29udGV4dCkge1xuICAgICAgY29udGV4dC5jb2RlICs9ICd0LmIodC52KHQuJyArIGNob29zZU1ldGhvZChub2RlLm4pICsgJyhcIicgKyBlc2Mobm9kZS5uKSArICdcIixjLHAsMCkpKTsnO1xuICAgIH0sXG5cbiAgICAnX3QnOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gd3JpdGUoJ1wiJyArIGVzYyhub2RlLnRleHQpICsgJ1wiJyk7XG4gICAgfSxcblxuICAgICd7JzogdHJpcGxlU3RhY2hlLFxuXG4gICAgJyYnOiB0cmlwbGVTdGFjaGVcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaXBsZVN0YWNoZShub2RlLCBjb250ZXh0KSB7XG4gICAgY29udGV4dC5jb2RlICs9ICd0LmIodC50KHQuJyArIGNob29zZU1ldGhvZChub2RlLm4pICsgJyhcIicgKyBlc2Mobm9kZS5uKSArICdcIixjLHAsMCkpKTsnO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGUocykge1xuICAgIHJldHVybiAndC5iKCcgKyBzICsgJyk7JztcbiAgfVxuXG4gIEhvZ2FuLndhbGsgPSBmdW5jdGlvbihub2RlbGlzdCwgY29udGV4dCkge1xuICAgIHZhciBmdW5jO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gbm9kZWxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmdW5jID0gSG9nYW4uY29kZWdlbltub2RlbGlzdFtpXS50YWddO1xuICAgICAgZnVuYyAmJiBmdW5jKG5vZGVsaXN0W2ldLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICBIb2dhbi5wYXJzZSA9IGZ1bmN0aW9uKHRva2VucywgdGV4dCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBidWlsZFRyZWUodG9rZW5zLCAnJywgW10sIG9wdGlvbnMuc2VjdGlvblRhZ3MgfHwgW10pO1xuICB9XG5cbiAgSG9nYW4uY2FjaGUgPSB7fTtcblxuICBIb2dhbi5jYWNoZUtleSA9IGZ1bmN0aW9uKHRleHQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gW3RleHQsICEhb3B0aW9ucy5hc1N0cmluZywgISFvcHRpb25zLmRpc2FibGVMYW1iZGEsIG9wdGlvbnMuZGVsaW1pdGVycywgISFvcHRpb25zLm1vZGVsR2V0XS5qb2luKCd8fCcpO1xuICB9XG5cbiAgSG9nYW4uY29tcGlsZSA9IGZ1bmN0aW9uKHRleHQsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIga2V5ID0gSG9nYW4uY2FjaGVLZXkodGV4dCwgb3B0aW9ucyk7XG4gICAgdmFyIHRlbXBsYXRlID0gdGhpcy5jYWNoZVtrZXldO1xuXG4gICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICB2YXIgcGFydGlhbHMgPSB0ZW1wbGF0ZS5wYXJ0aWFscztcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gcGFydGlhbHMpIHtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxzW25hbWVdLmluc3RhbmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH1cblxuICAgIHRlbXBsYXRlID0gdGhpcy5nZW5lcmF0ZSh0aGlzLnBhcnNlKHRoaXMuc2Nhbih0ZXh0LCBvcHRpb25zLmRlbGltaXRlcnMpLCB0ZXh0LCBvcHRpb25zKSwgdGV4dCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVba2V5XSA9IHRlbXBsYXRlO1xuICB9XG59KSh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcgPyBleHBvcnRzIDogSG9nYW4pO1xuIiwgIi8qXG4gKiAgQ29weXJpZ2h0IDIwMTEgVHdpdHRlciwgSW5jLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxudmFyIEhvZ2FuID0ge307XG5cbihmdW5jdGlvbiAoSG9nYW4pIHtcbiAgSG9nYW4uVGVtcGxhdGUgPSBmdW5jdGlvbiAoY29kZU9iaiwgdGV4dCwgY29tcGlsZXIsIG9wdGlvbnMpIHtcbiAgICBjb2RlT2JqID0gY29kZU9iaiB8fCB7fTtcbiAgICB0aGlzLnIgPSBjb2RlT2JqLmNvZGUgfHwgdGhpcy5yO1xuICAgIHRoaXMuYyA9IGNvbXBpbGVyO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy50ZXh0ID0gdGV4dCB8fCAnJztcbiAgICB0aGlzLnBhcnRpYWxzID0gY29kZU9iai5wYXJ0aWFscyB8fCB7fTtcbiAgICB0aGlzLnN1YnMgPSBjb2RlT2JqLnN1YnMgfHwge307XG4gICAgdGhpcy5idWYgPSAnJztcbiAgfVxuXG4gIEhvZ2FuLlRlbXBsYXRlLnByb3RvdHlwZSA9IHtcbiAgICAvLyByZW5kZXI6IHJlcGxhY2VkIGJ5IGdlbmVyYXRlZCBjb2RlLlxuICAgIHI6IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KSB7IHJldHVybiAnJzsgfSxcblxuICAgIC8vIHZhcmlhYmxlIGVzY2FwaW5nXG4gICAgdjogaG9nYW5Fc2NhcGUsXG5cbiAgICAvLyB0cmlwbGUgc3RhY2hlXG4gICAgdDogY29lcmNlVG9TdHJpbmcsXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5yaShbY29udGV4dF0sIHBhcnRpYWxzIHx8IHt9LCBpbmRlbnQpO1xuICAgIH0sXG5cbiAgICAvLyByZW5kZXIgaW50ZXJuYWwgLS0gYSBob29rIGZvciBvdmVycmlkZXMgdGhhdCBjYXRjaGVzIHBhcnRpYWxzIHRvb1xuICAgIHJpOiBmdW5jdGlvbiAoY29udGV4dCwgcGFydGlhbHMsIGluZGVudCkge1xuICAgICAgcmV0dXJuIHRoaXMucihjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KTtcbiAgICB9LFxuXG4gICAgLy8gZW5zdXJlUGFydGlhbFxuICAgIGVwOiBmdW5jdGlvbihzeW1ib2wsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgcGFydGlhbCA9IHRoaXMucGFydGlhbHNbc3ltYm9sXTtcblxuICAgICAgLy8gY2hlY2sgdG8gc2VlIHRoYXQgaWYgd2UndmUgaW5zdGFudGlhdGVkIHRoaXMgcGFydGlhbCBiZWZvcmVcbiAgICAgIHZhciB0ZW1wbGF0ZSA9IHBhcnRpYWxzW3BhcnRpYWwubmFtZV07XG4gICAgICBpZiAocGFydGlhbC5pbnN0YW5jZSAmJiBwYXJ0aWFsLmJhc2UgPT0gdGVtcGxhdGUpIHtcbiAgICAgICAgcmV0dXJuIHBhcnRpYWwuaW5zdGFuY2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKCF0aGlzLmMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb21waWxlciBhdmFpbGFibGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlID0gdGhpcy5jLmNvbXBpbGUodGVtcGxhdGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIHVzZSB0aGlzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBhcnRpYWxzIGRpY3Rpb25hcnkgaGFzIGNoYW5nZWRcbiAgICAgIHRoaXMucGFydGlhbHNbc3ltYm9sXS5iYXNlID0gdGVtcGxhdGU7XG5cbiAgICAgIGlmIChwYXJ0aWFsLnN1YnMpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNvbnNpZGVyIHBhcmVudCB0ZW1wbGF0ZSBub3dcbiAgICAgICAgaWYgKCFwYXJ0aWFscy5zdGFja1RleHQpIHBhcnRpYWxzLnN0YWNrVGV4dCA9IHt9O1xuICAgICAgICBmb3IgKGtleSBpbiBwYXJ0aWFsLnN1YnMpIHtcbiAgICAgICAgICBpZiAoIXBhcnRpYWxzLnN0YWNrVGV4dFtrZXldKSB7XG4gICAgICAgICAgICBwYXJ0aWFscy5zdGFja1RleHRba2V5XSA9ICh0aGlzLmFjdGl2ZVN1YiAhPT0gdW5kZWZpbmVkICYmIHBhcnRpYWxzLnN0YWNrVGV4dFt0aGlzLmFjdGl2ZVN1Yl0pID8gcGFydGlhbHMuc3RhY2tUZXh0W3RoaXMuYWN0aXZlU3ViXSA6IHRoaXMudGV4dDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGVtcGxhdGUgPSBjcmVhdGVTcGVjaWFsaXplZFBhcnRpYWwodGVtcGxhdGUsIHBhcnRpYWwuc3VicywgcGFydGlhbC5wYXJ0aWFscyxcbiAgICAgICAgICB0aGlzLnN0YWNrU3VicywgdGhpcy5zdGFja1BhcnRpYWxzLCBwYXJ0aWFscy5zdGFja1RleHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5wYXJ0aWFsc1tzeW1ib2xdLmluc3RhbmNlID0gdGVtcGxhdGU7XG5cbiAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgLy8gdHJpZXMgdG8gZmluZCBhIHBhcnRpYWwgaW4gdGhlIGN1cnJlbnQgc2NvcGUgYW5kIHJlbmRlciBpdFxuICAgIHJwOiBmdW5jdGlvbihzeW1ib2wsIGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpIHtcbiAgICAgIHZhciBwYXJ0aWFsID0gdGhpcy5lcChzeW1ib2wsIHBhcnRpYWxzKTtcbiAgICAgIGlmICghcGFydGlhbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJ0aWFsLnJpKGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpO1xuICAgIH0sXG5cbiAgICAvLyByZW5kZXIgYSBzZWN0aW9uXG4gICAgcnM6IGZ1bmN0aW9uKGNvbnRleHQsIHBhcnRpYWxzLCBzZWN0aW9uKSB7XG4gICAgICB2YXIgdGFpbCA9IGNvbnRleHRbY29udGV4dC5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKCFpc0FycmF5KHRhaWwpKSB7XG4gICAgICAgIHNlY3Rpb24oY29udGV4dCwgcGFydGlhbHMsIHRoaXMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFpbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb250ZXh0LnB1c2godGFpbFtpXSk7XG4gICAgICAgIHNlY3Rpb24oY29udGV4dCwgcGFydGlhbHMsIHRoaXMpO1xuICAgICAgICBjb250ZXh0LnBvcCgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtYXliZSBzdGFydCBhIHNlY3Rpb25cbiAgICBzOiBmdW5jdGlvbih2YWwsIGN0eCwgcGFydGlhbHMsIGludmVydGVkLCBzdGFydCwgZW5kLCB0YWdzKSB7XG4gICAgICB2YXIgcGFzcztcblxuICAgICAgaWYgKGlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB0aGlzLm1zKHZhbCwgY3R4LCBwYXJ0aWFscywgaW52ZXJ0ZWQsIHN0YXJ0LCBlbmQsIHRhZ3MpO1xuICAgICAgfVxuXG4gICAgICBwYXNzID0gISF2YWw7XG5cbiAgICAgIGlmICghaW52ZXJ0ZWQgJiYgcGFzcyAmJiBjdHgpIHtcbiAgICAgICAgY3R4LnB1c2goKHR5cGVvZiB2YWwgPT0gJ29iamVjdCcpID8gdmFsIDogY3R4W2N0eC5sZW5ndGggLSAxXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXNzO1xuICAgIH0sXG5cbiAgICAvLyBmaW5kIHZhbHVlcyB3aXRoIGRvdHRlZCBuYW1lc1xuICAgIGQ6IGZ1bmN0aW9uKGtleSwgY3R4LCBwYXJ0aWFscywgcmV0dXJuRm91bmQpIHtcbiAgICAgIHZhciBmb3VuZCxcbiAgICAgICAgICBuYW1lcyA9IGtleS5zcGxpdCgnLicpLFxuICAgICAgICAgIHZhbCA9IHRoaXMuZihuYW1lc1swXSwgY3R4LCBwYXJ0aWFscywgcmV0dXJuRm91bmQpLFxuICAgICAgICAgIGRvTW9kZWxHZXQgPSB0aGlzLm9wdGlvbnMubW9kZWxHZXQsXG4gICAgICAgICAgY3ggPSBudWxsO1xuXG4gICAgICBpZiAoa2V5ID09PSAnLicgJiYgaXNBcnJheShjdHhbY3R4Lmxlbmd0aCAtIDJdKSkge1xuICAgICAgICB2YWwgPSBjdHhbY3R4Lmxlbmd0aCAtIDFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGZvdW5kID0gZmluZEluU2NvcGUobmFtZXNbaV0sIHZhbCwgZG9Nb2RlbEdldCk7XG4gICAgICAgICAgaWYgKGZvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN4ID0gdmFsO1xuICAgICAgICAgICAgdmFsID0gZm91bmQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbCA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmV0dXJuRm91bmQgJiYgIXZhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmV0dXJuRm91bmQgJiYgdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGN0eC5wdXNoKGN4KTtcbiAgICAgICAgdmFsID0gdGhpcy5tdih2YWwsIGN0eCwgcGFydGlhbHMpO1xuICAgICAgICBjdHgucG9wKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIGZpbmQgdmFsdWVzIHdpdGggbm9ybWFsIG5hbWVzXG4gICAgZjogZnVuY3Rpb24oa2V5LCBjdHgsIHBhcnRpYWxzLCByZXR1cm5Gb3VuZCkge1xuICAgICAgdmFyIHZhbCA9IGZhbHNlLFxuICAgICAgICAgIHYgPSBudWxsLFxuICAgICAgICAgIGZvdW5kID0gZmFsc2UsXG4gICAgICAgICAgZG9Nb2RlbEdldCA9IHRoaXMub3B0aW9ucy5tb2RlbEdldDtcblxuICAgICAgZm9yICh2YXIgaSA9IGN0eC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2ID0gY3R4W2ldO1xuICAgICAgICB2YWwgPSBmaW5kSW5TY29wZShrZXksIHYsIGRvTW9kZWxHZXQpO1xuICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICByZXR1cm4gKHJldHVybkZvdW5kKSA/IGZhbHNlIDogXCJcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXR1cm5Gb3VuZCAmJiB0eXBlb2YgdmFsID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsID0gdGhpcy5tdih2YWwsIGN0eCwgcGFydGlhbHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICAvLyBoaWdoZXIgb3JkZXIgdGVtcGxhdGVzXG4gICAgbHM6IGZ1bmN0aW9uKGZ1bmMsIGN4LCBwYXJ0aWFscywgdGV4dCwgdGFncykge1xuICAgICAgdmFyIG9sZFRhZ3MgPSB0aGlzLm9wdGlvbnMuZGVsaW1pdGVycztcblxuICAgICAgdGhpcy5vcHRpb25zLmRlbGltaXRlcnMgPSB0YWdzO1xuICAgICAgdGhpcy5iKHRoaXMuY3QoY29lcmNlVG9TdHJpbmcoZnVuYy5jYWxsKGN4LCB0ZXh0KSksIGN4LCBwYXJ0aWFscykpO1xuICAgICAgdGhpcy5vcHRpb25zLmRlbGltaXRlcnMgPSBvbGRUYWdzO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8vIGNvbXBpbGUgdGV4dFxuICAgIGN0OiBmdW5jdGlvbih0ZXh0LCBjeCwgcGFydGlhbHMpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZUxhbWJkYSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xhbWJkYSBmZWF0dXJlcyBkaXNhYmxlZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmMuY29tcGlsZSh0ZXh0LCB0aGlzLm9wdGlvbnMpLnJlbmRlcihjeCwgcGFydGlhbHMpO1xuICAgIH0sXG5cbiAgICAvLyB0ZW1wbGF0ZSByZXN1bHQgYnVmZmVyaW5nXG4gICAgYjogZnVuY3Rpb24ocykgeyB0aGlzLmJ1ZiArPSBzOyB9LFxuXG4gICAgZmw6IGZ1bmN0aW9uKCkgeyB2YXIgciA9IHRoaXMuYnVmOyB0aGlzLmJ1ZiA9ICcnOyByZXR1cm4gcjsgfSxcblxuICAgIC8vIG1ldGhvZCByZXBsYWNlIHNlY3Rpb25cbiAgICBtczogZnVuY3Rpb24oZnVuYywgY3R4LCBwYXJ0aWFscywgaW52ZXJ0ZWQsIHN0YXJ0LCBlbmQsIHRhZ3MpIHtcbiAgICAgIHZhciB0ZXh0U291cmNlLFxuICAgICAgICAgIGN4ID0gY3R4W2N0eC5sZW5ndGggLSAxXSxcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmNhbGwoY3gpO1xuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChpbnZlcnRlZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHRTb3VyY2UgPSAodGhpcy5hY3RpdmVTdWIgJiYgdGhpcy5zdWJzVGV4dCAmJiB0aGlzLnN1YnNUZXh0W3RoaXMuYWN0aXZlU3ViXSkgPyB0aGlzLnN1YnNUZXh0W3RoaXMuYWN0aXZlU3ViXSA6IHRoaXMudGV4dDtcbiAgICAgICAgICByZXR1cm4gdGhpcy5scyhyZXN1bHQsIGN4LCBwYXJ0aWFscywgdGV4dFNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCksIHRhZ3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIC8vIG1ldGhvZCByZXBsYWNlIHZhcmlhYmxlXG4gICAgbXY6IGZ1bmN0aW9uKGZ1bmMsIGN0eCwgcGFydGlhbHMpIHtcbiAgICAgIHZhciBjeCA9IGN0eFtjdHgubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgcmVzdWx0ID0gZnVuYy5jYWxsKGN4KTtcblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGhpcy5jdChjb2VyY2VUb1N0cmluZyhyZXN1bHQuY2FsbChjeCkpLCBjeCwgcGFydGlhbHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBzdWI6IGZ1bmN0aW9uKG5hbWUsIGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpIHtcbiAgICAgIHZhciBmID0gdGhpcy5zdWJzW25hbWVdO1xuICAgICAgaWYgKGYpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTdWIgPSBuYW1lO1xuICAgICAgICBmKGNvbnRleHQsIHBhcnRpYWxzLCB0aGlzLCBpbmRlbnQpO1xuICAgICAgICB0aGlzLmFjdGl2ZVN1YiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICB9O1xuXG4gIC8vRmluZCBhIGtleSBpbiBhbiBvYmplY3RcbiAgZnVuY3Rpb24gZmluZEluU2NvcGUoa2V5LCBzY29wZSwgZG9Nb2RlbEdldCkge1xuICAgIHZhciB2YWw7XG5cbiAgICBpZiAoc2NvcGUgJiYgdHlwZW9mIHNjb3BlID09ICdvYmplY3QnKSB7XG5cbiAgICAgIGlmIChzY29wZVtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsID0gc2NvcGVba2V5XTtcblxuICAgICAgLy8gdHJ5IGxvb2t1cCB3aXRoIGdldCBmb3IgYmFja2JvbmUgb3Igc2ltaWxhciBtb2RlbCBkYXRhXG4gICAgICB9IGVsc2UgaWYgKGRvTW9kZWxHZXQgJiYgc2NvcGUuZ2V0ICYmIHR5cGVvZiBzY29wZS5nZXQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSBzY29wZS5nZXQoa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3BlY2lhbGl6ZWRQYXJ0aWFsKGluc3RhbmNlLCBzdWJzLCBwYXJ0aWFscywgc3RhY2tTdWJzLCBzdGFja1BhcnRpYWxzLCBzdGFja1RleHQpIHtcbiAgICBmdW5jdGlvbiBQYXJ0aWFsVGVtcGxhdGUoKSB7fTtcbiAgICBQYXJ0aWFsVGVtcGxhdGUucHJvdG90eXBlID0gaW5zdGFuY2U7XG4gICAgZnVuY3Rpb24gU3Vic3RpdHV0aW9ucygpIHt9O1xuICAgIFN1YnN0aXR1dGlvbnMucHJvdG90eXBlID0gaW5zdGFuY2Uuc3VicztcbiAgICB2YXIga2V5O1xuICAgIHZhciBwYXJ0aWFsID0gbmV3IFBhcnRpYWxUZW1wbGF0ZSgpO1xuICAgIHBhcnRpYWwuc3VicyA9IG5ldyBTdWJzdGl0dXRpb25zKCk7XG4gICAgcGFydGlhbC5zdWJzVGV4dCA9IHt9OyAgLy9oZWhlLiBzdWJzdGV4dC5cbiAgICBwYXJ0aWFsLmJ1ZiA9ICcnO1xuXG4gICAgc3RhY2tTdWJzID0gc3RhY2tTdWJzIHx8IHt9O1xuICAgIHBhcnRpYWwuc3RhY2tTdWJzID0gc3RhY2tTdWJzO1xuICAgIHBhcnRpYWwuc3Vic1RleHQgPSBzdGFja1RleHQ7XG4gICAgZm9yIChrZXkgaW4gc3Vicykge1xuICAgICAgaWYgKCFzdGFja1N1YnNba2V5XSkgc3RhY2tTdWJzW2tleV0gPSBzdWJzW2tleV07XG4gICAgfVxuICAgIGZvciAoa2V5IGluIHN0YWNrU3Vicykge1xuICAgICAgcGFydGlhbC5zdWJzW2tleV0gPSBzdGFja1N1YnNba2V5XTtcbiAgICB9XG5cbiAgICBzdGFja1BhcnRpYWxzID0gc3RhY2tQYXJ0aWFscyB8fCB7fTtcbiAgICBwYXJ0aWFsLnN0YWNrUGFydGlhbHMgPSBzdGFja1BhcnRpYWxzO1xuICAgIGZvciAoa2V5IGluIHBhcnRpYWxzKSB7XG4gICAgICBpZiAoIXN0YWNrUGFydGlhbHNba2V5XSkgc3RhY2tQYXJ0aWFsc1trZXldID0gcGFydGlhbHNba2V5XTtcbiAgICB9XG4gICAgZm9yIChrZXkgaW4gc3RhY2tQYXJ0aWFscykge1xuICAgICAgcGFydGlhbC5wYXJ0aWFsc1trZXldID0gc3RhY2tQYXJ0aWFsc1trZXldO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0aWFsO1xuICB9XG5cbiAgdmFyIHJBbXAgPSAvJi9nLFxuICAgICAgckx0ID0gLzwvZyxcbiAgICAgIHJHdCA9IC8+L2csXG4gICAgICByQXBvcyA9IC9cXCcvZyxcbiAgICAgIHJRdW90ID0gL1xcXCIvZyxcbiAgICAgIGhDaGFycyA9IC9bJjw+XFxcIlxcJ10vO1xuXG4gIGZ1bmN0aW9uIGNvZXJjZVRvU3RyaW5nKHZhbCkge1xuICAgIHJldHVybiBTdHJpbmcoKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgPyAnJyA6IHZhbCk7XG4gIH1cblxuICBmdW5jdGlvbiBob2dhbkVzY2FwZShzdHIpIHtcbiAgICBzdHIgPSBjb2VyY2VUb1N0cmluZyhzdHIpO1xuICAgIHJldHVybiBoQ2hhcnMudGVzdChzdHIpID9cbiAgICAgIHN0clxuICAgICAgICAucmVwbGFjZShyQW1wLCAnJmFtcDsnKVxuICAgICAgICAucmVwbGFjZShyTHQsICcmbHQ7JylcbiAgICAgICAgLnJlcGxhY2Uockd0LCAnJmd0OycpXG4gICAgICAgIC5yZXBsYWNlKHJBcG9zLCAnJiMzOTsnKVxuICAgICAgICAucmVwbGFjZShyUXVvdCwgJyZxdW90OycpIDpcbiAgICAgIHN0cjtcbiAgfVxuXG4gIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgfTtcblxufSkodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnID8gZXhwb3J0cyA6IEhvZ2FuKTtcbiIsICIvKlxuICogIENvcHlyaWdodCAyMDExIFR3aXR0ZXIsIEluYy5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIFRoaXMgZmlsZSBpcyBmb3IgdXNlIHdpdGggTm9kZS5qcy4gU2VlIGRpc3QvIGZvciBicm93c2VyIGZpbGVzLlxuXG52YXIgSG9nYW4gPSByZXF1aXJlKCcuL2NvbXBpbGVyJyk7XG5Ib2dhbi5UZW1wbGF0ZSA9IHJlcXVpcmUoJy4vdGVtcGxhdGUnKS5UZW1wbGF0ZTtcbkhvZ2FuLnRlbXBsYXRlID0gSG9nYW4uVGVtcGxhdGU7XG5tb2R1bGUuZXhwb3J0cyA9IEhvZ2FuO1xuIiwgIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImZlYXRoZXJcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZmVhdGhlclwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCAiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbiIsICIvKiFcbiAgQ29weXJpZ2h0IChjKSAyMDE2IEplZCBXYXRzb24uXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlXG4gIGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXNcbiovXG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgY2xhc3NOYW1lcyA9IChmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gZG9uJ3QgaW5oZXJpdCBmcm9tIE9iamVjdCBzbyB3ZSBjYW4gc2tpcCBoYXNPd25Qcm9wZXJ0eSBjaGVjayBsYXRlclxuXHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU1MTgzMjgvY3JlYXRpbmctanMtb2JqZWN0LXdpdGgtb2JqZWN0LWNyZWF0ZW51bGwjYW5zd2VyLTIxMDc5MjMyXG5cdFx0ZnVuY3Rpb24gU3RvcmFnZU9iamVjdCgpIHt9XG5cdFx0U3RvcmFnZU9iamVjdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5cdFx0ZnVuY3Rpb24gX3BhcnNlQXJyYXkgKHJlc3VsdFNldCwgYXJyYXkpIHtcblx0XHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0X3BhcnNlKHJlc3VsdFNldCwgYXJyYXlbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRcdGZ1bmN0aW9uIF9wYXJzZU51bWJlciAocmVzdWx0U2V0LCBudW0pIHtcblx0XHRcdHJlc3VsdFNldFtudW1dID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBfcGFyc2VPYmplY3QgKHJlc3VsdFNldCwgb2JqZWN0KSB7XG5cdFx0XHRmb3IgKHZhciBrIGluIG9iamVjdCkge1xuXHRcdFx0XHRpZiAoaGFzT3duLmNhbGwob2JqZWN0LCBrKSkge1xuXHRcdFx0XHRcdC8vIHNldCB2YWx1ZSB0byBmYWxzZSBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0IHRvIGF2b2lkIGNoYW5naW5nIG9iamVjdCBzdHJ1Y3R1cmVcblx0XHRcdFx0XHQvLyBodHRwczovL3d3dy5zbWFzaGluZ21hZ2F6aW5lLmNvbS8yMDEyLzExL3dyaXRpbmctZmFzdC1tZW1vcnktZWZmaWNpZW50LWphdmFzY3JpcHQvI2RlLXJlZmVyZW5jaW5nLW1pc2NvbmNlcHRpb25zXG5cdFx0XHRcdFx0cmVzdWx0U2V0W2tdID0gISFvYmplY3Rba107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgU1BBQ0UgPSAvXFxzKy87XG5cdFx0ZnVuY3Rpb24gX3BhcnNlU3RyaW5nIChyZXN1bHRTZXQsIHN0cikge1xuXHRcdFx0dmFyIGFycmF5ID0gc3RyLnNwbGl0KFNQQUNFKTtcblx0XHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0cmVzdWx0U2V0W2FycmF5W2ldXSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gX3BhcnNlIChyZXN1bHRTZXQsIGFyZykge1xuXHRcdFx0aWYgKCFhcmcpIHJldHVybjtcblx0XHRcdHZhciBhcmdUeXBlID0gdHlwZW9mIGFyZztcblxuXHRcdFx0Ly8gJ2ZvbyBiYXInXG5cdFx0XHRpZiAoYXJnVHlwZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0X3BhcnNlU3RyaW5nKHJlc3VsdFNldCwgYXJnKTtcblxuXHRcdFx0Ly8gWydmb28nLCAnYmFyJywgLi4uXVxuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcblx0XHRcdFx0X3BhcnNlQXJyYXkocmVzdWx0U2V0LCBhcmcpO1xuXG5cdFx0XHQvLyB7ICdmb28nOiB0cnVlLCAuLi4gfVxuXHRcdFx0fSBlbHNlIGlmIChhcmdUeXBlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRfcGFyc2VPYmplY3QocmVzdWx0U2V0LCBhcmcpO1xuXG5cdFx0XHQvLyAnMTMwJ1xuXHRcdFx0fSBlbHNlIGlmIChhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRfcGFyc2VOdW1iZXIocmVzdWx0U2V0LCBhcmcpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIF9jbGFzc05hbWVzICgpIHtcblx0XHRcdC8vIGRvbid0IGxlYWsgYXJndW1lbnRzXG5cdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vcGV0a2FhbnRvbm92L2JsdWViaXJkL3dpa2kvT3B0aW1pemF0aW9uLWtpbGxlcnMjMzItbGVha2luZy1hcmd1bWVudHNcblx0XHRcdHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdFx0dmFyIGFyZ3MgPSBBcnJheShsZW4pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY2xhc3NTZXQgPSBuZXcgU3RvcmFnZU9iamVjdCgpO1xuXHRcdFx0X3BhcnNlQXJyYXkoY2xhc3NTZXQsIGFyZ3MpO1xuXG5cdFx0XHR2YXIgbGlzdCA9IFtdO1xuXG5cdFx0XHRmb3IgKHZhciBrIGluIGNsYXNzU2V0KSB7XG5cdFx0XHRcdGlmIChjbGFzc1NldFtrXSkge1xuXHRcdFx0XHRcdGxpc3QucHVzaChrKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBsaXN0LmpvaW4oJyAnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gX2NsYXNzTmFtZXM7XG5cdH0pKCk7XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWVzO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyByZWdpc3RlciBhcyAnY2xhc3NuYW1lcycsIGNvbnNpc3RlbnQgd2l0aCBucG0gcGFja2FnZSBuYW1lXG5cdFx0ZGVmaW5lKCdjbGFzc25hbWVzJywgW10sIGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5jbGFzc05hbWVzID0gY2xhc3NOYW1lcztcblx0fVxufSgpKTtcbiIsICJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5mcm9tJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5mcm9tO1xuIiwgIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCAidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9iaW5kLWNvbnRleHQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nJyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5O1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgaWYgKG1hcHBpbmcpIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlXG4gIGlmIChpdGVyYXRvck1ldGhvZCAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyYXRvck1ldGhvZCkpKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYXRvck1ldGhvZC5jYWxsKE8pO1xuICAgIHJlc3VsdCA9IG5ldyBDKCk7XG4gICAgZm9yICg7IShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nXG4gICAgICAgID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpXG4gICAgICAgIDogc3RlcC52YWx1ZVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgIH1cbiAgfVxuICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgInZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykge1xuICAgICAgaWYgKE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcbiIsICJ2YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0KTtcbiAgICB9O1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsICJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHZhciByZXR1cm5NZXRob2QgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldHVybk1ldGhvZCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXR1cm5NZXRob2QuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIiwgInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHtcbiAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuIiwgInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsICJ2YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIiwgInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhcyh0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiIsICJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUoa2V5KTtcbiAgaWYgKHByb3BlcnR5S2V5IGluIG9iamVjdCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbcHJvcGVydHlLZXldID0gdmFsdWU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSXRlcmF0b3JzQ29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpO1xuXG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBJdGVyYXRvcnNDb3JlLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBJdGVyYXRvcnNDb3JlLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlM7XG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcbnZhciBFTlRSSUVTID0gJ2VudHJpZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhYmxlLCBOQU1FLCBJdGVyYXRvckNvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuXG4gIHZhciBnZXRJdGVyYXRpb25NZXRob2QgPSBmdW5jdGlvbiAoS0lORCkge1xuICAgIGlmIChLSU5EID09PSBERUZBVUxUICYmIGRlZmF1bHRJdGVyYXRvcikgcmV0dXJuIGRlZmF1bHRJdGVyYXRvcjtcbiAgICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdO1xuICAgIHN3aXRjaCAoS0lORCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgRU5UUklFUzogcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzKTsgfTtcbiAgfTtcblxuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlO1xuICB2YXIgSXRlcmFibGVQcm90b3R5cGUgPSBJdGVyYWJsZS5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVJdGVyYXRvciA9IEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXVxuICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ11cbiAgICB8fCBERUZBVUxUICYmIEl0ZXJhYmxlUHJvdG90eXBlW0RFRkFVTFRdO1xuICB2YXIgZGVmYXVsdEl0ZXJhdG9yID0gIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgbmF0aXZlSXRlcmF0b3IgfHwgZ2V0SXRlcmF0aW9uTWV0aG9kKERFRkFVTFQpO1xuICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7XG4gIHZhciBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIG1ldGhvZHMsIEtFWTtcblxuICAvLyBmaXggbmF0aXZlXG4gIGlmIChhbnlOYXRpdmVJdGVyYXRvcikge1xuICAgIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGFueU5hdGl2ZUl0ZXJhdG9yLmNhbGwobmV3IEl0ZXJhYmxlKCkpKTtcbiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaGlkZShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmF0aXZlSXRlcmF0b3IuY2FsbCh0aGlzKTsgfTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICBoaWRlKEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yKTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgLy8gZXhwb3J0IGFkZGl0aW9uYWwgbWV0aG9kc1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gZGVmYXVsdEl0ZXJhdG9yIDogZ2V0SXRlcmF0aW9uTWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKEtFWSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7XG4gICAgICAgIHJlZGVmaW5lKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7XG4gICAgICB9XG4gICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpO1xuICB9XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwgInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgZXhpc3QgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBleGlzdCA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwgIi8vIElFOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSBbXG4gICdjb25zdHJ1Y3RvcicsXG4gICdoYXNPd25Qcm9wZXJ0eScsXG4gICdpc1Byb3RvdHlwZU9mJyxcbiAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgJ3RvU3RyaW5nJyxcbiAgJ3ZhbHVlT2YnXG5dO1xuIiwgInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLm5vVGFyZ2V0R2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBzZXRHbG9iYWwoVEFSR0VULCB7fSk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0ID0gKGdsb2JhbFtUQVJHRVRdIHx8IHt9KS5wcm90b3R5cGU7XG4gIH1cbiAgaWYgKHRhcmdldCkgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkge1xuICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG4gICAgICB0YXJnZXRQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTtcbiAgICBGT1JDRUQgPSBpc0ZvcmNlZChHTE9CQUwgPyBrZXkgOiBUQVJHRVQgKyAoU1RBVElDID8gJy4nIDogJyMnKSArIGtleSwgb3B0aW9ucy5mb3JjZWQpO1xuICAgIC8vIGNvbnRhaW5lZCBpbiB0YXJnZXRcbiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZVByb3BlcnR5ID09PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlO1xuICAgICAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHkpO1xuICAgIH1cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGhpZGUoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpO1xuICB9XG59O1xuIiwgIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCAidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzaGFyZWQoJ25hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmcnLCBGdW5jdGlvbi50b1N0cmluZyk7XG4iLCAidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwgInZhciBPID0gJ29iamVjdCc7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSBPICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gTyAmJiB3aW5kb3cpIHx8XG4gIGNoZWNrKHR5cGVvZiBzZWxmID09IE8gJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSBPICYmIGdsb2JhbCkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCAidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIiwgIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCAidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuIiwgInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG4iLCAiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIHNwbGl0ID0gJycuc3BsaXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuIiwgInZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIG9iamVjdEhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVApIHtcbiAgdmFyIHN0b3JlID0gbmV3IFdlYWtNYXAoKTtcbiAgdmFyIHdtZ2V0ID0gc3RvcmUuZ2V0O1xuICB2YXIgd21oYXMgPSBzdG9yZS5oYXM7XG4gIHZhciB3bXNldCA9IHN0b3JlLnNldDtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIHdtc2V0LmNhbGwoc3RvcmUsIGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21nZXQuY2FsbChzdG9yZSwgaXQpIHx8IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21oYXMuY2FsbChzdG9yZSwgaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBoaWRlKGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIiwgInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwgInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IHR5cGVvZiBkZXRlY3Rpb24gPT0gJ2Z1bmN0aW9uJyA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwgIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwgIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlYCBvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG5pZiAoSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxuaWYgKCFJU19QVVJFICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSXRlcmF0b3JQcm90b3R5cGU6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTXG59O1xuIiwgIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCAidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICByZXR1cm4gIVN0cmluZyhTeW1ib2woKSk7XG59KTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdG8tc3RyaW5nJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcuY2FsbChXZWFrTWFwKSk7XG4iLCAidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgc2NyaXB0ID0gJ3NjcmlwdCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGpzID0gJ2phdmEnICsgc2NyaXB0ICsgJzonO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoanMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgc2NyaXB0ICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnLycgKyBzY3JpcHQgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuXG5oaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7XG4iLCAidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2krK10sIFByb3BlcnRpZXNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcbiIsICJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlRGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsICJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIXByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIiwgIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiIsICJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwgInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxubW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iLCAidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgYXJyYXlJbmRleE9mID0gYXJyYXlJbmNsdWRlcyhmYWxzZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pICFoYXMoaGlkZGVuS2V5cywga2V5KSAmJiBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICJ2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG4vLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCAidmFyIHZhbGlkYXRlU2V0UHJvdG90eXBlT2ZBcmd1bWVudHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdmFsaWRhdGUtc2V0LXByb3RvdHlwZS1vZi1hcmd1bWVudHMnKTtcblxuLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gZnVuY3Rpb24gKCkge1xuICB2YXIgY29ycmVjdFNldHRlciA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIHNldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldDtcbiAgICBzZXR0ZXIuY2FsbCh0ZXN0LCBbXSk7XG4gICAgY29ycmVjdFNldHRlciA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICB2YWxpZGF0ZVNldFByb3RvdHlwZU9mQXJndW1lbnRzKE8sIHByb3RvKTtcbiAgICBpZiAoY29ycmVjdFNldHRlcikgc2V0dGVyLmNhbGwoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIFJlZmxlY3QgPSBnbG9iYWwuUmVmbGVjdDtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBSZWZsZWN0ICYmIFJlZmxlY3Qub3duS2V5cyB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgbmF0aXZlRnVuY3Rpb25Ub1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi10by1zdHJpbmcnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7XG52YXIgVEVNUExBVEUgPSBTdHJpbmcobmF0aXZlRnVuY3Rpb25Ub1N0cmluZykuc3BsaXQoJ3RvU3RyaW5nJyk7XG5cbnNoYXJlZCgnaW5zcGVjdFNvdXJjZScsIGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gbmF0aXZlRnVuY3Rpb25Ub1N0cmluZy5jYWxsKGl0KTtcbn0pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMuZW51bWVyYWJsZSA6IGZhbHNlO1xuICB2YXIgbm9UYXJnZXRHZXQgPSBvcHRpb25zID8gISFvcHRpb25zLm5vVGFyZ2V0R2V0IDogZmFsc2U7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmICFoYXModmFsdWUsICduYW1lJykpIGhpZGUodmFsdWUsICduYW1lJywga2V5KTtcbiAgICBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSkuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8ga2V5IDogJycpO1xuICB9XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIHNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXVuc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gIH0gZWxzZSBpZiAoIW5vVGFyZ2V0R2V0ICYmIE9ba2V5XSkge1xuICAgIHNpbXBsZSA9IHRydWU7XG4gIH1cbiAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gIGVsc2UgaGlkZShPLCBrZXksIHZhbHVlKTtcbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgbmF0aXZlRnVuY3Rpb25Ub1N0cmluZy5jYWxsKHRoaXMpO1xufSk7XG4iLCAiLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB0cnkge1xuICAgIGhpZGUoZ2xvYmFsLCBrZXksIHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCAidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUQUcsIFNUQVRJQykge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IFNUQVRJQyA/IGl0IDogaXQucHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkge1xuICAgIGRlZmluZVByb3BlcnR5KGl0LCBUT19TVFJJTkdfVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IFRBRyB9KTtcbiAgfVxufTtcbiIsICJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4xLjMnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsICJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBDT05WRVJUX1RPX1NUUklORzogdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBDT05WRVJUX1RPX1NUUklORzogZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBwb3MsIENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xuICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXIocG9zKTtcbiAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3RcbiAgICAgIDogQ09OVkVSVF9UT19TVFJJTkcgPyBTLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbn07XG4iLCAidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihsZW5ndGgsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwgIi8vIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG4iLCAidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzTmFOKGFyZ3VtZW50ID0gK2FyZ3VtZW50KSA/IDAgOiAoYXJndW1lbnQgPiAwID8gZmxvb3IgOiBjZWlsKShhcmd1bWVudCk7XG59O1xuIiwgInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCAidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwgInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxuLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsICJ2YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNikpO1xufTtcbiIsICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhwcm90bykgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG4gIH1cbn07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBzdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9IE5BVElWRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdXG4gICAgfHwgKE5BVElWRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG4iLCAidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBjb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSBjb2RlUG9pbnRBdChzdHJpbmcsIGluZGV4LCB0cnVlKTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsICJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSwgZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoIChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcbiIsICJpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzL2RlZHVwZSc7XG5cbmltcG9ydCBERUZBVUxUX0FUVFJTIGZyb20gJy4vZGVmYXVsdC1hdHRycy5qc29uJztcblxuY2xhc3MgSWNvbiB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGNvbnRlbnRzLCB0YWdzID0gW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29udGVudHMgPSBjb250ZW50cztcbiAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgIHRoaXMuYXR0cnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0FUVFJTLFxuICAgICAgLi4ueyBjbGFzczogYGZlYXRoZXIgZmVhdGhlci0ke25hbWV9YCB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIFNWRyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhdHRyc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdmcoYXR0cnMgPSB7fSkge1xuICAgIGNvbnN0IGNvbWJpbmVkQXR0cnMgPSB7XG4gICAgICAuLi50aGlzLmF0dHJzLFxuICAgICAgLi4uYXR0cnMsXG4gICAgICAuLi57IGNsYXNzOiBjbGFzc25hbWVzKHRoaXMuYXR0cnMuY2xhc3MsIGF0dHJzLmNsYXNzKSB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gYDxzdmcgJHthdHRyc1RvU3RyaW5nKGNvbWJpbmVkQXR0cnMpfT4ke3RoaXMuY29udGVudHN9PC9zdmc+YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBJY29uYC5cbiAgICpcbiAgICogQWRkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIElmIG9sZCBjb2RlIGV4cGVjdHMgYGZlYXRoZXIuaWNvbnMuPG5hbWU+YFxuICAgKiB0byBiZSBhIHN0cmluZywgYHRvU3RyaW5nKClgIHdpbGwgZ2V0IGltcGxpY2l0bHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudHM7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGF0dHJpYnV0ZXMgb2JqZWN0IHRvIHN0cmluZyBvZiBIVE1MIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJzVG9TdHJpbmcoYXR0cnMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoa2V5ID0+IGAke2tleX09XCIke2F0dHJzW2tleV19XCJgKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEljb247XG4iLCAiaW1wb3J0IEljb24gZnJvbSAnLi9pY29uJztcbmltcG9ydCBpY29ucyBmcm9tICcuLi9kaXN0L2ljb25zLmpzb24nO1xuaW1wb3J0IHRhZ3MgZnJvbSAnLi90YWdzLmpzb24nO1xuXG5leHBvcnQgZGVmYXVsdCBPYmplY3Qua2V5cyhpY29ucylcbiAgLm1hcChrZXkgPT4gbmV3IEljb24oa2V5LCBpY29uc1trZXldLCB0YWdzW2tleV0pKVxuICAucmVkdWNlKChvYmplY3QsIGljb24pID0+IHtcbiAgICBvYmplY3RbaWNvbi5uYW1lXSA9IGljb247XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSwge30pO1xuIiwgImltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcbmltcG9ydCB0b1N2ZyBmcm9tICcuL3RvLXN2Zyc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICcuL3JlcGxhY2UnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgaWNvbnMsIHRvU3ZnLCByZXBsYWNlIH07XG4iLCAiLyogZXNsaW50LWVudiBicm93c2VyICovXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzL2RlZHVwZSc7XG5cbmltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcblxuLyoqXG4gKiBSZXBsYWNlIGFsbCBIVE1MIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGBkYXRhLWZlYXRoZXJgIGF0dHJpYnV0ZSB3aXRoIFNWRyBtYXJrdXBcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBgZGF0YS1mZWF0aGVyYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZShhdHRycyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZmVhdGhlci5yZXBsYWNlKClgIG9ubHkgd29ya3MgaW4gYSBicm93c2VyIGVudmlyb25tZW50LicpO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudHNUb1JlcGxhY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1mZWF0aGVyXScpO1xuXG4gIEFycmF5LmZyb20oZWxlbWVudHNUb1JlcGxhY2UpLmZvckVhY2goZWxlbWVudCA9PlxuICAgIHJlcGxhY2VFbGVtZW50KGVsZW1lbnQsIGF0dHJzKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGEgc2luZ2xlIEhUTUwgZWxlbWVudCB3aXRoIFNWRyBtYXJrdXBcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBgZGF0YS1mZWF0aGVyYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUVsZW1lbnQoZWxlbWVudCwgYXR0cnMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50QXR0cnMgPSBnZXRBdHRycyhlbGVtZW50KTtcbiAgY29uc3QgbmFtZSA9IGVsZW1lbnRBdHRyc1snZGF0YS1mZWF0aGVyJ107XG4gIGRlbGV0ZSBlbGVtZW50QXR0cnNbJ2RhdGEtZmVhdGhlciddO1xuXG4gIGNvbnN0IHN2Z1N0cmluZyA9IGljb25zW25hbWVdLnRvU3ZnKHtcbiAgICAuLi5hdHRycyxcbiAgICAuLi5lbGVtZW50QXR0cnMsXG4gICAgLi4ueyBjbGFzczogY2xhc3NuYW1lcyhhdHRycy5jbGFzcywgZWxlbWVudEF0dHJzLmNsYXNzKSB9LFxuICB9KTtcbiAgY29uc3Qgc3ZnRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFxuICAgIHN2Z1N0cmluZyxcbiAgICAnaW1hZ2Uvc3ZnK3htbCcsXG4gICk7XG4gIGNvbnN0IHN2Z0VsZW1lbnQgPSBzdmdEb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcblxuICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHN2Z0VsZW1lbnQsIGVsZW1lbnQpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBIVE1MIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRBdHRycyhlbGVtZW50KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcykucmVkdWNlKChhdHRycywgYXR0cikgPT4ge1xuICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgIHJldHVybiBhdHRycztcbiAgfSwge30pO1xufVxuXG5leHBvcnQgZGVmYXVsdCByZXBsYWNlO1xuIiwgImltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gU1ZHIHN0cmluZy5cbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGF0dHJzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB0b1N2ZyhuYW1lLCBhdHRycyA9IHt9KSB7XG4gIGNvbnNvbGUud2FybihcbiAgICAnZmVhdGhlci50b1N2ZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgZmVhdGhlci5pY29uc1tuYW1lXS50b1N2ZygpIGluc3RlYWQuJyxcbiAgKTtcblxuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSByZXF1aXJlZCBga2V5YCAoaWNvbiBuYW1lKSBwYXJhbWV0ZXIgaXMgbWlzc2luZy4nKTtcbiAgfVxuXG4gIGlmICghaWNvbnNbbmFtZV0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gaWNvbiBtYXRjaGluZyAnJHtuYW1lfScuIFNlZSB0aGUgY29tcGxldGUgbGlzdCBvZiBpY29ucyBhdCBodHRwczovL2ZlYXRoZXJpY29ucy5jb21gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaWNvbnNbbmFtZV0udG9TdmcoYXR0cnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b1N2ZztcbiIsICJpbXBvcnQgeyBFcnJvcnMgfSBmcm9tIFwiaXNvbW9ycGhpYy1naXRcIjtcbmltcG9ydCB7XG4gICAgZGVib3VuY2UsXG4gICAgRGVib3VuY2VyLFxuICAgIEV2ZW50UmVmLFxuICAgIE1hcmtkb3duVmlldyxcbiAgICBNZW51LFxuICAgIG5vcm1hbGl6ZVBhdGgsXG4gICAgTm90aWNlLFxuICAgIFBsYXRmb3JtLFxuICAgIFBsdWdpbixcbiAgICBUQWJzdHJhY3RGaWxlLFxuICAgIFRGaWxlLFxuICAgIFdvcmtzcGFjZUxlYWYsXG59IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgTGluZUF1dGhvcmluZ0ZlYXR1cmUgfSBmcm9tIFwic3JjL2xpbmVBdXRob3IvbGluZUF1dGhvckludGVncmF0aW9uXCI7XG5pbXBvcnQgeyBwbHVnaW5SZWYgfSBmcm9tIFwic3JjL3BsdWdpbkdsb2JhbFJlZlwiO1xuaW1wb3J0IHsgUHJvbWlzZVF1ZXVlIH0gZnJvbSBcInNyYy9wcm9taXNlUXVldWVcIjtcbmltcG9ydCB7IE9ic2lkaWFuR2l0U2V0dGluZ3NUYWIgfSBmcm9tIFwic3JjL3NldHRpbmcvc2V0dGluZ3NcIjtcbmltcG9ydCB7IFN0YXR1c0JhciB9IGZyb20gXCJzcmMvc3RhdHVzQmFyXCI7XG5pbXBvcnQgeyBDaGFuZ2VkRmlsZXNNb2RhbCB9IGZyb20gXCJzcmMvdWkvbW9kYWxzL2NoYW5nZWRGaWxlc01vZGFsXCI7XG5pbXBvcnQgeyBDdXN0b21NZXNzYWdlTW9kYWwgfSBmcm9tIFwic3JjL3VpL21vZGFscy9jdXN0b21NZXNzYWdlTW9kYWxcIjtcbmltcG9ydCB7XG4gICAgREVGQVVMVF9TRVRUSU5HUyxcbiAgICBESUZGX1ZJRVdfQ09ORklHLFxuICAgIEhJU1RPUllfVklFV19DT05GSUcsXG4gICAgU09VUkNFX0NPTlRST0xfVklFV19DT05GSUcsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgR2l0TWFuYWdlciB9IGZyb20gXCIuL2dpdE1hbmFnZXIvZ2l0TWFuYWdlclwiO1xuaW1wb3J0IHsgSXNvbW9ycGhpY0dpdCB9IGZyb20gXCIuL2dpdE1hbmFnZXIvaXNvbW9ycGhpY0dpdFwiO1xuaW1wb3J0IHsgU2ltcGxlR2l0IH0gZnJvbSBcIi4vZ2l0TWFuYWdlci9zaW1wbGVHaXRcIjtcbmltcG9ydCB7IG9wZW5IaXN0b3J5SW5HaXRIdWIsIG9wZW5MaW5lSW5HaXRIdWIgfSBmcm9tIFwiLi9vcGVuSW5HaXRIdWJcIjtcbmltcG9ydCB7IExvY2FsU3RvcmFnZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZy9sb2NhbFN0b3JhZ2VTZXR0aW5nc1wiO1xuaW1wb3J0IHtcbiAgICBEaWZmVmlld1N0YXRlLFxuICAgIEZpbGVTdGF0dXNSZXN1bHQsXG4gICAgbWVyZ2VTZXR0aW5nc0J5UHJpb3JpdHksXG4gICAgT2JzaWRpYW5HaXRTZXR0aW5ncyxcbiAgICBQbHVnaW5TdGF0ZSxcbiAgICBTdGF0dXMsXG4gICAgVW5zdGFnZWRGaWxlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IERpZmZWaWV3IGZyb20gXCIuL3VpL2RpZmYvZGlmZlZpZXdcIjtcbmltcG9ydCBIaXN0b3J5VmlldyBmcm9tIFwiLi91aS9oaXN0b3J5L2hpc3RvcnlWaWV3XCI7XG5pbXBvcnQgeyBCcmFuY2hNb2RhbCB9IGZyb20gXCIuL3VpL21vZGFscy9icmFuY2hNb2RhbFwiO1xuaW1wb3J0IHsgR2VuZXJhbE1vZGFsIH0gZnJvbSBcIi4vdWkvbW9kYWxzL2dlbmVyYWxNb2RhbFwiO1xuaW1wb3J0IHsgSWdub3JlTW9kYWwgfSBmcm9tIFwiLi91aS9tb2RhbHMvaWdub3JlTW9kYWxcIjtcbmltcG9ydCBHaXRWaWV3IGZyb20gXCIuL3VpL3NvdXJjZUNvbnRyb2wvc291cmNlQ29udHJvbFwiO1xuaW1wb3J0IHsgQnJhbmNoU3RhdHVzQmFyIH0gZnJvbSBcIi4vdWkvc3RhdHVzQmFyL2JyYW5jaFN0YXR1c0JhclwiO1xuaW1wb3J0IHsgZ2V0TmV3TGVhZiwgc3BsaXRSZW1vdGVCcmFuY2ggfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPYnNpZGlhbkdpdCBleHRlbmRzIFBsdWdpbiB7XG4gICAgZ2l0TWFuYWdlcjogR2l0TWFuYWdlcjtcbiAgICBsb2NhbFN0b3JhZ2U6IExvY2FsU3RvcmFnZVNldHRpbmdzO1xuICAgIHNldHRpbmdzOiBPYnNpZGlhbkdpdFNldHRpbmdzO1xuICAgIHNldHRpbmdzVGFiPzogT2JzaWRpYW5HaXRTZXR0aW5nc1RhYjtcbiAgICBzdGF0dXNCYXI/OiBTdGF0dXNCYXI7XG4gICAgYnJhbmNoQmFyPzogQnJhbmNoU3RhdHVzQmFyO1xuICAgIHN0YXRlOiBQbHVnaW5TdGF0ZTtcbiAgICB0aW1lb3V0SURCYWNrdXA/OiBudW1iZXI7XG4gICAgdGltZW91dElEUHVzaD86IG51bWJlcjtcbiAgICB0aW1lb3V0SURQdWxsPzogbnVtYmVyO1xuICAgIGxhc3RQdWxsZWRGaWxlczogRmlsZVN0YXR1c1Jlc3VsdFtdO1xuICAgIGdpdFJlYWR5ID0gZmFsc2U7XG4gICAgcHJvbWlzZVF1ZXVlOiBQcm9taXNlUXVldWUgPSBuZXcgUHJvbWlzZVF1ZXVlKCk7XG4gICAgY29uZmxpY3RPdXRwdXRGaWxlID0gXCJjb25mbGljdC1maWxlcy1vYnNpZGlhbi1naXQubWRcIjtcbiAgICBhdXRvQmFja3VwRGVib3VuY2VyOiBEZWJvdW5jZXI8YW55LCB2b2lkPjtcbiAgICBvbkZpbGVNb2RpZnlFdmVudFJlZj86IEV2ZW50UmVmO1xuICAgIG9mZmxpbmVNb2RlID0gZmFsc2U7XG4gICAgbG9hZGluZyA9IGZhbHNlO1xuICAgIGNhY2hlZFN0YXR1czogU3RhdHVzIHwgdW5kZWZpbmVkO1xuICAgIC8vIFVzZWQgdG8gc3RvcmUgdGhlIHBhdGggb2YgdGhlIGZpbGUgdGhhdCBpcyBjdXJyZW50bHkgc2hvd24gaW4gdGhlIGRpZmYgdmlldy5cbiAgICBsYXN0RGlmZlZpZXdTdGF0ZTogRGlmZlZpZXdTdGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBvcGVuRXZlbnQ6IEV2ZW50UmVmO1xuICAgIG1vZGlmeUV2ZW50OiBFdmVudFJlZjtcbiAgICBkZWxldGVFdmVudDogRXZlbnRSZWY7XG4gICAgY3JlYXRlRXZlbnQ6IEV2ZW50UmVmO1xuICAgIHJlbmFtZUV2ZW50OiBFdmVudFJlZjtcbiAgICBsaW5lQXV0aG9yaW5nRmVhdHVyZTogTGluZUF1dGhvcmluZ0ZlYXR1cmUgPSBuZXcgTGluZUF1dGhvcmluZ0ZlYXR1cmUodGhpcyk7XG5cbiAgICBkZWJSZWZyZXNoOiBEZWJvdW5jZXI8YW55LCB2b2lkPjtcblxuICAgIHNldFN0YXRlKHN0YXRlOiBQbHVnaW5TdGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuc3RhdHVzQmFyPy5kaXNwbGF5KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlQ2FjaGVkU3RhdHVzKCk6IFByb21pc2U8U3RhdHVzPiB7XG4gICAgICAgIHRoaXMuY2FjaGVkU3RhdHVzID0gYXdhaXQgdGhpcy5naXRNYW5hZ2VyLnN0YXR1cygpO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRTdGF0dXM7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaCgpIHtcbiAgICAgICAgY29uc3QgZ2l0VmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXG4gICAgICAgICAgICBTT1VSQ0VfQ09OVFJPTF9WSUVXX0NPTkZJRy50eXBlXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGhpc3RvcnlWaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShcbiAgICAgICAgICAgIEhJU1RPUllfVklFV19DT05GSUcudHlwZVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuY2hhbmdlZEZpbGVzSW5TdGF0dXNCYXIgfHxcbiAgICAgICAgICAgIGdpdFZpZXcubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgaGlzdG9yeVZpZXcubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICBkaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImdpdC12aWV3LXJlZnJlc2hcIikpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNhY2hlZFN0YXR1cygpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBkaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImdpdC12aWV3LXJlZnJlc2hcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgZG9uJ3QgcHV0IGEgbGluZSBhdXRob3JpbmcgcmVmcmVzaCBoZXJlLCBhcyBpdCB3b3VsZCBmb3JjZSBhIHJlLWxvYWRpbmdcbiAgICAgICAgLy8gb2YgdGhlIGxpbmUgYXV0aG9yaW5nIGZlYXR1cmUgLSB3aGljaCB3b3VsZCBsZWFkIHRvIGEganVtcHkgZWRpdG9yLXZpZXcgaW4gdGhlXG4gICAgICAgIC8vIHVpIGFmdGVyIGV2ZXJ5IHJlbmFtZSBldmVudC5cbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoVXBkYXRlZEhlYWQoKSB7XG4gICAgICAgIHRoaXMubGluZUF1dGhvcmluZ0ZlYXR1cmUucmVmcmVzaExpbmVBdXRob3JWaWV3cygpO1xuICAgIH1cblxuICAgIGFzeW5jIG9ubG9hZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJsb2FkaW5nIFwiICsgdGhpcy5tYW5pZmVzdC5uYW1lICsgXCIgcGx1Z2luXCIpO1xuICAgICAgICBwbHVnaW5SZWYucGx1Z2luID0gdGhpcztcblxuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG5ldyBMb2NhbFN0b3JhZ2VTZXR0aW5ncyh0aGlzKTtcblxuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5taWdyYXRlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG4gICAgICAgIHRoaXMubWlncmF0ZVNldHRpbmdzKCk7XG5cbiAgICAgICAgdGhpcy5zZXR0aW5nc1RhYiA9IG5ldyBPYnNpZGlhbkdpdFNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKTtcbiAgICAgICAgdGhpcy5hZGRTZXR0aW5nVGFiKHRoaXMuc2V0dGluZ3NUYWIpO1xuXG4gICAgICAgIGlmICghdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0UGx1Z2luRGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkUGx1Z2luKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBsb2FkUGx1Z2luKCkge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwiZ2l0LXJlZnJlc2hcIiwgdGhpcy5yZWZyZXNoLmJpbmQodGhpcykpO1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwiZ2l0LWhlYWQtdXBkYXRlXCIsIHRoaXMucmVmcmVzaFVwZGF0ZWRIZWFkLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KFNPVVJDRV9DT05UUk9MX1ZJRVdfQ09ORklHLnR5cGUsIChsZWFmKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEdpdFZpZXcobGVhZiwgdGhpcyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyhISVNUT1JZX1ZJRVdfQ09ORklHLnR5cGUsIChsZWFmKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlWaWV3KGxlYWYsIHRoaXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyhESUZGX1ZJRVdfQ09ORklHLnR5cGUsIChsZWFmKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERpZmZWaWV3KGxlYWYsIHRoaXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxpbmVBdXRob3JpbmdGZWF0dXJlLm9uTG9hZFBsdWdpbigpO1xuXG4gICAgICAgICh0aGlzLmFwcC53b3Jrc3BhY2UgYXMgYW55KS5yZWdpc3RlckhvdmVyTGlua1NvdXJjZShcbiAgICAgICAgICAgIFNPVVJDRV9DT05UUk9MX1ZJRVdfQ09ORklHLnR5cGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJHaXQgVmlld1wiLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRNb2Q6IHRydWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zZXRSZWZyZXNoRGVib3VuY2VyKCk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImVkaXQtZ2l0aWdub3JlXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkVkaXQgLmdpdGlnbm9yZVwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5naXRNYW5hZ2VyLmdldFJlbGF0aXZlVmF1bHRQYXRoKFwiLmdpdGlnbm9yZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwYXRoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZShwYXRoLCBcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChwYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RhbCA9IG5ldyBJZ25vcmVNb2RhbCh0aGlzLmFwcCwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbW9kYWwub3BlbigpO1xuICAgICAgICAgICAgICAgIGlmIChyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKHBhdGgsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwib3Blbi1naXQtdmlld1wiLFxuICAgICAgICAgICAgbmFtZTogXCJPcGVuIHNvdXJjZSBjb250cm9sIHZpZXdcIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVhZnMgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFxuICAgICAgICAgICAgICAgICAgICBTT1VSQ0VfQ09OVFJPTF9WSUVXX0NPTkZJRy50eXBlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBsZXQgbGVhZjogV29ya3NwYWNlTGVhZjtcbiAgICAgICAgICAgICAgICBpZiAobGVhZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU09VUkNFX0NPTlRST0xfVklFV19DT05GSUcudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhZiA9IGxlYWZzLmZpcnN0KCkhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UucmV2ZWFsTGVhZihsZWFmKTtcblxuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJvcGVuLWhpc3Rvcnktdmlld1wiLFxuICAgICAgICAgICAgbmFtZTogXCJPcGVuIGhpc3Rvcnkgdmlld1wiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZWFmcyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXG4gICAgICAgICAgICAgICAgICAgIEhJU1RPUllfVklFV19DT05GSUcudHlwZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbGV0IGxlYWY6IFdvcmtzcGFjZUxlYWY7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldFJpZ2h0TGVhZihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGxlYWYuc2V0Vmlld1N0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEhJU1RPUllfVklFV19DT05GSUcudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhZiA9IGxlYWZzLmZpcnN0KCkhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UucmV2ZWFsTGVhZihsZWFmKTtcblxuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcIm9wZW4tZGlmZi12aWV3XCIsXG4gICAgICAgICAgICBuYW1lOiBcIk9wZW4gZGlmZiB2aWV3XCIsXG4gICAgICAgICAgICBjaGVja0NhbGxiYWNrOiAoY2hlY2tpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUgIT09IG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0TmV3TGVhZigpPy5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRElGRl9WSUVXX0NPTkZJRy50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IHRoaXMuZ2l0TWFuYWdlci5nZXRSZWxhdGl2ZVJlcG9QYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIS5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJ2aWV3LWZpbGUtb24tZ2l0aHViXCIsXG4gICAgICAgICAgICBuYW1lOiBcIk9wZW4gZmlsZSBvbiBHaXRIdWJcIixcbiAgICAgICAgICAgIGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yLCB7IGZpbGUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlbkxpbmVJbkdpdEh1YihlZGl0b3IsIGZpbGUsIHRoaXMuZ2l0TWFuYWdlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwidmlldy1oaXN0b3J5LW9uLWdpdGh1YlwiLFxuICAgICAgICAgICAgbmFtZTogXCJPcGVuIGZpbGUgaGlzdG9yeSBvbiBHaXRIdWJcIixcbiAgICAgICAgICAgIGVkaXRvckNhbGxiYWNrOiAoXywgeyBmaWxlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSkgcmV0dXJuIG9wZW5IaXN0b3J5SW5HaXRIdWIoZmlsZSwgdGhpcy5naXRNYW5hZ2VyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJwdWxsXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlB1bGxcIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZVF1ZXVlLmFkZFRhc2soKCkgPT4gdGhpcy5wdWxsQ2hhbmdlc0Zyb21SZW1vdGUoKSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJmZXRjaFwiLFxuICAgICAgICAgICAgbmFtZTogXCJmZXRjaFwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMucHJvbWlzZVF1ZXVlLmFkZFRhc2soKCkgPT4gdGhpcy5mZXRjaCgpKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcInN3aXRjaC10by1yZW1vdGUtYnJhbmNoXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlN3aXRjaCB0byByZW1vdGUgYnJhbmNoXCIsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+IHRoaXMuc3dpdGNoUmVtb3RlQnJhbmNoKCkpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwiYWRkLXRvLWdpdGlnbm9yZVwiLFxuICAgICAgICAgICAgbmFtZTogXCJBZGQgZmlsZSB0byBnaXRpZ25vcmVcIixcbiAgICAgICAgICAgIGNoZWNrQ2FsbGJhY2s6IChjaGVja2luZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2luZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZSAhPT0gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC52YXVsdC5hZGFwdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2l0TWFuYWdlci5nZXRSZWxhdGl2ZVZhdWx0UGF0aChcIi5naXRpZ25vcmVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2l0TWFuYWdlci5nZXRSZWxhdGl2ZVJlcG9QYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSEucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcInB1c2hcIixcbiAgICAgICAgICAgIG5hbWU6IFwiQ3JlYXRlIGJhY2t1cFwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLmNyZWF0ZUJhY2t1cChmYWxzZSkpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwiYmFja3VwLWFuZC1jbG9zZVwiLFxuICAgICAgICAgICAgbmFtZTogXCJDcmVhdGUgYmFja3VwIGFuZCBjbG9zZVwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJjb21taXQtcHVzaC1zcGVjaWZpZWQtbWVzc2FnZVwiLFxuICAgICAgICAgICAgbmFtZTogXCJDcmVhdGUgYmFja3VwIHdpdGggc3BlY2lmaWMgbWVzc2FnZVwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLmNyZWF0ZUJhY2t1cChmYWxzZSwgdHJ1ZSkpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwiY29tbWl0XCIsXG4gICAgICAgICAgICBuYW1lOiBcIkNvbW1pdCBhbGwgY2hhbmdlc1wiLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1pdCh7IGZyb21BdXRvQmFja3VwOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJjb21taXQtc3BlY2lmaWVkLW1lc3NhZ2VcIixcbiAgICAgICAgICAgIG5hbWU6IFwiQ29tbWl0IGFsbCBjaGFuZ2VzIHdpdGggc3BlY2lmaWMgbWVzc2FnZVwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tQXV0b0JhY2t1cDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q3VzdG9tTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwiY29tbWl0LXN0YWdlZFwiLFxuICAgICAgICAgICAgbmFtZTogXCJDb21taXQgc3RhZ2VkXCIsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21BdXRvQmFja3VwOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDdXN0b21NZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlTdGFnZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKFBsYXRmb3JtLmlzRGVza3RvcEFwcCkge1xuICAgICAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgICAgICBpZDogXCJjb21taXQtYW1lbmQtc3RhZ2VkLXNwZWNpZmllZC1tZXNzYWdlXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJDb21taXQgQW1lbmRcIixcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21taXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21BdXRvQmFja3VwOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q3VzdG9tTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5U3RhZ2VkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImNvbW1pdC1zdGFnZWQtc3BlY2lmaWVkLW1lc3NhZ2VcIixcbiAgICAgICAgICAgIG5hbWU6IFwiQ29tbWl0IHN0YWdlZCB3aXRoIHNwZWNpZmljIG1lc3NhZ2VcIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZVF1ZXVlLmFkZFRhc2soKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21taXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUF1dG9CYWNrdXA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEN1c3RvbU1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbmx5U3RhZ2VkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJwdXNoMlwiLFxuICAgICAgICAgICAgbmFtZTogXCJQdXNoXCIsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLnB1c2goKSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzdGFnZS1jdXJyZW50LWZpbGVcIixcbiAgICAgICAgICAgIG5hbWU6IFwiU3RhZ2UgY3VycmVudCBmaWxlXCIsXG4gICAgICAgICAgICBjaGVja0NhbGxiYWNrOiAoY2hlY2tpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUgIT09IG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLnN0YWdlRmlsZShmaWxlISkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJ1bnN0YWdlLWN1cnJlbnQtZmlsZVwiLFxuICAgICAgICAgICAgbmFtZTogXCJVbnN0YWdlIGN1cnJlbnQgZmlsZVwiLFxuICAgICAgICAgICAgY2hlY2tDYWxsYmFjazogKGNoZWNraW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNraW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlICE9PSBudWxsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZVF1ZXVlLmFkZFRhc2soKCkgPT4gdGhpcy51bnN0YWdlRmlsZShmaWxlISkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJlZGl0LXJlbW90ZXNcIixcbiAgICAgICAgICAgIG5hbWU6IFwiRWRpdCByZW1vdGVzXCIsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4gdGhpcy5lZGl0UmVtb3RlcygpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwicmVtb3ZlLXJlbW90ZVwiLFxuICAgICAgICAgICAgbmFtZTogXCJSZW1vdmUgcmVtb3RlXCIsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4gdGhpcy5yZW1vdmVSZW1vdGUoKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcInNldC11cHN0cmVhbS1icmFuY2hcIixcbiAgICAgICAgICAgIG5hbWU6IFwiU2V0IHVwc3RyZWFtIGJyYW5jaFwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHRoaXMuc2V0VXBzdHJlYW1CcmFuY2goKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImRlbGV0ZS1yZXBvXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkNBVVRJT046IERlbGV0ZSByZXBvc2l0b3J5XCIsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcG9FeGlzdHMgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5zZXR0aW5ncy5iYXNlUGF0aH0vLmdpdGBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChyZXBvRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGFsID0gbmV3IEdlbmVyYWxNb2RhbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbXCJOT1wiLCBcIllFU1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGUgcmVwb3NpdG9yeSAoLmdpdCBkaXJlY3RvcnkpPyBUaGlzIGFjdGlvbiBjYW5ub3QgYmUgdW5kb25lLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25seVNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERlbGV0ZSA9IChhd2FpdCBtb2RhbC5vcGVuKCkpID09PSBcIllFU1wiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRGVsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLnJtZGlyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuc2V0dGluZ3MuYmFzZVBhdGh9Ly5naXRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgcmVwb3NpdG9yeS4gUmVsb2FkaW5nIHBsdWdpbi4uLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmxvYWRQbHVnaW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIk5vIHJlcG9zaXRvcnkgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImluaXQtcmVwb1wiLFxuICAgICAgICAgICAgbmFtZTogXCJJbml0aWFsaXplIGEgbmV3IHJlcG9cIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB0aGlzLmNyZWF0ZU5ld1JlcG8oKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImNsb25lLXJlcG9cIixcbiAgICAgICAgICAgIG5hbWU6IFwiQ2xvbmUgYW4gZXhpc3RpbmcgcmVtb3RlIHJlcG9cIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB0aGlzLmNsb25lTmV3UmVwbygpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwibGlzdC1jaGFuZ2VkLWZpbGVzXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkxpc3QgY2hhbmdlZCBmaWxlc1wiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmlzQWxsSW5pdGlhbGl6ZWQoKSkpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5zdGF0dXMoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhzdGF0dXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5jaGFuZ2VkLmxlbmd0aCArIHN0YXR1cy5zdGFnZWQubGVuZ3RoID4gNTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUVycm9yKFwiVG9vIG1hbnkgY2hhbmdlcyB0byBkaXNwbGF5XCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbmV3IENoYW5nZWRGaWxlc01vZGFsKHRoaXMsIHN0YXR1cy5hbGwpLm9wZW4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzd2l0Y2gtYnJhbmNoXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlN3aXRjaCBicmFuY2hcIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hCcmFuY2goKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJjcmVhdGUtYnJhbmNoXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkNyZWF0ZSBuZXcgYnJhbmNoXCIsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQnJhbmNoKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwiZGVsZXRlLWJyYW5jaFwiLFxuICAgICAgICAgICAgbmFtZTogXCJEZWxldGUgYnJhbmNoXCIsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlQnJhbmNoKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwiZGlzY2FyZC1hbGxcIixcbiAgICAgICAgICAgIG5hbWU6IFwiQ0FVVElPTjogRGlzY2FyZCBhbGwgY2hhbmdlc1wiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmlzQWxsSW5pdGlhbGl6ZWQoKSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RhbCA9IG5ldyBHZW5lcmFsTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbXCJOT1wiLCBcIllFU1wiXSxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGRpc2NhcmQgYWxsIGNoYW5nZXMgdG8gdHJhY2tlZCBmaWxlcz8gVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS5cIixcbiAgICAgICAgICAgICAgICAgICAgb25seVNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGREaXNjYXJkQWxsID0gKGF3YWl0IG1vZGFsLm9wZW4oKSkgPT09IFwiWUVTXCI7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZERpc2NhcmRBbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLmRpc2NhcmRBbGwoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcInRvZ2dsZS1saW5lLWF1dGhvci1pbmZvXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlRvZ2dsZSBsaW5lIGF1dGhvciBpbmZvcm1hdGlvblwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1RhYj8uY29uZmlndXJlTGluZUF1dGhvclNob3dTdGF0dXMoXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLnNldHRpbmdzLmxpbmVBdXRob3Iuc2hvd1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudChcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbihcImZpbGUtbWVudVwiLCAobWVudSwgZmlsZSwgc291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWxlTWVudShtZW51LCBmaWxlLCBzb3VyY2UpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5zaG93U3RhdHVzQmFyKSB7XG4gICAgICAgICAgICAvLyBpbml0IHN0YXR1c0JhclxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzQmFyRWwgPSB0aGlzLmFkZFN0YXR1c0Jhckl0ZW0oKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyID0gbmV3IFN0YXR1c0JhcihzdGF0dXNCYXJFbCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVySW50ZXJ2YWwoXG4gICAgICAgICAgICAgICAgd2luZG93LnNldEludGVydmFsKCgpID0+IHRoaXMuc3RhdHVzQmFyPy5kaXNwbGF5KCksIDEwMDApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFBsYXRmb3JtLmlzRGVza3RvcCAmJiB0aGlzLnNldHRpbmdzLnNob3dCcmFuY2hTdGF0dXNCYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGJyYW5jaFN0YXR1c0JhckVsID0gdGhpcy5hZGRTdGF0dXNCYXJJdGVtKCk7XG4gICAgICAgICAgICB0aGlzLmJyYW5jaEJhciA9IG5ldyBCcmFuY2hTdGF0dXNCYXIoYnJhbmNoU3RhdHVzQmFyRWwsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckludGVydmFsKFxuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmJyYW5jaEJhcj8uZGlzcGxheSgpLCA2MDAwMClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSgoKSA9PiB0aGlzLmluaXQoKSk7XG4gICAgfVxuXG4gICAgc2V0UmVmcmVzaERlYm91bmNlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZWJSZWZyZXNoPy5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5kZWJSZWZyZXNoID0gZGVib3VuY2UoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MucmVmcmVzaFNvdXJjZUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MucmVmcmVzaFNvdXJjZUNvbnRyb2xUaW1lcixcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyBzaG93Tm90aWNlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gMTAwMDA7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMubWFuaWZlc3QuaWQgPT09IFwib2JzaWRpYW4tZ2l0XCIgJiZcbiAgICAgICAgICAgIFBsYXRmb3JtLmlzRGVza3RvcEFwcCAmJlxuICAgICAgICAgICAgIXRoaXMuc2V0dGluZ3Muc2hvd2VkTW9iaWxlTm90aWNlXG4gICAgICAgICkge1xuICAgICAgICAgICAgbmV3IE5vdGljZShcbiAgICAgICAgICAgICAgICBcIkdpdCBpcyBub3cgYXZhaWxhYmxlIG9uIG1vYmlsZSEgUGxlYXNlIHJlYWQgdGhlIHBsdWdpbidzIFJFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIixcbiAgICAgICAgICAgICAgICBsZW5ndGhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLnNob3dlZE1vYmlsZU5vdGljZSA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1hbmlmZXN0LmlkID09PSBcIm9ic2lkaWFuLWdpdC1pc29tb3JwaGljXCIpIHtcbiAgICAgICAgICAgIG5ldyBOb3RpY2UoXG4gICAgICAgICAgICAgICAgXCJHaXQgTW9iaWxlIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdW5pbnN0YWxsIGl0IGFuZCBpbnN0YWxsIEdpdCBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUZpbGVNZW51KG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUsIHNvdXJjZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5zaG93RmlsZU1lbnUpIHJldHVybjtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gXCJmaWxlLWV4cGxvcmVyLWNvbnRleHQtbWVudVwiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmdpdFJlYWR5KSByZXR1cm47XG4gICAgICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRUaXRsZShgR2l0OiBTdGFnZWApXG4gICAgICAgICAgICAgICAgLnNldEljb24oXCJwbHVzLWNpcmNsZVwiKVxuICAgICAgICAgICAgICAgIC5zZXRTZWN0aW9uKFwiYWN0aW9uXCIpXG4gICAgICAgICAgICAgICAgLm9uQ2xpY2soKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5naXRNYW5hZ2VyLnN0YWdlKGZpbGUucGF0aCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5zdGFnZUFsbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogdGhpcy5naXRNYW5hZ2VyLmdldFJlbGF0aXZlUmVwb1BhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKGBTdGFnZWQgJHtmaWxlLnBhdGh9YCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldFRpdGxlKGBHaXQ6IFVuc3RhZ2VgKVxuICAgICAgICAgICAgICAgIC5zZXRJY29uKFwibWludXMtY2lyY2xlXCIpXG4gICAgICAgICAgICAgICAgLnNldFNlY3Rpb24oXCJhY3Rpb25cIilcbiAgICAgICAgICAgICAgICAub25DbGljaygoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2VRdWV1ZS5hZGRUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdpdE1hbmFnZXIudW5zdGFnZShmaWxlLnBhdGgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdpdE1hbmFnZXIudW5zdGFnZUFsbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogdGhpcy5naXRNYW5hZ2VyLmdldFJlbGF0aXZlUmVwb1BhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKGBVbnN0YWdlZCAke2ZpbGUucGF0aH1gKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIG1pZ3JhdGVTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubWVyZ2VPblB1bGwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLnN5bmNNZXRob2QgPSB0aGlzLnNldHRpbmdzLm1lcmdlT25QdWxsXG4gICAgICAgICAgICAgICAgPyBcIm1lcmdlXCJcbiAgICAgICAgICAgICAgICA6IFwicmViYXNlXCI7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLm1lcmdlT25QdWxsID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5hdXRvQ29tbWl0TWVzc2FnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLmF1dG9Db21taXRNZXNzYWdlID0gdGhpcy5zZXR0aW5ncy5jb21taXRNZXNzYWdlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5naXRQYXRoICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0R2l0UGF0aCh0aGlzLnNldHRpbmdzLmdpdFBhdGgpO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5naXRQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy51c2VybmFtZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldFBhc3N3b3JkKHRoaXMuc2V0dGluZ3MudXNlcm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy51c2VybmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bmxvYWRQbHVnaW4oKSB7XG4gICAgICAgIHRoaXMuZ2l0UmVhZHkgPSBmYWxzZTtcbiAgICAgICAgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJnaXQtcmVmcmVzaFwiKSk7XG5cbiAgICAgICAgdGhpcy5saW5lQXV0aG9yaW5nRmVhdHVyZS5kZWFjdGl2YXRlRmVhdHVyZSgpO1xuICAgICAgICB0aGlzLmNsZWFyQXV0b1B1bGwoKTtcbiAgICAgICAgdGhpcy5jbGVhckF1dG9QdXNoKCk7XG4gICAgICAgIHRoaXMuY2xlYXJBdXRvQmFja3VwKCk7XG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJnaXQtcmVmcmVzaFwiLCB0aGlzLnJlZnJlc2guYmluZCh0aGlzKSk7XG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcImdpdC1oZWFkLXVwZGF0ZVwiLFxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVXBkYXRlZEhlYWQuYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub2ZmcmVmKHRoaXMub3BlbkV2ZW50KTtcbiAgICAgICAgdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vZmZyZWYodGhpcy5tb2RpZnlFdmVudCk7XG4gICAgICAgIHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUub2ZmcmVmKHRoaXMuZGVsZXRlRXZlbnQpO1xuICAgICAgICB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLm9mZnJlZih0aGlzLmNyZWF0ZUV2ZW50KTtcbiAgICAgICAgdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vZmZyZWYodGhpcy5yZW5hbWVFdmVudCk7XG4gICAgICAgIHRoaXMuZGViUmVmcmVzaC5jYW5jZWwoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbnVubG9hZCgpIHtcbiAgICAgICAgKHRoaXMuYXBwLndvcmtzcGFjZSBhcyBhbnkpLnVucmVnaXN0ZXJIb3ZlckxpbmtTb3VyY2UoXG4gICAgICAgICAgICBTT1VSQ0VfQ09OVFJPTF9WSUVXX0NPTkZJRy50eXBlXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy51bmxvYWRQbHVnaW4oKTtcblxuICAgICAgICBjb25zb2xlLmxvZyhcInVubG9hZGluZyBcIiArIHRoaXMubWFuaWZlc3QubmFtZSArIFwiIHBsdWdpblwiKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG4gICAgICAgIC8vIEF0IGZpcnN0IHN0YXJ0dXAsIGBkYXRhYCBpcyBgbnVsbGAgYmVjYXVzZSBkYXRhLmpzb24gZG9lcyBub3QgZXhpc3QuXG4gICAgICAgIGxldCBkYXRhID0gKGF3YWl0IHRoaXMubG9hZERhdGEoKSkgYXMgT2JzaWRpYW5HaXRTZXR0aW5ncyB8IG51bGw7XG4gICAgICAgIC8vQ2hlY2sgZm9yIGV4aXN0aW5nIHNldHRpbmdzXG4gICAgICAgIGlmIChkYXRhID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0YSA9IDxPYnNpZGlhbkdpdFNldHRpbmdzPnsgc2hvd2VkTW9iaWxlTm90aWNlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IG1lcmdlU2V0dGluZ3NCeVByaW9yaXR5KERFRkFVTFRfU0VUVElOR1MsIGRhdGEpO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5nc1RhYj8uYmVmb3JlU2F2ZVNldHRpbmdzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgc2F2ZUxhc3RBdXRvKGRhdGU6IERhdGUsIG1vZGU6IFwiYmFja3VwXCIgfCBcInB1bGxcIiB8IFwicHVzaFwiKSB7XG4gICAgICAgIGlmIChtb2RlID09PSBcImJhY2t1cFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRMYXN0QXV0b0JhY2t1cChkYXRlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFwicHVsbFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRMYXN0QXV0b1B1bGwoZGF0ZS50b1N0cmluZygpKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSBcInB1c2hcIikge1xuICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0TGFzdEF1dG9QdXNoKGRhdGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkTGFzdEF1dG8oKTogeyBiYWNrdXA6IERhdGU7IHB1bGw6IERhdGU7IHB1c2g6IERhdGUgfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiYWNrdXA6IG5ldyBEYXRlKHRoaXMubG9jYWxTdG9yYWdlLmdldExhc3RBdXRvQmFja3VwKCkgPz8gXCJcIiksXG4gICAgICAgICAgICBwdWxsOiBuZXcgRGF0ZSh0aGlzLmxvY2FsU3RvcmFnZS5nZXRMYXN0QXV0b1B1bGwoKSA/PyBcIlwiKSxcbiAgICAgICAgICAgIHB1c2g6IG5ldyBEYXRlKHRoaXMubG9jYWxTdG9yYWdlLmdldExhc3RBdXRvUHVzaCgpID8/IFwiXCIpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCB1c2VTaW1wbGVHaXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHA7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zaG93Tm90aWNlcygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VTaW1wbGVHaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdpdE1hbmFnZXIgPSBuZXcgU2ltcGxlR2l0KHRoaXMpO1xuICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLmdpdE1hbmFnZXIgYXMgU2ltcGxlR2l0KS5zZXRHaXRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdpdE1hbmFnZXIgPSBuZXcgSXNvbW9ycGhpY0dpdCh0aGlzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmNoZWNrUmVxdWlyZW1lbnRzKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtaXNzaW5nLWdpdFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcIkNhbm5vdCBydW4gZ2l0IGNvbW1hbmRcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtaXNzaW5nLXJlcG9cIjpcbiAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgZmluZCBhIHZhbGlkIGdpdCByZXBvc2l0b3J5LiBQbGVhc2UgY3JlYXRlIG9uZSB2aWEgdGhlIGdpdmVuIGNvbW1hbmQgb3IgY2xvbmUgYW4gZXhpc3RpbmcgcmVwby5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ2YWxpZFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdpdFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5pZGxlKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5FdmVudCA9IHRoaXMuYXBwLndvcmtzcGFjZS5vbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aXZlLWxlYWYtY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAobGVhZikgPT4gdGhpcy5oYW5kbGVWaWV3QWN0aXZlU3RhdGUobGVhZilcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGlmeUV2ZW50ID0gdGhpcy5hcHAudmF1bHQub24oXCJtb2RpZnlcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJSZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUV2ZW50ID0gdGhpcy5hcHAudmF1bHQub24oXCJkZWxldGVcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJSZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50ID0gdGhpcy5hcHAudmF1bHQub24oXCJjcmVhdGVcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJSZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmFtZUV2ZW50ID0gdGhpcy5hcHAudmF1bHQub24oXCJyZW5hbWVcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJSZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLm1vZGlmeUV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuZGVsZXRlRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5jcmVhdGVFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLnJlbmFtZUV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyYW5jaEJhcj8uZGlzcGxheSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUF1dGhvcmluZ0ZlYXR1cmUuY29uZGl0aW9uYWxseUFjdGl2YXRlQnlTZXR0aW5ncygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9QdWxsT25Cb290KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdWxsQ2hhbmdlc0Zyb21SZW1vdGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFVwQXV0b3MoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlNvbWV0aGluZyB3ZWlyZCBoYXBwZW5lZC4gVGhlICdjaGVja1JlcXVpcmVtZW50cycgcmVzdWx0IGlzIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlTmV3UmVwbygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmluaXQoKTtcbiAgICAgICAgbmV3IE5vdGljZShcIkluaXRpYWxpemVkIG5ldyByZXBvXCIpO1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbG9uZU5ld1JlcG8oKSB7XG4gICAgICAgIGNvbnN0IG1vZGFsID0gbmV3IEdlbmVyYWxNb2RhbCh7IHBsYWNlaG9sZGVyOiBcIkVudGVyIHJlbW90ZSBVUkxcIiB9KTtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgbW9kYWwub3BlbigpO1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maXJtT3B0aW9uID0gXCJWYXVsdCBSb290XCI7XG4gICAgICAgICAgICBsZXQgZGlyID0gYXdhaXQgbmV3IEdlbmVyYWxNb2RhbCh7XG4gICAgICAgICAgICAgICAgb3B0aW9uczpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5naXRNYW5hZ2VyIGluc3RhbmNlb2YgSXNvbW9ycGhpY0dpdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbY29uZmlybU9wdGlvbl1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6XG4gICAgICAgICAgICAgICAgICAgIFwiRW50ZXIgZGlyZWN0b3J5IGZvciBjbG9uZS4gSXQgbmVlZHMgdG8gYmUgZW1wdHkgb3Igbm90IGV4aXN0ZW50LlwiLFxuICAgICAgICAgICAgICAgIGFsbG93RW1wdHk6IHRoaXMuZ2l0TWFuYWdlciBpbnN0YW5jZW9mIElzb21vcnBoaWNHaXQsXG4gICAgICAgICAgICB9KS5vcGVuKCk7XG4gICAgICAgICAgICBpZiAoZGlyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGlyID09PSBjb25maXJtT3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpciA9IFwiLlwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRpciA9IG5vcm1hbGl6ZVBhdGgoZGlyKTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgICAgICBkaXIgPSBcIi5cIjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGlyID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RhbCA9IG5ldyBHZW5lcmFsTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogW1wiTk9cIiwgXCJZRVNcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogYERvZXMgeW91ciByZW1vdGUgcmVwbyBjb250YWluIGEgJHthcHAudmF1bHQuY29uZmlnRGlyfSBkaXJlY3RvcnkgYXQgdGhlIHJvb3Q/YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlTZWxlY3Rpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluc0NvbmZsaWN0RGlyID0gYXdhaXQgbW9kYWwub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNDb25mbGljdERpciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiQWJvcnRlZCBjbG9uZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluc0NvbmZsaWN0RGlyID09PSBcIllFU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maXJtT3B0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkRFTEVURSBBTEwgWU9VUiBMT0NBTCBDT05GSUcgQU5EIFBMVUdJTlNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGFsID0gbmV3IEdlbmVyYWxNb2RhbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogW1wiQWJvcnQgY2xvbmVcIiwgY29uZmlybU9wdGlvbl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IGBUbyBhdm9pZCBjb25mbGljdHMsIHRoZSBsb2NhbCAke2FwcC52YXVsdC5jb25maWdEaXJ9IGRpcmVjdG9yeSBuZWVkcyB0byBiZSBkZWxldGVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkRGVsZXRlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgbW9kYWwub3BlbigpKSA9PT0gY29uZmlybU9wdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGREZWxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLnJtZGlyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAudmF1bHQuY29uZmlnRGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIkFib3J0ZWQgY2xvbmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcHRoID0gYXdhaXQgbmV3IEdlbmVyYWxNb2RhbCh7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTcGVjaWZ5IGRlcHRoIG9mIGNsb25lLiBMZWF2ZSBlbXB0eSBmb3IgZnVsbCBjbG9uZS5cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dFbXB0eTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KS5vcGVuKCk7XG4gICAgICAgICAgICAgICAgbGV0IGRlcHRoSW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChkZXB0aCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBkZXB0aEludCA9IHBhcnNlSW50KGRlcHRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGRlcHRoSW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIkludmFsaWQgZGVwdGguIEFib3J0aW5nIGNsb25lLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGBDbG9uaW5nIG5ldyByZXBvIGludG8gXCIke2Rpcn1cImApO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEJhc2UgPSB0aGlzLnNldHRpbmdzLmJhc2VQYXRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbURpciA9IGRpciAmJiBkaXIgIT09IFwiLlwiO1xuICAgICAgICAgICAgICAgIC8vU2V0IG5ldyBiYXNlIHBhdGggYmVmb3JlIGNsb25lIHRvIGVuc3VyZSBwcm9wZXIgLmdpdC9pbmRleCBmaWxlIGxvY2F0aW9uIGluIGlzb21vcnBoaWMtZ2l0XG4gICAgICAgICAgICAgICAgaWYgKGN1c3RvbURpcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmJhc2VQYXRoID0gZGlyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdpdE1hbmFnZXIuY2xvbmUodXJsLCBkaXIsIGRlcHRoSW50KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmJhc2VQYXRoID0gb2xkQmFzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJDbG9uZWQgbmV3IHJlcG8uXCIpO1xuICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJQbGVhc2UgcmVzdGFydCBPYnNpZGlhblwiKTtcblxuICAgICAgICAgICAgICAgIGlmIChjdXN0b21EaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWVzIHRvIGNhbGwgYHRoaXMuaW5pdCgpYCBpZiBuZWNlc3NhcnksIG90aGVyd2lzZSByZXR1cm5zIGRpcmVjdGx5XG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBgdGhpcy5naXRNYW5hZ2VyYCBpcyByZWFkeSB0byBiZSB1c2VkLCBmYWxzZSBpZiBub3QuXG4gICAgICovXG4gICAgYXN5bmMgaXNBbGxJbml0aWFsaXplZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKCF0aGlzLmdpdFJlYWR5KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5naXRSZWFkeTtcbiAgICB9XG5cbiAgICAvLy9Vc2VkIGZvciBjb21tYW5kXG4gICAgYXN5bmMgcHVsbENoYW5nZXNGcm9tUmVtb3RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmlzQWxsSW5pdGlhbGl6ZWQoKSkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBmaWxlc1VwZGF0ZWQgPSBhd2FpdCB0aGlzLnB1bGwoKTtcbiAgICAgICAgdGhpcy5zZXRVcEF1dG9CYWNrdXAoKTtcbiAgICAgICAgaWYgKGZpbGVzVXBkYXRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZpbGVzVXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShcIkV2ZXJ5dGhpbmcgaXMgdXAtdG8tZGF0ZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdpdE1hbmFnZXIgaW5zdGFuY2VvZiBTaW1wbGVHaXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5zdGF0dXMoKTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMuY29uZmxpY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBZb3UgaGF2ZSBjb25mbGljdHMgaW4gJHtzdGF0dXMuY29uZmxpY3RlZC5sZW5ndGh9ICR7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuY29uZmxpY3RlZC5sZW5ndGggPT0gMSA/IFwiZmlsZVwiIDogXCJmaWxlc1wiXG4gICAgICAgICAgICAgICAgICAgIH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNvbmZsaWN0KHN0YXR1cy5jb25mbGljdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZUJhY2t1cChcbiAgICAgICAgZnJvbUF1dG9CYWNrdXA6IGJvb2xlYW4sXG4gICAgICAgIHJlcXVlc3RDdXN0b21NZXNzYWdlID0gZmFsc2UsXG4gICAgICAgIGNvbW1pdE1lc3NhZ2U/OiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5pc0FsbEluaXRpYWxpemVkKCkpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5zeW5jTWV0aG9kID09IFwicmVzZXRcIiAmJlxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5wdWxsQmVmb3JlUHVzaFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHVsbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShhd2FpdCB0aGlzLmNvbW1pdCh7XG4gICAgICAgICAgICAgICAgZnJvbUF1dG9CYWNrdXAsXG4gICAgICAgICAgICAgICAgcmVxdWVzdEN1c3RvbU1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgY29tbWl0TWVzc2FnZSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5kaXNhYmxlUHVzaCkge1xuICAgICAgICAgICAgLy8gUHJldmVudCBwbHVnaW4gdG8gcHVsbC9wdXNoIGF0IGV2ZXJ5IGNhbGwgb2YgY3JlYXRlQmFja3VwLiBPbmx5IGlmIHVucHVzaGVkIGNvbW1pdHMgYXJlIHByZXNlbnRcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5yZW1vdGVzQXJlU2V0KCkpICYmXG4gICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5jYW5QdXNoKCkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3Muc3luY01ldGhvZCAhPSBcInJlc2V0XCIgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5wdWxsQmVmb3JlUHVzaFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnB1bGwoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnB1c2goKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShcIk5vIGNoYW5nZXMgdG8gcHVzaFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBjb21taXQgd2FzIHN1Y2Nlc3NmdWxseVxuICAgIGFzeW5jIGNvbW1pdCh7XG4gICAgICAgIGZyb21BdXRvQmFja3VwLFxuICAgICAgICByZXF1ZXN0Q3VzdG9tTWVzc2FnZSA9IGZhbHNlLFxuICAgICAgICBvbmx5U3RhZ2VkID0gZmFsc2UsXG4gICAgICAgIGNvbW1pdE1lc3NhZ2UsXG4gICAgICAgIGFtZW5kID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgICBmcm9tQXV0b0JhY2t1cDogYm9vbGVhbjtcbiAgICAgICAgcmVxdWVzdEN1c3RvbU1lc3NhZ2U/OiBib29sZWFuO1xuICAgICAgICBvbmx5U3RhZ2VkPzogYm9vbGVhbjtcbiAgICAgICAgY29tbWl0TWVzc2FnZT86IHN0cmluZztcbiAgICAgICAgYW1lbmQ/OiBib29sZWFuO1xuICAgIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5pc0FsbEluaXRpYWxpemVkKCkpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGhhZENvbmZsaWN0ID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0Q29uZmxpY3QoKTtcblxuICAgICAgICBsZXQgY2hhbmdlZEZpbGVzOiB7IHZhdWx0X3BhdGg6IHN0cmluZyB9W107XG4gICAgICAgIGxldCBzdGF0dXM6IFN0YXR1cyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHVuc3RhZ2VkRmlsZXM6IFVuc3RhZ2VkRmlsZVtdIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmICh0aGlzLmdpdE1hbmFnZXIgaW5zdGFuY2VvZiBTaW1wbGVHaXQpIHtcbiAgICAgICAgICAgIHRoaXMubWF5RGVsZXRlQ29uZmxpY3RGaWxlKCk7XG4gICAgICAgICAgICBzdGF0dXMgPSBhd2FpdCB0aGlzLnVwZGF0ZUNhY2hlZFN0YXR1cygpO1xuXG4gICAgICAgICAgICAvL1Nob3VsZCBub3QgYmUgbmVjZXNzYXJ5LCBidXQganVzdCBpbiBjYXNlXG4gICAgICAgICAgICBpZiAoc3RhdHVzLmNvbmZsaWN0ZWQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRDb25mbGljdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgaGFkQ29uZmxpY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGNvbmZsaWN0IGZpbGVzIG9uIGF1dG8gYmFja3VwXG4gICAgICAgICAgICBpZiAoZnJvbUF1dG9CYWNrdXAgJiYgc3RhdHVzLmNvbmZsaWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgRGlkIG5vdCBjb21taXQsIGJlY2F1c2UgeW91IGhhdmUgY29uZmxpY3RzIGluICR7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuY29uZmxpY3RlZC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgfSAke1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmNvbmZsaWN0ZWQubGVuZ3RoID09IDEgPyBcImZpbGVcIiA6IFwiZmlsZXNcIlxuICAgICAgICAgICAgICAgICAgICB9LiBQbGVhc2UgcmVzb2x2ZSB0aGVtIGFuZCBjb21taXQgcGVyIGNvbW1hbmQuYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDb25mbGljdChzdGF0dXMuY29uZmxpY3RlZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hhbmdlZEZpbGVzID0gWy4uLnN0YXR1cy5jaGFuZ2VkLCAuLi5zdGF0dXMuc3RhZ2VkXTtcbiAgICAgICAgfSBlbHNlIGlmIChmcm9tQXV0b0JhY2t1cCAmJiBoYWRDb25mbGljdCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5jb25mbGljdGVkKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUVycm9yKFxuICAgICAgICAgICAgICAgIGBEaWQgbm90IGNvbW1pdCwgYmVjYXVzZSB5b3UgaGF2ZSBjb25mbGljdHMuIFBsZWFzZSByZXNvbHZlIHRoZW0gYW5kIGNvbW1pdCBwZXIgY29tbWFuZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGhhZENvbmZsaWN0KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1heURlbGV0ZUNvbmZsaWN0RmlsZSgpO1xuICAgICAgICAgICAgc3RhdHVzID0gYXdhaXQgdGhpcy51cGRhdGVDYWNoZWRTdGF0dXMoKTtcbiAgICAgICAgICAgIGNoYW5nZWRGaWxlcyA9IFsuLi5zdGF0dXMuY2hhbmdlZCwgLi4uc3RhdHVzLnN0YWdlZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAob25seVN0YWdlZCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWRGaWxlcyA9IGF3YWl0IChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5naXRNYW5hZ2VyIGFzIElzb21vcnBoaWNHaXRcbiAgICAgICAgICAgICAgICApLmdldFN0YWdlZEZpbGVzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVuc3RhZ2VkRmlsZXMgPSBhd2FpdCAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2l0TWFuYWdlciBhcyBJc29tb3JwaGljR2l0XG4gICAgICAgICAgICAgICAgKS5nZXRVbnN0YWdlZEZpbGVzKCk7XG4gICAgICAgICAgICAgICAgY2hhbmdlZEZpbGVzID0gdW5zdGFnZWRGaWxlcy5tYXAoKHsgZmlsZXBhdGggfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmF1bHRfcGF0aDogdGhpcy5naXRNYW5hZ2VyLmdldFJlbGF0aXZlVmF1bHRQYXRoKGZpbGVwYXRoKSxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYXNUb29CaWdGaWxlcyhjaGFuZ2VkRmlsZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWRGaWxlcy5sZW5ndGggIT09IDAgfHwgaGFkQ29uZmxpY3QpIHtcbiAgICAgICAgICAgIGxldCBjbXRNZXNzYWdlID0gKGNvbW1pdE1lc3NhZ2UgPz89IGZyb21BdXRvQmFja3VwXG4gICAgICAgICAgICAgICAgPyB0aGlzLnNldHRpbmdzLmF1dG9Db21taXRNZXNzYWdlXG4gICAgICAgICAgICAgICAgOiB0aGlzLnNldHRpbmdzLmNvbW1pdE1lc3NhZ2UpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChmcm9tQXV0b0JhY2t1cCAmJiB0aGlzLnNldHRpbmdzLmN1c3RvbU1lc3NhZ2VPbkF1dG9CYWNrdXApIHx8XG4gICAgICAgICAgICAgICAgcmVxdWVzdEN1c3RvbU1lc3NhZ2VcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5kaXNhYmxlUG9wdXBzICYmIGZyb21BdXRvQmFja3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkF1dG8gYmFja3VwOiBQbGVhc2UgZW50ZXIgYSBjdXN0b20gY29tbWl0IG1lc3NhZ2UuIExlYXZlIGVtcHR5IHRvIGFib3J0XCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcE1lc3NhZ2UgPSBhd2FpdCBuZXcgQ3VzdG9tTWVzc2FnZU1vZGFsKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKS5vcGVuKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRlbXBNZXNzYWdlICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICB0ZW1wTWVzc2FnZSAhPSBcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgIHRlbXBNZXNzYWdlICE9IFwiLi4uXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY210TWVzc2FnZSA9IHRlbXBNZXNzYWdlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29tbWl0dGVkRmlsZXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChvbmx5U3RhZ2VkKSB7XG4gICAgICAgICAgICAgICAgY29tbWl0dGVkRmlsZXMgPSBhd2FpdCB0aGlzLmdpdE1hbmFnZXIuY29tbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY210TWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgYW1lbmQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbW1pdHRlZEZpbGVzID0gYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmNvbW1pdEFsbCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNtdE1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgdW5zdGFnZWRGaWxlcyxcbiAgICAgICAgICAgICAgICAgICAgYW1lbmQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vSGFuZGxlIHJlc29sdmVkIGNvbmZsaWN0IGFmdGVyIGNvbW1pdFxuICAgICAgICAgICAgaWYgKHRoaXMuZ2l0TWFuYWdlciBpbnN0YW5jZW9mIFNpbXBsZUdpdCkge1xuICAgICAgICAgICAgICAgIGlmICgoYXdhaXQgdGhpcy51cGRhdGVDYWNoZWRTdGF0dXMoKSkuY29uZmxpY3RlZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRDb25mbGljdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcm91Z2hseSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGNvbW1pdHRlZEZpbGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByb3VnaGx5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb21taXR0ZWRGaWxlcyA9IGNoYW5nZWRGaWxlcy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFVwQXV0b0JhY2t1cCgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShcbiAgICAgICAgICAgICAgICBgQ29tbWl0dGVkJHtyb3VnaGx5ID8gXCIgYXBwcm94LlwiIDogXCJcIn0gJHtjb21taXR0ZWRGaWxlc30gJHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0dGVkRmlsZXMgPT0gMSA/IFwiZmlsZVwiIDogXCJmaWxlc1wiXG4gICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKFwiTm8gY2hhbmdlcyB0byBjb21taXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJnaXQtcmVmcmVzaFwiKSk7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5pZGxlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgaGFzVG9vQmlnRmlsZXMoZmlsZXM6IHsgdmF1bHRfcGF0aDogc3RyaW5nIH1bXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBicmFuY2hJbmZvID0gYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmJyYW5jaEluZm8oKTtcbiAgICAgICAgY29uc3QgcmVtb3RlID0gYnJhbmNoSW5mby50cmFja2luZ1xuICAgICAgICAgICAgPyBzcGxpdFJlbW90ZUJyYW5jaChicmFuY2hJbmZvLnRyYWNraW5nKVswXVxuICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIGlmIChyZW1vdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW90ZVVybCA9IGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5nZXRSZW1vdGVVcmwocmVtb3RlKTtcblxuICAgICAgICAgICAgLy9DaGVjayBmb3IgZmlsZXMgPjEwMG1iIG9uIEdpdEh1YiByZW1vdGVcbiAgICAgICAgICAgIGlmIChyZW1vdGVVcmw/LmluY2x1ZGVzKFwiZ2l0aHViLmNvbVwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb0JpZ0ZpbGVzID0gZmlsZXMuZmlsdGVyKChmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICBmLnZhdWx0X3BhdGhcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuc3RhdC5zaXplID49IDEwMDAwMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZ0ZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRGlkIG5vdCBjb21taXQsIGJlY2F1c2UgZm9sbG93aW5nIGZpbGVzIGFyZSB0b28gYmlnOiAke3Rvb0JpZ0ZpbGVzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT4gZS52YXVsdF9wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICApfS4gUGxlYXNlIHJlbW92ZSB0aGVtLmBcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIHB1c2goKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaXNBbGxJbml0aWFsaXplZCgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLnJlbW90ZXNBcmVTZXQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoYWRDb25mbGljdCA9IHRoaXMubG9jYWxTdG9yYWdlLmdldENvbmZsaWN0KCk7XG4gICAgICAgIGlmICh0aGlzLmdpdE1hbmFnZXIgaW5zdGFuY2VvZiBTaW1wbGVHaXQpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1heURlbGV0ZUNvbmZsaWN0RmlsZSgpO1xuXG4gICAgICAgIC8vIFJlZnJlc2ggYmVjYXVzZSBvZiBwdWxsXG4gICAgICAgIGxldCBzdGF0dXM6IGFueTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5naXRNYW5hZ2VyIGluc3RhbmNlb2YgU2ltcGxlR2l0ICYmXG4gICAgICAgICAgICAoc3RhdHVzID0gYXdhaXQgdGhpcy51cGRhdGVDYWNoZWRTdGF0dXMoKSkuY29uZmxpY3RlZC5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBwdXNoLiBZb3UgaGF2ZSBjb25mbGljdHMgaW4gJHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmNvbmZsaWN0ZWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgfSAke3N0YXR1cy5jb25mbGljdGVkLmxlbmd0aCA9PSAxID8gXCJmaWxlXCIgOiBcImZpbGVzXCJ9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29uZmxpY3Qoc3RhdHVzLmNvbmZsaWN0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2l0TWFuYWdlciBpbnN0YW5jZW9mIElzb21vcnBoaWNHaXQgJiYgaGFkQ29uZmxpY3QpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUVycm9yKGBDYW5ub3QgcHVzaC4gWW91IGhhdmUgY29uZmxpY3RzYCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmNvbmZsaWN0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUHVzaGluZy4uLi5cIik7XG4gICAgICAgIGNvbnN0IHB1c2hlZEZpbGVzID0gYXdhaXQgdGhpcy5naXRNYW5hZ2VyLnB1c2goKTtcblxuICAgICAgICBpZiAocHVzaGVkRmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQdXNoZWQhXCIsIHB1c2hlZEZpbGVzKTtcbiAgICAgICAgICAgIGlmIChwdXNoZWRGaWxlcyA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICBgUHVzaGVkICR7cHVzaGVkRmlsZXN9ICR7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoZWRGaWxlcyA9PSAxID8gXCJmaWxlXCIgOiBcImZpbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgfSB0byByZW1vdGVgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShgTm8gY2hhbmdlcyB0byBwdXNoYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vZmZsaW5lTW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgICAgICBkaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImdpdC1yZWZyZXNoXCIpKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogVXNlZCBmb3IgaW50ZXJuYWxzXG4gICAgUmV0dXJucyB3aGV0aGVyIHRoZSBwdWxsIGFkZGVkIGEgY29tbWl0IG9yIG5vdC5cblxuICAgIFNlZSB7QGxpbmsgcHVsbENoYW5nZXNGcm9tUmVtb3RlfSBmb3IgdGhlIGNvbW1hbmQgdmVyc2lvbi4gKi9cbiAgICBhc3luYyBwdWxsKCk6IFByb21pc2U8ZmFsc2UgfCBudW1iZXI+IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5yZW1vdGVzQXJlU2V0KCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHVsbGVkRmlsZXMgPSAoYXdhaXQgdGhpcy5naXRNYW5hZ2VyLnB1bGwoKSkgfHwgW107XG4gICAgICAgIHRoaXMub2ZmbGluZU1vZGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAocHVsbGVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShcbiAgICAgICAgICAgICAgICBgUHVsbGVkICR7cHVsbGVkRmlsZXMubGVuZ3RofSAke1xuICAgICAgICAgICAgICAgICAgICBwdWxsZWRGaWxlcy5sZW5ndGggPT0gMSA/IFwiZmlsZVwiIDogXCJmaWxlc1wiXG4gICAgICAgICAgICAgICAgfSBmcm9tIHJlbW90ZWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmxhc3RQdWxsZWRGaWxlcyA9IHB1bGxlZEZpbGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwdWxsZWRGaWxlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMucmVtb3Rlc0FyZVNldCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5mZXRjaCgpO1xuXG4gICAgICAgIHRoaXMuZGlzcGxheU1lc3NhZ2UoYEZldGNoZWQgZnJvbSByZW1vdGVgKTtcbiAgICAgICAgdGhpcy5vZmZsaW5lTW9kZSA9IGZhbHNlO1xuICAgICAgICBkaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImdpdC1yZWZyZXNoXCIpKTtcbiAgICB9XG5cbiAgICBhc3luYyBtYXlEZWxldGVDb25mbGljdEZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoXG4gICAgICAgICAgICB0aGlzLmNvbmZsaWN0T3V0cHV0RmlsZVxuICAgICAgICApO1xuICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldyAmJlxuICAgICAgICAgICAgICAgICAgICBsZWFmLnZpZXcuZmlsZT8ucGF0aCA9PSBmaWxlLnBhdGhcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhZi5kZXRhY2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmRlbGV0ZShmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHN0YWdlRmlsZShmaWxlOiBURmlsZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmlzQWxsSW5pdGlhbGl6ZWQoKSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBhd2FpdCB0aGlzLmdpdE1hbmFnZXIuc3RhZ2UoZmlsZS5wYXRoLCB0cnVlKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShgU3RhZ2VkICR7ZmlsZS5wYXRofWApO1xuXG4gICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIHVuc3RhZ2VGaWxlKGZpbGU6IFRGaWxlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaXNBbGxJbml0aWFsaXplZCgpKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0TWFuYWdlci51bnN0YWdlKGZpbGUucGF0aCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZGlzcGxheU1lc3NhZ2UoYFVuc3RhZ2VkICR7ZmlsZS5wYXRofWApO1xuXG4gICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIHN3aXRjaEJyYW5jaCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmlzQWxsSW5pdGlhbGl6ZWQoKSkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBicmFuY2hJbmZvID0gYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmJyYW5jaEluZm8oKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRCcmFuY2ggPSBhd2FpdCBuZXcgQnJhbmNoTW9kYWwoXG4gICAgICAgICAgICBicmFuY2hJbmZvLmJyYW5jaGVzXG4gICAgICAgICkub3BlbigpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEJyYW5jaCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5jaGVja291dChzZWxlY3RlZEJyYW5jaCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKGBTd2l0Y2hlZCB0byAke3NlbGVjdGVkQnJhbmNofWApO1xuICAgICAgICAgICAgdGhpcy5icmFuY2hCYXI/LmRpc3BsYXkoKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEJyYW5jaDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHN3aXRjaFJlbW90ZUJyYW5jaCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmlzQWxsSW5pdGlhbGl6ZWQoKSkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBzZWxlY3RlZEJyYW5jaCA9IChhd2FpdCB0aGlzLnNlbGVjdFJlbW90ZUJyYW5jaCgpKSB8fCBcIlwiO1xuXG4gICAgICAgIGNvbnN0IFtyZW1vdGUsIGJyYW5jaF0gPSBzcGxpdFJlbW90ZUJyYW5jaChzZWxlY3RlZEJyYW5jaCk7XG5cbiAgICAgICAgaWYgKGJyYW5jaCAhPSB1bmRlZmluZWQgJiYgcmVtb3RlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmNoZWNrb3V0KGJyYW5jaCwgcmVtb3RlKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU1lc3NhZ2UoYFN3aXRjaGVkIHRvICR7c2VsZWN0ZWRCcmFuY2h9YCk7XG4gICAgICAgICAgICB0aGlzLmJyYW5jaEJhcj8uZGlzcGxheSgpO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkQnJhbmNoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlQnJhbmNoKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaXNBbGxJbml0aWFsaXplZCgpKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld0JyYW5jaCA9IGF3YWl0IG5ldyBHZW5lcmFsTW9kYWwoe1xuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiQ3JlYXRlIG5ldyBicmFuY2hcIixcbiAgICAgICAgfSkub3BlbigpO1xuICAgICAgICBpZiAobmV3QnJhbmNoICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmNyZWF0ZUJyYW5jaChuZXdCcmFuY2gpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShgQ3JlYXRlZCBuZXcgYnJhbmNoICR7bmV3QnJhbmNofWApO1xuICAgICAgICAgICAgdGhpcy5icmFuY2hCYXI/LmRpc3BsYXkoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdCcmFuY2g7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVCcmFuY2goKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5pc0FsbEluaXRpYWxpemVkKCkpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYnJhbmNoSW5mbyA9IGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5icmFuY2hJbmZvKCk7XG4gICAgICAgIGlmIChicmFuY2hJbmZvLmN1cnJlbnQpIGJyYW5jaEluZm8uYnJhbmNoZXMucmVtb3ZlKGJyYW5jaEluZm8uY3VycmVudCk7XG4gICAgICAgIGNvbnN0IGJyYW5jaCA9IGF3YWl0IG5ldyBHZW5lcmFsTW9kYWwoe1xuICAgICAgICAgICAgb3B0aW9uczogYnJhbmNoSW5mby5icmFuY2hlcyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIkRlbGV0ZSBicmFuY2hcIixcbiAgICAgICAgICAgIG9ubHlTZWxlY3Rpb246IHRydWUsXG4gICAgICAgIH0pLm9wZW4oKTtcbiAgICAgICAgaWYgKGJyYW5jaCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBmb3JjZSA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmJyYW5jaElzTWVyZ2VkKGJyYW5jaCk7XG4gICAgICAgICAgICAvLyBVc2luZyBhd2FpdCBpbnNpZGUgSUYgdGhyb3dzIGV4Y2VwdGlvblxuICAgICAgICAgICAgaWYgKCFtZXJnZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JjZUFuc3dlciA9IGF3YWl0IG5ldyBHZW5lcmFsTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbXCJZRVNcIiwgXCJOT1wiXSxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlRoaXMgYnJhbmNoIGlzbid0IG1lcmdlZCBpbnRvIEhFQUQuIEZvcmNlIGRlbGV0ZT9cIixcbiAgICAgICAgICAgICAgICAgICAgb25seVNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KS5vcGVuKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZvcmNlQW5zd2VyICE9PSBcIllFU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yY2UgPSBmb3JjZUFuc3dlciA9PT0gXCJZRVNcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5kZWxldGVCcmFuY2goYnJhbmNoLCBmb3JjZSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKGBEZWxldGVkIGJyYW5jaCAke2JyYW5jaH1gKTtcbiAgICAgICAgICAgIHRoaXMuYnJhbmNoQmFyPy5kaXNwbGF5KCk7XG4gICAgICAgICAgICByZXR1cm4gYnJhbmNoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlcyB0aGF0IHRoZSB1cHN0cmVhbSBicmFuY2ggaXMgc2V0LlxuICAgIC8vIElmIG5vdCwgaXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gc2V0IGl0LlxuICAgIC8vXG4gICAgLy8gQW4gZXhjZXB0aW9uIGlzIHdoZW4gdGhlIHVzZXIgaGFzIHN1Ym1vZHVsZXMgZW5hYmxlZC5cbiAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSB1cHN0cmVhbSBicmFuY2ggaXMgbm90IHJlcXVpcmVkLFxuICAgIC8vIHRvIGFsbG93IHB1bGxpbmcvcHVzaGluZyBvbmx5IHRoZSBzdWJtb2R1bGVzIGFuZCBub3QgdGhlIG91dGVyIHJlcG8uXG4gICAgYXN5bmMgcmVtb3Rlc0FyZVNldCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MudXBkYXRlU3VibW9kdWxlcykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmJyYW5jaEluZm8oKSkudHJhY2tpbmcpIHtcbiAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJObyB1cHN0cmVhbSBicmFuY2ggaXMgc2V0LiBQbGVhc2Ugc2VsZWN0IG9uZS5cIik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRVcHN0cmVhbUJyYW5jaCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIHNldFVwc3RyZWFtQnJhbmNoKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZW1vdGVCcmFuY2ggPSBhd2FpdCB0aGlzLnNlbGVjdFJlbW90ZUJyYW5jaCgpO1xuXG4gICAgICAgIGlmIChyZW1vdGVCcmFuY2ggPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcIkFib3J0ZWQuIE5vIHVwc3RyZWFtLWJyYW5jaCBpcyBzZXQhXCIsIDEwMDAwKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdpdE1hbmFnZXIudXBkYXRlVXBzdHJlYW1CcmFuY2gocmVtb3RlQnJhbmNoKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU1lc3NhZ2UoYFNldCB1cHN0cmVhbSBicmFuY2ggdG8gJHtyZW1vdGVCcmFuY2h9YCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzZXRVcEF1dG9CYWNrdXAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnNldExhc3RTYXZlVG9MYXN0Q29tbWl0KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQXV0b0JhY2t1cCgpO1xuICAgICAgICAgICAgY29uc3QgbGFzdENvbW1pdERhdGUgPSBhd2FpdCB0aGlzLmdpdE1hbmFnZXIuZ2V0TGFzdENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIGlmIChsYXN0Q29tbWl0RGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldExhc3RBdXRvQmFja3VwKGxhc3RDb21taXREYXRlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnRpbWVvdXRJREJhY2t1cCAmJiAhdGhpcy5vbkZpbGVNb2RpZnlFdmVudFJlZikge1xuICAgICAgICAgICAgY29uc3QgbGFzdEF1dG9zID0gdGhpcy5sb2FkTGFzdEF1dG8oKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCAtXG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAobm93LmdldFRpbWUoKSAtIGxhc3RBdXRvcy5iYWNrdXAuZ2V0VGltZSgpKSAvIDEwMDAgLyA2MFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvQmFja3VwKGRpZmYgPD0gMCA/IDAgOiBkaWZmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHNldFVwQXV0b3MoKSB7XG4gICAgICAgIHRoaXMuc2V0VXBBdXRvQmFja3VwKCk7XG4gICAgICAgIGNvbnN0IGxhc3RBdXRvcyA9IHRoaXMubG9hZExhc3RBdXRvKCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5kaWZmZXJlbnRJbnRlcnZhbENvbW1pdEFuZFB1c2ggJiZcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYXV0b1B1c2hJbnRlcnZhbCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBkaWZmID1cbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmF1dG9QdXNoSW50ZXJ2YWwgLVxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgIChub3cuZ2V0VGltZSgpIC0gbGFzdEF1dG9zLnB1c2guZ2V0VGltZSgpKSAvIDEwMDAgLyA2MFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1B1c2goZGlmZiA8PSAwID8gMCA6IGRpZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9QdWxsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBkaWZmID1cbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmF1dG9QdWxsSW50ZXJ2YWwgLVxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgIChub3cuZ2V0VGltZSgpIC0gbGFzdEF1dG9zLnB1bGwuZ2V0VGltZSgpKSAvIDEwMDAgLyA2MFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1B1bGwoZGlmZiA8PSAwID8gMCA6IGRpZmYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZGlzY2FyZEFsbCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmRpc2NhcmRBbGwoe1xuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLmNhY2hlZFN0YXR1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIG5ldyBOb3RpY2UoXG4gICAgICAgICAgICBcIkFsbCBsb2NhbCBjaGFuZ2VzIGhhdmUgYmVlbiBkaXNjYXJkZWQuIE5ldyBmaWxlcyByZW1haW4gdW50b3VjaGVkLlwiXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY2xlYXJBdXRvcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhckF1dG9CYWNrdXAoKTtcbiAgICAgICAgdGhpcy5jbGVhckF1dG9QdXNoKCk7XG4gICAgICAgIHRoaXMuY2xlYXJBdXRvUHVsbCgpO1xuICAgIH1cblxuICAgIHN0YXJ0QXV0b0JhY2t1cChtaW51dGVzPzogbnVtYmVyKSB7XG4gICAgICAgIGxldCB0aW1lID0gKG1pbnV0ZXMgPz8gdGhpcy5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsKSAqIDYwMDAwO1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5hdXRvQmFja3VwQWZ0ZXJGaWxlQ2hhbmdlKSB7XG4gICAgICAgICAgICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9BdXRvQmFja3VwKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub25GaWxlTW9kaWZ5RXZlbnRSZWYgPSB0aGlzLmFwcC52YXVsdC5vbihcIm1vZGlmeVwiLCAoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9CYWNrdXBEZWJvdW5jZXIoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvQmFja3VwRGVib3VuY2VyID0gZGVib3VuY2UoXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuZG9BdXRvQmFja3VwKCksXG4gICAgICAgICAgICAgICAgICAgIHRpbWUsXG4gICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbWF4IHRpbWVvdXQgaW4ganNcbiAgICAgICAgICAgIGlmICh0aW1lID4gMjE0NzQ4MzY0NykgdGltZSA9IDIxNDc0ODM2NDc7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXRJREJhY2t1cCA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICgpID0+IHRoaXMuZG9BdXRvQmFja3VwKCksXG4gICAgICAgICAgICAgICAgdGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgYm90aCBhdXRvIGJhY2t1cCBhbmQgY29tbWl0XG4gICAgZG9BdXRvQmFja3VwKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmRpZmZlcmVudEludGVydmFsQ29tbWl0QW5kUHVzaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1pdCh7IGZyb21BdXRvQmFja3VwOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVCYWNrdXAodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNhdmVMYXN0QXV0byhuZXcgRGF0ZSgpLCBcImJhY2t1cFwiKTtcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgdGhpcy5zdGFydEF1dG9CYWNrdXAoKTtcbiAgICB9XG5cbiAgICBzdGFydEF1dG9QdWxsKG1pbnV0ZXM/OiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHRpbWUgPSAobWludXRlcyA/PyB0aGlzLnNldHRpbmdzLmF1dG9QdWxsSW50ZXJ2YWwpICogNjAwMDA7XG4gICAgICAgIC8vIG1heCB0aW1lb3V0IGluIGpzXG4gICAgICAgIGlmICh0aW1lID4gMjE0NzQ4MzY0NykgdGltZSA9IDIxNDc0ODM2NDc7XG5cbiAgICAgICAgdGhpcy50aW1lb3V0SURQdWxsID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLnB1bGxDaGFuZ2VzRnJvbVJlbW90ZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUxhc3RBdXRvKG5ldyBEYXRlKCksIFwicHVsbFwiKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1B1bGwoKTtcbiAgICAgICAgfSwgdGltZSk7XG4gICAgfVxuXG4gICAgc3RhcnRBdXRvUHVzaChtaW51dGVzPzogbnVtYmVyKSB7XG4gICAgICAgIGxldCB0aW1lID0gKG1pbnV0ZXMgPz8gdGhpcy5zZXR0aW5ncy5hdXRvUHVzaEludGVydmFsKSAqIDYwMDAwO1xuICAgICAgICAvLyBtYXggdGltZW91dCBpbiBqc1xuICAgICAgICBpZiAodGltZSA+IDIxNDc0ODM2NDcpIHRpbWUgPSAyMTQ3NDgzNjQ3O1xuXG4gICAgICAgIHRoaXMudGltZW91dElEUHVzaCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZVF1ZXVlLmFkZFRhc2soKCkgPT4gdGhpcy5wdXNoKCkpO1xuICAgICAgICAgICAgdGhpcy5zYXZlTGFzdEF1dG8obmV3IERhdGUoKSwgXCJwdXNoXCIpO1xuICAgICAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvUHVzaCgpO1xuICAgICAgICB9LCB0aW1lKTtcbiAgICB9XG5cbiAgICBjbGVhckF1dG9CYWNrdXAoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCB3YXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMudGltZW91dElEQmFja3VwKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElEQmFja3VwKTtcbiAgICAgICAgICAgIHRoaXMudGltZW91dElEQmFja3VwID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgd2FzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbkZpbGVNb2RpZnlFdmVudFJlZikge1xuICAgICAgICAgICAgdGhpcy5hdXRvQmFja3VwRGVib3VuY2VyPy5jYW5jZWwoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwLnZhdWx0Lm9mZnJlZih0aGlzLm9uRmlsZU1vZGlmeUV2ZW50UmVmKTtcbiAgICAgICAgICAgIHRoaXMub25GaWxlTW9kaWZ5RXZlbnRSZWYgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB3YXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YXNBY3RpdmU7XG4gICAgfVxuXG4gICAgY2xlYXJBdXRvUHVsbCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudGltZW91dElEUHVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJRFB1bGwpO1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0SURQdWxsID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNsZWFyQXV0b1B1c2goKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXRJRFB1c2gpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SURQdXNoKTtcbiAgICAgICAgICAgIHRoaXMudGltZW91dElEUHVzaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBoYW5kbGVDb25mbGljdChjb25mbGljdGVkPzogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5jb25mbGljdGVkKTtcblxuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRDb25mbGljdCh0cnVlKTtcbiAgICAgICAgbGV0IGxpbmVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGNvbmZsaWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgICAgICAgXCIjIENvbmZsaWN0c1wiLFxuICAgICAgICAgICAgICAgIFwiUGxlYXNlIHJlc29sdmUgdGhlbSBhbmQgY29tbWl0IHRoZW0gdXNpbmcgdGhlIGNvbW1hbmRzIGBHaXQ6IENvbW1pdCBhbGwgY2hhbmdlc2AgZm9sbG93ZWQgYnkgYEdpdDogUHVzaGBcIixcbiAgICAgICAgICAgICAgICBcIihUaGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRlbGV0ZWQgYmVmb3JlIGNvbW1pdClcIixcbiAgICAgICAgICAgICAgICBcIltbI0FkZGl0aW9uYWwgSW5zdHJ1Y3Rpb25zXV0gYXZhaWxhYmxlIGJlbG93IGZpbGUgbGlzdFwiLFxuICAgICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICAgICAgLi4uY29uZmxpY3RlZC5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluayA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgLSBbWyR7bGlua31dXWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYC0gTm90IGEgZmlsZTogJHtlfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBgXG4jIEFkZGl0aW9uYWwgSW5zdHJ1Y3Rpb25zXG5JIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgXCJTb3VyY2UgbW9kZVwiIGZvciB2aWV3aW5nIHRoZSBjb25mbGljdGVkIGZpbGVzLiBGb3Igc2ltcGxlIGNvbmZsaWN0cywgaW4gZWFjaCBmaWxlIGxpc3RlZCBhYm92ZSByZXBsYWNlIGV2ZXJ5IG9jY3VycmVuY2Ugb2YgdGhlIGZvbGxvd2luZyB0ZXh0IGJsb2NrcyB3aXRoIHRoZSBkZXNpcmVkIHRleHQuXG5cblxcYFxcYFxcYGRpZmZcbjw8PDw8PDwgSEVBRFxuICAgIEZpbGUgY2hhbmdlcyBpbiBsb2NhbCByZXBvc2l0b3J5XG49PT09PT09XG4gICAgRmlsZSBjaGFuZ2VzIGluIHJlbW90ZSByZXBvc2l0b3J5XG4+Pj4+Pj4+IG9yaWdpbi9tYWluXG5cXGBcXGBcXGBgLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndyaXRlQW5kT3BlbkZpbGUobGluZXM/LmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIGFzeW5jIGVkaXRSZW1vdGVzKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaXNBbGxJbml0aWFsaXplZCgpKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCB0aGlzLmdpdE1hbmFnZXIuZ2V0UmVtb3RlcygpO1xuXG4gICAgICAgIGNvbnN0IG5hbWVNb2RhbCA9IG5ldyBHZW5lcmFsTW9kYWwoe1xuICAgICAgICAgICAgb3B0aW9uczogcmVtb3RlcyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOlxuICAgICAgICAgICAgICAgIFwiU2VsZWN0IG9yIGNyZWF0ZSBhIG5ldyByZW1vdGUgYnkgdHlwaW5nIGl0cyBuYW1lIGFuZCBzZWxlY3RpbmcgaXRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlbW90ZU5hbWUgPSBhd2FpdCBuYW1lTW9kYWwub3BlbigpO1xuXG4gICAgICAgIGlmIChyZW1vdGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBvbGRVcmwgPSBhd2FpdCB0aGlzLmdpdE1hbmFnZXIuZ2V0UmVtb3RlVXJsKHJlbW90ZU5hbWUpO1xuXG4gICAgICAgICAgICBjb25zdCB1cmxNb2RhbCA9IG5ldyBHZW5lcmFsTW9kYWwoeyBpbml0aWFsVmFsdWU6IG9sZFVybCB9KTtcbiAgICAgICAgICAgIC8vIHVybE1vZGFsLmlucHV0RWwuc2V0VGV4dChvbGRVcmwgPz8gXCJcIik7XG4gICAgICAgICAgICBjb25zdCByZW1vdGVVUkwgPSBhd2FpdCB1cmxNb2RhbC5vcGVuKCk7XG4gICAgICAgICAgICBpZiAocmVtb3RlVVJMKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5naXRNYW5hZ2VyLnNldFJlbW90ZShyZW1vdGVOYW1lLCByZW1vdGVVUkwpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZW1vdGVOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0UmVtb3RlQnJhbmNoKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZW1vdGVzID0gYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmdldFJlbW90ZXMoKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkUmVtb3RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChyZW1vdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRSZW1vdGUgPSBhd2FpdCB0aGlzLmVkaXRSZW1vdGVzKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRSZW1vdGUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVtb3RlcyA9IGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5nZXRSZW1vdGVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lTW9kYWwgPSBuZXcgR2VuZXJhbE1vZGFsKHtcbiAgICAgICAgICAgIG9wdGlvbnM6IHJlbW90ZXMsXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjpcbiAgICAgICAgICAgICAgICBcIlNlbGVjdCBvciBjcmVhdGUgYSBuZXcgcmVtb3RlIGJ5IHR5cGluZyBpdHMgbmFtZSBhbmQgc2VsZWN0aW5nIGl0XCIsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZW1vdGVOYW1lID0gc2VsZWN0ZWRSZW1vdGUgPz8gKGF3YWl0IG5hbWVNb2RhbC5vcGVuKCkpO1xuXG4gICAgICAgIGlmIChyZW1vdGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKFwiRmV0Y2hpbmcgcmVtb3RlIGJyYW5jaGVzXCIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5naXRNYW5hZ2VyLmZldGNoKHJlbW90ZU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgYnJhbmNoZXMgPVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0TWFuYWdlci5nZXRSZW1vdGVCcmFuY2hlcyhyZW1vdGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGJyYW5jaE1vZGFsID0gbmV3IEdlbmVyYWxNb2RhbCh7XG4gICAgICAgICAgICAgICAgb3B0aW9uczogYnJhbmNoZXMsXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6XG4gICAgICAgICAgICAgICAgICAgIFwiU2VsZWN0IG9yIGNyZWF0ZSBhIG5ldyByZW1vdGUgYnJhbmNoIGJ5IHR5cGluZyBpdHMgbmFtZSBhbmQgc2VsZWN0aW5nIGl0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBicmFuY2hNb2RhbC5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyByZW1vdmVSZW1vdGUoKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaXNBbGxJbml0aWFsaXplZCgpKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCB0aGlzLmdpdE1hbmFnZXIuZ2V0UmVtb3RlcygpO1xuXG4gICAgICAgIGNvbnN0IG5hbWVNb2RhbCA9IG5ldyBHZW5lcmFsTW9kYWwoe1xuICAgICAgICAgICAgb3B0aW9uczogcmVtb3RlcyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIlNlbGVjdCBhIHJlbW90ZVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVtb3RlTmFtZSA9IGF3YWl0IG5hbWVNb2RhbC5vcGVuKCk7XG5cbiAgICAgICAgaWYgKHJlbW90ZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2l0TWFuYWdlci5yZW1vdmVSZW1vdGUocmVtb3RlTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZUFuZE9wZW5GaWxlKHRleHQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZSh0aGlzLmNvbmZsaWN0T3V0cHV0RmlsZSwgdGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVJc0FscmVhZHlPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBsZWFmLmdldERpc3BsYXlUZXh0KCkgIT0gXCJcIiAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmxpY3RPdXRwdXRGaWxlLnN0YXJ0c1dpdGgobGVhZi5nZXREaXNwbGF5VGV4dCgpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZmlsZUlzQWxyZWFkeU9wZW5lZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZpbGVJc0FscmVhZHlPcGVuZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQodGhpcy5jb25mbGljdE91dHB1dEZpbGUsIFwiL1wiLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVZpZXdBY3RpdmVTdGF0ZShsZWFmOiBXb3Jrc3BhY2VMZWFmIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICAvLyBQcmV2ZW50IHJlbW92aW5nIGZvY3VzIHdoZW4gc3dpdGNoaW5nIHRvIG90aGVyIHBhbmVzIHRoYW4gZmlsZSBwYW5lcyBsaWtlIHNlYXJjaCBvciBHaXRWaWV3XG4gICAgICAgIGlmICghbGVhZj8udmlldy5nZXRTdGF0ZSgpLmZpbGUpIHJldHVybjtcblxuICAgICAgICBjb25zdCBzb3VyY2VDb250cm9sTGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZVxuICAgICAgICAgICAgLmdldExlYXZlc09mVHlwZShTT1VSQ0VfQ09OVFJPTF9WSUVXX0NPTkZJRy50eXBlKVxuICAgICAgICAgICAgLmZpcnN0KCk7XG4gICAgICAgIGNvbnN0IGhpc3RvcnlMZWFmID0gdGhpcy5hcHAud29ya3NwYWNlXG4gICAgICAgICAgICAuZ2V0TGVhdmVzT2ZUeXBlKEhJU1RPUllfVklFV19DT05GSUcudHlwZSlcbiAgICAgICAgICAgIC5maXJzdCgpO1xuXG4gICAgICAgIC8vIENsZWFyIGV4aXN0aW5nIGFjdGl2ZSBzdGF0ZVxuICAgICAgICBzb3VyY2VDb250cm9sTGVhZj8udmlldy5jb250YWluZXJFbFxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoYGRpdi5uYXYtZmlsZS10aXRsZS5pcy1hY3RpdmVgKVxuICAgICAgICAgICAgPy5yZW1vdmVDbGFzcyhcImlzLWFjdGl2ZVwiKTtcbiAgICAgICAgaGlzdG9yeUxlYWY/LnZpZXcuY29udGFpbmVyRWxcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKGBkaXYubmF2LWZpbGUtdGl0bGUuaXMtYWN0aXZlYClcbiAgICAgICAgICAgID8ucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmVcIik7XG5cbiAgICAgICAgaWYgKGxlYWY/LnZpZXcgaW5zdGFuY2VvZiBEaWZmVmlldykge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGxlYWYudmlldy5zdGF0ZS5maWxlO1xuICAgICAgICAgICAgdGhpcy5sYXN0RGlmZlZpZXdTdGF0ZSA9IGxlYWYudmlldy5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgbGV0IGVsOiBFbGVtZW50IHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDb250cm9sTGVhZiAmJiBsZWFmLnZpZXcuc3RhdGUuc3RhZ2VkKSB7XG4gICAgICAgICAgICAgICAgZWwgPSBzb3VyY2VDb250cm9sTGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICAgIGBkaXYuc3RhZ2VkIGRpdi5uYXYtZmlsZS10aXRsZVtkYXRhLXBhdGg9JyR7cGF0aH0nXWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzb3VyY2VDb250cm9sTGVhZiAmJlxuICAgICAgICAgICAgICAgIGxlYWYudmlldy5zdGF0ZS5zdGFnZWQgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgIWxlYWYudmlldy5zdGF0ZS5oYXNoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBlbCA9IHNvdXJjZUNvbnRyb2xMZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAgICAgYGRpdi5jaGFuZ2VzIGRpdi5uYXYtZmlsZS10aXRsZVtkYXRhLXBhdGg9JyR7cGF0aH0nXWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoaXN0b3J5TGVhZiAmJiBsZWFmLnZpZXcuc3RhdGUuaGFzaCkge1xuICAgICAgICAgICAgICAgIGVsID0gaGlzdG9yeUxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICAgICBgZGl2Lm5hdi1maWxlLXRpdGxlW2RhdGEtcGF0aD0nJHtwYXRofSddYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbD8uYWRkQ2xhc3MoXCJpcy1hY3RpdmVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhc3REaWZmVmlld1N0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVnaW9uOiBkaXNwbGF5aW5nIC8gZm9ybWF0dGluZyBtZXNzYWdlc1xuICAgIGRpc3BsYXlNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gNCAqIDEwMDApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXI/LmRpc3BsYXlNZXNzYWdlKG1lc3NhZ2UudG9Mb3dlckNhc2UoKSwgdGltZW91dCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmRpc2FibGVQb3B1cHMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5zZXR0aW5ncy5kaXNhYmxlUG9wdXBzRm9yTm9DaGFuZ2VzIHx8XG4gICAgICAgICAgICAgICAgIW1lc3NhZ2Uuc3RhcnRzV2l0aChcIk5vIGNoYW5nZXNcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UobWVzc2FnZSwgNSAqIDEwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcGxheUVycm9yKG1lc3NhZ2U6IGFueSwgdGltZW91dDogbnVtYmVyID0gMTAgKiAxMDAwKTogdm9pZCB7XG4gICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3JzLlVzZXJDYW5jZWxlZEVycm9yKSB7XG4gICAgICAgICAgICBuZXcgTm90aWNlKFwiQWJvcnRlZFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb21lIGVycm9ycyBtaWdodCBub3QgYmUgb2YgdHlwZSBzdHJpbmdcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UudG9TdHJpbmcoKTtcbiAgICAgICAgbmV3IE5vdGljZShtZXNzYWdlLCB0aW1lb3V0KTtcbiAgICAgICAgY29uc29sZS5sb2coYGdpdCBvYnNpZGlhbiBlcnJvcjogJHttZXNzYWdlfWApO1xuICAgICAgICB0aGlzLnN0YXR1c0Jhcj8uZGlzcGxheU1lc3NhZ2UobWVzc2FnZS50b0xvd2VyQ2FzZSgpLCB0aW1lb3V0KTtcbiAgICB9XG5cbiAgICBsb2cobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3RoaXMubWFuaWZlc3QuaWR9OiBgICsgbWVzc2FnZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCBBc3luY0xvY2sgZnJvbSAnYXN5bmMtbG9jayc7XG5pbXBvcnQgSGFzaCBmcm9tICdzaGEuanMvc2hhMS5qcyc7XG5pbXBvcnQgY3JjMzIgZnJvbSAnY3JjLTMyJztcbmltcG9ydCBwYWtvIGZyb20gJ3Bha28nO1xuaW1wb3J0IHBpZnkgZnJvbSAncGlmeSc7XG5pbXBvcnQgaWdub3JlIGZyb20gJ2lnbm9yZSc7XG5pbXBvcnQgY2xlYW5HaXRSZWYgZnJvbSAnY2xlYW4tZ2l0LXJlZic7XG5pbXBvcnQgZGlmZjNNZXJnZSBmcm9tICdkaWZmMyc7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2l0UHJvZ3Jlc3NFdmVudFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBoYXNlXG4gKiBAcHJvcGVydHkge251bWJlcn0gbG9hZGVkXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG90YWxcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBQcm9ncmVzc0NhbGxiYWNrXG4gKiBAcGFyYW0ge0dpdFByb2dyZXNzRXZlbnR9IHByb2dyZXNzXG4gKiBAcmV0dXJucyB7dm9pZCB8IFByb21pc2U8dm9pZD59XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHaXRIdHRwUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgdG8gcmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttZXRob2Q9J0dFVCddIC0gVGhlIEhUVFAgbWV0aG9kIHRvIHVzZVxuICogQHByb3BlcnR5IHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBbaGVhZGVycz17fV0gLSBIZWFkZXJzIHRvIGluY2x1ZGUgaW4gdGhlIEhUVFAgcmVxdWVzdFxuICogQHByb3BlcnR5IHtPYmplY3R9IFthZ2VudF0gLSBBbiBIVFRQIG9yIEhUVFBTIGFnZW50IHRoYXQgbWFuYWdlcyBjb25uZWN0aW9ucyBmb3IgdGhlIEhUVFAgY2xpZW50IChOb2RlLmpzIG9ubHkpXG4gKiBAcHJvcGVydHkge0FzeW5jSXRlcmFibGVJdGVyYXRvcjxVaW50OEFycmF5Pn0gW2JvZHldIC0gQW4gYXN5bmMgaXRlcmF0b3Igb2YgVWludDhBcnJheXMgdGhhdCBtYWtlIHVwIHRoZSBib2R5IG9mIFBPU1QgcmVxdWVzdHNcbiAqIEBwcm9wZXJ0eSB7UHJvZ3Jlc3NDYWxsYmFja30gW29uUHJvZ3Jlc3NdIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKGVtaXR0aW5nIGBHaXRQcm9ncmVzc0V2ZW50YHMpXG4gKiBAcHJvcGVydHkge29iamVjdH0gW3NpZ25hbF0gLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAoY2FuY2VsaW5nIGEgcmVxdWVzdClcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdpdEh0dHBSZXNwb25zZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCAtIFRoZSBmaW5hbCBVUkwgdGhhdCB3YXMgZmV0Y2hlZCBhZnRlciBhbnkgcmVkaXJlY3RzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21ldGhvZF0gLSBUaGUgSFRUUCBtZXRob2QgdGhhdCB3YXMgdXNlZFxuICogQHByb3BlcnR5IHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBbaGVhZGVyc10gLSBIVFRQIHJlc3BvbnNlIGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7QXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFVpbnQ4QXJyYXk+fSBbYm9keV0gLSBBbiBhc3luYyBpdGVyYXRvciBvZiBVaW50OEFycmF5cyB0aGF0IG1ha2UgdXAgdGhlIGJvZHkgb2YgdGhlIHJlc3BvbnNlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3RhdHVzQ29kZSAtIFRoZSBIVFRQIHN0YXR1cyBjb2RlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RhdHVzTWVzc2FnZSAtIFRoZSBIVFRQIHN0YXR1cyBtZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHR0cEZldGNoXG4gKiBAcGFyYW0ge0dpdEh0dHBSZXF1ZXN0fSByZXF1ZXN0XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxHaXRIdHRwUmVzcG9uc2U+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHR0cENsaWVudFxuICogQHByb3BlcnR5IHtIdHRwRmV0Y2h9IHJlcXVlc3RcbiAqL1xuXG4vKipcbiAqIEEgZ2l0IGNvbW1pdCBvYmplY3QuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQ29tbWl0T2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZSBDb21taXQgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyZWUgU0hBLTEgb2JqZWN0IGlkIG9mIGNvcnJlc3BvbmRpbmcgZmlsZSB0cmVlXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBwYXJlbnQgYW4gYXJyYXkgb2YgemVybyBvciBtb3JlIFNIQS0xIG9iamVjdCBpZHNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBhdXRob3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdXRob3IubmFtZSBUaGUgYXV0aG9yJ3MgbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhvci5lbWFpbCBUaGUgYXV0aG9yJ3MgZW1haWxcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhdXRob3IudGltZXN0YW1wIFVUQyBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzXG4gKiBAcHJvcGVydHkge251bWJlcn0gYXV0aG9yLnRpbWV6b25lT2Zmc2V0IFRpbWV6b25lIGRpZmZlcmVuY2UgZnJvbSBVVEMgaW4gbWludXRlc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGNvbW1pdHRlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbW1pdHRlci5uYW1lIFRoZSBjb21taXR0ZXIncyBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29tbWl0dGVyLmVtYWlsIFRoZSBjb21taXR0ZXIncyBlbWFpbFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvbW1pdHRlci50aW1lc3RhbXAgVVRDIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb21taXR0ZXIudGltZXpvbmVPZmZzZXQgVGltZXpvbmUgZGlmZmVyZW5jZSBmcm9tIFVUQyBpbiBtaW51dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2dwZ3NpZ10gUEdQIHNpZ25hdHVyZSAoaWYgcHJlc2VudClcbiAqL1xuXG4vKipcbiAqIEFuIGVudHJ5IGZyb20gYSBnaXQgdHJlZSBvYmplY3QuIEZpbGVzIGFyZSBjYWxsZWQgJ2Jsb2JzJyBhbmQgZGlyZWN0b3JpZXMgYXJlIGNhbGxlZCAndHJlZXMnLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRyZWVFbnRyeVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGUgdGhlIDYgZGlnaXQgaGV4YWRlY2ltYWwgbW9kZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2lkIHRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlIGJsb2Igb3IgdHJlZVxuICogQHByb3BlcnR5IHsnY29tbWl0J3wnYmxvYid8J3RyZWUnfSB0eXBlIHRoZSB0eXBlIG9mIG9iamVjdFxuICovXG5cbi8qKlxuICogQSBnaXQgdHJlZSBvYmplY3QuIFRyZWVzIHJlcHJlc2VudCBhIGRpcmVjdG9yeSBzbmFwc2hvdC5cbiAqXG4gKiBAdHlwZWRlZiB7VHJlZUVudHJ5W119IFRyZWVPYmplY3RcbiAqL1xuXG4vKipcbiAqIEEgZ2l0IGFubm90YXRlZCB0YWcgb2JqZWN0LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRhZ09iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9iamVjdCBTSEEtMSBvYmplY3QgaWQgb2Ygb2JqZWN0IGJlaW5nIHRhZ2dlZFxuICogQHByb3BlcnR5IHsnYmxvYicgfCAndHJlZScgfCAnY29tbWl0JyB8ICd0YWcnfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgdGFnZ2VkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFnIHRoZSB0YWcgbmFtZVxuICogQHByb3BlcnR5IHtPYmplY3R9IHRhZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhZ2dlci5uYW1lIHRoZSB0YWdnZXIncyBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFnZ2VyLmVtYWlsIHRoZSB0YWdnZXIncyBlbWFpbFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRhZ2dlci50aW1lc3RhbXAgVVRDIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0YWdnZXIudGltZXpvbmVPZmZzZXQgdGltZXpvbmUgZGlmZmVyZW5jZSBmcm9tIFVUQyBpbiBtaW51dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZSB0YWcgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtncGdzaWddIFBHUCBzaWduYXR1cmUgKGlmIHByZXNlbnQpXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZWFkQ29tbWl0UmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2lkIC0gU0hBLTEgb2JqZWN0IGlkIG9mIHRoaXMgY29tbWl0XG4gKiBAcHJvcGVydHkge0NvbW1pdE9iamVjdH0gY29tbWl0IC0gdGhlIHBhcnNlZCBjb21taXQgb2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF5bG9hZCAtIFBHUCBzaWduaW5nIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlcnZlclJlZiAtIFRoaXMgb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIHNjaGVtYTpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWYgLSBUaGUgbmFtZSBvZiB0aGUgcmVmXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2lkIC0gVGhlIFNIQS0xIG9iamVjdCBpZCB0aGUgcmVmIHBvaW50cyB0b1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdIC0gVGhlIHRhcmdldCByZWYgcG9pbnRlZCB0byBieSBhIHN5bWJvbGljIHJlZlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwZWVsZWRdIC0gSWYgdGhlIG9pZCBpcyB0aGUgU0hBLTEgb2JqZWN0IGlkIG9mIGFuIGFubm90YXRlZCB0YWcsIHRoaXMgaXMgdGhlIFNIQS0xIG9iamVjdCBpZCB0aGF0IHRoZSBhbm5vdGF0ZWQgdGFnIHBvaW50cyB0b1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgV2Fsa2VyXG4gKiBAcHJvcGVydHkge1N5bWJvbH0gU3ltYm9sKCdHaXRXYWxrZXJTeW1ib2wnKVxuICovXG5cbi8qKlxuICogTm9ybWFsaXplZCBzdWJzZXQgb2YgZmlsZXN5c3RlbSBgc3RhdGAgZGF0YTpcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGF0XG4gKiBAcHJvcGVydHkge251bWJlcn0gY3RpbWVTZWNvbmRzXG4gKiBAcHJvcGVydHkge251bWJlcn0gY3RpbWVOYW5vc2Vjb25kc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG10aW1lU2Vjb25kc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG10aW1lTmFub3NlY29uZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkZXZcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbm9cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtb2RlXG4gKiBAcHJvcGVydHkge251bWJlcn0gdWlkXG4gKiBAcHJvcGVydHkge251bWJlcn0gZ2lkXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2l6ZVxuICovXG5cbi8qKlxuICogVGhlIGBXYWxrZXJFbnRyeWAgaXMgYW4gaW50ZXJmYWNlIHRoYXQgYWJzdHJhY3RzIGNvbXB1dGluZyBtYW55IGNvbW1vbiB0cmVlIC8gYmxvYiBzdGF0cy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXYWxrZXJFbnRyeVxuICogQHByb3BlcnR5IHtmdW5jdGlvbigpOiBQcm9taXNlPCd0cmVlJ3wnYmxvYid8J3NwZWNpYWwnfCdjb21taXQnPn0gdHlwZVxuICogQHByb3BlcnR5IHtmdW5jdGlvbigpOiBQcm9taXNlPG51bWJlcj59IG1vZGVcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oKTogUHJvbWlzZTxzdHJpbmc+fSBvaWRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oKTogUHJvbWlzZTxVaW50OEFycmF5fHZvaWQ+fSBjb250ZW50XG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKCk6IFByb21pc2U8U3RhdD59IHN0YXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENhbGxiYWNrRnNDbGllbnRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHJlYWRGaWxlIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX2ZzX3JlYWRmaWxlX3BhdGhfb3B0aW9uc19jYWxsYmFja1xuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gd3JpdGVGaWxlIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX2ZzX3dyaXRlZmlsZV9maWxlX2RhdGFfb3B0aW9uc19jYWxsYmFja1xuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gdW5saW5rIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX2ZzX3VubGlua19wYXRoX2NhbGxiYWNrXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByZWFkZGlyIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX2ZzX3JlYWRkaXJfcGF0aF9vcHRpb25zX2NhbGxiYWNrXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBta2RpciAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZnMuaHRtbCNmc19mc19ta2Rpcl9wYXRoX21vZGVfY2FsbGJhY2tcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHJtZGlyIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX2ZzX3JtZGlyX3BhdGhfY2FsbGJhY2tcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHN0YXQgLSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfZnNfc3RhdF9wYXRoX29wdGlvbnNfY2FsbGJhY2tcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGxzdGF0IC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX2ZzX2xzdGF0X3BhdGhfb3B0aW9uc19jYWxsYmFja1xuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gW3JlYWRsaW5rXSAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZnMuaHRtbCNmc19mc19yZWFkbGlua19wYXRoX29wdGlvbnNfY2FsbGJhY2tcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IFtzeW1saW5rXSAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZnMuaHRtbCNmc19mc19zeW1saW5rX3RhcmdldF9wYXRoX3R5cGVfY2FsbGJhY2tcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IFtjaG1vZF0gLSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfZnNfY2htb2RfcGF0aF9tb2RlX2NhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm9taXNlRnNDbGllbnRcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9taXNlc1xuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gcHJvbWlzZXMucmVhZEZpbGUgLSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfZnNwcm9taXNlc19yZWFkZmlsZV9wYXRoX29wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHByb21pc2VzLndyaXRlRmlsZSAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZnMuaHRtbCNmc19mc3Byb21pc2VzX3dyaXRlZmlsZV9maWxlX2RhdGFfb3B0aW9uc1xuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gcHJvbWlzZXMudW5saW5rIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX2ZzcHJvbWlzZXNfdW5saW5rX3BhdGhcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHByb21pc2VzLnJlYWRkaXIgLSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfZnNwcm9taXNlc19yZWFkZGlyX3BhdGhfb3B0aW9uc1xuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gcHJvbWlzZXMubWtkaXIgLSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfZnNwcm9taXNlc19ta2Rpcl9wYXRoX29wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHByb21pc2VzLnJtZGlyIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX2ZzcHJvbWlzZXNfcm1kaXJfcGF0aFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gcHJvbWlzZXMuc3RhdCAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZnMuaHRtbCNmc19mc3Byb21pc2VzX3N0YXRfcGF0aF9vcHRpb25zXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBwcm9taXNlcy5sc3RhdCAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZnMuaHRtbCNmc19mc3Byb21pc2VzX2xzdGF0X3BhdGhfb3B0aW9uc1xuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gW3Byb21pc2VzLnJlYWRsaW5rXSAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZnMuaHRtbCNmc19mc3Byb21pc2VzX3JlYWRsaW5rX3BhdGhfb3B0aW9uc1xuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gW3Byb21pc2VzLnN5bWxpbmtdIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX2ZzcHJvbWlzZXNfc3ltbGlua190YXJnZXRfcGF0aF90eXBlXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBbcHJvbWlzZXMuY2htb2RdIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX2ZzcHJvbWlzZXNfY2htb2RfcGF0aF9tb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7Q2FsbGJhY2tGc0NsaWVudCB8IFByb21pc2VGc0NsaWVudH0gRnNDbGllbnRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNZXNzYWdlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7dm9pZCB8IFByb21pc2U8dm9pZD59XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHaXRBdXRoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VzZXJuYW1lXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXNzd29yZF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxdIFRlbGxzIGdpdCB0byB0aHJvdyBhIGBVc2VyQ2FuY2VsZWRFcnJvcmAgKGluc3RlYWQgb2YgYW4gYEh0dHBFcnJvcmApLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEF1dGhDYWxsYmFja1xuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICogQHBhcmFtIHtHaXRBdXRofSBhdXRoIE1pZ2h0IGhhdmUgc29tZSB2YWx1ZXMgaWYgdGhlIFVSTCBpdHNlbGYgb3JpZ2luYWxseSBjb250YWluZWQgYSB1c2VybmFtZSBvciBwYXNzd29yZC5cbiAqIEByZXR1cm5zIHtHaXRBdXRoIHwgdm9pZCB8IFByb21pc2U8R2l0QXV0aCB8IHZvaWQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEF1dGhGYWlsdXJlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7R2l0QXV0aH0gYXV0aCBUaGUgY3JlZGVudGlhbHMgdGhhdCBmYWlsZWRcbiAqIEByZXR1cm5zIHtHaXRBdXRoIHwgdm9pZCB8IFByb21pc2U8R2l0QXV0aCB8IHZvaWQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEF1dGhTdWNjZXNzQ2FsbGJhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7R2l0QXV0aH0gYXV0aFxuICogQHJldHVybnMge3ZvaWQgfCBQcm9taXNlPHZvaWQ+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2lnblBhcmFtc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHBheWxvYWQgLSBhIHBsYWludGV4dCBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VjcmV0S2V5IC0gYW4gJ0FTQ0lJIGFybW9yJyBlbmNvZGVkIFBHUCBrZXkgKHRlY2huaWNhbGx5IGNhbiBhY3R1YWxseSBjb250YWluIF9tdWx0aXBsZV8ga2V5cylcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaWduQ2FsbGJhY2tcbiAqIEBwYXJhbSB7U2lnblBhcmFtc30gYXJnc1xuICogQHJldHVybiB7e3NpZ25hdHVyZTogc3RyaW5nfSB8IFByb21pc2U8e3NpZ25hdHVyZTogc3RyaW5nfT59IC0gYW4gJ0FTQ0lJIGFybW9yJyBlbmNvZGVkIFwiZGV0YWNoZWRcIiBzaWduYXR1cmVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1lcmdlRHJpdmVyUGFyYW1zXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGJyYW5jaGVzXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGNvbnRlbnRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1lcmdlRHJpdmVyQ2FsbGJhY2tcbiAqIEBwYXJhbSB7TWVyZ2VEcml2ZXJQYXJhbXN9IGFyZ3NcbiAqIEByZXR1cm4ge3tjbGVhbk1lcmdlOiBib29sZWFuLCBtZXJnZWRUZXh0OiBzdHJpbmd9IHwgUHJvbWlzZTx7Y2xlYW5NZXJnZTogYm9vbGVhbiwgbWVyZ2VkVGV4dDogc3RyaW5nfT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgV2Fsa2VyTWFwXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAqIEBwYXJhbSB7V2Fsa2VyRW50cnlbXX0gZW50cmllc1xuICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBXYWxrZXJSZWR1Y2VcbiAqIEBwYXJhbSB7YW55fSBwYXJlbnRcbiAqIEBwYXJhbSB7YW55W119IGNoaWxkcmVuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFdhbGtlckl0ZXJhdGVDYWxsYmFja1xuICogQHBhcmFtIHtXYWxrZXJFbnRyeVtdfSBlbnRyaWVzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgV2Fsa2VySXRlcmF0ZVxuICogQHBhcmFtIHtXYWxrZXJJdGVyYXRlQ2FsbGJhY2t9IHdhbGtcbiAqIEBwYXJhbSB7SXRlcmFibGVJdGVyYXRvcjxXYWxrZXJFbnRyeVtdPn0gY2hpbGRyZW5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGFueVtdPn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlZlVwZGF0ZVN0YXR1c1xuICogQHByb3BlcnR5IHtib29sZWFufSBva1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdXNoUmVzdWx0XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9rXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVycm9yXG4gKiBAcHJvcGVydHkge09iamVjdDxzdHJpbmcsIFJlZlVwZGF0ZVN0YXR1cz59IHJlZnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gW2hlYWRlcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7MHwxfSBIZWFkU3RhdHVzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7MHwxfDJ9IFdvcmtkaXJTdGF0dXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHswfDF8MnwzfSBTdGFnZVN0YXR1c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tzdHJpbmcsIEhlYWRTdGF0dXMsIFdvcmtkaXJTdGF0dXMsIFN0YWdlU3RhdHVzXX0gU3RhdHVzUm93XG4gKi9cblxuY2xhc3MgQmFzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgLy8gU2V0dGluZyB0aGlzIGhlcmUgYWxsb3dzIFRTIHRvIGluZmVyIHRoYXQgYWxsIGdpdCBlcnJvcnMgaGF2ZSBhIGBjYWxsZXJgIHByb3BlcnR5IGFuZFxuICAgIC8vIHRoYXQgaXRzIHR5cGUgaXMgc3RyaW5nLlxuICAgIHRoaXMuY2FsbGVyID0gJyc7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgLy8gRXJyb3Igb2JqZWN0cyBhcmVuJ3Qgbm9ybWFsbHkgc2VyaWFsaXphYmxlLiBTbyB3ZSBkbyBzb21ldGhpbmcgYWJvdXQgdGhhdC5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgY2FsbGVyOiB0aGlzLmNhbGxlcixcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgIH1cbiAgfVxuXG4gIGZyb21KU09OKGpzb24pIHtcbiAgICBjb25zdCBlID0gbmV3IEJhc2VFcnJvcihqc29uLm1lc3NhZ2UpO1xuICAgIGUuY29kZSA9IGpzb24uY29kZTtcbiAgICBlLmRhdGEgPSBqc29uLmRhdGE7XG4gICAgZS5jYWxsZXIgPSBqc29uLmNhbGxlcjtcbiAgICBlLnN0YWNrID0ganNvbi5zdGFjaztcbiAgICByZXR1cm4gZVxuICB9XG5cbiAgZ2V0IGlzSXNvbW9ycGhpY0dpdEVycm9yKCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuY2xhc3MgVW5tZXJnZWRQYXRoc0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmlsZXBhdGhzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmaWxlcGF0aHMpIHtcbiAgICBzdXBlcihcbiAgICAgIGBNb2RpZnlpbmcgdGhlIGluZGV4IGlzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIHlvdSBoYXZlIHVubWVyZ2VkIGZpbGVzOiAke2ZpbGVwYXRocy50b1N0cmluZ30uIEZpeCB0aGVtIHVwIGluIHRoZSB3b3JrIHRyZWUsIGFuZCB0aGVuIHVzZSAnZ2l0IGFkZC9ybSBhcyBhcHByb3ByaWF0ZSB0byBtYXJrIHJlc29sdXRpb24gYW5kIG1ha2UgYSBjb21taXQuYFxuICAgICk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5uYW1lID0gVW5tZXJnZWRQYXRoc0Vycm9yLmNvZGU7XG4gICAgdGhpcy5kYXRhID0geyBmaWxlcGF0aHMgfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnVW5tZXJnZWRQYXRoc0Vycm9yJ30gKi9cblVubWVyZ2VkUGF0aHNFcnJvci5jb2RlID0gJ1VubWVyZ2VkUGF0aHNFcnJvcic7XG5cbmNsYXNzIEludGVybmFsRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihcbiAgICAgIGBBbiBpbnRlcm5hbCBlcnJvciBjYXVzZWQgdGhpcyBjb21tYW5kIHRvIGZhaWwuIFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCBhdCBodHRwczovL2dpdGh1Yi5jb20vaXNvbW9ycGhpYy1naXQvaXNvbW9ycGhpYy1naXQvaXNzdWVzIHdpdGggdGhpcyBlcnJvciBtZXNzYWdlOiAke21lc3NhZ2V9YFxuICAgICk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5uYW1lID0gSW50ZXJuYWxFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgbWVzc2FnZSB9O1xuICB9XG59XG4vKiogQHR5cGUgeydJbnRlcm5hbEVycm9yJ30gKi9cbkludGVybmFsRXJyb3IuY29kZSA9ICdJbnRlcm5hbEVycm9yJztcblxuY2xhc3MgVW5zYWZlRmlsZXBhdGhFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZXBhdGhcbiAgICovXG4gIGNvbnN0cnVjdG9yKGZpbGVwYXRoKSB7XG4gICAgc3VwZXIoYFRoZSBmaWxlcGF0aCBcIiR7ZmlsZXBhdGh9XCIgY29udGFpbnMgdW5zYWZlIGNoYXJhY3RlciBzZXF1ZW5jZXNgKTtcbiAgICB0aGlzLmNvZGUgPSB0aGlzLm5hbWUgPSBVbnNhZmVGaWxlcGF0aEVycm9yLmNvZGU7XG4gICAgdGhpcy5kYXRhID0geyBmaWxlcGF0aCB9O1xuICB9XG59XG4vKiogQHR5cGUgeydVbnNhZmVGaWxlcGF0aEVycm9yJ30gKi9cblVuc2FmZUZpbGVwYXRoRXJyb3IuY29kZSA9ICdVbnNhZmVGaWxlcGF0aEVycm9yJztcblxuLy8gTW9kZWxlZCBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vdGpmb250YWluZS9ub2RlLWJ1ZmZlcmN1cnNvclxuLy8gYnV0IHdpdGggdGhlIGdvYWwgb2YgYmVpbmcgbXVjaCBsaWdodGVyIHdlaWdodC5cbmNsYXNzIEJ1ZmZlckN1cnNvciB7XG4gIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgIHRoaXMuX3N0YXJ0ID0gMDtcbiAgfVxuXG4gIGVvZigpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnQgPj0gdGhpcy5idWZmZXIubGVuZ3RoXG4gIH1cblxuICB0ZWxsKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFydFxuICB9XG5cbiAgc2VlayhuKSB7XG4gICAgdGhpcy5fc3RhcnQgPSBuO1xuICB9XG5cbiAgc2xpY2Uobikge1xuICAgIGNvbnN0IHIgPSB0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLl9zdGFydCwgdGhpcy5fc3RhcnQgKyBuKTtcbiAgICB0aGlzLl9zdGFydCArPSBuO1xuICAgIHJldHVybiByXG4gIH1cblxuICB0b1N0cmluZyhlbmMsIGxlbmd0aCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmJ1ZmZlci50b1N0cmluZyhlbmMsIHRoaXMuX3N0YXJ0LCB0aGlzLl9zdGFydCArIGxlbmd0aCk7XG4gICAgdGhpcy5fc3RhcnQgKz0gbGVuZ3RoO1xuICAgIHJldHVybiByXG4gIH1cblxuICB3cml0ZSh2YWx1ZSwgbGVuZ3RoLCBlbmMpIHtcbiAgICBjb25zdCByID0gdGhpcy5idWZmZXIud3JpdGUodmFsdWUsIHRoaXMuX3N0YXJ0LCBsZW5ndGgsIGVuYyk7XG4gICAgdGhpcy5fc3RhcnQgKz0gbGVuZ3RoO1xuICAgIHJldHVybiByXG4gIH1cblxuICBjb3B5KHNvdXJjZSwgc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IHIgPSBzb3VyY2UuY29weSh0aGlzLmJ1ZmZlciwgdGhpcy5fc3RhcnQsIHN0YXJ0LCBlbmQpO1xuICAgIHRoaXMuX3N0YXJ0ICs9IHI7XG4gICAgcmV0dXJuIHJcbiAgfVxuXG4gIHJlYWRVSW50OCgpIHtcbiAgICBjb25zdCByID0gdGhpcy5idWZmZXIucmVhZFVJbnQ4KHRoaXMuX3N0YXJ0KTtcbiAgICB0aGlzLl9zdGFydCArPSAxO1xuICAgIHJldHVybiByXG4gIH1cblxuICB3cml0ZVVJbnQ4KHZhbHVlKSB7XG4gICAgY29uc3QgciA9IHRoaXMuYnVmZmVyLndyaXRlVUludDgodmFsdWUsIHRoaXMuX3N0YXJ0KTtcbiAgICB0aGlzLl9zdGFydCArPSAxO1xuICAgIHJldHVybiByXG4gIH1cblxuICByZWFkVUludDE2QkUoKSB7XG4gICAgY29uc3QgciA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MTZCRSh0aGlzLl9zdGFydCk7XG4gICAgdGhpcy5fc3RhcnQgKz0gMjtcbiAgICByZXR1cm4gclxuICB9XG5cbiAgd3JpdGVVSW50MTZCRSh2YWx1ZSkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmJ1ZmZlci53cml0ZVVJbnQxNkJFKHZhbHVlLCB0aGlzLl9zdGFydCk7XG4gICAgdGhpcy5fc3RhcnQgKz0gMjtcbiAgICByZXR1cm4gclxuICB9XG5cbiAgcmVhZFVJbnQzMkJFKCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyQkUodGhpcy5fc3RhcnQpO1xuICAgIHRoaXMuX3N0YXJ0ICs9IDQ7XG4gICAgcmV0dXJuIHJcbiAgfVxuXG4gIHdyaXRlVUludDMyQkUodmFsdWUpIHtcbiAgICBjb25zdCByID0gdGhpcy5idWZmZXIud3JpdGVVSW50MzJCRSh2YWx1ZSwgdGhpcy5fc3RhcnQpO1xuICAgIHRoaXMuX3N0YXJ0ICs9IDQ7XG4gICAgcmV0dXJuIHJcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlU3RyaW5ncyhhLCBiKSB7XG4gIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80MDM1NTEwNy8yMTY4NDE2XG4gIHJldHVybiAtKGEgPCBiKSB8fCArKGEgPiBiKVxufVxuXG5mdW5jdGlvbiBjb21wYXJlUGF0aChhLCBiKSB7XG4gIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80MDM1NTEwNy8yMTY4NDE2XG4gIHJldHVybiBjb21wYXJlU3RyaW5ncyhhLnBhdGgsIGIucGF0aClcbn1cblxuLyoqXG4gKiBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9naXQvZ2l0L2Jsb2IvbWFzdGVyL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2luZGV4LWZvcm1hdC50eHRcbiAqXG4gKiAzMi1iaXQgbW9kZSwgc3BsaXQgaW50byAoaGlnaCB0byBsb3cgYml0cylcbiAqXG4gKiAgNC1iaXQgb2JqZWN0IHR5cGVcbiAqICAgIHZhbGlkIHZhbHVlcyBpbiBiaW5hcnkgYXJlIDEwMDAgKHJlZ3VsYXIgZmlsZSksIDEwMTAgKHN5bWJvbGljIGxpbmspXG4gKiAgICBhbmQgMTExMCAoZ2l0bGluaylcbiAqXG4gKiAgMy1iaXQgdW51c2VkXG4gKlxuICogIDktYml0IHVuaXggcGVybWlzc2lvbi4gT25seSAwNzU1IGFuZCAwNjQ0IGFyZSB2YWxpZCBmb3IgcmVndWxhciBmaWxlcy5cbiAqICBTeW1ib2xpYyBsaW5rcyBhbmQgZ2l0bGlua3MgaGF2ZSB2YWx1ZSAwIGluIHRoaXMgZmllbGQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1vZGUobW9kZSkge1xuICAvLyBOb3RlOiBCcm93c2VyRlMgd2lsbCB1c2UgLTEgZm9yIFwidW5rbm93blwiXG4gIC8vIEkgbmVlZCB0byBtYWtlIGl0IG5vbi1uZWdhdGl2ZSBmb3IgdGhlc2UgYml0c2hpZnRzIHRvIHdvcmsuXG4gIGxldCB0eXBlID0gbW9kZSA+IDAgPyBtb2RlID4+IDEyIDogMDtcbiAgLy8gSWYgaXQgaXNuJ3QgdmFsaWQsIGFzc3VtZSBpdCBhcyBhIFwicmVndWxhciBmaWxlXCJcbiAgLy8gMDEwMCA9IGRpcmVjdG9yeVxuICAvLyAxMDAwID0gcmVndWxhciBmaWxlXG4gIC8vIDEwMTAgPSBzeW1saW5rXG4gIC8vIDExMTAgPSBnaXRsaW5rXG4gIGlmIChcbiAgICB0eXBlICE9PSAwYjAxMDAgJiZcbiAgICB0eXBlICE9PSAwYjEwMDAgJiZcbiAgICB0eXBlICE9PSAwYjEwMTAgJiZcbiAgICB0eXBlICE9PSAwYjExMTBcbiAgKSB7XG4gICAgdHlwZSA9IDBiMTAwMDtcbiAgfVxuICBsZXQgcGVybWlzc2lvbnMgPSBtb2RlICYgMG83Nzc7XG4gIC8vIElzIHRoZSBmaWxlIGV4ZWN1dGFibGU/IHRoZW4gNzU1LiBFbHNlIDY0NC5cbiAgaWYgKHBlcm1pc3Npb25zICYgMGIwMDEwMDEwMDEpIHtcbiAgICBwZXJtaXNzaW9ucyA9IDBvNzU1O1xuICB9IGVsc2Uge1xuICAgIHBlcm1pc3Npb25zID0gMG82NDQ7XG4gIH1cbiAgLy8gSWYgaXQncyBub3QgYSByZWd1bGFyIGZpbGUsIHNjcnViIGFsbCBwZXJtaXNzaW9uc1xuICBpZiAodHlwZSAhPT0gMGIxMDAwKSBwZXJtaXNzaW9ucyA9IDA7XG4gIHJldHVybiAodHlwZSA8PCAxMikgKyBwZXJtaXNzaW9uc1xufVxuXG5jb25zdCBNQVhfVUlOVDMyID0gMiAqKiAzMjtcblxuZnVuY3Rpb24gU2Vjb25kc05hbm9zZWNvbmRzKFxuICBnaXZlblNlY29uZHMsXG4gIGdpdmVuTmFub3NlY29uZHMsXG4gIG1pbGxpc2Vjb25kcyxcbiAgZGF0ZVxuKSB7XG4gIGlmIChnaXZlblNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiBnaXZlbk5hbm9zZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gW2dpdmVuU2Vjb25kcywgZ2l2ZW5OYW5vc2Vjb25kc11cbiAgfVxuICBpZiAobWlsbGlzZWNvbmRzID09PSB1bmRlZmluZWQpIHtcbiAgICBtaWxsaXNlY29uZHMgPSBkYXRlLnZhbHVlT2YoKTtcbiAgfVxuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgY29uc3QgbmFub3NlY29uZHMgPSAobWlsbGlzZWNvbmRzIC0gc2Vjb25kcyAqIDEwMDApICogMTAwMDAwMDtcbiAgcmV0dXJuIFtzZWNvbmRzLCBuYW5vc2Vjb25kc11cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RhdHMoZSkge1xuICBjb25zdCBbY3RpbWVTZWNvbmRzLCBjdGltZU5hbm9zZWNvbmRzXSA9IFNlY29uZHNOYW5vc2Vjb25kcyhcbiAgICBlLmN0aW1lU2Vjb25kcyxcbiAgICBlLmN0aW1lTmFub3NlY29uZHMsXG4gICAgZS5jdGltZU1zLFxuICAgIGUuY3RpbWVcbiAgKTtcbiAgY29uc3QgW210aW1lU2Vjb25kcywgbXRpbWVOYW5vc2Vjb25kc10gPSBTZWNvbmRzTmFub3NlY29uZHMoXG4gICAgZS5tdGltZVNlY29uZHMsXG4gICAgZS5tdGltZU5hbm9zZWNvbmRzLFxuICAgIGUubXRpbWVNcyxcbiAgICBlLm10aW1lXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBjdGltZVNlY29uZHM6IGN0aW1lU2Vjb25kcyAlIE1BWF9VSU5UMzIsXG4gICAgY3RpbWVOYW5vc2Vjb25kczogY3RpbWVOYW5vc2Vjb25kcyAlIE1BWF9VSU5UMzIsXG4gICAgbXRpbWVTZWNvbmRzOiBtdGltZVNlY29uZHMgJSBNQVhfVUlOVDMyLFxuICAgIG10aW1lTmFub3NlY29uZHM6IG10aW1lTmFub3NlY29uZHMgJSBNQVhfVUlOVDMyLFxuICAgIGRldjogZS5kZXYgJSBNQVhfVUlOVDMyLFxuICAgIGlubzogZS5pbm8gJSBNQVhfVUlOVDMyLFxuICAgIG1vZGU6IG5vcm1hbGl6ZU1vZGUoZS5tb2RlICUgTUFYX1VJTlQzMiksXG4gICAgdWlkOiBlLnVpZCAlIE1BWF9VSU5UMzIsXG4gICAgZ2lkOiBlLmdpZCAlIE1BWF9VSU5UMzIsXG4gICAgLy8gc2l6ZSBvZiAtMSBoYXBwZW5zIG92ZXIgYSBCcm93c2VyRlMgSFRUUCBCYWNrZW5kIHRoYXQgZG9lc24ndCBzZXJ2ZSBDb250ZW50LUxlbmd0aCBoZWFkZXJzXG4gICAgLy8gKGxpa2UgdGhlIEthcm1hIHdlYnNlcnZlcikgYmVjYXVzZSBCcm93c2VyRlMgSFRUUCBCYWNrZW5kIHVzZXMgSFRUUCBIRUFEIHJlcXVlc3RzIHRvIGRvIGZzLnN0YXRcbiAgICBzaXplOiBlLnNpemUgPiAtMSA/IGUuc2l6ZSAlIE1BWF9VSU5UMzIgOiAwLFxuICB9XG59XG5cbmZ1bmN0aW9uIHRvSGV4KGJ1ZmZlcikge1xuICBsZXQgaGV4ID0gJyc7XG4gIGZvciAoY29uc3QgYnl0ZSBvZiBuZXcgVWludDhBcnJheShidWZmZXIpKSB7XG4gICAgaWYgKGJ5dGUgPCAxNikgaGV4ICs9ICcwJztcbiAgICBoZXggKz0gYnl0ZS50b1N0cmluZygxNik7XG4gIH1cbiAgcmV0dXJuIGhleFxufVxuXG4vKiBlc2xpbnQtZW52IG5vZGUsIGJyb3dzZXIgKi9cblxubGV0IHN1cHBvcnRzU3VidGxlU0hBMSA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIHNoYXN1bShidWZmZXIpIHtcbiAgaWYgKHN1cHBvcnRzU3VidGxlU0hBMSA9PT0gbnVsbCkge1xuICAgIHN1cHBvcnRzU3VidGxlU0hBMSA9IGF3YWl0IHRlc3RTdWJ0bGVTSEExKCk7XG4gIH1cbiAgcmV0dXJuIHN1cHBvcnRzU3VidGxlU0hBMSA/IHN1YnRsZVNIQTEoYnVmZmVyKSA6IHNoYXN1bVN5bmMoYnVmZmVyKVxufVxuXG4vLyBUaGlzIGlzIG1vZGVsZWQgYWZ0ZXIgQGRvbWluaWN0YXJyJ3MgXCJzaGFzdW1cIiBtb2R1bGUsXG4vLyBidXQgd2l0aG91dCB0aGUgJ2pzb24tc3RhYmxlLXN0cmluZ2lmeScgZGVwZW5kZW5jeSBhbmRcbi8vIGV4dHJhIHR5cGUtY2FzdGluZyBmZWF0dXJlcy5cbmZ1bmN0aW9uIHNoYXN1bVN5bmMoYnVmZmVyKSB7XG4gIHJldHVybiBuZXcgSGFzaCgpLnVwZGF0ZShidWZmZXIpLmRpZ2VzdCgnaGV4Jylcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VidGxlU0hBMShidWZmZXIpIHtcbiAgY29uc3QgaGFzaCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMScsIGJ1ZmZlcik7XG4gIHJldHVybiB0b0hleChoYXNoKVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0U3VidGxlU0hBMSgpIHtcbiAgLy8gSSdtIHVzaW5nIGEgcmF0aGVyIGNydWRlIG1ldGhvZCBvZiBwcm9ncmVzc2l2ZSBlbmhhbmNlbWVudCwgYmVjYXVzZVxuICAvLyBzb21lIGJyb3dzZXJzIHRoYXQgaGF2ZSBjcnlwdG8uc3VidGxlLmRpZ2VzdCBkb24ndCBhY3R1YWxseSBpbXBsZW1lbnQgU0hBLTEuXG4gIHRyeSB7XG4gICAgY29uc3QgaGFzaCA9IGF3YWl0IHN1YnRsZVNIQTEobmV3IFVpbnQ4QXJyYXkoW10pKTtcbiAgICBpZiAoaGFzaCA9PT0gJ2RhMzlhM2VlNWU2YjRiMGQzMjU1YmZlZjk1NjAxODkwYWZkODA3MDknKSByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChfKSB7XG4gICAgLy8gbm8gYm90aGVyXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8vIEV4dHJhY3QgMS1iaXQgYXNzdW1lLXZhbGlkLCAxLWJpdCBleHRlbmRlZCBmbGFnLCAyLWJpdCBtZXJnZSBzdGF0ZSBmbGFnLCAxMi1iaXQgcGF0aCBsZW5ndGggZmxhZ1xuZnVuY3Rpb24gcGFyc2VDYWNoZUVudHJ5RmxhZ3MoYml0cykge1xuICByZXR1cm4ge1xuICAgIGFzc3VtZVZhbGlkOiBCb29sZWFuKGJpdHMgJiAwYjEwMDAwMDAwMDAwMDAwMDApLFxuICAgIGV4dGVuZGVkOiBCb29sZWFuKGJpdHMgJiAwYjAxMDAwMDAwMDAwMDAwMDApLFxuICAgIHN0YWdlOiAoYml0cyAmIDBiMDAxMTAwMDAwMDAwMDAwMCkgPj4gMTIsXG4gICAgbmFtZUxlbmd0aDogYml0cyAmIDBiMDAwMDExMTExMTExMTExMSxcbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJDYWNoZUVudHJ5RmxhZ3MoZW50cnkpIHtcbiAgY29uc3QgZmxhZ3MgPSBlbnRyeS5mbGFncztcbiAgLy8gMS1iaXQgZXh0ZW5kZWQgZmxhZyAobXVzdCBiZSB6ZXJvIGluIHZlcnNpb24gMilcbiAgZmxhZ3MuZXh0ZW5kZWQgPSBmYWxzZTtcbiAgLy8gMTItYml0IG5hbWUgbGVuZ3RoIGlmIHRoZSBsZW5ndGggaXMgbGVzcyB0aGFuIDB4RkZGOyBvdGhlcndpc2UgMHhGRkZcbiAgLy8gaXMgc3RvcmVkIGluIHRoaXMgZmllbGQuXG4gIGZsYWdzLm5hbWVMZW5ndGggPSBNYXRoLm1pbihCdWZmZXIuZnJvbShlbnRyeS5wYXRoKS5sZW5ndGgsIDB4ZmZmKTtcbiAgcmV0dXJuIChcbiAgICAoZmxhZ3MuYXNzdW1lVmFsaWQgPyAwYjEwMDAwMDAwMDAwMDAwMDAgOiAwKSArXG4gICAgKGZsYWdzLmV4dGVuZGVkID8gMGIwMTAwMDAwMDAwMDAwMDAwIDogMCkgK1xuICAgICgoZmxhZ3Muc3RhZ2UgJiAwYjExKSA8PCAxMikgK1xuICAgIChmbGFncy5uYW1lTGVuZ3RoICYgMGIxMTExMTExMTExMTEpXG4gIClcbn1cblxuY2xhc3MgR2l0SW5kZXgge1xuICAvKjo6XG4gICBfZW50cmllczogTWFwPHN0cmluZywgQ2FjaGVFbnRyeT5cbiAgIF9kaXJ0eTogYm9vbGVhbiAvLyBVc2VkIHRvIGRldGVybWluZSBpZiBpbmRleCBuZWVkcyB0byBiZSBzYXZlZCB0byBmaWxlc3lzdGVtXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbnRyaWVzLCB1bm1lcmdlZFBhdGhzKSB7XG4gICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcbiAgICB0aGlzLl91bm1lcmdlZFBhdGhzID0gdW5tZXJnZWRQYXRocyB8fCBuZXcgU2V0KCk7XG4gICAgdGhpcy5fZW50cmllcyA9IGVudHJpZXMgfHwgbmV3IE1hcCgpO1xuICB9XG5cbiAgX2FkZEVudHJ5KGVudHJ5KSB7XG4gICAgaWYgKGVudHJ5LmZsYWdzLnN0YWdlID09PSAwKSB7XG4gICAgICBlbnRyeS5zdGFnZXMgPSBbZW50cnldO1xuICAgICAgdGhpcy5fZW50cmllcy5zZXQoZW50cnkucGF0aCwgZW50cnkpO1xuICAgICAgdGhpcy5fdW5tZXJnZWRQYXRocy5kZWxldGUoZW50cnkucGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBleGlzdGluZ0VudHJ5ID0gdGhpcy5fZW50cmllcy5nZXQoZW50cnkucGF0aCk7XG4gICAgICBpZiAoIWV4aXN0aW5nRW50cnkpIHtcbiAgICAgICAgdGhpcy5fZW50cmllcy5zZXQoZW50cnkucGF0aCwgZW50cnkpO1xuICAgICAgICBleGlzdGluZ0VudHJ5ID0gZW50cnk7XG4gICAgICB9XG4gICAgICBleGlzdGluZ0VudHJ5LnN0YWdlc1tlbnRyeS5mbGFncy5zdGFnZV0gPSBlbnRyeTtcbiAgICAgIHRoaXMuX3VubWVyZ2VkUGF0aHMuYWRkKGVudHJ5LnBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBmcm9tKGJ1ZmZlcikge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKSkge1xuICAgICAgcmV0dXJuIEdpdEluZGV4LmZyb21CdWZmZXIoYnVmZmVyKVxuICAgIH0gZWxzZSBpZiAoYnVmZmVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbmV3IEdpdEluZGV4KG51bGwpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCdpbnZhbGlkIHR5cGUgcGFzc2VkIHRvIEdpdEluZGV4LmZyb20nKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBmcm9tQnVmZmVyKGJ1ZmZlcikge1xuICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcignSW5kZXggZmlsZSBpcyBlbXB0eSAoLmdpdC9pbmRleCknKVxuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gbmV3IEdpdEluZGV4KCk7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEJ1ZmZlckN1cnNvcihidWZmZXIpO1xuICAgIGNvbnN0IG1hZ2ljID0gcmVhZGVyLnRvU3RyaW5nKCd1dGY4JywgNCk7XG4gICAgaWYgKG1hZ2ljICE9PSAnRElSQycpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBJbnZhbGlkIGRpcmNhY2hlIG1hZ2ljIGZpbGUgbnVtYmVyOiAke21hZ2ljfWApXG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHNoYXN1bSBhZnRlciB3ZSBlbnN1cmVkIHRoYXQgdGhlIGZpbGUgaGFzIGEgbWFnaWMgbnVtYmVyXG4gICAgY29uc3Qgc2hhQ29tcHV0ZWQgPSBhd2FpdCBzaGFzdW0oYnVmZmVyLnNsaWNlKDAsIC0yMCkpO1xuICAgIGNvbnN0IHNoYUNsYWltZWQgPSBidWZmZXIuc2xpY2UoLTIwKS50b1N0cmluZygnaGV4Jyk7XG4gICAgaWYgKHNoYUNsYWltZWQgIT09IHNoYUNvbXB1dGVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEludmFsaWQgY2hlY2tzdW0gaW4gR2l0SW5kZXggYnVmZmVyOiBleHBlY3RlZCAke3NoYUNsYWltZWR9IGJ1dCBzYXcgJHtzaGFDb21wdXRlZH1gXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgdmVyc2lvbiA9IHJlYWRlci5yZWFkVUludDMyQkUoKTtcbiAgICBpZiAodmVyc2lvbiAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIGRpcmNhY2hlIHZlcnNpb246ICR7dmVyc2lvbn1gKVxuICAgIH1cbiAgICBjb25zdCBudW1FbnRyaWVzID0gcmVhZGVyLnJlYWRVSW50MzJCRSgpO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoIXJlYWRlci5lb2YoKSAmJiBpIDwgbnVtRW50cmllcykge1xuICAgICAgY29uc3QgZW50cnkgPSB7fTtcbiAgICAgIGVudHJ5LmN0aW1lU2Vjb25kcyA9IHJlYWRlci5yZWFkVUludDMyQkUoKTtcbiAgICAgIGVudHJ5LmN0aW1lTmFub3NlY29uZHMgPSByZWFkZXIucmVhZFVJbnQzMkJFKCk7XG4gICAgICBlbnRyeS5tdGltZVNlY29uZHMgPSByZWFkZXIucmVhZFVJbnQzMkJFKCk7XG4gICAgICBlbnRyeS5tdGltZU5hbm9zZWNvbmRzID0gcmVhZGVyLnJlYWRVSW50MzJCRSgpO1xuICAgICAgZW50cnkuZGV2ID0gcmVhZGVyLnJlYWRVSW50MzJCRSgpO1xuICAgICAgZW50cnkuaW5vID0gcmVhZGVyLnJlYWRVSW50MzJCRSgpO1xuICAgICAgZW50cnkubW9kZSA9IHJlYWRlci5yZWFkVUludDMyQkUoKTtcbiAgICAgIGVudHJ5LnVpZCA9IHJlYWRlci5yZWFkVUludDMyQkUoKTtcbiAgICAgIGVudHJ5LmdpZCA9IHJlYWRlci5yZWFkVUludDMyQkUoKTtcbiAgICAgIGVudHJ5LnNpemUgPSByZWFkZXIucmVhZFVJbnQzMkJFKCk7XG4gICAgICBlbnRyeS5vaWQgPSByZWFkZXIuc2xpY2UoMjApLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGZsYWdzID0gcmVhZGVyLnJlYWRVSW50MTZCRSgpO1xuICAgICAgZW50cnkuZmxhZ3MgPSBwYXJzZUNhY2hlRW50cnlGbGFncyhmbGFncyk7XG4gICAgICAvLyBUT0RPOiBoYW5kbGUgaWYgKHZlcnNpb24gPT09IDMgJiYgZW50cnkuZmxhZ3MuZXh0ZW5kZWQpXG4gICAgICBjb25zdCBwYXRobGVuZ3RoID0gYnVmZmVyLmluZGV4T2YoMCwgcmVhZGVyLnRlbGwoKSArIDEpIC0gcmVhZGVyLnRlbGwoKTtcbiAgICAgIGlmIChwYXRobGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgR290IGEgcGF0aCBsZW5ndGggb2Y6ICR7cGF0aGxlbmd0aH1gKVxuICAgICAgfVxuICAgICAgLy8gVE9ETzogaGFuZGxlIHBhdGhuYW1lcyBsYXJnZXIgdGhhbiAxMiBiaXRzXG4gICAgICBlbnRyeS5wYXRoID0gcmVhZGVyLnRvU3RyaW5nKCd1dGY4JywgcGF0aGxlbmd0aCk7XG5cbiAgICAgIC8vIFByZXZlbnQgbWFsaWNpb3VzIHBhdGhzIGxpa2UgXCIuLlxcZm9vXCJcbiAgICAgIGlmIChlbnRyeS5wYXRoLmluY2x1ZGVzKCcuLlxcXFwnKSB8fCBlbnRyeS5wYXRoLmluY2x1ZGVzKCcuLi8nKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zYWZlRmlsZXBhdGhFcnJvcihlbnRyeS5wYXRoKVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbmV4dCBiaXQgaXMgYXdrd2FyZC4gV2UgZXhwZWN0IDEgdG8gOCBudWxsIGNoYXJhY3RlcnNcbiAgICAgIC8vIHN1Y2ggdGhhdCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZW50cnkgaXMgYSBtdWx0aXBsZSBvZiA4IGJpdHMuXG4gICAgICAvLyAoSGVuY2Ugc3VidHJhY3QgMTIgYnl0ZXMgZm9yIHRoZSBoZWFkZXIuKVxuICAgICAgbGV0IHBhZGRpbmcgPSA4IC0gKChyZWFkZXIudGVsbCgpIC0gMTIpICUgOCk7XG4gICAgICBpZiAocGFkZGluZyA9PT0gMCkgcGFkZGluZyA9IDg7XG4gICAgICB3aGlsZSAocGFkZGluZy0tKSB7XG4gICAgICAgIGNvbnN0IHRtcCA9IHJlYWRlci5yZWFkVUludDgoKTtcbiAgICAgICAgaWYgKHRtcCAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIDEtOCBudWxsIGNoYXJhY3RlcnMgYnV0IGdvdCAnJHt0bXB9JyBhZnRlciAke2VudHJ5LnBhdGh9YFxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIuZW9mKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgZmlsZScpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGVuZCBvZiBhd2t3YXJkIHBhcnRcbiAgICAgIGVudHJ5LnN0YWdlcyA9IFtdO1xuXG4gICAgICBpbmRleC5fYWRkRW50cnkoZW50cnkpO1xuXG4gICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBpbmRleFxuICB9XG5cbiAgZ2V0IHVubWVyZ2VkUGF0aHMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl91bm1lcmdlZFBhdGhzXVxuICB9XG5cbiAgZ2V0IGVudHJpZXMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9lbnRyaWVzLnZhbHVlcygpXS5zb3J0KGNvbXBhcmVQYXRoKVxuICB9XG5cbiAgZ2V0IGVudHJpZXNNYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXNcbiAgfVxuXG4gIGdldCBlbnRyaWVzRmxhdCgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZW50cmllc10uZmxhdE1hcChlbnRyeSA9PiB7XG4gICAgICByZXR1cm4gZW50cnkuc3RhZ2VzLmxlbmd0aCA+IDEgPyBlbnRyeS5zdGFnZXMuZmlsdGVyKHggPT4geCkgOiBlbnRyeVxuICAgIH0pXG4gIH1cblxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIHlpZWxkIGVudHJ5O1xuICAgIH1cbiAgfVxuXG4gIGluc2VydCh7IGZpbGVwYXRoLCBzdGF0cywgb2lkLCBzdGFnZSA9IDAgfSkge1xuICAgIGlmICghc3RhdHMpIHtcbiAgICAgIHN0YXRzID0ge1xuICAgICAgICBjdGltZVNlY29uZHM6IDAsXG4gICAgICAgIGN0aW1lTmFub3NlY29uZHM6IDAsXG4gICAgICAgIG10aW1lU2Vjb25kczogMCxcbiAgICAgICAgbXRpbWVOYW5vc2Vjb25kczogMCxcbiAgICAgICAgZGV2OiAwLFxuICAgICAgICBpbm86IDAsXG4gICAgICAgIG1vZGU6IDAsXG4gICAgICAgIHVpZDogMCxcbiAgICAgICAgZ2lkOiAwLFxuICAgICAgICBzaXplOiAwLFxuICAgICAgfTtcbiAgICB9XG4gICAgc3RhdHMgPSBub3JtYWxpemVTdGF0cyhzdGF0cyk7XG4gICAgY29uc3QgYmZpbGVwYXRoID0gQnVmZmVyLmZyb20oZmlsZXBhdGgpO1xuICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgY3RpbWVTZWNvbmRzOiBzdGF0cy5jdGltZVNlY29uZHMsXG4gICAgICBjdGltZU5hbm9zZWNvbmRzOiBzdGF0cy5jdGltZU5hbm9zZWNvbmRzLFxuICAgICAgbXRpbWVTZWNvbmRzOiBzdGF0cy5tdGltZVNlY29uZHMsXG4gICAgICBtdGltZU5hbm9zZWNvbmRzOiBzdGF0cy5tdGltZU5hbm9zZWNvbmRzLFxuICAgICAgZGV2OiBzdGF0cy5kZXYsXG4gICAgICBpbm86IHN0YXRzLmlubyxcbiAgICAgIC8vIFdlIHByb3ZpZGUgYSBmYWxsYmFjayB2YWx1ZSBmb3IgYG1vZGVgIGhlcmUgYmVjYXVzZSBub3QgYWxsIGZzXG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgYXNzaWduIGl0LCBidXQgd2UgdXNlIGl0IGluIEdpdFRyZWUuXG4gICAgICAvLyAnMTAwNjQ0JyBpcyBmb3IgYSBcInJlZ3VsYXIgbm9uLWV4ZWN1dGFibGUgZmlsZVwiXG4gICAgICBtb2RlOiBzdGF0cy5tb2RlIHx8IDBvMTAwNjQ0LFxuICAgICAgdWlkOiBzdGF0cy51aWQsXG4gICAgICBnaWQ6IHN0YXRzLmdpZCxcbiAgICAgIHNpemU6IHN0YXRzLnNpemUsXG4gICAgICBwYXRoOiBmaWxlcGF0aCxcbiAgICAgIG9pZDogb2lkLFxuICAgICAgZmxhZ3M6IHtcbiAgICAgICAgYXNzdW1lVmFsaWQ6IGZhbHNlLFxuICAgICAgICBleHRlbmRlZDogZmFsc2UsXG4gICAgICAgIHN0YWdlLFxuICAgICAgICBuYW1lTGVuZ3RoOiBiZmlsZXBhdGgubGVuZ3RoIDwgMHhmZmYgPyBiZmlsZXBhdGgubGVuZ3RoIDogMHhmZmYsXG4gICAgICB9LFxuICAgICAgc3RhZ2VzOiBbXSxcbiAgICB9O1xuXG4gICAgdGhpcy5fYWRkRW50cnkoZW50cnkpO1xuXG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICB9XG5cbiAgZGVsZXRlKHsgZmlsZXBhdGggfSkge1xuICAgIGlmICh0aGlzLl9lbnRyaWVzLmhhcyhmaWxlcGF0aCkpIHtcbiAgICAgIHRoaXMuX2VudHJpZXMuZGVsZXRlKGZpbGVwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5fZW50cmllcy5rZXlzKCkpIHtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGZpbGVwYXRoICsgJy8nKSkge1xuICAgICAgICAgIHRoaXMuX2VudHJpZXMuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdW5tZXJnZWRQYXRocy5oYXMoZmlsZXBhdGgpKSB7XG4gICAgICB0aGlzLl91bm1lcmdlZFBhdGhzLmRlbGV0ZShmaWxlcGF0aCk7XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuX2VudHJpZXMuY2xlYXIoKTtcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gIH1cblxuICBoYXMoeyBmaWxlcGF0aCB9KSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXMuaGFzKGZpbGVwYXRoKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXNcbiAgICAgIC5tYXAoZW50cnkgPT4gYCR7ZW50cnkubW9kZS50b1N0cmluZyg4KX0gJHtlbnRyeS5vaWR9ICAgICR7ZW50cnkucGF0aH1gKVxuICAgICAgLmpvaW4oJ1xcbicpXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgX2VudHJ5VG9CdWZmZXIoZW50cnkpIHtcbiAgICBjb25zdCBicGF0aCA9IEJ1ZmZlci5mcm9tKGVudHJ5LnBhdGgpO1xuICAgIC8vIHRoZSBmaXhlZCBsZW5ndGggKyB0aGUgZmlsZW5hbWUgKyBhdCBsZWFzdCBvbmUgbnVsbCBjaGFyID0+IGFsaWduIGJ5IDhcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLmNlaWwoKDYyICsgYnBhdGgubGVuZ3RoICsgMSkgLyA4KSAqIDg7XG4gICAgY29uc3Qgd3JpdHRlbiA9IEJ1ZmZlci5hbGxvYyhsZW5ndGgpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCdWZmZXJDdXJzb3Iod3JpdHRlbik7XG4gICAgY29uc3Qgc3RhdCA9IG5vcm1hbGl6ZVN0YXRzKGVudHJ5KTtcbiAgICB3cml0ZXIud3JpdGVVSW50MzJCRShzdGF0LmN0aW1lU2Vjb25kcyk7XG4gICAgd3JpdGVyLndyaXRlVUludDMyQkUoc3RhdC5jdGltZU5hbm9zZWNvbmRzKTtcbiAgICB3cml0ZXIud3JpdGVVSW50MzJCRShzdGF0Lm10aW1lU2Vjb25kcyk7XG4gICAgd3JpdGVyLndyaXRlVUludDMyQkUoc3RhdC5tdGltZU5hbm9zZWNvbmRzKTtcbiAgICB3cml0ZXIud3JpdGVVSW50MzJCRShzdGF0LmRldik7XG4gICAgd3JpdGVyLndyaXRlVUludDMyQkUoc3RhdC5pbm8pO1xuICAgIHdyaXRlci53cml0ZVVJbnQzMkJFKHN0YXQubW9kZSk7XG4gICAgd3JpdGVyLndyaXRlVUludDMyQkUoc3RhdC51aWQpO1xuICAgIHdyaXRlci53cml0ZVVJbnQzMkJFKHN0YXQuZ2lkKTtcbiAgICB3cml0ZXIud3JpdGVVSW50MzJCRShzdGF0LnNpemUpO1xuICAgIHdyaXRlci53cml0ZShlbnRyeS5vaWQsIDIwLCAnaGV4Jyk7XG4gICAgd3JpdGVyLndyaXRlVUludDE2QkUocmVuZGVyQ2FjaGVFbnRyeUZsYWdzKGVudHJ5KSk7XG4gICAgd3JpdGVyLndyaXRlKGVudHJ5LnBhdGgsIGJwYXRoLmxlbmd0aCwgJ3V0ZjgnKTtcbiAgICByZXR1cm4gd3JpdHRlblxuICB9XG5cbiAgYXN5bmMgdG9PYmplY3QoKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDEyKTtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnVmZmVyQ3Vyc29yKGhlYWRlcik7XG4gICAgd3JpdGVyLndyaXRlKCdESVJDJywgNCwgJ3V0ZjgnKTtcbiAgICB3cml0ZXIud3JpdGVVSW50MzJCRSgyKTtcbiAgICB3cml0ZXIud3JpdGVVSW50MzJCRSh0aGlzLmVudHJpZXNGbGF0Lmxlbmd0aCk7XG5cbiAgICBsZXQgZW50cnlCdWZmZXJzID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIGVudHJ5QnVmZmVycy5wdXNoKEdpdEluZGV4Ll9lbnRyeVRvQnVmZmVyKGVudHJ5KSk7XG4gICAgICBpZiAoZW50cnkuc3RhZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yIChjb25zdCBzdGFnZSBvZiBlbnRyeS5zdGFnZXMpIHtcbiAgICAgICAgICBpZiAoc3RhZ2UgJiYgc3RhZ2UgIT09IGVudHJ5KSB7XG4gICAgICAgICAgICBlbnRyeUJ1ZmZlcnMucHVzaChHaXRJbmRleC5fZW50cnlUb0J1ZmZlcihzdGFnZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnRyeUJ1ZmZlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChlbnRyeUJ1ZmZlcnMpO1xuXG4gICAgY29uc3QgYm9keSA9IEJ1ZmZlci5jb25jYXQoZW50cnlCdWZmZXJzKTtcbiAgICBjb25zdCBtYWluID0gQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBib2R5XSk7XG4gICAgY29uc3Qgc3VtID0gYXdhaXQgc2hhc3VtKG1haW4pO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFttYWluLCBCdWZmZXIuZnJvbShzdW0sICdoZXgnKV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGFyZVN0YXRzKGVudHJ5LCBzdGF0cykge1xuICAvLyBDb21wYXJpc29uIGJhc2VkIG9uIHRoZSBkZXNjcmlwdGlvbiBpbiBQYXJhZ3JhcGggNCBvZlxuICAvLyBodHRwczovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvdGVjaG5pY2FsL3JhY3ktZ2l0LnR4dFxuICBjb25zdCBlID0gbm9ybWFsaXplU3RhdHMoZW50cnkpO1xuICBjb25zdCBzID0gbm9ybWFsaXplU3RhdHMoc3RhdHMpO1xuICBjb25zdCBzdGFsZW5lc3MgPVxuICAgIGUubW9kZSAhPT0gcy5tb2RlIHx8XG4gICAgZS5tdGltZVNlY29uZHMgIT09IHMubXRpbWVTZWNvbmRzIHx8XG4gICAgZS5jdGltZVNlY29uZHMgIT09IHMuY3RpbWVTZWNvbmRzIHx8XG4gICAgZS51aWQgIT09IHMudWlkIHx8XG4gICAgZS5naWQgIT09IHMuZ2lkIHx8XG4gICAgZS5pbm8gIT09IHMuaW5vIHx8XG4gICAgZS5zaXplICE9PSBzLnNpemU7XG4gIHJldHVybiBzdGFsZW5lc3Ncbn1cblxuLy8gaW1wb3J0IExvY2tNYW5hZ2VyIGZyb20gJ3RyYXZpeC1sb2NrLW1hbmFnZXInXG5cbi8vIGltcG9ydCBMb2NrIGZyb20gJy4uL3V0aWxzLmpzJ1xuXG4vLyBjb25zdCBsbSA9IG5ldyBMb2NrTWFuYWdlcigpXG5sZXQgbG9jayA9IG51bGw7XG5cbmNvbnN0IEluZGV4Q2FjaGUgPSBTeW1ib2woJ0luZGV4Q2FjaGUnKTtcblxuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG4gIHJldHVybiB7XG4gICAgbWFwOiBuZXcgTWFwKCksXG4gICAgc3RhdHM6IG5ldyBNYXAoKSxcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVDYWNoZWRJbmRleEZpbGUoZnMsIGZpbGVwYXRoLCBjYWNoZSkge1xuICBjb25zdCBzdGF0ID0gYXdhaXQgZnMubHN0YXQoZmlsZXBhdGgpO1xuICBjb25zdCByYXdJbmRleEZpbGUgPSBhd2FpdCBmcy5yZWFkKGZpbGVwYXRoKTtcbiAgY29uc3QgaW5kZXggPSBhd2FpdCBHaXRJbmRleC5mcm9tKHJhd0luZGV4RmlsZSk7XG4gIC8vIGNhY2hlIHRoZSBHaXRJbmRleCBvYmplY3Qgc28gd2UgZG9uJ3QgbmVlZCB0byByZS1yZWFkIGl0IGV2ZXJ5IHRpbWUuXG4gIGNhY2hlLm1hcC5zZXQoZmlsZXBhdGgsIGluZGV4KTtcbiAgLy8gU2F2ZSB0aGUgc3RhdCBkYXRhIGZvciB0aGUgaW5kZXggc28gd2Uga25vdyB3aGV0aGVyIHRoZSBjYWNoZWQgZmlsZSBpcyBzdGFsZSAobW9kaWZpZWQgYnkgYW4gb3V0c2lkZSBwcm9jZXNzKS5cbiAgY2FjaGUuc3RhdHMuc2V0KGZpbGVwYXRoLCBzdGF0KTtcbn1cblxuLy8gRGV0ZXJtaW5lIHdoZXRoZXIgb3VyIGNvcHkgb2YgdGhlIGluZGV4IGZpbGUgaXMgc3RhbGVcbmFzeW5jIGZ1bmN0aW9uIGlzSW5kZXhTdGFsZShmcywgZmlsZXBhdGgsIGNhY2hlKSB7XG4gIGNvbnN0IHNhdmVkU3RhdHMgPSBjYWNoZS5zdGF0cy5nZXQoZmlsZXBhdGgpO1xuICBpZiAoc2F2ZWRTdGF0cyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZVxuICBjb25zdCBjdXJyU3RhdHMgPSBhd2FpdCBmcy5sc3RhdChmaWxlcGF0aCk7XG4gIGlmIChzYXZlZFN0YXRzID09PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKGN1cnJTdGF0cyA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBjb21wYXJlU3RhdHMoc2F2ZWRTdGF0cywgY3VyclN0YXRzKVxufVxuXG5jbGFzcyBHaXRJbmRleE1hbmFnZXIge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gb3B0cy5mc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5naXRkaXJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdHMuY2FjaGVcbiAgICogQHBhcmFtIHtib29sfSBvcHRzLmFsbG93VW5tZXJnZWRcbiAgICogQHBhcmFtIHtmdW5jdGlvbihHaXRJbmRleCk6IGFueX0gY2xvc3VyZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFjcXVpcmUoeyBmcywgZ2l0ZGlyLCBjYWNoZSwgYWxsb3dVbm1lcmdlZCA9IHRydWUgfSwgY2xvc3VyZSkge1xuICAgIGlmICghY2FjaGVbSW5kZXhDYWNoZV0pIGNhY2hlW0luZGV4Q2FjaGVdID0gY3JlYXRlQ2FjaGUoKTtcblxuICAgIGNvbnN0IGZpbGVwYXRoID0gYCR7Z2l0ZGlyfS9pbmRleGA7XG4gICAgaWYgKGxvY2sgPT09IG51bGwpIGxvY2sgPSBuZXcgQXN5bmNMb2NrKHsgbWF4UGVuZGluZzogSW5maW5pdHkgfSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBsZXQgdW5tZXJnZWRQYXRocyA9IFtdO1xuICAgIGF3YWl0IGxvY2suYWNxdWlyZShmaWxlcGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQWNxdWlyZSBhIGZpbGUgbG9jayB3aGlsZSB3ZSdyZSByZWFkaW5nIHRoZSBpbmRleFxuICAgICAgLy8gdG8gbWFrZSBzdXJlIG90aGVyIHByb2Nlc3NlcyBhcmVuJ3Qgd3JpdGluZyB0byBpdFxuICAgICAgLy8gc2ltdWx0YW5lb3VzbHksIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBhIGNvcnJ1cHRlZCBpbmRleC5cbiAgICAgIC8vIGNvbnN0IGZpbGVMb2NrID0gYXdhaXQgTG9jayhmaWxlcGF0aClcbiAgICAgIGlmIChhd2FpdCBpc0luZGV4U3RhbGUoZnMsIGZpbGVwYXRoLCBjYWNoZVtJbmRleENhY2hlXSkpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlQ2FjaGVkSW5kZXhGaWxlKGZzLCBmaWxlcGF0aCwgY2FjaGVbSW5kZXhDYWNoZV0pO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXggPSBjYWNoZVtJbmRleENhY2hlXS5tYXAuZ2V0KGZpbGVwYXRoKTtcbiAgICAgIHVubWVyZ2VkUGF0aHMgPSBpbmRleC51bm1lcmdlZFBhdGhzO1xuXG4gICAgICBpZiAodW5tZXJnZWRQYXRocy5sZW5ndGggJiYgIWFsbG93VW5tZXJnZWQpXG4gICAgICAgIHRocm93IG5ldyBVbm1lcmdlZFBhdGhzRXJyb3IodW5tZXJnZWRQYXRocylcblxuICAgICAgcmVzdWx0ID0gYXdhaXQgY2xvc3VyZShpbmRleCk7XG4gICAgICBpZiAoaW5kZXguX2RpcnR5KSB7XG4gICAgICAgIC8vIEFjcXVpcmUgYSBmaWxlIGxvY2sgd2hpbGUgd2UncmUgd3JpdGluZyB0aGUgaW5kZXggZmlsZVxuICAgICAgICAvLyBsZXQgZmlsZUxvY2sgPSBhd2FpdCBMb2NrKGZpbGVwYXRoKVxuICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBpbmRleC50b09iamVjdCgpO1xuICAgICAgICBhd2FpdCBmcy53cml0ZShmaWxlcGF0aCwgYnVmZmVyKTtcbiAgICAgICAgLy8gVXBkYXRlIGNhY2hlZCBzdGF0IHZhbHVlXG4gICAgICAgIGNhY2hlW0luZGV4Q2FjaGVdLnN0YXRzLnNldChmaWxlcGF0aCwgYXdhaXQgZnMubHN0YXQoZmlsZXBhdGgpKTtcbiAgICAgICAgaW5kZXguX2RpcnR5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkge1xuICBjb25zdCBsYXN0ID0gTWF0aC5tYXgocGF0aC5sYXN0SW5kZXhPZignLycpLCBwYXRoLmxhc3RJbmRleE9mKCdcXFxcJykpO1xuICBpZiAobGFzdCA+IC0xKSB7XG4gICAgcGF0aCA9IHBhdGguc2xpY2UobGFzdCArIDEpO1xuICB9XG4gIHJldHVybiBwYXRoXG59XG5cbmZ1bmN0aW9uIGRpcm5hbWUocGF0aCkge1xuICBjb25zdCBsYXN0ID0gTWF0aC5tYXgocGF0aC5sYXN0SW5kZXhPZignLycpLCBwYXRoLmxhc3RJbmRleE9mKCdcXFxcJykpO1xuICBpZiAobGFzdCA9PT0gLTEpIHJldHVybiAnLidcbiAgaWYgKGxhc3QgPT09IDApIHJldHVybiAnLydcbiAgcmV0dXJuIHBhdGguc2xpY2UoMCwgbGFzdClcbn1cblxuLyo6OlxudHlwZSBOb2RlID0ge1xuICB0eXBlOiBzdHJpbmcsXG4gIGZ1bGxwYXRoOiBzdHJpbmcsXG4gIGJhc2VuYW1lOiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBPYmplY3QsIC8vIG1vZGUsIG9pZFxuICBwYXJlbnQ/OiBOb2RlLFxuICBjaGlsZHJlbjogQXJyYXk8Tm9kZT5cbn1cbiovXG5cbmZ1bmN0aW9uIGZsYXRGaWxlTGlzdFRvRGlyZWN0b3J5U3RydWN0dXJlKGZpbGVzKSB7XG4gIGNvbnN0IGlub2RlcyA9IG5ldyBNYXAoKTtcbiAgY29uc3QgbWtkaXIgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKCFpbm9kZXMuaGFzKG5hbWUpKSB7XG4gICAgICBjb25zdCBkaXIgPSB7XG4gICAgICAgIHR5cGU6ICd0cmVlJyxcbiAgICAgICAgZnVsbHBhdGg6IG5hbWUsXG4gICAgICAgIGJhc2VuYW1lOiBiYXNlbmFtZShuYW1lKSxcbiAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuICAgICAgaW5vZGVzLnNldChuYW1lLCBkaXIpO1xuICAgICAgLy8gVGhpcyByZWN1cnNpdmVseSBnZW5lcmF0ZXMgYW55IG1pc3NpbmcgcGFyZW50IGZvbGRlcnMuXG4gICAgICAvLyBXZSBkbyBpdCBhZnRlciB3ZSd2ZSBhZGRlZCB0aGUgaW5vZGUgdG8gdGhlIHNldCBzbyB0aGF0XG4gICAgICAvLyB3ZSBkb24ndCByZWN1cnNlIGluZmluaXRlbHkgdHJ5aW5nIHRvIGNyZWF0ZSB0aGUgcm9vdCAnLicgZGlybmFtZS5cbiAgICAgIGRpci5wYXJlbnQgPSBta2RpcihkaXJuYW1lKG5hbWUpKTtcbiAgICAgIGlmIChkaXIucGFyZW50ICYmIGRpci5wYXJlbnQgIT09IGRpcikgZGlyLnBhcmVudC5jaGlsZHJlbi5wdXNoKGRpcik7XG4gICAgfVxuICAgIHJldHVybiBpbm9kZXMuZ2V0KG5hbWUpXG4gIH07XG5cbiAgY29uc3QgbWtmaWxlID0gZnVuY3Rpb24obmFtZSwgbWV0YWRhdGEpIHtcbiAgICBpZiAoIWlub2Rlcy5oYXMobmFtZSkpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSB7XG4gICAgICAgIHR5cGU6ICdibG9iJyxcbiAgICAgICAgZnVsbHBhdGg6IG5hbWUsXG4gICAgICAgIGJhc2VuYW1lOiBiYXNlbmFtZShuYW1lKSxcbiAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLFxuICAgICAgICAvLyBUaGlzIHJlY3Vyc2l2ZWx5IGdlbmVyYXRlcyBhbnkgbWlzc2luZyBwYXJlbnQgZm9sZGVycy5cbiAgICAgICAgcGFyZW50OiBta2RpcihkaXJuYW1lKG5hbWUpKSxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgfTtcbiAgICAgIGlmIChmaWxlLnBhcmVudCkgZmlsZS5wYXJlbnQuY2hpbGRyZW4ucHVzaChmaWxlKTtcbiAgICAgIGlub2Rlcy5zZXQobmFtZSwgZmlsZSk7XG4gICAgfVxuICAgIHJldHVybiBpbm9kZXMuZ2V0KG5hbWUpXG4gIH07XG5cbiAgbWtkaXIoJy4nKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgbWtmaWxlKGZpbGUucGF0aCwgZmlsZSk7XG4gIH1cbiAgcmV0dXJuIGlub2Rlc1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbW9kZVxuICovXG5mdW5jdGlvbiBtb2RlMnR5cGUobW9kZSkge1xuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSAwbzA0MDAwMDogcmV0dXJuICd0cmVlJ1xuICAgIGNhc2UgMG8xMDA2NDQ6IHJldHVybiAnYmxvYidcbiAgICBjYXNlIDBvMTAwNzU1OiByZXR1cm4gJ2Jsb2InXG4gICAgY2FzZSAwbzEyMDAwMDogcmV0dXJuICdibG9iJ1xuICAgIGNhc2UgMG8xNjAwMDA6IHJldHVybiAnY29tbWl0J1xuICB9XG4gIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbmV4cGVjdGVkIEdpdFRyZWUgZW50cnkgbW9kZTogJHttb2RlLnRvU3RyaW5nKDgpfWApXG59XG5cbmNsYXNzIEdpdFdhbGtlckluZGV4IHtcbiAgY29uc3RydWN0b3IoeyBmcywgZ2l0ZGlyLCBjYWNoZSB9KSB7XG4gICAgdGhpcy50cmVlUHJvbWlzZSA9IEdpdEluZGV4TWFuYWdlci5hY3F1aXJlKFxuICAgICAgeyBmcywgZ2l0ZGlyLCBjYWNoZSB9LFxuICAgICAgYXN5bmMgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZsYXRGaWxlTGlzdFRvRGlyZWN0b3J5U3RydWN0dXJlKGluZGV4LmVudHJpZXMpXG4gICAgICB9XG4gICAgKTtcbiAgICBjb25zdCB3YWxrZXIgPSB0aGlzO1xuICAgIHRoaXMuQ29uc3RydWN0RW50cnkgPSBjbGFzcyBTdGFnZUVudHJ5IHtcbiAgICAgIGNvbnN0cnVjdG9yKGZ1bGxwYXRoKSB7XG4gICAgICAgIHRoaXMuX2Z1bGxwYXRoID0gZnVsbHBhdGg7XG4gICAgICAgIHRoaXMuX3R5cGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zdGF0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX29pZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBhc3luYyB0eXBlKCkge1xuICAgICAgICByZXR1cm4gd2Fsa2VyLnR5cGUodGhpcylcbiAgICAgIH1cblxuICAgICAgYXN5bmMgbW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHdhbGtlci5tb2RlKHRoaXMpXG4gICAgICB9XG5cbiAgICAgIGFzeW5jIHN0YXQoKSB7XG4gICAgICAgIHJldHVybiB3YWxrZXIuc3RhdCh0aGlzKVxuICAgICAgfVxuXG4gICAgICBhc3luYyBjb250ZW50KCkge1xuICAgICAgICByZXR1cm4gd2Fsa2VyLmNvbnRlbnQodGhpcylcbiAgICAgIH1cblxuICAgICAgYXN5bmMgb2lkKCkge1xuICAgICAgICByZXR1cm4gd2Fsa2VyLm9pZCh0aGlzKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWFkZGlyKGVudHJ5KSB7XG4gICAgY29uc3QgZmlsZXBhdGggPSBlbnRyeS5fZnVsbHBhdGg7XG4gICAgY29uc3QgdHJlZSA9IGF3YWl0IHRoaXMudHJlZVByb21pc2U7XG4gICAgY29uc3QgaW5vZGUgPSB0cmVlLmdldChmaWxlcGF0aCk7XG4gICAgaWYgKCFpbm9kZSkgcmV0dXJuIG51bGxcbiAgICBpZiAoaW5vZGUudHlwZSA9PT0gJ2Jsb2InKSByZXR1cm4gbnVsbFxuICAgIGlmIChpbm9kZS50eXBlICE9PSAndHJlZScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRU5PVERJUjogbm90IGEgZGlyZWN0b3J5LCBzY2FuZGlyICcke2ZpbGVwYXRofSdgKVxuICAgIH1cbiAgICBjb25zdCBuYW1lcyA9IGlub2RlLmNoaWxkcmVuLm1hcChpbm9kZSA9PiBpbm9kZS5mdWxscGF0aCk7XG4gICAgbmFtZXMuc29ydChjb21wYXJlU3RyaW5ncyk7XG4gICAgcmV0dXJuIG5hbWVzXG4gIH1cblxuICBhc3luYyB0eXBlKGVudHJ5KSB7XG4gICAgaWYgKGVudHJ5Ll90eXBlID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgZW50cnkuc3RhdCgpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnkuX3R5cGVcbiAgfVxuXG4gIGFzeW5jIG1vZGUoZW50cnkpIHtcbiAgICBpZiAoZW50cnkuX21vZGUgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCBlbnRyeS5zdGF0KCk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeS5fbW9kZVxuICB9XG5cbiAgYXN5bmMgc3RhdChlbnRyeSkge1xuICAgIGlmIChlbnRyeS5fc3RhdCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHRyZWUgPSBhd2FpdCB0aGlzLnRyZWVQcm9taXNlO1xuICAgICAgY29uc3QgaW5vZGUgPSB0cmVlLmdldChlbnRyeS5fZnVsbHBhdGgpO1xuICAgICAgaWYgKCFpbm9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEVOT0VOVDogbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSwgbHN0YXQgJyR7ZW50cnkuX2Z1bGxwYXRofSdgXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXRzID0gaW5vZGUudHlwZSA9PT0gJ3RyZWUnID8ge30gOiBub3JtYWxpemVTdGF0cyhpbm9kZS5tZXRhZGF0YSk7XG4gICAgICBlbnRyeS5fdHlwZSA9IGlub2RlLnR5cGUgPT09ICd0cmVlJyA/ICd0cmVlJyA6IG1vZGUydHlwZShzdGF0cy5tb2RlKTtcbiAgICAgIGVudHJ5Ll9tb2RlID0gc3RhdHMubW9kZTtcbiAgICAgIGlmIChpbm9kZS50eXBlID09PSAndHJlZScpIHtcbiAgICAgICAgZW50cnkuX3N0YXQgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeS5fc3RhdCA9IHN0YXRzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW50cnkuX3N0YXRcbiAgfVxuXG4gIGFzeW5jIGNvbnRlbnQoX2VudHJ5KSB7XG4gICAgLy8gQ2Fubm90IGdldCBjb250ZW50IGZvciBhbiBpbmRleCBlbnRyeVxuICB9XG5cbiAgYXN5bmMgb2lkKGVudHJ5KSB7XG4gICAgaWYgKGVudHJ5Ll9vaWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB0cmVlID0gYXdhaXQgdGhpcy50cmVlUHJvbWlzZTtcbiAgICAgIGNvbnN0IGlub2RlID0gdHJlZS5nZXQoZW50cnkuX2Z1bGxwYXRoKTtcbiAgICAgIGVudHJ5Ll9vaWQgPSBpbm9kZS5tZXRhZGF0YS5vaWQ7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeS5fb2lkXG4gIH1cbn1cblxuLy8gVGhpcyBpcyBwYXJ0IG9mIGFuIGVsYWJvcmF0ZSBzeXN0ZW0gdG8gZmFjaWxpdGF0ZSBjb2RlLXNwbGl0dGluZyAvIHRyZWUtc2hha2luZy5cbi8vIGNvbW1hbmRzL3dhbGsuanMgY2FuIGRlcGVuZCBvbiBvbmx5IHRoaXMsIGFuZCB0aGUgYWN0dWFsIFdhbGtlciBjbGFzc2VzIGV4cG9ydGVkXG4vLyBjYW4gYmUgb3BhcXVlIC0gb25seSBoYXZpbmcgYSBzaW5nbGUgcHJvcGVydHkgKHRoaXMgc3ltYm9sKSB0aGF0IGlzIG5vdCBlbnVtZXJhYmxlLFxuLy8gYW5kIHRodXMgdGhlIGNvbnN0cnVjdG9yIGNhbiBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gd2FsayB3aGlsZSBiZWluZyBcInVudXNhYmxlXCJcbi8vIG91dHNpZGUgb2YgaXQuXG5jb25zdCBHaXRXYWxrU3ltYm9sID0gU3ltYm9sKCdHaXRXYWxrU3ltYm9sJyk7XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEByZXR1cm5zIHtXYWxrZXJ9XG4gKi9cbmZ1bmN0aW9uIFNUQUdFKCkge1xuICBjb25zdCBvID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIEdpdFdhbGtTeW1ib2wsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24oeyBmcywgZ2l0ZGlyLCBjYWNoZSB9KSB7XG4gICAgICByZXR1cm4gbmV3IEdpdFdhbGtlckluZGV4KHsgZnMsIGdpdGRpciwgY2FjaGUgfSlcbiAgICB9LFxuICB9KTtcbiAgT2JqZWN0LmZyZWV6ZShvKTtcbiAgcmV0dXJuIG9cbn1cblxuLy8gQHRzLWNoZWNrXG5cbmNsYXNzIE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHdoYXRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHdoYXQpIHtcbiAgICBzdXBlcihgQ291bGQgbm90IGZpbmQgJHt3aGF0fS5gKTtcbiAgICB0aGlzLmNvZGUgPSB0aGlzLm5hbWUgPSBOb3RGb3VuZEVycm9yLmNvZGU7XG4gICAgdGhpcy5kYXRhID0geyB3aGF0IH07XG4gIH1cbn1cbi8qKiBAdHlwZSB7J05vdEZvdW5kRXJyb3InfSAqL1xuTm90Rm91bmRFcnJvci5jb2RlID0gJ05vdEZvdW5kRXJyb3InO1xuXG5jbGFzcyBPYmplY3RUeXBlRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9pZFxuICAgKiBAcGFyYW0geydibG9iJ3wnY29tbWl0J3wndGFnJ3wndHJlZSd9IGFjdHVhbFxuICAgKiBAcGFyYW0geydibG9iJ3wnY29tbWl0J3wndGFnJ3wndHJlZSd9IGV4cGVjdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmlsZXBhdGhdXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvaWQsIGFjdHVhbCwgZXhwZWN0ZWQsIGZpbGVwYXRoKSB7XG4gICAgc3VwZXIoXG4gICAgICBgT2JqZWN0ICR7b2lkfSAke1xuICAgICAgICBmaWxlcGF0aCA/IGBhdCAke2ZpbGVwYXRofWAgOiAnJ1xuICAgICAgfXdhcyBhbnRpY2lwYXRlZCB0byBiZSBhICR7ZXhwZWN0ZWR9IGJ1dCBpdCBpcyBhICR7YWN0dWFsfS5gXG4gICAgKTtcbiAgICB0aGlzLmNvZGUgPSB0aGlzLm5hbWUgPSBPYmplY3RUeXBlRXJyb3IuY29kZTtcbiAgICB0aGlzLmRhdGEgPSB7IG9pZCwgYWN0dWFsLCBleHBlY3RlZCwgZmlsZXBhdGggfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnT2JqZWN0VHlwZUVycm9yJ30gKi9cbk9iamVjdFR5cGVFcnJvci5jb2RlID0gJ09iamVjdFR5cGVFcnJvcic7XG5cbmNsYXNzIEludmFsaWRPaWRFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgc3VwZXIoYEV4cGVjdGVkIGEgNDAtY2hhciBoZXggb2JqZWN0IGlkIGJ1dCBzYXcgXCIke3ZhbHVlfVwiLmApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IEludmFsaWRPaWRFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgdmFsdWUgfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnSW52YWxpZE9pZEVycm9yJ30gKi9cbkludmFsaWRPaWRFcnJvci5jb2RlID0gJ0ludmFsaWRPaWRFcnJvcic7XG5cbmNsYXNzIE5vUmVmc3BlY0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHJlbW90ZSkge1xuICAgIHN1cGVyKGBDb3VsZCBub3QgZmluZCBhIGZldGNoIHJlZnNwZWMgZm9yIHJlbW90ZSBcIiR7cmVtb3RlfVwiLiBNYWtlIHN1cmUgdGhlIGNvbmZpZyBmaWxlIGhhcyBhbiBlbnRyeSBsaWtlIHRoZSBmb2xsb3dpbmc6XG5bcmVtb3RlIFwiJHtyZW1vdGV9XCJdXG5cXHRmZXRjaCA9ICtyZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qXG5gKTtcbiAgICB0aGlzLmNvZGUgPSB0aGlzLm5hbWUgPSBOb1JlZnNwZWNFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgcmVtb3RlIH07XG4gIH1cbn1cbi8qKiBAdHlwZSB7J05vUmVmc3BlY0Vycm9yJ30gKi9cbk5vUmVmc3BlY0Vycm9yLmNvZGUgPSAnTm9SZWZzcGVjRXJyb3InO1xuXG5jbGFzcyBHaXRQYWNrZWRSZWZzIHtcbiAgY29uc3RydWN0b3IodGV4dCkge1xuICAgIHRoaXMucmVmcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnBhcnNlZENvbmZpZyA9IFtdO1xuICAgIGlmICh0ZXh0KSB7XG4gICAgICBsZXQga2V5ID0gbnVsbDtcbiAgICAgIHRoaXMucGFyc2VkQ29uZmlnID0gdGV4dFxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcChsaW5lID0+IHtcbiAgICAgICAgICBpZiAoL15cXHMqIy8udGVzdChsaW5lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbGluZSwgY29tbWVudDogdHJ1ZSB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGkgPSBsaW5lLmluZGV4T2YoJyAnKTtcbiAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCdeJykpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBvaWQgZm9yIHRoZSBjb21taXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbm5vdGF0ZWQgdGFnIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGlzIGxpbmUuXG4gICAgICAgICAgICAvLyBUcmltIG9mZiB0aGUgJ14nXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxpbmUuc2xpY2UoMSk7XG4gICAgICAgICAgICAvLyBUaGUgdGFnbmFtZV57fSBzeW50YXggaXMgYmFzZWQgb24gdGhlIG91dHB1dCBvZiBgZ2l0IHNob3ctcmVmIC0tdGFncyAtZGBcbiAgICAgICAgICAgIHRoaXMucmVmcy5zZXQoa2V5ICsgJ157fScsIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB7IGxpbmUsIHJlZjoga2V5LCBwZWVsZWQ6IHZhbHVlIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBvaWQgZm9sbG93ZWQgYnkgdGhlIHJlZiBuYW1lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxpbmUuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICBrZXkgPSBsaW5lLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgIHRoaXMucmVmcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4geyBsaW5lLCByZWY6IGtleSwgb2lkOiB2YWx1ZSB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHRleHQpIHtcbiAgICByZXR1cm4gbmV3IEdpdFBhY2tlZFJlZnModGV4dClcbiAgfVxuXG4gIGRlbGV0ZShyZWYpIHtcbiAgICB0aGlzLnBhcnNlZENvbmZpZyA9IHRoaXMucGFyc2VkQ29uZmlnLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5yZWYgIT09IHJlZik7XG4gICAgdGhpcy5yZWZzLmRlbGV0ZShyZWYpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VkQ29uZmlnLm1hcCgoeyBsaW5lIH0pID0+IGxpbmUpLmpvaW4oJ1xcbicpICsgJ1xcbidcbiAgfVxufVxuXG5jbGFzcyBHaXRSZWZTcGVjIHtcbiAgY29uc3RydWN0b3IoeyByZW1vdGVQYXRoLCBsb2NhbFBhdGgsIGZvcmNlLCBtYXRjaFByZWZpeCB9KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XG4gICAgICByZW1vdGVQYXRoLFxuICAgICAgbG9jYWxQYXRoLFxuICAgICAgZm9yY2UsXG4gICAgICBtYXRjaFByZWZpeCxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHJlZnNwZWMpIHtcbiAgICBjb25zdCBbXG4gICAgICBmb3JjZU1hdGNoLFxuICAgICAgcmVtb3RlUGF0aCxcbiAgICAgIHJlbW90ZUdsb2JNYXRjaCxcbiAgICAgIGxvY2FsUGF0aCxcbiAgICAgIGxvY2FsR2xvYk1hdGNoLFxuICAgIF0gPSByZWZzcGVjLm1hdGNoKC9eKFxcKz8pKC4qPykoXFwqPyk6KC4qPykoXFwqPykkLykuc2xpY2UoMSk7XG4gICAgY29uc3QgZm9yY2UgPSBmb3JjZU1hdGNoID09PSAnKyc7XG4gICAgY29uc3QgcmVtb3RlSXNHbG9iID0gcmVtb3RlR2xvYk1hdGNoID09PSAnKic7XG4gICAgY29uc3QgbG9jYWxJc0dsb2IgPSBsb2NhbEdsb2JNYXRjaCA9PT0gJyonO1xuICAgIC8vIHZhbGlkYXRlXG4gICAgLy8gVE9ETzogTWFrZSB0aGlzIGNoZWNrIG1vcmUgbnVhbmNlZCwgYW5kIGRlcGVuZCBvbiB3aGV0aGVyIHRoaXMgaXMgYSBmZXRjaCByZWZzcGVjIG9yIGEgcHVzaCByZWZzcGVjXG4gICAgaWYgKHJlbW90ZUlzR2xvYiAhPT0gbG9jYWxJc0dsb2IpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCdJbnZhbGlkIHJlZnNwZWMnKVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEdpdFJlZlNwZWMoe1xuICAgICAgcmVtb3RlUGF0aCxcbiAgICAgIGxvY2FsUGF0aCxcbiAgICAgIGZvcmNlLFxuICAgICAgbWF0Y2hQcmVmaXg6IHJlbW90ZUlzR2xvYixcbiAgICB9KVxuICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gcnVuIHJlc29sdmVSZWYgb24gYm90aCBwYXRocyB0byBleHBhbmQgdGhlbSB0byB0aGVpciBmdWxsIG5hbWUuXG4gIH1cblxuICB0cmFuc2xhdGUocmVtb3RlQnJhbmNoKSB7XG4gICAgaWYgKHRoaXMubWF0Y2hQcmVmaXgpIHtcbiAgICAgIGlmIChyZW1vdGVCcmFuY2guc3RhcnRzV2l0aCh0aGlzLnJlbW90ZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsUGF0aCArIHJlbW90ZUJyYW5jaC5yZXBsYWNlKHRoaXMucmVtb3RlUGF0aCwgJycpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZW1vdGVCcmFuY2ggPT09IHRoaXMucmVtb3RlUGF0aCkgcmV0dXJuIHRoaXMubG9jYWxQYXRoXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXZlcnNlVHJhbnNsYXRlKGxvY2FsQnJhbmNoKSB7XG4gICAgaWYgKHRoaXMubWF0Y2hQcmVmaXgpIHtcbiAgICAgIGlmIChsb2NhbEJyYW5jaC5zdGFydHNXaXRoKHRoaXMubG9jYWxQYXRoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdGVQYXRoICsgbG9jYWxCcmFuY2gucmVwbGFjZSh0aGlzLmxvY2FsUGF0aCwgJycpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChsb2NhbEJyYW5jaCA9PT0gdGhpcy5sb2NhbFBhdGgpIHJldHVybiB0aGlzLnJlbW90ZVBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5jbGFzcyBHaXRSZWZTcGVjU2V0IHtcbiAgY29uc3RydWN0b3IocnVsZXMgPSBbXSkge1xuICAgIHRoaXMucnVsZXMgPSBydWxlcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHJlZnNwZWNzKSB7XG4gICAgY29uc3QgcnVsZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlZnNwZWMgb2YgcmVmc3BlY3MpIHtcbiAgICAgIHJ1bGVzLnB1c2goR2l0UmVmU3BlYy5mcm9tKHJlZnNwZWMpKTsgLy8gbWlnaHQgdGhyb3dcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBHaXRSZWZTcGVjU2V0KHJ1bGVzKVxuICB9XG5cbiAgYWRkKHJlZnNwZWMpIHtcbiAgICBjb25zdCBydWxlID0gR2l0UmVmU3BlYy5mcm9tKHJlZnNwZWMpOyAvLyBtaWdodCB0aHJvd1xuICAgIHRoaXMucnVsZXMucHVzaChydWxlKTtcbiAgfVxuXG4gIHRyYW5zbGF0ZShyZW1vdGVSZWZzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHRoaXMucnVsZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcmVtb3RlUmVmIG9mIHJlbW90ZVJlZnMpIHtcbiAgICAgICAgY29uc3QgbG9jYWxSZWYgPSBydWxlLnRyYW5zbGF0ZShyZW1vdGVSZWYpO1xuICAgICAgICBpZiAobG9jYWxSZWYpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChbcmVtb3RlUmVmLCBsb2NhbFJlZl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHRyYW5zbGF0ZU9uZShyZW1vdGVSZWYpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgdGhpcy5ydWxlcykge1xuICAgICAgY29uc3QgbG9jYWxSZWYgPSBydWxlLnRyYW5zbGF0ZShyZW1vdGVSZWYpO1xuICAgICAgaWYgKGxvY2FsUmVmKSB7XG4gICAgICAgIHJlc3VsdCA9IGxvY2FsUmVmO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBsb2NhbE5hbWVzcGFjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZXNcbiAgICAgIC5maWx0ZXIocnVsZSA9PiBydWxlLm1hdGNoUHJlZml4KVxuICAgICAgLm1hcChydWxlID0+IHJ1bGUubG9jYWxQYXRoLnJlcGxhY2UoL1xcLyQvLCAnJykpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGFyZVJlZk5hbWVzKGEsIGIpIHtcbiAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQwMzU1MTA3LzIxNjg0MTZcbiAgY29uc3QgX2EgPSBhLnJlcGxhY2UoL1xcXlxce1xcfSQvLCAnJyk7XG4gIGNvbnN0IF9iID0gYi5yZXBsYWNlKC9cXF5cXHtcXH0kLywgJycpO1xuICBjb25zdCB0bXAgPSAtKF9hIDwgX2IpIHx8ICsoX2EgPiBfYik7XG4gIGlmICh0bXAgPT09IDApIHtcbiAgICByZXR1cm4gYS5lbmRzV2l0aCgnXnt9JykgPyAxIDogLTFcbiAgfVxuICByZXR1cm4gdG1wXG59XG5cbmNvbnN0IG1lbW8gPSBuZXcgTWFwKCk7XG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gbWVtby5nZXQocGF0aCk7XG4gIGlmICghbm9ybWFsaXplZFBhdGgpIHtcbiAgICBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVBhdGhJbnRlcm5hbChwYXRoKTtcbiAgICBtZW1vLnNldChwYXRoLCBub3JtYWxpemVkUGF0aCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhJbnRlcm5hbChwYXRoKSB7XG4gIHBhdGggPSBwYXRoXG4gICAgLnNwbGl0KCcvLi8nKVxuICAgIC5qb2luKCcvJykgLy8gUmVwbGFjZSAnLy4vJyB3aXRoICcvJ1xuICAgIC5yZXBsYWNlKC9cXC97Mix9L2csICcvJyk7IC8vIFJlcGxhY2UgY29uc2VjdXRpdmUgJy8nXG5cbiAgaWYgKHBhdGggPT09ICcvLicpIHJldHVybiAnLycgLy8gaWYgcGF0aCA9PT0gJy8uJyByZXR1cm4gJy8nXG4gIGlmIChwYXRoID09PSAnLi8nKSByZXR1cm4gJy4nIC8vIGlmIHBhdGggPT09ICcuLycgcmV0dXJuICcuJ1xuXG4gIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy4vJykpIHBhdGggPSBwYXRoLnNsaWNlKDIpOyAvLyBSZW1vdmUgbGVhZGluZyAnLi8nXG4gIGlmIChwYXRoLmVuZHNXaXRoKCcvLicpKSBwYXRoID0gcGF0aC5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyAnLy4nXG4gIGlmIChwYXRoLmxlbmd0aCA+IDEgJiYgcGF0aC5lbmRzV2l0aCgnLycpKSBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSk7IC8vIFJlbW92ZSB0cmFpbGluZyAnLydcblxuICBpZiAocGF0aCA9PT0gJycpIHJldHVybiAnLicgLy8gaWYgcGF0aCA9PT0gJycgcmV0dXJuICcuJ1xuXG4gIHJldHVybiBwYXRoXG59XG5cbi8vIEZvciBzb21lIHJlYXNvbiBwYXRoLnBvc2l4LmpvaW4gaXMgdW5kZWZpbmVkIGluIHdlYnBhY2tcblxuZnVuY3Rpb24gam9pbiguLi5wYXJ0cykge1xuICByZXR1cm4gbm9ybWFsaXplUGF0aChwYXJ0cy5tYXAobm9ybWFsaXplUGF0aCkuam9pbignLycpKVxufVxuXG4vLyBUaGlzIGlzIHN0cmFpZ2h0IGZyb20gcGFyc2VfdW5pdF9mYWN0b3IgaW4gY29uZmlnLmMgb2YgY2Fub25pY2FsIGdpdFxuY29uc3QgbnVtID0gdmFsID0+IHtcbiAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gIGxldCBuID0gcGFyc2VJbnQodmFsKTtcbiAgaWYgKHZhbC5lbmRzV2l0aCgnaycpKSBuICo9IDEwMjQ7XG4gIGlmICh2YWwuZW5kc1dpdGgoJ20nKSkgbiAqPSAxMDI0ICogMTAyNDtcbiAgaWYgKHZhbC5lbmRzV2l0aCgnZycpKSBuICo9IDEwMjQgKiAxMDI0ICogMTAyNDtcbiAgcmV0dXJuIG5cbn07XG5cbi8vIFRoaXMgaXMgc3RyYWlnaHQgZnJvbSBnaXRfcGFyc2VfbWF5YmVfYm9vbF90ZXh0IGluIGNvbmZpZy5jIG9mIGNhbm9uaWNhbCBnaXRcbmNvbnN0IGJvb2wgPSB2YWwgPT4ge1xuICB2YWwgPSB2YWwudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh2YWwgPT09ICd0cnVlJyB8fCB2YWwgPT09ICd5ZXMnIHx8IHZhbCA9PT0gJ29uJykgcmV0dXJuIHRydWVcbiAgaWYgKHZhbCA9PT0gJ2ZhbHNlJyB8fCB2YWwgPT09ICdubycgfHwgdmFsID09PSAnb2ZmJykgcmV0dXJuIGZhbHNlXG4gIHRocm93IEVycm9yKFxuICAgIGBFeHBlY3RlZCAndHJ1ZScsICdmYWxzZScsICd5ZXMnLCAnbm8nLCAnb24nLCBvciAnb2ZmJywgYnV0IGdvdCAke3ZhbH1gXG4gIClcbn07XG5cbmNvbnN0IHNjaGVtYSA9IHtcbiAgY29yZToge1xuICAgIGZpbGVtb2RlOiBib29sLFxuICAgIGJhcmU6IGJvb2wsXG4gICAgbG9nYWxscmVmdXBkYXRlczogYm9vbCxcbiAgICBzeW1saW5rczogYm9vbCxcbiAgICBpZ25vcmVjYXNlOiBib29sLFxuICAgIGJpZ0ZpbGVUaHJlc2hvbGQ6IG51bSxcbiAgfSxcbn07XG5cbi8vIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtY29uZmlnI19zeW50YXhcblxuLy8gc2VjdGlvbiBzdGFydHMgd2l0aCBbIGFuZCBlbmRzIHdpdGggXVxuLy8gc2VjdGlvbiBpcyBhbHBoYW51bWVyaWMgKEFTQ0lJKSB3aXRoIC0gYW5kIC5cbi8vIHNlY3Rpb24gaXMgY2FzZSBpbnNlbnNpdGl2ZVxuLy8gc3Vic2VjdGlvbiBpcyBvcHRpb25hbFxuLy8gc3Vic2VjdGlvbiBpcyBzcGVjaWZpZWQgYWZ0ZXIgc2VjdGlvbiBhbmQgb25lIG9yIG1vcmUgc3BhY2VzXG4vLyBzdWJzZWN0aW9uIGlzIHNwZWNpZmllZCBiZXR3ZWVuIGRvdWJsZSBxdW90ZXNcbmNvbnN0IFNFQ1RJT05fTElORV9SRUdFWCA9IC9eXFxbKFtBLVphLXowLTktLl0rKSg/OiBcIiguKilcIik/XFxdJC87XG5jb25zdCBTRUNUSU9OX1JFR0VYID0gL15bQS1aYS16MC05LS5dKyQvO1xuXG4vLyB2YXJpYWJsZSBsaW5lcyBjb250YWluIGEgbmFtZSwgYW5kIGVxdWFsIHNpZ24gYW5kIHRoZW4gYSB2YWx1ZVxuLy8gdmFyaWFibGUgbGluZXMgY2FuIGFsc28gb25seSBjb250YWluIGEgbmFtZSAodGhlIGltcGxpY2l0IHZhbHVlIGlzIGEgYm9vbGVhbiB0cnVlKVxuLy8gdmFyaWFibGUgbmFtZSBpcyBhbHBoYW51bWVyaWMgKEFTQ0lJKSB3aXRoIC1cbi8vIHZhcmlhYmxlIG5hbWUgc3RhcnRzIHdpdGggYW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXJcbi8vIHZhcmlhYmxlIG5hbWUgaXMgY2FzZSBpbnNlbnNpdGl2ZVxuY29uc3QgVkFSSUFCTEVfTElORV9SRUdFWCA9IC9eKFtBLVphLXpdW0EtWmEtei1dKikoPzogKj0gKiguKikpPyQvO1xuY29uc3QgVkFSSUFCTEVfTkFNRV9SRUdFWCA9IC9eW0EtWmEtel1bQS1aYS16LV0qJC87XG5cbmNvbnN0IFZBUklBQkxFX1ZBTFVFX0NPTU1FTlRfUkVHRVggPSAvXiguKj8pKCAqWyM7XS4qKSQvO1xuXG5jb25zdCBleHRyYWN0U2VjdGlvbkxpbmUgPSBsaW5lID0+IHtcbiAgY29uc3QgbWF0Y2hlcyA9IFNFQ1RJT05fTElORV9SRUdFWC5leGVjKGxpbmUpO1xuICBpZiAobWF0Y2hlcyAhPSBudWxsKSB7XG4gICAgY29uc3QgW3NlY3Rpb24sIHN1YnNlY3Rpb25dID0gbWF0Y2hlcy5zbGljZSgxKTtcbiAgICByZXR1cm4gW3NlY3Rpb24sIHN1YnNlY3Rpb25dXG4gIH1cbiAgcmV0dXJuIG51bGxcbn07XG5cbmNvbnN0IGV4dHJhY3RWYXJpYWJsZUxpbmUgPSBsaW5lID0+IHtcbiAgY29uc3QgbWF0Y2hlcyA9IFZBUklBQkxFX0xJTkVfUkVHRVguZXhlYyhsaW5lKTtcbiAgaWYgKG1hdGNoZXMgIT0gbnVsbCkge1xuICAgIGNvbnN0IFtuYW1lLCByYXdWYWx1ZSA9ICd0cnVlJ10gPSBtYXRjaGVzLnNsaWNlKDEpO1xuICAgIGNvbnN0IHZhbHVlV2l0aG91dENvbW1lbnRzID0gcmVtb3ZlQ29tbWVudHMocmF3VmFsdWUpO1xuICAgIGNvbnN0IHZhbHVlV2l0aG91dFF1b3RlcyA9IHJlbW92ZVF1b3Rlcyh2YWx1ZVdpdGhvdXRDb21tZW50cyk7XG4gICAgcmV0dXJuIFtuYW1lLCB2YWx1ZVdpdGhvdXRRdW90ZXNdXG4gIH1cbiAgcmV0dXJuIG51bGxcbn07XG5cbmNvbnN0IHJlbW92ZUNvbW1lbnRzID0gcmF3VmFsdWUgPT4ge1xuICBjb25zdCBjb21tZW50TWF0Y2hlcyA9IFZBUklBQkxFX1ZBTFVFX0NPTU1FTlRfUkVHRVguZXhlYyhyYXdWYWx1ZSk7XG4gIGlmIChjb21tZW50TWF0Y2hlcyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHJhd1ZhbHVlXG4gIH1cbiAgY29uc3QgW3ZhbHVlV2l0aG91dENvbW1lbnQsIGNvbW1lbnRdID0gY29tbWVudE1hdGNoZXMuc2xpY2UoMSk7XG4gIC8vIGlmIG9kZCBudW1iZXIgb2YgcXVvdGVzIGJlZm9yZSBhbmQgYWZ0ZXIgY29tbWVudCA9PiBjb21tZW50IGlzIGVzY2FwZWRcbiAgaWYgKFxuICAgIGhhc09kZE51bWJlck9mUXVvdGVzKHZhbHVlV2l0aG91dENvbW1lbnQpICYmXG4gICAgaGFzT2RkTnVtYmVyT2ZRdW90ZXMoY29tbWVudClcbiAgKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlV2l0aG91dENvbW1lbnR9JHtjb21tZW50fWBcbiAgfVxuICByZXR1cm4gdmFsdWVXaXRob3V0Q29tbWVudFxufTtcblxuY29uc3QgaGFzT2RkTnVtYmVyT2ZRdW90ZXMgPSB0ZXh0ID0+IHtcbiAgY29uc3QgbnVtYmVyT2ZRdW90ZXMgPSAodGV4dC5tYXRjaCgvKD86XnxbXlxcXFxdKVwiL2cpIHx8IFtdKS5sZW5ndGg7XG4gIHJldHVybiBudW1iZXJPZlF1b3RlcyAlIDIgIT09IDBcbn07XG5cbmNvbnN0IHJlbW92ZVF1b3RlcyA9IHRleHQgPT4ge1xuICByZXR1cm4gdGV4dC5zcGxpdCgnJykucmVkdWNlKChuZXdUZXh0LCBjLCBpZHgsIHRleHQpID0+IHtcbiAgICBjb25zdCBpc1F1b3RlID0gYyA9PT0gJ1wiJyAmJiB0ZXh0W2lkeCAtIDFdICE9PSAnXFxcXCc7XG4gICAgY29uc3QgaXNFc2NhcGVGb3JRdW90ZSA9IGMgPT09ICdcXFxcJyAmJiB0ZXh0W2lkeCArIDFdID09PSAnXCInO1xuICAgIGlmIChpc1F1b3RlIHx8IGlzRXNjYXBlRm9yUXVvdGUpIHtcbiAgICAgIHJldHVybiBuZXdUZXh0XG4gICAgfVxuICAgIHJldHVybiBuZXdUZXh0ICsgY1xuICB9LCAnJylcbn07XG5cbmNvbnN0IGxvd2VyID0gdGV4dCA9PiB7XG4gIHJldHVybiB0ZXh0ICE9IG51bGwgPyB0ZXh0LnRvTG93ZXJDYXNlKCkgOiBudWxsXG59O1xuXG5jb25zdCBnZXRQYXRoID0gKHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpID0+IHtcbiAgcmV0dXJuIFtsb3dlcihzZWN0aW9uKSwgc3Vic2VjdGlvbiwgbG93ZXIobmFtZSldXG4gICAgLmZpbHRlcihhID0+IGEgIT0gbnVsbClcbiAgICAuam9pbignLicpXG59O1xuXG5jb25zdCBub3JtYWxpemVQYXRoJDEgPSBwYXRoID0+IHtcbiAgY29uc3QgcGF0aFNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICBjb25zdCBzZWN0aW9uID0gcGF0aFNlZ21lbnRzLnNoaWZ0KCk7XG4gIGNvbnN0IG5hbWUgPSBwYXRoU2VnbWVudHMucG9wKCk7XG4gIGNvbnN0IHN1YnNlY3Rpb24gPSBwYXRoU2VnbWVudHMubGVuZ3RoID8gcGF0aFNlZ21lbnRzLmpvaW4oJy4nKSA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIHNlY3Rpb24sXG4gICAgc3Vic2VjdGlvbixcbiAgICBuYW1lLFxuICAgIHBhdGg6IGdldFBhdGgoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSksXG4gICAgc2VjdGlvblBhdGg6IGdldFBhdGgoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbnVsbCksXG4gIH1cbn07XG5cbmNvbnN0IGZpbmRMYXN0SW5kZXggPSAoYXJyYXksIGNhbGxiYWNrKSA9PiB7XG4gIHJldHVybiBhcnJheS5yZWR1Y2UoKGxhc3RJbmRleCwgaXRlbSwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soaXRlbSkgPyBpbmRleCA6IGxhc3RJbmRleFxuICB9LCAtMSlcbn07XG5cbi8vIE5vdGU6IHRoZXJlIGFyZSBhIExPVCBvZiBlZGdlIGNhc2VzIHRoYXQgYXJlbid0IGNvdmVyZWQgKGUuZy4ga2V5cyBpbiBzZWN0aW9ucyB0aGF0IGFsc29cbi8vIGhhdmUgc3Vic2VjdGlvbnMsIFtpbmNsdWRlXSBkaXJlY3RpdmVzLCBldGMuXG5jbGFzcyBHaXRDb25maWcge1xuICBjb25zdHJ1Y3Rvcih0ZXh0KSB7XG4gICAgbGV0IHNlY3Rpb24gPSBudWxsO1xuICAgIGxldCBzdWJzZWN0aW9uID0gbnVsbDtcbiAgICB0aGlzLnBhcnNlZENvbmZpZyA9IHRleHQuc3BsaXQoJ1xcbicpLm1hcChsaW5lID0+IHtcbiAgICAgIGxldCBuYW1lID0gbnVsbDtcbiAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG5cbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgICBjb25zdCBleHRyYWN0ZWRTZWN0aW9uID0gZXh0cmFjdFNlY3Rpb25MaW5lKHRyaW1tZWRMaW5lKTtcbiAgICAgIGNvbnN0IGlzU2VjdGlvbiA9IGV4dHJhY3RlZFNlY3Rpb24gIT0gbnVsbDtcbiAgICAgIGlmIChpc1NlY3Rpb24pIHtcbiAgICAgICAgO1tzZWN0aW9uLCBzdWJzZWN0aW9uXSA9IGV4dHJhY3RlZFNlY3Rpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBleHRyYWN0ZWRWYXJpYWJsZSA9IGV4dHJhY3RWYXJpYWJsZUxpbmUodHJpbW1lZExpbmUpO1xuICAgICAgICBjb25zdCBpc1ZhcmlhYmxlID0gZXh0cmFjdGVkVmFyaWFibGUgIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzVmFyaWFibGUpIHtcbiAgICAgICAgICA7W25hbWUsIHZhbHVlXSA9IGV4dHJhY3RlZFZhcmlhYmxlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpO1xuICAgICAgcmV0dXJuIHsgbGluZSwgaXNTZWN0aW9uLCBzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lLCB2YWx1ZSwgcGF0aCB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbSh0ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBHaXRDb25maWcodGV4dClcbiAgfVxuXG4gIGFzeW5jIGdldChwYXRoLCBnZXRhbGwgPSBmYWxzZSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aCQxKHBhdGgpLnBhdGg7XG4gICAgY29uc3QgYWxsVmFsdWVzID0gdGhpcy5wYXJzZWRDb25maWdcbiAgICAgIC5maWx0ZXIoY29uZmlnID0+IGNvbmZpZy5wYXRoID09PSBub3JtYWxpemVkUGF0aClcbiAgICAgIC5tYXAoKHsgc2VjdGlvbiwgbmFtZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICBjb25zdCBmbiA9IHNjaGVtYVtzZWN0aW9uXSAmJiBzY2hlbWFbc2VjdGlvbl1bbmFtZV07XG4gICAgICAgIHJldHVybiBmbiA/IGZuKHZhbHVlKSA6IHZhbHVlXG4gICAgICB9KTtcbiAgICByZXR1cm4gZ2V0YWxsID8gYWxsVmFsdWVzIDogYWxsVmFsdWVzLnBvcCgpXG4gIH1cblxuICBhc3luYyBnZXRhbGwocGF0aCkge1xuICAgIHJldHVybiB0aGlzLmdldChwYXRoLCB0cnVlKVxuICB9XG5cbiAgYXN5bmMgZ2V0U3Vic2VjdGlvbnMoc2VjdGlvbikge1xuICAgIHJldHVybiB0aGlzLnBhcnNlZENvbmZpZ1xuICAgICAgLmZpbHRlcihjb25maWcgPT4gY29uZmlnLnNlY3Rpb24gPT09IHNlY3Rpb24gJiYgY29uZmlnLmlzU2VjdGlvbilcbiAgICAgIC5tYXAoY29uZmlnID0+IGNvbmZpZy5zdWJzZWN0aW9uKVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2VjdGlvbihzZWN0aW9uLCBzdWJzZWN0aW9uKSB7XG4gICAgdGhpcy5wYXJzZWRDb25maWcgPSB0aGlzLnBhcnNlZENvbmZpZy5maWx0ZXIoXG4gICAgICBjb25maWcgPT5cbiAgICAgICAgIShjb25maWcuc2VjdGlvbiA9PT0gc2VjdGlvbiAmJiBjb25maWcuc3Vic2VjdGlvbiA9PT0gc3Vic2VjdGlvbilcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYXBwZW5kKHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KHBhdGgsIHZhbHVlLCB0cnVlKVxuICB9XG5cbiAgYXN5bmMgc2V0KHBhdGgsIHZhbHVlLCBhcHBlbmQgPSBmYWxzZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNlY3Rpb24sXG4gICAgICBzdWJzZWN0aW9uLFxuICAgICAgbmFtZSxcbiAgICAgIHBhdGg6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgc2VjdGlvblBhdGgsXG4gICAgfSA9IG5vcm1hbGl6ZVBhdGgkMShwYXRoKTtcbiAgICBjb25zdCBjb25maWdJbmRleCA9IGZpbmRMYXN0SW5kZXgoXG4gICAgICB0aGlzLnBhcnNlZENvbmZpZyxcbiAgICAgIGNvbmZpZyA9PiBjb25maWcucGF0aCA9PT0gbm9ybWFsaXplZFBhdGhcbiAgICApO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBpZiAoY29uZmlnSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMucGFyc2VkQ29uZmlnLnNwbGljZShjb25maWdJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb25maWdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5wYXJzZWRDb25maWdbY29uZmlnSW5kZXhdO1xuICAgICAgICAvLyBOYW1lIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBpbiBjYXNlIHRoZSBjYXNpbmcgY2hhbmdlZFxuICAgICAgICBjb25zdCBtb2RpZmllZENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZywge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbW9kaWZpZWQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYXBwZW5kKSB7XG4gICAgICAgICAgdGhpcy5wYXJzZWRDb25maWcuc3BsaWNlKGNvbmZpZ0luZGV4ICsgMSwgMCwgbW9kaWZpZWRDb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGFyc2VkQ29uZmlnW2NvbmZpZ0luZGV4XSA9IG1vZGlmaWVkQ29uZmlnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZWN0aW9uSW5kZXggPSB0aGlzLnBhcnNlZENvbmZpZy5maW5kSW5kZXgoXG4gICAgICAgICAgY29uZmlnID0+IGNvbmZpZy5wYXRoID09PSBzZWN0aW9uUGF0aFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBuZXdDb25maWcgPSB7XG4gICAgICAgICAgc2VjdGlvbixcbiAgICAgICAgICBzdWJzZWN0aW9uLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbW9kaWZpZWQ6IHRydWUsXG4gICAgICAgICAgcGF0aDogbm9ybWFsaXplZFBhdGgsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChTRUNUSU9OX1JFR0VYLnRlc3Qoc2VjdGlvbikgJiYgVkFSSUFCTEVfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgaWYgKHNlY3Rpb25JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAvLyBSZXVzZSBleGlzdGluZyBzZWN0aW9uXG4gICAgICAgICAgICB0aGlzLnBhcnNlZENvbmZpZy5zcGxpY2Uoc2VjdGlvbkluZGV4ICsgMSwgMCwgbmV3Q29uZmlnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkIGEgbmV3IHNlY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IG5ld1NlY3Rpb24gPSB7XG4gICAgICAgICAgICAgIHNlY3Rpb24sXG4gICAgICAgICAgICAgIHN1YnNlY3Rpb24sXG4gICAgICAgICAgICAgIG1vZGlmaWVkOiB0cnVlLFxuICAgICAgICAgICAgICBwYXRoOiBzZWN0aW9uUGF0aCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnBhcnNlZENvbmZpZy5wdXNoKG5ld1NlY3Rpb24sIG5ld0NvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VkQ29uZmlnXG4gICAgICAubWFwKCh7IGxpbmUsIHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUsIHZhbHVlLCBtb2RpZmllZCA9IGZhbHNlIH0pID0+IHtcbiAgICAgICAgaWYgKCFtb2RpZmllZCkge1xuICAgICAgICAgIHJldHVybiBsaW5lXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgL1sjO10vLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBBIGAjYCBvciBgO2Agc3ltYm9sIGRlbm90ZXMgYSBjb21tZW50LCBzbyB3ZSBoYXZlIHRvIHdyYXAgaXQgaW4gZG91YmxlIHF1b3Rlc1xuICAgICAgICAgICAgcmV0dXJuIGBcXHQke25hbWV9ID0gXCIke3ZhbHVlfVwiYFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYFxcdCR7bmFtZX0gPSAke3ZhbHVlfWBcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3Vic2VjdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGBbJHtzZWN0aW9ufSBcIiR7c3Vic2VjdGlvbn1cIl1gXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBbJHtzZWN0aW9ufV1gXG4gICAgICB9KVxuICAgICAgLmpvaW4oJ1xcbicpXG4gIH1cbn1cblxuY2xhc3MgR2l0Q29uZmlnTWFuYWdlciB7XG4gIHN0YXRpYyBhc3luYyBnZXQoeyBmcywgZ2l0ZGlyIH0pIHtcbiAgICAvLyBXZSBjYW4gaW1wcm92ZSBlZmZpY2llbmN5IGxhdGVyIGlmIG5lZWRlZC5cbiAgICAvLyBUT0RPOiByZWFkIGZyb20gZnVsbCBsaXN0IG9mIGdpdCBjb25maWcgZmlsZXNcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgZnMucmVhZChgJHtnaXRkaXJ9L2NvbmZpZ2AsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcbiAgICByZXR1cm4gR2l0Q29uZmlnLmZyb20odGV4dClcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBzYXZlKHsgZnMsIGdpdGRpciwgY29uZmlnIH0pIHtcbiAgICAvLyBXZSBjYW4gaW1wcm92ZSBlZmZpY2llbmN5IGxhdGVyIGlmIG5lZWRlZC5cbiAgICAvLyBUT0RPOiBoYW5kbGUgc2F2aW5nIHRvIHRoZSBjb3JyZWN0IGdsb2JhbC91c2VyL3JlcG8gbG9jYXRpb25cbiAgICBhd2FpdCBmcy53cml0ZShgJHtnaXRkaXJ9L2NvbmZpZ2AsIGNvbmZpZy50b1N0cmluZygpLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICB9XG59XG5cbi8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzIGluIHRoZSAncmVmcycgZGlyZWN0b3J5LlxuXG4vLyBAc2VlIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtcmV2LXBhcnNlLmh0bWwjX3NwZWNpZnlpbmdfcmV2aXNpb25zXG5jb25zdCByZWZwYXRocyA9IHJlZiA9PiBbXG4gIGAke3JlZn1gLFxuICBgcmVmcy8ke3JlZn1gLFxuICBgcmVmcy90YWdzLyR7cmVmfWAsXG4gIGByZWZzL2hlYWRzLyR7cmVmfWAsXG4gIGByZWZzL3JlbW90ZXMvJHtyZWZ9YCxcbiAgYHJlZnMvcmVtb3Rlcy8ke3JlZn0vSEVBRGAsXG5dO1xuXG4vLyBAc2VlIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXRyZXBvc2l0b3J5LWxheW91dFxuY29uc3QgR0lUX0ZJTEVTID0gWydjb25maWcnLCAnZGVzY3JpcHRpb24nLCAnaW5kZXgnLCAnc2hhbGxvdycsICdjb21tb25kaXInXTtcblxubGV0IGxvY2skMTtcblxuYXN5bmMgZnVuY3Rpb24gYWNxdWlyZUxvY2socmVmLCBjYWxsYmFjaykge1xuICBpZiAobG9jayQxID09PSB1bmRlZmluZWQpIGxvY2skMSA9IG5ldyBBc3luY0xvY2soKTtcbiAgcmV0dXJuIGxvY2skMS5hY3F1aXJlKHJlZiwgY2FsbGJhY2spXG59XG5cbmNsYXNzIEdpdFJlZk1hbmFnZXIge1xuICBzdGF0aWMgYXN5bmMgdXBkYXRlUmVtb3RlUmVmcyh7XG4gICAgZnMsXG4gICAgZ2l0ZGlyLFxuICAgIHJlbW90ZSxcbiAgICByZWZzLFxuICAgIHN5bXJlZnMsXG4gICAgdGFncyxcbiAgICByZWZzcGVjcyA9IHVuZGVmaW5lZCxcbiAgICBwcnVuZSA9IGZhbHNlLFxuICAgIHBydW5lVGFncyA9IGZhbHNlLFxuICB9KSB7XG4gICAgLy8gVmFsaWRhdGUgaW5wdXRcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlZnMudmFsdWVzKCkpIHtcbiAgICAgIGlmICghdmFsdWUubWF0Y2goL1swLTlhLWZdezQwfS8pKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkT2lkRXJyb3IodmFsdWUpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuZ2V0KHsgZnMsIGdpdGRpciB9KTtcbiAgICBpZiAoIXJlZnNwZWNzKSB7XG4gICAgICByZWZzcGVjcyA9IGF3YWl0IGNvbmZpZy5nZXRhbGwoYHJlbW90ZS4ke3JlbW90ZX0uZmV0Y2hgKTtcbiAgICAgIGlmIChyZWZzcGVjcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vUmVmc3BlY0Vycm9yKHJlbW90ZSlcbiAgICAgIH1cbiAgICAgIC8vIFRoZXJlJ3Mgc29tZSBpbnRlcmVzdGluZyBiZWhhdmlvciB3aXRoIEhFQUQgdGhhdCBkb2Vzbid0IGZvbGxvdyB0aGUgcmVmc3BlYy5cbiAgICAgIHJlZnNwZWNzLnVuc2hpZnQoYCtIRUFEOnJlZnMvcmVtb3Rlcy8ke3JlbW90ZX0vSEVBRGApO1xuICAgIH1cbiAgICBjb25zdCByZWZzcGVjID0gR2l0UmVmU3BlY1NldC5mcm9tKHJlZnNwZWNzKTtcbiAgICBjb25zdCBhY3R1YWxSZWZzVG9Xcml0ZSA9IG5ldyBNYXAoKTtcbiAgICAvLyBEZWxldGUgYWxsIGN1cnJlbnQgdGFncyBpZiB0aGUgcHJ1bmVUYWdzIGFyZ3VtZW50IGlzIHRydWUuXG4gICAgaWYgKHBydW5lVGFncykge1xuICAgICAgY29uc3QgdGFncyA9IGF3YWl0IEdpdFJlZk1hbmFnZXIubGlzdFJlZnMoe1xuICAgICAgICBmcyxcbiAgICAgICAgZ2l0ZGlyLFxuICAgICAgICBmaWxlcGF0aDogJ3JlZnMvdGFncycsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IEdpdFJlZk1hbmFnZXIuZGVsZXRlUmVmcyh7XG4gICAgICAgIGZzLFxuICAgICAgICBnaXRkaXIsXG4gICAgICAgIHJlZnM6IHRhZ3MubWFwKHRhZyA9PiBgcmVmcy90YWdzLyR7dGFnfWApLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEFkZCBhbGwgdGFncyBpZiB0aGUgZmV0Y2ggdGFncyBhcmd1bWVudCBpcyB0cnVlLlxuICAgIGlmICh0YWdzKSB7XG4gICAgICBmb3IgKGNvbnN0IHNlcnZlclJlZiBvZiByZWZzLmtleXMoKSkge1xuICAgICAgICBpZiAoc2VydmVyUmVmLnN0YXJ0c1dpdGgoJ3JlZnMvdGFncycpICYmICFzZXJ2ZXJSZWYuZW5kc1dpdGgoJ157fScpKSB7XG4gICAgICAgICAgLy8gR2l0J3MgYmVoYXZpb3IgaXMgdG8gb25seSBmZXRjaCB0YWdzIHRoYXQgZG8gbm90IGNvbmZsaWN0IHdpdGggdGFncyBhbHJlYWR5IHByZXNlbnQuXG4gICAgICAgICAgaWYgKCEoYXdhaXQgR2l0UmVmTWFuYWdlci5leGlzdHMoeyBmcywgZ2l0ZGlyLCByZWY6IHNlcnZlclJlZiB9KSkpIHtcbiAgICAgICAgICAgIC8vIEFsd2F5cyB1c2UgdGhlIG9iamVjdCBpZCBvZiB0aGUgdGFnIGl0c2VsZiwgYW5kIG5vdCB0aGUgcGVlbGVkIG9iamVjdCBpZC5cbiAgICAgICAgICAgIGNvbnN0IG9pZCA9IHJlZnMuZ2V0KHNlcnZlclJlZik7XG4gICAgICAgICAgICBhY3R1YWxSZWZzVG9Xcml0ZS5zZXQoc2VydmVyUmVmLCBvaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBDb21iaW5lIHJlZnMgYW5kIHN5bXJlZnMgZ2l2aW5nIHN5bXJlZnMgcHJpb3JpdHlcbiAgICBjb25zdCByZWZUcmFuc2xhdGlvbnMgPSByZWZzcGVjLnRyYW5zbGF0ZShbLi4ucmVmcy5rZXlzKCldKTtcbiAgICBmb3IgKGNvbnN0IFtzZXJ2ZXJSZWYsIHRyYW5zbGF0ZWRSZWZdIG9mIHJlZlRyYW5zbGF0aW9ucykge1xuICAgICAgY29uc3QgdmFsdWUgPSByZWZzLmdldChzZXJ2ZXJSZWYpO1xuICAgICAgYWN0dWFsUmVmc1RvV3JpdGUuc2V0KHRyYW5zbGF0ZWRSZWYsIHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3Qgc3ltcmVmVHJhbnNsYXRpb25zID0gcmVmc3BlYy50cmFuc2xhdGUoWy4uLnN5bXJlZnMua2V5cygpXSk7XG4gICAgZm9yIChjb25zdCBbc2VydmVyUmVmLCB0cmFuc2xhdGVkUmVmXSBvZiBzeW1yZWZUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gc3ltcmVmcy5nZXQoc2VydmVyUmVmKTtcbiAgICAgIGNvbnN0IHN5bXRhcmdldCA9IHJlZnNwZWMudHJhbnNsYXRlT25lKHZhbHVlKTtcbiAgICAgIGlmIChzeW10YXJnZXQpIHtcbiAgICAgICAgYWN0dWFsUmVmc1RvV3JpdGUuc2V0KHRyYW5zbGF0ZWRSZWYsIGByZWY6ICR7c3ltdGFyZ2V0fWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBgcHJ1bmVgIGFyZ3VtZW50IGlzIHRydWUsIGNsZWFyIG91dCB0aGUgZXhpc3RpbmcgbG9jYWwgcmVmc3BlYyByb290c1xuICAgIGNvbnN0IHBydW5lZCA9IFtdO1xuICAgIGlmIChwcnVuZSkge1xuICAgICAgZm9yIChjb25zdCBmaWxlcGF0aCBvZiByZWZzcGVjLmxvY2FsTmFtZXNwYWNlcygpKSB7XG4gICAgICAgIGNvbnN0IHJlZnMgPSAoXG4gICAgICAgICAgYXdhaXQgR2l0UmVmTWFuYWdlci5saXN0UmVmcyh7XG4gICAgICAgICAgICBmcyxcbiAgICAgICAgICAgIGdpdGRpcixcbiAgICAgICAgICAgIGZpbGVwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICkubWFwKGZpbGUgPT4gYCR7ZmlsZXBhdGh9LyR7ZmlsZX1gKTtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgcmVmcykge1xuICAgICAgICAgIGlmICghYWN0dWFsUmVmc1RvV3JpdGUuaGFzKHJlZikpIHtcbiAgICAgICAgICAgIHBydW5lZC5wdXNoKHJlZik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJ1bmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgR2l0UmVmTWFuYWdlci5kZWxldGVSZWZzKHsgZnMsIGdpdGRpciwgcmVmczogcHJ1bmVkIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBVcGRhdGUgZmlsZXNcbiAgICAvLyBUT0RPOiBGb3IgbGFyZ2UgcmVwb3Mgd2l0aCBhIGhpc3Rvcnkgb2YgdGhvdXNhbmRzIG9mIHB1bGwgcmVxdWVzdHNcbiAgICAvLyAoaS5lLiBnaXRsYWItY2UpIGl0IHdvdWxkIGJlIHZhc3RseSBtb3JlIGVmZmljaWVudCB0byB3cml0ZSB0aGVtXG4gICAgLy8gdG8gLmdpdC9wYWNrZWQtcmVmcy5cbiAgICAvLyBUaGUgdHJpY2sgaXMgdG8gbWFrZSBzdXJlIHdlIGEpIGRvbid0IHdyaXRlIGEgcGFja2VkIHJlZiB0aGF0IGlzXG4gICAgLy8gYWxyZWFkeSBzaGFkb3dlZCBieSBhIGxvb3NlIHJlZiBhbmQgYikgZG9uJ3QgbG9vc2UgYW55IHJlZnMgYWxyZWFkeVxuICAgIC8vIGluIHBhY2tlZC1yZWZzLiBEb2luZyB0aGlzIGVmZmljaWVudGx5IG1heSBiZSBkaWZmaWN1bHQuIEFcbiAgICAvLyBzb2x1dGlvbiB0aGF0IG1pZ2h0IHdvcmsgaXNcbiAgICAvLyBhKSBsb2FkIHRoZSBjdXJyZW50IHBhY2tlZC1yZWZzIGZpbGVcbiAgICAvLyBiKSBhZGQgYWN0dWFsUmVmc1RvV3JpdGUsIG92ZXJyaWRpbmcgdGhlIGV4aXN0aW5nIHZhbHVlcyBpZiBwcmVzZW50XG4gICAgLy8gYykgZW51bWVyYXRlIGFsbCB0aGUgbG9vc2UgcmVmcyBjdXJyZW50bHkgaW4gLmdpdC9yZWZzL3JlbW90ZXMvJHtyZW1vdGV9XG4gICAgLy8gZCkgb3ZlcndyaXRlIHRoZWlyIHZhbHVlIHdpdGggdGhlIG5ldyB2YWx1ZS5cbiAgICAvLyBFeGFtcGxlcyBvZiByZWZzIHdlIG5lZWQgdG8gYXZvaWQgd3JpdGluZyBpbiBsb29zZSBmb3JtYXQgZm9yIGVmZmljaWVueSdzIHNha2VcbiAgICAvLyBhcmUgLmdpdC9yZWZzL3JlbW90ZXMvb3JpZ2luL3JlZnMvcmVtb3Rlcy9yZW1vdGVfbWlycm9yXzMwNTlcbiAgICAvLyBhbmQgLmdpdC9yZWZzL3JlbW90ZXMvb3JpZ2luL3JlZnMvbWVyZ2UtcmVxdWVzdHNcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhY3R1YWxSZWZzVG9Xcml0ZSkge1xuICAgICAgYXdhaXQgYWNxdWlyZUxvY2soa2V5LCBhc3luYyAoKSA9PlxuICAgICAgICBmcy53cml0ZShqb2luKGdpdGRpciwga2V5KSwgYCR7dmFsdWUudHJpbSgpfVxcbmAsICd1dGY4JylcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IHBydW5lZCB9XG4gIH1cblxuICAvLyBUT0RPOiBtYWtlIHRoaXMgbGVzcyBjcnVkZT9cbiAgc3RhdGljIGFzeW5jIHdyaXRlUmVmKHsgZnMsIGdpdGRpciwgcmVmLCB2YWx1ZSB9KSB7XG4gICAgLy8gVmFsaWRhdGUgaW5wdXRcbiAgICBpZiAoIXZhbHVlLm1hdGNoKC9bMC05YS1mXXs0MH0vKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRPaWRFcnJvcih2YWx1ZSlcbiAgICB9XG4gICAgYXdhaXQgYWNxdWlyZUxvY2socmVmLCBhc3luYyAoKSA9PlxuICAgICAgZnMud3JpdGUoam9pbihnaXRkaXIsIHJlZiksIGAke3ZhbHVlLnRyaW0oKX1cXG5gLCAndXRmOCcpXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB3cml0ZVN5bWJvbGljUmVmKHsgZnMsIGdpdGRpciwgcmVmLCB2YWx1ZSB9KSB7XG4gICAgYXdhaXQgYWNxdWlyZUxvY2socmVmLCBhc3luYyAoKSA9PlxuICAgICAgZnMud3JpdGUoam9pbihnaXRkaXIsIHJlZiksICdyZWY6ICcgKyBgJHt2YWx1ZS50cmltKCl9XFxuYCwgJ3V0ZjgnKVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZGVsZXRlUmVmKHsgZnMsIGdpdGRpciwgcmVmIH0pIHtcbiAgICByZXR1cm4gR2l0UmVmTWFuYWdlci5kZWxldGVSZWZzKHsgZnMsIGdpdGRpciwgcmVmczogW3JlZl0gfSlcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVSZWZzKHsgZnMsIGdpdGRpciwgcmVmcyB9KSB7XG4gICAgLy8gRGVsZXRlIHJlZ3VsYXIgcmVmXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocmVmcy5tYXAocmVmID0+IGZzLnJtKGpvaW4oZ2l0ZGlyLCByZWYpKSkpO1xuICAgIC8vIERlbGV0ZSBhbnkgcGFja2VkIHJlZlxuICAgIGxldCB0ZXh0ID0gYXdhaXQgYWNxdWlyZUxvY2soJ3BhY2tlZC1yZWZzJywgYXN5bmMgKCkgPT5cbiAgICAgIGZzLnJlYWQoYCR7Z2l0ZGlyfS9wYWNrZWQtcmVmc2AsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KVxuICAgICk7XG4gICAgY29uc3QgcGFja2VkID0gR2l0UGFja2VkUmVmcy5mcm9tKHRleHQpO1xuICAgIGNvbnN0IGJlZm9yZVNpemUgPSBwYWNrZWQucmVmcy5zaXplO1xuICAgIGZvciAoY29uc3QgcmVmIG9mIHJlZnMpIHtcbiAgICAgIGlmIChwYWNrZWQucmVmcy5oYXMocmVmKSkge1xuICAgICAgICBwYWNrZWQuZGVsZXRlKHJlZik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYWNrZWQucmVmcy5zaXplIDwgYmVmb3JlU2l6ZSkge1xuICAgICAgdGV4dCA9IHBhY2tlZC50b1N0cmluZygpO1xuICAgICAgYXdhaXQgYWNxdWlyZUxvY2soJ3BhY2tlZC1yZWZzJywgYXN5bmMgKCkgPT5cbiAgICAgICAgZnMud3JpdGUoYCR7Z2l0ZGlyfS9wYWNrZWQtcmVmc2AsIHRleHQsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVmXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5kZXB0aF1cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXNvbHZlKHsgZnMsIGdpdGRpciwgcmVmLCBkZXB0aCA9IHVuZGVmaW5lZCB9KSB7XG4gICAgaWYgKGRlcHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlcHRoLS07XG4gICAgICBpZiAoZGVwdGggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiByZWZcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJcyBpdCBhIHJlZiBwb2ludGVyP1xuICAgIGlmIChyZWYuc3RhcnRzV2l0aCgncmVmOiAnKSkge1xuICAgICAgcmVmID0gcmVmLnNsaWNlKCdyZWY6ICcubGVuZ3RoKTtcbiAgICAgIHJldHVybiBHaXRSZWZNYW5hZ2VyLnJlc29sdmUoeyBmcywgZ2l0ZGlyLCByZWYsIGRlcHRoIH0pXG4gICAgfVxuICAgIC8vIElzIGl0IGEgY29tcGxldGUgYW5kIHZhbGlkIFNIQT9cbiAgICBpZiAocmVmLmxlbmd0aCA9PT0gNDAgJiYgL1swLTlhLWZdezQwfS8udGVzdChyZWYpKSB7XG4gICAgICByZXR1cm4gcmVmXG4gICAgfVxuICAgIC8vIFdlIG5lZWQgdG8gYWx0ZXJuYXRlIGJldHdlZW4gdGhlIGZpbGUgc3lzdGVtIGFuZCB0aGUgcGFja2VkLXJlZnNcbiAgICBjb25zdCBwYWNrZWRNYXAgPSBhd2FpdCBHaXRSZWZNYW5hZ2VyLnBhY2tlZFJlZnMoeyBmcywgZ2l0ZGlyIH0pO1xuICAgIC8vIExvb2sgaW4gYWxsIHRoZSBwcm9wZXIgcGF0aHMsIGluIHRoaXMgb3JkZXJcbiAgICBjb25zdCBhbGxwYXRocyA9IHJlZnBhdGhzKHJlZikuZmlsdGVyKHAgPT4gIUdJVF9GSUxFUy5pbmNsdWRlcyhwKSk7IC8vIGV4Y2x1ZGUgZ2l0IHN5c3RlbSBmaWxlcyAoIzcwOSlcblxuICAgIGZvciAoY29uc3QgcmVmIG9mIGFsbHBhdGhzKSB7XG4gICAgICBjb25zdCBzaGEgPSBhd2FpdCBhY3F1aXJlTG9jayhcbiAgICAgICAgcmVmLFxuICAgICAgICBhc3luYyAoKSA9PlxuICAgICAgICAgIChhd2FpdCBmcy5yZWFkKGAke2dpdGRpcn0vJHtyZWZ9YCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pKSB8fFxuICAgICAgICAgIHBhY2tlZE1hcC5nZXQocmVmKVxuICAgICAgKTtcbiAgICAgIGlmIChzaGEpIHtcbiAgICAgICAgcmV0dXJuIEdpdFJlZk1hbmFnZXIucmVzb2x2ZSh7IGZzLCBnaXRkaXIsIHJlZjogc2hhLnRyaW0oKSwgZGVwdGggfSlcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRG8gd2UgZ2l2ZSB1cD9cbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihyZWYpXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZXhpc3RzKHsgZnMsIGdpdGRpciwgcmVmIH0pIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgR2l0UmVmTWFuYWdlci5leHBhbmQoeyBmcywgZ2l0ZGlyLCByZWYgfSk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4cGFuZCh7IGZzLCBnaXRkaXIsIHJlZiB9KSB7XG4gICAgLy8gSXMgaXQgYSBjb21wbGV0ZSBhbmQgdmFsaWQgU0hBP1xuICAgIGlmIChyZWYubGVuZ3RoID09PSA0MCAmJiAvWzAtOWEtZl17NDB9Ly50ZXN0KHJlZikpIHtcbiAgICAgIHJldHVybiByZWZcbiAgICB9XG4gICAgLy8gV2UgbmVlZCB0byBhbHRlcm5hdGUgYmV0d2VlbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIHRoZSBwYWNrZWQtcmVmc1xuICAgIGNvbnN0IHBhY2tlZE1hcCA9IGF3YWl0IEdpdFJlZk1hbmFnZXIucGFja2VkUmVmcyh7IGZzLCBnaXRkaXIgfSk7XG4gICAgLy8gTG9vayBpbiBhbGwgdGhlIHByb3BlciBwYXRocywgaW4gdGhpcyBvcmRlclxuICAgIGNvbnN0IGFsbHBhdGhzID0gcmVmcGF0aHMocmVmKTtcbiAgICBmb3IgKGNvbnN0IHJlZiBvZiBhbGxwYXRocykge1xuICAgICAgY29uc3QgcmVmRXhpc3RzID0gYXdhaXQgYWNxdWlyZUxvY2socmVmLCBhc3luYyAoKSA9PlxuICAgICAgICBmcy5leGlzdHMoYCR7Z2l0ZGlyfS8ke3JlZn1gKVxuICAgICAgKTtcbiAgICAgIGlmIChyZWZFeGlzdHMpIHJldHVybiByZWZcbiAgICAgIGlmIChwYWNrZWRNYXAuaGFzKHJlZikpIHJldHVybiByZWZcbiAgICB9XG4gICAgLy8gRG8gd2UgZ2l2ZSB1cD9cbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihyZWYpXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZXhwYW5kQWdhaW5zdE1hcCh7IHJlZiwgbWFwIH0pIHtcbiAgICAvLyBMb29rIGluIGFsbCB0aGUgcHJvcGVyIHBhdGhzLCBpbiB0aGlzIG9yZGVyXG4gICAgY29uc3QgYWxscGF0aHMgPSByZWZwYXRocyhyZWYpO1xuICAgIGZvciAoY29uc3QgcmVmIG9mIGFsbHBhdGhzKSB7XG4gICAgICBpZiAoYXdhaXQgbWFwLmhhcyhyZWYpKSByZXR1cm4gcmVmXG4gICAgfVxuICAgIC8vIERvIHdlIGdpdmUgdXA/XG4gICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IocmVmKVxuICB9XG5cbiAgc3RhdGljIHJlc29sdmVBZ2FpbnN0TWFwKHsgcmVmLCBmdWxscmVmID0gcmVmLCBkZXB0aCA9IHVuZGVmaW5lZCwgbWFwIH0pIHtcbiAgICBpZiAoZGVwdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgZnVsbHJlZiwgb2lkOiByZWYgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJcyBpdCBhIHJlZiBwb2ludGVyP1xuICAgIGlmIChyZWYuc3RhcnRzV2l0aCgncmVmOiAnKSkge1xuICAgICAgcmVmID0gcmVmLnNsaWNlKCdyZWY6ICcubGVuZ3RoKTtcbiAgICAgIHJldHVybiBHaXRSZWZNYW5hZ2VyLnJlc29sdmVBZ2FpbnN0TWFwKHsgcmVmLCBmdWxscmVmLCBkZXB0aCwgbWFwIH0pXG4gICAgfVxuICAgIC8vIElzIGl0IGEgY29tcGxldGUgYW5kIHZhbGlkIFNIQT9cbiAgICBpZiAocmVmLmxlbmd0aCA9PT0gNDAgJiYgL1swLTlhLWZdezQwfS8udGVzdChyZWYpKSB7XG4gICAgICByZXR1cm4geyBmdWxscmVmLCBvaWQ6IHJlZiB9XG4gICAgfVxuICAgIC8vIExvb2sgaW4gYWxsIHRoZSBwcm9wZXIgcGF0aHMsIGluIHRoaXMgb3JkZXJcbiAgICBjb25zdCBhbGxwYXRocyA9IHJlZnBhdGhzKHJlZik7XG4gICAgZm9yIChjb25zdCByZWYgb2YgYWxscGF0aHMpIHtcbiAgICAgIGNvbnN0IHNoYSA9IG1hcC5nZXQocmVmKTtcbiAgICAgIGlmIChzaGEpIHtcbiAgICAgICAgcmV0dXJuIEdpdFJlZk1hbmFnZXIucmVzb2x2ZUFnYWluc3RNYXAoe1xuICAgICAgICAgIHJlZjogc2hhLnRyaW0oKSxcbiAgICAgICAgICBmdWxscmVmOiByZWYsXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgbWFwLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBEbyB3ZSBnaXZlIHVwP1xuICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKHJlZilcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBwYWNrZWRSZWZzKHsgZnMsIGdpdGRpciB9KSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IGFjcXVpcmVMb2NrKCdwYWNrZWQtcmVmcycsIGFzeW5jICgpID0+XG4gICAgICBmcy5yZWFkKGAke2dpdGRpcn0vcGFja2VkLXJlZnNgLCB7IGVuY29kaW5nOiAndXRmOCcgfSlcbiAgICApO1xuICAgIGNvbnN0IHBhY2tlZCA9IEdpdFBhY2tlZFJlZnMuZnJvbSh0ZXh0KTtcbiAgICByZXR1cm4gcGFja2VkLnJlZnNcbiAgfVxuXG4gIC8vIExpc3QgYWxsIHRoZSByZWZzIHRoYXQgbWF0Y2ggdGhlIGBmaWxlcGF0aGAgcHJlZml4XG4gIHN0YXRpYyBhc3luYyBsaXN0UmVmcyh7IGZzLCBnaXRkaXIsIGZpbGVwYXRoIH0pIHtcbiAgICBjb25zdCBwYWNrZWRNYXAgPSBHaXRSZWZNYW5hZ2VyLnBhY2tlZFJlZnMoeyBmcywgZ2l0ZGlyIH0pO1xuICAgIGxldCBmaWxlcyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGZpbGVzID0gYXdhaXQgZnMucmVhZGRpckRlZXAoYCR7Z2l0ZGlyfS8ke2ZpbGVwYXRofWApO1xuICAgICAgZmlsZXMgPSBmaWxlcy5tYXAoeCA9PiB4LnJlcGxhY2UoYCR7Z2l0ZGlyfS8ke2ZpbGVwYXRofS9gLCAnJykpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZmlsZXMgPSBbXTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBrZXkgb2YgKGF3YWl0IHBhY2tlZE1hcCkua2V5cygpKSB7XG4gICAgICAvLyBmaWx0ZXIgYnkgcHJlZml4XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoZmlsZXBhdGgpKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcmVmaXhcbiAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoZmlsZXBhdGggKyAnLycsICcnKTtcbiAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBkdXBsaWNhdGVzOyB0aGUgbG9vc2UgZmlsZXMgaGF2ZSBwcmVjZWRlbmNlIGFueXdheVxuICAgICAgICBpZiAoIWZpbGVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBmaWxlcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gc2luY2Ugd2UganVzdCBhcHBlbmRlZCB0aGluZ3Mgb250byBhbiBhcnJheSwgd2UgbmVlZCB0byBzb3J0IHRoZW0gbm93XG4gICAgZmlsZXMuc29ydChjb21wYXJlUmVmTmFtZXMpO1xuICAgIHJldHVybiBmaWxlc1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGxpc3RCcmFuY2hlcyh7IGZzLCBnaXRkaXIsIHJlbW90ZSB9KSB7XG4gICAgaWYgKHJlbW90ZSkge1xuICAgICAgcmV0dXJuIEdpdFJlZk1hbmFnZXIubGlzdFJlZnMoe1xuICAgICAgICBmcyxcbiAgICAgICAgZ2l0ZGlyLFxuICAgICAgICBmaWxlcGF0aDogYHJlZnMvcmVtb3Rlcy8ke3JlbW90ZX1gLFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIEdpdFJlZk1hbmFnZXIubGlzdFJlZnMoeyBmcywgZ2l0ZGlyLCBmaWxlcGF0aDogYHJlZnMvaGVhZHNgIH0pXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGxpc3RUYWdzKHsgZnMsIGdpdGRpciB9KSB7XG4gICAgY29uc3QgdGFncyA9IGF3YWl0IEdpdFJlZk1hbmFnZXIubGlzdFJlZnMoe1xuICAgICAgZnMsXG4gICAgICBnaXRkaXIsXG4gICAgICBmaWxlcGF0aDogYHJlZnMvdGFnc2AsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhZ3MuZmlsdGVyKHggPT4gIXguZW5kc1dpdGgoJ157fScpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVUcmVlRW50cnlQYXRoKGEsIGIpIHtcbiAgLy8gR2l0IHNvcnRzIHRyZWUgZW50cmllcyBhcyBpZiB0aGVyZSBpcyBhIHRyYWlsaW5nIHNsYXNoIG9uIGRpcmVjdG9yeSBuYW1lcy5cbiAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGFwcGVuZFNsYXNoSWZEaXIoYSksIGFwcGVuZFNsYXNoSWZEaXIoYikpXG59XG5cbmZ1bmN0aW9uIGFwcGVuZFNsYXNoSWZEaXIoZW50cnkpIHtcbiAgcmV0dXJuIGVudHJ5Lm1vZGUgPT09ICcwNDAwMDAnID8gZW50cnkucGF0aCArICcvJyA6IGVudHJ5LnBhdGhcbn1cblxuLyoqXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJlZUVudHJ5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZSAtIHRoZSA2IGRpZ2l0IGhleGFkZWNpbWFsIG1vZGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gdGhlIG5hbWUgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2lkIC0gdGhlIFNIQS0xIG9iamVjdCBpZCBvZiB0aGUgYmxvYiBvciB0cmVlXG4gKiBAcHJvcGVydHkgeydjb21taXQnfCdibG9iJ3wndHJlZSd9IHR5cGUgLSB0aGUgdHlwZSBvZiBvYmplY3RcbiAqL1xuXG5mdW5jdGlvbiBtb2RlMnR5cGUkMShtb2RlKSB7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlICcwNDAwMDAnOiByZXR1cm4gJ3RyZWUnXG4gICAgY2FzZSAnMTAwNjQ0JzogcmV0dXJuICdibG9iJ1xuICAgIGNhc2UgJzEwMDc1NSc6IHJldHVybiAnYmxvYidcbiAgICBjYXNlICcxMjAwMDAnOiByZXR1cm4gJ2Jsb2InXG4gICAgY2FzZSAnMTYwMDAwJzogcmV0dXJuICdjb21taXQnXG4gIH1cbiAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuZXhwZWN0ZWQgR2l0VHJlZSBlbnRyeSBtb2RlOiAke21vZGV9YClcbn1cblxuZnVuY3Rpb24gcGFyc2VCdWZmZXIoYnVmZmVyKSB7XG4gIGNvbnN0IF9lbnRyaWVzID0gW107XG4gIGxldCBjdXJzb3IgPSAwO1xuICB3aGlsZSAoY3Vyc29yIDwgYnVmZmVyLmxlbmd0aCkge1xuICAgIGNvbnN0IHNwYWNlID0gYnVmZmVyLmluZGV4T2YoMzIsIGN1cnNvcik7XG4gICAgaWYgKHNwYWNlID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBHaXRUcmVlOiBFcnJvciBwYXJzaW5nIGJ1ZmZlciBhdCBieXRlIGxvY2F0aW9uICR7Y3Vyc29yfTogQ291bGQgbm90IGZpbmQgdGhlIG5leHQgc3BhY2UgY2hhcmFjdGVyLmBcbiAgICAgIClcbiAgICB9XG4gICAgY29uc3QgbnVsbGNoYXIgPSBidWZmZXIuaW5kZXhPZigwLCBjdXJzb3IpO1xuICAgIGlmIChudWxsY2hhciA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgR2l0VHJlZTogRXJyb3IgcGFyc2luZyBidWZmZXIgYXQgYnl0ZSBsb2NhdGlvbiAke2N1cnNvcn06IENvdWxkIG5vdCBmaW5kIHRoZSBuZXh0IG51bGwgY2hhcmFjdGVyLmBcbiAgICAgIClcbiAgICB9XG4gICAgbGV0IG1vZGUgPSBidWZmZXIuc2xpY2UoY3Vyc29yLCBzcGFjZSkudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICBpZiAobW9kZSA9PT0gJzQwMDAwJykgbW9kZSA9ICcwNDAwMDAnOyAvLyBtYWtlcyBpdCBsaW5lIHVwIG5lYXRlciBpbiBwcmludGVkIG91dHB1dFxuICAgIGNvbnN0IHR5cGUgPSBtb2RlMnR5cGUkMShtb2RlKTtcbiAgICBjb25zdCBwYXRoID0gYnVmZmVyLnNsaWNlKHNwYWNlICsgMSwgbnVsbGNoYXIpLnRvU3RyaW5nKCd1dGY4Jyk7XG5cbiAgICAvLyBQcmV2ZW50IG1hbGljaW91cyBnaXQgcmVwb3MgZnJvbSB3cml0aW5nIHRvIFwiLi5cXGZvb1wiIG9uIGNsb25lIGV0Y1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKCdcXFxcJykgfHwgcGF0aC5pbmNsdWRlcygnLycpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zYWZlRmlsZXBhdGhFcnJvcihwYXRoKVxuICAgIH1cblxuICAgIGNvbnN0IG9pZCA9IGJ1ZmZlci5zbGljZShudWxsY2hhciArIDEsIG51bGxjaGFyICsgMjEpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjdXJzb3IgPSBudWxsY2hhciArIDIxO1xuICAgIF9lbnRyaWVzLnB1c2goeyBtb2RlLCBwYXRoLCBvaWQsIHR5cGUgfSk7XG4gIH1cbiAgcmV0dXJuIF9lbnRyaWVzXG59XG5cbmZ1bmN0aW9uIGxpbWl0TW9kZVRvQWxsb3dlZChtb2RlKSB7XG4gIGlmICh0eXBlb2YgbW9kZSA9PT0gJ251bWJlcicpIHtcbiAgICBtb2RlID0gbW9kZS50b1N0cmluZyg4KTtcbiAgfVxuICAvLyB0cmVlXG4gIGlmIChtb2RlLm1hdGNoKC9eMD80LiovKSkgcmV0dXJuICcwNDAwMDAnIC8vIERpcmVjdG9yeVxuICBpZiAobW9kZS5tYXRjaCgvXjEwMDYuKi8pKSByZXR1cm4gJzEwMDY0NCcgLy8gUmVndWxhciBub24tZXhlY3V0YWJsZSBmaWxlXG4gIGlmIChtb2RlLm1hdGNoKC9eMTAwNy4qLykpIHJldHVybiAnMTAwNzU1JyAvLyBSZWd1bGFyIGV4ZWN1dGFibGUgZmlsZVxuICBpZiAobW9kZS5tYXRjaCgvXjEyMC4qLykpIHJldHVybiAnMTIwMDAwJyAvLyBTeW1ib2xpYyBsaW5rXG4gIGlmIChtb2RlLm1hdGNoKC9eMTYwLiovKSkgcmV0dXJuICcxNjAwMDAnIC8vIENvbW1pdCAoZ2l0IHN1Ym1vZHVsZSByZWZlcmVuY2UpXG4gIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgdW5kZXJzdGFuZCBmaWxlIG1vZGU6ICR7bW9kZX1gKVxufVxuXG5mdW5jdGlvbiBudWRnZUludG9TaGFwZShlbnRyeSkge1xuICBpZiAoIWVudHJ5Lm9pZCAmJiBlbnRyeS5zaGEpIHtcbiAgICBlbnRyeS5vaWQgPSBlbnRyeS5zaGE7IC8vIEdpdGh1YlxuICB9XG4gIGVudHJ5Lm1vZGUgPSBsaW1pdE1vZGVUb0FsbG93ZWQoZW50cnkubW9kZSk7IC8vIGluZGV4XG4gIGlmICghZW50cnkudHlwZSkge1xuICAgIGVudHJ5LnR5cGUgPSBtb2RlMnR5cGUkMShlbnRyeS5tb2RlKTsgLy8gaW5kZXhcbiAgfVxuICByZXR1cm4gZW50cnlcbn1cblxuY2xhc3MgR2l0VHJlZSB7XG4gIGNvbnN0cnVjdG9yKGVudHJpZXMpIHtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGVudHJpZXMpKSB7XG4gICAgICB0aGlzLl9lbnRyaWVzID0gcGFyc2VCdWZmZXIoZW50cmllcyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudHJpZXMpKSB7XG4gICAgICB0aGlzLl9lbnRyaWVzID0gZW50cmllcy5tYXAobnVkZ2VJbnRvU2hhcGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcignaW52YWxpZCB0eXBlIHBhc3NlZCB0byBHaXRUcmVlIGNvbnN0cnVjdG9yJylcbiAgICB9XG4gICAgLy8gVHJlZSBlbnRyaWVzIGFyZSBub3Qgc29ydGVkIGFscGhhYmV0aWNhbGx5IGluIHRoZSB1c3VhbCBzZW5zZSAoc2VlIGBjb21wYXJlVHJlZUVudHJ5UGF0aGApXG4gICAgLy8gYnV0IGl0IGlzIGltcG9ydGFudCBsYXRlciBvbiB0aGF0IHRoZXNlIGJlIHNvcnRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IHdvdWxkIGJlIHJldHVybmVkIGZyb20gcmVhZGRpci5cbiAgICB0aGlzLl9lbnRyaWVzLnNvcnQoY29tcGFyZVBhdGgpO1xuICB9XG5cbiAgc3RhdGljIGZyb20odHJlZSkge1xuICAgIHJldHVybiBuZXcgR2l0VHJlZSh0cmVlKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzXG4gICAgICAubWFwKGVudHJ5ID0+IGAke2VudHJ5Lm1vZGV9ICR7ZW50cnkudHlwZX0gJHtlbnRyeS5vaWR9ICAgICR7ZW50cnkucGF0aH1gKVxuICAgICAgLmpvaW4oJ1xcbicpXG4gIH1cblxuICB0b09iamVjdCgpIHtcbiAgICAvLyBBZGp1c3QgdGhlIHNvcnQgb3JkZXIgdG8gbWF0Y2ggZ2l0J3NcbiAgICBjb25zdCBlbnRyaWVzID0gWy4uLnRoaXMuX2VudHJpZXNdO1xuICAgIGVudHJpZXMuc29ydChjb21wYXJlVHJlZUVudHJ5UGF0aCk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoXG4gICAgICBlbnRyaWVzLm1hcChlbnRyeSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSBCdWZmZXIuZnJvbShlbnRyeS5tb2RlLnJlcGxhY2UoL14wLywgJycpKTtcbiAgICAgICAgY29uc3Qgc3BhY2UgPSBCdWZmZXIuZnJvbSgnICcpO1xuICAgICAgICBjb25zdCBwYXRoID0gQnVmZmVyLmZyb20oZW50cnkucGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgY29uc3QgbnVsbGNoYXIgPSBCdWZmZXIuZnJvbShbMF0pO1xuICAgICAgICBjb25zdCBvaWQgPSBCdWZmZXIuZnJvbShlbnRyeS5vaWQsICdoZXgnKTtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW21vZGUsIHNwYWNlLCBwYXRoLCBudWxsY2hhciwgb2lkXSlcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtUcmVlRW50cnlbXX1cbiAgICovXG4gIGVudHJpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXNcbiAgfVxuXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuX2VudHJpZXMpIHtcbiAgICAgIHlpZWxkIGVudHJ5O1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBHaXRPYmplY3Qge1xuICBzdGF0aWMgd3JhcCh7IHR5cGUsIG9iamVjdCB9KSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20oYCR7dHlwZX0gJHtvYmplY3QuYnl0ZUxlbmd0aC50b1N0cmluZygpfVxceDAwYCksXG4gICAgICBCdWZmZXIuZnJvbShvYmplY3QpLFxuICAgIF0pXG4gIH1cblxuICBzdGF0aWMgdW53cmFwKGJ1ZmZlcikge1xuICAgIGNvbnN0IHMgPSBidWZmZXIuaW5kZXhPZigzMik7IC8vIGZpcnN0IHNwYWNlXG4gICAgY29uc3QgaSA9IGJ1ZmZlci5pbmRleE9mKDApOyAvLyBmaXJzdCBudWxsIHZhbHVlXG4gICAgY29uc3QgdHlwZSA9IGJ1ZmZlci5zbGljZSgwLCBzKS50b1N0cmluZygndXRmOCcpOyAvLyBnZXQgdHlwZSBvZiBvYmplY3RcbiAgICBjb25zdCBsZW5ndGggPSBidWZmZXIuc2xpY2UocyArIDEsIGkpLnRvU3RyaW5nKCd1dGY4Jyk7IC8vIGdldCB0eXBlIG9mIG9iamVjdFxuICAgIGNvbnN0IGFjdHVhbExlbmd0aCA9IGJ1ZmZlci5sZW5ndGggLSAoaSArIDEpO1xuICAgIC8vIHZlcmlmeSBsZW5ndGhcbiAgICBpZiAocGFyc2VJbnQobGVuZ3RoKSAhPT0gYWN0dWFsTGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYExlbmd0aCBtaXNtYXRjaDogZXhwZWN0ZWQgJHtsZW5ndGh9IGJ5dGVzIGJ1dCBnb3QgJHthY3R1YWxMZW5ndGh9IGluc3RlYWQuYFxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZSxcbiAgICAgIG9iamVjdDogQnVmZmVyLmZyb20oYnVmZmVyLnNsaWNlKGkgKyAxKSksXG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRPYmplY3RMb29zZSh7IGZzLCBnaXRkaXIsIG9pZCB9KSB7XG4gIGNvbnN0IHNvdXJjZSA9IGBvYmplY3RzLyR7b2lkLnNsaWNlKDAsIDIpfS8ke29pZC5zbGljZSgyKX1gO1xuICBjb25zdCBmaWxlID0gYXdhaXQgZnMucmVhZChgJHtnaXRkaXJ9LyR7c291cmNlfWApO1xuICBpZiAoIWZpbGUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiB7IG9iamVjdDogZmlsZSwgZm9ybWF0OiAnZGVmbGF0ZWQnLCBzb3VyY2UgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyfSBkZWx0YVxuICogQHBhcmFtIHtCdWZmZXJ9IHNvdXJjZVxuICogQHJldHVybnMge0J1ZmZlcn1cbiAqL1xuZnVuY3Rpb24gYXBwbHlEZWx0YShkZWx0YSwgc291cmNlKSB7XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBCdWZmZXJDdXJzb3IoZGVsdGEpO1xuICBjb25zdCBzb3VyY2VTaXplID0gcmVhZFZhckludExFKHJlYWRlcik7XG5cbiAgaWYgKHNvdXJjZVNpemUgIT09IHNvdXJjZS5ieXRlTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgYXBwbHlEZWx0YSBleHBlY3RlZCBzb3VyY2UgYnVmZmVyIHRvIGJlICR7c291cmNlU2l6ZX0gYnl0ZXMgYnV0IHRoZSBwcm92aWRlZCBidWZmZXIgd2FzICR7c291cmNlLmxlbmd0aH0gYnl0ZXNgXG4gICAgKVxuICB9XG4gIGNvbnN0IHRhcmdldFNpemUgPSByZWFkVmFySW50TEUocmVhZGVyKTtcbiAgbGV0IHRhcmdldDtcblxuICBjb25zdCBmaXJzdE9wID0gcmVhZE9wKHJlYWRlciwgc291cmNlKTtcbiAgLy8gU3BlZWQgb3B0aW1pemF0aW9uIC0gcmV0dXJuIHJhdyBidWZmZXIgaWYgaXQncyBqdXN0IHNpbmdsZSBzaW1wbGUgY29weVxuICBpZiAoZmlyc3RPcC5ieXRlTGVuZ3RoID09PSB0YXJnZXRTaXplKSB7XG4gICAgdGFyZ2V0ID0gZmlyc3RPcDtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIGFsbG9jYXRlIGEgZnJlc2ggYnVmZmVyIGFuZCBzbGljZXNcbiAgICB0YXJnZXQgPSBCdWZmZXIuYWxsb2ModGFyZ2V0U2l6ZSk7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ1ZmZlckN1cnNvcih0YXJnZXQpO1xuICAgIHdyaXRlci5jb3B5KGZpcnN0T3ApO1xuXG4gICAgd2hpbGUgKCFyZWFkZXIuZW9mKCkpIHtcbiAgICAgIHdyaXRlci5jb3B5KHJlYWRPcChyZWFkZXIsIHNvdXJjZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbGwgPSB3cml0ZXIudGVsbCgpO1xuICAgIGlmICh0YXJnZXRTaXplICE9PSB0ZWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYGFwcGx5RGVsdGEgZXhwZWN0ZWQgdGFyZ2V0IGJ1ZmZlciB0byBiZSAke3RhcmdldFNpemV9IGJ5dGVzIGJ1dCB0aGUgcmVzdWx0aW5nIGJ1ZmZlciB3YXMgJHt0ZWxsfSBieXRlc2BcbiAgICAgIClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldFxufVxuXG5mdW5jdGlvbiByZWFkVmFySW50TEUocmVhZGVyKSB7XG4gIGxldCByZXN1bHQgPSAwO1xuICBsZXQgc2hpZnQgPSAwO1xuICBsZXQgYnl0ZSA9IG51bGw7XG4gIGRvIHtcbiAgICBieXRlID0gcmVhZGVyLnJlYWRVSW50OCgpO1xuICAgIHJlc3VsdCB8PSAoYnl0ZSAmIDBiMDExMTExMTEpIDw8IHNoaWZ0O1xuICAgIHNoaWZ0ICs9IDc7XG4gIH0gd2hpbGUgKGJ5dGUgJiAwYjEwMDAwMDAwKVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHJlYWRDb21wYWN0TEUocmVhZGVyLCBmbGFncywgc2l6ZSkge1xuICBsZXQgcmVzdWx0ID0gMDtcbiAgbGV0IHNoaWZ0ID0gMDtcbiAgd2hpbGUgKHNpemUtLSkge1xuICAgIGlmIChmbGFncyAmIDBiMDAwMDAwMDEpIHtcbiAgICAgIHJlc3VsdCB8PSByZWFkZXIucmVhZFVJbnQ4KCkgPDwgc2hpZnQ7XG4gICAgfVxuICAgIGZsYWdzID4+PSAxO1xuICAgIHNoaWZ0ICs9IDg7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiByZWFkT3AocmVhZGVyLCBzb3VyY2UpIHtcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gIGNvbnN0IGJ5dGUgPSByZWFkZXIucmVhZFVJbnQ4KCk7XG4gIGNvbnN0IENPUFkgPSAwYjEwMDAwMDAwO1xuICBjb25zdCBPRkZTID0gMGIwMDAwMTExMTtcbiAgY29uc3QgU0laRSA9IDBiMDExMTAwMDA7XG4gIGlmIChieXRlICYgQ09QWSkge1xuICAgIC8vIGNvcHkgY29uc2lzdHMgb2YgNCBieXRlIG9mZnNldCwgMyBieXRlIHNpemUgKGluIExFIG9yZGVyKVxuICAgIGNvbnN0IG9mZnNldCA9IHJlYWRDb21wYWN0TEUocmVhZGVyLCBieXRlICYgT0ZGUywgNCk7XG4gICAgbGV0IHNpemUgPSByZWFkQ29tcGFjdExFKHJlYWRlciwgKGJ5dGUgJiBTSVpFKSA+PiA0LCAzKTtcbiAgICAvLyBZdXAuIFRoZXkgcmVhbGx5IGRpZCB0aGlzIG9wdGltaXphdGlvbi5cbiAgICBpZiAoc2l6ZSA9PT0gMCkgc2l6ZSA9IDB4MTAwMDA7XG4gICAgcmV0dXJuIHNvdXJjZS5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpXG4gIH0gZWxzZSB7XG4gICAgLy8gaW5zZXJ0XG4gICAgcmV0dXJuIHJlYWRlci5zbGljZShieXRlKVxuICB9XG59XG5cbi8vIENvbnZlcnQgYSB2YWx1ZSB0byBhbiBBc3luYyBJdGVyYXRvclxuLy8gVGhpcyB3aWxsIGJlIGVhc2llciB3aXRoIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbnMuXG5mdW5jdGlvbiBmcm9tVmFsdWUodmFsdWUpIHtcbiAgbGV0IHF1ZXVlID0gW3ZhbHVlXTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0KCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHF1ZXVlLmxlbmd0aCA9PT0gMCwgdmFsdWU6IHF1ZXVlLnBvcCgpIH0pXG4gICAgfSxcbiAgICByZXR1cm4oKSB7XG4gICAgICBxdWV1ZSA9IFtdO1xuICAgICAgcmV0dXJuIHt9XG4gICAgfSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEl0ZXJhdG9yKGl0ZXJhYmxlKSB7XG4gIGlmIChpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIHtcbiAgICByZXR1cm4gaXRlcmFibGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcbiAgfVxuICBpZiAoaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgIHJldHVybiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKClcbiAgfVxuICBpZiAoaXRlcmFibGUubmV4dCkge1xuICAgIHJldHVybiBpdGVyYWJsZVxuICB9XG4gIHJldHVybiBmcm9tVmFsdWUoaXRlcmFibGUpXG59XG5cbi8vIGluc3BpcmVkIGJ5ICdnYXJ0YWwnIGJ1dCBsaWdodGVyLXdlaWdodCBhbmQgbW9yZSBiYXR0bGUtdGVzdGVkLlxuY2xhc3MgU3RyZWFtUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBnZXRJdGVyYXRvcihzdHJlYW0pO1xuICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgICB0aGlzLmN1cnNvciA9IDA7XG4gICAgdGhpcy51bmRvQ3Vyc29yID0gMDtcbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2Rpc2NhcmRlZEJ5dGVzID0gMDtcbiAgfVxuXG4gIGVvZigpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5kZWQgJiYgdGhpcy5jdXJzb3IgPT09IHRoaXMuYnVmZmVyLmxlbmd0aFxuICB9XG5cbiAgdGVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzY2FyZGVkQnl0ZXMgKyB0aGlzLmN1cnNvclxuICB9XG5cbiAgYXN5bmMgYnl0ZSgpIHtcbiAgICBpZiAodGhpcy5lb2YoKSkgcmV0dXJuXG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIGF3YWl0IHRoaXMuX2luaXQoKTtcbiAgICBpZiAodGhpcy5jdXJzb3IgPT09IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgYXdhaXQgdGhpcy5fbG9hZG5leHQoKTtcbiAgICAgIGlmICh0aGlzLl9lbmRlZCkgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuX21vdmVDdXJzb3IoMSk7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMudW5kb0N1cnNvcl1cbiAgfVxuXG4gIGFzeW5jIGNodW5rKCkge1xuICAgIGlmICh0aGlzLmVvZigpKSByZXR1cm5cbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5faW5pdCgpO1xuICAgIGlmICh0aGlzLmN1cnNvciA9PT0gdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICBhd2FpdCB0aGlzLl9sb2FkbmV4dCgpO1xuICAgICAgaWYgKHRoaXMuX2VuZGVkKSByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5fbW92ZUN1cnNvcih0aGlzLmJ1ZmZlci5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLnVuZG9DdXJzb3IsIHRoaXMuY3Vyc29yKVxuICB9XG5cbiAgYXN5bmMgcmVhZChuKSB7XG4gICAgaWYgKHRoaXMuZW9mKCkpIHJldHVyblxuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLl9pbml0KCk7XG4gICAgaWYgKHRoaXMuY3Vyc29yICsgbiA+IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgdGhpcy5fdHJpbSgpO1xuICAgICAgYXdhaXQgdGhpcy5fYWNjdW11bGF0ZShuKTtcbiAgICB9XG4gICAgdGhpcy5fbW92ZUN1cnNvcihuKTtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIuc2xpY2UodGhpcy51bmRvQ3Vyc29yLCB0aGlzLmN1cnNvcilcbiAgfVxuXG4gIGFzeW5jIHNraXAobikge1xuICAgIGlmICh0aGlzLmVvZigpKSByZXR1cm5cbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5faW5pdCgpO1xuICAgIGlmICh0aGlzLmN1cnNvciArIG4gPiB0aGlzLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3RyaW0oKTtcbiAgICAgIGF3YWl0IHRoaXMuX2FjY3VtdWxhdGUobik7XG4gICAgfVxuICAgIHRoaXMuX21vdmVDdXJzb3Iobik7XG4gIH1cblxuICBhc3luYyB1bmRvKCkge1xuICAgIHRoaXMuY3Vyc29yID0gdGhpcy51bmRvQ3Vyc29yO1xuICB9XG5cbiAgYXN5bmMgX25leHQoKSB7XG4gICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICBsZXQgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgdGhpcy5zdHJlYW0ubmV4dCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICB0aGlzLl9lbmRlZCA9IHRydWU7XG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdmFsdWUgPSBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgX3RyaW0oKSB7XG4gICAgLy8gVGhyb3cgYXdheSBwYXJ0cyBvZiB0aGUgYnVmZmVyIHdlIGRvbid0IG5lZWQgYW55bW9yZVxuICAgIC8vIGFzc2VydCh0aGlzLmN1cnNvciA8PSB0aGlzLmJ1ZmZlci5sZW5ndGgpXG4gICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLnVuZG9DdXJzb3IpO1xuICAgIHRoaXMuY3Vyc29yIC09IHRoaXMudW5kb0N1cnNvcjtcbiAgICB0aGlzLl9kaXNjYXJkZWRCeXRlcyArPSB0aGlzLnVuZG9DdXJzb3I7XG4gICAgdGhpcy51bmRvQ3Vyc29yID0gMDtcbiAgfVxuXG4gIF9tb3ZlQ3Vyc29yKG4pIHtcbiAgICB0aGlzLnVuZG9DdXJzb3IgPSB0aGlzLmN1cnNvcjtcbiAgICB0aGlzLmN1cnNvciArPSBuO1xuICAgIGlmICh0aGlzLmN1cnNvciA+IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgdGhpcy5jdXJzb3IgPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2FjY3VtdWxhdGUobikge1xuICAgIGlmICh0aGlzLl9lbmRlZCkgcmV0dXJuXG4gICAgLy8gRXhwYW5kIHRoZSBidWZmZXIgdW50aWwgd2UgaGF2ZSBOIGJ5dGVzIG9mIGRhdGFcbiAgICAvLyBvciB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbVxuICAgIGNvbnN0IGJ1ZmZlcnMgPSBbdGhpcy5idWZmZXJdO1xuICAgIHdoaWxlICh0aGlzLmN1cnNvciArIG4gPiBsZW5ndGhCdWZmZXJzKGJ1ZmZlcnMpKSB7XG4gICAgICBjb25zdCBuZXh0YnVmZmVyID0gYXdhaXQgdGhpcy5fbmV4dCgpO1xuICAgICAgaWYgKHRoaXMuX2VuZGVkKSBicmVha1xuICAgICAgYnVmZmVycy5wdXNoKG5leHRidWZmZXIpO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG4gIH1cblxuICBhc3luYyBfbG9hZG5leHQoKSB7XG4gICAgdGhpcy5fZGlzY2FyZGVkQnl0ZXMgKz0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgIHRoaXMudW5kb0N1cnNvciA9IDA7XG4gICAgdGhpcy5jdXJzb3IgPSAwO1xuICAgIHRoaXMuYnVmZmVyID0gYXdhaXQgdGhpcy5fbmV4dCgpO1xuICB9XG5cbiAgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5idWZmZXIgPSBhd2FpdCB0aGlzLl9uZXh0KCk7XG4gIH1cbn1cblxuLy8gVGhpcyBoZWxwZXIgZnVuY3Rpb24gaGVscHMgdXMgcG9zdHBvbmUgY29uY2F0ZW5hdGluZyBidWZmZXJzLCB3aGljaFxuLy8gd291bGQgY3JlYXRlIGludGVybWVkaWF0ZSBidWZmZXIgb2JqZWN0cyxcbmZ1bmN0aW9uIGxlbmd0aEJ1ZmZlcnMoYnVmZmVycykge1xuICByZXR1cm4gYnVmZmVycy5yZWR1Y2UoKGFjYywgYnVmZmVyKSA9PiBhY2MgKyBidWZmZXIubGVuZ3RoLCAwKVxufVxuXG4vLyBNeSB2ZXJzaW9uIG9mIGdpdC1saXN0LXBhY2sgLSByb3VnaGx5IDE1eCBmYXN0ZXIgdGhhbiB0aGUgb3JpZ2luYWxcblxuYXN5bmMgZnVuY3Rpb24gbGlzdHBhY2soc3RyZWFtLCBvbkRhdGEpIHtcbiAgY29uc3QgcmVhZGVyID0gbmV3IFN0cmVhbVJlYWRlcihzdHJlYW0pO1xuICBsZXQgUEFDSyA9IGF3YWl0IHJlYWRlci5yZWFkKDQpO1xuICBQQUNLID0gUEFDSy50b1N0cmluZygndXRmOCcpO1xuICBpZiAoUEFDSyAhPT0gJ1BBQ0snKSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEludmFsaWQgUEFDSyBoZWFkZXIgJyR7UEFDS30nYClcbiAgfVxuXG4gIGxldCB2ZXJzaW9uID0gYXdhaXQgcmVhZGVyLnJlYWQoNCk7XG4gIHZlcnNpb24gPSB2ZXJzaW9uLnJlYWRVSW50MzJCRSgwKTtcbiAgaWYgKHZlcnNpb24gIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgSW52YWxpZCBwYWNrZmlsZSB2ZXJzaW9uOiAke3ZlcnNpb259YClcbiAgfVxuXG4gIGxldCBudW1PYmplY3RzID0gYXdhaXQgcmVhZGVyLnJlYWQoNCk7XG4gIG51bU9iamVjdHMgPSBudW1PYmplY3RzLnJlYWRVSW50MzJCRSgwKTtcbiAgLy8gSWYgKGZvciBzb21lIGdvZGZvcnNha2VuIHJlYXNvbikgdGhpcyBpcyBhbiBlbXB0eSBwYWNrZmlsZSwgYWJvcnQgbm93LlxuICBpZiAobnVtT2JqZWN0cyA8IDEpIHJldHVyblxuXG4gIHdoaWxlICghcmVhZGVyLmVvZigpICYmIG51bU9iamVjdHMtLSkge1xuICAgIGNvbnN0IG9mZnNldCA9IHJlYWRlci50ZWxsKCk7XG4gICAgY29uc3QgeyB0eXBlLCBsZW5ndGgsIG9mcywgcmVmZXJlbmNlIH0gPSBhd2FpdCBwYXJzZUhlYWRlcihyZWFkZXIpO1xuICAgIGNvbnN0IGluZmxhdG9yID0gbmV3IHBha28uSW5mbGF0ZSgpO1xuICAgIHdoaWxlICghaW5mbGF0b3IucmVzdWx0KSB7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHJlYWRlci5jaHVuaygpO1xuICAgICAgaWYgKCFjaHVuaykgYnJlYWtcbiAgICAgIGluZmxhdG9yLnB1c2goY2h1bmssIGZhbHNlKTtcbiAgICAgIGlmIChpbmZsYXRvci5lcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFBha28gZXJyb3I6ICR7aW5mbGF0b3IubXNnfWApXG4gICAgICB9XG4gICAgICBpZiAoaW5mbGF0b3IucmVzdWx0KSB7XG4gICAgICAgIGlmIChpbmZsYXRvci5yZXN1bHQubGVuZ3RoICE9PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBJbmZsYXRlZCBvYmplY3Qgc2l6ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IHN0YXRlZCBpbiBwYWNrZmlsZS5gXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmFja3RyYWNrIHBhcnNlciB0byB3aGVyZSBkZWZsYXRlZCBkYXRhIGVuZHNcbiAgICAgICAgYXdhaXQgcmVhZGVyLnVuZG8oKTtcbiAgICAgICAgYXdhaXQgcmVhZGVyLnJlYWQoY2h1bmsubGVuZ3RoIC0gaW5mbGF0b3Iuc3RybS5hdmFpbF9pbik7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlYWRlci50ZWxsKCk7XG4gICAgICAgIGF3YWl0IG9uRGF0YSh7XG4gICAgICAgICAgZGF0YTogaW5mbGF0b3IucmVzdWx0LFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgbnVtOiBudW1PYmplY3RzLFxuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBlbmQsXG4gICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgIG9mcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlSGVhZGVyKHJlYWRlcikge1xuICAvLyBPYmplY3QgdHlwZSBpcyBlbmNvZGVkIGluIGJpdHMgNjU0XG4gIGxldCBieXRlID0gYXdhaXQgcmVhZGVyLmJ5dGUoKTtcbiAgY29uc3QgdHlwZSA9IChieXRlID4+IDQpICYgMGIxMTE7XG4gIC8vIFRoZSBsZW5ndGggZW5jb2RpbmcgZ2V0IGNvbXBsaWNhdGVkLlxuICAvLyBMYXN0IGZvdXIgYml0cyBvZiBsZW5ndGggaXMgZW5jb2RlZCBpbiBiaXRzIDMyMTBcbiAgbGV0IGxlbmd0aCA9IGJ5dGUgJiAwYjExMTE7XG4gIC8vIFdoZXRoZXIgdGhlIG5leHQgYnl0ZSBpcyBwYXJ0IG9mIHRoZSB2YXJpYWJsZS1sZW5ndGggZW5jb2RlZCBudW1iZXJcbiAgLy8gaXMgZW5jb2RlZCBpbiBiaXQgN1xuICBpZiAoYnl0ZSAmIDBiMTAwMDAwMDApIHtcbiAgICBsZXQgc2hpZnQgPSA0O1xuICAgIGRvIHtcbiAgICAgIGJ5dGUgPSBhd2FpdCByZWFkZXIuYnl0ZSgpO1xuICAgICAgbGVuZ3RoIHw9IChieXRlICYgMGIwMTExMTExMSkgPDwgc2hpZnQ7XG4gICAgICBzaGlmdCArPSA3O1xuICAgIH0gd2hpbGUgKGJ5dGUgJiAwYjEwMDAwMDAwKVxuICB9XG4gIC8vIEhhbmRsZSBkZWx0aWZpZWQgb2JqZWN0c1xuICBsZXQgb2ZzO1xuICBsZXQgcmVmZXJlbmNlO1xuICBpZiAodHlwZSA9PT0gNikge1xuICAgIGxldCBzaGlmdCA9IDA7XG4gICAgb2ZzID0gMDtcbiAgICBjb25zdCBieXRlcyA9IFtdO1xuICAgIGRvIHtcbiAgICAgIGJ5dGUgPSBhd2FpdCByZWFkZXIuYnl0ZSgpO1xuICAgICAgb2ZzIHw9IChieXRlICYgMGIwMTExMTExMSkgPDwgc2hpZnQ7XG4gICAgICBzaGlmdCArPSA3O1xuICAgICAgYnl0ZXMucHVzaChieXRlKTtcbiAgICB9IHdoaWxlIChieXRlICYgMGIxMDAwMDAwMClcbiAgICByZWZlcmVuY2UgPSBCdWZmZXIuZnJvbShieXRlcyk7XG4gIH1cbiAgaWYgKHR5cGUgPT09IDcpIHtcbiAgICBjb25zdCBidWYgPSBhd2FpdCByZWFkZXIucmVhZCgyMCk7XG4gICAgcmVmZXJlbmNlID0gYnVmO1xuICB9XG4gIHJldHVybiB7IHR5cGUsIGxlbmd0aCwgb2ZzLCByZWZlcmVuY2UgfVxufVxuXG4vKiBlc2xpbnQtZW52IG5vZGUsIGJyb3dzZXIgKi9cblxubGV0IHN1cHBvcnRzRGVjb21wcmVzc2lvblN0cmVhbSA9IGZhbHNlO1xuXG5hc3luYyBmdW5jdGlvbiBpbmZsYXRlKGJ1ZmZlcikge1xuICBpZiAoc3VwcG9ydHNEZWNvbXByZXNzaW9uU3RyZWFtID09PSBudWxsKSB7XG4gICAgc3VwcG9ydHNEZWNvbXByZXNzaW9uU3RyZWFtID0gdGVzdERlY29tcHJlc3Npb25TdHJlYW0oKTtcbiAgfVxuICByZXR1cm4gc3VwcG9ydHNEZWNvbXByZXNzaW9uU3RyZWFtXG4gICAgPyBicm93c2VySW5mbGF0ZShidWZmZXIpXG4gICAgOiBwYWtvLmluZmxhdGUoYnVmZmVyKVxufVxuXG5hc3luYyBmdW5jdGlvbiBicm93c2VySW5mbGF0ZShidWZmZXIpIHtcbiAgY29uc3QgZHMgPSBuZXcgRGVjb21wcmVzc2lvblN0cmVhbSgnZGVmbGF0ZScpO1xuICBjb25zdCBkID0gbmV3IEJsb2IoW2J1ZmZlcl0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKGRzKTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IG5ldyBSZXNwb25zZShkKS5hcnJheUJ1ZmZlcigpKVxufVxuXG5mdW5jdGlvbiB0ZXN0RGVjb21wcmVzc2lvblN0cmVhbSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkcyA9IG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCdkZWZsYXRlJyk7XG4gICAgaWYgKGRzKSByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChfKSB7XG4gICAgLy8gbm8gYm90aGVyXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGRlY29kZVZhckludChyZWFkZXIpIHtcbiAgY29uc3QgYnl0ZXMgPSBbXTtcbiAgbGV0IGJ5dGUgPSAwO1xuICBsZXQgbXVsdGlieXRlID0gMDtcbiAgZG8ge1xuICAgIGJ5dGUgPSByZWFkZXIucmVhZFVJbnQ4KCk7XG4gICAgLy8gV2Uga2VlcCBiaXRzIDY1NDMyMTBcbiAgICBjb25zdCBsYXN0U2V2ZW4gPSBieXRlICYgMGIwMTExMTExMTtcbiAgICBieXRlcy5wdXNoKGxhc3RTZXZlbik7XG4gICAgLy8gV2hldGhlciB0aGUgbmV4dCBieXRlIGlzIHBhcnQgb2YgdGhlIHZhcmlhYmxlLWxlbmd0aCBlbmNvZGVkIG51bWJlclxuICAgIC8vIGlzIGVuY29kZWQgaW4gYml0IDdcbiAgICBtdWx0aWJ5dGUgPSBieXRlICYgMGIxMDAwMDAwMDtcbiAgfSB3aGlsZSAobXVsdGlieXRlKVxuICAvLyBOb3cgdGhhdCBhbGwgdGhlIGJ5dGVzIGFyZSBpbiBiaWctZW5kaWFuIG9yZGVyLFxuICAvLyBhbHRlcm5hdGUgc2hpZnRpbmcgdGhlIGJpdHMgbGVmdCBieSA3IGFuZCBPUi1pbmcgdGhlIG5leHQgYnl0ZS5cbiAgLy8gQW5kLi4uIGRvIGEgd2VpcmQgaW5jcmVtZW50LWJ5LW9uZSB0aGluZyB0aGF0IEkgZG9uJ3QgcXVpdGUgdW5kZXJzdGFuZC5cbiAgcmV0dXJuIGJ5dGVzLnJlZHVjZSgoYSwgYikgPT4gKChhICsgMSkgPDwgNykgfCBiLCAtMSlcbn1cblxuLy8gSSdtIHByZXR0eSBtdWNoIGNvcHlpbmcgdGhpcyBvbmUgZnJvbSB0aGUgZ2l0IEMgc291cmNlIGNvZGUsXG4vLyBiZWNhdXNlIGl0IG1ha2VzIG5vIHNlbnNlLlxuZnVuY3Rpb24gb3RoZXJWYXJJbnREZWNvZGUocmVhZGVyLCBzdGFydFdpdGgpIHtcbiAgbGV0IHJlc3VsdCA9IHN0YXJ0V2l0aDtcbiAgbGV0IHNoaWZ0ID0gNDtcbiAgbGV0IGJ5dGUgPSBudWxsO1xuICBkbyB7XG4gICAgYnl0ZSA9IHJlYWRlci5yZWFkVUludDgoKTtcbiAgICByZXN1bHQgfD0gKGJ5dGUgJiAwYjAxMTExMTExKSA8PCBzaGlmdDtcbiAgICBzaGlmdCArPSA3O1xuICB9IHdoaWxlIChieXRlICYgMGIxMDAwMDAwMClcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5jbGFzcyBHaXRQYWNrSW5kZXgge1xuICBjb25zdHJ1Y3RvcihzdHVmZikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgc3R1ZmYpO1xuICAgIHRoaXMub2Zmc2V0Q2FjaGUgPSB7fTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBmcm9tSWR4KHsgaWR4LCBnZXRFeHRlcm5hbFJlZkRlbHRhIH0pIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgQnVmZmVyQ3Vyc29yKGlkeCk7XG4gICAgY29uc3QgbWFnaWMgPSByZWFkZXIuc2xpY2UoNCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIC8vIENoZWNrIGZvciBJRFggdjIgbWFnaWMgbnVtYmVyXG4gICAgaWYgKG1hZ2ljICE9PSAnZmY3NDRmNjMnKSB7XG4gICAgICByZXR1cm4gLy8gdW5kZWZpbmVkXG4gICAgfVxuICAgIGNvbnN0IHZlcnNpb24gPSByZWFkZXIucmVhZFVJbnQzMkJFKCk7XG4gICAgaWYgKHZlcnNpb24gIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgVW5hYmxlIHRvIHJlYWQgdmVyc2lvbiAke3ZlcnNpb259IHBhY2tmaWxlIElEWC4gKE9ubHkgdmVyc2lvbiAyIHN1cHBvcnRlZClgXG4gICAgICApXG4gICAgfVxuICAgIGlmIChpZHguYnl0ZUxlbmd0aCA+IDIwNDggKiAxMDI0ICogMTAyNCkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBUbyBrZWVwIGltcGxlbWVudGF0aW9uIHNpbXBsZSwgSSBoYXZlbid0IGltcGxlbWVudGVkIHRoZSBsYXllciA1IGZlYXR1cmUgbmVlZGVkIHRvIHN1cHBvcnQgcGFja2ZpbGVzID4gMkdCIGluIHNpemUuYFxuICAgICAgKVxuICAgIH1cbiAgICAvLyBTa2lwIG92ZXIgZmFub3V0IHRhYmxlXG4gICAgcmVhZGVyLnNlZWsocmVhZGVyLnRlbGwoKSArIDQgKiAyNTUpO1xuICAgIC8vIEdldCBoYXNoZXNcbiAgICBjb25zdCBzaXplID0gcmVhZGVyLnJlYWRVSW50MzJCRSgpO1xuICAgIGNvbnN0IGhhc2hlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICBjb25zdCBoYXNoID0gcmVhZGVyLnNsaWNlKDIwKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBoYXNoZXNbaV0gPSBoYXNoO1xuICAgIH1cbiAgICByZWFkZXIuc2VlayhyZWFkZXIudGVsbCgpICsgNCAqIHNpemUpO1xuICAgIC8vIFNraXAgb3ZlciBDUkNzXG4gICAgLy8gR2V0IG9mZnNldHNcbiAgICBjb25zdCBvZmZzZXRzID0gbmV3IE1hcCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICBvZmZzZXRzLnNldChoYXNoZXNbaV0sIHJlYWRlci5yZWFkVUludDMyQkUoKSk7XG4gICAgfVxuICAgIGNvbnN0IHBhY2tmaWxlU2hhID0gcmVhZGVyLnNsaWNlKDIwKS50b1N0cmluZygnaGV4Jyk7XG4gICAgcmV0dXJuIG5ldyBHaXRQYWNrSW5kZXgoe1xuICAgICAgaGFzaGVzLFxuICAgICAgY3Jjczoge30sXG4gICAgICBvZmZzZXRzLFxuICAgICAgcGFja2ZpbGVTaGEsXG4gICAgICBnZXRFeHRlcm5hbFJlZkRlbHRhLFxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZnJvbVBhY2soeyBwYWNrLCBnZXRFeHRlcm5hbFJlZkRlbHRhLCBvblByb2dyZXNzIH0pIHtcbiAgICBjb25zdCBsaXN0cGFja1R5cGVzID0ge1xuICAgICAgMTogJ2NvbW1pdCcsXG4gICAgICAyOiAndHJlZScsXG4gICAgICAzOiAnYmxvYicsXG4gICAgICA0OiAndGFnJyxcbiAgICAgIDY6ICdvZnMtZGVsdGEnLFxuICAgICAgNzogJ3JlZi1kZWx0YScsXG4gICAgfTtcbiAgICBjb25zdCBvZmZzZXRUb09iamVjdCA9IHt9O1xuXG4gICAgLy8gT2xkZXIgcGFja2ZpbGVzIGRvIE5PVCB1c2UgdGhlIHNoYXN1bSBvZiB0aGUgcGFjayBpdHNlbGYsXG4gICAgLy8gc28gaXQgaXMgcmVjb21tZW5kZWQgdG8ganVzdCB1c2Ugd2hhdGV2ZXIgYnl0ZXMgYXJlIGluIHRoZSB0cmFpbGVyLlxuICAgIC8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2dpdC9naXQvY29tbWl0LzExOTBhMWFjZjgwMGFjZGNmZDc1NjlmODdhYzE1NjBlMmQwNzc0MTRcbiAgICBjb25zdCBwYWNrZmlsZVNoYSA9IHBhY2suc2xpY2UoLTIwKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBoYXNoZXMgPSBbXTtcbiAgICBjb25zdCBjcmNzID0ge307XG4gICAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdG90YWxPYmplY3RDb3VudCA9IG51bGw7XG4gICAgbGV0IGxhc3RQZXJjZW50ID0gbnVsbDtcblxuICAgIGF3YWl0IGxpc3RwYWNrKFtwYWNrXSwgYXN5bmMgKHsgZGF0YSwgdHlwZSwgcmVmZXJlbmNlLCBvZmZzZXQsIG51bSB9KSA9PiB7XG4gICAgICBpZiAodG90YWxPYmplY3RDb3VudCA9PT0gbnVsbCkgdG90YWxPYmplY3RDb3VudCA9IG51bTtcbiAgICAgIGNvbnN0IHBlcmNlbnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAoKHRvdGFsT2JqZWN0Q291bnQgLSBudW0pICogMTAwKSAvIHRvdGFsT2JqZWN0Q291bnRcbiAgICAgICk7XG4gICAgICBpZiAocGVyY2VudCAhPT0gbGFzdFBlcmNlbnQpIHtcbiAgICAgICAgaWYgKG9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICBhd2FpdCBvblByb2dyZXNzKHtcbiAgICAgICAgICAgIHBoYXNlOiAnUmVjZWl2aW5nIG9iamVjdHMnLFxuICAgICAgICAgICAgbG9hZGVkOiB0b3RhbE9iamVjdENvdW50IC0gbnVtLFxuICAgICAgICAgICAgdG90YWw6IHRvdGFsT2JqZWN0Q291bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhc3RQZXJjZW50ID0gcGVyY2VudDtcbiAgICAgIC8vIENoYW5nZSB0eXBlIGZyb20gYSBudW1iZXIgdG8gYSBtZWFuaW5nZnVsIHN0cmluZ1xuICAgICAgdHlwZSA9IGxpc3RwYWNrVHlwZXNbdHlwZV07XG5cbiAgICAgIGlmIChbJ2NvbW1pdCcsICd0cmVlJywgJ2Jsb2InLCAndGFnJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgICAgb2Zmc2V0VG9PYmplY3Rbb2Zmc2V0XSA9IHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29mcy1kZWx0YScpIHtcbiAgICAgICAgb2Zmc2V0VG9PYmplY3Rbb2Zmc2V0XSA9IHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3JlZi1kZWx0YScpIHtcbiAgICAgICAgb2Zmc2V0VG9PYmplY3Rbb2Zmc2V0XSA9IHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdlIG5lZWQgdG8ga25vdyB0aGUgbGVuZ3RocyBvZiB0aGUgc2xpY2VzIHRvIGNvbXB1dGUgdGhlIENSQ3MuXG4gICAgY29uc3Qgb2Zmc2V0QXJyYXkgPSBPYmplY3Qua2V5cyhvZmZzZXRUb09iamVjdCkubWFwKE51bWJlcik7XG4gICAgZm9yIChjb25zdCBbaSwgc3RhcnRdIG9mIG9mZnNldEFycmF5LmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgZW5kID1cbiAgICAgICAgaSArIDEgPT09IG9mZnNldEFycmF5Lmxlbmd0aCA/IHBhY2suYnl0ZUxlbmd0aCAtIDIwIDogb2Zmc2V0QXJyYXlbaSArIDFdO1xuICAgICAgY29uc3QgbyA9IG9mZnNldFRvT2JqZWN0W3N0YXJ0XTtcbiAgICAgIGNvbnN0IGNyYyA9IGNyYzMyLmJ1ZihwYWNrLnNsaWNlKHN0YXJ0LCBlbmQpKSA+Pj4gMDtcbiAgICAgIG8uZW5kID0gZW5kO1xuICAgICAgby5jcmMgPSBjcmM7XG4gICAgfVxuXG4gICAgLy8gV2UgZG9uJ3QgaGF2ZSB0aGUgaGFzaGVzIHlldC4gQnV0IHdlIGNhbiBnZW5lcmF0ZSB0aGVtIHVzaW5nIHRoZSAucmVhZFNsaWNlIGZ1bmN0aW9uIVxuICAgIGNvbnN0IHAgPSBuZXcgR2l0UGFja0luZGV4KHtcbiAgICAgIHBhY2s6IFByb21pc2UucmVzb2x2ZShwYWNrKSxcbiAgICAgIHBhY2tmaWxlU2hhLFxuICAgICAgY3JjcyxcbiAgICAgIGhhc2hlcyxcbiAgICAgIG9mZnNldHMsXG4gICAgICBnZXRFeHRlcm5hbFJlZkRlbHRhLFxuICAgIH0pO1xuXG4gICAgLy8gUmVzb2x2ZSBkZWx0YXMgYW5kIGNvbXB1dGUgdGhlIG9pZHNcbiAgICBsYXN0UGVyY2VudCA9IG51bGw7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBvYmplY3RzQnlEZXB0aCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICBmb3IgKGxldCBvZmZzZXQgaW4gb2Zmc2V0VG9PYmplY3QpIHtcbiAgICAgIG9mZnNldCA9IE51bWJlcihvZmZzZXQpO1xuICAgICAgY29uc3QgcGVyY2VudCA9IE1hdGguZmxvb3IoKGNvdW50ICogMTAwKSAvIHRvdGFsT2JqZWN0Q291bnQpO1xuICAgICAgaWYgKHBlcmNlbnQgIT09IGxhc3RQZXJjZW50KSB7XG4gICAgICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICAgICAgYXdhaXQgb25Qcm9ncmVzcyh7XG4gICAgICAgICAgICBwaGFzZTogJ1Jlc29sdmluZyBkZWx0YXMnLFxuICAgICAgICAgICAgbG9hZGVkOiBjb3VudCxcbiAgICAgICAgICAgIHRvdGFsOiB0b3RhbE9iamVjdENvdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb3VudCsrO1xuICAgICAgbGFzdFBlcmNlbnQgPSBwZXJjZW50O1xuXG4gICAgICBjb25zdCBvID0gb2Zmc2V0VG9PYmplY3Rbb2Zmc2V0XTtcbiAgICAgIGlmIChvLm9pZCkgY29udGludWVcbiAgICAgIHRyeSB7XG4gICAgICAgIHAucmVhZERlcHRoID0gMDtcbiAgICAgICAgcC5leHRlcm5hbFJlYWREZXB0aCA9IDA7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgb2JqZWN0IH0gPSBhd2FpdCBwLnJlYWRTbGljZSh7IHN0YXJ0OiBvZmZzZXQgfSk7XG4gICAgICAgIG9iamVjdHNCeURlcHRoW3AucmVhZERlcHRoXSArPSAxO1xuICAgICAgICBjb25zdCBvaWQgPSBhd2FpdCBzaGFzdW0oR2l0T2JqZWN0LndyYXAoeyB0eXBlLCBvYmplY3QgfSkpO1xuICAgICAgICBvLm9pZCA9IG9pZDtcbiAgICAgICAgaGFzaGVzLnB1c2gob2lkKTtcbiAgICAgICAgb2Zmc2V0cy5zZXQob2lkLCBvZmZzZXQpO1xuICAgICAgICBjcmNzW29pZF0gPSBvLmNyYztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGhhc2hlcy5zb3J0KCk7XG4gICAgcmV0dXJuIHBcbiAgfVxuXG4gIGFzeW5jIHRvQnVmZmVyKCkge1xuICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgICBjb25zdCB3cml0ZSA9IChzdHIsIGVuY29kaW5nKSA9PiB7XG4gICAgICBidWZmZXJzLnB1c2goQnVmZmVyLmZyb20oc3RyLCBlbmNvZGluZykpO1xuICAgIH07XG4gICAgLy8gV3JpdGUgb3V0IElEWCB2MiBtYWdpYyBudW1iZXJcbiAgICB3cml0ZSgnZmY3NDRmNjMnLCAnaGV4Jyk7XG4gICAgLy8gV3JpdGUgb3V0IHZlcnNpb24gbnVtYmVyIDJcbiAgICB3cml0ZSgnMDAwMDAwMDInLCAnaGV4Jyk7XG4gICAgLy8gV3JpdGUgZmFub3V0IHRhYmxlXG4gICAgY29uc3QgZmFub3V0QnVmZmVyID0gbmV3IEJ1ZmZlckN1cnNvcihCdWZmZXIuYWxsb2MoMjU2ICogNCkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgdGhpcy5oYXNoZXMpIHtcbiAgICAgICAgaWYgKHBhcnNlSW50KGhhc2guc2xpY2UoMCwgMiksIDE2KSA8PSBpKSBjb3VudCsrO1xuICAgICAgfVxuICAgICAgZmFub3V0QnVmZmVyLndyaXRlVUludDMyQkUoY291bnQpO1xuICAgIH1cbiAgICBidWZmZXJzLnB1c2goZmFub3V0QnVmZmVyLmJ1ZmZlcik7XG4gICAgLy8gV3JpdGUgb3V0IGhhc2hlc1xuICAgIGZvciAoY29uc3QgaGFzaCBvZiB0aGlzLmhhc2hlcykge1xuICAgICAgd3JpdGUoaGFzaCwgJ2hleCcpO1xuICAgIH1cbiAgICAvLyBXcml0ZSBvdXQgY3Jjc1xuICAgIGNvbnN0IGNyY3NCdWZmZXIgPSBuZXcgQnVmZmVyQ3Vyc29yKEJ1ZmZlci5hbGxvYyh0aGlzLmhhc2hlcy5sZW5ndGggKiA0KSk7XG4gICAgZm9yIChjb25zdCBoYXNoIG9mIHRoaXMuaGFzaGVzKSB7XG4gICAgICBjcmNzQnVmZmVyLndyaXRlVUludDMyQkUodGhpcy5jcmNzW2hhc2hdKTtcbiAgICB9XG4gICAgYnVmZmVycy5wdXNoKGNyY3NCdWZmZXIuYnVmZmVyKTtcbiAgICAvLyBXcml0ZSBvdXQgb2Zmc2V0c1xuICAgIGNvbnN0IG9mZnNldHNCdWZmZXIgPSBuZXcgQnVmZmVyQ3Vyc29yKEJ1ZmZlci5hbGxvYyh0aGlzLmhhc2hlcy5sZW5ndGggKiA0KSk7XG4gICAgZm9yIChjb25zdCBoYXNoIG9mIHRoaXMuaGFzaGVzKSB7XG4gICAgICBvZmZzZXRzQnVmZmVyLndyaXRlVUludDMyQkUodGhpcy5vZmZzZXRzLmdldChoYXNoKSk7XG4gICAgfVxuICAgIGJ1ZmZlcnMucHVzaChvZmZzZXRzQnVmZmVyLmJ1ZmZlcik7XG4gICAgLy8gV3JpdGUgb3V0IHBhY2tmaWxlIGNoZWNrc3VtXG4gICAgd3JpdGUodGhpcy5wYWNrZmlsZVNoYSwgJ2hleCcpO1xuICAgIC8vIFdyaXRlIG91dCBzaGFzdW1cbiAgICBjb25zdCB0b3RhbEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG4gICAgY29uc3Qgc2hhID0gYXdhaXQgc2hhc3VtKHRvdGFsQnVmZmVyKTtcbiAgICBjb25zdCBzaGFCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMjApO1xuICAgIHNoYUJ1ZmZlci53cml0ZShzaGEsICdoZXgnKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbdG90YWxCdWZmZXIsIHNoYUJ1ZmZlcl0pXG4gIH1cblxuICBhc3luYyBsb2FkKHsgcGFjayB9KSB7XG4gICAgdGhpcy5wYWNrID0gcGFjaztcbiAgfVxuXG4gIGFzeW5jIHVubG9hZCgpIHtcbiAgICB0aGlzLnBhY2sgPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgcmVhZCh7IG9pZCB9KSB7XG4gICAgaWYgKCF0aGlzLm9mZnNldHMuZ2V0KG9pZCkpIHtcbiAgICAgIGlmICh0aGlzLmdldEV4dGVybmFsUmVmRGVsdGEpIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbFJlYWREZXB0aCsrO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFeHRlcm5hbFJlZkRlbHRhKG9pZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgcmVhZCBvYmplY3QgJHtvaWR9IGZyb20gcGFja2ZpbGVgKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzdGFydCA9IHRoaXMub2Zmc2V0cy5nZXQob2lkKTtcbiAgICByZXR1cm4gdGhpcy5yZWFkU2xpY2UoeyBzdGFydCB9KVxuICB9XG5cbiAgYXN5bmMgcmVhZFNsaWNlKHsgc3RhcnQgfSkge1xuICAgIGlmICh0aGlzLm9mZnNldENhY2hlW3N0YXJ0XSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub2Zmc2V0Q2FjaGVbc3RhcnRdKVxuICAgIH1cbiAgICB0aGlzLnJlYWREZXB0aCsrO1xuICAgIGNvbnN0IHR5cGVzID0ge1xuICAgICAgMGIwMDEwMDAwOiAnY29tbWl0JyxcbiAgICAgIDBiMDEwMDAwMDogJ3RyZWUnLFxuICAgICAgMGIwMTEwMDAwOiAnYmxvYicsXG4gICAgICAwYjEwMDAwMDA6ICd0YWcnLFxuICAgICAgMGIxMTAwMDAwOiAnb2ZzX2RlbHRhJyxcbiAgICAgIDBiMTExMDAwMDogJ3JlZl9kZWx0YScsXG4gICAgfTtcbiAgICBpZiAoIXRoaXMucGFjaykge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICdUcmllZCB0byByZWFkIGZyb20gYSBHaXRQYWNrSW5kZXggd2l0aCBubyBwYWNrZmlsZSBsb2FkZWQgaW50byBtZW1vcnknXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IHJhdyA9IChhd2FpdCB0aGlzLnBhY2spLnNsaWNlKHN0YXJ0KTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgQnVmZmVyQ3Vyc29yKHJhdyk7XG4gICAgY29uc3QgYnl0ZSA9IHJlYWRlci5yZWFkVUludDgoKTtcbiAgICAvLyBPYmplY3QgdHlwZSBpcyBlbmNvZGVkIGluIGJpdHMgNjU0XG4gICAgY29uc3QgYnR5cGUgPSBieXRlICYgMGIxMTEwMDAwO1xuICAgIGxldCB0eXBlID0gdHlwZXNbYnR5cGVdO1xuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCdVbnJlY29nbml6ZWQgdHlwZTogMGInICsgYnR5cGUudG9TdHJpbmcoMikpXG4gICAgfVxuICAgIC8vIFRoZSBsZW5ndGggZW5jb2RpbmcgZ2V0IGNvbXBsaWNhdGVkLlxuICAgIC8vIExhc3QgZm91ciBiaXRzIG9mIGxlbmd0aCBpcyBlbmNvZGVkIGluIGJpdHMgMzIxMFxuICAgIGNvbnN0IGxhc3RGb3VyID0gYnl0ZSAmIDBiMTExMTtcbiAgICBsZXQgbGVuZ3RoID0gbGFzdEZvdXI7XG4gICAgLy8gV2hldGhlciB0aGUgbmV4dCBieXRlIGlzIHBhcnQgb2YgdGhlIHZhcmlhYmxlLWxlbmd0aCBlbmNvZGVkIG51bWJlclxuICAgIC8vIGlzIGVuY29kZWQgaW4gYml0IDdcbiAgICBjb25zdCBtdWx0aWJ5dGUgPSBieXRlICYgMGIxMDAwMDAwMDtcbiAgICBpZiAobXVsdGlieXRlKSB7XG4gICAgICBsZW5ndGggPSBvdGhlclZhckludERlY29kZShyZWFkZXIsIGxhc3RGb3VyKTtcbiAgICB9XG4gICAgbGV0IGJhc2UgPSBudWxsO1xuICAgIGxldCBvYmplY3QgPSBudWxsO1xuICAgIC8vIEhhbmRsZSBkZWx0aWZpZWQgb2JqZWN0c1xuICAgIGlmICh0eXBlID09PSAnb2ZzX2RlbHRhJykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gZGVjb2RlVmFySW50KHJlYWRlcik7XG4gICAgICBjb25zdCBiYXNlT2Zmc2V0ID0gc3RhcnQgLSBvZmZzZXRcbiAgICAgIDsoeyBvYmplY3Q6IGJhc2UsIHR5cGUgfSA9IGF3YWl0IHRoaXMucmVhZFNsaWNlKHsgc3RhcnQ6IGJhc2VPZmZzZXQgfSkpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ3JlZl9kZWx0YScpIHtcbiAgICAgIGNvbnN0IG9pZCA9IHJlYWRlci5zbGljZSgyMCkudG9TdHJpbmcoJ2hleCcpXG4gICAgICA7KHsgb2JqZWN0OiBiYXNlLCB0eXBlIH0gPSBhd2FpdCB0aGlzLnJlYWQoeyBvaWQgfSkpO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgdW5kZWx0aWZpZWQgb2JqZWN0c1xuICAgIGNvbnN0IGJ1ZmZlciA9IHJhdy5zbGljZShyZWFkZXIudGVsbCgpKTtcbiAgICBvYmplY3QgPSBCdWZmZXIuZnJvbShhd2FpdCBpbmZsYXRlKGJ1ZmZlcikpO1xuICAgIC8vIEFzc2VydCB0aGF0IHRoZSBvYmplY3QgbGVuZ3RoIGlzIGFzIGV4cGVjdGVkLlxuICAgIGlmIChvYmplY3QuYnl0ZUxlbmd0aCAhPT0gbGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFBhY2tmaWxlIHRvbGQgdXMgb2JqZWN0IHdvdWxkIGhhdmUgbGVuZ3RoICR7bGVuZ3RofSBidXQgaXQgaGFkIGxlbmd0aCAke29iamVjdC5ieXRlTGVuZ3RofWBcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKGJhc2UpIHtcbiAgICAgIG9iamVjdCA9IEJ1ZmZlci5mcm9tKGFwcGx5RGVsdGEob2JqZWN0LCBiYXNlKSk7XG4gICAgfVxuICAgIC8vIENhY2hlIHRoZSByZXN1bHQgYmFzZWQgb24gZGVwdGguXG4gICAgaWYgKHRoaXMucmVhZERlcHRoID4gMykge1xuICAgICAgLy8gaGFuZCB0dW5lZCBmb3Igc3BlZWQgLyBtZW1vcnkgdXNhZ2UgdHJhZGVvZmZcbiAgICAgIHRoaXMub2Zmc2V0Q2FjaGVbc3RhcnRdID0geyB0eXBlLCBvYmplY3QgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZSwgZm9ybWF0OiAnY29udGVudCcsIG9iamVjdCB9XG4gIH1cbn1cblxuY29uc3QgUGFja2ZpbGVDYWNoZSA9IFN5bWJvbCgnUGFja2ZpbGVDYWNoZScpO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkUGFja0luZGV4KHtcbiAgZnMsXG4gIGZpbGVuYW1lLFxuICBnZXRFeHRlcm5hbFJlZkRlbHRhLFxuICBlbWl0dGVyLFxuICBlbWl0dGVyUHJlZml4LFxufSkge1xuICBjb25zdCBpZHggPSBhd2FpdCBmcy5yZWFkKGZpbGVuYW1lKTtcbiAgcmV0dXJuIEdpdFBhY2tJbmRleC5mcm9tSWR4KHsgaWR4LCBnZXRFeHRlcm5hbFJlZkRlbHRhIH0pXG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrSW5kZXgoe1xuICBmcyxcbiAgY2FjaGUsXG4gIGZpbGVuYW1lLFxuICBnZXRFeHRlcm5hbFJlZkRlbHRhLFxuICBlbWl0dGVyLFxuICBlbWl0dGVyUHJlZml4LFxufSkge1xuICAvLyBUcnkgdG8gZ2V0IHRoZSBwYWNrZmlsZSBpbmRleCBmcm9tIHRoZSBpbi1tZW1vcnkgY2FjaGVcbiAgaWYgKCFjYWNoZVtQYWNrZmlsZUNhY2hlXSkgY2FjaGVbUGFja2ZpbGVDYWNoZV0gPSBuZXcgTWFwKCk7XG4gIGxldCBwID0gY2FjaGVbUGFja2ZpbGVDYWNoZV0uZ2V0KGZpbGVuYW1lKTtcbiAgaWYgKCFwKSB7XG4gICAgcCA9IGxvYWRQYWNrSW5kZXgoe1xuICAgICAgZnMsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGdldEV4dGVybmFsUmVmRGVsdGEsXG4gICAgICBlbWl0dGVyLFxuICAgICAgZW1pdHRlclByZWZpeCxcbiAgICB9KTtcbiAgICBjYWNoZVtQYWNrZmlsZUNhY2hlXS5zZXQoZmlsZW5hbWUsIHApO1xuICB9XG4gIHJldHVybiBwXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRPYmplY3RQYWNrZWQoe1xuICBmcyxcbiAgY2FjaGUsXG4gIGdpdGRpcixcbiAgb2lkLFxuICBmb3JtYXQgPSAnY29udGVudCcsXG4gIGdldEV4dGVybmFsUmVmRGVsdGEsXG59KSB7XG4gIC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIGluIGEgcGFja2ZpbGUuXG4gIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIC5pZHggZmlsZXNcbiAgbGV0IGxpc3QgPSBhd2FpdCBmcy5yZWFkZGlyKGpvaW4oZ2l0ZGlyLCAnb2JqZWN0cy9wYWNrJykpO1xuICBsaXN0ID0gbGlzdC5maWx0ZXIoeCA9PiB4LmVuZHNXaXRoKCcuaWR4JykpO1xuICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGxpc3QpIHtcbiAgICBjb25zdCBpbmRleEZpbGUgPSBgJHtnaXRkaXJ9L29iamVjdHMvcGFjay8ke2ZpbGVuYW1lfWA7XG4gICAgY29uc3QgcCA9IGF3YWl0IHJlYWRQYWNrSW5kZXgoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIGZpbGVuYW1lOiBpbmRleEZpbGUsXG4gICAgICBnZXRFeHRlcm5hbFJlZkRlbHRhLFxuICAgIH0pO1xuICAgIGlmIChwLmVycm9yKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihwLmVycm9yKVxuICAgIC8vIElmIHRoZSBwYWNrZmlsZSBET0VTIGhhdmUgdGhlIG9pZCB3ZSdyZSBsb29raW5nIGZvci4uLlxuICAgIGlmIChwLm9mZnNldHMuaGFzKG9pZCkpIHtcbiAgICAgIC8vIEdldCB0aGUgcmVzb2x2ZWQgZ2l0IG9iamVjdCBmcm9tIHRoZSBwYWNrZmlsZVxuICAgICAgaWYgKCFwLnBhY2spIHtcbiAgICAgICAgY29uc3QgcGFja0ZpbGUgPSBpbmRleEZpbGUucmVwbGFjZSgvaWR4JC8sICdwYWNrJyk7XG4gICAgICAgIHAucGFjayA9IGZzLnJlYWQocGFja0ZpbGUpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcC5yZWFkKHsgb2lkLCBnZXRFeHRlcm5hbFJlZkRlbHRhIH0pO1xuICAgICAgcmVzdWx0LmZvcm1hdCA9ICdjb250ZW50JztcbiAgICAgIHJlc3VsdC5zb3VyY2UgPSBgb2JqZWN0cy9wYWNrLyR7ZmlsZW5hbWUucmVwbGFjZSgvaWR4JC8sICdwYWNrJyl9YDtcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1cbiAgLy8gRmFpbGVkIHRvIGZpbmQgaXRcbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHthbnl9IGFyZ3MuY2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdpdGRpclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub2lkXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZm9ybWF0XVxuICovXG5hc3luYyBmdW5jdGlvbiBfcmVhZE9iamVjdCh7XG4gIGZzLFxuICBjYWNoZSxcbiAgZ2l0ZGlyLFxuICBvaWQsXG4gIGZvcm1hdCA9ICdjb250ZW50Jyxcbn0pIHtcbiAgLy8gQ3VycnkgdGhlIGN1cnJlbnQgcmVhZCBtZXRob2Qgc28gdGhhdCB0aGUgcGFja2ZpbGUgdW4tZGVsdGlmaWNhdGlvblxuICAvLyBwcm9jZXNzIGNhbiBhY3F1aXJlIGV4dGVybmFsIHJlZi1kZWx0YXMuXG4gIGNvbnN0IGdldEV4dGVybmFsUmVmRGVsdGEgPSBvaWQgPT4gX3JlYWRPYmplY3QoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pO1xuXG4gIGxldCByZXN1bHQ7XG4gIC8vIEVtcHR5IHRyZWUgLSBoYXJkLWNvZGVkIHNvIHdlIGNhbiB1c2UgaXQgYXMgYSBzaG9ydGhhbmQuXG4gIC8vIE5vdGU6IEkgdGhpbmsgdGhlIGNhbm9uaWNhbCBnaXQgaW1wbGVtZW50YXRpb24gbXVzdCBkbyB0aGlzIHRvbyBiZWNhdXNlXG4gIC8vIGBnaXQgY2F0LWZpbGUgLXQgNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNGAgcHJpbnRzIFwidHJlZVwiIGV2ZW4gaW4gZW1wdHkgcmVwb3MuXG4gIGlmIChvaWQgPT09ICc0YjgyNWRjNjQyY2I2ZWI5YTA2MGU1NGJmOGQ2OTI4OGZiZWU0OTA0Jykge1xuICAgIHJlc3VsdCA9IHsgZm9ybWF0OiAnd3JhcHBlZCcsIG9iamVjdDogQnVmZmVyLmZyb20oYHRyZWUgMFxceDAwYCkgfTtcbiAgfVxuICAvLyBMb29rIGZvciBpdCBpbiB0aGUgbG9vc2Ugb2JqZWN0IGRpcmVjdG9yeS5cbiAgaWYgKCFyZXN1bHQpIHtcbiAgICByZXN1bHQgPSBhd2FpdCByZWFkT2JqZWN0TG9vc2UoeyBmcywgZ2l0ZGlyLCBvaWQgfSk7XG4gIH1cbiAgLy8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgaW4gYSBwYWNrZmlsZS5cbiAgaWYgKCFyZXN1bHQpIHtcbiAgICByZXN1bHQgPSBhd2FpdCByZWFkT2JqZWN0UGFja2VkKHtcbiAgICAgIGZzLFxuICAgICAgY2FjaGUsXG4gICAgICBnaXRkaXIsXG4gICAgICBvaWQsXG4gICAgICBnZXRFeHRlcm5hbFJlZkRlbHRhLFxuICAgIH0pO1xuICB9XG4gIC8vIEZpbmFsbHlcbiAgaWYgKCFyZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihvaWQpXG4gIH1cblxuICBpZiAoZm9ybWF0ID09PSAnZGVmbGF0ZWQnKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgaWYgKHJlc3VsdC5mb3JtYXQgPT09ICdkZWZsYXRlZCcpIHtcbiAgICByZXN1bHQub2JqZWN0ID0gQnVmZmVyLmZyb20oYXdhaXQgaW5mbGF0ZShyZXN1bHQub2JqZWN0KSk7XG4gICAgcmVzdWx0LmZvcm1hdCA9ICd3cmFwcGVkJztcbiAgfVxuXG4gIGlmIChyZXN1bHQuZm9ybWF0ID09PSAnd3JhcHBlZCcpIHtcbiAgICBpZiAoZm9ybWF0ID09PSAnd3JhcHBlZCcgJiYgcmVzdWx0LmZvcm1hdCA9PT0gJ3dyYXBwZWQnKSB7XG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICAgIGNvbnN0IHNoYSA9IGF3YWl0IHNoYXN1bShyZXN1bHQub2JqZWN0KTtcbiAgICBpZiAoc2hhICE9PSBvaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgU0hBIGNoZWNrIGZhaWxlZCEgRXhwZWN0ZWQgJHtvaWR9LCBjb21wdXRlZCAke3NoYX1gXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IHsgb2JqZWN0LCB0eXBlIH0gPSBHaXRPYmplY3QudW53cmFwKHJlc3VsdC5vYmplY3QpO1xuICAgIHJlc3VsdC50eXBlID0gdHlwZTtcbiAgICByZXN1bHQub2JqZWN0ID0gb2JqZWN0O1xuICAgIHJlc3VsdC5mb3JtYXQgPSAnY29udGVudCc7XG4gIH1cblxuICBpZiAocmVzdWx0LmZvcm1hdCA9PT0gJ2NvbnRlbnQnKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ2NvbnRlbnQnKSByZXR1cm4gcmVzdWx0XG4gICAgcmV0dXJuXG4gIH1cblxuICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgaW52YWxpZCBmb3JtYXQgXCIke3Jlc3VsdC5mb3JtYXR9XCJgKVxufVxuXG5jbGFzcyBBbHJlYWR5RXhpc3RzRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHsnbm90ZSd8J3JlbW90ZSd8J3RhZyd8J2JyYW5jaCd9IG5vdW5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHdoZXJlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2FuRm9yY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5vdW4sIHdoZXJlLCBjYW5Gb3JjZSA9IHRydWUpIHtcbiAgICBzdXBlcihcbiAgICAgIGBGYWlsZWQgdG8gY3JlYXRlICR7bm91bn0gYXQgJHt3aGVyZX0gYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy4ke1xuICAgICAgICBjYW5Gb3JjZVxuICAgICAgICAgID8gYCAoSGludDogdXNlICdmb3JjZTogdHJ1ZScgcGFyYW1ldGVyIHRvIG92ZXJ3cml0ZSBleGlzdGluZyAke25vdW59LilgXG4gICAgICAgICAgOiAnJ1xuICAgICAgfWBcbiAgICApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IEFscmVhZHlFeGlzdHNFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgbm91biwgd2hlcmUsIGNhbkZvcmNlIH07XG4gIH1cbn1cbi8qKiBAdHlwZSB7J0FscmVhZHlFeGlzdHNFcnJvcid9ICovXG5BbHJlYWR5RXhpc3RzRXJyb3IuY29kZSA9ICdBbHJlYWR5RXhpc3RzRXJyb3InO1xuXG5jbGFzcyBBbWJpZ3VvdXNFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0geydvaWRzJ3wncmVmcyd9IG5vdW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaG9ydFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBtYXRjaGVzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihub3Vucywgc2hvcnQsIG1hdGNoZXMpIHtcbiAgICBzdXBlcihcbiAgICAgIGBGb3VuZCBtdWx0aXBsZSAke25vdW5zfSBtYXRjaGluZyBcIiR7c2hvcnR9XCIgKCR7bWF0Y2hlcy5qb2luKFxuICAgICAgICAnLCAnXG4gICAgICApfSkuIFVzZSBhIGxvbmdlciBhYmJyZXZpYXRpb24gbGVuZ3RoIHRvIGRpc2FtYmlndWF0ZSB0aGVtLmBcbiAgICApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IEFtYmlndW91c0Vycm9yLmNvZGU7XG4gICAgdGhpcy5kYXRhID0geyBub3Vucywgc2hvcnQsIG1hdGNoZXMgfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnQW1iaWd1b3VzRXJyb3InfSAqL1xuQW1iaWd1b3VzRXJyb3IuY29kZSA9ICdBbWJpZ3VvdXNFcnJvcic7XG5cbmNsYXNzIENoZWNrb3V0Q29uZmxpY3RFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmaWxlcGF0aHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKGZpbGVwYXRocykge1xuICAgIHN1cGVyKFxuICAgICAgYFlvdXIgbG9jYWwgY2hhbmdlcyB0byB0aGUgZm9sbG93aW5nIGZpbGVzIHdvdWxkIGJlIG92ZXJ3cml0dGVuIGJ5IGNoZWNrb3V0OiAke2ZpbGVwYXRocy5qb2luKFxuICAgICAgICAnLCAnXG4gICAgICApfWBcbiAgICApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IENoZWNrb3V0Q29uZmxpY3RFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgZmlsZXBhdGhzIH07XG4gIH1cbn1cbi8qKiBAdHlwZSB7J0NoZWNrb3V0Q29uZmxpY3RFcnJvcid9ICovXG5DaGVja291dENvbmZsaWN0RXJyb3IuY29kZSA9ICdDaGVja291dENvbmZsaWN0RXJyb3InO1xuXG5jbGFzcyBDb21taXROb3RGZXRjaGVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2lkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWYsIG9pZCkge1xuICAgIHN1cGVyKFxuICAgICAgYEZhaWxlZCB0byBjaGVja291dCBcIiR7cmVmfVwiIGJlY2F1c2UgY29tbWl0ICR7b2lkfSBpcyBub3QgYXZhaWxhYmxlIGxvY2FsbHkuIERvIGEgZ2l0IGZldGNoIHRvIG1ha2UgdGhlIGJyYW5jaCBhdmFpbGFibGUgbG9jYWxseS5gXG4gICAgKTtcbiAgICB0aGlzLmNvZGUgPSB0aGlzLm5hbWUgPSBDb21taXROb3RGZXRjaGVkRXJyb3IuY29kZTtcbiAgICB0aGlzLmRhdGEgPSB7IHJlZiwgb2lkIH07XG4gIH1cbn1cbi8qKiBAdHlwZSB7J0NvbW1pdE5vdEZldGNoZWRFcnJvcid9ICovXG5Db21taXROb3RGZXRjaGVkRXJyb3IuY29kZSA9ICdDb21taXROb3RGZXRjaGVkRXJyb3InO1xuXG5jbGFzcyBFbXB0eVNlcnZlclJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihgRW1wdHkgcmVzcG9uc2UgZnJvbSBnaXQgc2VydmVyLmApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IEVtcHR5U2VydmVyUmVzcG9uc2VFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHt9O1xuICB9XG59XG4vKiogQHR5cGUgeydFbXB0eVNlcnZlclJlc3BvbnNlRXJyb3InfSAqL1xuRW1wdHlTZXJ2ZXJSZXNwb25zZUVycm9yLmNvZGUgPSAnRW1wdHlTZXJ2ZXJSZXNwb25zZUVycm9yJztcblxuY2xhc3MgRmFzdEZvcndhcmRFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGBBIHNpbXBsZSBmYXN0LWZvcndhcmQgbWVyZ2Ugd2FzIG5vdCBwb3NzaWJsZS5gKTtcbiAgICB0aGlzLmNvZGUgPSB0aGlzLm5hbWUgPSBGYXN0Rm9yd2FyZEVycm9yLmNvZGU7XG4gICAgdGhpcy5kYXRhID0ge307XG4gIH1cbn1cbi8qKiBAdHlwZSB7J0Zhc3RGb3J3YXJkRXJyb3InfSAqL1xuRmFzdEZvcndhcmRFcnJvci5jb2RlID0gJ0Zhc3RGb3J3YXJkRXJyb3InO1xuXG5jbGFzcyBHaXRQdXNoRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZXR0eURldGFpbHNcbiAgICogQHBhcmFtIHtQdXNoUmVzdWx0fSByZXN1bHRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByZXR0eURldGFpbHMsIHJlc3VsdCkge1xuICAgIHN1cGVyKGBPbmUgb3IgbW9yZSBicmFuY2hlcyB3ZXJlIG5vdCB1cGRhdGVkOiAke3ByZXR0eURldGFpbHN9YCk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5uYW1lID0gR2l0UHVzaEVycm9yLmNvZGU7XG4gICAgdGhpcy5kYXRhID0geyBwcmV0dHlEZXRhaWxzLCByZXN1bHQgfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnR2l0UHVzaEVycm9yJ30gKi9cbkdpdFB1c2hFcnJvci5jb2RlID0gJ0dpdFB1c2hFcnJvcic7XG5cbmNsYXNzIEh0dHBFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzQ29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzTWVzc2FnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UsIHJlc3BvbnNlKSB7XG4gICAgc3VwZXIoYEhUVFAgRXJyb3I6ICR7c3RhdHVzQ29kZX0gJHtzdGF0dXNNZXNzYWdlfWApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IEh0dHBFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgc3RhdHVzQ29kZSwgc3RhdHVzTWVzc2FnZSwgcmVzcG9uc2UgfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnSHR0cEVycm9yJ30gKi9cbkh0dHBFcnJvci5jb2RlID0gJ0h0dHBFcnJvcic7XG5cbmNsYXNzIEludmFsaWRGaWxlcGF0aEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7J2xlYWRpbmctc2xhc2gnfCd0cmFpbGluZy1zbGFzaCd8J2RpcmVjdG9yeSd9IFtyZWFzb25dXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWFzb24pIHtcbiAgICBsZXQgbWVzc2FnZSA9ICdpbnZhbGlkIGZpbGVwYXRoJztcbiAgICBpZiAocmVhc29uID09PSAnbGVhZGluZy1zbGFzaCcgfHwgcmVhc29uID09PSAndHJhaWxpbmctc2xhc2gnKSB7XG4gICAgICBtZXNzYWdlID0gYFwiZmlsZXBhdGhcIiBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvcnMgYmVjYXVzZSB0aGVzZSBjYW4gY2F1c2UgcHJvYmxlbXMgb24gc29tZSBwbGF0Zm9ybXMuYDtcbiAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICAgIG1lc3NhZ2UgPSBgXCJmaWxlcGF0aFwiIHNob3VsZCBub3QgYmUgYSBkaXJlY3RvcnkuYDtcbiAgICB9XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5uYW1lID0gSW52YWxpZEZpbGVwYXRoRXJyb3IuY29kZTtcbiAgICB0aGlzLmRhdGEgPSB7IHJlYXNvbiB9O1xuICB9XG59XG4vKiogQHR5cGUgeydJbnZhbGlkRmlsZXBhdGhFcnJvcid9ICovXG5JbnZhbGlkRmlsZXBhdGhFcnJvci5jb2RlID0gJ0ludmFsaWRGaWxlcGF0aEVycm9yJztcblxuY2xhc3MgSW52YWxpZFJlZk5hbWVFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWdnZXN0aW9uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2FuRm9yY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHJlZiwgc3VnZ2VzdGlvbikge1xuICAgIHN1cGVyKFxuICAgICAgYFwiJHtyZWZ9XCIgd291bGQgYmUgYW4gaW52YWxpZCBnaXQgcmVmZXJlbmNlLiAoSGludDogYSB2YWxpZCBhbHRlcm5hdGl2ZSB3b3VsZCBiZSBcIiR7c3VnZ2VzdGlvbn1cIi4pYFxuICAgICk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5uYW1lID0gSW52YWxpZFJlZk5hbWVFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgcmVmLCBzdWdnZXN0aW9uIH07XG4gIH1cbn1cbi8qKiBAdHlwZSB7J0ludmFsaWRSZWZOYW1lRXJyb3InfSAqL1xuSW52YWxpZFJlZk5hbWVFcnJvci5jb2RlID0gJ0ludmFsaWRSZWZOYW1lRXJyb3InO1xuXG5jbGFzcyBNYXhEZXB0aEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aFxuICAgKi9cbiAgY29uc3RydWN0b3IoZGVwdGgpIHtcbiAgICBzdXBlcihgTWF4aW11bSBzZWFyY2ggZGVwdGggb2YgJHtkZXB0aH0gZXhjZWVkZWQuYCk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5uYW1lID0gTWF4RGVwdGhFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgZGVwdGggfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnTWF4RGVwdGhFcnJvcid9ICovXG5NYXhEZXB0aEVycm9yLmNvZGUgPSAnTWF4RGVwdGhFcnJvcic7XG5cbmNsYXNzIE1lcmdlTm90U3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihgTWVyZ2VzIHdpdGggY29uZmxpY3RzIGFyZSBub3Qgc3VwcG9ydGVkIHlldC5gKTtcbiAgICB0aGlzLmNvZGUgPSB0aGlzLm5hbWUgPSBNZXJnZU5vdFN1cHBvcnRlZEVycm9yLmNvZGU7XG4gICAgdGhpcy5kYXRhID0ge307XG4gIH1cbn1cbi8qKiBAdHlwZSB7J01lcmdlTm90U3VwcG9ydGVkRXJyb3InfSAqL1xuTWVyZ2VOb3RTdXBwb3J0ZWRFcnJvci5jb2RlID0gJ01lcmdlTm90U3VwcG9ydGVkRXJyb3InO1xuXG5jbGFzcyBNZXJnZUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBmaWxlcGF0aHNcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBib3RoTW9kaWZpZWRcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBkZWxldGVCeVVzXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZGVsZXRlQnlUaGVpcnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKGZpbGVwYXRocywgYm90aE1vZGlmaWVkLCBkZWxldGVCeVVzLCBkZWxldGVCeVRoZWlycykge1xuICAgIHN1cGVyKFxuICAgICAgYEF1dG9tYXRpYyBtZXJnZSBmYWlsZWQgd2l0aCBvbmUgb3IgbW9yZSBtZXJnZSBjb25mbGljdHMgaW4gdGhlIGZvbGxvd2luZyBmaWxlczogJHtmaWxlcGF0aHMudG9TdHJpbmcoKX0uIEZpeCBjb25mbGljdHMgdGhlbiBjb21taXQgdGhlIHJlc3VsdC5gXG4gICAgKTtcbiAgICB0aGlzLmNvZGUgPSB0aGlzLm5hbWUgPSBNZXJnZUNvbmZsaWN0RXJyb3IuY29kZTtcbiAgICB0aGlzLmRhdGEgPSB7IGZpbGVwYXRocywgYm90aE1vZGlmaWVkLCBkZWxldGVCeVVzLCBkZWxldGVCeVRoZWlycyB9O1xuICB9XG59XG4vKiogQHR5cGUgeydNZXJnZUNvbmZsaWN0RXJyb3InfSAqL1xuTWVyZ2VDb25mbGljdEVycm9yLmNvZGUgPSAnTWVyZ2VDb25mbGljdEVycm9yJztcblxuY2xhc3MgTWlzc2luZ05hbWVFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0geydhdXRob3InfCdjb21taXR0ZXInfCd0YWdnZXInfSByb2xlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihyb2xlKSB7XG4gICAgc3VwZXIoXG4gICAgICBgTm8gbmFtZSB3YXMgcHJvdmlkZWQgZm9yICR7cm9sZX0gaW4gdGhlIGFyZ3VtZW50IG9yIGluIHRoZSAuZ2l0L2NvbmZpZyBmaWxlLmBcbiAgICApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IE1pc3NpbmdOYW1lRXJyb3IuY29kZTtcbiAgICB0aGlzLmRhdGEgPSB7IHJvbGUgfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnTWlzc2luZ05hbWVFcnJvcid9ICovXG5NaXNzaW5nTmFtZUVycm9yLmNvZGUgPSAnTWlzc2luZ05hbWVFcnJvcic7XG5cbmNsYXNzIE1pc3NpbmdQYXJhbWV0ZXJFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1ldGVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXIpIHtcbiAgICBzdXBlcihcbiAgICAgIGBUaGUgZnVuY3Rpb24gcmVxdWlyZXMgYSBcIiR7cGFyYW1ldGVyfVwiIHBhcmFtZXRlciBidXQgbm9uZSB3YXMgcHJvdmlkZWQuYFxuICAgICk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5uYW1lID0gTWlzc2luZ1BhcmFtZXRlckVycm9yLmNvZGU7XG4gICAgdGhpcy5kYXRhID0geyBwYXJhbWV0ZXIgfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnTWlzc2luZ1BhcmFtZXRlckVycm9yJ30gKi9cbk1pc3NpbmdQYXJhbWV0ZXJFcnJvci5jb2RlID0gJ01pc3NpbmdQYXJhbWV0ZXJFcnJvcic7XG5cbmNsYXNzIE11bHRpcGxlR2l0RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtFcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVycm9ycykge1xuICAgIHN1cGVyKFxuICAgICAgYFRoZXJlIGFyZSBtdWx0aXBsZSBlcnJvcnMgdGhhdCB3ZXJlIHRocm93biBieSB0aGUgbWV0aG9kLiBQbGVhc2UgcmVmZXIgdG8gdGhlIFwiZXJyb3JzXCIgcHJvcGVydHkgdG8gc2VlIG1vcmVgXG4gICAgKTtcbiAgICB0aGlzLmNvZGUgPSB0aGlzLm5hbWUgPSBNdWx0aXBsZUdpdEVycm9yLmNvZGU7XG4gICAgdGhpcy5kYXRhID0geyBlcnJvcnMgfTtcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgfVxufVxuLyoqIEB0eXBlIHsnTXVsdGlwbGVHaXRFcnJvcid9ICovXG5NdWx0aXBsZUdpdEVycm9yLmNvZGUgPSAnTXVsdGlwbGVHaXRFcnJvcic7XG5cbmNsYXNzIFBhcnNlRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3R1YWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKGV4cGVjdGVkLCBhY3R1YWwpIHtcbiAgICBzdXBlcihgRXhwZWN0ZWQgXCIke2V4cGVjdGVkfVwiIGJ1dCByZWNlaXZlZCBcIiR7YWN0dWFsfVwiLmApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IFBhcnNlRXJyb3IuY29kZTtcbiAgICB0aGlzLmRhdGEgPSB7IGV4cGVjdGVkLCBhY3R1YWwgfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnUGFyc2VFcnJvcid9ICovXG5QYXJzZUVycm9yLmNvZGUgPSAnUGFyc2VFcnJvcic7XG5cbmNsYXNzIFB1c2hSZWplY3RlZEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7J25vdC1mYXN0LWZvcndhcmQnfCd0YWctZXhpc3RzJ30gcmVhc29uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWFzb24pIHtcbiAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgIGlmIChyZWFzb24gPT09ICdub3QtZmFzdC1mb3J3YXJkJykge1xuICAgICAgbWVzc2FnZSA9ICcgYmVjYXVzZSBpdCB3YXMgbm90IGEgc2ltcGxlIGZhc3QtZm9yd2FyZCc7XG4gICAgfSBlbHNlIGlmIChyZWFzb24gPT09ICd0YWctZXhpc3RzJykge1xuICAgICAgbWVzc2FnZSA9ICcgYmVjYXVzZSB0YWcgYWxyZWFkeSBleGlzdHMnO1xuICAgIH1cbiAgICBzdXBlcihgUHVzaCByZWplY3RlZCR7bWVzc2FnZX0uIFVzZSBcImZvcmNlOiB0cnVlXCIgdG8gb3ZlcnJpZGUuYCk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5uYW1lID0gUHVzaFJlamVjdGVkRXJyb3IuY29kZTtcbiAgICB0aGlzLmRhdGEgPSB7IHJlYXNvbiB9O1xuICB9XG59XG4vKiogQHR5cGUgeydQdXNoUmVqZWN0ZWRFcnJvcid9ICovXG5QdXNoUmVqZWN0ZWRFcnJvci5jb2RlID0gJ1B1c2hSZWplY3RlZEVycm9yJztcblxuY2xhc3MgUmVtb3RlQ2FwYWJpbGl0eUVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7J3NoYWxsb3cnfCdkZWVwZW4tc2luY2UnfCdkZWVwZW4tbm90J3wnZGVlcGVuLXJlbGF0aXZlJ30gY2FwYWJpbGl0eVxuICAgKiBAcGFyYW0geydkZXB0aCd8J3NpbmNlJ3wnZXhjbHVkZSd8J3JlbGF0aXZlJ30gcGFyYW1ldGVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjYXBhYmlsaXR5LCBwYXJhbWV0ZXIpIHtcbiAgICBzdXBlcihcbiAgICAgIGBSZW1vdGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgXCIke2NhcGFiaWxpdHl9XCIgc28gdGhlIFwiJHtwYXJhbWV0ZXJ9XCIgcGFyYW1ldGVyIGNhbm5vdCBiZSB1c2VkLmBcbiAgICApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IFJlbW90ZUNhcGFiaWxpdHlFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgY2FwYWJpbGl0eSwgcGFyYW1ldGVyIH07XG4gIH1cbn1cbi8qKiBAdHlwZSB7J1JlbW90ZUNhcGFiaWxpdHlFcnJvcid9ICovXG5SZW1vdGVDYXBhYmlsaXR5RXJyb3IuY29kZSA9ICdSZW1vdGVDYXBhYmlsaXR5RXJyb3InO1xuXG5jbGFzcyBTbWFydEh0dHBFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJldmlld1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByZXZpZXcsIHJlc3BvbnNlKSB7XG4gICAgc3VwZXIoXG4gICAgICBgUmVtb3RlIGRpZCBub3QgcmVwbHkgdXNpbmcgdGhlIFwic21hcnRcIiBIVFRQIHByb3RvY29sLiBFeHBlY3RlZCBcIjAwMWUjIHNlcnZpY2U9Z2l0LXVwbG9hZC1wYWNrXCIgYnV0IHJlY2VpdmVkOiAke3ByZXZpZXd9YFxuICAgICk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5uYW1lID0gU21hcnRIdHRwRXJyb3IuY29kZTtcbiAgICB0aGlzLmRhdGEgPSB7IHByZXZpZXcsIHJlc3BvbnNlIH07XG4gIH1cbn1cbi8qKiBAdHlwZSB7J1NtYXJ0SHR0cEVycm9yJ30gKi9cblNtYXJ0SHR0cEVycm9yLmNvZGUgPSAnU21hcnRIdHRwRXJyb3InO1xuXG5jbGFzcyBVbmtub3duVHJhbnNwb3J0RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNwb3J0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3VnZ2VzdGlvbl1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHVybCwgdHJhbnNwb3J0LCBzdWdnZXN0aW9uKSB7XG4gICAgc3VwZXIoXG4gICAgICBgR2l0IHJlbW90ZSBcIiR7dXJsfVwiIHVzZXMgYW4gdW5yZWNvZ25pemVkIHRyYW5zcG9ydCBwcm90b2NvbDogXCIke3RyYW5zcG9ydH1cImBcbiAgICApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IFVua25vd25UcmFuc3BvcnRFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgdXJsLCB0cmFuc3BvcnQsIHN1Z2dlc3Rpb24gfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnVW5rbm93blRyYW5zcG9ydEVycm9yJ30gKi9cblVua25vd25UcmFuc3BvcnRFcnJvci5jb2RlID0gJ1Vua25vd25UcmFuc3BvcnRFcnJvcic7XG5cbmNsYXNzIFVybFBhcnNlRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKi9cbiAgY29uc3RydWN0b3IodXJsKSB7XG4gICAgc3VwZXIoYENhbm5vdCBwYXJzZSByZW1vdGUgVVJMOiBcIiR7dXJsfVwiYCk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5uYW1lID0gVXJsUGFyc2VFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgdXJsIH07XG4gIH1cbn1cbi8qKiBAdHlwZSB7J1VybFBhcnNlRXJyb3InfSAqL1xuVXJsUGFyc2VFcnJvci5jb2RlID0gJ1VybFBhcnNlRXJyb3InO1xuXG5jbGFzcyBVc2VyQ2FuY2VsZWRFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGBUaGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxlZC5gKTtcbiAgICB0aGlzLmNvZGUgPSB0aGlzLm5hbWUgPSBVc2VyQ2FuY2VsZWRFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHt9O1xuICB9XG59XG4vKiogQHR5cGUgeydVc2VyQ2FuY2VsZWRFcnJvcid9ICovXG5Vc2VyQ2FuY2VsZWRFcnJvci5jb2RlID0gJ1VzZXJDYW5jZWxlZEVycm9yJztcblxuY2xhc3MgSW5kZXhSZXNldEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmlsZXBhdGhzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmaWxlcGF0aCkge1xuICAgIHN1cGVyKFxuICAgICAgYENvdWxkIG5vdCBtZXJnZSBpbmRleDogRW50cnkgZm9yICcke2ZpbGVwYXRofScgaXMgbm90IHVwIHRvIGRhdGUuIEVpdGhlciByZXNldCB0aGUgaW5kZXggZW50cnkgdG8gSEVBRCwgb3Igc3RhZ2UgeW91ciB1bnN0YWdlZCBjaGFuZ2VzLmBcbiAgICApO1xuICAgIHRoaXMuY29kZSA9IHRoaXMubmFtZSA9IEluZGV4UmVzZXRFcnJvci5jb2RlO1xuICAgIHRoaXMuZGF0YSA9IHsgZmlsZXBhdGggfTtcbiAgfVxufVxuLyoqIEB0eXBlIHsnSW5kZXhSZXNldEVycm9yJ30gKi9cbkluZGV4UmVzZXRFcnJvci5jb2RlID0gJ0luZGV4UmVzZXRFcnJvcic7XG5cblxuXG52YXIgRXJyb3JzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIEFscmVhZHlFeGlzdHNFcnJvcjogQWxyZWFkeUV4aXN0c0Vycm9yLFxuICBBbWJpZ3VvdXNFcnJvcjogQW1iaWd1b3VzRXJyb3IsXG4gIENoZWNrb3V0Q29uZmxpY3RFcnJvcjogQ2hlY2tvdXRDb25mbGljdEVycm9yLFxuICBDb21taXROb3RGZXRjaGVkRXJyb3I6IENvbW1pdE5vdEZldGNoZWRFcnJvcixcbiAgRW1wdHlTZXJ2ZXJSZXNwb25zZUVycm9yOiBFbXB0eVNlcnZlclJlc3BvbnNlRXJyb3IsXG4gIEZhc3RGb3J3YXJkRXJyb3I6IEZhc3RGb3J3YXJkRXJyb3IsXG4gIEdpdFB1c2hFcnJvcjogR2l0UHVzaEVycm9yLFxuICBIdHRwRXJyb3I6IEh0dHBFcnJvcixcbiAgSW50ZXJuYWxFcnJvcjogSW50ZXJuYWxFcnJvcixcbiAgSW52YWxpZEZpbGVwYXRoRXJyb3I6IEludmFsaWRGaWxlcGF0aEVycm9yLFxuICBJbnZhbGlkT2lkRXJyb3I6IEludmFsaWRPaWRFcnJvcixcbiAgSW52YWxpZFJlZk5hbWVFcnJvcjogSW52YWxpZFJlZk5hbWVFcnJvcixcbiAgTWF4RGVwdGhFcnJvcjogTWF4RGVwdGhFcnJvcixcbiAgTWVyZ2VOb3RTdXBwb3J0ZWRFcnJvcjogTWVyZ2VOb3RTdXBwb3J0ZWRFcnJvcixcbiAgTWVyZ2VDb25mbGljdEVycm9yOiBNZXJnZUNvbmZsaWN0RXJyb3IsXG4gIE1pc3NpbmdOYW1lRXJyb3I6IE1pc3NpbmdOYW1lRXJyb3IsXG4gIE1pc3NpbmdQYXJhbWV0ZXJFcnJvcjogTWlzc2luZ1BhcmFtZXRlckVycm9yLFxuICBNdWx0aXBsZUdpdEVycm9yOiBNdWx0aXBsZUdpdEVycm9yLFxuICBOb1JlZnNwZWNFcnJvcjogTm9SZWZzcGVjRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3I6IE5vdEZvdW5kRXJyb3IsXG4gIE9iamVjdFR5cGVFcnJvcjogT2JqZWN0VHlwZUVycm9yLFxuICBQYXJzZUVycm9yOiBQYXJzZUVycm9yLFxuICBQdXNoUmVqZWN0ZWRFcnJvcjogUHVzaFJlamVjdGVkRXJyb3IsXG4gIFJlbW90ZUNhcGFiaWxpdHlFcnJvcjogUmVtb3RlQ2FwYWJpbGl0eUVycm9yLFxuICBTbWFydEh0dHBFcnJvcjogU21hcnRIdHRwRXJyb3IsXG4gIFVua25vd25UcmFuc3BvcnRFcnJvcjogVW5rbm93blRyYW5zcG9ydEVycm9yLFxuICBVbnNhZmVGaWxlcGF0aEVycm9yOiBVbnNhZmVGaWxlcGF0aEVycm9yLFxuICBVcmxQYXJzZUVycm9yOiBVcmxQYXJzZUVycm9yLFxuICBVc2VyQ2FuY2VsZWRFcnJvcjogVXNlckNhbmNlbGVkRXJyb3IsXG4gIFVubWVyZ2VkUGF0aHNFcnJvcjogVW5tZXJnZWRQYXRoc0Vycm9yLFxuICBJbmRleFJlc2V0RXJyb3I6IEluZGV4UmVzZXRFcnJvclxufSk7XG5cbmZ1bmN0aW9uIGZvcm1hdEF1dGhvcih7IG5hbWUsIGVtYWlsLCB0aW1lc3RhbXAsIHRpbWV6b25lT2Zmc2V0IH0pIHtcbiAgdGltZXpvbmVPZmZzZXQgPSBmb3JtYXRUaW1lem9uZU9mZnNldCh0aW1lem9uZU9mZnNldCk7XG4gIHJldHVybiBgJHtuYW1lfSA8JHtlbWFpbH0+ICR7dGltZXN0YW1wfSAke3RpbWV6b25lT2Zmc2V0fWBcbn1cblxuLy8gVGhlIGFtb3VudCBvZiBlZmZvcnQgdGhhdCB3ZW50IGludG8gY3JhZnRpbmcgdGhlc2UgY2FzZXMgdG8gaGFuZGxlXG4vLyAtMCAoanVzdCBzbyB3ZSBkb24ndCBsb3NlIHRoYXQgaW5mb3JtYXRpb24gd2hlbiBwYXJzaW5nIGFuZCByZWNvbnN0cnVjdGluZylcbi8vIGJ1dCBjYW4gYWxzbyBkZWZhdWx0IHRvICswIHdhcyBleHRyYW9yZGluYXJ5LlxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZU9mZnNldChtaW51dGVzKSB7XG4gIGNvbnN0IHNpZ24gPSBzaW1wbGVTaWduKG5lZ2F0ZUV4Y2VwdEZvclplcm8obWludXRlcykpO1xuICBtaW51dGVzID0gTWF0aC5hYnMobWludXRlcyk7XG4gIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihtaW51dGVzIC8gNjApO1xuICBtaW51dGVzIC09IGhvdXJzICogNjA7XG4gIGxldCBzdHJIb3VycyA9IFN0cmluZyhob3Vycyk7XG4gIGxldCBzdHJNaW51dGVzID0gU3RyaW5nKG1pbnV0ZXMpO1xuICBpZiAoc3RySG91cnMubGVuZ3RoIDwgMikgc3RySG91cnMgPSAnMCcgKyBzdHJIb3VycztcbiAgaWYgKHN0ck1pbnV0ZXMubGVuZ3RoIDwgMikgc3RyTWludXRlcyA9ICcwJyArIHN0ck1pbnV0ZXM7XG4gIHJldHVybiAoc2lnbiA9PT0gLTEgPyAnLScgOiAnKycpICsgc3RySG91cnMgKyBzdHJNaW51dGVzXG59XG5cbmZ1bmN0aW9uIHNpbXBsZVNpZ24obikge1xuICByZXR1cm4gTWF0aC5zaWduKG4pIHx8IChPYmplY3QuaXMobiwgLTApID8gLTEgOiAxKVxufVxuXG5mdW5jdGlvbiBuZWdhdGVFeGNlcHRGb3JaZXJvKG4pIHtcbiAgcmV0dXJuIG4gPT09IDAgPyBuIDogLW5cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV3bGluZXMoc3RyKSB7XG4gIC8vIHJlbW92ZSBhbGwgPENSPlxuICBzdHIgPSBzdHIucmVwbGFjZSgvXFxyL2csICcnKTtcbiAgLy8gbm8gZXh0cmEgbmV3bGluZXMgdXAgZnJvbnRcbiAgc3RyID0gc3RyLnJlcGxhY2UoL15cXG4rLywgJycpO1xuICAvLyBhbmQgYSBzaW5nbGUgbmV3bGluZSBhdCB0aGUgZW5kXG4gIHN0ciA9IHN0ci5yZXBsYWNlKC9cXG4rJC8sICcnKSArICdcXG4nO1xuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHBhcnNlQXV0aG9yKGF1dGhvcikge1xuICBjb25zdCBbLCBuYW1lLCBlbWFpbCwgdGltZXN0YW1wLCBvZmZzZXRdID0gYXV0aG9yLm1hdGNoKFxuICAgIC9eKC4qKSA8KC4qKT4gKC4qKSAoLiopJC9cbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGVtYWlsOiBlbWFpbCxcbiAgICB0aW1lc3RhbXA6IE51bWJlcih0aW1lc3RhbXApLFxuICAgIHRpbWV6b25lT2Zmc2V0OiBwYXJzZVRpbWV6b25lT2Zmc2V0KG9mZnNldCksXG4gIH1cbn1cblxuLy8gVGhlIGFtb3VudCBvZiBlZmZvcnQgdGhhdCB3ZW50IGludG8gY3JhZnRpbmcgdGhlc2UgY2FzZXMgdG8gaGFuZGxlXG4vLyAtMCAoanVzdCBzbyB3ZSBkb24ndCBsb3NlIHRoYXQgaW5mb3JtYXRpb24gd2hlbiBwYXJzaW5nIGFuZCByZWNvbnN0cnVjdGluZylcbi8vIGJ1dCBjYW4gYWxzbyBkZWZhdWx0IHRvICswIHdhcyBleHRyYW9yZGluYXJ5LlxuXG5mdW5jdGlvbiBwYXJzZVRpbWV6b25lT2Zmc2V0KG9mZnNldCkge1xuICBsZXQgWywgc2lnbiwgaG91cnMsIG1pbnV0ZXNdID0gb2Zmc2V0Lm1hdGNoKC8oXFwrfC0pKFxcZFxcZCkoXFxkXFxkKS8pO1xuICBtaW51dGVzID0gKHNpZ24gPT09ICcrJyA/IDEgOiAtMSkgKiAoTnVtYmVyKGhvdXJzKSAqIDYwICsgTnVtYmVyKG1pbnV0ZXMpKTtcbiAgcmV0dXJuIG5lZ2F0ZUV4Y2VwdEZvclplcm8kMShtaW51dGVzKVxufVxuXG5mdW5jdGlvbiBuZWdhdGVFeGNlcHRGb3JaZXJvJDEobikge1xuICByZXR1cm4gbiA9PT0gMCA/IG4gOiAtblxufVxuXG5jbGFzcyBHaXRBbm5vdGF0ZWRUYWcge1xuICBjb25zdHJ1Y3Rvcih0YWcpIHtcbiAgICBpZiAodHlwZW9mIHRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3RhZyA9IHRhZztcbiAgICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcih0YWcpKSB7XG4gICAgICB0aGlzLl90YWcgPSB0YWcudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YWcgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLl90YWcgPSBHaXRBbm5vdGF0ZWRUYWcucmVuZGVyKHRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAnaW52YWxpZCB0eXBlIHBhc3NlZCB0byBHaXRBbm5vdGF0ZWRUYWcgY29uc3RydWN0b3InXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb20odGFnKSB7XG4gICAgcmV0dXJuIG5ldyBHaXRBbm5vdGF0ZWRUYWcodGFnKVxuICB9XG5cbiAgc3RhdGljIHJlbmRlcihvYmopIHtcbiAgICByZXR1cm4gYG9iamVjdCAke29iai5vYmplY3R9XG50eXBlICR7b2JqLnR5cGV9XG50YWcgJHtvYmoudGFnfVxudGFnZ2VyICR7Zm9ybWF0QXV0aG9yKG9iai50YWdnZXIpfVxuXG4ke29iai5tZXNzYWdlfVxuJHtvYmouZ3Bnc2lnID8gb2JqLmdwZ3NpZyA6ICcnfWBcbiAgfVxuXG4gIGp1c3RIZWFkZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl90YWcuc2xpY2UoMCwgdGhpcy5fdGFnLmluZGV4T2YoJ1xcblxcbicpKVxuICB9XG5cbiAgbWVzc2FnZSgpIHtcbiAgICBjb25zdCB0YWcgPSB0aGlzLndpdGhvdXRTaWduYXR1cmUoKTtcbiAgICByZXR1cm4gdGFnLnNsaWNlKHRhZy5pbmRleE9mKCdcXG5cXG4nKSArIDIpXG4gIH1cblxuICBwYXJzZSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLmhlYWRlcnMoKSwge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlKCksXG4gICAgICBncGdzaWc6IHRoaXMuZ3Bnc2lnKCksXG4gICAgfSlcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFnXG4gIH1cblxuICBoZWFkZXJzKCkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmp1c3RIZWFkZXJzKCkuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IGhzID0gW107XG4gICAgZm9yIChjb25zdCBoIG9mIGhlYWRlcnMpIHtcbiAgICAgIGlmIChoWzBdID09PSAnICcpIHtcbiAgICAgICAgLy8gY29tYmluZSB3aXRoIHByZXZpb3VzIGhlYWRlciAod2l0aG91dCBzcGFjZSBpbmRlbnQpXG4gICAgICAgIGhzW2hzLmxlbmd0aCAtIDFdICs9ICdcXG4nICsgaC5zbGljZSgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhzLnB1c2goaCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgIGZvciAoY29uc3QgaCBvZiBocykge1xuICAgICAgY29uc3Qga2V5ID0gaC5zbGljZSgwLCBoLmluZGV4T2YoJyAnKSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGguc2xpY2UoaC5pbmRleE9mKCcgJykgKyAxKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ialtrZXldKSkge1xuICAgICAgICBvYmpba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvYmoudGFnZ2VyKSB7XG4gICAgICBvYmoudGFnZ2VyID0gcGFyc2VBdXRob3Iob2JqLnRhZ2dlcik7XG4gICAgfVxuICAgIGlmIChvYmouY29tbWl0dGVyKSB7XG4gICAgICBvYmouY29tbWl0dGVyID0gcGFyc2VBdXRob3Iob2JqLmNvbW1pdHRlcik7XG4gICAgfVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIHdpdGhvdXRTaWduYXR1cmUoKSB7XG4gICAgY29uc3QgdGFnID0gbm9ybWFsaXplTmV3bGluZXModGhpcy5fdGFnKTtcbiAgICBpZiAodGFnLmluZGV4T2YoJ1xcbi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tJykgPT09IC0xKSByZXR1cm4gdGFnXG4gICAgcmV0dXJuIHRhZy5zbGljZSgwLCB0YWcubGFzdEluZGV4T2YoJ1xcbi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tJykpXG4gIH1cblxuICBncGdzaWcoKSB7XG4gICAgaWYgKHRoaXMuX3RhZy5pbmRleE9mKCdcXG4tLS0tLUJFR0lOIFBHUCBTSUdOQVRVUkUtLS0tLScpID09PSAtMSkgcmV0dXJuXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5fdGFnLnNsaWNlKFxuICAgICAgdGhpcy5fdGFnLmluZGV4T2YoJy0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tJyksXG4gICAgICB0aGlzLl90YWcuaW5kZXhPZignLS0tLS1FTkQgUEdQIFNJR05BVFVSRS0tLS0tJykgK1xuICAgICAgICAnLS0tLS1FTkQgUEdQIFNJR05BVFVSRS0tLS0tJy5sZW5ndGhcbiAgICApO1xuICAgIHJldHVybiBub3JtYWxpemVOZXdsaW5lcyhzaWduYXR1cmUpXG4gIH1cblxuICBwYXlsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLndpdGhvdXRTaWduYXR1cmUoKSArICdcXG4nXG4gIH1cblxuICB0b09iamVjdCgpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5fdGFnLCAndXRmOCcpXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgc2lnbih0YWcsIHNpZ24sIHNlY3JldEtleSkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB0YWcucGF5bG9hZCgpO1xuICAgIGxldCB7IHNpZ25hdHVyZSB9ID0gYXdhaXQgc2lnbih7IHBheWxvYWQsIHNlY3JldEtleSB9KTtcbiAgICAvLyByZW5vcm1hbGl6ZSB0aGUgbGluZSBlbmRpbmdzIHRvIHRoZSBvbmUgdHJ1ZSBsaW5lLWVuZGluZ1xuICAgIHNpZ25hdHVyZSA9IG5vcm1hbGl6ZU5ld2xpbmVzKHNpZ25hdHVyZSk7XG4gICAgY29uc3Qgc2lnbmVkVGFnID0gcGF5bG9hZCArIHNpZ25hdHVyZTtcbiAgICAvLyByZXR1cm4gYSBuZXcgdGFnIG9iamVjdFxuICAgIHJldHVybiBHaXRBbm5vdGF0ZWRUYWcuZnJvbShzaWduZWRUYWcpXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZW50KHN0cikge1xuICByZXR1cm4gKFxuICAgIHN0clxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCh4ID0+ICcgJyArIHgpXG4gICAgICAuam9pbignXFxuJykgKyAnXFxuJ1xuICApXG59XG5cbmZ1bmN0aW9uIG91dGRlbnQoc3RyKSB7XG4gIHJldHVybiBzdHJcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCh4ID0+IHgucmVwbGFjZSgvXiAvLCAnJykpXG4gICAgLmpvaW4oJ1xcbicpXG59XG5cbmNsYXNzIEdpdENvbW1pdCB7XG4gIGNvbnN0cnVjdG9yKGNvbW1pdCkge1xuICAgIGlmICh0eXBlb2YgY29tbWl0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fY29tbWl0ID0gY29tbWl0O1xuICAgIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbW1pdCkpIHtcbiAgICAgIHRoaXMuX2NvbW1pdCA9IGNvbW1pdC50b1N0cmluZygndXRmOCcpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbW1pdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuX2NvbW1pdCA9IEdpdENvbW1pdC5yZW5kZXIoY29tbWl0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoJ2ludmFsaWQgdHlwZSBwYXNzZWQgdG8gR2l0Q29tbWl0IGNvbnN0cnVjdG9yJylcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZnJvbVBheWxvYWRTaWduYXR1cmUoeyBwYXlsb2FkLCBzaWduYXR1cmUgfSkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBHaXRDb21taXQuanVzdEhlYWRlcnMocGF5bG9hZCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IEdpdENvbW1pdC5qdXN0TWVzc2FnZShwYXlsb2FkKTtcbiAgICBjb25zdCBjb21taXQgPSBub3JtYWxpemVOZXdsaW5lcyhcbiAgICAgIGhlYWRlcnMgKyAnXFxuZ3Bnc2lnJyArIGluZGVudChzaWduYXR1cmUpICsgJ1xcbicgKyBtZXNzYWdlXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IEdpdENvbW1pdChjb21taXQpXG4gIH1cblxuICBzdGF0aWMgZnJvbShjb21taXQpIHtcbiAgICByZXR1cm4gbmV3IEdpdENvbW1pdChjb21taXQpXG4gIH1cblxuICB0b09iamVjdCgpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5fY29tbWl0LCAndXRmOCcpXG4gIH1cblxuICAvLyBUb2RvOiBhbGxvdyBzZXR0aW5nIHRoZSBoZWFkZXJzIGFuZCBtZXNzYWdlXG4gIGhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VIZWFkZXJzKClcbiAgfVxuXG4gIC8vIFRvZG86IGFsbG93IHNldHRpbmcgdGhlIGhlYWRlcnMgYW5kIG1lc3NhZ2VcbiAgbWVzc2FnZSgpIHtcbiAgICByZXR1cm4gR2l0Q29tbWl0Lmp1c3RNZXNzYWdlKHRoaXMuX2NvbW1pdClcbiAgfVxuXG4gIHBhcnNlKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgbWVzc2FnZTogdGhpcy5tZXNzYWdlKCkgfSwgdGhpcy5oZWFkZXJzKCkpXG4gIH1cblxuICBzdGF0aWMganVzdE1lc3NhZ2UoY29tbWl0KSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZU5ld2xpbmVzKGNvbW1pdC5zbGljZShjb21taXQuaW5kZXhPZignXFxuXFxuJykgKyAyKSlcbiAgfVxuXG4gIHN0YXRpYyBqdXN0SGVhZGVycyhjb21taXQpIHtcbiAgICByZXR1cm4gY29tbWl0LnNsaWNlKDAsIGNvbW1pdC5pbmRleE9mKCdcXG5cXG4nKSlcbiAgfVxuXG4gIHBhcnNlSGVhZGVycygpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gR2l0Q29tbWl0Lmp1c3RIZWFkZXJzKHRoaXMuX2NvbW1pdCkuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IGhzID0gW107XG4gICAgZm9yIChjb25zdCBoIG9mIGhlYWRlcnMpIHtcbiAgICAgIGlmIChoWzBdID09PSAnICcpIHtcbiAgICAgICAgLy8gY29tYmluZSB3aXRoIHByZXZpb3VzIGhlYWRlciAod2l0aG91dCBzcGFjZSBpbmRlbnQpXG4gICAgICAgIGhzW2hzLmxlbmd0aCAtIDFdICs9ICdcXG4nICsgaC5zbGljZSgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhzLnB1c2goaCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIHBhcmVudDogW10sXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGggb2YgaHMpIHtcbiAgICAgIGNvbnN0IGtleSA9IGguc2xpY2UoMCwgaC5pbmRleE9mKCcgJykpO1xuICAgICAgY29uc3QgdmFsdWUgPSBoLnNsaWNlKGguaW5kZXhPZignICcpICsgMSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpba2V5XSkpIHtcbiAgICAgICAgb2JqW2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2JqLmF1dGhvcikge1xuICAgICAgb2JqLmF1dGhvciA9IHBhcnNlQXV0aG9yKG9iai5hdXRob3IpO1xuICAgIH1cbiAgICBpZiAob2JqLmNvbW1pdHRlcikge1xuICAgICAgb2JqLmNvbW1pdHRlciA9IHBhcnNlQXV0aG9yKG9iai5jb21taXR0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgcmVuZGVySGVhZGVycyhvYmopIHtcbiAgICBsZXQgaGVhZGVycyA9ICcnO1xuICAgIGlmIChvYmoudHJlZSkge1xuICAgICAgaGVhZGVycyArPSBgdHJlZSAke29iai50cmVlfVxcbmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlcnMgKz0gYHRyZWUgNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNFxcbmA7IC8vIHRoZSBudWxsIHRyZWVcbiAgICB9XG4gICAgaWYgKG9iai5wYXJlbnQpIHtcbiAgICAgIGlmIChvYmoucGFyZW50Lmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBjb21taXQgJ3BhcmVudCcgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5YClcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcCBvZiBvYmoucGFyZW50KSB7XG4gICAgICAgIGhlYWRlcnMgKz0gYHBhcmVudCAke3B9XFxuYDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXV0aG9yID0gb2JqLmF1dGhvcjtcbiAgICBoZWFkZXJzICs9IGBhdXRob3IgJHtmb3JtYXRBdXRob3IoYXV0aG9yKX1cXG5gO1xuICAgIGNvbnN0IGNvbW1pdHRlciA9IG9iai5jb21taXR0ZXIgfHwgb2JqLmF1dGhvcjtcbiAgICBoZWFkZXJzICs9IGBjb21taXR0ZXIgJHtmb3JtYXRBdXRob3IoY29tbWl0dGVyKX1cXG5gO1xuICAgIGlmIChvYmouZ3Bnc2lnKSB7XG4gICAgICBoZWFkZXJzICs9ICdncGdzaWcnICsgaW5kZW50KG9iai5ncGdzaWcpO1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgc3RhdGljIHJlbmRlcihvYmopIHtcbiAgICByZXR1cm4gR2l0Q29tbWl0LnJlbmRlckhlYWRlcnMob2JqKSArICdcXG4nICsgbm9ybWFsaXplTmV3bGluZXMob2JqLm1lc3NhZ2UpXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1pdFxuICB9XG5cbiAgd2l0aG91dFNpZ25hdHVyZSgpIHtcbiAgICBjb25zdCBjb21taXQgPSBub3JtYWxpemVOZXdsaW5lcyh0aGlzLl9jb21taXQpO1xuICAgIGlmIChjb21taXQuaW5kZXhPZignXFxuZ3Bnc2lnJykgPT09IC0xKSByZXR1cm4gY29tbWl0XG4gICAgY29uc3QgaGVhZGVycyA9IGNvbW1pdC5zbGljZSgwLCBjb21taXQuaW5kZXhPZignXFxuZ3Bnc2lnJykpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjb21taXQuc2xpY2UoXG4gICAgICBjb21taXQuaW5kZXhPZignLS0tLS1FTkQgUEdQIFNJR05BVFVSRS0tLS0tXFxuJykgK1xuICAgICAgICAnLS0tLS1FTkQgUEdQIFNJR05BVFVSRS0tLS0tXFxuJy5sZW5ndGhcbiAgICApO1xuICAgIHJldHVybiBub3JtYWxpemVOZXdsaW5lcyhoZWFkZXJzICsgJ1xcbicgKyBtZXNzYWdlKVxuICB9XG5cbiAgaXNvbGF0ZVNpZ25hdHVyZSgpIHtcbiAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLl9jb21taXQuc2xpY2UoXG4gICAgICB0aGlzLl9jb21taXQuaW5kZXhPZignLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nKSxcbiAgICAgIHRoaXMuX2NvbW1pdC5pbmRleE9mKCctLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS0nKSArXG4gICAgICAgICctLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS0nLmxlbmd0aFxuICAgICk7XG4gICAgcmV0dXJuIG91dGRlbnQoc2lnbmF0dXJlKVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24oY29tbWl0LCBzaWduLCBzZWNyZXRLZXkpIHtcbiAgICBjb25zdCBwYXlsb2FkID0gY29tbWl0LndpdGhvdXRTaWduYXR1cmUoKTtcbiAgICBjb25zdCBtZXNzYWdlID0gR2l0Q29tbWl0Lmp1c3RNZXNzYWdlKGNvbW1pdC5fY29tbWl0KTtcbiAgICBsZXQgeyBzaWduYXR1cmUgfSA9IGF3YWl0IHNpZ24oeyBwYXlsb2FkLCBzZWNyZXRLZXkgfSk7XG4gICAgLy8gcmVub3JtYWxpemUgdGhlIGxpbmUgZW5kaW5ncyB0byB0aGUgb25lIHRydWUgbGluZS1lbmRpbmdcbiAgICBzaWduYXR1cmUgPSBub3JtYWxpemVOZXdsaW5lcyhzaWduYXR1cmUpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBHaXRDb21taXQuanVzdEhlYWRlcnMoY29tbWl0Ll9jb21taXQpO1xuICAgIGNvbnN0IHNpZ25lZENvbW1pdCA9XG4gICAgICBoZWFkZXJzICsgJ1xcbicgKyAnZ3Bnc2lnJyArIGluZGVudChzaWduYXR1cmUpICsgJ1xcbicgKyBtZXNzYWdlO1xuICAgIC8vIHJldHVybiBhIG5ldyBjb21taXQgb2JqZWN0XG4gICAgcmV0dXJuIEdpdENvbW1pdC5mcm9tKHNpZ25lZENvbW1pdClcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVHJlZSh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSkge1xuICAvLyBFbXB0eSB0cmVlIC0gYnlwYXNzIGByZWFkT2JqZWN0YFxuICBpZiAob2lkID09PSAnNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNCcpIHtcbiAgICByZXR1cm4geyB0cmVlOiBHaXRUcmVlLmZyb20oW10pLCBvaWQgfVxuICB9XG4gIGNvbnN0IHsgdHlwZSwgb2JqZWN0IH0gPSBhd2FpdCBfcmVhZE9iamVjdCh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSk7XG4gIC8vIFJlc29sdmUgYW5ub3RhdGVkIHRhZyBvYmplY3RzIHRvIHdoYXRldmVyXG4gIGlmICh0eXBlID09PSAndGFnJykge1xuICAgIG9pZCA9IEdpdEFubm90YXRlZFRhZy5mcm9tKG9iamVjdCkucGFyc2UoKS5vYmplY3Q7XG4gICAgcmV0dXJuIHJlc29sdmVUcmVlKHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCB9KVxuICB9XG4gIC8vIFJlc29sdmUgY29tbWl0cyB0byB0cmVlc1xuICBpZiAodHlwZSA9PT0gJ2NvbW1pdCcpIHtcbiAgICBvaWQgPSBHaXRDb21taXQuZnJvbShvYmplY3QpLnBhcnNlKCkudHJlZTtcbiAgICByZXR1cm4gcmVzb2x2ZVRyZWUoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pXG4gIH1cbiAgaWYgKHR5cGUgIT09ICd0cmVlJykge1xuICAgIHRocm93IG5ldyBPYmplY3RUeXBlRXJyb3Iob2lkLCB0eXBlLCAndHJlZScpXG4gIH1cbiAgcmV0dXJuIHsgdHJlZTogR2l0VHJlZS5mcm9tKG9iamVjdCksIG9pZCB9XG59XG5cbmNsYXNzIEdpdFdhbGtlclJlcG8ge1xuICBjb25zdHJ1Y3Rvcih7IGZzLCBnaXRkaXIsIHJlZiwgY2FjaGUgfSkge1xuICAgIHRoaXMuZnMgPSBmcztcbiAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG4gICAgdGhpcy5naXRkaXIgPSBnaXRkaXI7XG4gICAgdGhpcy5tYXBQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIGxldCBvaWQ7XG4gICAgICB0cnkge1xuICAgICAgICBvaWQgPSBhd2FpdCBHaXRSZWZNYW5hZ2VyLnJlc29sdmUoeyBmcywgZ2l0ZGlyLCByZWYgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikge1xuICAgICAgICAgIC8vIEhhbmRsZSBmcmVzaCBicmFuY2hlcyB3aXRoIG5vIGNvbW1pdHNcbiAgICAgICAgICBvaWQgPSAnNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyZWUgPSBhd2FpdCByZXNvbHZlVHJlZSh7IGZzLCBjYWNoZTogdGhpcy5jYWNoZSwgZ2l0ZGlyLCBvaWQgfSk7XG4gICAgICB0cmVlLnR5cGUgPSAndHJlZSc7XG4gICAgICB0cmVlLm1vZGUgPSAnNDAwMDAnO1xuICAgICAgbWFwLnNldCgnLicsIHRyZWUpO1xuICAgICAgcmV0dXJuIG1hcFxuICAgIH0pKCk7XG4gICAgY29uc3Qgd2Fsa2VyID0gdGhpcztcbiAgICB0aGlzLkNvbnN0cnVjdEVudHJ5ID0gY2xhc3MgVHJlZUVudHJ5IHtcbiAgICAgIGNvbnN0cnVjdG9yKGZ1bGxwYXRoKSB7XG4gICAgICAgIHRoaXMuX2Z1bGxwYXRoID0gZnVsbHBhdGg7XG4gICAgICAgIHRoaXMuX3R5cGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zdGF0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb2lkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGFzeW5jIHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB3YWxrZXIudHlwZSh0aGlzKVxuICAgICAgfVxuXG4gICAgICBhc3luYyBtb2RlKCkge1xuICAgICAgICByZXR1cm4gd2Fsa2VyLm1vZGUodGhpcylcbiAgICAgIH1cblxuICAgICAgYXN5bmMgc3RhdCgpIHtcbiAgICAgICAgcmV0dXJuIHdhbGtlci5zdGF0KHRoaXMpXG4gICAgICB9XG5cbiAgICAgIGFzeW5jIGNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB3YWxrZXIuY29udGVudCh0aGlzKVxuICAgICAgfVxuXG4gICAgICBhc3luYyBvaWQoKSB7XG4gICAgICAgIHJldHVybiB3YWxrZXIub2lkKHRoaXMpXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRkaXIoZW50cnkpIHtcbiAgICBjb25zdCBmaWxlcGF0aCA9IGVudHJ5Ll9mdWxscGF0aDtcbiAgICBjb25zdCB7IGZzLCBjYWNoZSwgZ2l0ZGlyIH0gPSB0aGlzO1xuICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMubWFwUHJvbWlzZTtcbiAgICBjb25zdCBvYmogPSBtYXAuZ2V0KGZpbGVwYXRoKTtcbiAgICBpZiAoIW9iaikgdGhyb3cgbmV3IEVycm9yKGBObyBvYmogZm9yICR7ZmlsZXBhdGh9YClcbiAgICBjb25zdCBvaWQgPSBvYmoub2lkO1xuICAgIGlmICghb2lkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9pZCBmb3Igb2JqICR7SlNPTi5zdHJpbmdpZnkob2JqKX1gKVxuICAgIGlmIChvYmoudHlwZSAhPT0gJ3RyZWUnKSB7XG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IHN1Ym1vZHVsZXMgKHR5cGUgPT09ICdjb21taXQnKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgY29uc3QgeyB0eXBlLCBvYmplY3QgfSA9IGF3YWl0IF9yZWFkT2JqZWN0KHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCB9KTtcbiAgICBpZiAodHlwZSAhPT0gb2JqLnR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBPYmplY3RUeXBlRXJyb3Iob2lkLCB0eXBlLCBvYmoudHlwZSlcbiAgICB9XG4gICAgY29uc3QgdHJlZSA9IEdpdFRyZWUuZnJvbShvYmplY3QpO1xuICAgIC8vIGNhY2hlIGFsbCBlbnRyaWVzXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0cmVlKSB7XG4gICAgICBtYXAuc2V0KGpvaW4oZmlsZXBhdGgsIGVudHJ5LnBhdGgpLCBlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiB0cmVlLmVudHJpZXMoKS5tYXAoZW50cnkgPT4gam9pbihmaWxlcGF0aCwgZW50cnkucGF0aCkpXG4gIH1cblxuICBhc3luYyB0eXBlKGVudHJ5KSB7XG4gICAgaWYgKGVudHJ5Ll90eXBlID09PSBmYWxzZSkge1xuICAgICAgY29uc3QgbWFwID0gYXdhaXQgdGhpcy5tYXBQcm9taXNlO1xuICAgICAgY29uc3QgeyB0eXBlIH0gPSBtYXAuZ2V0KGVudHJ5Ll9mdWxscGF0aCk7XG4gICAgICBlbnRyeS5fdHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeS5fdHlwZVxuICB9XG5cbiAgYXN5bmMgbW9kZShlbnRyeSkge1xuICAgIGlmIChlbnRyeS5fbW9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMubWFwUHJvbWlzZTtcbiAgICAgIGNvbnN0IHsgbW9kZSB9ID0gbWFwLmdldChlbnRyeS5fZnVsbHBhdGgpO1xuICAgICAgZW50cnkuX21vZGUgPSBub3JtYWxpemVNb2RlKHBhcnNlSW50KG1vZGUsIDgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5Ll9tb2RlXG4gIH1cblxuICBhc3luYyBzdGF0KF9lbnRyeSkge31cblxuICBhc3luYyBjb250ZW50KGVudHJ5KSB7XG4gICAgaWYgKGVudHJ5Ll9jb250ZW50ID09PSBmYWxzZSkge1xuICAgICAgY29uc3QgbWFwID0gYXdhaXQgdGhpcy5tYXBQcm9taXNlO1xuICAgICAgY29uc3QgeyBmcywgY2FjaGUsIGdpdGRpciB9ID0gdGhpcztcbiAgICAgIGNvbnN0IG9iaiA9IG1hcC5nZXQoZW50cnkuX2Z1bGxwYXRoKTtcbiAgICAgIGNvbnN0IG9pZCA9IG9iai5vaWQ7XG4gICAgICBjb25zdCB7IHR5cGUsIG9iamVjdCB9ID0gYXdhaXQgX3JlYWRPYmplY3QoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pO1xuICAgICAgaWYgKHR5cGUgIT09ICdibG9iJykge1xuICAgICAgICBlbnRyeS5fY29udGVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJ5Ll9jb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkob2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5Ll9jb250ZW50XG4gIH1cblxuICBhc3luYyBvaWQoZW50cnkpIHtcbiAgICBpZiAoZW50cnkuX29pZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMubWFwUHJvbWlzZTtcbiAgICAgIGNvbnN0IG9iaiA9IG1hcC5nZXQoZW50cnkuX2Z1bGxwYXRoKTtcbiAgICAgIGVudHJ5Ll9vaWQgPSBvYmoub2lkO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnkuX29pZFxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVmPSdIRUFEJ11cbiAqIEByZXR1cm5zIHtXYWxrZXJ9XG4gKi9cbmZ1bmN0aW9uIFRSRUUoeyByZWYgPSAnSEVBRCcgfSA9IHt9KSB7XG4gIGNvbnN0IG8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgR2l0V2Fsa1N5bWJvbCwge1xuICAgIHZhbHVlOiBmdW5jdGlvbih7IGZzLCBnaXRkaXIsIGNhY2hlIH0pIHtcbiAgICAgIHJldHVybiBuZXcgR2l0V2Fsa2VyUmVwbyh7IGZzLCBnaXRkaXIsIHJlZiwgY2FjaGUgfSlcbiAgICB9LFxuICB9KTtcbiAgT2JqZWN0LmZyZWV6ZShvKTtcbiAgcmV0dXJuIG9cbn1cblxuLy8gQHRzLWNoZWNrXG5cbmNsYXNzIEdpdFdhbGtlckZzIHtcbiAgY29uc3RydWN0b3IoeyBmcywgZGlyLCBnaXRkaXIsIGNhY2hlIH0pIHtcbiAgICB0aGlzLmZzID0gZnM7XG4gICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgIHRoaXMuZGlyID0gZGlyO1xuICAgIHRoaXMuZ2l0ZGlyID0gZ2l0ZGlyO1xuICAgIGNvbnN0IHdhbGtlciA9IHRoaXM7XG4gICAgdGhpcy5Db25zdHJ1Y3RFbnRyeSA9IGNsYXNzIFdvcmtkaXJFbnRyeSB7XG4gICAgICBjb25zdHJ1Y3RvcihmdWxscGF0aCkge1xuICAgICAgICB0aGlzLl9mdWxscGF0aCA9IGZ1bGxwYXRoO1xuICAgICAgICB0aGlzLl90eXBlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21vZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3RhdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX29pZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBhc3luYyB0eXBlKCkge1xuICAgICAgICByZXR1cm4gd2Fsa2VyLnR5cGUodGhpcylcbiAgICAgIH1cblxuICAgICAgYXN5bmMgbW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHdhbGtlci5tb2RlKHRoaXMpXG4gICAgICB9XG5cbiAgICAgIGFzeW5jIHN0YXQoKSB7XG4gICAgICAgIHJldHVybiB3YWxrZXIuc3RhdCh0aGlzKVxuICAgICAgfVxuXG4gICAgICBhc3luYyBjb250ZW50KCkge1xuICAgICAgICByZXR1cm4gd2Fsa2VyLmNvbnRlbnQodGhpcylcbiAgICAgIH1cblxuICAgICAgYXN5bmMgb2lkKCkge1xuICAgICAgICByZXR1cm4gd2Fsa2VyLm9pZCh0aGlzKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWFkZGlyKGVudHJ5KSB7XG4gICAgY29uc3QgZmlsZXBhdGggPSBlbnRyeS5fZnVsbHBhdGg7XG4gICAgY29uc3QgeyBmcywgZGlyIH0gPSB0aGlzO1xuICAgIGNvbnN0IG5hbWVzID0gYXdhaXQgZnMucmVhZGRpcihqb2luKGRpciwgZmlsZXBhdGgpKTtcbiAgICBpZiAobmFtZXMgPT09IG51bGwpIHJldHVybiBudWxsXG4gICAgcmV0dXJuIG5hbWVzLm1hcChuYW1lID0+IGpvaW4oZmlsZXBhdGgsIG5hbWUpKVxuICB9XG5cbiAgYXN5bmMgdHlwZShlbnRyeSkge1xuICAgIGlmIChlbnRyeS5fdHlwZSA9PT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IGVudHJ5LnN0YXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5Ll90eXBlXG4gIH1cblxuICBhc3luYyBtb2RlKGVudHJ5KSB7XG4gICAgaWYgKGVudHJ5Ll9tb2RlID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgZW50cnkuc3RhdCgpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnkuX21vZGVcbiAgfVxuXG4gIGFzeW5jIHN0YXQoZW50cnkpIHtcbiAgICBpZiAoZW50cnkuX3N0YXQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB7IGZzLCBkaXIgfSA9IHRoaXM7XG4gICAgICBsZXQgc3RhdCA9IGF3YWl0IGZzLmxzdGF0KGAke2Rpcn0vJHtlbnRyeS5fZnVsbHBhdGh9YCk7XG4gICAgICBpZiAoIXN0YXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFTk9FTlQ6IG5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnksIGxzdGF0ICcke2VudHJ5Ll9mdWxscGF0aH0nYFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBsZXQgdHlwZSA9IHN0YXQuaXNEaXJlY3RvcnkoKSA/ICd0cmVlJyA6ICdibG9iJztcbiAgICAgIGlmICh0eXBlID09PSAnYmxvYicgJiYgIXN0YXQuaXNGaWxlKCkgJiYgIXN0YXQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICB0eXBlID0gJ3NwZWNpYWwnO1xuICAgICAgfVxuICAgICAgZW50cnkuX3R5cGUgPSB0eXBlO1xuICAgICAgc3RhdCA9IG5vcm1hbGl6ZVN0YXRzKHN0YXQpO1xuICAgICAgZW50cnkuX21vZGUgPSBzdGF0Lm1vZGU7XG4gICAgICAvLyB3b3JrYXJvdW5kIGZvciBhIEJyb3dzZXJGUyBlZGdlIGNhc2VcbiAgICAgIGlmIChzdGF0LnNpemUgPT09IC0xICYmIGVudHJ5Ll9hY3R1YWxTaXplKSB7XG4gICAgICAgIHN0YXQuc2l6ZSA9IGVudHJ5Ll9hY3R1YWxTaXplO1xuICAgICAgfVxuICAgICAgZW50cnkuX3N0YXQgPSBzdGF0O1xuICAgIH1cbiAgICByZXR1cm4gZW50cnkuX3N0YXRcbiAgfVxuXG4gIGFzeW5jIGNvbnRlbnQoZW50cnkpIHtcbiAgICBpZiAoZW50cnkuX2NvbnRlbnQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB7IGZzLCBkaXIgfSA9IHRoaXM7XG4gICAgICBpZiAoKGF3YWl0IGVudHJ5LnR5cGUoKSkgPT09ICd0cmVlJykge1xuICAgICAgICBlbnRyeS5fY29udGVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkKGAke2Rpcn0vJHtlbnRyeS5fZnVsbHBhdGh9YCk7XG4gICAgICAgIC8vIHdvcmthcm91bmQgZm9yIGEgQnJvd3NlckZTIGVkZ2UgY2FzZVxuICAgICAgICBlbnRyeS5fYWN0dWFsU2l6ZSA9IGNvbnRlbnQubGVuZ3RoO1xuICAgICAgICBpZiAoZW50cnkuX3N0YXQgJiYgZW50cnkuX3N0YXQuc2l6ZSA9PT0gLTEpIHtcbiAgICAgICAgICBlbnRyeS5fc3RhdC5zaXplID0gZW50cnkuX2FjdHVhbFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgZW50cnkuX2NvbnRlbnQgPSBuZXcgVWludDhBcnJheShjb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5Ll9jb250ZW50XG4gIH1cblxuICBhc3luYyBvaWQoZW50cnkpIHtcbiAgICBpZiAoZW50cnkuX29pZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHsgZnMsIGdpdGRpciwgY2FjaGUgfSA9IHRoaXM7XG4gICAgICBsZXQgb2lkO1xuICAgICAgLy8gU2VlIGlmIHdlIGNhbiB1c2UgdGhlIFNIQTEgaGFzaCBpbiB0aGUgaW5kZXguXG4gICAgICBhd2FpdCBHaXRJbmRleE1hbmFnZXIuYWNxdWlyZSh7IGZzLCBnaXRkaXIsIGNhY2hlIH0sIGFzeW5jIGZ1bmN0aW9uKFxuICAgICAgICBpbmRleFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHN0YWdlID0gaW5kZXguZW50cmllc01hcC5nZXQoZW50cnkuX2Z1bGxwYXRoKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBlbnRyeS5zdGF0KCk7XG4gICAgICAgIGlmICghc3RhZ2UgfHwgY29tcGFyZVN0YXRzKHN0YXRzLCBzdGFnZSkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZW50cnkuY29udGVudCgpO1xuICAgICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9pZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2lkID0gYXdhaXQgc2hhc3VtKFxuICAgICAgICAgICAgICBHaXRPYmplY3Qud3JhcCh7IHR5cGU6ICdibG9iJywgb2JqZWN0OiBhd2FpdCBlbnRyeS5jb250ZW50KCkgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHN0YXRzIGluIHRoZSBpbmRleCBzbyB3ZSB3aWxsIGdldCBhIFwiY2FjaGUgaGl0XCIgbmV4dCB0aW1lXG4gICAgICAgICAgICAvLyAxKSBpZiB3ZSBjYW4gKGJlY2F1c2UgdGhlIG9pZCBhbmQgbW9kZSBhcmUgdGhlIHNhbWUpXG4gICAgICAgICAgICAvLyAyKSBhbmQgb25seSBpZiB3ZSBuZWVkIHRvIChiZWNhdXNlIG90aGVyIHN0YXRzIGRpZmZlcilcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgc3RhZ2UgJiZcbiAgICAgICAgICAgICAgb2lkID09PSBzdGFnZS5vaWQgJiZcbiAgICAgICAgICAgICAgc3RhdHMubW9kZSA9PT0gc3RhZ2UubW9kZSAmJlxuICAgICAgICAgICAgICBjb21wYXJlU3RhdHMoc3RhdHMsIHN0YWdlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGluZGV4Lmluc2VydCh7XG4gICAgICAgICAgICAgICAgZmlsZXBhdGg6IGVudHJ5Ll9mdWxscGF0aCxcbiAgICAgICAgICAgICAgICBzdGF0cyxcbiAgICAgICAgICAgICAgICBvaWQ6IG9pZCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVzZSB0aGUgaW5kZXggU0hBMSByYXRoZXIgdGhhbiBjb21wdXRlIGl0XG4gICAgICAgICAgb2lkID0gc3RhZ2Uub2lkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGVudHJ5Ll9vaWQgPSBvaWQ7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeS5fb2lkXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHJldHVybnMge1dhbGtlcn1cbiAqL1xuZnVuY3Rpb24gV09SS0RJUigpIHtcbiAgY29uc3QgbyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBHaXRXYWxrU3ltYm9sLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uKHsgZnMsIGRpciwgZ2l0ZGlyLCBjYWNoZSB9KSB7XG4gICAgICByZXR1cm4gbmV3IEdpdFdhbGtlckZzKHsgZnMsIGRpciwgZ2l0ZGlyLCBjYWNoZSB9KVxuICAgIH0sXG4gIH0pO1xuICBPYmplY3QuZnJlZXplKG8pO1xuICByZXR1cm4gb1xufVxuXG4vLyBAdHMtY2hlY2tcblxuLy8gaHR0cHM6Ly9kZXYudG8vbmFtaXJzYWIvY29tbWVudC8yMDUwXG5mdW5jdGlvbiBhcnJheVJhbmdlKHN0YXJ0LCBlbmQpIHtcbiAgY29uc3QgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoIH0sIChfLCBpKSA9PiBzdGFydCArIGkpXG59XG5cbi8vIFRPRE86IFNob3VsZCBJIGp1c3QgcG9seWZpbGwgQXJyYXkuZmxhdD9cbmNvbnN0IGZsYXQgPVxuICB0eXBlb2YgQXJyYXkucHJvdG90eXBlLmZsYXQgPT09ICd1bmRlZmluZWQnXG4gICAgPyBlbnRyaWVzID0+IGVudHJpZXMucmVkdWNlKChhY2MsIHgpID0+IGFjYy5jb25jYXQoeCksIFtdKVxuICAgIDogZW50cmllcyA9PiBlbnRyaWVzLmZsYXQoKTtcblxuLy8gVGhpcyBpcyBjb252ZW5pZW50IGZvciBjb21wdXRpbmcgdW5pb25zL2pvaW5zIG9mIHNvcnRlZCBsaXN0cy5cbmNsYXNzIFJ1bm5pbmdNaW5pbXVtIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gVXNpbmcgYSBnZXR0ZXIgZm9yICd2YWx1ZScgd291bGQganVzdCBibG9hdCB0aGUgY29kZS5cbiAgICAvLyBZb3Uga25vdyBiZXR0ZXIgdGhhbiB0byBzZXQgaXQgZGlyZWN0bHkgcmlnaHQ/XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gIH1cblxuICBjb25zaWRlcih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm5cbiAgICBpZiAodGhpcy52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPCB0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gIH1cbn1cblxuLy8gVGFrZSBhbiBhcnJheSBvZiBsZW5ndGggTiBvZlxuLy8gICBpdGVyYXRvcnMgb2YgbGVuZ3RoIFFfblxuLy8gICAgIG9mIHN0cmluZ3Ncbi8vIGFuZCByZXR1cm4gYW4gaXRlcmF0b3Igb2YgbGVuZ3RoIG1heChRX24pIGZvciBhbGwgblxuLy8gICBvZiBhcnJheXMgb2YgbGVuZ3RoIE5cbi8vICAgICBvZiBzdHJpbmd8bnVsbCB3aG8gYWxsIGhhdmUgdGhlIHNhbWUgc3RyaW5nIHZhbHVlXG5mdW5jdGlvbiogdW5pb25PZkl0ZXJhdG9ycyhzZXRzKSB7XG4gIC8qIE5PVEU6IFdlIGNhbiBhc3N1bWUgYWxsIGFycmF5cyBhcmUgc29ydGVkLlxuICAgKiBJbmRleGVzIGFyZSBzb3J0ZWQgYmVjYXVzZSB0aGV5IGFyZSBkZWZpbmVkIHRoYXQgd2F5OlxuICAgKlxuICAgKiA+IEluZGV4IGVudHJpZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgb24gdGhlIG5hbWUgZmllbGQsXG4gICAqID4gaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcgb2YgdW5zaWduZWQgYnl0ZXMgKGkuZS4gbWVtY21wKCkgb3JkZXIsIG5vXG4gICAqID4gbG9jYWxpemF0aW9uLCBubyBzcGVjaWFsIGNhc2luZyBvZiBkaXJlY3Rvcnkgc2VwYXJhdG9yICcvJykuIEVudHJpZXNcbiAgICogPiB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIHNvcnRlZCBieSB0aGVpciBzdGFnZSBmaWVsZC5cbiAgICpcbiAgICogVHJlZXMgc2hvdWxkIGJlIHNvcnRlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBpbmRleGVzLlxuICAgKiBUaGV5IGRlZmluaXRlbHkgc2hvdWxkIGJlIHNvcnRlZCwgb3IgZWxzZSB0aGV5IHdvdWxkbid0IGhhdmUgYSB1bmlxdWUgU0hBMS5cbiAgICogU28gdGhhdCB3b3VsZCBiZSB2ZXJ5IG5hdWdodHkgb24gdGhlIHBhcnQgb2YgdGhlIHRyZWUtY3JlYXRvci5cbiAgICpcbiAgICogTGFzdGx5LCB0aGUgd29ya2luZyBkaXIgZW50cmllcyBhcmUgc29ydGVkIGJlY2F1c2UgSSBjaG9vc2UgdG8gc29ydCB0aGVtXG4gICAqIGluIG15IEZpbGVTeXN0ZW0ucmVhZGRpcigpIGltcGxlbWVudGF0aW9uLlxuICAgKi9cblxuICAvLyBJbml0XG4gIGNvbnN0IG1pbiA9IG5ldyBSdW5uaW5nTWluaW11bSgpO1xuICBsZXQgbWluaW11bTtcbiAgY29uc3QgaGVhZHMgPSBbXTtcbiAgY29uc3QgbnVtc2V0cyA9IHNldHMubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bXNldHM7IGkrKykge1xuICAgIC8vIEFidXNlIHRoZSBmYWN0IHRoYXQgaXRlcmF0b3JzIGNvbnRpbnVlIHRvIHJldHVybiAndW5kZWZpbmVkJyBmb3IgdmFsdWVcbiAgICAvLyBvbmNlIHRoZXkgYXJlIGRvbmVcbiAgICBoZWFkc1tpXSA9IHNldHNbaV0ubmV4dCgpLnZhbHVlO1xuICAgIGlmIChoZWFkc1tpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaW4uY29uc2lkZXIoaGVhZHNbaV0pO1xuICAgIH1cbiAgfVxuICBpZiAobWluLnZhbHVlID09PSBudWxsKSByZXR1cm5cbiAgLy8gSXRlcmF0ZVxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIG1pbmltdW0gPSBtaW4udmFsdWU7XG4gICAgbWluLnJlc2V0KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1zZXRzOyBpKyspIHtcbiAgICAgIGlmIChoZWFkc1tpXSAhPT0gdW5kZWZpbmVkICYmIGhlYWRzW2ldID09PSBtaW5pbXVtKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IGhlYWRzW2ldO1xuICAgICAgICBoZWFkc1tpXSA9IHNldHNbaV0ubmV4dCgpLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQSBsaXR0bGUgaGFja3ksIGJ1dCBlaFxuICAgICAgICByZXN1bHRbaV0gPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGhlYWRzW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWluLmNvbnNpZGVyKGhlYWRzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgeWllbGQgcmVzdWx0O1xuICAgIGlmIChtaW4udmFsdWUgPT09IG51bGwpIHJldHVyblxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncy5jYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV1cbiAqIEBwYXJhbSB7V2Fsa2VyW119IGFyZ3MudHJlZXNcbiAqIEBwYXJhbSB7V2Fsa2VyTWFwfSBbYXJncy5tYXBdXG4gKiBAcGFyYW0ge1dhbGtlclJlZHVjZX0gW2FyZ3MucmVkdWNlXVxuICogQHBhcmFtIHtXYWxrZXJJdGVyYXRlfSBbYXJncy5pdGVyYXRlXVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFRoZSBmaW5pc2hlZCB0cmVlLXdhbGtpbmcgcmVzdWx0XG4gKlxuICogQHNlZSB7V2Fsa2VyTWFwfVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX3dhbGsoe1xuICBmcyxcbiAgY2FjaGUsXG4gIGRpcixcbiAgZ2l0ZGlyLFxuICB0cmVlcyxcbiAgLy8gQHRzLWlnbm9yZVxuICBtYXAgPSBhc3luYyAoXywgZW50cnkpID0+IGVudHJ5LFxuICAvLyBUaGUgZGVmYXVsdCByZWR1Y2VyIGlzIGEgZmxhdG1hcCB0aGF0IGZpbHRlcnMgb3V0IHVuZGVmaW5lZHMuXG4gIHJlZHVjZSA9IGFzeW5jIChwYXJlbnQsIGNoaWxkcmVuKSA9PiB7XG4gICAgY29uc3QgZmxhdHRlbiA9IGZsYXQoY2hpbGRyZW4pO1xuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCkgZmxhdHRlbi51bnNoaWZ0KHBhcmVudCk7XG4gICAgcmV0dXJuIGZsYXR0ZW5cbiAgfSxcbiAgLy8gVGhlIGRlZmF1bHQgaXRlcmF0ZSBmdW5jdGlvbiB3YWxrcyBhbGwgY2hpbGRyZW4gY29uY3VycmVudGx5XG4gIGl0ZXJhdGUgPSAod2FsaywgY2hpbGRyZW4pID0+IFByb21pc2UuYWxsKFsuLi5jaGlsZHJlbl0ubWFwKHdhbGspKSxcbn0pIHtcbiAgY29uc3Qgd2Fsa2VycyA9IHRyZWVzLm1hcChwcm94eSA9PlxuICAgIHByb3h5W0dpdFdhbGtTeW1ib2xdKHsgZnMsIGRpciwgZ2l0ZGlyLCBjYWNoZSB9KVxuICApO1xuXG4gIGNvbnN0IHJvb3QgPSBuZXcgQXJyYXkod2Fsa2Vycy5sZW5ndGgpLmZpbGwoJy4nKTtcbiAgY29uc3QgcmFuZ2UgPSBhcnJheVJhbmdlKDAsIHdhbGtlcnMubGVuZ3RoKTtcbiAgY29uc3QgdW5pb25XYWxrZXJGcm9tUmVhZGRpciA9IGFzeW5jIGVudHJpZXMgPT4ge1xuICAgIHJhbmdlLm1hcChpID0+IHtcbiAgICAgIGVudHJpZXNbaV0gPSBlbnRyaWVzW2ldICYmIG5ldyB3YWxrZXJzW2ldLkNvbnN0cnVjdEVudHJ5KGVudHJpZXNbaV0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHN1YmRpcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHJhbmdlLm1hcChpID0+IChlbnRyaWVzW2ldID8gd2Fsa2Vyc1tpXS5yZWFkZGlyKGVudHJpZXNbaV0pIDogW10pKVxuICAgICk7XG4gICAgLy8gTm93IHByb2Nlc3MgY2hpbGQgZGlyZWN0b3JpZXNcbiAgICBjb25zdCBpdGVyYXRvcnMgPSBzdWJkaXJzXG4gICAgICAubWFwKGFycmF5ID0+IChhcnJheSA9PT0gbnVsbCA/IFtdIDogYXJyYXkpKVxuICAgICAgLm1hcChhcnJheSA9PiBhcnJheVtTeW1ib2wuaXRlcmF0b3JdKCkpO1xuICAgIHJldHVybiB7XG4gICAgICBlbnRyaWVzLFxuICAgICAgY2hpbGRyZW46IHVuaW9uT2ZJdGVyYXRvcnMoaXRlcmF0b3JzKSxcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgd2FsayA9IGFzeW5jIHJvb3QgPT4ge1xuICAgIGNvbnN0IHsgZW50cmllcywgY2hpbGRyZW4gfSA9IGF3YWl0IHVuaW9uV2Fsa2VyRnJvbVJlYWRkaXIocm9vdCk7XG4gICAgY29uc3QgZnVsbHBhdGggPSBlbnRyaWVzLmZpbmQoZW50cnkgPT4gZW50cnkgJiYgZW50cnkuX2Z1bGxwYXRoKS5fZnVsbHBhdGg7XG4gICAgY29uc3QgcGFyZW50ID0gYXdhaXQgbWFwKGZ1bGxwYXRoLCBlbnRyaWVzKTtcbiAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICBsZXQgd2Fsa2VkQ2hpbGRyZW4gPSBhd2FpdCBpdGVyYXRlKHdhbGssIGNoaWxkcmVuKTtcbiAgICAgIHdhbGtlZENoaWxkcmVuID0gd2Fsa2VkQ2hpbGRyZW4uZmlsdGVyKHggPT4geCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiByZWR1Y2UocGFyZW50LCB3YWxrZWRDaGlsZHJlbilcbiAgICB9XG4gIH07XG4gIHJldHVybiB3YWxrKHJvb3QpXG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgZGlyZWN0b3J5IGF0IHRoZSBzcGVjaWZpZWQgZmlsZXBhdGggcmVjdXJzaXZlbHkuIFVzZWQgaW50ZXJuYWxseSB0byByZXBsaWNhdGUgdGhlIGJlaGF2aW9yIG9mXG4gKiBmcy5wcm9taXNlcy5ybSh7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSkgZnJvbSBOb2RlLmpzIDE0IGFuZCBhYm92ZSB3aGVuIG5vdCBhdmFpbGFibGUuIElmIHRoZSBwcm92aWRlZFxuICogZmlsZXBhdGggcmVzb2x2ZXMgdG8gYSBmaWxlLCBpdCB3aWxsIGJlIHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gZnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlcGF0aCAtIFRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJtUmVjdXJzaXZlKGZzLCBmaWxlcGF0aCkge1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihmaWxlcGF0aCk7XG4gIGlmIChlbnRyaWVzID09IG51bGwpIHtcbiAgICBhd2FpdCBmcy5ybShmaWxlcGF0aCk7XG4gIH0gZWxzZSBpZiAoZW50cmllcy5sZW5ndGgpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGVudHJpZXMubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgY29uc3Qgc3VicGF0aCA9IGpvaW4oZmlsZXBhdGgsIGVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGZzLmxzdGF0KHN1YnBhdGgpLnRoZW4oc3RhdCA9PiB7XG4gICAgICAgICAgaWYgKCFzdGF0KSByZXR1cm5cbiAgICAgICAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpID8gcm1SZWN1cnNpdmUoZnMsIHN1YnBhdGgpIDogZnMucm0oc3VicGF0aClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgKS50aGVuKCgpID0+IGZzLnJtZGlyKGZpbGVwYXRoKSk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgZnMucm1kaXIoZmlsZXBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2Uob2JqKSB7XG4gIHJldHVybiBpc09iamVjdChvYmopICYmIGlzRnVuY3Rpb24ob2JqLnRoZW4pICYmIGlzRnVuY3Rpb24ob2JqLmNhdGNoKVxufVxuXG5mdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0J1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG5mdW5jdGlvbiBpc1Byb21pc2VGcyhmcykge1xuICBjb25zdCB0ZXN0ID0gdGFyZ2V0RnMgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBJZiByZWFkRmlsZSByZXR1cm5zIGEgcHJvbWlzZSB0aGVuIHdlIGNhbiBwcm9iYWJseSBhc3N1bWUgdGhlIG90aGVyXG4gICAgICAvLyBjb21tYW5kcyBkbyBhcyB3ZWxsXG4gICAgICByZXR1cm4gdGFyZ2V0RnMucmVhZEZpbGUoKS5jYXRjaChlID0+IGUpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGVcbiAgICB9XG4gIH07XG4gIHJldHVybiBpc1Byb21pc2VMaWtlKHRlc3QoZnMpKVxufVxuXG4vLyBMaXN0IG9mIGNvbW1hbmRzIGFsbCBmaWxlc3lzdGVtcyBhcmUgZXhwZWN0ZWQgdG8gcHJvdmlkZS4gYHJtYCBpcyBub3Rcbi8vIGluY2x1ZGVkIHNpbmNlIGl0IG1heSBub3QgZXhpc3QgYW5kIG11c3QgYmUgaGFuZGxlZCBhcyBhIHNwZWNpYWwgY2FzZVxuY29uc3QgY29tbWFuZHMgPSBbXG4gICdyZWFkRmlsZScsXG4gICd3cml0ZUZpbGUnLFxuICAnbWtkaXInLFxuICAncm1kaXInLFxuICAndW5saW5rJyxcbiAgJ3N0YXQnLFxuICAnbHN0YXQnLFxuICAncmVhZGRpcicsXG4gICdyZWFkbGluaycsXG4gICdzeW1saW5rJyxcbl07XG5cbmZ1bmN0aW9uIGJpbmRGcyh0YXJnZXQsIGZzKSB7XG4gIGlmIChpc1Byb21pc2VGcyhmcykpIHtcbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY29tbWFuZHMpIHtcbiAgICAgIHRhcmdldFtgXyR7Y29tbWFuZH1gXSA9IGZzW2NvbW1hbmRdLmJpbmQoZnMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY29tbWFuZHMpIHtcbiAgICAgIHRhcmdldFtgXyR7Y29tbWFuZH1gXSA9IHBpZnkoZnNbY29tbWFuZF0uYmluZChmcykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGBybWBcbiAgaWYgKGlzUHJvbWlzZUZzKGZzKSkge1xuICAgIGlmIChmcy5ybSkgdGFyZ2V0Ll9ybSA9IGZzLnJtLmJpbmQoZnMpO1xuICAgIGVsc2UgaWYgKGZzLnJtZGlyLmxlbmd0aCA+IDEpIHRhcmdldC5fcm0gPSBmcy5ybWRpci5iaW5kKGZzKTtcbiAgICBlbHNlIHRhcmdldC5fcm0gPSBybVJlY3Vyc2l2ZS5iaW5kKG51bGwsIHRhcmdldCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGZzLnJtKSB0YXJnZXQuX3JtID0gcGlmeShmcy5ybS5iaW5kKGZzKSk7XG4gICAgZWxzZSBpZiAoZnMucm1kaXIubGVuZ3RoID4gMikgdGFyZ2V0Ll9ybSA9IHBpZnkoZnMucm1kaXIuYmluZChmcykpO1xuICAgIGVsc2UgdGFyZ2V0Ll9ybSA9IHJtUmVjdXJzaXZlLmJpbmQobnVsbCwgdGFyZ2V0KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMganVzdCBhIGNvbGxlY3Rpb24gb2YgaGVscGVyIGZ1bmN0aW9ucyByZWFsbHkuIEF0IGxlYXN0IHRoYXQncyBob3cgaXQgc3RhcnRlZC5cbiAqL1xuY2xhc3MgRmlsZVN5c3RlbSB7XG4gIGNvbnN0cnVjdG9yKGZzKSB7XG4gICAgaWYgKHR5cGVvZiBmcy5fb3JpZ2luYWxfdW53cmFwcGVkX2ZzICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGZzXG5cbiAgICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZnMsICdwcm9taXNlcycpO1xuICAgIGlmIChwcm9taXNlcyAmJiBwcm9taXNlcy5lbnVtZXJhYmxlKSB7XG4gICAgICBiaW5kRnModGhpcywgZnMucHJvbWlzZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW5kRnModGhpcywgZnMpO1xuICAgIH1cbiAgICB0aGlzLl9vcmlnaW5hbF91bndyYXBwZWRfZnMgPSBmcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiBhIGZpbGUgZXhpc3RzLCBmYWxzZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgKiBSZXRocm93cyBlcnJvcnMgdGhhdCBhcmVuJ3QgcmVsYXRlZCB0byBmaWxlIGV4aXN0ZW5jZS5cbiAgICovXG4gIGFzeW5jIGV4aXN0cyhmaWxlcGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3N0YXQoZmlsZXBhdGgpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcgfHwgZXJyLmNvZGUgPT09ICdFTk9URElSJykge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdVbmhhbmRsZWQgZXJyb3IgaW4gXCJGaWxlU3lzdGVtLmV4aXN0cygpXCIgZnVuY3Rpb24nLCBlcnIpO1xuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZXBhdGhcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXJ8c3RyaW5nfG51bGw+fVxuICAgKi9cbiAgYXN5bmMgcmVhZChmaWxlcGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBidWZmZXIgPSBhd2FpdCB0aGlzLl9yZWFkRmlsZShmaWxlcGF0aCwgb3B0aW9ucyk7XG4gICAgICAvLyBDb252ZXJ0IHBsYWluIEFycmF5QnVmZmVycyB0byBCdWZmZXJzXG4gICAgICBpZiAodHlwZW9mIGJ1ZmZlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgYnVmZmVyID0gQnVmZmVyLmZyb20oYnVmZmVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWZmZXJcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGEgZmlsZSAoY3JlYXRpbmcgbWlzc2luZyBkaXJlY3RvcmllcyBpZiBuZWVkIGJlKSB3aXRob3V0IHRocm93aW5nIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVwYXRoXG4gICAqIEBwYXJhbSB7QnVmZmVyfFVpbnQ4QXJyYXl8c3RyaW5nfSBjb250ZW50c1xuICAgKiBAcGFyYW0ge29iamVjdHxzdHJpbmd9IFtvcHRpb25zXVxuICAgKi9cbiAgYXN5bmMgd3JpdGUoZmlsZXBhdGgsIGNvbnRlbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd3JpdGVGaWxlKGZpbGVwYXRoLCBjb250ZW50cywgb3B0aW9ucyk7XG4gICAgICByZXR1cm5cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEhtbS4gTGV0J3MgdHJ5IG1rZGlycCBhbmQgdHJ5IGFnYWluLlxuICAgICAgYXdhaXQgdGhpcy5ta2RpcihkaXJuYW1lKGZpbGVwYXRoKSk7XG4gICAgICBhd2FpdCB0aGlzLl93cml0ZUZpbGUoZmlsZXBhdGgsIGNvbnRlbnRzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIGRpcmVjdG9yeSAob3Igc2VyaWVzIG9mIG5lc3RlZCBkaXJlY3Rvcmllcykgd2l0aG91dCB0aHJvd2luZyBhbiBlcnJvciBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICovXG4gIGFzeW5jIG1rZGlyKGZpbGVwYXRoLCBfc2VsZkNhbGwgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9ta2RpcihmaWxlcGF0aCk7XG4gICAgICByZXR1cm5cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIElmIGVyciBpcyBudWxsIHRoZW4gb3BlcmF0aW9uIHN1Y2NlZWRlZCFcbiAgICAgIGlmIChlcnIgPT09IG51bGwpIHJldHVyblxuICAgICAgLy8gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgdGhhdCdzIE9LIVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUVYSVNUJykgcmV0dXJuXG4gICAgICAvLyBBdm9pZCBpbmZpbml0ZSBsb29wcyBvZiBmYWlsdXJlXG4gICAgICBpZiAoX3NlbGZDYWxsKSB0aHJvdyBlcnJcbiAgICAgIC8vIElmIHdlIGdvdCBhIFwibm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSBlcnJvclwiIGJhY2t1cCBhbmQgdHJ5IGFnYWluLlxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGZpbGVwYXRoKTtcbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGdvbmUgdG9vIGZhclxuICAgICAgICBpZiAocGFyZW50ID09PSAnLicgfHwgcGFyZW50ID09PSAnLycgfHwgcGFyZW50ID09PSBmaWxlcGF0aCkgdGhyb3cgZXJyXG4gICAgICAgIC8vIEluZmluaXRlIHJlY3Vyc2lvbiwgd2hhdCBjb3VsZCBnbyB3cm9uZz9cbiAgICAgICAgYXdhaXQgdGhpcy5ta2RpcihwYXJlbnQpO1xuICAgICAgICBhd2FpdCB0aGlzLm1rZGlyKGZpbGVwYXRoLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgZmlsZSB3aXRob3V0IHRocm93aW5nIGFuIGVycm9yIGlmIGl0IGlzIGFscmVhZHkgZGVsZXRlZC5cbiAgICovXG4gIGFzeW5jIHJtKGZpbGVwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3VubGluayhmaWxlcGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyLmNvZGUgIT09ICdFTk9FTlQnKSB0aHJvdyBlcnJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgZGlyZWN0b3J5IHdpdGhvdXQgdGhyb3dpbmcgYW4gZXJyb3IgaWYgaXQgaXMgYWxyZWFkeSBkZWxldGVkLlxuICAgKi9cbiAgYXN5bmMgcm1kaXIoZmlsZXBhdGgsIG9wdHMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG9wdHMgJiYgb3B0cy5yZWN1cnNpdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcm0oZmlsZXBhdGgsIG9wdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcm1kaXIoZmlsZXBhdGgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYSBkaXJlY3Rvcnkgd2l0aG91dCB0aHJvd2luZyBhbiBlcnJvciBpcyB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3RcbiAgICovXG4gIGFzeW5jIHJlYWRkaXIoZmlsZXBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbmFtZXMgPSBhd2FpdCB0aGlzLl9yZWFkZGlyKGZpbGVwYXRoKTtcbiAgICAgIC8vIE9yZGVyaW5nIGlzIG5vdCBndWFyYW50ZWVkLCBhbmQgc3lzdGVtIHNwZWNpZmljIChXaW5kb3dzIHZzIFVuaXgpXG4gICAgICAvLyBzbyB3ZSBtdXN0IHNvcnQgdGhlbSBvdXJzZWx2ZXMuXG4gICAgICBuYW1lcy5zb3J0KGNvbXBhcmVTdHJpbmdzKTtcbiAgICAgIHJldHVybiBuYW1lc1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PVERJUicpIHJldHVybiBudWxsXG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgZmxhc3QgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIG5lc3RlZCBpbnNpZGUgYSBkaXJlY3RvcnlcbiAgICpcbiAgICogQmFzZWQgb24gYW4gZWxlZ2FudCBjb25jdXJyZW50IHJlY3Vyc2l2ZSBzb2x1dGlvbiBmcm9tIFNPXG4gICAqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NTEzMDk5MC8yMTY4NDE2XG4gICAqL1xuICBhc3luYyByZWFkZGlyRGVlcChkaXIpIHtcbiAgICBjb25zdCBzdWJkaXJzID0gYXdhaXQgdGhpcy5fcmVhZGRpcihkaXIpO1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJkaXJzLm1hcChhc3luYyBzdWJkaXIgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBkaXIgKyAnLycgKyBzdWJkaXI7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5fc3RhdChyZXMpKS5pc0RpcmVjdG9yeSgpXG4gICAgICAgICAgPyB0aGlzLnJlYWRkaXJEZWVwKHJlcylcbiAgICAgICAgICA6IHJlc1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBmaWxlcy5yZWR1Y2UoKGEsIGYpID0+IGEuY29uY2F0KGYpLCBbXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFN0YXRzIG9mIGEgZmlsZS9zeW1saW5rIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cbiAgICogUmV0aHJvd3MgZXJyb3JzIHRoYXQgYXJlbid0IHJlbGF0ZWQgdG8gZmlsZSBleGlzdGVuY2UuXG4gICAqL1xuICBhc3luYyBsc3RhdChmaWxlbmFtZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuX2xzdGF0KGZpbGVuYW1lKTtcbiAgICAgIHJldHVybiBzdGF0c1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBjb250ZW50cyBvZiBhIHN5bWxpbmsgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxuICAgKiBSZXRocm93cyBlcnJvcnMgdGhhdCBhcmVuJ3QgcmVsYXRlZCB0byBmaWxlIGV4aXN0ZW5jZS5cbiAgICovXG4gIGFzeW5jIHJlYWRsaW5rKGZpbGVuYW1lLCBvcHRzID0geyBlbmNvZGluZzogJ2J1ZmZlcicgfSkge1xuICAgIC8vIE5vdGU6IEZpbGVTeXN0ZW0ucmVhZGxpbmsgcmV0dXJucyBhIGJ1ZmZlciBieSBkZWZhdWx0XG4gICAgLy8gc28gd2UgY2FuIGR1bXAgaXQgaW50byBHaXRPYmplY3Qud3JpdGUganVzdCBsaWtlIGFueSBvdGhlciBmaWxlLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCBsaW5rID0gYXdhaXQgdGhpcy5fcmVhZGxpbmsoZmlsZW5hbWUsIG9wdHMpO1xuICAgICAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihsaW5rKSA/IGxpbmsgOiBCdWZmZXIuZnJvbShsaW5rKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiBidWZmZXIgdG8gYSBzeW1saW5rLlxuICAgKi9cbiAgYXN5bmMgd3JpdGVsaW5rKGZpbGVuYW1lLCBidWZmZXIpIHtcbiAgICByZXR1cm4gdGhpcy5fc3ltbGluayhidWZmZXIudG9TdHJpbmcoJ3V0ZjgnKSwgZmlsZW5hbWUpXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0UGFyYW1ldGVyKG5hbWUsIHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IE1pc3NpbmdQYXJhbWV0ZXJFcnJvcihuYW1lKVxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuLyoqXG4gKlxuICogQHBhcmFtIHtXYWxrZXJFbnRyeX0gZW50cnlcbiAqIEBwYXJhbSB7V2Fsa2VyRW50cnl9IGJhc2VcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1vZGlmaWVkKGVudHJ5LCBiYXNlKSB7XG4gIGlmICghZW50cnkgJiYgIWJhc2UpIHJldHVybiBmYWxzZVxuICBpZiAoZW50cnkgJiYgIWJhc2UpIHJldHVybiB0cnVlXG4gIGlmICghZW50cnkgJiYgYmFzZSkgcmV0dXJuIHRydWVcbiAgaWYgKChhd2FpdCBlbnRyeS50eXBlKCkpID09PSAndHJlZScgJiYgKGF3YWl0IGJhc2UudHlwZSgpKSA9PT0gJ3RyZWUnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgaWYgKFxuICAgIChhd2FpdCBlbnRyeS50eXBlKCkpID09PSAoYXdhaXQgYmFzZS50eXBlKCkpICYmXG4gICAgKGF3YWl0IGVudHJ5Lm1vZGUoKSkgPT09IChhd2FpdCBiYXNlLm1vZGUoKSkgJiZcbiAgICAoYXdhaXQgZW50cnkub2lkKCkpID09PSAoYXdhaXQgYmFzZS5vaWQoKSlcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQWJvcnQgYSBtZXJnZSBpbiBwcm9ncmVzcy5cbiAqXG4gKiBCYXNlZCBvbiB0aGUgYmVoYXZpb3Igb2YgZ2l0IHJlc2V0IC0tbWVyZ2UsIGkuZS4gIFwiUmVzZXRzIHRoZSBpbmRleCBhbmQgdXBkYXRlcyB0aGUgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSB0aGF0IGFyZSBkaWZmZXJlbnQgYmV0d2VlbiA8Y29tbWl0PiBhbmQgSEVBRCwgYnV0IGtlZXBzIHRob3NlIHdoaWNoIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgaW5kZXggYW5kIHdvcmtpbmcgdHJlZSAoaS5lLiB3aGljaCBoYXZlIGNoYW5nZXMgd2hpY2ggaGF2ZSBub3QgYmVlbiBhZGRlZCkuIElmIGEgZmlsZSB0aGF0IGlzIGRpZmZlcmVudCBiZXR3ZWVuIDxjb21taXQ+IGFuZCB0aGUgaW5kZXggaGFzIHVuc3RhZ2VkIGNoYW5nZXMsIHJlc2V0IGlzIGFib3J0ZWQuXCJcbiAqXG4gKiBFc3NlbnRpYWxseSwgYWJvcnRNZXJnZSB3aWxsIHJlc2V0IGFueSBmaWxlcyBhZmZlY3RlZCBieSBtZXJnZSBjb25mbGljdHMgdG8gdGhlaXIgbGFzdCBrbm93biBnb29kIHZlcnNpb24gYXQgSEVBRC5cbiAqIEFueSB1bnN0YWdlZCBjaGFuZ2VzIGFyZSBzYXZlZCBhbmQgYW55IHN0YWdlZCBjaGFuZ2VzIGFyZSByZXNldCBhcyB3ZWxsLlxuICpcbiAqIE5PVEU6IFRoZSBiZWhhdmlvciBvZiB0aGlzIGNvbW1hbmQgZGlmZmVycyBzbGlnaHRseSBmcm9tIGNhbm9uaWNhbCBnaXQgaW4gdGhhdCBhbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpbGUgZXhpc3RzIGluIHRoZSBpbmRleCBhbmQgbm93aGVyZSBlbHNlLlxuICogQ2Fub25pY2FsIGdpdCB3aWxsIHJlc2V0IHRoZSBmaWxlIGFuZCBjb250aW51ZSBhYm9ydGluZyB0aGUgbWVyZ2UgaW4gdGhpcyBjYXNlLlxuICpcbiAqICoqV0FSTklORzoqKiBSdW5uaW5nIGdpdCBtZXJnZSB3aXRoIG5vbi10cml2aWFsIHVuY29tbWl0dGVkIGNoYW5nZXMgaXMgZGlzY291cmFnZWQ6IHdoaWxlIHBvc3NpYmxlLCBpdCBtYXkgbGVhdmUgeW91IGluIGEgc3RhdGUgdGhhdCBpcyBoYXJkIHRvIGJhY2sgb3V0IG9mIGluIHRoZSBjYXNlIG9mIGEgY29uZmxpY3QuXG4gKiBJZiB0aGVyZSB3ZXJlIHVuY29tbWl0dGVkIGNoYW5nZXMgd2hlbiB0aGUgbWVyZ2Ugc3RhcnRlZCAoYW5kIGVzcGVjaWFsbHkgaWYgdGhvc2UgY2hhbmdlcyB3ZXJlIGZ1cnRoZXIgbW9kaWZpZWQgYWZ0ZXIgdGhlIG1lcmdlIHdhcyBzdGFydGVkKSwgYGdpdC5hYm9ydE1lcmdlYCB3aWxsIGluIHNvbWUgY2FzZXMgYmUgdW5hYmxlIHRvIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCAocHJlLW1lcmdlKSBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGlyIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCAnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuY29tbWl0PSdIRUFEJ10gLSBjb21taXQgdG8gcmVzZXQgdGhlIGluZGV4IGFuZCB3b3JrdHJlZSB0bywgZGVmYXVsdHMgdG8gSEVBRFxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSBvbmNlIHRoZSBnaXQgaW5kZXggaGFzIGJlZW4gdXBkYXRlZFxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWJvcnRNZXJnZSh7XG4gIGZzOiBfZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIGNvbW1pdCA9ICdIRUFEJyxcbiAgY2FjaGUgPSB7fSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgX2ZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2RpcicsIGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuXG4gICAgY29uc3QgZnMgPSBuZXcgRmlsZVN5c3RlbShfZnMpO1xuICAgIGNvbnN0IHRyZWVzID0gW1RSRUUoeyByZWY6IGNvbW1pdCB9KSwgV09SS0RJUigpLCBTVEFHRSgpXTtcbiAgICBsZXQgdW5tZXJnZWRQYXRocyA9IFtdO1xuXG4gICAgYXdhaXQgR2l0SW5kZXhNYW5hZ2VyLmFjcXVpcmUoeyBmcywgZ2l0ZGlyLCBjYWNoZSB9LCBhc3luYyBmdW5jdGlvbihpbmRleCkge1xuICAgICAgdW5tZXJnZWRQYXRocyA9IGluZGV4LnVubWVyZ2VkUGF0aHM7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgX3dhbGsoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIGRpcixcbiAgICAgIGdpdGRpcixcbiAgICAgIHRyZWVzLFxuICAgICAgbWFwOiBhc3luYyBmdW5jdGlvbihwYXRoLCBbaGVhZCwgd29ya2RpciwgaW5kZXhdKSB7XG4gICAgICAgIGNvbnN0IHN0YWdlZCA9ICEoYXdhaXQgbW9kaWZpZWQod29ya2RpciwgaW5kZXgpKTtcbiAgICAgICAgY29uc3QgdW5tZXJnZWQgPSB1bm1lcmdlZFBhdGhzLmluY2x1ZGVzKHBhdGgpO1xuICAgICAgICBjb25zdCB1bm1vZGlmaWVkID0gIShhd2FpdCBtb2RpZmllZChpbmRleCwgaGVhZCkpO1xuXG4gICAgICAgIGlmIChzdGFnZWQgfHwgdW5tZXJnZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGVhZFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBtb2RlOiBhd2FpdCBoZWFkLm1vZGUoKSxcbiAgICAgICAgICAgICAgICBvaWQ6IGF3YWl0IGhlYWQub2lkKCksXG4gICAgICAgICAgICAgICAgdHlwZTogYXdhaXQgaGVhZC50eXBlKCksXG4gICAgICAgICAgICAgICAgY29udGVudDogYXdhaXQgaGVhZC5jb250ZW50KCksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5tb2RpZmllZCkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEluZGV4UmVzZXRFcnJvcihwYXRoKVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGF3YWl0IEdpdEluZGV4TWFuYWdlci5hY3F1aXJlKHsgZnMsIGdpdGRpciwgY2FjaGUgfSwgYXN5bmMgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgIC8vIFJlc2V0IHBhdGhzIGluIGluZGV4IGFuZCB3b3JrdHJlZSwgdGhpcyBjYW4ndCBiZSBkb25lIGluIF93YWxrIGJlY2F1c2UgdGhlXG4gICAgICAvLyBTVEFHRSB3YWxrZXIgYWNxdWlyZXMgaXRzIG93biBpbmRleCBsb2NrLlxuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKGVudHJ5ID09PSBmYWxzZSkgY29udGludWVcblxuICAgICAgICAvLyBlbnRyeSBpcyBub3QgZmFsc2UsIHNvIGZyb20gaGVyZSB3ZSBjYW4gYXNzdW1lIGluZGV4ID0gd29ya2RpclxuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgYXdhaXQgZnMucm1kaXIoYCR7ZGlyfS8ke2VudHJ5LnBhdGh9YCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgaW5kZXguZGVsZXRlKHsgZmlsZXBhdGg6IGVudHJ5LnBhdGggfSk7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50eXBlID09PSAnYmxvYicpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGVudHJ5LmNvbnRlbnQpO1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlKGAke2Rpcn0vJHtlbnRyeS5wYXRofWAsIGNvbnRlbnQsIHsgbW9kZTogZW50cnkubW9kZSB9KTtcbiAgICAgICAgICBpbmRleC5pbnNlcnQoe1xuICAgICAgICAgICAgZmlsZXBhdGg6IGVudHJ5LnBhdGgsXG4gICAgICAgICAgICBvaWQ6IGVudHJ5Lm9pZCxcbiAgICAgICAgICAgIHN0YWdlOiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmFib3J0TWVyZ2UnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEknbSBwdXR0aW5nIHRoaXMgaW4gYSBNYW5hZ2VyIGJlY2F1c2UgSSByZWNrb24gaXQgY291bGQgYmVuZWZpdFxuLy8gZnJvbSBhIExPVCBvZiBjYWNoaW5nLlxuY2xhc3MgR2l0SWdub3JlTWFuYWdlciB7XG4gIHN0YXRpYyBhc3luYyBpc0lnbm9yZWQoeyBmcywgZGlyLCBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSwgZmlsZXBhdGggfSkge1xuICAgIC8vIEFMV0FZUyBpZ25vcmUgXCIuZ2l0XCIgZm9sZGVycy5cbiAgICBpZiAoYmFzZW5hbWUoZmlsZXBhdGgpID09PSAnLmdpdCcpIHJldHVybiB0cnVlXG4gICAgLy8gJy4nIGlzIG5vdCBhIHZhbGlkIGdpdGlnbm9yZSBlbnRyeSwgc28gJy4nIGlzIG5ldmVyIGlnbm9yZWRcbiAgICBpZiAoZmlsZXBhdGggPT09ICcuJykgcmV0dXJuIGZhbHNlXG4gICAgLy8gQ2hlY2sgYW5kIGxvYWQgZXhjbHVzaW9uIHJ1bGVzIGZyb20gcHJvamVjdCBleGNsdWRlIGZpbGUgKC5naXQvaW5mby9leGNsdWRlKVxuICAgIGxldCBleGNsdWRlcyA9ICcnO1xuICAgIGNvbnN0IGV4Y2x1ZGVzRmlsZSA9IGpvaW4oZ2l0ZGlyLCAnaW5mbycsICdleGNsdWRlJyk7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhleGNsdWRlc0ZpbGUpKSB7XG4gICAgICBleGNsdWRlcyA9IGF3YWl0IGZzLnJlYWQoZXhjbHVkZXNGaWxlLCAndXRmOCcpO1xuICAgIH1cbiAgICAvLyBGaW5kIGFsbCB0aGUgLmdpdGlnbm9yZSBmaWxlcyB0aGF0IGNvdWxkIGFmZmVjdCB0aGlzIGZpbGVcbiAgICBjb25zdCBwYWlycyA9IFtcbiAgICAgIHtcbiAgICAgICAgZ2l0aWdub3JlOiBqb2luKGRpciwgJy5naXRpZ25vcmUnKSxcbiAgICAgICAgZmlsZXBhdGgsXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3QgcGllY2VzID0gZmlsZXBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwaWVjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGZvbGRlciA9IHBpZWNlcy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG4gICAgICBjb25zdCBmaWxlID0gcGllY2VzLnNsaWNlKGkpLmpvaW4oJy8nKTtcbiAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICBnaXRpZ25vcmU6IGpvaW4oZGlyLCBmb2xkZXIsICcuZ2l0aWdub3JlJyksXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBpZ25vcmVkU3RhdHVzID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwIG9mIHBhaXJzKSB7XG4gICAgICBsZXQgZmlsZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbGUgPSBhd2FpdCBmcy5yZWFkKHAuZ2l0aWdub3JlLCAndXRmOCcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ05PRU5UJykgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlnbiA9IGlnbm9yZSgpLmFkZChleGNsdWRlcyk7XG4gICAgICBpZ24uYWRkKGZpbGUpO1xuICAgICAgLy8gSWYgdGhlIHBhcmVudCBkaXJlY3RvcnkgaXMgZXhjbHVkZWQsIHdlIGFyZSBkb25lLlxuICAgICAgLy8gXCJJdCBpcyBub3QgcG9zc2libGUgdG8gcmUtaW5jbHVkZSBhIGZpbGUgaWYgYSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoYXQgZmlsZSBpcyBleGNsdWRlZC4gR2l0IGRvZXNuXHUyMDE5dCBsaXN0IGV4Y2x1ZGVkIGRpcmVjdG9yaWVzIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBzbyBhbnkgcGF0dGVybnMgb24gY29udGFpbmVkIGZpbGVzIGhhdmUgbm8gZWZmZWN0LCBubyBtYXR0ZXIgd2hlcmUgdGhleSBhcmUgZGVmaW5lZC5cIlxuICAgICAgLy8gc291cmNlOiBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0aWdub3JlXG4gICAgICBjb25zdCBwYXJlbnRkaXIgPSBkaXJuYW1lKHAuZmlsZXBhdGgpO1xuICAgICAgaWYgKHBhcmVudGRpciAhPT0gJy4nICYmIGlnbi5pZ25vcmVzKHBhcmVudGRpcikpIHJldHVybiB0cnVlXG4gICAgICAvLyBJZiB0aGUgZmlsZSBpcyBjdXJyZW50bHkgaWdub3JlZCwgdGVzdCBmb3IgVU5pZ25vcmluZy5cbiAgICAgIGlmIChpZ25vcmVkU3RhdHVzKSB7XG4gICAgICAgIGlnbm9yZWRTdGF0dXMgPSAhaWduLnRlc3QocC5maWxlcGF0aCkudW5pZ25vcmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWdub3JlZFN0YXR1cyA9IGlnbi50ZXN0KHAuZmlsZXBhdGgpLmlnbm9yZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpZ25vcmVkU3RhdHVzXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVPYmplY3RMb29zZSh7IGZzLCBnaXRkaXIsIG9iamVjdCwgZm9ybWF0LCBvaWQgfSkge1xuICBpZiAoZm9ybWF0ICE9PSAnZGVmbGF0ZWQnKSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAnR2l0T2JqZWN0U3RvcmVMb29zZSBleHBlY3RzIG9iamVjdHMgdG8gd3JpdGUgdG8gYmUgaW4gZGVmbGF0ZWQgZm9ybWF0J1xuICAgIClcbiAgfVxuICBjb25zdCBzb3VyY2UgPSBgb2JqZWN0cy8ke29pZC5zbGljZSgwLCAyKX0vJHtvaWQuc2xpY2UoMil9YDtcbiAgY29uc3QgZmlsZXBhdGggPSBgJHtnaXRkaXJ9LyR7c291cmNlfWA7XG4gIC8vIERvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBnaXQgb2JqZWN0cyAtIHRoaXMgaGVscHMgYXZvaWQgRVBFUk0gZXJyb3JzLlxuICAvLyBBbHRob3VnaCBJIGRvbid0IGtub3cgaG93IHdlJ2QgZml4IGNvcnJ1cHRlZCBvYmplY3RzIHRoZW4uIFBlcmhhcHMgZGVsZXRlIHRoZW1cbiAgLy8gb24gcmVhZD9cbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGZpbGVwYXRoKSkpIGF3YWl0IGZzLndyaXRlKGZpbGVwYXRoLCBvYmplY3QpO1xufVxuXG4vKiBlc2xpbnQtZW52IG5vZGUsIGJyb3dzZXIgKi9cblxubGV0IHN1cHBvcnRzQ29tcHJlc3Npb25TdHJlYW0gPSBudWxsO1xuXG5hc3luYyBmdW5jdGlvbiBkZWZsYXRlKGJ1ZmZlcikge1xuICBpZiAoc3VwcG9ydHNDb21wcmVzc2lvblN0cmVhbSA9PT0gbnVsbCkge1xuICAgIHN1cHBvcnRzQ29tcHJlc3Npb25TdHJlYW0gPSB0ZXN0Q29tcHJlc3Npb25TdHJlYW0oKTtcbiAgfVxuICByZXR1cm4gc3VwcG9ydHNDb21wcmVzc2lvblN0cmVhbVxuICAgID8gYnJvd3NlckRlZmxhdGUoYnVmZmVyKVxuICAgIDogcGFrby5kZWZsYXRlKGJ1ZmZlcilcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnJvd3NlckRlZmxhdGUoYnVmZmVyKSB7XG4gIGNvbnN0IGNzID0gbmV3IENvbXByZXNzaW9uU3RyZWFtKCdkZWZsYXRlJyk7XG4gIGNvbnN0IGMgPSBuZXcgQmxvYihbYnVmZmVyXSkuc3RyZWFtKCkucGlwZVRocm91Z2goY3MpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IFJlc3BvbnNlKGMpLmFycmF5QnVmZmVyKCkpXG59XG5cbmZ1bmN0aW9uIHRlc3RDb21wcmVzc2lvblN0cmVhbSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjcyA9IG5ldyBDb21wcmVzc2lvblN0cmVhbSgnZGVmbGF0ZScpO1xuICAgIGNzLndyaXRhYmxlLmNsb3NlKCk7XG4gICAgLy8gVGVzdCBpZiBgQmxvYi5zdHJlYW1gIGlzIHByZXNlbnQuIFJlYWN0IE5hdGl2ZSBkb2VzIG5vdCBoYXZlIHRoZSBgc3RyZWFtYCBtZXRob2RcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmxvYihbXSkuc3RyZWFtKCk7XG4gICAgc3RyZWFtLmNhbmNlbCgpO1xuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfd3JpdGVPYmplY3Qoe1xuICBmcyxcbiAgZ2l0ZGlyLFxuICB0eXBlLFxuICBvYmplY3QsXG4gIGZvcm1hdCA9ICdjb250ZW50JyxcbiAgb2lkID0gdW5kZWZpbmVkLFxuICBkcnlSdW4gPSBmYWxzZSxcbn0pIHtcbiAgaWYgKGZvcm1hdCAhPT0gJ2RlZmxhdGVkJykge1xuICAgIGlmIChmb3JtYXQgIT09ICd3cmFwcGVkJykge1xuICAgICAgb2JqZWN0ID0gR2l0T2JqZWN0LndyYXAoeyB0eXBlLCBvYmplY3QgfSk7XG4gICAgfVxuICAgIG9pZCA9IGF3YWl0IHNoYXN1bShvYmplY3QpO1xuICAgIG9iamVjdCA9IEJ1ZmZlci5mcm9tKGF3YWl0IGRlZmxhdGUob2JqZWN0KSk7XG4gIH1cbiAgaWYgKCFkcnlSdW4pIHtcbiAgICBhd2FpdCB3cml0ZU9iamVjdExvb3NlKHsgZnMsIGdpdGRpciwgb2JqZWN0LCBmb3JtYXQ6ICdkZWZsYXRlZCcsIG9pZCB9KTtcbiAgfVxuICByZXR1cm4gb2lkXG59XG5cbmZ1bmN0aW9uIHBvc2l4aWZ5UGF0aEJ1ZmZlcihidWZmZXIpIHtcbiAgbGV0IGlkeDtcbiAgd2hpbGUgKH4oaWR4ID0gYnVmZmVyLmluZGV4T2YoOTIpKSkgYnVmZmVyW2lkeF0gPSA0NztcbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBBZGQgYSBmaWxlIHRvIHRoZSBnaXQgaW5kZXggKGFrYSBzdGFnaW5nIGFyZWEpXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5kaXIgLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsICcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhcmdzLmZpbGVwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYWRkIHRvIHRoZSBpbmRleFxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmZvcmNlPWZhbHNlXSAtIGFkZCB0byBpbmRleCBldmVuIGlmIG1hdGNoZXMgZ2l0aWdub3JlLiBUaGluayBgZ2l0IGFkZCAtLWZvcmNlYFxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5wYXJhbGxlbD1mYWxzZV0gLSBwcm9jZXNzIGVhY2ggaW5wdXQgZmlsZSBpbiBwYXJhbGxlbC4gUGFyYWxsZWwgcHJvY2Vzc2luZyB3aWxsIHJlc3VsdCBpbiBtb3JlIG1lbW9yeSBjb25zdW1wdGlvbiBidXQgbGVzcyBwcm9jZXNzIHRpbWVcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IG9uY2UgdGhlIGdpdCBpbmRleCBoYXMgYmVlbiB1cGRhdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSgnL3R1dG9yaWFsL1JFQURNRS5tZCcsIGAjIFRFU1RgKVxuICogYXdhaXQgZ2l0LmFkZCh7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCBmaWxlcGF0aDogJ1JFQURNRS5tZCcgfSlcbiAqIGNvbnNvbGUubG9nKCdkb25lJylcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFkZCh7XG4gIGZzOiBfZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIGZpbGVwYXRoLFxuICBjYWNoZSA9IHt9LFxuICBmb3JjZSA9IGZhbHNlLFxuICBwYXJhbGxlbCA9IHRydWUsXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIF9mcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdkaXInLCBkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZpbGVwYXRoJywgZmlsZXBhdGgpO1xuXG4gICAgY29uc3QgZnMgPSBuZXcgRmlsZVN5c3RlbShfZnMpO1xuICAgIGF3YWl0IEdpdEluZGV4TWFuYWdlci5hY3F1aXJlKHsgZnMsIGdpdGRpciwgY2FjaGUgfSwgYXN5bmMgaW5kZXggPT4ge1xuICAgICAgcmV0dXJuIGFkZFRvSW5kZXgoe1xuICAgICAgICBkaXIsXG4gICAgICAgIGdpdGRpcixcbiAgICAgICAgZnMsXG4gICAgICAgIGZpbGVwYXRoLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgZm9yY2UsXG4gICAgICAgIHBhcmFsbGVsLFxuICAgICAgfSlcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuYWRkJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhZGRUb0luZGV4KHtcbiAgZGlyLFxuICBnaXRkaXIsXG4gIGZzLFxuICBmaWxlcGF0aCxcbiAgaW5kZXgsXG4gIGZvcmNlLFxuICBwYXJhbGxlbCxcbn0pIHtcbiAgLy8gVE9ETzogU2hvdWxkIGlnbm9yZSBVTkxFU1MgaXQncyBhbHJlYWR5IGluIHRoZSBpbmRleC5cbiAgZmlsZXBhdGggPSBBcnJheS5pc0FycmF5KGZpbGVwYXRoKSA/IGZpbGVwYXRoIDogW2ZpbGVwYXRoXTtcbiAgY29uc3QgcHJvbWlzZXMgPSBmaWxlcGF0aC5tYXAoYXN5bmMgY3VycmVudEZpbGVwYXRoID0+IHtcbiAgICBpZiAoIWZvcmNlKSB7XG4gICAgICBjb25zdCBpZ25vcmVkID0gYXdhaXQgR2l0SWdub3JlTWFuYWdlci5pc0lnbm9yZWQoe1xuICAgICAgICBmcyxcbiAgICAgICAgZGlyLFxuICAgICAgICBnaXRkaXIsXG4gICAgICAgIGZpbGVwYXRoOiBjdXJyZW50RmlsZXBhdGgsXG4gICAgICB9KTtcbiAgICAgIGlmIChpZ25vcmVkKSByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5sc3RhdChqb2luKGRpciwgY3VycmVudEZpbGVwYXRoKSk7XG4gICAgaWYgKCFzdGF0cykgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoY3VycmVudEZpbGVwYXRoKVxuXG4gICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gYXdhaXQgZnMucmVhZGRpcihqb2luKGRpciwgY3VycmVudEZpbGVwYXRoKSk7XG4gICAgICBpZiAocGFyYWxsZWwpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoY2hpbGQgPT5cbiAgICAgICAgICBhZGRUb0luZGV4KHtcbiAgICAgICAgICAgIGRpcixcbiAgICAgICAgICAgIGdpdGRpcixcbiAgICAgICAgICAgIGZzLFxuICAgICAgICAgICAgZmlsZXBhdGg6IFtqb2luKGN1cnJlbnRGaWxlcGF0aCwgY2hpbGQpXSxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgZm9yY2UsXG4gICAgICAgICAgICBwYXJhbGxlbCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgYXdhaXQgYWRkVG9JbmRleCh7XG4gICAgICAgICAgICBkaXIsXG4gICAgICAgICAgICBnaXRkaXIsXG4gICAgICAgICAgICBmcyxcbiAgICAgICAgICAgIGZpbGVwYXRoOiBbam9pbihjdXJyZW50RmlsZXBhdGgsIGNoaWxkKV0sXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGZvcmNlLFxuICAgICAgICAgICAgcGFyYWxsZWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb2JqZWN0ID0gc3RhdHMuaXNTeW1ib2xpY0xpbmsoKVxuICAgICAgICA/IGF3YWl0IGZzLnJlYWRsaW5rKGpvaW4oZGlyLCBjdXJyZW50RmlsZXBhdGgpKS50aGVuKHBvc2l4aWZ5UGF0aEJ1ZmZlcilcbiAgICAgICAgOiBhd2FpdCBmcy5yZWFkKGpvaW4oZGlyLCBjdXJyZW50RmlsZXBhdGgpKTtcbiAgICAgIGlmIChvYmplY3QgPT09IG51bGwpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGN1cnJlbnRGaWxlcGF0aClcbiAgICAgIGNvbnN0IG9pZCA9IGF3YWl0IF93cml0ZU9iamVjdCh7IGZzLCBnaXRkaXIsIHR5cGU6ICdibG9iJywgb2JqZWN0IH0pO1xuICAgICAgaW5kZXguaW5zZXJ0KHsgZmlsZXBhdGg6IGN1cnJlbnRGaWxlcGF0aCwgc3RhdHMsIG9pZCB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHNldHRsZWRQcm9taXNlcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG4gIGNvbnN0IHJlamVjdGVkUHJvbWlzZXMgPSBzZXR0bGVkUHJvbWlzZXNcbiAgICAuZmlsdGVyKHNldHRsZSA9PiBzZXR0bGUuc3RhdHVzID09PSAncmVqZWN0ZWQnKVxuICAgIC5tYXAoc2V0dGxlID0+IHNldHRsZS5yZWFzb24pO1xuICBpZiAocmVqZWN0ZWRQcm9taXNlcy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IE11bHRpcGxlR2l0RXJyb3IocmVqZWN0ZWRQcm9taXNlcylcbiAgfVxuICBpZiAocmVqZWN0ZWRQcm9taXNlcy5sZW5ndGggPT09IDEpIHtcbiAgICB0aHJvdyByZWplY3RlZFByb21pc2VzWzBdXG4gIH1cblxuICBjb25zdCBmdWxmaWxsZWRQcm9taXNlcyA9IHNldHRsZWRQcm9taXNlc1xuICAgIC5maWx0ZXIoc2V0dGxlID0+IHNldHRsZS5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHNldHRsZS52YWx1ZSlcbiAgICAubWFwKHNldHRsZSA9PiBzZXR0bGUudmFsdWUpO1xuXG4gIHJldHVybiBmdWxmaWxsZWRQcm9taXNlc1xufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge1NpZ25DYWxsYmFja30gW2FyZ3Mub25TaWduXVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXNzYWdlXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncy5hdXRob3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhvci5uYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRob3IuZW1haWxcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmF1dGhvci50aW1lc3RhbXBcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmF1dGhvci50aW1lem9uZU9mZnNldFxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MuY29tbWl0dGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21taXR0ZXIubmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWl0dGVyLmVtYWlsXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21taXR0ZXIudGltZXN0YW1wXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21taXR0ZXIudGltZXpvbmVPZmZzZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zaWduaW5nS2V5XVxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kcnlSdW4gPSBmYWxzZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3Mubm9VcGRhdGVCcmFuY2ggPSBmYWxzZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZWZdXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5wYXJlbnRdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudHJlZV1cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCB0aGUgU0hBLTEgb2JqZWN0IGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIGNvbW1pdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2NvbW1pdCh7XG4gIGZzLFxuICBjYWNoZSxcbiAgb25TaWduLFxuICBnaXRkaXIsXG4gIG1lc3NhZ2UsXG4gIGF1dGhvcixcbiAgY29tbWl0dGVyLFxuICBzaWduaW5nS2V5LFxuICBkcnlSdW4gPSBmYWxzZSxcbiAgbm9VcGRhdGVCcmFuY2ggPSBmYWxzZSxcbiAgcmVmLFxuICBwYXJlbnQsXG4gIHRyZWUsXG59KSB7XG4gIGlmICghcmVmKSB7XG4gICAgcmVmID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHtcbiAgICAgIGZzLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVmOiAnSEVBRCcsXG4gICAgICBkZXB0aDogMixcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBHaXRJbmRleE1hbmFnZXIuYWNxdWlyZShcbiAgICB7IGZzLCBnaXRkaXIsIGNhY2hlLCBhbGxvd1VubWVyZ2VkOiBmYWxzZSB9LFxuICAgIGFzeW5jIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICBjb25zdCBpbm9kZXMgPSBmbGF0RmlsZUxpc3RUb0RpcmVjdG9yeVN0cnVjdHVyZShpbmRleC5lbnRyaWVzKTtcbiAgICAgIGNvbnN0IGlub2RlID0gaW5vZGVzLmdldCgnLicpO1xuICAgICAgaWYgKCF0cmVlKSB7XG4gICAgICAgIHRyZWUgPSBhd2FpdCBjb25zdHJ1Y3RUcmVlKHsgZnMsIGdpdGRpciwgaW5vZGUsIGRyeVJ1biB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50ID0gW1xuICAgICAgICAgICAgYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgZnMsXG4gICAgICAgICAgICAgIGdpdGRpcixcbiAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gUHJvYmFibHkgYW4gaW5pdGlhbCBjb21taXRcbiAgICAgICAgICBwYXJlbnQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHBhcmVudHMgYXJlIG9pZHMsIG5vdCByZWZzXG4gICAgICAgIHBhcmVudCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHBhcmVudC5tYXAocCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gR2l0UmVmTWFuYWdlci5yZXNvbHZlKHsgZnMsIGdpdGRpciwgcmVmOiBwIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNvbW0gPSBHaXRDb21taXQuZnJvbSh7XG4gICAgICAgIHRyZWUsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYXV0aG9yLFxuICAgICAgICBjb21taXR0ZXIsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChzaWduaW5nS2V5KSB7XG4gICAgICAgIGNvbW0gPSBhd2FpdCBHaXRDb21taXQuc2lnbihjb21tLCBvblNpZ24sIHNpZ25pbmdLZXkpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2lkID0gYXdhaXQgX3dyaXRlT2JqZWN0KHtcbiAgICAgICAgZnMsXG4gICAgICAgIGdpdGRpcixcbiAgICAgICAgdHlwZTogJ2NvbW1pdCcsXG4gICAgICAgIG9iamVjdDogY29tbS50b09iamVjdCgpLFxuICAgICAgICBkcnlSdW4sXG4gICAgICB9KTtcbiAgICAgIGlmICghbm9VcGRhdGVCcmFuY2ggJiYgIWRyeVJ1bikge1xuICAgICAgICAvLyBVcGRhdGUgYnJhbmNoIHBvaW50ZXJcbiAgICAgICAgYXdhaXQgR2l0UmVmTWFuYWdlci53cml0ZVJlZih7XG4gICAgICAgICAgZnMsXG4gICAgICAgICAgZ2l0ZGlyLFxuICAgICAgICAgIHJlZixcbiAgICAgICAgICB2YWx1ZTogb2lkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvaWRcbiAgICB9XG4gIClcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29uc3RydWN0VHJlZSh7IGZzLCBnaXRkaXIsIGlub2RlLCBkcnlSdW4gfSkge1xuICAvLyB1c2UgZGVwdGggZmlyc3QgdHJhdmVyc2FsXG4gIGNvbnN0IGNoaWxkcmVuID0gaW5vZGUuY2hpbGRyZW47XG4gIGZvciAoY29uc3QgaW5vZGUgb2YgY2hpbGRyZW4pIHtcbiAgICBpZiAoaW5vZGUudHlwZSA9PT0gJ3RyZWUnKSB7XG4gICAgICBpbm9kZS5tZXRhZGF0YS5tb2RlID0gJzA0MDAwMCc7XG4gICAgICBpbm9kZS5tZXRhZGF0YS5vaWQgPSBhd2FpdCBjb25zdHJ1Y3RUcmVlKHsgZnMsIGdpdGRpciwgaW5vZGUsIGRyeVJ1biB9KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZW50cmllcyA9IGNoaWxkcmVuLm1hcChpbm9kZSA9PiAoe1xuICAgIG1vZGU6IGlub2RlLm1ldGFkYXRhLm1vZGUsXG4gICAgcGF0aDogaW5vZGUuYmFzZW5hbWUsXG4gICAgb2lkOiBpbm9kZS5tZXRhZGF0YS5vaWQsXG4gICAgdHlwZTogaW5vZGUudHlwZSxcbiAgfSkpO1xuICBjb25zdCB0cmVlID0gR2l0VHJlZS5mcm9tKGVudHJpZXMpO1xuICBjb25zdCBvaWQgPSBhd2FpdCBfd3JpdGVPYmplY3Qoe1xuICAgIGZzLFxuICAgIGdpdGRpcixcbiAgICB0eXBlOiAndHJlZScsXG4gICAgb2JqZWN0OiB0cmVlLnRvT2JqZWN0KCksXG4gICAgZHJ5UnVuLFxuICB9KTtcbiAgcmV0dXJuIG9pZFxufVxuXG4vLyBAdHMtY2hlY2tcblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZpbGVwYXRoKHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCwgZmlsZXBhdGggfSkge1xuICAvLyBFbnN1cmUgdGhlcmUgYXJlIG5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvcnMuXG4gIC8vIEkgd2FzIGdvaW5nIHRvIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IHRoZW4gZm91bmQgdGhhdCB0aGUgR2l0IFRlcm1pbmFsIGZvciBXaW5kb3dzXG4gIC8vIGF1dG8tZXhwYW5kcyAtLWZpbGVwYXRoPS9zcmMvdXRpbHMgdG8gLS1maWxlcGF0aD1DOi9Vc2Vycy9XaWxsL0FwcERhdGEvTG9jYWwvUHJvZ3JhbXMvR2l0L3NyYy91dGlsc1xuICAvLyBzbyBJIGZpZ3VyZWQgaXQgd291bGQgYmUgd2lzZSB0byBwcm9tb3RlIHRoZSBiZWhhdmlvciBpbiB0aGUgYXBwbGljYXRpb24gbGF5ZXIgbm90IGp1c3QgdGhlIGxpYnJhcnkgbGF5ZXIuXG4gIGlmIChmaWxlcGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEZpbGVwYXRoRXJyb3IoJ2xlYWRpbmctc2xhc2gnKVxuICB9IGVsc2UgaWYgKGZpbGVwYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEZpbGVwYXRoRXJyb3IoJ3RyYWlsaW5nLXNsYXNoJylcbiAgfVxuICBjb25zdCBfb2lkID0gb2lkO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlVHJlZSh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSk7XG4gIGNvbnN0IHRyZWUgPSByZXN1bHQudHJlZTtcbiAgaWYgKGZpbGVwYXRoID09PSAnJykge1xuICAgIG9pZCA9IHJlc3VsdC5vaWQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gZmlsZXBhdGguc3BsaXQoJy8nKTtcbiAgICBvaWQgPSBhd2FpdCBfcmVzb2x2ZUZpbGVwYXRoKHtcbiAgICAgIGZzLFxuICAgICAgY2FjaGUsXG4gICAgICBnaXRkaXIsXG4gICAgICB0cmVlLFxuICAgICAgcGF0aEFycmF5LFxuICAgICAgb2lkOiBfb2lkLFxuICAgICAgZmlsZXBhdGgsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9pZFxufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVzb2x2ZUZpbGVwYXRoKHtcbiAgZnMsXG4gIGNhY2hlLFxuICBnaXRkaXIsXG4gIHRyZWUsXG4gIHBhdGhBcnJheSxcbiAgb2lkLFxuICBmaWxlcGF0aCxcbn0pIHtcbiAgY29uc3QgbmFtZSA9IHBhdGhBcnJheS5zaGlmdCgpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRyZWUpIHtcbiAgICBpZiAoZW50cnkucGF0aCA9PT0gbmFtZSkge1xuICAgICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5Lm9pZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyB0eXBlLCBvYmplY3QgfSA9IGF3YWl0IF9yZWFkT2JqZWN0KHtcbiAgICAgICAgICBmcyxcbiAgICAgICAgICBjYWNoZSxcbiAgICAgICAgICBnaXRkaXIsXG4gICAgICAgICAgb2lkOiBlbnRyeS5vaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZSAhPT0gJ3RyZWUnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFR5cGVFcnJvcihvaWQsIHR5cGUsICd0cmVlJywgZmlsZXBhdGgpXG4gICAgICAgIH1cbiAgICAgICAgdHJlZSA9IEdpdFRyZWUuZnJvbShvYmplY3QpO1xuICAgICAgICByZXR1cm4gX3Jlc29sdmVGaWxlcGF0aCh7XG4gICAgICAgICAgZnMsXG4gICAgICAgICAgY2FjaGUsXG4gICAgICAgICAgZ2l0ZGlyLFxuICAgICAgICAgIHRyZWUsXG4gICAgICAgICAgcGF0aEFycmF5LFxuICAgICAgICAgIG9pZCxcbiAgICAgICAgICBmaWxlcGF0aCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYGZpbGUgb3IgZGlyZWN0b3J5IGZvdW5kIGF0IFwiJHtvaWR9OiR7ZmlsZXBhdGh9XCJgKVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gUmVhZFRyZWVSZXN1bHQgLSBUaGUgb2JqZWN0IHJldHVybmVkIGhhcyB0aGUgZm9sbG93aW5nIHNjaGVtYTpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvaWQgLSBTSEEtMSBvYmplY3QgaWQgb2YgdGhpcyB0cmVlXG4gKiBAcHJvcGVydHkge1RyZWVPYmplY3R9IHRyZWUgLSB0aGUgcGFyc2VkIHRyZWUgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHthbnl9IGFyZ3MuY2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdpdGRpclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub2lkXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZmlsZXBhdGhdXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8UmVhZFRyZWVSZXN1bHQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBfcmVhZFRyZWUoe1xuICBmcyxcbiAgY2FjaGUsXG4gIGdpdGRpcixcbiAgb2lkLFxuICBmaWxlcGF0aCA9IHVuZGVmaW5lZCxcbn0pIHtcbiAgaWYgKGZpbGVwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICBvaWQgPSBhd2FpdCByZXNvbHZlRmlsZXBhdGgoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkLCBmaWxlcGF0aCB9KTtcbiAgfVxuICBjb25zdCB7IHRyZWUsIG9pZDogdHJlZU9pZCB9ID0gYXdhaXQgcmVzb2x2ZVRyZWUoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pO1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgb2lkOiB0cmVlT2lkLFxuICAgIHRyZWU6IHRyZWUuZW50cmllcygpLFxuICB9O1xuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7VHJlZU9iamVjdH0gYXJncy50cmVlXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX3dyaXRlVHJlZSh7IGZzLCBnaXRkaXIsIHRyZWUgfSkge1xuICAvLyBDb252ZXJ0IG9iamVjdCB0byBidWZmZXJcbiAgY29uc3Qgb2JqZWN0ID0gR2l0VHJlZS5mcm9tKHRyZWUpLnRvT2JqZWN0KCk7XG4gIGNvbnN0IG9pZCA9IGF3YWl0IF93cml0ZU9iamVjdCh7XG4gICAgZnMsXG4gICAgZ2l0ZGlyLFxuICAgIHR5cGU6ICd0cmVlJyxcbiAgICBvYmplY3QsXG4gICAgZm9ybWF0OiAnY29udGVudCcsXG4gIH0pO1xuICByZXR1cm4gb2lkXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncy5jYWNoZVxuICogQHBhcmFtIHtTaWduQ2FsbGJhY2t9IFthcmdzLm9uU2lnbl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdpdGRpclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVmXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5vaWRcbiAqIEBwYXJhbSB7c3RyaW5nfFVpbnQ4QXJyYXl9IGFyZ3Mubm90ZVxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JjZV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzLmF1dGhvclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aG9yLm5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhvci5lbWFpbFxuICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYXV0aG9yLnRpbWVzdGFtcFxuICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYXV0aG9yLnRpbWV6b25lT2Zmc2V0XG4gKiBAcGFyYW0ge09iamVjdH0gYXJncy5jb21taXR0ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1pdHRlci5uYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21taXR0ZXIuZW1haWxcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNvbW1pdHRlci50aW1lc3RhbXBcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNvbW1pdHRlci50aW1lem9uZU9mZnNldFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnNpZ25pbmdLZXldXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAqL1xuXG5hc3luYyBmdW5jdGlvbiBfYWRkTm90ZSh7XG4gIGZzLFxuICBjYWNoZSxcbiAgb25TaWduLFxuICBnaXRkaXIsXG4gIHJlZixcbiAgb2lkLFxuICBub3RlLFxuICBmb3JjZSxcbiAgYXV0aG9yLFxuICBjb21taXR0ZXIsXG4gIHNpZ25pbmdLZXksXG59KSB7XG4gIC8vIEdldCB0aGUgY3VycmVudCBub3RlIGNvbW1pdFxuICBsZXQgcGFyZW50O1xuICB0cnkge1xuICAgIHBhcmVudCA9IGF3YWl0IEdpdFJlZk1hbmFnZXIucmVzb2x2ZSh7IGdpdGRpciwgZnMsIHJlZiB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIC8vIEknbSB1c2luZyB0aGUgXCJlbXB0eSB0cmVlXCIgbWFnaWMgbnVtYmVyIGhlcmUgZm9yIGJyZXZpdHlcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgX3JlYWRUcmVlKHtcbiAgICBmcyxcbiAgICBjYWNoZSxcbiAgICBnaXRkaXIsXG4gICAgb2lkOiBwYXJlbnQgfHwgJzRiODI1ZGM2NDJjYjZlYjlhMDYwZTU0YmY4ZDY5Mjg4ZmJlZTQ5MDQnLFxuICB9KTtcbiAgbGV0IHRyZWUgPSByZXN1bHQudHJlZTtcblxuICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBub3RlIGFscmVhZHkgZXhpc3RzXG4gIGlmIChmb3JjZSkge1xuICAgIHRyZWUgPSB0cmVlLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5wYXRoICE9PSBvaWQpO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdHJlZSkge1xuICAgICAgaWYgKGVudHJ5LnBhdGggPT09IG9pZCkge1xuICAgICAgICB0aHJvdyBuZXcgQWxyZWFkeUV4aXN0c0Vycm9yKCdub3RlJywgb2lkKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSB0aGUgbm90ZSBibG9iXG4gIGlmICh0eXBlb2Ygbm90ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBub3RlID0gQnVmZmVyLmZyb20obm90ZSwgJ3V0ZjgnKTtcbiAgfVxuICBjb25zdCBub3RlT2lkID0gYXdhaXQgX3dyaXRlT2JqZWN0KHtcbiAgICBmcyxcbiAgICBnaXRkaXIsXG4gICAgdHlwZTogJ2Jsb2InLFxuICAgIG9iamVjdDogbm90ZSxcbiAgICBmb3JtYXQ6ICdjb250ZW50JyxcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBuZXcgbm90ZSB0cmVlXG4gIHRyZWUucHVzaCh7IG1vZGU6ICcxMDA2NDQnLCBwYXRoOiBvaWQsIG9pZDogbm90ZU9pZCwgdHlwZTogJ2Jsb2InIH0pO1xuICBjb25zdCB0cmVlT2lkID0gYXdhaXQgX3dyaXRlVHJlZSh7XG4gICAgZnMsXG4gICAgZ2l0ZGlyLFxuICAgIHRyZWUsXG4gIH0pO1xuXG4gIC8vIENyZWF0ZSB0aGUgbmV3IG5vdGUgY29tbWl0XG4gIGNvbnN0IGNvbW1pdE9pZCA9IGF3YWl0IF9jb21taXQoe1xuICAgIGZzLFxuICAgIGNhY2hlLFxuICAgIG9uU2lnbixcbiAgICBnaXRkaXIsXG4gICAgcmVmLFxuICAgIHRyZWU6IHRyZWVPaWQsXG4gICAgcGFyZW50OiBwYXJlbnQgJiYgW3BhcmVudF0sXG4gICAgbWVzc2FnZTogYE5vdGUgYWRkZWQgYnkgJ2lzb21vcnBoaWMtZ2l0IGFkZE5vdGUnXFxuYCxcbiAgICBhdXRob3IsXG4gICAgY29tbWl0dGVyLFxuICAgIHNpZ25pbmdLZXksXG4gIH0pO1xuXG4gIHJldHVybiBjb21taXRPaWRcbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdpdGRpclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucGF0aFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc29sdmVzIHdpdGggdGhlIGNvbmZpZyB2YWx1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGNvbmZpZyB2YWx1ZVxuICogbGV0IHZhbHVlID0gYXdhaXQgZ2l0LmdldENvbmZpZyh7XG4gKiAgIGRpcjogJyRpbnB1dCgoLykpJyxcbiAqICAgcGF0aDogJyRpbnB1dCgodXNlci5uYW1lKSknXG4gKiB9KVxuICogY29uc29sZS5sb2codmFsdWUpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBfZ2V0Q29uZmlnKHsgZnMsIGdpdGRpciwgcGF0aCB9KSB7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuZ2V0KHsgZnMsIGdpdGRpciB9KTtcbiAgcmV0dXJuIGNvbmZpZy5nZXQocGF0aClcbn1cblxuLyoqXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZCB8IHtuYW1lOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcsIGRhdGU6IERhdGUsIHRpbWVzdGFtcDogbnVtYmVyLCB0aW1lem9uZU9mZnNldDogbnVtYmVyIH0+fVxuICovXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVBdXRob3JPYmplY3QoeyBmcywgZ2l0ZGlyLCBhdXRob3IgPSB7fSB9KSB7XG4gIGxldCB7IG5hbWUsIGVtYWlsLCB0aW1lc3RhbXAsIHRpbWV6b25lT2Zmc2V0IH0gPSBhdXRob3I7XG4gIG5hbWUgPSBuYW1lIHx8IChhd2FpdCBfZ2V0Q29uZmlnKHsgZnMsIGdpdGRpciwgcGF0aDogJ3VzZXIubmFtZScgfSkpO1xuICBlbWFpbCA9IGVtYWlsIHx8IChhd2FpdCBfZ2V0Q29uZmlnKHsgZnMsIGdpdGRpciwgcGF0aDogJ3VzZXIuZW1haWwnIH0pKSB8fCAnJztcblxuICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgdGltZXN0YW1wID0gdGltZXN0YW1wICE9IG51bGwgPyB0aW1lc3RhbXAgOiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgdGltZXpvbmVPZmZzZXQgPVxuICAgIHRpbWV6b25lT2Zmc2V0ICE9IG51bGxcbiAgICAgID8gdGltZXpvbmVPZmZzZXRcbiAgICAgIDogbmV3IERhdGUodGltZXN0YW1wICogMTAwMCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcblxuICByZXR1cm4geyBuYW1lLCBlbWFpbCwgdGltZXN0YW1wLCB0aW1lem9uZU9mZnNldCB9XG59XG5cbi8qKlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQgfCB7bmFtZTogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCB0aW1lc3RhbXA6IG51bWJlciwgdGltZXpvbmVPZmZzZXQ6IG51bWJlciB9Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplQ29tbWl0dGVyT2JqZWN0KHtcbiAgZnMsXG4gIGdpdGRpcixcbiAgYXV0aG9yLFxuICBjb21taXR0ZXIsXG59KSB7XG4gIGNvbW1pdHRlciA9IE9iamVjdC5hc3NpZ24oe30sIGNvbW1pdHRlciB8fCBhdXRob3IpO1xuICAvLyBNYXRjaCBjb21taXR0ZXIncyBkYXRlIHRvIGF1dGhvcidzIG9uZSwgaWYgb21pdHRlZFxuICBpZiAoYXV0aG9yKSB7XG4gICAgY29tbWl0dGVyLnRpbWVzdGFtcCA9IGNvbW1pdHRlci50aW1lc3RhbXAgfHwgYXV0aG9yLnRpbWVzdGFtcDtcbiAgICBjb21taXR0ZXIudGltZXpvbmVPZmZzZXQgPSBjb21taXR0ZXIudGltZXpvbmVPZmZzZXQgfHwgYXV0aG9yLnRpbWV6b25lT2Zmc2V0O1xuICB9XG4gIGNvbW1pdHRlciA9IGF3YWl0IG5vcm1hbGl6ZUF1dGhvck9iamVjdCh7IGZzLCBnaXRkaXIsIGF1dGhvcjogY29tbWl0dGVyIH0pO1xuICByZXR1cm4gY29tbWl0dGVyXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEFkZCBvciB1cGRhdGUgYW4gb2JqZWN0IG5vdGVcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7U2lnbkNhbGxiYWNrfSBbYXJncy5vblNpZ25dIC0gYSBQR1Agc2lnbmluZyBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlZl0gLSBUaGUgbm90ZXMgcmVmIHRvIGxvb2sgdW5kZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm9pZCAtIFRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlIG9iamVjdCB0byBhZGQgdGhlIG5vdGUgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ3xVaW50OEFycmF5fSBhcmdzLm5vdGUgLSBUaGUgbm90ZSB0byBhZGRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZm9yY2VdIC0gT3Zlci13cml0ZSBub3RlIGlmIGl0IGFscmVhZHkgZXhpc3RzLlxuICogQHBhcmFtIHtPYmplY3R9IFthcmdzLmF1dGhvcl0gLSBUaGUgZGV0YWlscyBhYm91dCB0aGUgYXV0aG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhvci5uYW1lXSAtIERlZmF1bHQgaXMgYHVzZXIubmFtZWAgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhvci5lbWFpbF0gLSBEZWZhdWx0IGlzIGB1c2VyLmVtYWlsYCBjb25maWcuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYXV0aG9yLnRpbWVzdGFtcD1NYXRoLmZsb29yKERhdGUubm93KCkvMTAwMCldIC0gU2V0IHRoZSBhdXRob3IgdGltZXN0YW1wIGZpZWxkLiBUaGlzIGlzIHRoZSBpbnRlZ2VyIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBVbml4IGVwb2NoICgxOTcwLTAxLTAxIDAwOjAwOjAwKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5hdXRob3IudGltZXpvbmVPZmZzZXRdIC0gU2V0IHRoZSBhdXRob3IgdGltZXpvbmUgb2Zmc2V0IGZpZWxkLiBUaGlzIGlzIHRoZSBkaWZmZXJlbmNlLCBpbiBtaW51dGVzLCBmcm9tIHRoZSBjdXJyZW50IHRpbWV6b25lIHRvIFVUQy4gRGVmYXVsdCBpcyBgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KClgLlxuICogQHBhcmFtIHtPYmplY3R9IFthcmdzLmNvbW1pdHRlciA9IGF1dGhvcl0gLSBUaGUgZGV0YWlscyBhYm91dCB0aGUgbm90ZSBjb21taXR0ZXIsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYXV0aG9yIHBhcmFtZXRlci4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGF1dGhvciBkZXRhaWxzIGFyZSB1c2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNvbW1pdHRlci5uYW1lXSAtIERlZmF1bHQgaXMgYHVzZXIubmFtZWAgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNvbW1pdHRlci5lbWFpbF0gLSBEZWZhdWx0IGlzIGB1c2VyLmVtYWlsYCBjb25maWcuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuY29tbWl0dGVyLnRpbWVzdGFtcD1NYXRoLmZsb29yKERhdGUubm93KCkvMTAwMCldIC0gU2V0IHRoZSBjb21taXR0ZXIgdGltZXN0YW1wIGZpZWxkLiBUaGlzIGlzIHRoZSBpbnRlZ2VyIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBVbml4IGVwb2NoICgxOTcwLTAxLTAxIDAwOjAwOjAwKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5jb21taXR0ZXIudGltZXpvbmVPZmZzZXRdIC0gU2V0IHRoZSBjb21taXR0ZXIgdGltZXpvbmUgb2Zmc2V0IGZpZWxkLiBUaGlzIGlzIHRoZSBkaWZmZXJlbmNlLCBpbiBtaW51dGVzLCBmcm9tIHRoZSBjdXJyZW50IHRpbWV6b25lIHRvIFVUQy4gRGVmYXVsdCBpcyBgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KClgLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnNpZ25pbmdLZXldIC0gU2lnbiB0aGUgbm90ZSBjb21taXQgdXNpbmcgdGhpcyBwcml2YXRlIFBHUCBrZXkuXG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3MuY2FjaGVdIC0gYSBbY2FjaGVdKGNhY2hlLm1kKSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCB0aGUgU0hBLTEgb2JqZWN0IGlkIG9mIHRoZSBjb21taXQgb2JqZWN0IGZvciB0aGUgYWRkZWQgbm90ZS5cbiAqL1xuXG5hc3luYyBmdW5jdGlvbiBhZGROb3RlKHtcbiAgZnM6IF9mcyxcbiAgb25TaWduLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICByZWYgPSAncmVmcy9ub3Rlcy9jb21taXRzJyxcbiAgb2lkLFxuICBub3RlLFxuICBmb3JjZSxcbiAgYXV0aG9yOiBfYXV0aG9yLFxuICBjb21taXR0ZXI6IF9jb21taXR0ZXIsXG4gIHNpZ25pbmdLZXksXG4gIGNhY2hlID0ge30sXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIF9mcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcignb2lkJywgb2lkKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ25vdGUnLCBub3RlKTtcbiAgICBpZiAoc2lnbmluZ0tleSkge1xuICAgICAgYXNzZXJ0UGFyYW1ldGVyKCdvblNpZ24nLCBvblNpZ24pO1xuICAgIH1cbiAgICBjb25zdCBmcyA9IG5ldyBGaWxlU3lzdGVtKF9mcyk7XG5cbiAgICBjb25zdCBhdXRob3IgPSBhd2FpdCBub3JtYWxpemVBdXRob3JPYmplY3QoeyBmcywgZ2l0ZGlyLCBhdXRob3I6IF9hdXRob3IgfSk7XG4gICAgaWYgKCFhdXRob3IpIHRocm93IG5ldyBNaXNzaW5nTmFtZUVycm9yKCdhdXRob3InKVxuXG4gICAgY29uc3QgY29tbWl0dGVyID0gYXdhaXQgbm9ybWFsaXplQ29tbWl0dGVyT2JqZWN0KHtcbiAgICAgIGZzLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgYXV0aG9yLFxuICAgICAgY29tbWl0dGVyOiBfY29tbWl0dGVyLFxuICAgIH0pO1xuICAgIGlmICghY29tbWl0dGVyKSB0aHJvdyBuZXcgTWlzc2luZ05hbWVFcnJvcignY29tbWl0dGVyJylcblxuICAgIHJldHVybiBhd2FpdCBfYWRkTm90ZSh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgY2FjaGUsXG4gICAgICBvblNpZ24sXG4gICAgICBnaXRkaXIsXG4gICAgICByZWYsXG4gICAgICBvaWQsXG4gICAgICBub3RlLFxuICAgICAgZm9yY2UsXG4gICAgICBhdXRob3IsXG4gICAgICBjb21taXR0ZXIsXG4gICAgICBzaWduaW5nS2V5LFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmFkZE5vdGUnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlbW90ZVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudXJsXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3MuZm9yY2VcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9hZGRSZW1vdGUoeyBmcywgZ2l0ZGlyLCByZW1vdGUsIHVybCwgZm9yY2UgfSkge1xuICBpZiAocmVtb3RlICE9PSBjbGVhbkdpdFJlZi5jbGVhbihyZW1vdGUpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRSZWZOYW1lRXJyb3IocmVtb3RlLCBjbGVhbkdpdFJlZi5jbGVhbihyZW1vdGUpKVxuICB9XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuZ2V0KHsgZnMsIGdpdGRpciB9KTtcbiAgaWYgKCFmb3JjZSkge1xuICAgIC8vIENoZWNrIHRoYXQgc2V0dGluZyBpdCB3b3VsZG4ndCBvdmVyd3JpdGUuXG4gICAgY29uc3QgcmVtb3RlTmFtZXMgPSBhd2FpdCBjb25maWcuZ2V0U3Vic2VjdGlvbnMoJ3JlbW90ZScpO1xuICAgIGlmIChyZW1vdGVOYW1lcy5pbmNsdWRlcyhyZW1vdGUpKSB7XG4gICAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiBpdCB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgcmVtb3RlLFxuICAgICAgLy8gYnV0IG5vdCBpZiBpdCdzIHNpbXBseSBzZXR0aW5nIHRoZSBzYW1lIHZhbHVlIGFnYWluLlxuICAgICAgaWYgKHVybCAhPT0gKGF3YWl0IGNvbmZpZy5nZXQoYHJlbW90ZS4ke3JlbW90ZX0udXJsYCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBBbHJlYWR5RXhpc3RzRXJyb3IoJ3JlbW90ZScsIHJlbW90ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgYXdhaXQgY29uZmlnLnNldChgcmVtb3RlLiR7cmVtb3RlfS51cmxgLCB1cmwpO1xuICBhd2FpdCBjb25maWcuc2V0KFxuICAgIGByZW1vdGUuJHtyZW1vdGV9LmZldGNoYCxcbiAgICBgK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvJHtyZW1vdGV9LypgXG4gICk7XG4gIGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuc2F2ZSh7IGZzLCBnaXRkaXIsIGNvbmZpZyB9KTtcbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQWRkIG9yIHVwZGF0ZSBhIHJlbW90ZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXJdIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlbW90ZSAtIFRoZSBuYW1lIG9mIHRoZSByZW1vdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnVybCAtIFRoZSBVUkwgb2YgdGhlIHJlbW90ZVxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JjZSA9IGZhbHNlXSAtIEluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IgaWYgYSByZW1vdGUgbmFtZWQgYHJlbW90ZWAgYWxyZWFkeSBleGlzdHMsIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgcmVtb3RlLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2hlbiBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IGdpdC5hZGRSZW1vdGUoe1xuICogICBmcyxcbiAqICAgZGlyOiAnL3R1dG9yaWFsJyxcbiAqICAgcmVtb3RlOiAndXBzdHJlYW0nLFxuICogICB1cmw6ICdodHRwczovL2dpdGh1Yi5jb20vaXNvbW9ycGhpYy1naXQvaXNvbW9ycGhpYy1naXQnXG4gKiB9KVxuICogY29uc29sZS5sb2coJ2RvbmUnKVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkUmVtb3RlKHtcbiAgZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIHJlbW90ZSxcbiAgdXJsLFxuICBmb3JjZSA9IGZhbHNlLFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcigncmVtb3RlJywgcmVtb3RlKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ3VybCcsIHVybCk7XG4gICAgcmV0dXJuIGF3YWl0IF9hZGRSZW1vdGUoe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlbW90ZSxcbiAgICAgIHVybCxcbiAgICAgIGZvcmNlLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmFkZFJlbW90ZSc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQ3JlYXRlIGFuIGFubm90YXRlZCB0YWcuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7YW55fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge1NpZ25DYWxsYmFja30gW2FyZ3Mub25TaWduXVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZWZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5tZXNzYWdlID0gcmVmXVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLm9iamVjdCA9ICdIRUFEJ11cbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy50YWdnZXJdXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YWdnZXIubmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFnZ2VyLmVtYWlsXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy50YWdnZXIudGltZXN0YW1wXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy50YWdnZXIudGltZXpvbmVPZmZzZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5ncGdzaWddXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc2lnbmluZ0tleV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZm9yY2UgPSBmYWxzZV1cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gZmlsZXN5c3RlbSBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBnaXQuYW5ub3RhdGVkVGFnKHtcbiAqICAgZGlyOiAnJGlucHV0KCgvKSknLFxuICogICByZWY6ICckaW5wdXQoKHRlc3QtdGFnKSknLFxuICogICBtZXNzYWdlOiAnJGlucHV0KChUaGlzIGNvbW1pdCBpcyBhd2Vzb21lKSknLFxuICogICB0YWdnZXI6IHtcbiAqICAgICBuYW1lOiAnJGlucHV0KChNci4gVGVzdCkpJyxcbiAqICAgICBlbWFpbDogJyRpbnB1dCgobXJ0ZXN0QGV4YW1wbGUuY29tKSknXG4gKiAgIH1cbiAqIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBfYW5ub3RhdGVkVGFnKHtcbiAgZnMsXG4gIGNhY2hlLFxuICBvblNpZ24sXG4gIGdpdGRpcixcbiAgcmVmLFxuICB0YWdnZXIsXG4gIG1lc3NhZ2UgPSByZWYsXG4gIGdwZ3NpZyxcbiAgb2JqZWN0LFxuICBzaWduaW5nS2V5LFxuICBmb3JjZSA9IGZhbHNlLFxufSkge1xuICByZWYgPSByZWYuc3RhcnRzV2l0aCgncmVmcy90YWdzLycpID8gcmVmIDogYHJlZnMvdGFncy8ke3JlZn1gO1xuXG4gIGlmICghZm9yY2UgJiYgKGF3YWl0IEdpdFJlZk1hbmFnZXIuZXhpc3RzKHsgZnMsIGdpdGRpciwgcmVmIH0pKSkge1xuICAgIHRocm93IG5ldyBBbHJlYWR5RXhpc3RzRXJyb3IoJ3RhZycsIHJlZilcbiAgfVxuXG4gIC8vIFJlc29sdmUgcGFzc2VkIHZhbHVlXG4gIGNvbnN0IG9pZCA9IGF3YWl0IEdpdFJlZk1hbmFnZXIucmVzb2x2ZSh7XG4gICAgZnMsXG4gICAgZ2l0ZGlyLFxuICAgIHJlZjogb2JqZWN0IHx8ICdIRUFEJyxcbiAgfSk7XG5cbiAgY29uc3QgeyB0eXBlIH0gPSBhd2FpdCBfcmVhZE9iamVjdCh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSk7XG4gIGxldCB0YWdPYmplY3QgPSBHaXRBbm5vdGF0ZWRUYWcuZnJvbSh7XG4gICAgb2JqZWN0OiBvaWQsXG4gICAgdHlwZSxcbiAgICB0YWc6IHJlZi5yZXBsYWNlKCdyZWZzL3RhZ3MvJywgJycpLFxuICAgIHRhZ2dlcixcbiAgICBtZXNzYWdlLFxuICAgIGdwZ3NpZyxcbiAgfSk7XG4gIGlmIChzaWduaW5nS2V5KSB7XG4gICAgdGFnT2JqZWN0ID0gYXdhaXQgR2l0QW5ub3RhdGVkVGFnLnNpZ24odGFnT2JqZWN0LCBvblNpZ24sIHNpZ25pbmdLZXkpO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gYXdhaXQgX3dyaXRlT2JqZWN0KHtcbiAgICBmcyxcbiAgICBnaXRkaXIsXG4gICAgdHlwZTogJ3RhZycsXG4gICAgb2JqZWN0OiB0YWdPYmplY3QudG9PYmplY3QoKSxcbiAgfSk7XG5cbiAgYXdhaXQgR2l0UmVmTWFuYWdlci53cml0ZVJlZih7IGZzLCBnaXRkaXIsIHJlZiwgdmFsdWUgfSk7XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIENyZWF0ZSBhbiBhbm5vdGF0ZWQgdGFnLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtTaWduQ2FsbGJhY2t9IFthcmdzLm9uU2lnbl0gLSBhIFBHUCBzaWduaW5nIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZWYgLSBXaGF0IHRvIG5hbWUgdGhlIHRhZ1xuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLm1lc3NhZ2UgPSByZWZdIC0gVGhlIHRhZyBtZXNzYWdlIHRvIHVzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5vYmplY3QgPSAnSEVBRCddIC0gVGhlIFNIQS0xIG9iamVjdCBpZCB0aGUgdGFnIHBvaW50cyB0by4gKFdpbGwgcmVzb2x2ZSB0byBhIFNIQS0xIG9iamVjdCBpZCBpZiB2YWx1ZSBpcyBhIHJlZi4pIEJ5IGRlZmF1bHQsIHRoZSBjb21taXQgb2JqZWN0IHdoaWNoIGlzIHJlZmVycmVkIGJ5IHRoZSBjdXJyZW50IGBIRUFEYCBpcyB1c2VkLlxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLnRhZ2dlcl0gLSBUaGUgZGV0YWlscyBhYm91dCB0aGUgdGFnZ2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnRhZ2dlci5uYW1lXSAtIERlZmF1bHQgaXMgYHVzZXIubmFtZWAgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnRhZ2dlci5lbWFpbF0gLSBEZWZhdWx0IGlzIGB1c2VyLmVtYWlsYCBjb25maWcuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MudGFnZ2VyLnRpbWVzdGFtcD1NYXRoLmZsb29yKERhdGUubm93KCkvMTAwMCldIC0gU2V0IHRoZSB0YWdnZXIgdGltZXN0YW1wIGZpZWxkLiBUaGlzIGlzIHRoZSBpbnRlZ2VyIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBVbml4IGVwb2NoICgxOTcwLTAxLTAxIDAwOjAwOjAwKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy50YWdnZXIudGltZXpvbmVPZmZzZXRdIC0gU2V0IHRoZSB0YWdnZXIgdGltZXpvbmUgb2Zmc2V0IGZpZWxkLiBUaGlzIGlzIHRoZSBkaWZmZXJlbmNlLCBpbiBtaW51dGVzLCBmcm9tIHRoZSBjdXJyZW50IHRpbWV6b25lIHRvIFVUQy4gRGVmYXVsdCBpcyBgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KClgLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdwZ3NpZ10gLSBUaGUgZ3Bnc2lnIGF0dGFjaGVkIHRvIHRoZSB0YWcgb2JqZWN0LiAoTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIGBzaWduaW5nS2V5YCBvcHRpb24uKVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnNpZ25pbmdLZXldIC0gU2lnbiB0aGUgdGFnIG9iamVjdCB1c2luZyB0aGlzIHByaXZhdGUgUEdQIGtleS4gKE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBgZ3Bnc2lnYCBvcHRpb24uKVxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JjZSA9IGZhbHNlXSAtIEluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IgaWYgYSB0YWcgbmFtZWQgYHJlZmAgYWxyZWFkeSBleGlzdHMsIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgdGFnLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gZG9lcyBub3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCB0YWcgb2JqZWN0IGl0c2VsZi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2hlbiBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IGdpdC5hbm5vdGF0ZWRUYWcoe1xuICogICBmcyxcbiAqICAgZGlyOiAnL3R1dG9yaWFsJyxcbiAqICAgcmVmOiAndGVzdC10YWcnLFxuICogICBtZXNzYWdlOiAnVGhpcyBjb21taXQgaXMgYXdlc29tZScsXG4gKiAgIHRhZ2dlcjoge1xuICogICAgIG5hbWU6ICdNci4gVGVzdCcsXG4gKiAgICAgZW1haWw6ICdtcnRlc3RAZXhhbXBsZS5jb20nXG4gKiAgIH1cbiAqIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBhbm5vdGF0ZWRUYWcoe1xuICBmczogX2ZzLFxuICBvblNpZ24sXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIHJlZixcbiAgdGFnZ2VyOiBfdGFnZ2VyLFxuICBtZXNzYWdlID0gcmVmLFxuICBncGdzaWcsXG4gIG9iamVjdCxcbiAgc2lnbmluZ0tleSxcbiAgZm9yY2UgPSBmYWxzZSxcbiAgY2FjaGUgPSB7fSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgX2ZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdyZWYnLCByZWYpO1xuICAgIGlmIChzaWduaW5nS2V5KSB7XG4gICAgICBhc3NlcnRQYXJhbWV0ZXIoJ29uU2lnbicsIG9uU2lnbik7XG4gICAgfVxuICAgIGNvbnN0IGZzID0gbmV3IEZpbGVTeXN0ZW0oX2ZzKTtcblxuICAgIC8vIEZpbGwgaW4gbWlzc2luZyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICAgIGNvbnN0IHRhZ2dlciA9IGF3YWl0IG5vcm1hbGl6ZUF1dGhvck9iamVjdCh7IGZzLCBnaXRkaXIsIGF1dGhvcjogX3RhZ2dlciB9KTtcbiAgICBpZiAoIXRhZ2dlcikgdGhyb3cgbmV3IE1pc3NpbmdOYW1lRXJyb3IoJ3RhZ2dlcicpXG5cbiAgICByZXR1cm4gYXdhaXQgX2Fubm90YXRlZFRhZyh7XG4gICAgICBmcyxcbiAgICAgIGNhY2hlLFxuICAgICAgb25TaWduLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVmLFxuICAgICAgdGFnZ2VyLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGdwZ3NpZyxcbiAgICAgIG9iamVjdCxcbiAgICAgIHNpZ25pbmdLZXksXG4gICAgICBmb3JjZSxcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5hbm5vdGF0ZWRUYWcnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIENyZWF0ZSBhIGJyYW5jaFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlZlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLm9iamVjdCA9ICdIRUFEJ11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuY2hlY2tvdXQgPSBmYWxzZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZm9yY2UgPSBmYWxzZV1cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gZmlsZXN5c3RlbSBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBnaXQuYnJhbmNoKHsgZGlyOiAnJGlucHV0KCgvKSknLCByZWY6ICckaW5wdXQoKGRldmVsb3ApKScgfSlcbiAqIGNvbnNvbGUubG9nKCdkb25lJylcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9icmFuY2goe1xuICBmcyxcbiAgZ2l0ZGlyLFxuICByZWYsXG4gIG9iamVjdCxcbiAgY2hlY2tvdXQgPSBmYWxzZSxcbiAgZm9yY2UgPSBmYWxzZSxcbn0pIHtcbiAgaWYgKHJlZiAhPT0gY2xlYW5HaXRSZWYuY2xlYW4ocmVmKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUVycm9yKHJlZiwgY2xlYW5HaXRSZWYuY2xlYW4ocmVmKSlcbiAgfVxuXG4gIGNvbnN0IGZ1bGxyZWYgPSBgcmVmcy9oZWFkcy8ke3JlZn1gO1xuXG4gIGlmICghZm9yY2UpIHtcbiAgICBjb25zdCBleGlzdCA9IGF3YWl0IEdpdFJlZk1hbmFnZXIuZXhpc3RzKHsgZnMsIGdpdGRpciwgcmVmOiBmdWxscmVmIH0pO1xuICAgIGlmIChleGlzdCkge1xuICAgICAgdGhyb3cgbmV3IEFscmVhZHlFeGlzdHNFcnJvcignYnJhbmNoJywgcmVmLCBmYWxzZSlcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgY3VycmVudCBIRUFEIHRyZWUgb2lkXG4gIGxldCBvaWQ7XG4gIHRyeSB7XG4gICAgb2lkID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHsgZnMsIGdpdGRpciwgcmVmOiBvYmplY3QgfHwgJ0hFQUQnIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gUHJvYmFibHkgYW4gZW1wdHkgcmVwb1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbmV3IHJlZiB0aGF0IHBvaW50cyBhdCB0aGUgY3VycmVudCBjb21taXRcbiAgaWYgKG9pZCkge1xuICAgIGF3YWl0IEdpdFJlZk1hbmFnZXIud3JpdGVSZWYoeyBmcywgZ2l0ZGlyLCByZWY6IGZ1bGxyZWYsIHZhbHVlOiBvaWQgfSk7XG4gIH1cblxuICBpZiAoY2hlY2tvdXQpIHtcbiAgICAvLyBVcGRhdGUgSEVBRFxuICAgIGF3YWl0IEdpdFJlZk1hbmFnZXIud3JpdGVTeW1ib2xpY1JlZih7XG4gICAgICBmcyxcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlZjogJ0hFQUQnLFxuICAgICAgdmFsdWU6IGZ1bGxyZWYsXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQ3JlYXRlIGEgYnJhbmNoXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZWYgLSBXaGF0IHRvIG5hbWUgdGhlIGJyYW5jaFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLm9iamVjdCA9ICdIRUFEJ10gLSBXaGF0IG9pZCB0byB1c2UgYXMgdGhlIHN0YXJ0IHBvaW50LiBBY2NlcHRzIGEgc3ltYm9saWMgcmVmLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5jaGVja291dCA9IGZhbHNlXSAtIFVwZGF0ZSBgSEVBRGAgdG8gcG9pbnQgYXQgdGhlIG5ld2x5IGNyZWF0ZWQgYnJhbmNoXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmZvcmNlID0gZmFsc2VdIC0gSW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvciBpZiBhIGJyYW5jaGVkIG5hbWVkIGByZWZgIGFscmVhZHkgZXhpc3RzLCBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGJyYW5jaC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gZmlsZXN5c3RlbSBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBnaXQuYnJhbmNoKHsgZnMsIGRpcjogJy90dXRvcmlhbCcsIHJlZjogJ2RldmVsb3AnIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBicmFuY2goe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgcmVmLFxuICBvYmplY3QsXG4gIGNoZWNrb3V0ID0gZmFsc2UsXG4gIGZvcmNlID0gZmFsc2UsXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIGZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdyZWYnLCByZWYpO1xuICAgIHJldHVybiBhd2FpdCBfYnJhbmNoKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBnaXRkaXIsXG4gICAgICByZWYsXG4gICAgICBvYmplY3QsXG4gICAgICBjaGVja291dCxcbiAgICAgIGZvcmNlLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmJyYW5jaCc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuY29uc3Qgd29ydGhXYWxraW5nID0gKGZpbGVwYXRoLCByb290KSA9PiB7XG4gIGlmIChmaWxlcGF0aCA9PT0gJy4nIHx8IHJvb3QgPT0gbnVsbCB8fCByb290Lmxlbmd0aCA9PT0gMCB8fCByb290ID09PSAnLicpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmIChyb290Lmxlbmd0aCA+PSBmaWxlcGF0aC5sZW5ndGgpIHtcbiAgICByZXR1cm4gcm9vdC5zdGFydHNXaXRoKGZpbGVwYXRoKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaWxlcGF0aC5zdGFydHNXaXRoKHJvb3QpXG4gIH1cbn07XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge2FueX0gYXJncy5jYWNoZVxuICogQHBhcmFtIHtQcm9ncmVzc0NhbGxiYWNrfSBbYXJncy5vblByb2dyZXNzXVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlZlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3MuZmlsZXBhdGhzXVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVtb3RlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3Mubm9DaGVja291dFxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5ub1VwZGF0ZUhlYWRdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmRyeVJ1bl1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZm9yY2VdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnRyYWNrXVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2hlbiBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBfY2hlY2tvdXQoe1xuICBmcyxcbiAgY2FjaGUsXG4gIG9uUHJvZ3Jlc3MsXG4gIGRpcixcbiAgZ2l0ZGlyLFxuICByZW1vdGUsXG4gIHJlZixcbiAgZmlsZXBhdGhzLFxuICBub0NoZWNrb3V0LFxuICBub1VwZGF0ZUhlYWQsXG4gIGRyeVJ1bixcbiAgZm9yY2UsXG4gIHRyYWNrID0gdHJ1ZSxcbn0pIHtcbiAgLy8gR2V0IHRyZWUgb2lkXG4gIGxldCBvaWQ7XG4gIHRyeSB7XG4gICAgb2lkID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHsgZnMsIGdpdGRpciwgcmVmIH0pO1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyBpZiBib3RoICdyZWYnIGFuZCAncmVtb3RlJyBhcmUgc3BlY2lmaWVkLCByZWYgYWxyZWFkeSBleGlzdHMsXG4gICAgLy8gYW5kIGlzIGNvbmZpZ3VyZWQgdG8gdHJhY2sgYSBkaWZmZXJlbnQgcmVtb3RlLlxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAocmVmID09PSAnSEVBRCcpIHRocm93IGVyclxuICAgIC8vIElmIGByZWZgIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBhIG5ldyByZW1vdGUgdHJhY2tpbmcgYnJhbmNoXG4gICAgLy8gRmlndXJlIG91dCB0aGUgY29tbWl0IHRvIGNoZWNrb3V0XG4gICAgY29uc3QgcmVtb3RlUmVmID0gYCR7cmVtb3RlfS8ke3JlZn1gO1xuICAgIG9pZCA9IGF3YWl0IEdpdFJlZk1hbmFnZXIucmVzb2x2ZSh7XG4gICAgICBmcyxcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlZjogcmVtb3RlUmVmLFxuICAgIH0pO1xuICAgIGlmICh0cmFjaykge1xuICAgICAgLy8gU2V0IHVwIHJlbW90ZSB0cmFja2luZyBicmFuY2hcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuZ2V0KHsgZnMsIGdpdGRpciB9KTtcbiAgICAgIGF3YWl0IGNvbmZpZy5zZXQoYGJyYW5jaC4ke3JlZn0ucmVtb3RlYCwgcmVtb3RlKTtcbiAgICAgIGF3YWl0IGNvbmZpZy5zZXQoYGJyYW5jaC4ke3JlZn0ubWVyZ2VgLCBgcmVmcy9oZWFkcy8ke3JlZn1gKTtcbiAgICAgIGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuc2F2ZSh7IGZzLCBnaXRkaXIsIGNvbmZpZyB9KTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGJyYW5jaCB0aGF0IHBvaW50cyBhdCB0aGF0IHNhbWUgY29tbWl0XG4gICAgYXdhaXQgR2l0UmVmTWFuYWdlci53cml0ZVJlZih7XG4gICAgICBmcyxcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlZjogYHJlZnMvaGVhZHMvJHtyZWZ9YCxcbiAgICAgIHZhbHVlOiBvaWQsXG4gICAgfSk7XG4gIH1cblxuICAvLyBVcGRhdGUgd29ya2luZyBkaXJcbiAgaWYgKCFub0NoZWNrb3V0KSB7XG4gICAgbGV0IG9wcztcbiAgICAvLyBGaXJzdCBwYXNzIC0ganVzdCBhbmFseXplIGZpbGVzIChub3QgZGlyZWN0b3JpZXMpIGFuZCBmaWd1cmUgb3V0IHdoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAgIHRyeSB7XG4gICAgICBvcHMgPSBhd2FpdCBhbmFseXplKHtcbiAgICAgICAgZnMsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBvblByb2dyZXNzLFxuICAgICAgICBkaXIsXG4gICAgICAgIGdpdGRpcixcbiAgICAgICAgcmVmLFxuICAgICAgICBmb3JjZSxcbiAgICAgICAgZmlsZXBhdGhzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBUaHJvdyBhIG1vcmUgaGVscGZ1bCBlcnJvciBtZXNzYWdlIGZvciB0aGlzIGNvbW1vbiBtaXN0YWtlLlxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IgJiYgZXJyLmRhdGEud2hhdCA9PT0gb2lkKSB7XG4gICAgICAgIHRocm93IG5ldyBDb21taXROb3RGZXRjaGVkRXJyb3IocmVmLCBvaWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXBvcnQgY29uZmxpY3RzXG4gICAgY29uc3QgY29uZmxpY3RzID0gb3BzXG4gICAgICAuZmlsdGVyKChbbWV0aG9kXSkgPT4gbWV0aG9kID09PSAnY29uZmxpY3QnKVxuICAgICAgLm1hcCgoW21ldGhvZCwgZnVsbHBhdGhdKSA9PiBmdWxscGF0aCk7XG4gICAgaWYgKGNvbmZsaWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQ2hlY2tvdXRDb25mbGljdEVycm9yKGNvbmZsaWN0cylcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0IGVycm9yc1xuICAgIGNvbnN0IGVycm9ycyA9IG9wc1xuICAgICAgLmZpbHRlcigoW21ldGhvZF0pID0+IG1ldGhvZCA9PT0gJ2Vycm9yJylcbiAgICAgIC5tYXAoKFttZXRob2QsIGZ1bGxwYXRoXSkgPT4gZnVsbHBhdGgpO1xuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oJywgJykpXG4gICAgfVxuXG4gICAgaWYgKGRyeVJ1bikge1xuICAgICAgLy8gU2luY2UgdGhlIGZvcm1hdCBvZiAnb3BzJyBpcyBpbiBmbHV4LCBJIHJlYWxseSB3b3VsZCByYXRoZXIgZm9sayBiZXNpZGVzIG15c2VsZiBub3Qgc3RhcnQgcmVseWluZyBvbiBpdFxuICAgICAgLy8gcmV0dXJuIG9wc1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gU2Vjb25kIHBhc3MgLSBleGVjdXRlIHBsYW5uZWQgY2hhbmdlc1xuICAgIC8vIFRoZSBjaGVhcGVzdCBzZW1pLXBhcmFsbGVsIHNvbHV0aW9uIHdpdGhvdXQgY29tcHV0aW5nIGEgZnVsbCBkZXBlbmRlbmN5IGdyYXBoIHdpbGwgYmVcbiAgICAvLyB0byBqdXN0IGRvIG9wcyBpbiA0IGR1bWIgcGhhc2VzOiBkZWxldGUgZmlsZXMsIGRlbGV0ZSBkaXJzLCBjcmVhdGUgZGlycywgd3JpdGUgZmlsZXNcblxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgY29uc3QgdG90YWwgPSBvcHMubGVuZ3RoO1xuICAgIGF3YWl0IEdpdEluZGV4TWFuYWdlci5hY3F1aXJlKHsgZnMsIGdpdGRpciwgY2FjaGUgfSwgYXN5bmMgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBvcHNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKFttZXRob2RdKSA9PiBtZXRob2QgPT09ICdkZWxldGUnIHx8IG1ldGhvZCA9PT0gJ2RlbGV0ZS1pbmRleCdcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcChhc3luYyBmdW5jdGlvbihbbWV0aG9kLCBmdWxscGF0aF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVwYXRoID0gYCR7ZGlyfS8ke2Z1bGxwYXRofWA7XG4gICAgICAgICAgICBpZiAobWV0aG9kID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgICBhd2FpdCBmcy5ybShmaWxlcGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleC5kZWxldGUoeyBmaWxlcGF0aDogZnVsbHBhdGggfSk7XG4gICAgICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgICAgICBhd2FpdCBvblByb2dyZXNzKHtcbiAgICAgICAgICAgICAgICBwaGFzZTogJ1VwZGF0aW5nIHdvcmtkaXInLFxuICAgICAgICAgICAgICAgIGxvYWRlZDogKytjb3VudCxcbiAgICAgICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBOb3RlOiB0aGlzIGlzIGNhbm5vdCBiZSBkb25lIG5haXZlbHkgaW4gcGFyYWxsZWxcbiAgICBhd2FpdCBHaXRJbmRleE1hbmFnZXIuYWNxdWlyZSh7IGZzLCBnaXRkaXIsIGNhY2hlIH0sIGFzeW5jIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2QsIGZ1bGxwYXRoXSBvZiBvcHMpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ3JtZGlyJyB8fCBtZXRob2QgPT09ICdybWRpci1pbmRleCcpIHtcbiAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IGAke2Rpcn0vJHtmdWxscGF0aH1gO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAobWV0aG9kID09PSAncm1kaXItaW5kZXgnKSB7XG4gICAgICAgICAgICAgIGluZGV4LmRlbGV0ZSh7IGZpbGVwYXRoOiBmdWxscGF0aCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGZzLnJtZGlyKGZpbGVwYXRoKTtcbiAgICAgICAgICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgIGF3YWl0IG9uUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgICAgIHBoYXNlOiAnVXBkYXRpbmcgd29ya2RpcicsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiArK2NvdW50LFxuICAgICAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSAnRU5PVEVNUFRZJykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBgRGlkIG5vdCBkZWxldGUgJHtmdWxscGF0aH0gYmVjYXVzZSBkaXJlY3RvcnkgaXMgbm90IGVtcHR5YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBvcHNcbiAgICAgICAgLmZpbHRlcigoW21ldGhvZF0pID0+IG1ldGhvZCA9PT0gJ21rZGlyJyB8fCBtZXRob2QgPT09ICdta2Rpci1pbmRleCcpXG4gICAgICAgIC5tYXAoYXN5bmMgZnVuY3Rpb24oW18sIGZ1bGxwYXRoXSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVwYXRoID0gYCR7ZGlyfS8ke2Z1bGxwYXRofWA7XG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoZmlsZXBhdGgpO1xuICAgICAgICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICAgICAgICBhd2FpdCBvblByb2dyZXNzKHtcbiAgICAgICAgICAgICAgcGhhc2U6ICdVcGRhdGluZyB3b3JrZGlyJyxcbiAgICAgICAgICAgICAgbG9hZGVkOiArK2NvdW50LFxuICAgICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgYXdhaXQgR2l0SW5kZXhNYW5hZ2VyLmFjcXVpcmUoeyBmcywgZ2l0ZGlyLCBjYWNoZSB9LCBhc3luYyBmdW5jdGlvbihpbmRleCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wc1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoW21ldGhvZF0pID0+XG4gICAgICAgICAgICAgIG1ldGhvZCA9PT0gJ2NyZWF0ZScgfHxcbiAgICAgICAgICAgICAgbWV0aG9kID09PSAnY3JlYXRlLWluZGV4JyB8fFxuICAgICAgICAgICAgICBtZXRob2QgPT09ICd1cGRhdGUnIHx8XG4gICAgICAgICAgICAgIG1ldGhvZCA9PT0gJ21rZGlyLWluZGV4J1xuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKGFzeW5jIGZ1bmN0aW9uKFttZXRob2QsIGZ1bGxwYXRoLCBvaWQsIG1vZGUsIGNobW9kXSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZXBhdGggPSBgJHtkaXJ9LyR7ZnVsbHBhdGh9YDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChtZXRob2QgIT09ICdjcmVhdGUtaW5kZXgnICYmIG1ldGhvZCAhPT0gJ21rZGlyLWluZGV4Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgb2JqZWN0IH0gPSBhd2FpdCBfcmVhZE9iamVjdCh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNobW9kKSB7XG4gICAgICAgICAgICAgICAgICAvLyBOb3RlOiB0aGUgbW9kZSBvcHRpb24gb2YgZnMud3JpdGUgb25seSB3b3JrcyB3aGVuIGNyZWF0aW5nIGZpbGVzLFxuICAgICAgICAgICAgICAgICAgLy8gbm90IHVwZGF0aW5nIHRoZW0uIFNpbmNlIHRoZSBgZnNgIHBsdWdpbiBkb2Vzbid0IGV4cG9zZSBgY2htb2RgIHRoaXNcbiAgICAgICAgICAgICAgICAgIC8vIGlzIG91ciBvbmx5IG9wdGlvbi5cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZzLnJtKGZpbGVwYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IDBvMTAwNjQ0KSB7XG4gICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGZpbGVcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZzLndyaXRlKGZpbGVwYXRoLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gMG8xMDA3NTUpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGFibGUgZmlsZVxuICAgICAgICAgICAgICAgICAgYXdhaXQgZnMud3JpdGUoZmlsZXBhdGgsIG9iamVjdCwgeyBtb2RlOiAwbzc3NyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IDBvMTIwMDAwKSB7XG4gICAgICAgICAgICAgICAgICAvLyBzeW1saW5rXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmcy53cml0ZWxpbmsoZmlsZXBhdGgsIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgSW52YWxpZCBtb2RlIDBvJHttb2RlLnRvU3RyaW5nKDgpfSBkZXRlY3RlZCBpbiBibG9iICR7b2lkfWBcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLmxzdGF0KGZpbGVwYXRoKTtcbiAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdHJ1c3QgdGhlIGV4ZWN1dGFibGUgYml0IHJldHVybmVkIGJ5IGxzdGF0IG9uIFdpbmRvd3MsXG4gICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhpcyB2YWx1ZSBmcm9tIHRoZSBUUkVFLlxuICAgICAgICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IGhvdyBnaXQgaGFuZGxlcyB0aGlzIGludGVybmFsbHkuXG4gICAgICAgICAgICAgIGlmIChtb2RlID09PSAwbzEwMDc1NSkge1xuICAgICAgICAgICAgICAgIHN0YXRzLm1vZGUgPSAwbzc1NTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBTdWJtb2R1bGVzIGFyZSBwcmVzZW50IGluIHRoZSBnaXQgaW5kZXggYnV0IHVzZSBhIHVuaXF1ZSBtb2RlIGRpZmZlcmVudCBmcm9tIHRyZWVzXG4gICAgICAgICAgICAgIGlmIChtZXRob2QgPT09ICdta2Rpci1pbmRleCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0cy5tb2RlID0gMG8xNjAwMDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW5kZXguaW5zZXJ0KHtcbiAgICAgICAgICAgICAgICBmaWxlcGF0aDogZnVsbHBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHMsXG4gICAgICAgICAgICAgICAgb2lkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKG9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBvblByb2dyZXNzKHtcbiAgICAgICAgICAgICAgICAgIHBoYXNlOiAnVXBkYXRpbmcgd29ya2RpcicsXG4gICAgICAgICAgICAgICAgICBsb2FkZWQ6ICsrY291bnQsXG4gICAgICAgICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBIRUFEXG4gIGlmICghbm9VcGRhdGVIZWFkKSB7XG4gICAgY29uc3QgZnVsbFJlZiA9IGF3YWl0IEdpdFJlZk1hbmFnZXIuZXhwYW5kKHsgZnMsIGdpdGRpciwgcmVmIH0pO1xuICAgIGlmIChmdWxsUmVmLnN0YXJ0c1dpdGgoJ3JlZnMvaGVhZHMnKSkge1xuICAgICAgYXdhaXQgR2l0UmVmTWFuYWdlci53cml0ZVN5bWJvbGljUmVmKHtcbiAgICAgICAgZnMsXG4gICAgICAgIGdpdGRpcixcbiAgICAgICAgcmVmOiAnSEVBRCcsXG4gICAgICAgIHZhbHVlOiBmdWxsUmVmLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRldGFjaGVkIGhlYWRcbiAgICAgIGF3YWl0IEdpdFJlZk1hbmFnZXIud3JpdGVSZWYoeyBmcywgZ2l0ZGlyLCByZWY6ICdIRUFEJywgdmFsdWU6IG9pZCB9KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYW5hbHl6ZSh7XG4gIGZzLFxuICBjYWNoZSxcbiAgb25Qcm9ncmVzcyxcbiAgZGlyLFxuICBnaXRkaXIsXG4gIHJlZixcbiAgZm9yY2UsXG4gIGZpbGVwYXRocyxcbn0pIHtcbiAgbGV0IGNvdW50ID0gMDtcbiAgcmV0dXJuIF93YWxrKHtcbiAgICBmcyxcbiAgICBjYWNoZSxcbiAgICBkaXIsXG4gICAgZ2l0ZGlyLFxuICAgIHRyZWVzOiBbVFJFRSh7IHJlZiB9KSwgV09SS0RJUigpLCBTVEFHRSgpXSxcbiAgICBtYXA6IGFzeW5jIGZ1bmN0aW9uKGZ1bGxwYXRoLCBbY29tbWl0LCB3b3JrZGlyLCBzdGFnZV0pIHtcbiAgICAgIGlmIChmdWxscGF0aCA9PT0gJy4nKSByZXR1cm5cbiAgICAgIC8vIG1hdGNoIGFnYWluc3QgYmFzZSBwYXRoc1xuICAgICAgaWYgKGZpbGVwYXRocyAmJiAhZmlsZXBhdGhzLnNvbWUoYmFzZSA9PiB3b3J0aFdhbGtpbmcoZnVsbHBhdGgsIGJhc2UpKSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgLy8gRW1pdCBwcm9ncmVzcyBldmVudFxuICAgICAgaWYgKG9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgYXdhaXQgb25Qcm9ncmVzcyh7IHBoYXNlOiAnQW5hbHl6aW5nIHdvcmtkaXInLCBsb2FkZWQ6ICsrY291bnQgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgaXMgYSBraW5kIG9mIHNpbGx5IHBhdHRlcm4gYnV0IGl0IHdvcmtlZCBzbyB3ZWxsIGZvciBtZSBpbiB0aGUgcGFzdFxuICAgICAgLy8gYW5kIGl0IG1ha2VzIGludHVpdGl2ZWx5IGRlbW9uc3RyYXRpbmcgZXhoYXVzdGl2ZW5lc3Mgc28gKmVhc3kqLlxuICAgICAgLy8gVGhpcyBjaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBhbmQvb3IgYWJzZW5jZSBvZiBlYWNoIG9mIHRoZSAzIGVudHJpZXMsXG4gICAgICAvLyBjb252ZXJ0cyB0aGF0IHRvIGEgMy1iaXQgYmluYXJ5IHJlcHJlc2VudGF0aW9uLCBhbmQgdGhlbiBoYW5kbGVzXG4gICAgICAvLyBldmVyeSBwb3NzaWJsZSBjb21iaW5hdGlvbiAoMl4zIG9yIDggY2FzZXMpIHdpdGggYSBsb29rdXAgdGFibGUuXG4gICAgICBjb25zdCBrZXkgPSBbISFzdGFnZSwgISFjb21taXQsICEhd29ya2Rpcl0ubWFwKE51bWJlcikuam9pbignJyk7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAvLyBJbXBvc3NpYmxlIGNhc2UuXG4gICAgICAgIGNhc2UgJzAwMCc6XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIC8vIElnbm9yZSB3b3JrZGlyIGZpbGVzIHRoYXQgYXJlIG5vdCB0cmFja2VkIGFuZCBub3QgcGFydCBvZiB0aGUgbmV3IGNvbW1pdC5cbiAgICAgICAgY2FzZSAnMDAxJzpcbiAgICAgICAgICAvLyBPSywgbWFrZSBhbiBleGNlcHRpb24gZm9yIGV4cGxpY2l0bHkgbmFtZWQgZmlsZXMuXG4gICAgICAgICAgaWYgKGZvcmNlICYmIGZpbGVwYXRocyAmJiBmaWxlcGF0aHMuaW5jbHVkZXMoZnVsbHBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gWydkZWxldGUnLCBmdWxscGF0aF1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIC8vIE5ldyBlbnRyaWVzXG4gICAgICAgIGNhc2UgJzAxMCc6IHtcbiAgICAgICAgICBzd2l0Y2ggKGF3YWl0IGNvbW1pdC50eXBlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RyZWUnOiB7XG4gICAgICAgICAgICAgIHJldHVybiBbJ21rZGlyJywgZnVsbHBhdGhdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdibG9iJzoge1xuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICdjcmVhdGUnLFxuICAgICAgICAgICAgICAgIGZ1bGxwYXRoLFxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbW1pdC5vaWQoKSxcbiAgICAgICAgICAgICAgICBhd2FpdCBjb21taXQubW9kZSgpLFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdjb21taXQnOiB7XG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgJ21rZGlyLWluZGV4JyxcbiAgICAgICAgICAgICAgICBmdWxscGF0aCxcbiAgICAgICAgICAgICAgICBhd2FpdCBjb21taXQub2lkKCksXG4gICAgICAgICAgICAgICAgYXdhaXQgY29tbWl0Lm1vZGUoKSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgYG5ldyBlbnRyeSBVbmhhbmRsZWQgdHlwZSAke2F3YWl0IGNvbW1pdC50eXBlKCl9YCxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBOZXcgZW50cmllcyBidXQgdGhlcmUgaXMgYWxyZWFkeSBzb21ldGhpbmcgaW4gdGhlIHdvcmtkaXIgdGhlcmUuXG4gICAgICAgIGNhc2UgJzAxMSc6IHtcbiAgICAgICAgICBzd2l0Y2ggKGAke2F3YWl0IGNvbW1pdC50eXBlKCl9LSR7YXdhaXQgd29ya2Rpci50eXBlKCl9YCkge1xuICAgICAgICAgICAgY2FzZSAndHJlZS10cmVlJzoge1xuICAgICAgICAgICAgICByZXR1cm4gLy8gbm9vcFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAndHJlZS1ibG9iJzpcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2ItdHJlZSc6IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFsnY29uZmxpY3QnLCBmdWxscGF0aF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2Jsb2ItYmxvYic6IHtcbiAgICAgICAgICAgICAgLy8gSXMgdGhlIGluY29taW5nIGZpbGUgZGlmZmVyZW50P1xuICAgICAgICAgICAgICBpZiAoKGF3YWl0IGNvbW1pdC5vaWQoKSkgIT09IChhd2FpdCB3b3JrZGlyLm9pZCgpKSkge1xuICAgICAgICAgICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgJ3VwZGF0ZScsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoLFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb21taXQub2lkKCksXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbW1pdC5tb2RlKCksXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCBjb21taXQubW9kZSgpKSAhPT0gKGF3YWl0IHdvcmtkaXIubW9kZSgpKSxcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFsnY29uZmxpY3QnLCBmdWxscGF0aF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSXMgdGhlIGluY29taW5nIGZpbGUgYSBkaWZmZXJlbnQgbW9kZT9cbiAgICAgICAgICAgICAgICBpZiAoKGF3YWl0IGNvbW1pdC5tb2RlKCkpICE9PSAoYXdhaXQgd29ya2Rpci5tb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAndXBkYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb21taXQub2lkKCksXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29tbWl0Lm1vZGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWydjb25mbGljdCcsIGZ1bGxwYXRoXVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAnY3JlYXRlLWluZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbW1pdC5vaWQoKSxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29tbWl0Lm1vZGUoKSxcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2NvbW1pdC10cmVlJzoge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBzdWJtb2R1bGVcbiAgICAgICAgICAgICAgLy8gV2UnbGwgaWdub3JlIHN1Ym1vZHVsZSBkaXJlY3RvcmllcyBmb3Igbm93LlxuICAgICAgICAgICAgICAvLyBVc2VycyBwcmVmZXIgd2Ugbm90IHRocm93IGFuIGVycm9yIGZvciBsYWNrIG9mIHN1Ym1vZHVsZSBzdXBwb3J0LlxuICAgICAgICAgICAgICAvLyBnaXRsaW5rc1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2NvbW1pdC1ibG9iJzoge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBzdWJtb2R1bGVcbiAgICAgICAgICAgICAgLy8gQnV0Li4uIHdlJ2xsIGNvbXBsYWluIGlmIHRoZXJlIGlzIGEgKmZpbGUqIHdoZXJlIHdlIHdvdWxkXG4gICAgICAgICAgICAgIC8vIHB1dCBhIHN1Ym1vZHVsZSBpZiB3ZSBoYWQgc3VibW9kdWxlIHN1cHBvcnQuXG4gICAgICAgICAgICAgIHJldHVybiBbJ2NvbmZsaWN0JywgZnVsbHBhdGhdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgIHJldHVybiBbJ2Vycm9yJywgYG5ldyBlbnRyeSBVbmhhbmRsZWQgdHlwZSAke2NvbW1pdC50eXBlfWBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNvbWV0aGluZyBpbiBzdGFnZSBidXQgbm90IGluIHRoZSBjb21taXQgT1IgdGhlIHdvcmtkaXIuXG4gICAgICAgIC8vIE5vdGU6IEkgdmVyaWZpZWQgdGhpcyBiZWhhdmlvciBhZ2FpbnN0IGNhbm9uaWNhbCBnaXQuXG4gICAgICAgIGNhc2UgJzEwMCc6IHtcbiAgICAgICAgICByZXR1cm4gWydkZWxldGUtaW5kZXgnLCBmdWxscGF0aF1cbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxldGVkIGVudHJpZXNcbiAgICAgICAgLy8gVE9ETzogSG93IHRvIGhhbmRsZSBpZiBzdGFnZSB0eXBlIGFuZCB3b3JrZGlyIHR5cGUgbWlzbWF0Y2g/XG4gICAgICAgIGNhc2UgJzEwMSc6IHtcbiAgICAgICAgICBzd2l0Y2ggKGF3YWl0IHN0YWdlLnR5cGUoKSkge1xuICAgICAgICAgICAgY2FzZSAndHJlZSc6IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFsncm1kaXInLCBmdWxscGF0aF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2Jsb2InOiB7XG4gICAgICAgICAgICAgIC8vIEdpdCBjaGVja3MgdGhhdCB0aGUgd29ya2Rpci5vaWQgPT09IHN0YWdlLm9pZCBiZWZvcmUgZGVsZXRpbmcgZmlsZVxuICAgICAgICAgICAgICBpZiAoKGF3YWl0IHN0YWdlLm9pZCgpKSAhPT0gKGF3YWl0IHdvcmtkaXIub2lkKCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gWydkZWxldGUnLCBmdWxscGF0aF1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFsnY29uZmxpY3QnLCBmdWxscGF0aF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnZGVsZXRlJywgZnVsbHBhdGhdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2NvbW1pdCc6IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFsncm1kaXItaW5kZXgnLCBmdWxscGF0aF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGBkZWxldGUgZW50cnkgVW5oYW5kbGVkIHR5cGUgJHthd2FpdCBzdGFnZS50eXBlKCl9YCxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1mYWxsdGhyb3VnaCAqL1xuICAgICAgICAvLyBGaWxlIG1pc3NpbmcgZnJvbSB3b3JrZGlyXG4gICAgICAgIGNhc2UgJzExMCc6XG4gICAgICAgIC8vIFBvc3NpYmx5IG1vZGlmaWVkIGVudHJpZXNcbiAgICAgICAgY2FzZSAnMTExJzoge1xuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi9cbiAgICAgICAgICBzd2l0Y2ggKGAke2F3YWl0IHN0YWdlLnR5cGUoKX0tJHthd2FpdCBjb21taXQudHlwZSgpfWApIHtcbiAgICAgICAgICAgIGNhc2UgJ3RyZWUtdHJlZSc6IHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdibG9iLWJsb2InOiB7XG4gICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlIGhhc24ndCBjaGFuZ2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIGRvIGFueXRoaW5nLlxuICAgICAgICAgICAgICAvLyBFeGlzdGluZyBmaWxlIG1vZGlmaWNhdGlvbnMgaW4gdGhlIHdvcmtkaXIgY2FuIGJlIGJlIGxlZnQgYXMgaXMuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoYXdhaXQgc3RhZ2Uub2lkKCkpID09PSAoYXdhaXQgY29tbWl0Lm9pZCgpKSAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBzdGFnZS5tb2RlKCkpID09PSAoYXdhaXQgY29tbWl0Lm1vZGUoKSkgJiZcbiAgICAgICAgICAgICAgICAhZm9yY2VcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgbG9jYWwgY2hhbmdlcyB0aGF0IHdvdWxkIGJlIGxvc3RcbiAgICAgICAgICAgICAgaWYgKHdvcmtkaXIpIHtcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBjYW5vbmljYWwgZ2l0IG9ubHkgY29tcGFyZXMgd2l0aCB0aGUgc3RhZ2UuIEJ1dCB3ZSdyZSBzbWFydCBlbm91Z2hcbiAgICAgICAgICAgICAgICAvLyB0byBjb21wYXJlIHRvIHRoZSBzdGFnZSBBTkQgdGhlIGluY29taW5nIGNvbW1pdC5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAoYXdhaXQgd29ya2Rpci5vaWQoKSkgIT09IChhd2FpdCBzdGFnZS5vaWQoKSkgJiZcbiAgICAgICAgICAgICAgICAgIChhd2FpdCB3b3JrZGlyLm9pZCgpKSAhPT0gKGF3YWl0IGNvbW1pdC5vaWQoKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICd1cGRhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbW1pdC5vaWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb21taXQubW9kZSgpLFxuICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCBjb21taXQubW9kZSgpKSAhPT0gKGF3YWl0IHdvcmtkaXIubW9kZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsnY29uZmxpY3QnLCBmdWxscGF0aF1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgJ3VwZGF0ZScsXG4gICAgICAgICAgICAgICAgICBmdWxscGF0aCxcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbW1pdC5vaWQoKSxcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbW1pdC5tb2RlKCksXG4gICAgICAgICAgICAgICAgICAoYXdhaXQgY29tbWl0Lm1vZGUoKSkgIT09IChhd2FpdCBzdGFnZS5tb2RlKCkpLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBIYXMgZmlsZSBtb2RlIGNoYW5nZWQ/XG4gICAgICAgICAgICAgIGlmICgoYXdhaXQgY29tbWl0Lm1vZGUoKSkgIT09IChhd2FpdCBzdGFnZS5tb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICd1cGRhdGUnLFxuICAgICAgICAgICAgICAgICAgZnVsbHBhdGgsXG4gICAgICAgICAgICAgICAgICBhd2FpdCBjb21taXQub2lkKCksXG4gICAgICAgICAgICAgICAgICBhd2FpdCBjb21taXQubW9kZSgpLFxuICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gVE9ETzogSEFORExFIFNZTUxJTktTXG4gICAgICAgICAgICAgIC8vIEhhcyB0aGUgZmlsZSBjb250ZW50IGNoYW5nZWQ/XG4gICAgICAgICAgICAgIGlmICgoYXdhaXQgY29tbWl0Lm9pZCgpKSAhPT0gKGF3YWl0IHN0YWdlLm9pZCgpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAndXBkYXRlJyxcbiAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoLFxuICAgICAgICAgICAgICAgICAgYXdhaXQgY29tbWl0Lm9pZCgpLFxuICAgICAgICAgICAgICAgICAgYXdhaXQgY29tbWl0Lm1vZGUoKSxcbiAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAndHJlZS1ibG9iJzoge1xuICAgICAgICAgICAgICByZXR1cm4gWyd1cGRhdGUtZGlyLXRvLWJsb2InLCBmdWxscGF0aCwgYXdhaXQgY29tbWl0Lm9pZCgpXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnYmxvYi10cmVlJzoge1xuICAgICAgICAgICAgICByZXR1cm4gWyd1cGRhdGUtYmxvYi10by10cmVlJywgZnVsbHBhdGhdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdjb21taXQtY29tbWl0Jzoge1xuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICdta2Rpci1pbmRleCcsXG4gICAgICAgICAgICAgICAgZnVsbHBhdGgsXG4gICAgICAgICAgICAgICAgYXdhaXQgY29tbWl0Lm9pZCgpLFxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbW1pdC5tb2RlKCksXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGB1cGRhdGUgZW50cnkgVW5oYW5kbGVkIHR5cGUgJHthd2FpdCBzdGFnZS50eXBlKCl9LSR7YXdhaXQgY29tbWl0LnR5cGUoKX1gLFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBNb2RpZnkgdGhlIGRlZmF1bHQgZmxhdCBtYXBwaW5nXG4gICAgcmVkdWNlOiBhc3luYyBmdW5jdGlvbihwYXJlbnQsIGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbiA9IGZsYXQoY2hpbGRyZW4pO1xuICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuXG4gICAgICB9IGVsc2UgaWYgKHBhcmVudCAmJiBwYXJlbnRbMF0gPT09ICdybWRpcicpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChwYXJlbnQpO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkcmVuLnVuc2hpZnQocGFyZW50KTtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuXG4gICAgICB9XG4gICAgfSxcbiAgfSlcbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQ2hlY2tvdXQgYSBicmFuY2hcbiAqXG4gKiBJZiB0aGUgYnJhbmNoIGFscmVhZHkgZXhpc3RzIGl0IHdpbGwgY2hlY2sgb3V0IHRoYXQgYnJhbmNoLiBPdGhlcndpc2UsIGl0IHdpbGwgY3JlYXRlIGEgbmV3IHJlbW90ZSB0cmFja2luZyBicmFuY2ggc2V0IHRvIHRyYWNrIHRoZSByZW1vdGUgYnJhbmNoIG9mIHRoYXQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7UHJvZ3Jlc3NDYWxsYmFja30gW2FyZ3Mub25Qcm9ncmVzc10gLSBvcHRpb25hbCBwcm9ncmVzcyBldmVudCBjYWxsYmFja1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGlyIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZWYgPSAnSEVBRCddIC0gU291cmNlIHRvIGNoZWNrb3V0IGZpbGVzIGZyb21cbiAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmZpbGVwYXRoc10gLSBMaW1pdCB0aGUgY2hlY2tvdXQgdG8gdGhlIGdpdmVuIGZpbGVzIGFuZCBkaXJlY3Rvcmllc1xuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlbW90ZSA9ICdvcmlnaW4nXSAtIFdoaWNoIHJlbW90ZSByZXBvc2l0b3J5IHRvIHVzZVxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5ub0NoZWNrb3V0ID0gZmFsc2VdIC0gSWYgdHJ1ZSwgd2lsbCB1cGRhdGUgSEVBRCBidXQgd29uJ3QgdXBkYXRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeVxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5ub1VwZGF0ZUhlYWRdIC0gSWYgdHJ1ZSwgd2lsbCB1cGRhdGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJ1dCB3b24ndCB1cGRhdGUgSEVBRC4gRGVmYXVsdHMgdG8gYGZhbHNlYCB3aGVuIGByZWZgIGlzIHByb3ZpZGVkLCBhbmQgYHRydWVgIGlmIGByZWZgIGlzIG5vdCBwcm92aWRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZHJ5UnVuID0gZmFsc2VdIC0gSWYgdHJ1ZSwgc2ltdWxhdGVzIGEgY2hlY2tvdXQgc28geW91IGNhbiB0ZXN0IHdoZXRoZXIgaXQgd291bGQgc3VjY2VlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZm9yY2UgPSBmYWxzZV0gLSBJZiB0cnVlLCBjb25mbGljdHMgd2lsbCBiZSBpZ25vcmVkIGFuZCBmaWxlcyB3aWxsIGJlIG92ZXJ3cml0dGVuIHJlZ2FyZGxlc3Mgb2YgbG9jYWwgY2hhbmdlcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MudHJhY2sgPSB0cnVlXSAtIElmIGZhbHNlLCB3aWxsIG5vdCBzZXQgdGhlIHJlbW90ZSBicmFuY2ggdHJhY2tpbmcgaW5mb3JtYXRpb24uIERlZmF1bHRzIHRvIHRydWUuXG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3MuY2FjaGVdIC0gYSBbY2FjaGVdKGNhY2hlLm1kKSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gZmlsZXN5c3RlbSBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBzd2l0Y2ggdG8gdGhlIG1haW4gYnJhbmNoXG4gKiBhd2FpdCBnaXQuY2hlY2tvdXQoe1xuICogICBmcyxcbiAqICAgZGlyOiAnL3R1dG9yaWFsJyxcbiAqICAgcmVmOiAnbWFpbidcbiAqIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIHJlc3RvcmUgdGhlICdkb2NzJyBhbmQgJ3NyYy9kb2NzJyBmb2xkZXJzIHRvIHRoZSB3YXkgdGhleSB3ZXJlLCBvdmVyd3JpdGluZyBhbnkgY2hhbmdlc1xuICogYXdhaXQgZ2l0LmNoZWNrb3V0KHtcbiAqICAgZnMsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIGZvcmNlOiB0cnVlLFxuICogICBmaWxlcGF0aHM6IFsnZG9jcycsICdzcmMvZG9jcyddXG4gKiB9KVxuICogY29uc29sZS5sb2coJ2RvbmUnKVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyByZXN0b3JlIHRoZSAnZG9jcycgYW5kICdzcmMvZG9jcycgZm9sZGVycyB0byB0aGUgd2F5IHRoZXkgYXJlIGluIHRoZSAnZGV2ZWxvcCcgYnJhbmNoLCBvdmVyd3JpdGluZyBhbnkgY2hhbmdlc1xuICogYXdhaXQgZ2l0LmNoZWNrb3V0KHtcbiAqICAgZnMsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIHJlZjogJ2RldmVsb3AnLFxuICogICBub1VwZGF0ZUhlYWQ6IHRydWUsXG4gKiAgIGZvcmNlOiB0cnVlLFxuICogICBmaWxlcGF0aHM6IFsnZG9jcycsICdzcmMvZG9jcyddXG4gKiB9KVxuICogY29uc29sZS5sb2coJ2RvbmUnKVxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja291dCh7XG4gIGZzLFxuICBvblByb2dyZXNzLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICByZW1vdGUgPSAnb3JpZ2luJyxcbiAgcmVmOiBfcmVmLFxuICBmaWxlcGF0aHMsXG4gIG5vQ2hlY2tvdXQgPSBmYWxzZSxcbiAgbm9VcGRhdGVIZWFkID0gX3JlZiA9PT0gdW5kZWZpbmVkLFxuICBkcnlSdW4gPSBmYWxzZSxcbiAgZm9yY2UgPSBmYWxzZSxcbiAgdHJhY2sgPSB0cnVlLFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdkaXInLCBkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcblxuICAgIGNvbnN0IHJlZiA9IF9yZWYgfHwgJ0hFQUQnO1xuICAgIHJldHVybiBhd2FpdCBfY2hlY2tvdXQoe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGNhY2hlLFxuICAgICAgb25Qcm9ncmVzcyxcbiAgICAgIGRpcixcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlbW90ZSxcbiAgICAgIHJlZixcbiAgICAgIGZpbGVwYXRocyxcbiAgICAgIG5vQ2hlY2tvdXQsXG4gICAgICBub1VwZGF0ZUhlYWQsXG4gICAgICBkcnlSdW4sXG4gICAgICBmb3JjZSxcbiAgICAgIHRyYWNrLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmNoZWNrb3V0JztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAc2VlIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtcmV2LXBhcnNlLmh0bWwjX3NwZWNpZnlpbmdfcmV2aXNpb25zXG5jb25zdCBhYmJyZXZpYXRlUnggPSBuZXcgUmVnRXhwKCdecmVmcy8oaGVhZHMvfHRhZ3MvfHJlbW90ZXMvKT8oLiopJyk7XG5cbmZ1bmN0aW9uIGFiYnJldmlhdGVSZWYocmVmKSB7XG4gIGNvbnN0IG1hdGNoID0gYWJicmV2aWF0ZVJ4LmV4ZWMocmVmKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgaWYgKG1hdGNoWzFdID09PSAncmVtb3Rlcy8nICYmIHJlZi5lbmRzV2l0aCgnL0hFQUQnKSkge1xuICAgICAgcmV0dXJuIG1hdGNoWzJdLnNsaWNlKDAsIC01KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMl1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZlxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmZ1bGxuYW1lID0gZmFsc2VdIC0gUmV0dXJuIHRoZSBmdWxsIHBhdGggKGUuZy4gXCJyZWZzL2hlYWRzL21haW5cIikgaW5zdGVhZCBvZiB0aGUgYWJicmV2aWF0ZWQgZm9ybS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MudGVzdCA9IGZhbHNlXSAtIElmIHRoZSBjdXJyZW50IGJyYW5jaCBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0IChzdWNoIGFzIHJpZ2h0IGFmdGVyIGdpdCBpbml0KSB0aGVuIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmd8dm9pZD59IFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGJyYW5jaCBvciB1bmRlZmluZWQgaWYgdGhlIEhFQUQgaXMgZGV0YWNoZWQuXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBfY3VycmVudEJyYW5jaCh7XG4gIGZzLFxuICBnaXRkaXIsXG4gIGZ1bGxuYW1lID0gZmFsc2UsXG4gIHRlc3QgPSBmYWxzZSxcbn0pIHtcbiAgY29uc3QgcmVmID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHtcbiAgICBmcyxcbiAgICBnaXRkaXIsXG4gICAgcmVmOiAnSEVBRCcsXG4gICAgZGVwdGg6IDIsXG4gIH0pO1xuICBpZiAodGVzdCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBHaXRSZWZNYW5hZ2VyLnJlc29sdmUoeyBmcywgZ2l0ZGlyLCByZWYgfSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG4gIC8vIFJldHVybiBgdW5kZWZpbmVkYCBmb3IgZGV0YWNoZWQgSEVBRFxuICBpZiAoIXJlZi5zdGFydHNXaXRoKCdyZWZzLycpKSByZXR1cm5cbiAgcmV0dXJuIGZ1bGxuYW1lID8gcmVmIDogYWJicmV2aWF0ZVJlZihyZWYpXG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZVNTSHRvSFRUUCh1cmwpIHtcbiAgLy8gaGFuZGxlIFwic2hvcnRlciBzY3AtbGlrZSBzeW50YXhcIlxuICB1cmwgPSB1cmwucmVwbGFjZSgvXmdpdEAoW146XSspOi8sICdodHRwczovLyQxLycpO1xuICAvLyBoYW5kbGUgcHJvcGVyIFNTSCBVUkxzXG4gIHVybCA9IHVybC5yZXBsYWNlKC9ec3NoOlxcL1xcLy8sICdodHRwczovLycpO1xuICByZXR1cm4gdXJsXG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhc2ljQXV0aEhlYWRlcih7IHVzZXJuYW1lID0gJycsIHBhc3N3b3JkID0gJycgfSkge1xuICByZXR1cm4gYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7dXNlcm5hbWV9OiR7cGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWBcbn1cblxuLy8gQ3VycmVudGx5ICdmb3IgYXdhaXQnIHVwc2V0cyBteSBsaW50ZXJzLlxuYXN5bmMgZnVuY3Rpb24gZm9yQXdhaXQoaXRlcmFibGUsIGNiKSB7XG4gIGNvbnN0IGl0ZXIgPSBnZXRJdGVyYXRvcihpdGVyYWJsZSk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgaWYgKHZhbHVlKSBhd2FpdCBjYih2YWx1ZSk7XG4gICAgaWYgKGRvbmUpIGJyZWFrXG4gIH1cbiAgaWYgKGl0ZXIucmV0dXJuKSBpdGVyLnJldHVybigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0KGl0ZXJhYmxlKSB7XG4gIGxldCBzaXplID0gMDtcbiAgY29uc3QgYnVmZmVycyA9IFtdO1xuICAvLyBUaGlzIHdpbGwgYmUgZWFzaWVyIG9uY2UgYGZvciBhd2FpdCAuLi4gb2ZgIGxvb3BzIGFyZSBhdmFpbGFibGUuXG4gIGF3YWl0IGZvckF3YWl0KGl0ZXJhYmxlLCB2YWx1ZSA9PiB7XG4gICAgYnVmZmVycy5wdXNoKHZhbHVlKTtcbiAgICBzaXplICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgbGV0IG5leHRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcbiAgICByZXN1bHQuc2V0KGJ1ZmZlciwgbmV4dEluZGV4KTtcbiAgICBuZXh0SW5kZXggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBleHRyYWN0QXV0aEZyb21VcmwodXJsKSB7XG4gIC8vIEZvciB3aGF0ZXZlciByZWFzb24sIHRoZSBgZmV0Y2hgIEFQSSBkb2VzIG5vdCBjb252ZXJ0IGNyZWRlbnRpYWxzIGVtYmVkZGVkIGluIHRoZSBVUkxcbiAgLy8gaW50byBCYXNpYyBBdXRoZW50aWNhdGlvbiBoZWFkZXJzIGF1dG9tYXRpY2FsbHkuIEluc3RlYWQgaXQgdGhyb3dzIGFuIGVycm9yIVxuICAvLyBTbyB3ZSBtdXN0IG1hbnVhbGx5IHBhcnNlIHRoZSBVUkwsIHJpcCBvdXQgdGhlIHVzZXI6cGFzc3dvcmQgcG9ydGlvbiBpZiBpdCBpcyBwcmVzZW50XG4gIC8vIGFuZCBjb21wdXRlIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlci5cbiAgLy8gTm90ZTogSSB0cmllZCB1c2luZyBuZXcgVVJMKHVybCkgYnV0IHRoYXQgdGhyb3dzIGEgc2VjdXJpdHkgZXhjZXB0aW9uIGluIEVkZ2UuIDpyb2xsZXllczpcbiAgbGV0IHVzZXJwYXNzID0gdXJsLm1hdGNoKC9eaHR0cHM/OlxcL1xcLyhbXi9dKylALyk7XG4gIC8vIE5vIGNyZWRlbnRpYWxzLCByZXR1cm4gdGhlIHVybCB1bm1vZGlmaWVkIGFuZCBhbiBlbXB0eSBhdXRoIG9iamVjdFxuICBpZiAodXNlcnBhc3MgPT0gbnVsbCkgcmV0dXJuIHsgdXJsLCBhdXRoOiB7fSB9XG4gIHVzZXJwYXNzID0gdXNlcnBhc3NbMV07XG4gIGNvbnN0IFt1c2VybmFtZSwgcGFzc3dvcmRdID0gdXNlcnBhc3Muc3BsaXQoJzonKTtcbiAgLy8gUmVtb3ZlIGNyZWRlbnRpYWxzIGZyb20gVVJMXG4gIHVybCA9IHVybC5yZXBsYWNlKGAke3VzZXJwYXNzfUBgLCAnJyk7XG4gIC8vIEhhcyBjcmVkZW50aWFscywgcmV0dXJuIHRoZSBmZXRjaC1zYWZlIFVSTCBhbmQgdGhlIHBhcnNlZCBjcmVkZW50aWFsc1xuICByZXR1cm4geyB1cmwsIGF1dGg6IHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0gfVxufVxuXG5mdW5jdGlvbiBwYWRIZXgoYiwgbikge1xuICBjb25zdCBzID0gbi50b1N0cmluZygxNik7XG4gIHJldHVybiAnMCcucmVwZWF0KGIgLSBzLmxlbmd0aCkgKyBzXG59XG5cbi8qKlxucGt0LWxpbmUgRm9ybWF0XG4tLS0tLS0tLS0tLS0tLS1cblxuTXVjaCAoYnV0IG5vdCBhbGwpIG9mIHRoZSBwYXlsb2FkIGlzIGRlc2NyaWJlZCBhcm91bmQgcGt0LWxpbmVzLlxuXG5BIHBrdC1saW5lIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGJpbmFyeSBzdHJpbmcuICBUaGUgZmlyc3QgZm91ciBieXRlc1xub2YgdGhlIGxpbmUsIHRoZSBwa3QtbGVuLCBpbmRpY2F0ZXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbGluZSxcbmluIGhleGFkZWNpbWFsLiAgVGhlIHBrdC1sZW4gaW5jbHVkZXMgdGhlIDQgYnl0ZXMgdXNlZCB0byBjb250YWluXG50aGUgbGVuZ3RoJ3MgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24uXG5cbkEgcGt0LWxpbmUgTUFZIGNvbnRhaW4gYmluYXJ5IGRhdGEsIHNvIGltcGxlbWVudGVycyBNVVNUIGVuc3VyZVxucGt0LWxpbmUgcGFyc2luZy9mb3JtYXR0aW5nIHJvdXRpbmVzIGFyZSA4LWJpdCBjbGVhbi5cblxuQSBub24tYmluYXJ5IGxpbmUgU0hPVUxEIEJFIHRlcm1pbmF0ZWQgYnkgYW4gTEYsIHdoaWNoIGlmIHByZXNlbnRcbk1VU1QgYmUgaW5jbHVkZWQgaW4gdGhlIHRvdGFsIGxlbmd0aC4gUmVjZWl2ZXJzIE1VU1QgdHJlYXQgcGt0LWxpbmVzXG53aXRoIG5vbi1iaW5hcnkgZGF0YSB0aGUgc2FtZSB3aGV0aGVyIG9yIG5vdCB0aGV5IGNvbnRhaW4gdGhlIHRyYWlsaW5nXG5MRiAoc3RyaXBwaW5nIHRoZSBMRiBpZiBwcmVzZW50LCBhbmQgbm90IGNvbXBsYWluaW5nIHdoZW4gaXQgaXNcbm1pc3NpbmcpLlxuXG5UaGUgbWF4aW11bSBsZW5ndGggb2YgYSBwa3QtbGluZSdzIGRhdGEgY29tcG9uZW50IGlzIDY1NTE2IGJ5dGVzLlxuSW1wbGVtZW50YXRpb25zIE1VU1QgTk9UIHNlbmQgcGt0LWxpbmUgd2hvc2UgbGVuZ3RoIGV4Y2VlZHMgNjU1MjBcbig2NTUxNiBieXRlcyBvZiBwYXlsb2FkICsgNCBieXRlcyBvZiBsZW5ndGggZGF0YSkuXG5cbkltcGxlbWVudGF0aW9ucyBTSE9VTEQgTk9UIHNlbmQgYW4gZW1wdHkgcGt0LWxpbmUgKFwiMDAwNFwiKS5cblxuQSBwa3QtbGluZSB3aXRoIGEgbGVuZ3RoIGZpZWxkIG9mIDAgKFwiMDAwMFwiKSwgY2FsbGVkIGEgZmx1c2gtcGt0LFxuaXMgYSBzcGVjaWFsIGNhc2UgYW5kIE1VU1QgYmUgaGFuZGxlZCBkaWZmZXJlbnRseSB0aGFuIGFuIGVtcHR5XG5wa3QtbGluZSAoXCIwMDA0XCIpLlxuXG4tLS0tXG4gIHBrdC1saW5lICAgICA9ICBkYXRhLXBrdCAvIGZsdXNoLXBrdFxuXG4gIGRhdGEtcGt0ICAgICA9ICBwa3QtbGVuIHBrdC1wYXlsb2FkXG4gIHBrdC1sZW4gICAgICA9ICA0KihIRVhESUcpXG4gIHBrdC1wYXlsb2FkICA9ICAocGt0LWxlbiAtIDQpKihPQ1RFVClcblxuICBmbHVzaC1wa3QgICAgPSBcIjAwMDBcIlxuLS0tLVxuXG5FeGFtcGxlcyAoYXMgQy1zdHlsZSBzdHJpbmdzKTpcblxuLS0tLVxuICBwa3QtbGluZSAgICAgICAgICBhY3R1YWwgdmFsdWVcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIFwiMDAwNmFcXG5cIiAgICAgICAgIFwiYVxcblwiXG4gIFwiMDAwNWFcIiAgICAgICAgICAgXCJhXCJcbiAgXCIwMDBiZm9vYmFyXFxuXCIgICAgXCJmb29iYXJcXG5cIlxuICBcIjAwMDRcIiAgICAgICAgICAgIFwiXCJcbi0tLS1cbiovXG5cbi8vIEknbSByZWFsbHkgdXNpbmcgdGhpcyBtb3JlIGFzIGEgbmFtZXNwYWNlLlxuLy8gVGhlcmUncyBub3QgYSBsb3Qgb2YgXCJzdGF0ZVwiIGluIGEgcGt0LWxpbmVcblxuY2xhc3MgR2l0UGt0TGluZSB7XG4gIHN0YXRpYyBmbHVzaCgpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oJzAwMDAnLCAndXRmOCcpXG4gIH1cblxuICBzdGF0aWMgZGVsaW0oKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKCcwMDAxJywgJ3V0ZjgnKVxuICB9XG5cbiAgc3RhdGljIGVuY29kZShsaW5lKSB7XG4gICAgaWYgKHR5cGVvZiBsaW5lID09PSAnc3RyaW5nJykge1xuICAgICAgbGluZSA9IEJ1ZmZlci5mcm9tKGxpbmUpO1xuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSBsaW5lLmxlbmd0aCArIDQ7XG4gICAgY29uc3QgaGV4bGVuZ3RoID0gcGFkSGV4KDQsIGxlbmd0aCk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKGhleGxlbmd0aCwgJ3V0ZjgnKSwgbGluZV0pXG4gIH1cblxuICBzdGF0aWMgc3RyZWFtUmVhZGVyKHN0cmVhbSkge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBTdHJlYW1SZWFkZXIoc3RyZWFtKTtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVhZCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBsZW5ndGggPSBhd2FpdCByZWFkZXIucmVhZCg0KTtcbiAgICAgICAgaWYgKGxlbmd0aCA9PSBudWxsKSByZXR1cm4gdHJ1ZVxuICAgICAgICBsZW5ndGggPSBwYXJzZUludChsZW5ndGgudG9TdHJpbmcoJ3V0ZjgnKSwgMTYpO1xuICAgICAgICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICAgICAgICBpZiAobGVuZ3RoID09PSAxKSByZXR1cm4gbnVsbCAvLyBkZWxpbSBwYWNrZXRzXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlYWRlci5yZWFkKGxlbmd0aCAtIDQpO1xuICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiB0cnVlXG4gICAgICAgIHJldHVybiBidWZmZXJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzdHJlYW0uZXJyb3IgPSBlcnI7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlYWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VDYXBhYmlsaXRpZXNWMihyZWFkKSB7XG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgc3RyaW5nIHwgdHJ1ZT59ICovXG4gIGNvbnN0IGNhcGFiaWxpdGllczIgPSB7fTtcblxuICBsZXQgbGluZTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBsaW5lID0gYXdhaXQgcmVhZCgpO1xuICAgIGlmIChsaW5lID09PSB0cnVlKSBicmVha1xuICAgIGlmIChsaW5lID09PSBudWxsKSBjb250aW51ZVxuICAgIGxpbmUgPSBsaW5lLnRvU3RyaW5nKCd1dGY4JykucmVwbGFjZSgvXFxuJC8sICcnKTtcbiAgICBjb25zdCBpID0gbGluZS5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKGkgPiAtMSkge1xuICAgICAgY29uc3Qga2V5ID0gbGluZS5zbGljZSgwLCBpKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gbGluZS5zbGljZShpICsgMSk7XG4gICAgICBjYXBhYmlsaXRpZXMyW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FwYWJpbGl0aWVzMltsaW5lXSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHByb3RvY29sVmVyc2lvbjogMiwgY2FwYWJpbGl0aWVzMiB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlUmVmc0FkUmVzcG9uc2Uoc3RyZWFtLCB7IHNlcnZpY2UgfSkge1xuICBjb25zdCBjYXBhYmlsaXRpZXMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IHJlZnMgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IHN5bXJlZnMgPSBuZXcgTWFwKCk7XG5cbiAgLy8gVGhlcmUgaXMgcHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIGJ1dCBmb3Igbm93XG4gIC8vIGxldCdzIGp1c3QgdGhyb3cgdGhlIHJlc3VsdCBwYXJzZXIgaW5saW5lIGhlcmUuXG4gIGNvbnN0IHJlYWQgPSBHaXRQa3RMaW5lLnN0cmVhbVJlYWRlcihzdHJlYW0pO1xuICBsZXQgbGluZU9uZSA9IGF3YWl0IHJlYWQoKTtcbiAgLy8gc2tpcCBwYXN0IGFueSBmbHVzaGVzXG4gIHdoaWxlIChsaW5lT25lID09PSBudWxsKSBsaW5lT25lID0gYXdhaXQgcmVhZCgpO1xuXG4gIGlmIChsaW5lT25lID09PSB0cnVlKSB0aHJvdyBuZXcgRW1wdHlTZXJ2ZXJSZXNwb25zZUVycm9yKClcblxuICAvLyBIYW5kbGUgcHJvdG9jb2wgdjIgcmVzcG9uc2VzIChCaXRidWNrZXQgU2VydmVyIGRvZXNuJ3QgaW5jbHVkZSBhIGAjIHNlcnZpY2U9YCBsaW5lKVxuICBpZiAobGluZU9uZS5pbmNsdWRlcygndmVyc2lvbiAyJykpIHtcbiAgICByZXR1cm4gcGFyc2VDYXBhYmlsaXRpZXNWMihyZWFkKVxuICB9XG5cbiAgLy8gQ2xpZW50cyBNVVNUIGlnbm9yZSBhbiBMRiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICBpZiAobGluZU9uZS50b1N0cmluZygndXRmOCcpLnJlcGxhY2UoL1xcbiQvLCAnJykgIT09IGAjIHNlcnZpY2U9JHtzZXJ2aWNlfWApIHtcbiAgICB0aHJvdyBuZXcgUGFyc2VFcnJvcihgIyBzZXJ2aWNlPSR7c2VydmljZX1cXFxcbmAsIGxpbmVPbmUudG9TdHJpbmcoJ3V0ZjgnKSlcbiAgfVxuICBsZXQgbGluZVR3byA9IGF3YWl0IHJlYWQoKTtcbiAgLy8gc2tpcCBwYXN0IGFueSBmbHVzaGVzXG4gIHdoaWxlIChsaW5lVHdvID09PSBudWxsKSBsaW5lVHdvID0gYXdhaXQgcmVhZCgpO1xuICAvLyBJbiB0aGUgZWRnZSBjYXNlIG9mIGEgYnJhbmQgbmV3IHJlcG8sIHplcm8gcmVmcyAoYW5kIHplcm8gY2FwYWJpbGl0aWVzKVxuICAvLyBhcmUgcmV0dXJuZWQuXG4gIGlmIChsaW5lVHdvID09PSB0cnVlKSByZXR1cm4geyBjYXBhYmlsaXRpZXMsIHJlZnMsIHN5bXJlZnMgfVxuICBsaW5lVHdvID0gbGluZVR3by50b1N0cmluZygndXRmOCcpO1xuXG4gIC8vIEhhbmRsZSBwcm90b2NvbCB2MiByZXNwb25zZXNcbiAgaWYgKGxpbmVUd28uaW5jbHVkZXMoJ3ZlcnNpb24gMicpKSB7XG4gICAgcmV0dXJuIHBhcnNlQ2FwYWJpbGl0aWVzVjIocmVhZClcbiAgfVxuXG4gIGNvbnN0IFtmaXJzdFJlZiwgY2FwYWJpbGl0aWVzTGluZV0gPSBzcGxpdEFuZEFzc2VydChsaW5lVHdvLCAnXFx4MDAnLCAnXFxcXHgwMCcpO1xuICBjYXBhYmlsaXRpZXNMaW5lLnNwbGl0KCcgJykubWFwKHggPT4gY2FwYWJpbGl0aWVzLmFkZCh4KSk7XG4gIC8vIHNlZSBuby1yZWZzIGluIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9wYWNrLXByb3RvY29sI19yZWZlcmVuY2VfZGlzY292ZXJ5IChzaW5jZSBnaXQgMi40MS4wKVxuICBpZiAoZmlyc3RSZWYgIT09ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGNhcGFiaWxpdGllc157fScpIHtcbiAgICBjb25zdCBbcmVmLCBuYW1lXSA9IHNwbGl0QW5kQXNzZXJ0KGZpcnN0UmVmLCAnICcsICcgJyk7XG4gICAgcmVmcy5zZXQobmFtZSwgcmVmKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgbGluZSA9IGF3YWl0IHJlYWQoKTtcbiAgICAgIGlmIChsaW5lID09PSB0cnVlKSBicmVha1xuICAgICAgaWYgKGxpbmUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgW3JlZiwgbmFtZV0gPSBzcGxpdEFuZEFzc2VydChsaW5lLnRvU3RyaW5nKCd1dGY4JyksICcgJywgJyAnKTtcbiAgICAgICAgcmVmcy5zZXQobmFtZSwgcmVmKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU3ltcmVmcyBhcmUgdGhyb3duIGludG8gdGhlIFwiY2FwYWJpbGl0aWVzXCIgdW5mb3J0dW5hdGVseS5cbiAgZm9yIChjb25zdCBjYXAgb2YgY2FwYWJpbGl0aWVzKSB7XG4gICAgaWYgKGNhcC5zdGFydHNXaXRoKCdzeW1yZWY9JykpIHtcbiAgICAgIGNvbnN0IG0gPSBjYXAubWF0Y2goL3N5bXJlZj0oW146XSspOiguKikvKTtcbiAgICAgIGlmIChtLmxlbmd0aCA9PT0gMykge1xuICAgICAgICBzeW1yZWZzLnNldChtWzFdLCBtWzJdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcHJvdG9jb2xWZXJzaW9uOiAxLCBjYXBhYmlsaXRpZXMsIHJlZnMsIHN5bXJlZnMgfVxufVxuXG5mdW5jdGlvbiBzcGxpdEFuZEFzc2VydChsaW5lLCBzZXAsIGV4cGVjdGVkKSB7XG4gIGNvbnN0IHNwbGl0ID0gbGluZS50cmltKCkuc3BsaXQoc2VwKTtcbiAgaWYgKHNwbGl0Lmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBQYXJzZUVycm9yKFxuICAgICAgYFR3byBzdHJpbmdzIHNlcGFyYXRlZCBieSAnJHtleHBlY3RlZH0nYCxcbiAgICAgIGxpbmUudG9TdHJpbmcoJ3V0ZjgnKVxuICAgIClcbiAgfVxuICByZXR1cm4gc3BsaXRcbn1cblxuLy8gVHJ5IHRvIGFjY29tbW9kYXRlIGtub3duIENPUlMgcHJveHkgaW1wbGVtZW50YXRpb25zOlxuLy8gLSBodHRwczovL2pjdWJpYy5wbC9wcm94eS5waHA/ICA8LS0gdXNlcyBxdWVyeSBzdHJpbmdcbi8vIC0gaHR0cHM6Ly9jb3JzLmlzb21vcnBoaWMtZ2l0Lm9yZyAgPC0tIHVzZXMgcGF0aFxuY29uc3QgY29yc1Byb3hpZnkgPSAoY29yc1Byb3h5LCB1cmwpID0+XG4gIGNvcnNQcm94eS5lbmRzV2l0aCgnPycpXG4gICAgPyBgJHtjb3JzUHJveHl9JHt1cmx9YFxuICAgIDogYCR7Y29yc1Byb3h5fS8ke3VybC5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcLy8sICcnKX1gO1xuXG5jb25zdCB1cGRhdGVIZWFkZXJzID0gKGhlYWRlcnMsIGF1dGgpID0+IHtcbiAgLy8gVXBkYXRlIHRoZSBiYXNpYyBhdXRoIGhlYWRlclxuICBpZiAoYXV0aC51c2VybmFtZSB8fCBhdXRoLnBhc3N3b3JkKSB7XG4gICAgaGVhZGVycy5BdXRob3JpemF0aW9uID0gY2FsY3VsYXRlQmFzaWNBdXRoSGVhZGVyKGF1dGgpO1xuICB9XG4gIC8vIGJ1dCBhbnkgbWFudWFsbHkgcHJvdmlkZWQgaGVhZGVycyB0YWtlIHByZWNlZGVuY2VcbiAgaWYgKGF1dGguaGVhZGVycykge1xuICAgIE9iamVjdC5hc3NpZ24oaGVhZGVycywgYXV0aC5oZWFkZXJzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge0dpdEh0dHBSZXNwb25zZX0gcmVzXG4gKlxuICogQHJldHVybnMge3sgcHJldmlldzogc3RyaW5nLCByZXNwb25zZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIgfX1cbiAqL1xuY29uc3Qgc3RyaW5naWZ5Qm9keSA9IGFzeW5jIHJlcyA9PiB7XG4gIHRyeSB7XG4gICAgLy8gU29tZSBzZXJ2aWNlcyBwcm92aWRlIGEgbWVhbmluZ2Z1bCBlcnJvciBtZXNzYWdlIGluIHRoZSBib2R5IG9mIDQwM3MgbGlrZSBcInRva2VuIGxhY2tzIHRoZSBzY29wZXMgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gdGhpcyBhY3Rpb25cIlxuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuZnJvbShhd2FpdCBjb2xsZWN0KHJlcy5ib2R5KSk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBkYXRhLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgY29uc3QgcHJldmlldyA9XG4gICAgICByZXNwb25zZS5sZW5ndGggPCAyNTYgPyByZXNwb25zZSA6IHJlc3BvbnNlLnNsaWNlKDAsIDI1NikgKyAnLi4uJztcbiAgICByZXR1cm4geyBwcmV2aWV3LCByZXNwb25zZSwgZGF0YSB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4ge31cbiAgfVxufTtcblxuY2xhc3MgR2l0UmVtb3RlSFRUUCB7XG4gIHN0YXRpYyBhc3luYyBjYXBhYmlsaXRpZXMoKSB7XG4gICAgcmV0dXJuIFsnZGlzY292ZXInLCAnY29ubmVjdCddXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtIdHRwQ2xpZW50fSBhcmdzLmh0dHBcbiAgICogQHBhcmFtIHtQcm9ncmVzc0NhbGxiYWNrfSBbYXJncy5vblByb2dyZXNzXVxuICAgKiBAcGFyYW0ge0F1dGhDYWxsYmFja30gW2FyZ3Mub25BdXRoXVxuICAgKiBAcGFyYW0ge0F1dGhGYWlsdXJlQ2FsbGJhY2t9IFthcmdzLm9uQXV0aEZhaWx1cmVdXG4gICAqIEBwYXJhbSB7QXV0aFN1Y2Nlc3NDYWxsYmFja30gW2FyZ3Mub25BdXRoU3VjY2Vzc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNvcnNQcm94eV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2VydmljZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy51cmxcbiAgICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLmhlYWRlcnNcbiAgICogQHBhcmFtIHsxIHwgMn0gYXJncy5wcm90b2NvbFZlcnNpb24gLSBHaXQgUHJvdG9jb2wgVmVyc2lvblxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRpc2NvdmVyKHtcbiAgICBodHRwLFxuICAgIG9uUHJvZ3Jlc3MsXG4gICAgb25BdXRoLFxuICAgIG9uQXV0aFN1Y2Nlc3MsXG4gICAgb25BdXRoRmFpbHVyZSxcbiAgICBjb3JzUHJveHksXG4gICAgc2VydmljZSxcbiAgICB1cmw6IF9vcmlnVXJsLFxuICAgIGhlYWRlcnMsXG4gICAgcHJvdG9jb2xWZXJzaW9uLFxuICB9KSB7XG4gICAgbGV0IHsgdXJsLCBhdXRoIH0gPSBleHRyYWN0QXV0aEZyb21VcmwoX29yaWdVcmwpO1xuICAgIGNvbnN0IHByb3hpZmllZFVSTCA9IGNvcnNQcm94eSA/IGNvcnNQcm94aWZ5KGNvcnNQcm94eSwgdXJsKSA6IHVybDtcbiAgICBpZiAoYXV0aC51c2VybmFtZSB8fCBhdXRoLnBhc3N3b3JkKSB7XG4gICAgICBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBjYWxjdWxhdGVCYXNpY0F1dGhIZWFkZXIoYXV0aCk7XG4gICAgfVxuICAgIGlmIChwcm90b2NvbFZlcnNpb24gPT09IDIpIHtcbiAgICAgIGhlYWRlcnNbJ0dpdC1Qcm90b2NvbCddID0gJ3ZlcnNpb249Mic7XG4gICAgfVxuXG4gICAgbGV0IHJlcztcbiAgICBsZXQgdHJ5QWdhaW47XG4gICAgbGV0IHByb3ZpZGVkQXV0aEJlZm9yZSA9IGZhbHNlO1xuICAgIGRvIHtcbiAgICAgIHJlcyA9IGF3YWl0IGh0dHAucmVxdWVzdCh7XG4gICAgICAgIG9uUHJvZ3Jlc3MsXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHVybDogYCR7cHJveGlmaWVkVVJMfS9pbmZvL3JlZnM/c2VydmljZT0ke3NlcnZpY2V9YCxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgZGVmYXVsdCBsb29wIGJlaGF2aW9yXG4gICAgICB0cnlBZ2FpbiA9IGZhbHNlO1xuXG4gICAgICAvLyA0MDEgaXMgdGhlIFwiY29ycmVjdFwiIHJlc3BvbnNlIGZvciBhY2Nlc3MgZGVuaWVkLiAyMDMgaXMgTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24gYW5kIGNvbWVzIGZyb20gQXp1cmUgRGV2T3BzLCB3aGljaFxuICAgICAgLy8gYXBwYXJlbnRseSBkb2Vzbid0IHJlYWxpemUgdGhpcyBpcyBhIGdpdCByZXF1ZXN0IGFuZCBpcyByZXR1cm5pbmcgdGhlIEhUTUwgZm9yIHRoZSBcIkF6dXJlIERldk9wcyBTZXJ2aWNlcyB8IFNpZ24gSW5cIiBwYWdlLlxuICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSA0MDEgfHwgcmVzLnN0YXR1c0NvZGUgPT09IDIwMykge1xuICAgICAgICAvLyBPbiBzdWJzZXF1ZW50IDQwMXMsIGNhbGwgYG9uQXV0aEZhaWx1cmVgIGluc3RlYWQgb2YgYG9uQXV0aGAuXG4gICAgICAgIC8vIFRoaXMgaXMgc28gdGhhdCBuYWl2ZSBgb25BdXRoYCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBmaXhlZCB2YWx1ZSBkb24ndCBjcmVhdGUgYW4gaW5maW5pdGUgbG9vcCBvZiByZXRyeWluZy5cbiAgICAgICAgY29uc3QgZ2V0QXV0aCA9IHByb3ZpZGVkQXV0aEJlZm9yZSA/IG9uQXV0aEZhaWx1cmUgOiBvbkF1dGg7XG4gICAgICAgIGlmIChnZXRBdXRoKSB7XG4gICAgICAgICAgLy8gQWNxdWlyZSBjcmVkZW50aWFscyBhbmQgdHJ5IGFnYWluXG4gICAgICAgICAgLy8gVE9ETzogcmVhZCBgdXNlSHR0cFBhdGhgIHZhbHVlIGZyb20gZ2l0IGNvbmZpZyBhbmQgcGFzcyBhbG9uZz9cbiAgICAgICAgICBhdXRoID0gYXdhaXQgZ2V0QXV0aCh1cmwsIHtcbiAgICAgICAgICAgIC4uLmF1dGgsXG4gICAgICAgICAgICBoZWFkZXJzOiB7IC4uLmhlYWRlcnMgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoYXV0aCAmJiBhdXRoLmNhbmNlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJDYW5jZWxlZEVycm9yKClcbiAgICAgICAgICB9IGVsc2UgaWYgKGF1dGgpIHtcbiAgICAgICAgICAgIHVwZGF0ZUhlYWRlcnMoaGVhZGVycywgYXV0aCk7XG4gICAgICAgICAgICBwcm92aWRlZEF1dGhCZWZvcmUgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5QWdhaW4gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcmVzLnN0YXR1c0NvZGUgPT09IDIwMCAmJlxuICAgICAgICBwcm92aWRlZEF1dGhCZWZvcmUgJiZcbiAgICAgICAgb25BdXRoU3VjY2Vzc1xuICAgICAgKSB7XG4gICAgICAgIGF3YWl0IG9uQXV0aFN1Y2Nlc3ModXJsLCBhdXRoKTtcbiAgICAgIH1cbiAgICB9IHdoaWxlICh0cnlBZ2FpbilcblxuICAgIGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICBjb25zdCB7IHJlc3BvbnNlIH0gPSBhd2FpdCBzdHJpbmdpZnlCb2R5KHJlcyk7XG4gICAgICB0aHJvdyBuZXcgSHR0cEVycm9yKHJlcy5zdGF0dXNDb2RlLCByZXMuc3RhdHVzTWVzc2FnZSwgcmVzcG9uc2UpXG4gICAgfVxuICAgIC8vIEdpdCBcInNtYXJ0XCIgSFRUUCBzZXJ2ZXJzIHNob3VsZCByZXNwb25kIHdpdGggdGhlIGNvcnJlY3QgQ29udGVudC1UeXBlIGhlYWRlci5cbiAgICBpZiAoXG4gICAgICByZXMuaGVhZGVyc1snY29udGVudC10eXBlJ10gPT09IGBhcHBsaWNhdGlvbi94LSR7c2VydmljZX0tYWR2ZXJ0aXNlbWVudGBcbiAgICApIHtcbiAgICAgIGNvbnN0IHJlbW90ZUhUVFAgPSBhd2FpdCBwYXJzZVJlZnNBZFJlc3BvbnNlKHJlcy5ib2R5LCB7IHNlcnZpY2UgfSk7XG4gICAgICByZW1vdGVIVFRQLmF1dGggPSBhdXRoO1xuICAgICAgcmV0dXJuIHJlbW90ZUhUVFBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhleSBkb24ndCBzZW5kIHRoZSBjb3JyZWN0IGNvbnRlbnQtdHlwZSBoZWFkZXIsIHRoYXQncyBhIGdvb2QgaW5kaWNhdG9yIGl0IGlzIGVpdGhlciBhIFwiZHVtYlwiIEhUVFBcbiAgICAgIC8vIHNlcnZlciwgb3IgdGhlIHVzZXIgc3BlY2lmaWVkIGFuIGluY29ycmVjdCByZW1vdGUgVVJMIGFuZCB0aGUgcmVzcG9uc2UgaXMgYWN0dWFsbHkgYW4gSFRNTCBwYWdlLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBzYXZlIHRoZSByZXNwb25zZSBhcyBwbGFpbiB0ZXh0IHNvIHdlIGNhbiBnZW5lcmF0ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlIGlmIG5lZWRlZC5cbiAgICAgIGNvbnN0IHsgcHJldmlldywgcmVzcG9uc2UsIGRhdGEgfSA9IGF3YWl0IHN0cmluZ2lmeUJvZHkocmVzKTtcbiAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdHJ5IHRvIHBhcnNlIGl0IGFueXdheS5cbiAgICAgIC8vIFRPRE86IG1heWJlIGp1c3QgdGhyb3cgaW5zdGVhZCBvZiB0cnlpbmc/XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZW1vdGVIVFRQID0gYXdhaXQgcGFyc2VSZWZzQWRSZXNwb25zZShbZGF0YV0sIHsgc2VydmljZSB9KTtcbiAgICAgICAgcmVtb3RlSFRUUC5hdXRoID0gYXV0aDtcbiAgICAgICAgcmV0dXJuIHJlbW90ZUhUVFBcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNtYXJ0SHR0cEVycm9yKHByZXZpZXcsIHJlc3BvbnNlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge0h0dHBDbGllbnR9IGFyZ3MuaHR0cFxuICAgKiBAcGFyYW0ge1Byb2dyZXNzQ2FsbGJhY2t9IFthcmdzLm9uUHJvZ3Jlc3NdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb3JzUHJveHldXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNlcnZpY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudXJsXG4gICAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuaGVhZGVyc11cbiAgICogQHBhcmFtIHthbnl9IGFyZ3MuYm9keVxuICAgKiBAcGFyYW0ge2FueX0gYXJncy5hdXRoXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY29ubmVjdCh7XG4gICAgaHR0cCxcbiAgICBvblByb2dyZXNzLFxuICAgIGNvcnNQcm94eSxcbiAgICBzZXJ2aWNlLFxuICAgIHVybCxcbiAgICBhdXRoLFxuICAgIGJvZHksXG4gICAgaGVhZGVycyxcbiAgfSkge1xuICAgIC8vIFdlIGFscmVhZHkgaGF2ZSB0aGUgXCJjb3JyZWN0XCIgYXV0aCB2YWx1ZSBhdCB0aGlzIHBvaW50LCBidXRcbiAgICAvLyB3ZSBuZWVkIHRvIHN0cmlwIG91dCB0aGUgdXNlcm5hbWUvcGFzc3dvcmQgZnJvbSB0aGUgVVJMIHlldCBhZ2Fpbi5cbiAgICBjb25zdCB1cmxBdXRoID0gZXh0cmFjdEF1dGhGcm9tVXJsKHVybCk7XG4gICAgaWYgKHVybEF1dGgpIHVybCA9IHVybEF1dGgudXJsO1xuXG4gICAgaWYgKGNvcnNQcm94eSkgdXJsID0gY29yc1Byb3hpZnkoY29yc1Byb3h5LCB1cmwpO1xuXG4gICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBgYXBwbGljYXRpb24veC0ke3NlcnZpY2V9LXJlcXVlc3RgO1xuICAgIGhlYWRlcnMuYWNjZXB0ID0gYGFwcGxpY2F0aW9uL3gtJHtzZXJ2aWNlfS1yZXN1bHRgO1xuICAgIHVwZGF0ZUhlYWRlcnMoaGVhZGVycywgYXV0aCk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBodHRwLnJlcXVlc3Qoe1xuICAgICAgb25Qcm9ncmVzcyxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsOiBgJHt1cmx9LyR7c2VydmljZX1gLFxuICAgICAgYm9keSxcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2UgfSA9IHN0cmluZ2lmeUJvZHkocmVzKTtcbiAgICAgIHRocm93IG5ldyBIdHRwRXJyb3IocmVzLnN0YXR1c0NvZGUsIHJlcy5zdGF0dXNNZXNzYWdlLCByZXNwb25zZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVtb3RlVXJsKHsgdXJsIH0pIHtcbiAgLy8gdGhlIHN0dXBpZCBcInNob3J0ZXIgc2NwLWxpa2Ugc3ludGF4XCJcbiAgaWYgKHVybC5zdGFydHNXaXRoKCdnaXRAJykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNwb3J0OiAnc3NoJyxcbiAgICAgIGFkZHJlc3M6IHVybCxcbiAgICB9XG4gIH1cbiAgY29uc3QgbWF0Y2hlcyA9IHVybC5tYXRjaCgvKFxcdyspKDpcXC9cXC98OjopKC4qKS8pO1xuICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkgcmV0dXJuXG4gIC8qXG4gICAqIFdoZW4gZ2l0IGVuY291bnRlcnMgYSBVUkwgb2YgdGhlIGZvcm0gPHRyYW5zcG9ydD46Ly88YWRkcmVzcz4sIHdoZXJlIDx0cmFuc3BvcnQ+IGlzXG4gICAqIGEgcHJvdG9jb2wgdGhhdCBpdCBjYW5ub3QgaGFuZGxlIG5hdGl2ZWx5LCBpdCBhdXRvbWF0aWNhbGx5IGludm9rZXMgZ2l0IHJlbW90ZS08dHJhbnNwb3J0PlxuICAgKiB3aXRoIHRoZSBmdWxsIFVSTCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtcmVtb3RlLWhlbHBlcnNcbiAgICovXG4gIGlmIChtYXRjaGVzWzJdID09PSAnOi8vJykge1xuICAgIHJldHVybiB7XG4gICAgICB0cmFuc3BvcnQ6IG1hdGNoZXNbMV0sXG4gICAgICBhZGRyZXNzOiBtYXRjaGVzWzBdLFxuICAgIH1cbiAgfVxuICAvKlxuICAgKiBBIFVSTCBvZiB0aGUgZm9ybSA8dHJhbnNwb3J0Pjo6PGFkZHJlc3M+IGV4cGxpY2l0bHkgaW5zdHJ1Y3RzIGdpdCB0byBpbnZva2VcbiAgICogZ2l0IHJlbW90ZS08dHJhbnNwb3J0PiB3aXRoIDxhZGRyZXNzPiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtcmVtb3RlLWhlbHBlcnNcbiAgICovXG4gIGlmIChtYXRjaGVzWzJdID09PSAnOjonKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zcG9ydDogbWF0Y2hlc1sxXSxcbiAgICAgIGFkZHJlc3M6IG1hdGNoZXNbM10sXG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEdpdFJlbW90ZU1hbmFnZXIge1xuICBzdGF0aWMgZ2V0UmVtb3RlSGVscGVyRm9yKHsgdXJsIH0pIHtcbiAgICAvLyBUT0RPOiBjbGVhbiB1cCB0aGUgcmVtb3RlSGVscGVyIEFQSSBhbmQgbW92ZSBpbnRvIFBsdWdpbkNvcmVcbiAgICBjb25zdCByZW1vdGVIZWxwZXJzID0gbmV3IE1hcCgpO1xuICAgIHJlbW90ZUhlbHBlcnMuc2V0KCdodHRwJywgR2l0UmVtb3RlSFRUUCk7XG4gICAgcmVtb3RlSGVscGVycy5zZXQoJ2h0dHBzJywgR2l0UmVtb3RlSFRUUCk7XG5cbiAgICBjb25zdCBwYXJ0cyA9IHBhcnNlUmVtb3RlVXJsKHsgdXJsIH0pO1xuICAgIGlmICghcGFydHMpIHtcbiAgICAgIHRocm93IG5ldyBVcmxQYXJzZUVycm9yKHVybClcbiAgICB9XG4gICAgaWYgKHJlbW90ZUhlbHBlcnMuaGFzKHBhcnRzLnRyYW5zcG9ydCkpIHtcbiAgICAgIHJldHVybiByZW1vdGVIZWxwZXJzLmdldChwYXJ0cy50cmFuc3BvcnQpXG4gICAgfVxuICAgIHRocm93IG5ldyBVbmtub3duVHJhbnNwb3J0RXJyb3IoXG4gICAgICB1cmwsXG4gICAgICBwYXJ0cy50cmFuc3BvcnQsXG4gICAgICBwYXJ0cy50cmFuc3BvcnQgPT09ICdzc2gnID8gdHJhbnNsYXRlU1NIdG9IVFRQKHVybCkgOiB1bmRlZmluZWRcbiAgICApXG4gIH1cbn1cblxubGV0IGxvY2skMiA9IG51bGw7XG5cbmNsYXNzIEdpdFNoYWxsb3dNYW5hZ2VyIHtcbiAgc3RhdGljIGFzeW5jIHJlYWQoeyBmcywgZ2l0ZGlyIH0pIHtcbiAgICBpZiAobG9jayQyID09PSBudWxsKSBsb2NrJDIgPSBuZXcgQXN5bmNMb2NrKCk7XG4gICAgY29uc3QgZmlsZXBhdGggPSBqb2luKGdpdGRpciwgJ3NoYWxsb3cnKTtcbiAgICBjb25zdCBvaWRzID0gbmV3IFNldCgpO1xuICAgIGF3YWl0IGxvY2skMi5hY3F1aXJlKGZpbGVwYXRoLCBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmcy5yZWFkKGZpbGVwYXRoLCB7IGVuY29kaW5nOiAndXRmOCcgfSk7XG4gICAgICBpZiAodGV4dCA9PT0gbnVsbCkgcmV0dXJuIG9pZHMgLy8gbm8gZmlsZVxuICAgICAgaWYgKHRleHQudHJpbSgpID09PSAnJykgcmV0dXJuIG9pZHMgLy8gZW1wdHkgZmlsZVxuICAgICAgdGV4dFxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcChvaWQgPT4gb2lkcy5hZGQob2lkKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9pZHNcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB3cml0ZSh7IGZzLCBnaXRkaXIsIG9pZHMgfSkge1xuICAgIGlmIChsb2NrJDIgPT09IG51bGwpIGxvY2skMiA9IG5ldyBBc3luY0xvY2soKTtcbiAgICBjb25zdCBmaWxlcGF0aCA9IGpvaW4oZ2l0ZGlyLCAnc2hhbGxvdycpO1xuICAgIGlmIChvaWRzLnNpemUgPiAwKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gWy4uLm9pZHNdLmpvaW4oJ1xcbicpICsgJ1xcbic7XG4gICAgICBhd2FpdCBsb2NrJDIuYWNxdWlyZShmaWxlcGF0aCwgYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlKGZpbGVwYXRoLCB0ZXh0LCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gc2hhbGxvd3NcbiAgICAgIGF3YWl0IGxvY2skMi5hY3F1aXJlKGZpbGVwYXRoLCBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgICAgYXdhaXQgZnMucm0oZmlsZXBhdGgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc09iamVjdExvb3NlKHsgZnMsIGdpdGRpciwgb2lkIH0pIHtcbiAgY29uc3Qgc291cmNlID0gYG9iamVjdHMvJHtvaWQuc2xpY2UoMCwgMil9LyR7b2lkLnNsaWNlKDIpfWA7XG4gIHJldHVybiBmcy5leGlzdHMoYCR7Z2l0ZGlyfS8ke3NvdXJjZX1gKVxufVxuXG5hc3luYyBmdW5jdGlvbiBoYXNPYmplY3RQYWNrZWQoe1xuICBmcyxcbiAgY2FjaGUsXG4gIGdpdGRpcixcbiAgb2lkLFxuICBnZXRFeHRlcm5hbFJlZkRlbHRhLFxufSkge1xuICAvLyBDaGVjayB0byBzZWUgaWYgaXQncyBpbiBhIHBhY2tmaWxlLlxuICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHRoZSAuaWR4IGZpbGVzXG4gIGxldCBsaXN0ID0gYXdhaXQgZnMucmVhZGRpcihqb2luKGdpdGRpciwgJ29iamVjdHMvcGFjaycpKTtcbiAgbGlzdCA9IGxpc3QuZmlsdGVyKHggPT4geC5lbmRzV2l0aCgnLmlkeCcpKTtcbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBsaXN0KSB7XG4gICAgY29uc3QgaW5kZXhGaWxlID0gYCR7Z2l0ZGlyfS9vYmplY3RzL3BhY2svJHtmaWxlbmFtZX1gO1xuICAgIGNvbnN0IHAgPSBhd2FpdCByZWFkUGFja0luZGV4KHtcbiAgICAgIGZzLFxuICAgICAgY2FjaGUsXG4gICAgICBmaWxlbmFtZTogaW5kZXhGaWxlLFxuICAgICAgZ2V0RXh0ZXJuYWxSZWZEZWx0YSxcbiAgICB9KTtcbiAgICBpZiAocC5lcnJvcikgdGhyb3cgbmV3IEludGVybmFsRXJyb3IocC5lcnJvcilcbiAgICAvLyBJZiB0aGUgcGFja2ZpbGUgRE9FUyBoYXZlIHRoZSBvaWQgd2UncmUgbG9va2luZyBmb3IuLi5cbiAgICBpZiAocC5vZmZzZXRzLmhhcyhvaWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICAvLyBGYWlsZWQgdG8gZmluZCBpdFxuICByZXR1cm4gZmFsc2Vcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzT2JqZWN0KHtcbiAgZnMsXG4gIGNhY2hlLFxuICBnaXRkaXIsXG4gIG9pZCxcbiAgZm9ybWF0ID0gJ2NvbnRlbnQnLFxufSkge1xuICAvLyBDdXJyeSB0aGUgY3VycmVudCByZWFkIG1ldGhvZCBzbyB0aGF0IHRoZSBwYWNrZmlsZSB1bi1kZWx0aWZpY2F0aW9uXG4gIC8vIHByb2Nlc3MgY2FuIGFjcXVpcmUgZXh0ZXJuYWwgcmVmLWRlbHRhcy5cbiAgY29uc3QgZ2V0RXh0ZXJuYWxSZWZEZWx0YSA9IG9pZCA9PiBfcmVhZE9iamVjdCh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSk7XG5cbiAgLy8gTG9vayBmb3IgaXQgaW4gdGhlIGxvb3NlIG9iamVjdCBkaXJlY3RvcnkuXG4gIGxldCByZXN1bHQgPSBhd2FpdCBoYXNPYmplY3RMb29zZSh7IGZzLCBnaXRkaXIsIG9pZCB9KTtcbiAgLy8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgaW4gYSBwYWNrZmlsZS5cbiAgaWYgKCFyZXN1bHQpIHtcbiAgICByZXN1bHQgPSBhd2FpdCBoYXNPYmplY3RQYWNrZWQoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIGdpdGRpcixcbiAgICAgIG9pZCxcbiAgICAgIGdldEV4dGVybmFsUmVmRGVsdGEsXG4gICAgfSk7XG4gIH1cbiAgLy8gRmluYWxseVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIFRPRE86IG1ha2UgYSBmdW5jdGlvbiB0aGF0IGp1c3QgcmV0dXJucyBvYkNvdW50LiB0aGVuIGVtcHR5UGFja2ZpbGUgPSAoKSA9PiBzaXplUGFjayhwYWNrKSA9PT0gMFxuZnVuY3Rpb24gZW1wdHlQYWNrZmlsZShwYWNrKSB7XG4gIGNvbnN0IHBoZWFkZXIgPSAnNTA0MTQzNGInO1xuICBjb25zdCB2ZXJzaW9uID0gJzAwMDAwMDAyJztcbiAgY29uc3Qgb2JDb3VudCA9ICcwMDAwMDAwMCc7XG4gIGNvbnN0IGhlYWRlciA9IHBoZWFkZXIgKyB2ZXJzaW9uICsgb2JDb3VudDtcbiAgcmV0dXJuIHBhY2suc2xpY2UoMCwgMTIpLnRvU3RyaW5nKCdoZXgnKSA9PT0gaGVhZGVyXG59XG5cbmZ1bmN0aW9uIGZpbHRlckNhcGFiaWxpdGllcyhzZXJ2ZXIsIGNsaWVudCkge1xuICBjb25zdCBzZXJ2ZXJOYW1lcyA9IHNlcnZlci5tYXAoY2FwID0+IGNhcC5zcGxpdCgnPScsIDEpWzBdKTtcbiAgcmV0dXJuIGNsaWVudC5maWx0ZXIoY2FwID0+IHtcbiAgICBjb25zdCBuYW1lID0gY2FwLnNwbGl0KCc9JywgMSlbMF07XG4gICAgcmV0dXJuIHNlcnZlck5hbWVzLmluY2x1ZGVzKG5hbWUpXG4gIH0pXG59XG5cbmNvbnN0IHBrZyA9IHtcbiAgbmFtZTogJ2lzb21vcnBoaWMtZ2l0JyxcbiAgdmVyc2lvbjogJzEuMjUuNycsXG4gIGFnZW50OiAnZ2l0L2lzb21vcnBoaWMtZ2l0QDEuMjUuNycsXG59O1xuXG5jbGFzcyBGSUZPIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgfVxuXG4gIHdyaXRlKGNodW5rKSB7XG4gICAgaWYgKHRoaXMuX2VuZGVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignWW91IGNhbm5vdCB3cml0ZSB0byBhIEZJRk8gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGVuZGVkIScpXG4gICAgfVxuICAgIGlmICh0aGlzLl93YWl0aW5nKSB7XG4gICAgICBjb25zdCByZXNvbHZlID0gdGhpcy5fd2FpdGluZztcbiAgICAgIHRoaXMuX3dhaXRpbmcgPSBudWxsO1xuICAgICAgcmVzb2x2ZSh7IHZhbHVlOiBjaHVuayB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcXVldWUucHVzaChjaHVuayk7XG4gICAgfVxuICB9XG5cbiAgZW5kKCkge1xuICAgIHRoaXMuX2VuZGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fd2FpdGluZykge1xuICAgICAgY29uc3QgcmVzb2x2ZSA9IHRoaXMuX3dhaXRpbmc7XG4gICAgICB0aGlzLl93YWl0aW5nID0gbnVsbDtcbiAgICAgIHJlc29sdmUoeyBkb25lOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koZXJyKSB7XG4gICAgdGhpcy5lcnJvciA9IGVycjtcbiAgICB0aGlzLmVuZCgpO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpIHtcbiAgICBpZiAodGhpcy5fcXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMuX3F1ZXVlLnNoaWZ0KCkgfVxuICAgIH1cbiAgICBpZiAodGhpcy5fZW5kZWQpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfVxuICAgIH1cbiAgICBpZiAodGhpcy5fd2FpdGluZykge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICdZb3UgY2Fubm90IGNhbGwgcmVhZCB1bnRpbCB0aGUgcHJldmlvdXMgY2FsbCB0byByZWFkIGhhcyByZXR1cm5lZCEnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuX3dhaXRpbmcgPSByZXNvbHZlO1xuICAgIH0pXG4gIH1cbn1cblxuLy8gTm90ZTogcHJvZ3Jlc3MgbWVzc2FnZXMgYXJlIGRlc2lnbmVkIHRvIGJlIHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGhlIHRlcm1pbmFsLFxuLy8gc28gdGhleSBhcmUgb2Z0ZW4gc2VudCB3aXRoIGp1c3QgYSBjYXJyaWFnZSByZXR1cm4gdG8gb3ZlcndyaXRlIHRoZSBsYXN0IGxpbmUgb2Ygb3V0cHV0LlxuLy8gQnV0IHRoZXJlIGFyZSBhbHNvIG1lc3NhZ2VzIGRlbGltaXRlZCB3aXRoIG5ld2xpbmVzLlxuLy8gSSBhbHNvIGluY2x1ZGUgQ1JMRiBqdXN0IGluIGNhc2UuXG5mdW5jdGlvbiBmaW5kU3BsaXQoc3RyKSB7XG4gIGNvbnN0IHIgPSBzdHIuaW5kZXhPZignXFxyJyk7XG4gIGNvbnN0IG4gPSBzdHIuaW5kZXhPZignXFxuJyk7XG4gIGlmIChyID09PSAtMSAmJiBuID09PSAtMSkgcmV0dXJuIC0xXG4gIGlmIChyID09PSAtMSkgcmV0dXJuIG4gKyAxIC8vIFxcblxuICBpZiAobiA9PT0gLTEpIHJldHVybiByICsgMSAvLyBcXHJcbiAgaWYgKG4gPT09IHIgKyAxKSByZXR1cm4gbiArIDEgLy8gXFxyXFxuXG4gIHJldHVybiBNYXRoLm1pbihyLCBuKSArIDEgLy8gXFxyIG9yIFxcblxufVxuXG5mdW5jdGlvbiBzcGxpdExpbmVzKGlucHV0KSB7XG4gIGNvbnN0IG91dHB1dCA9IG5ldyBGSUZPKCk7XG4gIGxldCB0bXAgPSAnJ1xuICA7KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBmb3JBd2FpdChpbnB1dCwgY2h1bmsgPT4ge1xuICAgICAgY2h1bmsgPSBjaHVuay50b1N0cmluZygndXRmOCcpO1xuICAgICAgdG1wICs9IGNodW5rO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgaSA9IGZpbmRTcGxpdCh0bXApO1xuICAgICAgICBpZiAoaSA9PT0gLTEpIGJyZWFrXG4gICAgICAgIG91dHB1dC53cml0ZSh0bXAuc2xpY2UoMCwgaSkpO1xuICAgICAgICB0bXAgPSB0bXAuc2xpY2UoaSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRtcC5sZW5ndGggPiAwKSB7XG4gICAgICBvdXRwdXQud3JpdGUodG1wKTtcbiAgICB9XG4gICAgb3V0cHV0LmVuZCgpO1xuICB9KSgpO1xuICByZXR1cm4gb3V0cHV0XG59XG5cbi8qXG5JZiAnc2lkZS1iYW5kJyBvciAnc2lkZS1iYW5kLTY0aycgY2FwYWJpbGl0aWVzIGhhdmUgYmVlbiBzcGVjaWZpZWQgYnlcbnRoZSBjbGllbnQsIHRoZSBzZXJ2ZXIgd2lsbCBzZW5kIHRoZSBwYWNrZmlsZSBkYXRhIG11bHRpcGxleGVkLlxuXG5FYWNoIHBhY2tldCBzdGFydGluZyB3aXRoIHRoZSBwYWNrZXQtbGluZSBsZW5ndGggb2YgdGhlIGFtb3VudCBvZiBkYXRhXG50aGF0IGZvbGxvd3MsIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIGJ5dGUgc3BlY2lmeWluZyB0aGUgc2lkZWJhbmQgdGhlXG5mb2xsb3dpbmcgZGF0YSBpcyBjb21pbmcgaW4gb24uXG5cbkluICdzaWRlLWJhbmQnIG1vZGUsIGl0IHdpbGwgc2VuZCB1cCB0byA5OTkgZGF0YSBieXRlcyBwbHVzIDEgY29udHJvbFxuY29kZSwgZm9yIGEgdG90YWwgb2YgdXAgdG8gMTAwMCBieXRlcyBpbiBhIHBrdC1saW5lLiAgSW4gJ3NpZGUtYmFuZC02NGsnXG5tb2RlIGl0IHdpbGwgc2VuZCB1cCB0byA2NTUxOSBkYXRhIGJ5dGVzIHBsdXMgMSBjb250cm9sIGNvZGUsIGZvciBhXG50b3RhbCBvZiB1cCB0byA2NTUyMCBieXRlcyBpbiBhIHBrdC1saW5lLlxuXG5UaGUgc2lkZWJhbmQgYnl0ZSB3aWxsIGJlIGEgJzEnLCAnMicgb3IgYSAnMycuIFNpZGViYW5kICcxJyB3aWxsIGNvbnRhaW5cbnBhY2tmaWxlIGRhdGEsIHNpZGViYW5kICcyJyB3aWxsIGJlIHVzZWQgZm9yIHByb2dyZXNzIGluZm9ybWF0aW9uIHRoYXQgdGhlXG5jbGllbnQgd2lsbCBnZW5lcmFsbHkgcHJpbnQgdG8gc3RkZXJyIGFuZCBzaWRlYmFuZCAnMycgaXMgdXNlZCBmb3IgZXJyb3JcbmluZm9ybWF0aW9uLlxuXG5JZiBubyAnc2lkZS1iYW5kJyBjYXBhYmlsaXR5IHdhcyBzcGVjaWZpZWQsIHRoZSBzZXJ2ZXIgd2lsbCBzdHJlYW0gdGhlXG5lbnRpcmUgcGFja2ZpbGUgd2l0aG91dCBtdWx0aXBsZXhpbmcuXG4qL1xuXG5jbGFzcyBHaXRTaWRlQmFuZCB7XG4gIHN0YXRpYyBkZW11eChpbnB1dCkge1xuICAgIGNvbnN0IHJlYWQgPSBHaXRQa3RMaW5lLnN0cmVhbVJlYWRlcihpbnB1dCk7XG4gICAgLy8gQW5kIG5vdyBmb3IgdGhlIHJpZGljdWxvdXMgc2lkZS1iYW5kIG9yIHNpZGUtYmFuZC02NGsgcHJvdG9jb2xcbiAgICBjb25zdCBwYWNrZXRsaW5lcyA9IG5ldyBGSUZPKCk7XG4gICAgY29uc3QgcGFja2ZpbGUgPSBuZXcgRklGTygpO1xuICAgIGNvbnN0IHByb2dyZXNzID0gbmV3IEZJRk8oKTtcbiAgICAvLyBUT0RPOiBVc2UgYSBwcm9wZXIgdGhyb3VnaCBzdHJlYW0/XG4gICAgY29uc3QgbmV4dEJpdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbGluZSA9IGF3YWl0IHJlYWQoKTtcbiAgICAgIC8vIFNraXAgb3ZlciBmbHVzaCBwYWNrZXRzXG4gICAgICBpZiAobGluZSA9PT0gbnVsbCkgcmV0dXJuIG5leHRCaXQoKVxuICAgICAgLy8gQSBtYWRlIHVwIGNvbnZlbnRpb24gdG8gc2lnbmFsIHRoZXJlJ3Mgbm8gbW9yZSB0byByZWFkLlxuICAgICAgaWYgKGxpbmUgPT09IHRydWUpIHtcbiAgICAgICAgcGFja2V0bGluZXMuZW5kKCk7XG4gICAgICAgIHByb2dyZXNzLmVuZCgpO1xuICAgICAgICBpbnB1dC5lcnJvciA/IHBhY2tmaWxlLmRlc3Ryb3koaW5wdXQuZXJyb3IpIDogcGFja2ZpbGUuZW5kKCk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gRXhhbWluZSBmaXJzdCBieXRlIHRvIGRldGVybWluZSB3aGljaCBvdXRwdXQgXCJzdHJlYW1cIiB0byB1c2VcbiAgICAgIHN3aXRjaCAobGluZVswXSkge1xuICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICAvLyBwYWNrIGRhdGFcbiAgICAgICAgICBwYWNrZmlsZS53cml0ZShsaW5lLnNsaWNlKDEpKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgIC8vIHByb2dyZXNzIG1lc3NhZ2VcbiAgICAgICAgICBwcm9ncmVzcy53cml0ZShsaW5lLnNsaWNlKDEpKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzoge1xuICAgICAgICAgIC8vIGZhdGFsIGVycm9yIG1lc3NhZ2UganVzdCBiZWZvcmUgc3RyZWFtIGFib3J0c1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gbGluZS5zbGljZSgxKTtcbiAgICAgICAgICBwcm9ncmVzcy53cml0ZShlcnJvcik7XG4gICAgICAgICAgcGFja2V0bGluZXMuZW5kKCk7XG4gICAgICAgICAgcHJvZ3Jlc3MuZW5kKCk7XG4gICAgICAgICAgcGFja2ZpbGUuZGVzdHJveShuZXcgRXJyb3IoZXJyb3IudG9TdHJpbmcoJ3V0ZjgnKSkpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBOb3QgcGFydCBvZiB0aGUgc2lkZS1iYW5kLTY0ayBwcm90b2NvbFxuICAgICAgICAgIHBhY2tldGxpbmVzLndyaXRlKGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDYXJlZnVsIG5vdCB0byBibG93IHVwIHRoZSBzdGFjay5cbiAgICAgIC8vIEkgdGhpbmsgUHJvbWlzZXMgaW4gYSB0YWlsLWNhbGwgcG9zaXRpb24gc2hvdWxkIGJlIE9LLlxuICAgICAgbmV4dEJpdCgpO1xuICAgIH07XG4gICAgbmV4dEJpdCgpO1xuICAgIHJldHVybiB7XG4gICAgICBwYWNrZXRsaW5lcyxcbiAgICAgIHBhY2tmaWxlLFxuICAgICAgcHJvZ3Jlc3MsXG4gICAgfVxuICB9XG4gIC8vIHN0YXRpYyBtdXggKHtcbiAgLy8gICBwcm90b2NvbCwgLy8gJ3NpZGUtYmFuZCcgb3IgJ3NpZGUtYmFuZC02NGsnXG4gIC8vICAgcGFja2V0bGluZXMsXG4gIC8vICAgcGFja2ZpbGUsXG4gIC8vICAgcHJvZ3Jlc3MsXG4gIC8vICAgZXJyb3JcbiAgLy8gfSkge1xuICAvLyAgIGNvbnN0IE1BWF9QQUNLRVRfTEVOR1RIID0gcHJvdG9jb2wgPT09ICdzaWRlLWJhbmQtNjRrJyA/IDk5OSA6IDY1NTE5XG4gIC8vICAgbGV0IG91dHB1dCA9IG5ldyBQYXNzVGhyb3VnaCgpXG4gIC8vICAgcGFja2V0bGluZXMub24oJ2RhdGEnLCBkYXRhID0+IHtcbiAgLy8gICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gIC8vICAgICAgIG91dHB1dC53cml0ZShHaXRQa3RMaW5lLmZsdXNoKCkpXG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICBvdXRwdXQud3JpdGUoR2l0UGt0TGluZS5lbmNvZGUoZGF0YSkpXG4gIC8vICAgICB9XG4gIC8vICAgfSlcbiAgLy8gICBsZXQgcGFja2ZpbGVXYXNFbXB0eSA9IHRydWVcbiAgLy8gICBsZXQgcGFja2ZpbGVFbmRlZCA9IGZhbHNlXG4gIC8vICAgbGV0IHByb2dyZXNzRW5kZWQgPSBmYWxzZVxuICAvLyAgIGxldCBlcnJvckVuZGVkID0gZmFsc2VcbiAgLy8gICBsZXQgZ29vZGJ5ZSA9IEJ1ZmZlci5jb25jYXQoW1xuICAvLyAgICAgR2l0UGt0TGluZS5lbmNvZGUoQnVmZmVyLmZyb20oJzAxMEEnLCAnaGV4JykpLFxuICAvLyAgICAgR2l0UGt0TGluZS5mbHVzaCgpXG4gIC8vICAgXSlcbiAgLy8gICBwYWNrZmlsZVxuICAvLyAgICAgLm9uKCdkYXRhJywgZGF0YSA9PiB7XG4gIC8vICAgICAgIHBhY2tmaWxlV2FzRW1wdHkgPSBmYWxzZVxuICAvLyAgICAgICBjb25zdCBidWZmZXJzID0gc3BsaXRCdWZmZXIoZGF0YSwgTUFYX1BBQ0tFVF9MRU5HVEgpXG4gIC8vICAgICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcbiAgLy8gICAgICAgICBvdXRwdXQud3JpdGUoXG4gIC8vICAgICAgICAgICBHaXRQa3RMaW5lLmVuY29kZShCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbSgnMDEnLCAnaGV4JyksIGJ1ZmZlcl0pKVxuICAvLyAgICAgICAgIClcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSlcbiAgLy8gICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAvLyAgICAgICBwYWNrZmlsZUVuZGVkID0gdHJ1ZVxuICAvLyAgICAgICBpZiAoIXBhY2tmaWxlV2FzRW1wdHkpIG91dHB1dC53cml0ZShnb29kYnllKVxuICAvLyAgICAgICBpZiAocHJvZ3Jlc3NFbmRlZCAmJiBlcnJvckVuZGVkKSBvdXRwdXQuZW5kKClcbiAgLy8gICAgIH0pXG4gIC8vICAgcHJvZ3Jlc3NcbiAgLy8gICAgIC5vbignZGF0YScsIGRhdGEgPT4ge1xuICAvLyAgICAgICBjb25zdCBidWZmZXJzID0gc3BsaXRCdWZmZXIoZGF0YSwgTUFYX1BBQ0tFVF9MRU5HVEgpXG4gIC8vICAgICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcbiAgLy8gICAgICAgICBvdXRwdXQud3JpdGUoXG4gIC8vICAgICAgICAgICBHaXRQa3RMaW5lLmVuY29kZShCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbSgnMDInLCAnaGV4JyksIGJ1ZmZlcl0pKVxuICAvLyAgICAgICAgIClcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSlcbiAgLy8gICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAvLyAgICAgICBwcm9ncmVzc0VuZGVkID0gdHJ1ZVxuICAvLyAgICAgICBpZiAocGFja2ZpbGVFbmRlZCAmJiBlcnJvckVuZGVkKSBvdXRwdXQuZW5kKClcbiAgLy8gICAgIH0pXG4gIC8vICAgZXJyb3JcbiAgLy8gICAgIC5vbignZGF0YScsIGRhdGEgPT4ge1xuICAvLyAgICAgICBjb25zdCBidWZmZXJzID0gc3BsaXRCdWZmZXIoZGF0YSwgTUFYX1BBQ0tFVF9MRU5HVEgpXG4gIC8vICAgICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcbiAgLy8gICAgICAgICBvdXRwdXQud3JpdGUoXG4gIC8vICAgICAgICAgICBHaXRQa3RMaW5lLmVuY29kZShCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbSgnMDMnLCAnaGV4JyksIGJ1ZmZlcl0pKVxuICAvLyAgICAgICAgIClcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSlcbiAgLy8gICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAvLyAgICAgICBlcnJvckVuZGVkID0gdHJ1ZVxuICAvLyAgICAgICBpZiAocHJvZ3Jlc3NFbmRlZCAmJiBwYWNrZmlsZUVuZGVkKSBvdXRwdXQuZW5kKClcbiAgLy8gICAgIH0pXG4gIC8vICAgcmV0dXJuIG91dHB1dFxuICAvLyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlVXBsb2FkUGFja1Jlc3BvbnNlKHN0cmVhbSkge1xuICBjb25zdCB7IHBhY2tldGxpbmVzLCBwYWNrZmlsZSwgcHJvZ3Jlc3MgfSA9IEdpdFNpZGVCYW5kLmRlbXV4KHN0cmVhbSk7XG4gIGNvbnN0IHNoYWxsb3dzID0gW107XG4gIGNvbnN0IHVuc2hhbGxvd3MgPSBbXTtcbiAgY29uc3QgYWNrcyA9IFtdO1xuICBsZXQgbmFrID0gZmFsc2U7XG4gIGxldCBkb25lID0gZmFsc2U7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gUGFyc2UgdGhlIHJlc3BvbnNlXG4gICAgZm9yQXdhaXQocGFja2V0bGluZXMsIGRhdGEgPT4ge1xuICAgICAgY29uc3QgbGluZSA9IGRhdGEudG9TdHJpbmcoJ3V0ZjgnKS50cmltKCk7XG4gICAgICBpZiAobGluZS5zdGFydHNXaXRoKCdzaGFsbG93JykpIHtcbiAgICAgICAgY29uc3Qgb2lkID0gbGluZS5zbGljZSgtNDEpLnRyaW0oKTtcbiAgICAgICAgaWYgKG9pZC5sZW5ndGggIT09IDQwKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBJbnZhbGlkT2lkRXJyb3Iob2lkKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2hhbGxvd3MucHVzaChvaWQpO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJ3Vuc2hhbGxvdycpKSB7XG4gICAgICAgIGNvbnN0IG9pZCA9IGxpbmUuc2xpY2UoLTQxKS50cmltKCk7XG4gICAgICAgIGlmIChvaWQubGVuZ3RoICE9PSA0MCkge1xuICAgICAgICAgIHJlamVjdChuZXcgSW52YWxpZE9pZEVycm9yKG9pZCkpO1xuICAgICAgICB9XG4gICAgICAgIHVuc2hhbGxvd3MucHVzaChvaWQpO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJ0FDSycpKSB7XG4gICAgICAgIGNvbnN0IFssIG9pZCwgc3RhdHVzXSA9IGxpbmUuc3BsaXQoJyAnKTtcbiAgICAgICAgYWNrcy5wdXNoKHsgb2lkLCBzdGF0dXMgfSk7XG4gICAgICAgIGlmICghc3RhdHVzKSBkb25lID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCdOQUsnKSkge1xuICAgICAgICBuYWsgPSB0cnVlO1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICBuYWsgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgc3RyZWFtLmVycm9yXG4gICAgICAgICAgPyByZWplY3Qoc3RyZWFtLmVycm9yKVxuICAgICAgICAgIDogcmVzb2x2ZSh7IHNoYWxsb3dzLCB1bnNoYWxsb3dzLCBhY2tzLCBuYWssIHBhY2tmaWxlLCBwcm9ncmVzcyB9KTtcbiAgICAgIH1cbiAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmICghZG9uZSkge1xuICAgICAgICBzdHJlYW0uZXJyb3JcbiAgICAgICAgICA/IHJlamVjdChzdHJlYW0uZXJyb3IpXG4gICAgICAgICAgOiByZXNvbHZlKHsgc2hhbGxvd3MsIHVuc2hhbGxvd3MsIGFja3MsIG5haywgcGFja2ZpbGUsIHByb2dyZXNzIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KVxufVxuXG5mdW5jdGlvbiB3cml0ZVVwbG9hZFBhY2tSZXF1ZXN0KHtcbiAgY2FwYWJpbGl0aWVzID0gW10sXG4gIHdhbnRzID0gW10sXG4gIGhhdmVzID0gW10sXG4gIHNoYWxsb3dzID0gW10sXG4gIGRlcHRoID0gbnVsbCxcbiAgc2luY2UgPSBudWxsLFxuICBleGNsdWRlID0gW10sXG59KSB7XG4gIGNvbnN0IHBhY2tzdHJlYW0gPSBbXTtcbiAgd2FudHMgPSBbLi4ubmV3IFNldCh3YW50cyldOyAvLyByZW1vdmUgZHVwbGljYXRlc1xuICBsZXQgZmlyc3RMaW5lQ2FwYWJpbGl0aWVzID0gYCAke2NhcGFiaWxpdGllcy5qb2luKCcgJyl9YDtcbiAgZm9yIChjb25zdCBvaWQgb2Ygd2FudHMpIHtcbiAgICBwYWNrc3RyZWFtLnB1c2goR2l0UGt0TGluZS5lbmNvZGUoYHdhbnQgJHtvaWR9JHtmaXJzdExpbmVDYXBhYmlsaXRpZXN9XFxuYCkpO1xuICAgIGZpcnN0TGluZUNhcGFiaWxpdGllcyA9ICcnO1xuICB9XG4gIGZvciAoY29uc3Qgb2lkIG9mIHNoYWxsb3dzKSB7XG4gICAgcGFja3N0cmVhbS5wdXNoKEdpdFBrdExpbmUuZW5jb2RlKGBzaGFsbG93ICR7b2lkfVxcbmApKTtcbiAgfVxuICBpZiAoZGVwdGggIT09IG51bGwpIHtcbiAgICBwYWNrc3RyZWFtLnB1c2goR2l0UGt0TGluZS5lbmNvZGUoYGRlZXBlbiAke2RlcHRofVxcbmApKTtcbiAgfVxuICBpZiAoc2luY2UgIT09IG51bGwpIHtcbiAgICBwYWNrc3RyZWFtLnB1c2goXG4gICAgICBHaXRQa3RMaW5lLmVuY29kZShgZGVlcGVuLXNpbmNlICR7TWF0aC5mbG9vcihzaW5jZS52YWx1ZU9mKCkgLyAxMDAwKX1cXG5gKVxuICAgICk7XG4gIH1cbiAgZm9yIChjb25zdCBvaWQgb2YgZXhjbHVkZSkge1xuICAgIHBhY2tzdHJlYW0ucHVzaChHaXRQa3RMaW5lLmVuY29kZShgZGVlcGVuLW5vdCAke29pZH1cXG5gKSk7XG4gIH1cbiAgcGFja3N0cmVhbS5wdXNoKEdpdFBrdExpbmUuZmx1c2goKSk7XG4gIGZvciAoY29uc3Qgb2lkIG9mIGhhdmVzKSB7XG4gICAgcGFja3N0cmVhbS5wdXNoKEdpdFBrdExpbmUuZW5jb2RlKGBoYXZlICR7b2lkfVxcbmApKTtcbiAgfVxuICBwYWNrc3RyZWFtLnB1c2goR2l0UGt0TGluZS5lbmNvZGUoYGRvbmVcXG5gKSk7XG4gIHJldHVybiBwYWNrc3RyZWFtXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGZXRjaFJlc3VsdCAtIFRoZSBvYmplY3QgcmV0dXJuZWQgaGFzIHRoZSBmb2xsb3dpbmcgc2NoZW1hOlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBkZWZhdWx0QnJhbmNoIC0gVGhlIGJyYW5jaCB0aGF0IGlzIGNsb25lZCBpZiBubyBicmFuY2ggaXMgc3BlY2lmaWVkXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGZldGNoSGVhZCAtIFRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlIGZldGNoZWQgaGVhZCBjb21taXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gZmV0Y2hIZWFkRGVzY3JpcHRpb24gLSBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIGJyYW5jaCB0aGF0IHdhcyBmZXRjaGVkXG4gKiBAcHJvcGVydHkge09iamVjdDxzdHJpbmcsIHN0cmluZz59IFtoZWFkZXJzXSAtIFRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgcmV0dXJuZWQgYnkgdGhlIGdpdCBzZXJ2ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtwcnVuZWRdIC0gQSBsaXN0IG9mIGJyYW5jaGVzIHRoYXQgd2VyZSBwcnVuZWQsIGlmIHlvdSBwcm92aWRlZCB0aGUgYHBydW5lYCBwYXJhbWV0ZXJcbiAqXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHthbnl9IGFyZ3MuY2FjaGVcbiAqIEBwYXJhbSB7SHR0cENsaWVudH0gYXJncy5odHRwXG4gKiBAcGFyYW0ge1Byb2dyZXNzQ2FsbGJhY2t9IFthcmdzLm9uUHJvZ3Jlc3NdXG4gKiBAcGFyYW0ge01lc3NhZ2VDYWxsYmFja30gW2FyZ3Mub25NZXNzYWdlXVxuICogQHBhcmFtIHtBdXRoQ2FsbGJhY2t9IFthcmdzLm9uQXV0aF1cbiAqIEBwYXJhbSB7QXV0aEZhaWx1cmVDYWxsYmFja30gW2FyZ3Mub25BdXRoRmFpbHVyZV1cbiAqIEBwYXJhbSB7QXV0aFN1Y2Nlc3NDYWxsYmFja30gW2FyZ3Mub25BdXRoU3VjY2Vzc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdpdGRpclxuICogQHBhcmFtIHtzdHJpbmd8dm9pZH0gW2FyZ3MudXJsXVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNvcnNQcm94eV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZWZdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlUmVmXVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlbW90ZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3Muc2luZ2xlQnJhbmNoID0gZmFsc2VdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnRhZ3MgPSBmYWxzZV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5kZXB0aF1cbiAqIEBwYXJhbSB7RGF0ZX0gW2FyZ3Muc2luY2VdXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5leGNsdWRlID0gW11dXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnJlbGF0aXZlID0gZmFsc2VdXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIHN0cmluZz59IFthcmdzLmhlYWRlcnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnBydW5lXVxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5wcnVuZVRhZ3NdXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8RmV0Y2hSZXN1bHQ+fVxuICogQHNlZSBGZXRjaFJlc3VsdFxuICovXG5hc3luYyBmdW5jdGlvbiBfZmV0Y2goe1xuICBmcyxcbiAgY2FjaGUsXG4gIGh0dHAsXG4gIG9uUHJvZ3Jlc3MsXG4gIG9uTWVzc2FnZSxcbiAgb25BdXRoLFxuICBvbkF1dGhTdWNjZXNzLFxuICBvbkF1dGhGYWlsdXJlLFxuICBnaXRkaXIsXG4gIHJlZjogX3JlZixcbiAgcmVtb3RlUmVmOiBfcmVtb3RlUmVmLFxuICByZW1vdGU6IF9yZW1vdGUsXG4gIHVybDogX3VybCxcbiAgY29yc1Byb3h5LFxuICBkZXB0aCA9IG51bGwsXG4gIHNpbmNlID0gbnVsbCxcbiAgZXhjbHVkZSA9IFtdLFxuICByZWxhdGl2ZSA9IGZhbHNlLFxuICB0YWdzID0gZmFsc2UsXG4gIHNpbmdsZUJyYW5jaCA9IGZhbHNlLFxuICBoZWFkZXJzID0ge30sXG4gIHBydW5lID0gZmFsc2UsXG4gIHBydW5lVGFncyA9IGZhbHNlLFxufSkge1xuICBjb25zdCByZWYgPSBfcmVmIHx8IChhd2FpdCBfY3VycmVudEJyYW5jaCh7IGZzLCBnaXRkaXIsIHRlc3Q6IHRydWUgfSkpO1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBHaXRDb25maWdNYW5hZ2VyLmdldCh7IGZzLCBnaXRkaXIgfSk7XG4gIC8vIEZpZ3VyZSBvdXQgd2hhdCByZW1vdGUgdG8gdXNlLlxuICBjb25zdCByZW1vdGUgPVxuICAgIF9yZW1vdGUgfHwgKHJlZiAmJiAoYXdhaXQgY29uZmlnLmdldChgYnJhbmNoLiR7cmVmfS5yZW1vdGVgKSkpIHx8ICdvcmlnaW4nO1xuICAvLyBMb29rdXAgdGhlIFVSTCBmb3IgdGhlIGdpdmVuIHJlbW90ZS5cbiAgY29uc3QgdXJsID0gX3VybCB8fCAoYXdhaXQgY29uZmlnLmdldChgcmVtb3RlLiR7cmVtb3RlfS51cmxgKSk7XG4gIGlmICh0eXBlb2YgdXJsID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBNaXNzaW5nUGFyYW1ldGVyRXJyb3IoJ3JlbW90ZSBPUiB1cmwnKVxuICB9XG4gIC8vIEZpZ3VyZSBvdXQgd2hhdCByZW1vdGUgcmVmIHRvIHVzZS5cbiAgY29uc3QgcmVtb3RlUmVmID1cbiAgICBfcmVtb3RlUmVmIHx8XG4gICAgKHJlZiAmJiAoYXdhaXQgY29uZmlnLmdldChgYnJhbmNoLiR7cmVmfS5tZXJnZWApKSkgfHxcbiAgICBfcmVmIHx8XG4gICAgJ0hFQUQnO1xuXG4gIGlmIChjb3JzUHJveHkgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvcnNQcm94eSA9IGF3YWl0IGNvbmZpZy5nZXQoJ2h0dHAuY29yc1Byb3h5Jyk7XG4gIH1cblxuICBjb25zdCBHaXRSZW1vdGVIVFRQID0gR2l0UmVtb3RlTWFuYWdlci5nZXRSZW1vdGVIZWxwZXJGb3IoeyB1cmwgfSk7XG4gIGNvbnN0IHJlbW90ZUhUVFAgPSBhd2FpdCBHaXRSZW1vdGVIVFRQLmRpc2NvdmVyKHtcbiAgICBodHRwLFxuICAgIG9uQXV0aCxcbiAgICBvbkF1dGhTdWNjZXNzLFxuICAgIG9uQXV0aEZhaWx1cmUsXG4gICAgY29yc1Byb3h5LFxuICAgIHNlcnZpY2U6ICdnaXQtdXBsb2FkLXBhY2snLFxuICAgIHVybCxcbiAgICBoZWFkZXJzLFxuICAgIHByb3RvY29sVmVyc2lvbjogMSxcbiAgfSk7XG4gIGNvbnN0IGF1dGggPSByZW1vdGVIVFRQLmF1dGg7IC8vIGhhY2sgdG8gZ2V0IG5ldyBjcmVkZW50aWFscyBmcm9tIENyZWRlbnRpYWxNYW5hZ2VyIEFQSVxuICBjb25zdCByZW1vdGVSZWZzID0gcmVtb3RlSFRUUC5yZWZzO1xuICAvLyBGb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiBhbiBlbXB0eSByZXBvc2l0b3J5IHdpdGggbm8gcmVmcywgcmV0dXJuIG51bGwuXG4gIGlmIChyZW1vdGVSZWZzLnNpemUgPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVmYXVsdEJyYW5jaDogbnVsbCxcbiAgICAgIGZldGNoSGVhZDogbnVsbCxcbiAgICAgIGZldGNoSGVhZERlc2NyaXB0aW9uOiBudWxsLFxuICAgIH1cbiAgfVxuICAvLyBDaGVjayB0aGF0IHRoZSByZW1vdGUgc3VwcG9ydHMgdGhlIHJlcXVlc3RlZCBmZWF0dXJlc1xuICBpZiAoZGVwdGggIT09IG51bGwgJiYgIXJlbW90ZUhUVFAuY2FwYWJpbGl0aWVzLmhhcygnc2hhbGxvdycpKSB7XG4gICAgdGhyb3cgbmV3IFJlbW90ZUNhcGFiaWxpdHlFcnJvcignc2hhbGxvdycsICdkZXB0aCcpXG4gIH1cbiAgaWYgKHNpbmNlICE9PSBudWxsICYmICFyZW1vdGVIVFRQLmNhcGFiaWxpdGllcy5oYXMoJ2RlZXBlbi1zaW5jZScpKSB7XG4gICAgdGhyb3cgbmV3IFJlbW90ZUNhcGFiaWxpdHlFcnJvcignZGVlcGVuLXNpbmNlJywgJ3NpbmNlJylcbiAgfVxuICBpZiAoZXhjbHVkZS5sZW5ndGggPiAwICYmICFyZW1vdGVIVFRQLmNhcGFiaWxpdGllcy5oYXMoJ2RlZXBlbi1ub3QnKSkge1xuICAgIHRocm93IG5ldyBSZW1vdGVDYXBhYmlsaXR5RXJyb3IoJ2RlZXBlbi1ub3QnLCAnZXhjbHVkZScpXG4gIH1cbiAgaWYgKHJlbGF0aXZlID09PSB0cnVlICYmICFyZW1vdGVIVFRQLmNhcGFiaWxpdGllcy5oYXMoJ2RlZXBlbi1yZWxhdGl2ZScpKSB7XG4gICAgdGhyb3cgbmV3IFJlbW90ZUNhcGFiaWxpdHlFcnJvcignZGVlcGVuLXJlbGF0aXZlJywgJ3JlbGF0aXZlJylcbiAgfVxuICAvLyBGaWd1cmUgb3V0IHRoZSBTSEEgZm9yIHRoZSByZXF1ZXN0ZWQgcmVmXG4gIGNvbnN0IHsgb2lkLCBmdWxscmVmIH0gPSBHaXRSZWZNYW5hZ2VyLnJlc29sdmVBZ2FpbnN0TWFwKHtcbiAgICByZWY6IHJlbW90ZVJlZixcbiAgICBtYXA6IHJlbW90ZVJlZnMsXG4gIH0pO1xuICAvLyBGaWx0ZXIgb3V0IHJlZnMgd2Ugd2FudCB0byBpZ25vcmU6IG9ubHkga2VlcCByZWYgd2UncmUgY2xvbmluZywgSEVBRCwgYnJhbmNoZXMsIGFuZCB0YWdzIChpZiB3ZSdyZSBrZWVwaW5nIHRoZW0pXG4gIGZvciAoY29uc3QgcmVtb3RlUmVmIG9mIHJlbW90ZVJlZnMua2V5cygpKSB7XG4gICAgaWYgKFxuICAgICAgcmVtb3RlUmVmID09PSBmdWxscmVmIHx8XG4gICAgICByZW1vdGVSZWYgPT09ICdIRUFEJyB8fFxuICAgICAgcmVtb3RlUmVmLnN0YXJ0c1dpdGgoJ3JlZnMvaGVhZHMvJykgfHxcbiAgICAgICh0YWdzICYmIHJlbW90ZVJlZi5zdGFydHNXaXRoKCdyZWZzL3RhZ3MvJykpXG4gICAgKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICByZW1vdGVSZWZzLmRlbGV0ZShyZW1vdGVSZWYpO1xuICB9XG4gIC8vIEFzc2VtYmxlIHRoZSBhcHBsaWNhdGlvbi94LWdpdC11cGxvYWQtcGFjay1yZXF1ZXN0XG4gIGNvbnN0IGNhcGFiaWxpdGllcyA9IGZpbHRlckNhcGFiaWxpdGllcyhcbiAgICBbLi4ucmVtb3RlSFRUUC5jYXBhYmlsaXRpZXNdLFxuICAgIFtcbiAgICAgICdtdWx0aV9hY2tfZGV0YWlsZWQnLFxuICAgICAgJ25vLWRvbmUnLFxuICAgICAgJ3NpZGUtYmFuZC02NGsnLFxuICAgICAgLy8gTm90ZTogSSByZW1vdmVkICd0aGluLXBhY2snIG9wdGlvbiBzaW5jZSBvdXIgY29kZSBkb2Vzbid0IFwiZmF0dGVuXCIgcGFja2ZpbGVzLFxuICAgICAgLy8gd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggZ2l0LiBJdCB3YXMgdGhlIGNhdXNlIG9mIG15c3RlcmlvdXNcbiAgICAgIC8vICdmYXRhbDogcGFjayBoYXMgW3hdIHVucmVzb2x2ZWQgZGVsdGFzJyBlcnJvcnMgdGhhdCBwbGFndWVkIHVzIGZvciBzb21lIHRpbWUuXG4gICAgICAvLyBpc29tb3JwaGljLWdpdCBpcyBwZXJmZWN0bHkgaGFwcHkgd2l0aCB0aGluIHBhY2tmaWxlcyBpbiAuZ2l0L29iamVjdHMvcGFjayBidXRcbiAgICAgIC8vIGNhbm9uaWNhbCBnaXQgaXQgdHVybnMgb3V0IGlzIE5PVC5cbiAgICAgICdvZnMtZGVsdGEnLFxuICAgICAgYGFnZW50PSR7cGtnLmFnZW50fWAsXG4gICAgXVxuICApO1xuICBpZiAocmVsYXRpdmUpIGNhcGFiaWxpdGllcy5wdXNoKCdkZWVwZW4tcmVsYXRpdmUnKTtcbiAgLy8gU3RhcnQgZmlndXJpbmcgb3V0IHdoaWNoIG9pZHMgZnJvbSB0aGUgcmVtb3RlIHdlIHdhbnQgdG8gcmVxdWVzdFxuICBjb25zdCB3YW50cyA9IHNpbmdsZUJyYW5jaCA/IFtvaWRdIDogcmVtb3RlUmVmcy52YWx1ZXMoKTtcbiAgLy8gQ29tZSB1cCB3aXRoIGEgcmVhc29uYWJsZSBsaXN0IG9mIG9pZHMgdG8gdGVsbCB0aGUgcmVtb3RlIHdlIGFscmVhZHkgaGF2ZVxuICAvLyAocHJlZmVyYWJseSBvaWRzIHRoYXQgYXJlIGNsb3NlIGFuY2VzdG9ycyBvZiB0aGUgYnJhbmNoIGhlYWRzIHdlJ3JlIGZldGNoaW5nKVxuICBjb25zdCBoYXZlUmVmcyA9IHNpbmdsZUJyYW5jaFxuICAgID8gW3JlZl1cbiAgICA6IGF3YWl0IEdpdFJlZk1hbmFnZXIubGlzdFJlZnMoe1xuICAgICAgICBmcyxcbiAgICAgICAgZ2l0ZGlyLFxuICAgICAgICBmaWxlcGF0aDogYHJlZnNgLFxuICAgICAgfSk7XG4gIGxldCBoYXZlcyA9IFtdO1xuICBmb3IgKGxldCByZWYgb2YgaGF2ZVJlZnMpIHtcbiAgICB0cnkge1xuICAgICAgcmVmID0gYXdhaXQgR2l0UmVmTWFuYWdlci5leHBhbmQoeyBmcywgZ2l0ZGlyLCByZWYgfSk7XG4gICAgICBjb25zdCBvaWQgPSBhd2FpdCBHaXRSZWZNYW5hZ2VyLnJlc29sdmUoeyBmcywgZ2l0ZGlyLCByZWYgfSk7XG4gICAgICBpZiAoYXdhaXQgaGFzT2JqZWN0KHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCB9KSkge1xuICAgICAgICBoYXZlcy5wdXNoKG9pZCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7fVxuICB9XG4gIGhhdmVzID0gWy4uLm5ldyBTZXQoaGF2ZXMpXTtcbiAgY29uc3Qgb2lkcyA9IGF3YWl0IEdpdFNoYWxsb3dNYW5hZ2VyLnJlYWQoeyBmcywgZ2l0ZGlyIH0pO1xuICBjb25zdCBzaGFsbG93cyA9IHJlbW90ZUhUVFAuY2FwYWJpbGl0aWVzLmhhcygnc2hhbGxvdycpID8gWy4uLm9pZHNdIDogW107XG4gIGNvbnN0IHBhY2tzdHJlYW0gPSB3cml0ZVVwbG9hZFBhY2tSZXF1ZXN0KHtcbiAgICBjYXBhYmlsaXRpZXMsXG4gICAgd2FudHMsXG4gICAgaGF2ZXMsXG4gICAgc2hhbGxvd3MsXG4gICAgZGVwdGgsXG4gICAgc2luY2UsXG4gICAgZXhjbHVkZSxcbiAgfSk7XG4gIC8vIENvZGVDb21taXQgd2lsbCBoYW5nIHVwIGlmIHdlIGRvbid0IHNlbmQgYSBDb250ZW50LUxlbmd0aCBoZWFkZXJcbiAgLy8gc28gd2UgY2FuJ3Qgc3RyZWFtIHRoZSBib2R5LlxuICBjb25zdCBwYWNrYnVmZmVyID0gQnVmZmVyLmZyb20oYXdhaXQgY29sbGVjdChwYWNrc3RyZWFtKSk7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IEdpdFJlbW90ZUhUVFAuY29ubmVjdCh7XG4gICAgaHR0cCxcbiAgICBvblByb2dyZXNzLFxuICAgIGNvcnNQcm94eSxcbiAgICBzZXJ2aWNlOiAnZ2l0LXVwbG9hZC1wYWNrJyxcbiAgICB1cmwsXG4gICAgYXV0aCxcbiAgICBib2R5OiBbcGFja2J1ZmZlcl0sXG4gICAgaGVhZGVycyxcbiAgfSk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcGFyc2VVcGxvYWRQYWNrUmVzcG9uc2UocmF3LmJvZHkpO1xuICBpZiAocmF3LmhlYWRlcnMpIHtcbiAgICByZXNwb25zZS5oZWFkZXJzID0gcmF3LmhlYWRlcnM7XG4gIH1cbiAgLy8gQXBwbHkgYWxsIHRoZSAnc2hhbGxvdycgYW5kICd1bnNoYWxsb3cnIGNvbW1hbmRzXG4gIGZvciAoY29uc3Qgb2lkIG9mIHJlc3BvbnNlLnNoYWxsb3dzKSB7XG4gICAgaWYgKCFvaWRzLmhhcyhvaWQpKSB7XG4gICAgICAvLyB0aGlzIGlzIGluIGEgdHJ5L2NhdGNoIG1vc3RseSBiZWNhdXNlIG15IG9sZCB0ZXN0IGZpeHR1cmVzIGFyZSBtaXNzaW5nIG9iamVjdHNcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIHNlcnZlciBzYXlzIGl0J3Mgc2hhbGxvdywgYnV0IGRvIHdlIGhhdmUgdGhlIHBhcmVudHM/XG4gICAgICAgIGNvbnN0IHsgb2JqZWN0IH0gPSBhd2FpdCBfcmVhZE9iamVjdCh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSk7XG4gICAgICAgIGNvbnN0IGNvbW1pdCA9IG5ldyBHaXRDb21taXQob2JqZWN0KTtcbiAgICAgICAgY29uc3QgaGFzUGFyZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGNvbW1pdFxuICAgICAgICAgICAgLmhlYWRlcnMoKVxuICAgICAgICAgICAgLnBhcmVudC5tYXAob2lkID0+IGhhc09iamVjdCh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSkpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGhhdmVBbGxQYXJlbnRzID1cbiAgICAgICAgICBoYXNQYXJlbnRzLmxlbmd0aCA9PT0gMCB8fCBoYXNQYXJlbnRzLmV2ZXJ5KGhhcyA9PiBoYXMpO1xuICAgICAgICBpZiAoIWhhdmVBbGxQYXJlbnRzKSB7XG4gICAgICAgICAgb2lkcy5hZGQob2lkKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIG9pZHMuYWRkKG9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3Qgb2lkIG9mIHJlc3BvbnNlLnVuc2hhbGxvd3MpIHtcbiAgICBvaWRzLmRlbGV0ZShvaWQpO1xuICB9XG4gIGF3YWl0IEdpdFNoYWxsb3dNYW5hZ2VyLndyaXRlKHsgZnMsIGdpdGRpciwgb2lkcyB9KTtcbiAgLy8gVXBkYXRlIGxvY2FsIHJlbW90ZSByZWZzXG4gIGlmIChzaW5nbGVCcmFuY2gpIHtcbiAgICBjb25zdCByZWZzID0gbmV3IE1hcChbW2Z1bGxyZWYsIG9pZF1dKTtcbiAgICAvLyBCdXQgd2FpdCwgbWF5YmUgaXQgd2FzIGEgc3ltcmVmLCBsaWtlICdIRUFEJyFcbiAgICAvLyBXZSBuZWVkIHRvIHNhdmUgYWxsIHRoZSByZWZzIGluIHRoZSBzeW1yZWYgY2hhaW4gKHNpZ2gpLlxuICAgIGNvbnN0IHN5bXJlZnMgPSBuZXcgTWFwKCk7XG4gICAgbGV0IGJhaWwgPSAxMDtcbiAgICBsZXQga2V5ID0gZnVsbHJlZjtcbiAgICB3aGlsZSAoYmFpbC0tKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHJlbW90ZUhUVFAuc3ltcmVmcy5nZXQoa2V5KTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBicmVha1xuICAgICAgc3ltcmVmcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICBrZXkgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gZmluYWwgdmFsdWUgbXVzdCBub3QgYmUgYSBzeW1yZWYgYnV0IGEgcmVhbCByZWZcbiAgICBjb25zdCByZWFsUmVmID0gcmVtb3RlUmVmcy5nZXQoa2V5KTtcbiAgICAvLyBUaGVyZSBtYXkgYmUgbm8gcmVmIGF0IGFsbCBpZiB3ZSd2ZSBmZXRjaGVkIGEgc3BlY2lmaWMgY29tbWl0IGhhc2hcbiAgICBpZiAocmVhbFJlZikge1xuICAgICAgcmVmcy5zZXQoa2V5LCByZWFsUmVmKTtcbiAgICB9XG4gICAgY29uc3QgeyBwcnVuZWQgfSA9IGF3YWl0IEdpdFJlZk1hbmFnZXIudXBkYXRlUmVtb3RlUmVmcyh7XG4gICAgICBmcyxcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlbW90ZSxcbiAgICAgIHJlZnMsXG4gICAgICBzeW1yZWZzLFxuICAgICAgdGFncyxcbiAgICAgIHBydW5lLFxuICAgIH0pO1xuICAgIGlmIChwcnVuZSkge1xuICAgICAgcmVzcG9uc2UucHJ1bmVkID0gcHJ1bmVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHBydW5lZCB9ID0gYXdhaXQgR2l0UmVmTWFuYWdlci51cGRhdGVSZW1vdGVSZWZzKHtcbiAgICAgIGZzLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVtb3RlLFxuICAgICAgcmVmczogcmVtb3RlUmVmcyxcbiAgICAgIHN5bXJlZnM6IHJlbW90ZUhUVFAuc3ltcmVmcyxcbiAgICAgIHRhZ3MsXG4gICAgICBwcnVuZSxcbiAgICAgIHBydW5lVGFncyxcbiAgICB9KTtcbiAgICBpZiAocHJ1bmUpIHtcbiAgICAgIHJlc3BvbnNlLnBydW5lZCA9IHBydW5lZDtcbiAgICB9XG4gIH1cbiAgLy8gV2UgbmVlZCB0aGlzIHZhbHVlIGxhdGVyIGZvciB0aGUgYGNsb25lYCBjb21tYW5kLlxuICByZXNwb25zZS5IRUFEID0gcmVtb3RlSFRUUC5zeW1yZWZzLmdldCgnSEVBRCcpO1xuICAvLyBBV1MgQ29kZUNvbW1pdCBkb2Vzbid0IGxpc3QgSEVBRCBhcyBhIHN5bXJlZiwgYnV0IHdlIGNhbiByZXZlcnNlIGVuZ2luZWVyIGl0XG4gIC8vIEZpbmQgdGhlIFNIQSBvZiB0aGUgYnJhbmNoIGNhbGxlZCBIRUFEXG4gIGlmIChyZXNwb25zZS5IRUFEID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7IG9pZCB9ID0gR2l0UmVmTWFuYWdlci5yZXNvbHZlQWdhaW5zdE1hcCh7XG4gICAgICByZWY6ICdIRUFEJyxcbiAgICAgIG1hcDogcmVtb3RlUmVmcyxcbiAgICB9KTtcbiAgICAvLyBVc2UgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGJyYW5jaCB0aGF0J3Mgbm90IGNhbGxlZCBIRUFEIHRoYXQgaGFzXG4gICAgLy8gdGhlIHNhbWUgU0hBIGFzIHRoZSBicmFuY2ggY2FsbGVkIEhFQUQuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVtb3RlUmVmcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChrZXkgIT09ICdIRUFEJyAmJiB2YWx1ZSA9PT0gb2lkKSB7XG4gICAgICAgIHJlc3BvbnNlLkhFQUQgPSBrZXk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IG5vdW4gPSBmdWxscmVmLnN0YXJ0c1dpdGgoJ3JlZnMvdGFncycpID8gJ3RhZycgOiAnYnJhbmNoJztcbiAgcmVzcG9uc2UuRkVUQ0hfSEVBRCA9IHtcbiAgICBvaWQsXG4gICAgZGVzY3JpcHRpb246IGAke25vdW59ICcke2FiYnJldmlhdGVSZWYoZnVsbHJlZil9JyBvZiAke3VybH1gLFxuICB9O1xuXG4gIGlmIChvblByb2dyZXNzIHx8IG9uTWVzc2FnZSkge1xuICAgIGNvbnN0IGxpbmVzID0gc3BsaXRMaW5lcyhyZXNwb25zZS5wcm9ncmVzcyk7XG4gICAgZm9yQXdhaXQobGluZXMsIGFzeW5jIGxpbmUgPT4ge1xuICAgICAgaWYgKG9uTWVzc2FnZSkgYXdhaXQgb25NZXNzYWdlKGxpbmUpO1xuICAgICAgaWYgKG9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goLyhbXjpdKikuKlxcKChcXGQrPylcXC8oXFxkKz8pXFwpLyk7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgYXdhaXQgb25Qcm9ncmVzcyh7XG4gICAgICAgICAgICBwaGFzZTogbWF0Y2hlc1sxXS50cmltKCksXG4gICAgICAgICAgICBsb2FkZWQ6IHBhcnNlSW50KG1hdGNoZXNbMl0sIDEwKSxcbiAgICAgICAgICAgIHRvdGFsOiBwYXJzZUludChtYXRjaGVzWzNdLCAxMCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBjb25zdCBwYWNrZmlsZSA9IEJ1ZmZlci5mcm9tKGF3YWl0IGNvbGxlY3QocmVzcG9uc2UucGFja2ZpbGUpKTtcbiAgaWYgKHJhdy5ib2R5LmVycm9yKSB0aHJvdyByYXcuYm9keS5lcnJvclxuICBjb25zdCBwYWNrZmlsZVNoYSA9IHBhY2tmaWxlLnNsaWNlKC0yMCkudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCByZXMgPSB7XG4gICAgZGVmYXVsdEJyYW5jaDogcmVzcG9uc2UuSEVBRCxcbiAgICBmZXRjaEhlYWQ6IHJlc3BvbnNlLkZFVENIX0hFQUQub2lkLFxuICAgIGZldGNoSGVhZERlc2NyaXB0aW9uOiByZXNwb25zZS5GRVRDSF9IRUFELmRlc2NyaXB0aW9uLFxuICB9O1xuICBpZiAocmVzcG9uc2UuaGVhZGVycykge1xuICAgIHJlcy5oZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgfVxuICBpZiAocHJ1bmUpIHtcbiAgICByZXMucHJ1bmVkID0gcmVzcG9uc2UucHJ1bmVkO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBxdWljayBmaXggZm9yIHRoZSBlbXB0eSAuZ2l0L29iamVjdHMvcGFjay9wYWNrLS5wYWNrIGZpbGUgZXJyb3IsXG4gIC8vIHdoaWNoIGR1ZSB0byB0aGUgd2F5IGBnaXQtbGlzdC1wYWNrYCB3b3JrcyBjYXVzZXMgdGhlIHByb2dyYW0gdG8gaGFuZyB3aGVuIGl0IHRyaWVzIHRvIHJlYWQgaXQuXG4gIC8vIFRPRE86IExvbmdlciB0ZXJtLCB3ZSBzaG91bGQgYWN0dWFsbHk6XG4gIC8vIGEpIE5PVCBjb25jYXRlbmF0ZSB0aGUgZW50aXJlIHBhY2tmaWxlIGludG8gbWVtb3J5IChsaW5lIDc4KSxcbiAgLy8gYikgY29tcHV0ZSB0aGUgU0hBIG9mIHRoZSBzdHJlYW0gZXhjZXB0IGZvciB0aGUgbGFzdCAyMCBieXRlcywgdXNpbmcgdGhlIHNhbWUgbGlicmFyeSB1c2VkIGluIHB1c2guanMsIGFuZFxuICAvLyBjKSBjb21wYXJlIHRoZSBjb21wdXRlZCBTSEEgd2l0aCB0aGUgbGFzdCAyMCBieXRlcyBvZiB0aGUgc3RyZWFtIGJlZm9yZSBzYXZpbmcgdG8gZGlzaywgYW5kIHRocm93aW5nIGEgXCJwYWNrZmlsZSBnb3QgY29ycnVwdGVkIGR1cmluZyBkb3dubG9hZFwiIGVycm9yIGlmIHRoZSBTSEEgZG9lc24ndCBtYXRjaC5cbiAgaWYgKHBhY2tmaWxlU2hhICE9PSAnJyAmJiAhZW1wdHlQYWNrZmlsZShwYWNrZmlsZSkpIHtcbiAgICByZXMucGFja2ZpbGUgPSBgb2JqZWN0cy9wYWNrL3BhY2stJHtwYWNrZmlsZVNoYX0ucGFja2A7XG4gICAgY29uc3QgZnVsbHBhdGggPSBqb2luKGdpdGRpciwgcmVzLnBhY2tmaWxlKTtcbiAgICBhd2FpdCBmcy53cml0ZShmdWxscGF0aCwgcGFja2ZpbGUpO1xuICAgIGNvbnN0IGdldEV4dGVybmFsUmVmRGVsdGEgPSBvaWQgPT4gX3JlYWRPYmplY3QoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pO1xuICAgIGNvbnN0IGlkeCA9IGF3YWl0IEdpdFBhY2tJbmRleC5mcm9tUGFjayh7XG4gICAgICBwYWNrOiBwYWNrZmlsZSxcbiAgICAgIGdldEV4dGVybmFsUmVmRGVsdGEsXG4gICAgICBvblByb2dyZXNzLFxuICAgIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlKGZ1bGxwYXRoLnJlcGxhY2UoL1xcLnBhY2skLywgJy5pZHgnKSwgYXdhaXQgaWR4LnRvQnVmZmVyKCkpO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyByZXBvc2l0b3J5XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyXVxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5iYXJlID0gZmFsc2VdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGVmYXVsdEJyYW5jaCA9ICdtYXN0ZXInXVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9pbml0KHtcbiAgZnMsXG4gIGJhcmUgPSBmYWxzZSxcbiAgZGlyLFxuICBnaXRkaXIgPSBiYXJlID8gZGlyIDogam9pbihkaXIsICcuZ2l0JyksXG4gIGRlZmF1bHRCcmFuY2ggPSAnbWFzdGVyJyxcbn0pIHtcbiAgLy8gRG9uJ3Qgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGNvbmZpZ1xuICBpZiAoYXdhaXQgZnMuZXhpc3RzKGdpdGRpciArICcvY29uZmlnJykpIHJldHVyblxuXG4gIGxldCBmb2xkZXJzID0gW1xuICAgICdob29rcycsXG4gICAgJ2luZm8nLFxuICAgICdvYmplY3RzL2luZm8nLFxuICAgICdvYmplY3RzL3BhY2snLFxuICAgICdyZWZzL2hlYWRzJyxcbiAgICAncmVmcy90YWdzJyxcbiAgXTtcbiAgZm9sZGVycyA9IGZvbGRlcnMubWFwKGRpciA9PiBnaXRkaXIgKyAnLycgKyBkaXIpO1xuICBmb3IgKGNvbnN0IGZvbGRlciBvZiBmb2xkZXJzKSB7XG4gICAgYXdhaXQgZnMubWtkaXIoZm9sZGVyKTtcbiAgfVxuXG4gIGF3YWl0IGZzLndyaXRlKFxuICAgIGdpdGRpciArICcvY29uZmlnJyxcbiAgICAnW2NvcmVdXFxuJyArXG4gICAgICAnXFx0cmVwb3NpdG9yeWZvcm1hdHZlcnNpb24gPSAwXFxuJyArXG4gICAgICAnXFx0ZmlsZW1vZGUgPSBmYWxzZVxcbicgK1xuICAgICAgYFxcdGJhcmUgPSAke2JhcmV9XFxuYCArXG4gICAgICAoYmFyZSA/ICcnIDogJ1xcdGxvZ2FsbHJlZnVwZGF0ZXMgPSB0cnVlXFxuJykgK1xuICAgICAgJ1xcdHN5bWxpbmtzID0gZmFsc2VcXG4nICtcbiAgICAgICdcXHRpZ25vcmVjYXNlID0gdHJ1ZVxcbidcbiAgKTtcbiAgYXdhaXQgZnMud3JpdGUoZ2l0ZGlyICsgJy9IRUFEJywgYHJlZjogcmVmcy9oZWFkcy8ke2RlZmF1bHRCcmFuY2h9XFxuYCk7XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncy5jYWNoZVxuICogQHBhcmFtIHtIdHRwQ2xpZW50fSBhcmdzLmh0dHBcbiAqIEBwYXJhbSB7UHJvZ3Jlc3NDYWxsYmFja30gW2FyZ3Mub25Qcm9ncmVzc11cbiAqIEBwYXJhbSB7TWVzc2FnZUNhbGxiYWNrfSBbYXJncy5vbk1lc3NhZ2VdXG4gKiBAcGFyYW0ge0F1dGhDYWxsYmFja30gW2FyZ3Mub25BdXRoXVxuICogQHBhcmFtIHtBdXRoRmFpbHVyZUNhbGxiYWNrfSBbYXJncy5vbkF1dGhGYWlsdXJlXVxuICogQHBhcmFtIHtBdXRoU3VjY2Vzc0NhbGxiYWNrfSBbYXJncy5vbkF1dGhTdWNjZXNzXVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdpdGRpclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudXJsXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb3JzUHJveHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlZlxuICogQHBhcmFtIHtib29sZWFufSBhcmdzLnNpbmdsZUJyYW5jaFxuICogQHBhcmFtIHtib29sZWFufSBhcmdzLm5vQ2hlY2tvdXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJncy5ub1RhZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlbW90ZVxuICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuZGVwdGhcbiAqIEBwYXJhbSB7RGF0ZX0gYXJncy5zaW5jZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5leGNsdWRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3MucmVsYXRpdmVcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gYXJncy5oZWFkZXJzXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aGVuIGNsb25lIGNvbXBsZXRlc1xuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2Nsb25lKHtcbiAgZnMsXG4gIGNhY2hlLFxuICBodHRwLFxuICBvblByb2dyZXNzLFxuICBvbk1lc3NhZ2UsXG4gIG9uQXV0aCxcbiAgb25BdXRoU3VjY2VzcyxcbiAgb25BdXRoRmFpbHVyZSxcbiAgZGlyLFxuICBnaXRkaXIsXG4gIHVybCxcbiAgY29yc1Byb3h5LFxuICByZWYsXG4gIHJlbW90ZSxcbiAgZGVwdGgsXG4gIHNpbmNlLFxuICBleGNsdWRlLFxuICByZWxhdGl2ZSxcbiAgc2luZ2xlQnJhbmNoLFxuICBub0NoZWNrb3V0LFxuICBub1RhZ3MsXG4gIGhlYWRlcnMsXG59KSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgX2luaXQoeyBmcywgZ2l0ZGlyIH0pO1xuICAgIGF3YWl0IF9hZGRSZW1vdGUoeyBmcywgZ2l0ZGlyLCByZW1vdGUsIHVybCwgZm9yY2U6IGZhbHNlIH0pO1xuICAgIGlmIChjb3JzUHJveHkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuZ2V0KHsgZnMsIGdpdGRpciB9KTtcbiAgICAgIGF3YWl0IGNvbmZpZy5zZXQoYGh0dHAuY29yc1Byb3h5YCwgY29yc1Byb3h5KTtcbiAgICAgIGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuc2F2ZSh7IGZzLCBnaXRkaXIsIGNvbmZpZyB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBkZWZhdWx0QnJhbmNoLCBmZXRjaEhlYWQgfSA9IGF3YWl0IF9mZXRjaCh7XG4gICAgICBmcyxcbiAgICAgIGNhY2hlLFxuICAgICAgaHR0cCxcbiAgICAgIG9uUHJvZ3Jlc3MsXG4gICAgICBvbk1lc3NhZ2UsXG4gICAgICBvbkF1dGgsXG4gICAgICBvbkF1dGhTdWNjZXNzLFxuICAgICAgb25BdXRoRmFpbHVyZSxcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlZixcbiAgICAgIHJlbW90ZSxcbiAgICAgIGNvcnNQcm94eSxcbiAgICAgIGRlcHRoLFxuICAgICAgc2luY2UsXG4gICAgICBleGNsdWRlLFxuICAgICAgcmVsYXRpdmUsXG4gICAgICBzaW5nbGVCcmFuY2gsXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFnczogIW5vVGFncyxcbiAgICB9KTtcbiAgICBpZiAoZmV0Y2hIZWFkID09PSBudWxsKSByZXR1cm5cbiAgICByZWYgPSByZWYgfHwgZGVmYXVsdEJyYW5jaDtcbiAgICByZWYgPSByZWYucmVwbGFjZSgncmVmcy9oZWFkcy8nLCAnJyk7XG4gICAgLy8gQ2hlY2tvdXQgdGhhdCBicmFuY2hcbiAgICBhd2FpdCBfY2hlY2tvdXQoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIG9uUHJvZ3Jlc3MsXG4gICAgICBkaXIsXG4gICAgICBnaXRkaXIsXG4gICAgICByZWYsXG4gICAgICByZW1vdGUsXG4gICAgICBub0NoZWNrb3V0LFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBSZW1vdmUgcGFydGlhbCBsb2NhbCByZXBvc2l0b3J5LCBzZWUgIzEyODNcbiAgICAvLyBJZ25vcmUgYW55IGVycm9yIGFzIHdlIGFyZSBhbHJlYWR5IGZhaWxpbmcuXG4gICAgLy8gVGhlIGNhdGNoIGlzIG5lY2Vzc2FyeSBzbyB0aGUgb3JpZ2luYWwgZXJyb3IgaXMgbm90IG1hc2tlZC5cbiAgICBhd2FpdCBmc1xuICAgICAgLnJtZGlyKGdpdGRpciwgeyByZWN1cnNpdmU6IHRydWUsIG1heFJldHJpZXM6IDEwIH0pXG4gICAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBDbG9uZSBhIHJlcG9zaXRvcnlcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7SHR0cENsaWVudH0gYXJncy5odHRwIC0gYW4gSFRUUCBjbGllbnRcbiAqIEBwYXJhbSB7UHJvZ3Jlc3NDYWxsYmFja30gW2FyZ3Mub25Qcm9ncmVzc10gLSBvcHRpb25hbCBwcm9ncmVzcyBldmVudCBjYWxsYmFja1xuICogQHBhcmFtIHtNZXNzYWdlQ2FsbGJhY2t9IFthcmdzLm9uTWVzc2FnZV0gLSBvcHRpb25hbCBtZXNzYWdlIGV2ZW50IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0F1dGhDYWxsYmFja30gW2FyZ3Mub25BdXRoXSAtIG9wdGlvbmFsIGF1dGggZmlsbCBjYWxsYmFja1xuICogQHBhcmFtIHtBdXRoRmFpbHVyZUNhbGxiYWNrfSBbYXJncy5vbkF1dGhGYWlsdXJlXSAtIG9wdGlvbmFsIGF1dGggcmVqZWN0ZWQgY2FsbGJhY2tcbiAqIEBwYXJhbSB7QXV0aFN1Y2Nlc3NDYWxsYmFja30gW2FyZ3Mub25BdXRoU3VjY2Vzc10gLSBvcHRpb25hbCBhdXRoIGFwcHJvdmVkIGNhbGxiYWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5kaXIgLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudXJsIC0gVGhlIFVSTCBvZiB0aGUgcmVtb3RlIHJlcG9zaXRvcnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb3JzUHJveHldIC0gT3B0aW9uYWwgW0NPUlMgcHJveHldKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS8lNDBpc29tb3JwaGljLWdpdC9jb3JzLXByb3h5KS4gVmFsdWUgaXMgc3RvcmVkIGluIHRoZSBnaXQgY29uZmlnIGZpbGUgZm9yIHRoYXQgcmVwby5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZWZdIC0gV2hpY2ggYnJhbmNoIHRvIGNoZWNrb3V0LiBCeSBkZWZhdWx0IHRoaXMgaXMgdGhlIGRlc2lnbmF0ZWQgXCJtYWluIGJyYW5jaFwiIG9mIHRoZSByZXBvc2l0b3J5LlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5zaW5nbGVCcmFuY2ggPSBmYWxzZV0gLSBJbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGZldGNoaW5nIGFsbCB0aGUgYnJhbmNoZXMsIG9ubHkgZmV0Y2ggYSBzaW5nbGUgYnJhbmNoLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5ub0NoZWNrb3V0ID0gZmFsc2VdIC0gSWYgdHJ1ZSwgY2xvbmUgd2lsbCBvbmx5IGZldGNoIHRoZSByZXBvLCBub3QgY2hlY2sgb3V0IGEgYnJhbmNoLiBTa2lwcGluZyBjaGVja291dCBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lIG5vcm1hbGx5IHNwZW50IHdyaXRpbmcgZmlsZXMgdG8gZGlzay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3Mubm9UYWdzID0gZmFsc2VdIC0gQnkgZGVmYXVsdCBjbG9uZSB3aWxsIGZldGNoIGFsbCB0YWdzLiBgbm9UYWdzYCBkaXNhYmxlcyB0aGF0IGJlaGF2aW9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlbW90ZSA9ICdvcmlnaW4nXSAtIFdoYXQgdG8gbmFtZSB0aGUgcmVtb3RlIHRoYXQgaXMgY3JlYXRlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5kZXB0aF0gLSBJbnRlZ2VyLiBEZXRlcm1pbmVzIGhvdyBtdWNoIG9mIHRoZSBnaXQgcmVwb3NpdG9yeSdzIGhpc3RvcnkgdG8gcmV0cmlldmVcbiAqIEBwYXJhbSB7RGF0ZX0gW2FyZ3Muc2luY2VdIC0gT25seSBmZXRjaCBjb21taXRzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUuIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBkZXB0aGAuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5leGNsdWRlID0gW11dIC0gQSBsaXN0IG9mIGJyYW5jaGVzIG9yIHRhZ3MuIEluc3RydWN0cyB0aGUgcmVtb3RlIHNlcnZlciBub3QgdG8gc2VuZCB1cyBhbnkgY29tbWl0cyByZWFjaGFibGUgZnJvbSB0aGVzZSByZWZzLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5yZWxhdGl2ZSA9IGZhbHNlXSAtIENoYW5nZXMgdGhlIG1lYW5pbmcgb2YgYGRlcHRoYCB0byBiZSBtZWFzdXJlZCBmcm9tIHRoZSBjdXJyZW50IHNoYWxsb3cgZGVwdGggcmF0aGVyIHRoYW4gZnJvbSB0aGUgYnJhbmNoIHRpcC5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuaGVhZGVycyA9IHt9XSAtIEFkZGl0aW9uYWwgaGVhZGVycyB0byBpbmNsdWRlIGluIEhUVFAgcmVxdWVzdHMsIHNpbWlsYXIgdG8gZ2l0J3MgYGV4dHJhSGVhZGVyYCBjb25maWdcbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2hlbiBjbG9uZSBjb21wbGV0ZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYXdhaXQgZ2l0LmNsb25lKHtcbiAqICAgZnMsXG4gKiAgIGh0dHAsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIGNvcnNQcm94eTogJ2h0dHBzOi8vY29ycy5pc29tb3JwaGljLWdpdC5vcmcnLFxuICogICB1cmw6ICdodHRwczovL2dpdGh1Yi5jb20vaXNvbW9ycGhpYy1naXQvaXNvbW9ycGhpYy1naXQnLFxuICogICBzaW5nbGVCcmFuY2g6IHRydWUsXG4gKiAgIGRlcHRoOiAxXG4gKiB9KVxuICogY29uc29sZS5sb2coJ2RvbmUnKVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xvbmUoe1xuICBmcyxcbiAgaHR0cCxcbiAgb25Qcm9ncmVzcyxcbiAgb25NZXNzYWdlLFxuICBvbkF1dGgsXG4gIG9uQXV0aFN1Y2Nlc3MsXG4gIG9uQXV0aEZhaWx1cmUsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIHVybCxcbiAgY29yc1Byb3h5ID0gdW5kZWZpbmVkLFxuICByZWYgPSB1bmRlZmluZWQsXG4gIHJlbW90ZSA9ICdvcmlnaW4nLFxuICBkZXB0aCA9IHVuZGVmaW5lZCxcbiAgc2luY2UgPSB1bmRlZmluZWQsXG4gIGV4Y2x1ZGUgPSBbXSxcbiAgcmVsYXRpdmUgPSBmYWxzZSxcbiAgc2luZ2xlQnJhbmNoID0gZmFsc2UsXG4gIG5vQ2hlY2tvdXQgPSBmYWxzZSxcbiAgbm9UYWdzID0gZmFsc2UsXG4gIGhlYWRlcnMgPSB7fSxcbiAgY2FjaGUgPSB7fSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignaHR0cCcsIGh0dHApO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBpZiAoIW5vQ2hlY2tvdXQpIHtcbiAgICAgIGFzc2VydFBhcmFtZXRlcignZGlyJywgZGlyKTtcbiAgICB9XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCd1cmwnLCB1cmwpO1xuXG4gICAgcmV0dXJuIGF3YWl0IF9jbG9uZSh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgY2FjaGUsXG4gICAgICBodHRwLFxuICAgICAgb25Qcm9ncmVzcyxcbiAgICAgIG9uTWVzc2FnZSxcbiAgICAgIG9uQXV0aCxcbiAgICAgIG9uQXV0aFN1Y2Nlc3MsXG4gICAgICBvbkF1dGhGYWlsdXJlLFxuICAgICAgZGlyLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgdXJsLFxuICAgICAgY29yc1Byb3h5LFxuICAgICAgcmVmLFxuICAgICAgcmVtb3RlLFxuICAgICAgZGVwdGgsXG4gICAgICBzaW5jZSxcbiAgICAgIGV4Y2x1ZGUsXG4gICAgICByZWxhdGl2ZSxcbiAgICAgIHNpbmdsZUJyYW5jaCxcbiAgICAgIG5vQ2hlY2tvdXQsXG4gICAgICBub1RhZ3MsXG4gICAgICBoZWFkZXJzLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmNsb25lJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgY29tbWl0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge1NpZ25DYWxsYmFja30gW2FyZ3Mub25TaWduXSAtIGEgUEdQIHNpZ25pbmcgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1lc3NhZ2UgLSBUaGUgY29tbWl0IG1lc3NhZ2UgdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IFthcmdzLmF1dGhvcl0gLSBUaGUgZGV0YWlscyBhYm91dCB0aGUgYXV0aG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhvci5uYW1lXSAtIERlZmF1bHQgaXMgYHVzZXIubmFtZWAgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhvci5lbWFpbF0gLSBEZWZhdWx0IGlzIGB1c2VyLmVtYWlsYCBjb25maWcuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYXV0aG9yLnRpbWVzdGFtcD1NYXRoLmZsb29yKERhdGUubm93KCkvMTAwMCldIC0gU2V0IHRoZSBhdXRob3IgdGltZXN0YW1wIGZpZWxkLiBUaGlzIGlzIHRoZSBpbnRlZ2VyIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBVbml4IGVwb2NoICgxOTcwLTAxLTAxIDAwOjAwOjAwKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5hdXRob3IudGltZXpvbmVPZmZzZXRdIC0gU2V0IHRoZSBhdXRob3IgdGltZXpvbmUgb2Zmc2V0IGZpZWxkLiBUaGlzIGlzIHRoZSBkaWZmZXJlbmNlLCBpbiBtaW51dGVzLCBmcm9tIHRoZSBjdXJyZW50IHRpbWV6b25lIHRvIFVUQy4gRGVmYXVsdCBpcyBgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KClgLlxuICogQHBhcmFtIHtPYmplY3R9IFthcmdzLmNvbW1pdHRlciA9IGF1dGhvcl0gLSBUaGUgZGV0YWlscyBhYm91dCB0aGUgY29tbWl0IGNvbW1pdHRlciwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBhdXRob3IgcGFyYW1ldGVyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgYXV0aG9yIGRldGFpbHMgYXJlIHVzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuY29tbWl0dGVyLm5hbWVdIC0gRGVmYXVsdCBpcyBgdXNlci5uYW1lYCBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuY29tbWl0dGVyLmVtYWlsXSAtIERlZmF1bHQgaXMgYHVzZXIuZW1haWxgIGNvbmZpZy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5jb21taXR0ZXIudGltZXN0YW1wPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xMDAwKV0gLSBTZXQgdGhlIGNvbW1pdHRlciB0aW1lc3RhbXAgZmllbGQuIFRoaXMgaXMgdGhlIGludGVnZXIgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIFVuaXggZXBvY2ggKDE5NzAtMDEtMDEgMDA6MDA6MDApLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmNvbW1pdHRlci50aW1lem9uZU9mZnNldF0gLSBTZXQgdGhlIGNvbW1pdHRlciB0aW1lem9uZSBvZmZzZXQgZmllbGQuIFRoaXMgaXMgdGhlIGRpZmZlcmVuY2UsIGluIG1pbnV0ZXMsIGZyb20gdGhlIGN1cnJlbnQgdGltZXpvbmUgdG8gVVRDLiBEZWZhdWx0IGlzIGAobmV3IERhdGUoKSkuZ2V0VGltZXpvbmVPZmZzZXQoKWAuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc2lnbmluZ0tleV0gLSBTaWduIHRoZSB0YWcgb2JqZWN0IHVzaW5nIHRoaXMgcHJpdmF0ZSBQR1Aga2V5LlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kcnlSdW4gPSBmYWxzZV0gLSBJZiB0cnVlLCBzaW11bGF0ZXMgbWFraW5nIGEgY29tbWl0IHNvIHlvdSBjYW4gdGVzdCB3aGV0aGVyIGl0IHdvdWxkIHN1Y2NlZWQuIEltcGxpZXMgYG5vVXBkYXRlQnJhbmNoYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3Mubm9VcGRhdGVCcmFuY2ggPSBmYWxzZV0gLSBJZiB0cnVlLCBkb2VzIG5vdCB1cGRhdGUgdGhlIGJyYW5jaCBwb2ludGVyIGFmdGVyIGNyZWF0aW5nIHRoZSBjb21taXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVmXSAtIFRoZSBmdWxseSBleHBhbmRlZCBuYW1lIG9mIHRoZSBicmFuY2ggdG8gY29tbWl0IHRvLiBEZWZhdWx0IGlzIHRoZSBjdXJyZW50IGJyYW5jaCBwb2ludGVkIHRvIGJ5IEhFQUQuIChUT0RPOiBmaXggaXQgc28gaXQgY2FuIGV4cGFuZCBicmFuY2ggbmFtZXMgd2l0aG91dCB0aHJvd2luZyBpZiB0aGUgYnJhbmNoIGRvZXNuJ3QgZXhpc3QgeWV0LilcbiAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLnBhcmVudF0gLSBUaGUgU0hBLTEgb2JqZWN0IGlkcyBvZiB0aGUgY29tbWl0cyB0byB1c2UgYXMgcGFyZW50cy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGNvbW1pdCBwb2ludGVkIHRvIGJ5IGByZWZgIGlzIHVzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudHJlZV0gLSBUaGUgU0hBLTEgb2JqZWN0IGlkIG9mIHRoZSB0cmVlIHRvIHVzZS4gSWYgbm90IHNwZWNpZmllZCwgYSBuZXcgdHJlZSBvYmplY3QgaXMgY3JlYXRlZCBmcm9tIHRoZSBjdXJyZW50IGdpdCBpbmRleC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIHRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgY29tbWl0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBsZXQgc2hhID0gYXdhaXQgZ2l0LmNvbW1pdCh7XG4gKiAgIGZzLFxuICogICBkaXI6ICcvdHV0b3JpYWwnLFxuICogICBhdXRob3I6IHtcbiAqICAgICBuYW1lOiAnTXIuIFRlc3QnLFxuICogICAgIGVtYWlsOiAnbXJ0ZXN0QGV4YW1wbGUuY29tJyxcbiAqICAgfSxcbiAqICAgbWVzc2FnZTogJ0FkZGVkIHRoZSBhLnR4dCBmaWxlJ1xuICogfSlcbiAqIGNvbnNvbGUubG9nKHNoYSlcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbW1pdCh7XG4gIGZzOiBfZnMsXG4gIG9uU2lnbixcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgbWVzc2FnZSxcbiAgYXV0aG9yOiBfYXV0aG9yLFxuICBjb21taXR0ZXI6IF9jb21taXR0ZXIsXG4gIHNpZ25pbmdLZXksXG4gIGRyeVJ1biA9IGZhbHNlLFxuICBub1VwZGF0ZUJyYW5jaCA9IGZhbHNlLFxuICByZWYsXG4gIHBhcmVudCxcbiAgdHJlZSxcbiAgY2FjaGUgPSB7fSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgX2ZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ21lc3NhZ2UnLCBtZXNzYWdlKTtcbiAgICBpZiAoc2lnbmluZ0tleSkge1xuICAgICAgYXNzZXJ0UGFyYW1ldGVyKCdvblNpZ24nLCBvblNpZ24pO1xuICAgIH1cbiAgICBjb25zdCBmcyA9IG5ldyBGaWxlU3lzdGVtKF9mcyk7XG5cbiAgICBjb25zdCBhdXRob3IgPSBhd2FpdCBub3JtYWxpemVBdXRob3JPYmplY3QoeyBmcywgZ2l0ZGlyLCBhdXRob3I6IF9hdXRob3IgfSk7XG4gICAgaWYgKCFhdXRob3IpIHRocm93IG5ldyBNaXNzaW5nTmFtZUVycm9yKCdhdXRob3InKVxuXG4gICAgY29uc3QgY29tbWl0dGVyID0gYXdhaXQgbm9ybWFsaXplQ29tbWl0dGVyT2JqZWN0KHtcbiAgICAgIGZzLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgYXV0aG9yLFxuICAgICAgY29tbWl0dGVyOiBfY29tbWl0dGVyLFxuICAgIH0pO1xuICAgIGlmICghY29tbWl0dGVyKSB0aHJvdyBuZXcgTWlzc2luZ05hbWVFcnJvcignY29tbWl0dGVyJylcblxuICAgIHJldHVybiBhd2FpdCBfY29tbWl0KHtcbiAgICAgIGZzLFxuICAgICAgY2FjaGUsXG4gICAgICBvblNpZ24sXG4gICAgICBnaXRkaXIsXG4gICAgICBtZXNzYWdlLFxuICAgICAgYXV0aG9yLFxuICAgICAgY29tbWl0dGVyLFxuICAgICAgc2lnbmluZ0tleSxcbiAgICAgIGRyeVJ1bixcbiAgICAgIG5vVXBkYXRlQnJhbmNoLFxuICAgICAgcmVmLFxuICAgICAgcGFyZW50LFxuICAgICAgdHJlZSxcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5jb21taXQnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYnJhbmNoIGN1cnJlbnRseSBwb2ludGVkIHRvIGJ5IC5naXQvSEVBRFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mdWxsbmFtZSA9IGZhbHNlXSAtIFJldHVybiB0aGUgZnVsbCBwYXRoIChlLmcuIFwicmVmcy9oZWFkcy9tYWluXCIpIGluc3RlYWQgb2YgdGhlIGFiYnJldmlhdGVkIGZvcm0uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnRlc3QgPSBmYWxzZV0gLSBJZiB0aGUgY3VycmVudCBicmFuY2ggZG9lc24ndCBhY3R1YWxseSBleGlzdCAoc3VjaCBhcyByaWdodCBhZnRlciBnaXQgaW5pdCkgdGhlbiByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nfHZvaWQ+fSBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBicmFuY2ggb3IgdW5kZWZpbmVkIGlmIHRoZSBIRUFEIGlzIGRldGFjaGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIGN1cnJlbnQgYnJhbmNoIG5hbWVcbiAqIGxldCBicmFuY2ggPSBhd2FpdCBnaXQuY3VycmVudEJyYW5jaCh7XG4gKiAgIGZzLFxuICogICBkaXI6ICcvdHV0b3JpYWwnLFxuICogICBmdWxsbmFtZTogZmFsc2VcbiAqIH0pXG4gKiBjb25zb2xlLmxvZyhicmFuY2gpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBjdXJyZW50QnJhbmNoKHtcbiAgZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIGZ1bGxuYW1lID0gZmFsc2UsXG4gIHRlc3QgPSBmYWxzZSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICByZXR1cm4gYXdhaXQgX2N1cnJlbnRCcmFuY2goe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGdpdGRpcixcbiAgICAgIGZ1bGxuYW1lLFxuICAgICAgdGVzdCxcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5jdXJyZW50QnJhbmNoJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZWZcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2RlbGV0ZUJyYW5jaCh7IGZzLCBnaXRkaXIsIHJlZiB9KSB7XG4gIHJlZiA9IHJlZi5zdGFydHNXaXRoKCdyZWZzL2hlYWRzLycpID8gcmVmIDogYHJlZnMvaGVhZHMvJHtyZWZ9YDtcbiAgY29uc3QgZXhpc3QgPSBhd2FpdCBHaXRSZWZNYW5hZ2VyLmV4aXN0cyh7IGZzLCBnaXRkaXIsIHJlZiB9KTtcbiAgaWYgKCFleGlzdCkge1xuICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKHJlZilcbiAgfVxuXG4gIGNvbnN0IGZ1bGxSZWYgPSBhd2FpdCBHaXRSZWZNYW5hZ2VyLmV4cGFuZCh7IGZzLCBnaXRkaXIsIHJlZiB9KTtcbiAgY29uc3QgY3VycmVudFJlZiA9IGF3YWl0IF9jdXJyZW50QnJhbmNoKHsgZnMsIGdpdGRpciwgZnVsbG5hbWU6IHRydWUgfSk7XG4gIGlmIChmdWxsUmVmID09PSBjdXJyZW50UmVmKSB7XG4gICAgLy8gZGV0YWNoIEhFQURcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IEdpdFJlZk1hbmFnZXIucmVzb2x2ZSh7IGZzLCBnaXRkaXIsIHJlZjogZnVsbFJlZiB9KTtcbiAgICBhd2FpdCBHaXRSZWZNYW5hZ2VyLndyaXRlUmVmKHsgZnMsIGdpdGRpciwgcmVmOiAnSEVBRCcsIHZhbHVlIH0pO1xuICB9XG5cbiAgLy8gRGVsZXRlIGEgc3BlY2lmaWVkIGJyYW5jaFxuICBhd2FpdCBHaXRSZWZNYW5hZ2VyLmRlbGV0ZVJlZih7IGZzLCBnaXRkaXIsIHJlZjogZnVsbFJlZiB9KTtcbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogRGVsZXRlIGEgbG9jYWwgYnJhbmNoXG4gKlxuICogPiBOb3RlOiBUaGlzIG9ubHkgZGVsZXRlcyBsb29zZSBicmFuY2hlcyAtIGl0IHNob3VsZCBiZSBmaXhlZCBpbiB0aGUgZnV0dXJlIHRvIGRlbGV0ZSBwYWNrZWQgYnJhbmNoZXMgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlZiAtIFRoZSBicmFuY2ggdG8gZGVsZXRlXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aGVuIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBhcmUgY29tcGxldGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYXdhaXQgZ2l0LmRlbGV0ZUJyYW5jaCh7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCByZWY6ICdsb2NhbC1icmFuY2gnIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVCcmFuY2goe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgcmVmLFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdyZWYnLCByZWYpO1xuICAgIHJldHVybiBhd2FpdCBfZGVsZXRlQnJhbmNoKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBnaXRkaXIsXG4gICAgICByZWYsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuZGVsZXRlQnJhbmNoJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBEZWxldGUgYSBsb2NhbCByZWZcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlZiAtIFRoZSByZWYgdG8gZGVsZXRlXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aGVuIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBhcmUgY29tcGxldGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYXdhaXQgZ2l0LmRlbGV0ZVJlZih7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCByZWY6ICdyZWZzL3RhZ3MvdGVzdC10YWcnIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVSZWYoeyBmcywgZGlyLCBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSwgcmVmIH0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcigncmVmJywgcmVmKTtcbiAgICBhd2FpdCBHaXRSZWZNYW5hZ2VyLmRlbGV0ZVJlZih7IGZzOiBuZXcgRmlsZVN5c3RlbShmcyksIGdpdGRpciwgcmVmIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5kZWxldGVSZWYnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlbW90ZVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBfZGVsZXRlUmVtb3RlKHsgZnMsIGdpdGRpciwgcmVtb3RlIH0pIHtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgR2l0Q29uZmlnTWFuYWdlci5nZXQoeyBmcywgZ2l0ZGlyIH0pO1xuICBhd2FpdCBjb25maWcuZGVsZXRlU2VjdGlvbigncmVtb3RlJywgcmVtb3RlKTtcbiAgYXdhaXQgR2l0Q29uZmlnTWFuYWdlci5zYXZlKHsgZnMsIGdpdGRpciwgY29uZmlnIH0pO1xufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBsb2NhbCBjb25maWcgZW50cnkgZm9yIGEgZ2l2ZW4gcmVtb3RlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZW1vdGUgLSBUaGUgbmFtZSBvZiB0aGUgcmVtb3RlIHRvIGRlbGV0ZVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2hlbiBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IGdpdC5kZWxldGVSZW1vdGUoeyBmcywgZGlyOiAnL3R1dG9yaWFsJywgcmVtb3RlOiAndXBzdHJlYW0nIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVSZW1vdGUoe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgcmVtb3RlLFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdyZW1vdGUnLCByZW1vdGUpO1xuICAgIHJldHVybiBhd2FpdCBfZGVsZXRlUmVtb3RlKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBnaXRkaXIsXG4gICAgICByZW1vdGUsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuZGVsZXRlUmVtb3RlJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBEZWxldGUgYSBsb2NhbCB0YWcgcmVmXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdpdGRpclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVmIC0gVGhlIHRhZyB0byBkZWxldGVcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gZmlsZXN5c3RlbSBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBnaXQuZGVsZXRlVGFnKHsgZGlyOiAnJGlucHV0KCgvKSknLCByZWY6ICckaW5wdXQoKHRlc3QtdGFnKSknIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBfZGVsZXRlVGFnKHsgZnMsIGdpdGRpciwgcmVmIH0pIHtcbiAgcmVmID0gcmVmLnN0YXJ0c1dpdGgoJ3JlZnMvdGFncy8nKSA/IHJlZiA6IGByZWZzL3RhZ3MvJHtyZWZ9YDtcbiAgYXdhaXQgR2l0UmVmTWFuYWdlci5kZWxldGVSZWYoeyBmcywgZ2l0ZGlyLCByZWYgfSk7XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIERlbGV0ZSBhIGxvY2FsIHRhZyByZWZcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlZiAtIFRoZSB0YWcgdG8gZGVsZXRlXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aGVuIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBhcmUgY29tcGxldGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYXdhaXQgZ2l0LmRlbGV0ZVRhZyh7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCByZWY6ICd0ZXN0LXRhZycgfSlcbiAqIGNvbnNvbGUubG9nKCdkb25lJylcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVRhZyh7IGZzLCBkaXIsIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLCByZWYgfSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdyZWYnLCByZWYpO1xuICAgIHJldHVybiBhd2FpdCBfZGVsZXRlVGFnKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBnaXRkaXIsXG4gICAgICByZWYsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuZGVsZXRlVGFnJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBleHBhbmRPaWRMb29zZSh7IGZzLCBnaXRkaXIsIG9pZDogc2hvcnQgfSkge1xuICBjb25zdCBwcmVmaXggPSBzaG9ydC5zbGljZSgwLCAyKTtcbiAgY29uc3Qgb2JqZWN0c1N1ZmZpeGVzID0gYXdhaXQgZnMucmVhZGRpcihgJHtnaXRkaXJ9L29iamVjdHMvJHtwcmVmaXh9YCk7XG4gIHJldHVybiBvYmplY3RzU3VmZml4ZXNcbiAgICAubWFwKHN1ZmZpeCA9PiBgJHtwcmVmaXh9JHtzdWZmaXh9YClcbiAgICAuZmlsdGVyKF9vaWQgPT4gX29pZC5zdGFydHNXaXRoKHNob3J0KSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhwYW5kT2lkUGFja2VkKHtcbiAgZnMsXG4gIGNhY2hlLFxuICBnaXRkaXIsXG4gIG9pZDogc2hvcnQsXG4gIGdldEV4dGVybmFsUmVmRGVsdGEsXG59KSB7XG4gIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIC5wYWNrIGZpbGVzXG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgbGV0IGxpc3QgPSBhd2FpdCBmcy5yZWFkZGlyKGpvaW4oZ2l0ZGlyLCAnb2JqZWN0cy9wYWNrJykpO1xuICBsaXN0ID0gbGlzdC5maWx0ZXIoeCA9PiB4LmVuZHNXaXRoKCcuaWR4JykpO1xuICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGxpc3QpIHtcbiAgICBjb25zdCBpbmRleEZpbGUgPSBgJHtnaXRkaXJ9L29iamVjdHMvcGFjay8ke2ZpbGVuYW1lfWA7XG4gICAgY29uc3QgcCA9IGF3YWl0IHJlYWRQYWNrSW5kZXgoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIGZpbGVuYW1lOiBpbmRleEZpbGUsXG4gICAgICBnZXRFeHRlcm5hbFJlZkRlbHRhLFxuICAgIH0pO1xuICAgIGlmIChwLmVycm9yKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihwLmVycm9yKVxuICAgIC8vIFNlYXJjaCB0aHJvdWdoIHRoZSBsaXN0IG9mIG9pZHMgaW4gdGhlIHBhY2tmaWxlXG4gICAgZm9yIChjb25zdCBvaWQgb2YgcC5vZmZzZXRzLmtleXMoKSkge1xuICAgICAgaWYgKG9pZC5zdGFydHNXaXRoKHNob3J0KSkgcmVzdWx0cy5wdXNoKG9pZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRzXG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9leHBhbmRPaWQoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkOiBzaG9ydCB9KSB7XG4gIC8vIEN1cnJ5IHRoZSBjdXJyZW50IHJlYWQgbWV0aG9kIHNvIHRoYXQgdGhlIHBhY2tmaWxlIHVuLWRlbHRpZmljYXRpb25cbiAgLy8gcHJvY2VzcyBjYW4gYWNxdWlyZSBleHRlcm5hbCByZWYtZGVsdGFzLlxuICBjb25zdCBnZXRFeHRlcm5hbFJlZkRlbHRhID0gb2lkID0+IF9yZWFkT2JqZWN0KHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCB9KTtcblxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgZXhwYW5kT2lkTG9vc2UoeyBmcywgZ2l0ZGlyLCBvaWQ6IHNob3J0IH0pO1xuICBjb25zdCBwYWNrZWRPaWRzID0gYXdhaXQgZXhwYW5kT2lkUGFja2VkKHtcbiAgICBmcyxcbiAgICBjYWNoZSxcbiAgICBnaXRkaXIsXG4gICAgb2lkOiBzaG9ydCxcbiAgICBnZXRFeHRlcm5hbFJlZkRlbHRhLFxuICB9KTtcbiAgLy8gT2JqZWN0cyBjYW4gZXhpc3QgaW4gYSBwYWNrIGZpbGUgYXMgd2VsbCBhcyBsb29zZSwgbWFrZSBzdXJlIHdlIG9ubHkgZ2V0IGEgbGlzdCBvZiB1bmlxdWUgb2lkcy5cbiAgZm9yIChjb25zdCBwYWNrZWRPaWQgb2YgcGFja2VkT2lkcykge1xuICAgIGlmIChyZXN1bHRzLmluZGV4T2YocGFja2VkT2lkKSA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdHMucHVzaChwYWNrZWRPaWQpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiByZXN1bHRzWzBdXG4gIH1cbiAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBBbWJpZ3VvdXNFcnJvcignb2lkcycsIHNob3J0LCByZXN1bHRzKVxuICB9XG4gIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBhbiBvYmplY3QgbWF0Y2hpbmcgXCIke3Nob3J0fVwiYClcbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogRXhwYW5kIGFuZCByZXNvbHZlIGEgc2hvcnQgb2lkIGludG8gYSBmdWxsIG9pZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub2lkIC0gVGhlIHNob3J0ZW5lZCBvaWQgcHJlZml4IHRvIGV4cGFuZCAobGlrZSBcIjA0MTRkMmFcIilcbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIHRoZSBmdWxsIG9pZCAobGlrZSBcIjA0MTRkMmEyODZkN2JiYzdhNGEzMjZhNjFjMWY5Zjg4OGE4YWI4N2ZcIilcbiAqXG4gKiBAZXhhbXBsZVxuICogbGV0IG9pZCA9IGF3YWl0IGdpdC5leHBhbmRPaWQoeyBmcywgZGlyOiAnL3R1dG9yaWFsJywgb2lkOiAnMDQxNGQyYSd9KVxuICogY29uc29sZS5sb2cob2lkKVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhwYW5kT2lkKHtcbiAgZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIG9pZCxcbiAgY2FjaGUgPSB7fSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ29pZCcsIG9pZCk7XG4gICAgcmV0dXJuIGF3YWl0IF9leHBhbmRPaWQoe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGNhY2hlLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgb2lkLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmV4cGFuZE9pZCc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogRXhwYW5kIGFuIGFiYnJldmlhdGVkIHJlZiB0byBpdHMgZnVsbCBuYW1lXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZWYgLSBUaGUgcmVmIHRvIGV4cGFuZCAobGlrZSBcInYxLjAuMFwiKVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIGEgZnVsbCByZWYgbmFtZSAoXCJyZWZzL3RhZ3MvdjEuMC4wXCIpXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCBmdWxsUmVmID0gYXdhaXQgZ2l0LmV4cGFuZFJlZih7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCByZWY6ICdtYWluJ30pXG4gKiBjb25zb2xlLmxvZyhmdWxsUmVmKVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhwYW5kUmVmKHsgZnMsIGRpciwgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksIHJlZiB9KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIGZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdyZWYnLCByZWYpO1xuICAgIHJldHVybiBhd2FpdCBHaXRSZWZNYW5hZ2VyLmV4cGFuZCh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVmLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmV4cGFuZFJlZic7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7YW55fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3Mub2lkc1xuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2ZpbmRNZXJnZUJhc2UoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkcyB9KSB7XG4gIC8vIE5vdGU6IHJpZ2h0IG5vdywgdGhlIHRlc3RzIGFyZSBnZWFyZWQgc28gdGhhdCB0aGUgb3V0cHV0IHNob3VsZCBtYXRjaCB0aGF0IG9mXG4gIC8vIGBnaXQgbWVyZ2UtYmFzZSAtLWFsbCAtLW9jdG9wdXNgXG4gIC8vIGJlY2F1c2Ugd2l0aG91dCB0aGUgLS1vY3RvcHVzIGZsYWcsIGdpdCdzIG91dHB1dCBzZWVtcyB0byBkZXBlbmQgb24gdGhlIE9SREVSIG9mIHRoZSBvaWRzLFxuICAvLyBhbmQgY29tcHV0aW5nIHZpcnR1YWwgbWVyZ2UgYmFzZXMgaXMganVzdCB0b28gbXVjaCBmb3IgbWUgdG8gZmF0aG9tIHJpZ2h0IG5vdy5cblxuICAvLyBJZiB3ZSBzdGFydCBOIGluZGVwZW5kZW50IHdhbGtlcnMsIG9uZSBhdCBlYWNoIG9mIHRoZSBnaXZlbiBgb2lkc2AsIGFuZCB3YWxrIGJhY2t3YXJkc1xuICAvLyB0aHJvdWdoIGFuY2VzdG9ycywgZXZlbnR1YWxseSB3ZSdsbCBkaXNjb3ZlciBhIGNvbW1pdCB3aGVyZSBlYWNoIG9uZSBvZiB0aGVzZSBOIHdhbGtlcnNcbiAgLy8gaGFzIHBhc3NlZCB0aHJvdWdoLiBTbyB3ZSBqdXN0IG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCB3YWxrZXJzIGhhdmUgdmlzaXRlZCBlYWNoIGNvbW1pdFxuICAvLyB1bnRpbCB3ZSBmaW5kIGEgY29tbWl0IHRoYXQgTiBkaXN0aW5jdCB3YWxrZXJzIGhhcyB2aXNpdGVkLlxuICBjb25zdCB2aXNpdHMgPSB7fTtcbiAgY29uc3QgcGFzc2VzID0gb2lkcy5sZW5ndGg7XG4gIGxldCBoZWFkcyA9IG9pZHMubWFwKChvaWQsIGluZGV4KSA9PiAoeyBpbmRleCwgb2lkIH0pKTtcbiAgd2hpbGUgKGhlYWRzLmxlbmd0aCkge1xuICAgIC8vIENvdW50IGhvdyBtYW55IHRpbWVzIHdlJ3ZlIHBhc3NlZCBlYWNoIGNvbW1pdFxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IHsgb2lkLCBpbmRleCB9IG9mIGhlYWRzKSB7XG4gICAgICBpZiAoIXZpc2l0c1tvaWRdKSB2aXNpdHNbb2lkXSA9IG5ldyBTZXQoKTtcbiAgICAgIHZpc2l0c1tvaWRdLmFkZChpbmRleCk7XG4gICAgICBpZiAodmlzaXRzW29pZF0uc2l6ZSA9PT0gcGFzc2VzKSB7XG4gICAgICAgIHJlc3VsdC5hZGQob2lkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3VsdC5zaXplID4gMCkge1xuICAgICAgcmV0dXJuIFsuLi5yZXN1bHRdXG4gICAgfVxuICAgIC8vIFdlIGhhdmVuJ3QgZm91bmQgYSBjb21tb24gYW5jZXN0b3IgeWV0XG4gICAgY29uc3QgbmV3aGVhZHMgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCB7IG9pZCwgaW5kZXggfSBvZiBoZWFkcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBvYmplY3QgfSA9IGF3YWl0IF9yZWFkT2JqZWN0KHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCB9KTtcbiAgICAgICAgY29uc3QgY29tbWl0ID0gR2l0Q29tbWl0LmZyb20ob2JqZWN0KTtcbiAgICAgICAgY29uc3QgeyBwYXJlbnQgfSA9IGNvbW1pdC5wYXJzZUhlYWRlcnMoKTtcbiAgICAgICAgZm9yIChjb25zdCBvaWQgb2YgcGFyZW50KSB7XG4gICAgICAgICAgaWYgKCF2aXNpdHNbb2lkXSB8fCAhdmlzaXRzW29pZF0uaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgbmV3aGVhZHMuc2V0KG9pZCArICc6JyArIGluZGV4LCB7IG9pZCwgaW5kZXggfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cbiAgICBoZWFkcyA9IEFycmF5LmZyb20obmV3aGVhZHMudmFsdWVzKCkpO1xuICB9XG4gIHJldHVybiBbXVxufVxuXG5jb25zdCBMSU5FQlJFQUtTID0gL14uKihcXHI/XFxufCQpL2dtO1xuXG5mdW5jdGlvbiBtZXJnZUZpbGUoeyBicmFuY2hlcywgY29udGVudHMgfSkge1xuICBjb25zdCBvdXJOYW1lID0gYnJhbmNoZXNbMV07XG4gIGNvbnN0IHRoZWlyTmFtZSA9IGJyYW5jaGVzWzJdO1xuXG4gIGNvbnN0IGJhc2VDb250ZW50ID0gY29udGVudHNbMF07XG4gIGNvbnN0IG91ckNvbnRlbnQgPSBjb250ZW50c1sxXTtcbiAgY29uc3QgdGhlaXJDb250ZW50ID0gY29udGVudHNbMl07XG5cbiAgY29uc3Qgb3VycyA9IG91ckNvbnRlbnQubWF0Y2goTElORUJSRUFLUyk7XG4gIGNvbnN0IGJhc2UgPSBiYXNlQ29udGVudC5tYXRjaChMSU5FQlJFQUtTKTtcbiAgY29uc3QgdGhlaXJzID0gdGhlaXJDb250ZW50Lm1hdGNoKExJTkVCUkVBS1MpO1xuXG4gIC8vIEhlcmUgd2UgbGV0IHRoZSBkaWZmMyBsaWJyYXJ5IGRvIHRoZSBoZWF2eSBsaWZ0aW5nLlxuICBjb25zdCByZXN1bHQgPSBkaWZmM01lcmdlKG91cnMsIGJhc2UsIHRoZWlycyk7XG5cbiAgY29uc3QgbWFya2VyU2l6ZSA9IDc7XG5cbiAgLy8gSGVyZSB3ZSBub3RlIHdoZXRoZXIgdGhlcmUgYXJlIGNvbmZsaWN0cyBhbmQgZm9ybWF0IHRoZSByZXN1bHRzXG4gIGxldCBtZXJnZWRUZXh0ID0gJyc7XG4gIGxldCBjbGVhbk1lcmdlID0gdHJ1ZTtcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmVzdWx0KSB7XG4gICAgaWYgKGl0ZW0ub2spIHtcbiAgICAgIG1lcmdlZFRleHQgKz0gaXRlbS5vay5qb2luKCcnKTtcbiAgICB9XG4gICAgaWYgKGl0ZW0uY29uZmxpY3QpIHtcbiAgICAgIGNsZWFuTWVyZ2UgPSBmYWxzZTtcbiAgICAgIG1lcmdlZFRleHQgKz0gYCR7JzwnLnJlcGVhdChtYXJrZXJTaXplKX0gJHtvdXJOYW1lfVxcbmA7XG4gICAgICBtZXJnZWRUZXh0ICs9IGl0ZW0uY29uZmxpY3QuYS5qb2luKCcnKTtcblxuICAgICAgbWVyZ2VkVGV4dCArPSBgJHsnPScucmVwZWF0KG1hcmtlclNpemUpfVxcbmA7XG4gICAgICBtZXJnZWRUZXh0ICs9IGl0ZW0uY29uZmxpY3QuYi5qb2luKCcnKTtcbiAgICAgIG1lcmdlZFRleHQgKz0gYCR7Jz4nLnJlcGVhdChtYXJrZXJTaXplKX0gJHt0aGVpck5hbWV9XFxuYDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgY2xlYW5NZXJnZSwgbWVyZ2VkVGV4dCB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIENyZWF0ZSBhIG1lcmdlZCB0cmVlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5vdXJPaWQgLSBUaGUgU0hBLTEgb2JqZWN0IGlkIG9mIG91ciB0cmVlXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5iYXNlT2lkIC0gVGhlIFNIQS0xIG9iamVjdCBpZCBvZiB0aGUgYmFzZSB0cmVlXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50aGVpck9pZCAtIFRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlaXIgdHJlZVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLm91ck5hbWU9J291cnMnXSAtIFRoZSBuYW1lIHRvIHVzZSBpbiBjb25mbGljdGVkIGZpbGVzIGZvciBvdXIgaHVua3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5iYXNlTmFtZT0nYmFzZSddIC0gVGhlIG5hbWUgdG8gdXNlIGluIGNvbmZsaWN0ZWQgZmlsZXMgKGluIGRpZmYzIGZvcm1hdCkgZm9yIHRoZSBiYXNlIGh1bmtzXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudGhlaXJOYW1lPSd0aGVpcnMnXSAtIFRoZSBuYW1lIHRvIHVzZSBpbiBjb25mbGljdGVkIGZpbGVzIGZvciB0aGVpciBodW5rc1xuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kcnlSdW49ZmFsc2VdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmFib3J0T25Db25mbGljdD1mYWxzZV1cbiAqIEBwYXJhbSB7TWVyZ2VEcml2ZXJDYWxsYmFja30gW2FyZ3MubWVyZ2VEcml2ZXJdXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBUaGUgU0hBLTEgb2JqZWN0IGlkIG9mIHRoZSBtZXJnZWQgdHJlZVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWVyZ2VUcmVlKHtcbiAgZnMsXG4gIGNhY2hlLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICBpbmRleCxcbiAgb3VyT2lkLFxuICBiYXNlT2lkLFxuICB0aGVpck9pZCxcbiAgb3VyTmFtZSA9ICdvdXJzJyxcbiAgYmFzZU5hbWUgPSAnYmFzZScsXG4gIHRoZWlyTmFtZSA9ICd0aGVpcnMnLFxuICBkcnlSdW4gPSBmYWxzZSxcbiAgYWJvcnRPbkNvbmZsaWN0ID0gdHJ1ZSxcbiAgbWVyZ2VEcml2ZXIsXG59KSB7XG4gIGNvbnN0IG91clRyZWUgPSBUUkVFKHsgcmVmOiBvdXJPaWQgfSk7XG4gIGNvbnN0IGJhc2VUcmVlID0gVFJFRSh7IHJlZjogYmFzZU9pZCB9KTtcbiAgY29uc3QgdGhlaXJUcmVlID0gVFJFRSh7IHJlZjogdGhlaXJPaWQgfSk7XG5cbiAgY29uc3QgdW5tZXJnZWRGaWxlcyA9IFtdO1xuICBjb25zdCBib3RoTW9kaWZpZWQgPSBbXTtcbiAgY29uc3QgZGVsZXRlQnlVcyA9IFtdO1xuICBjb25zdCBkZWxldGVCeVRoZWlycyA9IFtdO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBfd2Fsayh7XG4gICAgZnMsXG4gICAgY2FjaGUsXG4gICAgZGlyLFxuICAgIGdpdGRpcixcbiAgICB0cmVlczogW291clRyZWUsIGJhc2VUcmVlLCB0aGVpclRyZWVdLFxuICAgIG1hcDogYXN5bmMgZnVuY3Rpb24oZmlsZXBhdGgsIFtvdXJzLCBiYXNlLCB0aGVpcnNdKSB7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZW5hbWUoZmlsZXBhdGgpO1xuICAgICAgLy8gV2hhdCB3ZSBkaWQsIHdoYXQgdGhleSBkaWRcbiAgICAgIGNvbnN0IG91ckNoYW5nZSA9IGF3YWl0IG1vZGlmaWVkKG91cnMsIGJhc2UpO1xuICAgICAgY29uc3QgdGhlaXJDaGFuZ2UgPSBhd2FpdCBtb2RpZmllZCh0aGVpcnMsIGJhc2UpO1xuICAgICAgc3dpdGNoIChgJHtvdXJDaGFuZ2V9LSR7dGhlaXJDaGFuZ2V9YCkge1xuICAgICAgICBjYXNlICdmYWxzZS1mYWxzZSc6IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW9kZTogYXdhaXQgYmFzZS5tb2RlKCksXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgb2lkOiBhd2FpdCBiYXNlLm9pZCgpLFxuICAgICAgICAgICAgdHlwZTogYXdhaXQgYmFzZS50eXBlKCksXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2ZhbHNlLXRydWUnOiB7XG4gICAgICAgICAgcmV0dXJuIHRoZWlyc1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgbW9kZTogYXdhaXQgdGhlaXJzLm1vZGUoKSxcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIG9pZDogYXdhaXQgdGhlaXJzLm9pZCgpLFxuICAgICAgICAgICAgICAgIHR5cGU6IGF3YWl0IHRoZWlycy50eXBlKCksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJ1ZS1mYWxzZSc6IHtcbiAgICAgICAgICByZXR1cm4gb3Vyc1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgbW9kZTogYXdhaXQgb3Vycy5tb2RlKCksXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBvaWQ6IGF3YWl0IG91cnMub2lkKCksXG4gICAgICAgICAgICAgICAgdHlwZTogYXdhaXQgb3Vycy50eXBlKCksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJ1ZS10cnVlJzoge1xuICAgICAgICAgIC8vIE1vZGlmaWNhdGlvbnNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBvdXJzICYmXG4gICAgICAgICAgICBiYXNlICYmXG4gICAgICAgICAgICB0aGVpcnMgJiZcbiAgICAgICAgICAgIChhd2FpdCBvdXJzLnR5cGUoKSkgPT09ICdibG9iJyAmJlxuICAgICAgICAgICAgKGF3YWl0IGJhc2UudHlwZSgpKSA9PT0gJ2Jsb2InICYmXG4gICAgICAgICAgICAoYXdhaXQgdGhlaXJzLnR5cGUoKSkgPT09ICdibG9iJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlQmxvYnMoe1xuICAgICAgICAgICAgICBmcyxcbiAgICAgICAgICAgICAgZ2l0ZGlyLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICBvdXJzLFxuICAgICAgICAgICAgICBiYXNlLFxuICAgICAgICAgICAgICB0aGVpcnMsXG4gICAgICAgICAgICAgIG91ck5hbWUsXG4gICAgICAgICAgICAgIGJhc2VOYW1lLFxuICAgICAgICAgICAgICB0aGVpck5hbWUsXG4gICAgICAgICAgICAgIG1lcmdlRHJpdmVyLFxuICAgICAgICAgICAgfSkudGhlbihhc3luYyByID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFyLmNsZWFuTWVyZ2UpIHtcbiAgICAgICAgICAgICAgICB1bm1lcmdlZEZpbGVzLnB1c2goZmlsZXBhdGgpO1xuICAgICAgICAgICAgICAgIGJvdGhNb2RpZmllZC5wdXNoKGZpbGVwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFib3J0T25Db25mbGljdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZU9pZCA9IGF3YWl0IGJhc2Uub2lkKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBvdXJPaWQgPSBhd2FpdCBvdXJzLm9pZCgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgdGhlaXJPaWQgPSBhd2FpdCB0aGVpcnMub2lkKCk7XG5cbiAgICAgICAgICAgICAgICAgIGluZGV4LmRlbGV0ZSh7IGZpbGVwYXRoIH0pO1xuXG4gICAgICAgICAgICAgICAgICBpbmRleC5pbnNlcnQoeyBmaWxlcGF0aCwgb2lkOiBiYXNlT2lkLCBzdGFnZTogMSB9KTtcbiAgICAgICAgICAgICAgICAgIGluZGV4Lmluc2VydCh7IGZpbGVwYXRoLCBvaWQ6IG91ck9pZCwgc3RhZ2U6IDIgfSk7XG4gICAgICAgICAgICAgICAgICBpbmRleC5pbnNlcnQoeyBmaWxlcGF0aCwgb2lkOiB0aGVpck9pZCwgc3RhZ2U6IDMgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhYm9ydE9uQ29uZmxpY3QpIHtcbiAgICAgICAgICAgICAgICBpbmRleC5pbnNlcnQoeyBmaWxlcGF0aCwgb2lkOiByLm1lcmdlUmVzdWx0Lm9pZCwgc3RhZ2U6IDAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHIubWVyZ2VSZXN1bHRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZGVsZXRlZCBieSB1c1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGJhc2UgJiZcbiAgICAgICAgICAgICFvdXJzICYmXG4gICAgICAgICAgICB0aGVpcnMgJiZcbiAgICAgICAgICAgIChhd2FpdCBiYXNlLnR5cGUoKSkgPT09ICdibG9iJyAmJlxuICAgICAgICAgICAgKGF3YWl0IHRoZWlycy50eXBlKCkpID09PSAnYmxvYidcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHVubWVyZ2VkRmlsZXMucHVzaChmaWxlcGF0aCk7XG4gICAgICAgICAgICBkZWxldGVCeVVzLnB1c2goZmlsZXBhdGgpO1xuICAgICAgICAgICAgaWYgKCFhYm9ydE9uQ29uZmxpY3QpIHtcbiAgICAgICAgICAgICAgY29uc3QgYmFzZU9pZCA9IGF3YWl0IGJhc2Uub2lkKCk7XG4gICAgICAgICAgICAgIGNvbnN0IHRoZWlyT2lkID0gYXdhaXQgdGhlaXJzLm9pZCgpO1xuXG4gICAgICAgICAgICAgIGluZGV4LmRlbGV0ZSh7IGZpbGVwYXRoIH0pO1xuXG4gICAgICAgICAgICAgIGluZGV4Lmluc2VydCh7IGZpbGVwYXRoLCBvaWQ6IGJhc2VPaWQsIHN0YWdlOiAxIH0pO1xuICAgICAgICAgICAgICBpbmRleC5pbnNlcnQoeyBmaWxlcGF0aCwgb2lkOiB0aGVpck9pZCwgc3RhZ2U6IDMgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1vZGU6IGF3YWl0IHRoZWlycy5tb2RlKCksXG4gICAgICAgICAgICAgIG9pZDogYXdhaXQgdGhlaXJzLm9pZCgpLFxuICAgICAgICAgICAgICB0eXBlOiAnYmxvYicsXG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZGVsZXRlZCBieSB0aGVpcnNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBiYXNlICYmXG4gICAgICAgICAgICBvdXJzICYmXG4gICAgICAgICAgICAhdGhlaXJzICYmXG4gICAgICAgICAgICAoYXdhaXQgYmFzZS50eXBlKCkpID09PSAnYmxvYicgJiZcbiAgICAgICAgICAgIChhd2FpdCBvdXJzLnR5cGUoKSkgPT09ICdibG9iJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdW5tZXJnZWRGaWxlcy5wdXNoKGZpbGVwYXRoKTtcbiAgICAgICAgICAgIGRlbGV0ZUJ5VGhlaXJzLnB1c2goZmlsZXBhdGgpO1xuICAgICAgICAgICAgaWYgKCFhYm9ydE9uQ29uZmxpY3QpIHtcbiAgICAgICAgICAgICAgY29uc3QgYmFzZU9pZCA9IGF3YWl0IGJhc2Uub2lkKCk7XG4gICAgICAgICAgICAgIGNvbnN0IG91ck9pZCA9IGF3YWl0IG91cnMub2lkKCk7XG5cbiAgICAgICAgICAgICAgaW5kZXguZGVsZXRlKHsgZmlsZXBhdGggfSk7XG5cbiAgICAgICAgICAgICAgaW5kZXguaW5zZXJ0KHsgZmlsZXBhdGgsIG9pZDogYmFzZU9pZCwgc3RhZ2U6IDEgfSk7XG4gICAgICAgICAgICAgIGluZGV4Lmluc2VydCh7IGZpbGVwYXRoLCBvaWQ6IG91ck9pZCwgc3RhZ2U6IDIgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1vZGU6IGF3YWl0IG91cnMubW9kZSgpLFxuICAgICAgICAgICAgICBvaWQ6IGF3YWl0IG91cnMub2lkKCksXG4gICAgICAgICAgICAgIHR5cGU6ICdibG9iJyxcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkZWxldGVkIGJ5IGJvdGhcbiAgICAgICAgICBpZiAoYmFzZSAmJiAhb3VycyAmJiAhdGhlaXJzICYmIChhd2FpdCBiYXNlLnR5cGUoKSkgPT09ICdibG9iJykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGFsbCBvdGhlciB0eXBlcyBvZiBjb25mbGljdHMgZmFpbFxuICAgICAgICAgIC8vIFRPRE86IE1lcmdlIGNvbmZsaWN0cyBpbnZvbHZpbmcgYWRkaXRpb25zXG4gICAgICAgICAgdGhyb3cgbmV3IE1lcmdlTm90U3VwcG9ydGVkRXJyb3IoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RyZWVFbnRyeX0gW3BhcmVudF1cbiAgICAgKiBAcGFyYW0ge0FycmF5PFRyZWVFbnRyeT59IGNoaWxkcmVuXG4gICAgICovXG4gICAgcmVkdWNlOlxuICAgICAgdW5tZXJnZWRGaWxlcy5sZW5ndGggIT09IDAgJiYgKCFkaXIgfHwgYWJvcnRPbkNvbmZsaWN0KVxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGFzeW5jIChwYXJlbnQsIGNoaWxkcmVuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gY2hpbGRyZW4uZmlsdGVyKEJvb2xlYW4pOyAvLyByZW1vdmUgdW5kZWZpbmVkc1xuXG4gICAgICAgICAgICAvLyBpZiB0aGUgcGFyZW50IHdhcyBkZWxldGVkLCB0aGUgY2hpbGRyZW4gaGF2ZSB0byBnb1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVyblxuXG4gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRlbGV0ZSBkaXJlY3RvcmllcyBpZiB0aGV5IGhhdmUgYmVlbiBlbXB0aWVkXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC50eXBlID09PSAndHJlZScgJiYgZW50cmllcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRyZWUgPSBuZXcgR2l0VHJlZShlbnRyaWVzKTtcbiAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0gdHJlZS50b09iamVjdCgpO1xuICAgICAgICAgICAgICBjb25zdCBvaWQgPSBhd2FpdCBfd3JpdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGZzLFxuICAgICAgICAgICAgICAgIGdpdGRpcixcbiAgICAgICAgICAgICAgICB0eXBlOiAndHJlZScsXG4gICAgICAgICAgICAgICAgb2JqZWN0LFxuICAgICAgICAgICAgICAgIGRyeVJ1bixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHBhcmVudC5vaWQgPSBvaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50XG4gICAgICAgICAgfSxcbiAgfSk7XG5cbiAgaWYgKHVubWVyZ2VkRmlsZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgaWYgKGRpciAmJiAhYWJvcnRPbkNvbmZsaWN0KSB7XG4gICAgICBhd2FpdCBfd2Fsayh7XG4gICAgICAgIGZzLFxuICAgICAgICBjYWNoZSxcbiAgICAgICAgZGlyLFxuICAgICAgICBnaXRkaXIsXG4gICAgICAgIHRyZWVzOiBbVFJFRSh7IHJlZjogcmVzdWx0cy5vaWQgfSldLFxuICAgICAgICBtYXA6IGFzeW5jIGZ1bmN0aW9uKGZpbGVwYXRoLCBbZW50cnldKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGAke2Rpcn0vJHtmaWxlcGF0aH1gO1xuICAgICAgICAgIGlmICgoYXdhaXQgZW50cnkudHlwZSgpKSA9PT0gJ2Jsb2InKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlID0gYXdhaXQgZW50cnkubW9kZSgpO1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShhd2FpdCBlbnRyeS5jb250ZW50KCkpO1xuICAgICAgICAgICAgYXdhaXQgZnMud3JpdGUocGF0aCwgY29udGVudCwgeyBtb2RlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTWVyZ2VDb25mbGljdEVycm9yKFxuICAgICAgdW5tZXJnZWRGaWxlcyxcbiAgICAgIGJvdGhNb2RpZmllZCxcbiAgICAgIGRlbGV0ZUJ5VXMsXG4gICAgICBkZWxldGVCeVRoZWlyc1xuICAgIClcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzLm9pZFxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wYXRoXG4gKiBAcGFyYW0ge1dhbGtlckVudHJ5fSBhcmdzLm91cnNcbiAqIEBwYXJhbSB7V2Fsa2VyRW50cnl9IGFyZ3MuYmFzZVxuICogQHBhcmFtIHtXYWxrZXJFbnRyeX0gYXJncy50aGVpcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5vdXJOYW1lXVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmJhc2VOYW1lXVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnRoZWlyTmFtZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZHJ5UnVuID0gZmFsc2VdXG4gKiBAcGFyYW0ge01lcmdlRHJpdmVyQ2FsbGJhY2t9IFthcmdzLm1lcmdlRHJpdmVyXVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWVyZ2VCbG9icyh7XG4gIGZzLFxuICBnaXRkaXIsXG4gIHBhdGgsXG4gIG91cnMsXG4gIGJhc2UsXG4gIHRoZWlycyxcbiAgb3VyTmFtZSxcbiAgdGhlaXJOYW1lLFxuICBiYXNlTmFtZSxcbiAgZHJ5UnVuLFxuICBtZXJnZURyaXZlciA9IG1lcmdlRmlsZSxcbn0pIHtcbiAgY29uc3QgdHlwZSA9ICdibG9iJztcbiAgLy8gQ29tcHV0ZSB0aGUgbmV3IG1vZGUuXG4gIC8vIFNpbmNlIHRoZXJlIGFyZSBPTkxZIHR3byB2YWxpZCBibG9iIG1vZGVzICgnMTAwNzU1JyBhbmQgJzEwMDY0NCcpIGl0IGJvaWxzIGRvd24gdG8gdGhpc1xuICBjb25zdCBtb2RlID1cbiAgICAoYXdhaXQgYmFzZS5tb2RlKCkpID09PSAoYXdhaXQgb3Vycy5tb2RlKCkpXG4gICAgICA/IGF3YWl0IHRoZWlycy5tb2RlKClcbiAgICAgIDogYXdhaXQgb3Vycy5tb2RlKCk7XG4gIC8vIFRoZSB0cml2aWFsIGNhc2U6IG5vdGhpbmcgdG8gbWVyZ2UgZXhjZXB0IG1heWJlIG1vZGVcbiAgaWYgKChhd2FpdCBvdXJzLm9pZCgpKSA9PT0gKGF3YWl0IHRoZWlycy5vaWQoKSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xlYW5NZXJnZTogdHJ1ZSxcbiAgICAgIG1lcmdlUmVzdWx0OiB7IG1vZGUsIHBhdGgsIG9pZDogYXdhaXQgb3Vycy5vaWQoKSwgdHlwZSB9LFxuICAgIH1cbiAgfVxuICAvLyBpZiBvbmx5IG9uZSBzaWRlIG1hZGUgb2lkIGNoYW5nZXMsIHJldHVybiB0aGF0IHNpZGUncyBvaWRcbiAgaWYgKChhd2FpdCBvdXJzLm9pZCgpKSA9PT0gKGF3YWl0IGJhc2Uub2lkKCkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsZWFuTWVyZ2U6IHRydWUsXG4gICAgICBtZXJnZVJlc3VsdDogeyBtb2RlLCBwYXRoLCBvaWQ6IGF3YWl0IHRoZWlycy5vaWQoKSwgdHlwZSB9LFxuICAgIH1cbiAgfVxuICBpZiAoKGF3YWl0IHRoZWlycy5vaWQoKSkgPT09IChhd2FpdCBiYXNlLm9pZCgpKSkge1xuICAgIHJldHVybiB7XG4gICAgICBjbGVhbk1lcmdlOiB0cnVlLFxuICAgICAgbWVyZ2VSZXN1bHQ6IHsgbW9kZSwgcGF0aCwgb2lkOiBhd2FpdCBvdXJzLm9pZCgpLCB0eXBlIH0sXG4gICAgfVxuICB9XG4gIC8vIGlmIGJvdGggc2lkZXMgbWFkZSBjaGFuZ2VzIGRvIGEgbWVyZ2VcbiAgY29uc3Qgb3VyQ29udGVudCA9IEJ1ZmZlci5mcm9tKGF3YWl0IG91cnMuY29udGVudCgpKS50b1N0cmluZygndXRmOCcpO1xuICBjb25zdCBiYXNlQ29udGVudCA9IEJ1ZmZlci5mcm9tKGF3YWl0IGJhc2UuY29udGVudCgpKS50b1N0cmluZygndXRmOCcpO1xuICBjb25zdCB0aGVpckNvbnRlbnQgPSBCdWZmZXIuZnJvbShhd2FpdCB0aGVpcnMuY29udGVudCgpKS50b1N0cmluZygndXRmOCcpO1xuICBjb25zdCB7IG1lcmdlZFRleHQsIGNsZWFuTWVyZ2UgfSA9IGF3YWl0IG1lcmdlRHJpdmVyKHtcbiAgICBicmFuY2hlczogW2Jhc2VOYW1lLCBvdXJOYW1lLCB0aGVpck5hbWVdLFxuICAgIGNvbnRlbnRzOiBbYmFzZUNvbnRlbnQsIG91ckNvbnRlbnQsIHRoZWlyQ29udGVudF0sXG4gICAgcGF0aCxcbiAgfSk7XG4gIGNvbnN0IG9pZCA9IGF3YWl0IF93cml0ZU9iamVjdCh7XG4gICAgZnMsXG4gICAgZ2l0ZGlyLFxuICAgIHR5cGU6ICdibG9iJyxcbiAgICBvYmplY3Q6IEJ1ZmZlci5mcm9tKG1lcmdlZFRleHQsICd1dGY4JyksXG4gICAgZHJ5UnVuLFxuICB9KTtcblxuICByZXR1cm4geyBjbGVhbk1lcmdlLCBtZXJnZVJlc3VsdDogeyBtb2RlLCBwYXRoLCBvaWQsIHR5cGUgfSB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vLyBpbXBvcnQgZGlmZjMgZnJvbSAnbm9kZS1kaWZmMydcbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1lcmdlUmVzdWx0IC0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHNjaGVtYSBsaWtlIHRoaXM6XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29pZF0gLSBUaGUgU0hBLTEgb2JqZWN0IGlkIHRoYXQgaXMgbm93IGF0IHRoZSBoZWFkIG9mIHRoZSBicmFuY2guIEFic2VudCBvbmx5IGlmIGBkcnlSdW5gIHdhcyBzcGVjaWZpZWQgYW5kIGBtZXJnZUNvbW1pdGAgaXMgdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2FscmVhZHlNZXJnZWRdIC0gVHJ1ZSBpZiB0aGUgYnJhbmNoIHdhcyBhbHJlYWR5IG1lcmdlZCBzbyBubyBjaGFuZ2VzIHdlcmUgbWFkZVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFzdEZvcndhcmRdIC0gVHJ1ZSBpZiBpdCB3YXMgYSBmYXN0LWZvcndhcmQgbWVyZ2VcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW21lcmdlQ29tbWl0XSAtIFRydWUgaWYgbWVyZ2UgcmVzdWx0ZWQgaW4gYSBtZXJnZSBjb21taXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHJlZV0gLSBUaGUgU0hBLTEgb2JqZWN0IGlkIG9mIHRoZSB0cmVlIHJlc3VsdGluZyBmcm9tIGEgbWVyZ2UgY29tbWl0XG4gKlxuICovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5vdXJzXVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGhlaXJzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3MuZmFzdEZvcndhcmRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJncy5mYXN0Rm9yd2FyZE9ubHlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJncy5kcnlSdW5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJncy5ub1VwZGF0ZUJyYW5jaFxuICogQHBhcmFtIHtib29sZWFufSBhcmdzLmFib3J0T25Db25mbGljdFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLm1lc3NhZ2VdXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncy5hdXRob3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhvci5uYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRob3IuZW1haWxcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmF1dGhvci50aW1lc3RhbXBcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmF1dGhvci50aW1lem9uZU9mZnNldFxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MuY29tbWl0dGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21taXR0ZXIubmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWl0dGVyLmVtYWlsXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21taXR0ZXIudGltZXN0YW1wXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21taXR0ZXIudGltZXpvbmVPZmZzZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zaWduaW5nS2V5XVxuICogQHBhcmFtIHtTaWduQ2FsbGJhY2t9IFthcmdzLm9uU2lnbl0gLSBhIFBHUCBzaWduaW5nIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge01lcmdlRHJpdmVyQ2FsbGJhY2t9IFthcmdzLm1lcmdlRHJpdmVyXVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPE1lcmdlUmVzdWx0Pn0gUmVzb2x2ZXMgdG8gYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVyZ2Ugb3BlcmF0aW9uXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBfbWVyZ2Uoe1xuICBmcyxcbiAgY2FjaGUsXG4gIGRpcixcbiAgZ2l0ZGlyLFxuICBvdXJzLFxuICB0aGVpcnMsXG4gIGZhc3RGb3J3YXJkID0gdHJ1ZSxcbiAgZmFzdEZvcndhcmRPbmx5ID0gZmFsc2UsXG4gIGRyeVJ1biA9IGZhbHNlLFxuICBub1VwZGF0ZUJyYW5jaCA9IGZhbHNlLFxuICBhYm9ydE9uQ29uZmxpY3QgPSB0cnVlLFxuICBtZXNzYWdlLFxuICBhdXRob3IsXG4gIGNvbW1pdHRlcixcbiAgc2lnbmluZ0tleSxcbiAgb25TaWduLFxuICBtZXJnZURyaXZlcixcbn0pIHtcbiAgaWYgKG91cnMgPT09IHVuZGVmaW5lZCkge1xuICAgIG91cnMgPSBhd2FpdCBfY3VycmVudEJyYW5jaCh7IGZzLCBnaXRkaXIsIGZ1bGxuYW1lOiB0cnVlIH0pO1xuICB9XG4gIG91cnMgPSBhd2FpdCBHaXRSZWZNYW5hZ2VyLmV4cGFuZCh7XG4gICAgZnMsXG4gICAgZ2l0ZGlyLFxuICAgIHJlZjogb3VycyxcbiAgfSk7XG4gIHRoZWlycyA9IGF3YWl0IEdpdFJlZk1hbmFnZXIuZXhwYW5kKHtcbiAgICBmcyxcbiAgICBnaXRkaXIsXG4gICAgcmVmOiB0aGVpcnMsXG4gIH0pO1xuICBjb25zdCBvdXJPaWQgPSBhd2FpdCBHaXRSZWZNYW5hZ2VyLnJlc29sdmUoe1xuICAgIGZzLFxuICAgIGdpdGRpcixcbiAgICByZWY6IG91cnMsXG4gIH0pO1xuICBjb25zdCB0aGVpck9pZCA9IGF3YWl0IEdpdFJlZk1hbmFnZXIucmVzb2x2ZSh7XG4gICAgZnMsXG4gICAgZ2l0ZGlyLFxuICAgIHJlZjogdGhlaXJzLFxuICB9KTtcbiAgLy8gZmluZCBtb3N0IHJlY2VudCBjb21tb24gYW5jZXN0b3Igb2YgcmVmIGEgYW5kIHJlZiBiXG4gIGNvbnN0IGJhc2VPaWRzID0gYXdhaXQgX2ZpbmRNZXJnZUJhc2Uoe1xuICAgIGZzLFxuICAgIGNhY2hlLFxuICAgIGdpdGRpcixcbiAgICBvaWRzOiBbb3VyT2lkLCB0aGVpck9pZF0sXG4gIH0pO1xuICBpZiAoYmFzZU9pZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgLy8gVE9ETzogUmVjdXJzaXZlIE1lcmdlIHN0cmF0ZWd5XG4gICAgdGhyb3cgbmV3IE1lcmdlTm90U3VwcG9ydGVkRXJyb3IoKVxuICB9XG4gIGNvbnN0IGJhc2VPaWQgPSBiYXNlT2lkc1swXTtcbiAgLy8gaGFuZGxlIGZhc3QtZm9yd2FyZCBjYXNlXG4gIGlmIChiYXNlT2lkID09PSB0aGVpck9pZCkge1xuICAgIHJldHVybiB7XG4gICAgICBvaWQ6IG91ck9pZCxcbiAgICAgIGFscmVhZHlNZXJnZWQ6IHRydWUsXG4gICAgfVxuICB9XG4gIGlmIChmYXN0Rm9yd2FyZCAmJiBiYXNlT2lkID09PSBvdXJPaWQpIHtcbiAgICBpZiAoIWRyeVJ1biAmJiAhbm9VcGRhdGVCcmFuY2gpIHtcbiAgICAgIGF3YWl0IEdpdFJlZk1hbmFnZXIud3JpdGVSZWYoeyBmcywgZ2l0ZGlyLCByZWY6IG91cnMsIHZhbHVlOiB0aGVpck9pZCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9pZDogdGhlaXJPaWQsXG4gICAgICBmYXN0Rm9yd2FyZDogdHJ1ZSxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gbm90IGEgc2ltcGxlIGZhc3QtZm9yd2FyZFxuICAgIGlmIChmYXN0Rm9yd2FyZE9ubHkpIHtcbiAgICAgIHRocm93IG5ldyBGYXN0Rm9yd2FyZEVycm9yKClcbiAgICB9XG4gICAgLy8gdHJ5IGEgZmFuY2llciBtZXJnZVxuICAgIGNvbnN0IHRyZWUgPSBhd2FpdCBHaXRJbmRleE1hbmFnZXIuYWNxdWlyZShcbiAgICAgIHsgZnMsIGdpdGRpciwgY2FjaGUsIGFsbG93VW5tZXJnZWQ6IGZhbHNlIH0sXG4gICAgICBhc3luYyBpbmRleCA9PiB7XG4gICAgICAgIHJldHVybiBtZXJnZVRyZWUoe1xuICAgICAgICAgIGZzLFxuICAgICAgICAgIGNhY2hlLFxuICAgICAgICAgIGRpcixcbiAgICAgICAgICBnaXRkaXIsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgb3VyT2lkLFxuICAgICAgICAgIHRoZWlyT2lkLFxuICAgICAgICAgIGJhc2VPaWQsXG4gICAgICAgICAgb3VyTmFtZTogYWJicmV2aWF0ZVJlZihvdXJzKSxcbiAgICAgICAgICBiYXNlTmFtZTogJ2Jhc2UnLFxuICAgICAgICAgIHRoZWlyTmFtZTogYWJicmV2aWF0ZVJlZih0aGVpcnMpLFxuICAgICAgICAgIGRyeVJ1bixcbiAgICAgICAgICBhYm9ydE9uQ29uZmxpY3QsXG4gICAgICAgICAgbWVyZ2VEcml2ZXIsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIERlZmVyIHRocm93aW5nIGVycm9yIHVudGlsIHRoZSBpbmRleCBsb2NrIGlzIHJlbGlucXVpc2hlZCBhbmQgaW5kZXggaXNcbiAgICAvLyB3cml0dGVuIHRvIGZpbHNlc3lzdGVtXG4gICAgaWYgKHRyZWUgaW5zdGFuY2VvZiBNZXJnZUNvbmZsaWN0RXJyb3IpIHRocm93IHRyZWVcblxuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgbWVzc2FnZSA9IGBNZXJnZSBicmFuY2ggJyR7YWJicmV2aWF0ZVJlZih0aGVpcnMpfScgaW50byAke2FiYnJldmlhdGVSZWYoXG4gICAgICAgIG91cnNcbiAgICAgICl9YDtcbiAgICB9XG4gICAgY29uc3Qgb2lkID0gYXdhaXQgX2NvbW1pdCh7XG4gICAgICBmcyxcbiAgICAgIGNhY2hlLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHJlZjogb3VycyxcbiAgICAgIHRyZWUsXG4gICAgICBwYXJlbnQ6IFtvdXJPaWQsIHRoZWlyT2lkXSxcbiAgICAgIGF1dGhvcixcbiAgICAgIGNvbW1pdHRlcixcbiAgICAgIHNpZ25pbmdLZXksXG4gICAgICBvblNpZ24sXG4gICAgICBkcnlSdW4sXG4gICAgICBub1VwZGF0ZUJyYW5jaCxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgb2lkLFxuICAgICAgdHJlZSxcbiAgICAgIG1lcmdlQ29tbWl0OiB0cnVlLFxuICAgIH1cbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MuY2FjaGVcbiAqIEBwYXJhbSB7SHR0cENsaWVudH0gYXJncy5odHRwXG4gKiBAcGFyYW0ge1Byb2dyZXNzQ2FsbGJhY2t9IFthcmdzLm9uUHJvZ3Jlc3NdXG4gKiBAcGFyYW0ge01lc3NhZ2VDYWxsYmFja30gW2FyZ3Mub25NZXNzYWdlXVxuICogQHBhcmFtIHtBdXRoQ2FsbGJhY2t9IFthcmdzLm9uQXV0aF1cbiAqIEBwYXJhbSB7QXV0aEZhaWx1cmVDYWxsYmFja30gW2FyZ3Mub25BdXRoRmFpbHVyZV1cbiAqIEBwYXJhbSB7QXV0aFN1Y2Nlc3NDYWxsYmFja30gW2FyZ3Mub25BdXRoU3VjY2Vzc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRpclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZWZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy51cmxdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlXVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlbW90ZVJlZl1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MucHJ1bmVdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnBydW5lVGFnc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb3JzUHJveHldXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3Muc2luZ2xlQnJhbmNoXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3MuZmFzdEZvcndhcmRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJncy5mYXN0Rm9yd2FyZE9ubHlcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuaGVhZGVyc11cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzLmF1dGhvclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aG9yLm5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhvci5lbWFpbFxuICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYXV0aG9yLnRpbWVzdGFtcFxuICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYXV0aG9yLnRpbWV6b25lT2Zmc2V0XG4gKiBAcGFyYW0ge09iamVjdH0gYXJncy5jb21taXR0ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1pdHRlci5uYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21taXR0ZXIuZW1haWxcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNvbW1pdHRlci50aW1lc3RhbXBcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNvbW1pdHRlci50aW1lem9uZU9mZnNldFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnNpZ25pbmdLZXldXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aGVuIHB1bGwgb3BlcmF0aW9uIGNvbXBsZXRlc1xuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX3B1bGwoe1xuICBmcyxcbiAgY2FjaGUsXG4gIGh0dHAsXG4gIG9uUHJvZ3Jlc3MsXG4gIG9uTWVzc2FnZSxcbiAgb25BdXRoLFxuICBvbkF1dGhTdWNjZXNzLFxuICBvbkF1dGhGYWlsdXJlLFxuICBkaXIsXG4gIGdpdGRpcixcbiAgcmVmLFxuICB1cmwsXG4gIHJlbW90ZSxcbiAgcmVtb3RlUmVmLFxuICBwcnVuZSxcbiAgcHJ1bmVUYWdzLFxuICBmYXN0Rm9yd2FyZCxcbiAgZmFzdEZvcndhcmRPbmx5LFxuICBjb3JzUHJveHksXG4gIHNpbmdsZUJyYW5jaCxcbiAgaGVhZGVycyxcbiAgYXV0aG9yLFxuICBjb21taXR0ZXIsXG4gIHNpZ25pbmdLZXksXG59KSB7XG4gIHRyeSB7XG4gICAgLy8gSWYgcmVmIGlzIHVuZGVmaW5lZCwgdXNlICdIRUFEJ1xuICAgIGlmICghcmVmKSB7XG4gICAgICBjb25zdCBoZWFkID0gYXdhaXQgX2N1cnJlbnRCcmFuY2goeyBmcywgZ2l0ZGlyIH0pO1xuICAgICAgLy8gVE9ETzogdXNlIGEgYmV0dGVyIGVycm9yLlxuICAgICAgaWYgKCFoZWFkKSB7XG4gICAgICAgIHRocm93IG5ldyBNaXNzaW5nUGFyYW1ldGVyRXJyb3IoJ3JlZicpXG4gICAgICB9XG4gICAgICByZWYgPSBoZWFkO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZmV0Y2hIZWFkLCBmZXRjaEhlYWREZXNjcmlwdGlvbiB9ID0gYXdhaXQgX2ZldGNoKHtcbiAgICAgIGZzLFxuICAgICAgY2FjaGUsXG4gICAgICBodHRwLFxuICAgICAgb25Qcm9ncmVzcyxcbiAgICAgIG9uTWVzc2FnZSxcbiAgICAgIG9uQXV0aCxcbiAgICAgIG9uQXV0aFN1Y2Nlc3MsXG4gICAgICBvbkF1dGhGYWlsdXJlLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgY29yc1Byb3h5LFxuICAgICAgcmVmLFxuICAgICAgdXJsLFxuICAgICAgcmVtb3RlLFxuICAgICAgcmVtb3RlUmVmLFxuICAgICAgc2luZ2xlQnJhbmNoLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHBydW5lLFxuICAgICAgcHJ1bmVUYWdzLFxuICAgIH0pO1xuICAgIC8vIE1lcmdlIHRoZSByZW1vdGUgdHJhY2tpbmcgYnJhbmNoIGludG8gdGhlIGxvY2FsIG9uZS5cbiAgICBhd2FpdCBfbWVyZ2Uoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIGdpdGRpcixcbiAgICAgIG91cnM6IHJlZixcbiAgICAgIHRoZWlyczogZmV0Y2hIZWFkLFxuICAgICAgZmFzdEZvcndhcmQsXG4gICAgICBmYXN0Rm9yd2FyZE9ubHksXG4gICAgICBtZXNzYWdlOiBgTWVyZ2UgJHtmZXRjaEhlYWREZXNjcmlwdGlvbn1gLFxuICAgICAgYXV0aG9yLFxuICAgICAgY29tbWl0dGVyLFxuICAgICAgc2lnbmluZ0tleSxcbiAgICAgIGRyeVJ1bjogZmFsc2UsXG4gICAgICBub1VwZGF0ZUJyYW5jaDogZmFsc2UsXG4gICAgfSk7XG4gICAgYXdhaXQgX2NoZWNrb3V0KHtcbiAgICAgIGZzLFxuICAgICAgY2FjaGUsXG4gICAgICBvblByb2dyZXNzLFxuICAgICAgZGlyLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVmLFxuICAgICAgcmVtb3RlLFxuICAgICAgbm9DaGVja291dDogZmFsc2UsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LnB1bGwnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIExpa2UgYHB1bGxgLCBidXQgaGFyZC1jb2RlZCB3aXRoIGBmYXN0Rm9yd2FyZDogdHJ1ZWAgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW4gYGF1dGhvcmAgcGFyYW1ldGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7SHR0cENsaWVudH0gYXJncy5odHRwIC0gYW4gSFRUUCBjbGllbnRcbiAqIEBwYXJhbSB7UHJvZ3Jlc3NDYWxsYmFja30gW2FyZ3Mub25Qcm9ncmVzc10gLSBvcHRpb25hbCBwcm9ncmVzcyBldmVudCBjYWxsYmFja1xuICogQHBhcmFtIHtNZXNzYWdlQ2FsbGJhY2t9IFthcmdzLm9uTWVzc2FnZV0gLSBvcHRpb25hbCBtZXNzYWdlIGV2ZW50IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0F1dGhDYWxsYmFja30gW2FyZ3Mub25BdXRoXSAtIG9wdGlvbmFsIGF1dGggZmlsbCBjYWxsYmFja1xuICogQHBhcmFtIHtBdXRoRmFpbHVyZUNhbGxiYWNrfSBbYXJncy5vbkF1dGhGYWlsdXJlXSAtIG9wdGlvbmFsIGF1dGggcmVqZWN0ZWQgY2FsbGJhY2tcbiAqIEBwYXJhbSB7QXV0aFN1Y2Nlc3NDYWxsYmFja30gW2FyZ3Mub25BdXRoU3VjY2Vzc10gLSBvcHRpb25hbCBhdXRoIGFwcHJvdmVkIGNhbGxiYWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZWZdIC0gV2hpY2ggYnJhbmNoIHRvIG1lcmdlIGludG8uIEJ5IGRlZmF1bHQgdGhpcyBpcyB0aGUgY3VycmVudGx5IGNoZWNrZWQgb3V0IGJyYW5jaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy51cmxdIC0gKEFkZGVkIGluIDEuMS4wKSBUaGUgVVJMIG9mIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4gVGhlIGRlZmF1bHQgaXMgdGhlIHZhbHVlIHNldCBpbiB0aGUgZ2l0IGNvbmZpZyBmb3IgdGhhdCByZW1vdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlXSAtIChBZGRlZCBpbiAxLjEuMCkgSWYgVVJMIGlzIG5vdCBzcGVjaWZpZWQsIGRldGVybWluZXMgd2hpY2ggcmVtb3RlIHRvIHVzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZW1vdGVSZWZdIC0gKEFkZGVkIGluIDEuMS4wKSBUaGUgbmFtZSBvZiB0aGUgYnJhbmNoIG9uIHRoZSByZW1vdGUgdG8gZmV0Y2guIEJ5IGRlZmF1bHQgdGhpcyBpcyB0aGUgY29uZmlndXJlZCByZW1vdGUgdHJhY2tpbmcgYnJhbmNoLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNvcnNQcm94eV0gLSBPcHRpb25hbCBbQ09SUyBwcm94eV0oaHR0cHM6Ly93d3cubnBtanMuY29tLyU0MGlzb21vcnBoaWMtZ2l0L2NvcnMtcHJveHkpLiBPdmVycmlkZXMgdmFsdWUgaW4gcmVwbyBjb25maWcuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnNpbmdsZUJyYW5jaCA9IGZhbHNlXSAtIEluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZmV0Y2hpbmcgYWxsIHRoZSBicmFuY2hlcywgb25seSBmZXRjaCBhIHNpbmdsZSBicmFuY2guXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIHN0cmluZz59IFthcmdzLmhlYWRlcnNdIC0gQWRkaXRpb25hbCBoZWFkZXJzIHRvIGluY2x1ZGUgaW4gSFRUUCByZXF1ZXN0cywgc2ltaWxhciB0byBnaXQncyBgZXh0cmFIZWFkZXJgIGNvbmZpZ1xuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aGVuIHB1bGwgb3BlcmF0aW9uIGNvbXBsZXRlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBnaXQuZmFzdEZvcndhcmQoe1xuICogICBmcyxcbiAqICAgaHR0cCxcbiAqICAgZGlyOiAnL3R1dG9yaWFsJyxcbiAqICAgcmVmOiAnbWFpbicsXG4gKiAgIHNpbmdsZUJyYW5jaDogdHJ1ZVxuICogfSlcbiAqIGNvbnNvbGUubG9nKCdkb25lJylcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZhc3RGb3J3YXJkKHtcbiAgZnMsXG4gIGh0dHAsXG4gIG9uUHJvZ3Jlc3MsXG4gIG9uTWVzc2FnZSxcbiAgb25BdXRoLFxuICBvbkF1dGhTdWNjZXNzLFxuICBvbkF1dGhGYWlsdXJlLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICByZWYsXG4gIHVybCxcbiAgcmVtb3RlLFxuICByZW1vdGVSZWYsXG4gIGNvcnNQcm94eSxcbiAgc2luZ2xlQnJhbmNoLFxuICBoZWFkZXJzID0ge30sXG4gIGNhY2hlID0ge30sXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIGZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2h0dHAnLCBodHRwKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG5cbiAgICBjb25zdCB0aGlzV2lsbE5vdEJlVXNlZCA9IHtcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgZW1haWw6ICcnLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgdGltZXpvbmVPZmZzZXQ6IDAsXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCBfcHVsbCh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgY2FjaGUsXG4gICAgICBodHRwLFxuICAgICAgb25Qcm9ncmVzcyxcbiAgICAgIG9uTWVzc2FnZSxcbiAgICAgIG9uQXV0aCxcbiAgICAgIG9uQXV0aFN1Y2Nlc3MsXG4gICAgICBvbkF1dGhGYWlsdXJlLFxuICAgICAgZGlyLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVmLFxuICAgICAgdXJsLFxuICAgICAgcmVtb3RlLFxuICAgICAgcmVtb3RlUmVmLFxuICAgICAgZmFzdEZvcndhcmRPbmx5OiB0cnVlLFxuICAgICAgY29yc1Byb3h5LFxuICAgICAgc2luZ2xlQnJhbmNoLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGF1dGhvcjogdGhpc1dpbGxOb3RCZVVzZWQsXG4gICAgICBjb21taXR0ZXI6IHRoaXNXaWxsTm90QmVVc2VkLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmZhc3RGb3J3YXJkJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gRmV0Y2hSZXN1bHQgLSBUaGUgb2JqZWN0IHJldHVybmVkIGhhcyB0aGUgZm9sbG93aW5nIHNjaGVtYTpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gZGVmYXVsdEJyYW5jaCAtIFRoZSBicmFuY2ggdGhhdCBpcyBjbG9uZWQgaWYgbm8gYnJhbmNoIGlzIHNwZWNpZmllZFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBmZXRjaEhlYWQgLSBUaGUgU0hBLTEgb2JqZWN0IGlkIG9mIHRoZSBmZXRjaGVkIGhlYWQgY29tbWl0XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGZldGNoSGVhZERlc2NyaXB0aW9uIC0gYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBicmFuY2ggdGhhdCB3YXMgZmV0Y2hlZFxuICogQHByb3BlcnR5IHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBbaGVhZGVyc10gLSBUaGUgSFRUUCByZXNwb25zZSBoZWFkZXJzIHJldHVybmVkIGJ5IHRoZSBnaXQgc2VydmVyXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbcHJ1bmVkXSAtIEEgbGlzdCBvZiBicmFuY2hlcyB0aGF0IHdlcmUgcHJ1bmVkLCBpZiB5b3UgcHJvdmlkZWQgdGhlIGBwcnVuZWAgcGFyYW1ldGVyXG4gKlxuICovXG5cbi8qKlxuICogRmV0Y2ggY29tbWl0cyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnlcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge0h0dHBDbGllbnR9IGFyZ3MuaHR0cCAtIGFuIEhUVFAgY2xpZW50XG4gKiBAcGFyYW0ge1Byb2dyZXNzQ2FsbGJhY2t9IFthcmdzLm9uUHJvZ3Jlc3NdIC0gb3B0aW9uYWwgcHJvZ3Jlc3MgZXZlbnQgY2FsbGJhY2tcbiAqIEBwYXJhbSB7TWVzc2FnZUNhbGxiYWNrfSBbYXJncy5vbk1lc3NhZ2VdIC0gb3B0aW9uYWwgbWVzc2FnZSBldmVudCBjYWxsYmFja1xuICogQHBhcmFtIHtBdXRoQ2FsbGJhY2t9IFthcmdzLm9uQXV0aF0gLSBvcHRpb25hbCBhdXRoIGZpbGwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7QXV0aEZhaWx1cmVDYWxsYmFja30gW2FyZ3Mub25BdXRoRmFpbHVyZV0gLSBvcHRpb25hbCBhdXRoIHJlamVjdGVkIGNhbGxiYWNrXG4gKiBAcGFyYW0ge0F1dGhTdWNjZXNzQ2FsbGJhY2t9IFthcmdzLm9uQXV0aFN1Y2Nlc3NdIC0gb3B0aW9uYWwgYXV0aCBhcHByb3ZlZCBjYWxsYmFja1xuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnVybF0gLSBUaGUgVVJMIG9mIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4gVGhlIGRlZmF1bHQgaXMgdGhlIHZhbHVlIHNldCBpbiB0aGUgZ2l0IGNvbmZpZyBmb3IgdGhhdCByZW1vdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlXSAtIElmIFVSTCBpcyBub3Qgc3BlY2lmaWVkLCBkZXRlcm1pbmVzIHdoaWNoIHJlbW90ZSB0byB1c2UuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnNpbmdsZUJyYW5jaCA9IGZhbHNlXSAtIEluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZmV0Y2hpbmcgYWxsIHRoZSBicmFuY2hlcywgb25seSBmZXRjaCBhIHNpbmdsZSBicmFuY2guXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVmXSAtIFdoaWNoIGJyYW5jaCB0byBmZXRjaCBpZiBgc2luZ2xlQnJhbmNoYCBpcyB0cnVlLiBCeSBkZWZhdWx0IHRoaXMgaXMgdGhlIGN1cnJlbnQgYnJhbmNoIG9yIHRoZSByZW1vdGUncyBkZWZhdWx0IGJyYW5jaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZW1vdGVSZWZdIC0gVGhlIG5hbWUgb2YgdGhlIGJyYW5jaCBvbiB0aGUgcmVtb3RlIHRvIGZldGNoIGlmIGBzaW5nbGVCcmFuY2hgIGlzIHRydWUuIEJ5IGRlZmF1bHQgdGhpcyBpcyB0aGUgY29uZmlndXJlZCByZW1vdGUgdHJhY2tpbmcgYnJhbmNoLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy50YWdzID0gZmFsc2VdIC0gQWxzbyBmZXRjaCB0YWdzXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZGVwdGhdIC0gSW50ZWdlci4gRGV0ZXJtaW5lcyBob3cgbXVjaCBvZiB0aGUgZ2l0IHJlcG9zaXRvcnkncyBoaXN0b3J5IHRvIHJldHJpZXZlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnJlbGF0aXZlID0gZmFsc2VdIC0gQ2hhbmdlcyB0aGUgbWVhbmluZyBvZiBgZGVwdGhgIHRvIGJlIG1lYXN1cmVkIGZyb20gdGhlIGN1cnJlbnQgc2hhbGxvdyBkZXB0aCByYXRoZXIgdGhhbiBmcm9tIHRoZSBicmFuY2ggdGlwLlxuICogQHBhcmFtIHtEYXRlfSBbYXJncy5zaW5jZV0gLSBPbmx5IGZldGNoIGNvbW1pdHMgY3JlYXRlZCBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGRlcHRoYC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmV4Y2x1ZGUgPSBbXV0gLSBBIGxpc3Qgb2YgYnJhbmNoZXMgb3IgdGFncy4gSW5zdHJ1Y3RzIHRoZSByZW1vdGUgc2VydmVyIG5vdCB0byBzZW5kIHVzIGFueSBjb21taXRzIHJlYWNoYWJsZSBmcm9tIHRoZXNlIHJlZnMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnBydW5lID0gZmFsc2VdIC0gRGVsZXRlIGxvY2FsIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyB0aGF0IGFyZSBub3QgcHJlc2VudCBvbiB0aGUgcmVtb3RlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnBydW5lVGFncyA9IGZhbHNlXSAtIFBydW5lIGxvY2FsIHRhZ3MgdGhhdCBkb25cdTIwMTl0IGV4aXN0IG9uIHRoZSByZW1vdGUsIGFuZCBmb3JjZS11cGRhdGUgdGhvc2UgdGFncyB0aGF0IGRpZmZlclxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNvcnNQcm94eV0gLSBPcHRpb25hbCBbQ09SUyBwcm94eV0oaHR0cHM6Ly93d3cubnBtanMuY29tLyU0MGlzb21vcnBoaWMtZ2l0L2NvcnMtcHJveHkpLiBPdmVycmlkZXMgdmFsdWUgaW4gcmVwbyBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIHN0cmluZz59IFthcmdzLmhlYWRlcnNdIC0gQWRkaXRpb25hbCBoZWFkZXJzIHRvIGluY2x1ZGUgaW4gSFRUUCByZXF1ZXN0cywgc2ltaWxhciB0byBnaXQncyBgZXh0cmFIZWFkZXJgIGNvbmZpZ1xuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8RmV0Y2hSZXN1bHQ+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2hlbiBmZXRjaCBjb21wbGV0ZXNcbiAqIEBzZWUgRmV0Y2hSZXN1bHRcbiAqXG4gKiBAZXhhbXBsZVxuICogbGV0IHJlc3VsdCA9IGF3YWl0IGdpdC5mZXRjaCh7XG4gKiAgIGZzLFxuICogICBodHRwLFxuICogICBkaXI6ICcvdHV0b3JpYWwnLFxuICogICBjb3JzUHJveHk6ICdodHRwczovL2NvcnMuaXNvbW9ycGhpYy1naXQub3JnJyxcbiAqICAgdXJsOiAnaHR0cHM6Ly9naXRodWIuY29tL2lzb21vcnBoaWMtZ2l0L2lzb21vcnBoaWMtZ2l0JyxcbiAqICAgcmVmOiAnbWFpbicsXG4gKiAgIGRlcHRoOiAxLFxuICogICBzaW5nbGVCcmFuY2g6IHRydWUsXG4gKiAgIHRhZ3M6IGZhbHNlXG4gKiB9KVxuICogY29uc29sZS5sb2cocmVzdWx0KVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2goe1xuICBmcyxcbiAgaHR0cCxcbiAgb25Qcm9ncmVzcyxcbiAgb25NZXNzYWdlLFxuICBvbkF1dGgsXG4gIG9uQXV0aFN1Y2Nlc3MsXG4gIG9uQXV0aEZhaWx1cmUsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIHJlZixcbiAgcmVtb3RlLFxuICByZW1vdGVSZWYsXG4gIHVybCxcbiAgY29yc1Byb3h5LFxuICBkZXB0aCA9IG51bGwsXG4gIHNpbmNlID0gbnVsbCxcbiAgZXhjbHVkZSA9IFtdLFxuICByZWxhdGl2ZSA9IGZhbHNlLFxuICB0YWdzID0gZmFsc2UsXG4gIHNpbmdsZUJyYW5jaCA9IGZhbHNlLFxuICBoZWFkZXJzID0ge30sXG4gIHBydW5lID0gZmFsc2UsXG4gIHBydW5lVGFncyA9IGZhbHNlLFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdodHRwJywgaHR0cCk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IF9mZXRjaCh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgY2FjaGUsXG4gICAgICBodHRwLFxuICAgICAgb25Qcm9ncmVzcyxcbiAgICAgIG9uTWVzc2FnZSxcbiAgICAgIG9uQXV0aCxcbiAgICAgIG9uQXV0aFN1Y2Nlc3MsXG4gICAgICBvbkF1dGhGYWlsdXJlLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVmLFxuICAgICAgcmVtb3RlLFxuICAgICAgcmVtb3RlUmVmLFxuICAgICAgdXJsLFxuICAgICAgY29yc1Byb3h5LFxuICAgICAgZGVwdGgsXG4gICAgICBzaW5jZSxcbiAgICAgIGV4Y2x1ZGUsXG4gICAgICByZWxhdGl2ZSxcbiAgICAgIHRhZ3MsXG4gICAgICBzaW5nbGVCcmFuY2gsXG4gICAgICBoZWFkZXJzLFxuICAgICAgcHJ1bmUsXG4gICAgICBwcnVuZVRhZ3MsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuZmV0Y2gnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEZpbmQgdGhlIG1lcmdlIGJhc2UgZm9yIGEgc2V0IG9mIGNvbW1pdHNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLm9pZHMgLSBXaGljaCBjb21taXRzXG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3MuY2FjaGVdIC0gYSBbY2FjaGVdKGNhY2hlLm1kKSBvYmplY3RcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRNZXJnZUJhc2Uoe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgb2lkcyxcbiAgY2FjaGUgPSB7fSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ29pZHMnLCBvaWRzKTtcblxuICAgIHJldHVybiBhd2FpdCBfZmluZE1lcmdlQmFzZSh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgY2FjaGUsXG4gICAgICBnaXRkaXIsXG4gICAgICBvaWRzLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmZpbmRNZXJnZUJhc2UnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEZpbmQgdGhlIHJvb3QgZ2l0IGRpcmVjdG9yeVxuICpcbiAqIFN0YXJ0aW5nIGF0IGBmaWxlcGF0aGAsIHdhbGtzIHVwd2FyZCB1bnRpbCBpdCBmaW5kcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGEgc3ViZGlyZWN0b3J5IGNhbGxlZCAnLmdpdCcuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZpbGVwYXRoXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdpdGggYSByb290IGdpdCBkaXJlY3RvcnkgcGF0aFxuICovXG5hc3luYyBmdW5jdGlvbiBfZmluZFJvb3QoeyBmcywgZmlsZXBhdGggfSkge1xuICBpZiAoYXdhaXQgZnMuZXhpc3RzKGpvaW4oZmlsZXBhdGgsICcuZ2l0JykpKSB7XG4gICAgcmV0dXJuIGZpbGVwYXRoXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShmaWxlcGF0aCk7XG4gICAgaWYgKHBhcmVudCA9PT0gZmlsZXBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBnaXQgcm9vdCBmb3IgJHtmaWxlcGF0aH1gKVxuICAgIH1cbiAgICByZXR1cm4gX2ZpbmRSb290KHsgZnMsIGZpbGVwYXRoOiBwYXJlbnQgfSlcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBGaW5kIHRoZSByb290IGdpdCBkaXJlY3RvcnlcbiAqXG4gKiBTdGFydGluZyBhdCBgZmlsZXBhdGhgLCB3YWxrcyB1cHdhcmQgdW50aWwgaXQgZmluZHMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBhIHN1YmRpcmVjdG9yeSBjYWxsZWQgJy5naXQnLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZpbGVwYXRoIC0gVGhlIGZpbGUgZGlyZWN0b3J5IHRvIHN0YXJ0IHNlYXJjaGluZyBpbi5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCBhIHJvb3QgZ2l0IGRpcmVjdG9yeSBwYXRoXG4gKiBAdGhyb3dzIHtOb3RGb3VuZEVycm9yfVxuICpcbiAqIEBleGFtcGxlXG4gKiBsZXQgZ2l0cm9vdCA9IGF3YWl0IGdpdC5maW5kUm9vdCh7XG4gKiAgIGZzLFxuICogICBmaWxlcGF0aDogJy90dXRvcmlhbC9zcmMvdXRpbHMnXG4gKiB9KVxuICogY29uc29sZS5sb2coZ2l0cm9vdClcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRSb290KHsgZnMsIGZpbGVwYXRoIH0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZmlsZXBhdGgnLCBmaWxlcGF0aCk7XG5cbiAgICByZXR1cm4gYXdhaXQgX2ZpbmRSb290KHsgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSwgZmlsZXBhdGggfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuZmluZFJvb3QnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFJlYWQgYW4gZW50cnkgZnJvbSB0aGUgZ2l0IGNvbmZpZyBmaWxlcy5cbiAqXG4gKiAqQ2F2ZWF0czoqXG4gKiAtIEN1cnJlbnRseSBvbmx5IHRoZSBsb2NhbCBgJEdJVF9ESVIvY29uZmlnYCBmaWxlIGNhbiBiZSByZWFkIG9yIHdyaXR0ZW4uIEhvd2V2ZXIgc3VwcG9ydCBmb3IgdGhlIGdsb2JhbCBgfi8uZ2l0Y29uZmlnYCBhbmQgc3lzdGVtIGAkKHByZWZpeCkvZXRjL2dpdGNvbmZpZ2Agd2lsbCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLlxuICogLSBUaGUgY3VycmVudCBwYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgbW9yZSBleG90aWMgZmVhdHVyZXMgb2YgdGhlIGdpdC1jb25maWcgZmlsZSBmb3JtYXQgc3VjaCBhcyBgW2luY2x1ZGVdYCBhbmQgYFtpbmNsdWRlSWZdYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnBhdGggLSBUaGUga2V5IG9mIHRoZSBnaXQgY29uZmlnIGVudHJ5XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzb2x2ZXMgd2l0aCB0aGUgY29uZmlnIHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlYWQgY29uZmlnIHZhbHVlXG4gKiBsZXQgdmFsdWUgPSBhd2FpdCBnaXQuZ2V0Q29uZmlnKHtcbiAqICAgZnMsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIHBhdGg6ICdyZW1vdGUub3JpZ2luLnVybCdcbiAqIH0pXG4gKiBjb25zb2xlLmxvZyh2YWx1ZSlcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENvbmZpZyh7IGZzLCBkaXIsIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLCBwYXRoIH0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ3BhdGgnLCBwYXRoKTtcblxuICAgIHJldHVybiBhd2FpdCBfZ2V0Q29uZmlnKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBnaXRkaXIsXG4gICAgICBwYXRoLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmdldENvbmZpZyc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdpdGRpclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucGF0aFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGFueT4+fSBSZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSBjb25maWcgdmFsdWVcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9nZXRDb25maWdBbGwoeyBmcywgZ2l0ZGlyLCBwYXRoIH0pIHtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgR2l0Q29uZmlnTWFuYWdlci5nZXQoeyBmcywgZ2l0ZGlyIH0pO1xuICByZXR1cm4gY29uZmlnLmdldGFsbChwYXRoKVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBSZWFkIGEgbXVsdGktdmFsdWVkIGVudHJ5IGZyb20gdGhlIGdpdCBjb25maWcgZmlsZXMuXG4gKlxuICogKkNhdmVhdHM6KlxuICogLSBDdXJyZW50bHkgb25seSB0aGUgbG9jYWwgYCRHSVRfRElSL2NvbmZpZ2AgZmlsZSBjYW4gYmUgcmVhZCBvciB3cml0dGVuLiBIb3dldmVyIHN1cHBvcnQgZm9yIHRoZSBnbG9iYWwgYH4vLmdpdGNvbmZpZ2AgYW5kIHN5c3RlbSBgJChwcmVmaXgpL2V0Yy9naXRjb25maWdgIHdpbGwgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS5cbiAqIC0gVGhlIGN1cnJlbnQgcGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIG1vcmUgZXhvdGljIGZlYXR1cmVzIG9mIHRoZSBnaXQtY29uZmlnIGZpbGUgZm9ybWF0IHN1Y2ggYXMgYFtpbmNsdWRlXWAgYW5kIGBbaW5jbHVkZUlmXWAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wYXRoIC0gVGhlIGtleSBvZiB0aGUgZ2l0IGNvbmZpZyBlbnRyeVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGFueT4+fSBSZXNvbHZlcyB3aXRoIHRoZSBjb25maWcgdmFsdWVcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENvbmZpZ0FsbCh7XG4gIGZzLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICBwYXRoLFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcigncGF0aCcsIHBhdGgpO1xuXG4gICAgcmV0dXJuIGF3YWl0IF9nZXRDb25maWdBbGwoe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGdpdGRpcixcbiAgICAgIHBhdGgsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuZ2V0Q29uZmlnQWxsJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0UmVtb3RlSW5mb1Jlc3VsdCAtIFRoZSBvYmplY3QgcmV0dXJuZWQgaGFzIHRoZSBmb2xsb3dpbmcgc2NoZW1hOlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY2FwYWJpbGl0aWVzIC0gVGhlIGxpc3Qgb2YgY2FwYWJpbGl0aWVzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgKHBhcnQgb2YgdGhlIEdpdCBwcm90b2NvbClcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbcmVmc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSEVBRF0gLSBUaGUgZGVmYXVsdCBicmFuY2ggb2YgdGhlIHJlbW90ZVxuICogQHByb3BlcnR5IHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBbcmVmcy5oZWFkc10gLSBUaGUgYnJhbmNoZXMgb24gdGhlIHJlbW90ZVxuICogQHByb3BlcnR5IHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBbcmVmcy5wdWxsXSAtIFRoZSBzcGVjaWFsIGJyYW5jaGVzIHJlcHJlc2VudGluZyBwdWxsIHJlcXVlc3RzIChub24tc3RhbmRhcmQpXG4gKiBAcHJvcGVydHkge09iamVjdDxzdHJpbmcsIHN0cmluZz59IFtyZWZzLnRhZ3NdIC0gVGhlIHRhZ3Mgb24gdGhlIHJlbW90ZVxuICpcbiAqL1xuXG4vKipcbiAqIExpc3QgYSByZW1vdGUgc2VydmVycyBicmFuY2hlcywgdGFncywgYW5kIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBUaGlzIGlzIGEgcmFyZSBjb21tYW5kIHRoYXQgZG9lc24ndCByZXF1aXJlIGFuIGBmc2AsIGBkaXJgLCBvciBldmVuIGBnaXRkaXJgIGFyZ3VtZW50LlxuICogSXQganVzdCBjb21tdW5pY2F0ZXMgdG8gYSByZW1vdGUgZ2l0IHNlcnZlciwgdXNpbmcgdGhlIGZpcnN0IHN0ZXAgb2YgdGhlIGBnaXQtdXBsb2FkLXBhY2tgIGhhbmRzaGFrZSwgYnV0IHN0b3BwaW5nIHNob3J0IG9mIGZldGNoaW5nIHRoZSBwYWNrZmlsZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtIdHRwQ2xpZW50fSBhcmdzLmh0dHAgLSBhbiBIVFRQIGNsaWVudFxuICogQHBhcmFtIHtBdXRoQ2FsbGJhY2t9IFthcmdzLm9uQXV0aF0gLSBvcHRpb25hbCBhdXRoIGZpbGwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7QXV0aEZhaWx1cmVDYWxsYmFja30gW2FyZ3Mub25BdXRoRmFpbHVyZV0gLSBvcHRpb25hbCBhdXRoIHJlamVjdGVkIGNhbGxiYWNrXG4gKiBAcGFyYW0ge0F1dGhTdWNjZXNzQ2FsbGJhY2t9IFthcmdzLm9uQXV0aFN1Y2Nlc3NdIC0gb3B0aW9uYWwgYXV0aCBhcHByb3ZlZCBjYWxsYmFja1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudXJsIC0gVGhlIFVSTCBvZiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIFdpbGwgYmUgZ290dGVuIGZyb20gZ2l0Y29uZmlnIGlmIGFic2VudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb3JzUHJveHldIC0gT3B0aW9uYWwgW0NPUlMgcHJveHldKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS8lNDBpc29tb3JwaGljLWdpdC9jb3JzLXByb3h5KS4gT3ZlcnJpZGVzIHZhbHVlIGluIHJlcG8gY29uZmlnLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JQdXNoID0gZmFsc2VdIC0gQnkgZGVmYXVsdCwgdGhlIGNvbW1hbmQgcXVlcmllcyB0aGUgJ2ZldGNoJyBjYXBhYmlsaXRpZXMuIElmIHRydWUsIGl0IHdpbGwgYXNrIGZvciB0aGUgJ3B1c2gnIGNhcGFiaWxpdGllcy5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuaGVhZGVyc10gLSBBZGRpdGlvbmFsIGhlYWRlcnMgdG8gaW5jbHVkZSBpbiBIVFRQIHJlcXVlc3RzLCBzaW1pbGFyIHRvIGdpdCdzIGBleHRyYUhlYWRlcmAgY29uZmlnXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8R2V0UmVtb3RlSW5mb1Jlc3VsdD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIGFuIG9iamVjdCBsaXN0aW5nIHRoZSBicmFuY2hlcywgdGFncywgYW5kIGNhcGFiaWxpdGllcyBvZiB0aGUgcmVtb3RlLlxuICogQHNlZSBHZXRSZW1vdGVJbmZvUmVzdWx0XG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCBpbmZvID0gYXdhaXQgZ2l0LmdldFJlbW90ZUluZm8oe1xuICogICBodHRwLFxuICogICB1cmw6XG4gKiAgICAgXCJodHRwczovL2NvcnMuaXNvbW9ycGhpYy1naXQub3JnL2dpdGh1Yi5jb20vaXNvbW9ycGhpYy1naXQvaXNvbW9ycGhpYy1naXQuZ2l0XCJcbiAqIH0pO1xuICogY29uc29sZS5sb2coaW5mbyk7XG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZW1vdGVJbmZvKHtcbiAgaHR0cCxcbiAgb25BdXRoLFxuICBvbkF1dGhTdWNjZXNzLFxuICBvbkF1dGhGYWlsdXJlLFxuICBjb3JzUHJveHksXG4gIHVybCxcbiAgaGVhZGVycyA9IHt9LFxuICBmb3JQdXNoID0gZmFsc2UsXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdodHRwJywgaHR0cCk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCd1cmwnLCB1cmwpO1xuXG4gICAgY29uc3QgR2l0UmVtb3RlSFRUUCA9IEdpdFJlbW90ZU1hbmFnZXIuZ2V0UmVtb3RlSGVscGVyRm9yKHsgdXJsIH0pO1xuICAgIGNvbnN0IHJlbW90ZSA9IGF3YWl0IEdpdFJlbW90ZUhUVFAuZGlzY292ZXIoe1xuICAgICAgaHR0cCxcbiAgICAgIG9uQXV0aCxcbiAgICAgIG9uQXV0aFN1Y2Nlc3MsXG4gICAgICBvbkF1dGhGYWlsdXJlLFxuICAgICAgY29yc1Byb3h5LFxuICAgICAgc2VydmljZTogZm9yUHVzaCA/ICdnaXQtcmVjZWl2ZS1wYWNrJyA6ICdnaXQtdXBsb2FkLXBhY2snLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHByb3RvY29sVmVyc2lvbjogMSxcbiAgICB9KTtcblxuICAgIC8vIE5vdGU6IHJlbW90ZS5jYXBhYmlsaXRpZXMsIHJlbW90ZS5yZWZzLCBhbmQgcmVtb3RlLnN5bXJlZnMgYXJlIFNldCBhbmQgTWFwIG9iamVjdHMsXG4gICAgLy8gYnV0IG9uZSBvZiB0aGUgb2JqZWN0aXZlcyBvZiB0aGUgcHVibGljIEFQSSBpcyB0byBhbHdheXMgcmV0dXJuIEpTT04tY29tcGF0aWJsZSBvYmplY3RzXG4gICAgLy8gc28gd2UgbXVzdCBKU09OaWZ5IHRoZW0uXG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgY2FwYWJpbGl0aWVzOiBbLi4ucmVtb3RlLmNhcGFiaWxpdGllc10sXG4gICAgfTtcbiAgICAvLyBDb252ZXJ0IHRoZSBmbGF0IGxpc3QgaW50byBhbiBvYmplY3QgdHJlZSwgYmVjYXVzZSBJIGZpZ3VyZSA5OSUgb2YgdGhlIHRpbWVcbiAgICAvLyB0aGF0IHdpbGwgYmUgZWFzaWVyIHRvIHVzZS5cbiAgICBmb3IgKGNvbnN0IFtyZWYsIG9pZF0gb2YgcmVtb3RlLnJlZnMpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gcmVmLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBsYXN0ID0gcGFydHMucG9wKCk7XG4gICAgICBsZXQgbyA9IHJlc3VsdDtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICBvW3BhcnRdID0gb1twYXJ0XSB8fCB7fTtcbiAgICAgICAgbyA9IG9bcGFydF07XG4gICAgICB9XG4gICAgICBvW2xhc3RdID0gb2lkO1xuICAgIH1cbiAgICAvLyBNZXJnZSBzeW1yZWZzIG9uIHRvcCBvZiByZWZzIHRvIG1vcmUgY2xvc2VseSBtYXRjaCBhY3R1YWwgZ2l0IHJlcG8gbGF5b3V0c1xuICAgIGZvciAoY29uc3QgW3N5bXJlZiwgcmVmXSBvZiByZW1vdGUuc3ltcmVmcykge1xuICAgICAgY29uc3QgcGFydHMgPSBzeW1yZWYuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IGxhc3QgPSBwYXJ0cy5wb3AoKTtcbiAgICAgIGxldCBvID0gcmVzdWx0O1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgIG9bcGFydF0gPSBvW3BhcnRdIHx8IHt9O1xuICAgICAgICBvID0gb1twYXJ0XTtcbiAgICAgIH1cbiAgICAgIG9bbGFzdF0gPSByZWY7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuZ2V0UmVtb3RlSW5mbyc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHJlbW90ZVxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtib29sZWFufSBzeW1yZWZzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHBlZWxUYWdzXG4gKiBAcmV0dXJucyB7U2VydmVyUmVmW119XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdEluZm9SZWZzKHJlbW90ZSwgcHJlZml4LCBzeW1yZWZzLCBwZWVsVGFncykge1xuICBjb25zdCByZWZzID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlbW90ZS5yZWZzKSB7XG4gICAgaWYgKHByZWZpeCAmJiAha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWVcblxuICAgIGlmIChrZXkuZW5kc1dpdGgoJ157fScpKSB7XG4gICAgICBpZiAocGVlbFRhZ3MpIHtcbiAgICAgICAgY29uc3QgX2tleSA9IGtleS5yZXBsYWNlKCdee30nLCAnJyk7XG4gICAgICAgIC8vIFBlZWxlZCB0YWdzIGFyZSBhbG1vc3QgYWx3YXlzIGxpc3RlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgb3JpZ2luYWwgdGFnXG4gICAgICAgIGNvbnN0IGxhc3QgPSByZWZzW3JlZnMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IHIgPSBsYXN0LnJlZiA9PT0gX2tleSA/IGxhc3QgOiByZWZzLmZpbmQoeCA9PiB4LnJlZiA9PT0gX2tleSk7XG4gICAgICAgIGlmIChyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0kgZGlkIG5vdCBleHBlY3QgdGhpcyB0byBoYXBwZW4nKVxuICAgICAgICB9XG4gICAgICAgIHIucGVlbGVkID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICAvKiogQHR5cGUgU2VydmVyUmVmICovXG4gICAgY29uc3QgcmVmID0geyByZWY6IGtleSwgb2lkOiB2YWx1ZSB9O1xuICAgIGlmIChzeW1yZWZzKSB7XG4gICAgICBpZiAocmVtb3RlLnN5bXJlZnMuaGFzKGtleSkpIHtcbiAgICAgICAgcmVmLnRhcmdldCA9IHJlbW90ZS5zeW1yZWZzLmdldChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZWZzLnB1c2gocmVmKTtcbiAgfVxuICByZXR1cm4gcmVmc1xufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRSZW1vdGVJbmZvMlJlc3VsdCAtIFRoaXMgb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIHNjaGVtYTpcbiAqIEBwcm9wZXJ0eSB7MSB8IDJ9IHByb3RvY29sVmVyc2lvbiAtIEdpdCBwcm90b2NvbCB2ZXJzaW9uIHRoZSBzZXJ2ZXIgc3VwcG9ydHNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0PHN0cmluZywgc3RyaW5nIHwgdHJ1ZT59IGNhcGFiaWxpdGllcyAtIEFuIG9iamVjdCBvZiBjYXBhYmlsaXRpZXMgcmVwcmVzZW50ZWQgYXMga2V5cyBhbmQgdmFsdWVzXG4gKiBAcHJvcGVydHkge1NlcnZlclJlZltdfSBbcmVmc10gLSBTZXJ2ZXIgcmVmcyAodGhleSBnZXQgcmV0dXJuZWQgYnkgcHJvdG9jb2wgdmVyc2lvbiAxIHdoZXRoZXIgeW91IHdhbnQgdGhlbSBvciBub3QpXG4gKi9cblxuLyoqXG4gKiBMaXN0IGEgcmVtb3RlIHNlcnZlcidzIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBUaGlzIGlzIGEgcmFyZSBjb21tYW5kIHRoYXQgZG9lc24ndCByZXF1aXJlIGFuIGBmc2AsIGBkaXJgLCBvciBldmVuIGBnaXRkaXJgIGFyZ3VtZW50LlxuICogSXQganVzdCBjb21tdW5pY2F0ZXMgdG8gYSByZW1vdGUgZ2l0IHNlcnZlciwgZGV0ZXJtaW5pbmcgd2hhdCBwcm90b2NvbCB2ZXJzaW9uLCBjb21tYW5kcywgYW5kIGZlYXR1cmVzIGl0IHN1cHBvcnRzLlxuICpcbiAqID4gVGhlIHN1Y2Nlc3NvciB0byBbYGdldFJlbW90ZUluZm9gXSguL2dldFJlbW90ZUluZm8ubWQpLCB0aGlzIGNvbW1hbmQgc3VwcG9ydHMgR2l0IFdpcmUgUHJvdG9jb2wgVmVyc2lvbiAyLlxuICogPiBUaGVyZWZvcmUgaXRzIHJldHVybiB0eXBlIGlzIG1vcmUgY29tcGxpY2F0ZWQgYXMgZWl0aGVyOlxuICogPlxuICogPiAtIHYxIGNhcGFiaWxpdGllcyAoYW5kIHJlZnMpIG9yXG4gKiA+IC0gdjIgY2FwYWJpbGl0aWVzIChhbmQgbm8gcmVmcylcbiAqID5cbiAqID4gYXJlIHJldHVybmVkLlxuICogPiBJZiB5b3UganVzdCBjYXJlIGFib3V0IHJlZnMsIHVzZSBbYGxpc3RTZXJ2ZXJSZWZzYF0oLi9saXN0U2VydmVyUmVmcy5tZClcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtIdHRwQ2xpZW50fSBhcmdzLmh0dHAgLSBhbiBIVFRQIGNsaWVudFxuICogQHBhcmFtIHtBdXRoQ2FsbGJhY2t9IFthcmdzLm9uQXV0aF0gLSBvcHRpb25hbCBhdXRoIGZpbGwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7QXV0aEZhaWx1cmVDYWxsYmFja30gW2FyZ3Mub25BdXRoRmFpbHVyZV0gLSBvcHRpb25hbCBhdXRoIHJlamVjdGVkIGNhbGxiYWNrXG4gKiBAcGFyYW0ge0F1dGhTdWNjZXNzQ2FsbGJhY2t9IFthcmdzLm9uQXV0aFN1Y2Nlc3NdIC0gb3B0aW9uYWwgYXV0aCBhcHByb3ZlZCBjYWxsYmFja1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudXJsIC0gVGhlIFVSTCBvZiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIFdpbGwgYmUgZ290dGVuIGZyb20gZ2l0Y29uZmlnIGlmIGFic2VudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb3JzUHJveHldIC0gT3B0aW9uYWwgW0NPUlMgcHJveHldKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS8lNDBpc29tb3JwaGljLWdpdC9jb3JzLXByb3h5KS4gT3ZlcnJpZGVzIHZhbHVlIGluIHJlcG8gY29uZmlnLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JQdXNoID0gZmFsc2VdIC0gQnkgZGVmYXVsdCwgdGhlIGNvbW1hbmQgcXVlcmllcyB0aGUgJ2ZldGNoJyBjYXBhYmlsaXRpZXMuIElmIHRydWUsIGl0IHdpbGwgYXNrIGZvciB0aGUgJ3B1c2gnIGNhcGFiaWxpdGllcy5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuaGVhZGVyc10gLSBBZGRpdGlvbmFsIGhlYWRlcnMgdG8gaW5jbHVkZSBpbiBIVFRQIHJlcXVlc3RzLCBzaW1pbGFyIHRvIGdpdCdzIGBleHRyYUhlYWRlcmAgY29uZmlnXG4gKiBAcGFyYW0gezEgfCAyfSBbYXJncy5wcm90b2NvbFZlcnNpb24gPSAyXSAtIFdoaWNoIHZlcnNpb24gb2YgdGhlIEdpdCBQcm90b2NvbCB0byB1c2UuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8R2V0UmVtb3RlSW5mbzJSZXN1bHQ+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCBhbiBvYmplY3QgbGlzdGluZyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSByZW1vdGUuXG4gKiBAc2VlIEdldFJlbW90ZUluZm8yUmVzdWx0XG4gKiBAc2VlIFNlcnZlclJlZlxuICpcbiAqIEBleGFtcGxlXG4gKiBsZXQgaW5mbyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVJbmZvMih7XG4gKiAgIGh0dHAsXG4gKiAgIGNvcnNQcm94eTogXCJodHRwczovL2NvcnMuaXNvbW9ycGhpYy1naXQub3JnXCIsXG4gKiAgIHVybDogXCJodHRwczovL2dpdGh1Yi5jb20vaXNvbW9ycGhpYy1naXQvaXNvbW9ycGhpYy1naXQuZ2l0XCJcbiAqIH0pO1xuICogY29uc29sZS5sb2coaW5mbyk7XG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZW1vdGVJbmZvMih7XG4gIGh0dHAsXG4gIG9uQXV0aCxcbiAgb25BdXRoU3VjY2VzcyxcbiAgb25BdXRoRmFpbHVyZSxcbiAgY29yc1Byb3h5LFxuICB1cmwsXG4gIGhlYWRlcnMgPSB7fSxcbiAgZm9yUHVzaCA9IGZhbHNlLFxuICBwcm90b2NvbFZlcnNpb24gPSAyLFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignaHR0cCcsIGh0dHApO1xuICAgIGFzc2VydFBhcmFtZXRlcigndXJsJywgdXJsKTtcblxuICAgIGNvbnN0IEdpdFJlbW90ZUhUVFAgPSBHaXRSZW1vdGVNYW5hZ2VyLmdldFJlbW90ZUhlbHBlckZvcih7IHVybCB9KTtcbiAgICBjb25zdCByZW1vdGUgPSBhd2FpdCBHaXRSZW1vdGVIVFRQLmRpc2NvdmVyKHtcbiAgICAgIGh0dHAsXG4gICAgICBvbkF1dGgsXG4gICAgICBvbkF1dGhTdWNjZXNzLFxuICAgICAgb25BdXRoRmFpbHVyZSxcbiAgICAgIGNvcnNQcm94eSxcbiAgICAgIHNlcnZpY2U6IGZvclB1c2ggPyAnZ2l0LXJlY2VpdmUtcGFjaycgOiAnZ2l0LXVwbG9hZC1wYWNrJyxcbiAgICAgIHVybCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBwcm90b2NvbFZlcnNpb24sXG4gICAgfSk7XG5cbiAgICBpZiAocmVtb3RlLnByb3RvY29sVmVyc2lvbiA9PT0gMikge1xuICAgICAgLyoqIEB0eXBlIEdldFJlbW90ZUluZm8yUmVzdWx0ICovXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbFZlcnNpb246IHJlbW90ZS5wcm90b2NvbFZlcnNpb24sXG4gICAgICAgIGNhcGFiaWxpdGllczogcmVtb3RlLmNhcGFiaWxpdGllczIsXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm90ZTogcmVtb3RlLmNhcGFiaWxpdGllcywgcmVtb3RlLnJlZnMsIGFuZCByZW1vdGUuc3ltcmVmcyBhcmUgU2V0IGFuZCBNYXAgb2JqZWN0cyxcbiAgICAvLyBidXQgb25lIG9mIHRoZSBvYmplY3RpdmVzIG9mIHRoZSBwdWJsaWMgQVBJIGlzIHRvIGFsd2F5cyByZXR1cm4gSlNPTi1jb21wYXRpYmxlIG9iamVjdHNcbiAgICAvLyBzbyB3ZSBtdXN0IEpTT05pZnkgdGhlbS5cbiAgICAvKiogQHR5cGUgT2JqZWN0PHN0cmluZywgdHJ1ZT4gKi9cbiAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGNhcCBvZiByZW1vdGUuY2FwYWJpbGl0aWVzKSB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBjYXAuc3BsaXQoJz0nKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBjYXBhYmlsaXRpZXNba2V5XSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FwYWJpbGl0aWVzW2tleV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiogQHR5cGUgR2V0UmVtb3RlSW5mbzJSZXN1bHQgKi9cbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2xWZXJzaW9uOiAxLFxuICAgICAgY2FwYWJpbGl0aWVzLFxuICAgICAgcmVmczogZm9ybWF0SW5mb1JlZnMocmVtb3RlLCB1bmRlZmluZWQsIHRydWUsIHRydWUpLFxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuZ2V0UmVtb3RlSW5mbzInO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc2hPYmplY3Qoe1xuICB0eXBlLFxuICBvYmplY3QsXG4gIGZvcm1hdCA9ICdjb250ZW50JyxcbiAgb2lkID0gdW5kZWZpbmVkLFxufSkge1xuICBpZiAoZm9ybWF0ICE9PSAnZGVmbGF0ZWQnKSB7XG4gICAgaWYgKGZvcm1hdCAhPT0gJ3dyYXBwZWQnKSB7XG4gICAgICBvYmplY3QgPSBHaXRPYmplY3Qud3JhcCh7IHR5cGUsIG9iamVjdCB9KTtcbiAgICB9XG4gICAgb2lkID0gYXdhaXQgc2hhc3VtKG9iamVjdCk7XG4gIH1cbiAgcmV0dXJuIHsgb2lkLCBvYmplY3QgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSGFzaEJsb2JSZXN1bHQgLSBUaGUgb2JqZWN0IHJldHVybmVkIGhhcyB0aGUgZm9sbG93aW5nIHNjaGVtYTpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvaWQgLSBUaGUgU0hBLTEgb2JqZWN0IGlkXG4gKiBAcHJvcGVydHkgeydibG9iJ30gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7VWludDhBcnJheX0gb2JqZWN0IC0gVGhlIHdyYXBwZWQgZ2l0IG9iamVjdCAodGhlIHRoaW5nIHRoYXQgaXMgaGFzaGVkKVxuICogQHByb3BlcnR5IHsnd3JhcHBlZCd9IGZvcm1hdCAtIFRoZSBmb3JtYXQgb2YgdGhlIG9iamVjdFxuICpcbiAqL1xuXG4vKipcbiAqIENvbXB1dGUgd2hhdCB0aGUgU0hBLTEgb2JqZWN0IGlkIG9mIGEgZmlsZSB3b3VsZCBiZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl8c3RyaW5nfSBhcmdzLm9iamVjdCAtIFRoZSBvYmplY3QgdG8gd3JpdGUuIElmIGBvYmplY3RgIGlzIGEgU3RyaW5nIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBVaW50OEFycmF5IHVzaW5nIFVURi04IGVuY29kaW5nLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEhhc2hCbG9iUmVzdWx0Pn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdpdGggdGhlIFNIQS0xIG9iamVjdCBpZCBhbmQgdGhlIHdyYXBwZWQgb2JqZWN0IFVpbnQ4QXJyYXkuXG4gKiBAc2VlIEhhc2hCbG9iUmVzdWx0XG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCB7IG9pZCwgdHlwZSwgb2JqZWN0LCBmb3JtYXQgfSA9IGF3YWl0IGdpdC5oYXNoQmxvYih7XG4gKiAgIG9iamVjdDogJ0hlbGxvIHdvcmxkIScsXG4gKiB9KVxuICpcbiAqIGNvbnNvbGUubG9nKCdvaWQnLCBvaWQpXG4gKiBjb25zb2xlLmxvZygndHlwZScsIHR5cGUpXG4gKiBjb25zb2xlLmxvZygnb2JqZWN0Jywgb2JqZWN0KVxuICogY29uc29sZS5sb2coJ2Zvcm1hdCcsIGZvcm1hdClcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhc2hCbG9iKHsgb2JqZWN0IH0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ29iamVjdCcsIG9iamVjdCk7XG5cbiAgICAvLyBDb252ZXJ0IG9iamVjdCB0byBidWZmZXJcbiAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9iamVjdCA9IEJ1ZmZlci5mcm9tKG9iamVjdCwgJ3V0ZjgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqZWN0ID0gQnVmZmVyLmZyb20ob2JqZWN0KTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gJ2Jsb2InO1xuICAgIGNvbnN0IHsgb2lkLCBvYmplY3Q6IF9vYmplY3QgfSA9IGF3YWl0IGhhc2hPYmplY3Qoe1xuICAgICAgdHlwZTogJ2Jsb2InLFxuICAgICAgZm9ybWF0OiAnY29udGVudCcsXG4gICAgICBvYmplY3QsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgb2lkLCB0eXBlLCBvYmplY3Q6IG5ldyBVaW50OEFycmF5KF9vYmplY3QpLCBmb3JtYXQ6ICd3cmFwcGVkJyB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0Lmhhc2hCbG9iJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHthbnl9IGFyZ3MuY2FjaGVcbiAqIEBwYXJhbSB7UHJvZ3Jlc3NDYWxsYmFja30gW2FyZ3Mub25Qcm9ncmVzc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRpclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5maWxlcGF0aFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHtvaWRzOiBzdHJpbmdbXX0+fVxuICovXG5hc3luYyBmdW5jdGlvbiBfaW5kZXhQYWNrKHtcbiAgZnMsXG4gIGNhY2hlLFxuICBvblByb2dyZXNzLFxuICBkaXIsXG4gIGdpdGRpcixcbiAgZmlsZXBhdGgsXG59KSB7XG4gIHRyeSB7XG4gICAgZmlsZXBhdGggPSBqb2luKGRpciwgZmlsZXBhdGgpO1xuICAgIGNvbnN0IHBhY2sgPSBhd2FpdCBmcy5yZWFkKGZpbGVwYXRoKTtcbiAgICBjb25zdCBnZXRFeHRlcm5hbFJlZkRlbHRhID0gb2lkID0+IF9yZWFkT2JqZWN0KHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCB9KTtcbiAgICBjb25zdCBpZHggPSBhd2FpdCBHaXRQYWNrSW5kZXguZnJvbVBhY2soe1xuICAgICAgcGFjayxcbiAgICAgIGdldEV4dGVybmFsUmVmRGVsdGEsXG4gICAgICBvblByb2dyZXNzLFxuICAgIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlKGZpbGVwYXRoLnJlcGxhY2UoL1xcLnBhY2skLywgJy5pZHgnKSwgYXdhaXQgaWR4LnRvQnVmZmVyKCkpO1xuICAgIHJldHVybiB7XG4gICAgICBvaWRzOiBbLi4uaWR4Lmhhc2hlc10sXG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5pbmRleFBhY2snO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgLmlkeCBmaWxlIGZvciBhIGdpdmVuIC5wYWNrIGZpbGVcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge1Byb2dyZXNzQ2FsbGJhY2t9IFthcmdzLm9uUHJvZ3Jlc3NdIC0gb3B0aW9uYWwgcHJvZ3Jlc3MgZXZlbnQgY2FsbGJhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRpciAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5maWxlcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSAucGFjayBmaWxlIHRvIGluZGV4XG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3MuY2FjaGVdIC0gYSBbY2FjaGVdKGNhY2hlLm1kKSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7b2lkczogc3RyaW5nW119Pn0gUmVzb2x2ZXMgd2l0aCBhIGxpc3Qgb2YgdGhlIFNIQS0xIG9iamVjdCBpZHMgY29udGFpbmVkIGluIHRoZSBwYWNrZmlsZVxuICpcbiAqIEBleGFtcGxlXG4gKiBsZXQgcGFja2ZpbGVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcignL3R1dG9yaWFsLy5naXQvb2JqZWN0cy9wYWNrJylcbiAqIHBhY2tmaWxlcyA9IHBhY2tmaWxlcy5maWx0ZXIobmFtZSA9PiBuYW1lLmVuZHNXaXRoKCcucGFjaycpKVxuICogY29uc29sZS5sb2coJ3BhY2tmaWxlcycsIHBhY2tmaWxlcylcbiAqXG4gKiBjb25zdCB7IG9pZHMgfSA9IGF3YWl0IGdpdC5pbmRleFBhY2soe1xuICogICBmcyxcbiAqICAgZGlyOiAnL3R1dG9yaWFsJyxcbiAqICAgZmlsZXBhdGg6IGAuZ2l0L29iamVjdHMvcGFjay8ke3BhY2tmaWxlc1swXX1gLFxuICogICBhc3luYyBvblByb2dyZXNzIChldnQpIHtcbiAqICAgICBjb25zb2xlLmxvZyhgJHtldnQucGhhc2V9OiAke2V2dC5sb2FkZWR9IC8gJHtldnQudG90YWx9YClcbiAqICAgfVxuICogfSlcbiAqIGNvbnNvbGUubG9nKG9pZHMpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBpbmRleFBhY2soe1xuICBmcyxcbiAgb25Qcm9ncmVzcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgZmlsZXBhdGgsXG4gIGNhY2hlID0ge30sXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIGZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2RpcicsIGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZmlsZXBhdGgnLCBmaWxlcGF0aCk7XG5cbiAgICByZXR1cm4gYXdhaXQgX2luZGV4UGFjayh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgY2FjaGUsXG4gICAgICBvblByb2dyZXNzLFxuICAgICAgZGlyLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgZmlsZXBhdGgsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuaW5kZXhQYWNrJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IHJlcG9zaXRvcnlcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmJhcmUgPSBmYWxzZV0gLSBJbml0aWFsaXplIGEgYmFyZSByZXBvc2l0b3J5XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGVmYXVsdEJyYW5jaCA9ICdtYXN0ZXInXSAtIFRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGJyYW5jaCAobWlnaHQgYmUgY2hhbmdlZCB0byBhIHJlcXVpcmVkIGFyZ3VtZW50IGluIDIuMC4wKVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2hlbiBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IGdpdC5pbml0KHsgZnMsIGRpcjogJy90dXRvcmlhbCcgfSlcbiAqIGNvbnNvbGUubG9nKCdkb25lJylcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXQoe1xuICBmcyxcbiAgYmFyZSA9IGZhbHNlLFxuICBkaXIsXG4gIGdpdGRpciA9IGJhcmUgPyBkaXIgOiBqb2luKGRpciwgJy5naXQnKSxcbiAgZGVmYXVsdEJyYW5jaCA9ICdtYXN0ZXInLFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGlmICghYmFyZSkge1xuICAgICAgYXNzZXJ0UGFyYW1ldGVyKCdkaXInLCBkaXIpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBfaW5pdCh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgYmFyZSxcbiAgICAgIGRpcixcbiAgICAgIGdpdGRpcixcbiAgICAgIGRlZmF1bHRCcmFuY2gsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuaW5pdCc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7YW55fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm9pZFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYW5jZXN0b3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmRlcHRoIC0gTWF4aW11bSBkZXB0aCB0byBzZWFyY2ggYmVmb3JlIGdpdmluZyB1cC4gLTEgbWVhbnMgbm8gbWF4aW11bSBkZXB0aC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2lzRGVzY2VuZGVudCh7XG4gIGZzLFxuICBjYWNoZSxcbiAgZ2l0ZGlyLFxuICBvaWQsXG4gIGFuY2VzdG9yLFxuICBkZXB0aCxcbn0pIHtcbiAgY29uc3Qgc2hhbGxvd3MgPSBhd2FpdCBHaXRTaGFsbG93TWFuYWdlci5yZWFkKHsgZnMsIGdpdGRpciB9KTtcbiAgaWYgKCFvaWQpIHtcbiAgICB0aHJvdyBuZXcgTWlzc2luZ1BhcmFtZXRlckVycm9yKCdvaWQnKVxuICB9XG4gIGlmICghYW5jZXN0b3IpIHtcbiAgICB0aHJvdyBuZXcgTWlzc2luZ1BhcmFtZXRlckVycm9yKCdhbmNlc3RvcicpXG4gIH1cbiAgLy8gSWYgeW91IGRvbid0IGxpa2UgdGhpcyBiZWhhdmlvciwgYWRkIHlvdXIgb3duIGNoZWNrLlxuICAvLyBFZGdlIGNhc2VzIGFyZSBoYXJkIHRvIGRlZmluZSBhIHBlcmZlY3Qgc29sdXRpb24uXG4gIGlmIChvaWQgPT09IGFuY2VzdG9yKSByZXR1cm4gZmFsc2VcbiAgLy8gV2UgZG8gbm90IHVzZSByZWN1cnNpb24gaGVyZSwgYmVjYXVzZSB0aGF0IHdvdWxkIGxlYWQgdG8gZGVwdGgtZmlyc3QgdHJhdmVyc2FsLFxuICAvLyBhbmQgd2Ugd2FudCB0byBtYWludGFpbiBhIGJyZWFkdGgtZmlyc3QgdHJhdmVyc2FsIHRvIGF2b2lkIGhpdHRpbmcgc2hhbGxvdyBjbG9uZSBkZXB0aCBjdXRvZmZzLlxuICBjb25zdCBxdWV1ZSA9IFtvaWRdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldCgpO1xuICBsZXQgc2VhcmNoZGVwdGggPSAwO1xuICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XG4gICAgaWYgKHNlYXJjaGRlcHRoKysgPT09IGRlcHRoKSB7XG4gICAgICB0aHJvdyBuZXcgTWF4RGVwdGhFcnJvcihkZXB0aClcbiAgICB9XG4gICAgY29uc3Qgb2lkID0gcXVldWUuc2hpZnQoKTtcbiAgICBjb25zdCB7IHR5cGUsIG9iamVjdCB9ID0gYXdhaXQgX3JlYWRPYmplY3Qoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIGdpdGRpcixcbiAgICAgIG9pZCxcbiAgICB9KTtcbiAgICBpZiAodHlwZSAhPT0gJ2NvbW1pdCcpIHtcbiAgICAgIHRocm93IG5ldyBPYmplY3RUeXBlRXJyb3Iob2lkLCB0eXBlLCAnY29tbWl0JylcbiAgICB9XG4gICAgY29uc3QgY29tbWl0ID0gR2l0Q29tbWl0LmZyb20ob2JqZWN0KS5wYXJzZSgpO1xuICAgIC8vIEFyZSBhbnkgb2YgdGhlIHBhcmVudHMgdGhlIHNvdWdodC1hZnRlciBhbmNlc3Rvcj9cbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBjb21taXQucGFyZW50KSB7XG4gICAgICBpZiAocGFyZW50ID09PSBhbmNlc3RvcikgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gSWYgbm90LCBhZGQgdGhlbSB0byBoZWFkcyAodW5sZXNzIHdlIGtub3cgdGhpcyBpcyBhIHNoYWxsb3cgY29tbWl0KVxuICAgIGlmICghc2hhbGxvd3MuaGFzKG9pZCkpIHtcbiAgICAgIGZvciAoY29uc3QgcGFyZW50IG9mIGNvbW1pdC5wYXJlbnQpIHtcbiAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQpKSB7XG4gICAgICAgICAgcXVldWUucHVzaChwYXJlbnQpO1xuICAgICAgICAgIHZpc2l0ZWQuYWRkKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRXZlbnR1YWxseSwgd2UnbGwgdHJhdmVsIGVudGlyZSB0cmVlIHRvIHRoZSByb290cyB3aGVyZSBhbGwgdGhlIHBhcmVudHMgYXJlIGVtcHR5IGFycmF5cyxcbiAgICAvLyBvciBoaXQgdGhlIHNoYWxsb3cgZGVwdGggYW5kIHRocm93IGFuIGVycm9yLiBFeGNsdWRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIGdyYWZ0cywgb3JcbiAgICAvLyBkaWZmZXJlbnQgYnJhbmNoZXMgY2xvbmVkIHRvIGRpZmZlcmVudCBkZXB0aHMsIHlvdSB3b3VsZCBoaXQgdGhpcyBlcnJvciBhdCB0aGUgc2FtZSB0aW1lXG4gICAgLy8gZm9yIGFsbCBwYXJlbnRzLCBzbyB0cnlpbmcgdG8gY29udGludWUgaXMgZnV0aWxlLlxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgZ2l0IGNvbW1pdCBpcyBkZXNjZW5kZWQgZnJvbSBhbm90aGVyXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub2lkIC0gVGhlIGRlc2NlbmRlbnQgY29tbWl0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hbmNlc3RvciAtIFRoZSAocHJvcG9zZWQpIGFuY2VzdG9yIGNvbW1pdFxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmRlcHRoID0gLTFdIC0gTWF4aW11bSBkZXB0aCB0byBzZWFyY2ggYmVmb3JlIGdpdmluZyB1cC4gLTEgbWVhbnMgbm8gbWF4aW11bSBkZXB0aC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBSZXNvbHZlcyB0byB0cnVlIGlmIGBvaWRgIGlzIGEgZGVzY2VuZGVudCBvZiBgYW5jZXN0b3JgXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCBvaWQgPSBhd2FpdCBnaXQucmVzb2x2ZVJlZih7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCByZWY6ICdtYWluJyB9KVxuICogbGV0IGFuY2VzdG9yID0gYXdhaXQgZ2l0LnJlc29sdmVSZWYoeyBmcywgZGlyOiAnL3R1dG9yaWFsJywgcmVmOiAndjAuMjAuMCcgfSlcbiAqIGNvbnNvbGUubG9nKG9pZCwgYW5jZXN0b3IpXG4gKiBhd2FpdCBnaXQuaXNEZXNjZW5kZW50KHsgZnMsIGRpcjogJy90dXRvcmlhbCcsIG9pZCwgYW5jZXN0b3IsIGRlcHRoOiAtMSB9KVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNEZXNjZW5kZW50KHtcbiAgZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIG9pZCxcbiAgYW5jZXN0b3IsXG4gIGRlcHRoID0gLTEsXG4gIGNhY2hlID0ge30sXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIGZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdvaWQnLCBvaWQpO1xuICAgIGFzc2VydFBhcmFtZXRlcignYW5jZXN0b3InLCBhbmNlc3Rvcik7XG5cbiAgICByZXR1cm4gYXdhaXQgX2lzRGVzY2VuZGVudCh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgY2FjaGUsXG4gICAgICBnaXRkaXIsXG4gICAgICBvaWQsXG4gICAgICBhbmNlc3RvcixcbiAgICAgIGRlcHRoLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LmlzRGVzY2VuZGVudCc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIGEgZmlsZXBhdGggc2hvdWxkIGJlIGlnbm9yZWQgKGJlY2F1c2Ugb2YgLmdpdGlnbm9yZSBvciAuZ2l0L2V4Y2x1ZGUpXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGlyIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCAnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5maWxlcGF0aCAtIFRoZSBmaWxlcGF0aCB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFJlc29sdmVzIHRvIHRydWUgaWYgdGhlIGZpbGUgc2hvdWxkIGJlIGlnbm9yZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYXdhaXQgZ2l0LmlzSWdub3JlZCh7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCBmaWxlcGF0aDogJ2RvY3MvYWRkLm1kJyB9KVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNJZ25vcmVkKHtcbiAgZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIGZpbGVwYXRoLFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdkaXInLCBkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZpbGVwYXRoJywgZmlsZXBhdGgpO1xuXG4gICAgcmV0dXJuIEdpdElnbm9yZU1hbmFnZXIuaXNJZ25vcmVkKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBkaXIsXG4gICAgICBnaXRkaXIsXG4gICAgICBmaWxlcGF0aCxcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5pc0lnbm9yZWQnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIExpc3QgYnJhbmNoZXNcbiAqXG4gKiBCeSBkZWZhdWx0IGl0IGxpc3RzIGxvY2FsIGJyYW5jaGVzLiBJZiBhICdyZW1vdGUnIGlzIHNwZWNpZmllZCwgaXQgbGlzdHMgdGhlIHJlbW90ZSdzIGJyYW5jaGVzLiBXaGVuIGxpc3RpbmcgcmVtb3RlIGJyYW5jaGVzLCB0aGUgSEVBRCBicmFuY2ggaXMgbm90IGZpbHRlcmVkIG91dCwgc28gaXQgbWF5IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIHJlc3VsdHMuXG4gKlxuICogTm90ZSB0aGF0IHNwZWNpZnlpbmcgYSByZW1vdGUgZG9lcyBub3QgYWN0dWFsbHkgY29udGFjdCB0aGUgc2VydmVyIGFuZCB1cGRhdGUgdGhlIGxpc3Qgb2YgYnJhbmNoZXMuXG4gKiBJZiB5b3Ugd2FudCBhbiB1cC10by1kYXRlIGxpc3QsIGZpcnN0IGRvIGEgYGZldGNoYCB0byB0aGF0IHJlbW90ZS5cbiAqIChXaGljaCBicmFuY2ggeW91IGZldGNoIGRvZXNuJ3QgbWF0dGVyIC0gdGhlIGxpc3Qgb2YgYnJhbmNoZXMgYXZhaWxhYmxlIG9uIHRoZSByZW1vdGUgaXMgdXBkYXRlZCBkdXJpbmcgdGhlIGZldGNoIGhhbmRzaGFrZS4pXG4gKlxuICogQWxzbyBub3RlLCB0aGF0IGEgYnJhbmNoIGlzIGEgcmVmZXJlbmNlIHRvIGEgY29tbWl0LiBJZiB5b3UgaW5pdGlhbGl6ZSBhIG5ldyByZXBvc2l0b3J5IGl0IGhhcyBubyBjb21taXRzLCBzbyB0aGVcbiAqIGBsaXN0QnJhbmNoZXNgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGxpc3QsIHVudGlsIHlvdSBjcmVhdGUgdGhlIGZpcnN0IGNvbW1pdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlXSAtIEluc3RlYWQgb2YgdGhlIGJyYW5jaGVzIGluIGByZWZzL2hlYWRzYCwgbGlzdCB0aGUgYnJhbmNoZXMgaW4gYHJlZnMvcmVtb3Rlcy8ke3JlbW90ZX1gLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHN0cmluZz4+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCBhbiBhcnJheSBvZiBicmFuY2ggbmFtZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogbGV0IGJyYW5jaGVzID0gYXdhaXQgZ2l0Lmxpc3RCcmFuY2hlcyh7IGZzLCBkaXI6ICcvdHV0b3JpYWwnIH0pXG4gKiBjb25zb2xlLmxvZyhicmFuY2hlcylcbiAqIGxldCByZW1vdGVCcmFuY2hlcyA9IGF3YWl0IGdpdC5saXN0QnJhbmNoZXMoeyBmcywgZGlyOiAnL3R1dG9yaWFsJywgcmVtb3RlOiAnb3JpZ2luJyB9KVxuICogY29uc29sZS5sb2cocmVtb3RlQnJhbmNoZXMpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0QnJhbmNoZXMoe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgcmVtb3RlLFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuXG4gICAgcmV0dXJuIEdpdFJlZk1hbmFnZXIubGlzdEJyYW5jaGVzKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBnaXRkaXIsXG4gICAgICByZW1vdGUsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQubGlzdEJyYW5jaGVzJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MuY2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdpdGRpclxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlZl1cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxzdHJpbmc+Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2xpc3RGaWxlcyh7IGZzLCBnaXRkaXIsIHJlZiwgY2FjaGUgfSkge1xuICBpZiAocmVmKSB7XG4gICAgY29uc3Qgb2lkID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHsgZ2l0ZGlyLCBmcywgcmVmIH0pO1xuICAgIGNvbnN0IGZpbGVuYW1lcyA9IFtdO1xuICAgIGF3YWl0IGFjY3VtdWxhdGVGaWxlc0Zyb21PaWQoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIGdpdGRpcixcbiAgICAgIG9pZCxcbiAgICAgIGZpbGVuYW1lcyxcbiAgICAgIHByZWZpeDogJycsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbGVuYW1lc1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBHaXRJbmRleE1hbmFnZXIuYWNxdWlyZSh7IGZzLCBnaXRkaXIsIGNhY2hlIH0sIGFzeW5jIGZ1bmN0aW9uKFxuICAgICAgaW5kZXhcbiAgICApIHtcbiAgICAgIHJldHVybiBpbmRleC5lbnRyaWVzLm1hcCh4ID0+IHgucGF0aClcbiAgICB9KVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFjY3VtdWxhdGVGaWxlc0Zyb21PaWQoe1xuICBmcyxcbiAgY2FjaGUsXG4gIGdpdGRpcixcbiAgb2lkLFxuICBmaWxlbmFtZXMsXG4gIHByZWZpeCxcbn0pIHtcbiAgY29uc3QgeyB0cmVlIH0gPSBhd2FpdCBfcmVhZFRyZWUoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pO1xuICAvLyBUT0RPOiBVc2UgYHdhbGtgIHRvIGRvIHRoaXMuIFNob3VsZCBiZSBmYXN0ZXIuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgdHJlZSkge1xuICAgIGlmIChlbnRyeS50eXBlID09PSAndHJlZScpIHtcbiAgICAgIGF3YWl0IGFjY3VtdWxhdGVGaWxlc0Zyb21PaWQoe1xuICAgICAgICBmcyxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGdpdGRpcixcbiAgICAgICAgb2lkOiBlbnRyeS5vaWQsXG4gICAgICAgIGZpbGVuYW1lcyxcbiAgICAgICAgcHJlZml4OiBqb2luKHByZWZpeCwgZW50cnkucGF0aCksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZW5hbWVzLnB1c2goam9pbihwcmVmaXgsIGVudHJ5LnBhdGgpKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogTGlzdCBhbGwgdGhlIGZpbGVzIGluIHRoZSBnaXQgaW5kZXggb3IgYSBjb21taXRcbiAqXG4gKiA+IE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgZWZmaWNpZW50IGZvciBsaXN0aW5nIHRoZSBmaWxlcyBpbiB0aGUgc3RhZ2luZyBhcmVhLCBidXQgbGlzdGluZyBhbGwgdGhlIGZpbGVzIGluIGEgY29tbWl0IHJlcXVpcmVzIHJlY3Vyc2l2ZWx5IHdhbGtpbmcgdGhyb3VnaCB0aGUgZ2l0IG9iamVjdCBzdG9yZS5cbiAqID4gSWYgeW91IGRvIG5vdCByZXF1aXJlIGEgY29tcGxldGUgbGlzdCBvZiBldmVyeSBmaWxlLCBiZXR0ZXIgcGVyZm9ybWFuY2UgY2FuIGJlIGFjaGlldmVkIGJ5IHVzaW5nIFt3YWxrXSguL3dhbGspIGFuZCBpZ25vcmluZyBzdWJkaXJlY3RvcmllcyB5b3UgZG9uJ3QgY2FyZSBhYm91dC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVmXSAtIFJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUgY29tbWl0IGF0IGByZWZgIGluc3RlYWQgb2YgdGhlIGZpbGVzIGN1cnJlbnRseSBpbiB0aGUgZ2l0IGluZGV4IChha2Egc3RhZ2luZyBhcmVhKVxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8c3RyaW5nPj59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIGFuIGFycmF5IG9mIGZpbGVwYXRoc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBbGwgdGhlIGZpbGVzIGluIHRoZSBwcmV2aW91cyBjb21taXRcbiAqIGxldCBmaWxlcyA9IGF3YWl0IGdpdC5saXN0RmlsZXMoeyBmcywgZGlyOiAnL3R1dG9yaWFsJywgcmVmOiAnSEVBRCcgfSlcbiAqIGNvbnNvbGUubG9nKGZpbGVzKVxuICogLy8gQWxsIHRoZSBmaWxlcyBpbiB0aGUgY3VycmVudCBzdGFnaW5nIGFyZWFcbiAqIGZpbGVzID0gYXdhaXQgZ2l0Lmxpc3RGaWxlcyh7IGZzLCBkaXI6ICcvdHV0b3JpYWwnIH0pXG4gKiBjb25zb2xlLmxvZyhmaWxlcylcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RGaWxlcyh7XG4gIGZzLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICByZWYsXG4gIGNhY2hlID0ge30sXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIGZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG5cbiAgICByZXR1cm4gYXdhaXQgX2xpc3RGaWxlcyh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgY2FjaGUsXG4gICAgICBnaXRkaXIsXG4gICAgICByZWYsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQubGlzdEZpbGVzJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBMaXN0IGFsbCB0aGUgb2JqZWN0IG5vdGVzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7YW55fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlZlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHt0YXJnZXQ6IHN0cmluZywgbm90ZTogc3RyaW5nfT4+fVxuICovXG5cbmFzeW5jIGZ1bmN0aW9uIF9saXN0Tm90ZXMoeyBmcywgY2FjaGUsIGdpdGRpciwgcmVmIH0pIHtcbiAgLy8gR2V0IHRoZSBjdXJyZW50IG5vdGUgY29tbWl0XG4gIGxldCBwYXJlbnQ7XG4gIHRyeSB7XG4gICAgcGFyZW50ID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHsgZ2l0ZGlyLCBmcywgcmVmIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIHRoZSBjdXJyZW50IG5vdGUgdHJlZVxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBfcmVhZFRyZWUoe1xuICAgIGZzLFxuICAgIGNhY2hlLFxuICAgIGdpdGRpcixcbiAgICBvaWQ6IHBhcmVudCxcbiAgfSk7XG5cbiAgLy8gRm9ybWF0IHRoZSB0cmVlIGVudHJpZXNcbiAgY29uc3Qgbm90ZXMgPSByZXN1bHQudHJlZS5tYXAoZW50cnkgPT4gKHtcbiAgICB0YXJnZXQ6IGVudHJ5LnBhdGgsXG4gICAgbm90ZTogZW50cnkub2lkLFxuICB9KSk7XG4gIHJldHVybiBub3Rlc1xufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBMaXN0IGFsbCB0aGUgb2JqZWN0IG5vdGVzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlZl0gLSBUaGUgbm90ZXMgcmVmIHRvIGxvb2sgdW5kZXJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHt0YXJnZXQ6IHN0cmluZywgbm90ZTogc3RyaW5nfT4+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCBhbiBhcnJheSBvZiBlbnRyaWVzIGNvbnRhaW5pbmcgU0hBLTEgb2JqZWN0IGlkcyBvZiB0aGUgbm90ZSBhbmQgdGhlIG9iamVjdCB0aGUgbm90ZSB0YXJnZXRzXG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gbGlzdE5vdGVzKHtcbiAgZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIHJlZiA9ICdyZWZzL25vdGVzL2NvbW1pdHMnLFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcigncmVmJywgcmVmKTtcblxuICAgIHJldHVybiBhd2FpdCBfbGlzdE5vdGVzKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBjYWNoZSxcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlZixcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5saXN0Tm90ZXMnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTx7cmVtb3RlOiBzdHJpbmcsIHVybDogc3RyaW5nfT4+fVxuICovXG5hc3luYyBmdW5jdGlvbiBfbGlzdFJlbW90ZXMoeyBmcywgZ2l0ZGlyIH0pIHtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgR2l0Q29uZmlnTWFuYWdlci5nZXQoeyBmcywgZ2l0ZGlyIH0pO1xuICBjb25zdCByZW1vdGVOYW1lcyA9IGF3YWl0IGNvbmZpZy5nZXRTdWJzZWN0aW9ucygncmVtb3RlJyk7XG4gIGNvbnN0IHJlbW90ZXMgPSBQcm9taXNlLmFsbChcbiAgICByZW1vdGVOYW1lcy5tYXAoYXN5bmMgcmVtb3RlID0+IHtcbiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGNvbmZpZy5nZXQoYHJlbW90ZS4ke3JlbW90ZX0udXJsYCk7XG4gICAgICByZXR1cm4geyByZW1vdGUsIHVybCB9XG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIHJlbW90ZXNcbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogTGlzdCByZW1vdGVzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHtyZW1vdGU6IHN0cmluZywgdXJsOiBzdHJpbmd9Pj59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIGFuIGFycmF5IG9mIGB7cmVtb3RlLCB1cmx9YCBvYmplY3RzXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZW1vdGVzID0gYXdhaXQgZ2l0Lmxpc3RSZW1vdGVzKHsgZnMsIGRpcjogJy90dXRvcmlhbCcgfSlcbiAqIGNvbnNvbGUubG9nKHJlbW90ZXMpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0UmVtb3Rlcyh7IGZzLCBkaXIsIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpIH0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcblxuICAgIHJldHVybiBhd2FpdCBfbGlzdFJlbW90ZXMoe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGdpdGRpcixcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5saXN0UmVtb3Rlcyc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZXJ2ZXJSZWYgLSBUaGlzIG9iamVjdCBoYXMgdGhlIGZvbGxvd2luZyBzY2hlbWE6XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVmIC0gVGhlIG5hbWUgb2YgdGhlIHJlZlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9pZCAtIFRoZSBTSEEtMSBvYmplY3QgaWQgdGhlIHJlZiBwb2ludHMgdG9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XSAtIFRoZSB0YXJnZXQgcmVmIHBvaW50ZWQgdG8gYnkgYSBzeW1ib2xpYyByZWZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGVlbGVkXSAtIElmIHRoZSBvaWQgaXMgdGhlIFNIQS0xIG9iamVjdCBpZCBvZiBhbiBhbm5vdGF0ZWQgdGFnLCB0aGlzIGlzIHRoZSBTSEEtMSBvYmplY3QgaWQgdGhhdCB0aGUgYW5ub3RhdGVkIHRhZyBwb2ludHMgdG9cbiAqL1xuXG5hc3luYyBmdW5jdGlvbiBwYXJzZUxpc3RSZWZzUmVzcG9uc2Uoc3RyZWFtKSB7XG4gIGNvbnN0IHJlYWQgPSBHaXRQa3RMaW5lLnN0cmVhbVJlYWRlcihzdHJlYW0pO1xuXG4gIC8vIFRPRE86IHdoZW4gd2UgcmUtd3JpdGUgZXZlcnl0aGluZyB0byBtaW5pbWl6ZSBtZW1vcnkgdXNhZ2UsXG4gIC8vIHdlIGNvdWxkIG1ha2UgdGhpcyBhIGdlbmVyYXRvclxuICBjb25zdCByZWZzID0gW107XG5cbiAgbGV0IGxpbmU7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgbGluZSA9IGF3YWl0IHJlYWQoKTtcbiAgICBpZiAobGluZSA9PT0gdHJ1ZSkgYnJlYWtcbiAgICBpZiAobGluZSA9PT0gbnVsbCkgY29udGludWVcbiAgICBsaW5lID0gbGluZS50b1N0cmluZygndXRmOCcpLnJlcGxhY2UoL1xcbiQvLCAnJyk7XG4gICAgY29uc3QgW29pZCwgcmVmLCAuLi5hdHRyc10gPSBsaW5lLnNwbGl0KCcgJyk7XG4gICAgY29uc3QgciA9IHsgcmVmLCBvaWQgfTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cnMpIHtcbiAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBhdHRyLnNwbGl0KCc6Jyk7XG4gICAgICBpZiAobmFtZSA9PT0gJ3N5bXJlZi10YXJnZXQnKSB7XG4gICAgICAgIHIudGFyZ2V0ID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwZWVsZWQnKSB7XG4gICAgICAgIHIucGVlbGVkID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJlZnMucHVzaChyKTtcbiAgfVxuXG4gIHJldHVybiByZWZzXG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5wcmVmaXhdIC0gT25seSBsaXN0IHJlZnMgdGhhdCBzdGFydCB3aXRoIHRoaXMgcHJlZml4XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnN5bXJlZnMgPSBmYWxzZV0gLSBJbmNsdWRlIHN5bWJvbGljIHJlZiB0YXJnZXRzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnBlZWxUYWdzID0gZmFsc2VdIC0gSW5jbHVkZSBwZWVsZWQgdGFncyB2YWx1ZXNcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5W119XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTGlzdFJlZnNSZXF1ZXN0KHsgcHJlZml4LCBzeW1yZWZzLCBwZWVsVGFncyB9KSB7XG4gIGNvbnN0IHBhY2tzdHJlYW0gPSBbXTtcbiAgLy8gY29tbWFuZFxuICBwYWNrc3RyZWFtLnB1c2goR2l0UGt0TGluZS5lbmNvZGUoJ2NvbW1hbmQ9bHMtcmVmc1xcbicpKTtcbiAgLy8gY2FwYWJpbGl0eS1saXN0XG4gIHBhY2tzdHJlYW0ucHVzaChHaXRQa3RMaW5lLmVuY29kZShgYWdlbnQ9JHtwa2cuYWdlbnR9XFxuYCkpO1xuICAvLyBbY29tbWFuZC1hcmdzXVxuICBpZiAocGVlbFRhZ3MgfHwgc3ltcmVmcyB8fCBwcmVmaXgpIHtcbiAgICBwYWNrc3RyZWFtLnB1c2goR2l0UGt0TGluZS5kZWxpbSgpKTtcbiAgfVxuICBpZiAocGVlbFRhZ3MpIHBhY2tzdHJlYW0ucHVzaChHaXRQa3RMaW5lLmVuY29kZSgncGVlbCcpKTtcbiAgaWYgKHN5bXJlZnMpIHBhY2tzdHJlYW0ucHVzaChHaXRQa3RMaW5lLmVuY29kZSgnc3ltcmVmcycpKTtcbiAgaWYgKHByZWZpeCkgcGFja3N0cmVhbS5wdXNoKEdpdFBrdExpbmUuZW5jb2RlKGByZWYtcHJlZml4ICR7cHJlZml4fWApKTtcbiAgcGFja3N0cmVhbS5wdXNoKEdpdFBrdExpbmUuZmx1c2goKSk7XG4gIHJldHVybiBwYWNrc3RyZWFtXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEZldGNoIGEgbGlzdCBvZiByZWZzIChicmFuY2hlcywgdGFncywgZXRjKSBmcm9tIGEgc2VydmVyLlxuICpcbiAqIFRoaXMgaXMgYSByYXJlIGNvbW1hbmQgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYW4gYGZzYCwgYGRpcmAsIG9yIGV2ZW4gYGdpdGRpcmAgYXJndW1lbnQuXG4gKiBJdCBqdXN0IHJlcXVpcmVzIGFuIGBodHRwYCBhcmd1bWVudC5cbiAqXG4gKiAjIyMgQWJvdXQgYHByb3RvY29sVmVyc2lvbmBcbiAqXG4gKiBUaGVyZSdzIGEgcmF0aGVyIGZ1biB0cmFkZS1vZmYgYmV0d2VlbiBHaXQgUHJvdG9jb2wgVmVyc2lvbiAxIGFuZCBHaXQgUHJvdG9jb2wgVmVyc2lvbiAyLlxuICogVmVyc2lvbiAyIGFjdHVhbGx5IHJlcXVpcmVzIDIgSFRUUCByZXF1ZXN0cyBpbnN0ZWFkIG9mIDEsIG1ha2luZyBpdCBzaW1pbGFyIHRvIGZldGNoIG9yIHB1c2ggaW4gdGhhdCByZWdhcmQuXG4gKiBIb3dldmVyLCB2ZXJzaW9uIDIgc3VwcG9ydHMgc2VydmVyLXNpZGUgZmlsdGVyaW5nIGJ5IHByZWZpeCwgd2hlcmVhcyB0aGF0IGZpbHRlcmluZyBpcyBkb25lIGNsaWVudC1zaWRlIGluIHZlcnNpb24gMS5cbiAqIFdoaWNoIHByb3RvY29sIGlzIG1vc3QgZWZmaWNpZW50IHRoZXJlZm9yZSBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgcmVmcyBvbiB0aGUgcmVtb3RlLCB0aGUgbGF0ZW5jeSBvZiB0aGUgc2VydmVyLCBhbmQgc3BlZWQgb2YgdGhlIG5ldHdvcmsgY29ubmVjdGlvbi5cbiAqIEZvciBhbiBzbWFsbCByZXBvcyAob3IgZmFzdCBJbnRlcm5ldCBjb25uZWN0aW9ucyksIHRoZSByZXF1aXJlbWVudCB0byBtYWtlIHR3byB0cmlwcyB0byB0aGUgc2VydmVyIG1ha2VzIHByb3RvY29sIDIgc2xvd2VyLlxuICogQnV0IGZvciBsYXJnZSByZXBvcyAob3Igc2xvdyBJbnRlcm5ldCBjb25uZWN0aW9ucyksIHRoZSBkZWNyZWFzZWQgcGF5bG9hZCBzaXplIG9mIHRoZSBzZWNvbmQgcmVxdWVzdCBtYWtlcyB1cCBmb3IgdGhlIGFkZGl0aW9uYWwgcmVxdWVzdC5cbiAqXG4gKiBIYXJkIG51bWJlcnMgdmFyeSBieSBzaXR1YXRpb24sIGJ1dCBoZXJlJ3Mgc29tZSBudW1iZXJzIGZyb20gbXkgbWFjaGluZTpcbiAqXG4gKiBVc2luZyBpc29tb3JwaGljLWdpdCBpbiBhIGJyb3dzZXIsIHdpdGggYSBDT1JTIHByb3h5LCBsaXN0aW5nIG9ubHkgdGhlIGJyYW5jaGVzIChyZWZzL2hlYWRzKSBvZiBodHRwczovL2dpdGh1Yi5jb20vaXNvbW9ycGhpYy1naXQvaXNvbW9ycGhpYy1naXRcbiAqIC0gUHJvdG9jb2wgVmVyc2lvbiAxIHRvb2sgfjMwMG1zIGFuZCB0cmFuc2ZlcnJlZCA4NCBLQi5cbiAqIC0gUHJvdG9jb2wgVmVyc2lvbiAyIHRvb2sgfjUwMG1zIGFuZCB0cmFuc2ZlcnJlZCA0LjEgS0IuXG4gKlxuICogVXNpbmcgaXNvbW9ycGhpYy1naXQgaW4gYSBicm93c2VyLCB3aXRoIGEgQ09SUyBwcm94eSwgbGlzdGluZyBvbmx5IHRoZSBicmFuY2hlcyAocmVmcy9oZWFkcykgb2YgaHR0cHM6Ly9naXRsYWIuY29tL2dpdGxhYi1vcmcvZ2l0bGFiXG4gKiAtIFByb3RvY29sIFZlcnNpb24gMSB0b29rIH40OTAwbXMgYW5kIHRyYW5zZmVycmVkIDkuNDEgTUIuXG4gKiAtIFByb3RvY29sIFZlcnNpb24gMiB0b29rIH4xMjgwbXMgYW5kIHRyYW5zZmVycmVkIDQzMyBLQi5cbiAqXG4gKiBGaW5hbGx5LCB0aGVyZSBpcyBhIGZ1biBxdWlyayByZWdhcmRpbmcgdGhlIGBzeW1yZWZzYCBwYXJhbWV0ZXIuXG4gKiBQcm90b2NvbCBWZXJzaW9uIDEgd2lsbCBnZW5lcmFsbHkgb25seSByZXR1cm4gdGhlIGBIRUFEYCBzeW1yZWYgYW5kIG5vdCBvdGhlcnMuXG4gKiBIaXN0b3JpY2FsbHksIHRoaXMgbWVhbnQgdGhhdCBzZXJ2ZXJzIGRvbid0IHVzZSBzeW1ib2xpYyByZWZzIGV4Y2VwdCBmb3IgYEhFQURgLCB3aGljaCBpcyB1c2VkIHRvIHBvaW50IGF0IHRoZSBcImRlZmF1bHQgYnJhbmNoXCIuXG4gKiBIb3dldmVyIFByb3RvY29sIFZlcnNpb24gMiBjYW4gcmV0dXJuICphbGwqIHRoZSBzeW1ib2xpYyByZWZzIG9uIHRoZSBzZXJ2ZXIuXG4gKiBTbyBpZiB5b3UgYXJlIHJ1bm5pbmcgeW91ciBvd24gZ2l0IHNlcnZlciwgeW91IGNvdWxkIHRha2UgYWR2YW50YWdlIG9mIHRoYXQgSSBndWVzcy5cbiAqXG4gKiAjIyMjIFRMO0RSXG4gKiBJZiB5b3UgYXJlIF9ub3RfIHRha2luZyBhZHZhbnRhZ2Ugb2YgYHByZWZpeGAgSSB3b3VsZCByZWNvbW1lbmQgYHByb3RvY29sVmVyc2lvbjogMWAuXG4gKiBPdGhlcndpc2UsIEkgcmVjb21tZW5kIHRvIHVzZSB0aGUgZGVmYXVsdCB3aGljaCBpcyBgcHJvdG9jb2xWZXJzaW9uOiAyYC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtIdHRwQ2xpZW50fSBhcmdzLmh0dHAgLSBhbiBIVFRQIGNsaWVudFxuICogQHBhcmFtIHtBdXRoQ2FsbGJhY2t9IFthcmdzLm9uQXV0aF0gLSBvcHRpb25hbCBhdXRoIGZpbGwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7QXV0aEZhaWx1cmVDYWxsYmFja30gW2FyZ3Mub25BdXRoRmFpbHVyZV0gLSBvcHRpb25hbCBhdXRoIHJlamVjdGVkIGNhbGxiYWNrXG4gKiBAcGFyYW0ge0F1dGhTdWNjZXNzQ2FsbGJhY2t9IFthcmdzLm9uQXV0aFN1Y2Nlc3NdIC0gb3B0aW9uYWwgYXV0aCBhcHByb3ZlZCBjYWxsYmFja1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudXJsIC0gVGhlIFVSTCBvZiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIFdpbGwgYmUgZ290dGVuIGZyb20gZ2l0Y29uZmlnIGlmIGFic2VudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb3JzUHJveHldIC0gT3B0aW9uYWwgW0NPUlMgcHJveHldKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS8lNDBpc29tb3JwaGljLWdpdC9jb3JzLXByb3h5KS4gT3ZlcnJpZGVzIHZhbHVlIGluIHJlcG8gY29uZmlnLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JQdXNoID0gZmFsc2VdIC0gQnkgZGVmYXVsdCwgdGhlIGNvbW1hbmQgcXVlcmllcyB0aGUgJ2ZldGNoJyBjYXBhYmlsaXRpZXMuIElmIHRydWUsIGl0IHdpbGwgYXNrIGZvciB0aGUgJ3B1c2gnIGNhcGFiaWxpdGllcy5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuaGVhZGVyc10gLSBBZGRpdGlvbmFsIGhlYWRlcnMgdG8gaW5jbHVkZSBpbiBIVFRQIHJlcXVlc3RzLCBzaW1pbGFyIHRvIGdpdCdzIGBleHRyYUhlYWRlcmAgY29uZmlnXG4gKiBAcGFyYW0gezEgfCAyfSBbYXJncy5wcm90b2NvbFZlcnNpb24gPSAyXSAtIFdoaWNoIHZlcnNpb24gb2YgdGhlIEdpdCBQcm90b2NvbCB0byB1c2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucHJlZml4XSAtIE9ubHkgbGlzdCByZWZzIHRoYXQgc3RhcnQgd2l0aCB0aGlzIHByZWZpeFxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5zeW1yZWZzID0gZmFsc2VdIC0gSW5jbHVkZSBzeW1ib2xpYyByZWYgdGFyZ2V0c1xuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5wZWVsVGFncyA9IGZhbHNlXSAtIEluY2x1ZGUgYW5ub3RhdGVkIHRhZyBwZWVsZWQgdGFyZ2V0c1xuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZlclJlZltdPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdpdGggYW4gYXJyYXkgb2YgU2VydmVyUmVmIG9iamVjdHNcbiAqIEBzZWUgU2VydmVyUmVmXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIExpc3QgYWxsIHRoZSBicmFuY2hlcyBvbiBhIHJlcG9cbiAqIGxldCByZWZzID0gYXdhaXQgZ2l0Lmxpc3RTZXJ2ZXJSZWZzKHtcbiAqICAgaHR0cCxcbiAqICAgY29yc1Byb3h5OiBcImh0dHBzOi8vY29ycy5pc29tb3JwaGljLWdpdC5vcmdcIixcbiAqICAgdXJsOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9pc29tb3JwaGljLWdpdC9pc29tb3JwaGljLWdpdC5naXRcIixcbiAqICAgcHJlZml4OiBcInJlZnMvaGVhZHMvXCIsXG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKHJlZnMpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIGRlZmF1bHQgYnJhbmNoIG9uIGEgcmVwb1xuICogbGV0IHJlZnMgPSBhd2FpdCBnaXQubGlzdFNlcnZlclJlZnMoe1xuICogICBodHRwLFxuICogICBjb3JzUHJveHk6IFwiaHR0cHM6Ly9jb3JzLmlzb21vcnBoaWMtZ2l0Lm9yZ1wiLFxuICogICB1cmw6IFwiaHR0cHM6Ly9naXRodWIuY29tL2lzb21vcnBoaWMtZ2l0L2lzb21vcnBoaWMtZ2l0LmdpdFwiLFxuICogICBwcmVmaXg6IFwiSEVBRFwiLFxuICogICBzeW1yZWZzOiB0cnVlLFxuICogfSk7XG4gKiBjb25zb2xlLmxvZyhyZWZzKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTGlzdCBhbGwgdGhlIHRhZ3Mgb24gYSByZXBvXG4gKiBsZXQgcmVmcyA9IGF3YWl0IGdpdC5saXN0U2VydmVyUmVmcyh7XG4gKiAgIGh0dHAsXG4gKiAgIGNvcnNQcm94eTogXCJodHRwczovL2NvcnMuaXNvbW9ycGhpYy1naXQub3JnXCIsXG4gKiAgIHVybDogXCJodHRwczovL2dpdGh1Yi5jb20vaXNvbW9ycGhpYy1naXQvaXNvbW9ycGhpYy1naXQuZ2l0XCIsXG4gKiAgIHByZWZpeDogXCJyZWZzL3RhZ3MvXCIsXG4gKiAgIHBlZWxUYWdzOiB0cnVlLFxuICogfSk7XG4gKiBjb25zb2xlLmxvZyhyZWZzKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTGlzdCBhbGwgdGhlIHB1bGwgcmVxdWVzdHMgb24gYSByZXBvXG4gKiBsZXQgcmVmcyA9IGF3YWl0IGdpdC5saXN0U2VydmVyUmVmcyh7XG4gKiAgIGh0dHAsXG4gKiAgIGNvcnNQcm94eTogXCJodHRwczovL2NvcnMuaXNvbW9ycGhpYy1naXQub3JnXCIsXG4gKiAgIHVybDogXCJodHRwczovL2dpdGh1Yi5jb20vaXNvbW9ycGhpYy1naXQvaXNvbW9ycGhpYy1naXQuZ2l0XCIsXG4gKiAgIHByZWZpeDogXCJyZWZzL3B1bGwvXCIsXG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKHJlZnMpO1xuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdFNlcnZlclJlZnMoe1xuICBodHRwLFxuICBvbkF1dGgsXG4gIG9uQXV0aFN1Y2Nlc3MsXG4gIG9uQXV0aEZhaWx1cmUsXG4gIGNvcnNQcm94eSxcbiAgdXJsLFxuICBoZWFkZXJzID0ge30sXG4gIGZvclB1c2ggPSBmYWxzZSxcbiAgcHJvdG9jb2xWZXJzaW9uID0gMixcbiAgcHJlZml4LFxuICBzeW1yZWZzLFxuICBwZWVsVGFncyxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2h0dHAnLCBodHRwKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ3VybCcsIHVybCk7XG5cbiAgICBjb25zdCByZW1vdGUgPSBhd2FpdCBHaXRSZW1vdGVIVFRQLmRpc2NvdmVyKHtcbiAgICAgIGh0dHAsXG4gICAgICBvbkF1dGgsXG4gICAgICBvbkF1dGhTdWNjZXNzLFxuICAgICAgb25BdXRoRmFpbHVyZSxcbiAgICAgIGNvcnNQcm94eSxcbiAgICAgIHNlcnZpY2U6IGZvclB1c2ggPyAnZ2l0LXJlY2VpdmUtcGFjaycgOiAnZ2l0LXVwbG9hZC1wYWNrJyxcbiAgICAgIHVybCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBwcm90b2NvbFZlcnNpb24sXG4gICAgfSk7XG5cbiAgICBpZiAocmVtb3RlLnByb3RvY29sVmVyc2lvbiA9PT0gMSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEluZm9SZWZzKHJlbW90ZSwgcHJlZml4LCBzeW1yZWZzLCBwZWVsVGFncylcbiAgICB9XG5cbiAgICAvLyBQcm90b2NvbCBWZXJzaW9uIDJcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgd3JpdGVMaXN0UmVmc1JlcXVlc3QoeyBwcmVmaXgsIHN5bXJlZnMsIHBlZWxUYWdzIH0pO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgR2l0UmVtb3RlSFRUUC5jb25uZWN0KHtcbiAgICAgIGh0dHAsXG4gICAgICBhdXRoOiByZW1vdGUuYXV0aCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBjb3JzUHJveHksXG4gICAgICBzZXJ2aWNlOiBmb3JQdXNoID8gJ2dpdC1yZWNlaXZlLXBhY2snIDogJ2dpdC11cGxvYWQtcGFjaycsXG4gICAgICB1cmwsXG4gICAgICBib2R5LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcnNlTGlzdFJlZnNSZXNwb25zZShyZXMuYm9keSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQubGlzdFNlcnZlclJlZnMnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIExpc3QgdGFnc1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxzdHJpbmc+Pn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdpdGggYW4gYXJyYXkgb2YgdGFnIG5hbWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCB0YWdzID0gYXdhaXQgZ2l0Lmxpc3RUYWdzKHsgZnMsIGRpcjogJy90dXRvcmlhbCcgfSlcbiAqIGNvbnNvbGUubG9nKHRhZ3MpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0VGFncyh7IGZzLCBkaXIsIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpIH0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICByZXR1cm4gR2l0UmVmTWFuYWdlci5saXN0VGFncyh7IGZzOiBuZXcgRmlsZVN5c3RlbShmcyksIGdpdGRpciB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5saXN0VGFncyc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbW1pdCh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSkge1xuICBjb25zdCB7IHR5cGUsIG9iamVjdCB9ID0gYXdhaXQgX3JlYWRPYmplY3QoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pO1xuICAvLyBSZXNvbHZlIGFubm90YXRlZCB0YWcgb2JqZWN0cyB0byB3aGF0ZXZlclxuICBpZiAodHlwZSA9PT0gJ3RhZycpIHtcbiAgICBvaWQgPSBHaXRBbm5vdGF0ZWRUYWcuZnJvbShvYmplY3QpLnBhcnNlKCkub2JqZWN0O1xuICAgIHJldHVybiByZXNvbHZlQ29tbWl0KHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCB9KVxuICB9XG4gIGlmICh0eXBlICE9PSAnY29tbWl0Jykge1xuICAgIHRocm93IG5ldyBPYmplY3RUeXBlRXJyb3Iob2lkLCB0eXBlLCAnY29tbWl0JylcbiAgfVxuICByZXR1cm4geyBjb21taXQ6IEdpdENvbW1pdC5mcm9tKG9iamVjdCksIG9pZCB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge2FueX0gYXJncy5jYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5vaWRcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkQ29tbWl0UmVzdWx0Pn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdpdGggYSBnaXQgY29tbWl0IG9iamVjdFxuICogQHNlZSBSZWFkQ29tbWl0UmVzdWx0XG4gKiBAc2VlIENvbW1pdE9iamVjdFxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX3JlYWRDb21taXQoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pIHtcbiAgY29uc3QgeyBjb21taXQsIG9pZDogY29tbWl0T2lkIH0gPSBhd2FpdCByZXNvbHZlQ29tbWl0KHtcbiAgICBmcyxcbiAgICBjYWNoZSxcbiAgICBnaXRkaXIsXG4gICAgb2lkLFxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIG9pZDogY29tbWl0T2lkLFxuICAgIGNvbW1pdDogY29tbWl0LnBhcnNlKCksXG4gICAgcGF5bG9hZDogY29tbWl0LndpdGhvdXRTaWduYXR1cmUoKSxcbiAgfTtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVBZ2UoYSwgYikge1xuICByZXR1cm4gYS5jb21taXR0ZXIudGltZXN0YW1wIC0gYi5jb21taXR0ZXIudGltZXN0YW1wXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vLyB0aGUgZW1wdHkgZmlsZSBjb250ZW50IG9iamVjdCBpZFxuY29uc3QgRU1QVFlfT0lEID0gJ2U2OWRlMjliYjJkMWQ2NDM0YjhiMjlhZTc3NWFkOGMyZTQ4YzUzOTEnO1xuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRmlsZUlkSW5UcmVlKHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCwgZmlsZUlkIH0pIHtcbiAgaWYgKGZpbGVJZCA9PT0gRU1QVFlfT0lEKSByZXR1cm5cbiAgY29uc3QgX29pZCA9IG9pZDtcbiAgbGV0IGZpbGVwYXRoO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlVHJlZSh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSk7XG4gIGNvbnN0IHRyZWUgPSByZXN1bHQudHJlZTtcbiAgaWYgKGZpbGVJZCA9PT0gcmVzdWx0Lm9pZCkge1xuICAgIGZpbGVwYXRoID0gcmVzdWx0LnBhdGg7XG4gIH0gZWxzZSB7XG4gICAgZmlsZXBhdGggPSBhd2FpdCBfcmVzb2x2ZUZpbGVJZCh7XG4gICAgICBmcyxcbiAgICAgIGNhY2hlLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgdHJlZSxcbiAgICAgIGZpbGVJZCxcbiAgICAgIG9pZDogX29pZCxcbiAgICB9KTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWxlcGF0aCkpIHtcbiAgICAgIGlmIChmaWxlcGF0aC5sZW5ndGggPT09IDApIGZpbGVwYXRoID0gdW5kZWZpbmVkO1xuICAgICAgZWxzZSBpZiAoZmlsZXBhdGgubGVuZ3RoID09PSAxKSBmaWxlcGF0aCA9IGZpbGVwYXRoWzBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmlsZXBhdGhcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3Jlc29sdmVGaWxlSWQoe1xuICBmcyxcbiAgY2FjaGUsXG4gIGdpdGRpcixcbiAgdHJlZSxcbiAgZmlsZUlkLFxuICBvaWQsXG4gIGZpbGVwYXRocyA9IFtdLFxuICBwYXJlbnRQYXRoID0gJycsXG59KSB7XG4gIGNvbnN0IHdhbGtzID0gdHJlZS5lbnRyaWVzKCkubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoZW50cnkub2lkID09PSBmaWxlSWQpIHtcbiAgICAgIHJlc3VsdCA9IGpvaW4ocGFyZW50UGF0aCwgZW50cnkucGF0aCk7XG4gICAgICBmaWxlcGF0aHMucHVzaChyZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAoZW50cnkudHlwZSA9PT0gJ3RyZWUnKSB7XG4gICAgICByZXN1bHQgPSBfcmVhZE9iamVjdCh7XG4gICAgICAgIGZzLFxuICAgICAgICBjYWNoZSxcbiAgICAgICAgZ2l0ZGlyLFxuICAgICAgICBvaWQ6IGVudHJ5Lm9pZCxcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24oeyBvYmplY3QgfSkge1xuICAgICAgICByZXR1cm4gX3Jlc29sdmVGaWxlSWQoe1xuICAgICAgICAgIGZzLFxuICAgICAgICAgIGNhY2hlLFxuICAgICAgICAgIGdpdGRpcixcbiAgICAgICAgICB0cmVlOiBHaXRUcmVlLmZyb20ob2JqZWN0KSxcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgb2lkLFxuICAgICAgICAgIGZpbGVwYXRocyxcbiAgICAgICAgICBwYXJlbnRQYXRoOiBqb2luKHBhcmVudFBhdGgsIGVudHJ5LnBhdGgpLFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfSk7XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwod2Fsa3MpO1xuICByZXR1cm4gZmlsZXBhdGhzXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEdldCBjb21taXQgZGVzY3JpcHRpb25zIGZyb20gdGhlIGdpdCBoaXN0b3J5XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7YW55fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nPX0gYXJncy5maWxlcGF0aCBvcHRpb25hbCBnZXQgdGhlIGNvbW1pdCBmb3IgdGhlIGZpbGVwYXRoIG9ubHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlZlxuICogQHBhcmFtIHtudW1iZXJ8dm9pZH0gYXJncy5kZXB0aFxuICogQHBhcmFtIHtib29sZWFuPX0gW2FyZ3MuZm9yY2U9ZmFsc2VdIGRvIG5vdCB0aHJvdyBlcnJvciBpZiBmaWxlcGF0aCBpcyBub3QgZXhpc3QgKHdvcmtzIG9ubHkgZm9yIGEgc2luZ2xlIGZpbGUpLiBkZWZhdWx0cyB0byBmYWxzZVxuICogQHBhcmFtIHtib29sZWFuPX0gW2FyZ3MuZm9sbG93PWZhbHNlXSBDb250aW51ZSBsaXN0aW5nIHRoZSBoaXN0b3J5IG9mIGEgZmlsZSBiZXlvbmQgcmVuYW1lcyAod29ya3Mgb25seSBmb3IgYSBzaW5nbGUgZmlsZSkuIGRlZmF1bHRzIHRvIGZhbHNlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBhcmdzLmZvbGxvdyBDb250aW51ZSBsaXN0aW5nIHRoZSBoaXN0b3J5IG9mIGEgZmlsZSBiZXlvbmQgcmVuYW1lcyAod29ya3Mgb25seSBmb3IgYSBzaW5nbGUgZmlsZSkuIGRlZmF1bHRzIHRvIGZhbHNlXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UmVhZENvbW1pdFJlc3VsdD4+fSBSZXNvbHZlcyB0byBhbiBhcnJheSBvZiBSZWFkQ29tbWl0UmVzdWx0IG9iamVjdHNcbiAqIEBzZWUgUmVhZENvbW1pdFJlc3VsdFxuICogQHNlZSBDb21taXRPYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogbGV0IGNvbW1pdHMgPSBhd2FpdCBnaXQubG9nKHsgZGlyOiAnJGlucHV0KCgvKSknLCBkZXB0aDogJGlucHV0KCg1KSksIHJlZjogJyRpbnB1dCgobWFzdGVyKSknIH0pXG4gKiBjb25zb2xlLmxvZyhjb21taXRzKVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2xvZyh7XG4gIGZzLFxuICBjYWNoZSxcbiAgZ2l0ZGlyLFxuICBmaWxlcGF0aCxcbiAgcmVmLFxuICBkZXB0aCxcbiAgc2luY2UsXG4gIGZvcmNlLFxuICBmb2xsb3csXG59KSB7XG4gIGNvbnN0IHNpbmNlVGltZXN0YW1wID1cbiAgICB0eXBlb2Ygc2luY2UgPT09ICd1bmRlZmluZWQnXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBNYXRoLmZsb29yKHNpbmNlLnZhbHVlT2YoKSAvIDEwMDApO1xuICAvLyBUT0RPOiBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkgd2FudCB0byBoYXZlIGFuIEFQSSB3aGVyZSB3ZSByZXR1cm4gYVxuICAvLyBhc3luYyBpdGVyYXRvciB0aGF0IGVtaXRzIGNvbW1pdHMuXG4gIGNvbnN0IGNvbW1pdHMgPSBbXTtcbiAgY29uc3Qgc2hhbGxvd0NvbW1pdHMgPSBhd2FpdCBHaXRTaGFsbG93TWFuYWdlci5yZWFkKHsgZnMsIGdpdGRpciB9KTtcbiAgY29uc3Qgb2lkID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHsgZnMsIGdpdGRpciwgcmVmIH0pO1xuICBjb25zdCB0aXBzID0gW2F3YWl0IF9yZWFkQ29tbWl0KHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCB9KV07XG4gIGxldCBsYXN0RmlsZU9pZDtcbiAgbGV0IGxhc3RDb21taXQ7XG4gIGxldCBpc09rO1xuXG4gIGZ1bmN0aW9uIGVuZENvbW1pdChjb21taXQpIHtcbiAgICBpZiAoaXNPayAmJiBmaWxlcGF0aCkgY29tbWl0cy5wdXNoKGNvbW1pdCk7XG4gIH1cblxuICB3aGlsZSAodGlwcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY29tbWl0ID0gdGlwcy5wb3AoKTtcblxuICAgIC8vIFN0b3AgdGhlIGxvZyBpZiB3ZSd2ZSBoaXQgdGhlIGFnZSBsaW1pdFxuICAgIGlmIChcbiAgICAgIHNpbmNlVGltZXN0YW1wICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGNvbW1pdC5jb21taXQuY29tbWl0dGVyLnRpbWVzdGFtcCA8PSBzaW5jZVRpbWVzdGFtcFxuICAgICkge1xuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoZmlsZXBhdGgpIHtcbiAgICAgIGxldCB2RmlsZU9pZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZGaWxlT2lkID0gYXdhaXQgcmVzb2x2ZUZpbGVwYXRoKHtcbiAgICAgICAgICBmcyxcbiAgICAgICAgICBjYWNoZSxcbiAgICAgICAgICBnaXRkaXIsXG4gICAgICAgICAgb2lkOiBjb21taXQuY29tbWl0LnRyZWUsXG4gICAgICAgICAgZmlsZXBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobGFzdENvbW1pdCAmJiBsYXN0RmlsZU9pZCAhPT0gdkZpbGVPaWQpIHtcbiAgICAgICAgICBjb21taXRzLnB1c2gobGFzdENvbW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEZpbGVPaWQgPSB2RmlsZU9pZDtcbiAgICAgICAgbGFzdENvbW1pdCA9IGNvbW1pdDtcbiAgICAgICAgaXNPayA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikge1xuICAgICAgICAgIGxldCBmb3VuZCA9IGZvbGxvdyAmJiBsYXN0RmlsZU9pZDtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIGZvdW5kID0gYXdhaXQgcmVzb2x2ZUZpbGVJZEluVHJlZSh7XG4gICAgICAgICAgICAgIGZzLFxuICAgICAgICAgICAgICBjYWNoZSxcbiAgICAgICAgICAgICAgZ2l0ZGlyLFxuICAgICAgICAgICAgICBvaWQ6IGNvbW1pdC5jb21taXQudHJlZSxcbiAgICAgICAgICAgICAgZmlsZUlkOiBsYXN0RmlsZU9pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZvdW5kKSkge1xuICAgICAgICAgICAgICAgIGlmIChsYXN0Q29tbWl0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBsYXN0Rm91bmQgPSBhd2FpdCByZXNvbHZlRmlsZUlkSW5UcmVlKHtcbiAgICAgICAgICAgICAgICAgICAgZnMsXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlLFxuICAgICAgICAgICAgICAgICAgICBnaXRkaXIsXG4gICAgICAgICAgICAgICAgICAgIG9pZDogbGFzdENvbW1pdC5jb21taXQudHJlZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBsYXN0RmlsZU9pZCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGFzdEZvdW5kKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZvdW5kLmZpbHRlcihwID0+IGxhc3RGb3VuZC5pbmRleE9mKHApID09PSAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZvdW5kWzBdO1xuICAgICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoID0gZm91bmQ7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RDb21taXQpIGNvbW1pdHMucHVzaChsYXN0Q29tbWl0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Q29tbWl0KSBjb21taXRzLnB1c2gobGFzdENvbW1pdCk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IGZvdW5kO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0Q29tbWl0KSBjb21taXRzLnB1c2gobGFzdENvbW1pdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgaWYgKGlzT2sgJiYgbGFzdEZpbGVPaWQpIHtcbiAgICAgICAgICAgICAgY29tbWl0cy5wdXNoKGxhc3RDb21taXQpO1xuICAgICAgICAgICAgICBpZiAoIWZvcmNlKSBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhZm9sbG93KSB0aHJvdyBlXG4gICAgICAgICAgfVxuICAgICAgICAgIGxhc3RDb21taXQgPSBjb21taXQ7XG4gICAgICAgICAgaXNPayA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgdGhyb3cgZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRzLnB1c2goY29tbWl0KTtcbiAgICB9XG5cbiAgICAvLyBTdG9wIHRoZSBsb29wIGlmIHdlIGhhdmUgZW5vdWdoIGNvbW1pdHMgbm93LlxuICAgIGlmIChkZXB0aCAhPT0gdW5kZWZpbmVkICYmIGNvbW1pdHMubGVuZ3RoID09PSBkZXB0aCkge1xuICAgICAgZW5kQ29tbWl0KGNvbW1pdCk7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgbm90IGEgc2hhbGxvdyBjb21taXQuLi5cbiAgICBpZiAoIXNoYWxsb3dDb21taXRzLmhhcyhjb21taXQub2lkKSkge1xuICAgICAgLy8gQWRkIHRoZSBwYXJlbnRzIG9mIHRoaXMgY29tbWl0IHRvIHRoZSBxdWV1ZVxuICAgICAgLy8gTm90ZTogZm9yIHRoZSBjYXNlIG9mIGEgY29tbWl0IHdpdGggbm8gcGFyZW50cywgaXQgd2lsbCBjb25jYXQgYW4gZW1wdHkgYXJyYXksIGhhdmluZyBubyBuZXQgZWZmZWN0LlxuICAgICAgZm9yIChjb25zdCBvaWQgb2YgY29tbWl0LmNvbW1pdC5wYXJlbnQpIHtcbiAgICAgICAgY29uc3QgY29tbWl0ID0gYXdhaXQgX3JlYWRDb21taXQoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pO1xuICAgICAgICBpZiAoIXRpcHMubWFwKGNvbW1pdCA9PiBjb21taXQub2lkKS5pbmNsdWRlcyhjb21taXQub2lkKSkge1xuICAgICAgICAgIHRpcHMucHVzaChjb21taXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RvcCB0aGUgbG9vcCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBjb21taXQgcGFyZW50c1xuICAgIGlmICh0aXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW5kQ29tbWl0KGNvbW1pdCk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyB0aXBzIGluIG9yZGVyIGJ5IGFnZVxuICAgIHRpcHMuc29ydCgoYSwgYikgPT4gY29tcGFyZUFnZShhLmNvbW1pdCwgYi5jb21taXQpKTtcbiAgfVxuICByZXR1cm4gY29tbWl0c1xufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBHZXQgY29tbWl0IGRlc2NyaXB0aW9ucyBmcm9tIHRoZSBnaXQgaGlzdG9yeVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nPX0gYXJncy5maWxlcGF0aCBvcHRpb25hbCBnZXQgdGhlIGNvbW1pdCBmb3IgdGhlIGZpbGVwYXRoIG9ubHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZWYgPSAnSEVBRCddIC0gVGhlIGNvbW1pdCB0byBiZWdpbiB3YWxraW5nIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBoaXN0b3J5IGZyb21cbiAqIEBwYXJhbSB7bnVtYmVyPX0gW2FyZ3MuZGVwdGhdIC0gTGltaXQgdGhlIG51bWJlciBvZiBjb21taXRzIHJldHVybmVkLiBObyBsaW1pdCBieSBkZWZhdWx0LlxuICogQHBhcmFtIHtEYXRlfSBbYXJncy5zaW5jZV0gLSBSZXR1cm4gaGlzdG9yeSBuZXdlciB0aGFuIHRoZSBnaXZlbiBkYXRlLiBDYW4gYmUgY29tYmluZWQgd2l0aCBgZGVwdGhgIHRvIGdldCB3aGljaGV2ZXIgaXMgc2hvcnRlci5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IFthcmdzLmZvcmNlPWZhbHNlXSBkbyBub3QgdGhyb3cgZXJyb3IgaWYgZmlsZXBhdGggaXMgbm90IGV4aXN0ICh3b3JrcyBvbmx5IGZvciBhIHNpbmdsZSBmaWxlKS4gZGVmYXVsdHMgdG8gZmFsc2VcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IFthcmdzLmZvbGxvdz1mYWxzZV0gQ29udGludWUgbGlzdGluZyB0aGUgaGlzdG9yeSBvZiBhIGZpbGUgYmV5b25kIHJlbmFtZXMgKHdvcmtzIG9ubHkgZm9yIGEgc2luZ2xlIGZpbGUpLiBkZWZhdWx0cyB0byBmYWxzZVxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UmVhZENvbW1pdFJlc3VsdD4+fSBSZXNvbHZlcyB0byBhbiBhcnJheSBvZiBSZWFkQ29tbWl0UmVzdWx0IG9iamVjdHNcbiAqIEBzZWUgUmVhZENvbW1pdFJlc3VsdFxuICogQHNlZSBDb21taXRPYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogbGV0IGNvbW1pdHMgPSBhd2FpdCBnaXQubG9nKHtcbiAqICAgZnMsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIGRlcHRoOiA1LFxuICogICByZWY6ICdtYWluJ1xuICogfSlcbiAqIGNvbnNvbGUubG9nKGNvbW1pdHMpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBsb2coe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgZmlsZXBhdGgsXG4gIHJlZiA9ICdIRUFEJyxcbiAgZGVwdGgsXG4gIHNpbmNlLCAvLyBEYXRlXG4gIGZvcmNlLFxuICBmb2xsb3csXG4gIGNhY2hlID0ge30sXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIGZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdyZWYnLCByZWYpO1xuXG4gICAgcmV0dXJuIGF3YWl0IF9sb2coe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGNhY2hlLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgZmlsZXBhdGgsXG4gICAgICByZWYsXG4gICAgICBkZXB0aCxcbiAgICAgIHNpbmNlLFxuICAgICAgZm9yY2UsXG4gICAgICBmb2xsb3csXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQubG9nJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gTWVyZ2VSZXN1bHQgLSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgc2NoZW1hIGxpa2UgdGhpczpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbb2lkXSAtIFRoZSBTSEEtMSBvYmplY3QgaWQgdGhhdCBpcyBub3cgYXQgdGhlIGhlYWQgb2YgdGhlIGJyYW5jaC4gQWJzZW50IG9ubHkgaWYgYGRyeVJ1bmAgd2FzIHNwZWNpZmllZCBhbmQgYG1lcmdlQ29tbWl0YCBpcyB0cnVlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbYWxyZWFkeU1lcmdlZF0gLSBUcnVlIGlmIHRoZSBicmFuY2ggd2FzIGFscmVhZHkgbWVyZ2VkIHNvIG5vIGNoYW5nZXMgd2VyZSBtYWRlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYXN0Rm9yd2FyZF0gLSBUcnVlIGlmIGl0IHdhcyBhIGZhc3QtZm9yd2FyZCBtZXJnZVxuICogQHByb3BlcnR5IHtib29sZWFufSBbbWVyZ2VDb21taXRdIC0gVHJ1ZSBpZiBtZXJnZSByZXN1bHRlZCBpbiBhIG1lcmdlIGNvbW1pdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0cmVlXSAtIFRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlIHRyZWUgcmVzdWx0aW5nIGZyb20gYSBtZXJnZSBjb21taXRcbiAqXG4gKi9cblxuLyoqXG4gKiBNZXJnZSB0d28gYnJhbmNoZXNcbiAqXG4gKiBDdXJyZW50bHkgaXQgd2lsbCBmYWlsIGlmIG11bHRpcGxlIGNhbmRpZGF0ZSBtZXJnZSBiYXNlcyBhcmUgZm91bmQuIChJdCBkb2Vzbid0IHlldCBpbXBsZW1lbnQgdGhlIHJlY3Vyc2l2ZSBtZXJnZSBzdHJhdGVneS4pXG4gKlxuICogQ3VycmVudGx5IGl0IGRvZXMgbm90IHN1cHBvcnQgc2VsZWN0aW5nIGFsdGVybmF0aXZlIG1lcmdlIHN0cmF0ZWdpZXMuXG4gKlxuICogQ3VycmVudGx5IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBhYm9ydCBhbiBpbmNvbXBsZXRlIG1lcmdlLiBUbyByZXN0b3JlIHRoZSB3b3JrdHJlZSB0byBhIGNsZWFuIHN0YXRlLCB5b3Ugd2lsbCBuZWVkIHRvIGNoZWNrb3V0IGFuIGVhcmxpZXIgY29tbWl0LlxuICpcbiAqIEN1cnJlbnRseSBpdCBkb2VzIG5vdCBkaXJlY3RseSBzdXBwb3J0IHRoZSBiZWhhdmlvciBvZiBgZ2l0IG1lcmdlIC0tY29udGludWVgLiBUbyBjb21wbGV0ZSBhIG1lcmdlIGFmdGVyIG1hbnVhbCBjb25mbGljdCByZXNvbHV0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCBhbmQgY29tbWl0IHRoZSBmaWxlcyBtYW51YWxseSwgYW5kIHNwZWNpZnkgdGhlIGFwcHJvcHJpYXRlIHBhcmVudCBjb21taXRzLlxuICpcbiAqICMjIE1hbnVhbGx5IHJlc29sdmluZyBtZXJnZSBjb25mbGljdHNcbiAqIEJ5IGRlZmF1bHQsIGlmIGlzb21vcnBoaWMtZ2l0IGVuY291bnRlcnMgYSBtZXJnZSBjb25mbGljdCBpdCBjYW5ub3QgcmVzb2x2ZSB1c2luZyB0aGUgYnVpbHRpbiBkaWZmMyBhbGdvcml0aG0gb3IgcHJvdmlkZWQgbWVyZ2UgZHJpdmVyLCBpdCB3aWxsIGFib3J0IGFuZCB0aHJvdyBhIGBNZXJnZU5vdFN1cHBvcnRlZEVycm9yYC5cbiAqIFRoaXMgbGVhdmVzIHRoZSBpbmRleCBhbmQgd29ya2luZyB0cmVlIHVudG91Y2hlZC5cbiAqXG4gKiBXaGVuIGBhYm9ydE9uQ29uZmxpY3RgIGlzIHNldCB0byBgZmFsc2VgLCBhbmQgYSBtZXJnZSBjb25mbGljdCBjYW5ub3QgYmUgYXV0b21hdGljYWxseSByZXNvbHZlZCwgYSBgTWVyZ2VDb25mbGljdEVycm9yYCBpcyB0aHJvd24gYW5kIHRoZSByZXN1bHRzIG9mIHRoZSBpbmNvbXBsZXRlIG1lcmdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gKiBUaGlzIGluY2x1ZGVzIGNvbmZsaWN0IG1hcmtlcnMgaW4gZmlsZXMgd2l0aCB1bnJlc29sdmVkIG1lcmdlIGNvbmZsaWN0cy5cbiAqXG4gKiBUbyBjb21wbGV0ZSB0aGUgbWVyZ2UsIGVkaXQgdGhlIGNvbmZsaWN0aW5nIGZpbGVzIGFzIHlvdSBzZWUgZml0LCBhbmQgdGhlbiBhZGQgYW5kIGNvbW1pdCB0aGUgcmVzb2x2ZWQgbWVyZ2UuXG4gKlxuICogRm9yIGEgcHJvcGVyIG1lcmdlIGNvbW1pdCwgYmUgc3VyZSB0byBzcGVjaWZ5IHRoZSBicmFuY2hlcyBvciBjb21taXRzIHlvdSBhcmUgbWVyZ2luZyBpbiB0aGUgYHBhcmVudGAgYXJndW1lbnQgdG8gYGdpdC5jb21taXRgLlxuICogRm9yIGV4YW1wbGUsIHNheSB3ZSBhcmUgbWVyZ2luZyB0aGUgYnJhbmNoIGBmZWF0dXJlYCBpbnRvIHRoZSBicmFuY2ggYG1haW5gIGFuZCB0aGVyZSBpcyBhIGNvbmZsaWN0IHdlIHdhbnQgdG8gcmVzb2x2ZSBtYW51YWxseS5cbiAqIFRoZSBmbG93IHdvdWxkIGxvb2sgbGlrZSB0aGlzOlxuICpcbiAqIGBgYFxuICogYXdhaXQgZ2l0Lm1lcmdlKHtcbiAqICAgZnMsXG4gKiAgIGRpcixcbiAqICAgb3VyczogJ21haW4nLFxuICogICB0aGVpcnM6ICdmZWF0dXJlJyxcbiAqICAgYWJvcnRPbkNvbmZsaWN0OiBmYWxzZSxcbiAqIH0pLmNhdGNoKGUgPT4ge1xuICogICBpZiAoZSBpbnN0YW5jZW9mIEVycm9ycy5NZXJnZUNvbmZsaWN0RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmxvZyhcbiAqICAgICAgICdBdXRvbWF0aWMgbWVyZ2UgZmFpbGVkIGZvciB0aGUgZm9sbG93aW5nIGZpbGVzOiAnXG4gKiAgICAgICArIGAke2UuZGF0YX0uIGBcbiAqICAgICAgICsgJ1Jlc29sdmUgdGhlc2UgY29uZmxpY3RzIGFuZCB0aGVuIGNvbW1pdCB5b3VyIGNoYW5nZXMuJ1xuICogICAgIClcbiAqICAgfSBlbHNlIHRocm93IGVcbiAqIH0pXG4gKlxuICogLy8gVGhpcyBpcyB0aGUgd2hlcmUgd2UgbWFudWFsbHkgZWRpdCB0aGUgZmlsZXMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUgd29ya2luZyBkaXJlY3RvcnlcbiAqIC8vIC4uLlxuICogLy8gRmlsZXMgaGF2ZSBiZWVuIGVkaXRlZCBhbmQgd2UgYXJlIHJlYWR5IHRvIGNvbW1pdFxuICpcbiAqIGF3YWl0IGdpdC5hZGQoe1xuICogICBmcyxcbiAqICAgZGlyLFxuICogICBmaWxlcGF0aDogJy4nLFxuICogfSlcbiAqXG4gKiBhd2FpdCBnaXQuY29tbWl0KHtcbiAqICAgZnMsXG4gKiAgIGRpcixcbiAqICAgcmVmOiAnbWFpbicsXG4gKiAgIG1lc3NhZ2U6IFwiTWVyZ2UgYnJhbmNoICdmZWF0dXJlJyBpbnRvIG1haW5cIixcbiAqICAgcGFyZW50OiBbJ21haW4nLCAnZmVhdHVyZSddLCAvLyBCZSBzdXJlIHRvIHNwZWNpZnkgdGhlIHBhcmVudHMgd2hlbiBjcmVhdGluZyBhIG1lcmdlIGNvbW1pdFxuICogfSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7U2lnbkNhbGxiYWNrfSBbYXJncy5vblNpZ25dIC0gYSBQR1Agc2lnbmluZyBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLm91cnNdIC0gVGhlIGJyYW5jaCByZWNlaXZpbmcgdGhlIG1lcmdlLiBJZiB1bmRlZmluZWQsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRoZWlycyAtIFRoZSBicmFuY2ggdG8gYmUgbWVyZ2VkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmZhc3RGb3J3YXJkID0gdHJ1ZV0gLSBJZiBmYWxzZSwgY3JlYXRlIGEgbWVyZ2UgY29tbWl0IGluIGFsbCBjYXNlcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZmFzdEZvcndhcmRPbmx5ID0gZmFsc2VdIC0gSWYgdHJ1ZSwgdGhlbiBub24tZmFzdC1mb3J3YXJkIG1lcmdlcyB3aWxsIHRocm93IGFuIEVycm9yIGluc3RlYWQgb2YgcGVyZm9ybWluZyBhIG1lcmdlLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kcnlSdW4gPSBmYWxzZV0gLSBJZiB0cnVlLCBzaW11bGF0ZXMgYSBtZXJnZSBzbyB5b3UgY2FuIHRlc3Qgd2hldGhlciBpdCB3b3VsZCBzdWNjZWVkLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5ub1VwZGF0ZUJyYW5jaCA9IGZhbHNlXSAtIElmIHRydWUsIGRvZXMgbm90IHVwZGF0ZSB0aGUgYnJhbmNoIHBvaW50ZXIgYWZ0ZXIgY3JlYXRpbmcgdGhlIGNvbW1pdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuYWJvcnRPbkNvbmZsaWN0ID0gdHJ1ZV0gLSBJZiB0cnVlLCBtZXJnZXMgd2l0aCBjb25mbGljdHMgd2lsbCBub3QgdXBkYXRlIHRoZSB3b3JrdHJlZSBvciBpbmRleC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5tZXNzYWdlXSAtIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBhdXRvLWdlbmVyYXRlZCBtZXJnZSBjb21taXQgbWVzc2FnZVxuICogQHBhcmFtIHtPYmplY3R9IFthcmdzLmF1dGhvcl0gLSBwYXNzZWQgdG8gW2NvbW1pdF0oY29tbWl0Lm1kKSB3aGVuIGNyZWF0aW5nIGEgbWVyZ2UgY29tbWl0XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYXV0aG9yLm5hbWVdIC0gRGVmYXVsdCBpcyBgdXNlci5uYW1lYCBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYXV0aG9yLmVtYWlsXSAtIERlZmF1bHQgaXMgYHVzZXIuZW1haWxgIGNvbmZpZy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5hdXRob3IudGltZXN0YW1wPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xMDAwKV0gLSBTZXQgdGhlIGF1dGhvciB0aW1lc3RhbXAgZmllbGQuIFRoaXMgaXMgdGhlIGludGVnZXIgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIFVuaXggZXBvY2ggKDE5NzAtMDEtMDEgMDA6MDA6MDApLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmF1dGhvci50aW1lem9uZU9mZnNldF0gLSBTZXQgdGhlIGF1dGhvciB0aW1lem9uZSBvZmZzZXQgZmllbGQuIFRoaXMgaXMgdGhlIGRpZmZlcmVuY2UsIGluIG1pbnV0ZXMsIGZyb20gdGhlIGN1cnJlbnQgdGltZXpvbmUgdG8gVVRDLiBEZWZhdWx0IGlzIGAobmV3IERhdGUoKSkuZ2V0VGltZXpvbmVPZmZzZXQoKWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ3MuY29tbWl0dGVyXSAtIHBhc3NlZCB0byBbY29tbWl0XShjb21taXQubWQpIHdoZW4gY3JlYXRpbmcgYSBtZXJnZSBjb21taXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb21taXR0ZXIubmFtZV0gLSBEZWZhdWx0IGlzIGB1c2VyLm5hbWVgIGNvbmZpZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb21taXR0ZXIuZW1haWxdIC0gRGVmYXVsdCBpcyBgdXNlci5lbWFpbGAgY29uZmlnLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmNvbW1pdHRlci50aW1lc3RhbXA9TWF0aC5mbG9vcihEYXRlLm5vdygpLzEwMDApXSAtIFNldCB0aGUgY29tbWl0dGVyIHRpbWVzdGFtcCBmaWVsZC4gVGhpcyBpcyB0aGUgaW50ZWdlciBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBlcG9jaCAoMTk3MC0wMS0wMSAwMDowMDowMCkuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuY29tbWl0dGVyLnRpbWV6b25lT2Zmc2V0XSAtIFNldCB0aGUgY29tbWl0dGVyIHRpbWV6b25lIG9mZnNldCBmaWVsZC4gVGhpcyBpcyB0aGUgZGlmZmVyZW5jZSwgaW4gbWludXRlcywgZnJvbSB0aGUgY3VycmVudCB0aW1lem9uZSB0byBVVEMuIERlZmF1bHQgaXMgYChuZXcgRGF0ZSgpKS5nZXRUaW1lem9uZU9mZnNldCgpYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zaWduaW5nS2V5XSAtIHBhc3NlZCB0byBbY29tbWl0XShjb21taXQubWQpIHdoZW4gY3JlYXRpbmcgYSBtZXJnZSBjb21taXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICogQHBhcmFtIHtNZXJnZURyaXZlckNhbGxiYWNrfSBbYXJncy5tZXJnZURyaXZlcl0gLSBhIFttZXJnZSBkcml2ZXJdKG1lcmdlRHJpdmVyLm1kKSBpbXBsZW1lbnRhdGlvblxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPE1lcmdlUmVzdWx0Pn0gUmVzb2x2ZXMgdG8gYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVyZ2Ugb3BlcmF0aW9uXG4gKiBAc2VlIE1lcmdlUmVzdWx0XG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCBtID0gYXdhaXQgZ2l0Lm1lcmdlKHtcbiAqICAgZnMsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIG91cnM6ICdtYWluJyxcbiAqICAgdGhlaXJzOiAncmVtb3Rlcy9vcmlnaW4vbWFpbidcbiAqIH0pXG4gKiBjb25zb2xlLmxvZyhtKVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWVyZ2Uoe1xuICBmczogX2ZzLFxuICBvblNpZ24sXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIG91cnMsXG4gIHRoZWlycyxcbiAgZmFzdEZvcndhcmQgPSB0cnVlLFxuICBmYXN0Rm9yd2FyZE9ubHkgPSBmYWxzZSxcbiAgZHJ5UnVuID0gZmFsc2UsXG4gIG5vVXBkYXRlQnJhbmNoID0gZmFsc2UsXG4gIGFib3J0T25Db25mbGljdCA9IHRydWUsXG4gIG1lc3NhZ2UsXG4gIGF1dGhvcjogX2F1dGhvcixcbiAgY29tbWl0dGVyOiBfY29tbWl0dGVyLFxuICBzaWduaW5nS2V5LFxuICBjYWNoZSA9IHt9LFxuICBtZXJnZURyaXZlcixcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgX2ZzKTtcbiAgICBpZiAoc2lnbmluZ0tleSkge1xuICAgICAgYXNzZXJ0UGFyYW1ldGVyKCdvblNpZ24nLCBvblNpZ24pO1xuICAgIH1cbiAgICBjb25zdCBmcyA9IG5ldyBGaWxlU3lzdGVtKF9mcyk7XG5cbiAgICBjb25zdCBhdXRob3IgPSBhd2FpdCBub3JtYWxpemVBdXRob3JPYmplY3QoeyBmcywgZ2l0ZGlyLCBhdXRob3I6IF9hdXRob3IgfSk7XG4gICAgaWYgKCFhdXRob3IgJiYgKCFmYXN0Rm9yd2FyZE9ubHkgfHwgIWZhc3RGb3J3YXJkKSkge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdOYW1lRXJyb3IoJ2F1dGhvcicpXG4gICAgfVxuXG4gICAgY29uc3QgY29tbWl0dGVyID0gYXdhaXQgbm9ybWFsaXplQ29tbWl0dGVyT2JqZWN0KHtcbiAgICAgIGZzLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgYXV0aG9yLFxuICAgICAgY29tbWl0dGVyOiBfY29tbWl0dGVyLFxuICAgIH0pO1xuICAgIGlmICghY29tbWl0dGVyICYmICghZmFzdEZvcndhcmRPbmx5IHx8ICFmYXN0Rm9yd2FyZCkpIHtcbiAgICAgIHRocm93IG5ldyBNaXNzaW5nTmFtZUVycm9yKCdjb21taXR0ZXInKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBfbWVyZ2Uoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIGRpcixcbiAgICAgIGdpdGRpcixcbiAgICAgIG91cnMsXG4gICAgICB0aGVpcnMsXG4gICAgICBmYXN0Rm9yd2FyZCxcbiAgICAgIGZhc3RGb3J3YXJkT25seSxcbiAgICAgIGRyeVJ1bixcbiAgICAgIG5vVXBkYXRlQnJhbmNoLFxuICAgICAgYWJvcnRPbkNvbmZsaWN0LFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGF1dGhvcixcbiAgICAgIGNvbW1pdHRlcixcbiAgICAgIHNpZ25pbmdLZXksXG4gICAgICBvblNpZ24sXG4gICAgICBtZXJnZURyaXZlcixcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5tZXJnZSc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLyoqXG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG5jb25zdCB0eXBlcyA9IHtcbiAgY29tbWl0OiAwYjAwMTAwMDAsXG4gIHRyZWU6IDBiMDEwMDAwMCxcbiAgYmxvYjogMGIwMTEwMDAwLFxuICB0YWc6IDBiMTAwMDAwMCxcbiAgb2ZzX2RlbHRhOiAwYjExMDAwMDAsXG4gIHJlZl9kZWx0YTogMGIxMTEwMDAwLFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHthbnl9IGFyZ3MuY2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCAnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLm9pZHNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX3BhY2soe1xuICBmcyxcbiAgY2FjaGUsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIG9pZHMsXG59KSB7XG4gIGNvbnN0IGhhc2ggPSBuZXcgSGFzaCgpO1xuICBjb25zdCBvdXRwdXRTdHJlYW0gPSBbXTtcbiAgZnVuY3Rpb24gd3JpdGUoY2h1bmssIGVuYykge1xuICAgIGNvbnN0IGJ1ZmYgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jKTtcbiAgICBvdXRwdXRTdHJlYW0ucHVzaChidWZmKTtcbiAgICBoYXNoLnVwZGF0ZShidWZmKTtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiB3cml0ZU9iamVjdCh7IHN0eXBlLCBvYmplY3QgfSkge1xuICAgIC8vIE9iamVjdCB0eXBlIGlzIGVuY29kZWQgaW4gYml0cyA2NTRcbiAgICBjb25zdCB0eXBlID0gdHlwZXNbc3R5cGVdO1xuICAgIC8vIFRoZSBsZW5ndGggZW5jb2RpbmcgZ2V0cyBjb21wbGljYXRlZC5cbiAgICBsZXQgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDtcbiAgICAvLyBXaGV0aGVyIHRoZSBuZXh0IGJ5dGUgaXMgcGFydCBvZiB0aGUgdmFyaWFibGUtbGVuZ3RoIGVuY29kZWQgbnVtYmVyXG4gICAgLy8gaXMgZW5jb2RlZCBpbiBiaXQgN1xuICAgIGxldCBtdWx0aWJ5dGUgPSBsZW5ndGggPiAwYjExMTEgPyAwYjEwMDAwMDAwIDogMGIwO1xuICAgIC8vIExhc3QgZm91ciBiaXRzIG9mIGxlbmd0aCBpcyBlbmNvZGVkIGluIGJpdHMgMzIxMFxuICAgIGNvbnN0IGxhc3RGb3VyID0gbGVuZ3RoICYgMGIxMTExO1xuICAgIC8vIERpc2NhcmQgdGhvc2UgYml0c1xuICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gNDtcbiAgICAvLyBUaGUgZmlyc3QgYnl0ZSBpcyB0aGVuICgxLWJpdCBtdWx0aWJ5dGU/KSwgKDMtYml0IHR5cGUpLCAoNC1iaXQgbGVhc3Qgc2lnIDQtYml0cyBvZiBsZW5ndGgpXG4gICAgbGV0IGJ5dGUgPSAobXVsdGlieXRlIHwgdHlwZSB8IGxhc3RGb3VyKS50b1N0cmluZygxNik7XG4gICAgd3JpdGUoYnl0ZSwgJ2hleCcpO1xuICAgIC8vIE5vdyB3ZSBrZWVwIGNob3BwaW5nIGF3YXkgYXQgbGVuZ3RoIDctYml0cyBhdCBhIHRpbWUgdW50aWwgaXRzIHplcm8sXG4gICAgLy8gd3JpdGluZyBvdXQgdGhlIGJ5dGVzIGluIHdoYXQgYW1vdW50cyB0byBsaXR0bGUtZW5kaWFuIG9yZGVyLlxuICAgIHdoaWxlIChtdWx0aWJ5dGUpIHtcbiAgICAgIG11bHRpYnl0ZSA9IGxlbmd0aCA+IDBiMDExMTExMTEgPyAwYjEwMDAwMDAwIDogMGIwO1xuICAgICAgYnl0ZSA9IG11bHRpYnl0ZSB8IChsZW5ndGggJiAwYjAxMTExMTExKTtcbiAgICAgIHdyaXRlKHBhZEhleCgyLCBieXRlKSwgJ2hleCcpO1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiA3O1xuICAgIH1cbiAgICAvLyBMYXN0bHksIHdlIGNhbiBjb21wcmVzcyBhbmQgd3JpdGUgdGhlIG9iamVjdC5cbiAgICB3cml0ZShCdWZmZXIuZnJvbShhd2FpdCBkZWZsYXRlKG9iamVjdCkpKTtcbiAgfVxuICB3cml0ZSgnUEFDSycpO1xuICB3cml0ZSgnMDAwMDAwMDInLCAnaGV4Jyk7XG4gIC8vIFdyaXRlIGEgNCBieXRlICgzMi1iaXQpIGludFxuICB3cml0ZShwYWRIZXgoOCwgb2lkcy5sZW5ndGgpLCAnaGV4Jyk7XG4gIGZvciAoY29uc3Qgb2lkIG9mIG9pZHMpIHtcbiAgICBjb25zdCB7IHR5cGUsIG9iamVjdCB9ID0gYXdhaXQgX3JlYWRPYmplY3QoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pO1xuICAgIGF3YWl0IHdyaXRlT2JqZWN0KHsgd3JpdGUsIG9iamVjdCwgc3R5cGU6IHR5cGUgfSk7XG4gIH1cbiAgLy8gV3JpdGUgU0hBMSBjaGVja3N1bVxuICBjb25zdCBkaWdlc3QgPSBoYXNoLmRpZ2VzdCgpO1xuICBvdXRwdXRTdHJlYW0ucHVzaChkaWdlc3QpO1xuICByZXR1cm4gb3V0cHV0U3RyZWFtXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYWNrT2JqZWN0c1Jlc3VsdCBUaGUgcGFja09iamVjdHMgY29tbWFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIHR3byBwcm9wZXJ0aWVzOlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gVGhlIHN1Z2dlc3RlZCBmaWxlbmFtZSBmb3IgdGhlIHBhY2tmaWxlIGlmIHlvdSB3YW50IHRvIHNhdmUgaXQgdG8gZGlzayBzb21ld2hlcmUuIEl0IGluY2x1ZGVzIHRoZSBwYWNrZmlsZSBTSEEuXG4gKiBAcHJvcGVydHkge1VpbnQ4QXJyYXl9IFtwYWNrZmlsZV0gLSBUaGUgcGFja2ZpbGUgY29udGVudHMuIE5vdCBwcmVzZW50IGlmIGB3cml0ZWAgcGFyYW1ldGVyIHdhcyB0cnVlLCBpbiB3aGljaCBjYXNlIHRoZSBwYWNrZmlsZSB3YXMgd3JpdHRlbiBzdHJhaWdodCB0byBkaXNrLlxuICovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7YW55fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3Mub2lkc1xuICogQHBhcmFtIHtib29sZWFufSBhcmdzLndyaXRlXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8UGFja09iamVjdHNSZXN1bHQ+fVxuICogQHNlZSBQYWNrT2JqZWN0c1Jlc3VsdFxuICovXG5hc3luYyBmdW5jdGlvbiBfcGFja09iamVjdHMoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkcywgd3JpdGUgfSkge1xuICBjb25zdCBidWZmZXJzID0gYXdhaXQgX3BhY2soeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkcyB9KTtcbiAgY29uc3QgcGFja2ZpbGUgPSBCdWZmZXIuZnJvbShhd2FpdCBjb2xsZWN0KGJ1ZmZlcnMpKTtcbiAgY29uc3QgcGFja2ZpbGVTaGEgPSBwYWNrZmlsZS5zbGljZSgtMjApLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgZmlsZW5hbWUgPSBgcGFjay0ke3BhY2tmaWxlU2hhfS5wYWNrYDtcbiAgaWYgKHdyaXRlKSB7XG4gICAgYXdhaXQgZnMud3JpdGUoam9pbihnaXRkaXIsIGBvYmplY3RzL3BhY2svJHtmaWxlbmFtZX1gKSwgcGFja2ZpbGUpO1xuICAgIHJldHVybiB7IGZpbGVuYW1lIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbGVuYW1lLFxuICAgIHBhY2tmaWxlOiBuZXcgVWludDhBcnJheShwYWNrZmlsZSksXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBhY2tPYmplY3RzUmVzdWx0IFRoZSBwYWNrT2JqZWN0cyBjb21tYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggdHdvIHByb3BlcnRpZXM6XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBUaGUgc3VnZ2VzdGVkIGZpbGVuYW1lIGZvciB0aGUgcGFja2ZpbGUgaWYgeW91IHdhbnQgdG8gc2F2ZSBpdCB0byBkaXNrIHNvbWV3aGVyZS4gSXQgaW5jbHVkZXMgdGhlIHBhY2tmaWxlIFNIQS5cbiAqIEBwcm9wZXJ0eSB7VWludDhBcnJheX0gW3BhY2tmaWxlXSAtIFRoZSBwYWNrZmlsZSBjb250ZW50cy4gTm90IHByZXNlbnQgaWYgYHdyaXRlYCBwYXJhbWV0ZXIgd2FzIHRydWUsIGluIHdoaWNoIGNhc2UgdGhlIHBhY2tmaWxlIHdhcyB3cml0dGVuIHN0cmFpZ2h0IHRvIGRpc2suXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBwYWNrZmlsZSBmcm9tIGFuIGFycmF5IG9mIFNIQS0xIG9iamVjdCBpZHNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwgJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5vaWRzIC0gQW4gYXJyYXkgb2YgU0hBLTEgb2JqZWN0IGlkcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcGFja2ZpbGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3Mud3JpdGUgPSBmYWxzZV0gLSBXaGV0aGVyIHRvIHNhdmUgdGhlIHBhY2tmaWxlIHRvIGRpc2sgb3Igbm90XG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3MuY2FjaGVdIC0gYSBbY2FjaGVdKGNhY2hlLm1kKSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYWNrT2JqZWN0c1Jlc3VsdD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aGVuIHRoZSBwYWNrZmlsZSBpcyByZWFkeSB3aXRoIHRoZSBmaWxlbmFtZSBhbmQgYnVmZmVyXG4gKiBAc2VlIFBhY2tPYmplY3RzUmVzdWx0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHBhY2tmaWxlIGNvbnRhaW5pbmcgb25seSBhbiBlbXB0eSB0cmVlXG4gKiBsZXQgeyBwYWNrZmlsZSB9ID0gYXdhaXQgZ2l0LnBhY2tPYmplY3RzKHtcbiAqICAgZnMsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIG9pZHM6IFsnNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNCddXG4gKiB9KVxuICogY29uc29sZS5sb2cocGFja2ZpbGUpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBwYWNrT2JqZWN0cyh7XG4gIGZzLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICBvaWRzLFxuICB3cml0ZSA9IGZhbHNlLFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcignb2lkcycsIG9pZHMpO1xuXG4gICAgcmV0dXJuIGF3YWl0IF9wYWNrT2JqZWN0cyh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgY2FjaGUsXG4gICAgICBnaXRkaXIsXG4gICAgICBvaWRzLFxuICAgICAgd3JpdGUsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQucGFja09iamVjdHMnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEZldGNoIGFuZCBtZXJnZSBjb21taXRzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7SHR0cENsaWVudH0gYXJncy5odHRwIC0gYW4gSFRUUCBjbGllbnRcbiAqIEBwYXJhbSB7UHJvZ3Jlc3NDYWxsYmFja30gW2FyZ3Mub25Qcm9ncmVzc10gLSBvcHRpb25hbCBwcm9ncmVzcyBldmVudCBjYWxsYmFja1xuICogQHBhcmFtIHtNZXNzYWdlQ2FsbGJhY2t9IFthcmdzLm9uTWVzc2FnZV0gLSBvcHRpb25hbCBtZXNzYWdlIGV2ZW50IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0F1dGhDYWxsYmFja30gW2FyZ3Mub25BdXRoXSAtIG9wdGlvbmFsIGF1dGggZmlsbCBjYWxsYmFja1xuICogQHBhcmFtIHtBdXRoRmFpbHVyZUNhbGxiYWNrfSBbYXJncy5vbkF1dGhGYWlsdXJlXSAtIG9wdGlvbmFsIGF1dGggcmVqZWN0ZWQgY2FsbGJhY2tcbiAqIEBwYXJhbSB7QXV0aFN1Y2Nlc3NDYWxsYmFja30gW2FyZ3Mub25BdXRoU3VjY2Vzc10gLSBvcHRpb25hbCBhdXRoIGFwcHJvdmVkIGNhbGxiYWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZWZdIC0gV2hpY2ggYnJhbmNoIHRvIG1lcmdlIGludG8uIEJ5IGRlZmF1bHQgdGhpcyBpcyB0aGUgY3VycmVudGx5IGNoZWNrZWQgb3V0IGJyYW5jaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy51cmxdIC0gKEFkZGVkIGluIDEuMS4wKSBUaGUgVVJMIG9mIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4gVGhlIGRlZmF1bHQgaXMgdGhlIHZhbHVlIHNldCBpbiB0aGUgZ2l0IGNvbmZpZyBmb3IgdGhhdCByZW1vdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlXSAtIChBZGRlZCBpbiAxLjEuMCkgSWYgVVJMIGlzIG5vdCBzcGVjaWZpZWQsIGRldGVybWluZXMgd2hpY2ggcmVtb3RlIHRvIHVzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZW1vdGVSZWZdIC0gKEFkZGVkIGluIDEuMS4wKSBUaGUgbmFtZSBvZiB0aGUgYnJhbmNoIG9uIHRoZSByZW1vdGUgdG8gZmV0Y2guIEJ5IGRlZmF1bHQgdGhpcyBpcyB0aGUgY29uZmlndXJlZCByZW1vdGUgdHJhY2tpbmcgYnJhbmNoLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5wcnVuZSA9IGZhbHNlXSAtIERlbGV0ZSBsb2NhbCByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMgdGhhdCBhcmUgbm90IHByZXNlbnQgb24gdGhlIHJlbW90ZVxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5wcnVuZVRhZ3MgPSBmYWxzZV0gLSBQcnVuZSBsb2NhbCB0YWdzIHRoYXQgZG9uXHUyMDE5dCBleGlzdCBvbiB0aGUgcmVtb3RlLCBhbmQgZm9yY2UtdXBkYXRlIHRob3NlIHRhZ3MgdGhhdCBkaWZmZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb3JzUHJveHldIC0gT3B0aW9uYWwgW0NPUlMgcHJveHldKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS8lNDBpc29tb3JwaGljLWdpdC9jb3JzLXByb3h5KS4gT3ZlcnJpZGVzIHZhbHVlIGluIHJlcG8gY29uZmlnLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5zaW5nbGVCcmFuY2ggPSBmYWxzZV0gLSBJbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGZldGNoaW5nIGFsbCB0aGUgYnJhbmNoZXMsIG9ubHkgZmV0Y2ggYSBzaW5nbGUgYnJhbmNoLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mYXN0Rm9yd2FyZCA9IHRydWVdIC0gIElmIGZhbHNlLCBvbmx5IGNyZWF0ZSBtZXJnZSBjb21taXRzLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mYXN0Rm9yd2FyZE9ubHkgPSBmYWxzZV0gLSBPbmx5IHBlcmZvcm0gc2ltcGxlIGZhc3QtZm9yd2FyZCBtZXJnZXMuIChEb24ndCBjcmVhdGUgbWVyZ2UgY29tbWl0cy4pXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIHN0cmluZz59IFthcmdzLmhlYWRlcnNdIC0gQWRkaXRpb25hbCBoZWFkZXJzIHRvIGluY2x1ZGUgaW4gSFRUUCByZXF1ZXN0cywgc2ltaWxhciB0byBnaXQncyBgZXh0cmFIZWFkZXJgIGNvbmZpZ1xuICogQHBhcmFtIHtPYmplY3R9IFthcmdzLmF1dGhvcl0gLSBUaGUgZGV0YWlscyBhYm91dCB0aGUgYXV0aG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhvci5uYW1lXSAtIERlZmF1bHQgaXMgYHVzZXIubmFtZWAgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhvci5lbWFpbF0gLSBEZWZhdWx0IGlzIGB1c2VyLmVtYWlsYCBjb25maWcuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYXV0aG9yLnRpbWVzdGFtcD1NYXRoLmZsb29yKERhdGUubm93KCkvMTAwMCldIC0gU2V0IHRoZSBhdXRob3IgdGltZXN0YW1wIGZpZWxkLiBUaGlzIGlzIHRoZSBpbnRlZ2VyIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBVbml4IGVwb2NoICgxOTcwLTAxLTAxIDAwOjAwOjAwKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5hdXRob3IudGltZXpvbmVPZmZzZXRdIC0gU2V0IHRoZSBhdXRob3IgdGltZXpvbmUgb2Zmc2V0IGZpZWxkLiBUaGlzIGlzIHRoZSBkaWZmZXJlbmNlLCBpbiBtaW51dGVzLCBmcm9tIHRoZSBjdXJyZW50IHRpbWV6b25lIHRvIFVUQy4gRGVmYXVsdCBpcyBgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KClgLlxuICogQHBhcmFtIHtPYmplY3R9IFthcmdzLmNvbW1pdHRlciA9IGF1dGhvcl0gLSBUaGUgZGV0YWlscyBhYm91dCB0aGUgY29tbWl0IGNvbW1pdHRlciwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBhdXRob3IgcGFyYW1ldGVyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgYXV0aG9yIGRldGFpbHMgYXJlIHVzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuY29tbWl0dGVyLm5hbWVdIC0gRGVmYXVsdCBpcyBgdXNlci5uYW1lYCBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuY29tbWl0dGVyLmVtYWlsXSAtIERlZmF1bHQgaXMgYHVzZXIuZW1haWxgIGNvbmZpZy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5jb21taXR0ZXIudGltZXN0YW1wPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xMDAwKV0gLSBTZXQgdGhlIGNvbW1pdHRlciB0aW1lc3RhbXAgZmllbGQuIFRoaXMgaXMgdGhlIGludGVnZXIgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIFVuaXggZXBvY2ggKDE5NzAtMDEtMDEgMDA6MDA6MDApLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmNvbW1pdHRlci50aW1lem9uZU9mZnNldF0gLSBTZXQgdGhlIGNvbW1pdHRlciB0aW1lem9uZSBvZmZzZXQgZmllbGQuIFRoaXMgaXMgdGhlIGRpZmZlcmVuY2UsIGluIG1pbnV0ZXMsIGZyb20gdGhlIGN1cnJlbnQgdGltZXpvbmUgdG8gVVRDLiBEZWZhdWx0IGlzIGAobmV3IERhdGUoKSkuZ2V0VGltZXpvbmVPZmZzZXQoKWAuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc2lnbmluZ0tleV0gLSBwYXNzZWQgdG8gW2NvbW1pdF0oY29tbWl0Lm1kKSB3aGVuIGNyZWF0aW5nIGEgbWVyZ2UgY29tbWl0XG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3MuY2FjaGVdIC0gYSBbY2FjaGVdKGNhY2hlLm1kKSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gcHVsbCBvcGVyYXRpb24gY29tcGxldGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IGdpdC5wdWxsKHtcbiAqICAgZnMsXG4gKiAgIGh0dHAsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIHJlZjogJ21haW4nLFxuICogICBzaW5nbGVCcmFuY2g6IHRydWVcbiAqIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBwdWxsKHtcbiAgZnM6IF9mcyxcbiAgaHR0cCxcbiAgb25Qcm9ncmVzcyxcbiAgb25NZXNzYWdlLFxuICBvbkF1dGgsXG4gIG9uQXV0aFN1Y2Nlc3MsXG4gIG9uQXV0aEZhaWx1cmUsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIHJlZixcbiAgdXJsLFxuICByZW1vdGUsXG4gIHJlbW90ZVJlZixcbiAgcHJ1bmUgPSBmYWxzZSxcbiAgcHJ1bmVUYWdzID0gZmFsc2UsXG4gIGZhc3RGb3J3YXJkID0gdHJ1ZSxcbiAgZmFzdEZvcndhcmRPbmx5ID0gZmFsc2UsXG4gIGNvcnNQcm94eSxcbiAgc2luZ2xlQnJhbmNoLFxuICBoZWFkZXJzID0ge30sXG4gIGF1dGhvcjogX2F1dGhvcixcbiAgY29tbWl0dGVyOiBfY29tbWl0dGVyLFxuICBzaWduaW5nS2V5LFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBfZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcblxuICAgIGNvbnN0IGZzID0gbmV3IEZpbGVTeXN0ZW0oX2ZzKTtcblxuICAgIGNvbnN0IGF1dGhvciA9IGF3YWl0IG5vcm1hbGl6ZUF1dGhvck9iamVjdCh7IGZzLCBnaXRkaXIsIGF1dGhvcjogX2F1dGhvciB9KTtcbiAgICBpZiAoIWF1dGhvcikgdGhyb3cgbmV3IE1pc3NpbmdOYW1lRXJyb3IoJ2F1dGhvcicpXG5cbiAgICBjb25zdCBjb21taXR0ZXIgPSBhd2FpdCBub3JtYWxpemVDb21taXR0ZXJPYmplY3Qoe1xuICAgICAgZnMsXG4gICAgICBnaXRkaXIsXG4gICAgICBhdXRob3IsXG4gICAgICBjb21taXR0ZXI6IF9jb21taXR0ZXIsXG4gICAgfSk7XG4gICAgaWYgKCFjb21taXR0ZXIpIHRocm93IG5ldyBNaXNzaW5nTmFtZUVycm9yKCdjb21taXR0ZXInKVxuXG4gICAgcmV0dXJuIGF3YWl0IF9wdWxsKHtcbiAgICAgIGZzLFxuICAgICAgY2FjaGUsXG4gICAgICBodHRwLFxuICAgICAgb25Qcm9ncmVzcyxcbiAgICAgIG9uTWVzc2FnZSxcbiAgICAgIG9uQXV0aCxcbiAgICAgIG9uQXV0aFN1Y2Nlc3MsXG4gICAgICBvbkF1dGhGYWlsdXJlLFxuICAgICAgZGlyLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVmLFxuICAgICAgdXJsLFxuICAgICAgcmVtb3RlLFxuICAgICAgcmVtb3RlUmVmLFxuICAgICAgZmFzdEZvcndhcmQsXG4gICAgICBmYXN0Rm9yd2FyZE9ubHksXG4gICAgICBjb3JzUHJveHksXG4gICAgICBzaW5nbGVCcmFuY2gsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYXV0aG9yLFxuICAgICAgY29tbWl0dGVyLFxuICAgICAgc2lnbmluZ0tleSxcbiAgICAgIHBydW5lLFxuICAgICAgcHJ1bmVUYWdzLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LnB1bGwnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7YW55fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPHN0cmluZz59IGFyZ3Muc3RhcnRcbiAqIEBwYXJhbSB7SXRlcmFibGU8c3RyaW5nPn0gYXJncy5maW5pc2hcbiAqIEByZXR1cm5zIHtQcm9taXNlPFNldDxzdHJpbmc+Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdENvbW1pdHNBbmRUYWdzKHtcbiAgZnMsXG4gIGNhY2hlLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICBzdGFydCxcbiAgZmluaXNoLFxufSkge1xuICBjb25zdCBzaGFsbG93cyA9IGF3YWl0IEdpdFNoYWxsb3dNYW5hZ2VyLnJlYWQoeyBmcywgZ2l0ZGlyIH0pO1xuICBjb25zdCBzdGFydGluZ1NldCA9IG5ldyBTZXQoKTtcbiAgY29uc3QgZmluaXNoaW5nU2V0ID0gbmV3IFNldCgpO1xuICBmb3IgKGNvbnN0IHJlZiBvZiBzdGFydCkge1xuICAgIHN0YXJ0aW5nU2V0LmFkZChhd2FpdCBHaXRSZWZNYW5hZ2VyLnJlc29sdmUoeyBmcywgZ2l0ZGlyLCByZWYgfSkpO1xuICB9XG4gIGZvciAoY29uc3QgcmVmIG9mIGZpbmlzaCkge1xuICAgIC8vIFdlIG1heSBub3QgaGF2ZSB0aGVzZSByZWZzIGxvY2FsbHkgc28gd2UgbXVzdCB0cnkvY2F0Y2hcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2lkID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHsgZnMsIGdpdGRpciwgcmVmIH0pO1xuICAgICAgZmluaXNoaW5nU2V0LmFkZChvaWQpO1xuICAgIH0gY2F0Y2ggKGVycikge31cbiAgfVxuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldCgpO1xuICAvLyBCZWNhdXNlIGdpdCBjb21taXRzIGFyZSBuYW1lZCBieSB0aGVpciBoYXNoLCB0aGVyZSBpcyBub1xuICAvLyB3YXkgdG8gY29uc3RydWN0IGEgY3ljbGUuIFRoZXJlZm9yZSB3ZSB3b24ndCB3b3JyeSBhYm91dFxuICAvLyBzZXR0aW5nIGEgZGVmYXVsdCByZWN1cnNpb24gbGltaXQuXG4gIGFzeW5jIGZ1bmN0aW9uIHdhbGsob2lkKSB7XG4gICAgdmlzaXRlZC5hZGQob2lkKTtcbiAgICBjb25zdCB7IHR5cGUsIG9iamVjdCB9ID0gYXdhaXQgX3JlYWRPYmplY3QoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pO1xuICAgIC8vIFJlY3Vyc2l2ZWx5IHJlc29sdmUgYW5ub3RhdGVkIHRhZ3NcbiAgICBpZiAodHlwZSA9PT0gJ3RhZycpIHtcbiAgICAgIGNvbnN0IHRhZyA9IEdpdEFubm90YXRlZFRhZy5mcm9tKG9iamVjdCk7XG4gICAgICBjb25zdCBjb21taXQgPSB0YWcuaGVhZGVycygpLm9iamVjdDtcbiAgICAgIHJldHVybiB3YWxrKGNvbW1pdClcbiAgICB9XG4gICAgaWYgKHR5cGUgIT09ICdjb21taXQnKSB7XG4gICAgICB0aHJvdyBuZXcgT2JqZWN0VHlwZUVycm9yKG9pZCwgdHlwZSwgJ2NvbW1pdCcpXG4gICAgfVxuICAgIGlmICghc2hhbGxvd3MuaGFzKG9pZCkpIHtcbiAgICAgIGNvbnN0IGNvbW1pdCA9IEdpdENvbW1pdC5mcm9tKG9iamVjdCk7XG4gICAgICBjb25zdCBwYXJlbnRzID0gY29tbWl0LmhlYWRlcnMoKS5wYXJlbnQ7XG4gICAgICBmb3IgKG9pZCBvZiBwYXJlbnRzKSB7XG4gICAgICAgIGlmICghZmluaXNoaW5nU2V0LmhhcyhvaWQpICYmICF2aXNpdGVkLmhhcyhvaWQpKSB7XG4gICAgICAgICAgYXdhaXQgd2FsayhvaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIExldCdzIGdvIHdhbGtpbmchXG4gIGZvciAoY29uc3Qgb2lkIG9mIHN0YXJ0aW5nU2V0KSB7XG4gICAgYXdhaXQgd2FsayhvaWQpO1xuICB9XG4gIHJldHVybiB2aXNpdGVkXG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7YW55fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPHN0cmluZz59IGFyZ3Mub2lkc1xuICogQHJldHVybnMge1Byb21pc2U8U2V0PHN0cmluZz4+fVxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0T2JqZWN0cyh7XG4gIGZzLFxuICBjYWNoZSxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgb2lkcyxcbn0pIHtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgLy8gV2UgZG9uJ3QgZG8gdGhlIHB1cmVzdCBzaW1wbGVzdCByZWN1cnNpb24sIGJlY2F1c2Ugd2UgY2FuXG4gIC8vIGF2b2lkIHJlYWRpbmcgQmxvYiBvYmplY3RzIGVudGlyZWx5IHNpbmNlIHRoZSBUcmVlIG9iamVjdHNcbiAgLy8gdGVsbCB1cyB3aGljaCBvaWRzIGFyZSBCbG9icyBhbmQgd2hpY2ggYXJlIFRyZWVzLlxuICBhc3luYyBmdW5jdGlvbiB3YWxrKG9pZCkge1xuICAgIGlmICh2aXNpdGVkLmhhcyhvaWQpKSByZXR1cm5cbiAgICB2aXNpdGVkLmFkZChvaWQpO1xuICAgIGNvbnN0IHsgdHlwZSwgb2JqZWN0IH0gPSBhd2FpdCBfcmVhZE9iamVjdCh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSk7XG4gICAgaWYgKHR5cGUgPT09ICd0YWcnKSB7XG4gICAgICBjb25zdCB0YWcgPSBHaXRBbm5vdGF0ZWRUYWcuZnJvbShvYmplY3QpO1xuICAgICAgY29uc3Qgb2JqID0gdGFnLmhlYWRlcnMoKS5vYmplY3Q7XG4gICAgICBhd2FpdCB3YWxrKG9iaik7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnY29tbWl0Jykge1xuICAgICAgY29uc3QgY29tbWl0ID0gR2l0Q29tbWl0LmZyb20ob2JqZWN0KTtcbiAgICAgIGNvbnN0IHRyZWUgPSBjb21taXQuaGVhZGVycygpLnRyZWU7XG4gICAgICBhd2FpdCB3YWxrKHRyZWUpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RyZWUnKSB7XG4gICAgICBjb25zdCB0cmVlID0gR2l0VHJlZS5mcm9tKG9iamVjdCk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRyZWUpIHtcbiAgICAgICAgLy8gYWRkIGJsb2JzIHRvIHRoZSBzZXRcbiAgICAgICAgLy8gc2tpcCBvdmVyIHN1Ym1vZHVsZXMgd2hvc2UgdHlwZSBpcyAnY29tbWl0J1xuICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgICAgICAgdmlzaXRlZC5hZGQoZW50cnkub2lkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWN1cnNlIGZvciB0cmVlc1xuICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gJ3RyZWUnKSB7XG4gICAgICAgICAgYXdhaXQgd2FsayhlbnRyeS5vaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIExldCdzIGdvIHdhbGtpbmchXG4gIGZvciAoY29uc3Qgb2lkIG9mIG9pZHMpIHtcbiAgICBhd2FpdCB3YWxrKG9pZCk7XG4gIH1cbiAgcmV0dXJuIHZpc2l0ZWRcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VSZWNlaXZlUGFja1Jlc3BvbnNlKHBhY2tmaWxlKSB7XG4gIC8qKiBAdHlwZSBQdXNoUmVzdWx0ICovXG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBsZXQgcmVzcG9uc2UgPSAnJztcbiAgY29uc3QgcmVhZCA9IEdpdFBrdExpbmUuc3RyZWFtUmVhZGVyKHBhY2tmaWxlKTtcbiAgbGV0IGxpbmUgPSBhd2FpdCByZWFkKCk7XG4gIHdoaWxlIChsaW5lICE9PSB0cnVlKSB7XG4gICAgaWYgKGxpbmUgIT09IG51bGwpIHJlc3BvbnNlICs9IGxpbmUudG9TdHJpbmcoJ3V0ZjgnKSArICdcXG4nO1xuICAgIGxpbmUgPSBhd2FpdCByZWFkKCk7XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IHJlc3BvbnNlLnRvU3RyaW5nKCd1dGY4Jykuc3BsaXQoJ1xcbicpO1xuICAvLyBXZSdyZSBleHBlY3RpbmcgXCJ1bnBhY2sge3VucGFjay1yZXN1bHR9XCJcbiAgbGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmICghbGluZS5zdGFydHNXaXRoKCd1bnBhY2sgJykpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2VFcnJvcigndW5wYWNrIG9rXCIgb3IgXCJ1bnBhY2sgW2Vycm9yIG1lc3NhZ2VdJywgbGluZSlcbiAgfVxuICByZXN1bHQub2sgPSBsaW5lID09PSAndW5wYWNrIG9rJztcbiAgaWYgKCFyZXN1bHQub2spIHtcbiAgICByZXN1bHQuZXJyb3IgPSBsaW5lLnNsaWNlKCd1bnBhY2sgJy5sZW5ndGgpO1xuICB9XG4gIHJlc3VsdC5yZWZzID0ge307XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChsaW5lLnRyaW0oKSA9PT0gJycpIGNvbnRpbnVlXG4gICAgY29uc3Qgc3RhdHVzID0gbGluZS5zbGljZSgwLCAyKTtcbiAgICBjb25zdCByZWZBbmRNZXNzYWdlID0gbGluZS5zbGljZSgzKTtcbiAgICBsZXQgc3BhY2UgPSByZWZBbmRNZXNzYWdlLmluZGV4T2YoJyAnKTtcbiAgICBpZiAoc3BhY2UgPT09IC0xKSBzcGFjZSA9IHJlZkFuZE1lc3NhZ2UubGVuZ3RoO1xuICAgIGNvbnN0IHJlZiA9IHJlZkFuZE1lc3NhZ2Uuc2xpY2UoMCwgc3BhY2UpO1xuICAgIGNvbnN0IGVycm9yID0gcmVmQW5kTWVzc2FnZS5zbGljZShzcGFjZSArIDEpO1xuICAgIHJlc3VsdC5yZWZzW3JlZl0gPSB7XG4gICAgICBvazogc3RhdHVzID09PSAnb2snLFxuICAgICAgZXJyb3IsXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUmVjZWl2ZVBhY2tSZXF1ZXN0KHtcbiAgY2FwYWJpbGl0aWVzID0gW10sXG4gIHRyaXBsZXRzID0gW10sXG59KSB7XG4gIGNvbnN0IHBhY2tzdHJlYW0gPSBbXTtcbiAgbGV0IGNhcHNGaXJzdExpbmUgPSBgXFx4MDAgJHtjYXBhYmlsaXRpZXMuam9pbignICcpfWA7XG4gIGZvciAoY29uc3QgdHJpcCBvZiB0cmlwbGV0cykge1xuICAgIHBhY2tzdHJlYW0ucHVzaChcbiAgICAgIEdpdFBrdExpbmUuZW5jb2RlKFxuICAgICAgICBgJHt0cmlwLm9sZG9pZH0gJHt0cmlwLm9pZH0gJHt0cmlwLmZ1bGxSZWZ9JHtjYXBzRmlyc3RMaW5lfVxcbmBcbiAgICAgIClcbiAgICApO1xuICAgIGNhcHNGaXJzdExpbmUgPSAnJztcbiAgfVxuICBwYWNrc3RyZWFtLnB1c2goR2l0UGt0TGluZS5mbHVzaCgpKTtcbiAgcmV0dXJuIHBhY2tzdHJlYW1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7YW55fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge0h0dHBDbGllbnR9IGFyZ3MuaHR0cFxuICogQHBhcmFtIHtQcm9ncmVzc0NhbGxiYWNrfSBbYXJncy5vblByb2dyZXNzXVxuICogQHBhcmFtIHtNZXNzYWdlQ2FsbGJhY2t9IFthcmdzLm9uTWVzc2FnZV1cbiAqIEBwYXJhbSB7QXV0aENhbGxiYWNrfSBbYXJncy5vbkF1dGhdXG4gKiBAcGFyYW0ge0F1dGhGYWlsdXJlQ2FsbGJhY2t9IFthcmdzLm9uQXV0aEZhaWx1cmVdXG4gKiBAcGFyYW0ge0F1dGhTdWNjZXNzQ2FsbGJhY2t9IFthcmdzLm9uQXV0aFN1Y2Nlc3NdXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZWZdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlUmVmXVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlbW90ZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZm9yY2UgPSBmYWxzZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVsZXRlID0gZmFsc2VdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudXJsXVxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNvcnNQcm94eV1cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuaGVhZGVyc11cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQdXNoUmVzdWx0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX3B1c2goe1xuICBmcyxcbiAgY2FjaGUsXG4gIGh0dHAsXG4gIG9uUHJvZ3Jlc3MsXG4gIG9uTWVzc2FnZSxcbiAgb25BdXRoLFxuICBvbkF1dGhTdWNjZXNzLFxuICBvbkF1dGhGYWlsdXJlLFxuICBnaXRkaXIsXG4gIHJlZjogX3JlZixcbiAgcmVtb3RlUmVmOiBfcmVtb3RlUmVmLFxuICByZW1vdGUsXG4gIHVybDogX3VybCxcbiAgZm9yY2UgPSBmYWxzZSxcbiAgZGVsZXRlOiBfZGVsZXRlID0gZmFsc2UsXG4gIGNvcnNQcm94eSxcbiAgaGVhZGVycyA9IHt9LFxufSkge1xuICBjb25zdCByZWYgPSBfcmVmIHx8IChhd2FpdCBfY3VycmVudEJyYW5jaCh7IGZzLCBnaXRkaXIgfSkpO1xuICBpZiAodHlwZW9mIHJlZiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aHJvdyBuZXcgTWlzc2luZ1BhcmFtZXRlckVycm9yKCdyZWYnKVxuICB9XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuZ2V0KHsgZnMsIGdpdGRpciB9KTtcbiAgLy8gRmlndXJlIG91dCB3aGF0IHJlbW90ZSB0byB1c2UuXG4gIHJlbW90ZSA9XG4gICAgcmVtb3RlIHx8XG4gICAgKGF3YWl0IGNvbmZpZy5nZXQoYGJyYW5jaC4ke3JlZn0ucHVzaFJlbW90ZWApKSB8fFxuICAgIChhd2FpdCBjb25maWcuZ2V0KCdyZW1vdGUucHVzaERlZmF1bHQnKSkgfHxcbiAgICAoYXdhaXQgY29uZmlnLmdldChgYnJhbmNoLiR7cmVmfS5yZW1vdGVgKSkgfHxcbiAgICAnb3JpZ2luJztcbiAgLy8gTG9va3VwIHRoZSBVUkwgZm9yIHRoZSBnaXZlbiByZW1vdGUuXG4gIGNvbnN0IHVybCA9XG4gICAgX3VybCB8fFxuICAgIChhd2FpdCBjb25maWcuZ2V0KGByZW1vdGUuJHtyZW1vdGV9LnB1c2h1cmxgKSkgfHxcbiAgICAoYXdhaXQgY29uZmlnLmdldChgcmVtb3RlLiR7cmVtb3RlfS51cmxgKSk7XG4gIGlmICh0eXBlb2YgdXJsID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBNaXNzaW5nUGFyYW1ldGVyRXJyb3IoJ3JlbW90ZSBPUiB1cmwnKVxuICB9XG4gIC8vIEZpZ3VyZSBvdXQgd2hhdCByZW1vdGUgcmVmIHRvIHVzZS5cbiAgY29uc3QgcmVtb3RlUmVmID0gX3JlbW90ZVJlZiB8fCAoYXdhaXQgY29uZmlnLmdldChgYnJhbmNoLiR7cmVmfS5tZXJnZWApKTtcbiAgaWYgKHR5cGVvZiB1cmwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IE1pc3NpbmdQYXJhbWV0ZXJFcnJvcigncmVtb3RlUmVmJylcbiAgfVxuXG4gIGlmIChjb3JzUHJveHkgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvcnNQcm94eSA9IGF3YWl0IGNvbmZpZy5nZXQoJ2h0dHAuY29yc1Byb3h5Jyk7XG4gIH1cblxuICBjb25zdCBmdWxsUmVmID0gYXdhaXQgR2l0UmVmTWFuYWdlci5leHBhbmQoeyBmcywgZ2l0ZGlyLCByZWYgfSk7XG4gIGNvbnN0IG9pZCA9IF9kZWxldGVcbiAgICA/ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgIDogYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHsgZnMsIGdpdGRpciwgcmVmOiBmdWxsUmVmIH0pO1xuXG4gIC8qKiBAdHlwZSB0eXBlb2YgaW1wb3J0KFwiLi4vbWFuYWdlcnMvR2l0UmVtb3RlSFRUUFwiKS5HaXRSZW1vdGVIVFRQICovXG4gIGNvbnN0IEdpdFJlbW90ZUhUVFAgPSBHaXRSZW1vdGVNYW5hZ2VyLmdldFJlbW90ZUhlbHBlckZvcih7IHVybCB9KTtcbiAgY29uc3QgaHR0cFJlbW90ZSA9IGF3YWl0IEdpdFJlbW90ZUhUVFAuZGlzY292ZXIoe1xuICAgIGh0dHAsXG4gICAgb25BdXRoLFxuICAgIG9uQXV0aFN1Y2Nlc3MsXG4gICAgb25BdXRoRmFpbHVyZSxcbiAgICBjb3JzUHJveHksXG4gICAgc2VydmljZTogJ2dpdC1yZWNlaXZlLXBhY2snLFxuICAgIHVybCxcbiAgICBoZWFkZXJzLFxuICAgIHByb3RvY29sVmVyc2lvbjogMSxcbiAgfSk7XG4gIGNvbnN0IGF1dGggPSBodHRwUmVtb3RlLmF1dGg7IC8vIGhhY2sgdG8gZ2V0IG5ldyBjcmVkZW50aWFscyBmcm9tIENyZWRlbnRpYWxNYW5hZ2VyIEFQSVxuICBsZXQgZnVsbFJlbW90ZVJlZjtcbiAgaWYgKCFyZW1vdGVSZWYpIHtcbiAgICBmdWxsUmVtb3RlUmVmID0gZnVsbFJlZjtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgZnVsbFJlbW90ZVJlZiA9IGF3YWl0IEdpdFJlZk1hbmFnZXIuZXhwYW5kQWdhaW5zdE1hcCh7XG4gICAgICAgIHJlZjogcmVtb3RlUmVmLFxuICAgICAgICBtYXA6IGh0dHBSZW1vdGUucmVmcyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgLy8gVGhlIHJlbW90ZSByZWZlcmVuY2UgZG9lc24ndCBleGlzdCB5ZXQuXG4gICAgICAgIC8vIElmIGl0IGlzIGZ1bGx5IHNwZWNpZmllZCwgdXNlIHRoYXQgdmFsdWUuIE90aGVyd2lzZSwgdHJlYXQgaXQgYXMgYSBicmFuY2guXG4gICAgICAgIGZ1bGxSZW1vdGVSZWYgPSByZW1vdGVSZWYuc3RhcnRzV2l0aCgncmVmcy8nKVxuICAgICAgICAgID8gcmVtb3RlUmVmXG4gICAgICAgICAgOiBgcmVmcy9oZWFkcy8ke3JlbW90ZVJlZn1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IG9sZG9pZCA9XG4gICAgaHR0cFJlbW90ZS5yZWZzLmdldChmdWxsUmVtb3RlUmVmKSB8fFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcblxuICAvLyBSZW1vdGVzIGNhbiBhbHdheXMgYWNjZXB0IHRoaW4tcGFja3MgVU5MRVNTIHRoZXkgc3BlY2lmeSB0aGUgJ25vLXRoaW4nIGNhcGFiaWxpdHlcbiAgY29uc3QgdGhpblBhY2sgPSAhaHR0cFJlbW90ZS5jYXBhYmlsaXRpZXMuaGFzKCduby10aGluJyk7XG5cbiAgbGV0IG9iamVjdHMgPSBuZXcgU2V0KCk7XG4gIGlmICghX2RlbGV0ZSkge1xuICAgIGNvbnN0IGZpbmlzaCA9IFsuLi5odHRwUmVtb3RlLnJlZnMudmFsdWVzKCldO1xuICAgIGxldCBza2lwT2JqZWN0cyA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIHJlbW90ZSBicmFuY2ggaXMgcHJlc2VudCwgbG9vayBmb3IgYSBjb21tb24gbWVyZ2UgYmFzZS5cbiAgICBpZiAob2xkb2lkICE9PSAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpIHtcbiAgICAgIC8vIHRyaWNrIHRvIHNwZWVkIHVwIGNvbW1vbiBmb3JjZSBwdXNoIHNjZW5hcmlvc1xuICAgICAgY29uc3QgbWVyZ2ViYXNlID0gYXdhaXQgX2ZpbmRNZXJnZUJhc2Uoe1xuICAgICAgICBmcyxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGdpdGRpcixcbiAgICAgICAgb2lkczogW29pZCwgb2xkb2lkXSxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBvaWQgb2YgbWVyZ2ViYXNlKSBmaW5pc2gucHVzaChvaWQpO1xuICAgICAgaWYgKHRoaW5QYWNrKSB7XG4gICAgICAgIHNraXBPYmplY3RzID0gYXdhaXQgbGlzdE9iamVjdHMoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkczogbWVyZ2ViYXNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHJlbW90ZSBkb2VzIG5vdCBoYXZlIHRoZSBjb21taXQsIGZpZ3VyZSBvdXQgdGhlIG9iamVjdHMgdG8gc2VuZFxuICAgIGlmICghZmluaXNoLmluY2x1ZGVzKG9pZCkpIHtcbiAgICAgIGNvbnN0IGNvbW1pdHMgPSBhd2FpdCBsaXN0Q29tbWl0c0FuZFRhZ3Moe1xuICAgICAgICBmcyxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGdpdGRpcixcbiAgICAgICAgc3RhcnQ6IFtvaWRdLFxuICAgICAgICBmaW5pc2gsXG4gICAgICB9KTtcbiAgICAgIG9iamVjdHMgPSBhd2FpdCBsaXN0T2JqZWN0cyh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWRzOiBjb21taXRzIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGluUGFjaykge1xuICAgICAgLy8gSWYgdGhlcmUncyBhIGRlZmF1bHQgYnJhbmNoIGZvciB0aGUgcmVtb3RlIGxldHMgc2tpcCB0aG9zZSBvYmplY3RzIHRvby5cbiAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYW4gb3B0aW9uYWwgb3B0aW1pemF0aW9uLCB3ZSBqdXN0IGNhdGNoIGFuZCBjb250aW51ZSBpZiB0aGVyZSBpc1xuICAgICAgLy8gYW4gZXJyb3IgKGJlY2F1c2Ugd2UgY2FuJ3QgZmluZCBhIGRlZmF1bHQgYnJhbmNoLCBvciBjYW4ndCBmaW5kIGEgY29tbWl0LCBldGMpXG4gICAgICB0cnkge1xuICAgICAgICAvLyBTYWRseSwgdGhlIGRpc2NvdmVyeSBwaGFzZSB3aXRoICdmb3JQdXNoJyBkb2Vzbid0IHJldHVybiBzeW1yZWZzLCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vIHJlbHkgb24gZXhpc3Rpbmcgb25lcy5cbiAgICAgICAgY29uc3QgcmVmID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHtcbiAgICAgICAgICBmcyxcbiAgICAgICAgICBnaXRkaXIsXG4gICAgICAgICAgcmVmOiBgcmVmcy9yZW1vdGVzLyR7cmVtb3RlfS9IRUFEYCxcbiAgICAgICAgICBkZXB0aDogMixcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHsgb2lkIH0gPSBhd2FpdCBHaXRSZWZNYW5hZ2VyLnJlc29sdmVBZ2FpbnN0TWFwKHtcbiAgICAgICAgICByZWY6IHJlZi5yZXBsYWNlKGByZWZzL3JlbW90ZXMvJHtyZW1vdGV9L2AsICcnKSxcbiAgICAgICAgICBmdWxscmVmOiByZWYsXG4gICAgICAgICAgbWFwOiBodHRwUmVtb3RlLnJlZnMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvaWRzID0gW29pZF07XG4gICAgICAgIGZvciAoY29uc3Qgb2lkIG9mIGF3YWl0IGxpc3RPYmplY3RzKHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZHMgfSkpIHtcbiAgICAgICAgICBza2lwT2JqZWN0cy5hZGQob2lkKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgLy8gUmVtb3ZlIG9iamVjdHMgdGhhdCB3ZSBrbm93IHRoZSByZW1vdGUgYWxyZWFkeSBoYXNcbiAgICAgIGZvciAoY29uc3Qgb2lkIG9mIHNraXBPYmplY3RzKSB7XG4gICAgICAgIG9iamVjdHMuZGVsZXRlKG9pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9pZCA9PT0gb2xkb2lkKSBmb3JjZSA9IHRydWU7XG4gICAgaWYgKCFmb3JjZSkge1xuICAgICAgLy8gSXMgaXQgYSB0YWcgdGhhdCBhbHJlYWR5IGV4aXN0cz9cbiAgICAgIGlmIChcbiAgICAgICAgZnVsbFJlZi5zdGFydHNXaXRoKCdyZWZzL3RhZ3MnKSAmJlxuICAgICAgICBvbGRvaWQgIT09ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBQdXNoUmVqZWN0ZWRFcnJvcigndGFnLWV4aXN0cycpXG4gICAgICB9XG4gICAgICAvLyBJcyBpdCBhIG5vbi1mYXN0LWZvcndhcmQgY29tbWl0P1xuICAgICAgaWYgKFxuICAgICAgICBvaWQgIT09ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAmJlxuICAgICAgICBvbGRvaWQgIT09ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAmJlxuICAgICAgICAhKGF3YWl0IF9pc0Rlc2NlbmRlbnQoe1xuICAgICAgICAgIGZzLFxuICAgICAgICAgIGNhY2hlLFxuICAgICAgICAgIGdpdGRpcixcbiAgICAgICAgICBvaWQsXG4gICAgICAgICAgYW5jZXN0b3I6IG9sZG9pZCxcbiAgICAgICAgICBkZXB0aDogLTEsXG4gICAgICAgIH0pKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBQdXNoUmVqZWN0ZWRFcnJvcignbm90LWZhc3QtZm9yd2FyZCcpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIFdlIGNhbiBvbmx5IHNhZmVseSB1c2UgY2FwYWJpbGl0aWVzIHRoYXQgdGhlIHNlcnZlciBhbHNvIHVuZGVyc3RhbmRzLlxuICAvLyBGb3IgaW5zdGFuY2UsIEFXUyBDb2RlQ29tbWl0IGFib3J0cyBhIHB1c2ggaWYgeW91IGluY2x1ZGUgdGhlIGBhZ2VudGAhISFcbiAgY29uc3QgY2FwYWJpbGl0aWVzID0gZmlsdGVyQ2FwYWJpbGl0aWVzKFxuICAgIFsuLi5odHRwUmVtb3RlLmNhcGFiaWxpdGllc10sXG4gICAgWydyZXBvcnQtc3RhdHVzJywgJ3NpZGUtYmFuZC02NGsnLCBgYWdlbnQ9JHtwa2cuYWdlbnR9YF1cbiAgKTtcbiAgY29uc3QgcGFja3N0cmVhbTEgPSBhd2FpdCB3cml0ZVJlY2VpdmVQYWNrUmVxdWVzdCh7XG4gICAgY2FwYWJpbGl0aWVzLFxuICAgIHRyaXBsZXRzOiBbeyBvbGRvaWQsIG9pZCwgZnVsbFJlZjogZnVsbFJlbW90ZVJlZiB9XSxcbiAgfSk7XG4gIGNvbnN0IHBhY2tzdHJlYW0yID0gX2RlbGV0ZVxuICAgID8gW11cbiAgICA6IGF3YWl0IF9wYWNrKHtcbiAgICAgICAgZnMsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBnaXRkaXIsXG4gICAgICAgIG9pZHM6IFsuLi5vYmplY3RzXSxcbiAgICAgIH0pO1xuICBjb25zdCByZXMgPSBhd2FpdCBHaXRSZW1vdGVIVFRQLmNvbm5lY3Qoe1xuICAgIGh0dHAsXG4gICAgb25Qcm9ncmVzcyxcbiAgICBjb3JzUHJveHksXG4gICAgc2VydmljZTogJ2dpdC1yZWNlaXZlLXBhY2snLFxuICAgIHVybCxcbiAgICBhdXRoLFxuICAgIGhlYWRlcnMsXG4gICAgYm9keTogWy4uLnBhY2tzdHJlYW0xLCAuLi5wYWNrc3RyZWFtMl0sXG4gIH0pO1xuICBjb25zdCB7IHBhY2tmaWxlLCBwcm9ncmVzcyB9ID0gYXdhaXQgR2l0U2lkZUJhbmQuZGVtdXgocmVzLmJvZHkpO1xuICBpZiAob25NZXNzYWdlKSB7XG4gICAgY29uc3QgbGluZXMgPSBzcGxpdExpbmVzKHByb2dyZXNzKTtcbiAgICBmb3JBd2FpdChsaW5lcywgYXN5bmMgbGluZSA9PiB7XG4gICAgICBhd2FpdCBvbk1lc3NhZ2UobGluZSk7XG4gICAgfSk7XG4gIH1cbiAgLy8gUGFyc2UgdGhlIHJlc3BvbnNlIVxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJzZVJlY2VpdmVQYWNrUmVzcG9uc2UocGFja2ZpbGUpO1xuICBpZiAocmVzLmhlYWRlcnMpIHtcbiAgICByZXN1bHQuaGVhZGVycyA9IHJlcy5oZWFkZXJzO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSByZW1vdGUgcmVmXG4gIGlmIChyZW1vdGUgJiYgcmVzdWx0Lm9rICYmIHJlc3VsdC5yZWZzW2Z1bGxSZW1vdGVSZWZdLm9rKSB7XG4gICAgLy8gVE9ETzogSSB0aGluayB0aGlzIHNob3VsZCBhY3R1YWxseSBiZSB1c2luZyBhIHJlZnNwZWMgdHJhbnNmb3JtIHJhdGhlciB0aGFuIGFzc3VtaW5nICdyZWZzL3JlbW90ZXMve3JlbW90ZX0nXG4gICAgY29uc3QgcmVmID0gYHJlZnMvcmVtb3Rlcy8ke3JlbW90ZX0vJHtmdWxsUmVtb3RlUmVmLnJlcGxhY2UoXG4gICAgICAncmVmcy9oZWFkcycsXG4gICAgICAnJ1xuICAgICl9YDtcbiAgICBpZiAoX2RlbGV0ZSkge1xuICAgICAgYXdhaXQgR2l0UmVmTWFuYWdlci5kZWxldGVSZWYoeyBmcywgZ2l0ZGlyLCByZWYgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IEdpdFJlZk1hbmFnZXIud3JpdGVSZWYoeyBmcywgZ2l0ZGlyLCByZWYsIHZhbHVlOiBvaWQgfSk7XG4gICAgfVxuICB9XG4gIGlmIChyZXN1bHQub2sgJiYgT2JqZWN0LnZhbHVlcyhyZXN1bHQucmVmcykuZXZlcnkocmVzdWx0ID0+IHJlc3VsdC5vaykpIHtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJldHR5RGV0YWlscyA9IE9iamVjdC5lbnRyaWVzKHJlc3VsdC5yZWZzKVxuICAgICAgLmZpbHRlcigoW2ssIHZdKSA9PiAhdi5vaylcbiAgICAgIC5tYXAoKFtrLCB2XSkgPT4gYFxcbiAgLSAke2t9OiAke3YuZXJyb3J9YClcbiAgICAgIC5qb2luKCcnKTtcbiAgICB0aHJvdyBuZXcgR2l0UHVzaEVycm9yKHByZXR0eURldGFpbHMsIHJlc3VsdClcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBQdXNoIGEgYnJhbmNoIG9yIHRhZ1xuICpcbiAqIFRoZSBwdXNoIGNvbW1hbmQgcmV0dXJucyBhbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhlIHJlc3VsdCBvZiB0aGUgYXR0ZW1wdGVkIHB1c2ggb3BlcmF0aW9uLlxuICogKk5vdGVzOiogSWYgdGhlcmUgd2VyZSBubyBlcnJvcnMsIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBgZXJyb3JzYCBwcm9wZXJ0eS4gVGhlcmUgY2FuIGJlIGEgbWl4IG9mIGBva2AgbWVzc2FnZXMgYW5kIGBlcnJvcnNgIG1lc3NhZ2VzLlxuICpcbiAqIHwgcGFyYW0gIHwgdHlwZSBbPSBkZWZhdWx0XSB8IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAtLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gKiB8IG9rICAgICB8IEFycmF5XFw8c3RyaW5nXFw+ICB8IFRoZSBmaXJzdCBpdGVtIGlzIFwidW5wYWNrXCIgaWYgdGhlIG92ZXJhbGwgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLiBUaGUgcmVtYWluaW5nIGl0ZW1zIGFyZSB0aGUgbmFtZXMgb2YgcmVmcyB0aGF0IHdlcmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGVycm9ycyB8IEFycmF5XFw8c3RyaW5nXFw+ICB8IElmIHRoZSBvdmVyYWxsIG9wZXJhdGlvbiB0aHJldyBhbmQgZXJyb3IsIHRoZSBmaXJzdCBpdGVtIHdpbGwgYmUgXCJ1bnBhY2sge092ZXJhbGwgZXJyb3IgbWVzc2FnZX1cIi4gVGhlIHJlbWFpbmluZyBpdGVtcyBhcmUgaW5kaXZpZHVhbCByZWZzIHRoYXQgZmFpbGVkIHRvIGJlIHVwZGF0ZWQgaW4gdGhlIGZvcm1hdCBcIntyZWYgbmFtZX0ge2Vycm9yIG1lc3NhZ2V9XCIuIHxcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge0h0dHBDbGllbnR9IGFyZ3MuaHR0cCAtIGFuIEhUVFAgY2xpZW50XG4gKiBAcGFyYW0ge1Byb2dyZXNzQ2FsbGJhY2t9IFthcmdzLm9uUHJvZ3Jlc3NdIC0gb3B0aW9uYWwgcHJvZ3Jlc3MgZXZlbnQgY2FsbGJhY2tcbiAqIEBwYXJhbSB7TWVzc2FnZUNhbGxiYWNrfSBbYXJncy5vbk1lc3NhZ2VdIC0gb3B0aW9uYWwgbWVzc2FnZSBldmVudCBjYWxsYmFja1xuICogQHBhcmFtIHtBdXRoQ2FsbGJhY2t9IFthcmdzLm9uQXV0aF0gLSBvcHRpb25hbCBhdXRoIGZpbGwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7QXV0aEZhaWx1cmVDYWxsYmFja30gW2FyZ3Mub25BdXRoRmFpbHVyZV0gLSBvcHRpb25hbCBhdXRoIHJlamVjdGVkIGNhbGxiYWNrXG4gKiBAcGFyYW0ge0F1dGhTdWNjZXNzQ2FsbGJhY2t9IFthcmdzLm9uQXV0aFN1Y2Nlc3NdIC0gb3B0aW9uYWwgYXV0aCBhcHByb3ZlZCBjYWxsYmFja1xuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlZl0gLSBXaGljaCBicmFuY2ggdG8gcHVzaC4gQnkgZGVmYXVsdCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgY2hlY2tlZCBvdXQgYnJhbmNoLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnVybF0gLSBUaGUgVVJMIG9mIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4gVGhlIGRlZmF1bHQgaXMgdGhlIHZhbHVlIHNldCBpbiB0aGUgZ2l0IGNvbmZpZyBmb3IgdGhhdCByZW1vdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlXSAtIElmIFVSTCBpcyBub3Qgc3BlY2lmaWVkLCBkZXRlcm1pbmVzIHdoaWNoIHJlbW90ZSB0byB1c2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlUmVmXSAtIFRoZSBuYW1lIG9mIHRoZSByZWNlaXZpbmcgYnJhbmNoIG9uIHRoZSByZW1vdGUuIEJ5IGRlZmF1bHQgdGhpcyBpcyB0aGUgY29uZmlndXJlZCByZW1vdGUgdHJhY2tpbmcgYnJhbmNoLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JjZSA9IGZhbHNlXSAtIElmIHRydWUsIGJlaGF2ZXMgdGhlIHNhbWUgYXMgYGdpdCBwdXNoIC0tZm9yY2VgXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmRlbGV0ZSA9IGZhbHNlXSAtIElmIHRydWUsIGRlbGV0ZSB0aGUgcmVtb3RlIHJlZlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNvcnNQcm94eV0gLSBPcHRpb25hbCBbQ09SUyBwcm94eV0oaHR0cHM6Ly93d3cubnBtanMuY29tLyU0MGlzb21vcnBoaWMtZ2l0L2NvcnMtcHJveHkpLiBPdmVycmlkZXMgdmFsdWUgaW4gcmVwbyBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIHN0cmluZz59IFthcmdzLmhlYWRlcnNdIC0gQWRkaXRpb25hbCBoZWFkZXJzIHRvIGluY2x1ZGUgaW4gSFRUUCByZXF1ZXN0cywgc2ltaWxhciB0byBnaXQncyBgZXh0cmFIZWFkZXJgIGNvbmZpZ1xuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8UHVzaFJlc3VsdD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aGVuIHB1c2ggY29tcGxldGVzIHdpdGggYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmF0aW9uIGZyb20gdGhlIHNlcnZlci5cbiAqIEBzZWUgUHVzaFJlc3VsdFxuICogQHNlZSBSZWZVcGRhdGVTdGF0dXNcbiAqXG4gKiBAZXhhbXBsZVxuICogbGV0IHB1c2hSZXN1bHQgPSBhd2FpdCBnaXQucHVzaCh7XG4gKiAgIGZzLFxuICogICBodHRwLFxuICogICBkaXI6ICcvdHV0b3JpYWwnLFxuICogICByZW1vdGU6ICdvcmlnaW4nLFxuICogICByZWY6ICdtYWluJyxcbiAqICAgb25BdXRoOiAoKSA9PiAoeyB1c2VybmFtZTogcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIH0pLFxuICogfSlcbiAqIGNvbnNvbGUubG9nKHB1c2hSZXN1bHQpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBwdXNoKHtcbiAgZnMsXG4gIGh0dHAsXG4gIG9uUHJvZ3Jlc3MsXG4gIG9uTWVzc2FnZSxcbiAgb25BdXRoLFxuICBvbkF1dGhTdWNjZXNzLFxuICBvbkF1dGhGYWlsdXJlLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICByZWYsXG4gIHJlbW90ZVJlZixcbiAgcmVtb3RlID0gJ29yaWdpbicsXG4gIHVybCxcbiAgZm9yY2UgPSBmYWxzZSxcbiAgZGVsZXRlOiBfZGVsZXRlID0gZmFsc2UsXG4gIGNvcnNQcm94eSxcbiAgaGVhZGVycyA9IHt9LFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdodHRwJywgaHR0cCk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IF9wdXNoKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBjYWNoZSxcbiAgICAgIGh0dHAsXG4gICAgICBvblByb2dyZXNzLFxuICAgICAgb25NZXNzYWdlLFxuICAgICAgb25BdXRoLFxuICAgICAgb25BdXRoU3VjY2VzcyxcbiAgICAgIG9uQXV0aEZhaWx1cmUsXG4gICAgICBnaXRkaXIsXG4gICAgICByZWYsXG4gICAgICByZW1vdGVSZWYsXG4gICAgICByZW1vdGUsXG4gICAgICB1cmwsXG4gICAgICBmb3JjZSxcbiAgICAgIGRlbGV0ZTogX2RlbGV0ZSxcbiAgICAgIGNvcnNQcm94eSxcbiAgICAgIGhlYWRlcnMsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQucHVzaCc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJsb2IoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pIHtcbiAgY29uc3QgeyB0eXBlLCBvYmplY3QgfSA9IGF3YWl0IF9yZWFkT2JqZWN0KHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCB9KTtcbiAgLy8gUmVzb2x2ZSBhbm5vdGF0ZWQgdGFnIG9iamVjdHMgdG8gd2hhdGV2ZXJcbiAgaWYgKHR5cGUgPT09ICd0YWcnKSB7XG4gICAgb2lkID0gR2l0QW5ub3RhdGVkVGFnLmZyb20ob2JqZWN0KS5wYXJzZSgpLm9iamVjdDtcbiAgICByZXR1cm4gcmVzb2x2ZUJsb2IoeyBmcywgY2FjaGUsIGdpdGRpciwgb2lkIH0pXG4gIH1cbiAgaWYgKHR5cGUgIT09ICdibG9iJykge1xuICAgIHRocm93IG5ldyBPYmplY3RUeXBlRXJyb3Iob2lkLCB0eXBlLCAnYmxvYicpXG4gIH1cbiAgcmV0dXJuIHsgb2lkLCBibG9iOiBuZXcgVWludDhBcnJheShvYmplY3QpIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlYWRCbG9iUmVzdWx0IC0gVGhlIG9iamVjdCByZXR1cm5lZCBoYXMgdGhlIGZvbGxvd2luZyBzY2hlbWE6XG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2lkXG4gKiBAcHJvcGVydHkge1VpbnQ4QXJyYXl9IGJsb2JcbiAqXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHthbnl9IGFyZ3MuY2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdpdGRpclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub2lkXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZmlsZXBhdGhdXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8UmVhZEJsb2JSZXN1bHQ+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCBhIGJsb2Igb2JqZWN0IGRlc2NyaXB0aW9uXG4gKiBAc2VlIFJlYWRCbG9iUmVzdWx0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9yZWFkQmxvYih7XG4gIGZzLFxuICBjYWNoZSxcbiAgZ2l0ZGlyLFxuICBvaWQsXG4gIGZpbGVwYXRoID0gdW5kZWZpbmVkLFxufSkge1xuICBpZiAoZmlsZXBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgIG9pZCA9IGF3YWl0IHJlc29sdmVGaWxlcGF0aCh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQsIGZpbGVwYXRoIH0pO1xuICB9XG4gIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNvbHZlQmxvYih7XG4gICAgZnMsXG4gICAgY2FjaGUsXG4gICAgZ2l0ZGlyLFxuICAgIG9pZCxcbiAgfSk7XG4gIHJldHVybiBibG9iXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZWFkQmxvYlJlc3VsdCAtIFRoZSBvYmplY3QgcmV0dXJuZWQgaGFzIHRoZSBmb2xsb3dpbmcgc2NoZW1hOlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9pZFxuICogQHByb3BlcnR5IHtVaW50OEFycmF5fSBibG9iXG4gKlxuICovXG5cbi8qKlxuICogUmVhZCBhIGJsb2Igb2JqZWN0IGRpcmVjdGx5XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub2lkIC0gVGhlIFNIQS0xIG9iamVjdCBpZCB0byBnZXQuIEFubm90YXRlZCB0YWdzLCBjb21taXRzLCBhbmQgdHJlZXMgYXJlIHBlZWxlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5maWxlcGF0aF0gLSBEb24ndCByZXR1cm4gdGhlIG9iamVjdCB3aXRoIGBvaWRgIGl0c2VsZiwgYnV0IHJlc29sdmUgYG9pZGAgdG8gYSB0cmVlIGFuZCB0aGVuIHJldHVybiB0aGUgYmxvYiBvYmplY3QgYXQgdGhhdCBmaWxlcGF0aC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlYWRCbG9iUmVzdWx0Pn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdpdGggYSBibG9iIG9iamVjdCBkZXNjcmlwdGlvblxuICogQHNlZSBSZWFkQmxvYlJlc3VsdFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIGNvbnRlbnRzIG9mICdSRUFETUUubWQnIGluIHRoZSBtYWluIGJyYW5jaC5cbiAqIGxldCBjb21taXRPaWQgPSBhd2FpdCBnaXQucmVzb2x2ZVJlZih7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCByZWY6ICdtYWluJyB9KVxuICogY29uc29sZS5sb2coY29tbWl0T2lkKVxuICogbGV0IHsgYmxvYiB9ID0gYXdhaXQgZ2l0LnJlYWRCbG9iKHtcbiAqICAgZnMsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIG9pZDogY29tbWl0T2lkLFxuICogICBmaWxlcGF0aDogJ1JFQURNRS5tZCdcbiAqIH0pXG4gKiBjb25zb2xlLmxvZyhCdWZmZXIuZnJvbShibG9iKS50b1N0cmluZygndXRmOCcpKVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZEJsb2Ioe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgb2lkLFxuICBmaWxlcGF0aCxcbiAgY2FjaGUgPSB7fSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ29pZCcsIG9pZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgX3JlYWRCbG9iKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBjYWNoZSxcbiAgICAgIGdpdGRpcixcbiAgICAgIG9pZCxcbiAgICAgIGZpbGVwYXRoLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LnJlYWRCbG9iJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBSZWFkIGEgY29tbWl0IG9iamVjdCBkaXJlY3RseVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm9pZCAtIFRoZSBTSEEtMSBvYmplY3QgaWQgdG8gZ2V0LiBBbm5vdGF0ZWQgdGFncyBhcmUgcGVlbGVkLlxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8UmVhZENvbW1pdFJlc3VsdD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIGEgZ2l0IGNvbW1pdCBvYmplY3RcbiAqIEBzZWUgUmVhZENvbW1pdFJlc3VsdFxuICogQHNlZSBDb21taXRPYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVhZCBhIGNvbW1pdCBvYmplY3RcbiAqIGxldCBzaGEgPSBhd2FpdCBnaXQucmVzb2x2ZVJlZih7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCByZWY6ICdtYWluJyB9KVxuICogY29uc29sZS5sb2coc2hhKVxuICogbGV0IGNvbW1pdCA9IGF3YWl0IGdpdC5yZWFkQ29tbWl0KHsgZnMsIGRpcjogJy90dXRvcmlhbCcsIG9pZDogc2hhIH0pXG4gKiBjb25zb2xlLmxvZyhjb21taXQpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkQ29tbWl0KHtcbiAgZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIG9pZCxcbiAgY2FjaGUgPSB7fSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ29pZCcsIG9pZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgX3JlYWRDb21taXQoe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGNhY2hlLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgb2lkLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LnJlYWRDb21taXQnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgbm90ZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge2FueX0gYXJncy5jYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVmXSAtIFRoZSBub3RlcyByZWYgdG8gbG9vayB1bmRlclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub2lkXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8VWludDhBcnJheT59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIG5vdGUgY29udGVudHMgYXMgYSBCdWZmZXIuXG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gX3JlYWROb3RlKHtcbiAgZnMsXG4gIGNhY2hlLFxuICBnaXRkaXIsXG4gIHJlZiA9ICdyZWZzL25vdGVzL2NvbW1pdHMnLFxuICBvaWQsXG59KSB7XG4gIGNvbnN0IHBhcmVudCA9IGF3YWl0IEdpdFJlZk1hbmFnZXIucmVzb2x2ZSh7IGdpdGRpciwgZnMsIHJlZiB9KTtcbiAgY29uc3QgeyBibG9iIH0gPSBhd2FpdCBfcmVhZEJsb2Ioe1xuICAgIGZzLFxuICAgIGNhY2hlLFxuICAgIGdpdGRpcixcbiAgICBvaWQ6IHBhcmVudCxcbiAgICBmaWxlcGF0aDogb2lkLFxuICB9KTtcblxuICByZXR1cm4gYmxvYlxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIG5vdGVcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVmXSAtIFRoZSBub3RlcyByZWYgdG8gbG9vayB1bmRlclxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub2lkIC0gVGhlIFNIQS0xIG9iamVjdCBpZCBvZiB0aGUgb2JqZWN0IHRvIGdldCB0aGUgbm90ZSBmb3IuXG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3MuY2FjaGVdIC0gYSBbY2FjaGVdKGNhY2hlLm1kKSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdpdGggbm90ZSBjb250ZW50cyBhcyBhIEJ1ZmZlci5cbiAqL1xuXG5hc3luYyBmdW5jdGlvbiByZWFkTm90ZSh7XG4gIGZzLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICByZWYgPSAncmVmcy9ub3Rlcy9jb21taXRzJyxcbiAgb2lkLFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcigncmVmJywgcmVmKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ29pZCcsIG9pZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgX3JlYWROb3RlKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBjYWNoZSxcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlZixcbiAgICAgIG9pZCxcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5yZWFkTm90ZSc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlZmxhdGVkT2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2lkXG4gKiBAcHJvcGVydHkgeydkZWZsYXRlZCd9IHR5cGVcbiAqIEBwcm9wZXJ0eSB7J2RlZmxhdGVkJ30gZm9ybWF0XG4gKiBAcHJvcGVydHkge1VpbnQ4QXJyYXl9IG9iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzb3VyY2VdXG4gKlxuICovXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdyYXBwZWRPYmplY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvaWRcbiAqIEBwcm9wZXJ0eSB7J3dyYXBwZWQnfSB0eXBlXG4gKiBAcHJvcGVydHkgeyd3cmFwcGVkJ30gZm9ybWF0XG4gKiBAcHJvcGVydHkge1VpbnQ4QXJyYXl9IG9iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzb3VyY2VdXG4gKlxuICovXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJhd09iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9pZFxuICogQHByb3BlcnR5IHsnYmxvYid8J2NvbW1pdCd8J3RyZWUnfCd0YWcnfSB0eXBlXG4gKiBAcHJvcGVydHkgeydjb250ZW50J30gZm9ybWF0XG4gKiBAcHJvcGVydHkge1VpbnQ4QXJyYXl9IG9iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzb3VyY2VdXG4gKlxuICovXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBhcnNlZEJsb2JPYmplY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvaWRcbiAqIEBwcm9wZXJ0eSB7J2Jsb2InfSB0eXBlXG4gKiBAcHJvcGVydHkgeydwYXJzZWQnfSBmb3JtYXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc291cmNlXVxuICpcbiAqL1xuXG4vKipcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYXJzZWRDb21taXRPYmplY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvaWRcbiAqIEBwcm9wZXJ0eSB7J2NvbW1pdCd9IHR5cGVcbiAqIEBwcm9wZXJ0eSB7J3BhcnNlZCd9IGZvcm1hdFxuICogQHByb3BlcnR5IHtDb21taXRPYmplY3R9IG9iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzb3VyY2VdXG4gKlxuICovXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBhcnNlZFRyZWVPYmplY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvaWRcbiAqIEBwcm9wZXJ0eSB7J3RyZWUnfSB0eXBlXG4gKiBAcHJvcGVydHkgeydwYXJzZWQnfSBmb3JtYXRcbiAqIEBwcm9wZXJ0eSB7VHJlZU9iamVjdH0gb2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NvdXJjZV1cbiAqXG4gKi9cblxuLyoqXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gUGFyc2VkVGFnT2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2lkXG4gKiBAcHJvcGVydHkgeyd0YWcnfSB0eXBlXG4gKiBAcHJvcGVydHkgeydwYXJzZWQnfSBmb3JtYXRcbiAqIEBwcm9wZXJ0eSB7VGFnT2JqZWN0fSBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc291cmNlXVxuICpcbiAqL1xuXG4vKipcbiAqXG4gKiBAdHlwZWRlZiB7UGFyc2VkQmxvYk9iamVjdCB8IFBhcnNlZENvbW1pdE9iamVjdCB8IFBhcnNlZFRyZWVPYmplY3QgfCBQYXJzZWRUYWdPYmplY3R9IFBhcnNlZE9iamVjdFxuICovXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtEZWZsYXRlZE9iamVjdCB8IFdyYXBwZWRPYmplY3QgfCBSYXdPYmplY3QgfCBQYXJzZWRPYmplY3QgfSBSZWFkT2JqZWN0UmVzdWx0XG4gKi9cblxuLyoqXG4gKiBSZWFkIGEgZ2l0IG9iamVjdCBkaXJlY3RseSBieSBpdHMgU0hBLTEgb2JqZWN0IGlkXG4gKlxuICogUmVnYXJkaW5nIGBSZWFkT2JqZWN0UmVzdWx0YDpcbiAqXG4gKiAtIGBvaWRgIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGBvaWRgIGFyZ3VtZW50IHVubGVzcyB0aGUgYGZpbGVwYXRoYCBhcmd1bWVudCBpcyBwcm92aWRlZCwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIHRoZSBvaWQgb2YgdGhlIHRyZWUgb3IgYmxvYiBiZWluZyByZXR1cm5lZC5cbiAqIC0gYHR5cGVgIG9mIGRlZmxhdGVkIG9iamVjdHMgaXMgYCdkZWZsYXRlZCdgLCBhbmQgYHR5cGVgIG9mIHdyYXBwZWQgb2JqZWN0cyBpcyBgJ3dyYXBwZWQnYFxuICogLSBgZm9ybWF0YCBpcyB1c3VhbGx5LCBidXQgbm90IGFsd2F5cywgdGhlIGZvcm1hdCB5b3UgcmVxdWVzdGVkLiBQYWNrZmlsZXMgZG8gbm90IHN0b3JlIGVhY2ggb2JqZWN0IGluZGl2aWR1YWxseSBjb21wcmVzc2VkIHNvIGlmIHlvdSBlbmQgdXAgcmVhZGluZyB0aGUgb2JqZWN0IGZyb20gYSBwYWNrZmlsZSBpdCB3aWxsIGJlIHJldHVybmVkIGluIGZvcm1hdCAnY29udGVudCcgZXZlbiBpZiB5b3UgcmVxdWVzdGVkICdkZWZsYXRlZCcgb3IgJ3dyYXBwZWQnLlxuICogLSBgb2JqZWN0YCB3aWxsIGJlIGFuIGFjdHVhbCBPYmplY3QgaWYgZm9ybWF0IGlzICdwYXJzZWQnIGFuZCB0aGUgb2JqZWN0IGlzIGEgY29tbWl0LCB0cmVlLCBvciBhbm5vdGF0ZWQgdGFnLiBCbG9icyBhcmUgc3RpbGwgZm9ybWF0dGVkIGFzIEJ1ZmZlcnMgdW5sZXNzIGFuIGVuY29kaW5nIGlzIHByb3ZpZGVkIGluIHdoaWNoIGNhc2UgdGhleSdsbCBiZSBzdHJpbmdzLiBJZiBmb3JtYXQgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiAncGFyc2VkJywgb2JqZWN0IHdpbGwgYmUgYSBCdWZmZXIuXG4gKiAtIGBzb3VyY2VgIGlzIHRoZSBuYW1lIG9mIHRoZSBwYWNrZmlsZSBvciBsb29zZSBvYmplY3QgZmlsZSB3aGVyZSB0aGUgb2JqZWN0IHdhcyBmb3VuZC5cbiAqXG4gKiBUaGUgYGZvcm1hdGAgcGFyYW1ldGVyIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuICpcbiAqIHwgcGFyYW0gICAgICB8IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IC0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICogfCAnZGVmbGF0ZWQnIHwgUmV0dXJuIHRoZSByYXcgZGVmbGF0ZS1jb21wcmVzc2VkIGJ1ZmZlciBmb3IgYW4gb2JqZWN0IGlmIHBvc3NpYmxlLiBVc2VmdWwgZm9yIGVmZmljaWVudGx5IHNodWZmbGluZyBhcm91bmQgbG9vc2Ugb2JqZWN0cyB3aGVuIHlvdSBkb24ndCBjYXJlIGFib3V0IHRoZSBjb250ZW50cyBhbmQgY2FuIHNhdmUgdGltZSBieSBub3QgaW5mbGF0aW5nIHRoZW0uIHxcbiAqIHwgJ3dyYXBwZWQnICB8IFJldHVybiB0aGUgaW5mbGF0ZWQgb2JqZWN0IGJ1ZmZlciB3cmFwcGVkIGluIHRoZSBnaXQgb2JqZWN0IGhlYWRlciBpZiBwb3NzaWJsZS4gVGhpcyBpcyB0aGUgcmF3IGRhdGEgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBTSEEtMSBvYmplY3QgaWQgb2YgYSBnaXQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICdjb250ZW50JyAgfCBSZXR1cm4gdGhlIG9iamVjdCBidWZmZXIgd2l0aG91dCB0aGUgZ2l0IGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAncGFyc2VkJyAgIHwgUmV0dXJucyBhIHBhcnNlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgc2NoZW1hczpcbiAqXG4gKiAjIyBgJ2RlZmxhdGVkJ2AgZm9ybWF0XG4gKlxuICoge0BsaW5rIERlZmxhdGVkT2JqZWN0IHR5cGVkZWZ9XG4gKlxuICogIyMgYCd3cmFwcGVkJ2AgZm9ybWF0XG4gKlxuICoge0BsaW5rIFdyYXBwZWRPYmplY3QgdHlwZWRlZn1cbiAqXG4gKiAjIyBgJ2NvbnRlbnQnYCBmb3JtYXRcbiAqXG4gKiB7QGxpbmsgUmF3T2JqZWN0IHR5cGVkZWZ9XG4gKlxuICogIyMgYCdwYXJzZWQnYCBmb3JtYXRcbiAqXG4gKiAjIyMgcGFyc2VkIGAnYmxvYidgIHR5cGVcbiAqXG4gKiB7QGxpbmsgUGFyc2VkQmxvYk9iamVjdCB0eXBlZGVmfVxuICpcbiAqICMjIyBwYXJzZWQgYCdjb21taXQnYCB0eXBlXG4gKlxuICoge0BsaW5rIFBhcnNlZENvbW1pdE9iamVjdCB0eXBlZGVmfVxuICoge0BsaW5rIENvbW1pdE9iamVjdCB0eXBlZGVmfVxuICpcbiAqICMjIyBwYXJzZWQgYCd0cmVlJ2AgdHlwZVxuICpcbiAqIHtAbGluayBQYXJzZWRUcmVlT2JqZWN0IHR5cGVkZWZ9XG4gKiB7QGxpbmsgVHJlZU9iamVjdCB0eXBlZGVmfVxuICoge0BsaW5rIFRyZWVFbnRyeSB0eXBlZGVmfVxuICpcbiAqICMjIyBwYXJzZWQgYCd0YWcnYCB0eXBlXG4gKlxuICoge0BsaW5rIFBhcnNlZFRhZ09iamVjdCB0eXBlZGVmfVxuICoge0BsaW5rIFRhZ09iamVjdCB0eXBlZGVmfVxuICpcbiAqIEBkZXByZWNhdGVkXG4gKiA+IFRoaXMgY29tbWFuZCBpcyBvdmVybHkgY29tcGxpY2F0ZWQuXG4gKiA+XG4gKiA+IElmIHlvdSBrbm93IHRoZSB0eXBlIG9mIG9iamVjdCB5b3UgYXJlIHJlYWRpbmcsIHVzZSBbYHJlYWRCbG9iYF0oLi9yZWFkQmxvYi5tZCksIFtgcmVhZENvbW1pdGBdKC4vcmVhZENvbW1pdC5tZCksIFtgcmVhZFRhZ2BdKC4vcmVhZFRhZy5tZCksIG9yIFtgcmVhZFRyZWVgXSguL3JlYWRUcmVlLm1kKS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5vaWQgLSBUaGUgU0hBLTEgb2JqZWN0IGlkIHRvIGdldFxuICogQHBhcmFtIHsnZGVmbGF0ZWQnIHwgJ3dyYXBwZWQnIHwgJ2NvbnRlbnQnIHwgJ3BhcnNlZCd9IFthcmdzLmZvcm1hdCA9ICdwYXJzZWQnXSAtIFdoYXQgZm9ybWF0IHRvIHJldHVybiB0aGUgb2JqZWN0IGluLiBUaGUgY2hvaWNlcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGJlbG93LlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmZpbGVwYXRoXSAtIERvbid0IHJldHVybiB0aGUgb2JqZWN0IHdpdGggYG9pZGAgaXRzZWxmLCBidXQgcmVzb2x2ZSBgb2lkYCB0byBhIHRyZWUgYW5kIHRoZW4gcmV0dXJuIHRoZSBvYmplY3QgYXQgdGhhdCBmaWxlcGF0aC4gVG8gcmV0dXJuIHRoZSByb290IGRpcmVjdG9yeSBvZiBhIHRyZWUgc2V0IGZpbGVwYXRoIHRvIGAnJ2BcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5lbmNvZGluZ10gLSBBIGNvbnZlbmllbmNlIGFyZ3VtZW50IHRoYXQgb25seSBhZmZlY3RzIGJsb2JzLiBJbnN0ZWFkIG9mIHJldHVybmluZyBgb2JqZWN0YCBhcyBhIGJ1ZmZlciwgaXQgcmV0dXJucyBhIHN0cmluZyBwYXJzZWQgdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nLlxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8UmVhZE9iamVjdFJlc3VsdD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIGEgZ2l0IG9iamVjdCBkZXNjcmlwdGlvblxuICogQHNlZSBSZWFkT2JqZWN0UmVzdWx0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEdpdmVuIGEgcmFuc29tIFNIQS0xIG9iamVjdCBpZCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gKiBsZXQgeyB0eXBlLCBvYmplY3QgfSA9IGF3YWl0IGdpdC5yZWFkT2JqZWN0KHtcbiAqICAgZnMsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIG9pZDogJzA2OThhNzgxYTAyMjY0YTZmMzdiYTNmZjQxZDc4MDY3ZWFmMGYwNzUnXG4gKiB9KVxuICogc3dpdGNoICh0eXBlKSB7XG4gKiAgIGNhc2UgJ2NvbW1pdCc6IHtcbiAqICAgICBjb25zb2xlLmxvZyhvYmplY3QpXG4gKiAgICAgYnJlYWtcbiAqICAgfVxuICogICBjYXNlICd0cmVlJzoge1xuICogICAgIGNvbnNvbGUubG9nKG9iamVjdClcbiAqICAgICBicmVha1xuICogICB9XG4gKiAgIGNhc2UgJ2Jsb2InOiB7XG4gKiAgICAgY29uc29sZS5sb2cob2JqZWN0KVxuICogICAgIGJyZWFrXG4gKiAgIH1cbiAqICAgY2FzZSAndGFnJzoge1xuICogICAgIGNvbnNvbGUubG9nKG9iamVjdClcbiAqICAgICBicmVha1xuICogICB9XG4gKiB9XG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkT2JqZWN0KHtcbiAgZnM6IF9mcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgb2lkLFxuICBmb3JtYXQgPSAncGFyc2VkJyxcbiAgZmlsZXBhdGggPSB1bmRlZmluZWQsXG4gIGVuY29kaW5nID0gdW5kZWZpbmVkLFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBfZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ29pZCcsIG9pZCk7XG5cbiAgICBjb25zdCBmcyA9IG5ldyBGaWxlU3lzdGVtKF9mcyk7XG4gICAgaWYgKGZpbGVwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9pZCA9IGF3YWl0IHJlc29sdmVGaWxlcGF0aCh7XG4gICAgICAgIGZzLFxuICAgICAgICBjYWNoZSxcbiAgICAgICAgZ2l0ZGlyLFxuICAgICAgICBvaWQsXG4gICAgICAgIGZpbGVwYXRoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEdpdE9iamVjdE1hbmFnZXIgZG9lcyBub3Qga25vdyBob3cgdG8gcGFyc2UgY29udGVudCwgc28gd2UgdHdlYWsgdGhhdCBwYXJhbWV0ZXIgYmVmb3JlIHBhc3NpbmcgaXQuXG4gICAgY29uc3QgX2Zvcm1hdCA9IGZvcm1hdCA9PT0gJ3BhcnNlZCcgPyAnY29udGVudCcgOiBmb3JtYXQ7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgX3JlYWRPYmplY3Qoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIGdpdGRpcixcbiAgICAgIG9pZCxcbiAgICAgIGZvcm1hdDogX2Zvcm1hdCxcbiAgICB9KTtcbiAgICByZXN1bHQub2lkID0gb2lkO1xuICAgIGlmIChmb3JtYXQgPT09ICdwYXJzZWQnKSB7XG4gICAgICByZXN1bHQuZm9ybWF0ID0gJ3BhcnNlZCc7XG4gICAgICBzd2l0Y2ggKHJlc3VsdC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1pdCc6XG4gICAgICAgICAgcmVzdWx0Lm9iamVjdCA9IEdpdENvbW1pdC5mcm9tKHJlc3VsdC5vYmplY3QpLnBhcnNlKCk7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndHJlZSc6XG4gICAgICAgICAgcmVzdWx0Lm9iamVjdCA9IEdpdFRyZWUuZnJvbShyZXN1bHQub2JqZWN0KS5lbnRyaWVzKCk7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYmxvYic6XG4gICAgICAgICAgLy8gSGVyZSB3ZSBjb25zaWRlciByZXR1cm5pbmcgYSByYXcgQnVmZmVyIGFzIHRoZSAnY29udGVudCcgZm9ybWF0XG4gICAgICAgICAgLy8gYW5kIHJldHVybmluZyBhIHN0cmluZyBhcyB0aGUgJ3BhcnNlZCcgZm9ybWF0XG4gICAgICAgICAgaWYgKGVuY29kaW5nKSB7XG4gICAgICAgICAgICByZXN1bHQub2JqZWN0ID0gcmVzdWx0Lm9iamVjdC50b1N0cmluZyhlbmNvZGluZyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5vYmplY3QgPSBuZXcgVWludDhBcnJheShyZXN1bHQub2JqZWN0KTtcbiAgICAgICAgICAgIHJlc3VsdC5mb3JtYXQgPSAnY29udGVudCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgICAgcmVzdWx0Lm9iamVjdCA9IEdpdEFubm90YXRlZFRhZy5mcm9tKHJlc3VsdC5vYmplY3QpLnBhcnNlKCk7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VHlwZUVycm9yKFxuICAgICAgICAgICAgcmVzdWx0Lm9pZCxcbiAgICAgICAgICAgIHJlc3VsdC50eXBlLFxuICAgICAgICAgICAgJ2Jsb2J8Y29tbWl0fHRhZ3x0cmVlJ1xuICAgICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlc3VsdC5mb3JtYXQgPT09ICdkZWZsYXRlZCcgfHwgcmVzdWx0LmZvcm1hdCA9PT0gJ3dyYXBwZWQnKSB7XG4gICAgICByZXN1bHQudHlwZSA9IHJlc3VsdC5mb3JtYXQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQucmVhZE9iamVjdCc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlYWRUYWdSZXN1bHQgLSBUaGUgb2JqZWN0IHJldHVybmVkIGhhcyB0aGUgZm9sbG93aW5nIHNjaGVtYTpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvaWQgLSBTSEEtMSBvYmplY3QgaWQgb2YgdGhpcyB0YWdcbiAqIEBwcm9wZXJ0eSB7VGFnT2JqZWN0fSB0YWcgLSB0aGUgcGFyc2VkIHRhZyBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXlsb2FkIC0gUEdQIHNpZ25pbmcgcGF5bG9hZFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9tb2RlbHMvRmlsZVN5c3RlbS5qcycpLkZpbGVTeXN0ZW19IGFyZ3MuZnNcbiAqIEBwYXJhbSB7YW55fSBhcmdzLmNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5naXRkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm9pZFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlYWRUYWdSZXN1bHQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBfcmVhZFRhZyh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCBvaWQgfSkge1xuICBjb25zdCB7IHR5cGUsIG9iamVjdCB9ID0gYXdhaXQgX3JlYWRPYmplY3Qoe1xuICAgIGZzLFxuICAgIGNhY2hlLFxuICAgIGdpdGRpcixcbiAgICBvaWQsXG4gICAgZm9ybWF0OiAnY29udGVudCcsXG4gIH0pO1xuICBpZiAodHlwZSAhPT0gJ3RhZycpIHtcbiAgICB0aHJvdyBuZXcgT2JqZWN0VHlwZUVycm9yKG9pZCwgdHlwZSwgJ3RhZycpXG4gIH1cbiAgY29uc3QgdGFnID0gR2l0QW5ub3RhdGVkVGFnLmZyb20ob2JqZWN0KTtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIG9pZCxcbiAgICB0YWc6IHRhZy5wYXJzZSgpLFxuICAgIHBheWxvYWQ6IHRhZy5wYXlsb2FkKCksXG4gIH07XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZWFkVGFnUmVzdWx0IC0gVGhlIG9iamVjdCByZXR1cm5lZCBoYXMgdGhlIGZvbGxvd2luZyBzY2hlbWE6XG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2lkIC0gU0hBLTEgb2JqZWN0IGlkIG9mIHRoaXMgdGFnXG4gKiBAcHJvcGVydHkge1RhZ09iamVjdH0gdGFnIC0gdGhlIHBhcnNlZCB0YWcgb2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF5bG9hZCAtIFBHUCBzaWduaW5nIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIFJlYWQgYW4gYW5ub3RhdGVkIHRhZyBvYmplY3QgZGlyZWN0bHlcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5vaWQgLSBUaGUgU0hBLTEgb2JqZWN0IGlkIHRvIGdldFxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8UmVhZFRhZ1Jlc3VsdD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIGEgZ2l0IG9iamVjdCBkZXNjcmlwdGlvblxuICogQHNlZSBSZWFkVGFnUmVzdWx0XG4gKiBAc2VlIFRhZ09iamVjdFxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFRhZyh7XG4gIGZzLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICBvaWQsXG4gIGNhY2hlID0ge30sXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIGZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdvaWQnLCBvaWQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IF9yZWFkVGFnKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBjYWNoZSxcbiAgICAgIGdpdGRpcixcbiAgICAgIG9pZCxcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5yZWFkVGFnJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gUmVhZFRyZWVSZXN1bHQgLSBUaGUgb2JqZWN0IHJldHVybmVkIGhhcyB0aGUgZm9sbG93aW5nIHNjaGVtYTpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvaWQgLSBTSEEtMSBvYmplY3QgaWQgb2YgdGhpcyB0cmVlXG4gKiBAcHJvcGVydHkge1RyZWVPYmplY3R9IHRyZWUgLSB0aGUgcGFyc2VkIHRyZWUgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBSZWFkIGEgdHJlZSBvYmplY3QgZGlyZWN0bHlcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5vaWQgLSBUaGUgU0hBLTEgb2JqZWN0IGlkIHRvIGdldC4gQW5ub3RhdGVkIHRhZ3MgYW5kIGNvbW1pdHMgYXJlIHBlZWxlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5maWxlcGF0aF0gLSBEb24ndCByZXR1cm4gdGhlIG9iamVjdCB3aXRoIGBvaWRgIGl0c2VsZiwgYnV0IHJlc29sdmUgYG9pZGAgdG8gYSB0cmVlIGFuZCB0aGVuIHJldHVybiB0aGUgdHJlZSBvYmplY3QgYXQgdGhhdCBmaWxlcGF0aC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlYWRUcmVlUmVzdWx0Pn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdpdGggYSBnaXQgdHJlZSBvYmplY3RcbiAqIEBzZWUgUmVhZFRyZWVSZXN1bHRcbiAqIEBzZWUgVHJlZU9iamVjdFxuICogQHNlZSBUcmVlRW50cnlcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRUcmVlKHtcbiAgZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIG9pZCxcbiAgZmlsZXBhdGggPSB1bmRlZmluZWQsXG4gIGNhY2hlID0ge30sXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIGZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdvaWQnLCBvaWQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IF9yZWFkVHJlZSh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgY2FjaGUsXG4gICAgICBnaXRkaXIsXG4gICAgICBvaWQsXG4gICAgICBmaWxlcGF0aCxcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5yZWFkVHJlZSc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogUmVtb3ZlIGEgZmlsZSBmcm9tIHRoZSBnaXQgaW5kZXggKGFrYSBzdGFnaW5nIGFyZWEpXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgZGVsZXRlIHRoZSBmaWxlIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwgJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZmlsZXBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byByZW1vdmUgZnJvbSB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgb25jZSB0aGUgZ2l0IGluZGV4IGhhcyBiZWVuIHVwZGF0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYXdhaXQgZ2l0LnJlbW92ZSh7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCBmaWxlcGF0aDogJ1JFQURNRS5tZCcgfSlcbiAqIGNvbnNvbGUubG9nKCdkb25lJylcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZSh7XG4gIGZzOiBfZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIGZpbGVwYXRoLFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBfZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZpbGVwYXRoJywgZmlsZXBhdGgpO1xuXG4gICAgYXdhaXQgR2l0SW5kZXhNYW5hZ2VyLmFjcXVpcmUoXG4gICAgICB7IGZzOiBuZXcgRmlsZVN5c3RlbShfZnMpLCBnaXRkaXIsIGNhY2hlIH0sXG4gICAgICBhc3luYyBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICBpbmRleC5kZWxldGUoeyBmaWxlcGF0aCB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5yZW1vdmUnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vbW9kZWxzL0ZpbGVTeXN0ZW0uanMnKS5GaWxlU3lzdGVtfSBhcmdzLmZzXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncy5jYWNoZVxuICogQHBhcmFtIHtTaWduQ2FsbGJhY2t9IFthcmdzLm9uU2lnbl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVmXVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub2lkXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncy5hdXRob3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhvci5uYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRob3IuZW1haWxcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmF1dGhvci50aW1lc3RhbXBcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmF1dGhvci50aW1lem9uZU9mZnNldFxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MuY29tbWl0dGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21taXR0ZXIubmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWl0dGVyLmVtYWlsXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21taXR0ZXIudGltZXN0YW1wXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21taXR0ZXIudGltZXpvbmVPZmZzZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zaWduaW5nS2V5XVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gX3JlbW92ZU5vdGUoe1xuICBmcyxcbiAgY2FjaGUsXG4gIG9uU2lnbixcbiAgZ2l0ZGlyLFxuICByZWYgPSAncmVmcy9ub3Rlcy9jb21taXRzJyxcbiAgb2lkLFxuICBhdXRob3IsXG4gIGNvbW1pdHRlcixcbiAgc2lnbmluZ0tleSxcbn0pIHtcbiAgLy8gR2V0IHRoZSBjdXJyZW50IG5vdGUgY29tbWl0XG4gIGxldCBwYXJlbnQ7XG4gIHRyeSB7XG4gICAgcGFyZW50ID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHsgZ2l0ZGlyLCBmcywgcmVmIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIShlcnIgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG5cbiAgLy8gSSdtIHVzaW5nIHRoZSBcImVtcHR5IHRyZWVcIiBtYWdpYyBudW1iZXIgaGVyZSBmb3IgYnJldml0eVxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBfcmVhZFRyZWUoe1xuICAgIGZzLFxuICAgIGdpdGRpcixcbiAgICBvaWQ6IHBhcmVudCB8fCAnNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNCcsXG4gIH0pO1xuICBsZXQgdHJlZSA9IHJlc3VsdC50cmVlO1xuXG4gIC8vIFJlbW92ZSB0aGUgbm90ZSBibG9iIGVudHJ5IGZyb20gdGhlIHRyZWVcbiAgdHJlZSA9IHRyZWUuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnBhdGggIT09IG9pZCk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBuZXcgbm90ZSB0cmVlXG4gIGNvbnN0IHRyZWVPaWQgPSBhd2FpdCBfd3JpdGVUcmVlKHtcbiAgICBmcyxcbiAgICBnaXRkaXIsXG4gICAgdHJlZSxcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBuZXcgbm90ZSBjb21taXRcbiAgY29uc3QgY29tbWl0T2lkID0gYXdhaXQgX2NvbW1pdCh7XG4gICAgZnMsXG4gICAgY2FjaGUsXG4gICAgb25TaWduLFxuICAgIGdpdGRpcixcbiAgICByZWYsXG4gICAgdHJlZTogdHJlZU9pZCxcbiAgICBwYXJlbnQ6IHBhcmVudCAmJiBbcGFyZW50XSxcbiAgICBtZXNzYWdlOiBgTm90ZSByZW1vdmVkIGJ5ICdpc29tb3JwaGljLWdpdCByZW1vdmVOb3RlJ1xcbmAsXG4gICAgYXV0aG9yLFxuICAgIGNvbW1pdHRlcixcbiAgICBzaWduaW5nS2V5LFxuICB9KTtcblxuICByZXR1cm4gY29tbWl0T2lkXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFJlbW92ZSBhbiBvYmplY3Qgbm90ZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7U2lnbkNhbGxiYWNrfSBbYXJncy5vblNpZ25dIC0gYSBQR1Agc2lnbmluZyBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlZl0gLSBUaGUgbm90ZXMgcmVmIHRvIGxvb2sgdW5kZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm9pZCAtIFRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlIG9iamVjdCB0byByZW1vdmUgdGhlIG5vdGUgZnJvbS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJncy5hdXRob3JdIC0gVGhlIGRldGFpbHMgYWJvdXQgdGhlIGF1dGhvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5hdXRob3IubmFtZV0gLSBEZWZhdWx0IGlzIGB1c2VyLm5hbWVgIGNvbmZpZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5hdXRob3IuZW1haWxdIC0gRGVmYXVsdCBpcyBgdXNlci5lbWFpbGAgY29uZmlnLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmF1dGhvci50aW1lc3RhbXA9TWF0aC5mbG9vcihEYXRlLm5vdygpLzEwMDApXSAtIFNldCB0aGUgYXV0aG9yIHRpbWVzdGFtcCBmaWVsZC4gVGhpcyBpcyB0aGUgaW50ZWdlciBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBlcG9jaCAoMTk3MC0wMS0wMSAwMDowMDowMCkuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYXV0aG9yLnRpbWV6b25lT2Zmc2V0XSAtIFNldCB0aGUgYXV0aG9yIHRpbWV6b25lIG9mZnNldCBmaWVsZC4gVGhpcyBpcyB0aGUgZGlmZmVyZW5jZSwgaW4gbWludXRlcywgZnJvbSB0aGUgY3VycmVudCB0aW1lem9uZSB0byBVVEMuIERlZmF1bHQgaXMgYChuZXcgRGF0ZSgpKS5nZXRUaW1lem9uZU9mZnNldCgpYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJncy5jb21taXR0ZXIgPSBhdXRob3JdIC0gVGhlIGRldGFpbHMgYWJvdXQgdGhlIG5vdGUgY29tbWl0dGVyLCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIGF1dGhvciBwYXJhbWV0ZXIuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBhdXRob3IgZGV0YWlscyBhcmUgdXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb21taXR0ZXIubmFtZV0gLSBEZWZhdWx0IGlzIGB1c2VyLm5hbWVgIGNvbmZpZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jb21taXR0ZXIuZW1haWxdIC0gRGVmYXVsdCBpcyBgdXNlci5lbWFpbGAgY29uZmlnLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmNvbW1pdHRlci50aW1lc3RhbXA9TWF0aC5mbG9vcihEYXRlLm5vdygpLzEwMDApXSAtIFNldCB0aGUgY29tbWl0dGVyIHRpbWVzdGFtcCBmaWVsZC4gVGhpcyBpcyB0aGUgaW50ZWdlciBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBlcG9jaCAoMTk3MC0wMS0wMSAwMDowMDowMCkuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuY29tbWl0dGVyLnRpbWV6b25lT2Zmc2V0XSAtIFNldCB0aGUgY29tbWl0dGVyIHRpbWV6b25lIG9mZnNldCBmaWVsZC4gVGhpcyBpcyB0aGUgZGlmZmVyZW5jZSwgaW4gbWludXRlcywgZnJvbSB0aGUgY3VycmVudCB0aW1lem9uZSB0byBVVEMuIERlZmF1bHQgaXMgYChuZXcgRGF0ZSgpKS5nZXRUaW1lem9uZU9mZnNldCgpYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zaWduaW5nS2V5XSAtIFNpZ24gdGhlIHRhZyBvYmplY3QgdXNpbmcgdGhpcyBwcml2YXRlIFBHUCBrZXkuXG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3MuY2FjaGVdIC0gYSBbY2FjaGVdKGNhY2hlLm1kKSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCB0aGUgU0hBLTEgb2JqZWN0IGlkIG9mIHRoZSBjb21taXQgb2JqZWN0IGZvciB0aGUgbm90ZSByZW1vdmFsLlxuICovXG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZU5vdGUoe1xuICBmczogX2ZzLFxuICBvblNpZ24sXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIHJlZiA9ICdyZWZzL25vdGVzL2NvbW1pdHMnLFxuICBvaWQsXG4gIGF1dGhvcjogX2F1dGhvcixcbiAgY29tbWl0dGVyOiBfY29tbWl0dGVyLFxuICBzaWduaW5nS2V5LFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBfZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ29pZCcsIG9pZCk7XG5cbiAgICBjb25zdCBmcyA9IG5ldyBGaWxlU3lzdGVtKF9mcyk7XG5cbiAgICBjb25zdCBhdXRob3IgPSBhd2FpdCBub3JtYWxpemVBdXRob3JPYmplY3QoeyBmcywgZ2l0ZGlyLCBhdXRob3I6IF9hdXRob3IgfSk7XG4gICAgaWYgKCFhdXRob3IpIHRocm93IG5ldyBNaXNzaW5nTmFtZUVycm9yKCdhdXRob3InKVxuXG4gICAgY29uc3QgY29tbWl0dGVyID0gYXdhaXQgbm9ybWFsaXplQ29tbWl0dGVyT2JqZWN0KHtcbiAgICAgIGZzLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgYXV0aG9yLFxuICAgICAgY29tbWl0dGVyOiBfY29tbWl0dGVyLFxuICAgIH0pO1xuICAgIGlmICghY29tbWl0dGVyKSB0aHJvdyBuZXcgTWlzc2luZ05hbWVFcnJvcignY29tbWl0dGVyJylcblxuICAgIHJldHVybiBhd2FpdCBfcmVtb3ZlTm90ZSh7XG4gICAgICBmcyxcbiAgICAgIGNhY2hlLFxuICAgICAgb25TaWduLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVmLFxuICAgICAgb2lkLFxuICAgICAgYXV0aG9yLFxuICAgICAgY29tbWl0dGVyLFxuICAgICAgc2lnbmluZ0tleSxcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5yZW1vdmVOb3RlJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBSZW5hbWUgYSBicmFuY2hcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZWYgLSBUaGUgbmFtZSBvZiB0aGUgbmV3IGJyYW5jaFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub2xkcmVmIC0gVGhlIG5hbWUgb2YgdGhlIG9sZCBicmFuY2hcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuY2hlY2tvdXQgPSBmYWxzZV1cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gZmlsZXN5c3RlbSBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZVxuICovXG5hc3luYyBmdW5jdGlvbiBfcmVuYW1lQnJhbmNoKHtcbiAgZnMsXG4gIGdpdGRpcixcbiAgb2xkcmVmLFxuICByZWYsXG4gIGNoZWNrb3V0ID0gZmFsc2UsXG59KSB7XG4gIGlmIChyZWYgIT09IGNsZWFuR2l0UmVmLmNsZWFuKHJlZikpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFJlZk5hbWVFcnJvcihyZWYsIGNsZWFuR2l0UmVmLmNsZWFuKHJlZikpXG4gIH1cblxuICBpZiAob2xkcmVmICE9PSBjbGVhbkdpdFJlZi5jbGVhbihvbGRyZWYpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRSZWZOYW1lRXJyb3Iob2xkcmVmLCBjbGVhbkdpdFJlZi5jbGVhbihvbGRyZWYpKVxuICB9XG5cbiAgY29uc3QgZnVsbG9sZHJlZiA9IGByZWZzL2hlYWRzLyR7b2xkcmVmfWA7XG4gIGNvbnN0IGZ1bGxuZXdyZWYgPSBgcmVmcy9oZWFkcy8ke3JlZn1gO1xuXG4gIGNvbnN0IG5ld2V4aXN0ID0gYXdhaXQgR2l0UmVmTWFuYWdlci5leGlzdHMoeyBmcywgZ2l0ZGlyLCByZWY6IGZ1bGxuZXdyZWYgfSk7XG5cbiAgaWYgKG5ld2V4aXN0KSB7XG4gICAgdGhyb3cgbmV3IEFscmVhZHlFeGlzdHNFcnJvcignYnJhbmNoJywgcmVmLCBmYWxzZSlcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHtcbiAgICBmcyxcbiAgICBnaXRkaXIsXG4gICAgcmVmOiBmdWxsb2xkcmVmLFxuICAgIGRlcHRoOiAxLFxuICB9KTtcblxuICBhd2FpdCBHaXRSZWZNYW5hZ2VyLndyaXRlUmVmKHsgZnMsIGdpdGRpciwgcmVmOiBmdWxsbmV3cmVmLCB2YWx1ZSB9KTtcbiAgYXdhaXQgR2l0UmVmTWFuYWdlci5kZWxldGVSZWYoeyBmcywgZ2l0ZGlyLCByZWY6IGZ1bGxvbGRyZWYgfSk7XG5cbiAgY29uc3QgZnVsbEN1cnJlbnRCcmFuY2hSZWYgPSBhd2FpdCBfY3VycmVudEJyYW5jaCh7XG4gICAgZnMsXG4gICAgZ2l0ZGlyLFxuICAgIGZ1bGxuYW1lOiB0cnVlLFxuICB9KTtcbiAgY29uc3QgaXNDdXJyZW50QnJhbmNoID0gZnVsbEN1cnJlbnRCcmFuY2hSZWYgPT09IGZ1bGxvbGRyZWY7XG5cbiAgaWYgKGNoZWNrb3V0IHx8IGlzQ3VycmVudEJyYW5jaCkge1xuICAgIC8vIFVwZGF0ZSBIRUFEXG4gICAgYXdhaXQgR2l0UmVmTWFuYWdlci53cml0ZVN5bWJvbGljUmVmKHtcbiAgICAgIGZzLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVmOiAnSEVBRCcsXG4gICAgICB2YWx1ZTogZnVsbG5ld3JlZixcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBSZW5hbWUgYSBicmFuY2hcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlZiAtIFdoYXQgdG8gbmFtZSB0aGUgYnJhbmNoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5vbGRyZWYgLSBXaGF0IHRoZSBuYW1lIG9mIHRoZSBicmFuY2ggd2FzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmNoZWNrb3V0ID0gZmFsc2VdIC0gVXBkYXRlIGBIRUFEYCB0byBwb2ludCBhdCB0aGUgbmV3bHkgY3JlYXRlZCBicmFuY2hcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gZmlsZXN5c3RlbSBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBnaXQucmVuYW1lQnJhbmNoKHsgZnMsIGRpcjogJy90dXRvcmlhbCcsIHJlZjogJ21haW4nLCBvbGRyZWY6ICdtYXN0ZXInIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiByZW5hbWVCcmFuY2goe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgcmVmLFxuICBvbGRyZWYsXG4gIGNoZWNrb3V0ID0gZmFsc2UsXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIGZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdyZWYnLCByZWYpO1xuICAgIGFzc2VydFBhcmFtZXRlcignb2xkcmVmJywgb2xkcmVmKTtcbiAgICByZXR1cm4gYXdhaXQgX3JlbmFtZUJyYW5jaCh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgcmVmLFxuICAgICAgb2xkcmVmLFxuICAgICAgY2hlY2tvdXQsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQucmVuYW1lQnJhbmNoJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBoYXNoT2JqZWN0JDEoeyBnaXRkaXIsIHR5cGUsIG9iamVjdCB9KSB7XG4gIHJldHVybiBzaGFzdW0oR2l0T2JqZWN0LndyYXAoeyB0eXBlLCBvYmplY3QgfSkpXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFJlc2V0IGEgZmlsZSBpbiB0aGUgZ2l0IGluZGV4IChha2Egc3RhZ2luZyBhcmVhKVxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIG1vZGlmeSB0aGUgZmlsZSBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsICcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZpbGVwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gcmVzZXQgaW4gdGhlIGluZGV4XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVmID0gJ0hFQUQnXSAtIEEgcmVmIHRvIHRoZSBjb21taXQgdG8gdXNlXG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3MuY2FjaGVdIC0gYSBbY2FjaGVdKGNhY2hlLm1kKSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IG9uY2UgdGhlIGdpdCBpbmRleCBoYXMgYmVlbiB1cGRhdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IGdpdC5yZXNldEluZGV4KHsgZnMsIGRpcjogJy90dXRvcmlhbCcsIGZpbGVwYXRoOiAnUkVBRE1FLm1kJyB9KVxuICogY29uc29sZS5sb2coJ2RvbmUnKVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzZXRJbmRleCh7XG4gIGZzOiBfZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIGZpbGVwYXRoLFxuICByZWYsXG4gIGNhY2hlID0ge30sXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIF9mcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZmlsZXBhdGgnLCBmaWxlcGF0aCk7XG5cbiAgICBjb25zdCBmcyA9IG5ldyBGaWxlU3lzdGVtKF9mcyk7XG5cbiAgICBsZXQgb2lkO1xuICAgIGxldCB3b3JrZGlyT2lkO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc29sdmUgY29tbWl0XG4gICAgICBvaWQgPSBhd2FpdCBHaXRSZWZNYW5hZ2VyLnJlc29sdmUoeyBmcywgZ2l0ZGlyLCByZWY6IHJlZiB8fCAnSEVBRCcgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHJlZikge1xuICAgICAgICAvLyBPbmx5IHRocm93IHRoZSBlcnJvciBpZiBhIHJlZiBpcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOb3QgaGF2aW5nIGFuIG9pZCBhdCB0aGlzIHBvaW50IG1lYW5zIGByZXNldEluZGV4KClgIHdhcyBjYWxsZWQgd2l0aG91dCBleHBsaWNpdCBgcmVmYCBvbiBhIG5ldyBnaXRcbiAgICAvLyByZXBvc2l0b3J5LiBJZiB0aGF0IGhhcHBlbnMsIHdlIGNhbiBza2lwIHJlc29sdmluZyB0aGUgZmlsZSBwYXRoLlxuICAgIGlmIChvaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFJlc29sdmUgYmxvYlxuICAgICAgICBvaWQgPSBhd2FpdCByZXNvbHZlRmlsZXBhdGgoe1xuICAgICAgICAgIGZzLFxuICAgICAgICAgIGNhY2hlLFxuICAgICAgICAgIGdpdGRpcixcbiAgICAgICAgICBvaWQsXG4gICAgICAgICAgZmlsZXBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBUaGlzIG1lYW5zIHdlJ3JlIHJlc2V0dGluZyB0aGUgZmlsZSB0byBhIFwiZGVsZXRlZFwiIHN0YXRlXG4gICAgICAgIG9pZCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9yIGZpbGVzIHRoYXQgYXJlbid0IGluIHRoZSB3b3JrZGlyIHVzZSB6ZXJvc1xuICAgIGxldCBzdGF0cyA9IHtcbiAgICAgIGN0aW1lOiBuZXcgRGF0ZSgwKSxcbiAgICAgIG10aW1lOiBuZXcgRGF0ZSgwKSxcbiAgICAgIGRldjogMCxcbiAgICAgIGlubzogMCxcbiAgICAgIG1vZGU6IDAsXG4gICAgICB1aWQ6IDAsXG4gICAgICBnaWQ6IDAsXG4gICAgICBzaXplOiAwLFxuICAgIH07XG4gICAgLy8gSWYgdGhlIGZpbGUgZXhpc3RzIGluIHRoZSB3b3JrZGlyLi4uXG4gICAgY29uc3Qgb2JqZWN0ID0gZGlyICYmIChhd2FpdCBmcy5yZWFkKGpvaW4oZGlyLCBmaWxlcGF0aCkpKTtcbiAgICBpZiAob2JqZWN0KSB7XG4gICAgICAvLyAuLi4gYW5kIGhhcyB0aGUgc2FtZSBoYXNoIGFzIHRoZSBkZXNpcmVkIHN0YXRlLi4uXG4gICAgICB3b3JrZGlyT2lkID0gYXdhaXQgaGFzaE9iamVjdCQxKHtcbiAgICAgICAgZ2l0ZGlyLFxuICAgICAgICB0eXBlOiAnYmxvYicsXG4gICAgICAgIG9iamVjdCxcbiAgICAgIH0pO1xuICAgICAgaWYgKG9pZCA9PT0gd29ya2Rpck9pZCkge1xuICAgICAgICAvLyAuLi4gdXNlIHRoZSB3b3JrZGlyIFN0YXRzIG9iamVjdFxuICAgICAgICBzdGF0cyA9IGF3YWl0IGZzLmxzdGF0KGpvaW4oZGlyLCBmaWxlcGF0aCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBHaXRJbmRleE1hbmFnZXIuYWNxdWlyZSh7IGZzLCBnaXRkaXIsIGNhY2hlIH0sIGFzeW5jIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICBpbmRleC5kZWxldGUoeyBmaWxlcGF0aCB9KTtcbiAgICAgIGlmIChvaWQpIHtcbiAgICAgICAgaW5kZXguaW5zZXJ0KHsgZmlsZXBhdGgsIHN0YXRzLCBvaWQgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LnJlc2V0JztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9saWMgcmVmIG9yIHJlc29sdmUgYSByZWYgdG8gaXRzIFNIQS0xIG9iamVjdCBpZFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCAnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZWYgLSBUaGUgcmVmIHRvIHJlc29sdmVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5kZXB0aCA9IHVuZGVmaW5lZF0gLSBIb3cgbWFueSBzeW1ib2xpYyByZWZlcmVuY2VzIHRvIGZvbGxvdyBiZWZvcmUgcmV0dXJuaW5nXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdpdGggYSBTSEEtMSBvYmplY3QgaWQgb3IgdGhlIHZhbHVlIG9mIGEgc3ltYm9saWMgcmVmXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCBjdXJyZW50Q29tbWl0ID0gYXdhaXQgZ2l0LnJlc29sdmVSZWYoeyBmcywgZGlyOiAnL3R1dG9yaWFsJywgcmVmOiAnSEVBRCcgfSlcbiAqIGNvbnNvbGUubG9nKGN1cnJlbnRDb21taXQpXG4gKiBsZXQgY3VycmVudEJyYW5jaCA9IGF3YWl0IGdpdC5yZXNvbHZlUmVmKHsgZnMsIGRpcjogJy90dXRvcmlhbCcsIHJlZjogJ0hFQUQnLCBkZXB0aDogMiB9KVxuICogY29uc29sZS5sb2coY3VycmVudEJyYW5jaClcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVSZWYoe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgcmVmLFxuICBkZXB0aCxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ3JlZicsIHJlZik7XG5cbiAgICBjb25zdCBvaWQgPSBhd2FpdCBHaXRSZWZNYW5hZ2VyLnJlc29sdmUoe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlZixcbiAgICAgIGRlcHRoLFxuICAgIH0pO1xuICAgIHJldHVybiBvaWRcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQucmVzb2x2ZVJlZic7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogV3JpdGUgYW4gZW50cnkgdG8gdGhlIGdpdCBjb25maWcgZmlsZXMuXG4gKlxuICogKkNhdmVhdHM6KlxuICogLSBDdXJyZW50bHkgb25seSB0aGUgbG9jYWwgYCRHSVRfRElSL2NvbmZpZ2AgZmlsZSBjYW4gYmUgcmVhZCBvciB3cml0dGVuLiBIb3dldmVyIHN1cHBvcnQgZm9yIHRoZSBnbG9iYWwgYH4vLmdpdGNvbmZpZ2AgYW5kIHN5c3RlbSBgJChwcmVmaXgpL2V0Yy9naXRjb25maWdgIHdpbGwgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS5cbiAqIC0gVGhlIGN1cnJlbnQgcGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIG1vcmUgZXhvdGljIGZlYXR1cmVzIG9mIHRoZSBnaXQtY29uZmlnIGZpbGUgZm9ybWF0IHN1Y2ggYXMgYFtpbmNsdWRlXWAgYW5kIGBbaW5jbHVkZUlmXWAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wYXRoIC0gVGhlIGtleSBvZiB0aGUgZ2l0IGNvbmZpZyBlbnRyeVxuICogQHBhcmFtIHtzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgdm9pZH0gYXJncy52YWx1ZSAtIEEgdmFsdWUgdG8gc3RvcmUgYXQgdGhhdCBwYXRoLiAoVXNlIGB1bmRlZmluZWRgIGFzIHRoZSB2YWx1ZSB0byBkZWxldGUgYSBjb25maWcgZW50cnkuKVxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5hcHBlbmQgPSBmYWxzZV0gLSBJZiB0cnVlLCB3aWxsIGFwcGVuZCByYXRoZXIgdGhhbiByZXBsYWNlIHdoZW4gc2V0dGluZyAodXNlIHdpdGggbXVsdGktdmFsdWVkIGNvbmZpZyBvcHRpb25zKS5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXcml0ZSBjb25maWcgdmFsdWVcbiAqIGF3YWl0IGdpdC5zZXRDb25maWcoe1xuICogICBmcyxcbiAqICAgZGlyOiAnL3R1dG9yaWFsJyxcbiAqICAgcGF0aDogJ3VzZXIubmFtZScsXG4gKiAgIHZhbHVlOiAnTXIuIFRlc3QnXG4gKiB9KVxuICpcbiAqIC8vIFByaW50IG91dCBjb25maWcgZmlsZVxuICogbGV0IGZpbGUgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSgnL3R1dG9yaWFsLy5naXQvY29uZmlnJywgJ3V0ZjgnKVxuICogY29uc29sZS5sb2coZmlsZSlcbiAqXG4gKiAvLyBEZWxldGUgYSBjb25maWcgZW50cnlcbiAqIGF3YWl0IGdpdC5zZXRDb25maWcoe1xuICogICBmcyxcbiAqICAgZGlyOiAnL3R1dG9yaWFsJyxcbiAqICAgcGF0aDogJ3VzZXIubmFtZScsXG4gKiAgIHZhbHVlOiB1bmRlZmluZWRcbiAqIH0pXG4gKlxuICogLy8gUHJpbnQgb3V0IGNvbmZpZyBmaWxlXG4gKiBmaWxlID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoJy90dXRvcmlhbC8uZ2l0L2NvbmZpZycsICd1dGY4JylcbiAqIGNvbnNvbGUubG9nKGZpbGUpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldENvbmZpZyh7XG4gIGZzOiBfZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIHBhdGgsXG4gIHZhbHVlLFxuICBhcHBlbmQgPSBmYWxzZSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgX2ZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdwYXRoJywgcGF0aCk7XG4gICAgLy8gYXNzZXJ0UGFyYW1ldGVyKCd2YWx1ZScsIHZhbHVlKSAvLyBXZSBhY3R1YWxseSBhbGxvdyAndW5kZWZpbmVkJyBhcyBhIHZhbHVlIHRvIHVuc2V0L2RlbGV0ZVxuXG4gICAgY29uc3QgZnMgPSBuZXcgRmlsZVN5c3RlbShfZnMpO1xuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuZ2V0KHsgZnMsIGdpdGRpciB9KTtcbiAgICBpZiAoYXBwZW5kKSB7XG4gICAgICBhd2FpdCBjb25maWcuYXBwZW5kKHBhdGgsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgY29uZmlnLnNldChwYXRoLCB2YWx1ZSk7XG4gICAgfVxuICAgIGF3YWl0IEdpdENvbmZpZ01hbmFnZXIuc2F2ZSh7IGZzLCBnaXRkaXIsIGNvbmZpZyB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuc2V0Q29uZmlnJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBUZWxsIHdoZXRoZXIgYSBmaWxlIGhhcyBiZWVuIGNoYW5nZWRcbiAqXG4gKiBUaGUgcG9zc2libGUgcmVzb2x2ZSB2YWx1ZXMgYXJlOlxuICpcbiAqIHwgc3RhdHVzICAgICAgICAgICAgICAgIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICogfCBgXCJpZ25vcmVkXCJgICAgICAgICAgICB8IGZpbGUgaWdub3JlZCBieSBhIC5naXRpZ25vcmUgcnVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCJ1bm1vZGlmaWVkXCJgICAgICAgICB8IGZpbGUgdW5jaGFuZ2VkIGZyb20gSEVBRCBjb21taXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCIqbW9kaWZpZWRcImAgICAgICAgICB8IGZpbGUgaGFzIG1vZGlmaWNhdGlvbnMsIG5vdCB5ZXQgc3RhZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCIqZGVsZXRlZFwiYCAgICAgICAgICB8IGZpbGUgaGFzIGJlZW4gcmVtb3ZlZCwgYnV0IHRoZSByZW1vdmFsIGlzIG5vdCB5ZXQgc3RhZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCIqYWRkZWRcImAgICAgICAgICAgICB8IGZpbGUgaXMgdW50cmFja2VkLCBub3QgeWV0IHN0YWdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCJhYnNlbnRcImAgICAgICAgICAgICB8IGZpbGUgbm90IHByZXNlbnQgaW4gSEVBRCBjb21taXQsIHN0YWdpbmcgYXJlYSwgb3Igd29ya2luZyBkaXIgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCJtb2RpZmllZFwiYCAgICAgICAgICB8IGZpbGUgaGFzIG1vZGlmaWNhdGlvbnMsIHN0YWdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCJkZWxldGVkXCJgICAgICAgICAgICB8IGZpbGUgaGFzIGJlZW4gcmVtb3ZlZCwgc3RhZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCJhZGRlZFwiYCAgICAgICAgICAgICB8IHByZXZpb3VzbHkgdW50cmFja2VkIGZpbGUsIHN0YWdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCIqdW5tb2RpZmllZFwiYCAgICAgICB8IHdvcmtpbmcgZGlyIGFuZCBIRUFEIGNvbW1pdCBtYXRjaCwgYnV0IGluZGV4IGRpZmZlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCIqYWJzZW50XCJgICAgICAgICAgICB8IGZpbGUgbm90IHByZXNlbnQgaW4gd29ya2luZyBkaXIgb3IgSEVBRCBjb21taXQsIGJ1dCBwcmVzZW50IGluIHRoZSBpbmRleCAgICAgICAgICAgICAgfFxuICogfCBgXCIqdW5kZWxldGVkXCJgICAgICAgICB8IGZpbGUgd2FzIGRlbGV0ZWQgZnJvbSB0aGUgaW5kZXgsIGJ1dCBpcyBzdGlsbCBpbiB0aGUgd29ya2luZyBkaXIgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgXCIqdW5kZWxldGVtb2RpZmllZFwiYCB8IGZpbGUgd2FzIGRlbGV0ZWQgZnJvbSB0aGUgaW5kZXgsIGJ1dCBpcyBwcmVzZW50IHdpdGggbW9kaWZpY2F0aW9ucyBpbiB0aGUgd29ya2luZyBkaXIgfFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRpciAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwgJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZmlsZXBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBxdWVyeVxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8J2lnbm9yZWQnfCd1bm1vZGlmaWVkJ3wnKm1vZGlmaWVkJ3wnKmRlbGV0ZWQnfCcqYWRkZWQnfCdhYnNlbnQnfCdtb2RpZmllZCd8J2RlbGV0ZWQnfCdhZGRlZCd8Jyp1bm1vZGlmaWVkJ3wnKmFic2VudCd8Jyp1bmRlbGV0ZWQnfCcqdW5kZWxldGVtb2RpZmllZCc+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCB0aGUgZmlsZSdzIGdpdCBzdGF0dXNcbiAqXG4gKiBAZXhhbXBsZVxuICogbGV0IHN0YXR1cyA9IGF3YWl0IGdpdC5zdGF0dXMoeyBmcywgZGlyOiAnL3R1dG9yaWFsJywgZmlsZXBhdGg6ICdSRUFETUUubWQnIH0pXG4gKiBjb25zb2xlLmxvZyhzdGF0dXMpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGF0dXMoe1xuICBmczogX2ZzLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICBmaWxlcGF0aCxcbiAgY2FjaGUgPSB7fSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgX2ZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmaWxlcGF0aCcsIGZpbGVwYXRoKTtcblxuICAgIGNvbnN0IGZzID0gbmV3IEZpbGVTeXN0ZW0oX2ZzKTtcbiAgICBjb25zdCBpZ25vcmVkID0gYXdhaXQgR2l0SWdub3JlTWFuYWdlci5pc0lnbm9yZWQoe1xuICAgICAgZnMsXG4gICAgICBnaXRkaXIsXG4gICAgICBkaXIsXG4gICAgICBmaWxlcGF0aCxcbiAgICB9KTtcbiAgICBpZiAoaWdub3JlZCkge1xuICAgICAgcmV0dXJuICdpZ25vcmVkJ1xuICAgIH1cbiAgICBjb25zdCBoZWFkVHJlZSA9IGF3YWl0IGdldEhlYWRUcmVlKHsgZnMsIGNhY2hlLCBnaXRkaXIgfSk7XG4gICAgY29uc3QgdHJlZU9pZCA9IGF3YWl0IGdldE9pZEF0UGF0aCh7XG4gICAgICBmcyxcbiAgICAgIGNhY2hlLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgdHJlZTogaGVhZFRyZWUsXG4gICAgICBwYXRoOiBmaWxlcGF0aCxcbiAgICB9KTtcbiAgICBjb25zdCBpbmRleEVudHJ5ID0gYXdhaXQgR2l0SW5kZXhNYW5hZ2VyLmFjcXVpcmUoXG4gICAgICB7IGZzLCBnaXRkaXIsIGNhY2hlIH0sXG4gICAgICBhc3luYyBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGluZGV4KSB7XG4gICAgICAgICAgaWYgKGVudHJ5LnBhdGggPT09IGZpbGVwYXRoKSByZXR1cm4gZW50cnlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICk7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5sc3RhdChqb2luKGRpciwgZmlsZXBhdGgpKTtcblxuICAgIGNvbnN0IEggPSB0cmVlT2lkICE9PSBudWxsOyAvLyBoZWFkXG4gICAgY29uc3QgSSA9IGluZGV4RW50cnkgIT09IG51bGw7IC8vIGluZGV4XG4gICAgY29uc3QgVyA9IHN0YXRzICE9PSBudWxsOyAvLyB3b3JraW5nIGRpclxuXG4gICAgY29uc3QgZ2V0V29ya2Rpck9pZCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChJICYmICFjb21wYXJlU3RhdHMoaW5kZXhFbnRyeSwgc3RhdHMpKSB7XG4gICAgICAgIHJldHVybiBpbmRleEVudHJ5Lm9pZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gYXdhaXQgZnMucmVhZChqb2luKGRpciwgZmlsZXBhdGgpKTtcbiAgICAgICAgY29uc3Qgd29ya2Rpck9pZCA9IGF3YWl0IGhhc2hPYmplY3QkMSh7XG4gICAgICAgICAgZ2l0ZGlyLFxuICAgICAgICAgIHR5cGU6ICdibG9iJyxcbiAgICAgICAgICBvYmplY3QsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJZiB0aGUgb2lkIGluIHRoZSBpbmRleCA9PT0gd29ya2luZyBkaXIgb2lkIGJ1dCBzdGF0cyBkaWZmZXJlZCB1cGRhdGUgY2FjaGVcbiAgICAgICAgaWYgKEkgJiYgaW5kZXhFbnRyeS5vaWQgPT09IHdvcmtkaXJPaWQpIHtcbiAgICAgICAgICAvLyBhbmQgYXMgbG9uZyBhcyBvdXIgZnMuc3RhdHMgYXJlbid0IGJhZC5cbiAgICAgICAgICAvLyBzaXplIG9mIC0xIGhhcHBlbnMgb3ZlciBhIEJyb3dzZXJGUyBIVFRQIEJhY2tlbmQgdGhhdCBkb2Vzbid0IHNlcnZlIENvbnRlbnQtTGVuZ3RoIGhlYWRlcnNcbiAgICAgICAgICAvLyAobGlrZSB0aGUgS2FybWEgd2Vic2VydmVyKSBiZWNhdXNlIEJyb3dzZXJGUyBIVFRQIEJhY2tlbmQgdXNlcyBIVFRQIEhFQUQgcmVxdWVzdHMgdG8gZG8gZnMuc3RhdFxuICAgICAgICAgIGlmIChzdGF0cy5zaXplICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3QgYXdhaXQgdGhpcyBzbyB3ZSBjYW4gcmV0dXJuIGZhc3RlciBmb3Igb25lLW9mZiBjYXNlcy5cbiAgICAgICAgICAgIEdpdEluZGV4TWFuYWdlci5hY3F1aXJlKHsgZnMsIGdpdGRpciwgY2FjaGUgfSwgYXN5bmMgZnVuY3Rpb24oXG4gICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaW5kZXguaW5zZXJ0KHsgZmlsZXBhdGgsIHN0YXRzLCBvaWQ6IHdvcmtkaXJPaWQgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdvcmtkaXJPaWRcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKCFIICYmICFXICYmICFJKSByZXR1cm4gJ2Fic2VudCcgLy8gLS0tXG4gICAgaWYgKCFIICYmICFXICYmIEkpIHJldHVybiAnKmFic2VudCcgLy8gLUEtXG4gICAgaWYgKCFIICYmIFcgJiYgIUkpIHJldHVybiAnKmFkZGVkJyAvLyAtLUFcbiAgICBpZiAoIUggJiYgVyAmJiBJKSB7XG4gICAgICBjb25zdCB3b3JrZGlyT2lkID0gYXdhaXQgZ2V0V29ya2Rpck9pZCgpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHdvcmtkaXJPaWQgPT09IGluZGV4RW50cnkub2lkID8gJ2FkZGVkJyA6ICcqYWRkZWQnIC8vIC1BQSA6IC1BQlxuICAgIH1cbiAgICBpZiAoSCAmJiAhVyAmJiAhSSkgcmV0dXJuICdkZWxldGVkJyAvLyBBLS1cbiAgICBpZiAoSCAmJiAhVyAmJiBJKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gdHJlZU9pZCA9PT0gaW5kZXhFbnRyeS5vaWQgPyAnKmRlbGV0ZWQnIDogJypkZWxldGVkJyAvLyBBQS0gOiBBQi1cbiAgICB9XG4gICAgaWYgKEggJiYgVyAmJiAhSSkge1xuICAgICAgY29uc3Qgd29ya2Rpck9pZCA9IGF3YWl0IGdldFdvcmtkaXJPaWQoKTtcbiAgICAgIHJldHVybiB3b3JrZGlyT2lkID09PSB0cmVlT2lkID8gJyp1bmRlbGV0ZWQnIDogJyp1bmRlbGV0ZW1vZGlmaWVkJyAvLyBBLUEgOiBBLUJcbiAgICB9XG4gICAgaWYgKEggJiYgVyAmJiBJKSB7XG4gICAgICBjb25zdCB3b3JrZGlyT2lkID0gYXdhaXQgZ2V0V29ya2Rpck9pZCgpO1xuICAgICAgaWYgKHdvcmtkaXJPaWQgPT09IHRyZWVPaWQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gd29ya2Rpck9pZCA9PT0gaW5kZXhFbnRyeS5vaWQgPyAndW5tb2RpZmllZCcgOiAnKnVubW9kaWZpZWQnIC8vIEFBQSA6IEFCQVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gd29ya2Rpck9pZCA9PT0gaW5kZXhFbnRyeS5vaWQgPyAnbW9kaWZpZWQnIDogJyptb2RpZmllZCcgLy8gQUJCIDogQUFCXG4gICAgICB9XG4gICAgfVxuICAgIC8qXG4gICAgLS0tXG4gICAgLUEtXG4gICAgLS1BXG4gICAgLUFBXG4gICAgLUFCXG4gICAgQS0tXG4gICAgQUEtXG4gICAgQUItXG4gICAgQS1BXG4gICAgQS1CXG4gICAgQUFBXG4gICAgQUJBXG4gICAgQUJCXG4gICAgQUFCXG4gICAgKi9cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQuc3RhdHVzJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPaWRBdFBhdGgoeyBmcywgY2FjaGUsIGdpdGRpciwgdHJlZSwgcGF0aCB9KSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHBhdGggPSBwYXRoLnNwbGl0KCcvJyk7XG4gIGNvbnN0IGRpcm5hbWUgPSBwYXRoLnNoaWZ0KCk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgdHJlZSkge1xuICAgIGlmIChlbnRyeS5wYXRoID09PSBkaXJuYW1lKSB7XG4gICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5Lm9pZFxuICAgICAgfVxuICAgICAgY29uc3QgeyB0eXBlLCBvYmplY3QgfSA9IGF3YWl0IF9yZWFkT2JqZWN0KHtcbiAgICAgICAgZnMsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBnaXRkaXIsXG4gICAgICAgIG9pZDogZW50cnkub2lkLFxuICAgICAgfSk7XG4gICAgICBpZiAodHlwZSA9PT0gJ3RyZWUnKSB7XG4gICAgICAgIGNvbnN0IHRyZWUgPSBHaXRUcmVlLmZyb20ob2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIGdldE9pZEF0UGF0aCh7IGZzLCBjYWNoZSwgZ2l0ZGlyLCB0cmVlLCBwYXRoIH0pXG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgICAgIHRocm93IG5ldyBPYmplY3RUeXBlRXJyb3IoZW50cnkub2lkLCB0eXBlLCAnYmxvYicsIHBhdGguam9pbignLycpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRIZWFkVHJlZSh7IGZzLCBjYWNoZSwgZ2l0ZGlyIH0pIHtcbiAgLy8gR2V0IHRoZSB0cmVlIGZyb20gdGhlIEhFQUQgY29tbWl0LlxuICBsZXQgb2lkO1xuICB0cnkge1xuICAgIG9pZCA9IGF3YWl0IEdpdFJlZk1hbmFnZXIucmVzb2x2ZSh7IGZzLCBnaXRkaXIsIHJlZjogJ0hFQUQnIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSGFuZGxlIGZyZXNoIGJyYW5jaGVzIHdpdGggbm8gY29tbWl0c1xuICAgIGlmIChlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG4gIGNvbnN0IHsgdHJlZSB9ID0gYXdhaXQgX3JlYWRUcmVlKHsgZnMsIGNhY2hlLCBnaXRkaXIsIG9pZCB9KTtcbiAgcmV0dXJuIHRyZWVcbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogRWZmaWNpZW50bHkgZ2V0IHRoZSBzdGF0dXMgb2YgbXVsdGlwbGUgZmlsZXMgYXQgb25jZS5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgYFN0YXR1c01hdHJpeGAgaXMgYWRtaXR0ZWRseSBub3QgdGhlIGVhc2llc3QgZm9ybWF0IHRvIHJlYWQuXG4gKiBIb3dldmVyIGl0IGNvbnZleXMgYSBsYXJnZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gaW4gZGVuc2UgZm9ybWF0IHRoYXQgc2hvdWxkIG1ha2UgaXQgZWFzeSB0byBjcmVhdGUgcmVwb3J0cyBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVwb3NpdG9yeTtcbiAqIHdpdGhvdXQgaGF2aW5nIHRvIGRvIG11bHRpcGxlLCB0aW1lLWNvbnN1bWluZyBpc29tb3JwaGljLWdpdCBjYWxscy5cbiAqIE15IGhvcGUgaXMgdGhhdCB0aGUgc3BlZWQgYW5kIGZsZXhpYmlsaXR5IG9mIHRoZSBmdW5jdGlvbiB3aWxsIG1ha2UgdXAgZm9yIHRoZSBsZWFybmluZyBjdXJ2ZSBvZiBpbnRlcnByZXRpbmcgdGhlIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBgYGBqcyBsaXZlXG4gKiAvLyBnZXQgdGhlIHN0YXR1cyBvZiBhbGwgdGhlIGZpbGVzIGluICdzcmMnXG4gKiBsZXQgc3RhdHVzID0gYXdhaXQgZ2l0LnN0YXR1c01hdHJpeCh7XG4gKiAgIGZzLFxuICogICBkaXI6ICcvdHV0b3JpYWwnLFxuICogICBmaWx0ZXI6IGYgPT4gZi5zdGFydHNXaXRoKCdzcmMvJylcbiAqIH0pXG4gKiBjb25zb2xlLmxvZyhzdGF0dXMpXG4gKiBgYGBcbiAqXG4gKiBgYGBqcyBsaXZlXG4gKiAvLyBnZXQgdGhlIHN0YXR1cyBvZiBhbGwgdGhlIEpTT04gYW5kIE1hcmtkb3duIGZpbGVzXG4gKiBsZXQgc3RhdHVzID0gYXdhaXQgZ2l0LnN0YXR1c01hdHJpeCh7XG4gKiAgIGZzLFxuICogICBkaXI6ICcvdHV0b3JpYWwnLFxuICogICBmaWx0ZXI6IGYgPT4gZi5lbmRzV2l0aCgnLmpzb24nKSB8fCBmLmVuZHNXaXRoKCcubWQnKVxuICogfSlcbiAqIGNvbnNvbGUubG9nKHN0YXR1cylcbiAqIGBgYFxuICpcbiAqIFRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYXMgYSAyRCBhcnJheS5cbiAqIFRoZSBvdXRlciBhcnJheSByZXByZXNlbnRzIHRoZSBmaWxlcyBhbmQvb3IgYmxvYnMgaW4gdGhlIHJlcG8sIGluIGFscGhhYmV0aWNhbCBvcmRlci5cbiAqIFRoZSBpbm5lciBhcnJheXMgZGVzY3JpYmUgdGhlIHN0YXR1cyBvZiB0aGUgZmlsZTpcbiAqIHRoZSBmaXJzdCB2YWx1ZSBpcyB0aGUgZmlsZXBhdGgsIGFuZCB0aGUgbmV4dCB0aHJlZSBhcmUgaW50ZWdlcnNcbiAqIHJlcHJlc2VudGluZyB0aGUgSEVBRCBzdGF0dXMsIFdPUktESVIgc3RhdHVzLCBhbmQgU1RBR0Ugc3RhdHVzIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBgYGBqc1xuICogLy8gZXhhbXBsZSBTdGF0dXNNYXRyaXhcbiAqIFtcbiAqICAgW1wiYS50eHRcIiwgMCwgMiwgMF0sIC8vIG5ldywgdW50cmFja2VkXG4gKiAgIFtcImIudHh0XCIsIDAsIDIsIDJdLCAvLyBhZGRlZCwgc3RhZ2VkXG4gKiAgIFtcImMudHh0XCIsIDAsIDIsIDNdLCAvLyBhZGRlZCwgc3RhZ2VkLCB3aXRoIHVuc3RhZ2VkIGNoYW5nZXNcbiAqICAgW1wiZC50eHRcIiwgMSwgMSwgMV0sIC8vIHVubW9kaWZpZWRcbiAqICAgW1wiZS50eHRcIiwgMSwgMiwgMV0sIC8vIG1vZGlmaWVkLCB1bnN0YWdlZFxuICogICBbXCJmLnR4dFwiLCAxLCAyLCAyXSwgLy8gbW9kaWZpZWQsIHN0YWdlZFxuICogICBbXCJnLnR4dFwiLCAxLCAyLCAzXSwgLy8gbW9kaWZpZWQsIHN0YWdlZCwgd2l0aCB1bnN0YWdlZCBjaGFuZ2VzXG4gKiAgIFtcImgudHh0XCIsIDEsIDAsIDFdLCAvLyBkZWxldGVkLCB1bnN0YWdlZFxuICogICBbXCJpLnR4dFwiLCAxLCAwLCAwXSwgLy8gZGVsZXRlZCwgc3RhZ2VkXG4gKiAgIFtcImoudHh0XCIsIDEsIDIsIDBdLCAvLyBkZWxldGVkLCBzdGFnZWQsIHdpdGggdW5zdGFnZWQtbW9kaWZpZWQgY2hhbmdlcyAobmV3IGZpbGUgb2YgdGhlIHNhbWUgbmFtZSlcbiAqICAgW1wiay50eHRcIiwgMSwgMSwgMF0sIC8vIGRlbGV0ZWQsIHN0YWdlZCwgd2l0aCB1bnN0YWdlZCBjaGFuZ2VzIChuZXcgZmlsZSBvZiB0aGUgc2FtZSBuYW1lKVxuICogXVxuICogYGBgXG4gKlxuICogLSBUaGUgSEVBRCBzdGF0dXMgaXMgZWl0aGVyIGFic2VudCAoMCkgb3IgcHJlc2VudCAoMSkuXG4gKiAtIFRoZSBXT1JLRElSIHN0YXR1cyBpcyBlaXRoZXIgYWJzZW50ICgwKSwgaWRlbnRpY2FsIHRvIEhFQUQgKDEpLCBvciBkaWZmZXJlbnQgZnJvbSBIRUFEICgyKS5cbiAqIC0gVGhlIFNUQUdFIHN0YXR1cyBpcyBlaXRoZXIgYWJzZW50ICgwKSwgaWRlbnRpY2FsIHRvIEhFQUQgKDEpLCBpZGVudGljYWwgdG8gV09SS0RJUiAoMiksIG9yIGRpZmZlcmVudCBmcm9tIFdPUktESVIgKDMpLlxuICpcbiAqIGBgYHRzXG4gKiB0eXBlIEZpbGVuYW1lICAgICAgPSBzdHJpbmdcbiAqIHR5cGUgSGVhZFN0YXR1cyAgICA9IDAgfCAxXG4gKiB0eXBlIFdvcmtkaXJTdGF0dXMgPSAwIHwgMSB8IDJcbiAqIHR5cGUgU3RhZ2VTdGF0dXMgICA9IDAgfCAxIHwgMiB8IDNcbiAqXG4gKiB0eXBlIFN0YXR1c1JvdyAgICAgPSBbRmlsZW5hbWUsIEhlYWRTdGF0dXMsIFdvcmtkaXJTdGF0dXMsIFN0YWdlU3RhdHVzXVxuICpcbiAqIHR5cGUgU3RhdHVzTWF0cml4ICA9IFN0YXR1c1Jvd1tdXG4gKiBgYGBcbiAqXG4gKiA+IFRoaW5rIG9mIHRoZSBuYXR1cmFsIHByb2dyZXNzaW9uIG9mIGZpbGUgbW9kaWZpY2F0aW9ucyBhcyBiZWluZyBmcm9tIEhFQUQgKHByZXZpb3VzKSAtPiBXT1JLRElSIChjdXJyZW50KSAtPiBTVEFHRSAobmV4dCkuXG4gKiA+IFRoZW4gSEVBRCBpcyBcInZlcnNpb24gMVwiLCBXT1JLRElSIGlzIFwidmVyc2lvbiAyXCIsIGFuZCBTVEFHRSBpcyBcInZlcnNpb24gM1wiLlxuICogPiBUaGVuLCBpbWFnaW5lIGEgXCJ2ZXJzaW9uIDBcIiB3aGljaCBpcyBiZWZvcmUgdGhlIGZpbGUgd2FzIGNyZWF0ZWQuXG4gKiA+IFRoZW4gdGhlIHN0YXR1cyB2YWx1ZSBpbiBlYWNoIGNvbHVtbiBjb3JyZXNwb25kcyB0byB0aGUgb2xkZXN0IHZlcnNpb24gb2YgdGhlIGZpbGUgaXQgaXMgaWRlbnRpY2FsIHRvLlxuICogPiAoRm9yIGEgZmlsZSB0byBiZSBpZGVudGljYWwgdG8gXCJ2ZXJzaW9uIDBcIiBtZWFucyB0aGUgZmlsZSBpcyBkZWxldGVkLilcbiAqXG4gKiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHF1ZXJpZXMgeW91IGNhbiBhbnN3ZXIgdXNpbmcgdGhlIHJlc3VsdDpcbiAqXG4gKiAjIyMjIFE6IFdoYXQgZmlsZXMgaGF2ZSBiZWVuIGRlbGV0ZWQ/XG4gKiBgYGBqc1xuICogY29uc3QgRklMRSA9IDAsIFdPUktESVIgPSAyXG4gKlxuICogY29uc3QgZmlsZW5hbWVzID0gKGF3YWl0IHN0YXR1c01hdHJpeCh7IGRpciB9KSlcbiAqICAgLmZpbHRlcihyb3cgPT4gcm93W1dPUktESVJdID09PSAwKVxuICogICAubWFwKHJvdyA9PiByb3dbRklMRV0pXG4gKiBgYGBcbiAqXG4gKiAjIyMjIFE6IFdoYXQgZmlsZXMgaGF2ZSB1bnN0YWdlZCBjaGFuZ2VzP1xuICogYGBganNcbiAqIGNvbnN0IEZJTEUgPSAwLCBXT1JLRElSID0gMiwgU1RBR0UgPSAzXG4gKlxuICogY29uc3QgZmlsZW5hbWVzID0gKGF3YWl0IHN0YXR1c01hdHJpeCh7IGRpciB9KSlcbiAqICAgLmZpbHRlcihyb3cgPT4gcm93W1dPUktESVJdICE9PSByb3dbU1RBR0VdKVxuICogICAubWFwKHJvdyA9PiByb3dbRklMRV0pXG4gKiBgYGBcbiAqXG4gKiAjIyMjIFE6IFdoYXQgZmlsZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNvbW1pdD9cbiAqIGBgYGpzXG4gKiBjb25zdCBGSUxFID0gMCwgSEVBRCA9IDEsIFdPUktESVIgPSAyXG4gKlxuICogY29uc3QgZmlsZW5hbWVzID0gKGF3YWl0IHN0YXR1c01hdHJpeCh7IGRpciB9KSlcbiAqICAgLmZpbHRlcihyb3cgPT4gcm93W0hFQURdICE9PSByb3dbV09SS0RJUl0pXG4gKiAgIC5tYXAocm93ID0+IHJvd1tGSUxFXSlcbiAqIGBgYFxuICpcbiAqICMjIyMgUTogV2hhdCBmaWxlcyB3aWxsIE5PVCBiZSBjaGFuZ2VkIGlmIEkgY29tbWl0IHJpZ2h0IG5vdz9cbiAqIGBgYGpzXG4gKiBjb25zdCBGSUxFID0gMCwgSEVBRCA9IDEsIFNUQUdFID0gM1xuICpcbiAqIGNvbnN0IGZpbGVuYW1lcyA9IChhd2FpdCBzdGF0dXNNYXRyaXgoeyBkaXIgfSkpXG4gKiAgIC5maWx0ZXIocm93ID0+IHJvd1tIRUFEXSA9PT0gcm93W1NUQUdFXSlcbiAqICAgLm1hcChyb3cgPT4gcm93W0ZJTEVdKVxuICogYGBgXG4gKlxuICogRm9yIHJlZmVyZW5jZSwgaGVyZSBhcmUgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9uczpcbiAqXG4gKiB8IEhFQUQgfCBXT1JLRElSIHwgU1RBR0UgfCBgZ2l0IHN0YXR1cyAtLXNob3J0YCBlcXVpdmFsZW50IHxcbiAqIHwgLS0tLSB8IC0tLS0tLS0gfCAtLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICogfCAwICAgIHwgMCAgICAgICB8IDAgICAgIHwgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IDAgICAgfCAwICAgICAgIHwgMyAgICAgfCBgQURgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgMCAgICB8IDIgICAgICAgfCAwICAgICB8IGA/P2AgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAwICAgIHwgMiAgICAgICB8IDIgICAgIHwgYEEgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IDAgICAgfCAyICAgICAgIHwgMyAgICAgfCBgQU1gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgMSAgICB8IDAgICAgICAgfCAwICAgICB8IGBEIGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAxICAgIHwgMCAgICAgICB8IDEgICAgIHwgYCBEYCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IDEgICAgfCAwICAgICAgIHwgMyAgICAgfCBgTURgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgMSAgICB8IDEgICAgICAgfCAwICAgICB8IGBEIGAgKyBgPz9gICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAxICAgIHwgMSAgICAgICB8IDEgICAgIHwgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IDEgICAgfCAxICAgICAgIHwgMyAgICAgfCBgTU1gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgMSAgICB8IDIgICAgICAgfCAwICAgICB8IGBEIGAgKyBgPz9gICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAxICAgIHwgMiAgICAgICB8IDEgICAgIHwgYCBNYCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IDEgICAgfCAyICAgICAgIHwgMiAgICAgfCBgTSBgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgMSAgICB8IDIgICAgICAgfCAzICAgICB8IGBNTWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRpciAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwgJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlZiA9ICdIRUFEJ10gLSBPcHRpb25hbGx5IHNwZWNpZnkgYSBkaWZmZXJlbnQgY29tbWl0IHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgd29ya2RpciBhbmQgc3RhZ2UgaW5zdGVhZCBvZiB0aGUgSEVBRFxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3MuZmlsZXBhdGhzID0gWycuJ11dIC0gTGltaXQgdGhlIHF1ZXJ5IHRvIHRoZSBnaXZlbiBmaWxlcyBhbmQgZGlyZWN0b3JpZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKTogYm9vbGVhbn0gW2FyZ3MuZmlsdGVyXSAtIEZpbHRlciB0aGUgcmVzdWx0cyB0byBvbmx5IHRob3NlIHdob3NlIGZpbGVwYXRoIG1hdGNoZXMgYSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pZ25vcmVkID0gZmFsc2VdIC0gaW5jbHVkZSBpZ25vcmVkIGZpbGVzIGluIHRoZSByZXN1bHRcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxTdGF0dXNSb3c+Pn0gUmVzb2x2ZXMgd2l0aCBhIHN0YXR1cyBtYXRyaXgsIGRlc2NyaWJlZCBiZWxvdy5cbiAqIEBzZWUgU3RhdHVzUm93XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXR1c01hdHJpeCh7XG4gIGZzOiBfZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIHJlZiA9ICdIRUFEJyxcbiAgZmlsZXBhdGhzID0gWycuJ10sXG4gIGZpbHRlcixcbiAgY2FjaGUgPSB7fSxcbiAgaWdub3JlZDogc2hvdWxkSWdub3JlID0gZmFsc2UsXG59KSB7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmcycsIF9mcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcigncmVmJywgcmVmKTtcblxuICAgIGNvbnN0IGZzID0gbmV3IEZpbGVTeXN0ZW0oX2ZzKTtcbiAgICByZXR1cm4gYXdhaXQgX3dhbGsoe1xuICAgICAgZnMsXG4gICAgICBjYWNoZSxcbiAgICAgIGRpcixcbiAgICAgIGdpdGRpcixcbiAgICAgIHRyZWVzOiBbVFJFRSh7IHJlZiB9KSwgV09SS0RJUigpLCBTVEFHRSgpXSxcbiAgICAgIG1hcDogYXN5bmMgZnVuY3Rpb24oZmlsZXBhdGgsIFtoZWFkLCB3b3JrZGlyLCBzdGFnZV0pIHtcbiAgICAgICAgLy8gSWdub3JlIGlnbm9yZWQgZmlsZXMsIGJ1dCBvbmx5IGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHRyYWNrZWQuXG4gICAgICAgIGlmICghaGVhZCAmJiAhc3RhZ2UgJiYgd29ya2Rpcikge1xuICAgICAgICAgIGlmICghc2hvdWxkSWdub3JlKSB7XG4gICAgICAgICAgICBjb25zdCBpc0lnbm9yZWQgPSBhd2FpdCBHaXRJZ25vcmVNYW5hZ2VyLmlzSWdub3JlZCh7XG4gICAgICAgICAgICAgIGZzLFxuICAgICAgICAgICAgICBkaXIsXG4gICAgICAgICAgICAgIGZpbGVwYXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNJZ25vcmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG1hdGNoIGFnYWluc3QgYmFzZSBwYXRoc1xuICAgICAgICBpZiAoIWZpbGVwYXRocy5zb21lKGJhc2UgPT4gd29ydGhXYWxraW5nKGZpbGVwYXRoLCBiYXNlKSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICAgIC8vIExhdGUgZmlsdGVyIGFnYWluc3QgZmlsZSBuYW1lc1xuICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgaWYgKCFmaWx0ZXIoZmlsZXBhdGgpKSByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtoZWFkVHlwZSwgd29ya2RpclR5cGUsIHN0YWdlVHlwZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgaGVhZCAmJiBoZWFkLnR5cGUoKSxcbiAgICAgICAgICB3b3JrZGlyICYmIHdvcmtkaXIudHlwZSgpLFxuICAgICAgICAgIHN0YWdlICYmIHN0YWdlLnR5cGUoKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3QgaXNCbG9iID0gW2hlYWRUeXBlLCB3b3JrZGlyVHlwZSwgc3RhZ2VUeXBlXS5pbmNsdWRlcygnYmxvYicpO1xuXG4gICAgICAgIC8vIEZvciBub3csIGJhaWwgb24gZGlyZWN0b3JpZXMgdW5sZXNzIHRoZSBmaWxlIGlzIGFsc28gYSBibG9iIGluIGFub3RoZXIgdHJlZVxuICAgICAgICBpZiAoKGhlYWRUeXBlID09PSAndHJlZScgfHwgaGVhZFR5cGUgPT09ICdzcGVjaWFsJykgJiYgIWlzQmxvYikgcmV0dXJuXG4gICAgICAgIGlmIChoZWFkVHlwZSA9PT0gJ2NvbW1pdCcpIHJldHVybiBudWxsXG5cbiAgICAgICAgaWYgKCh3b3JrZGlyVHlwZSA9PT0gJ3RyZWUnIHx8IHdvcmtkaXJUeXBlID09PSAnc3BlY2lhbCcpICYmICFpc0Jsb2IpXG4gICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgaWYgKHN0YWdlVHlwZSA9PT0gJ2NvbW1pdCcpIHJldHVybiBudWxsXG4gICAgICAgIGlmICgoc3RhZ2VUeXBlID09PSAndHJlZScgfHwgc3RhZ2VUeXBlID09PSAnc3BlY2lhbCcpICYmICFpc0Jsb2IpIHJldHVyblxuXG4gICAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIG9pZHMgZm9yIGZpbGVzLCB1c2luZyB0aGUgc3RhZ2VkIG9pZCBmb3IgdGhlIHdvcmtpbmcgZGlyIG9pZCBpZiB0aGUgc3RhdHMgbWF0Y2guXG4gICAgICAgIGNvbnN0IGhlYWRPaWQgPSBoZWFkVHlwZSA9PT0gJ2Jsb2InID8gYXdhaXQgaGVhZC5vaWQoKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc3RhZ2VPaWQgPSBzdGFnZVR5cGUgPT09ICdibG9iJyA/IGF3YWl0IHN0YWdlLm9pZCgpIDogdW5kZWZpbmVkO1xuICAgICAgICBsZXQgd29ya2Rpck9pZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGhlYWRUeXBlICE9PSAnYmxvYicgJiZcbiAgICAgICAgICB3b3JrZGlyVHlwZSA9PT0gJ2Jsb2InICYmXG4gICAgICAgICAgc3RhZ2VUeXBlICE9PSAnYmxvYidcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgTkVFRCB0aGUgc2hhLiBBbnkgc2hhIHdpbGwgZG9cbiAgICAgICAgICAvLyBUT0RPOiB1cGRhdGUgdGhpcyBsb2dpYyB0byBoYW5kbGUgTiB0cmVlcyBpbnN0ZWFkIG9mIGp1c3QgMy5cbiAgICAgICAgICB3b3JrZGlyT2lkID0gJzQyJztcbiAgICAgICAgfSBlbHNlIGlmICh3b3JrZGlyVHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgICAgICAgd29ya2Rpck9pZCA9IGF3YWl0IHdvcmtkaXIub2lkKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cnkgPSBbdW5kZWZpbmVkLCBoZWFkT2lkLCB3b3JrZGlyT2lkLCBzdGFnZU9pZF07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVudHJ5Lm1hcCh2YWx1ZSA9PiBlbnRyeS5pbmRleE9mKHZhbHVlKSk7XG4gICAgICAgIHJlc3VsdC5zaGlmdCgpOyAvLyByZW1vdmUgbGVhZGluZyB1bmRlZmluZWQgZW50cnlcbiAgICAgICAgcmV0dXJuIFtmaWxlcGF0aCwgLi4ucmVzdWx0XVxuICAgICAgfSxcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC5zdGF0dXNNYXRyaXgnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIENyZWF0ZSBhIGxpZ2h0d2VpZ2h0IHRhZ1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlZiAtIFdoYXQgdG8gbmFtZSB0aGUgdGFnXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Mub2JqZWN0ID0gJ0hFQUQnXSAtIFdoYXQgb2lkIHRoZSB0YWcgcmVmZXJzIHRvLiAoV2lsbCByZXNvbHZlIHRvIG9pZCBpZiB2YWx1ZSBpcyBhIHJlZi4pIEJ5IGRlZmF1bHQsIHRoZSBjb21taXQgb2JqZWN0IHdoaWNoIGlzIHJlZmVycmVkIGJ5IHRoZSBjdXJyZW50IGBIRUFEYCBpcyB1c2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JjZSA9IGZhbHNlXSAtIEluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IgaWYgYSB0YWcgbmFtZWQgYHJlZmAgYWxyZWFkeSBleGlzdHMsIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgdGFnLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2hlbiBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IGdpdC50YWcoeyBmcywgZGlyOiAnL3R1dG9yaWFsJywgcmVmOiAndGVzdC10YWcnIH0pXG4gKiBjb25zb2xlLmxvZygnZG9uZScpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiB0YWcoe1xuICBmczogX2ZzLFxuICBkaXIsXG4gIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLFxuICByZWYsXG4gIG9iamVjdCxcbiAgZm9yY2UgPSBmYWxzZSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgX2ZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdyZWYnLCByZWYpO1xuXG4gICAgY29uc3QgZnMgPSBuZXcgRmlsZVN5c3RlbShfZnMpO1xuXG4gICAgaWYgKHJlZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgTWlzc2luZ1BhcmFtZXRlckVycm9yKCdyZWYnKVxuICAgIH1cblxuICAgIHJlZiA9IHJlZi5zdGFydHNXaXRoKCdyZWZzL3RhZ3MvJykgPyByZWYgOiBgcmVmcy90YWdzLyR7cmVmfWA7XG5cbiAgICAvLyBSZXNvbHZlIHBhc3NlZCBvYmplY3RcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IEdpdFJlZk1hbmFnZXIucmVzb2x2ZSh7XG4gICAgICBmcyxcbiAgICAgIGdpdGRpcixcbiAgICAgIHJlZjogb2JqZWN0IHx8ICdIRUFEJyxcbiAgICB9KTtcblxuICAgIGlmICghZm9yY2UgJiYgKGF3YWl0IEdpdFJlZk1hbmFnZXIuZXhpc3RzKHsgZnMsIGdpdGRpciwgcmVmIH0pKSkge1xuICAgICAgdGhyb3cgbmV3IEFscmVhZHlFeGlzdHNFcnJvcigndGFnJywgcmVmKVxuICAgIH1cblxuICAgIGF3YWl0IEdpdFJlZk1hbmFnZXIud3JpdGVSZWYoeyBmcywgZ2l0ZGlyLCByZWYsIHZhbHVlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC50YWcnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFJlZ2lzdGVyIGZpbGUgY29udGVudHMgaW4gdGhlIHdvcmtpbmcgdHJlZSBvciBvYmplY3QgZGF0YWJhc2UgdG8gdGhlIGdpdCBpbmRleCAoYWthIHN0YWdpbmcgYXJlYSkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGlyIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCAnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5maWxlcGF0aCAtIEZpbGUgdG8gYWN0IHVwb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Mub2lkXSAtIE9JRCBvZiB0aGUgb2JqZWN0IGluIHRoZSBvYmplY3QgZGF0YWJhc2UgdG8gYWRkIHRvIHRoZSBpbmRleCB3aXRoIHRoZSBzcGVjaWZpZWQgZmlsZXBhdGguXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubW9kZSA9IDEwMDY0NF0gLSBUaGUgZmlsZSBtb2RlIHRvIGFkZCB0aGUgZmlsZSB0byB0aGUgaW5kZXguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmFkZF0gLSBBZGRzIHRoZSBzcGVjaWZpZWQgZmlsZSB0byB0aGUgaW5kZXggaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0IGluIHRoZSBpbmRleC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MucmVtb3ZlXSAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGZpbGUgZnJvbSB0aGUgaW5kZXggaWYgaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBhbnltb3JlLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JjZV0gLSBSZW1vdmUgdGhlIHNwZWNpZmllZCBmaWxlIGZyb20gdGhlIGluZGV4LCBldmVuIGlmIGl0IHN0aWxsIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlLlxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmNhY2hlXSAtIGEgW2NhY2hlXShjYWNoZS5tZCkgb2JqZWN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgdm9pZD59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIHRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlIG9iamVjdCB3cml0dGVuIG9yIHVwZGF0ZWQgaW4gdGhlIGluZGV4LCBvciBub3RoaW5nIGlmIHRoZSBmaWxlIHdhcyByZW1vdmVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBnaXQudXBkYXRlSW5kZXgoe1xuICogICBmcyxcbiAqICAgZGlyOiAnL3R1dG9yaWFsJyxcbiAqICAgZmlsZXBhdGg6ICdyZWFkbWUubWQnXG4gKiB9KVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNYW51YWxseSBjcmVhdGUgYSBibG9iIGluIHRoZSBvYmplY3QgZGF0YWJhc2UuXG4gKiBsZXQgb2lkID0gYXdhaXQgZ2l0LndyaXRlQmxvYih7XG4gKiAgIGZzLFxuICogICBkaXI6ICcvdHV0b3JpYWwnLFxuICogICBibG9iOiBuZXcgVWludDhBcnJheShbXSlcbiAqIH0pXG4gKlxuICogLy8gV3JpdGUgdGhlIG9iamVjdCBpbiB0aGUgb2JqZWN0IGRhdGFiYXNlIHRvIHRoZSBpbmRleC5cbiAqIGF3YWl0IGdpdC51cGRhdGVJbmRleCh7XG4gKiAgIGZzLFxuICogICBkaXI6ICcvdHV0b3JpYWwnLFxuICogICBhZGQ6IHRydWUsXG4gKiAgIGZpbGVwYXRoOiAncmVhZG1lLm1kJyxcbiAqICAgb2lkXG4gKiB9KVxuICovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVJbmRleCh7XG4gIGZzOiBfZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIGNhY2hlID0ge30sXG4gIGZpbGVwYXRoLFxuICBvaWQsXG4gIG1vZGUsXG4gIGFkZCxcbiAgcmVtb3ZlLFxuICBmb3JjZSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgX2ZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdmaWxlcGF0aCcsIGZpbGVwYXRoKTtcblxuICAgIGNvbnN0IGZzID0gbmV3IEZpbGVTeXN0ZW0oX2ZzKTtcblxuICAgIGlmIChyZW1vdmUpIHtcbiAgICAgIHJldHVybiBhd2FpdCBHaXRJbmRleE1hbmFnZXIuYWNxdWlyZShcbiAgICAgICAgeyBmcywgZ2l0ZGlyLCBjYWNoZSB9LFxuICAgICAgICBhc3luYyBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICAgIGxldCBmaWxlU3RhdHM7XG5cbiAgICAgICAgICBpZiAoIWZvcmNlKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBpcyBzdGlsbCBwcmVzZW50IGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICAgICAgZmlsZVN0YXRzID0gYXdhaXQgZnMubHN0YXQoam9pbihkaXIsIGZpbGVwYXRoKSk7XG5cbiAgICAgICAgICAgIGlmIChmaWxlU3RhdHMpIHtcbiAgICAgICAgICAgICAgaWYgKGZpbGVTdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZpbmcgZGlyZWN0b3JpZXMgc2hvdWxkIG5vdCB3b3JrXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRGaWxlcGF0aEVycm9yKCdkaXJlY3RvcnknKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gRG8gbm90aGluZyBpZiB3ZSBkb24ndCBmb3JjZSBhbmQgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIGluIHRoZSB3b3JrZGlyXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERpcmVjdG9yaWVzIGFyZSBub3QgYWxsb3dlZCwgc28gd2UgbWFrZSBzdXJlIHRoZSBwcm92aWRlZCBmaWxlcGF0aCBleGlzdHMgaW4gdGhlIGluZGV4XG4gICAgICAgICAgaWYgKGluZGV4Lmhhcyh7IGZpbGVwYXRoIH0pKSB7XG4gICAgICAgICAgICBpbmRleC5kZWxldGUoe1xuICAgICAgICAgICAgICBmaWxlcGF0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFRlc3QgaWYgaXQgaXMgYSBmaWxlIGFuZCBleGlzdHMgb24gZGlzayBpZiBgcmVtb3ZlYCBpcyBub3QgcHJvdmlkZWQsIG9ubHkgb2Ygbm8gb2lkIGlzIHByb3ZpZGVkXG4gICAgbGV0IGZpbGVTdGF0cztcblxuICAgIGlmICghb2lkKSB7XG4gICAgICBmaWxlU3RhdHMgPSBhd2FpdCBmcy5sc3RhdChqb2luKGRpciwgZmlsZXBhdGgpKTtcblxuICAgICAgaWYgKCFmaWxlU3RhdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgICAgYGZpbGUgYXQgXCIke2ZpbGVwYXRofVwiIG9uIGRpc2sgYW5kIFwicmVtb3ZlXCIgbm90IHNldGBcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZVN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRGaWxlcGF0aEVycm9yKCdkaXJlY3RvcnknKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBHaXRJbmRleE1hbmFnZXIuYWNxdWlyZSh7IGZzLCBnaXRkaXIsIGNhY2hlIH0sIGFzeW5jIGZ1bmN0aW9uKFxuICAgICAgaW5kZXhcbiAgICApIHtcbiAgICAgIGlmICghYWRkICYmICFpbmRleC5oYXMoeyBmaWxlcGF0aCB9KSkge1xuICAgICAgICAvLyBJZiB0aGUgaW5kZXggZG9lcyBub3QgY29udGFpbiB0aGUgZmlsZXBhdGggeWV0IGFuZCBgYWRkYCBpcyBub3Qgc2V0LCB3ZSBzaG91bGQgdGhyb3dcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgICAgYGZpbGUgYXQgXCIke2ZpbGVwYXRofVwiIGluIGluZGV4IGFuZCBcImFkZFwiIG5vdCBzZXRgXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gQnkgZGVmYXVsdCB3ZSB1c2UgMCBmb3IgdGhlIHN0YXRzIG9mIHRoZSBpbmRleCBmaWxlXG4gICAgICBsZXQgc3RhdHMgPSB7XG4gICAgICAgIGN0aW1lOiBuZXcgRGF0ZSgwKSxcbiAgICAgICAgbXRpbWU6IG5ldyBEYXRlKDApLFxuICAgICAgICBkZXY6IDAsXG4gICAgICAgIGlubzogMCxcbiAgICAgICAgbW9kZSxcbiAgICAgICAgdWlkOiAwLFxuICAgICAgICBnaWQ6IDAsXG4gICAgICAgIHNpemU6IDAsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIW9pZCkge1xuICAgICAgICBzdGF0cyA9IGZpbGVTdGF0cztcblxuICAgICAgICAvLyBXcml0ZSB0aGUgZmlsZSB0byB0aGUgb2JqZWN0IGRhdGFiYXNlXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHN0YXRzLmlzU3ltYm9saWNMaW5rKClcbiAgICAgICAgICA/IGF3YWl0IGZzLnJlYWRsaW5rKGpvaW4oZGlyLCBmaWxlcGF0aCkpXG4gICAgICAgICAgOiBhd2FpdCBmcy5yZWFkKGpvaW4oZGlyLCBmaWxlcGF0aCkpO1xuXG4gICAgICAgIG9pZCA9IGF3YWl0IF93cml0ZU9iamVjdCh7XG4gICAgICAgICAgZnMsXG4gICAgICAgICAgZ2l0ZGlyLFxuICAgICAgICAgIHR5cGU6ICdibG9iJyxcbiAgICAgICAgICBmb3JtYXQ6ICdjb250ZW50JyxcbiAgICAgICAgICBvYmplY3QsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpbmRleC5pbnNlcnQoe1xuICAgICAgICBmaWxlcGF0aCxcbiAgICAgICAgb2lkOiBvaWQsXG4gICAgICAgIHN0YXRzLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBvaWRcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC51cGRhdGVJbmRleCc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogUmV0dXJuIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBpc29tb3JwaGljLWdpdFxuICpcbiAqIEkgZG9uJ3Qga25vdyB3aHkgeW91IG1pZ2h0IG5lZWQgdGhpcy4gSSBhZGRlZCBpdCBqdXN0IHNvIEkgY291bGQgY2hlY2sgdGhhdCBJIHdhcyBnZXR0aW5nXG4gKiB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGFuZCBub3QgYSBjYWNoZWQgdmVyc2lvbi5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgdmVyc2lvbiBzdHJpbmcgdGFrZW4gZnJvbSBwYWNrYWdlLmpzb24gYXQgcHVibGljYXRpb24gdGltZVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zb2xlLmxvZyhnaXQudmVyc2lvbigpKVxuICpcbiAqL1xuZnVuY3Rpb24gdmVyc2lvbigpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGtnLnZlcnNpb25cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQudmVyc2lvbic7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQGNhbGxiYWNrIFdhbGtlck1hcFxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG4gKiBAcGFyYW0ge0FycmF5PFdhbGtlckVudHJ5IHwgbnVsbD59IGVudHJpZXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgV2Fsa2VyUmVkdWNlXG4gKiBAcGFyYW0ge2FueX0gcGFyZW50XG4gKiBAcGFyYW0ge2FueVtdfSBjaGlsZHJlblxuICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBXYWxrZXJJdGVyYXRlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7V2Fsa2VyRW50cnlbXX0gZW50cmllc1xuICogQHJldHVybnMge1Byb21pc2U8YW55W10+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFdhbGtlckl0ZXJhdGVcbiAqIEBwYXJhbSB7V2Fsa2VySXRlcmF0ZUNhbGxiYWNrfSB3YWxrXG4gKiBAcGFyYW0ge0l0ZXJhYmxlSXRlcmF0b3I8V2Fsa2VyRW50cnlbXT59IGNoaWxkcmVuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59XG4gKi9cblxuLyoqXG4gKiBBIHBvd2VyZnVsIHJlY3Vyc2l2ZSB0cmVlLXdhbGtpbmcgdXRpbGl0eS5cbiAqXG4gKiBUaGUgYHdhbGtgIEFQSSBzaW1wbGlmaWVzIGdhdGhlcmluZyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHRyZWUgb3IgY29tcGFyaW5nIGFsbCB0aGUgZmlsZXBhdGhzIGluIHR3byBvciBtb3JlIHRyZWVzLlxuICogVHJlZXMgY2FuIGJlIGdpdCBjb21taXRzLCB0aGUgd29ya2luZyBkaXJlY3RvcnksIG9yIHRoZSBvciBnaXQgaW5kZXggKHN0YWdpbmcgYXJlYSkuXG4gKiBBcyBsb25nIGFzIGEgZmlsZSBvciBkaXJlY3RvcnkgaXMgcHJlc2VudCBpbiBhdCBsZWFzdCBvbmUgb2YgdGhlIHRyZWVzLCBpdCB3aWxsIGJlIHRyYXZlcnNlZC5cbiAqIEVudHJpZXMgYXJlIHRyYXZlcnNlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIuXG4gKlxuICogVGhlIGFyZ3VtZW50cyB0byBgd2Fsa2AgYXJlIHRoZSBgdHJlZXNgIHlvdSB3YW50IHRvIHRyYXZlcnNlLCBhbmQgMyBvcHRpb25hbCB0cmFuc2Zvcm0gZnVuY3Rpb25zOlxuICogIGBtYXBgLCBgcmVkdWNlYCwgYW5kIGBpdGVyYXRlYC5cbiAqXG4gKiAjIyBgVFJFRWAsIGBXT1JLRElSYCwgYW5kIGBTVEFHRWBcbiAqXG4gKiBUcmVlIHdhbGtlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IHRocmVlIHNlcGFyYXRlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBpbXBvcnRlZDpcbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHsgVFJFRSwgV09SS0RJUiwgU1RBR0UgfSBmcm9tICdpc29tb3JwaGljLWdpdCdcbiAqIGBgYFxuICpcbiAqIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gb3BhcXVlIGhhbmRsZXMgY2FsbGVkIGBXYWxrZXJgcy5cbiAqIFRoZSBvbmx5IHRoaW5nIHRoYXQgYFdhbGtlcmAgb2JqZWN0cyBhcmUgZ29vZCBmb3IgaXMgcGFzc2luZyBpbnRvIGB3YWxrYC5cbiAqIEhlcmUgYXJlIHRoZSB0aHJlZSBgV2Fsa2VyYHMgcGFzc2VkIGludG8gYHdhbGtgIGJ5IHRoZSBgc3RhdHVzTWF0cml4YCBjb21tYW5kIGZvciBleGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBsZXQgcmVmID0gJ0hFQUQnXG4gKlxuICogbGV0IHRyZWVzID0gW1RSRUUoeyByZWYgfSksIFdPUktESVIoKSwgU1RBR0UoKV1cbiAqIGBgYFxuICpcbiAqIEZvciB0aGUgYXJndW1lbnRzLCBzZWUgdGhlIGRvYyBwYWdlcyBmb3IgW1RSRUVdKC4vVFJFRS5tZCksIFtXT1JLRElSXSguL1dPUktESVIubWQpLCBhbmQgW1NUQUdFXSguL1NUQUdFLm1kKS5cbiAqXG4gKiBgbWFwYCwgYHJlZHVjZWAsIGFuZCBgaXRlcmF0ZWAgYWxsb3cgeW91IGNvbnRyb2wgdGhlIHJlY3Vyc2l2ZSB3YWxrIGJ5IHBydW5pbmcgYW5kIHRyYW5zZm9ybWluZyBgV2Fsa2VyRW50cnlgcyBpbnRvIHRoZSBkZXNpcmVkIHJlc3VsdC5cbiAqXG4gKiAjIyBXYWxrZXJFbnRyeVxuICpcbiAqIHtAbGluayBXYWxrZXJFbnRyeSB0eXBlZGVmfVxuICpcbiAqIGBtYXBgIHJlY2VpdmVzIGFuIGFycmF5IG9mIGBXYWxrZXJFbnRyeVtdYCBhcyBpdHMgbWFpbiBhcmd1bWVudCwgb25lIGBXYWxrZXJFbnRyeWAgZm9yIGVhY2ggYFdhbGtlcmAgaW4gdGhlIGB0cmVlc2AgYXJndW1lbnQuXG4gKiBUaGUgbWV0aG9kcyBhcmUgbWVtb2l6ZWQgcGVyIGBXYWxrZXJFbnRyeWAgc28gY2FsbGluZyB0aGVtIG11bHRpcGxlIHRpbWVzIGluIGEgYG1hcGAgZnVuY3Rpb24gZG9lcyBub3QgYWR2ZXJzZWx5IGltcGFjdCBwZXJmb3JtYW5jZS5cbiAqIEJ5IG9ubHkgY29tcHV0aW5nIHRoZXNlIHZhbHVlcyBpZiBuZWVkZWQsIHlvdSBidWlsZCBjYW4gYnVpbGQgbGVhbiwgbWVhbiwgZWZmaWNpZW50IHdhbGtpbmcgbWFjaGluZXMuXG4gKlxuICogIyMjIFdhbGtlckVudHJ5I3R5cGUoKVxuICpcbiAqIFJldHVybnMgdGhlIGtpbmQgYXMgYSBzdHJpbmcuIFRoaXMgaXMgbm9ybWFsbHkgZWl0aGVyIGB0cmVlYCBvciBgYmxvYmAuXG4gKlxuICogYFRSRUVgLCBgU1RBR0VgLCBhbmQgYFdPUktESVJgIHdhbGtlcnMgYWxsIHJldHVybiBhIHN0cmluZy5cbiAqXG4gKiBQb3NzaWJsZSB2YWx1ZXM6XG4gKlxuICogLSBgJ3RyZWUnYCBkaXJlY3RvcnlcbiAqIC0gYCdibG9iJ2AgZmlsZVxuICogLSBgJ3NwZWNpYWwnYCB1c2VkIGJ5IGBXT1JLRElSYCB0byByZXByZXNlbnQgaXJyZWd1bGFyIGZpbGVzIGxpa2Ugc29ja2V0cyBhbmQgRklGT3NcbiAqIC0gYCdjb21taXQnYCB1c2VkIGJ5IGBUUkVFYCB0byByZXByZXNlbnQgc3VibW9kdWxlc1xuICpcbiAqIGBgYGpzXG4gKiBhd2FpdCBlbnRyeS50eXBlKClcbiAqIGBgYFxuICpcbiAqICMjIyBXYWxrZXJFbnRyeSNtb2RlKClcbiAqXG4gKiBSZXR1cm5zIHRoZSBmaWxlIG1vZGUgYXMgYSBudW1iZXIuIFVzZSB0aGlzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gcmVndWxhciBmaWxlcywgc3ltbGlua3MsIGFuZCBleGVjdXRhYmxlIGZpbGVzLlxuICpcbiAqIGBUUkVFYCwgYFNUQUdFYCwgYW5kIGBXT1JLRElSYCB3YWxrZXJzIGFsbCByZXR1cm4gYSBudW1iZXIgZm9yIGFsbCBgdHlwZWBzIG9mIGVudHJpZXMuXG4gKlxuICogSXQgaGFzIGJlZW4gbm9ybWFsaXplZCB0byBvbmUgb2YgdGhlIDQgdmFsdWVzIHRoYXQgYXJlIGFsbG93ZWQgaW4gZ2l0IGNvbW1pdHM6XG4gKlxuICogLSBgMG80MDAwMGAgZGlyZWN0b3J5XG4gKiAtIGAwbzEwMDY0NGAgZmlsZVxuICogLSBgMG8xMDA3NTVgIGZpbGUgKGV4ZWN1dGFibGUpXG4gKiAtIGAwbzEyMDAwMGAgc3ltbGlua1xuICpcbiAqIFRpcDogdG8gbWFrZSBtb2RlcyBtb3JlIHJlYWRhYmxlLCB5b3UgY2FuIHByaW50IHRoZW0gdG8gb2N0YWwgdXNpbmcgYC50b1N0cmluZyg4KWAuXG4gKlxuICogYGBganNcbiAqIGF3YWl0IGVudHJ5Lm1vZGUoKVxuICogYGBgXG4gKlxuICogIyMjIFdhbGtlckVudHJ5I29pZCgpXG4gKlxuICogUmV0dXJucyB0aGUgU0hBLTEgb2JqZWN0IGlkIGZvciBibG9icyBhbmQgdHJlZXMuXG4gKlxuICogYFRSRUVgIHdhbGtlcnMgcmV0dXJuIGEgc3RyaW5nIGZvciBgYmxvYmAgYW5kIGB0cmVlYCBlbnRyaWVzLlxuICpcbiAqIGBTVEFHRWAgYW5kIGBXT1JLRElSYCB3YWxrZXJzIHJldHVybiBhIHN0cmluZyBmb3IgYGJsb2JgIGVudHJpZXMgYW5kIGB1bmRlZmluZWRgIGZvciBgdHJlZWAgZW50cmllcy5cbiAqXG4gKiBgYGBqc1xuICogYXdhaXQgZW50cnkub2lkKClcbiAqIGBgYFxuICpcbiAqICMjIyBXYWxrZXJFbnRyeSNjb250ZW50KClcbiAqXG4gKiBSZXR1cm5zIHRoZSBmaWxlIGNvbnRlbnRzIGFzIGEgQnVmZmVyLlxuICpcbiAqIGBUUkVFYCBhbmQgYFdPUktESVJgIHdhbGtlcnMgcmV0dXJuIGEgQnVmZmVyIGZvciBgYmxvYmAgZW50cmllcyBhbmQgYHVuZGVmaW5lZGAgZm9yIGB0cmVlYCBlbnRyaWVzLlxuICpcbiAqIGBTVEFHRWAgd2Fsa2VycyBhbHdheXMgcmV0dXJuIGB1bmRlZmluZWRgIHNpbmNlIHRoZSBmaWxlIGNvbnRlbnRzIGFyZSBuZXZlciBzdG9yZWQgaW4gdGhlIHN0YWdlLlxuICpcbiAqIGBgYGpzXG4gKiBhd2FpdCBlbnRyeS5jb250ZW50KClcbiAqIGBgYFxuICpcbiAqICMjIyBXYWxrZXJFbnRyeSNzdGF0KClcbiAqXG4gKiBSZXR1cm5zIGEgbm9ybWFsaXplZCBzdWJzZXQgb2YgZmlsZXN5c3RlbSBTdGF0IGRhdGEuXG4gKlxuICogYFdPUktESVJgIHdhbGtlcnMgcmV0dXJuIGEgYFN0YXRgIGZvciBgYmxvYmAgYW5kIGB0cmVlYCBlbnRyaWVzLlxuICpcbiAqIGBTVEFHRWAgd2Fsa2VycyByZXR1cm4gYSBgU3RhdGAgZm9yIGBibG9iYCBlbnRyaWVzIGFuZCBgdW5kZWZpbmVkYCBmb3IgYHRyZWVgIGVudHJpZXMuXG4gKlxuICogYFRSRUVgIHdhbGtlcnMgcmV0dXJuIGB1bmRlZmluZWRgIGZvciBhbGwgZW50cnkgdHlwZXMuXG4gKlxuICogYGBganNcbiAqIGF3YWl0IGVudHJ5LnN0YXQoKVxuICogYGBgXG4gKlxuICoge0BsaW5rIFN0YXQgdHlwZWRlZn1cbiAqXG4gKiAjIyBtYXAoc3RyaW5nLCBBcnJheTxXYWxrZXJFbnRyeXxudWxsPikgPT4gUHJvbWlzZTxhbnk+XG4gKlxuICoge0BsaW5rIFdhbGtlck1hcCB0eXBlZGVmfVxuICpcbiAqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9uY2UgcGVyIGVudHJ5IEJFRk9SRSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhhdCBub2RlLlxuICpcbiAqIElmIHlvdSByZXR1cm4gYG51bGxgIGZvciBhIGB0cmVlYCBlbnRyeSwgdGhlbiBub25lIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGF0IGB0cmVlYCBlbnRyeSB3aWxsIGJlIHdhbGtlZC5cbiAqXG4gKiBUaGlzIGlzIGEgZ29vZCBwbGFjZSBmb3IgcXVlcnkgbG9naWMsIHN1Y2ggYXMgZXhhbWluaW5nIHRoZSBjb250ZW50cyBvZiBhIGZpbGUuXG4gKiBVbHRpbWF0ZWx5LCBjb21wYXJlIGFsbCB0aGUgZW50cmllcyBhbmQgcmV0dXJuIGFueSB2YWx1ZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluLlxuICogSWYgeW91IGRvIG5vdCByZXR1cm4gYSB2YWx1ZSAob3IgcmV0dXJuIHVuZGVmaW5lZCkgdGhhdCBlbnRyeSB3aWxsIGJlIGZpbHRlcmVkIGZyb20gdGhlIHJlc3VsdHMuXG4gKlxuICogRXhhbXBsZSAxOiBGaW5kIGFsbCB0aGUgZmlsZXMgY29udGFpbmluZyB0aGUgd29yZCAnZm9vJy5cbiAqIGBgYGpzXG4gKiBhc3luYyBmdW5jdGlvbiBtYXAoZmlsZXBhdGgsIFtoZWFkLCB3b3JrZGlyXSkge1xuICogICBsZXQgY29udGVudCA9IChhd2FpdCB3b3JrZGlyLmNvbnRlbnQoKSkudG9TdHJpbmcoJ3V0ZjgnKVxuICogICBpZiAoY29udGVudC5jb250YWlucygnZm9vJykpIHtcbiAqICAgICByZXR1cm4ge1xuICogICAgICAgZmlsZXBhdGgsXG4gKiAgICAgICBjb250ZW50XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBFeGFtcGxlIDI6IFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgdGhlIEhFQUQgY29tbWl0XG4gKiBgYGBqc1xuICogY29uc3QgbWFwID0gYXN5bmMgKGZpbGVwYXRoLCBbaGVhZCwgd29ya2Rpcl0pID0+IHtcbiAqICAgcmV0dXJuIHtcbiAqICAgICBmaWxlcGF0aCxcbiAqICAgICBvaWQ6IGF3YWl0IGhlYWQ/Lm9pZCgpLFxuICogICAgIGRpZmY6IGRpZmYoXG4gKiAgICAgICAoYXdhaXQgaGVhZD8uY29udGVudCgpKT8udG9TdHJpbmcoJ3V0ZjgnKSB8fCAnJyxcbiAqICAgICAgIChhd2FpdCB3b3JrZGlyPy5jb250ZW50KCkpPy50b1N0cmluZygndXRmOCcpIHx8ICcnXG4gKiAgICAgKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBFeGFtcGxlIDM6XG4gKiBgYGBqc1xuICogbGV0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAqIC8vIE9ubHkgZXhhbWluZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGBjd2RgXG4gKiBsZXQgY3dkID0gJ3NyYy9hcHAnXG4gKiBhc3luYyBmdW5jdGlvbiBtYXAgKGZpbGVwYXRoLCBbaGVhZCwgd29ya2Rpciwgc3RhZ2VdKSB7XG4gKiAgIGlmIChcbiAqICAgICAvLyBkb24ndCBza2lwIHRoZSByb290IGRpcmVjdG9yeVxuICogICAgIGhlYWQuZnVsbHBhdGggIT09ICcuJyAmJlxuICogICAgIC8vIHJldHVybiB0cnVlIGZvciAnc3JjJyBhbmQgJ3NyYy9hcHAnXG4gKiAgICAgIWN3ZC5zdGFydHNXaXRoKGZpbGVwYXRoKSAmJlxuICogICAgIC8vIHJldHVybiB0cnVlIGZvciAnc3JjL2FwcC8qJ1xuICogICAgIHBhdGguZGlybmFtZShmaWxlcGF0aCkgIT09IGN3ZFxuICogICApIHtcbiAqICAgICByZXR1cm4gbnVsbFxuICogICB9IGVsc2Uge1xuICogICAgIHJldHVybiBmaWxlcGF0aFxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyByZWR1Y2UocGFyZW50LCBjaGlsZHJlbilcbiAqXG4gKiB7QGxpbmsgV2Fsa2VyUmVkdWNlIHR5cGVkZWZ9XG4gKlxuICogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb25jZSBwZXIgZW50cnkgQUZURVIgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoYXQgbm9kZS5cbiAqXG4gKiBEZWZhdWx0OiBgYXN5bmMgKHBhcmVudCwgY2hpbGRyZW4pID0+IHBhcmVudCA9PT0gdW5kZWZpbmVkID8gY2hpbGRyZW4uZmxhdCgpIDogW3BhcmVudCwgY2hpbGRyZW5dLmZsYXQoKWBcbiAqXG4gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYWxsIGRpcmVjdG9yaWVzIGFuZCBjaGlsZHJlbiBpbiBhIGdpYW50IGZsYXQgYXJyYXkuXG4gKiBZb3UgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBhY2N1bXVsYXRpb24gbWV0aG9kIHRob3VnaC5cbiAqXG4gKiBFeGFtcGxlOiBSZXR1cm4gYSBoaWVyYXJjaGljYWwgc3RydWN0dXJlXG4gKiBgYGBqc1xuICogYXN5bmMgZnVuY3Rpb24gcmVkdWNlIChwYXJlbnQsIGNoaWxkcmVuKSB7XG4gKiAgIHJldHVybiBPYmplY3QuYXNzaWduKHBhcmVudCwgeyBjaGlsZHJlbiB9KVxuICogfVxuICogYGBgXG4gKlxuICogIyMgaXRlcmF0ZSh3YWxrLCBjaGlsZHJlbilcbiAqXG4gKiB7QGxpbmsgV2Fsa2VySXRlcmF0ZSB0eXBlZGVmfVxuICpcbiAqIHtAbGluayBXYWxrZXJJdGVyYXRlQ2FsbGJhY2sgdHlwZWRlZn1cbiAqXG4gKiBEZWZhdWx0OiBgKHdhbGssIGNoaWxkcmVuKSA9PiBQcm9taXNlLmFsbChbLi4uY2hpbGRyZW5dLm1hcCh3YWxrKSlgXG4gKlxuICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmVjdXJzZXMgYWxsIGNoaWxkcmVuIGNvbmN1cnJlbnRseSB1c2luZyBQcm9taXNlLmFsbC5cbiAqIEhvd2V2ZXIgeW91IGNvdWxkIHVzZSBhIGN1c3RvbSBmdW5jdGlvbiB0byB0cmF2ZXJzZSBjaGlsZHJlbiBzZXJpYWxseSBvciB1c2UgYSBnbG9iYWwgcXVldWUgdG8gdGhyb3R0bGUgcmVjdXJzaW9uLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge0ZzQ2xpZW50fSBhcmdzLmZzIC0gYSBmaWxlIHN5c3RlbSBjbGllbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kaXJdIC0gVGhlIFt3b3JraW5nIHRyZWVdKGRpci12cy1naXRkaXIubWQpIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2l0ZGlyPWpvaW4oZGlyLCcuZ2l0JyldIC0gW3JlcXVpcmVkXSBUaGUgW2dpdCBkaXJlY3RvcnldKGRpci12cy1naXRkaXIubWQpIHBhdGhcbiAqIEBwYXJhbSB7V2Fsa2VyW119IGFyZ3MudHJlZXMgLSBUaGUgdHJlZXMgeW91IHdhbnQgdG8gdHJhdmVyc2VcbiAqIEBwYXJhbSB7V2Fsa2VyTWFwfSBbYXJncy5tYXBdIC0gVHJhbnNmb3JtIGBXYWxrZXJFbnRyeWBzIGludG8gYSByZXN1bHQgZm9ybVxuICogQHBhcmFtIHtXYWxrZXJSZWR1Y2V9IFthcmdzLnJlZHVjZV0gLSBDb250cm9sIGhvdyBtYXBwZWQgZW50cmllcyBhcmUgY29tYmluZWQgd2l0aCB0aGVpciBwYXJlbnQgcmVzdWx0XG4gKiBAcGFyYW0ge1dhbGtlckl0ZXJhdGV9IFthcmdzLml0ZXJhdGVdIC0gRmluZS10dW5lIGhvdyBlbnRyaWVzIHdpdGhpbiBhIHRyZWUgYXJlIGl0ZXJhdGVkIG92ZXJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5jYWNoZV0gLSBhIFtjYWNoZV0oY2FjaGUubWQpIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFRoZSBmaW5pc2hlZCB0cmVlLXdhbGtpbmcgcmVzdWx0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhbGsoe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgdHJlZXMsXG4gIG1hcCxcbiAgcmVkdWNlLFxuICBpdGVyYXRlLFxuICBjYWNoZSA9IHt9LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcigndHJlZXMnLCB0cmVlcyk7XG5cbiAgICByZXR1cm4gYXdhaXQgX3dhbGsoe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGNhY2hlLFxuICAgICAgZGlyLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgdHJlZXMsXG4gICAgICBtYXAsXG4gICAgICByZWR1Y2UsXG4gICAgICBpdGVyYXRlLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LndhbGsnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFdyaXRlIGEgYmxvYiBvYmplY3QgZGlyZWN0bHlcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGFyZ3MuYmxvYiAtIFRoZSBibG9iIG9iamVjdCB0byB3cml0ZVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIHRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlIG5ld2x5IHdyaXR0ZW4gb2JqZWN0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE1hbnVhbGx5IGNyZWF0ZSBhIGJsb2IuXG4gKiBsZXQgb2lkID0gYXdhaXQgZ2l0LndyaXRlQmxvYih7XG4gKiAgIGZzLFxuICogICBkaXI6ICcvdHV0b3JpYWwnLFxuICogICBibG9iOiBuZXcgVWludDhBcnJheShbXSlcbiAqIH0pXG4gKlxuICogY29uc29sZS5sb2coJ29pZCcsIG9pZCkgLy8gc2hvdWxkIGJlICdlNjlkZTI5YmIyZDFkNjQzNGI4YjI5YWU3NzVhZDhjMmU0OGM1MzkxJ1xuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVCbG9iKHsgZnMsIGRpciwgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksIGJsb2IgfSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcignYmxvYicsIGJsb2IpO1xuXG4gICAgcmV0dXJuIGF3YWl0IF93cml0ZU9iamVjdCh7XG4gICAgICBmczogbmV3IEZpbGVTeXN0ZW0oZnMpLFxuICAgICAgZ2l0ZGlyLFxuICAgICAgdHlwZTogJ2Jsb2InLFxuICAgICAgb2JqZWN0OiBibG9iLFxuICAgICAgZm9ybWF0OiAnY29udGVudCcsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQud3JpdGVCbG9iJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge0NvbW1pdE9iamVjdH0gYXJncy5jb21taXRcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICogQHNlZSBDb21taXRPYmplY3RcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF93cml0ZUNvbW1pdCh7IGZzLCBnaXRkaXIsIGNvbW1pdCB9KSB7XG4gIC8vIENvbnZlcnQgb2JqZWN0IHRvIGJ1ZmZlclxuICBjb25zdCBvYmplY3QgPSBHaXRDb21taXQuZnJvbShjb21taXQpLnRvT2JqZWN0KCk7XG4gIGNvbnN0IG9pZCA9IGF3YWl0IF93cml0ZU9iamVjdCh7XG4gICAgZnMsXG4gICAgZ2l0ZGlyLFxuICAgIHR5cGU6ICdjb21taXQnLFxuICAgIG9iamVjdCxcbiAgICBmb3JtYXQ6ICdjb250ZW50JyxcbiAgfSk7XG4gIHJldHVybiBvaWRcbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogV3JpdGUgYSBjb21taXQgb2JqZWN0IGRpcmVjdGx5XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtDb21taXRPYmplY3R9IGFyZ3MuY29tbWl0IC0gVGhlIG9iamVjdCB0byB3cml0ZVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIHRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlIG5ld2x5IHdyaXR0ZW4gb2JqZWN0XG4gKiBAc2VlIENvbW1pdE9iamVjdFxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVDb21taXQoe1xuICBmcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgY29tbWl0LFxufSkge1xuICB0cnkge1xuICAgIGFzc2VydFBhcmFtZXRlcignZnMnLCBmcyk7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdnaXRkaXInLCBnaXRkaXIpO1xuICAgIGFzc2VydFBhcmFtZXRlcignY29tbWl0JywgY29tbWl0KTtcblxuICAgIHJldHVybiBhd2FpdCBfd3JpdGVDb21taXQoe1xuICAgICAgZnM6IG5ldyBGaWxlU3lzdGVtKGZzKSxcbiAgICAgIGdpdGRpcixcbiAgICAgIGNvbW1pdCxcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC53cml0ZUNvbW1pdCc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogV3JpdGUgYSBnaXQgb2JqZWN0IGRpcmVjdGx5XG4gKlxuICogYGZvcm1hdGAgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6XG4gKlxuICogfCBwYXJhbSAgICAgIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IC0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAqIHwgJ2RlZmxhdGVkJyB8IFRyZWF0IGBvYmplY3RgIGFzIHRoZSByYXcgZGVmbGF0ZS1jb21wcmVzc2VkIGJ1ZmZlciBmb3IgYW4gb2JqZWN0LCBtZWFuaW5nIGNhbiBiZSB3cml0dGVuIHRvIGAuZ2l0L29iamVjdHMvKipgIGFzLWlzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICd3cmFwcGVkJyAgfCBUcmVhdCBgb2JqZWN0YCBhcyB0aGUgaW5mbGF0ZWQgb2JqZWN0IGJ1ZmZlciB3cmFwcGVkIGluIHRoZSBnaXQgb2JqZWN0IGhlYWRlci4gVGhpcyBpcyB0aGUgcmF3IGJ1ZmZlciB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIFNIQS0xIG9iamVjdCBpZCBvZiBhIGdpdCBvYmplY3QuIHxcbiAqIHwgJ2NvbnRlbnQnICB8IFRyZWF0IGBvYmplY3RgIGFzIHRoZSBvYmplY3QgYnVmZmVyIHdpdGhvdXQgdGhlIGdpdCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAncGFyc2VkJyAgIHwgVHJlYXQgYG9iamVjdGAgYXMgYSBwYXJzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKlxuICogSWYgYGZvcm1hdGAgaXMgYCdwYXJzZWQnYCwgdGhlbiBgb2JqZWN0YCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgc2NoZW1hcyBmb3IgYENvbW1pdE9iamVjdGAsIGBUcmVlT2JqZWN0YCwgYFRhZ09iamVjdGAsIG9yIGEgYHN0cmluZ2AgKGZvciBibG9icykuXG4gKlxuICoge0BsaW5rIENvbW1pdE9iamVjdCB0eXBlZGVmfVxuICpcbiAqIHtAbGluayBUcmVlT2JqZWN0IHR5cGVkZWZ9XG4gKlxuICoge0BsaW5rIFRhZ09iamVjdCB0eXBlZGVmfVxuICpcbiAqIElmIGBmb3JtYXRgIGlzIGAnY29udGVudCdgLCBgJ3dyYXBwZWQnYCwgb3IgYCdkZWZsYXRlZCdgLCBgb2JqZWN0YCBzaG91bGQgYmUgYSBgVWludDhBcnJheWAuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqID4gVGhpcyBjb21tYW5kIGlzIG92ZXJseSBjb21wbGljYXRlZC5cbiAqID5cbiAqID4gSWYgeW91IGtub3cgdGhlIHR5cGUgb2Ygb2JqZWN0IHlvdSBhcmUgd3JpdGluZywgdXNlIFtgd3JpdGVCbG9iYF0oLi93cml0ZUJsb2IubWQpLCBbYHdyaXRlQ29tbWl0YF0oLi93cml0ZUNvbW1pdC5tZCksIFtgd3JpdGVUYWdgXSguL3dyaXRlVGFnLm1kKSwgb3IgW2B3cml0ZVRyZWVgXSguL3dyaXRlVHJlZS5tZCkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmcgfCBVaW50OEFycmF5IHwgQ29tbWl0T2JqZWN0IHwgVHJlZU9iamVjdCB8IFRhZ09iamVjdH0gYXJncy5vYmplY3QgLSBUaGUgb2JqZWN0IHRvIHdyaXRlLlxuICogQHBhcmFtIHsnYmxvYid8J3RyZWUnfCdjb21taXQnfCd0YWcnfSBbYXJncy50eXBlXSAtIFRoZSBraW5kIG9mIG9iamVjdCB0byB3cml0ZS5cbiAqIEBwYXJhbSB7J2RlZmxhdGVkJyB8ICd3cmFwcGVkJyB8ICdjb250ZW50JyB8ICdwYXJzZWQnfSBbYXJncy5mb3JtYXQgPSAncGFyc2VkJ10gLSBXaGF0IGZvcm1hdCB0aGUgb2JqZWN0IGlzIGluLiBUaGUgcG9zc2libGUgY2hvaWNlcyBhcmUgbGlzdGVkIGJlbG93LlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLm9pZF0gLSBJZiBgZm9ybWF0YCBpcyBgJ2RlZmxhdGVkJ2AgdGhlbiB0aGlzIHBhcmFtIGlzIHJlcXVpcmVkLiBPdGhlcndpc2UgaXQgaXMgY2FsY3VsYXRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5lbmNvZGluZ10gLSBJZiBgdHlwZWAgaXMgYCdibG9iJ2AgdGhlbiBgb2JqZWN0YCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFVpbnQ4QXJyYXkgdXNpbmcgYGVuY29kaW5nYC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCB0aGUgU0hBLTEgb2JqZWN0IGlkIG9mIHRoZSBuZXdseSB3cml0dGVuIG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTWFudWFsbHkgY3JlYXRlIGFuIGFubm90YXRlZCB0YWcuXG4gKiBsZXQgc2hhID0gYXdhaXQgZ2l0LnJlc29sdmVSZWYoeyBmcywgZGlyOiAnL3R1dG9yaWFsJywgcmVmOiAnSEVBRCcgfSlcbiAqIGNvbnNvbGUubG9nKCdjb21taXQnLCBzaGEpXG4gKlxuICogbGV0IG9pZCA9IGF3YWl0IGdpdC53cml0ZU9iamVjdCh7XG4gKiAgIGZzLFxuICogICBkaXI6ICcvdHV0b3JpYWwnLFxuICogICB0eXBlOiAndGFnJyxcbiAqICAgb2JqZWN0OiB7XG4gKiAgICAgb2JqZWN0OiBzaGEsXG4gKiAgICAgdHlwZTogJ2NvbW1pdCcsXG4gKiAgICAgdGFnOiAnbXktdGFnJyxcbiAqICAgICB0YWdnZXI6IHtcbiAqICAgICAgIG5hbWU6ICd5b3VyIG5hbWUnLFxuICogICAgICAgZW1haWw6ICdlbWFpbEBleGFtcGxlLmNvbScsXG4gKiAgICAgICB0aW1lc3RhbXA6IE1hdGguZmxvb3IoRGF0ZS5ub3coKS8xMDAwKSxcbiAqICAgICAgIHRpbWV6b25lT2Zmc2V0OiBuZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KClcbiAqICAgICB9LFxuICogICAgIG1lc3NhZ2U6ICdPcHRpb25hbCBtZXNzYWdlJ1xuICogICB9XG4gKiB9KVxuICpcbiAqIGNvbnNvbGUubG9nKCd0YWcnLCBvaWQpXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZU9iamVjdCh7XG4gIGZzOiBfZnMsXG4gIGRpcixcbiAgZ2l0ZGlyID0gam9pbihkaXIsICcuZ2l0JyksXG4gIHR5cGUsXG4gIG9iamVjdCxcbiAgZm9ybWF0ID0gJ3BhcnNlZCcsXG4gIG9pZCxcbiAgZW5jb2RpbmcgPSB1bmRlZmluZWQsXG59KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZnMgPSBuZXcgRmlsZVN5c3RlbShfZnMpO1xuICAgIC8vIENvbnZlcnQgb2JqZWN0IHRvIGJ1ZmZlclxuICAgIGlmIChmb3JtYXQgPT09ICdwYXJzZWQnKSB7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnY29tbWl0JzpcbiAgICAgICAgICBvYmplY3QgPSBHaXRDb21taXQuZnJvbShvYmplY3QpLnRvT2JqZWN0KCk7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndHJlZSc6XG4gICAgICAgICAgb2JqZWN0ID0gR2l0VHJlZS5mcm9tKG9iamVjdCkudG9PYmplY3QoKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdibG9iJzpcbiAgICAgICAgICBvYmplY3QgPSBCdWZmZXIuZnJvbShvYmplY3QsIGVuY29kaW5nKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICd0YWcnOlxuICAgICAgICAgIG9iamVjdCA9IEdpdEFubm90YXRlZFRhZy5mcm9tKG9iamVjdCkudG9PYmplY3QoKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBPYmplY3RUeXBlRXJyb3Iob2lkIHx8ICcnLCB0eXBlLCAnYmxvYnxjb21taXR8dGFnfHRyZWUnKVxuICAgICAgfVxuICAgICAgLy8gR2l0T2JqZWN0TWFuYWdlciBkb2VzIG5vdCBrbm93IGhvdyB0byBzZXJpYWxpemUgY29udGVudCwgc28gd2UgdHdlYWsgdGhhdCBwYXJhbWV0ZXIgYmVmb3JlIHBhc3NpbmcgaXQuXG4gICAgICBmb3JtYXQgPSAnY29udGVudCc7XG4gICAgfVxuICAgIG9pZCA9IGF3YWl0IF93cml0ZU9iamVjdCh7XG4gICAgICBmcyxcbiAgICAgIGdpdGRpcixcbiAgICAgIHR5cGUsXG4gICAgICBvYmplY3QsXG4gICAgICBvaWQsXG4gICAgICBmb3JtYXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIG9pZFxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIuY2FsbGVyID0gJ2dpdC53cml0ZU9iamVjdCc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogV3JpdGUgYSByZWYgd2hpY2ggcmVmZXJzIHRvIHRoZSBzcGVjaWZpZWQgU0hBLTEgb2JqZWN0IGlkLCBvciBhIHN5bWJvbGljIHJlZiB3aGljaCByZWZlcnMgdG8gdGhlIHNwZWNpZmllZCByZWYuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVmIC0gVGhlIG5hbWUgb2YgdGhlIHJlZiB0byB3cml0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmFsdWUgLSBXaGVuIGBzeW1ib2xpY2AgaXMgZmFsc2UsIGEgcmVmIG9yIGFuIFNIQS0xIG9iamVjdCBpZC4gV2hlbiB0cnVlLCBhIHJlZiBzdGFydGluZyB3aXRoIGByZWZzL2AuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmZvcmNlID0gZmFsc2VdIC0gSW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvciBpZiBhIHJlZiBuYW1lZCBgcmVmYCBhbHJlYWR5IGV4aXN0cywgb3ZlcndyaXRlIHRoZSBleGlzdGluZyByZWYuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnN5bWJvbGljID0gZmFsc2VdIC0gV2hldGhlciB0aGUgcmVmIGlzIHN5bWJvbGljIG9yIG5vdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gZmlsZXN5c3RlbSBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBnaXQud3JpdGVSZWYoe1xuICogICBmcyxcbiAqICAgZGlyOiAnL3R1dG9yaWFsJyxcbiAqICAgcmVmOiAncmVmcy9oZWFkcy9hbm90aGVyLWJyYW5jaCcsXG4gKiAgIHZhbHVlOiAnSEVBRCdcbiAqIH0pXG4gKiBhd2FpdCBnaXQud3JpdGVSZWYoe1xuICogICBmcyxcbiAqICAgZGlyOiAnL3R1dG9yaWFsJyxcbiAqICAgcmVmOiAnSEVBRCcsXG4gKiAgIHZhbHVlOiAncmVmcy9oZWFkcy9hbm90aGVyLWJyYW5jaCcsXG4gKiAgIGZvcmNlOiB0cnVlLFxuICogICBzeW1ib2xpYzogdHJ1ZVxuICogfSlcbiAqIGNvbnNvbGUubG9nKCdkb25lJylcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUmVmKHtcbiAgZnM6IF9mcyxcbiAgZGlyLFxuICBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSxcbiAgcmVmLFxuICB2YWx1ZSxcbiAgZm9yY2UgPSBmYWxzZSxcbiAgc3ltYm9saWMgPSBmYWxzZSxcbn0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgX2ZzKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2dpdGRpcicsIGdpdGRpcik7XG4gICAgYXNzZXJ0UGFyYW1ldGVyKCdyZWYnLCByZWYpO1xuICAgIGFzc2VydFBhcmFtZXRlcigndmFsdWUnLCB2YWx1ZSk7XG5cbiAgICBjb25zdCBmcyA9IG5ldyBGaWxlU3lzdGVtKF9mcyk7XG5cbiAgICBpZiAocmVmICE9PSBjbGVhbkdpdFJlZi5jbGVhbihyZWYpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFJlZk5hbWVFcnJvcihyZWYsIGNsZWFuR2l0UmVmLmNsZWFuKHJlZikpXG4gICAgfVxuXG4gICAgaWYgKCFmb3JjZSAmJiAoYXdhaXQgR2l0UmVmTWFuYWdlci5leGlzdHMoeyBmcywgZ2l0ZGlyLCByZWYgfSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQWxyZWFkeUV4aXN0c0Vycm9yKCdyZWYnLCByZWYpXG4gICAgfVxuXG4gICAgaWYgKHN5bWJvbGljKSB7XG4gICAgICBhd2FpdCBHaXRSZWZNYW5hZ2VyLndyaXRlU3ltYm9saWNSZWYoe1xuICAgICAgICBmcyxcbiAgICAgICAgZ2l0ZGlyLFxuICAgICAgICByZWYsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gYXdhaXQgR2l0UmVmTWFuYWdlci5yZXNvbHZlKHtcbiAgICAgICAgZnMsXG4gICAgICAgIGdpdGRpcixcbiAgICAgICAgcmVmOiB2YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgR2l0UmVmTWFuYWdlci53cml0ZVJlZih7XG4gICAgICAgIGZzLFxuICAgICAgICBnaXRkaXIsXG4gICAgICAgIHJlZixcbiAgICAgICAgdmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LndyaXRlUmVmJztcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtpbXBvcnQoJy4uL21vZGVscy9GaWxlU3lzdGVtLmpzJykuRmlsZVN5c3RlbX0gYXJncy5mc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZ2l0ZGlyXG4gKiBAcGFyYW0ge1RhZ09iamVjdH0gYXJncy50YWdcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICovXG5hc3luYyBmdW5jdGlvbiBfd3JpdGVUYWcoeyBmcywgZ2l0ZGlyLCB0YWcgfSkge1xuICAvLyBDb252ZXJ0IG9iamVjdCB0byBidWZmZXJcbiAgY29uc3Qgb2JqZWN0ID0gR2l0QW5ub3RhdGVkVGFnLmZyb20odGFnKS50b09iamVjdCgpO1xuICBjb25zdCBvaWQgPSBhd2FpdCBfd3JpdGVPYmplY3Qoe1xuICAgIGZzLFxuICAgIGdpdGRpcixcbiAgICB0eXBlOiAndGFnJyxcbiAgICBvYmplY3QsXG4gICAgZm9ybWF0OiAnY29udGVudCcsXG4gIH0pO1xuICByZXR1cm4gb2lkXG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFdyaXRlIGFuIGFubm90YXRlZCB0YWcgb2JqZWN0IGRpcmVjdGx5XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7RnNDbGllbnR9IGFyZ3MuZnMgLSBhIGZpbGUgc3lzdGVtIGNsaWVudFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcl0gLSBUaGUgW3dvcmtpbmcgdHJlZV0oZGlyLXZzLWdpdGRpci5tZCkgZGlyZWN0b3J5IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5naXRkaXI9am9pbihkaXIsJy5naXQnKV0gLSBbcmVxdWlyZWRdIFRoZSBbZ2l0IGRpcmVjdG9yeV0oZGlyLXZzLWdpdGRpci5tZCkgcGF0aFxuICogQHBhcmFtIHtUYWdPYmplY3R9IGFyZ3MudGFnIC0gVGhlIG9iamVjdCB0byB3cml0ZVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIHRoZSBTSEEtMSBvYmplY3QgaWQgb2YgdGhlIG5ld2x5IHdyaXR0ZW4gb2JqZWN0XG4gKiBAc2VlIFRhZ09iamVjdFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNYW51YWxseSBjcmVhdGUgYW4gYW5ub3RhdGVkIHRhZy5cbiAqIGxldCBzaGEgPSBhd2FpdCBnaXQucmVzb2x2ZVJlZih7IGZzLCBkaXI6ICcvdHV0b3JpYWwnLCByZWY6ICdIRUFEJyB9KVxuICogY29uc29sZS5sb2coJ2NvbW1pdCcsIHNoYSlcbiAqXG4gKiBsZXQgb2lkID0gYXdhaXQgZ2l0LndyaXRlVGFnKHtcbiAqICAgZnMsXG4gKiAgIGRpcjogJy90dXRvcmlhbCcsXG4gKiAgIHRhZzoge1xuICogICAgIG9iamVjdDogc2hhLFxuICogICAgIHR5cGU6ICdjb21taXQnLFxuICogICAgIHRhZzogJ215LXRhZycsXG4gKiAgICAgdGFnZ2VyOiB7XG4gKiAgICAgICBuYW1lOiAneW91ciBuYW1lJyxcbiAqICAgICAgIGVtYWlsOiAnZW1haWxAZXhhbXBsZS5jb20nLFxuICogICAgICAgdGltZXN0YW1wOiBNYXRoLmZsb29yKERhdGUubm93KCkvMTAwMCksXG4gKiAgICAgICB0aW1lem9uZU9mZnNldDogbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpXG4gKiAgICAgfSxcbiAqICAgICBtZXNzYWdlOiAnT3B0aW9uYWwgbWVzc2FnZSdcbiAqICAgfVxuICogfSlcbiAqXG4gKiBjb25zb2xlLmxvZygndGFnJywgb2lkKVxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVUYWcoeyBmcywgZGlyLCBnaXRkaXIgPSBqb2luKGRpciwgJy5naXQnKSwgdGFnIH0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ3RhZycsIHRhZyk7XG5cbiAgICByZXR1cm4gYXdhaXQgX3dyaXRlVGFnKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBnaXRkaXIsXG4gICAgICB0YWcsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLmNhbGxlciA9ICdnaXQud3JpdGVUYWcnO1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFdyaXRlIGEgdHJlZSBvYmplY3QgZGlyZWN0bHlcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtGc0NsaWVudH0gYXJncy5mcyAtIGEgZmlsZSBzeXN0ZW0gY2xpZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyXSAtIFRoZSBbd29ya2luZyB0cmVlXShkaXItdnMtZ2l0ZGlyLm1kKSBkaXJlY3RvcnkgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdpdGRpcj1qb2luKGRpciwnLmdpdCcpXSAtIFtyZXF1aXJlZF0gVGhlIFtnaXQgZGlyZWN0b3J5XShkaXItdnMtZ2l0ZGlyLm1kKSBwYXRoXG4gKiBAcGFyYW0ge1RyZWVPYmplY3R9IGFyZ3MudHJlZSAtIFRoZSBvYmplY3QgdG8gd3JpdGVcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBSZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCB0aGUgU0hBLTEgb2JqZWN0IGlkIG9mIHRoZSBuZXdseSB3cml0dGVuIG9iamVjdC5cbiAqIEBzZWUgVHJlZU9iamVjdFxuICogQHNlZSBUcmVlRW50cnlcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlVHJlZSh7IGZzLCBkaXIsIGdpdGRpciA9IGpvaW4oZGlyLCAnLmdpdCcpLCB0cmVlIH0pIHtcbiAgdHJ5IHtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ2ZzJywgZnMpO1xuICAgIGFzc2VydFBhcmFtZXRlcignZ2l0ZGlyJywgZ2l0ZGlyKTtcbiAgICBhc3NlcnRQYXJhbWV0ZXIoJ3RyZWUnLCB0cmVlKTtcblxuICAgIHJldHVybiBhd2FpdCBfd3JpdGVUcmVlKHtcbiAgICAgIGZzOiBuZXcgRmlsZVN5c3RlbShmcyksXG4gICAgICBnaXRkaXIsXG4gICAgICB0cmVlLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5jYWxsZXIgPSAnZ2l0LndyaXRlVHJlZSc7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy8gZGVmYXVsdCBleHBvcnRcbnZhciBpbmRleCA9IHtcbiAgRXJyb3JzLFxuICBTVEFHRSxcbiAgVFJFRSxcbiAgV09SS0RJUixcbiAgYWRkLFxuICBhYm9ydE1lcmdlLFxuICBhZGROb3RlLFxuICBhZGRSZW1vdGUsXG4gIGFubm90YXRlZFRhZyxcbiAgYnJhbmNoLFxuICBjaGVja291dCxcbiAgY2xvbmUsXG4gIGNvbW1pdCxcbiAgZ2V0Q29uZmlnLFxuICBnZXRDb25maWdBbGwsXG4gIHNldENvbmZpZyxcbiAgY3VycmVudEJyYW5jaCxcbiAgZGVsZXRlQnJhbmNoLFxuICBkZWxldGVSZWYsXG4gIGRlbGV0ZVJlbW90ZSxcbiAgZGVsZXRlVGFnLFxuICBleHBhbmRPaWQsXG4gIGV4cGFuZFJlZixcbiAgZmFzdEZvcndhcmQsXG4gIGZldGNoLFxuICBmaW5kTWVyZ2VCYXNlLFxuICBmaW5kUm9vdCxcbiAgZ2V0UmVtb3RlSW5mbyxcbiAgZ2V0UmVtb3RlSW5mbzIsXG4gIGhhc2hCbG9iLFxuICBpbmRleFBhY2ssXG4gIGluaXQsXG4gIGlzRGVzY2VuZGVudCxcbiAgaXNJZ25vcmVkLFxuICBsaXN0QnJhbmNoZXMsXG4gIGxpc3RGaWxlcyxcbiAgbGlzdE5vdGVzLFxuICBsaXN0UmVtb3RlcyxcbiAgbGlzdFNlcnZlclJlZnMsXG4gIGxpc3RUYWdzLFxuICBsb2csXG4gIG1lcmdlLFxuICBwYWNrT2JqZWN0cyxcbiAgcHVsbCxcbiAgcHVzaCxcbiAgcmVhZEJsb2IsXG4gIHJlYWRDb21taXQsXG4gIHJlYWROb3RlLFxuICByZWFkT2JqZWN0LFxuICByZWFkVGFnLFxuICByZWFkVHJlZSxcbiAgcmVtb3ZlLFxuICByZW1vdmVOb3RlLFxuICByZW5hbWVCcmFuY2gsXG4gIHJlc2V0SW5kZXgsXG4gIHVwZGF0ZUluZGV4LFxuICByZXNvbHZlUmVmLFxuICBzdGF0dXMsXG4gIHN0YXR1c01hdHJpeCxcbiAgdGFnLFxuICB2ZXJzaW9uLFxuICB3YWxrLFxuICB3cml0ZUJsb2IsXG4gIHdyaXRlQ29tbWl0LFxuICB3cml0ZU9iamVjdCxcbiAgd3JpdGVSZWYsXG4gIHdyaXRlVGFnLFxuICB3cml0ZVRyZWUsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBpbmRleDtcbmV4cG9ydCB7IEVycm9ycywgU1RBR0UsIFRSRUUsIFdPUktESVIsIGFib3J0TWVyZ2UsIGFkZCwgYWRkTm90ZSwgYWRkUmVtb3RlLCBhbm5vdGF0ZWRUYWcsIGJyYW5jaCwgY2hlY2tvdXQsIGNsb25lLCBjb21taXQsIGN1cnJlbnRCcmFuY2gsIGRlbGV0ZUJyYW5jaCwgZGVsZXRlUmVmLCBkZWxldGVSZW1vdGUsIGRlbGV0ZVRhZywgZXhwYW5kT2lkLCBleHBhbmRSZWYsIGZhc3RGb3J3YXJkLCBmZXRjaCwgZmluZE1lcmdlQmFzZSwgZmluZFJvb3QsIGdldENvbmZpZywgZ2V0Q29uZmlnQWxsLCBnZXRSZW1vdGVJbmZvLCBnZXRSZW1vdGVJbmZvMiwgaGFzaEJsb2IsIGluZGV4UGFjaywgaW5pdCwgaXNEZXNjZW5kZW50LCBpc0lnbm9yZWQsIGxpc3RCcmFuY2hlcywgbGlzdEZpbGVzLCBsaXN0Tm90ZXMsIGxpc3RSZW1vdGVzLCBsaXN0U2VydmVyUmVmcywgbGlzdFRhZ3MsIGxvZywgbWVyZ2UsIHBhY2tPYmplY3RzLCBwdWxsLCBwdXNoLCByZWFkQmxvYiwgcmVhZENvbW1pdCwgcmVhZE5vdGUsIHJlYWRPYmplY3QsIHJlYWRUYWcsIHJlYWRUcmVlLCByZW1vdmUsIHJlbW92ZU5vdGUsIHJlbmFtZUJyYW5jaCwgcmVzZXRJbmRleCwgcmVzb2x2ZVJlZiwgc2V0Q29uZmlnLCBzdGF0dXMsIHN0YXR1c01hdHJpeCwgdGFnLCB1cGRhdGVJbmRleCwgdmVyc2lvbiwgd2Fsaywgd3JpdGVCbG9iLCB3cml0ZUNvbW1pdCwgd3JpdGVPYmplY3QsIHdyaXRlUmVmLCB3cml0ZVRhZywgd3JpdGVUcmVlIH07XG4iLCAiaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQge1xuICAgIEV2ZW50UmVmLFxuICAgIFBsYXRmb3JtLFxuICAgIFRBYnN0cmFjdEZpbGUsXG4gICAgVEZpbGUsXG4gICAgV29ya3NwYWNlTGVhZixcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBTaW1wbGVHaXQgfSBmcm9tIFwic3JjL2dpdE1hbmFnZXIvc2ltcGxlR2l0XCI7XG5pbXBvcnQge1xuICAgIExpbmVBdXRob3JQcm92aWRlcixcbiAgICBlbmFibGVkTGluZUF1dGhvckluZm9FeHRlbnNpb25zLFxufSBmcm9tIFwic3JjL2xpbmVBdXRob3IvbGluZUF1dGhvclByb3ZpZGVyXCI7XG5pbXBvcnQge1xuICAgIExpbmVBdXRob3JTZXR0aW5ncyxcbiAgICBwcm92aWRlU2V0dGluZ3NBY2Nlc3MsXG59IGZyb20gXCJzcmMvbGluZUF1dGhvci9tb2RlbFwiO1xuaW1wb3J0IHsgaGFuZGxlQ29udGV4dE1lbnUgfSBmcm9tIFwic3JjL2xpbmVBdXRob3Ivdmlldy9jb250ZXh0TWVudVwiO1xuaW1wb3J0IHsgc2V0VGV4dENvbG9yQ3NzQmFzZWRPblNldHRpbmcgfSBmcm9tIFwic3JjL2xpbmVBdXRob3Ivdmlldy9ndXR0ZXIvY29sb3JpbmdcIjtcbmltcG9ydCB7IHByZXBhcmVHdXR0ZXJTZWFyY2hGb3JDb250ZXh0TWVudUhhbmRsaW5nIH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL3ZpZXcvZ3V0dGVyL2d1dHRlckVsZW1lbnRTZWFyY2hcIjtcbmltcG9ydCBPYnNpZGlhbkdpdCBmcm9tIFwic3JjL21haW5cIjtcblxuLyoqXG4gKiBNYW5hZ2VzIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIE9ic2lkaWFuIChmaWxlLW9wZW4gZXZlbnQsIG1vZGlmaWNhdGlvbiBldmVudCwgZXRjLilcbiAqIGFuZCB0aGUgbGluZSBhdXRob3JpbmcgZmVhdHVyZS4gSXQgYWxzbyBtYW5hZ2VzIHRoZSAoZGUtKSBhY3RpdmF0aW9uIG9mIHRoZVxuICogbGluZSBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIExpbmVBdXRob3JpbmdGZWF0dXJlIHtcbiAgICBwcml2YXRlIGxpbmVBdXRob3JJbmZvUHJvdmlkZXI/OiBMaW5lQXV0aG9yUHJvdmlkZXI7XG4gICAgcHJpdmF0ZSBmaWxlT3BlbkV2ZW50PzogRXZlbnRSZWY7XG4gICAgcHJpdmF0ZSB3b3Jrc3BhY2VMZWFmQ2hhbmdlRXZlbnQ/OiBFdmVudFJlZjtcbiAgICBwcml2YXRlIGZpbGVNb2RpZmljYXRpb25FdmVudD86IEV2ZW50UmVmO1xuICAgIHByaXZhdGUgcmVmcmVzaE9uQ3NzQ2hhbmdlRXZlbnQ/OiBFdmVudFJlZjtcbiAgICBwcml2YXRlIGZpbGVSZW5hbWVFdmVudD86IEV2ZW50UmVmO1xuICAgIHByaXZhdGUgZ3V0dGVyQ29udGV4dE1lbnVFdmVudD86IEV2ZW50UmVmO1xuICAgIHByaXZhdGUgY29kZU1pcnJvckV4dGVuc2lvbnM6IEV4dGVuc2lvbltdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBsZzogT2JzaWRpYW5HaXQpIHt9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IElOSVQgYW5kIERFLUlOSVQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHB1YmxpYyBvbkxvYWRQbHVnaW4oKSB7XG4gICAgICAgIHRoaXMucGxnLnJlZ2lzdGVyRWRpdG9yRXh0ZW5zaW9uKHRoaXMuY29kZU1pcnJvckV4dGVuc2lvbnMpO1xuICAgICAgICBwcm92aWRlU2V0dGluZ3NBY2Nlc3MoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnBsZy5zZXR0aW5ncy5saW5lQXV0aG9yLFxuICAgICAgICAgICAgKGxhU2V0dGluZ3M6IExpbmVBdXRob3JTZXR0aW5ncykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGxnLnNldHRpbmdzLmxpbmVBdXRob3IgPSBsYVNldHRpbmdzO1xuICAgICAgICAgICAgICAgIHRoaXMucGxnLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25kaXRpb25hbGx5QWN0aXZhdGVCeVNldHRpbmdzKCkge1xuICAgICAgICBpZiAodGhpcy5wbGcuc2V0dGluZ3MubGluZUF1dGhvci5zaG93KSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlRmVhdHVyZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlRmVhdHVyZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0F2YWlsYWJsZU9uQ3VycmVudFBsYXRmb3JtKCkuYXZhaWxhYmxlKSByZXR1cm47XG5cbiAgICAgICAgICAgIHNldFRleHRDb2xvckNzc0Jhc2VkT25TZXR0aW5nKHRoaXMucGxnLnNldHRpbmdzLmxpbmVBdXRob3IpO1xuXG4gICAgICAgICAgICB0aGlzLmxpbmVBdXRob3JJbmZvUHJvdmlkZXIgPSBuZXcgTGluZUF1dGhvclByb3ZpZGVyKHRoaXMucGxnKTtcblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVFdmVudEhhbmRsZXJzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVDb2RlTWlycm9yRXh0ZW5zaW9ucygpO1xuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnBsZy5tYW5pZmVzdC5uYW1lICsgXCI6IEVuYWJsZWQgbGluZSBhdXRob3JpbmcuXCIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJHaXQ6IEVycm9yIHdoaWxlIGxvYWRpbmcgbGluZSBhdXRob3JpbmcgZmVhdHVyZS5cIiwgZSk7XG4gICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVGZWF0dXJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWFjdGl2YXRlcyB0aGUgZmVhdHVyZS4gVGhpcyBmdW5jdGlvbiBpcyB2ZXJ5IGRlZmVuc2l2ZSwgYXMgaXQgaXMgYWxzb1xuICAgICAqIGNhbGxlZCB0byBjbGVhbnVwLCBpZiBhIGNyaXRpY2FsIGVycm9yIGluIHRoZSBsaW5lIGF1dGhvcmluZyBoYXMgb2NjdXJyZWQuXG4gICAgICovXG4gICAgcHVibGljIGRlYWN0aXZhdGVGZWF0dXJlKCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lFdmVudEhhbmRsZXJzKCk7XG5cbiAgICAgICAgdGhpcy5kZWFjdGl2YXRlQ29kZU1pcnJvckV4dGVuc2lvbnMoKTtcblxuICAgICAgICB0aGlzLmxpbmVBdXRob3JJbmZvUHJvdmlkZXI/LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5saW5lQXV0aG9ySW5mb1Byb3ZpZGVyID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMucGxnLm1hbmlmZXN0Lm5hbWUgKyBcIjogRGlzYWJsZWQgbGluZSBhdXRob3JpbmcuXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0F2YWlsYWJsZU9uQ3VycmVudFBsYXRmb3JtKCk6IHtcbiAgICAgICAgYXZhaWxhYmxlOiBib29sZWFuO1xuICAgICAgICBnaXRNYW5hZ2VyOiBTaW1wbGVHaXQ7XG4gICAgfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhdmFpbGFibGU6IHRoaXMucGxnLnVzZVNpbXBsZUdpdCAmJiBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHAsXG4gICAgICAgICAgICBnaXRNYW5hZ2VyOlxuICAgICAgICAgICAgICAgIHRoaXMucGxnLmdpdE1hbmFnZXIgaW5zdGFuY2VvZiBTaW1wbGVHaXRcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnBsZy5naXRNYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkISxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJFRlJFU0ggPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHB1YmxpYyByZWZyZXNoTGluZUF1dGhvclZpZXdzKCkge1xuICAgICAgICBpZiAodGhpcy5wbGcuc2V0dGluZ3MubGluZUF1dGhvci5zaG93KSB7XG4gICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVGZWF0dXJlKCk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlRmVhdHVyZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBDT0RFTUlSUk9SIEVYVEVOU0lPTlMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHByaXZhdGUgYWN0aXZhdGVDb2RlTWlycm9yRXh0ZW5zaW9ucygpIHtcbiAgICAgICAgLy8gWWVzLCB3ZSBuZWVkIHRvIGRpcmVjdGx5IG1vZGlmeSB0aGUgYXJyYXkgYW5kIG5vdGlmeSB0aGUgY2hhbmdlIHRvIGhhdmVcbiAgICAgICAgLy8gdG9nZ2xlYWJsZSBDb2RlbWlycm9yIGV4dGVuc2lvbnMuXG4gICAgICAgIHRoaXMuY29kZU1pcnJvckV4dGVuc2lvbnMucHVzaChlbmFibGVkTGluZUF1dGhvckluZm9FeHRlbnNpb25zKTtcbiAgICAgICAgdGhpcy5wbGcuYXBwLndvcmtzcGFjZS51cGRhdGVPcHRpb25zKCk7XG5cbiAgICAgICAgLy8gSGFuZGxlIGFsbCBhbHJlYWR5IG9wZW5lZCBmaWxlc1xuICAgICAgICB0aGlzLnBsZy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXModGhpcy5oYW5kbGVXb3Jrc3BhY2VMZWFmKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVDb2RlTWlycm9yRXh0ZW5zaW9ucygpIHtcbiAgICAgICAgLy8gWWVzLCB3ZSBuZWVkIHRvIGRpcmVjdGx5IG1vZGlmeSB0aGUgYXJyYXkgYW5kIG5vdGlmeSB0aGUgY2hhbmdlIHRvIGhhdmVcbiAgICAgICAgLy8gdG9nZ2xlYWJsZSBDb2RlbWlycm9yIGV4dGVuc2lvbnMuXG4gICAgICAgIGZvciAoY29uc3QgZXh0IG9mIHRoaXMuY29kZU1pcnJvckV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZU1pcnJvckV4dGVuc2lvbnMucmVtb3ZlKGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbGcuYXBwLndvcmtzcGFjZS51cGRhdGVPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBIQU5ETEVSUyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVFdmVudEhhbmRsZXJzKCkge1xuICAgICAgICB0aGlzLmd1dHRlckNvbnRleHRNZW51RXZlbnQgPSB0aGlzLmNyZWF0ZUd1dHRlckNvbnRleHRNZW51SGFuZGxlcigpO1xuICAgICAgICB0aGlzLmZpbGVPcGVuRXZlbnQgPSB0aGlzLmNyZWF0ZUZpbGVPcGVuRXZlbnQoKTtcbiAgICAgICAgdGhpcy53b3Jrc3BhY2VMZWFmQ2hhbmdlRXZlbnQgPSB0aGlzLmNyZWF0ZVdvcmtzcGFjZUxlYWZDaGFuZ2VFdmVudCgpO1xuICAgICAgICB0aGlzLmZpbGVNb2RpZmljYXRpb25FdmVudCA9IHRoaXMuY3JlYXRlVmF1bHRGaWxlTW9kaWZpY2F0aW9uSGFuZGxlcigpO1xuICAgICAgICB0aGlzLnJlZnJlc2hPbkNzc0NoYW5nZUV2ZW50ID0gdGhpcy5jcmVhdGVDc3NSZWZyZXNoSGFuZGxlcigpO1xuICAgICAgICB0aGlzLmZpbGVSZW5hbWVFdmVudCA9IHRoaXMuY3JlYXRlRmlsZVJlbmFtZUV2ZW50KCk7XG5cbiAgICAgICAgcHJlcGFyZUd1dHRlclNlYXJjaEZvckNvbnRleHRNZW51SGFuZGxpbmcoKTtcblxuICAgICAgICB0aGlzLnBsZy5yZWdpc3RlckV2ZW50KHRoaXMuZ3V0dGVyQ29udGV4dE1lbnVFdmVudCk7XG4gICAgICAgIHRoaXMucGxnLnJlZ2lzdGVyRXZlbnQodGhpcy5yZWZyZXNoT25Dc3NDaGFuZ2VFdmVudCk7XG4gICAgICAgIHRoaXMucGxnLnJlZ2lzdGVyRXZlbnQodGhpcy5maWxlT3BlbkV2ZW50KTtcbiAgICAgICAgdGhpcy5wbGcucmVnaXN0ZXJFdmVudCh0aGlzLndvcmtzcGFjZUxlYWZDaGFuZ2VFdmVudCk7XG4gICAgICAgIHRoaXMucGxnLnJlZ2lzdGVyRXZlbnQodGhpcy5maWxlTW9kaWZpY2F0aW9uRXZlbnQpO1xuICAgICAgICB0aGlzLnBsZy5yZWdpc3RlckV2ZW50KHRoaXMuZmlsZVJlbmFtZUV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lFdmVudEhhbmRsZXJzKCkge1xuICAgICAgICB0aGlzLnBsZy5hcHAud29ya3NwYWNlLm9mZnJlZih0aGlzLnJlZnJlc2hPbkNzc0NoYW5nZUV2ZW50ISk7XG4gICAgICAgIHRoaXMucGxnLmFwcC53b3Jrc3BhY2Uub2ZmcmVmKHRoaXMuZmlsZU9wZW5FdmVudCEpO1xuICAgICAgICB0aGlzLnBsZy5hcHAud29ya3NwYWNlLm9mZnJlZih0aGlzLndvcmtzcGFjZUxlYWZDaGFuZ2VFdmVudCEpO1xuICAgICAgICB0aGlzLnBsZy5hcHAud29ya3NwYWNlLm9mZnJlZih0aGlzLnJlZnJlc2hPbkNzc0NoYW5nZUV2ZW50ISk7XG4gICAgICAgIHRoaXMucGxnLmFwcC52YXVsdC5vZmZyZWYodGhpcy5maWxlUmVuYW1lRXZlbnQhKTtcbiAgICAgICAgdGhpcy5wbGcuYXBwLndvcmtzcGFjZS5vZmZyZWYodGhpcy5ndXR0ZXJDb250ZXh0TWVudUV2ZW50ISk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVXb3Jrc3BhY2VMZWFmID0gKGxlYWY6IFdvcmtzcGFjZUxlYWYpID0+IHtcbiAgICAgICAgY29uc3Qgb2JzVmlldyA9IDxhbnk+bGVhZj8udmlldztcbiAgICAgICAgY29uc3QgZmlsZSA9IG9ic1ZpZXc/LmZpbGU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpbmVBdXRob3JJbmZvUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBcIkdpdDogdW5kZWZpbmVkIGxpbmVBdXRob3JJbmZvUHJvdmlkZXIuIFVuZXhwZWN0ZWQgc2l0dWF0aW9uLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCB8fCBvYnNWaWV3Py5hbGxvd05vRmlsZSA9PT0gdHJ1ZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMubGluZUF1dGhvckluZm9Qcm92aWRlci50cmFja0NoYW5nZWQoZmlsZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgY3JlYXRlRmlsZU9wZW5FdmVudCgpOiBFdmVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsZy5hcHAud29ya3NwYWNlLm9uKFwiZmlsZS1vcGVuXCIsIChmaWxlOiBURmlsZSkgPT5cbiAgICAgICAgICAgIHRoaXMubGluZUF1dGhvckluZm9Qcm92aWRlcj8udHJhY2tDaGFuZ2VkKGZpbGUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVXb3Jrc3BhY2VMZWFmQ2hhbmdlRXZlbnQoKTogRXZlbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGcuYXBwLndvcmtzcGFjZS5vbihcbiAgICAgICAgICAgIFwiYWN0aXZlLWxlYWYtY2hhbmdlXCIsXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVdvcmtzcGFjZUxlYWZcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUZpbGVSZW5hbWVFdmVudCgpOiBFdmVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsZy5hcHAudmF1bHQub24oXG4gICAgICAgICAgICBcInJlbmFtZVwiLFxuICAgICAgICAgICAgKGZpbGUsIF9vbGQpID0+XG4gICAgICAgICAgICAgICAgZmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lQXV0aG9ySW5mb1Byb3ZpZGVyPy50cmFja0NoYW5nZWQoZmlsZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVZhdWx0RmlsZU1vZGlmaWNhdGlvbkhhbmRsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsZy5hcHAudmF1bHQub24oXG4gICAgICAgICAgICBcIm1vZGlmeVwiLFxuICAgICAgICAgICAgKGFueVBhdGg6IFRBYnN0cmFjdEZpbGUpID0+XG4gICAgICAgICAgICAgICAgYW55UGF0aCBpbnN0YW5jZW9mIFRGaWxlICYmXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lQXV0aG9ySW5mb1Byb3ZpZGVyPy50cmFja0NoYW5nZWQoYW55UGF0aClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNzc1JlZnJlc2hIYW5kbGVyKCk6IEV2ZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxnLmFwcC53b3Jrc3BhY2Uub24oXCJjc3MtY2hhbmdlXCIsICgpID0+XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMaW5lQXV0aG9yVmlld3MoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlR3V0dGVyQ29udGV4dE1lbnVIYW5kbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGcuYXBwLndvcmtzcGFjZS5vbihcImVkaXRvci1tZW51XCIsIGhhbmRsZUNvbnRleHRNZW51KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBkZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmltcG9ydCB7IEZpbGVTeXN0ZW1BZGFwdGVyLCBub3JtYWxpemVQYXRoLCBOb3RpY2UsIFBsYXRmb3JtIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBzZXAsIHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHNpbXBsZUdpdCwgKiBhcyBzaW1wbGUgZnJvbSBcInNpbXBsZS1naXRcIjtcbmltcG9ydCB7IEdJVF9MSU5FX0FVVEhPUklOR19NT1ZFTUVOVF9ERVRFQ1RJT05fTUlOSU1BTF9MRU5HVEggfSBmcm9tIFwic3JjL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTGluZUF1dGhvckZvbGxvd01vdmVtZW50IH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL21vZGVsXCI7XG5pbXBvcnQgT2JzaWRpYW5HaXQgZnJvbSBcIi4uL21haW5cIjtcbmltcG9ydCB7XG4gICAgQmxhbWUsXG4gICAgQmxhbWVDb21taXQsXG4gICAgQnJhbmNoSW5mbyxcbiAgICBGaWxlU3RhdHVzUmVzdWx0LFxuICAgIExvZ0VudHJ5LFxuICAgIFBsdWdpblN0YXRlLFxuICAgIFN0YXR1cyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBpbXBvc3NpYmxlQnJhbmNoLCBzcGxpdFJlbW90ZUJyYW5jaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgR2l0TWFuYWdlciB9IGZyb20gXCIuL2dpdE1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZUdpdCBleHRlbmRzIEdpdE1hbmFnZXIge1xuICAgIGdpdDogc2ltcGxlLlNpbXBsZUdpdDtcbiAgICBhYnNvbHV0ZVJlcG9QYXRoOiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3IocGx1Z2luOiBPYnNpZGlhbkdpdCkge1xuICAgICAgICBzdXBlcihwbHVnaW4pO1xuICAgIH1cblxuICAgIGFzeW5jIHNldEdpdEluc3RhbmNlKGlnbm9yZUVycm9yID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNHaXRJbnN0YWxsZWQoKSkge1xuICAgICAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgRmlsZVN5c3RlbUFkYXB0ZXI7XG4gICAgICAgICAgICBjb25zdCB2YXVsdEJhc2VQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCgpO1xuICAgICAgICAgICAgbGV0IGJhc2VQYXRoID0gdmF1bHRCYXNlUGF0aDtcbiAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIGJhc2VQYXRoIHNldHRpbmcgaXMgYSByZWxhdGl2ZSBwYXRoLCBhIGxlYWRpbmcgYC9gIG11c3RcbiAgICAgICAgICAgIC8vIGJlIGFwcGVuZGVkIGJlZm9yZSBjb25jYXRlbmF0aW5nIHdpdGggdGhlIHBhdGguXG4gICAgICAgICAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuYmFzZVBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBhZGFwdGVyLmV4aXN0cyhcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplUGF0aCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5iYXNlUGF0aClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFzZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXVsdEJhc2VQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuYmFzZVBhdGhcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiT2JzaWRpYW5HaXQ6IEJhc2UgcGF0aCBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFic29sdXRlUmVwb1BhdGggPSBiYXNlUGF0aDtcblxuICAgICAgICAgICAgdGhpcy5naXQgPSBzaW1wbGVHaXQoe1xuICAgICAgICAgICAgICAgIGJhc2VEaXI6IGJhc2VQYXRoLFxuICAgICAgICAgICAgICAgIGJpbmFyeTogdGhpcy5wbHVnaW4ubG9jYWxTdG9yYWdlLmdldEdpdFBhdGgoKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29uZmlnOiBbXCJjb3JlLnF1b3RlcGF0aD1vZmZcIl0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXRocyA9IHRoaXMucGx1Z2luLmxvY2FsU3RvcmFnZS5nZXRQQVRIUGF0aHMoKTtcbiAgICAgICAgICAgIGNvbnN0IGVudlZhcnMgPSB0aGlzLnBsdWdpbi5sb2NhbFN0b3JhZ2UuZ2V0RW52VmFycygpO1xuICAgICAgICAgICAgY29uc3QgZ2l0RGlyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuZ2l0RGlyO1xuICAgICAgICAgICAgaWYgKHBhdGhQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHByb2Nlc3MuZW52W1wiUEFUSFwiXSArIFwiOlwiICsgcGF0aFBhdGhzLmpvaW4oXCI6XCIpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52W1wiUEFUSFwiXSA9IHBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2l0RGlyKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnZbXCJHSVRfRElSXCJdID0gZ2l0RGlyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBlbnZWYXIgb2YgZW52VmFycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudlZhci5zcGxpdChcIj1cIik7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWJ1Zy5lbmFibGUoXCJzaW1wbGUtZ2l0XCIpO1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZ2l0LmNoZWNrSXNSZXBvKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSByZWxhdGl2ZSByb290IHJlcG9ydGVkIGJ5IGdpdCBpbnRvIGFuIGFic29sdXRlIHBhdGhcbiAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIGdpdCByZXNpZGVzIGluIGEgZGlmZmVyZW50IGZpbGVzeXN0ZW0gKGVnLCBXU0wpXG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVSb290ID0gYXdhaXQgdGhpcy5naXQucmV2cGFyc2UoXCItLXNob3ctY2R1cFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhYnNvbHV0ZVJvb3QgPSByZXNvbHZlKGJhc2VQYXRoICsgc2VwICsgcmVsYXRpdmVSb290KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYWJzb2x1dGVSZXBvUGF0aCA9IGFic29sdXRlUm9vdDtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdpdC5jd2QoYWJzb2x1dGVSb290KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdHMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB2YXVsdCBmcm9tIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgZ2l0IHJlcG9zaXRvcnlcbiAgICBnZXRSZWxhdGl2ZVZhdWx0UGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgRmlsZVN5c3RlbUFkYXB0ZXI7XG4gICAgICAgIGNvbnN0IGZyb20gPSBhZGFwdGVyLmdldEJhc2VQYXRoKCk7XG5cbiAgICAgICAgY29uc3QgdG8gPSBwYXRoLmpvaW4odGhpcy5hYnNvbHV0ZVJlcG9QYXRoLCBmaWxlUGF0aCk7XG5cbiAgICAgICAgbGV0IHJlcyA9IHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pO1xuICAgICAgICBpZiAoUGxhdGZvcm0uaXNXaW4pIHtcbiAgICAgICAgICAgIHJlcyA9IHJlcy5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdHMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBnaXQgcmVwb3NpdG9yeSBmcm9tIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgdmF1bHRcbiAgICAvL1xuICAgIC8vIEBwYXJhbSBkb0NvbnZlcnNpb24gLSBJZiBmYWxzZSwgdGhlIHBhdGggaXMgcmV0dXJuZWQgYXMgaXMuIFRoaXMgaXMgYWRkZWQgYmVjYXVzZSB0aGF0IHBhcmFtZXRlciBpcyBvZnRlbiBwYXNzZWQgb24gdG8gZnVuY3Rpb25zIHdoZXJlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAgICBnZXRSZWxhdGl2ZVJlcG9QYXRoKFxuICAgICAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgICAgICBkb0NvbnZlcnNpb246IGJvb2xlYW4gPSB0cnVlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGRvQ29udmVyc2lvbikge1xuICAgICAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyIGFzIEZpbGVTeXN0ZW1BZGFwdGVyO1xuICAgICAgICAgICAgY29uc3QgdmF1bHRQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCgpO1xuICAgICAgICAgICAgY29uc3QgZnJvbSA9IHRoaXMuYWJzb2x1dGVSZXBvUGF0aDtcbiAgICAgICAgICAgIGNvbnN0IHRvID0gcGF0aC5qb2luKHZhdWx0UGF0aCwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgbGV0IHJlcyA9IHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pO1xuICAgICAgICAgICAgaWYgKFBsYXRmb3JtLmlzV2luKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gcmVzLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgfVxuXG4gICAgYXN5bmMgc3RhdHVzKCk6IFByb21pc2U8U3RhdHVzPiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLnN0YXR1cyk7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKSk7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuXG4gICAgICAgIGNvbnN0IGFsbEZpbGVzRm9ybWF0dGVkID0gc3RhdHVzLmZpbGVzLm1hcDxGaWxlU3RhdHVzUmVzdWx0PigoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5mb3JtYXRQYXRoKGUpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXRoOiByZXMucGF0aCxcbiAgICAgICAgICAgICAgICBmcm9tOiByZXMuZnJvbSxcbiAgICAgICAgICAgICAgICBpbmRleDogZS5pbmRleCA9PT0gXCI/XCIgPyBcIlVcIiA6IGUuaW5kZXgsXG4gICAgICAgICAgICAgICAgd29ya2luZ19kaXI6IGUud29ya2luZ19kaXIgPT09IFwiP1wiID8gXCJVXCIgOiBlLndvcmtpbmdfZGlyLFxuICAgICAgICAgICAgICAgIHZhdWx0X3BhdGg6IHRoaXMuZ2V0UmVsYXRpdmVWYXVsdFBhdGgocmVzLnBhdGgpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGw6IGFsbEZpbGVzRm9ybWF0dGVkLFxuICAgICAgICAgICAgY2hhbmdlZDogYWxsRmlsZXNGb3JtYXR0ZWQuZmlsdGVyKChlKSA9PiBlLndvcmtpbmdfZGlyICE9PSBcIiBcIiksXG4gICAgICAgICAgICBzdGFnZWQ6IGFsbEZpbGVzRm9ybWF0dGVkLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZSkgPT4gZS5pbmRleCAhPT0gXCIgXCIgJiYgZS5pbmRleCAhPSBcIlVcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNvbmZsaWN0ZWQ6IHN0YXR1cy5jb25mbGljdGVkLm1hcChcbiAgICAgICAgICAgICAgICAocGF0aCkgPT4gdGhpcy5mb3JtYXRQYXRoKHsgcGF0aCB9KS5wYXRoXG4gICAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFzeW5jIHN1Ym1vZHVsZUF3YXJlSGVhZFJldmlzb25JbkNvbnRhaW5pbmdEaXJlY3RvcnkoXG4gICAgICAgIGZpbGVwYXRoOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXBvUGF0aCA9IHRoaXMuZ2V0UmVsYXRpdmVSZXBvUGF0aChmaWxlcGF0aCk7XG5cbiAgICAgICAgY29uc3QgY29udGFpbmluZ0RpcmVjdG9yeSA9IHBhdGguZGlybmFtZShyZXBvUGF0aCk7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbXCItQ1wiLCBjb250YWluaW5nRGlyZWN0b3J5LCBcInJldi1wYXJzZVwiLCBcIkhFQURcIl07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5naXQucmF3KGFyZ3MpO1xuICAgICAgICByZXN1bHQuY2F0Y2goKGVycikgPT5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIm9ic2lkaWFuLWdpdDogcmV2LXBhcnNlIGVycm9yOlwiLCBlcnIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0U3VibW9kdWxlUGF0aHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nW10+KGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdpdC5vdXRwdXRIYW5kbGVyKGFzeW5jIChjbWQsIHN0ZG91dCwgc3RkZXJyLCBhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHJ1biB0aGlzIGhhbmRsZXIgb24gb3RoZXIgY29tbWFuZHNcbiAgICAgICAgICAgICAgICBpZiAoIShhcmdzLmNvbnRhaW5zKFwic3VibW9kdWxlXCIpICYmIGFyZ3MuY29udGFpbnMoXCJmb3JlYWNoXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGJvZHkgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvb3QgPVxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC52YXVsdC5hZGFwdGVyIGFzIEZpbGVTeXN0ZW1BZGFwdGVyXG4gICAgICAgICAgICAgICAgICAgICkuZ2V0QmFzZVBhdGgoKSArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5iYXNlUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIi9cIiArIHRoaXMucGx1Z2luLnNldHRpbmdzLmJhc2VQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCIpO1xuICAgICAgICAgICAgICAgIHN0ZG91dC5vbihcImRhdGFcIiwgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gY2h1bmsudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0ZG91dC5vbihcImVuZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Ym1vZHMgPSBib2R5LnNwbGl0KFwiXFxuXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB3b3JkcyBsaWtlIGBFbnRlcmluZ2AgaW4gZnJvbnQgb2YgZWFjaCBsaW5lIGFuZCBmaWx0ZXIgZW1wdHkgbGluZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaXBwZWRTdWJtb2RzOiBzdHJpbmdbXSA9IHN1Ym1vZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJtb2QgPSBpLm1hdGNoKC8nKFteJ10qKScvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VibW9kICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vdCArIFwiL1wiICsgc3VibW9kWzFdICsgc2VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChpKTogaSBpcyBzdHJpbmcgPT4gISFpKTtcblxuICAgICAgICAgICAgICAgICAgICBzdHJpcHBlZFN1Ym1vZHMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0cmlwcGVkU3VibW9kcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5naXQuc3ViTW9kdWxlKFtcImZvcmVhY2hcIiwgXCItLXJlY3Vyc2l2ZVwiLCBcIlwiXSk7XG4gICAgICAgICAgICB0aGlzLmdpdC5vdXRwdXRIYW5kbGVyKCgpID0+IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy9SZW1vdmUgd3JvbmcgYFwiYCBsaWtlIFwiTXkgZmlsZS5tZFwiXG4gICAgZm9ybWF0UGF0aChcbiAgICAgICAgcGF0aDogeyBmcm9tPzogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfSxcbiAgICAgICAgcmVuYW1lZCA9IGZhbHNlXG4gICAgKTogeyBwYXRoOiBzdHJpbmc7IGZyb20/OiBzdHJpbmcgfSB7XG4gICAgICAgIGZ1bmN0aW9uIGZvcm1hdChwYXRoPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICAgIGlmIChwYXRoID09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnXCInKSAmJiBwYXRoLmVuZHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDEsIHBhdGgubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZW5hbWVkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZyb206IGZvcm1hdChwYXRoLmZyb20pLFxuICAgICAgICAgICAgICAgIHBhdGg6IGZvcm1hdChwYXRoLnBhdGgpISxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhdGg6IGZvcm1hdChwYXRoLnBhdGgpISxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBibGFtZShcbiAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICB0cmFja01vdmVtZW50OiBMaW5lQXV0aG9yRm9sbG93TW92ZW1lbnQsXG4gICAgICAgIGlnbm9yZVdoaXRlc3BhY2U6IGJvb2xlYW5cbiAgICApOiBQcm9taXNlPEJsYW1lIHwgXCJ1bnRyYWNrZWRcIj4ge1xuICAgICAgICBwYXRoID0gdGhpcy5nZXRSZWxhdGl2ZVJlcG9QYXRoKHBhdGgpO1xuXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaXNUcmFja2VkKHBhdGgpKSkgcmV0dXJuIFwidW50cmFja2VkXCI7XG5cbiAgICAgICAgY29uc3QgaW5TdWJtb2R1bGUgPSBhd2FpdCB0aGlzLmdldFN1Ym1vZHVsZU9mRmlsZShwYXRoKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGluU3VibW9kdWxlID8gW1wiLUNcIiwgaW5TdWJtb2R1bGUuc3VibW9kdWxlXSA6IFtdO1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpblN1Ym1vZHVsZSA/IGluU3VibW9kdWxlLnJlbGF0aXZlRmlsZXBhdGggOiBwYXRoO1xuXG4gICAgICAgIGFyZ3MucHVzaChcImJsYW1lXCIsIFwiLS1wb3JjZWxhaW5cIik7XG5cbiAgICAgICAgaWYgKGlnbm9yZVdoaXRlc3BhY2UpIGFyZ3MucHVzaChcIi13XCIpO1xuXG4gICAgICAgIGNvbnN0IHRyYWNrQ0FyZyA9IGAtQyR7R0lUX0xJTkVfQVVUSE9SSU5HX01PVkVNRU5UX0RFVEVDVElPTl9NSU5JTUFMX0xFTkdUSH1gO1xuICAgICAgICBzd2l0Y2ggKHRyYWNrTW92ZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJpbmFjdGl2ZVwiOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInNhbWUtY29tbWl0XCI6XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKFwiLUNcIiwgdHJhY2tDQXJnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJhbGwtY29tbWl0c1wiOlxuICAgICAgICAgICAgICAgIGFyZ3MucHVzaChcIi1DXCIsIFwiLUNcIiwgdHJhY2tDQXJnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaW1wb3NzaWJsZUJyYW5jaCh0cmFja01vdmVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZ3MucHVzaChcIi0tXCIsIHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgICAgY29uc3QgcmF3QmxhbWUgPSBhd2FpdCB0aGlzLmdpdC5yYXcoXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgKGVycikgPT4gZXJyICYmIGNvbnNvbGUud2FybihcImdpdC1ibGFtZVwiLCBlcnIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBwYXJzZUJsYW1lKHJhd0JsYW1lKTtcbiAgICB9XG5cbiAgICBhc3luYyBpc1RyYWNrZWQocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGluU3VibW9kdWxlID0gYXdhaXQgdGhpcy5nZXRTdWJtb2R1bGVPZkZpbGUocGF0aCk7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBpblN1Ym1vZHVsZSA/IFtcIi1DXCIsIGluU3VibW9kdWxlLnN1Ym1vZHVsZV0gOiBbXTtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gaW5TdWJtb2R1bGUgPyBpblN1Ym1vZHVsZS5yZWxhdGl2ZUZpbGVwYXRoIDogcGF0aDtcblxuICAgICAgICBhcmdzLnB1c2goXCJscy1maWxlc1wiLCBcIi0tXCIsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdpdFxuICAgICAgICAgICAgLnJhdyhhcmdzLCAoZXJyKSA9PiBlcnIgJiYgY29uc29sZS53YXJuKFwibHMtZmlsZXNcIiwgZXJyKSlcbiAgICAgICAgICAgIC50aGVuKCh4KSA9PiB4LnRyaW0oKSAhPT0gXCJcIik7XG4gICAgfVxuXG4gICAgYXN5bmMgY29tbWl0QWxsKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U6IHN0cmluZyB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwZGF0ZVN1Ym1vZHVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLmNvbW1pdCk7XG4gICAgICAgICAgICBjb25zdCBzdWJtb2R1bGVQYXRocyA9IGF3YWl0IHRoaXMuZ2V0U3VibW9kdWxlUGF0aHMoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBzdWJtb2R1bGVQYXRocykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0XG4gICAgICAgICAgICAgICAgICAgIC5jd2QoeyBwYXRoOiBpdGVtLCByb290OiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgICAgICAuYWRkKFwiLUFcIiwgKGVycikgPT4gdGhpcy5vbkVycm9yKGVycikpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0XG4gICAgICAgICAgICAgICAgICAgIC5jd2QoeyBwYXRoOiBpdGVtLCByb290OiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgICAgICAuY29tbWl0KGF3YWl0IHRoaXMuZm9ybWF0Q29tbWl0TWVzc2FnZShtZXNzYWdlKSwgKGVycikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuYWRkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmdpdC5hZGQoXCItQVwiLCAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKSk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuY29tbWl0KTtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdpdC5jb21taXQoXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZvcm1hdENvbW1pdE1lc3NhZ2UobWVzc2FnZSksXG4gICAgICAgICAgICAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICApO1xuICAgICAgICBkaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImdpdC1oZWFkLXVwZGF0ZVwiKSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcy5zdW1tYXJ5LmNoYW5nZXM7XG4gICAgfVxuXG4gICAgYXN5bmMgY29tbWl0KHtcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgYW1lbmQsXG4gICAgfToge1xuICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgIGFtZW5kPzogYm9vbGVhbjtcbiAgICB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuY29tbWl0KTtcblxuICAgICAgICBjb25zdCByZXMgPSAoXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdpdC5jb21taXQoXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JtYXRDb21taXRNZXNzYWdlKG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIGFtZW5kID8gW1wiLS1hbWVuZFwiXSA6IFtdLFxuICAgICAgICAgICAgICAgIChlcnIpID0+IHRoaXMub25FcnJvcihlcnIpXG4gICAgICAgICAgICApXG4gICAgICAgICkuc3VtbWFyeS5jaGFuZ2VzO1xuICAgICAgICBkaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImdpdC1oZWFkLXVwZGF0ZVwiKSk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgYXN5bmMgc3RhZ2UocGF0aDogc3RyaW5nLCByZWxhdGl2ZVRvVmF1bHQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuYWRkKTtcblxuICAgICAgICBwYXRoID0gdGhpcy5nZXRSZWxhdGl2ZVJlcG9QYXRoKHBhdGgsIHJlbGF0aXZlVG9WYXVsdCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0LmFkZChbXCItLVwiLCBwYXRoXSwgKGVycikgPT4gdGhpcy5vbkVycm9yKGVycikpO1xuXG4gICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgIH1cblxuICAgIGFzeW5jIHN0YWdlQWxsKHsgZGlyIH06IHsgZGlyPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuYWRkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5naXQuYWRkKGRpciA/PyBcIi1BXCIsIChlcnIpID0+IHRoaXMub25FcnJvcihlcnIpKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgdW5zdGFnZUFsbCh7IGRpciB9OiB7IGRpcj86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLmFkZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0LnJlc2V0KGRpciAhPSB1bmRlZmluZWQgPyBbXCItLVwiLCBkaXJdIDogW10sIChlcnIpID0+XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBsdWdpbi5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5pZGxlKTtcbiAgICB9XG5cbiAgICBhc3luYyB1bnN0YWdlKHBhdGg6IHN0cmluZywgcmVsYXRpdmVUb1ZhdWx0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLmFkZCk7XG5cbiAgICAgICAgcGF0aCA9IHRoaXMuZ2V0UmVsYXRpdmVSZXBvUGF0aChwYXRoLCByZWxhdGl2ZVRvVmF1bHQpO1xuICAgICAgICBhd2FpdCB0aGlzLmdpdC5yZXNldChbXCItLVwiLCBwYXRoXSwgKGVycikgPT4gdGhpcy5vbkVycm9yKGVycikpO1xuXG4gICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgIH1cblxuICAgIGFzeW5jIGRpc2NhcmQoZmlsZXBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnBsdWdpbi5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5hZGQpO1xuICAgICAgICBhd2FpdCB0aGlzLmdpdC5jaGVja291dChbXCItLVwiLCBmaWxlcGF0aF0sIChlcnIpID0+IHRoaXMub25FcnJvcihlcnIpKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgaGFzaE9iamVjdChmaWxlcGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgLy8gTmVlZCB0byB1c2UgcmF3IGNvbW1hbmQgaGVyZSB0byBlbnN1cmUgZmlsZW5hbWVzIGFyZSBsaXRlcmFsbHkgdXNlZC5cbiAgICAgICAgLy8gUGVyaGFwcyB3ZSBjb3VsZCBmaWxlIGEgUFI/IGh0dHBzOi8vZ2l0aHViLmNvbS9zdGV2ZXVreC9naXQtanMvYmxvYi9tYWluL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9oYXNoLW9iamVjdC50c1xuICAgICAgICBmaWxlcGF0aCA9IHRoaXMuZ2V0UmVsYXRpdmVSZXBvUGF0aChmaWxlcGF0aCk7XG4gICAgICAgIGNvbnN0IGluU3VibW9kdWxlID0gYXdhaXQgdGhpcy5nZXRTdWJtb2R1bGVPZkZpbGUoZmlsZXBhdGgpO1xuICAgICAgICBjb25zdCBhcmdzID0gaW5TdWJtb2R1bGUgPyBbXCItQ1wiLCBpblN1Ym1vZHVsZS5zdWJtb2R1bGVdIDogW107XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlRmlsZXBhdGggPSBpblN1Ym1vZHVsZVxuICAgICAgICAgICAgPyBpblN1Ym1vZHVsZS5yZWxhdGl2ZUZpbGVwYXRoXG4gICAgICAgICAgICA6IGZpbGVwYXRoO1xuXG4gICAgICAgIGFyZ3MucHVzaChcImhhc2gtb2JqZWN0XCIsIFwiLS1cIiwgcmVsYXRpdmVGaWxlcGF0aCk7XG5cbiAgICAgICAgY29uc3QgcmV2aXNpb24gPSB0aGlzLmdpdC5yYXcoYXJncyk7XG4gICAgICAgIHJldmlzaW9uLmNhdGNoKFxuICAgICAgICAgICAgKGVycikgPT5cbiAgICAgICAgICAgICAgICBlcnIgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJvYnNpZGlhbi1naXQuIGhhc2gtb2JqZWN0IGZhaWxlZDpcIiwgZXJyPy5tZXNzYWdlKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmV2aXNpb247XG4gICAgfVxuXG4gICAgYXN5bmMgZGlzY2FyZEFsbCh7IGRpciB9OiB7IGRpcj86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2NhcmQoZGlyID8/IFwiLlwiKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdWxsKCk6IFByb21pc2U8RmlsZVN0YXR1c1Jlc3VsdFtdIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLnB1bGwpO1xuICAgICAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MudXBkYXRlU3VibW9kdWxlcylcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0LnN1Yk1vZHVsZShcbiAgICAgICAgICAgICAgICBbXCJ1cGRhdGVcIiwgXCItLXJlbW90ZVwiLCBcIi0tbWVyZ2VcIiwgXCItLXJlY3Vyc2l2ZVwiXSxcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBicmFuY2hJbmZvID0gYXdhaXQgdGhpcy5icmFuY2hJbmZvKCk7XG4gICAgICAgIGNvbnN0IGxvY2FsQ29tbWl0ID0gYXdhaXQgdGhpcy5naXQucmV2cGFyc2UoXG4gICAgICAgICAgICBbYnJhbmNoSW5mby5jdXJyZW50IV0sXG4gICAgICAgICAgICAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghYnJhbmNoSW5mby50cmFja2luZyAmJiB0aGlzLnBsdWdpbi5zZXR0aW5ncy51cGRhdGVTdWJtb2R1bGVzKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2coXG4gICAgICAgICAgICAgICAgXCJObyB0cmFja2luZyBicmFuY2ggZm91bmQuIElnbm9yaW5nIHB1bGwgb2YgbWFpbiByZXBvIGFuZCB1cGRhdGluZyBzdWJtb2R1bGVzIG9ubHkuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmdpdC5mZXRjaCgoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKSk7XG4gICAgICAgIGNvbnN0IHVwc3RyZWFtQ29tbWl0ID0gYXdhaXQgdGhpcy5naXQucmV2cGFyc2UoXG4gICAgICAgICAgICBbYnJhbmNoSW5mby50cmFja2luZyFdLFxuICAgICAgICAgICAgKGVycikgPT4gdGhpcy5vbkVycm9yKGVycilcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobG9jYWxDb21taXQgIT09IHVwc3RyZWFtQ29tbWl0KSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Muc3luY01ldGhvZCA9PT0gXCJtZXJnZVwiIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Muc3luY01ldGhvZCA9PT0gXCJyZWJhc2VcIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zeW5jTWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVyZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdpdC5tZXJnZShbYnJhbmNoSW5mby50cmFja2luZyFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJyZWJhc2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdpdC5yZWJhc2UoW2JyYW5jaEluZm8udHJhY2tpbmchXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGlzcGxheUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFB1bGwgZmFpbGVkICgke3RoaXMucGx1Z2luLnNldHRpbmdzLnN5bmNNZXRob2R9KTogJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLnN5bmNNZXRob2QgPT09IFwicmVzZXRcIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0LnJhdyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInVwZGF0ZS1yZWZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgcmVmcy9oZWFkcy8ke2JyYW5jaEluZm8uY3VycmVudH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwc3RyZWFtQ29tbWl0LFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlcnIpID0+IHRoaXMub25FcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudW5zdGFnZUFsbCh7fSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRpc3BsYXlFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBTeW5jIGZhaWxlZCAoJHt0aGlzLnBsdWdpbi5zZXR0aW5ncy5zeW5jTWV0aG9kfSk6ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LWhlYWQtdXBkYXRlXCIpKTtcblxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJNZXJnZUNvbW1pdCA9IGF3YWl0IHRoaXMuZ2l0LnJldnBhcnNlKFxuICAgICAgICAgICAgICAgIFticmFuY2hJbmZvLmN1cnJlbnQhXSxcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgZmlsZXNDaGFuZ2VkID0gYXdhaXQgdGhpcy5naXQuZGlmZihbXG4gICAgICAgICAgICAgICAgYCR7bG9jYWxDb21taXR9Li4ke2FmdGVyTWVyZ2VDb21taXR9YCxcbiAgICAgICAgICAgICAgICBcIi0tbmFtZS1vbmx5XCIsXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZpbGVzQ2hhbmdlZFxuICAgICAgICAgICAgICAgIC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxGaWxlU3RhdHVzUmVzdWx0PntcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nX2RpcjogXCJQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXVsdF9wYXRoOiB0aGlzLmdldFJlbGF0aXZlVmF1bHRQYXRoKGUpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcHVzaCgpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICB0aGlzLnBsdWdpbi5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5wdXNoKTtcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwZGF0ZVN1Ym1vZHVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZ2l0XG4gICAgICAgICAgICAgICAgLmVudih7IC4uLnByb2Nlc3MuZW52LCBPQlNJRElBTl9HSVQ6IDEgfSlcbiAgICAgICAgICAgICAgICAuc3ViTW9kdWxlKFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZvcmVhY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiLS1yZWN1cnNpdmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGB0cmFja2luZz0kKGdpdCBmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JyUodXBzdHJlYW06c2hvcnQpJyBcIiQoZ2l0IHN5bWJvbGljLXJlZiAtcSBIRUFEKVwiKTsgZWNobyAkdHJhY2tpbmc7IGlmIFsgISAteiBcIiQoZ2l0IGRpZmYgLS1zaG9ydHN0YXQgJHRyYWNraW5nKVwiIF07IHRoZW4gZ2l0IHB1c2g7IGZpYCxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgKGVycikgPT4gdGhpcy5vbkVycm9yKGVycilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdpdC5zdGF0dXMoKTtcbiAgICAgICAgY29uc3QgdHJhY2tpbmdCcmFuY2ggPSBzdGF0dXMudHJhY2tpbmchO1xuICAgICAgICBjb25zdCBjdXJyZW50QnJhbmNoID0gc3RhdHVzLmN1cnJlbnQhO1xuXG4gICAgICAgIGlmICghdHJhY2tpbmdCcmFuY2ggJiYgdGhpcy5wbHVnaW4uc2V0dGluZ3MudXBkYXRlU3VibW9kdWxlcykge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKFxuICAgICAgICAgICAgICAgIFwiTm8gdHJhY2tpbmcgYnJhbmNoIGZvdW5kLiBJZ25vcmluZyBwdXNoIG9mIG1haW4gcmVwbyBhbmQgdXBkYXRpbmcgc3VibW9kdWxlcyBvbmx5LlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbW90ZUNoYW5nZWRGaWxlcyA9IChcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0LmRpZmZTdW1tYXJ5KFxuICAgICAgICAgICAgICAgIFtjdXJyZW50QnJhbmNoLCB0cmFja2luZ0JyYW5jaCwgXCItLVwiXSxcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICAgICAgKVxuICAgICAgICApLmNoYW5nZWQ7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5naXRcbiAgICAgICAgICAgIC5lbnYoeyAuLi5wcm9jZXNzLmVudiwgT0JTSURJQU5fR0lUOiAxIH0pXG4gICAgICAgICAgICAucHVzaCgoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKSk7XG5cbiAgICAgICAgcmV0dXJuIHJlbW90ZUNoYW5nZWRGaWxlcztcbiAgICB9XG5cbiAgICBhc3luYyBnZXRVbnB1c2hlZENvbW1pdHMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5naXQuc3RhdHVzKCk7XG4gICAgICAgIGNvbnN0IHRyYWNraW5nQnJhbmNoID0gc3RhdHVzLnRyYWNraW5nO1xuICAgICAgICBjb25zdCBjdXJyZW50QnJhbmNoID0gc3RhdHVzLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKHRyYWNraW5nQnJhbmNoID09IG51bGwgfHwgY3VycmVudEJyYW5jaCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbW90ZUNoYW5nZWRGaWxlcyA9IChcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0LmRpZmZTdW1tYXJ5KFxuICAgICAgICAgICAgICAgIFtjdXJyZW50QnJhbmNoLCB0cmFja2luZ0JyYW5jaCwgXCItLVwiXSxcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICAgICAgKVxuICAgICAgICApLmNoYW5nZWQ7XG5cbiAgICAgICAgcmV0dXJuIHJlbW90ZUNoYW5nZWRGaWxlcztcbiAgICB9XG5cbiAgICBhc3luYyBjYW5QdXNoKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICAvLyBhbGxvdyBwdXNoaW5nIGluIHN1Ym1vZHVsZXMgZXZlbiBpZiB0aGUgcm9vdCBoYXMgbm8gY2hhbmdlcy5cbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwZGF0ZVN1Ym1vZHVsZXMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKSk7XG4gICAgICAgIGNvbnN0IHRyYWNraW5nQnJhbmNoID0gc3RhdHVzLnRyYWNraW5nO1xuICAgICAgICBjb25zdCBjdXJyZW50QnJhbmNoID0gc3RhdHVzLmN1cnJlbnQhO1xuICAgICAgICBpZiAoIXRyYWNraW5nQnJhbmNoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtb3RlQ2hhbmdlZEZpbGVzID0gKFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5naXQuZGlmZlN1bW1hcnkoW2N1cnJlbnRCcmFuY2gsIHRyYWNraW5nQnJhbmNoLCBcIi0tXCJdKVxuICAgICAgICApLmNoYW5nZWQ7XG5cbiAgICAgICAgcmV0dXJuIHJlbW90ZUNoYW5nZWRGaWxlcyAhPT0gMDtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja1JlcXVpcmVtZW50cygpOiBQcm9taXNlPFxuICAgICAgICBcInZhbGlkXCIgfCBcIm1pc3NpbmctcmVwb1wiIHwgXCJtaXNzaW5nLWdpdFwiXG4gICAgPiB7XG4gICAgICAgIGlmICghdGhpcy5pc0dpdEluc3RhbGxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJtaXNzaW5nLWdpdFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuZ2l0LmNoZWNrSXNSZXBvKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJtaXNzaW5nLXJlcG9cIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJ2YWxpZFwiO1xuICAgIH1cblxuICAgIGFzeW5jIGJyYW5jaEluZm8oKTogUHJvbWlzZTxCcmFuY2hJbmZvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKSk7XG4gICAgICAgIGNvbnN0IGJyYW5jaGVzID0gYXdhaXQgdGhpcy5naXQuYnJhbmNoKFtcIi0tbm8tY29sb3JcIl0sIChlcnIpID0+XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJyZW50OiBzdGF0dXMuY3VycmVudCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICB0cmFja2luZzogc3RhdHVzLnRyYWNraW5nIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJyYW5jaGVzOiBicmFuY2hlcy5hbGwsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0UmVtb3RlVXJsKHJlbW90ZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5naXQucmVtb3RlKFtcImdldC11cmxcIiwgcmVtb3RlXSkpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgZXJyb3IgaXMgYXQgbGVhc3Qgbm90IGFib3V0IGdpdCBpcyBub3QgZm91bmQgb3Igc2ltaWxhci4gQ2hlY2tzIGlmIHRoZSByZW1vdGUgZXhpc3RzIG9yIG5vdFxuICAgICAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkuY29udGFpbnMocmVtb3RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20va29tZXRlbnN0YXViL29ic2lkaWFuLXZlcnNpb24taGlzdG9yeS1kaWZmL2lzc3Vlcy8zXG4gICAgYXN5bmMgbG9nKFxuICAgICAgICBmaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIHJlbGF0aXZlVG9WYXVsdCA9IHRydWUsXG4gICAgICAgIGxpbWl0PzogbnVtYmVyXG4gICAgKTogUHJvbWlzZTwoTG9nRW50cnkgJiB7IGZpbGVOYW1lPzogc3RyaW5nIH0pW10+IHtcbiAgICAgICAgbGV0IHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICAgIHBhdGggPSB0aGlzLmdldFJlbGF0aXZlUmVwb1BhdGgoZmlsZSwgcmVsYXRpdmVUb1ZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdpdC5sb2coXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZmlsZTogcGF0aCxcbiAgICAgICAgICAgICAgICBtYXhDb3VudDogbGltaXQsXG4gICAgICAgICAgICAgICAgXCItbVwiOiBudWxsLFxuICAgICAgICAgICAgICAgIFwiLS1uYW1lLXN0YXR1c1wiOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnIpID0+IHRoaXMub25FcnJvcihlcnIpXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHJlcy5hbGwubWFwPExvZ0VudHJ5PigoZSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmUsXG4gICAgICAgICAgICBhdXRob3I6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlLmF1dGhvcl9uYW1lLFxuICAgICAgICAgICAgICAgIGVtYWlsOiBlLmF1dGhvcl9lbWFpbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWZzOiBlLnJlZnMuc3BsaXQoXCIsIFwiKS5maWx0ZXIoKGUpID0+IGUubGVuZ3RoID4gMCksXG4gICAgICAgICAgICBkaWZmOiB7XG4gICAgICAgICAgICAgICAgLi4uZS5kaWZmISxcbiAgICAgICAgICAgICAgICBmaWxlczpcbiAgICAgICAgICAgICAgICAgICAgZS5kaWZmPy5maWxlcy5tYXAoKGYpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBmLnN0YXR1cyEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBmLmZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiBlLmhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXVsdF9wYXRoOiB0aGlzLmdldFJlbGF0aXZlVmF1bHRQYXRoKGYuZmlsZSksXG4gICAgICAgICAgICAgICAgICAgIH0pKSA/PyBbXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWxlTmFtZTogZS5kaWZmPy5maWxlcy5maXJzdCgpPy5maWxlLFxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvdyhcbiAgICAgICAgY29tbWl0SGFzaDogc3RyaW5nLFxuICAgICAgICBmaWxlOiBzdHJpbmcsXG4gICAgICAgIHJlbGF0aXZlVG9WYXVsdCA9IHRydWVcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5nZXRSZWxhdGl2ZVJlcG9QYXRoKGZpbGUsIHJlbGF0aXZlVG9WYXVsdCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2l0LnNob3coW2NvbW1pdEhhc2ggKyBcIjpcIiArIHBhdGhdLCAoZXJyKSA9PlxuICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycilcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja291dChicmFuY2g6IHN0cmluZywgcmVtb3RlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChyZW1vdGUpIHtcbiAgICAgICAgICAgIGJyYW5jaCA9IGAke3JlbW90ZX0vJHticmFuY2h9YDtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmdpdC5jaGVja291dChicmFuY2gsIChlcnIpID0+IHRoaXMub25FcnJvcihlcnIpKTtcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLnN1Ym1vZHVsZVJlY3Vyc2VDaGVja291dCkge1xuICAgICAgICAgICAgY29uc3Qgc3VibW9kdWxlUGF0aHMgPSBhd2FpdCB0aGlzLmdldFN1Ym1vZHVsZVBhdGhzKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1Ym1vZHVsZVBhdGggb2Ygc3VibW9kdWxlUGF0aHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBicmFuY2hTdW1tYXJ5ID0gYXdhaXQgdGhpcy5naXRcbiAgICAgICAgICAgICAgICAgICAgLmN3ZCh7IHBhdGg6IHN1Ym1vZHVsZVBhdGgsIHJvb3Q6IGZhbHNlIH0pXG4gICAgICAgICAgICAgICAgICAgIC5icmFuY2goKTtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYnJhbmNoU3VtbWFyeS5icmFuY2hlcykuaW5jbHVkZXMoYnJhbmNoKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLmN3ZCh7IHBhdGg6IHN1Ym1vZHVsZVBhdGgsIHJvb3Q6IGZhbHNlIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2hlY2tvdXQoYnJhbmNoLCAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlQnJhbmNoKGJyYW5jaDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0LmNoZWNrb3V0KFtcIi1iXCIsIGJyYW5jaF0sIChlcnIpID0+IHRoaXMub25FcnJvcihlcnIpKTtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVCcmFuY2goYnJhbmNoOiBzdHJpbmcsIGZvcmNlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0LmJyYW5jaChbZm9yY2UgPyBcIi1EXCIgOiBcIi1kXCIsIGJyYW5jaF0sIChlcnIpID0+XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIGJyYW5jaElzTWVyZ2VkKGJyYW5jaDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IG5vdE1lcmdlZEJyYW5jaGVzID0gYXdhaXQgdGhpcy5naXQuYnJhbmNoKFxuICAgICAgICAgICAgW1wiLS1uby1tZXJnZWRcIl0sXG4gICAgICAgICAgICAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gIW5vdE1lcmdlZEJyYW5jaGVzLmFsbC5jb250YWlucyhicmFuY2gpO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0LmluaXQoZmFsc2UsIChlcnIpID0+IHRoaXMub25FcnJvcihlcnIpKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbG9uZSh1cmw6IHN0cmluZywgZGlyOiBzdHJpbmcsIGRlcHRoPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0LmNsb25lKFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICh0aGlzLmFwcC52YXVsdC5hZGFwdGVyIGFzIEZpbGVTeXN0ZW1BZGFwdGVyKS5nZXRCYXNlUGF0aCgpLFxuICAgICAgICAgICAgICAgIGRpclxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRlcHRoID8gW1wiLS1kZXB0aFwiLCBgJHtkZXB0aH1gXSA6IFtdLFxuICAgICAgICAgICAgKGVycikgPT4gdGhpcy5vbkVycm9yKGVycilcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRDb25maWcocGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0LnJhdyhbXCJjb25maWdcIiwgXCItLWxvY2FsXCIsIFwiLS11bnNldFwiLCBwYXRoXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdpdC5hZGRDb25maWcocGF0aCwgdmFsdWUsIChlcnIpID0+IHRoaXMub25FcnJvcihlcnIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldENvbmZpZyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCB0aGlzLmdpdC5saXN0Q29uZmlnKFwibG9jYWxcIiwgKGVycikgPT5cbiAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBjb25maWcuYWxsW3BhdGhdO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoKHJlbW90ZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmdpdC5mZXRjaChyZW1vdGUgIT0gdW5kZWZpbmVkID8gW3JlbW90ZV0gOiBbXSwgKGVycikgPT5cbiAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnIpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0UmVtb3RlKG5hbWU6IHN0cmluZywgdXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKChhd2FpdCB0aGlzLmdldFJlbW90ZXMoKSkuaW5jbHVkZXMobmFtZSkpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdpdC5yZW1vdGUoW1wic2V0LXVybFwiLCBuYW1lLCB1cmxdLCAoZXJyKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnIpXG4gICAgICAgICAgICApO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0LnJlbW90ZShbXCJhZGRcIiwgbmFtZSwgdXJsXSwgKGVycikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldFJlbW90ZUJyYW5jaGVzKHJlbW90ZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdpdC5icmFuY2goXG4gICAgICAgICAgICBbXCItclwiLCBcIi0tbGlzdFwiLCBgJHtyZW1vdGV9KmBdLFxuICAgICAgICAgICAgKGVycikgPT4gdGhpcy5vbkVycm9yKGVycilcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBsaXN0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBpbiByZXMuYnJhbmNoZXMpIHtcbiAgICAgICAgICAgIGxpc3QucHVzaChyZXMuYnJhbmNoZXNbaXRlbV0ubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0UmVtb3RlcygpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5naXQucmVtb3RlKFtdLCAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKSk7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHJldHVybiByZXMudHJpbSgpLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcmVtb3ZlUmVtb3RlKHJlbW90ZU5hbWU6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLmdpdC5yZW1vdmVSZW1vdGUocmVtb3RlTmFtZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlVXBzdHJlYW1CcmFuY2gocmVtb3RlQnJhbmNoOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGdpdCAxLjgrXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdpdC5icmFuY2goW1wiLS1zZXQtdXBzdHJlYW0tdG9cIiwgcmVtb3RlQnJhbmNoXSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIGdpdCAxLjcgLSAxLjhcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdpdC5icmFuY2goW1wiLS1zZXQtdXBzdHJlYW1cIiwgcmVtb3RlQnJhbmNoXSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAvLyBmYWxsYmFja1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC8vIEEgdHlwZSBlcnJvciBvY2N1cnMgaGVyZSBiZWNhdXNlIHRoZSB0aGlyZCBlbGVtZW50IGNvdWxkIGJlIHVuZGVmaW5lZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgaXQgaXMgdW5saWtlbHkgdG8gYmUgdW5kZWZpbmVkIGR1ZSB0byB0aGUgYHJlbW90ZUJyYW5jaGAncyBmb3JtYXQsIGFuZCBlcnJvciBoYW5kbGluZyBpcyBpbiBwbGFjZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSB0ZW1wb3JhcmlseSBpZ25vcmUgdGhlIGVycm9yLlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIFtcIi0tc2V0LXVwc3RyZWFtXCIsIC4uLnNwbGl0UmVtb3RlQnJhbmNoKHJlbW90ZUJyYW5jaCldLFxuICAgICAgICAgICAgICAgICAgICAoZXJyKSA9PiB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVHaXRQYXRoKF86IHN0cmluZykge1xuICAgICAgICB0aGlzLnNldEdpdEluc3RhbmNlKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlQmFzZVBhdGgoXzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0R2l0SW5zdGFuY2UodHJ1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RGlmZlN0cmluZyhcbiAgICAgICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICAgICAgc3RhZ2VkQ2hhbmdlcyA9IGZhbHNlLFxuICAgICAgICBoYXNoPzogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKHN0YWdlZENoYW5nZXMpXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5naXQuZGlmZihbXCItLWNhY2hlZFwiLCBcIi0tXCIsIGZpbGVQYXRoXSk7XG4gICAgICAgIGlmIChoYXNoKSByZXR1cm4gYXdhaXQgdGhpcy5naXQuc2hvdyhbYCR7aGFzaH1gLCBcIi0tXCIsIGZpbGVQYXRoXSk7XG4gICAgICAgIGVsc2UgcmV0dXJuIGF3YWl0IHRoaXMuZ2l0LmRpZmYoW1wiLS1cIiwgZmlsZVBhdGhdKTtcbiAgICB9XG5cbiAgICBhc3luYyBkaWZmKFxuICAgICAgICBmaWxlOiBzdHJpbmcsXG4gICAgICAgIGNvbW1pdDE6IHN0cmluZyxcbiAgICAgICAgY29tbWl0Mjogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2l0LmRpZmYoW2Ake2NvbW1pdDF9Li4ke2NvbW1pdDJ9YCwgXCItLVwiLCBmaWxlXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRTdWJtb2R1bGVPZkZpbGUoXG4gICAgICAgIHJlcG9zaXRvcnlSZWxhdGl2ZUZpbGU6IHN0cmluZ1xuICAgICk6IFByb21pc2U8eyBzdWJtb2R1bGU6IHN0cmluZzsgcmVsYXRpdmVGaWxlcGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgLy8gRG9jdW1lbnRhdGlvbjogaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1yZXYtcGFyc2VcblxuICAgICAgICAvLyBnaXQgLUMgPGRpci1vZi1maWxlPiByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsXG4gICAgICAgIC8vIHJldHVybnMgdGhlIHN1Ym1vZHVsZXMgcmVwb3NpdG9yeSByb290IGFzIGFuIGFic29sdXRlIHBhdGhcbiAgICAgICAgbGV0IHN1Ym1vZHVsZVJvb3QgPSBhd2FpdCB0aGlzLmdpdC5yYXcoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgXCItQ1wiLFxuICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShyZXBvc2l0b3J5UmVsYXRpdmVGaWxlKSxcbiAgICAgICAgICAgICAgICBcInJldi1wYXJzZVwiLFxuICAgICAgICAgICAgICAgIFwiLS1zaG93LXRvcGxldmVsXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgKGVycikgPT4gZXJyICYmIGNvbnNvbGUud2FybihcImdldC1zdWJtb2R1bGUtb2YtZmlsZVwiLCBlcnI/Lm1lc3NhZ2UpXG4gICAgICAgICk7XG4gICAgICAgIHN1Ym1vZHVsZVJvb3QgPSBzdWJtb2R1bGVSb290LnRyaW0oKTtcblxuICAgICAgICAvLyBnaXQgLUMgPGRpci1vZi1maWxlPiByZXYtcGFyc2UgLS1zaG93LXN1cGVycHJvamVjdC13b3JraW5nLXRyZWVcbiAgICAgICAgLy8gcmV0dXJucyB0aGUgcGFyZW50IGdpdCByZXBvc2l0b3J5LCBpZiB0aGUgZmlsZSBpcyBpbiBhIHN1Ym1vZHVsZSAtIG90aGVyd2lzZSBlbXB0eS5cbiAgICAgICAgY29uc3Qgc3VwZXJQcm9qZWN0ID0gYXdhaXQgdGhpcy5naXQucmF3KFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFwiLUNcIixcbiAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUocmVwb3NpdG9yeVJlbGF0aXZlRmlsZSksXG4gICAgICAgICAgICAgICAgXCJyZXYtcGFyc2VcIixcbiAgICAgICAgICAgICAgICBcIi0tc2hvdy1zdXBlcnByb2plY3Qtd29ya2luZy10cmVlXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgKGVycikgPT4gZXJyICYmIGNvbnNvbGUud2FybihcImdldC1zdWJtb2R1bGUtb2YtZmlsZVwiLCBlcnI/Lm1lc3NhZ2UpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHN1cGVyUHJvamVjdC50cmltKCkgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIG5vdCBpbiBzdWJtb2R1bGVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZzQWRhcHRlciA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgRmlsZVN5c3RlbUFkYXB0ZXI7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGZzQWRhcHRlci5nZXRGdWxsUGF0aChcbiAgICAgICAgICAgIHBhdGgubm9ybWFsaXplKHJlcG9zaXRvcnlSZWxhdGl2ZUZpbGUpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5ld1JlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoc3VibW9kdWxlUm9vdCwgYWJzb2x1dGVQYXRoKTtcblxuICAgICAgICByZXR1cm4geyBzdWJtb2R1bGU6IHN1Ym1vZHVsZVJvb3QsIHJlbGF0aXZlRmlsZXBhdGg6IG5ld1JlbGF0aXZlUGF0aCB9O1xuICAgIH1cblxuICAgIGFzeW5jIGdldExhc3RDb21taXRUaW1lKCk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdpdC5sb2coeyBuOiAxIH0sIChlcnIpID0+IHRoaXMub25FcnJvcihlcnIpKTtcbiAgICAgICAgaWYgKHJlcyAhPSBudWxsICYmIHJlcy5sYXRlc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHJlcy5sYXRlc3QuZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzR2l0SW5zdGFsbGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc3RldmV1a3gvZ2l0LWpzL2lzc3Vlcy80MDJcbiAgICAgICAgY29uc3QgY29tbWFuZCA9IHNwYXduU3luYyhcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvY2FsU3RvcmFnZS5nZXRHaXRQYXRoKCkgfHwgXCJnaXRcIixcbiAgICAgICAgICAgIFtcIi0tdmVyc2lvblwiXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIixcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoY29tbWFuZC5lcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihjb21tYW5kLmVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRXJyb3IoZXJyb3I6IEVycm9yIHwgbnVsbCkge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtGYWlsdXJlID1cbiAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlLmNvbnRhaW5zKFwiQ291bGQgbm90IHJlc29sdmUgaG9zdFwiKSB8fFxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UubWF0Y2goXG4gICAgICAgICAgICAgICAgICAgIC9zc2g6IGNvbm5lY3QgdG8gaG9zdCAuKj8gcG9ydCAuKj86IE9wZXJhdGlvbiB0aW1lZCBvdXQvXG4gICAgICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UubWF0Y2goXG4gICAgICAgICAgICAgICAgICAgIC9zc2g6IGNvbm5lY3QgdG8gaG9zdCAuKj8gcG9ydCAuKj86IE5ldHdvcmsgaXMgdW5yZWFjaGFibGUvXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghbmV0d29ya0ZhaWx1cmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kaXNwbGF5RXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnBsdWdpbi5vZmZsaW5lTW9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRpc3BsYXlFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJHaXQ6IEdvaW5nIGludG8gb2ZmbGluZSBtb2RlLiBGdXR1cmUgbmV0d29yayBlcnJvcnMgd2lsbCBubyBsb25nZXIgYmUgZGlzcGxheWVkLlwiLFxuICAgICAgICAgICAgICAgICAgICAyMDAwXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5ldHdvcmtGYWlsdXJlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ub2ZmbGluZU1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgemVyb0NvbW1pdDogQmxhbWVDb21taXQgPSB7XG4gICAgaGFzaDogXCIwMDAwMDBcIixcbiAgICBpc1plcm9Db21taXQ6IHRydWUsXG4gICAgc3VtbWFyeTogXCJcIixcbn07XG5cbi8vIFBhcnNlIGdpdCBibGFtZSBwb3JjZWxhaW4gZm9ybWF0OiBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LWJsYW1lI190aGVfcG9yY2VsYWluX2Zvcm1hdFxuZnVuY3Rpb24gcGFyc2VCbGFtZShibGFtZU91dHB1dFVubm9ybWFsaXplZDogc3RyaW5nKTogQmxhbWUge1xuICAgIGNvbnN0IGJsYW1lT3V0cHV0ID0gYmxhbWVPdXRwdXRVbm5vcm1hbGl6ZWQucmVwbGFjZShcIlxcclxcblwiLCBcIlxcblwiKTtcblxuICAgIGNvbnN0IGJsYW1lTGluZXMgPSBibGFtZU91dHB1dC5zcGxpdChcIlxcblwiKTtcblxuICAgIGNvbnN0IHJlc3VsdDogQmxhbWUgPSB7XG4gICAgICAgIGNvbW1pdHM6IG5ldyBNYXAoKSxcbiAgICAgICAgaGFzaFBlckxpbmU6IFt1bmRlZmluZWQhXSwgLy8gb25lLWJhc2VkIGluZGljZXNcbiAgICAgICAgb3JpZ2luYWxGaWxlTGluZU5yUGVyTGluZTogW3VuZGVmaW5lZCFdLFxuICAgICAgICBmaW5hbEZpbGVMaW5lTnJQZXJMaW5lOiBbdW5kZWZpbmVkIV0sXG4gICAgICAgIGdyb3VwU2l6ZVBlclN0YXJ0aW5nTGluZTogbmV3IE1hcCgpLFxuICAgIH07XG5cbiAgICBsZXQgbGluZSA9IDE7XG4gICAgZm9yIChsZXQgYmkgPSAwOyBiaSA8IGJsYW1lTGluZXMubGVuZ3RoOyApIHtcbiAgICAgICAgaWYgKHN0YXJ0c1dpdGhOb25XaGl0ZXNwYWNlKGJsYW1lTGluZXNbYmldKSkge1xuICAgICAgICAgICAgY29uc3QgbGluZUluZm8gPSBibGFtZUxpbmVzW2JpXS5zcGxpdChcIiBcIik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBwYXJzZUxpbmVJbmZvSW50byhsaW5lSW5mbywgbGluZSwgcmVzdWx0KTtcbiAgICAgICAgICAgIGJpKys7XG5cbiAgICAgICAgICAgIC8vIHBhcnNlIGhlYWRlciB2YWx1ZXMgdW50aWwgYSB0YWIgaXMgZW5jb3VudGVyZWRcbiAgICAgICAgICAgIGZvciAoOyBzdGFydHNXaXRoTm9uV2hpdGVzcGFjZShibGFtZUxpbmVzW2JpXSk7IGJpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGFjZVNlcGFyYXRlZEhlYWRlclZhbHVlcyA9IGJsYW1lTGluZXNbYmldLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBwYXJzZUhlYWRlckludG8oc3BhY2VTZXBhcmF0ZWRIZWFkZXJWYWx1ZXMsIHJlc3VsdCwgbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGl6ZUJsYW1lQ29tbWl0SW5mbyhyZXN1bHQuY29tbWl0cy5nZXQoY29tbWl0SGFzaCkhKTtcblxuICAgICAgICAgICAgLy8gc2tpcCB0YWIgcHJlZml4ZWQgbGluZVxuICAgICAgICAgICAgbGluZSArPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKGJsYW1lTGluZXNbYmldID09PSBcIlwiICYmIGJpID09PSBibGFtZUxpbmVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIC8vIEVPRlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIG5vbi13aGl0ZXNwYWNlIGxpbmUgb3IgRU9GLCBidXQgZm91bmQ6ICR7YmxhbWVMaW5lc1tiaV19YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBiaSsrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpbmVJbmZvSW50byhsaW5lSW5mbzogc3RyaW5nW10sIGxpbmU6IG51bWJlciwgcmVzdWx0OiBCbGFtZSkge1xuICAgIGNvbnN0IGhhc2ggPSBsaW5lSW5mb1swXTtcbiAgICByZXN1bHQuaGFzaFBlckxpbmUucHVzaChoYXNoKTtcbiAgICByZXN1bHQub3JpZ2luYWxGaWxlTGluZU5yUGVyTGluZS5wdXNoKHBhcnNlSW50KGxpbmVJbmZvWzFdKSk7XG4gICAgcmVzdWx0LmZpbmFsRmlsZUxpbmVOclBlckxpbmUucHVzaChwYXJzZUludChsaW5lSW5mb1syXSkpO1xuICAgIGxpbmVJbmZvLmxlbmd0aCA+PSA0ICYmXG4gICAgICAgIHJlc3VsdC5ncm91cFNpemVQZXJTdGFydGluZ0xpbmUuc2V0KGxpbmUsIHBhcnNlSW50KGxpbmVJbmZvWzNdKSk7XG5cbiAgICBpZiAocGFyc2VJbnQobGluZUluZm9bMl0pICE9PSBsaW5lKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYGdpdC1ibGFtZSBvdXRwdXQgaXMgb3V0IG9mIG9yZGVyOiAke2xpbmV9IHZzICR7bGluZUluZm9bMl19YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNoO1xufVxuXG5mdW5jdGlvbiBwYXJzZUhlYWRlckludG8oaGVhZGVyOiBzdHJpbmdbXSwgb3V0OiBCbGFtZSwgbGluZTogbnVtYmVyKSB7XG4gICAgY29uc3Qga2V5ID0gaGVhZGVyWzBdO1xuICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyLnNsaWNlKDEpLmpvaW4oXCIgXCIpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXQuaGFzaFBlckxpbmVbbGluZV07XG4gICAgY29uc3QgY29tbWl0ID1cbiAgICAgICAgb3V0LmNvbW1pdHMuZ2V0KGNvbW1pdEhhc2gpIHx8XG4gICAgICAgIDxCbGFtZUNvbW1pdD57XG4gICAgICAgICAgICBoYXNoOiBjb21taXRIYXNoLFxuICAgICAgICAgICAgYXV0aG9yOiB7fSxcbiAgICAgICAgICAgIGNvbW1pdHRlcjoge30sXG4gICAgICAgICAgICBwcmV2aW91czoge30sXG4gICAgICAgIH07XG5cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwic3VtbWFyeVwiOlxuICAgICAgICAgICAgY29tbWl0LnN1bW1hcnkgPSB2YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJhdXRob3JcIjpcbiAgICAgICAgICAgIGNvbW1pdC5hdXRob3IhLm5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXV0aG9yLW1haWxcIjpcbiAgICAgICAgICAgIGNvbW1pdC5hdXRob3IhLmVtYWlsID0gcmVtb3ZlRW1haWxCcmFja2V0cyh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImF1dGhvci10aW1lXCI6XG4gICAgICAgICAgICBjb21taXQuYXV0aG9yIS5lcG9jaFNlY29uZHMgPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImF1dGhvci10elwiOlxuICAgICAgICAgICAgY29tbWl0LmF1dGhvciEudHogPSB2YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJjb21taXR0ZXJcIjpcbiAgICAgICAgICAgIGNvbW1pdC5jb21taXR0ZXIhLm5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiY29tbWl0dGVyLW1haWxcIjpcbiAgICAgICAgICAgIGNvbW1pdC5jb21taXR0ZXIhLmVtYWlsID0gcmVtb3ZlRW1haWxCcmFja2V0cyh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImNvbW1pdHRlci10aW1lXCI6XG4gICAgICAgICAgICBjb21taXQuY29tbWl0dGVyIS5lcG9jaFNlY29uZHMgPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImNvbW1pdHRlci10elwiOlxuICAgICAgICAgICAgY29tbWl0LmNvbW1pdHRlciEudHogPSB2YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJwcmV2aW91c1wiOlxuICAgICAgICAgICAgY29tbWl0LnByZXZpb3VzIS5jb21taXRIYXNoID0gdmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImZpbGVuYW1lXCI6XG4gICAgICAgICAgICBjb21taXQucHJldmlvdXMhLmZpbGVuYW1lID0gdmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgb3V0LmNvbW1pdHMuc2V0KGNvbW1pdEhhc2gsIGNvbW1pdCk7XG59XG5cbmZ1bmN0aW9uIGZpbmFsaXplQmxhbWVDb21taXRJbmZvKGNvbW1pdDogQmxhbWVDb21taXQpIHtcbiAgICBpZiAoY29tbWl0LnN1bW1hcnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBFcnJvcihgU3VtbWFyeSBub3QgcHJvdmlkZWQgZm9yIGNvbW1pdDogJHtjb21taXQuaGFzaH1gKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWRPckVtcHR5T2JqZWN0KGNvbW1pdC5hdXRob3IpKSB7XG4gICAgICAgIGNvbW1pdC5hdXRob3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChpc1VuZGVmaW5lZE9yRW1wdHlPYmplY3QoY29tbWl0LmNvbW1pdHRlcikpIHtcbiAgICAgICAgY29tbWl0LmNvbW1pdHRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGlzVW5kZWZpbmVkT3JFbXB0eU9iamVjdChjb21taXQucHJldmlvdXMpKSB7XG4gICAgICAgIGNvbW1pdC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb21taXQuaXNaZXJvQ29tbWl0ID0gQm9vbGVhbihjb21taXQuaGFzaC5tYXRjaCgvXjAqJC8pKTtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWRPckVtcHR5T2JqZWN0KG9iajogb2JqZWN0IHwgdW5kZWZpbmVkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhb2JqIHx8IE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xufVxuXG5mdW5jdGlvbiBzdGFydHNXaXRoTm9uV2hpdGVzcGFjZShzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdHIubGVuZ3RoID4gMCAmJiBzdHJbMF0udHJpbSgpID09PSBzdHJbMF07XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtYWlsQnJhY2tldHMoZ2l0RW1haWw6IHN0cmluZykge1xuICAgIGNvbnN0IHByZWZpeENsZWFuZWQgPSBnaXRFbWFpbC5zdGFydHNXaXRoKFwiPFwiKVxuICAgICAgICA/IGdpdEVtYWlsLnN1YnN0cmluZygxKVxuICAgICAgICA6IGdpdEVtYWlsO1xuICAgIHJldHVybiBwcmVmaXhDbGVhbmVkLmVuZHNXaXRoKFwiPlwiKVxuICAgICAgICA/IHByZWZpeENsZWFuZWQuc3Vic3RyaW5nKDAsIHByZWZpeENsZWFuZWQubGVuZ3RoIC0gMSlcbiAgICAgICAgOiBwcmVmaXhDbGVhbmVkO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2ltcGxlR2l0VGFzayB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgYEdpdEVycm9yYCBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBgZ2l0YCBwcm9jZXNzIHRocm93cyBhXG4gKiBmYXRhbCBleGNlcHRpb24gKGVnIGFuIGBFTk9FTlRgIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlIGFcbiAqIG5vbi13cml0YWJsZSBkaXJlY3RvcnkgYXMgdGhlIHJvb3QgZm9yIHlvdXIgcmVwbyksIGFuZCBhY3RzIGFzIHRoZVxuICogYmFzZSBjbGFzcyBmb3IgbW9yZSBzcGVjaWZpYyBlcnJvcnMgdGhyb3duIGJ5IHRoZSBwYXJzaW5nIG9mIHRoZVxuICogZ2l0IHJlc3BvbnNlIG9yIGVycm9ycyBpbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFzayBhYm91dCB0b1xuICogYmUgcnVuLlxuICpcbiAqIFdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biwgcGVuZGluZyB0YXNrcyBpbiB0aGUgc2FtZSBpbnN0YW5jZSB3aWxsXG4gKiBub3QgYmUgZXhlY3V0ZWQuIFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gcnVuIGEgc2VyaWVzIG9mIHRhc2tzIHRoYXRcbiAqIGNhbiBpbmRlcGVuZGVudGx5IGZhaWwgd2l0aG91dCBuZWVkaW5nIHRvIHByZXZlbnQgZnV0dXJlIHRhc2tzIGZyb21cbiAqIHJ1bm5pbmcgaXMgdG8gY2F0Y2ggdGhlbSBpbmRpdmlkdWFsbHk6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuIGltcG9ydCB7IGdpdFAsIFNpbXBsZUdpdCwgR2l0RXJyb3IsIFB1bGxSZXN1bHQgfSBmcm9tICdzaW1wbGUtZ2l0JztcblxuIGZ1bmN0aW9uIGNhdGNoVGFzayAoZTogR2l0RXJyb3IpIHtcbiAgIHJldHVybiBlLlxuIH1cblxuIGNvbnN0IGdpdCA9IGdpdFAocmVwb1dvcmtpbmdEaXIpO1xuIGNvbnN0IHB1bGxlZDogUHVsbFJlc3VsdCB8IEdpdEVycm9yID0gYXdhaXQgZ2l0LnB1bGwoKS5jYXRjaChjYXRjaFRhc2spO1xuIGNvbnN0IHB1c2hlZDogc3RyaW5nIHwgR2l0RXJyb3IgPSBhd2FpdCBnaXQucHVzaFRhZ3MoKS5jYXRjaChjYXRjaFRhc2spO1xuIGBgYFxuICovXG5leHBvcnQgY2xhc3MgR2l0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICBjb25zdHJ1Y3RvcihwdWJsaWMgdGFzaz86IFNpbXBsZUdpdFRhc2s8YW55PiwgbWVzc2FnZT86IHN0cmluZykge1xuICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICAgfVxufVxuIiwgImltcG9ydCB7IEdpdEVycm9yIH0gZnJvbSAnLi9naXQtZXJyb3InO1xuXG4vKipcbiAqIFRoZSBgR2l0UmVzcG9uc2VFcnJvcmAgaXMgdGhlIHdyYXBwZXIgZm9yIGEgcGFyc2VkIHJlc3BvbnNlIHRoYXQgaXMgdHJlYXRlZCBhc1xuICogYSBmYXRhbCBlcnJvciwgZm9yIGV4YW1wbGUgYXR0ZW1wdGluZyBhIGBtZXJnZWAgY2FuIGxlYXZlIHRoZSByZXBvIGluIGEgY29ycnVwdGVkXG4gKiBzdGF0ZSB3aGVuIHRoZXJlIGFyZSBjb25mbGljdHMgc28gdGhlIHRhc2sgd2lsbCByZWplY3QgcmF0aGVyIHRoYW4gcmVzb2x2ZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgY2F0Y2hpbmcgdGhlIG1lcmdlIGNvbmZsaWN0IGV4Y2VwdGlvbjpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gaW1wb3J0IHsgZ2l0UCwgU2ltcGxlR2l0LCBHaXRSZXNwb25zZUVycm9yLCBNZXJnZVN1bW1hcnkgfSBmcm9tICdzaW1wbGUtZ2l0JztcblxuIGNvbnN0IGdpdCA9IGdpdFAocmVwb1Jvb3QpO1xuIGNvbnN0IG1lcmdlT3B0aW9uczogc3RyaW5nW10gPSBbJy0tbm8tZmYnLCAnb3RoZXItYnJhbmNoJ107XG4gY29uc3QgbWVyZ2VTdW1tYXJ5OiBNZXJnZVN1bW1hcnkgPSBhd2FpdCBnaXQubWVyZ2UobWVyZ2VPcHRpb25zKVxuICAgICAgLmNhdGNoKChlOiBHaXRSZXNwb25zZUVycm9yPE1lcmdlU3VtbWFyeT4pID0+IGUuZ2l0KTtcblxuIGlmIChtZXJnZVN1bW1hcnkuZmFpbGVkKSB7XG4gICAvLyBkZWFsIHdpdGggdGhlIGVycm9yXG4gfVxuIGBgYFxuICovXG5leHBvcnQgY2xhc3MgR2l0UmVzcG9uc2VFcnJvcjxUID0gYW55PiBleHRlbmRzIEdpdEVycm9yIHtcbiAgIGNvbnN0cnVjdG9yKFxuICAgICAgLyoqXG4gICAgICAgKiBgLmdpdGAgYWNjZXNzIHRoZSBwYXJzZWQgcmVzcG9uc2UgdGhhdCBpcyB0cmVhdGVkIGFzIGJlaW5nIGFuIGVycm9yXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyByZWFkb25seSBnaXQ6IFQsXG4gICAgICBtZXNzYWdlPzogc3RyaW5nXG4gICApIHtcbiAgICAgIHN1cGVyKHVuZGVmaW5lZCwgbWVzc2FnZSB8fCBTdHJpbmcoZ2l0KSk7XG4gICB9XG59XG4iLCAiaW1wb3J0IHsgR2l0RXJyb3IgfSBmcm9tICcuL2dpdC1lcnJvcic7XG5cbi8qKlxuICogVGhlIGBUYXNrQ29uZmlndXJhdGlvbkVycm9yYCBpcyB0aHJvd24gd2hlbiBhIGNvbW1hbmQgd2FzIGluY29ycmVjdGx5XG4gKiBjb25maWd1cmVkLiBBbiBlcnJvciBvZiB0aGlzIGtpbmQgbWVhbnMgdGhhdCBubyBhdHRlbXB0IHdhcyBtYWRlIHRvXG4gKiBydW4geW91ciBjb21tYW5kIHRocm91Z2ggdGhlIHVuZGVybHlpbmcgYGdpdGAgYmluYXJ5LlxuICpcbiAqIENoZWNrIHRoZSBgLm1lc3NhZ2VgIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbCBvbiB3aHkgeW91ciBjb25maWd1cmF0aW9uXG4gKiByZXN1bHRlZCBpbiBhbiBlcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBHaXRFcnJvciB7XG4gICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICBzdXBlcih1bmRlZmluZWQsIG1lc3NhZ2UpO1xuICAgfVxufVxuIiwgImltcG9ydCB7IGV4aXN0cywgRk9MREVSIH0gZnJvbSAnQGt3c2l0ZXMvZmlsZS1leGlzdHMnO1xuaW1wb3J0IHsgTWF5YmUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBOVUxMID0gJ1xcMCc7XG5cbmV4cG9ydCBjb25zdCBOT09QOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuLyoqXG4gKiBSZXR1cm5zIGVpdGhlciB0aGUgc291cmNlIGFyZ3VtZW50IHdoZW4gaXQgaXMgYSBgRnVuY3Rpb25gLCBvciB0aGUgZGVmYXVsdFxuICogYE5PT1BgIGZ1bmN0aW9uIGNvbnN0YW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0Z1bmN0aW9uPFQgZXh0ZW5kcyAoKSA9PiBhbnk+KHNvdXJjZTogVCB8IGFueSk6IFQge1xuICAgcmV0dXJuIHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicgPyBzb3VyY2UgOiBOT09QO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3VwcGxpZWQgYXJndW1lbnQgaXMgYm90aCBhIGZ1bmN0aW9uLCBhbmQgaXMgbm90XG4gKiB0aGUgYE5PT1BgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNVc2VyRnVuY3Rpb248VCBleHRlbmRzIEZ1bmN0aW9uPihzb3VyY2U6IFQgfCBhbnkpOiBzb3VyY2UgaXMgVCB7XG4gICByZXR1cm4gdHlwZW9mIHNvdXJjZSA9PT0gJ2Z1bmN0aW9uJyAmJiBzb3VyY2UgIT09IE5PT1A7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdE9uKGlucHV0OiBzdHJpbmcsIGNoYXI6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgY29uc3QgaW5kZXggPSBpbnB1dC5pbmRleE9mKGNoYXIpO1xuICAgaWYgKGluZGV4IDw9IDApIHtcbiAgICAgIHJldHVybiBbaW5wdXQsICcnXTtcbiAgIH1cblxuICAgcmV0dXJuIFtpbnB1dC5zdWJzdHIoMCwgaW5kZXgpLCBpbnB1dC5zdWJzdHIoaW5kZXggKyAxKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdDxUIGV4dGVuZHMgYW55W10+KGlucHV0OiBULCBvZmZzZXQ/OiBudW1iZXIpOiBNYXliZTxUW251bWJlcl0+O1xuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0PFQgZXh0ZW5kcyBJQXJndW1lbnRzPihpbnB1dDogVCwgb2Zmc2V0PzogbnVtYmVyKTogTWF5YmU8dW5rbm93bj47XG5leHBvcnQgZnVuY3Rpb24gZmlyc3QoaW5wdXQ6IGFueVtdIHwgSUFyZ3VtZW50cywgb2Zmc2V0ID0gMCk6IE1heWJlPHVua25vd24+IHtcbiAgIHJldHVybiBpc0FycmF5TGlrZShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID4gb2Zmc2V0ID8gaW5wdXRbb2Zmc2V0XSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhc3Q8VCBleHRlbmRzIGFueVtdPihpbnB1dDogVCwgb2Zmc2V0PzogbnVtYmVyKTogTWF5YmU8VFtudW1iZXJdPjtcbmV4cG9ydCBmdW5jdGlvbiBsYXN0PFQgZXh0ZW5kcyBJQXJndW1lbnRzPihpbnB1dDogVCwgb2Zmc2V0PzogbnVtYmVyKTogTWF5YmU8dW5rbm93bj47XG5leHBvcnQgZnVuY3Rpb24gbGFzdDxUPihpbnB1dDogVCwgb2Zmc2V0PzogbnVtYmVyKTogTWF5YmU8dW5rbm93bj47XG5leHBvcnQgZnVuY3Rpb24gbGFzdChpbnB1dDogdW5rbm93biwgb2Zmc2V0ID0gMCkge1xuICAgaWYgKGlzQXJyYXlMaWtlKGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPiBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBpbnB1dFtpbnB1dC5sZW5ndGggLSAxIC0gb2Zmc2V0XTtcbiAgIH1cbn1cblxudHlwZSBBcnJheUxpa2U8VCA9IGFueT4gPSBUW10gfCBJQXJndW1lbnRzIHwgeyBbaW5kZXg6IG51bWJlcl06IFQ7IGxlbmd0aDogbnVtYmVyIH07XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKGlucHV0OiBhbnkpOiBpbnB1dCBpcyBBcnJheUxpa2Uge1xuICAgcmV0dXJuICEhKGlucHV0ICYmIHR5cGVvZiBpbnB1dC5sZW5ndGggPT09ICdudW1iZXInKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvTGluZXNXaXRoQ29udGVudChpbnB1dCA9ICcnLCB0cmltbWVkID0gdHJ1ZSwgc2VwYXJhdG9yID0gJ1xcbicpOiBzdHJpbmdbXSB7XG4gICByZXR1cm4gaW5wdXQuc3BsaXQoc2VwYXJhdG9yKS5yZWR1Y2UoKG91dHB1dCwgbGluZSkgPT4ge1xuICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSB0cmltbWVkID8gbGluZS50cmltKCkgOiBsaW5lO1xuICAgICAgaWYgKGxpbmVDb250ZW50KSB7XG4gICAgICAgICBvdXRwdXQucHVzaChsaW5lQ29udGVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgfSwgW10gYXMgc3RyaW5nW10pO1xufVxuXG50eXBlIExpbmVXaXRoQ29udGVudENhbGxiYWNrPFQgPSB2b2lkPiA9IChsaW5lOiBzdHJpbmcpID0+IFQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoTGluZVdpdGhDb250ZW50PFQ+KFxuICAgaW5wdXQ6IHN0cmluZyxcbiAgIGNhbGxiYWNrOiBMaW5lV2l0aENvbnRlbnRDYWxsYmFjazxUPlxuKTogVFtdIHtcbiAgIHJldHVybiB0b0xpbmVzV2l0aENvbnRlbnQoaW5wdXQsIHRydWUpLm1hcCgobGluZSkgPT4gY2FsbGJhY2sobGluZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9sZGVyRXhpc3RzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgcmV0dXJuIGV4aXN0cyhwYXRoLCBGT0xERVIpO1xufVxuXG4vKipcbiAqIEFkZHMgYGl0ZW1gIGludG8gdGhlIGB0YXJnZXRgIGBBcnJheWAgb3IgYFNldGAgd2hlbiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGFuZCByZXR1cm5zIHRoZSBgaXRlbWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmQ8VD4odGFyZ2V0OiBUW10gfCBTZXQ8VD4sIGl0ZW06IFQpOiB0eXBlb2YgaXRlbSB7XG4gICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICB9XG4gICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LmFkZChpdGVtKTtcbiAgIH1cbiAgIHJldHVybiBpdGVtO1xufVxuXG4vKipcbiAqIEFkZHMgYGl0ZW1gIGludG8gdGhlIGB0YXJnZXRgIGBBcnJheWAgd2hlbiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGFuZCByZXR1cm5zIHRoZSBgdGFyZ2V0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY2x1ZGluZzxUPih0YXJnZXQ6IFRbXSwgaXRlbTogVCk6IHR5cGVvZiB0YXJnZXQge1xuICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiAhdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICB0YXJnZXQucHVzaChpdGVtKTtcbiAgIH1cblxuICAgcmV0dXJuIHRhcmdldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZTxUPih0YXJnZXQ6IFNldDxUPiB8IFRbXSwgaXRlbTogVCk6IFQge1xuICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0YXJnZXQuaW5kZXhPZihpdGVtKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICB0YXJnZXQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQuZGVsZXRlKGl0ZW0pO1xuICAgfVxuICAgcmV0dXJuIGl0ZW07XG59XG5cbmV4cG9ydCBjb25zdCBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIGFzIChcbiAgIGlucHV0OiBhbnlcbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNBcnJheTxUPihzb3VyY2U6IFQgfCBUW10pOiBUW10ge1xuICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc291cmNlKSA/IHNvdXJjZSA6IFtzb3VyY2VdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNTdHJpbmdBcnJheTxUPihzb3VyY2U6IFQgfCBUW10pOiBzdHJpbmdbXSB7XG4gICByZXR1cm4gYXNBcnJheShzb3VyY2UpLm1hcChTdHJpbmcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNOdW1iZXIoc291cmNlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBvbk5hTiA9IDApIHtcbiAgIGlmIChzb3VyY2UgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9uTmFOO1xuICAgfVxuXG4gICBjb25zdCBudW0gPSBwYXJzZUludChzb3VyY2UsIDEwKTtcbiAgIHJldHVybiBpc05hTihudW0pID8gb25OYU4gOiBudW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVmaXhlZEFycmF5PFQ+KGlucHV0OiBUW10sIHByZWZpeDogVCk6IFRbXSB7XG4gICBjb25zdCBvdXRwdXQ6IFRbXSA9IFtdO1xuICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IGlucHV0Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICBvdXRwdXQucHVzaChwcmVmaXgsIGlucHV0W2ldKTtcbiAgIH1cbiAgIHJldHVybiBvdXRwdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJUb1N0cmluZyhpbnB1dDogQnVmZmVyIHwgQnVmZmVyW10pOiBzdHJpbmcge1xuICAgcmV0dXJuIChBcnJheS5pc0FycmF5KGlucHV0KSA/IEJ1ZmZlci5jb25jYXQoaW5wdXQpIDogaW5wdXQpLnRvU3RyaW5nKCd1dGYtOCcpO1xufVxuXG4vKipcbiAqIEdldCBhIG5ldyBvYmplY3QgZnJvbSBhIHNvdXJjZSBvYmplY3Qgd2l0aCBvbmx5IHRoZSBsaXN0ZWQgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2soc291cmNlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSkge1xuICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIC4uLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gKHByb3BlcnR5IGluIHNvdXJjZSA/IHsgW3Byb3BlcnR5XTogc291cmNlW3Byb3BlcnR5XSB9IDoge30pKVxuICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGF5KGR1cmF0aW9uID0gMCk6IFByb21pc2U8dm9pZD4ge1xuICAgcmV0dXJuIG5ldyBQcm9taXNlKChkb25lKSA9PiBzZXRUaW1lb3V0KGRvbmUsIGR1cmF0aW9uKSk7XG59XG4iLCAiaW1wb3J0IHsgTWF5YmUsIE9wdGlvbnMsIFByaW1pdGl2ZXMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBvYmplY3RUb1N0cmluZyB9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJndW1lbnRGaWx0ZXJQcmVkaWNhdGU8VD4ge1xuICAgKGlucHV0OiBhbnkpOiBpbnB1dCBpcyBUO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVHlwZTxULCBLPihcbiAgIGlucHV0OiBLLFxuICAgZmlsdGVyOiBBcmd1bWVudEZpbHRlclByZWRpY2F0ZTxUPlxuKTogSyBleHRlbmRzIFQgPyBUIDogdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclR5cGU8VCwgSz4oaW5wdXQ6IEssIGZpbHRlcjogQXJndW1lbnRGaWx0ZXJQcmVkaWNhdGU8VD4sIGRlZjogVCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVHlwZTxULCBLPihpbnB1dDogSywgZmlsdGVyOiBBcmd1bWVudEZpbHRlclByZWRpY2F0ZTxUPiwgZGVmPzogVCk6IE1heWJlPFQ+IHtcbiAgIGlmIChmaWx0ZXIoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gaW5wdXQ7XG4gICB9XG4gICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBkZWYgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJBcnJheTogQXJndW1lbnRGaWx0ZXJQcmVkaWNhdGU8QXJyYXk8YW55Pj4gPSAoaW5wdXQpOiBpbnB1dCBpcyBBcnJheTxhbnk+ID0+IHtcbiAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJQcmltaXRpdmVzKFxuICAgaW5wdXQ6IHVua25vd24sXG4gICBvbWl0PzogQXJyYXk8J2Jvb2xlYW4nIHwgJ3N0cmluZycgfCAnbnVtYmVyJz5cbik6IGlucHV0IGlzIFByaW1pdGl2ZXMge1xuICAgcmV0dXJuIChcbiAgICAgIC9udW1iZXJ8c3RyaW5nfGJvb2xlYW4vLnRlc3QodHlwZW9mIGlucHV0KSAmJlxuICAgICAgKCFvbWl0IHx8ICFvbWl0LmluY2x1ZGVzKHR5cGVvZiBpbnB1dCBhcyAnYm9vbGVhbicgfCAnc3RyaW5nJyB8ICdudW1iZXInKSlcbiAgICk7XG59XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJTdHJpbmc6IEFyZ3VtZW50RmlsdGVyUHJlZGljYXRlPHN0cmluZz4gPSAoaW5wdXQpOiBpbnB1dCBpcyBzdHJpbmcgPT4ge1xuICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7XG59O1xuXG5leHBvcnQgY29uc3QgZmlsdGVyU3RyaW5nQXJyYXk6IEFyZ3VtZW50RmlsdGVyUHJlZGljYXRlPHN0cmluZ1tdPiA9IChpbnB1dCk6IGlucHV0IGlzIHN0cmluZ1tdID0+IHtcbiAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSAmJiBpbnB1dC5ldmVyeShmaWx0ZXJTdHJpbmcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXk6IEFyZ3VtZW50RmlsdGVyUHJlZGljYXRlPHN0cmluZyB8IHN0cmluZ1tdPiA9IChcbiAgIGlucHV0XG4pOiBpbnB1dCBpcyBzdHJpbmcgfCBzdHJpbmdbXSA9PiB7XG4gICByZXR1cm4gZmlsdGVyU3RyaW5nKGlucHV0KSB8fCAoQXJyYXkuaXNBcnJheShpbnB1dCkgJiYgaW5wdXQuZXZlcnkoZmlsdGVyU3RyaW5nKSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUGxhaW5PYmplY3Q8VCBleHRlbmRzIE9wdGlvbnM+KGlucHV0OiBUIHwgdW5rbm93bik6IGlucHV0IGlzIFQ7XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUGxhaW5PYmplY3Q8VCBleHRlbmRzIE9iamVjdD4oaW5wdXQ6IFQgfCB1bmtub3duKTogaW5wdXQgaXMgVCB7XG4gICByZXR1cm4gISFpbnB1dCAmJiBvYmplY3RUb1N0cmluZyhpbnB1dCkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRnVuY3Rpb24oaW5wdXQ6IHVua25vd24pOiBpbnB1dCBpcyBGdW5jdGlvbiB7XG4gICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY29uc3QgZmlsdGVySGFzTGVuZ3RoOiBBcmd1bWVudEZpbHRlclByZWRpY2F0ZTx7IGxlbmd0aDogbnVtYmVyIH0+ID0gKFxuICAgaW5wdXRcbik6IGlucHV0IGlzIHsgbGVuZ3RoOiBudW1iZXIgfSA9PiB7XG4gICBpZiAoaW5wdXQgPT0gbnVsbCB8fCAnbnVtYmVyfGJvb2xlYW58ZnVuY3Rpb24nLmluY2x1ZGVzKHR5cGVvZiBpbnB1dCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgIH1cbiAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSB8fCB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBpbnB1dC5sZW5ndGggPT09ICdudW1iZXInO1xufTtcbiIsICIvKipcbiAqIEtub3duIHByb2Nlc3MgZXhpdCBjb2RlcyB1c2VkIGJ5IHRoZSB0YXNrIHBhcnNlcnMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZXJyb3JcbiAqIHdhcyBvbmUgdGhleSBjYW4gYXV0b21hdGljYWxseSBoYW5kbGVcbiAqL1xuZXhwb3J0IGVudW0gRXhpdENvZGVzIHtcbiAgIFNVQ0NFU1MsXG4gICBFUlJPUixcbiAgIE5PVF9GT1VORCA9IC0yLFxuICAgVU5DTEVBTiA9IDEyOCxcbn1cbiIsICJpbXBvcnQgeyBUYXNrUmVzcG9uc2VGb3JtYXQgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBHaXRPdXRwdXRTdHJlYW1zPFQgZXh0ZW5kcyBUYXNrUmVzcG9uc2VGb3JtYXQgPSBCdWZmZXI+IHtcbiAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBzdGRPdXQ6IFQsIHB1YmxpYyByZWFkb25seSBzdGRFcnI6IFQpIHt9XG5cbiAgIGFzU3RyaW5ncygpOiBHaXRPdXRwdXRTdHJlYW1zPHN0cmluZz4ge1xuICAgICAgcmV0dXJuIG5ldyBHaXRPdXRwdXRTdHJlYW1zKHRoaXMuc3RkT3V0LnRvU3RyaW5nKCd1dGY4JyksIHRoaXMuc3RkRXJyLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBMaW5lUGFyc2VyPFQ+IHtcbiAgIHByb3RlY3RlZCBtYXRjaGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICBwcml2YXRlIF9yZWdFeHA6IFJlZ0V4cFtdO1xuXG4gICBjb25zdHJ1Y3RvcihcbiAgICAgIHJlZ0V4cDogUmVnRXhwIHwgUmVnRXhwW10sXG4gICAgICB1c2VNYXRjaGVzPzogKHRhcmdldDogVCwgbWF0Y2g6IHN0cmluZ1tdKSA9PiBib29sZWFuIHwgdm9pZFxuICAgKSB7XG4gICAgICB0aGlzLl9yZWdFeHAgPSBBcnJheS5pc0FycmF5KHJlZ0V4cCkgPyByZWdFeHAgOiBbcmVnRXhwXTtcbiAgICAgIGlmICh1c2VNYXRjaGVzKSB7XG4gICAgICAgICB0aGlzLnVzZU1hdGNoZXMgPSB1c2VNYXRjaGVzO1xuICAgICAgfVxuICAgfVxuXG4gICBwYXJzZSA9IChsaW5lOiAob2Zmc2V0OiBudW1iZXIpID0+IHN0cmluZyB8IHVuZGVmaW5lZCwgdGFyZ2V0OiBUKTogYm9vbGVhbiA9PiB7XG4gICAgICB0aGlzLnJlc2V0TWF0Y2hlcygpO1xuXG4gICAgICBpZiAoIXRoaXMuX3JlZ0V4cC5ldmVyeSgocmVnLCBpbmRleCkgPT4gdGhpcy5hZGRNYXRjaChyZWcsIGluZGV4LCBsaW5lKGluZGV4KSkpKSB7XG4gICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnVzZU1hdGNoZXModGFyZ2V0LCB0aGlzLnByZXBhcmVNYXRjaGVzKCkpICE9PSBmYWxzZTtcbiAgIH07XG5cbiAgIC8vIEB0cy1pZ25vcmVcbiAgIHByb3RlY3RlZCB1c2VNYXRjaGVzKHRhcmdldDogVCwgbWF0Y2g6IHN0cmluZ1tdKTogYm9vbGVhbiB8IHZvaWQge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5lUGFyc2VyOnVzZU1hdGNoZXMgbm90IGltcGxlbWVudGVkYCk7XG4gICB9XG5cbiAgIHByb3RlY3RlZCByZXNldE1hdGNoZXMoKSB7XG4gICAgICB0aGlzLm1hdGNoZXMubGVuZ3RoID0gMDtcbiAgIH1cblxuICAgcHJvdGVjdGVkIHByZXBhcmVNYXRjaGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcztcbiAgIH1cblxuICAgcHJvdGVjdGVkIGFkZE1hdGNoKHJlZzogUmVnRXhwLCBpbmRleDogbnVtYmVyLCBsaW5lPzogc3RyaW5nKSB7XG4gICAgICBjb25zdCBtYXRjaGVkID0gbGluZSAmJiByZWcuZXhlYyhsaW5lKTtcbiAgICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgICB0aGlzLnB1c2hNYXRjaChpbmRleCwgbWF0Y2hlZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhIW1hdGNoZWQ7XG4gICB9XG5cbiAgIHByb3RlY3RlZCBwdXNoTWF0Y2goX2luZGV4OiBudW1iZXIsIG1hdGNoZWQ6IHN0cmluZ1tdKSB7XG4gICAgICB0aGlzLm1hdGNoZXMucHVzaCguLi5tYXRjaGVkLnNsaWNlKDEpKTtcbiAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbW90ZUxpbmVQYXJzZXI8VD4gZXh0ZW5kcyBMaW5lUGFyc2VyPFQ+IHtcbiAgIHByb3RlY3RlZCBhZGRNYXRjaChyZWc6IFJlZ0V4cCwgaW5kZXg6IG51bWJlciwgbGluZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIC9ecmVtb3RlOlxccy8udGVzdChTdHJpbmcobGluZSkpICYmIHN1cGVyLmFkZE1hdGNoKHJlZywgaW5kZXgsIGxpbmUpO1xuICAgfVxuXG4gICBwcm90ZWN0ZWQgcHVzaE1hdGNoKGluZGV4OiBudW1iZXIsIG1hdGNoZWQ6IHN0cmluZ1tdKSB7XG4gICAgICBpZiAoaW5kZXggPiAwIHx8IG1hdGNoZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgc3VwZXIucHVzaE1hdGNoKGluZGV4LCBtYXRjaGVkKTtcbiAgICAgIH1cbiAgIH1cbn1cbiIsICJpbXBvcnQgeyBTaW1wbGVHaXRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT21pdDxTaW1wbGVHaXRPcHRpb25zLCAnYmFzZURpcic+ID0ge1xuICAgYmluYXJ5OiAnZ2l0JyxcbiAgIG1heENvbmN1cnJlbnRQcm9jZXNzZXM6IDUsXG4gICBjb25maWc6IFtdLFxuICAgdHJpbW1lZDogZmFsc2UsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VDb25maWcoXG4gICAuLi5vcHRpb25zOiBBcnJheTxQYXJ0aWFsPFNpbXBsZUdpdE9wdGlvbnM+IHwgdW5kZWZpbmVkPlxuKTogU2ltcGxlR2l0T3B0aW9ucyB7XG4gICBjb25zdCBiYXNlRGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgIGNvbnN0IGNvbmZpZzogU2ltcGxlR2l0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGJhc2VEaXIsIC4uLmRlZmF1bHRPcHRpb25zIH0sXG4gICAgICAuLi5vcHRpb25zLmZpbHRlcigobykgPT4gdHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG8pXG4gICApO1xuXG4gICBjb25maWcuYmFzZURpciA9IGNvbmZpZy5iYXNlRGlyIHx8IGJhc2VEaXI7XG4gICBjb25maWcudHJpbW1lZCA9IGNvbmZpZy50cmltbWVkID09PSB0cnVlO1xuXG4gICByZXR1cm4gY29uZmlnO1xufVxuIiwgImltcG9ydCB7XG4gICBmaWx0ZXJBcnJheSxcbiAgIGZpbHRlckZ1bmN0aW9uLFxuICAgZmlsdGVyUGxhaW5PYmplY3QsXG4gICBmaWx0ZXJQcmltaXRpdmVzLFxuICAgZmlsdGVyVHlwZSxcbn0gZnJvbSAnLi9hcmd1bWVudC1maWx0ZXJzJztcbmltcG9ydCB7IGFzRnVuY3Rpb24sIGlzVXNlckZ1bmN0aW9uLCBsYXN0IH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IE1heWJlLCBPcHRpb25zLCBPcHRpb25zVmFsdWVzIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kVGFza09wdGlvbnM8VCBleHRlbmRzIE9wdGlvbnMgPSBPcHRpb25zPihcbiAgIG9wdGlvbnM6IE1heWJlPFQ+LFxuICAgY29tbWFuZHM6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZ1tdIHtcbiAgIGlmICghZmlsdGVyUGxhaW5PYmplY3Q8T3B0aW9ucz4ob3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBjb21tYW5kcztcbiAgIH1cblxuICAgcmV0dXJuIE9iamVjdC5rZXlzKG9wdGlvbnMpLnJlZHVjZSgoY29tbWFuZHM6IHN0cmluZ1tdLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IE9wdGlvbnNWYWx1ZXMgPSBvcHRpb25zW2tleV07XG5cbiAgICAgIGlmIChmaWx0ZXJQcmltaXRpdmVzKHZhbHVlLCBbJ2Jvb2xlYW4nXSkpIHtcbiAgICAgICAgIGNvbW1hbmRzLnB1c2goa2V5ICsgJz0nICsgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGNvbW1hbmRzLnB1c2goa2V5KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgfSwgY29tbWFuZHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhaWxpbmdPcHRpb25zKFxuICAgYXJnczogSUFyZ3VtZW50cyxcbiAgIGluaXRpYWxQcmltaXRpdmUgPSAwLFxuICAgb2JqZWN0T25seSA9IGZhbHNlXG4pOiBzdHJpbmdbXSB7XG4gICBjb25zdCBjb21tYW5kOiBzdHJpbmdbXSA9IFtdO1xuXG4gICBmb3IgKGxldCBpID0gMCwgbWF4ID0gaW5pdGlhbFByaW1pdGl2ZSA8IDAgPyBhcmdzLmxlbmd0aCA6IGluaXRpYWxQcmltaXRpdmU7IGkgPCBtYXg7IGkrKykge1xuICAgICAgaWYgKCdzdHJpbmd8bnVtYmVyJy5pbmNsdWRlcyh0eXBlb2YgYXJnc1tpXSkpIHtcbiAgICAgICAgIGNvbW1hbmQucHVzaChTdHJpbmcoYXJnc1tpXSkpO1xuICAgICAgfVxuICAgfVxuXG4gICBhcHBlbmRUYXNrT3B0aW9ucyh0cmFpbGluZ09wdGlvbnNBcmd1bWVudChhcmdzKSwgY29tbWFuZCk7XG4gICBpZiAoIW9iamVjdE9ubHkpIHtcbiAgICAgIGNvbW1hbmQucHVzaCguLi50cmFpbGluZ0FycmF5QXJndW1lbnQoYXJncykpO1xuICAgfVxuXG4gICByZXR1cm4gY29tbWFuZDtcbn1cblxuZnVuY3Rpb24gdHJhaWxpbmdBcnJheUFyZ3VtZW50KGFyZ3M6IElBcmd1bWVudHMpIHtcbiAgIGNvbnN0IGhhc1RyYWlsaW5nQ2FsbGJhY2sgPSB0eXBlb2YgbGFzdChhcmdzKSA9PT0gJ2Z1bmN0aW9uJztcbiAgIHJldHVybiBmaWx0ZXJUeXBlKGxhc3QoYXJncywgaGFzVHJhaWxpbmdDYWxsYmFjayA/IDEgOiAwKSwgZmlsdGVyQXJyYXksIFtdKTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cywgcmV0dXJucyB0aGUgdHJhaWxpbmcgb3B0aW9ucyBhcmd1bWVudCwgaWdub3JpbmcgYSB0cmFpbGluZyBmdW5jdGlvbiBhcmd1bWVudFxuICogaWYgdGhlcmUgaXMgb25lLiBXaGVuIG5vdCBmb3VuZCwgdGhlIHJldHVybiB2YWx1ZSBpcyBudWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhaWxpbmdPcHRpb25zQXJndW1lbnQoYXJnczogSUFyZ3VtZW50cyk6IE1heWJlPE9wdGlvbnM+IHtcbiAgIGNvbnN0IGhhc1RyYWlsaW5nQ2FsbGJhY2sgPSBmaWx0ZXJGdW5jdGlvbihsYXN0KGFyZ3MpKTtcbiAgIHJldHVybiBmaWx0ZXJUeXBlKGxhc3QoYXJncywgaGFzVHJhaWxpbmdDYWxsYmFjayA/IDEgOiAwKSwgZmlsdGVyUGxhaW5PYmplY3QpO1xufVxuXG4vKipcbiAqIFJldHVybnMgZWl0aGVyIHRoZSBzb3VyY2UgYXJndW1lbnQgd2hlbiBpdCBpcyBhIGBGdW5jdGlvbmAsIG9yIHRoZSBkZWZhdWx0XG4gKiBgTk9PUGAgZnVuY3Rpb24gY29uc3RhbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChcbiAgIGFyZ3M6IHVua25vd25bXSB8IElBcmd1bWVudHMgfCB1bmtub3duLFxuICAgaW5jbHVkZU5vb3AgPSB0cnVlXG4pOiBNYXliZTwoLi4uYXJnczogYW55W10pID0+IHVua25vd24+IHtcbiAgIGNvbnN0IGNhbGxiYWNrID0gYXNGdW5jdGlvbihsYXN0KGFyZ3MpKTtcbiAgIHJldHVybiBpbmNsdWRlTm9vcCB8fCBpc1VzZXJGdW5jdGlvbihjYWxsYmFjaykgPyBjYWxsYmFjayA6IHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IE1heWJlQXJyYXksIFRhc2tQYXJzZXIsIFRhc2tSZXNwb25zZUZvcm1hdCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEdpdE91dHB1dFN0cmVhbXMgfSBmcm9tICcuL2dpdC1vdXRwdXQtc3RyZWFtcyc7XG5pbXBvcnQgeyBMaW5lUGFyc2VyIH0gZnJvbSAnLi9saW5lLXBhcnNlcic7XG5pbXBvcnQgeyBhc0FycmF5LCB0b0xpbmVzV2l0aENvbnRlbnQgfSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FsbFRhc2tQYXJzZXI8SU5QVVQgZXh0ZW5kcyBUYXNrUmVzcG9uc2VGb3JtYXQsIFJFU1BPTlNFPihcbiAgIHBhcnNlcjogVGFza1BhcnNlcjxJTlBVVCwgUkVTUE9OU0U+LFxuICAgc3RyZWFtczogR2l0T3V0cHV0U3RyZWFtczxJTlBVVD5cbikge1xuICAgcmV0dXJuIHBhcnNlcihzdHJlYW1zLnN0ZE91dCwgc3RyZWFtcy5zdGRFcnIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdHJpbmdSZXNwb25zZTxUPihcbiAgIHJlc3VsdDogVCxcbiAgIHBhcnNlcnM6IExpbmVQYXJzZXI8VD5bXSxcbiAgIHRleHRzOiBNYXliZUFycmF5PHN0cmluZz4sXG4gICB0cmltID0gdHJ1ZVxuKTogVCB7XG4gICBhc0FycmF5KHRleHRzKS5mb3JFYWNoKCh0ZXh0KSA9PiB7XG4gICAgICBmb3IgKGxldCBsaW5lcyA9IHRvTGluZXNXaXRoQ29udGVudCh0ZXh0LCB0cmltKSwgaSA9IDAsIG1heCA9IGxpbmVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgICBjb25zdCBsaW5lID0gKG9mZnNldCA9IDApID0+IHtcbiAgICAgICAgICAgIGlmIChpICsgb2Zmc2V0ID49IG1heCkge1xuICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxpbmVzW2kgKyBvZmZzZXRdO1xuICAgICAgICAgfTtcblxuICAgICAgICAgcGFyc2Vycy5zb21lKCh7IHBhcnNlIH0pID0+IHBhcnNlKGxpbmUsIHJlc3VsdCkpO1xuICAgICAgfVxuICAgfSk7XG5cbiAgIHJldHVybiByZXN1bHQ7XG59XG4iLCAiZXhwb3J0ICogZnJvbSAnLi9hcmd1bWVudC1maWx0ZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vZXhpdC1jb2Rlcyc7XG5leHBvcnQgKiBmcm9tICcuL2dpdC1vdXRwdXQtc3RyZWFtcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpbmUtcGFyc2VyJztcbmV4cG9ydCAqIGZyb20gJy4vc2ltcGxlLWdpdC1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vdGFzay1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vdGFzay1wYXJzZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbiIsICJpbXBvcnQgeyBFeGl0Q29kZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBNYXliZSwgU3RyaW5nVGFzayB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGVudW0gQ2hlY2tSZXBvQWN0aW9ucyB7XG4gICBCQVJFID0gJ2JhcmUnLFxuICAgSU5fVFJFRSA9ICd0cmVlJyxcbiAgIElTX1JFUE9fUk9PVCA9ICdyb290Jyxcbn1cblxuY29uc3Qgb25FcnJvcjogU3RyaW5nVGFzazxib29sZWFuPlsnb25FcnJvciddID0gKHsgZXhpdENvZGUgfSwgZXJyb3IsIGRvbmUsIGZhaWwpID0+IHtcbiAgIGlmIChleGl0Q29kZSA9PT0gRXhpdENvZGVzLlVOQ0xFQU4gJiYgaXNOb3RSZXBvTWVzc2FnZShlcnJvcikpIHtcbiAgICAgIHJldHVybiBkb25lKEJ1ZmZlci5mcm9tKCdmYWxzZScpKTtcbiAgIH1cblxuICAgZmFpbChlcnJvcik7XG59O1xuXG5jb25zdCBwYXJzZXI6IFN0cmluZ1Rhc2s8Ym9vbGVhbj5bJ3BhcnNlciddID0gKHRleHQpID0+IHtcbiAgIHJldHVybiB0ZXh0LnRyaW0oKSA9PT0gJ3RydWUnO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNSZXBvVGFzayhhY3Rpb246IE1heWJlPENoZWNrUmVwb0FjdGlvbnM+KTogU3RyaW5nVGFzazxib29sZWFuPiB7XG4gICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgY2FzZSBDaGVja1JlcG9BY3Rpb25zLkJBUkU6XG4gICAgICAgICByZXR1cm4gY2hlY2tJc0JhcmVSZXBvVGFzaygpO1xuICAgICAgY2FzZSBDaGVja1JlcG9BY3Rpb25zLklTX1JFUE9fUk9PVDpcbiAgICAgICAgIHJldHVybiBjaGVja0lzUmVwb1Jvb3RUYXNrKCk7XG4gICB9XG5cbiAgIGNvbnN0IGNvbW1hbmRzID0gWydyZXYtcGFyc2UnLCAnLS1pcy1pbnNpZGUtd29yay10cmVlJ107XG5cbiAgIHJldHVybiB7XG4gICAgICBjb21tYW5kcyxcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBwYXJzZXIsXG4gICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc1JlcG9Sb290VGFzaygpOiBTdHJpbmdUYXNrPGJvb2xlYW4+IHtcbiAgIGNvbnN0IGNvbW1hbmRzID0gWydyZXYtcGFyc2UnLCAnLS1naXQtZGlyJ107XG5cbiAgIHJldHVybiB7XG4gICAgICBjb21tYW5kcyxcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBwYXJzZXIocGF0aCkge1xuICAgICAgICAgcmV0dXJuIC9eXFwuKGdpdCk/JC8udGVzdChwYXRoLnRyaW0oKSk7XG4gICAgICB9LFxuICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNCYXJlUmVwb1Rhc2soKTogU3RyaW5nVGFzazxib29sZWFuPiB7XG4gICBjb25zdCBjb21tYW5kcyA9IFsncmV2LXBhcnNlJywgJy0taXMtYmFyZS1yZXBvc2l0b3J5J107XG5cbiAgIHJldHVybiB7XG4gICAgICBjb21tYW5kcyxcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBwYXJzZXIsXG4gICB9O1xufVxuXG5mdW5jdGlvbiBpc05vdFJlcG9NZXNzYWdlKGVycm9yOiBFcnJvcik6IGJvb2xlYW4ge1xuICAgcmV0dXJuIC8oTm90IGEgZ2l0IHJlcG9zaXRvcnl8S2VpbiBHaXQtUmVwb3NpdG9yeSkvaS50ZXN0KFN0cmluZyhlcnJvcikpO1xufVxuIiwgImltcG9ydCB7IENsZWFuU3VtbWFyeSB9IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHsgdG9MaW5lc1dpdGhDb250ZW50IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ2xlYW5SZXNwb25zZSBpbXBsZW1lbnRzIENsZWFuU3VtbWFyeSB7XG4gICBwdWJsaWMgcGF0aHM6IHN0cmluZ1tdID0gW107XG4gICBwdWJsaWMgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICBwdWJsaWMgZm9sZGVyczogc3RyaW5nW10gPSBbXTtcblxuICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGRyeVJ1bjogYm9vbGVhbikge31cbn1cblxuY29uc3QgcmVtb3ZhbFJlZ2V4cCA9IC9eW2Etel0rXFxzKi9pO1xuY29uc3QgZHJ5UnVuUmVtb3ZhbFJlZ2V4cCA9IC9eW2Etel0rXFxzK1thLXpdK1xccyovaTtcbmNvbnN0IGlzRm9sZGVyUmVnZXhwID0gL1xcLyQvO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5TdW1tYXJ5UGFyc2VyKGRyeVJ1bjogYm9vbGVhbiwgdGV4dDogc3RyaW5nKTogQ2xlYW5TdW1tYXJ5IHtcbiAgIGNvbnN0IHN1bW1hcnkgPSBuZXcgQ2xlYW5SZXNwb25zZShkcnlSdW4pO1xuICAgY29uc3QgcmVnZXhwID0gZHJ5UnVuID8gZHJ5UnVuUmVtb3ZhbFJlZ2V4cCA6IHJlbW92YWxSZWdleHA7XG5cbiAgIHRvTGluZXNXaXRoQ29udGVudCh0ZXh0KS5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVkID0gbGluZS5yZXBsYWNlKHJlZ2V4cCwgJycpO1xuXG4gICAgICBzdW1tYXJ5LnBhdGhzLnB1c2gocmVtb3ZlZCk7XG4gICAgICAoaXNGb2xkZXJSZWdleHAudGVzdChyZW1vdmVkKSA/IHN1bW1hcnkuZm9sZGVycyA6IHN1bW1hcnkuZmlsZXMpLnB1c2gocmVtb3ZlZCk7XG4gICB9KTtcblxuICAgcmV0dXJuIHN1bW1hcnk7XG59XG4iLCAiaW1wb3J0IHsgVGFza0NvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycy90YXNrLWNvbmZpZ3VyYXRpb24tZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBCdWZmZXJUYXNrLCBFbXB0eVRhc2tQYXJzZXIsIFNpbXBsZUdpdFRhc2ssIFN0cmluZ1Rhc2sgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBFTVBUWV9DT01NQU5EUzogW10gPSBbXTtcblxuZXhwb3J0IHR5cGUgRW1wdHlUYXNrID0ge1xuICAgY29tbWFuZHM6IHR5cGVvZiBFTVBUWV9DT01NQU5EUztcbiAgIGZvcm1hdDogJ2VtcHR5JztcbiAgIHBhcnNlcjogRW1wdHlUYXNrUGFyc2VyO1xuICAgb25FcnJvcj86IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGhvY0V4ZWNUYXNrKHBhcnNlcjogRW1wdHlUYXNrUGFyc2VyKTogRW1wdHlUYXNrIHtcbiAgIHJldHVybiB7XG4gICAgICBjb21tYW5kczogRU1QVFlfQ09NTUFORFMsXG4gICAgICBmb3JtYXQ6ICdlbXB0eScsXG4gICAgICBwYXJzZXIsXG4gICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJhdGlvbkVycm9yVGFzayhlcnJvcjogRXJyb3IgfCBzdHJpbmcpOiBFbXB0eVRhc2sge1xuICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzOiBFTVBUWV9DT01NQU5EUyxcbiAgICAgIGZvcm1hdDogJ2VtcHR5JyxcbiAgICAgIHBhcnNlcigpIHtcbiAgICAgICAgIHRocm93IHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgPyBuZXcgVGFza0NvbmZpZ3VyYXRpb25FcnJvcihlcnJvcikgOiBlcnJvcjtcbiAgICAgIH0sXG4gICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhjb21tYW5kczogc3RyaW5nW10sIHRyaW1tZWQgPSBmYWxzZSk6IFN0cmluZ1Rhc2s8c3RyaW5nPiB7XG4gICByZXR1cm4ge1xuICAgICAgY29tbWFuZHMsXG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBwYXJzZXIodGV4dCkge1xuICAgICAgICAgcmV0dXJuIHRyaW1tZWQgPyBTdHJpbmcodGV4dCkudHJpbSgpIDogdGV4dDtcbiAgICAgIH0sXG4gICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyYWlnaHRUaHJvdWdoQnVmZmVyVGFzayhjb21tYW5kczogc3RyaW5nW10pOiBCdWZmZXJUYXNrPGFueT4ge1xuICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzLFxuICAgICAgZm9ybWF0OiAnYnVmZmVyJyxcbiAgICAgIHBhcnNlcihidWZmZXIpIHtcbiAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICB9LFxuICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnVmZmVyVGFzazxSPih0YXNrOiBTaW1wbGVHaXRUYXNrPFI+KTogdGFzayBpcyBCdWZmZXJUYXNrPFI+IHtcbiAgIHJldHVybiB0YXNrLmZvcm1hdCA9PT0gJ2J1ZmZlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5VGFzazxSPih0YXNrOiBTaW1wbGVHaXRUYXNrPFI+KTogdGFzayBpcyBFbXB0eVRhc2sge1xuICAgcmV0dXJuIHRhc2suZm9ybWF0ID09PSAnZW1wdHknIHx8ICF0YXNrLmNvbW1hbmRzLmxlbmd0aDtcbn1cbiIsICJpbXBvcnQgeyBDbGVhblN1bW1hcnkgfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcbmltcG9ydCB7IGNsZWFuU3VtbWFyeVBhcnNlciB9IGZyb20gJy4uL3Jlc3BvbnNlcy9DbGVhblN1bW1hcnknO1xuaW1wb3J0IHsgTWF5YmUsIFN0cmluZ1Rhc2sgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBhc1N0cmluZ0FycmF5IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgY29uZmlndXJhdGlvbkVycm9yVGFzayB9IGZyb20gJy4vdGFzayc7XG5cbmV4cG9ydCBjb25zdCBDT05GSUdfRVJST1JfSU5URVJBQ1RJVkVfTU9ERSA9ICdHaXQgY2xlYW4gaW50ZXJhY3RpdmUgbW9kZSBpcyBub3Qgc3VwcG9ydGVkJztcbmV4cG9ydCBjb25zdCBDT05GSUdfRVJST1JfTU9ERV9SRVFVSVJFRCA9ICdHaXQgY2xlYW4gbW9kZSBwYXJhbWV0ZXIgKFwiblwiIG9yIFwiZlwiKSBpcyByZXF1aXJlZCc7XG5leHBvcnQgY29uc3QgQ09ORklHX0VSUk9SX1VOS05PV05fT1BUSU9OID0gJ0dpdCBjbGVhbiB1bmtub3duIG9wdGlvbiBmb3VuZCBpbjogJztcblxuLyoqXG4gKiBBbGwgc3VwcG9ydGVkIG9wdGlvbiBzd2l0Y2hlcyBhdmFpbGFibGUgZm9yIHVzZSBpbiBhIGBnaXQuY2xlYW5gIG9wZXJhdGlvblxuICovXG5leHBvcnQgZW51bSBDbGVhbk9wdGlvbnMge1xuICAgRFJZX1JVTiA9ICduJyxcbiAgIEZPUkNFID0gJ2YnLFxuICAgSUdOT1JFRF9JTkNMVURFRCA9ICd4JyxcbiAgIElHTk9SRURfT05MWSA9ICdYJyxcbiAgIEVYQ0xVRElORyA9ICdlJyxcbiAgIFFVSUVUID0gJ3EnLFxuICAgUkVDVVJTSVZFID0gJ2QnLFxufVxuXG4vKipcbiAqIFRoZSB0d28gbW9kZXMgYGdpdC5jbGVhbmAgY2FuIHJ1biBpbiAtIG9uZSBvZiB0aGVzZSBtdXN0IGJlIHN1cHBsaWVkIGluIG9yZGVyXG4gKiBmb3IgdGhlIGNvbW1hbmQgdG8gbm90IHRocm93IGEgYFRhc2tDb25maWd1cmF0aW9uRXJyb3JgXG4gKi9cbmV4cG9ydCB0eXBlIENsZWFuTW9kZSA9IENsZWFuT3B0aW9ucy5GT1JDRSB8IENsZWFuT3B0aW9ucy5EUllfUlVOO1xuXG5jb25zdCBDbGVhbk9wdGlvblZhbHVlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICdpJyxcbiAgIC4uLmFzU3RyaW5nQXJyYXkoT2JqZWN0LnZhbHVlcyhDbGVhbk9wdGlvbnMgYXMgYW55KSksXG5dKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuV2l0aE9wdGlvbnNUYXNrKG1vZGU6IENsZWFuTW9kZSB8IHN0cmluZywgY3VzdG9tQXJnczogc3RyaW5nW10pIHtcbiAgIGNvbnN0IHsgY2xlYW5Nb2RlLCBvcHRpb25zLCB2YWxpZCB9ID0gZ2V0Q2xlYW5PcHRpb25zKG1vZGUpO1xuXG4gICBpZiAoIWNsZWFuTW9kZSkge1xuICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25FcnJvclRhc2soQ09ORklHX0VSUk9SX01PREVfUkVRVUlSRUQpO1xuICAgfVxuXG4gICBpZiAoIXZhbGlkLm9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBjb25maWd1cmF0aW9uRXJyb3JUYXNrKENPTkZJR19FUlJPUl9VTktOT1dOX09QVElPTiArIEpTT04uc3RyaW5naWZ5KG1vZGUpKTtcbiAgIH1cblxuICAgb3B0aW9ucy5wdXNoKC4uLmN1c3RvbUFyZ3MpO1xuXG4gICBpZiAob3B0aW9ucy5zb21lKGlzSW50ZXJhY3RpdmVNb2RlKSkge1xuICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25FcnJvclRhc2soQ09ORklHX0VSUk9SX0lOVEVSQUNUSVZFX01PREUpO1xuICAgfVxuXG4gICByZXR1cm4gY2xlYW5UYXNrKGNsZWFuTW9kZSwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblRhc2sobW9kZTogQ2xlYW5Nb2RlLCBjdXN0b21BcmdzOiBzdHJpbmdbXSk6IFN0cmluZ1Rhc2s8Q2xlYW5TdW1tYXJ5PiB7XG4gICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbJ2NsZWFuJywgYC0ke21vZGV9YCwgLi4uY3VzdG9tQXJnc107XG5cbiAgIHJldHVybiB7XG4gICAgICBjb21tYW5kcyxcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIHBhcnNlcih0ZXh0OiBzdHJpbmcpOiBDbGVhblN1bW1hcnkge1xuICAgICAgICAgcmV0dXJuIGNsZWFuU3VtbWFyeVBhcnNlcihtb2RlID09PSBDbGVhbk9wdGlvbnMuRFJZX1JVTiwgdGV4dCk7XG4gICAgICB9LFxuICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xlYW5PcHRpb25zQXJyYXkoaW5wdXQ6IHN0cmluZ1tdKTogaW5wdXQgaXMgQ2xlYW5PcHRpb25zW10ge1xuICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KCh0ZXN0KSA9PiBDbGVhbk9wdGlvblZhbHVlcy5oYXModGVzdCkpO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbk9wdGlvbnMoaW5wdXQ6IHN0cmluZykge1xuICAgbGV0IGNsZWFuTW9kZTogTWF5YmU8Q2xlYW5Nb2RlPjtcbiAgIGxldCBvcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgbGV0IHZhbGlkID0geyBjbGVhbk1vZGU6IGZhbHNlLCBvcHRpb25zOiB0cnVlIH07XG5cbiAgIGlucHV0XG4gICAgICAucmVwbGFjZSgvW15hLXpdaS9nLCAnJylcbiAgICAgIC5zcGxpdCgnJylcbiAgICAgIC5mb3JFYWNoKChjaGFyKSA9PiB7XG4gICAgICAgICBpZiAoaXNDbGVhbk1vZGUoY2hhcikpIHtcbiAgICAgICAgICAgIGNsZWFuTW9kZSA9IGNoYXI7XG4gICAgICAgICAgICB2YWxpZC5jbGVhbk1vZGUgPSB0cnVlO1xuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbGlkLm9wdGlvbnMgPSB2YWxpZC5vcHRpb25zICYmIGlzS25vd25PcHRpb24oKG9wdGlvbnNbb3B0aW9ucy5sZW5ndGhdID0gYC0ke2NoYXJ9YCkpO1xuICAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgIHJldHVybiB7XG4gICAgICBjbGVhbk1vZGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgdmFsaWQsXG4gICB9O1xufVxuXG5mdW5jdGlvbiBpc0NsZWFuTW9kZShjbGVhbk1vZGU/OiBzdHJpbmcpOiBjbGVhbk1vZGUgaXMgQ2xlYW5Nb2RlIHtcbiAgIHJldHVybiBjbGVhbk1vZGUgPT09IENsZWFuT3B0aW9ucy5GT1JDRSB8fCBjbGVhbk1vZGUgPT09IENsZWFuT3B0aW9ucy5EUllfUlVOO1xufVxuXG5mdW5jdGlvbiBpc0tub3duT3B0aW9uKG9wdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICByZXR1cm4gL14tW2Etel0kL2kudGVzdChvcHRpb24pICYmIENsZWFuT3B0aW9uVmFsdWVzLmhhcyhvcHRpb24uY2hhckF0KDEpKTtcbn1cblxuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZU1vZGUob3B0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgIGlmICgvXi1bXlxcLV0vLnRlc3Qob3B0aW9uKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbi5pbmRleE9mKCdpJykgPiAwO1xuICAgfVxuXG4gICByZXR1cm4gb3B0aW9uID09PSAnLS1pbnRlcmFjdGl2ZSc7XG59XG4iLCAiaW1wb3J0IHsgQ29uZmlnR2V0UmVzdWx0LCBDb25maWdMaXN0U3VtbWFyeSwgQ29uZmlnVmFsdWVzIH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBsYXN0LCBzcGxpdE9uIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnTGlzdCBpbXBsZW1lbnRzIENvbmZpZ0xpc3RTdW1tYXJ5IHtcbiAgIHB1YmxpYyBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgIHB1YmxpYyB2YWx1ZXM6IHsgW2ZpbGVOYW1lOiBzdHJpbmddOiBDb25maWdWYWx1ZXMgfSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgIHByaXZhdGUgX2FsbDogQ29uZmlnVmFsdWVzIHwgdW5kZWZpbmVkO1xuXG4gICBwdWJsaWMgZ2V0IGFsbCgpOiBDb25maWdWYWx1ZXMge1xuICAgICAgaWYgKCF0aGlzLl9hbGwpIHtcbiAgICAgICAgIHRoaXMuX2FsbCA9IHRoaXMuZmlsZXMucmVkdWNlKChhbGw6IENvbmZpZ1ZhbHVlcywgZmlsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhbGwsIHRoaXMudmFsdWVzW2ZpbGVdKTtcbiAgICAgICAgIH0sIHt9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2FsbDtcbiAgIH1cblxuICAgcHVibGljIGFkZEZpbGUoZmlsZTogc3RyaW5nKTogQ29uZmlnVmFsdWVzIHtcbiAgICAgIGlmICghKGZpbGUgaW4gdGhpcy52YWx1ZXMpKSB7XG4gICAgICAgICBjb25zdCBsYXRlc3QgPSBsYXN0KHRoaXMuZmlsZXMpO1xuICAgICAgICAgdGhpcy52YWx1ZXNbZmlsZV0gPSBsYXRlc3QgPyBPYmplY3QuY3JlYXRlKHRoaXMudmFsdWVzW2xhdGVzdF0pIDoge307XG5cbiAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzW2ZpbGVdO1xuICAgfVxuXG4gICBwdWJsaWMgYWRkVmFsdWUoZmlsZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5hZGRGaWxlKGZpbGUpO1xuXG4gICAgICBpZiAoIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICB2YWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlc1trZXldKSkge1xuICAgICAgICAgKHZhbHVlc1trZXldIGFzIHN0cmluZ1tdKS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB2YWx1ZXNba2V5XSA9IFt2YWx1ZXNba2V5XSBhcyBzdHJpbmcsIHZhbHVlXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fYWxsID0gdW5kZWZpbmVkO1xuICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlnTGlzdFBhcnNlcih0ZXh0OiBzdHJpbmcpOiBDb25maWdMaXN0IHtcbiAgIGNvbnN0IGNvbmZpZyA9IG5ldyBDb25maWdMaXN0KCk7XG5cbiAgIGZvciAoY29uc3QgaXRlbSBvZiBjb25maWdQYXJzZXIodGV4dCkpIHtcbiAgICAgIGNvbmZpZy5hZGRWYWx1ZShpdGVtLmZpbGUsIFN0cmluZyhpdGVtLmtleSksIGl0ZW0udmFsdWUpO1xuICAgfVxuXG4gICByZXR1cm4gY29uZmlnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlnR2V0UGFyc2VyKHRleHQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBDb25maWdHZXRSZXN1bHQge1xuICAgbGV0IHZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgIGNvbnN0IHNjb3BlczogTWFwPHN0cmluZywgc3RyaW5nW10+ID0gbmV3IE1hcCgpO1xuXG4gICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29uZmlnUGFyc2VyKHRleHQsIGtleSkpIHtcbiAgICAgIGlmIChpdGVtLmtleSAhPT0ga2V5KSB7XG4gICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWVzLnB1c2goKHZhbHVlID0gaXRlbS52YWx1ZSkpO1xuXG4gICAgICBpZiAoIXNjb3Blcy5oYXMoaXRlbS5maWxlKSkge1xuICAgICAgICAgc2NvcGVzLnNldChpdGVtLmZpbGUsIFtdKTtcbiAgICAgIH1cblxuICAgICAgc2NvcGVzLmdldChpdGVtLmZpbGUpIS5wdXNoKHZhbHVlKTtcbiAgIH1cblxuICAgcmV0dXJuIHtcbiAgICAgIGtleSxcbiAgICAgIHBhdGhzOiBBcnJheS5mcm9tKHNjb3Blcy5rZXlzKCkpLFxuICAgICAgc2NvcGVzLFxuICAgICAgdmFsdWUsXG4gICAgICB2YWx1ZXMsXG4gICB9O1xufVxuXG5mdW5jdGlvbiBjb25maWdGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgIHJldHVybiBmaWxlUGF0aC5yZXBsYWNlKC9eKGZpbGUpOi8sICcnKTtcbn1cblxuZnVuY3Rpb24qIGNvbmZpZ1BhcnNlcih0ZXh0OiBzdHJpbmcsIHJlcXVlc3RlZEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFwwJyk7XG5cbiAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBsaW5lcy5sZW5ndGggLSAxOyBpIDwgbWF4OyApIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBjb25maWdGaWxlUGF0aChsaW5lc1tpKytdKTtcblxuICAgICAgbGV0IHZhbHVlID0gbGluZXNbaSsrXTtcbiAgICAgIGxldCBrZXkgPSByZXF1ZXN0ZWRLZXk7XG5cbiAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgICAgIGNvbnN0IGxpbmUgPSBzcGxpdE9uKHZhbHVlLCAnXFxuJyk7XG4gICAgICAgICBrZXkgPSBsaW5lWzBdO1xuICAgICAgICAgdmFsdWUgPSBsaW5lWzFdO1xuICAgICAgfVxuXG4gICAgICB5aWVsZCB7IGZpbGUsIGtleSwgdmFsdWUgfTtcbiAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbmZpZ0dldFJlc3VsdCwgQ29uZmlnTGlzdFN1bW1hcnksIFNpbXBsZUdpdCB9IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHsgY29uZmlnR2V0UGFyc2VyLCBjb25maWdMaXN0UGFyc2VyIH0gZnJvbSAnLi4vcmVzcG9uc2VzL0NvbmZpZ0xpc3QnO1xuaW1wb3J0IHR5cGUgeyBTaW1wbGVHaXRBcGkgfSBmcm9tICcuLi9zaW1wbGUtZ2l0LWFwaSc7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ1Rhc2sgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQgfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBlbnVtIEdpdENvbmZpZ1Njb3BlIHtcbiAgIHN5c3RlbSA9ICdzeXN0ZW0nLFxuICAgZ2xvYmFsID0gJ2dsb2JhbCcsXG4gICBsb2NhbCA9ICdsb2NhbCcsXG4gICB3b3JrdHJlZSA9ICd3b3JrdHJlZScsXG59XG5cbmZ1bmN0aW9uIGFzQ29uZmlnU2NvcGU8VCBleHRlbmRzIEdpdENvbmZpZ1Njb3BlIHwgdW5kZWZpbmVkPihcbiAgIHNjb3BlOiBHaXRDb25maWdTY29wZSB8IHVua25vd24sXG4gICBmYWxsYmFjazogVFxuKTogR2l0Q29uZmlnU2NvcGUgfCBUIHtcbiAgIGlmICh0eXBlb2Ygc2NvcGUgPT09ICdzdHJpbmcnICYmIEdpdENvbmZpZ1Njb3BlLmhhc093blByb3BlcnR5KHNjb3BlKSkge1xuICAgICAgcmV0dXJuIHNjb3BlIGFzIEdpdENvbmZpZ1Njb3BlO1xuICAgfVxuICAgcmV0dXJuIGZhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBhZGRDb25maWdUYXNrKFxuICAga2V5OiBzdHJpbmcsXG4gICB2YWx1ZTogc3RyaW5nLFxuICAgYXBwZW5kOiBib29sZWFuLFxuICAgc2NvcGU6IEdpdENvbmZpZ1Njb3BlXG4pOiBTdHJpbmdUYXNrPHN0cmluZz4ge1xuICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gWydjb25maWcnLCBgLS0ke3Njb3BlfWBdO1xuXG4gICBpZiAoYXBwZW5kKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCctLWFkZCcpO1xuICAgfVxuXG4gICBjb21tYW5kcy5wdXNoKGtleSwgdmFsdWUpO1xuXG4gICByZXR1cm4ge1xuICAgICAgY29tbWFuZHMsXG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBwYXJzZXIodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgfSxcbiAgIH07XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ1Rhc2soa2V5OiBzdHJpbmcsIHNjb3BlPzogR2l0Q29uZmlnU2NvcGUpOiBTdHJpbmdUYXNrPENvbmZpZ0dldFJlc3VsdD4ge1xuICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gWydjb25maWcnLCAnLS1udWxsJywgJy0tc2hvdy1vcmlnaW4nLCAnLS1nZXQtYWxsJywga2V5XTtcblxuICAgaWYgKHNjb3BlKSB7XG4gICAgICBjb21tYW5kcy5zcGxpY2UoMSwgMCwgYC0tJHtzY29wZX1gKTtcbiAgIH1cblxuICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzLFxuICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgcGFyc2VyKHRleHQpIHtcbiAgICAgICAgIHJldHVybiBjb25maWdHZXRQYXJzZXIodGV4dCwga2V5KTtcbiAgICAgIH0sXG4gICB9O1xufVxuXG5mdW5jdGlvbiBsaXN0Q29uZmlnVGFzayhzY29wZT86IEdpdENvbmZpZ1Njb3BlKTogU3RyaW5nVGFzazxDb25maWdMaXN0U3VtbWFyeT4ge1xuICAgY29uc3QgY29tbWFuZHMgPSBbJ2NvbmZpZycsICctLWxpc3QnLCAnLS1zaG93LW9yaWdpbicsICctLW51bGwnXTtcblxuICAgaWYgKHNjb3BlKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGAtLSR7c2NvcGV9YCk7XG4gICB9XG5cbiAgIHJldHVybiB7XG4gICAgICBjb21tYW5kcyxcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIHBhcnNlcih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgIHJldHVybiBjb25maWdMaXN0UGFyc2VyKHRleHQpO1xuICAgICAgfSxcbiAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpOiBQaWNrPFNpbXBsZUdpdCwgJ2FkZENvbmZpZycgfCAnZ2V0Q29uZmlnJyB8ICdsaXN0Q29uZmlnJz4ge1xuICAgcmV0dXJuIHtcbiAgICAgIGFkZENvbmZpZyh0aGlzOiBTaW1wbGVHaXRBcGksIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCAuLi5yZXN0OiB1bmtub3duW10pIHtcbiAgICAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgICAgYWRkQ29uZmlnVGFzayhcbiAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgcmVzdFswXSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgIGFzQ29uZmlnU2NvcGUocmVzdFsxXSwgR2l0Q29uZmlnU2NvcGUubG9jYWwpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICBnZXRDb25maWcodGhpczogU2ltcGxlR2l0QXBpLCBrZXk6IHN0cmluZywgc2NvcGU/OiBHaXRDb25maWdTY29wZSkge1xuICAgICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICAgICBnZXRDb25maWdUYXNrKGtleSwgYXNDb25maWdTY29wZShzY29wZSwgdW5kZWZpbmVkKSksXG4gICAgICAgICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgICAgICAgKTtcbiAgICAgIH0sXG5cbiAgICAgIGxpc3RDb25maWcodGhpczogU2ltcGxlR2l0QXBpLCAuLi5yZXN0OiB1bmtub3duW10pIHtcbiAgICAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgICAgbGlzdENvbmZpZ1Rhc2soYXNDb25maWdTY29wZShyZXN0WzBdLCB1bmRlZmluZWQpKSxcbiAgICAgICAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICAgICAgICApO1xuICAgICAgfSxcbiAgIH07XG59XG4iLCAiaW1wb3J0IHsgR3JlcFJlc3VsdCwgU2ltcGxlR2l0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBTaW1wbGVHaXRBcGkgfSBmcm9tICcuLi9zaW1wbGUtZ2l0LWFwaSc7XG5pbXBvcnQge1xuICAgYXNOdW1iZXIsXG4gICBmb3JFYWNoTGluZVdpdGhDb250ZW50LFxuICAgZ2V0VHJhaWxpbmdPcHRpb25zLFxuICAgTlVMTCxcbiAgIHByZWZpeGVkQXJyYXksXG4gICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQsXG59IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHsgY29uZmlndXJhdGlvbkVycm9yVGFzayB9IGZyb20gJy4vdGFzayc7XG5cbmNvbnN0IGRpc2FsbG93ZWRPcHRpb25zID0gWyctaCddO1xuXG5jb25zdCBRdWVyeSA9IFN5bWJvbCgnZ3JlcFF1ZXJ5Jyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0R3JlcFF1ZXJ5IGV4dGVuZHMgSXRlcmFibGU8c3RyaW5nPiB7XG4gICAvKiogQWRkcyBvbmUgb3IgbW9yZSB0ZXJtcyB0byBiZSBncm91cGVkIGFzIGFuIFwiYW5kXCIgdG8gYW55IG90aGVyIHRlcm1zICovXG4gICBhbmQoLi4uYW5kOiBzdHJpbmdbXSk6IHRoaXM7XG5cbiAgIC8qKiBBZGRzIG9uZSBvciBtb3JlIHNlYXJjaCB0ZXJtcyAtIGdpdC5ncmVwIHdpbGwgXCJvclwiIHRoaXMgdG8gb3RoZXIgdGVybXMgKi9cbiAgIHBhcmFtKC4uLnBhcmFtOiBzdHJpbmdbXSk6IHRoaXM7XG59XG5cbmNsYXNzIEdyZXBRdWVyeSBpbXBsZW1lbnRzIEdpdEdyZXBRdWVyeSB7XG4gICBwcml2YXRlIFtRdWVyeV06IHN0cmluZ1tdID0gW107XG5cbiAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGZvciAoY29uc3QgcXVlcnkgb2YgdGhpc1tRdWVyeV0pIHtcbiAgICAgICAgIHlpZWxkIHF1ZXJ5O1xuICAgICAgfVxuICAgfVxuXG4gICBhbmQoLi4uYW5kOiBzdHJpbmdbXSkge1xuICAgICAgYW5kLmxlbmd0aCAmJiB0aGlzW1F1ZXJ5XS5wdXNoKCctLWFuZCcsICcoJywgLi4ucHJlZml4ZWRBcnJheShhbmQsICctZScpLCAnKScpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICB9XG5cbiAgIHBhcmFtKC4uLnBhcmFtOiBzdHJpbmdbXSkge1xuICAgICAgdGhpc1tRdWVyeV0ucHVzaCguLi5wcmVmaXhlZEFycmF5KHBhcmFtLCAnLWUnKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGJ1aWxkZXIgZm9yIGEgYGdpdC5ncmVwYCBxdWVyeSB3aXRoIG9wdGlvbmFsIHBhcmFtc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JlcFF1ZXJ5QnVpbGRlciguLi5wYXJhbXM6IHN0cmluZ1tdKTogR2l0R3JlcFF1ZXJ5IHtcbiAgIHJldHVybiBuZXcgR3JlcFF1ZXJ5KCkucGFyYW0oLi4ucGFyYW1zKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VHcmVwKGdyZXA6IHN0cmluZyk6IEdyZXBSZXN1bHQge1xuICAgY29uc3QgcGF0aHM6IEdyZXBSZXN1bHRbJ3BhdGhzJ10gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgIGNvbnN0IHJlc3VsdHM6IEdyZXBSZXN1bHRbJ3Jlc3VsdHMnXSA9IHt9O1xuXG4gICBmb3JFYWNoTGluZVdpdGhDb250ZW50KGdyZXAsIChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgW3BhdGgsIGxpbmUsIHByZXZpZXddID0gaW5wdXQuc3BsaXQoTlVMTCk7XG4gICAgICBwYXRocy5hZGQocGF0aCk7XG4gICAgICAocmVzdWx0c1twYXRoXSA9IHJlc3VsdHNbcGF0aF0gfHwgW10pLnB1c2goe1xuICAgICAgICAgbGluZTogYXNOdW1iZXIobGluZSksXG4gICAgICAgICBwYXRoLFxuICAgICAgICAgcHJldmlldyxcbiAgICAgIH0pO1xuICAgfSk7XG5cbiAgIHJldHVybiB7XG4gICAgICBwYXRocyxcbiAgICAgIHJlc3VsdHMsXG4gICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKTogUGljazxTaW1wbGVHaXQsICdncmVwJz4ge1xuICAgcmV0dXJuIHtcbiAgICAgIGdyZXAodGhpczogU2ltcGxlR2l0QXBpLCBzZWFyY2hUZXJtOiBzdHJpbmcgfCBHaXRHcmVwUXVlcnkpIHtcbiAgICAgICAgIGNvbnN0IHRoZW4gPSB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKTtcbiAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKTtcblxuICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZGlzYWxsb3dlZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVzKG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkVycm9yVGFzayhgZ2l0LmdyZXA6IHVzZSBvZiBcIiR7b3B0aW9ufVwiIGlzIG5vdCBzdXBwb3J0ZWQuYCksXG4gICAgICAgICAgICAgICAgICB0aGVuXG4gICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfVxuXG4gICAgICAgICBpZiAodHlwZW9mIHNlYXJjaFRlcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzZWFyY2hUZXJtID0gZ3JlcFF1ZXJ5QnVpbGRlcigpLnBhcmFtKHNlYXJjaFRlcm0pO1xuICAgICAgICAgfVxuXG4gICAgICAgICBjb25zdCBjb21tYW5kcyA9IFsnZ3JlcCcsICctLW51bGwnLCAnLW4nLCAnLS1mdWxsLW5hbWUnLCAuLi5vcHRpb25zLCAuLi5zZWFyY2hUZXJtXTtcblxuICAgICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgICAgICAgIHBhcnNlcihzdGRPdXQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUdyZXAoc3RkT3V0KTtcbiAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhlblxuICAgICAgICAgKTtcbiAgICAgIH0sXG4gICB9O1xufVxuIiwgImltcG9ydCB7IHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2sgfSBmcm9tICcuL3Rhc2snO1xuaW1wb3J0IHsgTWF5YmUsIE9wdGlvbkZsYWdzLCBPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZW51bSBSZXNldE1vZGUge1xuICAgTUlYRUQgPSAnbWl4ZWQnLFxuICAgU09GVCA9ICdzb2Z0JyxcbiAgIEhBUkQgPSAnaGFyZCcsXG4gICBNRVJHRSA9ICdtZXJnZScsXG4gICBLRUVQID0gJ2tlZXAnLFxufVxuXG5jb25zdCBSZXNldE1vZGVzID0gQXJyYXkuZnJvbShPYmplY3QudmFsdWVzKFJlc2V0TW9kZSkpO1xuXG5leHBvcnQgdHlwZSBSZXNldE9wdGlvbnMgPSBPcHRpb25zICZcbiAgIE9wdGlvbkZsYWdzPCctcScgfCAnLS1xdWlldCcgfCAnLS1uby1xdWlldCcgfCAnLS1wYXRoc3BlYy1mcm9tLW51bCc+ICZcbiAgIE9wdGlvbkZsYWdzPCctLXBhdGhzcGVjLWZyb20tZmlsZScsIHN0cmluZz47XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNldFRhc2sobW9kZTogTWF5YmU8UmVzZXRNb2RlPiwgY3VzdG9tQXJnczogc3RyaW5nW10pIHtcbiAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFsncmVzZXQnXTtcbiAgIGlmIChpc1ZhbGlkUmVzZXRNb2RlKG1vZGUpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGAtLSR7bW9kZX1gKTtcbiAgIH1cbiAgIGNvbW1hbmRzLnB1c2goLi4uY3VzdG9tQXJncyk7XG5cbiAgIHJldHVybiBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc2V0TW9kZShtb2RlOiBSZXNldE1vZGUgfCBhbnkpOiBNYXliZTxSZXNldE1vZGU+IHtcbiAgIGlmIChpc1ZhbGlkUmVzZXRNb2RlKG1vZGUpKSB7XG4gICAgICByZXR1cm4gbW9kZTtcbiAgIH1cblxuICAgc3dpdGNoICh0eXBlb2YgbW9kZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICByZXR1cm4gUmVzZXRNb2RlLlNPRlQ7XG4gICB9XG5cbiAgIHJldHVybjtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZFJlc2V0TW9kZShtb2RlOiBSZXNldE1vZGUgfCBhbnkpOiBtb2RlIGlzIFJlc2V0TW9kZSB7XG4gICByZXR1cm4gUmVzZXRNb2Rlcy5pbmNsdWRlcyhtb2RlKTtcbn1cbiIsICJpbXBvcnQgZGVidWcsIHsgRGVidWdnZXIgfSBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQge1xuICAgYXBwZW5kLFxuICAgZmlsdGVySGFzTGVuZ3RoLFxuICAgZmlsdGVyU3RyaW5nLFxuICAgZmlsdGVyVHlwZSxcbiAgIE5PT1AsXG4gICBvYmplY3RUb1N0cmluZyxcbiAgIHJlbW92ZSxcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBNYXliZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5kZWJ1Zy5mb3JtYXR0ZXJzLkwgPSAodmFsdWU6IGFueSkgPT4gU3RyaW5nKGZpbHRlckhhc0xlbmd0aCh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiAnLScpO1xuZGVidWcuZm9ybWF0dGVycy5CID0gKHZhbHVlOiBCdWZmZXIpID0+IHtcbiAgIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgIH1cbiAgIHJldHVybiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59O1xuXG50eXBlIE91dHB1dExvZ2dpbmdIYW5kbGVyID0gKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZygpIHtcbiAgIHJldHVybiBkZWJ1Zygnc2ltcGxlLWdpdCcpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE91dHB1dExvZ2dlciBleHRlbmRzIE91dHB1dExvZ2dpbmdIYW5kbGVyIHtcbiAgIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgIGluZm86IE91dHB1dExvZ2dpbmdIYW5kbGVyO1xuICAgc3RlcChuZXh0U3RlcD86IHN0cmluZyk6IE91dHB1dExvZ2dlcjtcbiAgIHNpYmxpbmcobmFtZTogc3RyaW5nKTogT3V0cHV0TG9nZ2VyO1xufVxuXG5mdW5jdGlvbiBwcmVmaXhlZExvZ2dlcihcbiAgIHRvOiBEZWJ1Z2dlcixcbiAgIHByZWZpeDogc3RyaW5nLFxuICAgZm9yd2FyZD86IE91dHB1dExvZ2dpbmdIYW5kbGVyXG4pOiBPdXRwdXRMb2dnaW5nSGFuZGxlciB7XG4gICBpZiAoIXByZWZpeCB8fCAhU3RyaW5nKHByZWZpeCkucmVwbGFjZSgvXFxzKi8sICcnKSkge1xuICAgICAgcmV0dXJuICFmb3J3YXJkXG4gICAgICAgICA/IHRvXG4gICAgICAgICA6IChtZXNzYWdlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgIHRvKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgICBmb3J3YXJkKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgICAgICB9O1xuICAgfVxuXG4gICByZXR1cm4gKG1lc3NhZ2UsIC4uLmFyZ3MpID0+IHtcbiAgICAgIHRvKGAlcyAke21lc3NhZ2V9YCwgcHJlZml4LCAuLi5hcmdzKTtcbiAgICAgIGlmIChmb3J3YXJkKSB7XG4gICAgICAgICBmb3J3YXJkKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgfVxuICAgfTtcbn1cblxuZnVuY3Rpb24gY2hpbGRMb2dnZXJOYW1lKFxuICAgbmFtZTogTWF5YmU8c3RyaW5nPixcbiAgIGNoaWxkRGVidWdnZXI6IE1heWJlPERlYnVnZ2VyPixcbiAgIHsgbmFtZXNwYWNlOiBwYXJlbnROYW1lc3BhY2UgfTogRGVidWdnZXJcbik6IHN0cmluZyB7XG4gICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgIH1cbiAgIGNvbnN0IGNoaWxkTmFtZXNwYWNlID0gKGNoaWxkRGVidWdnZXIgJiYgY2hpbGREZWJ1Z2dlci5uYW1lc3BhY2UpIHx8ICcnO1xuXG4gICBpZiAoY2hpbGROYW1lc3BhY2Uuc3RhcnRzV2l0aChwYXJlbnROYW1lc3BhY2UpKSB7XG4gICAgICByZXR1cm4gY2hpbGROYW1lc3BhY2Uuc3Vic3RyKHBhcmVudE5hbWVzcGFjZS5sZW5ndGggKyAxKTtcbiAgIH1cblxuICAgcmV0dXJuIGNoaWxkTmFtZXNwYWNlIHx8IHBhcmVudE5hbWVzcGFjZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ2dlcihcbiAgIGxhYmVsOiBzdHJpbmcsXG4gICB2ZXJib3NlPzogc3RyaW5nIHwgRGVidWdnZXIsXG4gICBpbml0aWFsU3RlcD86IHN0cmluZyxcbiAgIGluZm9EZWJ1Z2dlciA9IGNyZWF0ZUxvZygpXG4pOiBPdXRwdXRMb2dnZXIge1xuICAgY29uc3QgbGFiZWxQcmVmaXggPSAobGFiZWwgJiYgYFske2xhYmVsfV1gKSB8fCAnJztcblxuICAgY29uc3Qgc3Bhd25lZDogT3V0cHV0TG9nZ2VyW10gPSBbXTtcbiAgIGNvbnN0IGRlYnVnRGVidWdnZXI6IE1heWJlPERlYnVnZ2VyPiA9XG4gICAgICB0eXBlb2YgdmVyYm9zZSA9PT0gJ3N0cmluZycgPyBpbmZvRGVidWdnZXIuZXh0ZW5kKHZlcmJvc2UpIDogdmVyYm9zZTtcbiAgIGNvbnN0IGtleSA9IGNoaWxkTG9nZ2VyTmFtZShmaWx0ZXJUeXBlKHZlcmJvc2UsIGZpbHRlclN0cmluZyksIGRlYnVnRGVidWdnZXIsIGluZm9EZWJ1Z2dlcik7XG5cbiAgIHJldHVybiBzdGVwKGluaXRpYWxTdGVwKTtcblxuICAgZnVuY3Rpb24gc2libGluZyhuYW1lOiBzdHJpbmcsIGluaXRpYWw/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBhcHBlbmQoXG4gICAgICAgICBzcGF3bmVkLFxuICAgICAgICAgY3JlYXRlTG9nZ2VyKGxhYmVsLCBrZXkucmVwbGFjZSgvXlteOl0rLywgbmFtZSksIGluaXRpYWwsIGluZm9EZWJ1Z2dlcilcbiAgICAgICk7XG4gICB9XG5cbiAgIGZ1bmN0aW9uIHN0ZXAocGhhc2U/OiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IHN0ZXBQcmVmaXggPSAocGhhc2UgJiYgYFske3BoYXNlfV1gKSB8fCAnJztcbiAgICAgIGNvbnN0IGRlYnVnID0gKGRlYnVnRGVidWdnZXIgJiYgcHJlZml4ZWRMb2dnZXIoZGVidWdEZWJ1Z2dlciwgc3RlcFByZWZpeCkpIHx8IE5PT1A7XG4gICAgICBjb25zdCBpbmZvID0gcHJlZml4ZWRMb2dnZXIoaW5mb0RlYnVnZ2VyLCBgJHtsYWJlbFByZWZpeH0gJHtzdGVwUHJlZml4fWAsIGRlYnVnKTtcblxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZGVidWdEZWJ1Z2dlciA/IGRlYnVnIDogaW5mbywge1xuICAgICAgICAgbGFiZWwsXG4gICAgICAgICBzaWJsaW5nLFxuICAgICAgICAgaW5mbyxcbiAgICAgICAgIHN0ZXAsXG4gICAgICB9KTtcbiAgIH1cbn1cblxuLyoqXG4gKiBUaGUgYEdpdExvZ2dlcmAgaXMgdXNlZCBieSB0aGUgbWFpbiBgU2ltcGxlR2l0YCBydW5uZXIgdG8gaGFuZGxlIGxvZ2dpbmdcbiAqIGFueSB3YXJuaW5ncyBvciBlcnJvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRMb2dnZXIge1xuICAgcHVibGljIGVycm9yOiBPdXRwdXRMb2dnaW5nSGFuZGxlcjtcblxuICAgcHVibGljIHdhcm46IE91dHB1dExvZ2dpbmdIYW5kbGVyO1xuXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9vdXQ6IERlYnVnZ2VyID0gY3JlYXRlTG9nKCkpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBwcmVmaXhlZExvZ2dlcihfb3V0LCAnW0VSUk9SXScpO1xuICAgICAgdGhpcy53YXJuID0gcHJlZml4ZWRMb2dnZXIoX291dCwgJ1tXQVJOXScpO1xuICAgfVxuXG4gICBzaWxlbnQoc2lsZW5jZSA9IGZhbHNlKSB7XG4gICAgICBpZiAoc2lsZW5jZSAhPT0gdGhpcy5fb3V0LmVuYWJsZWQpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IHRoaXMuX291dDtcbiAgICAgIGNvbnN0IGVudiA9IChwcm9jZXNzLmVudi5ERUJVRyB8fCAnJykuc3BsaXQoJywnKS5maWx0ZXIoKHMpID0+ICEhcyk7XG4gICAgICBjb25zdCBoYXNPbiA9IGVudi5pbmNsdWRlcyhuYW1lc3BhY2UpO1xuICAgICAgY29uc3QgaGFzT2ZmID0gZW52LmluY2x1ZGVzKGAtJHtuYW1lc3BhY2V9YCk7XG5cbiAgICAgIC8vIGVuYWJsaW5nIHRoZSBsb2dcbiAgICAgIGlmICghc2lsZW5jZSkge1xuICAgICAgICAgaWYgKGhhc09mZikge1xuICAgICAgICAgICAgcmVtb3ZlKGVudiwgYC0ke25hbWVzcGFjZX1gKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbnYucHVzaChuYW1lc3BhY2UpO1xuICAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGlmIChoYXNPbikge1xuICAgICAgICAgICAgcmVtb3ZlKGVudiwgbmFtZXNwYWNlKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbnYucHVzaChgLSR7bmFtZXNwYWNlfWApO1xuICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBkZWJ1Zy5lbmFibGUoZW52LmpvaW4oJywnKSk7XG4gICB9XG59XG4iLCAiaW1wb3J0IHsgU2ltcGxlR2l0VGFzayB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEdpdEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2dpdC1lcnJvcic7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIE91dHB1dExvZ2dlciB9IGZyb20gJy4uL2dpdC1sb2dnZXInO1xuXG50eXBlIEFueVNpbXBsZUdpdFRhc2sgPSBTaW1wbGVHaXRUYXNrPGFueT47XG5cbnR5cGUgVGFza0luUHJvZ3Jlc3MgPSB7XG4gICBuYW1lOiBzdHJpbmc7XG4gICBsb2dnZXI6IE91dHB1dExvZ2dlcjtcbiAgIHRhc2s6IEFueVNpbXBsZUdpdFRhc2s7XG59O1xuXG5leHBvcnQgY2xhc3MgVGFza3NQZW5kaW5nUXVldWUge1xuICAgcHJpdmF0ZSBfcXVldWU6IE1hcDxBbnlTaW1wbGVHaXRUYXNrLCBUYXNrSW5Qcm9ncmVzcz4gPSBuZXcgTWFwKCk7XG5cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nTGFiZWwgPSAnR2l0RXhlY3V0b3InKSB7fVxuXG4gICBwcml2YXRlIHdpdGhQcm9ncmVzcyh0YXNrOiBBbnlTaW1wbGVHaXRUYXNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcXVldWUuZ2V0KHRhc2spO1xuICAgfVxuXG4gICBwcml2YXRlIGNyZWF0ZVByb2dyZXNzKHRhc2s6IEFueVNpbXBsZUdpdFRhc2spOiBUYXNrSW5Qcm9ncmVzcyB7XG4gICAgICBjb25zdCBuYW1lID0gVGFza3NQZW5kaW5nUXVldWUuZ2V0TmFtZSh0YXNrLmNvbW1hbmRzWzBdKTtcbiAgICAgIGNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcih0aGlzLmxvZ0xhYmVsLCBuYW1lKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgIHRhc2ssXG4gICAgICAgICBsb2dnZXIsXG4gICAgICAgICBuYW1lLFxuICAgICAgfTtcbiAgIH1cblxuICAgcHVzaCh0YXNrOiBBbnlTaW1wbGVHaXRUYXNrKTogVGFza0luUHJvZ3Jlc3Mge1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aGlzLmNyZWF0ZVByb2dyZXNzKHRhc2spO1xuICAgICAgcHJvZ3Jlc3MubG9nZ2VyKCdBZGRpbmcgdGFzayB0byB0aGUgcXVldWUsIGNvbW1hbmRzID0gJW8nLCB0YXNrLmNvbW1hbmRzKTtcblxuICAgICAgdGhpcy5fcXVldWUuc2V0KHRhc2ssIHByb2dyZXNzKTtcblxuICAgICAgcmV0dXJuIHByb2dyZXNzO1xuICAgfVxuXG4gICBmYXRhbChlcnI6IEdpdEVycm9yKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0YXNrLCB7IGxvZ2dlciB9XSBvZiBBcnJheS5mcm9tKHRoaXMuX3F1ZXVlLmVudHJpZXMoKSkpIHtcbiAgICAgICAgIGlmICh0YXNrID09PSBlcnIudGFzaykge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEZhaWxlZCAlb2AsIGVycik7XG4gICAgICAgICAgICBsb2dnZXIoXG4gICAgICAgICAgICAgICBgRmF0YWwgZXhjZXB0aW9uLCBhbnkgYXMteWV0IHVuLXN0YXJ0ZWQgdGFza3MgcnVuIHRocm91Z2ggdGhpcyBleGVjdXRvciB3aWxsIG5vdCBiZSBhdHRlbXB0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgYEEgZmF0YWwgZXhjZXB0aW9uIG9jY3VycmVkIGluIGEgcHJldmlvdXMgdGFzaywgdGhlIHF1ZXVlIGhhcyBiZWVuIHB1cmdlZDogJW9gLFxuICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICB9XG5cbiAgICAgICAgIHRoaXMuY29tcGxldGUodGFzayk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9xdWV1ZS5zaXplICE9PSAwKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXVlIHNpemUgc2hvdWxkIGJlIHplcm8gYWZ0ZXIgZmF0YWw6ICR7dGhpcy5fcXVldWUuc2l6ZX1gKTtcbiAgICAgIH1cbiAgIH1cblxuICAgY29tcGxldGUodGFzazogQW55U2ltcGxlR2l0VGFzaykge1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aGlzLndpdGhQcm9ncmVzcyh0YXNrKTtcbiAgICAgIGlmIChwcm9ncmVzcykge1xuICAgICAgICAgdGhpcy5fcXVldWUuZGVsZXRlKHRhc2spO1xuICAgICAgfVxuICAgfVxuXG4gICBhdHRlbXB0KHRhc2s6IEFueVNpbXBsZUdpdFRhc2spOiBUYXNrSW5Qcm9ncmVzcyB7XG4gICAgICBjb25zdCBwcm9ncmVzcyA9IHRoaXMud2l0aFByb2dyZXNzKHRhc2spO1xuICAgICAgaWYgKCFwcm9ncmVzcykge1xuICAgICAgICAgdGhyb3cgbmV3IEdpdEVycm9yKHVuZGVmaW5lZCwgJ1Rhc2tzUGVuZGluZ1F1ZXVlOiBhdHRlbXB0IGNhbGxlZCBmb3IgYW4gdW5rbm93biB0YXNrJyk7XG4gICAgICB9XG4gICAgICBwcm9ncmVzcy5sb2dnZXIoJ1N0YXJ0aW5nIHRhc2snKTtcblxuICAgICAgcmV0dXJuIHByb2dyZXNzO1xuICAgfVxuXG4gICBzdGF0aWMgZ2V0TmFtZShuYW1lID0gJ2VtcHR5Jykge1xuICAgICAgcmV0dXJuIGB0YXNrOiR7bmFtZX06JHsrK1Rhc2tzUGVuZGluZ1F1ZXVlLmNvdW50ZXJ9YDtcbiAgIH1cblxuICAgcHJpdmF0ZSBzdGF0aWMgY291bnRlciA9IDA7XG59XG4iLCAiaW1wb3J0IHsgc3Bhd24sIFNwYXduT3B0aW9ucyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgR2l0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvZ2l0LWVycm9yJztcbmltcG9ydCB7IE91dHB1dExvZ2dlciB9IGZyb20gJy4uL2dpdC1sb2dnZXInO1xuaW1wb3J0IHsgUGx1Z2luU3RvcmUgfSBmcm9tICcuLi9wbHVnaW5zJztcbmltcG9ydCB7IEVtcHR5VGFzaywgaXNCdWZmZXJUYXNrLCBpc0VtcHR5VGFzayB9IGZyb20gJy4uL3Rhc2tzL3Rhc2snO1xuaW1wb3J0IHtcbiAgIEdpdEV4ZWN1dG9yUmVzdWx0LFxuICAgTWF5YmUsXG4gICBvdXRwdXRIYW5kbGVyLFxuICAgUnVubmFibGVUYXNrLFxuICAgU2ltcGxlR2l0RXhlY3V0b3IsXG4gICBTaW1wbGVHaXRUYXNrLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBjYWxsVGFza1BhcnNlciwgZmlyc3QsIEdpdE91dHB1dFN0cmVhbXMsIG9iamVjdFRvU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgU2NoZWR1bGVyIH0gZnJvbSAnLi9zY2hlZHVsZXInO1xuaW1wb3J0IHsgVGFza3NQZW5kaW5nUXVldWUgfSBmcm9tICcuL3Rhc2tzLXBlbmRpbmctcXVldWUnO1xuXG5leHBvcnQgY2xhc3MgR2l0RXhlY3V0b3JDaGFpbiBpbXBsZW1lbnRzIFNpbXBsZUdpdEV4ZWN1dG9yIHtcbiAgIHByaXZhdGUgX2NoYWluOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgIHByaXZhdGUgX3F1ZXVlID0gbmV3IFRhc2tzUGVuZGluZ1F1ZXVlKCk7XG4gICBwcml2YXRlIF9jd2Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgcHVibGljIGdldCBiaW5hcnkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXhlY3V0b3IuYmluYXJ5O1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0IGN3ZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jd2QgfHwgdGhpcy5fZXhlY3V0b3IuY3dkO1xuICAgfVxuXG4gICBwdWJsaWMgc2V0IGN3ZChjd2Q6IHN0cmluZykge1xuICAgICAgdGhpcy5fY3dkID0gY3dkO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0IGVudigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRvci5lbnY7XG4gICB9XG5cbiAgIHB1YmxpYyBnZXQgb3V0cHV0SGFuZGxlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRvci5vdXRwdXRIYW5kbGVyO1xuICAgfVxuXG4gICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgX2V4ZWN1dG9yOiBTaW1wbGVHaXRFeGVjdXRvcixcbiAgICAgIHByaXZhdGUgX3NjaGVkdWxlcjogU2NoZWR1bGVyLFxuICAgICAgcHJpdmF0ZSBfcGx1Z2luczogUGx1Z2luU3RvcmVcbiAgICkge31cblxuICAgcHVibGljIGNoYWluKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICB9XG5cbiAgIHB1YmxpYyBwdXNoPFI+KHRhc2s6IFNpbXBsZUdpdFRhc2s8Uj4pOiBQcm9taXNlPFI+IHtcbiAgICAgIHRoaXMuX3F1ZXVlLnB1c2godGFzayk7XG5cbiAgICAgIHJldHVybiAodGhpcy5fY2hhaW4gPSB0aGlzLl9jaGFpbi50aGVuKCgpID0+IHRoaXMuYXR0ZW1wdFRhc2sodGFzaykpKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBhc3luYyBhdHRlbXB0VGFzazxSPih0YXNrOiBTaW1wbGVHaXRUYXNrPFI+KTogUHJvbWlzZTx2b2lkIHwgUj4ge1xuICAgICAgY29uc3Qgb25TY2hlZHVsZUNvbXBsZXRlID0gYXdhaXQgdGhpcy5fc2NoZWR1bGVyLm5leHQoKTtcbiAgICAgIGNvbnN0IG9uUXVldWVDb21wbGV0ZSA9ICgpID0+IHRoaXMuX3F1ZXVlLmNvbXBsZXRlKHRhc2spO1xuXG4gICAgICB0cnkge1xuICAgICAgICAgY29uc3QgeyBsb2dnZXIgfSA9IHRoaXMuX3F1ZXVlLmF0dGVtcHQodGFzayk7XG4gICAgICAgICByZXR1cm4gKGF3YWl0IChpc0VtcHR5VGFzayh0YXNrKVxuICAgICAgICAgICAgPyB0aGlzLmF0dGVtcHRFbXB0eVRhc2sodGFzaywgbG9nZ2VyKVxuICAgICAgICAgICAgOiB0aGlzLmF0dGVtcHRSZW1vdGVUYXNrKHRhc2ssIGxvZ2dlcikpKSBhcyBSO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgdGhyb3cgdGhpcy5vbkZhdGFsRXhjZXB0aW9uKHRhc2ssIGUgYXMgRXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgIG9uUXVldWVDb21wbGV0ZSgpO1xuICAgICAgICAgb25TY2hlZHVsZUNvbXBsZXRlKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgb25GYXRhbEV4Y2VwdGlvbjxSPih0YXNrOiBTaW1wbGVHaXRUYXNrPFI+LCBlOiBFcnJvcikge1xuICAgICAgY29uc3QgZ2l0RXJyb3IgPVxuICAgICAgICAgZSBpbnN0YW5jZW9mIEdpdEVycm9yID8gT2JqZWN0LmFzc2lnbihlLCB7IHRhc2sgfSkgOiBuZXcgR2l0RXJyb3IodGFzaywgZSAmJiBTdHJpbmcoZSkpO1xuXG4gICAgICB0aGlzLl9jaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgdGhpcy5fcXVldWUuZmF0YWwoZ2l0RXJyb3IpO1xuXG4gICAgICByZXR1cm4gZ2l0RXJyb3I7XG4gICB9XG5cbiAgIHByaXZhdGUgYXN5bmMgYXR0ZW1wdFJlbW90ZVRhc2s8Uj4odGFzazogUnVubmFibGVUYXNrPFI+LCBsb2dnZXI6IE91dHB1dExvZ2dlcikge1xuICAgICAgY29uc3QgYXJncyA9IHRoaXMuX3BsdWdpbnMuZXhlYyhcbiAgICAgICAgICdzcGF3bi5hcmdzJyxcbiAgICAgICAgIFsuLi50YXNrLmNvbW1hbmRzXSxcbiAgICAgICAgIHBsdWdpbkNvbnRleHQodGFzaywgdGFzay5jb21tYW5kcylcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHRoaXMuZ2l0UmVzcG9uc2UoXG4gICAgICAgICB0YXNrLFxuICAgICAgICAgdGhpcy5iaW5hcnksXG4gICAgICAgICBhcmdzLFxuICAgICAgICAgdGhpcy5vdXRwdXRIYW5kbGVyLFxuICAgICAgICAgbG9nZ2VyLnN0ZXAoJ1NQQVdOJylcbiAgICAgICk7XG4gICAgICBjb25zdCBvdXRwdXRTdHJlYW1zID0gYXdhaXQgdGhpcy5oYW5kbGVUYXNrRGF0YSh0YXNrLCBhcmdzLCByYXcsIGxvZ2dlci5zdGVwKCdIQU5ETEUnKSk7XG5cbiAgICAgIGxvZ2dlcihgcGFzc2luZyByZXNwb25zZSB0byB0YXNrJ3MgcGFyc2VyIGFzIGEgJXNgLCB0YXNrLmZvcm1hdCk7XG5cbiAgICAgIGlmIChpc0J1ZmZlclRhc2sodGFzaykpIHtcbiAgICAgICAgIHJldHVybiBjYWxsVGFza1BhcnNlcih0YXNrLnBhcnNlciwgb3V0cHV0U3RyZWFtcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYWxsVGFza1BhcnNlcih0YXNrLnBhcnNlciwgb3V0cHV0U3RyZWFtcy5hc1N0cmluZ3MoKSk7XG4gICB9XG5cbiAgIHByaXZhdGUgYXN5bmMgYXR0ZW1wdEVtcHR5VGFzayh0YXNrOiBFbXB0eVRhc2ssIGxvZ2dlcjogT3V0cHV0TG9nZ2VyKSB7XG4gICAgICBsb2dnZXIoYGVtcHR5IHRhc2sgYnlwYXNzaW5nIGNoaWxkIHByb2Nlc3MgdG8gY2FsbCB0byB0YXNrJ3MgcGFyc2VyYCk7XG4gICAgICByZXR1cm4gdGFzay5wYXJzZXIodGhpcyk7XG4gICB9XG5cbiAgIHByaXZhdGUgaGFuZGxlVGFza0RhdGE8Uj4oXG4gICAgICB0YXNrOiBTaW1wbGVHaXRUYXNrPFI+LFxuICAgICAgYXJnczogc3RyaW5nW10sXG4gICAgICByZXN1bHQ6IEdpdEV4ZWN1dG9yUmVzdWx0LFxuICAgICAgbG9nZ2VyOiBPdXRwdXRMb2dnZXJcbiAgICk6IFByb21pc2U8R2l0T3V0cHV0U3RyZWFtcz4ge1xuICAgICAgY29uc3QgeyBleGl0Q29kZSwgcmVqZWN0aW9uLCBzdGRPdXQsIHN0ZEVyciB9ID0gcmVzdWx0O1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKGRvbmUsIGZhaWwpID0+IHtcbiAgICAgICAgIGxvZ2dlcihgUHJlcGFyaW5nIHRvIGhhbmRsZSBwcm9jZXNzIHJlc3BvbnNlIGV4aXRDb2RlPSVkIHN0ZE91dD1gLCBleGl0Q29kZSk7XG5cbiAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IHRoaXMuX3BsdWdpbnMuZXhlYyhcbiAgICAgICAgICAgICd0YXNrLmVycm9yJyxcbiAgICAgICAgICAgIHsgZXJyb3I6IHJlamVjdGlvbiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgLi4ucGx1Z2luQ29udGV4dCh0YXNrLCBhcmdzKSxcbiAgICAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICk7XG5cbiAgICAgICAgIGlmIChlcnJvciAmJiB0YXNrLm9uRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBleGl0Q29kZT0lcyBoYW5kbGluZyB3aXRoIGN1c3RvbSBlcnJvciBoYW5kbGVyYCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0YXNrLm9uRXJyb3IoXG4gICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgIChuZXdTdGRPdXQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBjdXN0b20gZXJyb3IgaGFuZGxlciB0cmVhdGVkIGFzIHN1Y2Nlc3NgKTtcbiAgICAgICAgICAgICAgICAgIGxvZ2dlcihgY3VzdG9tIGVycm9yIHJldHVybmVkIGEgJXNgLCBvYmplY3RUb1N0cmluZyhuZXdTdGRPdXQpKTtcblxuICAgICAgICAgICAgICAgICAgZG9uZShcbiAgICAgICAgICAgICAgICAgICAgIG5ldyBHaXRPdXRwdXRTdHJlYW1zKFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShuZXdTdGRPdXQpID8gQnVmZmVyLmNvbmNhdChuZXdTdGRPdXQpIDogbmV3U3RkT3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyLmNvbmNhdChzdGRFcnIpXG4gICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgIGZhaWxcbiAgICAgICAgICAgICk7XG4gICAgICAgICB9XG5cbiAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICBgaGFuZGxpbmcgYXMgZXJyb3I6IGV4aXRDb2RlPSVzIHN0ZEVycj0lcyByZWplY3Rpb249JW9gLFxuICAgICAgICAgICAgICAgZXhpdENvZGUsXG4gICAgICAgICAgICAgICBzdGRFcnIubGVuZ3RoLFxuICAgICAgICAgICAgICAgcmVqZWN0aW9uXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3IpO1xuICAgICAgICAgfVxuXG4gICAgICAgICBsb2dnZXIuaW5mbyhgcmV0cmlldmluZyB0YXNrIG91dHB1dCBjb21wbGV0ZWApO1xuICAgICAgICAgZG9uZShuZXcgR2l0T3V0cHV0U3RyZWFtcyhCdWZmZXIuY29uY2F0KHN0ZE91dCksIEJ1ZmZlci5jb25jYXQoc3RkRXJyKSkpO1xuICAgICAgfSk7XG4gICB9XG5cbiAgIHByaXZhdGUgYXN5bmMgZ2l0UmVzcG9uc2U8Uj4oXG4gICAgICB0YXNrOiBTaW1wbGVHaXRUYXNrPFI+LFxuICAgICAgY29tbWFuZDogc3RyaW5nLFxuICAgICAgYXJnczogc3RyaW5nW10sXG4gICAgICBvdXRwdXRIYW5kbGVyOiBNYXliZTxvdXRwdXRIYW5kbGVyPixcbiAgICAgIGxvZ2dlcjogT3V0cHV0TG9nZ2VyXG4gICApOiBQcm9taXNlPEdpdEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgICBjb25zdCBvdXRwdXRMb2dnZXIgPSBsb2dnZXIuc2libGluZygnb3V0cHV0Jyk7XG4gICAgICBjb25zdCBzcGF3bk9wdGlvbnM6IFNwYXduT3B0aW9ucyA9IHRoaXMuX3BsdWdpbnMuZXhlYyhcbiAgICAgICAgICdzcGF3bi5vcHRpb25zJyxcbiAgICAgICAgIHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICAgICAgd2luZG93c0hpZGU6IHRydWUsXG4gICAgICAgICB9LFxuICAgICAgICAgcGx1Z2luQ29udGV4dCh0YXNrLCB0YXNrLmNvbW1hbmRzKVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChkb25lKSA9PiB7XG4gICAgICAgICBjb25zdCBzdGRPdXQ6IEJ1ZmZlcltdID0gW107XG4gICAgICAgICBjb25zdCBzdGRFcnI6IEJ1ZmZlcltdID0gW107XG5cbiAgICAgICAgIGxvZ2dlci5pbmZvKGAlcyAlb2AsIGNvbW1hbmQsIGFyZ3MpO1xuICAgICAgICAgbG9nZ2VyKCclTycsIHNwYXduT3B0aW9ucyk7XG5cbiAgICAgICAgIGxldCByZWplY3Rpb24gPSB0aGlzLl9iZWZvcmVTcGF3bih0YXNrLCBhcmdzKTtcbiAgICAgICAgIGlmIChyZWplY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKHtcbiAgICAgICAgICAgICAgIHN0ZE91dCxcbiAgICAgICAgICAgICAgIHN0ZEVycixcbiAgICAgICAgICAgICAgIGV4aXRDb2RlOiA5OTAxLFxuICAgICAgICAgICAgICAgcmVqZWN0aW9uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICB9XG5cbiAgICAgICAgIHRoaXMuX3BsdWdpbnMuZXhlYygnc3Bhd24uYmVmb3JlJywgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAuLi5wbHVnaW5Db250ZXh0KHRhc2ssIGFyZ3MpLFxuICAgICAgICAgICAga2lsbChyZWFzb24pIHtcbiAgICAgICAgICAgICAgIHJlamVjdGlvbiA9IHJlYXNvbiB8fCByZWplY3Rpb247XG4gICAgICAgICAgICB9LFxuICAgICAgICAgfSk7XG5cbiAgICAgICAgIGNvbnN0IHNwYXduZWQgPSBzcGF3bihjb21tYW5kLCBhcmdzLCBzcGF3bk9wdGlvbnMpO1xuXG4gICAgICAgICBzcGF3bmVkLnN0ZG91dCEub24oXG4gICAgICAgICAgICAnZGF0YScsXG4gICAgICAgICAgICBvbkRhdGFSZWNlaXZlZChzdGRPdXQsICdzdGRPdXQnLCBsb2dnZXIsIG91dHB1dExvZ2dlci5zdGVwKCdzdGRPdXQnKSlcbiAgICAgICAgICk7XG4gICAgICAgICBzcGF3bmVkLnN0ZGVyciEub24oXG4gICAgICAgICAgICAnZGF0YScsXG4gICAgICAgICAgICBvbkRhdGFSZWNlaXZlZChzdGRFcnIsICdzdGRFcnInLCBsb2dnZXIsIG91dHB1dExvZ2dlci5zdGVwKCdzdGRFcnInKSlcbiAgICAgICAgICk7XG5cbiAgICAgICAgIHNwYXduZWQub24oJ2Vycm9yJywgb25FcnJvclJlY2VpdmVkKHN0ZEVyciwgbG9nZ2VyKSk7XG5cbiAgICAgICAgIGlmIChvdXRwdXRIYW5kbGVyKSB7XG4gICAgICAgICAgICBsb2dnZXIoYFBhc3NpbmcgY2hpbGQgcHJvY2VzcyBzdGRPdXQvc3RkRXJyIHRvIGN1c3RvbSBvdXRwdXRIYW5kbGVyYCk7XG4gICAgICAgICAgICBvdXRwdXRIYW5kbGVyKGNvbW1hbmQsIHNwYXduZWQuc3Rkb3V0ISwgc3Bhd25lZC5zdGRlcnIhLCBbLi4uYXJnc10pO1xuICAgICAgICAgfVxuXG4gICAgICAgICB0aGlzLl9wbHVnaW5zLmV4ZWMoJ3NwYXduLmFmdGVyJywgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAuLi5wbHVnaW5Db250ZXh0KHRhc2ssIGFyZ3MpLFxuICAgICAgICAgICAgc3Bhd25lZCxcbiAgICAgICAgICAgIGNsb3NlKGV4aXRDb2RlOiBudW1iZXIsIHJlYXNvbj86IEVycm9yKSB7XG4gICAgICAgICAgICAgICBkb25lKHtcbiAgICAgICAgICAgICAgICAgIHN0ZE91dCxcbiAgICAgICAgICAgICAgICAgIHN0ZEVycixcbiAgICAgICAgICAgICAgICAgIGV4aXRDb2RlLFxuICAgICAgICAgICAgICAgICAgcmVqZWN0aW9uOiByZWplY3Rpb24gfHwgcmVhc29uLFxuICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2lsbChyZWFzb246IEVycm9yKSB7XG4gICAgICAgICAgICAgICBpZiAoc3Bhd25lZC5raWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgcmVqZWN0aW9uID0gcmVhc29uO1xuICAgICAgICAgICAgICAgc3Bhd25lZC5raWxsKCdTSUdJTlQnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgfVxuXG4gICBwcml2YXRlIF9iZWZvcmVTcGF3bjxSPih0YXNrOiBTaW1wbGVHaXRUYXNrPFI+LCBhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgbGV0IHJlamVjdGlvbjogTWF5YmU8RXJyb3I+O1xuICAgICAgdGhpcy5fcGx1Z2lucy5leGVjKCdzcGF3bi5iZWZvcmUnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgIC4uLnBsdWdpbkNvbnRleHQodGFzaywgYXJncyksXG4gICAgICAgICBraWxsKHJlYXNvbikge1xuICAgICAgICAgICAgcmVqZWN0aW9uID0gcmVhc29uIHx8IHJlamVjdGlvbjtcbiAgICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlamVjdGlvbjtcbiAgIH1cbn1cblxuZnVuY3Rpb24gcGx1Z2luQ29udGV4dDxSPih0YXNrOiBTaW1wbGVHaXRUYXNrPFI+LCBjb21tYW5kczogc3RyaW5nW10pIHtcbiAgIHJldHVybiB7XG4gICAgICBtZXRob2Q6IGZpcnN0KHRhc2suY29tbWFuZHMpIHx8ICcnLFxuICAgICAgY29tbWFuZHMsXG4gICB9O1xufVxuXG5mdW5jdGlvbiBvbkVycm9yUmVjZWl2ZWQodGFyZ2V0OiBCdWZmZXJbXSwgbG9nZ2VyOiBPdXRwdXRMb2dnZXIpIHtcbiAgIHJldHVybiAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgbG9nZ2VyKGBbRVJST1JdIGNoaWxkIHByb2Nlc3MgZXhjZXB0aW9uICVvYCwgZXJyKTtcbiAgICAgIHRhcmdldC5wdXNoKEJ1ZmZlci5mcm9tKFN0cmluZyhlcnIuc3RhY2spLCAnYXNjaWknKSk7XG4gICB9O1xufVxuXG5mdW5jdGlvbiBvbkRhdGFSZWNlaXZlZChcbiAgIHRhcmdldDogQnVmZmVyW10sXG4gICBuYW1lOiBzdHJpbmcsXG4gICBsb2dnZXI6IE91dHB1dExvZ2dlcixcbiAgIG91dHB1dDogT3V0cHV0TG9nZ2VyXG4pIHtcbiAgIHJldHVybiAoYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgICAgIGxvZ2dlcihgJXMgcmVjZWl2ZWQgJUwgYnl0ZXNgLCBuYW1lLCBidWZmZXIpO1xuICAgICAgb3V0cHV0KGAlQmAsIGJ1ZmZlcik7XG4gICAgICB0YXJnZXQucHVzaChidWZmZXIpO1xuICAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBsdWdpblN0b3JlIH0gZnJvbSAnLi4vcGx1Z2lucyc7XG5pbXBvcnQgdHlwZSB7IEdpdEV4ZWN1dG9yRW52LCBvdXRwdXRIYW5kbGVyLCBTaW1wbGVHaXRFeGVjdXRvciwgU2ltcGxlR2l0VGFzayB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgR2l0RXhlY3V0b3JDaGFpbiB9IGZyb20gJy4vZ2l0LWV4ZWN1dG9yLWNoYWluJztcbmltcG9ydCB7IFNjaGVkdWxlciB9IGZyb20gJy4vc2NoZWR1bGVyJztcblxuZXhwb3J0IGNsYXNzIEdpdEV4ZWN1dG9yIGltcGxlbWVudHMgU2ltcGxlR2l0RXhlY3V0b3Ige1xuICAgcHJpdmF0ZSBfY2hhaW4gPSBuZXcgR2l0RXhlY3V0b3JDaGFpbih0aGlzLCB0aGlzLl9zY2hlZHVsZXIsIHRoaXMuX3BsdWdpbnMpO1xuXG4gICBwdWJsaWMgZW52OiBHaXRFeGVjdXRvckVudjtcbiAgIHB1YmxpYyBvdXRwdXRIYW5kbGVyPzogb3V0cHV0SGFuZGxlcjtcblxuICAgY29uc3RydWN0b3IoXG4gICAgICBwdWJsaWMgYmluYXJ5OiBzdHJpbmcgPSAnZ2l0JyxcbiAgICAgIHB1YmxpYyBjd2Q6IHN0cmluZyxcbiAgICAgIHByaXZhdGUgX3NjaGVkdWxlcjogU2NoZWR1bGVyLFxuICAgICAgcHJpdmF0ZSBfcGx1Z2luczogUGx1Z2luU3RvcmVcbiAgICkge31cblxuICAgY2hhaW4oKTogU2ltcGxlR2l0RXhlY3V0b3Ige1xuICAgICAgcmV0dXJuIG5ldyBHaXRFeGVjdXRvckNoYWluKHRoaXMsIHRoaXMuX3NjaGVkdWxlciwgdGhpcy5fcGx1Z2lucyk7XG4gICB9XG5cbiAgIHB1c2g8Uj4odGFzazogU2ltcGxlR2l0VGFzazxSPik6IFByb21pc2U8Uj4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoYWluLnB1c2godGFzayk7XG4gICB9XG59XG4iLCAiaW1wb3J0IHsgR2l0RXJyb3IgfSBmcm9tICcuL2Vycm9ycy9naXQtZXJyb3InO1xuaW1wb3J0IHsgR2l0UmVzcG9uc2VFcnJvciB9IGZyb20gJy4vZXJyb3JzL2dpdC1yZXNwb25zZS1lcnJvcic7XG5pbXBvcnQgeyBTaW1wbGVHaXRUYXNrLCBTaW1wbGVHaXRUYXNrQ2FsbGJhY2sgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IE5PT1AgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRhc2tDYWxsYmFjazxSPihcbiAgIHRhc2s6IFNpbXBsZUdpdFRhc2s8Uj4sXG4gICByZXNwb25zZTogUHJvbWlzZTxSPixcbiAgIGNhbGxiYWNrOiBTaW1wbGVHaXRUYXNrQ2FsbGJhY2s8Uj4gPSBOT09QXG4pIHtcbiAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBSKSA9PiB7XG4gICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgIH07XG5cbiAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyOiBHaXRFcnJvciB8IEdpdFJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnI/LnRhc2sgPT09IHRhc2spIHtcbiAgICAgICAgIGNhbGxiYWNrKFxuICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgR2l0UmVzcG9uc2VFcnJvciA/IGFkZERlcHJlY2F0aW9uTm90aWNlVG9FcnJvcihlcnIpIDogZXJyLFxuICAgICAgICAgICAgdW5kZWZpbmVkIGFzIGFueVxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgIH07XG5cbiAgIHJlc3BvbnNlLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTtcbn1cblxuZnVuY3Rpb24gYWRkRGVwcmVjYXRpb25Ob3RpY2VUb0Vycm9yKGVycjogR2l0UmVzcG9uc2VFcnJvcikge1xuICAgbGV0IGxvZyA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgIGBzaW1wbGUtZ2l0IGRlcHJlY2F0aW9uIG5vdGljZTogYWNjZXNzaW5nIEdpdFJlc3BvbnNlRXJyb3IuJHtuYW1lfSBzaG91bGQgYmUgR2l0UmVzcG9uc2VFcnJvci5naXQuJHtuYW1lfSwgdGhpcyB3aWxsIG5vIGxvbmdlciBiZSBhdmFpbGFibGUgaW4gdmVyc2lvbiAzYFxuICAgICAgKTtcbiAgICAgIGxvZyA9IE5PT1A7XG4gICB9O1xuXG4gICByZXR1cm4gT2JqZWN0LmNyZWF0ZShlcnIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVyci5naXQpLnJlZHVjZShkZXNjcmlwdG9yUmVkdWNlciwge30pKTtcblxuICAgZnVuY3Rpb24gZGVzY3JpcHRvclJlZHVjZXIoYWxsOiBQcm9wZXJ0eURlc2NyaXB0b3JNYXAsIG5hbWU6IHN0cmluZyk6IHR5cGVvZiBhbGwge1xuICAgICAgaWYgKG5hbWUgaW4gZXJyKSB7XG4gICAgICAgICByZXR1cm4gYWxsO1xuICAgICAgfVxuXG4gICAgICBhbGxbbmFtZV0gPSB7XG4gICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBsb2cobmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gZXJyLmdpdFtuYW1lXTtcbiAgICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYWxsO1xuICAgfVxufVxuIiwgImltcG9ydCB7IGZvbGRlckV4aXN0cyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFNpbXBsZUdpdEV4ZWN1dG9yIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgYWRob2NFeGVjVGFzayB9IGZyb20gJy4vdGFzayc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VXb3JraW5nRGlyZWN0b3J5VGFzayhkaXJlY3Rvcnk6IHN0cmluZywgcm9vdD86IFNpbXBsZUdpdEV4ZWN1dG9yKSB7XG4gICByZXR1cm4gYWRob2NFeGVjVGFzaygoaW5zdGFuY2U6IFNpbXBsZUdpdEV4ZWN1dG9yKSA9PiB7XG4gICAgICBpZiAoIWZvbGRlckV4aXN0cyhkaXJlY3RvcnkpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdC5jd2Q6IGNhbm5vdCBjaGFuZ2UgdG8gbm9uLWRpcmVjdG9yeSBcIiR7ZGlyZWN0b3J5fVwiYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKHJvb3QgfHwgaW5zdGFuY2UpLmN3ZCA9IGRpcmVjdG9yeSk7XG4gICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNpbXBsZUdpdCB9IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHR5cGUgeyBTaW1wbGVHaXRBcGkgfSBmcm9tICcuLi9zaW1wbGUtZ2l0LWFwaSc7XG5pbXBvcnQgeyBnZXRUcmFpbGluZ09wdGlvbnMsIHJlbW92ZSwgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayB9IGZyb20gJy4vdGFzayc7XG5cbmZ1bmN0aW9uIGNoZWNrb3V0VGFzayhhcmdzOiBzdHJpbmdbXSkge1xuICAgY29uc3QgY29tbWFuZHMgPSBbJ2NoZWNrb3V0JywgLi4uYXJnc107XG4gICBpZiAoY29tbWFuZHNbMV0gPT09ICctYicgJiYgY29tbWFuZHMuaW5jbHVkZXMoJy1CJykpIHtcbiAgICAgIGNvbW1hbmRzWzFdID0gcmVtb3ZlKGNvbW1hbmRzLCAnLUInKTtcbiAgIH1cblxuICAgcmV0dXJuIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKTogUGljazxTaW1wbGVHaXQsICdjaGVja291dCcgfCAnY2hlY2tvdXRCcmFuY2gnIHwgJ2NoZWNrb3V0TG9jYWxCcmFuY2gnPiB7XG4gICByZXR1cm4ge1xuICAgICAgY2hlY2tvdXQodGhpczogU2ltcGxlR2l0QXBpKSB7XG4gICAgICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgICAgICAgIGNoZWNrb3V0VGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCAxKSksXG4gICAgICAgICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgICAgICAgKTtcbiAgICAgIH0sXG5cbiAgICAgIGNoZWNrb3V0QnJhbmNoKHRoaXM6IFNpbXBsZUdpdEFwaSwgYnJhbmNoTmFtZSwgc3RhcnRQb2ludCkge1xuICAgICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICAgICBjaGVja291dFRhc2soWyctYicsIGJyYW5jaE5hbWUsIHN0YXJ0UG9pbnQsIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpXSksXG4gICAgICAgICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgICAgICAgKTtcbiAgICAgIH0sXG5cbiAgICAgIGNoZWNrb3V0TG9jYWxCcmFuY2godGhpczogU2ltcGxlR2l0QXBpLCBicmFuY2hOYW1lKSB7XG4gICAgICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgICAgICAgIGNoZWNrb3V0VGFzayhbJy1iJywgYnJhbmNoTmFtZSwgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cyldKSxcbiAgICAgICAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICAgICAgICApO1xuICAgICAgfSxcbiAgIH07XG59XG4iLCAiaW1wb3J0IHsgQ29tbWl0UmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBMaW5lUGFyc2VyLCBwYXJzZVN0cmluZ1Jlc3BvbnNlIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBwYXJzZXJzOiBMaW5lUGFyc2VyPENvbW1pdFJlc3VsdD5bXSA9IFtcbiAgIG5ldyBMaW5lUGFyc2VyKC9eXFxbKFteXFxzXSspKCBcXChbXildK1xcKSk/IChbXlxcXV0rKS8sIChyZXN1bHQsIFticmFuY2gsIHJvb3QsIGNvbW1pdF0pID0+IHtcbiAgICAgIHJlc3VsdC5icmFuY2ggPSBicmFuY2g7XG4gICAgICByZXN1bHQuY29tbWl0ID0gY29tbWl0O1xuICAgICAgcmVzdWx0LnJvb3QgPSAhIXJvb3Q7XG4gICB9KSxcbiAgIG5ldyBMaW5lUGFyc2VyKC9cXHMqQXV0aG9yOlxccyguKykvaSwgKHJlc3VsdCwgW2F1dGhvcl0pID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gYXV0aG9yLnNwbGl0KCc8Jyk7XG4gICAgICBjb25zdCBlbWFpbCA9IHBhcnRzLnBvcCgpO1xuXG4gICAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC5hdXRob3IgPSB7XG4gICAgICAgICBlbWFpbDogZW1haWwuc3Vic3RyKDAsIGVtYWlsLmxlbmd0aCAtIDEpLFxuICAgICAgICAgbmFtZTogcGFydHMuam9pbignPCcpLnRyaW0oKSxcbiAgICAgIH07XG4gICB9KSxcbiAgIG5ldyBMaW5lUGFyc2VyKFxuICAgICAgLyhcXGQrKVteLF0qKD86LFxccyooXFxkKylbXixdKikoPzosXFxzKihcXGQrKSkvZyxcbiAgICAgIChyZXN1bHQsIFtjaGFuZ2VzLCBpbnNlcnRpb25zLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICAgICByZXN1bHQuc3VtbWFyeS5jaGFuZ2VzID0gcGFyc2VJbnQoY2hhbmdlcywgMTApIHx8IDA7XG4gICAgICAgICByZXN1bHQuc3VtbWFyeS5pbnNlcnRpb25zID0gcGFyc2VJbnQoaW5zZXJ0aW9ucywgMTApIHx8IDA7XG4gICAgICAgICByZXN1bHQuc3VtbWFyeS5kZWxldGlvbnMgPSBwYXJzZUludChkZWxldGlvbnMsIDEwKSB8fCAwO1xuICAgICAgfVxuICAgKSxcbiAgIG5ldyBMaW5lUGFyc2VyKFxuICAgICAgL14oXFxkKylbXixdKig/OixcXHMqKFxcZCspW14oXStcXCgoWystXSkpPy8sXG4gICAgICAocmVzdWx0LCBbY2hhbmdlcywgbGluZXMsIGRpcmVjdGlvbl0pID0+IHtcbiAgICAgICAgIHJlc3VsdC5zdW1tYXJ5LmNoYW5nZXMgPSBwYXJzZUludChjaGFuZ2VzLCAxMCkgfHwgMDtcbiAgICAgICAgIGNvbnN0IGNvdW50ID0gcGFyc2VJbnQobGluZXMsIDEwKSB8fCAwO1xuICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgICAgICByZXN1bHQuc3VtbWFyeS5kZWxldGlvbnMgPSBjb3VudDtcbiAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnKycpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdW1tYXJ5Lmluc2VydGlvbnMgPSBjb3VudDtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgICksXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb21taXRSZXN1bHQoc3RkT3V0OiBzdHJpbmcpOiBDb21taXRSZXN1bHQge1xuICAgY29uc3QgcmVzdWx0OiBDb21taXRSZXN1bHQgPSB7XG4gICAgICBhdXRob3I6IG51bGwsXG4gICAgICBicmFuY2g6ICcnLFxuICAgICAgY29tbWl0OiAnJyxcbiAgICAgIHJvb3Q6IGZhbHNlLFxuICAgICAgc3VtbWFyeToge1xuICAgICAgICAgY2hhbmdlczogMCxcbiAgICAgICAgIGluc2VydGlvbnM6IDAsXG4gICAgICAgICBkZWxldGlvbnM6IDAsXG4gICAgICB9LFxuICAgfTtcbiAgIHJldHVybiBwYXJzZVN0cmluZ1Jlc3BvbnNlKHJlc3VsdCwgcGFyc2Vycywgc3RkT3V0KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1pdFJlc3VsdCwgU2ltcGxlR2l0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgdHlwZSB7IFNpbXBsZUdpdEFwaSB9IGZyb20gJy4uL3NpbXBsZS1naXQtYXBpJztcbmltcG9ydCB0eXBlIHsgU3RyaW5nVGFzayB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlQ29tbWl0UmVzdWx0IH0gZnJvbSAnLi4vcGFyc2Vycy9wYXJzZS1jb21taXQnO1xuaW1wb3J0IHtcbiAgIGFzQXJyYXksXG4gICBmaWx0ZXJBcnJheSxcbiAgIGZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXksXG4gICBmaWx0ZXJUeXBlLFxuICAgZ2V0VHJhaWxpbmdPcHRpb25zLFxuICAgcHJlZml4ZWRBcnJheSxcbiAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudCxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgY29uZmlndXJhdGlvbkVycm9yVGFzayB9IGZyb20gJy4vdGFzayc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21taXRUYXNrKFxuICAgbWVzc2FnZTogc3RyaW5nW10sXG4gICBmaWxlczogc3RyaW5nW10sXG4gICBjdXN0b21BcmdzOiBzdHJpbmdbXVxuKTogU3RyaW5nVGFzazxDb21taXRSZXN1bHQ+IHtcbiAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICctYycsXG4gICAgICAnY29yZS5hYmJyZXY9NDAnLFxuICAgICAgJ2NvbW1pdCcsXG4gICAgICAuLi5wcmVmaXhlZEFycmF5KG1lc3NhZ2UsICctbScpLFxuICAgICAgLi4uZmlsZXMsXG4gICAgICAuLi5jdXN0b21BcmdzLFxuICAgXTtcblxuICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzLFxuICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgcGFyc2VyOiBwYXJzZUNvbW1pdFJlc3VsdCxcbiAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpOiBQaWNrPFNpbXBsZUdpdCwgJ2NvbW1pdCc+IHtcbiAgIHJldHVybiB7XG4gICAgICBjb21taXQodGhpczogU2ltcGxlR2l0QXBpLCBtZXNzYWdlOiBzdHJpbmcgfCBzdHJpbmdbXSwgLi4ucmVzdDogdW5rbm93bltdKSB7XG4gICAgICAgICBjb25zdCBuZXh0ID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyk7XG4gICAgICAgICBjb25zdCB0YXNrID1cbiAgICAgICAgICAgIHJlamVjdERlcHJlY2F0ZWRTaWduYXR1cmVzKG1lc3NhZ2UpIHx8XG4gICAgICAgICAgICBjb21taXRUYXNrKFxuICAgICAgICAgICAgICAgYXNBcnJheShtZXNzYWdlKSxcbiAgICAgICAgICAgICAgIGFzQXJyYXkoZmlsdGVyVHlwZShyZXN0WzBdLCBmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5LCBbXSkpLFxuICAgICAgICAgICAgICAgWy4uLmZpbHRlclR5cGUocmVzdFsxXSwgZmlsdGVyQXJyYXksIFtdKSwgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgMCwgdHJ1ZSldXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCBuZXh0KTtcbiAgICAgIH0sXG4gICB9O1xuXG4gICBmdW5jdGlvbiByZWplY3REZXByZWNhdGVkU2lnbmF0dXJlcyhtZXNzYWdlPzogdW5rbm93bikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgICFmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5KG1lc3NhZ2UpICYmXG4gICAgICAgICBjb25maWd1cmF0aW9uRXJyb3JUYXNrKFxuICAgICAgICAgICAgYGdpdC5jb21taXQ6IHJlcXVpcmVzIHRoZSBjb21taXQgbWVzc2FnZSB0byBiZSBzdXBwbGllZCBhcyBhIHN0cmluZy9zdHJpbmdbXWBcbiAgICAgICAgIClcbiAgICAgICk7XG4gICB9XG59XG4iLCAiaW1wb3J0IHsgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayB9IGZyb20gJy4vdGFzayc7XG5pbXBvcnQgeyBTdHJpbmdUYXNrIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFRhc2sgdXNlZCBieSBgZ2l0Lmhhc2hPYmplY3RgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoT2JqZWN0VGFzayhmaWxlUGF0aDogc3RyaW5nLCB3cml0ZTogYm9vbGVhbik6IFN0cmluZ1Rhc2s8c3RyaW5nPiB7XG4gICBjb25zdCBjb21tYW5kcyA9IFsnaGFzaC1vYmplY3QnLCBmaWxlUGF0aF07XG4gICBpZiAod3JpdGUpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJy13Jyk7XG4gICB9XG5cbiAgIHJldHVybiBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzLCB0cnVlKTtcbn1cbiIsICJpbXBvcnQgeyBJbml0UmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5cbmV4cG9ydCBjbGFzcyBJbml0U3VtbWFyeSBpbXBsZW1lbnRzIEluaXRSZXN1bHQge1xuICAgY29uc3RydWN0b3IoXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYmFyZTogYm9vbGVhbixcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmcsXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZXhpc3Rpbmc6IGJvb2xlYW4sXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ2l0RGlyOiBzdHJpbmdcbiAgICkge31cbn1cblxuY29uc3QgaW5pdFJlc3BvbnNlUmVnZXggPSAvXkluaXQuKyByZXBvc2l0b3J5IGluICguKykkLztcbmNvbnN0IHJlSW5pdFJlc3BvbnNlUmVnZXggPSAvXlJlaW4uKyBpbiAoLispJC87XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUluaXQoYmFyZTogYm9vbGVhbiwgcGF0aDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcbiAgIGNvbnN0IHJlc3BvbnNlID0gU3RyaW5nKHRleHQpLnRyaW0oKTtcbiAgIGxldCByZXN1bHQ7XG5cbiAgIGlmICgocmVzdWx0ID0gaW5pdFJlc3BvbnNlUmVnZXguZXhlYyhyZXNwb25zZSkpKSB7XG4gICAgICByZXR1cm4gbmV3IEluaXRTdW1tYXJ5KGJhcmUsIHBhdGgsIGZhbHNlLCByZXN1bHRbMV0pO1xuICAgfVxuXG4gICBpZiAoKHJlc3VsdCA9IHJlSW5pdFJlc3BvbnNlUmVnZXguZXhlYyhyZXNwb25zZSkpKSB7XG4gICAgICByZXR1cm4gbmV3IEluaXRTdW1tYXJ5KGJhcmUsIHBhdGgsIHRydWUsIHJlc3VsdFsxXSk7XG4gICB9XG5cbiAgIGxldCBnaXREaXIgPSAnJztcbiAgIGNvbnN0IHRva2VucyA9IHJlc3BvbnNlLnNwbGl0KCcgJyk7XG4gICB3aGlsZSAodG9rZW5zLmxlbmd0aCkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcbiAgICAgIGlmICh0b2tlbiA9PT0gJ2luJykge1xuICAgICAgICAgZ2l0RGlyID0gdG9rZW5zLmpvaW4oJyAnKTtcbiAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgfVxuXG4gICByZXR1cm4gbmV3IEluaXRTdW1tYXJ5KGJhcmUsIHBhdGgsIC9ecmUvaS50ZXN0KHJlc3BvbnNlKSwgZ2l0RGlyKTtcbn1cbiIsICJpbXBvcnQgeyBJbml0UmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBwYXJzZUluaXQgfSBmcm9tICcuLi9yZXNwb25zZXMvSW5pdFN1bW1hcnknO1xuaW1wb3J0IHsgU3RyaW5nVGFzayB9IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgYmFyZUNvbW1hbmQgPSAnLS1iYXJlJztcblxuZnVuY3Rpb24gaGFzQmFyZUNvbW1hbmQoY29tbWFuZDogc3RyaW5nW10pIHtcbiAgIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKGJhcmVDb21tYW5kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRUYXNrKGJhcmUgPSBmYWxzZSwgcGF0aDogc3RyaW5nLCBjdXN0b21BcmdzOiBzdHJpbmdbXSk6IFN0cmluZ1Rhc2s8SW5pdFJlc3VsdD4ge1xuICAgY29uc3QgY29tbWFuZHMgPSBbJ2luaXQnLCAuLi5jdXN0b21BcmdzXTtcbiAgIGlmIChiYXJlICYmICFoYXNCYXJlQ29tbWFuZChjb21tYW5kcykpIHtcbiAgICAgIGNvbW1hbmRzLnNwbGljZSgxLCAwLCBiYXJlQ29tbWFuZCk7XG4gICB9XG5cbiAgIHJldHVybiB7XG4gICAgICBjb21tYW5kcyxcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIHBhcnNlcih0ZXh0OiBzdHJpbmcpOiBJbml0UmVzdWx0IHtcbiAgICAgICAgIHJldHVybiBwYXJzZUluaXQoY29tbWFuZHMuaW5jbHVkZXMoJy0tYmFyZScpLCBwYXRoLCB0ZXh0KTtcbiAgICAgIH0sXG4gICB9O1xufVxuIiwgImV4cG9ydCBlbnVtIExvZ0Zvcm1hdCB7XG4gICBOT05FID0gJycsXG4gICBTVEFUID0gJy0tc3RhdCcsXG4gICBOVU1fU1RBVCA9ICctLW51bXN0YXQnLFxuICAgTkFNRV9PTkxZID0gJy0tbmFtZS1vbmx5JyxcbiAgIE5BTUVfU1RBVFVTID0gJy0tbmFtZS1zdGF0dXMnLFxufVxuXG5jb25zdCBsb2dGb3JtYXRSZWdleCA9IC9eLS0oc3RhdHxudW1zdGF0fG5hbWUtb25seXxuYW1lLXN0YXR1cykoPXwkKS87XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2dGb3JtYXRGcm9tQ29tbWFuZChjdXN0b21BcmdzOiBzdHJpbmdbXSkge1xuICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXN0b21BcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmb3JtYXQgPSBsb2dGb3JtYXRSZWdleC5leGVjKGN1c3RvbUFyZ3NbaV0pO1xuICAgICAgaWYgKGZvcm1hdCkge1xuICAgICAgICAgcmV0dXJuIGAtLSR7Zm9ybWF0WzFdfWAgYXMgTG9nRm9ybWF0O1xuICAgICAgfVxuICAgfVxuXG4gICByZXR1cm4gTG9nRm9ybWF0Lk5PTkU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvZ0Zvcm1hdChjdXN0b21Bcmc6IHN0cmluZyB8IHVua25vd24pIHtcbiAgIHJldHVybiBsb2dGb3JtYXRSZWdleC50ZXN0KGN1c3RvbUFyZyBhcyBzdHJpbmcpO1xufVxuIiwgImltcG9ydCB7IERpZmZSZXN1bHQsIERpZmZSZXN1bHRCaW5hcnlGaWxlLCBEaWZmUmVzdWx0VGV4dEZpbGUgfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcblxuLyoqKlxuICogVGhlIERpZmZTdW1tYXJ5IGlzIHJldHVybmVkIGFzIGEgcmVzcG9uc2UgdG8gZ2V0dGluZyBgZ2l0KCkuc3RhdHVzKClgXG4gKi9cbmV4cG9ydCBjbGFzcyBEaWZmU3VtbWFyeSBpbXBsZW1lbnRzIERpZmZSZXN1bHQge1xuICAgY2hhbmdlZCA9IDA7XG4gICBkZWxldGlvbnMgPSAwO1xuICAgaW5zZXJ0aW9ucyA9IDA7XG5cbiAgIGZpbGVzOiBBcnJheTxEaWZmUmVzdWx0VGV4dEZpbGUgfCBEaWZmUmVzdWx0QmluYXJ5RmlsZT4gPSBbXTtcbn1cbiIsICJpbXBvcnQgeyBEaWZmUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBMb2dGb3JtYXQgfSBmcm9tICcuLi9hcmdzL2xvZy1mb3JtYXQnO1xuaW1wb3J0IHsgRGlmZlN1bW1hcnkgfSBmcm9tICcuLi9yZXNwb25zZXMvRGlmZlN1bW1hcnknO1xuaW1wb3J0IHsgYXNOdW1iZXIsIExpbmVQYXJzZXIsIHBhcnNlU3RyaW5nUmVzcG9uc2UgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IHN0YXRQYXJzZXIgPSBbXG4gICBuZXcgTGluZVBhcnNlcjxEaWZmUmVzdWx0PihcbiAgICAgIC8oLispXFxzK1xcfFxccysoXFxkKykoXFxzK1srXFwtXSspPyQvLFxuICAgICAgKHJlc3VsdCwgW2ZpbGUsIGNoYW5nZXMsIGFsdGVyYXRpb25zID0gJyddKSA9PiB7XG4gICAgICAgICByZXN1bHQuZmlsZXMucHVzaCh7XG4gICAgICAgICAgICBmaWxlOiBmaWxlLnRyaW0oKSxcbiAgICAgICAgICAgIGNoYW5nZXM6IGFzTnVtYmVyKGNoYW5nZXMpLFxuICAgICAgICAgICAgaW5zZXJ0aW9uczogYWx0ZXJhdGlvbnMucmVwbGFjZSgvW14rXS9nLCAnJykubGVuZ3RoLFxuICAgICAgICAgICAgZGVsZXRpb25zOiBhbHRlcmF0aW9ucy5yZXBsYWNlKC9bXi1dL2csICcnKS5sZW5ndGgsXG4gICAgICAgICAgICBiaW5hcnk6IGZhbHNlLFxuICAgICAgICAgfSk7XG4gICAgICB9XG4gICApLFxuICAgbmV3IExpbmVQYXJzZXI8RGlmZlJlc3VsdD4oXG4gICAgICAvKC4rKSBcXHxcXHMrQmluIChbMC05Ll0rKSAtPiAoWzAtOS5dKykgKFthLXpdKykvLFxuICAgICAgKHJlc3VsdCwgW2ZpbGUsIGJlZm9yZSwgYWZ0ZXJdKSA9PiB7XG4gICAgICAgICByZXN1bHQuZmlsZXMucHVzaCh7XG4gICAgICAgICAgICBmaWxlOiBmaWxlLnRyaW0oKSxcbiAgICAgICAgICAgIGJlZm9yZTogYXNOdW1iZXIoYmVmb3JlKSxcbiAgICAgICAgICAgIGFmdGVyOiBhc051bWJlcihhZnRlciksXG4gICAgICAgICAgICBiaW5hcnk6IHRydWUsXG4gICAgICAgICB9KTtcbiAgICAgIH1cbiAgICksXG4gICBuZXcgTGluZVBhcnNlcjxEaWZmUmVzdWx0PihcbiAgICAgIC8oXFxkKykgZmlsZXM/IGNoYW5nZWRcXHMqKCg/OiwgXFxkKyBbXixdKyl7MCwyfSkvLFxuICAgICAgKHJlc3VsdCwgW2NoYW5nZWQsIHN1bW1hcnldKSA9PiB7XG4gICAgICAgICBjb25zdCBpbnNlcnRlZCA9IC8oXFxkKykgaS8uZXhlYyhzdW1tYXJ5KTtcbiAgICAgICAgIGNvbnN0IGRlbGV0ZWQgPSAvKFxcZCspIGQvLmV4ZWMoc3VtbWFyeSk7XG5cbiAgICAgICAgIHJlc3VsdC5jaGFuZ2VkID0gYXNOdW1iZXIoY2hhbmdlZCk7XG4gICAgICAgICByZXN1bHQuaW5zZXJ0aW9ucyA9IGFzTnVtYmVyKGluc2VydGVkPy5bMV0pO1xuICAgICAgICAgcmVzdWx0LmRlbGV0aW9ucyA9IGFzTnVtYmVyKGRlbGV0ZWQ/LlsxXSk7XG4gICAgICB9XG4gICApLFxuXTtcblxuY29uc3QgbnVtU3RhdFBhcnNlciA9IFtcbiAgIG5ldyBMaW5lUGFyc2VyPERpZmZSZXN1bHQ+KFxuICAgICAgLyhcXGQrKVxcdChcXGQrKVxcdCguKykkLyxcbiAgICAgIChyZXN1bHQsIFtjaGFuZ2VzSW5zZXJ0LCBjaGFuZ2VzRGVsZXRlLCBmaWxlXSkgPT4ge1xuICAgICAgICAgY29uc3QgaW5zZXJ0aW9ucyA9IGFzTnVtYmVyKGNoYW5nZXNJbnNlcnQpO1xuICAgICAgICAgY29uc3QgZGVsZXRpb25zID0gYXNOdW1iZXIoY2hhbmdlc0RlbGV0ZSk7XG5cbiAgICAgICAgIHJlc3VsdC5jaGFuZ2VkKys7XG4gICAgICAgICByZXN1bHQuaW5zZXJ0aW9ucyArPSBpbnNlcnRpb25zO1xuICAgICAgICAgcmVzdWx0LmRlbGV0aW9ucyArPSBkZWxldGlvbnM7XG5cbiAgICAgICAgIHJlc3VsdC5maWxlcy5wdXNoKHtcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICBjaGFuZ2VzOiBpbnNlcnRpb25zICsgZGVsZXRpb25zLFxuICAgICAgICAgICAgaW5zZXJ0aW9ucyxcbiAgICAgICAgICAgIGRlbGV0aW9ucyxcbiAgICAgICAgICAgIGJpbmFyeTogZmFsc2UsXG4gICAgICAgICB9KTtcbiAgICAgIH1cbiAgICksXG4gICBuZXcgTGluZVBhcnNlcjxEaWZmUmVzdWx0PigvLVxcdC1cXHQoLispJC8sIChyZXN1bHQsIFtmaWxlXSkgPT4ge1xuICAgICAgcmVzdWx0LmNoYW5nZWQrKztcblxuICAgICAgcmVzdWx0LmZpbGVzLnB1c2goe1xuICAgICAgICAgZmlsZSxcbiAgICAgICAgIGFmdGVyOiAwLFxuICAgICAgICAgYmVmb3JlOiAwLFxuICAgICAgICAgYmluYXJ5OiB0cnVlLFxuICAgICAgfSk7XG4gICB9KSxcbl07XG5cbmNvbnN0IG5hbWVPbmx5UGFyc2VyID0gW1xuICAgbmV3IExpbmVQYXJzZXI8RGlmZlJlc3VsdD4oLyguKykkLywgKHJlc3VsdCwgW2ZpbGVdKSA9PiB7XG4gICAgICByZXN1bHQuY2hhbmdlZCsrO1xuICAgICAgcmVzdWx0LmZpbGVzLnB1c2goe1xuICAgICAgICAgZmlsZSxcbiAgICAgICAgIGNoYW5nZXM6IDAsXG4gICAgICAgICBpbnNlcnRpb25zOiAwLFxuICAgICAgICAgZGVsZXRpb25zOiAwLFxuICAgICAgICAgYmluYXJ5OiBmYWxzZSxcbiAgICAgIH0pO1xuICAgfSksXG5dO1xuXG5jb25zdCBuYW1lU3RhdHVzUGFyc2VyID0gW1xuICAgbmV3IExpbmVQYXJzZXI8RGlmZlJlc3VsdD4oXG4gICAgICAvKFtBQ0RNUlRVWEJdKShbMC05XVswLTldWzAtOV0pP1xcdCguW15cXHRdKylcXHQ/KC4qKT8kLyxcbiAgICAgIChyZXN1bHQsIFtzdGF0dXMsIF9zaW1pbGFyaXR5LCBmcm9tLCB0b10pID0+IHtcbiAgICAgICAgIHJlc3VsdC5jaGFuZ2VkKys7XG4gICAgICAgICByZXN1bHQuZmlsZXMucHVzaCh7XG4gICAgICAgICAgICBmaWxlOiB0byA/PyBmcm9tLFxuICAgICAgICAgICAgY2hhbmdlczogMCxcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgICAgaW5zZXJ0aW9uczogMCxcbiAgICAgICAgICAgIGRlbGV0aW9uczogMCxcbiAgICAgICAgICAgIGJpbmFyeTogZmFsc2UsXG4gICAgICAgICB9KTtcbiAgICAgIH1cbiAgICksXG5dO1xuXG5jb25zdCBkaWZmU3VtbWFyeVBhcnNlcnM6IFJlY29yZDxMb2dGb3JtYXQsIExpbmVQYXJzZXI8RGlmZlJlc3VsdD5bXT4gPSB7XG4gICBbTG9nRm9ybWF0Lk5PTkVdOiBzdGF0UGFyc2VyLFxuICAgW0xvZ0Zvcm1hdC5TVEFUXTogc3RhdFBhcnNlcixcbiAgIFtMb2dGb3JtYXQuTlVNX1NUQVRdOiBudW1TdGF0UGFyc2VyLFxuICAgW0xvZ0Zvcm1hdC5OQU1FX1NUQVRVU106IG5hbWVTdGF0dXNQYXJzZXIsXG4gICBbTG9nRm9ybWF0Lk5BTUVfT05MWV06IG5hbWVPbmx5UGFyc2VyLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpZmZQYXJzZXIoZm9ybWF0ID0gTG9nRm9ybWF0Lk5PTkUpIHtcbiAgIGNvbnN0IHBhcnNlciA9IGRpZmZTdW1tYXJ5UGFyc2Vyc1tmb3JtYXRdO1xuXG4gICByZXR1cm4gKHN0ZE91dDogc3RyaW5nKSA9PiBwYXJzZVN0cmluZ1Jlc3BvbnNlKG5ldyBEaWZmU3VtbWFyeSgpLCBwYXJzZXIsIHN0ZE91dCwgZmFsc2UpO1xufVxuIiwgImltcG9ydCB7IExpc3RMb2dMaW5lLCBMb2dSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcbmltcG9ydCB7IHRvTGluZXNXaXRoQ29udGVudCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IGdldERpZmZQYXJzZXIgfSBmcm9tICcuL3BhcnNlLWRpZmYtc3VtbWFyeSc7XG5pbXBvcnQgeyBMb2dGb3JtYXQgfSBmcm9tICcuLi9hcmdzL2xvZy1mb3JtYXQnO1xuXG5leHBvcnQgY29uc3QgU1RBUlRfQk9VTkRBUlkgPSAnXHUwMEYyXHUwMEYyXHUwMEYyXHUwMEYyXHUwMEYyXHUwMEYyICc7XG5cbmV4cG9ydCBjb25zdCBDT01NSVRfQk9VTkRBUlkgPSAnIFx1MDBGMlx1MDBGMic7XG5cbmV4cG9ydCBjb25zdCBTUExJVFRFUiA9ICcgXHUwMEYyICc7XG5cbmNvbnN0IGRlZmF1bHRGaWVsZE5hbWVzID0gWydoYXNoJywgJ2RhdGUnLCAnbWVzc2FnZScsICdyZWZzJywgJ2F1dGhvcl9uYW1lJywgJ2F1dGhvcl9lbWFpbCddO1xuXG5mdW5jdGlvbiBsaW5lQnVpbGRlcih0b2tlbnM6IHN0cmluZ1tdLCBmaWVsZHM6IHN0cmluZ1tdKTogYW55IHtcbiAgIHJldHVybiBmaWVsZHMucmVkdWNlKChsaW5lLCBmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgIGxpbmVbZmllbGRdID0gdG9rZW5zW2luZGV4XSB8fCAnJztcbiAgICAgIHJldHVybiBsaW5lO1xuICAgfSwgT2JqZWN0LmNyZWF0ZSh7IGRpZmY6IG51bGwgfSkgYXMgYW55KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpc3RMb2dTdW1tYXJ5UGFyc2VyPFQgPSBhbnk+KFxuICAgc3BsaXR0ZXIgPSBTUExJVFRFUixcbiAgIGZpZWxkcyA9IGRlZmF1bHRGaWVsZE5hbWVzLFxuICAgbG9nRm9ybWF0ID0gTG9nRm9ybWF0Lk5PTkVcbikge1xuICAgY29uc3QgcGFyc2VEaWZmUmVzdWx0ID0gZ2V0RGlmZlBhcnNlcihsb2dGb3JtYXQpO1xuXG4gICByZXR1cm4gZnVuY3Rpb24gKHN0ZE91dDogc3RyaW5nKTogTG9nUmVzdWx0PFQ+IHtcbiAgICAgIGNvbnN0IGFsbDogUmVhZG9ubHlBcnJheTxUICYgTGlzdExvZ0xpbmU+ID0gdG9MaW5lc1dpdGhDb250ZW50KFxuICAgICAgICAgc3RkT3V0LFxuICAgICAgICAgdHJ1ZSxcbiAgICAgICAgIFNUQVJUX0JPVU5EQVJZXG4gICAgICApLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgY29uc3QgbGluZURldGFpbCA9IGl0ZW0udHJpbSgpLnNwbGl0KENPTU1JVF9CT1VOREFSWSk7XG4gICAgICAgICBjb25zdCBsaXN0TG9nTGluZTogVCAmIExpc3RMb2dMaW5lID0gbGluZUJ1aWxkZXIoXG4gICAgICAgICAgICBsaW5lRGV0YWlsWzBdLnRyaW0oKS5zcGxpdChzcGxpdHRlciksXG4gICAgICAgICAgICBmaWVsZHNcbiAgICAgICAgICk7XG5cbiAgICAgICAgIGlmIChsaW5lRGV0YWlsLmxlbmd0aCA+IDEgJiYgISFsaW5lRGV0YWlsWzFdLnRyaW0oKSkge1xuICAgICAgICAgICAgbGlzdExvZ0xpbmUuZGlmZiA9IHBhcnNlRGlmZlJlc3VsdChsaW5lRGV0YWlsWzFdKTtcbiAgICAgICAgIH1cblxuICAgICAgICAgcmV0dXJuIGxpc3RMb2dMaW5lO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgICBhbGwsXG4gICAgICAgICBsYXRlc3Q6IChhbGwubGVuZ3RoICYmIGFsbFswXSkgfHwgbnVsbCxcbiAgICAgICAgIHRvdGFsOiBhbGwubGVuZ3RoLFxuICAgICAgfTtcbiAgIH07XG59XG4iLCAiaW1wb3J0IHsgU3RyaW5nVGFzayB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IERpZmZSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcbmltcG9ydCB7IGlzTG9nRm9ybWF0LCBMb2dGb3JtYXQsIGxvZ0Zvcm1hdEZyb21Db21tYW5kIH0gZnJvbSAnLi4vYXJncy9sb2ctZm9ybWF0JztcbmltcG9ydCB7IGdldERpZmZQYXJzZXIgfSBmcm9tICcuLi9wYXJzZXJzL3BhcnNlLWRpZmYtc3VtbWFyeSc7XG5pbXBvcnQgeyBjb25maWd1cmF0aW9uRXJyb3JUYXNrLCBFbXB0eVRhc2sgfSBmcm9tICcuL3Rhc2snO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZlN1bW1hcnlUYXNrKGN1c3RvbUFyZ3M6IHN0cmluZ1tdKTogU3RyaW5nVGFzazxEaWZmUmVzdWx0PiB8IEVtcHR5VGFzayB7XG4gICBsZXQgbG9nRm9ybWF0ID0gbG9nRm9ybWF0RnJvbUNvbW1hbmQoY3VzdG9tQXJncyk7XG5cbiAgIGNvbnN0IGNvbW1hbmRzID0gWydkaWZmJ107XG5cbiAgIGlmIChsb2dGb3JtYXQgPT09IExvZ0Zvcm1hdC5OT05FKSB7XG4gICAgICBsb2dGb3JtYXQgPSBMb2dGb3JtYXQuU1RBVDtcbiAgICAgIGNvbW1hbmRzLnB1c2goJy0tc3RhdD00MDk2Jyk7XG4gICB9XG5cbiAgIGNvbW1hbmRzLnB1c2goLi4uY3VzdG9tQXJncyk7XG5cbiAgIHJldHVybiAoXG4gICAgICB2YWxpZGF0ZUxvZ0Zvcm1hdENvbmZpZyhjb21tYW5kcykgfHwge1xuICAgICAgICAgY29tbWFuZHMsXG4gICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgICBwYXJzZXI6IGdldERpZmZQYXJzZXIobG9nRm9ybWF0KSxcbiAgICAgIH1cbiAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxvZ0Zvcm1hdENvbmZpZyhjdXN0b21BcmdzOiB1bmtub3duW10pOiBFbXB0eVRhc2sgfCB2b2lkIHtcbiAgIGNvbnN0IGZsYWdzID0gY3VzdG9tQXJncy5maWx0ZXIoaXNMb2dGb3JtYXQpO1xuXG4gICBpZiAoZmxhZ3MubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25FcnJvclRhc2soXG4gICAgICAgICBgU3VtbWFyeSBmbGFncyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIC0gcGljayBvbmUgb2YgJHtmbGFncy5qb2luKCcsJyl9YFxuICAgICAgKTtcbiAgIH1cblxuICAgaWYgKGZsYWdzLmxlbmd0aCAmJiBjdXN0b21BcmdzLmluY2x1ZGVzKCcteicpKSB7XG4gICAgICByZXR1cm4gY29uZmlndXJhdGlvbkVycm9yVGFzayhcbiAgICAgICAgIGBTdW1tYXJ5IGZsYWcgJHtmbGFnc30gcGFyc2luZyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG51bGwgdGVybWluYXRpb24gb3B0aW9uICcteidgXG4gICAgICApO1xuICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgT3B0aW9ucywgU3RyaW5nVGFzayB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTG9nUmVzdWx0LCBTaW1wbGVHaXQgfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcbmltcG9ydCB7IGxvZ0Zvcm1hdEZyb21Db21tYW5kIH0gZnJvbSAnLi4vYXJncy9sb2ctZm9ybWF0JztcbmltcG9ydCB7XG4gICBDT01NSVRfQk9VTkRBUlksXG4gICBjcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlcixcbiAgIFNQTElUVEVSLFxuICAgU1RBUlRfQk9VTkRBUlksXG59IGZyb20gJy4uL3BhcnNlcnMvcGFyc2UtbGlzdC1sb2ctc3VtbWFyeSc7XG5pbXBvcnQge1xuICAgYXBwZW5kVGFza09wdGlvbnMsXG4gICBmaWx0ZXJBcnJheSxcbiAgIGZpbHRlclByaW1pdGl2ZXMsXG4gICBmaWx0ZXJTdHJpbmcsXG4gICBmaWx0ZXJUeXBlLFxuICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50LFxuICAgdHJhaWxpbmdPcHRpb25zQXJndW1lbnQsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFNpbXBsZUdpdEFwaSB9IGZyb20gJy4uL3NpbXBsZS1naXQtYXBpJztcbmltcG9ydCB7IGNvbmZpZ3VyYXRpb25FcnJvclRhc2sgfSBmcm9tICcuL3Rhc2snO1xuaW1wb3J0IHsgdmFsaWRhdGVMb2dGb3JtYXRDb25maWcgfSBmcm9tICcuL2RpZmYnO1xuXG5lbnVtIGV4Y2x1ZGVPcHRpb25zIHtcbiAgICctLXByZXR0eScsXG4gICAnbWF4LWNvdW50JyxcbiAgICdtYXhDb3VudCcsXG4gICAnbicsXG4gICAnZmlsZScsXG4gICAnZm9ybWF0JyxcbiAgICdmcm9tJyxcbiAgICd0bycsXG4gICAnc3BsaXR0ZXInLFxuICAgJ3N5bW1ldHJpYycsXG4gICAnbWFpbE1hcCcsXG4gICAnbXVsdGlMaW5lJyxcbiAgICdzdHJpY3REYXRlJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0TG9nRmllbGRzIHtcbiAgIGhhc2g6IHN0cmluZztcbiAgIGRhdGU6IHN0cmluZztcbiAgIG1lc3NhZ2U6IHN0cmluZztcbiAgIHJlZnM6IHN0cmluZztcbiAgIGJvZHk6IHN0cmluZztcbiAgIGF1dGhvcl9uYW1lOiBzdHJpbmc7XG4gICBhdXRob3JfZW1haWw6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTG9nT3B0aW9uczxUID0gRGVmYXVsdExvZ0ZpZWxkcz4gPSB7XG4gICBmaWxlPzogc3RyaW5nO1xuICAgZm9ybWF0PzogVDtcbiAgIGZyb20/OiBzdHJpbmc7XG4gICBtYWlsTWFwPzogYm9vbGVhbjtcbiAgIG1heENvdW50PzogbnVtYmVyO1xuICAgbXVsdGlMaW5lPzogYm9vbGVhbjtcbiAgIHNwbGl0dGVyPzogc3RyaW5nO1xuICAgc3RyaWN0RGF0ZT86IGJvb2xlYW47XG4gICBzeW1tZXRyaWM/OiBib29sZWFuO1xuICAgdG8/OiBzdHJpbmc7XG59O1xuXG5pbnRlcmZhY2UgUGFyc2VkTG9nT3B0aW9ucyB7XG4gICBmaWVsZHM6IHN0cmluZ1tdO1xuICAgc3BsaXR0ZXI6IHN0cmluZztcbiAgIGNvbW1hbmRzOiBzdHJpbmdbXTtcbn1cblxuZnVuY3Rpb24gcHJldHR5Rm9ybWF0KFxuICAgZm9ybWF0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmtub3duPixcbiAgIHNwbGl0dGVyOiBzdHJpbmdcbik6IFtzdHJpbmdbXSwgc3RyaW5nXSB7XG4gICBjb25zdCBmaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICBjb25zdCBmb3JtYXRTdHI6IHN0cmluZ1tdID0gW107XG5cbiAgIE9iamVjdC5rZXlzKGZvcm1hdCkuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgIGZvcm1hdFN0ci5wdXNoKFN0cmluZyhmb3JtYXRbZmllbGRdKSk7XG4gICB9KTtcblxuICAgcmV0dXJuIFtmaWVsZHMsIGZvcm1hdFN0ci5qb2luKHNwbGl0dGVyKV07XG59XG5cbmZ1bmN0aW9uIHVzZXJPcHRpb25zPFQgZXh0ZW5kcyBPcHRpb25zPihpbnB1dDogVCk6IE9wdGlvbnMge1xuICAgcmV0dXJuIE9iamVjdC5rZXlzKGlucHV0KS5yZWR1Y2UoKG91dCwga2V5KSA9PiB7XG4gICAgICBpZiAoIShrZXkgaW4gZXhjbHVkZU9wdGlvbnMpKSB7XG4gICAgICAgICBvdXRba2V5XSA9IGlucHV0W2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgfSwge30gYXMgT3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxvZ09wdGlvbnM8VCBleHRlbmRzIE9wdGlvbnM+KFxuICAgb3B0OiBPcHRpb25zIHwgTG9nT3B0aW9uczxUPiA9IHt9LFxuICAgY3VzdG9tQXJnczogc3RyaW5nW10gPSBbXVxuKTogUGFyc2VkTG9nT3B0aW9ucyB7XG4gICBjb25zdCBzcGxpdHRlciA9IGZpbHRlclR5cGUob3B0LnNwbGl0dGVyLCBmaWx0ZXJTdHJpbmcsIFNQTElUVEVSKTtcbiAgIGNvbnN0IGZvcm1hdCA9XG4gICAgICAhZmlsdGVyUHJpbWl0aXZlcyhvcHQuZm9ybWF0KSAmJiBvcHQuZm9ybWF0XG4gICAgICAgICA/IG9wdC5mb3JtYXRcbiAgICAgICAgIDoge1xuICAgICAgICAgICAgICBoYXNoOiAnJUgnLFxuICAgICAgICAgICAgICBkYXRlOiBvcHQuc3RyaWN0RGF0ZSA9PT0gZmFsc2UgPyAnJWFpJyA6ICclYUknLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnJXMnLFxuICAgICAgICAgICAgICByZWZzOiAnJUQnLFxuICAgICAgICAgICAgICBib2R5OiBvcHQubXVsdGlMaW5lID8gJyVCJyA6ICclYicsXG4gICAgICAgICAgICAgIGF1dGhvcl9uYW1lOiBvcHQubWFpbE1hcCAhPT0gZmFsc2UgPyAnJWFOJyA6ICclYW4nLFxuICAgICAgICAgICAgICBhdXRob3JfZW1haWw6IG9wdC5tYWlsTWFwICE9PSBmYWxzZSA/ICclYUUnIDogJyVhZScsXG4gICAgICAgICAgIH07XG5cbiAgIGNvbnN0IFtmaWVsZHMsIGZvcm1hdFN0cl0gPSBwcmV0dHlGb3JtYXQoZm9ybWF0LCBzcGxpdHRlcik7XG5cbiAgIGNvbnN0IHN1ZmZpeDogc3RyaW5nW10gPSBbXTtcbiAgIGNvbnN0IGNvbW1hbmQ6IHN0cmluZ1tdID0gW1xuICAgICAgYC0tcHJldHR5PWZvcm1hdDoke1NUQVJUX0JPVU5EQVJZfSR7Zm9ybWF0U3RyfSR7Q09NTUlUX0JPVU5EQVJZfWAsXG4gICAgICAuLi5jdXN0b21BcmdzLFxuICAgXTtcblxuICAgY29uc3QgbWF4Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IChvcHQgYXMgYW55KS5uIHx8IChvcHQgYXMgYW55KVsnbWF4LWNvdW50J10gfHwgb3B0Lm1heENvdW50O1xuICAgaWYgKG1heENvdW50KSB7XG4gICAgICBjb21tYW5kLnB1c2goYC0tbWF4LWNvdW50PSR7bWF4Q291bnR9YCk7XG4gICB9XG5cbiAgIGlmIChvcHQuZnJvbSB8fCBvcHQudG8pIHtcbiAgICAgIGNvbnN0IHJhbmdlT3BlcmF0b3IgPSBvcHQuc3ltbWV0cmljICE9PSBmYWxzZSA/ICcuLi4nIDogJy4uJztcbiAgICAgIHN1ZmZpeC5wdXNoKGAke29wdC5mcm9tIHx8ICcnfSR7cmFuZ2VPcGVyYXRvcn0ke29wdC50byB8fCAnJ31gKTtcbiAgIH1cblxuICAgaWYgKGZpbHRlclN0cmluZyhvcHQuZmlsZSkpIHtcbiAgICAgIHN1ZmZpeC5wdXNoKCctLWZvbGxvdycsIG9wdC5maWxlKTtcbiAgIH1cblxuICAgYXBwZW5kVGFza09wdGlvbnModXNlck9wdGlvbnMob3B0IGFzIE9wdGlvbnMpLCBjb21tYW5kKTtcblxuICAgcmV0dXJuIHtcbiAgICAgIGZpZWxkcyxcbiAgICAgIHNwbGl0dGVyLFxuICAgICAgY29tbWFuZHM6IFsuLi5jb21tYW5kLCAuLi5zdWZmaXhdLFxuICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ1Rhc2s8VD4oXG4gICBzcGxpdHRlcjogc3RyaW5nLFxuICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgIGN1c3RvbUFyZ3M6IHN0cmluZ1tdXG4pOiBTdHJpbmdUYXNrPExvZ1Jlc3VsdDxUPj4ge1xuICAgY29uc3QgcGFyc2VyID0gY3JlYXRlTGlzdExvZ1N1bW1hcnlQYXJzZXIoc3BsaXR0ZXIsIGZpZWxkcywgbG9nRm9ybWF0RnJvbUNvbW1hbmQoY3VzdG9tQXJncykpO1xuXG4gICByZXR1cm4ge1xuICAgICAgY29tbWFuZHM6IFsnbG9nJywgLi4uY3VzdG9tQXJnc10sXG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBwYXJzZXIsXG4gICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKTogUGljazxTaW1wbGVHaXQsICdsb2cnPiB7XG4gICByZXR1cm4ge1xuICAgICAgbG9nPFQgZXh0ZW5kcyBPcHRpb25zPih0aGlzOiBTaW1wbGVHaXRBcGksIC4uLnJlc3Q6IHVua25vd25bXSkge1xuICAgICAgICAgY29uc3QgbmV4dCA9IHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpO1xuICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlTG9nT3B0aW9uczxUPihcbiAgICAgICAgICAgIHRyYWlsaW5nT3B0aW9uc0FyZ3VtZW50KGFyZ3VtZW50cyksXG4gICAgICAgICAgICBmaWx0ZXJUeXBlKGFyZ3VtZW50c1swXSwgZmlsdGVyQXJyYXkpXG4gICAgICAgICApO1xuICAgICAgICAgY29uc3QgdGFzayA9XG4gICAgICAgICAgICByZWplY3REZXByZWNhdGVkU2lnbmF0dXJlcyguLi5yZXN0KSB8fFxuICAgICAgICAgICAgdmFsaWRhdGVMb2dGb3JtYXRDb25maWcob3B0aW9ucy5jb21tYW5kcykgfHxcbiAgICAgICAgICAgIGNyZWF0ZUxvZ1Rhc2sob3B0aW9ucyk7XG5cbiAgICAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHRhc2ssIG5leHQpO1xuICAgICAgfSxcbiAgIH07XG5cbiAgIGZ1bmN0aW9uIGNyZWF0ZUxvZ1Rhc2sob3B0aW9uczogUGFyc2VkTG9nT3B0aW9ucykge1xuICAgICAgcmV0dXJuIGxvZ1Rhc2sob3B0aW9ucy5zcGxpdHRlciwgb3B0aW9ucy5maWVsZHMsIG9wdGlvbnMuY29tbWFuZHMpO1xuICAgfVxuXG4gICBmdW5jdGlvbiByZWplY3REZXByZWNhdGVkU2lnbmF0dXJlcyhmcm9tPzogdW5rbm93biwgdG8/OiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAgZmlsdGVyU3RyaW5nKGZyb20pICYmXG4gICAgICAgICBmaWx0ZXJTdHJpbmcodG8pICYmXG4gICAgICAgICBjb25maWd1cmF0aW9uRXJyb3JUYXNrKFxuICAgICAgICAgICAgYGdpdC5sb2coc3RyaW5nLCBzdHJpbmcpIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGdpdC5sb2coeyBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcgfSlgXG4gICAgICAgICApXG4gICAgICApO1xuICAgfVxufVxuIiwgImltcG9ydCB7XG4gICBNZXJnZUNvbmZsaWN0LFxuICAgTWVyZ2VDb25mbGljdERlbGV0aW9uLFxuICAgTWVyZ2VEZXRhaWwsXG4gICBNZXJnZVJlc3VsdFN0YXR1cyxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5cbmV4cG9ydCBjbGFzcyBNZXJnZVN1bW1hcnlDb25mbGljdCBpbXBsZW1lbnRzIE1lcmdlQ29uZmxpY3Qge1xuICAgY29uc3RydWN0b3IoXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVhc29uOiBzdHJpbmcsXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZmlsZTogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YT86IE1lcmdlQ29uZmxpY3REZWxldGlvblxuICAgKSB7fVxuXG4gICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmZpbGV9OiR7dGhpcy5yZWFzb259YDtcbiAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lcmdlU3VtbWFyeURldGFpbCBpbXBsZW1lbnRzIE1lcmdlRGV0YWlsIHtcbiAgIHB1YmxpYyBjb25mbGljdHM6IE1lcmdlQ29uZmxpY3RbXSA9IFtdO1xuICAgcHVibGljIG1lcmdlczogc3RyaW5nW10gPSBbXTtcbiAgIHB1YmxpYyByZXN1bHQ6IE1lcmdlUmVzdWx0U3RhdHVzID0gJ3N1Y2Nlc3MnO1xuXG4gICBnZXQgZmFpbGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmxpY3RzLmxlbmd0aCA+IDA7XG4gICB9XG5cbiAgIGdldCByZWFzb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gICB9XG5cbiAgIHRvU3RyaW5nKCkge1xuICAgICAgaWYgKHRoaXMuY29uZmxpY3RzLmxlbmd0aCkge1xuICAgICAgICAgcmV0dXJuIGBDT05GTElDVFM6ICR7dGhpcy5jb25mbGljdHMuam9pbignLCAnKX1gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ09LJztcbiAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgUHVsbERldGFpbEZpbGVDaGFuZ2VzLFxuICAgUHVsbERldGFpbFN1bW1hcnksXG4gICBQdWxsRmFpbGVkUmVzdWx0LFxuICAgUHVsbFJlc3VsdCxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5cbmV4cG9ydCBjbGFzcyBQdWxsU3VtbWFyeSBpbXBsZW1lbnRzIFB1bGxSZXN1bHQge1xuICAgcHVibGljIHJlbW90ZU1lc3NhZ2VzID0ge1xuICAgICAgYWxsOiBbXSxcbiAgIH07XG4gICBwdWJsaWMgY3JlYXRlZCA9IFtdO1xuICAgcHVibGljIGRlbGV0ZWQ6IHN0cmluZ1tdID0gW107XG4gICBwdWJsaWMgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICBwdWJsaWMgZGVsZXRpb25zOiBQdWxsRGV0YWlsRmlsZUNoYW5nZXMgPSB7fTtcbiAgIHB1YmxpYyBpbnNlcnRpb25zOiBQdWxsRGV0YWlsRmlsZUNoYW5nZXMgPSB7fTtcbiAgIHB1YmxpYyBzdW1tYXJ5OiBQdWxsRGV0YWlsU3VtbWFyeSA9IHtcbiAgICAgIGNoYW5nZXM6IDAsXG4gICAgICBkZWxldGlvbnM6IDAsXG4gICAgICBpbnNlcnRpb25zOiAwLFxuICAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFB1bGxGYWlsZWRTdW1tYXJ5IGltcGxlbWVudHMgUHVsbEZhaWxlZFJlc3VsdCB7XG4gICByZW1vdGUgPSAnJztcbiAgIGhhc2ggPSB7XG4gICAgICBsb2NhbDogJycsXG4gICAgICByZW1vdGU6ICcnLFxuICAgfTtcbiAgIGJyYW5jaCA9IHtcbiAgICAgIGxvY2FsOiAnJyxcbiAgICAgIHJlbW90ZTogJycsXG4gICB9O1xuICAgbWVzc2FnZSA9ICcnO1xuXG4gICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgIFJlbW90ZU1lc3NhZ2VSZXN1bHQsXG4gICBSZW1vdGVNZXNzYWdlcyxcbiAgIFJlbW90ZU1lc3NhZ2VzT2JqZWN0RW51bWVyYXRpb24sXG59IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHsgYXNOdW1iZXIsIFJlbW90ZUxpbmVQYXJzZXIgfSBmcm9tICcuLi91dGlscyc7XG5cbmZ1bmN0aW9uIG9iamVjdEVudW1lcmF0aW9uUmVzdWx0PFQgZXh0ZW5kcyBSZW1vdGVNZXNzYWdlcyA9IFJlbW90ZU1lc3NhZ2VzPihcbiAgIHJlbW90ZU1lc3NhZ2VzOiBUXG4pOiBSZW1vdGVNZXNzYWdlc09iamVjdEVudW1lcmF0aW9uIHtcbiAgIHJldHVybiAocmVtb3RlTWVzc2FnZXMub2JqZWN0cyA9IHJlbW90ZU1lc3NhZ2VzLm9iamVjdHMgfHwge1xuICAgICAgY29tcHJlc3Npbmc6IDAsXG4gICAgICBjb3VudGluZzogMCxcbiAgICAgIGVudW1lcmF0aW5nOiAwLFxuICAgICAgcGFja1JldXNlZDogMCxcbiAgICAgIHJldXNlZDogeyBjb3VudDogMCwgZGVsdGE6IDAgfSxcbiAgICAgIHRvdGFsOiB7IGNvdW50OiAwLCBkZWx0YTogMCB9LFxuICAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzT2JqZWN0Q291bnQoc291cmNlOiBzdHJpbmcpIHtcbiAgIGNvbnN0IGNvdW50ID0gL15cXHMqKFxcZCspLy5leGVjKHNvdXJjZSk7XG4gICBjb25zdCBkZWx0YSA9IC9kZWx0YSAoXFxkKykvaS5leGVjKHNvdXJjZSk7XG5cbiAgIHJldHVybiB7XG4gICAgICBjb3VudDogYXNOdW1iZXIoKGNvdW50ICYmIGNvdW50WzFdKSB8fCAnMCcpLFxuICAgICAgZGVsdGE6IGFzTnVtYmVyKChkZWx0YSAmJiBkZWx0YVsxXSkgfHwgJzAnKSxcbiAgIH07XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdGVNZXNzYWdlc09iamVjdFBhcnNlcnM6IFJlbW90ZUxpbmVQYXJzZXI8UmVtb3RlTWVzc2FnZVJlc3VsdDxSZW1vdGVNZXNzYWdlcz4+W10gPVxuICAgW1xuICAgICAgbmV3IFJlbW90ZUxpbmVQYXJzZXIoXG4gICAgICAgICAvXnJlbW90ZTpcXHMqKGVudW1lcmF0aW5nfGNvdW50aW5nfGNvbXByZXNzaW5nKSBvYmplY3RzOiAoXFxkKyksL2ksXG4gICAgICAgICAocmVzdWx0LCBbYWN0aW9uLCBjb3VudF0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGFjdGlvbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgZW51bWVyYXRpb24gPSBvYmplY3RFbnVtZXJhdGlvblJlc3VsdChyZXN1bHQucmVtb3RlTWVzc2FnZXMpO1xuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVudW1lcmF0aW9uLCB7IFtrZXldOiBhc051bWJlcihjb3VudCkgfSk7XG4gICAgICAgICB9XG4gICAgICApLFxuICAgICAgbmV3IFJlbW90ZUxpbmVQYXJzZXIoXG4gICAgICAgICAvXnJlbW90ZTpcXHMqKGVudW1lcmF0aW5nfGNvdW50aW5nfGNvbXByZXNzaW5nKSBvYmplY3RzOiBcXGQrJSBcXChcXGQrXFwvKFxcZCspXFwpLC9pLFxuICAgICAgICAgKHJlc3VsdCwgW2FjdGlvbiwgY291bnRdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhY3Rpb24udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IGVudW1lcmF0aW9uID0gb2JqZWN0RW51bWVyYXRpb25SZXN1bHQocmVzdWx0LnJlbW90ZU1lc3NhZ2VzKTtcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlbnVtZXJhdGlvbiwgeyBba2V5XTogYXNOdW1iZXIoY291bnQpIH0pO1xuICAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIG5ldyBSZW1vdGVMaW5lUGFyc2VyKFxuICAgICAgICAgL3RvdGFsIChbXixdKyksIHJldXNlZCAoW14sXSspLCBwYWNrLXJldXNlZCAoXFxkKykvaSxcbiAgICAgICAgIChyZXN1bHQsIFt0b3RhbCwgcmV1c2VkLCBwYWNrUmV1c2VkXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0cyA9IG9iamVjdEVudW1lcmF0aW9uUmVzdWx0KHJlc3VsdC5yZW1vdGVNZXNzYWdlcyk7XG4gICAgICAgICAgICBvYmplY3RzLnRvdGFsID0gYXNPYmplY3RDb3VudCh0b3RhbCk7XG4gICAgICAgICAgICBvYmplY3RzLnJldXNlZCA9IGFzT2JqZWN0Q291bnQocmV1c2VkKTtcbiAgICAgICAgICAgIG9iamVjdHMucGFja1JldXNlZCA9IGFzTnVtYmVyKHBhY2tSZXVzZWQpO1xuICAgICAgICAgfVxuICAgICAgKSxcbiAgIF07XG4iLCAiaW1wb3J0IHsgUHVzaFJlc3VsdFJlbW90ZU1lc3NhZ2VzLCBSZW1vdGVNZXNzYWdlUmVzdWx0LCBSZW1vdGVNZXNzYWdlcyB9IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHsgYXNOdW1iZXIsIHBhcnNlU3RyaW5nUmVzcG9uc2UsIFJlbW90ZUxpbmVQYXJzZXIgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyByZW1vdGVNZXNzYWdlc09iamVjdFBhcnNlcnMgfSBmcm9tICcuL3BhcnNlLXJlbW90ZS1vYmplY3RzJztcblxuY29uc3QgcGFyc2VyczogUmVtb3RlTGluZVBhcnNlcjxSZW1vdGVNZXNzYWdlUmVzdWx0PFB1c2hSZXN1bHRSZW1vdGVNZXNzYWdlcyB8IFJlbW90ZU1lc3NhZ2VzPj5bXSA9XG4gICBbXG4gICAgICBuZXcgUmVtb3RlTGluZVBhcnNlcigvXnJlbW90ZTpcXHMqKC4rKSQvLCAocmVzdWx0LCBbdGV4dF0pID0+IHtcbiAgICAgICAgIHJlc3VsdC5yZW1vdGVNZXNzYWdlcy5hbGwucHVzaCh0ZXh0LnRyaW0oKSk7XG4gICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KSxcbiAgICAgIC4uLnJlbW90ZU1lc3NhZ2VzT2JqZWN0UGFyc2VycyxcbiAgICAgIG5ldyBSZW1vdGVMaW5lUGFyc2VyKFxuICAgICAgICAgWy9jcmVhdGUgYSAoPzpwdWxsfG1lcmdlKSByZXF1ZXN0L2ksIC9cXHMoaHR0cHM/OlxcL1xcL1xcUyspJC9dLFxuICAgICAgICAgKHJlc3VsdCwgW3B1bGxSZXF1ZXN0VXJsXSkgPT4ge1xuICAgICAgICAgICAgKHJlc3VsdC5yZW1vdGVNZXNzYWdlcyBhcyBQdXNoUmVzdWx0UmVtb3RlTWVzc2FnZXMpLnB1bGxSZXF1ZXN0VXJsID0gcHVsbFJlcXVlc3RVcmw7XG4gICAgICAgICB9XG4gICAgICApLFxuICAgICAgbmV3IFJlbW90ZUxpbmVQYXJzZXIoXG4gICAgICAgICBbL2ZvdW5kIChcXGQrKSB2dWxuZXJhYmlsaXRpZXMuK1xcKChbXildKylcXCkvaSwgL1xccyhodHRwcz86XFwvXFwvXFxTKykkL10sXG4gICAgICAgICAocmVzdWx0LCBbY291bnQsIHN1bW1hcnksIHVybF0pID0+IHtcbiAgICAgICAgICAgIChyZXN1bHQucmVtb3RlTWVzc2FnZXMgYXMgUHVzaFJlc3VsdFJlbW90ZU1lc3NhZ2VzKS52dWxuZXJhYmlsaXRpZXMgPSB7XG4gICAgICAgICAgICAgICBjb3VudDogYXNOdW1iZXIoY291bnQpLFxuICAgICAgICAgICAgICAgc3VtbWFyeSxcbiAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICB9XG4gICAgICApLFxuICAgXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVtb3RlTWVzc2FnZXM8VCBleHRlbmRzIFJlbW90ZU1lc3NhZ2VzID0gUmVtb3RlTWVzc2FnZXM+KFxuICAgX3N0ZE91dDogc3RyaW5nLFxuICAgc3RkRXJyOiBzdHJpbmdcbik6IFJlbW90ZU1lc3NhZ2VSZXN1bHQge1xuICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVzcG9uc2UoeyByZW1vdGVNZXNzYWdlczogbmV3IFJlbW90ZU1lc3NhZ2VTdW1tYXJ5KCkgYXMgVCB9LCBwYXJzZXJzLCBzdGRFcnIpO1xufVxuXG5leHBvcnQgY2xhc3MgUmVtb3RlTWVzc2FnZVN1bW1hcnkgaW1wbGVtZW50cyBSZW1vdGVNZXNzYWdlcyB7XG4gICBwdWJsaWMgcmVhZG9ubHkgYWxsOiBzdHJpbmdbXSA9IFtdO1xufVxuIiwgImltcG9ydCB7IFB1bGxEZXRhaWwsIFB1bGxGYWlsZWRSZXN1bHQsIFB1bGxSZXN1bHQsIFJlbW90ZU1lc3NhZ2VzIH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBQdWxsRmFpbGVkU3VtbWFyeSwgUHVsbFN1bW1hcnkgfSBmcm9tICcuLi9yZXNwb25zZXMvUHVsbFN1bW1hcnknO1xuaW1wb3J0IHsgVGFza1BhcnNlciB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGFwcGVuZCwgTGluZVBhcnNlciwgcGFyc2VTdHJpbmdSZXNwb25zZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IHBhcnNlUmVtb3RlTWVzc2FnZXMgfSBmcm9tICcuL3BhcnNlLXJlbW90ZS1tZXNzYWdlcyc7XG5cbmNvbnN0IEZJTEVfVVBEQVRFX1JFR0VYID0gL15cXHMqKC4rPylcXHMrXFx8XFxzK1xcZCtcXHMqKFxcKyopKC0qKS87XG5jb25zdCBTVU1NQVJZX1JFR0VYID0gLyhcXGQrKVxcRCsoKFxcZCspXFxEK1xcKFxcK1xcKSk/KFxcRCsoXFxkKylcXEQrXFwoLVxcKSk/LztcbmNvbnN0IEFDVElPTl9SRUdFWCA9IC9eKGNyZWF0ZXxkZWxldGUpIG1vZGUgXFxkKyAoLispLztcblxuY29uc3QgcGFyc2VyczogTGluZVBhcnNlcjxQdWxsUmVzdWx0PltdID0gW1xuICAgbmV3IExpbmVQYXJzZXIoRklMRV9VUERBVEVfUkVHRVgsIChyZXN1bHQsIFtmaWxlLCBpbnNlcnRpb25zLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICByZXN1bHQuZmlsZXMucHVzaChmaWxlKTtcblxuICAgICAgaWYgKGluc2VydGlvbnMpIHtcbiAgICAgICAgIHJlc3VsdC5pbnNlcnRpb25zW2ZpbGVdID0gaW5zZXJ0aW9ucy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWxldGlvbnMpIHtcbiAgICAgICAgIHJlc3VsdC5kZWxldGlvbnNbZmlsZV0gPSBkZWxldGlvbnMubGVuZ3RoO1xuICAgICAgfVxuICAgfSksXG4gICBuZXcgTGluZVBhcnNlcihTVU1NQVJZX1JFR0VYLCAocmVzdWx0LCBbY2hhbmdlcywgLCBpbnNlcnRpb25zLCAsIGRlbGV0aW9uc10pID0+IHtcbiAgICAgIGlmIChpbnNlcnRpb25zICE9PSB1bmRlZmluZWQgfHwgZGVsZXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHJlc3VsdC5zdW1tYXJ5LmNoYW5nZXMgPSArY2hhbmdlcyB8fCAwO1xuICAgICAgICAgcmVzdWx0LnN1bW1hcnkuaW5zZXJ0aW9ucyA9ICtpbnNlcnRpb25zIHx8IDA7XG4gICAgICAgICByZXN1bHQuc3VtbWFyeS5kZWxldGlvbnMgPSArZGVsZXRpb25zIHx8IDA7XG4gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgIH0pLFxuICAgbmV3IExpbmVQYXJzZXIoQUNUSU9OX1JFR0VYLCAocmVzdWx0LCBbYWN0aW9uLCBmaWxlXSkgPT4ge1xuICAgICAgYXBwZW5kKHJlc3VsdC5maWxlcywgZmlsZSk7XG4gICAgICBhcHBlbmQoYWN0aW9uID09PSAnY3JlYXRlJyA/IHJlc3VsdC5jcmVhdGVkIDogcmVzdWx0LmRlbGV0ZWQsIGZpbGUpO1xuICAgfSksXG5dO1xuXG5jb25zdCBlcnJvclBhcnNlcnM6IExpbmVQYXJzZXI8UHVsbEZhaWxlZFJlc3VsdD5bXSA9IFtcbiAgIG5ldyBMaW5lUGFyc2VyKC9eZnJvbVxccyguKykkL2ksIChyZXN1bHQsIFtyZW1vdGVdKSA9PiB2b2lkIChyZXN1bHQucmVtb3RlID0gcmVtb3RlKSksXG4gICBuZXcgTGluZVBhcnNlcigvXmZhdGFsOlxccyguKykkLywgKHJlc3VsdCwgW21lc3NhZ2VdKSA9PiB2b2lkIChyZXN1bHQubWVzc2FnZSA9IG1lc3NhZ2UpKSxcbiAgIG5ldyBMaW5lUGFyc2VyKFxuICAgICAgLyhbYS16MC05XSspXFwuXFwuKFthLXowLTldKylcXHMrKFxcUyspXFxzKy0+XFxzKyhcXFMrKSQvLFxuICAgICAgKHJlc3VsdCwgW2hhc2hMb2NhbCwgaGFzaFJlbW90ZSwgYnJhbmNoTG9jYWwsIGJyYW5jaFJlbW90ZV0pID0+IHtcbiAgICAgICAgIHJlc3VsdC5icmFuY2gubG9jYWwgPSBicmFuY2hMb2NhbDtcbiAgICAgICAgIHJlc3VsdC5oYXNoLmxvY2FsID0gaGFzaExvY2FsO1xuICAgICAgICAgcmVzdWx0LmJyYW5jaC5yZW1vdGUgPSBicmFuY2hSZW1vdGU7XG4gICAgICAgICByZXN1bHQuaGFzaC5yZW1vdGUgPSBoYXNoUmVtb3RlO1xuICAgICAgfVxuICAgKSxcbl07XG5cbmV4cG9ydCBjb25zdCBwYXJzZVB1bGxEZXRhaWw6IFRhc2tQYXJzZXI8c3RyaW5nLCBQdWxsRGV0YWlsPiA9IChzdGRPdXQsIHN0ZEVycikgPT4ge1xuICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVzcG9uc2UobmV3IFB1bGxTdW1tYXJ5KCksIHBhcnNlcnMsIFtzdGRPdXQsIHN0ZEVycl0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlUHVsbFJlc3VsdDogVGFza1BhcnNlcjxzdHJpbmcsIFB1bGxSZXN1bHQ+ID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAgIG5ldyBQdWxsU3VtbWFyeSgpLFxuICAgICAgcGFyc2VQdWxsRGV0YWlsKHN0ZE91dCwgc3RkRXJyKSxcbiAgICAgIHBhcnNlUmVtb3RlTWVzc2FnZXM8UmVtb3RlTWVzc2FnZXM+KHN0ZE91dCwgc3RkRXJyKVxuICAgKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVB1bGxFcnJvclJlc3VsdChzdGRPdXQ6IHN0cmluZywgc3RkRXJyOiBzdHJpbmcpIHtcbiAgIGNvbnN0IHB1bGxFcnJvciA9IHBhcnNlU3RyaW5nUmVzcG9uc2UobmV3IFB1bGxGYWlsZWRTdW1tYXJ5KCksIGVycm9yUGFyc2VycywgW3N0ZE91dCwgc3RkRXJyXSk7XG5cbiAgIHJldHVybiBwdWxsRXJyb3IubWVzc2FnZSAmJiBwdWxsRXJyb3I7XG59XG4iLCAiaW1wb3J0IHsgTWVyZ2VEZXRhaWwsIE1lcmdlUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBNZXJnZVN1bW1hcnlDb25mbGljdCwgTWVyZ2VTdW1tYXJ5RGV0YWlsIH0gZnJvbSAnLi4vcmVzcG9uc2VzL01lcmdlU3VtbWFyeSc7XG5pbXBvcnQgeyBUYXNrUGFyc2VyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgTGluZVBhcnNlciwgcGFyc2VTdHJpbmdSZXNwb25zZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IHBhcnNlUHVsbFJlc3VsdCB9IGZyb20gJy4vcGFyc2UtcHVsbCc7XG5cbmNvbnN0IHBhcnNlcnM6IExpbmVQYXJzZXI8TWVyZ2VEZXRhaWw+W10gPSBbXG4gICBuZXcgTGluZVBhcnNlcigvXkF1dG8tbWVyZ2luZ1xccysoLispJC8sIChzdW1tYXJ5LCBbYXV0b01lcmdlXSkgPT4ge1xuICAgICAgc3VtbWFyeS5tZXJnZXMucHVzaChhdXRvTWVyZ2UpO1xuICAgfSksXG4gICBuZXcgTGluZVBhcnNlcigvXkNPTkZMSUNUXFxzK1xcKCguKylcXCk6IE1lcmdlIGNvbmZsaWN0IGluICguKykkLywgKHN1bW1hcnksIFtyZWFzb24sIGZpbGVdKSA9PiB7XG4gICAgICBzdW1tYXJ5LmNvbmZsaWN0cy5wdXNoKG5ldyBNZXJnZVN1bW1hcnlDb25mbGljdChyZWFzb24sIGZpbGUpKTtcbiAgIH0pLFxuICAgbmV3IExpbmVQYXJzZXIoXG4gICAgICAvXkNPTkZMSUNUXFxzK1xcKCguK1xcL2RlbGV0ZSlcXCk6ICguKykgZGVsZXRlZCBpbiAoLispIGFuZC8sXG4gICAgICAoc3VtbWFyeSwgW3JlYXNvbiwgZmlsZSwgZGVsZXRlUmVmXSkgPT4ge1xuICAgICAgICAgc3VtbWFyeS5jb25mbGljdHMucHVzaChuZXcgTWVyZ2VTdW1tYXJ5Q29uZmxpY3QocmVhc29uLCBmaWxlLCB7IGRlbGV0ZVJlZiB9KSk7XG4gICAgICB9XG4gICApLFxuICAgbmV3IExpbmVQYXJzZXIoL15DT05GTElDVFxccytcXCgoLispXFwpOi8sIChzdW1tYXJ5LCBbcmVhc29uXSkgPT4ge1xuICAgICAgc3VtbWFyeS5jb25mbGljdHMucHVzaChuZXcgTWVyZ2VTdW1tYXJ5Q29uZmxpY3QocmVhc29uLCBudWxsKSk7XG4gICB9KSxcbiAgIG5ldyBMaW5lUGFyc2VyKC9eQXV0b21hdGljIG1lcmdlIGZhaWxlZDtcXHMrKC4rKSQvLCAoc3VtbWFyeSwgW3Jlc3VsdF0pID0+IHtcbiAgICAgIHN1bW1hcnkucmVzdWx0ID0gcmVzdWx0O1xuICAgfSksXG5dO1xuXG4vKipcbiAqIFBhcnNlIHRoZSBjb21wbGV0ZSByZXNwb25zZSBmcm9tIGBnaXQubWVyZ2VgXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZU1lcmdlUmVzdWx0OiBUYXNrUGFyc2VyPHN0cmluZywgTWVyZ2VSZXN1bHQ+ID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICByZXR1cm4gT2JqZWN0LmFzc2lnbihwYXJzZU1lcmdlRGV0YWlsKHN0ZE91dCwgc3RkRXJyKSwgcGFyc2VQdWxsUmVzdWx0KHN0ZE91dCwgc3RkRXJyKSk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtZXJnZSBzcGVjaWZpYyBkZXRhaWwgKGllOiBub3QgdGhlIGNvbnRlbnQgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHB1bGwgZGV0YWlsKSBmcm9tIGBnaXQubW5lcmdlYFxuICogQHBhcmFtIHN0ZE91dFxuICovXG5leHBvcnQgY29uc3QgcGFyc2VNZXJnZURldGFpbDogVGFza1BhcnNlcjxzdHJpbmcsIE1lcmdlRGV0YWlsPiA9IChzdGRPdXQpID0+IHtcbiAgIHJldHVybiBwYXJzZVN0cmluZ1Jlc3BvbnNlKG5ldyBNZXJnZVN1bW1hcnlEZXRhaWwoKSwgcGFyc2Vycywgc3RkT3V0KTtcbn07XG4iLCAiaW1wb3J0IHsgTWVyZ2VSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcbmltcG9ydCB7IEdpdFJlc3BvbnNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvZ2l0LXJlc3BvbnNlLWVycm9yJztcbmltcG9ydCB7IHBhcnNlTWVyZ2VSZXN1bHQgfSBmcm9tICcuLi9wYXJzZXJzL3BhcnNlLW1lcmdlJztcbmltcG9ydCB7IFN0cmluZ1Rhc2sgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBjb25maWd1cmF0aW9uRXJyb3JUYXNrLCBFbXB0eVRhc2sgfSBmcm9tICcuL3Rhc2snO1xuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUYXNrKGN1c3RvbUFyZ3M6IHN0cmluZ1tdKTogRW1wdHlUYXNrIHwgU3RyaW5nVGFzazxNZXJnZVJlc3VsdD4ge1xuICAgaWYgKCFjdXN0b21BcmdzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25FcnJvclRhc2soJ0dpdC5tZXJnZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgb3B0aW9uJyk7XG4gICB9XG5cbiAgIHJldHVybiB7XG4gICAgICBjb21tYW5kczogWydtZXJnZScsIC4uLmN1c3RvbUFyZ3NdLFxuICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgcGFyc2VyKHN0ZE91dCwgc3RkRXJyKTogTWVyZ2VSZXN1bHQge1xuICAgICAgICAgY29uc3QgbWVyZ2UgPSBwYXJzZU1lcmdlUmVzdWx0KHN0ZE91dCwgc3RkRXJyKTtcbiAgICAgICAgIGlmIChtZXJnZS5mYWlsZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBHaXRSZXNwb25zZUVycm9yKG1lcmdlKTtcbiAgICAgICAgIH1cblxuICAgICAgICAgcmV0dXJuIG1lcmdlO1xuICAgICAgfSxcbiAgIH07XG59XG4iLCAiaW1wb3J0IHtcbiAgIFB1c2hEZXRhaWwsXG4gICBQdXNoUmVzdWx0LFxuICAgUHVzaFJlc3VsdFB1c2hlZEl0ZW0sXG4gICBQdXNoUmVzdWx0UmVtb3RlTWVzc2FnZXMsXG59IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHsgVGFza1BhcnNlciB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IExpbmVQYXJzZXIsIHBhcnNlU3RyaW5nUmVzcG9uc2UgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBwYXJzZVJlbW90ZU1lc3NhZ2VzIH0gZnJvbSAnLi9wYXJzZS1yZW1vdGUtbWVzc2FnZXMnO1xuXG5mdW5jdGlvbiBwdXNoUmVzdWx0UHVzaGVkSXRlbShsb2NhbDogc3RyaW5nLCByZW1vdGU6IHN0cmluZywgc3RhdHVzOiBzdHJpbmcpOiBQdXNoUmVzdWx0UHVzaGVkSXRlbSB7XG4gICBjb25zdCBkZWxldGVkID0gc3RhdHVzLmluY2x1ZGVzKCdkZWxldGVkJyk7XG4gICBjb25zdCB0YWcgPSBzdGF0dXMuaW5jbHVkZXMoJ3RhZycpIHx8IC9ecmVmc1xcL3RhZ3MvLnRlc3QobG9jYWwpO1xuICAgY29uc3QgYWxyZWFkeVVwZGF0ZWQgPSAhc3RhdHVzLmluY2x1ZGVzKCduZXcnKTtcblxuICAgcmV0dXJuIHtcbiAgICAgIGRlbGV0ZWQsXG4gICAgICB0YWcsXG4gICAgICBicmFuY2g6ICF0YWcsXG4gICAgICBuZXc6ICFhbHJlYWR5VXBkYXRlZCxcbiAgICAgIGFscmVhZHlVcGRhdGVkLFxuICAgICAgbG9jYWwsXG4gICAgICByZW1vdGUsXG4gICB9O1xufVxuXG5jb25zdCBwYXJzZXJzOiBMaW5lUGFyc2VyPFB1c2hEZXRhaWw+W10gPSBbXG4gICBuZXcgTGluZVBhcnNlcigvXlB1c2hpbmcgdG8gKC4rKSQvLCAocmVzdWx0LCBbcmVwb10pID0+IHtcbiAgICAgIHJlc3VsdC5yZXBvID0gcmVwbztcbiAgIH0pLFxuICAgbmV3IExpbmVQYXJzZXIoL151cGRhdGluZyBsb2NhbCB0cmFja2luZyByZWYgJyguKyknLywgKHJlc3VsdCwgW2xvY2FsXSkgPT4ge1xuICAgICAgcmVzdWx0LnJlZiA9IHtcbiAgICAgICAgIC4uLihyZXN1bHQucmVmIHx8IHt9KSxcbiAgICAgICAgIGxvY2FsLFxuICAgICAgfTtcbiAgIH0pLFxuICAgbmV3IExpbmVQYXJzZXIoL15bPSotXVxccysoW146XSspOihcXFMrKVxccytcXFsoLispXSQvLCAocmVzdWx0LCBbbG9jYWwsIHJlbW90ZSwgdHlwZV0pID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoZWQucHVzaChwdXNoUmVzdWx0UHVzaGVkSXRlbShsb2NhbCwgcmVtb3RlLCB0eXBlKSk7XG4gICB9KSxcbiAgIG5ldyBMaW5lUGFyc2VyKFxuICAgICAgL15CcmFuY2ggJyhbXiddKyknIHNldCB1cCB0byB0cmFjayByZW1vdGUgYnJhbmNoICcoW14nXSspJyBmcm9tICcoW14nXSspJy8sXG4gICAgICAocmVzdWx0LCBbbG9jYWwsIHJlbW90ZSwgcmVtb3RlTmFtZV0pID0+IHtcbiAgICAgICAgIHJlc3VsdC5icmFuY2ggPSB7XG4gICAgICAgICAgICAuLi4ocmVzdWx0LmJyYW5jaCB8fCB7fSksXG4gICAgICAgICAgICBsb2NhbCxcbiAgICAgICAgICAgIHJlbW90ZSxcbiAgICAgICAgICAgIHJlbW90ZU5hbWUsXG4gICAgICAgICB9O1xuICAgICAgfVxuICAgKSxcbiAgIG5ldyBMaW5lUGFyc2VyKFxuICAgICAgL14oW146XSspOihcXFMrKVxccysoW2EtejAtOV0rKVxcLlxcLihbYS16MC05XSspJC8sXG4gICAgICAocmVzdWx0LCBbbG9jYWwsIHJlbW90ZSwgZnJvbSwgdG9dKSA9PiB7XG4gICAgICAgICByZXN1bHQudXBkYXRlID0ge1xuICAgICAgICAgICAgaGVhZDoge1xuICAgICAgICAgICAgICAgbG9jYWwsXG4gICAgICAgICAgICAgICByZW1vdGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFzaDoge1xuICAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgIH07XG4gICAgICB9XG4gICApLFxuXTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlUHVzaFJlc3VsdDogVGFza1BhcnNlcjxzdHJpbmcsIFB1c2hSZXN1bHQ+ID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICBjb25zdCBwdXNoRGV0YWlsID0gcGFyc2VQdXNoRGV0YWlsKHN0ZE91dCwgc3RkRXJyKTtcbiAgIGNvbnN0IHJlc3BvbnNlRGV0YWlsID0gcGFyc2VSZW1vdGVNZXNzYWdlczxQdXNoUmVzdWx0UmVtb3RlTWVzc2FnZXM+KHN0ZE91dCwgc3RkRXJyKTtcblxuICAgcmV0dXJuIHtcbiAgICAgIC4uLnB1c2hEZXRhaWwsXG4gICAgICAuLi5yZXNwb25zZURldGFpbCxcbiAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VQdXNoRGV0YWlsOiBUYXNrUGFyc2VyPHN0cmluZywgUHVzaERldGFpbD4gPSAoc3RkT3V0LCBzdGRFcnIpID0+IHtcbiAgIHJldHVybiBwYXJzZVN0cmluZ1Jlc3BvbnNlKHsgcHVzaGVkOiBbXSB9LCBwYXJzZXJzLCBbc3RkT3V0LCBzdGRFcnJdKTtcbn07XG4iLCAiaW1wb3J0IHsgUHVzaFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHsgcGFyc2VQdXNoUmVzdWx0IGFzIHBhcnNlciB9IGZyb20gJy4uL3BhcnNlcnMvcGFyc2UtcHVzaCc7XG5pbXBvcnQgeyBTdHJpbmdUYXNrIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgYXBwZW5kLCByZW1vdmUgfSBmcm9tICcuLi91dGlscyc7XG5cbnR5cGUgUHVzaFJlZiA9IHsgcmVtb3RlPzogc3RyaW5nOyBicmFuY2g/OiBzdHJpbmcgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2hUYWdzVGFzayhyZWY6IFB1c2hSZWYgPSB7fSwgY3VzdG9tQXJnczogc3RyaW5nW10pOiBTdHJpbmdUYXNrPFB1c2hSZXN1bHQ+IHtcbiAgIGFwcGVuZChjdXN0b21BcmdzLCAnLS10YWdzJyk7XG4gICByZXR1cm4gcHVzaFRhc2socmVmLCBjdXN0b21BcmdzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2hUYXNrKHJlZjogUHVzaFJlZiA9IHt9LCBjdXN0b21BcmdzOiBzdHJpbmdbXSk6IFN0cmluZ1Rhc2s8UHVzaFJlc3VsdD4ge1xuICAgY29uc3QgY29tbWFuZHMgPSBbJ3B1c2gnLCAuLi5jdXN0b21BcmdzXTtcbiAgIGlmIChyZWYuYnJhbmNoKSB7XG4gICAgICBjb21tYW5kcy5zcGxpY2UoMSwgMCwgcmVmLmJyYW5jaCk7XG4gICB9XG4gICBpZiAocmVmLnJlbW90ZSkge1xuICAgICAgY29tbWFuZHMuc3BsaWNlKDEsIDAsIHJlZi5yZW1vdGUpO1xuICAgfVxuXG4gICByZW1vdmUoY29tbWFuZHMsICctdicpO1xuICAgYXBwZW5kKGNvbW1hbmRzLCAnLS12ZXJib3NlJyk7XG4gICBhcHBlbmQoY29tbWFuZHMsICctLXBvcmNlbGFpbicpO1xuXG4gICByZXR1cm4ge1xuICAgICAgY29tbWFuZHMsXG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBwYXJzZXIsXG4gICB9O1xufVxuIiwgImltcG9ydCB7IEZpbGVTdGF0dXNSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcblxuZXhwb3J0IGNvbnN0IGZyb21QYXRoUmVnZXggPSAvXiguKykgLT4gKC4rKSQvO1xuXG5leHBvcnQgY2xhc3MgRmlsZVN0YXR1c1N1bW1hcnkgaW1wbGVtZW50cyBGaWxlU3RhdHVzUmVzdWx0IHtcbiAgIHB1YmxpYyByZWFkb25seSBmcm9tOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXRoOiBzdHJpbmcsIHB1YmxpYyBpbmRleDogc3RyaW5nLCBwdWJsaWMgd29ya2luZ19kaXI6IHN0cmluZykge1xuICAgICAgaWYgKCdSJyA9PT0gaW5kZXggKyB3b3JraW5nX2Rpcikge1xuICAgICAgICAgY29uc3QgZGV0YWlsID0gZnJvbVBhdGhSZWdleC5leGVjKHBhdGgpIHx8IFtudWxsLCBwYXRoLCBwYXRoXTtcbiAgICAgICAgIHRoaXMuZnJvbSA9IGRldGFpbFsxXSB8fCAnJztcbiAgICAgICAgIHRoaXMucGF0aCA9IGRldGFpbFsyXSB8fCAnJztcbiAgICAgIH1cbiAgIH1cbn1cbiIsICJpbXBvcnQgeyBTdGF0dXNSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcbmltcG9ydCB7IGFwcGVuZCwgTlVMTCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IEZpbGVTdGF0dXNTdW1tYXJ5IH0gZnJvbSAnLi9GaWxlU3RhdHVzU3VtbWFyeSc7XG5cbnR5cGUgU3RhdHVzTGluZVBhcnNlciA9IChyZXN1bHQ6IFN0YXR1c1Jlc3VsdCwgZmlsZTogc3RyaW5nKSA9PiB2b2lkO1xuXG5leHBvcnQgY2xhc3MgU3RhdHVzU3VtbWFyeSBpbXBsZW1lbnRzIFN0YXR1c1Jlc3VsdCB7XG4gICBwdWJsaWMgbm90X2FkZGVkID0gW107XG4gICBwdWJsaWMgY29uZmxpY3RlZCA9IFtdO1xuICAgcHVibGljIGNyZWF0ZWQgPSBbXTtcbiAgIHB1YmxpYyBkZWxldGVkID0gW107XG4gICBwdWJsaWMgaWdub3JlZCA9IHVuZGVmaW5lZDtcbiAgIHB1YmxpYyBtb2RpZmllZCA9IFtdO1xuICAgcHVibGljIHJlbmFtZWQgPSBbXTtcbiAgIHB1YmxpYyBmaWxlcyA9IFtdO1xuICAgcHVibGljIHN0YWdlZCA9IFtdO1xuICAgcHVibGljIGFoZWFkID0gMDtcbiAgIHB1YmxpYyBiZWhpbmQgPSAwO1xuICAgcHVibGljIGN1cnJlbnQgPSBudWxsO1xuICAgcHVibGljIHRyYWNraW5nID0gbnVsbDtcbiAgIHB1YmxpYyBkZXRhY2hlZCA9IGZhbHNlO1xuXG4gICBwdWJsaWMgaXNDbGVhbiA9ICgpID0+IHtcbiAgICAgIHJldHVybiAhdGhpcy5maWxlcy5sZW5ndGg7XG4gICB9O1xufVxuXG5lbnVtIFBvcmNlbGFpbkZpbGVTdGF0dXMge1xuICAgQURERUQgPSAnQScsXG4gICBERUxFVEVEID0gJ0QnLFxuICAgTU9ESUZJRUQgPSAnTScsXG4gICBSRU5BTUVEID0gJ1InLFxuICAgQ09QSUVEID0gJ0MnLFxuICAgVU5NRVJHRUQgPSAnVScsXG4gICBVTlRSQUNLRUQgPSAnPycsXG4gICBJR05PUkVEID0gJyEnLFxuICAgTk9ORSA9ICcgJyxcbn1cblxuZnVuY3Rpb24gcmVuYW1lZEZpbGUobGluZTogc3RyaW5nKSB7XG4gICBjb25zdCBbdG8sIGZyb21dID0gbGluZS5zcGxpdChOVUxMKTtcblxuICAgcmV0dXJuIHtcbiAgICAgIGZyb206IGZyb20gfHwgdG8sXG4gICAgICB0byxcbiAgIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlcihcbiAgIGluZGV4WDogUG9yY2VsYWluRmlsZVN0YXR1cyxcbiAgIGluZGV4WTogUG9yY2VsYWluRmlsZVN0YXR1cyxcbiAgIGhhbmRsZXI6IFN0YXR1c0xpbmVQYXJzZXJcbik6IFtzdHJpbmcsIFN0YXR1c0xpbmVQYXJzZXJdIHtcbiAgIHJldHVybiBbYCR7aW5kZXhYfSR7aW5kZXhZfWAsIGhhbmRsZXJdO1xufVxuXG5mdW5jdGlvbiBjb25mbGljdHMoaW5kZXhYOiBQb3JjZWxhaW5GaWxlU3RhdHVzLCAuLi5pbmRleFk6IFBvcmNlbGFpbkZpbGVTdGF0dXNbXSkge1xuICAgcmV0dXJuIGluZGV4WS5tYXAoKHkpID0+IHBhcnNlcihpbmRleFgsIHksIChyZXN1bHQsIGZpbGUpID0+IGFwcGVuZChyZXN1bHQuY29uZmxpY3RlZCwgZmlsZSkpKTtcbn1cblxuY29uc3QgcGFyc2VyczogTWFwPHN0cmluZywgU3RhdHVzTGluZVBhcnNlcj4gPSBuZXcgTWFwKFtcbiAgIHBhcnNlcihQb3JjZWxhaW5GaWxlU3RhdHVzLk5PTkUsIFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIChyZXN1bHQsIGZpbGUpID0+XG4gICAgICBhcHBlbmQocmVzdWx0LmNyZWF0ZWQsIGZpbGUpXG4gICApLFxuICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSwgUG9yY2VsYWluRmlsZVN0YXR1cy5ERUxFVEVELCAocmVzdWx0LCBmaWxlKSA9PlxuICAgICAgYXBwZW5kKHJlc3VsdC5kZWxldGVkLCBmaWxlKVxuICAgKSxcbiAgIHBhcnNlcihQb3JjZWxhaW5GaWxlU3RhdHVzLk5PTkUsIFBvcmNlbGFpbkZpbGVTdGF0dXMuTU9ESUZJRUQsIChyZXN1bHQsIGZpbGUpID0+XG4gICAgICBhcHBlbmQocmVzdWx0Lm1vZGlmaWVkLCBmaWxlKVxuICAgKSxcblxuICAgcGFyc2VyKFxuICAgICAgUG9yY2VsYWluRmlsZVN0YXR1cy5BRERFRCxcbiAgICAgIFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSxcbiAgICAgIChyZXN1bHQsIGZpbGUpID0+IGFwcGVuZChyZXN1bHQuY3JlYXRlZCwgZmlsZSkgJiYgYXBwZW5kKHJlc3VsdC5zdGFnZWQsIGZpbGUpXG4gICApLFxuICAgcGFyc2VyKFxuICAgICAgUG9yY2VsYWluRmlsZVN0YXR1cy5BRERFRCxcbiAgICAgIFBvcmNlbGFpbkZpbGVTdGF0dXMuTU9ESUZJRUQsXG4gICAgICAocmVzdWx0LCBmaWxlKSA9PlxuICAgICAgICAgYXBwZW5kKHJlc3VsdC5jcmVhdGVkLCBmaWxlKSAmJlxuICAgICAgICAgYXBwZW5kKHJlc3VsdC5zdGFnZWQsIGZpbGUpICYmXG4gICAgICAgICBhcHBlbmQocmVzdWx0Lm1vZGlmaWVkLCBmaWxlKVxuICAgKSxcblxuICAgcGFyc2VyKFxuICAgICAgUG9yY2VsYWluRmlsZVN0YXR1cy5ERUxFVEVELFxuICAgICAgUG9yY2VsYWluRmlsZVN0YXR1cy5OT05FLFxuICAgICAgKHJlc3VsdCwgZmlsZSkgPT4gYXBwZW5kKHJlc3VsdC5kZWxldGVkLCBmaWxlKSAmJiBhcHBlbmQocmVzdWx0LnN0YWdlZCwgZmlsZSlcbiAgICksXG5cbiAgIHBhcnNlcihcbiAgICAgIFBvcmNlbGFpbkZpbGVTdGF0dXMuTU9ESUZJRUQsXG4gICAgICBQb3JjZWxhaW5GaWxlU3RhdHVzLk5PTkUsXG4gICAgICAocmVzdWx0LCBmaWxlKSA9PiBhcHBlbmQocmVzdWx0Lm1vZGlmaWVkLCBmaWxlKSAmJiBhcHBlbmQocmVzdWx0LnN0YWdlZCwgZmlsZSlcbiAgICksXG4gICBwYXJzZXIoXG4gICAgICBQb3JjZWxhaW5GaWxlU3RhdHVzLk1PRElGSUVELFxuICAgICAgUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCxcbiAgICAgIChyZXN1bHQsIGZpbGUpID0+IGFwcGVuZChyZXN1bHQubW9kaWZpZWQsIGZpbGUpICYmIGFwcGVuZChyZXN1bHQuc3RhZ2VkLCBmaWxlKVxuICAgKSxcblxuICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuUkVOQU1FRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5OT05FLCAocmVzdWx0LCBmaWxlKSA9PiB7XG4gICAgICBhcHBlbmQocmVzdWx0LnJlbmFtZWQsIHJlbmFtZWRGaWxlKGZpbGUpKTtcbiAgIH0pLFxuICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuUkVOQU1FRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgKHJlc3VsdCwgZmlsZSkgPT4ge1xuICAgICAgY29uc3QgcmVuYW1lZCA9IHJlbmFtZWRGaWxlKGZpbGUpO1xuICAgICAgYXBwZW5kKHJlc3VsdC5yZW5hbWVkLCByZW5hbWVkKTtcbiAgICAgIGFwcGVuZChyZXN1bHQubW9kaWZpZWQsIHJlbmFtZWQudG8pO1xuICAgfSksXG4gICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5JR05PUkVELCBQb3JjZWxhaW5GaWxlU3RhdHVzLklHTk9SRUQsIChfcmVzdWx0LCBfZmlsZSkgPT4ge1xuICAgICAgYXBwZW5kKChfcmVzdWx0Lmlnbm9yZWQgPSBfcmVzdWx0Lmlnbm9yZWQgfHwgW10pLCBfZmlsZSk7XG4gICB9KSxcblxuICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuVU5UUkFDS0VELCBQb3JjZWxhaW5GaWxlU3RhdHVzLlVOVFJBQ0tFRCwgKHJlc3VsdCwgZmlsZSkgPT5cbiAgICAgIGFwcGVuZChyZXN1bHQubm90X2FkZGVkLCBmaWxlKVxuICAgKSxcblxuICAgLi4uY29uZmxpY3RzKFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuVU5NRVJHRUQpLFxuICAgLi4uY29uZmxpY3RzKFxuICAgICAgUG9yY2VsYWluRmlsZVN0YXR1cy5ERUxFVEVELFxuICAgICAgUG9yY2VsYWluRmlsZVN0YXR1cy5ERUxFVEVELFxuICAgICAgUG9yY2VsYWluRmlsZVN0YXR1cy5VTk1FUkdFRFxuICAgKSxcbiAgIC4uLmNvbmZsaWN0cyhcbiAgICAgIFBvcmNlbGFpbkZpbGVTdGF0dXMuVU5NRVJHRUQsXG4gICAgICBQb3JjZWxhaW5GaWxlU3RhdHVzLkFEREVELFxuICAgICAgUG9yY2VsYWluRmlsZVN0YXR1cy5ERUxFVEVELFxuICAgICAgUG9yY2VsYWluRmlsZVN0YXR1cy5VTk1FUkdFRFxuICAgKSxcblxuICAgW1xuICAgICAgJyMjJyxcbiAgICAgIChyZXN1bHQsIGxpbmUpID0+IHtcbiAgICAgICAgIGNvbnN0IGFoZWFkUmVnID0gL2FoZWFkIChcXGQrKS87XG4gICAgICAgICBjb25zdCBiZWhpbmRSZWcgPSAvYmVoaW5kIChcXGQrKS87XG4gICAgICAgICBjb25zdCBjdXJyZW50UmVnID0gL14oLis/KD89KD86XFwuezN9fFxcc3wkKSkpLztcbiAgICAgICAgIGNvbnN0IHRyYWNraW5nUmVnID0gL1xcLnszfShcXFMqKS87XG4gICAgICAgICBjb25zdCBvbkVtcHR5QnJhbmNoUmVnID0gL1xcc29uXFxzKFtcXFNdKykkLztcbiAgICAgICAgIGxldCByZWdleFJlc3VsdDtcblxuICAgICAgICAgcmVnZXhSZXN1bHQgPSBhaGVhZFJlZy5leGVjKGxpbmUpO1xuICAgICAgICAgcmVzdWx0LmFoZWFkID0gKHJlZ2V4UmVzdWx0ICYmICtyZWdleFJlc3VsdFsxXSkgfHwgMDtcblxuICAgICAgICAgcmVnZXhSZXN1bHQgPSBiZWhpbmRSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgIHJlc3VsdC5iZWhpbmQgPSAocmVnZXhSZXN1bHQgJiYgK3JlZ2V4UmVzdWx0WzFdKSB8fCAwO1xuXG4gICAgICAgICByZWdleFJlc3VsdCA9IGN1cnJlbnRSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgIHJlc3VsdC5jdXJyZW50ID0gcmVnZXhSZXN1bHQgJiYgcmVnZXhSZXN1bHRbMV07XG5cbiAgICAgICAgIHJlZ2V4UmVzdWx0ID0gdHJhY2tpbmdSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgIHJlc3VsdC50cmFja2luZyA9IHJlZ2V4UmVzdWx0ICYmIHJlZ2V4UmVzdWx0WzFdO1xuXG4gICAgICAgICByZWdleFJlc3VsdCA9IG9uRW1wdHlCcmFuY2hSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgIHJlc3VsdC5jdXJyZW50ID0gKHJlZ2V4UmVzdWx0ICYmIHJlZ2V4UmVzdWx0WzFdKSB8fCByZXN1bHQuY3VycmVudDtcblxuICAgICAgICAgcmVzdWx0LmRldGFjaGVkID0gL1xcKG5vIGJyYW5jaFxcKS8udGVzdChsaW5lKTtcbiAgICAgIH0sXG4gICBdLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVN0YXR1c1N1bW1hcnkgPSBmdW5jdGlvbiAodGV4dDogc3RyaW5nKTogU3RhdHVzUmVzdWx0IHtcbiAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdChOVUxMKTtcbiAgIGNvbnN0IHN0YXR1cyA9IG5ldyBTdGF0dXNTdW1tYXJ5KCk7XG5cbiAgIGZvciAobGV0IGkgPSAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgKSB7XG4gICAgICBsZXQgbGluZSA9IGxpbmVzW2krK10udHJpbSgpO1xuXG4gICAgICBpZiAoIWxpbmUpIHtcbiAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09IFBvcmNlbGFpbkZpbGVTdGF0dXMuUkVOQU1FRCkge1xuICAgICAgICAgbGluZSArPSBOVUxMICsgKGxpbmVzW2krK10gfHwgJycpO1xuICAgICAgfVxuXG4gICAgICBzcGxpdExpbmUoc3RhdHVzLCBsaW5lKTtcbiAgIH1cblxuICAgcmV0dXJuIHN0YXR1cztcbn07XG5cbmZ1bmN0aW9uIHNwbGl0TGluZShyZXN1bHQ6IFN0YXR1c1Jlc3VsdCwgbGluZVN0cjogc3RyaW5nKSB7XG4gICBjb25zdCB0cmltbWVkID0gbGluZVN0ci50cmltKCk7XG4gICBzd2l0Y2ggKCcgJykge1xuICAgICAgY2FzZSB0cmltbWVkLmNoYXJBdCgyKTpcbiAgICAgICAgIHJldHVybiBkYXRhKHRyaW1tZWQuY2hhckF0KDApLCB0cmltbWVkLmNoYXJBdCgxKSwgdHJpbW1lZC5zdWJzdHIoMykpO1xuICAgICAgY2FzZSB0cmltbWVkLmNoYXJBdCgxKTpcbiAgICAgICAgIHJldHVybiBkYXRhKFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSwgdHJpbW1lZC5jaGFyQXQoMCksIHRyaW1tZWQuc3Vic3RyKDIpKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgICByZXR1cm47XG4gICB9XG5cbiAgIGZ1bmN0aW9uIGRhdGEoaW5kZXg6IHN0cmluZywgd29ya2luZ0Rpcjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IHJhdyA9IGAke2luZGV4fSR7d29ya2luZ0Rpcn1gO1xuICAgICAgY29uc3QgaGFuZGxlciA9IHBhcnNlcnMuZ2V0KHJhdyk7XG5cbiAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICBoYW5kbGVyKHJlc3VsdCwgcGF0aCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyYXcgIT09ICcjIycgJiYgcmF3ICE9PSAnISEnKSB7XG4gICAgICAgICByZXN1bHQuZmlsZXMucHVzaChuZXcgRmlsZVN0YXR1c1N1bW1hcnkocGF0aC5yZXBsYWNlKC9cXDAuKyQvLCAnJyksIGluZGV4LCB3b3JraW5nRGlyKSk7XG4gICAgICB9XG4gICB9XG59XG4iLCAiaW1wb3J0IHsgU3RhdHVzUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBwYXJzZVN0YXR1c1N1bW1hcnkgfSBmcm9tICcuLi9yZXNwb25zZXMvU3RhdHVzU3VtbWFyeSc7XG5pbXBvcnQgeyBTdHJpbmdUYXNrIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBpZ25vcmVkT3B0aW9ucyA9IFsnLS1udWxsJywgJy16J107XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGF0dXNUYXNrKGN1c3RvbUFyZ3M6IHN0cmluZ1tdKTogU3RyaW5nVGFzazxTdGF0dXNSZXN1bHQ+IHtcbiAgIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgJ3N0YXR1cycsXG4gICAgICAnLS1wb3JjZWxhaW4nLFxuICAgICAgJy1iJyxcbiAgICAgICctdScsXG4gICAgICAnLS1udWxsJyxcbiAgICAgIC4uLmN1c3RvbUFyZ3MuZmlsdGVyKChhcmcpID0+ICFpZ25vcmVkT3B0aW9ucy5pbmNsdWRlcyhhcmcpKSxcbiAgIF07XG5cbiAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBjb21tYW5kcyxcbiAgICAgIHBhcnNlcih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgIHJldHVybiBwYXJzZVN0YXR1c1N1bW1hcnkodGV4dCk7XG4gICAgICB9LFxuICAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNpbXBsZUdpdEFwaSB9IGZyb20gJy4uL3NpbXBsZS1naXQtYXBpJztcbmltcG9ydCB0eXBlIHsgU2ltcGxlR2l0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBhc051bWJlciwgRXhpdENvZGVzLCBMaW5lUGFyc2VyLCBwYXJzZVN0cmluZ1Jlc3BvbnNlIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25SZXN1bHQge1xuICAgbWFqb3I6IG51bWJlcjtcbiAgIG1pbm9yOiBudW1iZXI7XG4gICBwYXRjaDogbnVtYmVyIHwgc3RyaW5nO1xuICAgYWdlbnQ6IHN0cmluZztcbiAgIGluc3RhbGxlZDogYm9vbGVhbjtcbn1cblxuY29uc3QgTk9UX0lOU1RBTExFRCA9ICdpbnN0YWxsZWQ9ZmFsc2UnO1xuXG5mdW5jdGlvbiB2ZXJzaW9uUmVzcG9uc2UoXG4gICBtYWpvciA9IDAsXG4gICBtaW5vciA9IDAsXG4gICBwYXRjaDogc3RyaW5nIHwgbnVtYmVyID0gMCxcbiAgIGFnZW50ID0gJycsXG4gICBpbnN0YWxsZWQgPSB0cnVlXG4pOiBWZXJzaW9uUmVzdWx0IHtcbiAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICB7XG4gICAgICAgICBtYWpvcixcbiAgICAgICAgIG1pbm9yLFxuICAgICAgICAgcGF0Y2gsXG4gICAgICAgICBhZ2VudCxcbiAgICAgICAgIGluc3RhbGxlZCxcbiAgICAgIH0sXG4gICAgICAndG9TdHJpbmcnLFxuICAgICAge1xuICAgICAgICAgdmFsdWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMucGF0Y2h9YDtcbiAgICAgICAgIH0sXG4gICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB9XG4gICApO1xufVxuXG5mdW5jdGlvbiBub3RJbnN0YWxsZWRSZXNwb25zZSgpIHtcbiAgIHJldHVybiB2ZXJzaW9uUmVzcG9uc2UoMCwgMCwgMCwgJycsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCk6IFBpY2s8U2ltcGxlR2l0LCAndmVyc2lvbic+IHtcbiAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uKHRoaXM6IFNpbXBsZUdpdEFwaSkge1xuICAgICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soe1xuICAgICAgICAgICAgY29tbWFuZHM6IFsnLS12ZXJzaW9uJ10sXG4gICAgICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgICAgICBwYXJzZXI6IHZlcnNpb25QYXJzZXIsXG4gICAgICAgICAgICBvbkVycm9yKHJlc3VsdCwgZXJyb3IsIGRvbmUsIGZhaWwpIHtcbiAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IEV4aXRDb2Rlcy5OT1RfRk9VTkQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lKEJ1ZmZlci5mcm9tKE5PVF9JTlNUQUxMRUQpKTtcbiAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgZmFpbChlcnJvcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgfSk7XG4gICAgICB9LFxuICAgfTtcbn1cblxuY29uc3QgcGFyc2VyczogTGluZVBhcnNlcjxWZXJzaW9uUmVzdWx0PltdID0gW1xuICAgbmV3IExpbmVQYXJzZXIoXG4gICAgICAvdmVyc2lvbiAoXFxkKylcXC4oXFxkKylcXC4oXFxkKykoPzpcXHMqXFwoKC4rKVxcKSk/LyxcbiAgICAgIChyZXN1bHQsIFttYWpvciwgbWlub3IsIHBhdGNoLCBhZ2VudCA9ICcnXSkgPT4ge1xuICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIHZlcnNpb25SZXNwb25zZShhc051bWJlcihtYWpvciksIGFzTnVtYmVyKG1pbm9yKSwgYXNOdW1iZXIocGF0Y2gpLCBhZ2VudClcbiAgICAgICAgICk7XG4gICAgICB9XG4gICApLFxuICAgbmV3IExpbmVQYXJzZXIoXG4gICAgICAvdmVyc2lvbiAoXFxkKylcXC4oXFxkKylcXC4oXFxEKykoLispPyQvLFxuICAgICAgKHJlc3VsdCwgW21ham9yLCBtaW5vciwgcGF0Y2gsIGFnZW50ID0gJyddKSA9PiB7XG4gICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgdmVyc2lvblJlc3BvbnNlKGFzTnVtYmVyKG1ham9yKSwgYXNOdW1iZXIobWlub3IpLCBwYXRjaCwgYWdlbnQpKTtcbiAgICAgIH1cbiAgICksXG5dO1xuXG5mdW5jdGlvbiB2ZXJzaW9uUGFyc2VyKHN0ZE91dDogc3RyaW5nKSB7XG4gICBpZiAoc3RkT3V0ID09PSBOT1RfSU5TVEFMTEVEKSB7XG4gICAgICByZXR1cm4gbm90SW5zdGFsbGVkUmVzcG9uc2UoKTtcbiAgIH1cblxuICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVzcG9uc2UodmVyc2lvblJlc3BvbnNlKDAsIDAsIDAsIHN0ZE91dCksIHBhcnNlcnMsIHN0ZE91dCk7XG59XG4iLCAiaW1wb3J0IHsgU2ltcGxlR2l0QmFzZSB9IGZyb20gJy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHsgdGFza0NhbGxiYWNrIH0gZnJvbSAnLi90YXNrLWNhbGxiYWNrJztcbmltcG9ydCB7IGNoYW5nZVdvcmtpbmdEaXJlY3RvcnlUYXNrIH0gZnJvbSAnLi90YXNrcy9jaGFuZ2Utd29ya2luZy1kaXJlY3RvcnknO1xuaW1wb3J0IGNoZWNrb3V0IGZyb20gJy4vdGFza3MvY2hlY2tvdXQnO1xuaW1wb3J0IGNvbW1pdCBmcm9tICcuL3Rhc2tzL2NvbW1pdCc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4vdGFza3MvY29uZmlnJztcbmltcG9ydCBncmVwIGZyb20gJy4vdGFza3MvZ3JlcCc7XG5pbXBvcnQgeyBoYXNoT2JqZWN0VGFzayB9IGZyb20gJy4vdGFza3MvaGFzaC1vYmplY3QnO1xuaW1wb3J0IHsgaW5pdFRhc2sgfSBmcm9tICcuL3Rhc2tzL2luaXQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3Rhc2tzL2xvZyc7XG5pbXBvcnQgeyBtZXJnZVRhc2sgfSBmcm9tICcuL3Rhc2tzL21lcmdlJztcbmltcG9ydCB7IHB1c2hUYXNrIH0gZnJvbSAnLi90YXNrcy9wdXNoJztcbmltcG9ydCB7IHN0YXR1c1Rhc2sgfSBmcm9tICcuL3Rhc2tzL3N0YXR1cyc7XG5pbXBvcnQgeyBjb25maWd1cmF0aW9uRXJyb3JUYXNrLCBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrIH0gZnJvbSAnLi90YXNrcy90YXNrJztcbmltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdGFza3MvdmVyc2lvbic7XG5pbXBvcnQgeyBvdXRwdXRIYW5kbGVyLCBTaW1wbGVHaXRFeGVjdXRvciwgU2ltcGxlR2l0VGFzaywgU2ltcGxlR2l0VGFza0NhbGxiYWNrIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICAgYXNBcnJheSxcbiAgIGZpbHRlclN0cmluZyxcbiAgIGZpbHRlclR5cGUsXG4gICBnZXRUcmFpbGluZ09wdGlvbnMsXG4gICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQsXG59IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgU2ltcGxlR2l0QXBpIGltcGxlbWVudHMgU2ltcGxlR2l0QmFzZSB7XG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9leGVjdXRvcjogU2ltcGxlR2l0RXhlY3V0b3IpIHt9XG5cbiAgIHByb3RlY3RlZCBfcnVuVGFzazxUPih0YXNrOiBTaW1wbGVHaXRUYXNrPFQ+LCB0aGVuPzogU2ltcGxlR2l0VGFza0NhbGxiYWNrPFQ+KSB7XG4gICAgICBjb25zdCBjaGFpbiA9IHRoaXMuX2V4ZWN1dG9yLmNoYWluKCk7XG4gICAgICBjb25zdCBwcm9taXNlID0gY2hhaW4ucHVzaCh0YXNrKTtcblxuICAgICAgaWYgKHRoZW4pIHtcbiAgICAgICAgIHRhc2tDYWxsYmFjayh0YXNrLCBwcm9taXNlLCB0aGVuKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcywge1xuICAgICAgICAgdGhlbjogeyB2YWx1ZTogcHJvbWlzZS50aGVuLmJpbmQocHJvbWlzZSkgfSxcbiAgICAgICAgIGNhdGNoOiB7IHZhbHVlOiBwcm9taXNlLmNhdGNoLmJpbmQocHJvbWlzZSkgfSxcbiAgICAgICAgIF9leGVjdXRvcjogeyB2YWx1ZTogY2hhaW4gfSxcbiAgICAgIH0pO1xuICAgfVxuXG4gICBhZGQoZmlsZXM6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydhZGQnLCAuLi5hc0FycmF5KGZpbGVzKV0pLFxuICAgICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICAgICk7XG4gICB9XG5cbiAgIGN3ZChkaXJlY3Rvcnk6IHN0cmluZyB8IHsgcGF0aDogc3RyaW5nOyByb290PzogYm9vbGVhbiB9KSB7XG4gICAgICBjb25zdCBuZXh0ID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyk7XG5cbiAgICAgIGlmICh0eXBlb2YgZGlyZWN0b3J5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soY2hhbmdlV29ya2luZ0RpcmVjdG9yeVRhc2soZGlyZWN0b3J5LCB0aGlzLl9leGVjdXRvciksIG5leHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRpcmVjdG9yeT8ucGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgICAgY2hhbmdlV29ya2luZ0RpcmVjdG9yeVRhc2soXG4gICAgICAgICAgICAgICBkaXJlY3RvcnkucGF0aCxcbiAgICAgICAgICAgICAgIChkaXJlY3Rvcnkucm9vdCAmJiB0aGlzLl9leGVjdXRvcikgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbmV4dFxuICAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICBjb25maWd1cmF0aW9uRXJyb3JUYXNrKCdHaXQuY3dkOiB3b3JraW5nRGlyZWN0b3J5IG11c3QgYmUgc3VwcGxpZWQgYXMgYSBzdHJpbmcnKSxcbiAgICAgICAgIG5leHRcbiAgICAgICk7XG4gICB9XG5cbiAgIGhhc2hPYmplY3QocGF0aDogc3RyaW5nLCB3cml0ZTogYm9vbGVhbiB8IHVua25vd24pIHtcbiAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgaGFzaE9iamVjdFRhc2socGF0aCwgd3JpdGUgPT09IHRydWUpLFxuICAgICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICAgICk7XG4gICB9XG5cbiAgIGluaXQoYmFyZT86IGJvb2xlYW4gfCB1bmtub3duKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgICAgIGluaXRUYXNrKGJhcmUgPT09IHRydWUsIHRoaXMuX2V4ZWN1dG9yLmN3ZCwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICAgICk7XG4gICB9XG5cbiAgIG1lcmdlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICBtZXJnZVRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICAgICk7XG4gICB9XG5cbiAgIG1lcmdlRnJvbVRvKHJlbW90ZTogc3RyaW5nLCBicmFuY2g6IHN0cmluZykge1xuICAgICAgaWYgKCEoZmlsdGVyU3RyaW5nKHJlbW90ZSkgJiYgZmlsdGVyU3RyaW5nKGJyYW5jaCkpKSB7XG4gICAgICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FcnJvclRhc2soXG4gICAgICAgICAgICAgICBgR2l0Lm1lcmdlRnJvbVRvIHJlcXVpcmVzIHRoYXQgdGhlICdyZW1vdGUnIGFuZCAnYnJhbmNoJyBhcmd1bWVudHMgYXJlIHN1cHBsaWVkIGFzIHN0cmluZ3NgXG4gICAgICAgICAgICApXG4gICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgICAgIG1lcmdlVGFzayhbcmVtb3RlLCBicmFuY2gsIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpXSksXG4gICAgICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzLCBmYWxzZSlcbiAgICAgICk7XG4gICB9XG5cbiAgIG91dHB1dEhhbmRsZXIoaGFuZGxlcjogb3V0cHV0SGFuZGxlcikge1xuICAgICAgdGhpcy5fZXhlY3V0b3Iub3V0cHV0SGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICByZXR1cm4gdGhpcztcbiAgIH1cblxuICAgcHVzaCgpIHtcbiAgICAgIGNvbnN0IHRhc2sgPSBwdXNoVGFzayhcbiAgICAgICAgIHtcbiAgICAgICAgICAgIHJlbW90ZTogZmlsdGVyVHlwZShhcmd1bWVudHNbMF0sIGZpbHRlclN0cmluZyksXG4gICAgICAgICAgICBicmFuY2g6IGZpbHRlclR5cGUoYXJndW1lbnRzWzFdLCBmaWx0ZXJTdHJpbmcpLFxuICAgICAgICAgfSxcbiAgICAgICAgIGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSk7XG4gICB9XG5cbiAgIHN0YXNoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKFsnc3Rhc2gnLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKV0pLFxuICAgICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICAgICk7XG4gICB9XG5cbiAgIHN0YXR1cygpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgc3RhdHVzVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgICAgKTtcbiAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihTaW1wbGVHaXRBcGkucHJvdG90eXBlLCBjaGVja291dCgpLCBjb21taXQoKSwgY29uZmlnKCksIGdyZXAoKSwgbG9nKCksIHZlcnNpb24oKSk7XG4iLCAiaW1wb3J0IHsgYXBwZW5kLCByZW1vdmUgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBjcmVhdGVEZWZlcnJlZCwgRGVmZXJyZWRQcm9taXNlIH0gZnJvbSAnQGt3c2l0ZXMvcHJvbWlzZS1kZWZlcnJlZCc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi9naXQtbG9nZ2VyJztcblxudHlwZSBTY2hlZHVsZUNvbXBsZXRlQ2FsbGJhY2sgPSAoKSA9PiB2b2lkO1xudHlwZSBTY2hlZHVsZWRUYXNrID0gUGljazxEZWZlcnJlZFByb21pc2U8U2NoZWR1bGVDb21wbGV0ZUNhbGxiYWNrPiwgJ3Byb21pc2UnIHwgJ2RvbmUnPiAmIHtcbiAgIGlkOiBudW1iZXI7XG59O1xuXG5jb25zdCBjcmVhdGVTY2hlZHVsZWRUYXNrOiAoKSA9PiBTY2hlZHVsZWRUYXNrID0gKCgpID0+IHtcbiAgIGxldCBpZCA9IDA7XG4gICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWQrKztcbiAgICAgIGNvbnN0IHsgcHJvbWlzZSwgZG9uZSB9ID0gY3JlYXRlRGVmZXJyZWQ8U2NoZWR1bGVDb21wbGV0ZUNhbGxiYWNrPigpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAgcHJvbWlzZSxcbiAgICAgICAgIGRvbmUsXG4gICAgICAgICBpZCxcbiAgICAgIH07XG4gICB9O1xufSkoKTtcblxuZXhwb3J0IGNsYXNzIFNjaGVkdWxlciB7XG4gICBwcml2YXRlIGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignJywgJ3NjaGVkdWxlcicpO1xuICAgcHJpdmF0ZSBwZW5kaW5nOiBTY2hlZHVsZWRUYXNrW10gPSBbXTtcbiAgIHByaXZhdGUgcnVubmluZzogU2NoZWR1bGVkVGFza1tdID0gW107XG5cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uY3VycmVuY3kgPSAyKSB7XG4gICAgICB0aGlzLmxvZ2dlcihgQ29uc3RydWN0ZWQsIGNvbmN1cnJlbmN5PSVzYCwgY29uY3VycmVuY3kpO1xuICAgfVxuXG4gICBwcml2YXRlIHNjaGVkdWxlKCkge1xuICAgICAgaWYgKCF0aGlzLnBlbmRpbmcubGVuZ3RoIHx8IHRoaXMucnVubmluZy5sZW5ndGggPj0gdGhpcy5jb25jdXJyZW5jeSkge1xuICAgICAgICAgdGhpcy5sb2dnZXIoXG4gICAgICAgICAgICBgU2NoZWR1bGUgYXR0ZW1wdCBpZ25vcmVkLCBwZW5kaW5nPSVzIHJ1bm5pbmc9JXMgY29uY3VycmVuY3k9JXNgLFxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nLmxlbmd0aCxcbiAgICAgICAgICAgIHRoaXMucnVubmluZy5sZW5ndGgsXG4gICAgICAgICAgICB0aGlzLmNvbmN1cnJlbmN5XG4gICAgICAgICApO1xuICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXNrID0gYXBwZW5kKHRoaXMucnVubmluZywgdGhpcy5wZW5kaW5nLnNoaWZ0KCkhKTtcbiAgICAgIHRoaXMubG9nZ2VyKGBBdHRlbXB0aW5nIGlkPSVzYCwgdGFzay5pZCk7XG4gICAgICB0YXNrLmRvbmUoKCkgPT4ge1xuICAgICAgICAgdGhpcy5sb2dnZXIoYENvbXBsZXRpbmcgaWQ9YCwgdGFzay5pZCk7XG4gICAgICAgICByZW1vdmUodGhpcy5ydW5uaW5nLCB0YXNrKTtcbiAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICAgIH0pO1xuICAgfVxuXG4gICBuZXh0KCk6IFByb21pc2U8U2NoZWR1bGVDb21wbGV0ZUNhbGxiYWNrPiB7XG4gICAgICBjb25zdCB7IHByb21pc2UsIGlkIH0gPSBhcHBlbmQodGhpcy5wZW5kaW5nLCBjcmVhdGVTY2hlZHVsZWRUYXNrKCkpO1xuICAgICAgdGhpcy5sb2dnZXIoYFNjaGVkdWxpbmcgaWQ9JXNgLCBpZCk7XG5cbiAgICAgIHRoaXMuc2NoZWR1bGUoKTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICB9XG59XG4iLCAiaW1wb3J0IHsgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayB9IGZyb20gJy4vdGFzayc7XG5pbXBvcnQgeyBPcHRpb25GbGFncywgT3B0aW9ucywgU3RyaW5nVGFzayB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgQXBwbHlPcHRpb25zID0gT3B0aW9ucyAmXG4gICBPcHRpb25GbGFnczxcbiAgICAgIHwgJy0tc3RhdCdcbiAgICAgIHwgJy0tbnVtc3RhdCdcbiAgICAgIHwgJy0tc3VtbWFyeSdcbiAgICAgIHwgJy0tY2hlY2snXG4gICAgICB8ICctLWluZGV4J1xuICAgICAgfCAnLS1pbnRlbnQtdG8tYWRkJ1xuICAgICAgfCAnLS0zd2F5J1xuICAgICAgfCAnLS1hcHBseSdcbiAgICAgIHwgJy0tbm8tYWRkJ1xuICAgICAgfCAnLVInXG4gICAgICB8ICctLXJldmVyc2UnXG4gICAgICB8ICctLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCdcbiAgICAgIHwgJy0tYmluYXJ5J1xuICAgICAgfCAnLS1yZWplY3QnXG4gICAgICB8ICcteidcbiAgICAgIHwgJy0taW5hY2N1cmF0ZS1lb2YnXG4gICAgICB8ICctLXJlY291bnQnXG4gICAgICB8ICctLWNhY2hlZCdcbiAgICAgIHwgJy0taWdub3JlLXNwYWNlLWNoYW5nZSdcbiAgICAgIHwgJy0taWdub3JlLXdoaXRlc3BhY2UnXG4gICAgICB8ICctLXZlcmJvc2UnXG4gICAgICB8ICctLXVuc2FmZS1wYXRocydcbiAgID4gJlxuICAgT3B0aW9uRmxhZ3M8Jy0td2hpdGVzcGFjZScsICdub3dhcm4nIHwgJ3dhcm4nIHwgJ2ZpeCcgfCAnZXJyb3InIHwgJ2Vycm9yLWFsbCc+ICZcbiAgIE9wdGlvbkZsYWdzPCctLWJ1aWxkLWZha2UtYW5jZXN0b3InIHwgJy0tZXhjbHVkZScgfCAnLS1pbmNsdWRlJyB8ICctLWRpcmVjdG9yeScsIHN0cmluZz4gJlxuICAgT3B0aW9uRmxhZ3M8Jy1wJyB8ICctQycsIG51bWJlcj47XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVBhdGNoVGFzayhwYXRjaGVzOiBzdHJpbmdbXSwgY3VzdG9tQXJnczogc3RyaW5nW10pOiBTdHJpbmdUYXNrPHN0cmluZz4ge1xuICAgcmV0dXJuIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydhcHBseScsIC4uLmN1c3RvbUFyZ3MsIC4uLnBhdGNoZXNdKTtcbn1cbiIsICJpbXBvcnQge1xuICAgQnJhbmNoTXVsdGlEZWxldGVSZXN1bHQsXG4gICBCcmFuY2hTaW5nbGVEZWxldGVGYWlsdXJlLFxuICAgQnJhbmNoU2luZ2xlRGVsZXRlUmVzdWx0LFxuICAgQnJhbmNoU2luZ2xlRGVsZXRlU3VjY2Vzcyxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5cbmV4cG9ydCBjbGFzcyBCcmFuY2hEZWxldGlvbkJhdGNoIGltcGxlbWVudHMgQnJhbmNoTXVsdGlEZWxldGVSZXN1bHQge1xuICAgYWxsOiBCcmFuY2hTaW5nbGVEZWxldGVSZXN1bHRbXSA9IFtdO1xuICAgYnJhbmNoZXM6IHsgW2JyYW5jaE5hbWU6IHN0cmluZ106IEJyYW5jaFNpbmdsZURlbGV0ZVJlc3VsdCB9ID0ge307XG4gICBlcnJvcnM6IEJyYW5jaFNpbmdsZURlbGV0ZVJlc3VsdFtdID0gW107XG5cbiAgIGdldCBzdWNjZXNzKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICF0aGlzLmVycm9ycy5sZW5ndGg7XG4gICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicmFuY2hEZWxldGlvblN1Y2Nlc3MoYnJhbmNoOiBzdHJpbmcsIGhhc2g6IHN0cmluZyk6IEJyYW5jaFNpbmdsZURlbGV0ZVN1Y2Nlc3Mge1xuICAgcmV0dXJuIHtcbiAgICAgIGJyYW5jaCxcbiAgICAgIGhhc2gsXG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyYW5jaERlbGV0aW9uRmFpbHVyZShicmFuY2g6IHN0cmluZyk6IEJyYW5jaFNpbmdsZURlbGV0ZUZhaWx1cmUge1xuICAgcmV0dXJuIHtcbiAgICAgIGJyYW5jaCxcbiAgICAgIGhhc2g6IG51bGwsXG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NpbmdsZUJyYW5jaERlbGV0ZUZhaWx1cmUoXG4gICB0ZXN0OiBCcmFuY2hTaW5nbGVEZWxldGVSZXN1bHRcbik6IHRlc3QgaXMgQnJhbmNoU2luZ2xlRGVsZXRlU3VjY2VzcyB7XG4gICByZXR1cm4gdGVzdC5zdWNjZXNzO1xufVxuIiwgImltcG9ydCB7IEJyYW5jaE11bHRpRGVsZXRlUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQge1xuICAgQnJhbmNoRGVsZXRpb25CYXRjaCxcbiAgIGJyYW5jaERlbGV0aW9uRmFpbHVyZSxcbiAgIGJyYW5jaERlbGV0aW9uU3VjY2Vzcyxcbn0gZnJvbSAnLi4vcmVzcG9uc2VzL0JyYW5jaERlbGV0ZVN1bW1hcnknO1xuaW1wb3J0IHsgVGFza1BhcnNlciB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEV4aXRDb2RlcywgTGluZVBhcnNlciwgcGFyc2VTdHJpbmdSZXNwb25zZSB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgZGVsZXRlU3VjY2Vzc1JlZ2V4ID0gLyhcXFMrKVxccytcXChcXFMrXFxzKFteKV0rKVxcKS87XG5jb25zdCBkZWxldGVFcnJvclJlZ2V4ID0gL15lcnJvclteJ10rJyhbXiddKyknL207XG5cbmNvbnN0IHBhcnNlcnM6IExpbmVQYXJzZXI8QnJhbmNoTXVsdGlEZWxldGVSZXN1bHQ+W10gPSBbXG4gICBuZXcgTGluZVBhcnNlcihkZWxldGVTdWNjZXNzUmVnZXgsIChyZXN1bHQsIFticmFuY2gsIGhhc2hdKSA9PiB7XG4gICAgICBjb25zdCBkZWxldGlvbiA9IGJyYW5jaERlbGV0aW9uU3VjY2VzcyhicmFuY2gsIGhhc2gpO1xuXG4gICAgICByZXN1bHQuYWxsLnB1c2goZGVsZXRpb24pO1xuICAgICAgcmVzdWx0LmJyYW5jaGVzW2JyYW5jaF0gPSBkZWxldGlvbjtcbiAgIH0pLFxuICAgbmV3IExpbmVQYXJzZXIoZGVsZXRlRXJyb3JSZWdleCwgKHJlc3VsdCwgW2JyYW5jaF0pID0+IHtcbiAgICAgIGNvbnN0IGRlbGV0aW9uID0gYnJhbmNoRGVsZXRpb25GYWlsdXJlKGJyYW5jaCk7XG5cbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaChkZWxldGlvbik7XG4gICAgICByZXN1bHQuYWxsLnB1c2goZGVsZXRpb24pO1xuICAgICAgcmVzdWx0LmJyYW5jaGVzW2JyYW5jaF0gPSBkZWxldGlvbjtcbiAgIH0pLFxuXTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlQnJhbmNoRGVsZXRpb25zOiBUYXNrUGFyc2VyPHN0cmluZywgQnJhbmNoTXVsdGlEZWxldGVSZXN1bHQ+ID0gKFxuICAgc3RkT3V0LFxuICAgc3RkRXJyXG4pID0+IHtcbiAgIHJldHVybiBwYXJzZVN0cmluZ1Jlc3BvbnNlKG5ldyBCcmFuY2hEZWxldGlvbkJhdGNoKCksIHBhcnNlcnMsIFtzdGRPdXQsIHN0ZEVycl0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0JyYW5jaERlbGV0aW9uRXJyb3IoZGF0YTogc3RyaW5nLCBwcm9jZXNzRXhpdENvZGU6IEV4aXRDb2Rlcyk6IGJvb2xlYW4ge1xuICAgcmV0dXJuIHByb2Nlc3NFeGl0Q29kZSA9PT0gRXhpdENvZGVzLkVSUk9SICYmIGRlbGV0ZUVycm9yUmVnZXgudGVzdChkYXRhKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJyYW5jaFN1bW1hcnksIEJyYW5jaFN1bW1hcnlCcmFuY2ggfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcblxuZXhwb3J0IGVudW0gQnJhbmNoU3RhdHVzSWRlbnRpZmllciB7XG4gICBDVVJSRU5UID0gJyonLFxuICAgTElOS0VEID0gJysnLFxufVxuXG5leHBvcnQgY2xhc3MgQnJhbmNoU3VtbWFyeVJlc3VsdCBpbXBsZW1lbnRzIEJyYW5jaFN1bW1hcnkge1xuICAgcHVibGljIGFsbDogc3RyaW5nW10gPSBbXTtcbiAgIHB1YmxpYyBicmFuY2hlczogeyBbcDogc3RyaW5nXTogQnJhbmNoU3VtbWFyeUJyYW5jaCB9ID0ge307XG4gICBwdWJsaWMgY3VycmVudDogc3RyaW5nID0gJyc7XG4gICBwdWJsaWMgZGV0YWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgcHVzaChcbiAgICAgIHN0YXR1czogQnJhbmNoU3RhdHVzSWRlbnRpZmllciB8IHVua25vd24sXG4gICAgICBkZXRhY2hlZDogYm9vbGVhbixcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGNvbW1pdDogc3RyaW5nLFxuICAgICAgbGFiZWw6IHN0cmluZ1xuICAgKSB7XG4gICAgICBpZiAoc3RhdHVzID09PSBCcmFuY2hTdGF0dXNJZGVudGlmaWVyLkNVUlJFTlQpIHtcbiAgICAgICAgIHRoaXMuZGV0YWNoZWQgPSBkZXRhY2hlZDtcbiAgICAgICAgIHRoaXMuY3VycmVudCA9IG5hbWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWxsLnB1c2gobmFtZSk7XG4gICAgICB0aGlzLmJyYW5jaGVzW25hbWVdID0ge1xuICAgICAgICAgY3VycmVudDogc3RhdHVzID09PSBCcmFuY2hTdGF0dXNJZGVudGlmaWVyLkNVUlJFTlQsXG4gICAgICAgICBsaW5rZWRXb3JrVHJlZTogc3RhdHVzID09PSBCcmFuY2hTdGF0dXNJZGVudGlmaWVyLkxJTktFRCxcbiAgICAgICAgIG5hbWUsXG4gICAgICAgICBjb21taXQsXG4gICAgICAgICBsYWJlbCxcbiAgICAgIH07XG4gICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCcmFuY2hTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBCcmFuY2hTdW1tYXJ5UmVzdWx0IH0gZnJvbSAnLi4vcmVzcG9uc2VzL0JyYW5jaFN1bW1hcnknO1xuaW1wb3J0IHsgTGluZVBhcnNlciwgcGFyc2VTdHJpbmdSZXNwb25zZSB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgcGFyc2VyczogTGluZVBhcnNlcjxCcmFuY2hTdW1tYXJ5UmVzdWx0PltdID0gW1xuICAgbmV3IExpbmVQYXJzZXIoXG4gICAgICAvXihbKitdXFxzKT9cXCgoPzpIRUFEICk/ZGV0YWNoZWQgKD86ZnJvbXxhdCkgKFxcUyspXFwpXFxzKyhbYS16MC05XSspXFxzKC4qKSQvLFxuICAgICAgKHJlc3VsdCwgW2N1cnJlbnQsIG5hbWUsIGNvbW1pdCwgbGFiZWxdKSA9PiB7XG4gICAgICAgICByZXN1bHQucHVzaChicmFuY2hTdGF0dXMoY3VycmVudCksIHRydWUsIG5hbWUsIGNvbW1pdCwgbGFiZWwpO1xuICAgICAgfVxuICAgKSxcbiAgIG5ldyBMaW5lUGFyc2VyKFxuICAgICAgL14oWyorXVxccyk/KFxcUyspXFxzKyhbYS16MC05XSspXFxzPyguKikkL3MsXG4gICAgICAocmVzdWx0LCBbY3VycmVudCwgbmFtZSwgY29tbWl0LCBsYWJlbF0pID0+IHtcbiAgICAgICAgIHJlc3VsdC5wdXNoKGJyYW5jaFN0YXR1cyhjdXJyZW50KSwgZmFsc2UsIG5hbWUsIGNvbW1pdCwgbGFiZWwpO1xuICAgICAgfVxuICAgKSxcbl07XG5cbmZ1bmN0aW9uIGJyYW5jaFN0YXR1cyhpbnB1dD86IHN0cmluZykge1xuICAgcmV0dXJuIGlucHV0ID8gaW5wdXQuY2hhckF0KDApIDogJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJyYW5jaFN1bW1hcnkoc3RkT3V0OiBzdHJpbmcpOiBCcmFuY2hTdW1tYXJ5IHtcbiAgIHJldHVybiBwYXJzZVN0cmluZ1Jlc3BvbnNlKG5ldyBCcmFuY2hTdW1tYXJ5UmVzdWx0KCksIHBhcnNlcnMsIHN0ZE91dCk7XG59XG4iLCAiaW1wb3J0IHsgQnJhbmNoTXVsdGlEZWxldGVSZXN1bHQsIEJyYW5jaFNpbmdsZURlbGV0ZVJlc3VsdCwgQnJhbmNoU3VtbWFyeSB9IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHsgU3RyaW5nVGFzayB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEdpdFJlc3BvbnNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvZ2l0LXJlc3BvbnNlLWVycm9yJztcbmltcG9ydCB7IGhhc0JyYW5jaERlbGV0aW9uRXJyb3IsIHBhcnNlQnJhbmNoRGVsZXRpb25zIH0gZnJvbSAnLi4vcGFyc2Vycy9wYXJzZS1icmFuY2gtZGVsZXRlJztcbmltcG9ydCB7IHBhcnNlQnJhbmNoU3VtbWFyeSB9IGZyb20gJy4uL3BhcnNlcnMvcGFyc2UtYnJhbmNoJztcbmltcG9ydCB7IGJ1ZmZlclRvU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNEZWxldGVCcmFuY2hDb21tYW5kKGNvbW1hbmRzOiBzdHJpbmdbXSkge1xuICAgY29uc3QgZGVsZXRlQ29tbWFuZHMgPSBbJy1kJywgJy1EJywgJy0tZGVsZXRlJ107XG4gICByZXR1cm4gY29tbWFuZHMuc29tZSgoY29tbWFuZCkgPT4gZGVsZXRlQ29tbWFuZHMuaW5jbHVkZXMoY29tbWFuZCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJhbmNoVGFzayhcbiAgIGN1c3RvbUFyZ3M6IHN0cmluZ1tdXG4pOiBTdHJpbmdUYXNrPEJyYW5jaFN1bW1hcnkgfCBCcmFuY2hTaW5nbGVEZWxldGVSZXN1bHQ+IHtcbiAgIGNvbnN0IGlzRGVsZXRlID0gY29udGFpbnNEZWxldGVCcmFuY2hDb21tYW5kKGN1c3RvbUFyZ3MpO1xuICAgY29uc3QgY29tbWFuZHMgPSBbJ2JyYW5jaCcsIC4uLmN1c3RvbUFyZ3NdO1xuXG4gICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCctYScpO1xuICAgfVxuXG4gICBpZiAoIWNvbW1hbmRzLmluY2x1ZGVzKCctdicpKSB7XG4gICAgICBjb21tYW5kcy5zcGxpY2UoMSwgMCwgJy12Jyk7XG4gICB9XG5cbiAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBjb21tYW5kcyxcbiAgICAgIHBhcnNlcihzdGRPdXQsIHN0ZEVycikge1xuICAgICAgICAgaWYgKGlzRGVsZXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VCcmFuY2hEZWxldGlvbnMoc3RkT3V0LCBzdGRFcnIpLmFsbFswXTtcbiAgICAgICAgIH1cblxuICAgICAgICAgcmV0dXJuIHBhcnNlQnJhbmNoU3VtbWFyeShzdGRPdXQpO1xuICAgICAgfSxcbiAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicmFuY2hMb2NhbFRhc2soKTogU3RyaW5nVGFzazxCcmFuY2hTdW1tYXJ5PiB7XG4gICBjb25zdCBwYXJzZXIgPSBwYXJzZUJyYW5jaFN1bW1hcnk7XG5cbiAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBjb21tYW5kczogWydicmFuY2gnLCAnLXYnXSxcbiAgICAgIHBhcnNlcixcbiAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVCcmFuY2hlc1Rhc2soXG4gICBicmFuY2hlczogc3RyaW5nW10sXG4gICBmb3JjZURlbGV0ZSA9IGZhbHNlXG4pOiBTdHJpbmdUYXNrPEJyYW5jaE11bHRpRGVsZXRlUmVzdWx0PiB7XG4gICByZXR1cm4ge1xuICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgY29tbWFuZHM6IFsnYnJhbmNoJywgJy12JywgZm9yY2VEZWxldGUgPyAnLUQnIDogJy1kJywgLi4uYnJhbmNoZXNdLFxuICAgICAgcGFyc2VyKHN0ZE91dCwgc3RkRXJyKSB7XG4gICAgICAgICByZXR1cm4gcGFyc2VCcmFuY2hEZWxldGlvbnMoc3RkT3V0LCBzdGRFcnIpO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3IoeyBleGl0Q29kZSwgc3RkT3V0IH0sIGVycm9yLCBkb25lLCBmYWlsKSB7XG4gICAgICAgICBpZiAoIWhhc0JyYW5jaERlbGV0aW9uRXJyb3IoU3RyaW5nKGVycm9yKSwgZXhpdENvZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChlcnJvcik7XG4gICAgICAgICB9XG5cbiAgICAgICAgIGRvbmUoc3RkT3V0KTtcbiAgICAgIH0sXG4gICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlQnJhbmNoVGFzayhcbiAgIGJyYW5jaDogc3RyaW5nLFxuICAgZm9yY2VEZWxldGUgPSBmYWxzZVxuKTogU3RyaW5nVGFzazxCcmFuY2hTaW5nbGVEZWxldGVSZXN1bHQ+IHtcbiAgIGNvbnN0IHRhc2s6IFN0cmluZ1Rhc2s8QnJhbmNoU2luZ2xlRGVsZXRlUmVzdWx0PiA9IHtcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIGNvbW1hbmRzOiBbJ2JyYW5jaCcsICctdicsIGZvcmNlRGVsZXRlID8gJy1EJyA6ICctZCcsIGJyYW5jaF0sXG4gICAgICBwYXJzZXIoc3RkT3V0LCBzdGRFcnIpIHtcbiAgICAgICAgIHJldHVybiBwYXJzZUJyYW5jaERlbGV0aW9ucyhzdGRPdXQsIHN0ZEVycikuYnJhbmNoZXNbYnJhbmNoXSE7XG4gICAgICB9LFxuICAgICAgb25FcnJvcih7IGV4aXRDb2RlLCBzdGRFcnIsIHN0ZE91dCB9LCBlcnJvciwgXywgZmFpbCkge1xuICAgICAgICAgaWYgKCFoYXNCcmFuY2hEZWxldGlvbkVycm9yKFN0cmluZyhlcnJvciksIGV4aXRDb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3IpO1xuICAgICAgICAgfVxuXG4gICAgICAgICB0aHJvdyBuZXcgR2l0UmVzcG9uc2VFcnJvcihcbiAgICAgICAgICAgIHRhc2sucGFyc2VyKGJ1ZmZlclRvU3RyaW5nKHN0ZE91dCksIGJ1ZmZlclRvU3RyaW5nKHN0ZEVycikpLFxuICAgICAgICAgICAgU3RyaW5nKGVycm9yKVxuICAgICAgICAgKTtcbiAgICAgIH0sXG4gICB9O1xuXG4gICByZXR1cm4gdGFzaztcbn1cbiIsICIvKipcbiAqIFBhcnNlciBmb3IgdGhlIGBjaGVjay1pZ25vcmVgIGNvbW1hbmQgLSByZXR1cm5zIGVhY2ggZmlsZSBhcyBhIHN0cmluZyBhcnJheVxuICovXG5leHBvcnQgY29uc3QgcGFyc2VDaGVja0lnbm9yZSA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICByZXR1cm4gdGV4dFxuICAgICAgLnNwbGl0KC9cXG4vZylcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgICAgLmZpbHRlcigoZmlsZSkgPT4gISFmaWxlKTtcbn07XG4iLCAiaW1wb3J0IHsgU3RyaW5nVGFzayB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlQ2hlY2tJZ25vcmUgfSBmcm9tICcuLi9yZXNwb25zZXMvQ2hlY2tJZ25vcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJZ25vcmVUYXNrKHBhdGhzOiBzdHJpbmdbXSk6IFN0cmluZ1Rhc2s8c3RyaW5nW10+IHtcbiAgIHJldHVybiB7XG4gICAgICBjb21tYW5kczogWydjaGVjay1pZ25vcmUnLCAuLi5wYXRoc10sXG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBwYXJzZXI6IHBhcnNlQ2hlY2tJZ25vcmUsXG4gICB9O1xufVxuIiwgImltcG9ydCB7IGNvbmZpZ3VyYXRpb25FcnJvclRhc2ssIEVtcHR5VGFzaywgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayB9IGZyb20gJy4vdGFzayc7XG5pbXBvcnQgeyBPcHRpb25GbGFncywgT3B0aW9ucywgU3RyaW5nVGFzayB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGFwcGVuZCwgZmlsdGVyU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgdHlwZSBDbG9uZU9wdGlvbnMgPSBPcHRpb25zICZcbiAgIE9wdGlvbkZsYWdzPFxuICAgICAgfCAnLS1iYXJlJ1xuICAgICAgfCAnLS1kaXNzb2NpYXRlJ1xuICAgICAgfCAnLS1taXJyb3InXG4gICAgICB8ICctLW5vLWNoZWNrb3V0J1xuICAgICAgfCAnLS1uby1yZW1vdGUtc3VibW9kdWxlcydcbiAgICAgIHwgJy0tbm8tc2hhbGxvdy1zdWJtb2R1bGVzJ1xuICAgICAgfCAnLS1uby1zaW5nbGUtYnJhbmNoJ1xuICAgICAgfCAnLS1uby10YWdzJ1xuICAgICAgfCAnLS1yZW1vdGUtc3VibW9kdWxlcydcbiAgICAgIHwgJy0tc2luZ2xlLWJyYW5jaCdcbiAgICAgIHwgJy0tc2hhbGxvdy1zdWJtb2R1bGVzJ1xuICAgICAgfCAnLS12ZXJib3NlJ1xuICAgPiAmXG4gICBPcHRpb25GbGFnczwnLS1kZXB0aCcgfCAnLWonIHwgJy0tam9icycsIG51bWJlcj4gJlxuICAgT3B0aW9uRmxhZ3M8XG4gICAgICB8ICctLWJyYW5jaCdcbiAgICAgIHwgJy0tb3JpZ2luJ1xuICAgICAgfCAnLS1yZWN1cnNlLXN1Ym1vZHVsZXMnXG4gICAgICB8ICctLXNlcGFyYXRlLWdpdC1kaXInXG4gICAgICB8ICctLXNoYWxsb3ctZXhjbHVkZSdcbiAgICAgIHwgJy0tc2hhbGxvdy1zaW5jZSdcbiAgICAgIHwgJy0tdGVtcGxhdGUnLFxuICAgICAgc3RyaW5nXG4gICA+O1xuXG5mdW5jdGlvbiBkaXNhbGxvd2VkQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpIHtcbiAgIHJldHVybiAvXi0tdXBsb2FkLXBhY2soPXwkKS8udGVzdChjb21tYW5kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lVGFzayhcbiAgIHJlcG86IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgIGRpcmVjdG9yeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgY3VzdG9tQXJnczogc3RyaW5nW11cbik6IFN0cmluZ1Rhc2s8c3RyaW5nPiB8IEVtcHR5VGFzayB7XG4gICBjb25zdCBjb21tYW5kcyA9IFsnY2xvbmUnLCAuLi5jdXN0b21BcmdzXTtcblxuICAgZmlsdGVyU3RyaW5nKHJlcG8pICYmIGNvbW1hbmRzLnB1c2gocmVwbyk7XG4gICBmaWx0ZXJTdHJpbmcoZGlyZWN0b3J5KSAmJiBjb21tYW5kcy5wdXNoKGRpcmVjdG9yeSk7XG5cbiAgIGNvbnN0IGJhbm5lZCA9IGNvbW1hbmRzLmZpbmQoZGlzYWxsb3dlZENvbW1hbmQpO1xuICAgaWYgKGJhbm5lZCkge1xuICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25FcnJvclRhc2soYGdpdC5mZXRjaDogcG90ZW50aWFsIGV4cGxvaXQgYXJndW1lbnQgYmxvY2tlZC5gKTtcbiAgIH1cblxuICAgcmV0dXJuIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVNaXJyb3JUYXNrKFxuICAgcmVwbzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgZGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICBjdXN0b21BcmdzOiBzdHJpbmdbXVxuKSB7XG4gICBhcHBlbmQoY3VzdG9tQXJncywgJy0tbWlycm9yJyk7XG5cbiAgIHJldHVybiBjbG9uZVRhc2socmVwbywgZGlyZWN0b3J5LCBjdXN0b21BcmdzKTtcbn1cbiIsICJpbXBvcnQgeyBGZXRjaFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHsgTGluZVBhcnNlciwgcGFyc2VTdHJpbmdSZXNwb25zZSB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgcGFyc2VyczogTGluZVBhcnNlcjxGZXRjaFJlc3VsdD5bXSA9IFtcbiAgIG5ldyBMaW5lUGFyc2VyKC9Gcm9tICguKykkLywgKHJlc3VsdCwgW3JlbW90ZV0pID0+IHtcbiAgICAgIHJlc3VsdC5yZW1vdGUgPSByZW1vdGU7XG4gICB9KSxcbiAgIG5ldyBMaW5lUGFyc2VyKC9cXCogXFxbbmV3IGJyYW5jaF1cXHMrKFxcUyspXFxzKi0+ICguKykkLywgKHJlc3VsdCwgW25hbWUsIHRyYWNraW5nXSkgPT4ge1xuICAgICAgcmVzdWx0LmJyYW5jaGVzLnB1c2goe1xuICAgICAgICAgbmFtZSxcbiAgICAgICAgIHRyYWNraW5nLFxuICAgICAgfSk7XG4gICB9KSxcbiAgIG5ldyBMaW5lUGFyc2VyKC9cXCogXFxbbmV3IHRhZ11cXHMrKFxcUyspXFxzKi0+ICguKykkLywgKHJlc3VsdCwgW25hbWUsIHRyYWNraW5nXSkgPT4ge1xuICAgICAgcmVzdWx0LnRhZ3MucHVzaCh7XG4gICAgICAgICBuYW1lLFxuICAgICAgICAgdHJhY2tpbmcsXG4gICAgICB9KTtcbiAgIH0pLFxuICAgbmV3IExpbmVQYXJzZXIoLy0gXFxbZGVsZXRlZF1cXHMrXFxTK1xccyotPiAoLispJC8sIChyZXN1bHQsIFt0cmFja2luZ10pID0+IHtcbiAgICAgIHJlc3VsdC5kZWxldGVkLnB1c2goe1xuICAgICAgICAgdHJhY2tpbmcsXG4gICAgICB9KTtcbiAgIH0pLFxuICAgbmV3IExpbmVQYXJzZXIoXG4gICAgICAvXFxzKihbXi5dKylcXC5cXC4oXFxTKylcXHMrKFxcUyspXFxzKi0+ICguKykkLyxcbiAgICAgIChyZXN1bHQsIFtmcm9tLCB0bywgbmFtZSwgdHJhY2tpbmddKSA9PiB7XG4gICAgICAgICByZXN1bHQudXBkYXRlZC5wdXNoKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0cmFja2luZyxcbiAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgIH0pO1xuICAgICAgfVxuICAgKSxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZldGNoUmVzdWx0KHN0ZE91dDogc3RyaW5nLCBzdGRFcnI6IHN0cmluZyk6IEZldGNoUmVzdWx0IHtcbiAgIGNvbnN0IHJlc3VsdDogRmV0Y2hSZXN1bHQgPSB7XG4gICAgICByYXc6IHN0ZE91dCxcbiAgICAgIHJlbW90ZTogbnVsbCxcbiAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIHRhZ3M6IFtdLFxuICAgICAgdXBkYXRlZDogW10sXG4gICAgICBkZWxldGVkOiBbXSxcbiAgIH07XG4gICByZXR1cm4gcGFyc2VTdHJpbmdSZXNwb25zZShyZXN1bHQsIHBhcnNlcnMsIFtzdGRPdXQsIHN0ZEVycl0pO1xufVxuIiwgImltcG9ydCB7IEZldGNoUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBwYXJzZUZldGNoUmVzdWx0IH0gZnJvbSAnLi4vcGFyc2Vycy9wYXJzZS1mZXRjaCc7XG5pbXBvcnQgeyBTdHJpbmdUYXNrIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBjb25maWd1cmF0aW9uRXJyb3JUYXNrLCBFbXB0eVRhc2sgfSBmcm9tICcuL3Rhc2snO1xuXG5mdW5jdGlvbiBkaXNhbGxvd2VkQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpIHtcbiAgIHJldHVybiAvXi0tdXBsb2FkLXBhY2soPXwkKS8udGVzdChjb21tYW5kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoVGFzayhcbiAgIHJlbW90ZTogc3RyaW5nLFxuICAgYnJhbmNoOiBzdHJpbmcsXG4gICBjdXN0b21BcmdzOiBzdHJpbmdbXVxuKTogU3RyaW5nVGFzazxGZXRjaFJlc3VsdD4gfCBFbXB0eVRhc2sge1xuICAgY29uc3QgY29tbWFuZHMgPSBbJ2ZldGNoJywgLi4uY3VzdG9tQXJnc107XG4gICBpZiAocmVtb3RlICYmIGJyYW5jaCkge1xuICAgICAgY29tbWFuZHMucHVzaChyZW1vdGUsIGJyYW5jaCk7XG4gICB9XG5cbiAgIGNvbnN0IGJhbm5lZCA9IGNvbW1hbmRzLmZpbmQoZGlzYWxsb3dlZENvbW1hbmQpO1xuICAgaWYgKGJhbm5lZCkge1xuICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25FcnJvclRhc2soYGdpdC5mZXRjaDogcG90ZW50aWFsIGV4cGxvaXQgYXJndW1lbnQgYmxvY2tlZC5gKTtcbiAgIH1cblxuICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzLFxuICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgcGFyc2VyOiBwYXJzZUZldGNoUmVzdWx0LFxuICAgfTtcbn1cbiIsICJpbXBvcnQgeyBNb3ZlUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBMaW5lUGFyc2VyLCBwYXJzZVN0cmluZ1Jlc3BvbnNlIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBwYXJzZXJzOiBMaW5lUGFyc2VyPE1vdmVSZXN1bHQ+W10gPSBbXG4gICBuZXcgTGluZVBhcnNlcigvXlJlbmFtaW5nICguKykgdG8gKC4rKSQvLCAocmVzdWx0LCBbZnJvbSwgdG9dKSA9PiB7XG4gICAgICByZXN1bHQubW92ZXMucHVzaCh7IGZyb20sIHRvIH0pO1xuICAgfSksXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNb3ZlUmVzdWx0KHN0ZE91dDogc3RyaW5nKTogTW92ZVJlc3VsdCB7XG4gICByZXR1cm4gcGFyc2VTdHJpbmdSZXNwb25zZSh7IG1vdmVzOiBbXSB9LCBwYXJzZXJzLCBzdGRPdXQpO1xufVxuIiwgImltcG9ydCB7IE1vdmVSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcbmltcG9ydCB7IHBhcnNlTW92ZVJlc3VsdCB9IGZyb20gJy4uL3BhcnNlcnMvcGFyc2UtbW92ZSc7XG5pbXBvcnQgeyBTdHJpbmdUYXNrIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgYXNBcnJheSB9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVUYXNrKGZyb206IHN0cmluZyB8IHN0cmluZ1tdLCB0bzogc3RyaW5nKTogU3RyaW5nVGFzazxNb3ZlUmVzdWx0PiB7XG4gICByZXR1cm4ge1xuICAgICAgY29tbWFuZHM6IFsnbXYnLCAnLXYnLCAuLi5hc0FycmF5KGZyb20pLCB0b10sXG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBwYXJzZXI6IHBhcnNlTW92ZVJlc3VsdCxcbiAgIH07XG59XG4iLCAiaW1wb3J0IHsgUHVsbFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuaW1wb3J0IHsgR2l0UmVzcG9uc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9naXQtcmVzcG9uc2UtZXJyb3InO1xuaW1wb3J0IHsgcGFyc2VQdWxsRXJyb3JSZXN1bHQsIHBhcnNlUHVsbFJlc3VsdCB9IGZyb20gJy4uL3BhcnNlcnMvcGFyc2UtcHVsbCc7XG5pbXBvcnQgeyBNYXliZSwgU3RyaW5nVGFzayB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGJ1ZmZlclRvU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcHVsbFRhc2soXG4gICByZW1vdGU6IE1heWJlPHN0cmluZz4sXG4gICBicmFuY2g6IE1heWJlPHN0cmluZz4sXG4gICBjdXN0b21BcmdzOiBzdHJpbmdbXVxuKTogU3RyaW5nVGFzazxQdWxsUmVzdWx0PiB7XG4gICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbJ3B1bGwnLCAuLi5jdXN0b21BcmdzXTtcbiAgIGlmIChyZW1vdGUgJiYgYnJhbmNoKSB7XG4gICAgICBjb21tYW5kcy5zcGxpY2UoMSwgMCwgcmVtb3RlLCBicmFuY2gpO1xuICAgfVxuXG4gICByZXR1cm4ge1xuICAgICAgY29tbWFuZHMsXG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBwYXJzZXIoc3RkT3V0LCBzdGRFcnIpOiBQdWxsUmVzdWx0IHtcbiAgICAgICAgIHJldHVybiBwYXJzZVB1bGxSZXN1bHQoc3RkT3V0LCBzdGRFcnIpO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3IocmVzdWx0LCBfZXJyb3IsIF9kb25lLCBmYWlsKSB7XG4gICAgICAgICBjb25zdCBwdWxsRXJyb3IgPSBwYXJzZVB1bGxFcnJvclJlc3VsdChcbiAgICAgICAgICAgIGJ1ZmZlclRvU3RyaW5nKHJlc3VsdC5zdGRPdXQpLFxuICAgICAgICAgICAgYnVmZmVyVG9TdHJpbmcocmVzdWx0LnN0ZEVycilcbiAgICAgICAgICk7XG4gICAgICAgICBpZiAocHVsbEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChuZXcgR2l0UmVzcG9uc2VFcnJvcihwdWxsRXJyb3IpKTtcbiAgICAgICAgIH1cblxuICAgICAgICAgZmFpbChfZXJyb3IpO1xuICAgICAgfSxcbiAgIH07XG59XG4iLCAiaW1wb3J0IHsgZm9yRWFjaExpbmVXaXRoQ29udGVudCB9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVXaXRob3V0UmVmcyB7XG4gICBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlV2l0aFJlZnMgZXh0ZW5kcyBSZW1vdGVXaXRob3V0UmVmcyB7XG4gICByZWZzOiB7XG4gICAgICBmZXRjaDogc3RyaW5nO1xuICAgICAgcHVzaDogc3RyaW5nO1xuICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR2V0UmVtb3Rlcyh0ZXh0OiBzdHJpbmcpOiBSZW1vdGVXaXRob3V0UmVmc1tdIHtcbiAgIGNvbnN0IHJlbW90ZXM6IHsgW25hbWU6IHN0cmluZ106IFJlbW90ZVdpdGhvdXRSZWZzIH0gPSB7fTtcblxuICAgZm9yRWFjaCh0ZXh0LCAoW25hbWVdKSA9PiAocmVtb3Rlc1tuYW1lXSA9IHsgbmFtZSB9KSk7XG5cbiAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlbW90ZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VHZXRSZW1vdGVzVmVyYm9zZSh0ZXh0OiBzdHJpbmcpOiBSZW1vdGVXaXRoUmVmc1tdIHtcbiAgIGNvbnN0IHJlbW90ZXM6IHsgW25hbWU6IHN0cmluZ106IFJlbW90ZVdpdGhSZWZzIH0gPSB7fTtcblxuICAgZm9yRWFjaCh0ZXh0LCAoW25hbWUsIHVybCwgcHVycG9zZV0pID0+IHtcbiAgICAgIGlmICghcmVtb3Rlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgcmVtb3Rlc1tuYW1lXSA9IHtcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICByZWZzOiB7IGZldGNoOiAnJywgcHVzaDogJycgfSxcbiAgICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChwdXJwb3NlICYmIHVybCkge1xuICAgICAgICAgcmVtb3Rlc1tuYW1lXS5yZWZzW3B1cnBvc2UucmVwbGFjZSgvW15hLXpdL2csICcnKSBhcyBrZXlvZiBSZW1vdGVXaXRoUmVmc1sncmVmcyddXSA9IHVybDtcbiAgICAgIH1cbiAgIH0pO1xuXG4gICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZW1vdGVzKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh0ZXh0OiBzdHJpbmcsIGhhbmRsZXI6IChsaW5lOiBzdHJpbmdbXSkgPT4gdm9pZCkge1xuICAgZm9yRWFjaExpbmVXaXRoQ29udGVudCh0ZXh0LCAobGluZSkgPT4gaGFuZGxlcihsaW5lLnNwbGl0KC9cXHMrLykpKTtcbn1cbiIsICJpbXBvcnQgeyBwYXJzZUdldFJlbW90ZXMsIHBhcnNlR2V0UmVtb3Rlc1ZlcmJvc2UgfSBmcm9tICcuLi9yZXNwb25zZXMvR2V0UmVtb3RlU3VtbWFyeSc7XG5pbXBvcnQgeyBTdHJpbmdUYXNrIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayB9IGZyb20gJy4vdGFzayc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRSZW1vdGVUYXNrKFxuICAgcmVtb3RlTmFtZTogc3RyaW5nLFxuICAgcmVtb3RlUmVwbzogc3RyaW5nLFxuICAgY3VzdG9tQXJnczogc3RyaW5nW10gPSBbXVxuKTogU3RyaW5nVGFzazxzdHJpbmc+IHtcbiAgIHJldHVybiBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKFsncmVtb3RlJywgJ2FkZCcsIC4uLmN1c3RvbUFyZ3MsIHJlbW90ZU5hbWUsIHJlbW90ZVJlcG9dKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlbW90ZXNUYXNrKHZlcmJvc2U6IGJvb2xlYW4pOiBTdHJpbmdUYXNrPGFueT4ge1xuICAgY29uc3QgY29tbWFuZHMgPSBbJ3JlbW90ZSddO1xuICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJy12Jyk7XG4gICB9XG5cbiAgIHJldHVybiB7XG4gICAgICBjb21tYW5kcyxcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIHBhcnNlcjogdmVyYm9zZSA/IHBhcnNlR2V0UmVtb3Rlc1ZlcmJvc2UgOiBwYXJzZUdldFJlbW90ZXMsXG4gICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFJlbW90ZXNUYXNrKGN1c3RvbUFyZ3M6IHN0cmluZ1tdID0gW10pOiBTdHJpbmdUYXNrPHN0cmluZz4ge1xuICAgY29uc3QgY29tbWFuZHMgPSBbLi4uY3VzdG9tQXJnc107XG4gICBpZiAoY29tbWFuZHNbMF0gIT09ICdscy1yZW1vdGUnKSB7XG4gICAgICBjb21tYW5kcy51bnNoaWZ0KCdscy1yZW1vdGUnKTtcbiAgIH1cblxuICAgcmV0dXJuIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3RlVGFzayhjdXN0b21BcmdzOiBzdHJpbmdbXSA9IFtdKTogU3RyaW5nVGFzazxzdHJpbmc+IHtcbiAgIGNvbnN0IGNvbW1hbmRzID0gWy4uLmN1c3RvbUFyZ3NdO1xuICAgaWYgKGNvbW1hbmRzWzBdICE9PSAncmVtb3RlJykge1xuICAgICAgY29tbWFuZHMudW5zaGlmdCgncmVtb3RlJyk7XG4gICB9XG5cbiAgIHJldHVybiBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVJlbW90ZVRhc2socmVtb3RlTmFtZTogc3RyaW5nKSB7XG4gICByZXR1cm4gc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhbJ3JlbW90ZScsICdyZW1vdmUnLCByZW1vdGVOYW1lXSk7XG59XG4iLCAiaW1wb3J0IHsgTG9nT3B0aW9ucywgTG9nUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBsb2dGb3JtYXRGcm9tQ29tbWFuZCB9IGZyb20gJy4uL2FyZ3MvbG9nLWZvcm1hdCc7XG5pbXBvcnQgeyBjcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlciB9IGZyb20gJy4uL3BhcnNlcnMvcGFyc2UtbGlzdC1sb2ctc3VtbWFyeSc7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ1Rhc2sgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUxvZ0Zvcm1hdENvbmZpZyB9IGZyb20gJy4vZGlmZic7XG5pbXBvcnQgeyBwYXJzZUxvZ09wdGlvbnMgfSBmcm9tICcuL2xvZyc7XG5pbXBvcnQgdHlwZSB7IEVtcHR5VGFzayB9IGZyb20gJy4vdGFzayc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFzaExpc3RUYXNrKFxuICAgb3B0OiBMb2dPcHRpb25zID0ge30sXG4gICBjdXN0b21BcmdzOiBzdHJpbmdbXVxuKTogRW1wdHlUYXNrIHwgU3RyaW5nVGFzazxMb2dSZXN1bHQ+IHtcbiAgIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUxvZ09wdGlvbnM8YW55PihvcHQpO1xuICAgY29uc3QgY29tbWFuZHMgPSBbJ3N0YXNoJywgJ2xpc3QnLCAuLi5vcHRpb25zLmNvbW1hbmRzLCAuLi5jdXN0b21BcmdzXTtcbiAgIGNvbnN0IHBhcnNlciA9IGNyZWF0ZUxpc3RMb2dTdW1tYXJ5UGFyc2VyKFxuICAgICAgb3B0aW9ucy5zcGxpdHRlcixcbiAgICAgIG9wdGlvbnMuZmllbGRzLFxuICAgICAgbG9nRm9ybWF0RnJvbUNvbW1hbmQoY29tbWFuZHMpXG4gICApO1xuXG4gICByZXR1cm4gKFxuICAgICAgdmFsaWRhdGVMb2dGb3JtYXRDb25maWcoY29tbWFuZHMpIHx8IHtcbiAgICAgICAgIGNvbW1hbmRzLFxuICAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICAgcGFyc2VyLFxuICAgICAgfVxuICAgKTtcbn1cbiIsICJpbXBvcnQgeyBTdHJpbmdUYXNrIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayB9IGZyb20gJy4vdGFzayc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRTdWJNb2R1bGVUYXNrKHJlcG86IHN0cmluZywgcGF0aDogc3RyaW5nKTogU3RyaW5nVGFzazxzdHJpbmc+IHtcbiAgIHJldHVybiBzdWJNb2R1bGVUYXNrKFsnYWRkJywgcmVwbywgcGF0aF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdFN1Yk1vZHVsZVRhc2soY3VzdG9tQXJnczogc3RyaW5nW10pOiBTdHJpbmdUYXNrPHN0cmluZz4ge1xuICAgcmV0dXJuIHN1Yk1vZHVsZVRhc2soWydpbml0JywgLi4uY3VzdG9tQXJnc10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3ViTW9kdWxlVGFzayhjdXN0b21BcmdzOiBzdHJpbmdbXSk6IFN0cmluZ1Rhc2s8c3RyaW5nPiB7XG4gICBjb25zdCBjb21tYW5kcyA9IFsuLi5jdXN0b21BcmdzXTtcbiAgIGlmIChjb21tYW5kc1swXSAhPT0gJ3N1Ym1vZHVsZScpIHtcbiAgICAgIGNvbW1hbmRzLnVuc2hpZnQoJ3N1Ym1vZHVsZScpO1xuICAgfVxuXG4gICByZXR1cm4gc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhjb21tYW5kcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdWJNb2R1bGVUYXNrKGN1c3RvbUFyZ3M6IHN0cmluZ1tdKTogU3RyaW5nVGFzazxzdHJpbmc+IHtcbiAgIHJldHVybiBzdWJNb2R1bGVUYXNrKFsndXBkYXRlJywgLi4uY3VzdG9tQXJnc10pO1xufVxuIiwgImltcG9ydCB7IFRhZ1Jlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3R5cGluZ3MnO1xuXG5leHBvcnQgY2xhc3MgVGFnTGlzdCBpbXBsZW1lbnRzIFRhZ1Jlc3VsdCB7XG4gICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYWxsOiBzdHJpbmdbXSwgcHVibGljIHJlYWRvbmx5IGxhdGVzdDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7fVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VUYWdMaXN0ID0gZnVuY3Rpb24gKGRhdGE6IHN0cmluZywgY3VzdG9tU29ydCA9IGZhbHNlKSB7XG4gICBjb25zdCB0YWdzID0gZGF0YS5zcGxpdCgnXFxuJykubWFwKHRyaW1tZWQpLmZpbHRlcihCb29sZWFuKTtcblxuICAgaWYgKCFjdXN0b21Tb3J0KSB7XG4gICAgICB0YWdzLnNvcnQoZnVuY3Rpb24gKHRhZ0EsIHRhZ0IpIHtcbiAgICAgICAgIGNvbnN0IHBhcnRzQSA9IHRhZ0Euc3BsaXQoJy4nKTtcbiAgICAgICAgIGNvbnN0IHBhcnRzQiA9IHRhZ0Iuc3BsaXQoJy4nKTtcblxuICAgICAgICAgaWYgKHBhcnRzQS5sZW5ndGggPT09IDEgfHwgcGFydHNCLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVNvcnRlZCh0b051bWJlcihwYXJ0c0FbMF0pLCB0b051bWJlcihwYXJ0c0JbMF0pKTtcbiAgICAgICAgIH1cblxuICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBNYXRoLm1heChwYXJ0c0EubGVuZ3RoLCBwYXJ0c0IubGVuZ3RoKTsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9IHNvcnRlZCh0b051bWJlcihwYXJ0c0FbaV0pLCB0b051bWJlcihwYXJ0c0JbaV0pKTtcblxuICAgICAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfVxuXG4gICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pO1xuICAgfVxuXG4gICBjb25zdCBsYXRlc3QgPSBjdXN0b21Tb3J0ID8gdGFnc1swXSA6IFsuLi50YWdzXS5yZXZlcnNlKCkuZmluZCgodGFnKSA9PiB0YWcuaW5kZXhPZignLicpID49IDApO1xuXG4gICByZXR1cm4gbmV3IFRhZ0xpc3QodGFncywgbGF0ZXN0KTtcbn07XG5cbmZ1bmN0aW9uIHNpbmdsZVNvcnRlZChhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICBjb25zdCBhSXNOdW0gPSBpc05hTihhKTtcbiAgIGNvbnN0IGJJc051bSA9IGlzTmFOKGIpO1xuXG4gICBpZiAoYUlzTnVtICE9PSBiSXNOdW0pIHtcbiAgICAgIHJldHVybiBhSXNOdW0gPyAxIDogLTE7XG4gICB9XG5cbiAgIHJldHVybiBhSXNOdW0gPyBzb3J0ZWQoYSwgYikgOiAwO1xufVxuXG5mdW5jdGlvbiBzb3J0ZWQoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgIHJldHVybiBhID09PSBiID8gMCA6IGEgPiBiID8gMSA6IC0xO1xufVxuXG5mdW5jdGlvbiB0cmltbWVkKGlucHV0OiBzdHJpbmcpIHtcbiAgIHJldHVybiBpbnB1dC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIHRvTnVtYmVyKGlucHV0OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoaW5wdXQucmVwbGFjZSgvXlxcRCsvZywgJycpLCAxMCkgfHwgMDtcbiAgIH1cblxuICAgcmV0dXJuIDA7XG59XG4iLCAiaW1wb3J0IHsgVGFnUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vdHlwaW5ncyc7XG5pbXBvcnQgeyBwYXJzZVRhZ0xpc3QgfSBmcm9tICcuLi9yZXNwb25zZXMvVGFnTGlzdCc7XG5pbXBvcnQgeyBTdHJpbmdUYXNrIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFRhc2sgdXNlZCBieSBgZ2l0LnRhZ3NgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWdMaXN0VGFzayhjdXN0b21BcmdzOiBzdHJpbmdbXSA9IFtdKTogU3RyaW5nVGFzazxUYWdSZXN1bHQ+IHtcbiAgIGNvbnN0IGhhc0N1c3RvbVNvcnQgPSBjdXN0b21BcmdzLnNvbWUoKG9wdGlvbikgPT4gL14tLXNvcnQ9Ly50ZXN0KG9wdGlvbikpO1xuXG4gICByZXR1cm4ge1xuICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgY29tbWFuZHM6IFsndGFnJywgJy1sJywgLi4uY3VzdG9tQXJnc10sXG4gICAgICBwYXJzZXIodGV4dDogc3RyaW5nKSB7XG4gICAgICAgICByZXR1cm4gcGFyc2VUYWdMaXN0KHRleHQsIGhhc0N1c3RvbVNvcnQpO1xuICAgICAgfSxcbiAgIH07XG59XG5cbi8qKlxuICogVGFzayB1c2VkIGJ5IGBnaXQuYWRkVGFnYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkVGFnVGFzayhuYW1lOiBzdHJpbmcpOiBTdHJpbmdUYXNrPHsgbmFtZTogc3RyaW5nIH0+IHtcbiAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBjb21tYW5kczogWyd0YWcnLCBuYW1lXSxcbiAgICAgIHBhcnNlcigpIHtcbiAgICAgICAgIHJldHVybiB7IG5hbWUgfTtcbiAgICAgIH0sXG4gICB9O1xufVxuXG4vKipcbiAqIFRhc2sgdXNlZCBieSBgZ2l0LmFkZFRhZ2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEFubm90YXRlZFRhZ1Rhc2soXG4gICBuYW1lOiBzdHJpbmcsXG4gICB0YWdNZXNzYWdlOiBzdHJpbmdcbik6IFN0cmluZ1Rhc2s8eyBuYW1lOiBzdHJpbmcgfT4ge1xuICAgcmV0dXJuIHtcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIGNvbW1hbmRzOiBbJ3RhZycsICctYScsICctbScsIHRhZ01lc3NhZ2UsIG5hbWVdLFxuICAgICAgcGFyc2VyKCkge1xuICAgICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgICAgfSxcbiAgIH07XG59XG4iLCAiY29uc3QgeyBHaXRFeGVjdXRvciB9ID0gcmVxdWlyZSgnLi9saWIvcnVubmVycy9naXQtZXhlY3V0b3InKTtcbmNvbnN0IHsgU2ltcGxlR2l0QXBpIH0gPSByZXF1aXJlKCcuL2xpYi9zaW1wbGUtZ2l0LWFwaScpO1xuXG5jb25zdCB7IFNjaGVkdWxlciB9ID0gcmVxdWlyZSgnLi9saWIvcnVubmVycy9zY2hlZHVsZXInKTtcbmNvbnN0IHsgY29uZmlndXJhdGlvbkVycm9yVGFzayB9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvdGFzaycpO1xuY29uc3Qge1xuICAgYXNBcnJheSxcbiAgIGZpbHRlckFycmF5LFxuICAgZmlsdGVyUHJpbWl0aXZlcyxcbiAgIGZpbHRlclN0cmluZyxcbiAgIGZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXksXG4gICBmaWx0ZXJUeXBlLFxuICAgZ2V0VHJhaWxpbmdPcHRpb25zLFxuICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50LFxuICAgdHJhaWxpbmdPcHRpb25zQXJndW1lbnQsXG59ID0gcmVxdWlyZSgnLi9saWIvdXRpbHMnKTtcbmNvbnN0IHsgYXBwbHlQYXRjaFRhc2sgfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2FwcGx5LXBhdGNoJyk7XG5jb25zdCB7XG4gICBicmFuY2hUYXNrLFxuICAgYnJhbmNoTG9jYWxUYXNrLFxuICAgZGVsZXRlQnJhbmNoZXNUYXNrLFxuICAgZGVsZXRlQnJhbmNoVGFzayxcbn0gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9icmFuY2gnKTtcbmNvbnN0IHsgY2hlY2tJZ25vcmVUYXNrIH0gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9jaGVjay1pZ25vcmUnKTtcbmNvbnN0IHsgY2hlY2tJc1JlcG9UYXNrIH0gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9jaGVjay1pcy1yZXBvJyk7XG5jb25zdCB7IGNsb25lVGFzaywgY2xvbmVNaXJyb3JUYXNrIH0gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9jbG9uZScpO1xuY29uc3QgeyBjbGVhbldpdGhPcHRpb25zVGFzaywgaXNDbGVhbk9wdGlvbnNBcnJheSB9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvY2xlYW4nKTtcbmNvbnN0IHsgZGlmZlN1bW1hcnlUYXNrIH0gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9kaWZmJyk7XG5jb25zdCB7IGZldGNoVGFzayB9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvZmV0Y2gnKTtcbmNvbnN0IHsgbW92ZVRhc2sgfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL21vdmUnKTtcbmNvbnN0IHsgcHVsbFRhc2sgfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3B1bGwnKTtcbmNvbnN0IHsgcHVzaFRhZ3NUYXNrIH0gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9wdXNoJyk7XG5jb25zdCB7XG4gICBhZGRSZW1vdGVUYXNrLFxuICAgZ2V0UmVtb3Rlc1Rhc2ssXG4gICBsaXN0UmVtb3Rlc1Rhc2ssXG4gICByZW1vdGVUYXNrLFxuICAgcmVtb3ZlUmVtb3RlVGFzayxcbn0gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9yZW1vdGUnKTtcbmNvbnN0IHsgZ2V0UmVzZXRNb2RlLCByZXNldFRhc2sgfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3Jlc2V0Jyk7XG5jb25zdCB7IHN0YXNoTGlzdFRhc2sgfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3N0YXNoLWxpc3QnKTtcbmNvbnN0IHtcbiAgIGFkZFN1Yk1vZHVsZVRhc2ssXG4gICBpbml0U3ViTW9kdWxlVGFzayxcbiAgIHN1Yk1vZHVsZVRhc2ssXG4gICB1cGRhdGVTdWJNb2R1bGVUYXNrLFxufSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3N1Yi1tb2R1bGUnKTtcbmNvbnN0IHsgYWRkQW5ub3RhdGVkVGFnVGFzaywgYWRkVGFnVGFzaywgdGFnTGlzdFRhc2sgfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3RhZycpO1xuY29uc3QgeyBzdHJhaWdodFRocm91Z2hCdWZmZXJUYXNrLCBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrIH0gPSByZXF1aXJlKCcuL2xpYi90YXNrcy90YXNrJyk7XG5cbmZ1bmN0aW9uIEdpdChvcHRpb25zLCBwbHVnaW5zKSB7XG4gICB0aGlzLl9leGVjdXRvciA9IG5ldyBHaXRFeGVjdXRvcihcbiAgICAgIG9wdGlvbnMuYmluYXJ5LFxuICAgICAgb3B0aW9ucy5iYXNlRGlyLFxuICAgICAgbmV3IFNjaGVkdWxlcihvcHRpb25zLm1heENvbmN1cnJlbnRQcm9jZXNzZXMpLFxuICAgICAgcGx1Z2luc1xuICAgKTtcblxuICAgdGhpcy5fdHJpbW1lZCA9IG9wdGlvbnMudHJpbW1lZDtcbn1cblxuKEdpdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNpbXBsZUdpdEFwaS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IEdpdDtcblxuLyoqXG4gKiBTZXRzIHRoZSBwYXRoIHRvIGEgY3VzdG9tIGdpdCBiaW5hcnksIHNob3VsZCBlaXRoZXIgYmUgYGdpdGAgd2hlbiB0aGVyZSBpcyBhbiBpbnN0YWxsYXRpb24gb2YgZ2l0IGF2YWlsYWJsZSBvblxuICogdGhlIHN5c3RlbSBwYXRoLCBvciBhIGZ1bGx5IHF1YWxpZmllZCBwYXRoIHRvIHRoZSBleGVjdXRhYmxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kXG4gKiBAcmV0dXJucyB7R2l0fVxuICovXG5HaXQucHJvdG90eXBlLmN1c3RvbUJpbmFyeSA9IGZ1bmN0aW9uIChjb21tYW5kKSB7XG4gICB0aGlzLl9leGVjdXRvci5iaW5hcnkgPSBjb21tYW5kO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MsIGVpdGhlciBzdXBwbHkgYm90aCBhIG5hbWUgYW5kIHZhbHVlIGFzIHN0cmluZ3Mgb3JcbiAqIGEgc2luZ2xlIG9iamVjdCB0byBlbnRpcmVseSByZXBsYWNlIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdXG4gKiBAcmV0dXJucyB7R2l0fVxuICovXG5HaXQucHJvdG90eXBlLmVudiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLl9leGVjdXRvci5lbnYgPSBuYW1lO1xuICAgfSBlbHNlIHtcbiAgICAgICh0aGlzLl9leGVjdXRvci5lbnYgPSB0aGlzLl9leGVjdXRvci5lbnYgfHwge30pW25hbWVdID0gdmFsdWU7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBMaXN0IHRoZSBzdGFzaChzKSBvZiB0aGUgbG9jYWwgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLnN0YXNoTGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0YXNoTGlzdFRhc2soXG4gICAgICAgICB0cmFpbGluZ09wdGlvbnNBcmd1bWVudChhcmd1bWVudHMpIHx8IHt9LFxuICAgICAgICAgKGZpbHRlckFycmF5KG9wdGlvbnMpICYmIG9wdGlvbnMpIHx8IFtdXG4gICAgICApLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICk7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVDbG9uZVRhc2soYXBpLCB0YXNrLCByZXBvUGF0aCwgbG9jYWxQYXRoKSB7XG4gICBpZiAodHlwZW9mIHJlcG9QYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25FcnJvclRhc2soYGdpdC4ke2FwaX0oKSByZXF1aXJlcyBhIHN0cmluZyAncmVwb1BhdGgnYCk7XG4gICB9XG5cbiAgIHJldHVybiB0YXNrKHJlcG9QYXRoLCBmaWx0ZXJUeXBlKGxvY2FsUGF0aCwgZmlsdGVyU3RyaW5nKSwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpO1xufVxuXG4vKipcbiAqIENsb25lIGEgZ2l0IHJlcG9cbiAqL1xuR2l0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY3JlYXRlQ2xvbmVUYXNrKCdjbG9uZScsIGNsb25lVGFzaywgLi4uYXJndW1lbnRzKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKiBNaXJyb3IgYSBnaXQgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLm1pcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY3JlYXRlQ2xvbmVUYXNrKCdtaXJyb3InLCBjbG9uZU1pcnJvclRhc2ssIC4uLmFyZ3VtZW50cyksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbi8qKlxuICogTW92ZXMgb25lIG9yIG1vcmUgZmlsZXMgdG8gYSBuZXcgZGVzdGluYXRpb24uXG4gKlxuICogQHNlZSBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LW12XG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IGZyb21cbiAqIEBwYXJhbSB7c3RyaW5nfSB0b1xuICovXG5HaXQucHJvdG90eXBlLm12ID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhtb3ZlVGFzayhmcm9tLCB0byksIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbn07XG5cbi8qKlxuICogSW50ZXJuYWxseSB1c2VzIHB1bGwgYW5kIHRhZ3MgdG8gZ2V0IHRoZSBsaXN0IG9mIHRhZ3MgdGhlbiBjaGVja3Mgb3V0IHRoZSBsYXRlc3QgdGFnLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmNoZWNrb3V0TGF0ZXN0VGFnID0gZnVuY3Rpb24gKHRoZW4pIHtcbiAgIHZhciBnaXQgPSB0aGlzO1xuICAgcmV0dXJuIHRoaXMucHVsbChmdW5jdGlvbiAoKSB7XG4gICAgICBnaXQudGFncyhmdW5jdGlvbiAoZXJyLCB0YWdzKSB7XG4gICAgICAgICBnaXQuY2hlY2tvdXQodGFncy5sYXRlc3QsIHRoZW4pO1xuICAgICAgfSk7XG4gICB9KTtcbn07XG5cbi8qKlxuICogUHVsbCB0aGUgdXBkYXRlZCBjb250ZW50cyBvZiB0aGUgY3VycmVudCByZXBvXG4gKi9cbkdpdC5wcm90b3R5cGUucHVsbCA9IGZ1bmN0aW9uIChyZW1vdGUsIGJyYW5jaCwgb3B0aW9ucywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBwdWxsVGFzayhcbiAgICAgICAgIGZpbHRlclR5cGUocmVtb3RlLCBmaWx0ZXJTdHJpbmcpLFxuICAgICAgICAgZmlsdGVyVHlwZShicmFuY2gsIGZpbHRlclN0cmluZyksXG4gICAgICAgICBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKVxuICAgICAgKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKiBGZXRjaCB0aGUgdXBkYXRlZCBjb250ZW50cyBvZiB0aGUgY3VycmVudCByZXBvLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIC5mZXRjaCgndXBzdHJlYW0nLCAnbWFzdGVyJykgLy8gZmV0Y2hlcyBmcm9tIG1hc3RlciBvbiByZW1vdGUgbmFtZWQgdXBzdHJlYW1cbiAqICAgLmZldGNoKGZ1bmN0aW9uICgpIHt9KSAvLyBydW5zIGZldGNoIGFnYWluc3QgZGVmYXVsdCByZW1vdGUgYW5kIGJyYW5jaCBhbmQgY2FsbHMgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JlbW90ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYnJhbmNoXVxuICovXG5HaXQucHJvdG90eXBlLmZldGNoID0gZnVuY3Rpb24gKHJlbW90ZSwgYnJhbmNoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGZldGNoVGFzayhcbiAgICAgICAgIGZpbHRlclR5cGUocmVtb3RlLCBmaWx0ZXJTdHJpbmcpLFxuICAgICAgICAgZmlsdGVyVHlwZShicmFuY2gsIGZpbHRlclN0cmluZyksXG4gICAgICAgICBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKVxuICAgICAgKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKiBEaXNhYmxlcy9lbmFibGVzIHRoZSB1c2Ugb2YgdGhlIGNvbnNvbGUgZm9yIHByaW50aW5nIHdhcm5pbmdzIGFuZCBlcnJvcnMsIGJ5IGRlZmF1bHQgbWVzc2FnZXMgYXJlIG5vdCBzaG93biBpblxuICogYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2lsZW5jZVxuICogQHJldHVybnMge0dpdH1cbiAqL1xuR2l0LnByb3RvdHlwZS5zaWxlbnQgPSBmdW5jdGlvbiAoc2lsZW5jZSkge1xuICAgY29uc29sZS53YXJuKFxuICAgICAgJ3NpbXBsZS1naXQgZGVwcmVjYXRpb24gbm90aWNlOiBnaXQuc2lsZW50OiBsb2dnaW5nIHNob3VsZCBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSBgZGVidWdgIGxpYnJhcnkgLyBgREVCVUdgIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGlzIHdpbGwgYmUgYW4gZXJyb3IgaW4gdmVyc2lvbiAzJ1xuICAgKTtcbiAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBMaXN0IGFsbCB0YWdzLiBXaGVuIHVzaW5nIGdpdCAyLjcuMCBvciBhYm92ZSwgaW5jbHVkZSBhbiBvcHRpb25zIG9iamVjdCB3aXRoIGBcIi0tc29ydFwiOiBcInByb3BlcnR5LW5hbWVcImAgdG9cbiAqIHNvcnQgdGhlIHRhZ3MgYnkgdGhhdCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBkZWZhdWx0IHNlbWFudGljIHZlcnNpb25pbmcgc29ydC5cbiAqXG4gKiBOb3RlLCBzdXBwbHlpbmcgdGhpcyBvcHRpb24gd2hlbiBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHlvdXIgR2l0IHZlcnNpb24gd2lsbCBjYXVzZSB0aGUgb3BlcmF0aW9uIHRvIGZhaWwuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUudGFncyA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHRhZ0xpc3RUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKiBSZWJhc2VzIHRoZSBjdXJyZW50IHdvcmtpbmcgY29weS4gT3B0aW9ucyBjYW4gYmUgc3VwcGxpZWQgZWl0aGVyIGFzIGFuIGFycmF5IG9mIHN0cmluZyBwYXJhbWV0ZXJzXG4gKiB0byBiZSBzZW50IHRvIHRoZSBgZ2l0IHJlYmFzZWAgY29tbWFuZCwgb3IgYSBzdGFuZGFyZCBvcHRpb25zIG9iamVjdC5cbiAqL1xuR2l0LnByb3RvdHlwZS5yZWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydyZWJhc2UnLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKV0pLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICk7XG59O1xuXG4vKipcbiAqIFJlc2V0IGEgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgcmVzZXRUYXNrKGdldFJlc2V0TW9kZShtb2RlKSwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICk7XG59O1xuXG4vKipcbiAqIFJldmVydCBvbmUgb3IgbW9yZSBjb21taXRzIGluIHRoZSBsb2NhbCB3b3JraW5nIGNvcHlcbiAqL1xuR2l0LnByb3RvdHlwZS5yZXZlcnQgPSBmdW5jdGlvbiAoY29tbWl0KSB7XG4gICBjb25zdCBuZXh0ID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyk7XG5cbiAgIGlmICh0eXBlb2YgY29tbWl0ICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soY29uZmlndXJhdGlvbkVycm9yVGFzaygnQ29tbWl0IG11c3QgYmUgYSBzdHJpbmcnKSwgbmV4dCk7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhbJ3JldmVydCcsIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMsIDAsIHRydWUpLCBjb21taXRdKSxcbiAgICAgIG5leHRcbiAgICk7XG59O1xuXG4vKipcbiAqIEFkZCBhIGxpZ2h0d2VpZ2h0IHRhZyB0byB0aGUgaGVhZCBvZiB0aGUgY3VycmVudCBicmFuY2hcbiAqL1xuR2l0LnByb3RvdHlwZS5hZGRUYWcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgY29uc3QgdGFzayA9XG4gICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgID8gYWRkVGFnVGFzayhuYW1lKVxuICAgICAgICAgOiBjb25maWd1cmF0aW9uRXJyb3JUYXNrKCdHaXQuYWRkVGFnIHJlcXVpcmVzIGEgdGFnIG5hbWUnKTtcblxuICAgcmV0dXJuIHRoaXMuX3J1blRhc2sodGFzaywgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBBZGQgYW4gYW5ub3RhdGVkIHRhZyB0byB0aGUgaGVhZCBvZiB0aGUgY3VycmVudCBicmFuY2hcbiAqL1xuR2l0LnByb3RvdHlwZS5hZGRBbm5vdGF0ZWRUYWcgPSBmdW5jdGlvbiAodGFnTmFtZSwgdGFnTWVzc2FnZSkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBhZGRBbm5vdGF0ZWRUYWdUYXNrKHRhZ05hbWUsIHRhZ01lc3NhZ2UpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICk7XG59O1xuXG4vKipcbiAqIERlbGV0ZSBhIGxvY2FsIGJyYW5jaFxuICovXG5HaXQucHJvdG90eXBlLmRlbGV0ZUxvY2FsQnJhbmNoID0gZnVuY3Rpb24gKGJyYW5jaE5hbWUsIGZvcmNlRGVsZXRlLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGRlbGV0ZUJyYW5jaFRhc2soYnJhbmNoTmFtZSwgdHlwZW9mIGZvcmNlRGVsZXRlID09PSAnYm9vbGVhbicgPyBmb3JjZURlbGV0ZSA6IGZhbHNlKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKiBEZWxldGUgb25lIG9yIG1vcmUgbG9jYWwgYnJhbmNoZXNcbiAqL1xuR2l0LnByb3RvdHlwZS5kZWxldGVMb2NhbEJyYW5jaGVzID0gZnVuY3Rpb24gKGJyYW5jaE5hbWVzLCBmb3JjZURlbGV0ZSwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBkZWxldGVCcmFuY2hlc1Rhc2soYnJhbmNoTmFtZXMsIHR5cGVvZiBmb3JjZURlbGV0ZSA9PT0gJ2Jvb2xlYW4nID8gZm9yY2VEZWxldGUgOiBmYWxzZSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbi8qKlxuICogTGlzdCBhbGwgYnJhbmNoZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdCB8IHN0cmluZ1tdfSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmJyYW5jaCA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGJyYW5jaFRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICk7XG59O1xuXG4vKipcbiAqIFJldHVybiBsaXN0IG9mIGxvY2FsIGJyYW5jaGVzXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuYnJhbmNoTG9jYWwgPSBmdW5jdGlvbiAodGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soYnJhbmNoTG9jYWxUYXNrKCksIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZXMgYW55IGNvbW1hbmQgYWdhaW5zdCB0aGUgZ2l0IGJpbmFyeS5cbiAqL1xuR2l0LnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbiAoY29tbWFuZHMpIHtcbiAgIGNvbnN0IGNyZWF0ZVJlc3RDb21tYW5kcyA9ICFBcnJheS5pc0FycmF5KGNvbW1hbmRzKTtcbiAgIGNvbnN0IGNvbW1hbmQgPSBbXS5zbGljZS5jYWxsKGNyZWF0ZVJlc3RDb21tYW5kcyA/IGFyZ3VtZW50cyA6IGNvbW1hbmRzLCAwKTtcblxuICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tYW5kLmxlbmd0aCAmJiBjcmVhdGVSZXN0Q29tbWFuZHM7IGkrKykge1xuICAgICAgaWYgKCFmaWx0ZXJQcmltaXRpdmVzKGNvbW1hbmRbaV0pKSB7XG4gICAgICAgICBjb21tYW5kLnNwbGljZShpLCBjb21tYW5kLmxlbmd0aCAtIGkpO1xuICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICB9XG5cbiAgIGNvbW1hbmQucHVzaCguLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCAwLCB0cnVlKSk7XG5cbiAgIHZhciBuZXh0ID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyk7XG5cbiAgIGlmICghY29tbWFuZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgY29uZmlndXJhdGlvbkVycm9yVGFzaygnUmF3OiBtdXN0IHN1cHBseSBvbmUgb3IgbW9yZSBjb21tYW5kIHRvIGV4ZWN1dGUnKSxcbiAgICAgICAgIG5leHRcbiAgICAgICk7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZCwgdGhpcy5fdHJpbW1lZCksIG5leHQpO1xufTtcblxuR2l0LnByb3RvdHlwZS5zdWJtb2R1bGVBZGQgPSBmdW5jdGlvbiAocmVwbywgcGF0aCwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soYWRkU3ViTW9kdWxlVGFzayhyZXBvLCBwYXRoKSwgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuR2l0LnByb3RvdHlwZS5zdWJtb2R1bGVVcGRhdGUgPSBmdW5jdGlvbiAoYXJncywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICB1cGRhdGVTdWJNb2R1bGVUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMsIHRydWUpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5zdWJtb2R1bGVJbml0ID0gZnVuY3Rpb24gKGFyZ3MsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgaW5pdFN1Yk1vZHVsZVRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgdHJ1ZSkpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICk7XG59O1xuXG5HaXQucHJvdG90eXBlLnN1Yk1vZHVsZSA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN1Yk1vZHVsZVRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICk7XG59O1xuXG5HaXQucHJvdG90eXBlLmxpc3RSZW1vdGUgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGxpc3RSZW1vdGVzVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbi8qKlxuICogQWRkcyBhIHJlbW90ZSB0byB0aGUgbGlzdCBvZiByZW1vdGVzLlxuICovXG5HaXQucHJvdG90eXBlLmFkZFJlbW90ZSA9IGZ1bmN0aW9uIChyZW1vdGVOYW1lLCByZW1vdGVSZXBvLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGFkZFJlbW90ZVRhc2socmVtb3RlTmFtZSwgcmVtb3RlUmVwbywgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICk7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW4gZW50cnkgYnkgbmFtZSBmcm9tIHRoZSBsaXN0IG9mIHJlbW90ZXMuXG4gKi9cbkdpdC5wcm90b3R5cGUucmVtb3ZlUmVtb3RlID0gZnVuY3Rpb24gKHJlbW90ZU5hbWUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHJlbW92ZVJlbW90ZVRhc2socmVtb3RlTmFtZSksIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSByZW1vdGVzLCBzZXR0aW5nIHRoZSBvcHRpb25hbCB2ZXJib3NlIGFyZ3VtZW50IHRvIHRydWUgaW5jbHVkZXMgYWRkaXRpb25hbFxuICogZGV0YWlsIG9uIHRoZSByZW1vdGVzIHRoZW1zZWx2ZXMuXG4gKi9cbkdpdC5wcm90b3R5cGUuZ2V0UmVtb3RlcyA9IGZ1bmN0aW9uICh2ZXJib3NlLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhnZXRSZW1vdGVzVGFzayh2ZXJib3NlID09PSB0cnVlKSwgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBDYWxsIGFueSBgZ2l0IHJlbW90ZWAgZnVuY3Rpb24gd2l0aCBhcmd1bWVudHMgcGFzc2VkIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gb3B0aW9uc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUucmVtb3RlID0gZnVuY3Rpb24gKG9wdGlvbnMsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgcmVtb3RlVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbi8qKlxuICogQ2FsbCBhbnkgYGdpdCB0YWdgIGZ1bmN0aW9uIHdpdGggYXJndW1lbnRzIHBhc3NlZCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IG9wdGlvbnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLnRhZyA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICBjb25zdCBjb21tYW5kID0gZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cyk7XG5cbiAgIGlmIChjb21tYW5kWzBdICE9PSAndGFnJykge1xuICAgICAgY29tbWFuZC51bnNoaWZ0KCd0YWcnKTtcbiAgIH1cblxuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhjb21tYW5kKSwgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBVcGRhdGVzIHJlcG9zaXRvcnkgc2VydmVyIGluZm9cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS51cGRhdGVTZXJ2ZXJJbmZvID0gZnVuY3Rpb24gKHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhbJ3VwZGF0ZS1zZXJ2ZXItaW5mbyddKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKiBQdXNoZXMgdGhlIGN1cnJlbnQgdGFnIGNoYW5nZXMgdG8gYSByZW1vdGUgd2hpY2ggY2FuIGJlIGVpdGhlciBhIFVSTCBvciBuYW1lZCByZW1vdGUuIFdoZW4gbm90IHNwZWNpZmllZCB1c2VzIHRoZVxuICogZGVmYXVsdCBjb25maWd1cmVkIHJlbW90ZSBzcGVjLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcmVtb3RlXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUucHVzaFRhZ3MgPSBmdW5jdGlvbiAocmVtb3RlLCB0aGVuKSB7XG4gICBjb25zdCB0YXNrID0gcHVzaFRhZ3NUYXNrKFxuICAgICAgeyByZW1vdGU6IGZpbHRlclR5cGUocmVtb3RlLCBmaWx0ZXJTdHJpbmcpIH0sXG4gICAgICBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKVxuICAgKTtcblxuICAgcmV0dXJuIHRoaXMuX3J1blRhc2sodGFzaywgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBuYW1lZCBmaWxlcyBmcm9tIHNvdXJjZSBjb250cm9sLlxuICovXG5HaXQucHJvdG90eXBlLnJtID0gZnVuY3Rpb24gKGZpbGVzKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydybScsICctZicsIC4uLmFzQXJyYXkoZmlsZXMpXSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgbmFtZWQgZmlsZXMgZnJvbSBzb3VyY2UgY29udHJvbCBidXQga2VlcHMgdGhlbSBvbiBkaXNrIHJhdGhlciB0aGFuIGRlbGV0aW5nIHRoZW0gZW50aXJlbHkuIFRvXG4gKiBjb21wbGV0ZWx5IHJlbW92ZSB0aGUgZmlsZXMsIHVzZSBgcm1gLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBmaWxlc1xuICovXG5HaXQucHJvdG90eXBlLnJtS2VlcExvY2FsID0gZnVuY3Rpb24gKGZpbGVzKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydybScsICctLWNhY2hlZCcsIC4uLmFzQXJyYXkoZmlsZXMpXSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBpbiBhIHRyZWUgYmFzZWQgb24gY29tbWl0IGhhc2guIFBhc3NpbmcgaW4gYW4gb2JqZWN0IGhhc2ggcmV0dXJucyB0aGUgb2JqZWN0J3MgY29udGVudCxcbiAqIHNpemUsIGFuZCB0eXBlLlxuICpcbiAqIFBhc3NpbmcgXCItcFwiIHdpbGwgaW5zdHJ1Y3QgY2F0LWZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBvYmplY3QgdHlwZSwgYW5kIGRpc3BsYXkgaXRzIGZvcm1hdHRlZCBjb250ZW50cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmNhdEZpbGUgPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX2NhdEZpbGUoJ3V0Zi04JywgYXJndW1lbnRzKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuYmluYXJ5Q2F0RmlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiB0aGlzLl9jYXRGaWxlKCdidWZmZXInLCBhcmd1bWVudHMpO1xufTtcblxuR2l0LnByb3RvdHlwZS5fY2F0RmlsZSA9IGZ1bmN0aW9uIChmb3JtYXQsIGFyZ3MpIHtcbiAgIHZhciBoYW5kbGVyID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3MpO1xuICAgdmFyIGNvbW1hbmQgPSBbJ2NhdC1maWxlJ107XG4gICB2YXIgb3B0aW9ucyA9IGFyZ3NbMF07XG5cbiAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgY29uZmlndXJhdGlvbkVycm9yVGFzaygnR2l0LmNhdEZpbGU6IG9wdGlvbnMgbXVzdCBiZSBzdXBwbGllZCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzJyksXG4gICAgICAgICBoYW5kbGVyXG4gICAgICApO1xuICAgfVxuXG4gICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgY29tbWFuZC5wdXNoLmFwcGx5KGNvbW1hbmQsIG9wdGlvbnMpO1xuICAgfVxuXG4gICBjb25zdCB0YXNrID1cbiAgICAgIGZvcm1hdCA9PT0gJ2J1ZmZlcicgPyBzdHJhaWdodFRocm91Z2hCdWZmZXJUYXNrKGNvbW1hbmQpIDogc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhjb21tYW5kKTtcblxuICAgcmV0dXJuIHRoaXMuX3J1blRhc2sodGFzaywgaGFuZGxlcik7XG59O1xuXG5HaXQucHJvdG90eXBlLmRpZmYgPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgY29uc3QgdGFzayA9IGZpbHRlclN0cmluZyhvcHRpb25zKVxuICAgICAgPyBjb25maWd1cmF0aW9uRXJyb3JUYXNrKFxuICAgICAgICAgICAnZ2l0LmRpZmY6IHN1cHBseWluZyBvcHRpb25zIGFzIGEgc2luZ2xlIHN0cmluZyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLCBzd2l0Y2ggdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncydcbiAgICAgICAgKVxuICAgICAgOiBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKFsnZGlmZicsIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpXSk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHRhc2ssIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuZGlmZlN1bW1hcnkgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGRpZmZTdW1tYXJ5VGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCAxKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuYXBwbHlQYXRjaCA9IGZ1bmN0aW9uIChwYXRjaGVzKSB7XG4gICBjb25zdCB0YXNrID0gIWZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXkocGF0Y2hlcylcbiAgICAgID8gY29uZmlndXJhdGlvbkVycm9yVGFzayhcbiAgICAgICAgICAgYGdpdC5hcHBseVBhdGNoIHJlcXVpcmVzIG9uZSBvciBtb3JlIHN0cmluZyBwYXRjaGVzIGFzIHRoZSBmaXJzdCBhcmd1bWVudGBcbiAgICAgICAgKVxuICAgICAgOiBhcHBseVBhdGNoVGFzayhhc0FycmF5KHBhdGNoZXMpLCBnZXRUcmFpbGluZ09wdGlvbnMoW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHRhc2ssIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbn07XG5cbkdpdC5wcm90b3R5cGUucmV2cGFyc2UgPSBmdW5jdGlvbiAoKSB7XG4gICBjb25zdCBjb21tYW5kcyA9IFsncmV2LXBhcnNlJywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgdHJ1ZSldO1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzLCB0cnVlKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKiBTaG93IHZhcmlvdXMgdHlwZXMgb2Ygb2JqZWN0cywgZm9yIGV4YW1wbGUgdGhlIGZpbGUgYXQgYSBjZXJ0YWluIGNvbW1pdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydzaG93JywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgMSldKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKi9cbkdpdC5wcm90b3R5cGUuY2xlYW4gPSBmdW5jdGlvbiAobW9kZSwgb3B0aW9ucywgdGhlbikge1xuICAgY29uc3QgdXNpbmdDbGVhbk9wdGlvbnNBcnJheSA9IGlzQ2xlYW5PcHRpb25zQXJyYXkobW9kZSk7XG4gICBjb25zdCBjbGVhbk1vZGUgPVxuICAgICAgKHVzaW5nQ2xlYW5PcHRpb25zQXJyYXkgJiYgbW9kZS5qb2luKCcnKSkgfHwgZmlsdGVyVHlwZShtb2RlLCBmaWx0ZXJTdHJpbmcpIHx8ICcnO1xuICAgY29uc3QgY3VzdG9tQXJncyA9IGdldFRyYWlsaW5nT3B0aW9ucyhbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgdXNpbmdDbGVhbk9wdGlvbnNBcnJheSA/IDEgOiAwKSk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY2xlYW5XaXRoT3B0aW9uc1Rhc2soY2xlYW5Nb2RlLCBjdXN0b21BcmdzKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5leGVjID0gZnVuY3Rpb24gKHRoZW4pIHtcbiAgIGNvbnN0IHRhc2sgPSB7XG4gICAgICBjb21tYW5kczogW10sXG4gICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICBwYXJzZXIoKSB7XG4gICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoZW4oKTtcbiAgICAgICAgIH1cbiAgICAgIH0sXG4gICB9O1xuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrKTtcbn07XG5cbi8qKlxuICogQ2xlYXJzIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIGNvbW1hbmRzIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7R2l0fVxuICovXG5HaXQucHJvdG90eXBlLmNsZWFyUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAvLyBUT0RPOlxuICAgLy8gdGhpcy5fZXhlY3V0b3IuY2xlYXIoKTtcbiAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhdGhuYW1lIG9yIHBhdGhuYW1lcyBhcmUgZXhjbHVkZWQgYnkgLmdpdGlnbm9yZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwYXRobmFtZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmNoZWNrSWdub3JlID0gZnVuY3Rpb24gKHBhdGhuYW1lcywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBjaGVja0lnbm9yZVRhc2soYXNBcnJheShmaWx0ZXJUeXBlKHBhdGhuYW1lcywgZmlsdGVyU3RyaW5nT3JTdHJpbmdBcnJheSwgW10pKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuY2hlY2tJc1JlcG8gPSBmdW5jdGlvbiAoY2hlY2tUeXBlLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGNoZWNrSXNSZXBvVGFzayhmaWx0ZXJUeXBlKGNoZWNrVHlwZSwgZmlsdGVyU3RyaW5nKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gR2l0O1xuIiwgImltcG9ydCB7IEdpdEVycm9yIH0gZnJvbSAnLi9naXQtZXJyb3InO1xuaW1wb3J0IHsgU2ltcGxlR2l0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgYEdpdENvbnN0cnVjdEVycm9yYCBpcyB0aHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgaW4gdGhlIGNvbnN0cnVjdG9yXG4gKiBvZiB0aGUgYHNpbXBsZS1naXRgIGluc3RhbmNlIGl0c2VsZi4gTW9zdCBjb21tb25seSBhcyBhIHJlc3VsdCBvZiB1c2luZ1xuICogYSBgYmFzZURpcmAgb3B0aW9uIHRoYXQgcG9pbnRzIHRvIGEgZm9sZGVyIHRoYXQgZWl0aGVyIGRvZXMgbm90IGV4aXN0LFxuICogb3IgY2Fubm90IGJlIHJlYWQgYnkgdGhlIHVzZXIgdGhlIG5vZGUgc2NyaXB0IGlzIHJ1bm5pbmcgYXMuXG4gKlxuICogQ2hlY2sgdGhlIGAubWVzc2FnZWAgcHJvcGVydHkgZm9yIG1vcmUgZGV0YWlsIGluY2x1ZGluZyB0aGUgcHJvcGVydGllc1xuICogcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdENvbnN0cnVjdEVycm9yIGV4dGVuZHMgR2l0RXJyb3Ige1xuICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvbmZpZzogU2ltcGxlR2l0T3B0aW9ucywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICBzdXBlcih1bmRlZmluZWQsIG1lc3NhZ2UpO1xuICAgfVxufVxuIiwgImltcG9ydCB7IEdpdENvbnN0cnVjdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvZ2l0LWNvbnN0cnVjdC1lcnJvcic7XG5pbXBvcnQgeyBHaXRFcnJvciB9IGZyb20gJy4vZXJyb3JzL2dpdC1lcnJvcic7XG5pbXBvcnQgeyBHaXRQbHVnaW5FcnJvciB9IGZyb20gJy4vZXJyb3JzL2dpdC1wbHVnaW4tZXJyb3InO1xuaW1wb3J0IHsgR2l0UmVzcG9uc2VFcnJvciB9IGZyb20gJy4vZXJyb3JzL2dpdC1yZXNwb25zZS1lcnJvcic7XG5pbXBvcnQgeyBUYXNrQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMvdGFzay1jb25maWd1cmF0aW9uLWVycm9yJztcbmltcG9ydCB7IENoZWNrUmVwb0FjdGlvbnMgfSBmcm9tICcuL3Rhc2tzL2NoZWNrLWlzLXJlcG8nO1xuaW1wb3J0IHsgQ2xlYW5PcHRpb25zIH0gZnJvbSAnLi90YXNrcy9jbGVhbic7XG5pbXBvcnQgeyBHaXRDb25maWdTY29wZSB9IGZyb20gJy4vdGFza3MvY29uZmlnJztcbmltcG9ydCB7IGdyZXBRdWVyeUJ1aWxkZXIgfSBmcm9tICcuL3Rhc2tzL2dyZXAnO1xuaW1wb3J0IHsgUmVzZXRNb2RlIH0gZnJvbSAnLi90YXNrcy9yZXNldCc7XG5cbmV4cG9ydCB7XG4gICBDaGVja1JlcG9BY3Rpb25zLFxuICAgQ2xlYW5PcHRpb25zLFxuICAgR2l0Q29uZmlnU2NvcGUsXG4gICBHaXRDb25zdHJ1Y3RFcnJvcixcbiAgIEdpdEVycm9yLFxuICAgR2l0UGx1Z2luRXJyb3IsXG4gICBHaXRSZXNwb25zZUVycm9yLFxuICAgUmVzZXRNb2RlLFxuICAgVGFza0NvbmZpZ3VyYXRpb25FcnJvcixcbiAgIGdyZXBRdWVyeUJ1aWxkZXIsXG59O1xuIiwgImltcG9ydCB7IFNpbXBsZUdpdE9wdGlvbnMsIFNpbXBsZUdpdFRhc2sgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBHaXRFcnJvciB9IGZyb20gJy4vZ2l0LWVycm9yJztcblxuZXhwb3J0IGNsYXNzIEdpdFBsdWdpbkVycm9yIGV4dGVuZHMgR2l0RXJyb3Ige1xuICAgY29uc3RydWN0b3IoXG4gICAgICBwdWJsaWMgdGFzaz86IFNpbXBsZUdpdFRhc2s8YW55PixcbiAgICAgIHB1YmxpYyByZWFkb25seSBwbHVnaW4/OiBrZXlvZiBTaW1wbGVHaXRPcHRpb25zLFxuICAgICAgbWVzc2FnZT86IHN0cmluZ1xuICAgKSB7XG4gICAgICBzdXBlcih0YXNrLCBtZXNzYWdlKTtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBuZXcudGFyZ2V0LnByb3RvdHlwZSk7XG4gICB9XG59XG4iLCAiaW1wb3J0IHsgU2ltcGxlR2l0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFNpbXBsZUdpdFBsdWdpbiB9IGZyb20gJy4vc2ltcGxlLWdpdC1wbHVnaW4nO1xuaW1wb3J0IHsgR2l0UGx1Z2luRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvZ2l0LXBsdWdpbi1lcnJvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBhYm9ydFBsdWdpbihzaWduYWw6IFNpbXBsZUdpdE9wdGlvbnNbJ2Fib3J0J10pIHtcbiAgIGlmICghc2lnbmFsKSB7XG4gICAgICByZXR1cm47XG4gICB9XG5cbiAgIGNvbnN0IG9uU3Bhd25BZnRlcjogU2ltcGxlR2l0UGx1Z2luPCdzcGF3bi5hZnRlcic+ID0ge1xuICAgICAgdHlwZTogJ3NwYXduLmFmdGVyJyxcbiAgICAgIGFjdGlvbihfZGF0YSwgY29udGV4dCkge1xuICAgICAgICAgZnVuY3Rpb24ga2lsbCgpIHtcbiAgICAgICAgICAgIGNvbnRleHQua2lsbChuZXcgR2l0UGx1Z2luRXJyb3IodW5kZWZpbmVkLCAnYWJvcnQnLCAnQWJvcnQgc2lnbmFsIHJlY2VpdmVkJykpO1xuICAgICAgICAgfVxuXG4gICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBraWxsKTtcblxuICAgICAgICAgY29udGV4dC5zcGF3bmVkLm9uKCdjbG9zZScsICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGtpbGwpKTtcbiAgICAgIH0sXG4gICB9O1xuXG4gICBjb25zdCBvblNwYXduQmVmb3JlOiBTaW1wbGVHaXRQbHVnaW48J3NwYXduLmJlZm9yZSc+ID0ge1xuICAgICAgdHlwZTogJ3NwYXduLmJlZm9yZScsXG4gICAgICBhY3Rpb24oX2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgY29udGV4dC5raWxsKG5ldyBHaXRQbHVnaW5FcnJvcih1bmRlZmluZWQsICdhYm9ydCcsICdBYm9ydCBhbHJlYWR5IHNpZ25hbGVkJykpO1xuICAgICAgICAgfVxuICAgICAgfSxcbiAgIH07XG5cbiAgIHJldHVybiBbb25TcGF3bkJlZm9yZSwgb25TcGF3bkFmdGVyXTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNpbXBsZUdpdFBsdWdpbiB9IGZyb20gJy4vc2ltcGxlLWdpdC1wbHVnaW4nO1xuXG5pbXBvcnQgeyBHaXRQbHVnaW5FcnJvciB9IGZyb20gJy4uL2Vycm9ycy9naXQtcGx1Z2luLWVycm9yJztcbmltcG9ydCB0eXBlIHsgU2ltcGxlR2l0UGx1Z2luQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5mdW5jdGlvbiBpc0NvbmZpZ1N3aXRjaChhcmc6IHN0cmluZyB8IHVua25vd24pIHtcbiAgIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyAmJiBhcmcudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICctYyc7XG59XG5cbmZ1bmN0aW9uIHByZXZlbnRQcm90b2NvbE92ZXJyaWRlKGFyZzogc3RyaW5nLCBuZXh0OiBzdHJpbmcpIHtcbiAgIGlmICghaXNDb25maWdTd2l0Y2goYXJnKSkge1xuICAgICAgcmV0dXJuO1xuICAgfVxuXG4gICBpZiAoIS9eXFxzKnByb3RvY29sKC5bYS16XSspPy5hbGxvdy8udGVzdChuZXh0KSkge1xuICAgICAgcmV0dXJuO1xuICAgfVxuXG4gICB0aHJvdyBuZXcgR2l0UGx1Z2luRXJyb3IoXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAndW5zYWZlJyxcbiAgICAgICdDb25maWd1cmluZyBwcm90b2NvbC5hbGxvdyBpcyBub3QgcGVybWl0dGVkIHdpdGhvdXQgZW5hYmxpbmcgYWxsb3dVbnNhZmVFeHRQcm90b2NvbCdcbiAgICk7XG59XG5cbmZ1bmN0aW9uIHByZXZlbnRVcGxvYWRQYWNrKGFyZzogc3RyaW5nLCBtZXRob2Q6IHN0cmluZykge1xuICAgaWYgKC9eXFxzKi0tKHVwbG9hZHxyZWNlaXZlKS1wYWNrLy50ZXN0KGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBHaXRQbHVnaW5FcnJvcihcbiAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICd1bnNhZmUnLFxuICAgICAgICAgYFVzZSBvZiAtLXVwbG9hZC1wYWNrIG9yIC0tcmVjZWl2ZS1wYWNrIGlzIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBlbmFibGluZyBhbGxvd1Vuc2FmZVBhY2tgXG4gICAgICApO1xuICAgfVxuXG4gICBpZiAobWV0aG9kID09PSAnY2xvbmUnICYmIC9eXFxzKi11XFxiLy50ZXN0KGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBHaXRQbHVnaW5FcnJvcihcbiAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICd1bnNhZmUnLFxuICAgICAgICAgYFVzZSBvZiBjbG9uZSB3aXRoIG9wdGlvbiAtdSBpcyBub3QgcGVybWl0dGVkIHdpdGhvdXQgZW5hYmxpbmcgYWxsb3dVbnNhZmVQYWNrYFxuICAgICAgKTtcbiAgIH1cblxuICAgaWYgKG1ldGhvZCA9PT0gJ3B1c2gnICYmIC9eXFxzKi0tZXhlY1xcYi8udGVzdChhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgR2l0UGx1Z2luRXJyb3IoXG4gICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAndW5zYWZlJyxcbiAgICAgICAgIGBVc2Ugb2YgcHVzaCB3aXRoIG9wdGlvbiAtLWV4ZWMgaXMgbm90IHBlcm1pdHRlZCB3aXRob3V0IGVuYWJsaW5nIGFsbG93VW5zYWZlUGFja2BcbiAgICAgICk7XG4gICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBibG9ja1Vuc2FmZU9wZXJhdGlvbnNQbHVnaW4oe1xuICAgYWxsb3dVbnNhZmVQcm90b2NvbE92ZXJyaWRlID0gZmFsc2UsXG4gICBhbGxvd1Vuc2FmZVBhY2sgPSBmYWxzZSxcbn06IFNpbXBsZUdpdFBsdWdpbkNvbmZpZ1sndW5zYWZlJ10gPSB7fSk6IFNpbXBsZUdpdFBsdWdpbjwnc3Bhd24uYXJncyc+IHtcbiAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnc3Bhd24uYXJncycsXG4gICAgICBhY3Rpb24oYXJncywgY29udGV4dCkge1xuICAgICAgICAgYXJncy5mb3JFYWNoKChjdXJyZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IGluZGV4IDwgYXJncy5sZW5ndGggPyBhcmdzW2luZGV4ICsgMV0gOiAnJztcblxuICAgICAgICAgICAgYWxsb3dVbnNhZmVQcm90b2NvbE92ZXJyaWRlIHx8IHByZXZlbnRQcm90b2NvbE92ZXJyaWRlKGN1cnJlbnQsIG5leHQpO1xuICAgICAgICAgICAgYWxsb3dVbnNhZmVQYWNrIHx8IHByZXZlbnRVcGxvYWRQYWNrKGN1cnJlbnQsIGNvbnRleHQubWV0aG9kKTtcbiAgICAgICAgIH0pO1xuXG4gICAgICAgICByZXR1cm4gYXJncztcbiAgICAgIH0sXG4gICB9O1xufVxuIiwgImltcG9ydCB7IHByZWZpeGVkQXJyYXkgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBTaW1wbGVHaXRQbHVnaW4gfSBmcm9tICcuL3NpbXBsZS1naXQtcGx1Z2luJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1hbmRDb25maWdQcmVmaXhpbmdQbHVnaW4oXG4gICBjb25maWd1cmF0aW9uOiBzdHJpbmdbXVxuKTogU2ltcGxlR2l0UGx1Z2luPCdzcGF3bi5hcmdzJz4ge1xuICAgY29uc3QgcHJlZml4ID0gcHJlZml4ZWRBcnJheShjb25maWd1cmF0aW9uLCAnLWMnKTtcblxuICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdzcGF3bi5hcmdzJyxcbiAgICAgIGFjdGlvbihkYXRhKSB7XG4gICAgICAgICByZXR1cm4gWy4uLnByZWZpeCwgLi4uZGF0YV07XG4gICAgICB9LFxuICAgfTtcbn1cbiIsICJpbXBvcnQgeyBkZWZlcnJlZCwgRGVmZXJyZWRQcm9taXNlIH0gZnJvbSAnQGt3c2l0ZXMvcHJvbWlzZS1kZWZlcnJlZCc7XG5pbXBvcnQgeyBTaW1wbGVHaXRQbHVnaW5Db25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFNpbXBsZUdpdFBsdWdpbiB9IGZyb20gJy4vc2ltcGxlLWdpdC1wbHVnaW4nO1xuXG5jb25zdCBuZXZlciA9IGRlZmVycmVkKCkucHJvbWlzZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBsZXRpb25EZXRlY3Rpb25QbHVnaW4oe1xuICAgb25DbG9zZSA9IHRydWUsXG4gICBvbkV4aXQgPSA1MCxcbn06IFNpbXBsZUdpdFBsdWdpbkNvbmZpZ1snY29tcGxldGlvbiddID0ge30pOiBTaW1wbGVHaXRQbHVnaW48J3NwYXduLmFmdGVyJz4ge1xuICAgZnVuY3Rpb24gY3JlYXRlRXZlbnRzKCkge1xuICAgICAgbGV0IGV4aXRDb2RlID0gLTE7XG4gICAgICBjb25zdCBldmVudHMgPSB7XG4gICAgICAgICBjbG9zZTogZGVmZXJyZWQoKSxcbiAgICAgICAgIGNsb3NlVGltZW91dDogZGVmZXJyZWQoKSxcbiAgICAgICAgIGV4aXQ6IGRlZmVycmVkKCksXG4gICAgICAgICBleGl0VGltZW91dDogZGVmZXJyZWQoKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IFByb21pc2UucmFjZShbXG4gICAgICAgICBvbkNsb3NlID09PSBmYWxzZSA/IG5ldmVyIDogZXZlbnRzLmNsb3NlVGltZW91dC5wcm9taXNlLFxuICAgICAgICAgb25FeGl0ID09PSBmYWxzZSA/IG5ldmVyIDogZXZlbnRzLmV4aXRUaW1lb3V0LnByb21pc2UsXG4gICAgICBdKTtcblxuICAgICAgY29uZmlndXJlVGltZW91dChvbkNsb3NlLCBldmVudHMuY2xvc2UsIGV2ZW50cy5jbG9zZVRpbWVvdXQpO1xuICAgICAgY29uZmlndXJlVGltZW91dChvbkV4aXQsIGV2ZW50cy5leGl0LCBldmVudHMuZXhpdFRpbWVvdXQpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAgY2xvc2UoY29kZTogbnVtYmVyKSB7XG4gICAgICAgICAgICBleGl0Q29kZSA9IGNvZGU7XG4gICAgICAgICAgICBldmVudHMuY2xvc2UuZG9uZSgpO1xuICAgICAgICAgfSxcbiAgICAgICAgIGV4aXQoY29kZTogbnVtYmVyKSB7XG4gICAgICAgICAgICBleGl0Q29kZSA9IGNvZGU7XG4gICAgICAgICAgICBldmVudHMuZXhpdC5kb25lKCk7XG4gICAgICAgICB9LFxuICAgICAgICAgZ2V0IGV4aXRDb2RlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgfSxcbiAgICAgICAgIHJlc3VsdCxcbiAgICAgIH07XG4gICB9XG5cbiAgIGZ1bmN0aW9uIGNvbmZpZ3VyZVRpbWVvdXQoXG4gICAgICBmbGFnOiBib29sZWFuIHwgbnVtYmVyLFxuICAgICAgZXZlbnQ6IERlZmVycmVkUHJvbWlzZTx2b2lkPixcbiAgICAgIHRpbWVvdXQ6IERlZmVycmVkUHJvbWlzZTx2b2lkPlxuICAgKSB7XG4gICAgICBpZiAoZmxhZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgKGZsYWcgPT09IHRydWUgPyBldmVudC5wcm9taXNlIDogZXZlbnQucHJvbWlzZS50aGVuKCgpID0+IGRlbGF5KGZsYWcpKSkudGhlbih0aW1lb3V0LmRvbmUpO1xuICAgfVxuXG4gICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3NwYXduLmFmdGVyJyxcbiAgICAgIGFzeW5jIGFjdGlvbihfZGF0YSwgeyBzcGF3bmVkLCBjbG9zZSB9KSB7XG4gICAgICAgICBjb25zdCBldmVudHMgPSBjcmVhdGVFdmVudHMoKTtcblxuICAgICAgICAgbGV0IGRlZmVyQ2xvc2UgPSB0cnVlO1xuICAgICAgICAgbGV0IHF1aWNrQ2xvc2UgPSAoKSA9PiB2b2lkIChkZWZlckNsb3NlID0gZmFsc2UpO1xuXG4gICAgICAgICBzcGF3bmVkLnN0ZG91dD8ub24oJ2RhdGEnLCBxdWlja0Nsb3NlKTtcbiAgICAgICAgIHNwYXduZWQuc3RkZXJyPy5vbignZGF0YScsIHF1aWNrQ2xvc2UpO1xuICAgICAgICAgc3Bhd25lZC5vbignZXJyb3InLCBxdWlja0Nsb3NlKTtcblxuICAgICAgICAgc3Bhd25lZC5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyKSA9PiBldmVudHMuY2xvc2UoY29kZSkpO1xuICAgICAgICAgc3Bhd25lZC5vbignZXhpdCcsIChjb2RlOiBudW1iZXIpID0+IGV2ZW50cy5leGl0KGNvZGUpKTtcblxuICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGV2ZW50cy5yZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZGVmZXJDbG9zZSkge1xuICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xvc2UoZXZlbnRzLmV4aXRDb2RlKTtcbiAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY2xvc2UoZXZlbnRzLmV4aXRDb2RlLCBlcnIgYXMgRXJyb3IpO1xuICAgICAgICAgfVxuICAgICAgfSxcbiAgIH07XG59XG4iLCAiaW1wb3J0IHsgR2l0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvZ2l0LWVycm9yJztcbmltcG9ydCB7IEdpdEV4ZWN1dG9yUmVzdWx0LCBTaW1wbGVHaXRQbHVnaW5Db25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBTaW1wbGVHaXRQbHVnaW4gfSBmcm9tICcuL3NpbXBsZS1naXQtcGx1Z2luJztcblxudHlwZSBUYXNrUmVzdWx0ID0gT21pdDxHaXRFeGVjdXRvclJlc3VsdCwgJ3JlamVjdGlvbic+O1xuXG5mdW5jdGlvbiBpc1Rhc2tFcnJvcihyZXN1bHQ6IFRhc2tSZXN1bHQpIHtcbiAgIHJldHVybiAhIShyZXN1bHQuZXhpdENvZGUgJiYgcmVzdWx0LnN0ZEVyci5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBnZXRFcnJvck1lc3NhZ2UocmVzdWx0OiBUYXNrUmVzdWx0KSB7XG4gICByZXR1cm4gQnVmZmVyLmNvbmNhdChbLi4ucmVzdWx0LnN0ZE91dCwgLi4ucmVzdWx0LnN0ZEVycl0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JEZXRlY3Rpb25IYW5kbGVyKFxuICAgb3ZlcndyaXRlID0gZmFsc2UsXG4gICBpc0Vycm9yID0gaXNUYXNrRXJyb3IsXG4gICBlcnJvck1lc3NhZ2U6IChyZXN1bHQ6IFRhc2tSZXN1bHQpID0+IEJ1ZmZlciB8IEVycm9yID0gZ2V0RXJyb3JNZXNzYWdlXG4pIHtcbiAgIHJldHVybiAoZXJyb3I6IEJ1ZmZlciB8IEVycm9yIHwgdW5kZWZpbmVkLCByZXN1bHQ6IFRhc2tSZXN1bHQpID0+IHtcbiAgICAgIGlmICgoIW92ZXJ3cml0ZSAmJiBlcnJvcikgfHwgIWlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3JNZXNzYWdlKHJlc3VsdCk7XG4gICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JEZXRlY3Rpb25QbHVnaW4oXG4gICBjb25maWc6IFNpbXBsZUdpdFBsdWdpbkNvbmZpZ1snZXJyb3JzJ11cbik6IFNpbXBsZUdpdFBsdWdpbjwndGFzay5lcnJvcic+IHtcbiAgIHJldHVybiB7XG4gICAgICB0eXBlOiAndGFzay5lcnJvcicsXG4gICAgICBhY3Rpb24oZGF0YSwgY29udGV4dCkge1xuICAgICAgICAgY29uc3QgZXJyb3IgPSBjb25maWcoZGF0YS5lcnJvciwge1xuICAgICAgICAgICAgc3RkRXJyOiBjb250ZXh0LnN0ZEVycixcbiAgICAgICAgICAgIHN0ZE91dDogY29udGV4dC5zdGRPdXQsXG4gICAgICAgICAgICBleGl0Q29kZTogY29udGV4dC5leGl0Q29kZSxcbiAgICAgICAgIH0pO1xuXG4gICAgICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG5ldyBHaXRFcnJvcih1bmRlZmluZWQsIGVycm9yLnRvU3RyaW5nKCd1dGYtOCcpKSB9O1xuICAgICAgICAgfVxuXG4gICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICB9O1xuICAgICAgfSxcbiAgIH07XG59XG4iLCAiaW1wb3J0IHsgU2ltcGxlR2l0UGx1Z2luLCBTaW1wbGVHaXRQbHVnaW5UeXBlLCBTaW1wbGVHaXRQbHVnaW5UeXBlcyB9IGZyb20gJy4vc2ltcGxlLWdpdC1wbHVnaW4nO1xuaW1wb3J0IHsgYXBwZW5kLCBhc0FycmF5IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgUGx1Z2luU3RvcmUge1xuICAgcHJpdmF0ZSBwbHVnaW5zOiBTZXQ8U2ltcGxlR2l0UGx1Z2luPFNpbXBsZUdpdFBsdWdpblR5cGU+PiA9IG5ldyBTZXQoKTtcblxuICAgcHVibGljIGFkZDxUIGV4dGVuZHMgU2ltcGxlR2l0UGx1Z2luVHlwZT4oXG4gICAgICBwbHVnaW46IHZvaWQgfCBTaW1wbGVHaXRQbHVnaW48VD4gfCBTaW1wbGVHaXRQbHVnaW48VD5bXVxuICAgKSB7XG4gICAgICBjb25zdCBwbHVnaW5zOiBTaW1wbGVHaXRQbHVnaW48VD5bXSA9IFtdO1xuXG4gICAgICBhc0FycmF5KHBsdWdpbikuZm9yRWFjaCgocGx1Z2luKSA9PiBwbHVnaW4gJiYgdGhpcy5wbHVnaW5zLmFkZChhcHBlbmQocGx1Z2lucywgcGx1Z2luKSkpO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgcGx1Z2lucy5mb3JFYWNoKChwbHVnaW4pID0+IHRoaXMucGx1Z2lucy5kZWxldGUocGx1Z2luKSk7XG4gICAgICB9O1xuICAgfVxuXG4gICBwdWJsaWMgZXhlYzxUIGV4dGVuZHMgU2ltcGxlR2l0UGx1Z2luVHlwZT4oXG4gICAgICB0eXBlOiBULFxuICAgICAgZGF0YTogU2ltcGxlR2l0UGx1Z2luVHlwZXNbVF1bJ2RhdGEnXSxcbiAgICAgIGNvbnRleHQ6IFNpbXBsZUdpdFBsdWdpblR5cGVzW1RdWydjb250ZXh0J11cbiAgICk6IHR5cGVvZiBkYXRhIHtcbiAgICAgIGxldCBvdXRwdXQgPSBkYXRhO1xuICAgICAgY29uc3QgY29udGV4dHVhbCA9IE9iamVjdC5mcmVlemUoT2JqZWN0LmNyZWF0ZShjb250ZXh0KSk7XG5cbiAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucykge1xuICAgICAgICAgaWYgKHBsdWdpbi50eXBlID09PSB0eXBlKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBwbHVnaW4uYWN0aW9uKG91dHB1dCwgY29udGV4dHVhbCk7XG4gICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICB9XG59XG4iLCAiaW1wb3J0IHsgU2ltcGxlR2l0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGFzTnVtYmVyLCBpbmNsdWRpbmcgfSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7IFNpbXBsZUdpdFBsdWdpbiB9IGZyb20gJy4vc2ltcGxlLWdpdC1wbHVnaW4nO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJvZ3Jlc3NNb25pdG9yUGx1Z2luKHByb2dyZXNzOiBFeGNsdWRlPFNpbXBsZUdpdE9wdGlvbnNbJ3Byb2dyZXNzJ10sIHZvaWQ+KSB7XG4gICBjb25zdCBwcm9ncmVzc0NvbW1hbmQgPSAnLS1wcm9ncmVzcyc7XG4gICBjb25zdCBwcm9ncmVzc01ldGhvZHMgPSBbJ2NoZWNrb3V0JywgJ2Nsb25lJywgJ2ZldGNoJywgJ3B1bGwnLCAncHVzaCddO1xuXG4gICBjb25zdCBvblByb2dyZXNzOiBTaW1wbGVHaXRQbHVnaW48J3NwYXduLmFmdGVyJz4gPSB7XG4gICAgICB0eXBlOiAnc3Bhd24uYWZ0ZXInLFxuICAgICAgYWN0aW9uKF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgICBpZiAoIWNvbnRleHQuY29tbWFuZHMuaW5jbHVkZXMocHJvZ3Jlc3NDb21tYW5kKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgfVxuXG4gICAgICAgICBjb250ZXh0LnNwYXduZWQuc3RkZXJyPy5vbignZGF0YScsIChjaHVuazogQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gL14oW1xcc1xcU10rPyk6XFxzKihcXGQrKSUgXFwoKFxcZCspXFwvKFxcZCspXFwpLy5leGVjKGNodW5rLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgICAgICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb2dyZXNzKHtcbiAgICAgICAgICAgICAgIG1ldGhvZDogY29udGV4dC5tZXRob2QsXG4gICAgICAgICAgICAgICBzdGFnZTogcHJvZ3Jlc3NFdmVudFN0YWdlKG1lc3NhZ2VbMV0pLFxuICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IGFzTnVtYmVyKG1lc3NhZ2VbMl0pLFxuICAgICAgICAgICAgICAgcHJvY2Vzc2VkOiBhc051bWJlcihtZXNzYWdlWzNdKSxcbiAgICAgICAgICAgICAgIHRvdGFsOiBhc051bWJlcihtZXNzYWdlWzRdKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgfSk7XG4gICAgICB9LFxuICAgfTtcblxuICAgY29uc3Qgb25BcmdzOiBTaW1wbGVHaXRQbHVnaW48J3NwYXduLmFyZ3MnPiA9IHtcbiAgICAgIHR5cGU6ICdzcGF3bi5hcmdzJyxcbiAgICAgIGFjdGlvbihhcmdzLCBjb250ZXh0KSB7XG4gICAgICAgICBpZiAoIXByb2dyZXNzTWV0aG9kcy5pbmNsdWRlcyhjb250ZXh0Lm1ldGhvZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgICAgfVxuXG4gICAgICAgICByZXR1cm4gaW5jbHVkaW5nKGFyZ3MsIHByb2dyZXNzQ29tbWFuZCk7XG4gICAgICB9LFxuICAgfTtcblxuICAgcmV0dXJuIFtvbkFyZ3MsIG9uUHJvZ3Jlc3NdO1xufVxuXG5mdW5jdGlvbiBwcm9ncmVzc0V2ZW50U3RhZ2UoaW5wdXQ6IHN0cmluZykge1xuICAgcmV0dXJuIFN0cmluZyhpbnB1dC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcgJywgMSkpIHx8ICd1bmtub3duJztcbn1cbiIsICJpbXBvcnQgeyBTcGF3bk9wdGlvbnMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHBpY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBTaW1wbGVHaXRQbHVnaW4gfSBmcm9tICcuL3NpbXBsZS1naXQtcGx1Z2luJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduT3B0aW9uc1BsdWdpbihcbiAgIHNwYXduT3B0aW9uczogUGFydGlhbDxTcGF3bk9wdGlvbnM+XG4pOiBTaW1wbGVHaXRQbHVnaW48J3NwYXduLm9wdGlvbnMnPiB7XG4gICBjb25zdCBvcHRpb25zID0gcGljayhzcGF3bk9wdGlvbnMsIFsndWlkJywgJ2dpZCddKTtcblxuICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdzcGF3bi5vcHRpb25zJyxcbiAgICAgIGFjdGlvbihkYXRhKSB7XG4gICAgICAgICByZXR1cm4geyAuLi5vcHRpb25zLCAuLi5kYXRhIH07XG4gICAgICB9LFxuICAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNpbXBsZUdpdFBsdWdpbiB9IGZyb20gJy4vc2ltcGxlLWdpdC1wbHVnaW4nO1xuXG5pbXBvcnQgdHlwZSB7IFNpbXBsZUdpdE9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBHaXRQbHVnaW5FcnJvciB9IGZyb20gJy4uL2Vycm9ycy9naXQtcGx1Z2luLWVycm9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVvdXRQbHVnaW4oe1xuICAgYmxvY2ssXG4gICBzdGRFcnIgPSB0cnVlLFxuICAgc3RkT3V0ID0gdHJ1ZSxcbn06IEV4Y2x1ZGU8U2ltcGxlR2l0T3B0aW9uc1sndGltZW91dCddLCB1bmRlZmluZWQ+KTogU2ltcGxlR2l0UGx1Z2luPCdzcGF3bi5hZnRlcic+IHwgdm9pZCB7XG4gICBpZiAoYmxvY2sgPiAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAgdHlwZTogJ3NwYXduLmFmdGVyJyxcbiAgICAgICAgIGFjdGlvbihfZGF0YSwgY29udGV4dCkge1xuICAgICAgICAgICAgbGV0IHRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xuXG4gICAgICAgICAgICBmdW5jdGlvbiB3YWl0KCkge1xuICAgICAgICAgICAgICAgdGltZW91dCAmJiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChraWxsLCBibG9jayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICAgICAgICAgICBjb250ZXh0LnNwYXduZWQuc3Rkb3V0Py5vZmYoJ2RhdGEnLCB3YWl0KTtcbiAgICAgICAgICAgICAgIGNvbnRleHQuc3Bhd25lZC5zdGRlcnI/Lm9mZignZGF0YScsIHdhaXQpO1xuICAgICAgICAgICAgICAgY29udGV4dC5zcGF3bmVkLm9mZignZXhpdCcsIHN0b3ApO1xuICAgICAgICAgICAgICAgY29udGV4dC5zcGF3bmVkLm9mZignY2xvc2UnLCBzdG9wKTtcbiAgICAgICAgICAgICAgIHRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBraWxsKCkge1xuICAgICAgICAgICAgICAgc3RvcCgpO1xuICAgICAgICAgICAgICAgY29udGV4dC5raWxsKG5ldyBHaXRQbHVnaW5FcnJvcih1bmRlZmluZWQsICd0aW1lb3V0JywgYGJsb2NrIHRpbWVvdXQgcmVhY2hlZGApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RkT3V0ICYmIGNvbnRleHQuc3Bhd25lZC5zdGRvdXQ/Lm9uKCdkYXRhJywgd2FpdCk7XG4gICAgICAgICAgICBzdGRFcnIgJiYgY29udGV4dC5zcGF3bmVkLnN0ZGVycj8ub24oJ2RhdGEnLCB3YWl0KTtcbiAgICAgICAgICAgIGNvbnRleHQuc3Bhd25lZC5vbignZXhpdCcsIHN0b3ApO1xuICAgICAgICAgICAgY29udGV4dC5zcGF3bmVkLm9uKCdjbG9zZScsIHN0b3ApO1xuXG4gICAgICAgICAgICB3YWl0KCk7XG4gICAgICAgICB9LFxuICAgICAgfTtcbiAgIH1cbn1cbiIsICJpbXBvcnQgeyBTaW1wbGVHaXRGYWN0b3J5IH0gZnJvbSAnLi4vLi4vdHlwaW5ncyc7XG5cbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuL2FwaSc7XG5pbXBvcnQge1xuICAgYWJvcnRQbHVnaW4sXG4gICBibG9ja1Vuc2FmZU9wZXJhdGlvbnNQbHVnaW4sXG4gICBjb21tYW5kQ29uZmlnUHJlZml4aW5nUGx1Z2luLFxuICAgY29tcGxldGlvbkRldGVjdGlvblBsdWdpbixcbiAgIGVycm9yRGV0ZWN0aW9uSGFuZGxlcixcbiAgIGVycm9yRGV0ZWN0aW9uUGx1Z2luLFxuICAgUGx1Z2luU3RvcmUsXG4gICBwcm9ncmVzc01vbml0b3JQbHVnaW4sXG4gICBzcGF3bk9wdGlvbnNQbHVnaW4sXG4gICB0aW1lb3V0UGx1Z2luLFxufSBmcm9tICcuL3BsdWdpbnMnO1xuaW1wb3J0IHsgY3JlYXRlSW5zdGFuY2VDb25maWcsIGZvbGRlckV4aXN0cyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU2ltcGxlR2l0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBHaXQgPSByZXF1aXJlKCcuLi9naXQnKTtcblxuLyoqXG4gKiBBZGRzIHRoZSBuZWNlc3NhcnkgcHJvcGVydGllcyB0byB0aGUgc3VwcGxpZWQgb2JqZWN0IHRvIGVuYWJsZSBpdCBmb3IgdXNlIGFzXG4gKiB0aGUgZGVmYXVsdCBleHBvcnQgb2YgYSBtb2R1bGUuXG4gKlxuICogRWc6IGBtb2R1bGUuZXhwb3J0cyA9IGVzTW9kdWxlRmFjdG9yeSh7IHNvbWV0aGluZyAoKSB7fSB9KWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzTW9kdWxlRmFjdG9yeTxUPihkZWZhdWx0RXhwb3J0OiBUKSB7XG4gICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGVmYXVsdEV4cG9ydCwge1xuICAgICAgX19lc01vZHVsZTogeyB2YWx1ZTogdHJ1ZSB9LFxuICAgICAgZGVmYXVsdDogeyB2YWx1ZTogZGVmYXVsdEV4cG9ydCB9LFxuICAgfSkgYXMgVCAmIHsgX19lc01vZHVsZTogdHJ1ZTsgZGVmYXVsdDogVCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2l0RXhwb3J0RmFjdG9yeShmYWN0b3J5OiBTaW1wbGVHaXRGYWN0b3J5KSB7XG4gICByZXR1cm4gT2JqZWN0LmFzc2lnbihmYWN0b3J5LmJpbmQobnVsbCksIGFwaSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnaXRJbnN0YW5jZUZhY3RvcnkoXG4gICBiYXNlRGlyPzogc3RyaW5nIHwgUGFydGlhbDxTaW1wbGVHaXRPcHRpb25zPixcbiAgIG9wdGlvbnM/OiBQYXJ0aWFsPFNpbXBsZUdpdE9wdGlvbnM+XG4pIHtcbiAgIGNvbnN0IHBsdWdpbnMgPSBuZXcgUGx1Z2luU3RvcmUoKTtcbiAgIGNvbnN0IGNvbmZpZyA9IGNyZWF0ZUluc3RhbmNlQ29uZmlnKFxuICAgICAgKGJhc2VEaXIgJiYgKHR5cGVvZiBiYXNlRGlyID09PSAnc3RyaW5nJyA/IHsgYmFzZURpciB9IDogYmFzZURpcikpIHx8IHt9LFxuICAgICAgb3B0aW9uc1xuICAgKTtcblxuICAgaWYgKCFmb2xkZXJFeGlzdHMoY29uZmlnLmJhc2VEaXIpKSB7XG4gICAgICB0aHJvdyBuZXcgYXBpLkdpdENvbnN0cnVjdEVycm9yKFxuICAgICAgICAgY29uZmlnLFxuICAgICAgICAgYENhbm5vdCB1c2Ugc2ltcGxlLWdpdCBvbiBhIGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0YFxuICAgICAgKTtcbiAgIH1cblxuICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLmNvbmZpZykpIHtcbiAgICAgIHBsdWdpbnMuYWRkKGNvbW1hbmRDb25maWdQcmVmaXhpbmdQbHVnaW4oY29uZmlnLmNvbmZpZykpO1xuICAgfVxuXG4gICBwbHVnaW5zLmFkZChibG9ja1Vuc2FmZU9wZXJhdGlvbnNQbHVnaW4oY29uZmlnLnVuc2FmZSkpO1xuICAgcGx1Z2lucy5hZGQoY29tcGxldGlvbkRldGVjdGlvblBsdWdpbihjb25maWcuY29tcGxldGlvbikpO1xuICAgY29uZmlnLmFib3J0ICYmIHBsdWdpbnMuYWRkKGFib3J0UGx1Z2luKGNvbmZpZy5hYm9ydCkpO1xuICAgY29uZmlnLnByb2dyZXNzICYmIHBsdWdpbnMuYWRkKHByb2dyZXNzTW9uaXRvclBsdWdpbihjb25maWcucHJvZ3Jlc3MpKTtcbiAgIGNvbmZpZy50aW1lb3V0ICYmIHBsdWdpbnMuYWRkKHRpbWVvdXRQbHVnaW4oY29uZmlnLnRpbWVvdXQpKTtcbiAgIGNvbmZpZy5zcGF3bk9wdGlvbnMgJiYgcGx1Z2lucy5hZGQoc3Bhd25PcHRpb25zUGx1Z2luKGNvbmZpZy5zcGF3bk9wdGlvbnMpKTtcblxuICAgcGx1Z2lucy5hZGQoZXJyb3JEZXRlY3Rpb25QbHVnaW4oZXJyb3JEZXRlY3Rpb25IYW5kbGVyKHRydWUpKSk7XG4gICBjb25maWcuZXJyb3JzICYmIHBsdWdpbnMuYWRkKGVycm9yRGV0ZWN0aW9uUGx1Z2luKGNvbmZpZy5lcnJvcnMpKTtcblxuICAgcmV0dXJuIG5ldyBHaXQoY29uZmlnLCBwbHVnaW5zKTtcbn1cbiIsICJpbXBvcnQgeyBTaW1wbGVHaXQsIFNpbXBsZUdpdE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi90eXBpbmdzJztcblxuaW1wb3J0IHsgR2l0UmVzcG9uc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9naXQtcmVzcG9uc2UtZXJyb3InO1xuaW1wb3J0IHsgZ2l0SW5zdGFuY2VGYWN0b3J5IH0gZnJvbSAnLi4vZ2l0LWZhY3RvcnknO1xuaW1wb3J0IHsgU2ltcGxlR2l0VGFza0NhbGxiYWNrIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBmdW5jdGlvbk5hbWVzQnVpbGRlckFwaSA9IFsnY3VzdG9tQmluYXJ5JywgJ2VudicsICdvdXRwdXRIYW5kbGVyJywgJ3NpbGVudCddO1xuXG5jb25zdCBmdW5jdGlvbk5hbWVzUHJvbWlzZUFwaSA9IFtcbiAgICdhZGQnLFxuICAgJ2FkZEFubm90YXRlZFRhZycsXG4gICAnYWRkQ29uZmlnJyxcbiAgICdhZGRSZW1vdGUnLFxuICAgJ2FkZFRhZycsXG4gICAnYXBwbHlQYXRjaCcsXG4gICAnYmluYXJ5Q2F0RmlsZScsXG4gICAnYnJhbmNoJyxcbiAgICdicmFuY2hMb2NhbCcsXG4gICAnY2F0RmlsZScsXG4gICAnY2hlY2tJZ25vcmUnLFxuICAgJ2NoZWNrSXNSZXBvJyxcbiAgICdjaGVja291dCcsXG4gICAnY2hlY2tvdXRCcmFuY2gnLFxuICAgJ2NoZWNrb3V0TGF0ZXN0VGFnJyxcbiAgICdjaGVja291dExvY2FsQnJhbmNoJyxcbiAgICdjbGVhbicsXG4gICAnY2xvbmUnLFxuICAgJ2NvbW1pdCcsXG4gICAnY3dkJyxcbiAgICdkZWxldGVMb2NhbEJyYW5jaCcsXG4gICAnZGVsZXRlTG9jYWxCcmFuY2hlcycsXG4gICAnZGlmZicsXG4gICAnZGlmZlN1bW1hcnknLFxuICAgJ2V4ZWMnLFxuICAgJ2ZldGNoJyxcbiAgICdnZXRSZW1vdGVzJyxcbiAgICdpbml0JyxcbiAgICdsaXN0Q29uZmlnJyxcbiAgICdsaXN0UmVtb3RlJyxcbiAgICdsb2cnLFxuICAgJ21lcmdlJyxcbiAgICdtZXJnZUZyb21UbycsXG4gICAnbWlycm9yJyxcbiAgICdtdicsXG4gICAncHVsbCcsXG4gICAncHVzaCcsXG4gICAncHVzaFRhZ3MnLFxuICAgJ3JhdycsXG4gICAncmViYXNlJyxcbiAgICdyZW1vdGUnLFxuICAgJ3JlbW92ZVJlbW90ZScsXG4gICAncmVzZXQnLFxuICAgJ3JldmVydCcsXG4gICAncmV2cGFyc2UnLFxuICAgJ3JtJyxcbiAgICdybUtlZXBMb2NhbCcsXG4gICAnc2hvdycsXG4gICAnc3Rhc2gnLFxuICAgJ3N0YXNoTGlzdCcsXG4gICAnc3RhdHVzJyxcbiAgICdzdWJNb2R1bGUnLFxuICAgJ3N1Ym1vZHVsZUFkZCcsXG4gICAnc3VibW9kdWxlSW5pdCcsXG4gICAnc3VibW9kdWxlVXBkYXRlJyxcbiAgICd0YWcnLFxuICAgJ3RhZ3MnLFxuICAgJ3VwZGF0ZVNlcnZlckluZm8nLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdpdFAoXG4gICAuLi5hcmdzOiBbXSB8IFtzdHJpbmddIHwgW1BhcnRpYWw8U2ltcGxlR2l0T3B0aW9ucz5dIHwgW3N0cmluZywgUGFydGlhbDxTaW1wbGVHaXRPcHRpb25zPl1cbik6IFNpbXBsZUdpdCB7XG4gICBsZXQgZ2l0OiBhbnk7XG5cbiAgIGxldCBjaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICB0cnkge1xuICAgICAgZ2l0ID0gZ2l0SW5zdGFuY2VGYWN0b3J5KC4uLmFyZ3MpO1xuICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2hhaW4gPSBQcm9taXNlLnJlamVjdChlKTtcbiAgIH1cblxuICAgZnVuY3Rpb24gYnVpbGRlclJldHVybigpIHtcbiAgICAgIHJldHVybiBwcm9taXNlQXBpO1xuICAgfVxuXG4gICBmdW5jdGlvbiBjaGFpblJldHVybigpIHtcbiAgICAgIHJldHVybiBjaGFpbjtcbiAgIH1cblxuICAgY29uc3QgcHJvbWlzZUFwaSA9IFsuLi5mdW5jdGlvbk5hbWVzQnVpbGRlckFwaSwgLi4uZnVuY3Rpb25OYW1lc1Byb21pc2VBcGldLnJlZHVjZShcbiAgICAgIChhcGk6IGFueSwgbmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICBjb25zdCBpc0FzeW5jID0gZnVuY3Rpb25OYW1lc1Byb21pc2VBcGkuaW5jbHVkZXMobmFtZSk7XG5cbiAgICAgICAgIGNvbnN0IHZhbGlkID0gaXNBc3luYyA/IGFzeW5jV3JhcHBlcihuYW1lLCBnaXQpIDogc3luY1dyYXBwZXIobmFtZSwgZ2l0LCBhcGkpO1xuICAgICAgICAgY29uc3QgYWx0ZXJuYXRpdmUgPSBpc0FzeW5jID8gY2hhaW5SZXR1cm4gOiBidWlsZGVyUmV0dXJuO1xuXG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBpLCBuYW1lLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogZ2l0ID8gdmFsaWQgOiBhbHRlcm5hdGl2ZSxcbiAgICAgICAgIH0pO1xuXG4gICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICApO1xuXG4gICByZXR1cm4gcHJvbWlzZUFwaSBhcyBTaW1wbGVHaXQ7XG5cbiAgIGZ1bmN0aW9uIGFzeW5jV3JhcHBlcihmbjogc3RyaW5nLCBnaXQ6IGFueSk6ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAnUHJvbWlzZSBpbnRlcmZhY2UgcmVxdWlyZXMgdGhhdCBoYW5kbGVycyBhcmUgbm90IHN1cHBsaWVkIGlubGluZSwgJyArXG4gICAgICAgICAgICAgICAgICAndHJhaWxpbmcgZnVuY3Rpb24gbm90IGFsbG93ZWQgaW4gY2FsbCB0byAnICtcbiAgICAgICAgICAgICAgICAgIGZuXG4gICAgICAgICAgICApO1xuICAgICAgICAgfVxuXG4gICAgICAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2s6IFNpbXBsZUdpdFRhc2tDYWxsYmFjayA9IChlcnI6IEVycm9yIHwgbnVsbCwgcmVzdWx0PzogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KHRvRXJyb3IoZXJyKSk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICBhcmdzLnB1c2goY2FsbGJhY2spO1xuXG4gICAgICAgICAgICAgICBnaXRbZm5dLmFwcGx5KGdpdCwgYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgIH1cblxuICAgZnVuY3Rpb24gc3luY1dyYXBwZXIoZm46IHN0cmluZywgZ2l0OiBhbnksIGFwaTogU2ltcGxlR2l0KSB7XG4gICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICBnaXRbZm5dKC4uLmFyZ3MpO1xuXG4gICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfTtcbiAgIH1cbn1cblxuZnVuY3Rpb24gdG9FcnJvcihlcnJvcjogRXJyb3IgfCBzdHJpbmcgfCBhbnkpOiBFcnJvciB7XG4gICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgfVxuXG4gICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihlcnJvcik7XG4gICB9XG5cbiAgIHJldHVybiBuZXcgR2l0UmVzcG9uc2VFcnJvcihlcnJvcik7XG59XG4iLCAiaW1wb3J0IHsgZ2l0SW5zdGFuY2VGYWN0b3J5IH0gZnJvbSAnLi9saWIvZ2l0LWZhY3RvcnknO1xuXG5leHBvcnQgeyBnaXRQIH0gZnJvbSAnLi9saWIvcnVubmVycy9wcm9taXNlLXdyYXBwZWQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYXBpJztcblxuZXhwb3J0IGNvbnN0IHNpbXBsZUdpdCA9IGdpdEluc3RhbmNlRmFjdG9yeTtcblxuZXhwb3J0IGRlZmF1bHQgZ2l0SW5zdGFuY2VGYWN0b3J5O1xuIiwgImltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBPYnNpZGlhbkdpdFNldHRpbmdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCBjb25zdCBEQVRFX0ZPUk1BVCA9IFwiWVlZWS1NTS1ERFwiO1xuZXhwb3J0IGNvbnN0IERBVEVfVElNRV9GT1JNQVRfTUlOVVRFUyA9IGAke0RBVEVfRk9STUFUfSBISDptbWA7XG5leHBvcnQgY29uc3QgREFURV9USU1FX0ZPUk1BVF9TRUNPTkRTID0gYCR7REFURV9GT1JNQVR9IEhIOm1tOnNzYDtcblxuZXhwb3J0IGNvbnN0IEdJVF9MSU5FX0FVVEhPUklOR19NT1ZFTUVOVF9ERVRFQ1RJT05fTUlOSU1BTF9MRU5HVEggPSA0MDtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IE9taXQ8T2JzaWRpYW5HaXRTZXR0aW5ncywgXCJhdXRvQ29tbWl0TWVzc2FnZVwiPiA9XG4gICAge1xuICAgICAgICBjb21taXRNZXNzYWdlOiBcInZhdWx0IGJhY2t1cDoge3tkYXRlfX1cIixcbiAgICAgICAgY29tbWl0RGF0ZUZvcm1hdDogREFURV9USU1FX0ZPUk1BVF9TRUNPTkRTLFxuICAgICAgICBhdXRvU2F2ZUludGVydmFsOiAwLFxuICAgICAgICBhdXRvUHVzaEludGVydmFsOiAwLFxuICAgICAgICBhdXRvUHVsbEludGVydmFsOiAwLFxuICAgICAgICBhdXRvUHVsbE9uQm9vdDogZmFsc2UsXG4gICAgICAgIGRpc2FibGVQdXNoOiBmYWxzZSxcbiAgICAgICAgcHVsbEJlZm9yZVB1c2g6IHRydWUsXG4gICAgICAgIGRpc2FibGVQb3B1cHM6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlUG9wdXBzRm9yTm9DaGFuZ2VzOiBmYWxzZSxcbiAgICAgICAgbGlzdENoYW5nZWRGaWxlc0luTWVzc2FnZUJvZHk6IGZhbHNlLFxuICAgICAgICBzaG93U3RhdHVzQmFyOiB0cnVlLFxuICAgICAgICB1cGRhdGVTdWJtb2R1bGVzOiBmYWxzZSxcbiAgICAgICAgc3luY01ldGhvZDogXCJtZXJnZVwiLFxuICAgICAgICBjdXN0b21NZXNzYWdlT25BdXRvQmFja3VwOiBmYWxzZSxcbiAgICAgICAgYXV0b0JhY2t1cEFmdGVyRmlsZUNoYW5nZTogZmFsc2UsXG4gICAgICAgIHRyZWVTdHJ1Y3R1cmU6IGZhbHNlLFxuICAgICAgICByZWZyZXNoU291cmNlQ29udHJvbDogUGxhdGZvcm0uaXNEZXNrdG9wQXBwLFxuICAgICAgICBiYXNlUGF0aDogXCJcIixcbiAgICAgICAgZGlmZmVyZW50SW50ZXJ2YWxDb21taXRBbmRQdXNoOiBmYWxzZSxcbiAgICAgICAgY2hhbmdlZEZpbGVzSW5TdGF0dXNCYXI6IGZhbHNlLFxuICAgICAgICBzaG93ZWRNb2JpbGVOb3RpY2U6IGZhbHNlLFxuICAgICAgICByZWZyZXNoU291cmNlQ29udHJvbFRpbWVyOiA3MDAwLFxuICAgICAgICBzaG93QnJhbmNoU3RhdHVzQmFyOiB0cnVlLFxuICAgICAgICBzZXRMYXN0U2F2ZVRvTGFzdENvbW1pdDogZmFsc2UsXG4gICAgICAgIHN1Ym1vZHVsZVJlY3Vyc2VDaGVja291dDogZmFsc2UsXG4gICAgICAgIGdpdERpcjogXCJcIixcbiAgICAgICAgc2hvd0ZpbGVNZW51OiB0cnVlLFxuICAgICAgICBhdXRob3JJbkhpc3RvcnlWaWV3OiBcImhpZGVcIixcbiAgICAgICAgZGF0ZUluSGlzdG9yeVZpZXc6IGZhbHNlLFxuICAgICAgICBsaW5lQXV0aG9yOiB7XG4gICAgICAgICAgICBzaG93OiBmYWxzZSxcbiAgICAgICAgICAgIGZvbGxvd01vdmVtZW50OiBcImluYWN0aXZlXCIsXG4gICAgICAgICAgICBhdXRob3JEaXNwbGF5OiBcImluaXRpYWxzXCIsXG4gICAgICAgICAgICBzaG93Q29tbWl0SGFzaDogZmFsc2UsXG4gICAgICAgICAgICBkYXRlVGltZUZvcm1hdE9wdGlvbnM6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgZGF0ZVRpbWVGb3JtYXRDdXN0b21TdHJpbmc6IERBVEVfVElNRV9GT1JNQVRfTUlOVVRFUyxcbiAgICAgICAgICAgIGRhdGVUaW1lVGltZXpvbmU6IFwidmlld2VyLWxvY2FsXCIsXG4gICAgICAgICAgICBjb2xvcmluZ01heEFnZTogXCIxeVwiLFxuICAgICAgICAgICAgLy8gY29sb3JzIHdlcmUgcGlja2VkIHZpYTpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vY29sb3IuYWRvYmUuY29tL2RlL2NyZWF0ZS9jb2xvci1hY2Nlc3NpYmlsaXR5XG4gICAgICAgICAgICBjb2xvck5ldzogeyByOiAyNTUsIGc6IDE1MCwgYjogMTUwIH0sXG4gICAgICAgICAgICBjb2xvck9sZDogeyByOiAxMjAsIGc6IDE2MCwgYjogMjU1IH0sXG4gICAgICAgICAgICB0ZXh0Q29sb3JDc3M6IFwidmFyKC0tdGV4dC1tdXRlZClcIiwgLy8gIG1vcmUgcHJvbm91bmNlZCB0aGFuIGxpbmUgbnVtYmVycywgYnV0IGxlc3MgdGhhbiB0aGUgY29udGVudCB0ZXh0XG4gICAgICAgICAgICBpZ25vcmVXaGl0ZXNwYWNlOiBmYWxzZSxcbiAgICAgICAgICAgIGd1dHRlclNwYWNpbmdGYWxsYmFja0xlbmd0aDogNSxcbiAgICAgICAgfSxcbiAgICB9O1xuXG5leHBvcnQgY29uc3QgU09VUkNFX0NPTlRST0xfVklFV19DT05GSUcgPSB7XG4gICAgdHlwZTogXCJnaXQtdmlld1wiLFxuICAgIG5hbWU6IFwiU291cmNlIENvbnRyb2xcIixcbiAgICBpY29uOiBcImdpdC1wdWxsLXJlcXVlc3RcIixcbn07XG5cbmV4cG9ydCBjb25zdCBISVNUT1JZX1ZJRVdfQ09ORklHID0ge1xuICAgIHR5cGU6IFwiZ2l0LWhpc3Rvcnktdmlld1wiLFxuICAgIG5hbWU6IFwiSGlzdG9yeVwiLFxuICAgIGljb246IFwiaGlzdG9yeVwiLFxufTtcblxuZXhwb3J0IGNvbnN0IERJRkZfVklFV19DT05GSUcgPSB7XG4gICAgdHlwZTogXCJkaWZmLXZpZXdcIixcbiAgICBuYW1lOiBcIkRpZmYgVmlld1wiLFxuICAgIGljb246IFwiZ2l0LXB1bGwtcmVxdWVzdFwiLFxufTtcbiIsICJpbXBvcnQgeyBMaW5lQXV0aG9yU2V0dGluZ3MgfSBmcm9tIFwic3JjL2xpbmVBdXRob3IvbW9kZWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkdpdFNldHRpbmdzIHtcbiAgICBjb21taXRNZXNzYWdlOiBzdHJpbmc7XG4gICAgYXV0b0NvbW1pdE1lc3NhZ2U6IHN0cmluZztcbiAgICBjb21taXREYXRlRm9ybWF0OiBzdHJpbmc7XG4gICAgYXV0b1NhdmVJbnRlcnZhbDogbnVtYmVyO1xuICAgIGF1dG9QdXNoSW50ZXJ2YWw6IG51bWJlcjtcbiAgICBhdXRvUHVsbEludGVydmFsOiBudW1iZXI7XG4gICAgYXV0b1B1bGxPbkJvb3Q6IGJvb2xlYW47XG4gICAgc3luY01ldGhvZDogU3luY01ldGhvZDtcbiAgICBkaXNhYmxlUHVzaDogYm9vbGVhbjtcbiAgICBwdWxsQmVmb3JlUHVzaDogYm9vbGVhbjtcbiAgICBkaXNhYmxlUG9wdXBzOiBib29sZWFuO1xuICAgIGRpc2FibGVQb3B1cHNGb3JOb0NoYW5nZXM6IGJvb2xlYW47XG4gICAgbGlzdENoYW5nZWRGaWxlc0luTWVzc2FnZUJvZHk6IGJvb2xlYW47XG4gICAgc2hvd1N0YXR1c0JhcjogYm9vbGVhbjtcbiAgICB1cGRhdGVTdWJtb2R1bGVzOiBib29sZWFuO1xuICAgIHN1Ym1vZHVsZVJlY3Vyc2VDaGVja291dDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2luZyBgbG9jYWxzdG9yYWdlYCBpbnN0ZWFkXG4gICAgICovXG4gICAgZ2l0UGF0aD86IHN0cmluZztcbiAgICBjdXN0b21NZXNzYWdlT25BdXRvQmFja3VwOiBib29sZWFuO1xuICAgIGF1dG9CYWNrdXBBZnRlckZpbGVDaGFuZ2U6IGJvb2xlYW47XG4gICAgdHJlZVN0cnVjdHVyZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2luZyBgbG9jYWxzdG9yYWdlYCBpbnN0ZWFkXG4gICAgICovXG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgZGlmZmVyZW50SW50ZXJ2YWxDb21taXRBbmRQdXNoOiBib29sZWFuO1xuICAgIGNoYW5nZWRGaWxlc0luU3RhdHVzQmFyOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgTWlncmF0ZWQgdG8gYHN5bmNNZXRob2QgPSAnbWVyZ2UnYFxuICAgICAqL1xuICAgIG1lcmdlT25QdWxsPzogYm9vbGVhbjtcbiAgICByZWZyZXNoU291cmNlQ29udHJvbDogYm9vbGVhbjtcbiAgICBiYXNlUGF0aDogc3RyaW5nO1xuICAgIHNob3dlZE1vYmlsZU5vdGljZTogYm9vbGVhbjtcbiAgICByZWZyZXNoU291cmNlQ29udHJvbFRpbWVyOiBudW1iZXI7XG4gICAgc2hvd0JyYW5jaFN0YXR1c0JhcjogYm9vbGVhbjtcbiAgICBsaW5lQXV0aG9yOiBMaW5lQXV0aG9yU2V0dGluZ3M7XG4gICAgc2V0TGFzdFNhdmVUb0xhc3RDb21taXQ6IGJvb2xlYW47XG4gICAgZ2l0RGlyOiBzdHJpbmc7XG4gICAgc2hvd0ZpbGVNZW51OiBib29sZWFuO1xuICAgIGF1dGhvckluSGlzdG9yeVZpZXc6IFNob3dBdXRob3JJbkhpc3RvcnlWaWV3O1xuICAgIGRhdGVJbkhpc3RvcnlWaWV3OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVuc3VyZXMsIHRoYXQgbmVzdGVkIHZhbHVlcyBvYmplY3RzIGFyZSBjb3JyZWN0bHkgbWVyZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VTZXR0aW5nc0J5UHJpb3JpdHkoXG4gICAgbG93OiBPbWl0PE9ic2lkaWFuR2l0U2V0dGluZ3MsIFwiYXV0b0NvbW1pdE1lc3NhZ2VcIj4sXG4gICAgaGlnaDogT2JzaWRpYW5HaXRTZXR0aW5nc1xuKTogT2JzaWRpYW5HaXRTZXR0aW5ncyB7XG4gICAgY29uc3QgbGluZUF1dGhvciA9IE9iamVjdC5hc3NpZ24oe30sIGxvdy5saW5lQXV0aG9yLCBoaWdoLmxpbmVBdXRob3IpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBsb3csIGhpZ2gsIHsgbGluZUF1dGhvciB9KTtcbn1cblxuZXhwb3J0IHR5cGUgU3luY01ldGhvZCA9IFwicmViYXNlXCIgfCBcIm1lcmdlXCIgfCBcInJlc2V0XCI7XG5cbmV4cG9ydCB0eXBlIFNob3dBdXRob3JJbkhpc3RvcnlWaWV3ID0gXCJmdWxsXCIgfCBcImluaXRpYWxzXCIgfCBcImhpZGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdXRob3Ige1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1cyB7XG4gICAgYWxsOiBGaWxlU3RhdHVzUmVzdWx0W107XG4gICAgY2hhbmdlZDogRmlsZVN0YXR1c1Jlc3VsdFtdO1xuICAgIHN0YWdlZDogRmlsZVN0YXR1c1Jlc3VsdFtdO1xuICAgIGNvbmZsaWN0ZWQ6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdFRpbWVzdGFtcCB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml4IHNlY29uZHMgc2luY2UgZXBvY2ggdGltZSAoVVRDKS5cbiAgICAgKi9cbiAgICBlcG9jaFNlY29uZHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB6b25lLCBpbiB3aGljaCB0aGUgY29tbWl0IHdhcyBvcmlnaW5hbGx5IGNyZWF0ZWQuXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byByZWNvbnN0cnVjdCB0aGUgbG9jYWwgdGltZSBkdXJpbmcgY3JlYXRpbmcgdGltZS5cbiAgICAgKi9cbiAgICB0ejogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJFbWFpbCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmxhbWVDb21taXQge1xuICAgIGhhc2g6IHN0cmluZztcbiAgICBhdXRob3I/OiBVc2VyRW1haWwgJiBHaXRUaW1lc3RhbXA7XG4gICAgY29tbWl0dGVyPzogVXNlckVtYWlsICYgR2l0VGltZXN0YW1wO1xuICAgIHByZXZpb3VzPzogeyBjb21taXRIYXNoPzogc3RyaW5nOyBmaWxlbmFtZTogc3RyaW5nIH07XG4gICAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gICAgc3VtbWFyeTogc3RyaW5nO1xuICAgIGlzWmVyb0NvbW1pdDogYm9vbGVhbjsgLy8gdHJ1ZSwgaWYgaGFzaCBpcyAwMDAuLi4wMDBcbn1cblxuLyoqXG4gKiBTZWUgaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1ibGFtZSNfdGhlX3BvcmNlbGFpbl9mb3JtYXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCbGFtZSB7XG4gICAgY29tbWl0czogTWFwPHN0cmluZywgQmxhbWVDb21taXQ+O1xuICAgIC8qKlxuICAgICAqIGhhc2hQZXJMaW5lW2ldIGlzIHRoZSBjb21taXQgaGFzaCB3aGVyZSBsaW5lIGkgb3JpZ2luYXRlcyBmcm9tXG4gICAgICpcbiAgICAgKiBUaGUgZmlyc3QgZWxlbWVudCBpcyBhbHdheXMgYHVuZGVmaW5lZGAsIHNpbmNlIGxpbmUtbnVtYmVycyBhcmUgMS1iYXNlZC5cbiAgICAgKi9cbiAgICBoYXNoUGVyTGluZTogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogb3JpZ2luYWxGaWxlTGluZU5yUGVyTGluZVtpXSBjb250YWlucyB0aGUgb3JpZ2luYWwgZmlsZXMnIGxpbmUgbnVtYmVyIGZyb20gd2hlcmUgbGluZSBpXG4gICAgICpcbiAgICAgKiBUaGUgZmlyc3QgZWxlbWVudCBpcyBhbHdheXMgYHVuZGVmaW5lZGAsIHNpbmNlIGxpbmUtbnVtYmVycyBhcmUgMS1iYXNlZC5vcmlnaW5hdGVkXG4gICAgICovXG4gICAgb3JpZ2luYWxGaWxlTGluZU5yUGVyTGluZTogbnVtYmVyW107XG4gICAgLyoqXG4gICAgICogZmluYWxGaWxlTGluZU5yUGVyTGluZVtpXSBjb250YWlucyB0aGUgZmluYWwgZmlsZXMnIGxpbmUgbnVtYmVyIGZyb20gd2hlcmUgbGluZSBpIG9yaWdpbmF0ZWRcbiAgICAgKlxuICAgICAqIFRoZSBmaXJzdCBlbGVtZW50IGlzIGFsd2F5cyBgdW5kZWZpbmVkYCwgc2luY2UgbGluZS1udW1iZXJzIGFyZSAxLWJhc2VkLlxuICAgICAqL1xuICAgIGZpbmFsRmlsZUxpbmVOclBlckxpbmU6IG51bWJlcltdO1xuICAgIC8qKlxuICAgICAqIEZvciBlYWNoIGxpbmUgaSwgd2hpY2ggb3JpZ2luYXRlcyBmcm9tIGEgZGlmZmVyZW50IGNvbW1pdCB0aGFuIGl0J3MgcHJldmlvdXMgbGluZSxcbiAgICAgKiBncm91cFNpemVQZXJTdGFydGluZ0xpbmVbaV0gY29udGFpbnMgdGhlIG51bWJlciBvZiBsaW5lcyB1bnRpbCBlaXRoZXIgdGhlIG5leHRcbiAgICAgKiBncm91cCBvZiBsaW5lcyBvciBFT0YgaXMgcmVhY2hlZC5cbiAgICAgKi9cbiAgICBncm91cFNpemVQZXJTdGFydGluZ0xpbmU6IE1hcDxudW1iZXIsIG51bWJlcj47XG59XG5cbi8qKlxuICogYGluZGV4YCBhbmQgYHdvcmtpbmdfZGlyYCBhcmUgZWFjaCBvbmUtY2hhcmFjdGVyIGNvZGVzLCBiYXNlZCBvZmYgdGhlIGdpdFxuICogc3RhdHVzIHNob3J0IGZvcm1hdDogZ2l0IHN0YXR1cyAtLXNob3J0XG4gKiBUaGUgZm9sbG93aW5nIGlzIGZyb206IGh0dHBzOi8vd3d3LmdpdC1zY20uY29tL2RvY3MvZ2l0LXN0YXR1cyNfc2hvcnRfZm9ybWF0XG4gKlxuICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gKiAtICcgJzogdW5tb2RpZmllZFxuICogLSBNICA6IG1vZGlmaWVkXG4gKiAtIFQgIDogZmlsZSB0eXBlIGNoYW5nZWRcbiAqIC0gQSAgOiBhZGRlZFxuICogLSBEICA6IGRlbGV0ZWRcbiAqIC0gUiAgOiByZW5hbWVkXG4gKiAtIEMgIDogY29waWVkXG4gKiAtIFUgIDogdXBkYXRlZCBidXQgdW5tZXJnZWRcbiAqXG4gKiAgaW5kZXggICAgICAgICAgICB3b3JraW5nX2RpciAgICAgICAgICAgIE1lYW5pbmdcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogICAgICAgICAgICAgICAgICAgIFtBTURdICAgICAgICAgICAgICAgICBub3QgdXBkYXRlZFxuICogICAgTSAgICAgICAgICAgICAgIFsgTVREXSAgICAgICAgICAgICAgICB1cGRhdGVkIGluIGluZGV4XG4gKiAgICBUICAgICAgICAgICAgICAgWyBNVERdICAgICAgICAgICAgICAgIHR5cGUgY2hhbmdlZCBpbiBpbmRleFxuICogICAgQSAgICAgICAgICAgICAgIFsgTVREXSAgICAgICAgICAgICAgICBhZGRlZCB0byBpbmRleFxuICogICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkIGZyb20gaW5kZXhcbiAqICAgIFIgICAgICAgICAgICAgICBbIE1URF0gICAgICAgICAgICAgICAgcmVuYW1lZCBpbiBpbmRleFxuICogICAgQyAgICAgICAgICAgICAgIFsgTVREXSAgICAgICAgICAgICAgICBjb3BpZWQgaW4gaW5kZXhcbiAqIFtNVEFSQ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggYW5kIHdvcmsgdHJlZSBtYXRjaFxuICogWyBNVEFSQ10gICAgICAgICAgICAgIE0gICAgICAgICAgICAgICAgICB3b3JrIHRyZWUgY2hhbmdlZCBzaW5jZSBpbmRleFxuICogWyBNVEFSQ10gICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICB0eXBlIGNoYW5nZWQgaW4gd29yayB0cmVlIHNpbmNlIGluZGV4XG4gKiBbIE1UQVJDXSAgICAgICAgICAgICAgRCAgICAgICAgICAgICAgICAgIGRlbGV0ZWQgaW4gd29yayB0cmVlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgUiAgICAgICAgICAgICAgICAgIHJlbmFtZWQgaW4gd29yayB0cmVlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgQyAgICAgICAgICAgICAgICAgIGNvcGllZCBpbiB3b3JrIHRyZWVcbiAqICAgIEQgICAgICAgICAgICAgICAgICBEICAgICAgICAgICAgICAgICAgdW5tZXJnZWQsIGJvdGggZGVsZXRlZFxuICogICAgQSAgICAgICAgICAgICAgICAgIFUgICAgICAgICAgICAgICAgICB1bm1lcmdlZCwgYWRkZWQgYnkgdXNcbiAqICAgIFUgICAgICAgICAgICAgICAgICBEICAgICAgICAgICAgICAgICAgdW5tZXJnZWQsIGRlbGV0ZWQgYnkgdGhlbVxuICogICAgVSAgICAgICAgICAgICAgICAgIEEgICAgICAgICAgICAgICAgICB1bm1lcmdlZCwgYWRkZWQgYnkgdGhlbVxuICogICAgRCAgICAgICAgICAgICAgICAgIFUgICAgICAgICAgICAgICAgICB1bm1lcmdlZCwgZGVsZXRlZCBieSB1c1xuICogICAgQSAgICAgICAgICAgICAgICAgIEEgICAgICAgICAgICAgICAgICB1bm1lcmdlZCwgYm90aCBhZGRlZFxuICogICAgVSAgICAgICAgICAgICAgICAgIFUgICAgICAgICAgICAgICAgICB1bm1lcmdlZCwgYm90aCBtb2RpZmllZFxuICogICAgPyAgICAgICAgICAgICAgICAgID8gICAgICAgICAgICAgICAgICB1bnRyYWNrZWRcbiAqICAgICEgICAgICAgICAgICAgICAgICAhICAgICAgICAgICAgICAgICAgaWdub3JlZFxuICpcbiAqXG4gKiBGaWxlU3RhdHVzUmVzdWx0IGlzIGJhc2VkIG9mZiBzaW1wbGUtZ2l0J3MgRmlsZVN0YXR1c1Jlc3VsdDpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGV2ZXVreC9naXQtanMvYmxvYi9hNTY5ODY4ZDgwMGEwZDg3MmU4ZmIxNTM0YmIwZGNlY2NmZjQ3YTRmL3R5cGluZ3MvcmVzcG9uc2UuZC50cyNMMjY3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVN0YXR1c1Jlc3VsdCB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIHZhdWx0X3BhdGg6IHN0cmluZztcbiAgICBmcm9tPzogc3RyaW5nO1xuXG4gICAgLy8gRmlyc3QgZGlnaXQgb2YgdGhlIHN0YXR1cyBjb2RlIG9mIHRoZSBmaWxlLCBlLmcuICdNJyA9IG1vZGlmaWVkLlxuICAgIC8vIFJlcHJlc2VudHMgdGhlIHN0YXR1cyBvZiB0aGUgaW5kZXggaWYgbm8gbWVyZ2UgY29uZmxpY3RzLCBvdGhlcndpc2UgcmVwcmVzZW50c1xuICAgIC8vIHN0YXR1cyBvZiBvbmUgc2lkZSBvZiB0aGUgbWVyZ2UuXG4gICAgaW5kZXg6IHN0cmluZztcbiAgICAvLyBTZWNvbmQgZGlnaXQgb2YgdGhlIHN0YXR1cyBjb2RlIG9mIHRoZSBmaWxlLiBSZXByZXNlbnRzIHN0YXR1cyBvZiB0aGUgd29ya2luZyBkaXJlY3RvcnlcbiAgICAvLyBpZiBubyBtZXJnZSBjb25mbGljdHMsIG90aGVyd2lzZSByZXByZXNlbnRzIHN0YXR1cyBvZiBvdGhlciBzaWRlIG9mIGEgbWVyZ2UuXG4gICAgd29ya2luZ19kaXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gUGx1Z2luU3RhdGUge1xuICAgIGlkbGUsXG4gICAgc3RhdHVzLFxuICAgIHB1bGwsXG4gICAgYWRkLFxuICAgIGNvbW1pdCxcbiAgICBwdXNoLFxuICAgIGNvbmZsaWN0ZWQsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nRW50cnkge1xuICAgIGhhc2g6IHN0cmluZztcbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHJlZnM6IHN0cmluZ1tdO1xuICAgIGJvZHk6IHN0cmluZztcbiAgICBkaWZmOiBEaWZmRW50cnk7XG4gICAgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZW1haWw6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpZmZFbnRyeSB7XG4gICAgY2hhbmdlZDogbnVtYmVyO1xuICAgIGZpbGVzOiBEaWZmRmlsZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpZmZGaWxlIHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgdmF1bHRfcGF0aDogc3RyaW5nO1xuICAgIGhhc2g6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBiaW5hcnk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2Fsa0RpZmZlcmVuY2Uge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICB0eXBlOiBcIk1cIiB8IFwiQVwiIHwgXCJEXCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5zdGFnZWRGaWxlIHtcbiAgICBmaWxlcGF0aDogc3RyaW5nO1xuICAgIGRlbGV0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnJhbmNoSW5mbyB7XG4gICAgY3VycmVudD86IHN0cmluZztcbiAgICB0cmFja2luZz86IHN0cmluZztcbiAgICBicmFuY2hlczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJlZUl0ZW08VCA9IERpZmZGaWxlIHwgRmlsZVN0YXR1c1Jlc3VsdD4ge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIHZhdWx0UGF0aDogc3RyaW5nO1xuICAgIGRhdGE/OiBUO1xuICAgIGNoaWxkcmVuPzogVHJlZUl0ZW08VD5bXTtcbn1cblxuZXhwb3J0IHR5cGUgUm9vdFRyZWVJdGVtPFQ+ID0gVHJlZUl0ZW08VD4gJiB7IGNoaWxkcmVuOiBUcmVlSXRlbTxUPltdIH07XG5cbmV4cG9ydCB0eXBlIFN0YXR1c1Jvb3RUcmVlSXRlbSA9IFJvb3RUcmVlSXRlbTxGaWxlU3RhdHVzUmVzdWx0PjtcblxuZXhwb3J0IHR5cGUgSGlzdG9yeVJvb3RUcmVlSXRlbSA9IFJvb3RUcmVlSXRlbTxEaWZmRmlsZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlmZlZpZXdTdGF0ZSB7XG4gICAgc3RhZ2VkOiBib29sZWFuO1xuICAgIGZpbGU6IHN0cmluZztcbiAgICBoYXNoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBGaWxlVHlwZSB7XG4gICAgc3RhZ2VkLFxuICAgIGNoYW5nZWQsXG4gICAgcHVsbGVkLFxufVxuXG5kZWNsYXJlIG1vZHVsZSBcIm9ic2lkaWFuXCIge1xuICAgIGludGVyZmFjZSBBcHAge1xuICAgICAgICBsb2FkTG9jYWxTdG9yYWdlKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgc2F2ZUxvY2FsU3RvcmFnZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQ7XG4gICAgfVxuICAgIGludGVyZmFjZSBWaWV3IHtcbiAgICAgICAgdGl0bGVFbDogSFRNTEVsZW1lbnQ7XG4gICAgfVxufVxuIiwgImltcG9ydCAqIGFzIGNzc0NvbG9yQ29udmVydGVyIGZyb20gXCJjc3MtY29sb3ItY29udmVydGVyXCI7XG5pbXBvcnQgZGVlcEVxdWFsIGZyb20gXCJkZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBLZXltYXAsIFJHQiwgV29ya3NwYWNlTGVhZiwgbW9tZW50IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmV4cG9ydCBjb25zdCB3b3J0aFdhbGtpbmcgPSAoZmlsZXBhdGg6IHN0cmluZywgcm9vdD86IHN0cmluZykgPT4ge1xuICAgIGlmIChmaWxlcGF0aCA9PT0gXCIuXCIgfHwgcm9vdCA9PSBudWxsIHx8IHJvb3QubGVuZ3RoID09PSAwIHx8IHJvb3QgPT09IFwiLlwiKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocm9vdC5sZW5ndGggPj0gZmlsZXBhdGgubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByb290LnN0YXJ0c1dpdGgoZmlsZXBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmaWxlcGF0aC5zdGFydHNXaXRoKHJvb3QpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdMZWFmKGV2ZW50PzogTW91c2VFdmVudCk6IFdvcmtzcGFjZUxlYWYgfCB1bmRlZmluZWQge1xuICAgIGxldCBsZWFmOiBXb3Jrc3BhY2VMZWFmIHwgdW5kZWZpbmVkO1xuICAgIGlmIChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAwIHx8IGV2ZW50LmJ1dHRvbiA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IEtleW1hcC5pc01vZEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGxlYWYgPSBhcHAud29ya3NwYWNlLmdldExlYWYodHlwZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGxlYWY7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHR5cGUtZXJyb3IsIGlmIHRoaXMgZnVuY3Rpb24gaXMgaW4gYSBwb3NzaWJsZSBicmFuY2guXG4gKlxuICogVXNlIHRoaXMgdG8gZW5zdXJlIGV4aGF1c3RpdmUgc3dpdGNoIGNhc2VzLlxuICpcbiAqIER1cmluZyBydW50aW1lLCBhbiBlcnJvciB3aWxsIGJlIHRocm93biwgaWYgZXhlY3V0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBvc3NpYmxlQnJhbmNoKHg6IG5ldmVyKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkltcG9zc2libGUgYnJhbmNoOiBcIiArIHgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiVG9TdHJpbmcocmdiOiBSR0IpOiBzdHJpbmcge1xuICAgIHJldHVybiBgcmdiKCR7cmdiLnJ9LCR7cmdiLmd9LCR7cmdiLmJ9KWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9SZ2Ioc3RyOiBzdHJpbmcpOiBSR0IgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbG9yID0gY3NzQ29sb3JDb252ZXJ0ZXIuZnJvbVN0cmluZyhzdHIpPy50b1JnYmFBcnJheSgpO1xuICAgIGlmIChjb2xvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IFtyLCBnLCBiXSA9IGNvbG9yO1xuICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vbWVudFRvRXBvY2hTZWNvbmRzKGluc3RhbnQ6IG1vbWVudC5Nb21lbnQpOiBudW1iZXIge1xuICAgIHJldHVybiBpbnN0YW50LmRpZmYobW9tZW50LnVuaXgoMCksIFwic2Vjb25kc1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lZGlhbihhcnJheTogbnVtYmVyW10pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGFycmF5LnNsaWNlKCkuc29ydCgpW01hdGguZmxvb3IoYXJyYXkubGVuZ3RoIC8gMildO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0RGVlcEVxdWFsPFQ+KGE6IFQsIGI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGVlcEVxdWFsKGEsIGIsIHsgc3RyaWN0OiB0cnVlIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplVG9MZW5ndGgoXG4gICAgb3JpZ2luYWw6IHN0cmluZyxcbiAgICBkZXNpcmVkTGVuZ3RoOiBudW1iZXIsXG4gICAgZmlsbENoYXI6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgICBpZiAob3JpZ2luYWwubGVuZ3RoIDw9IGRlc2lyZWRMZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gbmV3IEFycmF5KGRlc2lyZWRMZW5ndGggLSBvcmlnaW5hbC5sZW5ndGgpXG4gICAgICAgICAgICAuZmlsbChmaWxsQ2hhcilcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgb3JpZ2luYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsLnN1YnN0cmluZyhvcmlnaW5hbC5sZW5ndGggLSBkZXNpcmVkTGVuZ3RoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVmaXhPZkxlbmd0aEFzV2hpdGVzcGFjZShcbiAgICB0b0JlUmVuZGVyZWRUZXh0OiBzdHJpbmcsXG4gICAgd2hpdGVzcGFjZVByZWZpeExlbmd0aDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICAgIGlmICh3aGl0ZXNwYWNlUHJlZml4TGVuZ3RoIDw9IDApIHJldHVybiB0b0JlUmVuZGVyZWRUZXh0O1xuXG4gICAgY29uc3Qgd2hpdGVzcGFjZVByZWZpeCA9IG5ldyBBcnJheSh3aGl0ZXNwYWNlUHJlZml4TGVuZ3RoKVxuICAgICAgICAuZmlsbChcIiBcIilcbiAgICAgICAgLmpvaW4oXCJcIik7XG4gICAgY29uc3Qgb3JpZ2luYWxTdWZmaXggPSB0b0JlUmVuZGVyZWRUZXh0LnN1YnN0cmluZyhcbiAgICAgICAgd2hpdGVzcGFjZVByZWZpeExlbmd0aCxcbiAgICAgICAgdG9CZVJlbmRlcmVkVGV4dC5sZW5ndGhcbiAgICApO1xuICAgIHJldHVybiB3aGl0ZXNwYWNlUHJlZml4ICsgb3JpZ2luYWxTdWZmaXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiZXR3ZWVuKGw6IG51bWJlciwgeDogbnVtYmVyLCByOiBudW1iZXIpIHtcbiAgICByZXR1cm4gbCA8PSB4ICYmIHggPD0gcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFJlbW90ZUJyYW5jaChcbiAgICByZW1vdGVCcmFuY2g6IHN0cmluZ1xuKTogcmVhZG9ubHkgW3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXSB7XG4gICAgY29uc3QgW3JlbW90ZSwgLi4uYnJhbmNoXSA9IHJlbW90ZUJyYW5jaC5zcGxpdChcIi9cIik7XG4gICAgcmV0dXJuIFtyZW1vdGUsIGJyYW5jaC5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiBicmFuY2guam9pbihcIi9cIildO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzcGxheVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocGF0aC5lbmRzV2l0aChcIi9cIikpIHJldHVybiBwYXRoO1xuICAgIHJldHVybiBwYXRoLnNwbGl0KFwiL1wiKS5sYXN0KCkhLnJlcGxhY2UoXCIubWRcIiwgXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRNaW51dGVzKG1pbnV0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKG1pbnV0ZXMgPT09IDEpIHJldHVybiBcIjEgbWludXRlXCI7XG4gICAgcmV0dXJuIGAke21pbnV0ZXN9IG1pbnV0ZXNgO1xufVxuIiwgImltcG9ydCB7IEFwcCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCIuLi9tYWluXCI7XG5pbXBvcnQge1xuICAgIEJyYW5jaEluZm8sXG4gICAgRGlmZkZpbGUsXG4gICAgRmlsZVN0YXR1c1Jlc3VsdCxcbiAgICBMb2dFbnRyeSxcbiAgICBTdGF0dXMsXG4gICAgVHJlZUl0ZW0sXG4gICAgVW5zdGFnZWRGaWxlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEdpdE1hbmFnZXIge1xuICAgIHJlYWRvbmx5IHBsdWdpbjogT2JzaWRpYW5HaXQ7XG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gICAgY29uc3RydWN0b3IocGx1Z2luOiBPYnNpZGlhbkdpdCkge1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgdGhpcy5hcHAgPSBwbHVnaW4uYXBwO1xuICAgIH1cblxuICAgIGFic3RyYWN0IHN0YXR1cygpOiBQcm9taXNlPFN0YXR1cz47XG5cbiAgICBhYnN0cmFjdCBjb21taXRBbGwoXzoge1xuICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1cz86IFN0YXR1cztcbiAgICAgICAgdW5zdGFnZWRGaWxlcz86IFVuc3RhZ2VkRmlsZVtdO1xuICAgICAgICBhbWVuZD86IGJvb2xlYW47XG4gICAgfSk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPjtcblxuICAgIGFic3RyYWN0IGNvbW1pdChfOiB7XG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgYW1lbmQ/OiBib29sZWFuO1xuICAgIH0pOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD47XG5cbiAgICBhYnN0cmFjdCBzdGFnZUFsbChfOiB7IGRpcj86IHN0cmluZzsgc3RhdHVzPzogU3RhdHVzIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgYWJzdHJhY3QgdW5zdGFnZUFsbChfOiB7IGRpcj86IHN0cmluZzsgc3RhdHVzPzogU3RhdHVzIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgYWJzdHJhY3Qgc3RhZ2UoZmlsZXBhdGg6IHN0cmluZywgcmVsYXRpdmVUb1ZhdWx0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIGFic3RyYWN0IHVuc3RhZ2UoZmlsZXBhdGg6IHN0cmluZywgcmVsYXRpdmVUb1ZhdWx0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIGFic3RyYWN0IGRpc2NhcmQoZmlsZXBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cbiAgICBhYnN0cmFjdCBkaXNjYXJkQWxsKF86IHsgZGlyPzogc3RyaW5nOyBzdGF0dXM/OiBTdGF0dXMgfSk6IFByb21pc2U8dm9pZD47XG5cbiAgICBhYnN0cmFjdCBwdWxsKCk6IFByb21pc2U8RmlsZVN0YXR1c1Jlc3VsdFtdIHwgdW5kZWZpbmVkPjtcblxuICAgIGFic3RyYWN0IHB1c2goKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+O1xuXG4gICAgYWJzdHJhY3QgZ2V0VW5wdXNoZWRDb21taXRzKCk6IFByb21pc2U8bnVtYmVyPjtcblxuICAgIGFic3RyYWN0IGNhblB1c2goKTogUHJvbWlzZTxib29sZWFuPjtcblxuICAgIGFic3RyYWN0IGNoZWNrUmVxdWlyZW1lbnRzKCk6IFByb21pc2U8XG4gICAgICAgIFwidmFsaWRcIiB8IFwibWlzc2luZy1yZXBvXCIgfCBcIm1pc3NpbmctZ2l0XCJcbiAgICA+O1xuXG4gICAgYWJzdHJhY3QgYnJhbmNoSW5mbygpOiBQcm9taXNlPEJyYW5jaEluZm8+O1xuXG4gICAgYWJzdHJhY3QgY2hlY2tvdXQoYnJhbmNoOiBzdHJpbmcsIHJlbW90ZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cbiAgICBhYnN0cmFjdCBjcmVhdGVCcmFuY2goYnJhbmNoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgYWJzdHJhY3QgZGVsZXRlQnJhbmNoKGJyYW5jaDogc3RyaW5nLCBmb3JjZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD47XG5cbiAgICBhYnN0cmFjdCBicmFuY2hJc01lcmdlZChicmFuY2g6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgICBhYnN0cmFjdCBpbml0KCk6IFByb21pc2U8dm9pZD47XG5cbiAgICBhYnN0cmFjdCBjbG9uZSh1cmw6IHN0cmluZywgZGlyOiBzdHJpbmcsIGRlcHRoPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIGFic3RyYWN0IHNldENvbmZpZyhcbiAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZFxuICAgICk6IFByb21pc2U8dm9pZD47XG5cbiAgICBhYnN0cmFjdCBnZXRDb25maWcocGF0aDogc3RyaW5nKTogUHJvbWlzZTxhbnk+O1xuXG4gICAgYWJzdHJhY3QgZmV0Y2gocmVtb3RlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIGFic3RyYWN0IHNldFJlbW90ZShuYW1lOiBzdHJpbmcsIHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIGFic3RyYWN0IGdldFJlbW90ZXMoKTogUHJvbWlzZTxzdHJpbmdbXT47XG5cbiAgICBhYnN0cmFjdCBnZXRSZW1vdGVVcmwocmVtb3RlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbiAgICBhYnN0cmFjdCBsb2coXG4gICAgICAgIGZpbGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgcmVsYXRpdmVUb1ZhdWx0PzogYm9vbGVhbixcbiAgICAgICAgbGltaXQ/OiBudW1iZXJcbiAgICApOiBQcm9taXNlPExvZ0VudHJ5W10+O1xuXG4gICAgYWJzdHJhY3QgZ2V0UmVtb3RlQnJhbmNoZXMocmVtb3RlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPjtcblxuICAgIGFic3RyYWN0IHJlbW92ZVJlbW90ZShyZW1vdGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgYWJzdHJhY3QgdXBkYXRlVXBzdHJlYW1CcmFuY2gocmVtb3RlQnJhbmNoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgYWJzdHJhY3QgdXBkYXRlR2l0UGF0aChnaXRQYXRoOiBzdHJpbmcpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgdXBkYXRlQmFzZVBhdGgoYmFzZVBhdGg6IHN0cmluZyk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBnZXREaWZmU3RyaW5nKFxuICAgICAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgICAgICBzdGFnZWRDaGFuZ2VzOiBib29sZWFuLFxuICAgICAgICBoYXNoPzogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgYWJzdHJhY3QgZ2V0TGFzdENvbW1pdFRpbWUoKTogUHJvbWlzZTxEYXRlIHwgdW5kZWZpbmVkPjtcblxuICAgIC8vIENvbnN0cnVjdHMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB2YXVsdCBmcm9tIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgZ2l0IHJlcG9zaXRvcnlcbiAgICBnZXRSZWxhdGl2ZVZhdWx0UGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuYmFzZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBsdWdpbi5zZXR0aW5ncy5iYXNlUGF0aCArIFwiL1wiICsgcGF0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0cyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGdpdCByZXBvc2l0b3J5IGZyb20gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB2YXVsdFxuICAgIC8vXG4gICAgLy8gQHBhcmFtIGRvQ29udmVyc2lvbiAtIElmIGZhbHNlLCB0aGUgcGF0aCBpcyByZXR1cm5lZCBhcyBpcy4gVGhpcyBpcyBhZGRlZCBiZWNhdXNlIHRoYXQgcGFyYW1ldGVyIGlzIG9mdGVuIHBhc3NlZCBvbiB0byBmdW5jdGlvbnMgd2hlcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICAgIGdldFJlbGF0aXZlUmVwb1BhdGgoXG4gICAgICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIGRvQ29udmVyc2lvbjogYm9vbGVhbiA9IHRydWVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBpZiAoZG9Db252ZXJzaW9uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuYmFzZVBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vRXhwZWN0IHRoZSBjYXNlIHRoYXQgdGhlIGdpdCByZXBvc2l0b3J5IGlzIGxvY2F0ZWQgaW5zaWRlIHRoZSB2YXVsdCBvbiBtb2JpbGUgcGxhdGZvcm0gY3VycmVudGx5LlxuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmJhc2VQYXRoLmxlbmd0aCArIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRUcmVlU3RydWN0dXJlPFQgPSBEaWZmRmlsZSB8IEZpbGVTdGF0dXNSZXN1bHQ+KFxuICAgICAgICBjaGlsZHJlbjogKFQgJiB7IHBhdGg6IHN0cmluZyB9KVtdLFxuICAgICAgICBiZWdpbkxlbmd0aCA9IDBcbiAgICApOiBUcmVlSXRlbTxUPltdIHtcbiAgICAgICAgY29uc3QgbGlzdDogVHJlZUl0ZW08VD5bXSA9IFtdO1xuICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbl07XG4gICAgICAgIHdoaWxlIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGNoaWxkcmVuLmZpcnN0KCkhO1xuICAgICAgICAgICAgY29uc3QgcmVzdFBhdGggPSBmaXJzdC5wYXRoLnN1YnN0cmluZyhiZWdpbkxlbmd0aCk7XG4gICAgICAgICAgICBpZiAocmVzdFBhdGguY29udGFpbnMoXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSByZXN0UGF0aC5zdWJzdHJpbmcoMCwgcmVzdFBhdGguaW5kZXhPZihcIi9cIikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuV2l0aFNhbWVUaXRsZSA9IGNoaWxkcmVuLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKGJlZ2luTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgodGl0bGUgKyBcIi9cIik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5XaXRoU2FtZVRpdGxlLmZvckVhY2goKGl0ZW0pID0+IGNoaWxkcmVuLnJlbW92ZShpdGVtKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IGZpcnN0LnBhdGguc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICByZXN0UGF0aC5pbmRleE9mKFwiL1wiKSArIGJlZ2luTGVuZ3RoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBsaXN0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHZhdWx0UGF0aDogdGhpcy5nZXRSZWxhdGl2ZVZhdWx0UGF0aChwYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMuX2dldFRyZWVTdHJ1Y3R1cmUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbldpdGhTYW1lVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmVnaW5MZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBiZWdpbkxlbmd0aCArIHRpdGxlLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGl0bGUubGVuZ3RoKSArIDFcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHJlc3RQYXRoLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmaXJzdCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogZmlyc3QucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgdmF1bHRQYXRoOiB0aGlzLmdldFJlbGF0aXZlVmF1bHRQYXRoKGZpcnN0LnBhdGgpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZShmaXJzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBTb3J0cyB0aGUgY2hpbGRyZW4gYW5kIHNpbXBsaWZpZXMgdGhlIHRpdGxlXG4gICAgICogSWYgYSBub2RlIG9ubHkgY29udGFpbnMgYW5vdGhlciBzdWJkaXJlY3RvcnksIHRoYXQgc3ViZGlyZWN0b3J5IGlzIG1vdmVkIHVwIG9uZSBsZXZlbCBhbmQgaW50ZWdyYXRlZCBpbnRvIHRoZSBwYXJlbnQgbm9kZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2ltcGxpZnk8VD4odHJlZTogVHJlZUl0ZW08VD5bXSk6IFRyZWVJdGVtPFQ+W10ge1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdHJlZSkge1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaW5nbGVDaGlsZCA9IG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA9PSAxO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpbmdsZUNoaWxkSXNEaXIgPVxuICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuPy5maXJzdCgpPy5kYXRhID09IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVDaGlsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlQ2hpbGRJc0RpclxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW4uZmlyc3QoKSE7XG4gICAgICAgICAgICAgICAgbm9kZS50aXRsZSArPSBcIi9cIiArIGNoaWxkLnRpdGxlO1xuICAgICAgICAgICAgICAgIG5vZGUuZGF0YSA9IGNoaWxkLmRhdGE7XG4gICAgICAgICAgICAgICAgbm9kZS5wYXRoID0gY2hpbGQucGF0aDtcbiAgICAgICAgICAgICAgICBub2RlLnZhdWx0UGF0aCA9IGNoaWxkLnZhdWx0UGF0aDtcbiAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gY2hpbGQuY2hpbGRyZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNpbXBsaWZ5PFQ+KG5vZGUuY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbj8uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpckNvbXBhcmUgPVxuICAgICAgICAgICAgICAgICAgICAoYi5kYXRhID09IHVuZGVmaW5lZCA/IDEgOiAwKSAtXG4gICAgICAgICAgICAgICAgICAgIChhLmRhdGEgPT0gdW5kZWZpbmVkID8gMSA6IDApO1xuICAgICAgICAgICAgICAgIGlmIChkaXJDb21wYXJlICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpckNvbXBhcmU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudGl0bGUubG9jYWxlQ29tcGFyZShiLnRpdGxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJlZS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaXJDb21wYXJlID1cbiAgICAgICAgICAgICAgICAoYi5kYXRhID09IHVuZGVmaW5lZCA/IDEgOiAwKSAtIChhLmRhdGEgPT0gdW5kZWZpbmVkID8gMSA6IDApO1xuICAgICAgICAgICAgaWYgKGRpckNvbXBhcmUgIT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaXJDb21wYXJlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS50aXRsZS5sb2NhbGVDb21wYXJlKGIudGl0bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRUcmVlU3RydWN0dXJlPFQgPSBEaWZmRmlsZSB8IEZpbGVTdGF0dXNSZXN1bHQ+KFxuICAgICAgICBjaGlsZHJlbjogKFQgJiB7IHBhdGg6IHN0cmluZyB9KVtdXG4gICAgKTogVHJlZUl0ZW08VD5bXSB7XG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLl9nZXRUcmVlU3RydWN0dXJlPFQ+KGNoaWxkcmVuKTtcblxuICAgICAgICBjb25zdCByZXMgPSB0aGlzLnNpbXBsaWZ5PFQ+KHRyZWUpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGFzeW5jIGZvcm1hdENvbW1pdE1lc3NhZ2UodGVtcGxhdGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCBzdGF0dXM6IFN0YXR1cyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRlbXBsYXRlLmluY2x1ZGVzKFwie3tudW1GaWxlc319XCIpKSB7XG4gICAgICAgICAgICBzdGF0dXMgPSBhd2FpdCB0aGlzLnN0YXR1cygpO1xuICAgICAgICAgICAgY29uc3QgbnVtRmlsZXMgPSBzdGF0dXMuc3RhZ2VkLmxlbmd0aDtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShcInt7bnVtRmlsZXN9fVwiLCBTdHJpbmcobnVtRmlsZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVtcGxhdGUuaW5jbHVkZXMoXCJ7e2hvc3RuYW1lfX1cIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGhvc3RuYW1lID0gdGhpcy5wbHVnaW4ubG9jYWxTdG9yYWdlLmdldEhvc3RuYW1lKCkgfHwgXCJcIjtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShcInt7aG9zdG5hbWV9fVwiLCBob3N0bmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVtcGxhdGUuaW5jbHVkZXMoXCJ7e2ZpbGVzfX1cIikpIHtcbiAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1cyA/PyAoYXdhaXQgdGhpcy5zdGF0dXMoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXNldDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgICAgICAgICBsZXQgZmlsZXMgPSBcIlwiO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAxMDAgZmlsZXMsIHdlIGRvbid0IGxpc3QgdGhlbSBhbGxcbiAgICAgICAgICAgIGlmIChzdGF0dXMuc3RhZ2VkLmxlbmd0aCA8IDEwMCkge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5zdGFnZWQuZm9yRWFjaCgodmFsdWU6IEZpbGVTdGF0dXNSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4IGluIGNoYW5nZXNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc2V0W3ZhbHVlLmluZGV4XS5wdXNoKHZhbHVlLnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc2V0W3ZhbHVlLmluZGV4XSA9IFt2YWx1ZS5wYXRoXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbYWN0aW9uLCBmaWxlc10gb2YgT2JqZWN0LmVudHJpZXMoY2hhbmdlc2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChhY3Rpb24gKyBcIiBcIiArIGZpbGVzLmpvaW4oXCIgXCIpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWxlcyA9IGNodW5rcy5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbGVzID0gXCJUb28gbWFueSBmaWxlcyB0byBsaXN0XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShcInt7ZmlsZXN9fVwiLCBmaWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb21lbnQgPSAod2luZG93IGFzIGFueSkubW9tZW50O1xuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoXG4gICAgICAgICAgICBcInt7ZGF0ZX19XCIsXG4gICAgICAgICAgICBtb21lbnQoKS5mb3JtYXQodGhpcy5wbHVnaW4uc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLmxpc3RDaGFuZ2VkRmlsZXNJbk1lc3NhZ2VCb2R5KSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMyID0gc3RhdHVzID8/IChhd2FpdCB0aGlzLnN0YXR1cygpKTtcbiAgICAgICAgICAgIGxldCBmaWxlcyA9IFwiXCI7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDEwMCBmaWxlcywgd2UgZG9uJ3QgbGlzdCB0aGVtIGFsbFxuICAgICAgICAgICAgaWYgKHN0YXR1czIuc3RhZ2VkLmxlbmd0aCA8IDEwMCkge1xuICAgICAgICAgICAgICAgIGZpbGVzID0gc3RhdHVzMi5zdGFnZWQubWFwKChlKSA9PiBlLnBhdGgpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbGVzID0gXCJUb28gbWFueSBmaWxlcyB0byBsaXN0XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlICsgXCJcXG5cXG5cIiArIFwiQWZmZWN0ZWQgZmlsZXM6XCIgKyBcIlxcblwiICsgZmlsZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBFeHRlbnNpb24sIFByZWMgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBzdWJzY3JpYmVOZXdFZGl0b3IgfSBmcm9tIFwic3JjL2xpbmVBdXRob3IvY29udHJvbFwiO1xuaW1wb3J0IHsgZXZlbnRzUGVyRmlsZVBhdGhTaW5nbGV0b24gfSBmcm9tIFwic3JjL2xpbmVBdXRob3IvZXZlbnRzUGVyRmlsZXBhdGhcIjtcbmltcG9ydCB7XG4gICAgTGluZUF1dGhvcmluZyxcbiAgICBMaW5lQXV0aG9yaW5nSWQsXG4gICAgbGluZUF1dGhvclN0YXRlLFxuICAgIGxpbmVBdXRob3JpbmdJZCxcbn0gZnJvbSBcInNyYy9saW5lQXV0aG9yL21vZGVsXCI7XG5pbXBvcnQgeyBjbGVhclZpZXdDYWNoZSB9IGZyb20gXCJzcmMvbGluZUF1dGhvci92aWV3L2NhY2hlXCI7XG5pbXBvcnQgeyBsaW5lQXV0aG9yR3V0dGVyIH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL3ZpZXcvdmlld1wiO1xuaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCJzcmMvbWFpblwiO1xuXG5leHBvcnQgeyBwcmV2aWV3Q29sb3IgfSBmcm9tIFwic3JjL2xpbmVBdXRob3Ivdmlldy9ndXR0ZXIvY29sb3JpbmdcIjtcbi8qKlxuICogKiBoYW5kbGVzIGNoYW5nZXMgaW4gZ2l0IGhlYWQsIGZpbGVzeXN0ZW0sIGV0Yy4gYnkgaW5pdGlhdGluZyBjb21wdXRhdGlvblxuICogKiBJbml0aWF0ZXMgdGhlIGxpbmUgYXV0aG9yaW5nIGNvbXB1dGF0aW9uIHZpYVxuICogPGEgaHJlZj1cImh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtYmxhbWVcIj5naXQtYmxhbWU8L2E+XG4gKiAqIG5vdGlmaWVzIGNvbXB1dGF0aW9uIHJlc3VsdHMgYW5kIHNldHRpbmdzIHRvIHN1YnNjcmliZXJzIChlZGl0b3JzKVxuICogKiBkZXl0cm95cyBjYWNoZSBhbmQgZWRpdG9yLXN1YnNjcmliZXJzIHdoZW4gcGx1Z2luIGlzIGRlYWN0aXZhdGVkXG4gKi9cbmV4cG9ydCBjbGFzcyBMaW5lQXV0aG9yUHJvdmlkZXIge1xuICAgIC8qKlxuICAgICAqIFNhdmVzIGFsbCBjb21wdXRlZCBsaW5lIGF1dGhvcmluZyByZXN1bHRzLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBMaW5lQXV0aG9yaW5nSWR9XG4gICAgICovXG4gICAgcHJpdmF0ZSBsaW5lQXV0aG9yaW5nczogTWFwPExpbmVBdXRob3JpbmdJZCwgTGluZUF1dGhvcmluZz4gPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBsdWdpbjogT2JzaWRpYW5HaXQpIHt9XG5cbiAgICBwdWJsaWMgYXN5bmMgdHJhY2tDaGFuZ2VkKGZpbGU6IFRGaWxlKSB7XG4gICAgICAgIHRoaXMudHJhY2tDaGFuZ2VkSGVscGVyKGZpbGUpLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkdpdDogRXJyb3IgaW4gdHJhY2tDaGFuZ2VkLlwiICsgcmVhc29uKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHRyYWNrQ2hhbmdlZEhlbHBlcihmaWxlOiBURmlsZSkge1xuICAgICAgICBpZiAoIWZpbGUpIHJldHVybjtcblxuICAgICAgICBpZiAoZmlsZS5wYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBcIkdpdDogQXR0ZW1wdGVkIHRvIHRyYWNrIGNoYW5nZSBvZiB1bmRlZmluZWQgZmlsZXBhdGguIFVuZm9yZXNlZW4gc2l0dWF0aW9uLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wdXRlTGluZUF1dGhvckluZm8oZmlsZS5wYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5saW5lQXV0aG9yaW5ncy5jbGVhcigpO1xuICAgICAgICBldmVudHNQZXJGaWxlUGF0aFNpbmdsZXRvbi5jbGVhcigpO1xuICAgICAgICBjbGVhclZpZXdDYWNoZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29tcHV0ZUxpbmVBdXRob3JJbmZvKGZpbGVwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZ2l0TWFuYWdlciA9XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5saW5lQXV0aG9yaW5nRmVhdHVyZS5pc0F2YWlsYWJsZU9uQ3VycmVudFBsYXRmb3JtKClcbiAgICAgICAgICAgICAgICAuZ2l0TWFuYWdlcjtcblxuICAgICAgICBjb25zdCBoZWFkUmV2aXNpb24gPVxuICAgICAgICAgICAgYXdhaXQgZ2l0TWFuYWdlci5zdWJtb2R1bGVBd2FyZUhlYWRSZXZpc29uSW5Db250YWluaW5nRGlyZWN0b3J5KFxuICAgICAgICAgICAgICAgIGZpbGVwYXRoXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGZpbGVIYXNoID0gYXdhaXQgZ2l0TWFuYWdlci5oYXNoT2JqZWN0KGZpbGVwYXRoKTtcblxuICAgICAgICBjb25zdCBrZXkgPSBsaW5lQXV0aG9yaW5nSWQoaGVhZFJldmlzaW9uLCBmaWxlSGFzaCwgZmlsZXBhdGgpO1xuXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGluZUF1dGhvcmluZ3MuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgY29tcHV0ZWQuIGp1c3QgdGVsbCB0aGUgZWRpdG9yIHRvIHVwZGF0ZSB0byB0aGUga2V5J3Mgc3RhdGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGdpdEF1dGhvclJlc3VsdCA9IGF3YWl0IGdpdE1hbmFnZXIuYmxhbWUoXG4gICAgICAgICAgICAgICAgZmlsZXBhdGgsXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubGluZUF1dGhvci5mb2xsb3dNb3ZlbWVudCxcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5saW5lQXV0aG9yLmlnbm9yZVdoaXRlc3BhY2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmxpbmVBdXRob3JpbmdzLnNldChrZXksIGdpdEF1dGhvclJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5vdGlmeUNvbXB1dGF0aW9uUmVzdWx0VG9TdWJzY3JpYmVycyhmaWxlcGF0aCwga2V5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUNvbXB1dGF0aW9uUmVzdWx0VG9TdWJzY3JpYmVycyhcbiAgICAgICAgZmlsZXBhdGg6IHN0cmluZyxcbiAgICAgICAga2V5OiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgZXZlbnRzUGVyRmlsZVBhdGhTaW5nbGV0b24uaWZGaWxlcGF0aERlZmluZWRUcmFuc2Zvcm1TdWJzY3JpYmVycyhcbiAgICAgICAgICAgIGZpbGVwYXRoLFxuICAgICAgICAgICAgYXN5bmMgKHN1YnMpID0+XG4gICAgICAgICAgICAgICAgc3Vicy5mb3JFYWNoKChzdWIpID0+XG4gICAgICAgICAgICAgICAgICAgIHN1Yi5ub3RpZnlMaW5lQXV0aG9yaW5nKGtleSwgdGhpcy5saW5lQXV0aG9yaW5ncy5nZXQoa2V5KSEpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBlbmFibGVkTGluZUF1dGhvckluZm9FeHRlbnNpb25zOiBFeHRlbnNpb24gPSBQcmVjLmhpZ2goW1xuICAgIHN1YnNjcmliZU5ld0VkaXRvcixcbiAgICBsaW5lQXV0aG9yU3RhdGUsXG4gICAgbGluZUF1dGhvckd1dHRlcixcbl0pO1xuIiwgImltcG9ydCB7IEVkaXRvclN0YXRlLCBTdGF0ZUZpZWxkIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcbmltcG9ydCB7IGVkaXRvckVkaXRvckZpZWxkLCBlZGl0b3JWaWV3RmllbGQgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IGV2ZW50c1BlckZpbGVQYXRoU2luZ2xldG9uIH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL2V2ZW50c1BlckZpbGVwYXRoXCI7XG5pbXBvcnQge1xuICAgIExpbmVBdXRob3JpbmcsXG4gICAgTGluZUF1dGhvcmluZ0lkLFxuICAgIG5ld0NvbXB1dGF0aW9uUmVzdWx0QXNUcmFuc2FjdGlvbixcbn0gZnJvbSBcInNyYy9saW5lQXV0aG9yL21vZGVsXCI7XG5cbi8qXG49PT09PT09PT09PT09PT09PT0gQ09OVFJPTCA9PT09PT09PT09PT09PT09PT09PT09XG5Db250YWlucyBjbGFzc2VzIGFuZCBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgdGhlIG1vZGVsXG5naXZlbiB0aGUgY2hhbmdlcyBpbiB0aGUgT2JzaWRpYW4gVUkuXG4qL1xuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gY2hhbmdlcyBpbiB0aGUgZmlsZXMgb24gYSBzcGVjaWZpYyBmaWxlcGF0aC5cbiAqIEl0IGtub3dzIGl0cyBjb3JyZXNwb25kaW5nIGVkaXRvciBhbmQgaW5pdGlhdGVzIGVkaXRvciB2aWV3IGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaW5lQXV0aG9yaW5nU3Vic2NyaWJlciB7XG4gICAgcHJpdmF0ZSBsYXN0U2VlblBhdGg6IHN0cmluZzsgLy8gcmVtZW1iZXIgcGF0aCB0byBkZXRlY3QgYW5kIGFkYXB0IHRvIHJlbmFtZXNcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RhdGU6IEVkaXRvclN0YXRlKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlTWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbm90aWZ5TGluZUF1dGhvcmluZyhpZDogTGluZUF1dGhvcmluZ0lkLCBsYTogTGluZUF1dGhvcmluZykge1xuICAgICAgICBpZiAodGhpcy52aWV3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBgR2l0OiBWaWV3IGlzIG5vdCBkZWZpbmVkIGZvciBlZGl0b3IgY2FjaGUga2V5LiBVbmZvcmVzZWVuIHNpdHVhdGlvbi4gaWQ6ICR7aWR9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzaW5nIFwidGhpcy5zdGF0ZVwiIGRpcmVjdGx5IGhlcmUgbGVhZHMgdG8gc29tZSBwcm9ibGVtcyB3aGVuIGNsb3NpbmcgcGFuZXMuIEhlbmNlLCBcInRoaXMudmlldy5zdGF0ZVwiXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy52aWV3LnN0YXRlO1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ld0NvbXB1dGF0aW9uUmVzdWx0QXNUcmFuc2FjdGlvbihpZCwgbGEsIHN0YXRlKTtcbiAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHRyYW5zYWN0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlVG9OZXdTdGF0ZShzdGF0ZTogRWRpdG9yU3RhdGUpIHtcbiAgICAgICAgLy8gaWYgZmlsZXBhdGggaGFzIGNoYW5nZWQsIHRoZW4gcmUtc3ViY3JpYmUuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoQ2hhbmdlZCA9XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWVuUGF0aCAmJiB0aGlzLmZpbGVwYXRoICE9IHRoaXMubGFzdFNlZW5QYXRoO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG5cbiAgICAgICAgaWYgKGZpbGVwYXRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZU1lKHRoaXMubGFzdFNlZW5QYXRoKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlTWUoKTtcbiAgICAgICAgICAgIC8vIHRoZSB1cGRhdGUgb2YgdGhlIHZpZXcgYnkgc3RhcnRpbmcgYSBuZXcgY29tcHV0YXRpb24gaXMgZG9uZSBieVxuICAgICAgICAgICAgLy8gbGlzdGVuaW5nIHRvIHJlbmFtZSBldmVudHMgaW4gdGhlIGxpbmUgYXV0aG9yaW5nIGNvbnRyb2xsZXIuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlSWZTdGFsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCg8YW55PnRoaXMudmlldykuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlTWUodGhpcy5sYXN0U2VlblBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVNZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsZXBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBoYXBwZW5zIG9uIHRoZSB2ZXJ5IGZpcnN0IGVkaXRvciBhZnRlciBzdGFydC5cblxuICAgICAgICBldmVudHNQZXJGaWxlUGF0aFNpbmdsZXRvbi5pZkZpbGVwYXRoRGVmaW5lZFRyYW5zZm9ybVN1YnNjcmliZXJzKFxuICAgICAgICAgICAgdGhpcy5maWxlcGF0aCxcbiAgICAgICAgICAgIChzdWJzKSA9PiBzdWJzLmFkZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxhc3RTZWVuUGF0aCA9IHRoaXMuZmlsZXBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bnN1YnNjcmliZU1lKG9sZEZpbGVwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgZXZlbnRzUGVyRmlsZVBhdGhTaW5nbGV0b24uaWZGaWxlcGF0aERlZmluZWRUcmFuc2Zvcm1TdWJzY3JpYmVycyhcbiAgICAgICAgICAgIG9sZEZpbGVwYXRoLFxuICAgICAgICAgICAgKHN1YnMpID0+IHN1YnMuZGVsZXRlKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZmlsZXBhdGgoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuZmllbGQoZWRpdG9yVmlld0ZpZWxkKT8uZmlsZT8ucGF0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCB2aWV3KCk6IEVkaXRvclZpZXcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5maWVsZChlZGl0b3JFZGl0b3JGaWVsZCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBMaW5lQXV0aG9yaW5nU3Vic2NyaWJlcnMgPSBTZXQ8TGluZUF1dGhvcmluZ1N1YnNjcmliZXI+O1xuXG4vKipcbiAqIFRoZSBDb2RlbWlycm9yIHtAbGluayBFeHRlbnNpb259IHVzZWQgdG8gbWFrZSBlYWNoIGVkaXRvciBzdWJzY3JpYmUgaXRzZWxmIHRvIHRoaXMgcHViLXN1Yi5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1YnNjcmliZU5ld0VkaXRvcjogU3RhdGVGaWVsZDxMaW5lQXV0aG9yaW5nU3Vic2NyaWJlcj4gPVxuICAgIFN0YXRlRmllbGQuZGVmaW5lPExpbmVBdXRob3JpbmdTdWJzY3JpYmVyPih7XG4gICAgICAgIGNyZWF0ZTogKHN0YXRlKSA9PiBuZXcgTGluZUF1dGhvcmluZ1N1YnNjcmliZXIoc3RhdGUpLFxuICAgICAgICB1cGRhdGU6ICh2LCB0cmFuc2FjdGlvbikgPT4gdi51cGRhdGVUb05ld1N0YXRlKHRyYW5zYWN0aW9uLnN0YXRlKSxcbiAgICAgICAgY29tcGFyZTogKGEsIGIpID0+IGEgPT09IGIsXG4gICAgfSk7XG4iLCAiaW1wb3J0IHtcbiAgICBMaW5lQXV0aG9yaW5nU3Vic2NyaWJlcixcbiAgICBMaW5lQXV0aG9yaW5nU3Vic2NyaWJlcnMsXG59IGZyb20gXCJzcmMvbGluZUF1dGhvci9jb250cm9sXCI7XG5cbmNvbnN0IFNFQ09ORFMgPSAxMDAwO1xuY29uc3QgUkVNT1ZFX1NUQUxFU19GUkVRVUVOQ1kgPSA2MCAqIFNFQ09ORFM7XG5cbi8qKlxuICogKiBzdG9yZXMgdGhlIHN1YnNjcmliZXJzL2VkaXRvcnMgaW50ZXJlc3RlZCBpbiBjaGFuZ2VkIHBlciBmaWxlcGF0aFxuICogKiBXZSBuZWVkIHRoaXMgcHViLXN1YiBkZXNpZ24sIGJlY2F1c2UgYSBmaWxlcGF0aCBtYXkgYmUgb3BlbmVkIGluIG11bHRpcGxlIGVkaXRvcnNcbiAqICAgYW5kIGVhY2ggZWRpdG9yIHNob3VsZCBiZSB1cGRhdGVkIGFzeW5jaHJvbm91c2x5IGFuZCBpbmRlcGVuZGVudGx5LlxuICogKiBTdWJzY3JpYmVycyBjYW4gYmUgY2xlYXJlZCB3aGVuIHRoZSBmZWF0dXJlIGlzIGRlYWN0aXZhdGVkXG4gKi9cbmNsYXNzIEV2ZW50c1BlckZpbGVQYXRoIHtcbiAgICBwcml2YXRlIGV2ZW50c1BlckZpbGVwYXRoOiBNYXA8c3RyaW5nLCBMaW5lQXV0aG9yaW5nU3Vic2NyaWJlcnM+ID1cbiAgICAgICAgbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgcmVtb3ZlU3RhbGVzU3Vic2NyaWJlcnNUaW1lcjogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3RhcnRSZW1vdmVTdGFsZXNTdWJzY3JpYmVyc0ludGVydmFsKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIHRoZSB7QGxpbmsgaGFuZGxlcn0gb24gdGhlIHN1YnNjcmliZXJzIHRvIHtAbGluayBmaWxlcGF0aH0uXG4gICAgICovXG4gICAgcHVibGljIGlmRmlsZXBhdGhEZWZpbmVkVHJhbnNmb3JtU3Vic2NyaWJlcnM8VD4oXG4gICAgICAgIGZpbGVwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIGhhbmRsZXI6IChsYXNzOiBMaW5lQXV0aG9yaW5nU3Vic2NyaWJlcnMpID0+IFRcbiAgICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKCFmaWxlcGF0aCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoZmlsZXBhdGgpO1xuXG4gICAgICAgIHJldHVybiBoYW5kbGVyKHRoaXMuZXZlbnRzUGVyRmlsZXBhdGguZ2V0KGZpbGVwYXRoKSEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JFYWNoU3Vic2NyaWJlcihcbiAgICAgICAgaGFuZGxlcjogKGxhczogTGluZUF1dGhvcmluZ1N1YnNjcmliZXIpID0+IHZvaWRcbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudHNQZXJGaWxlcGF0aC5mb3JFYWNoKChzdWJzKSA9PiBzdWJzLmZvckVhY2goaGFuZGxlcikpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5zdXJlSW5pdGlhbGl6ZWQoZmlsZXBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuZXZlbnRzUGVyRmlsZXBhdGguZ2V0KGZpbGVwYXRoKSlcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzUGVyRmlsZXBhdGguc2V0KGZpbGVwYXRoLCBuZXcgU2V0KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhcnRSZW1vdmVTdGFsZXNTdWJzY3JpYmVyc0ludGVydmFsKCkge1xuICAgICAgICB0aGlzLnJlbW92ZVN0YWxlc1N1YnNjcmliZXJzVGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoXG4gICAgICAgICAgICAoKSA9PiB0aGlzPy5mb3JFYWNoU3Vic2NyaWJlcigobGFzKSA9PiBsYXM/LnJlbW92ZUlmU3RhbGUoKSksXG4gICAgICAgICAgICBSRU1PVkVfU1RBTEVTX0ZSRVFVRU5DWVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5yZW1vdmVTdGFsZXNTdWJzY3JpYmVyc1RpbWVyKTtcbiAgICAgICAgdGhpcy5ldmVudHNQZXJGaWxlcGF0aC5jbGVhcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGV2ZW50c1BlckZpbGVQYXRoU2luZ2xldG9uID0gbmV3IEV2ZW50c1BlckZpbGVQYXRoKCk7XG4iLCAiaW1wb3J0IHtcbiAgICBBbm5vdGF0aW9uLFxuICAgIEFubm90YXRpb25UeXBlLFxuICAgIEVkaXRvclN0YXRlLFxuICAgIFN0YXRlRmllbGQsXG4gICAgVHJhbnNhY3Rpb24sXG59IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHsgSGFzaGVyLCBzaGEyNTYgfSBmcm9tIFwianMtc2hhMjU2XCI7XG5pbXBvcnQgeyBSR0IgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IERFRkFVTFRfU0VUVElOR1MgfSBmcm9tIFwic3JjL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcGFyc2VDb2xvcmluZ01heEFnZUR1cmF0aW9uIH0gZnJvbSBcInNyYy9zZXR0aW5nL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBCbGFtZSB9IGZyb20gXCJzcmMvdHlwZXNcIjtcblxuLypcbj09PT09PT09PT09PT09PT09PSBNT0RFTCA9PT09PT09PT09PT09PT09PT09PT09XG5Db250YWlucyB0eXBlcyBhbmQgdmFyaWFibGVzIGRlc2NyaWJpbmcgdGhlIGVzc2VudGlhbFxuY29udGVudHMgb2YgdGhlIGxpbmUgYXV0aG9yaW5nIGFuZCBmdXJ0aGVyIHR5cGVzLlxuKi9cblxuLy8gdXNlIGEgbW9yZSBuZXV0cmFsIHdvcmQgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eVxuZXhwb3J0IHR5cGUgTGluZUF1dGhvcmluZyA9IEJsYW1lIHwgXCJ1bnRyYWNrZWRcIjtcblxuLyoqXG4gKiBBbiBpZGVudGlmaWVyIGZvciBlYWNoIGxpbmUgYXV0aG9yaW5nLlxuICpcbiAqIEZvciBldmVyeSB7QGxpbmsgTGluZUF1dGhvcmluZ30gdGhlcmUgaXMgZXhhY3RseSBvbmUgdmFsaWQgY29ycmVzcG9uZGluZyB7QGxpbmsgTGluZUF1dGhvcmluZ0lkfVxuICogVGhpcyBpcyB1c2VkIHRvIGRpc2FtYmlndWF0ZSBkaWZmZXJpbmcgbGluZSBhdXRob3JpbmcgY29udGVudC5cbiAqXG4gKiBGb3IgaW5zdGFuY2UsIHdoZW4gdGhlcmUgYXJlIFVJLWNoYW5nZXMgaW4gYW4gZWRpdG9yLCB3ZSB3YW50IHRvIHF1aWNrbHkgZmlndXJlIG91dFxuICogd2hldGhlciB0aGUgTGluZUF1dGhvcmluZyBoYXMgY2hhbmdlZCBhcyB3ZWxsLiBDb21wdXRpbmcgdGhpcyBjYWNoZS1pZGVudGlmaXlpbmcga2V5L2lkXG4gKiBhbGxvd3MgdXMgdG8gcXVpY2tseSBmaW5kIHRoYXQgb3V0IGFuZCBhdm9pZCByZS1jb21wdXRpbmcgdGhlIHJlc3VsdCwgaWYgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIGxpbmUgYXV0aG9yaW5nIGFscmVhZHkgaGFzIGJlZW4gY29tcHV0ZWQuIFRoaXMgaXMgdXNlZCBpbiBsaW5lQXV0aG9ySW5mb1Byb3ZpZGVyLnRzLlxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcywgdGhhdCBlYWNoIHtAbGluayBMaW5lQXV0aG9yaW5nfSBpcyB1bmlxdWUsIGdpdmVuXG4gKiB0aGUgSEVBRCByZXZpc2lvbiBvZiB0aGUgZ2l0IHJlcG9zaXRvcnksIHRoZSBoYXNoIG9mIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFuZFxuICogdGhlIHBhdGggdG8gdGhlIGZpbGUgd2l0aGluIHRoZSB2YXVsdC4gVGhlIGV4YWN0IHN5bnRheCBpcyBkZXRlcm1pbmVkIGJ5IHtAbGluayBsaW5lQXV0aG9yaW5nSWR9LlxuICpcbiAqICogSEVBRDogVGhpcyBlbnN1cmVzLCB0aGF0IGFkZGluZyBhIG5ldyBjb21taXQgb3IgY2hhbmdpbmcgdGhlIGNoZWNrZWQgb3V0IHJldmlzaW9uXG4gKiAgICAgIGZvcmNlcyByZS1jb21wdXRhdGlvbi5cbiAqICAgKiBXZSBhbHdheXMgd2FudCB0byB1c2UgdGhlIHN1Ym1vZHVsZSB3aGljaCBjb250YWlucyB0aGUgZmlsZSByYXRoZXIgdGhhbiBhbnkgc3VwZXItcHJvamVjdCxcbiAqICAgICBhcyB0aGUgZmlsZSBpcyBvbmx5IGNvbW1pdHRlZCBpbiBsb3dlc3QgbGV2ZWwgc3VibW9kdWxlIC0gYW5kIG9ubHkgaXQncyBIRUFEIHJldmlzaW9uXG4gKiAgICAgd2lsbCBiZSB1cGRhdGVkIGR1cmluZyBhIGNvbW1pdC5cbiAqICogY29udGVudHMtaGFzaDogV2hlbmV2ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHByb2R1Y2UgYSBkaWZmZXJlbnQgaGFzaCxcbiAqICAgICAgdGhlIHZpZXcgbmVlZHMgdXBkYXRpbmcgLSBoZW5jZSB0aGUgcmUtY29tcHV0YXRpb24uXG4gKiAqIHRoZSBwYXRoIG9mIHRoZSBmaWxlIGluIGdpdCBtYXR0ZXJzIGFzIHdlbGwsIGFzIHRoZSBleGFjdCBmaWxlIGNvbnRlbnQgYXQgZGlmZmVyZW50XG4gKiAgICAgIHBhdGhzIGluIGEgZ2l0IHJlcG9zaXRvcnkgY2FuIGhhdmUgZGlmZmVyZW50IGhpc3Rvcmllc1xuICovXG5leHBvcnQgdHlwZSBMaW5lQXV0aG9yaW5nSWQgPSBzdHJpbmc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lQXV0aG9yaW5nSWQoXG4gICAgaGVhZDogc3RyaW5nLFxuICAgIG9iakhhc2g6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmdcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGhlYWQgPT09IHVuZGVmaW5lZCB8fCBvYmpIYXNoID09PSB1bmRlZmluZWQgfHwgcGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBgaGVhZCR7aGVhZH0tb2JqJHtvYmpIYXNofS1wYXRoJHtwYXRofWA7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT0gTGluZUF1dGhvcmluZyBpbnNpZGUgYSBDb2RlbWlycm9yIFRyYW5zYWN0aW9uID09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBMaW5lQXV0aG9yaW5nV2l0aENoYW5nZXMgPSB7XG4gICAgbGE6IExpbmVBdXRob3Jpbmc7XG4gICAga2V5OiBMaW5lQXV0aG9yaW5nSWQ7XG4gICAgLyoqXG4gICAgICogU2VlIHtAbGluayBlbnJpY2hVbnNhdmVkQ2hhbmdlc31cbiAgICAgKi9cbiAgICBsaW5lT2Zmc2V0c0Zyb21VbnNhdmVkQ2hhbmdlczogTWFwPG51bWJlciwgbnVtYmVyPjtcbn07XG5cbi8qKlxuICogVGhlIHtAbGluayBBbm5vdGF0aW9ufSB1c2VkIGluIENvZGVtaXJyb3Ige0BsaW5rIFRyYW5zYWN0aW9ufXMgdG9cbiAqIHVwZGF0ZSB0aGUge0BsaW5rIEVkaXRvclN0YXRlfSB3aXRoIHRoZSB7QGxpbmsgTGluZUF1dGhvcmluZ30sIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAqXG4gKiBTZWUgdXNlcnMgb2Yge0BsaW5rIG5ld0NvbXB1dGF0aW9uUmVzdWx0QXNUcmFuc2FjdGlvbn0gZm9yIHRoZSB2YWx1ZSBwcm92aWRlcnMuXG4gKiBUaGUge0BsaW5rIFN0YXRlRmllbGR9IHtAbGluayBsaW5lQXV0aG9yU3RhdGV9IGhvbGQgdGhlIHZhbHVlIG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gKi9cbmNvbnN0IExpbmVBdXRob3JpbmdDb250YWluZXJUeXBlOiBBbm5vdGF0aW9uVHlwZTxMaW5lQXV0aG9yaW5nV2l0aENoYW5nZXM+ID1cbiAgICBBbm5vdGF0aW9uLmRlZmluZTxMaW5lQXV0aG9yaW5nV2l0aENoYW5nZXM+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdDb21wdXRhdGlvblJlc3VsdEFzVHJhbnNhY3Rpb24oXG4gICAga2V5OiBMaW5lQXV0aG9yaW5nSWQsXG4gICAgbGE6IExpbmVBdXRob3JpbmcsXG4gICAgc3RhdGU6IEVkaXRvclN0YXRlXG4pOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHN0YXRlLnVwZGF0ZSh7XG4gICAgICAgIGFubm90YXRpb25zOiBMaW5lQXV0aG9yaW5nQ29udGFpbmVyVHlwZS5vZih7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBsYSxcbiAgICAgICAgICAgIGxpbmVPZmZzZXRzRnJvbVVuc2F2ZWRDaGFuZ2VzOiBuZXcgTWFwKCksXG4gICAgICAgIH0pLFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lQXV0aG9yQW5ub3RhdGlvbihcbiAgICB0cjogVHJhbnNhY3Rpb25cbik6IExpbmVBdXRob3JpbmdXaXRoQ2hhbmdlcyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRyLmFubm90YXRpb24oTGluZUF1dGhvcmluZ0NvbnRhaW5lclR5cGUpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09IENvZGVtaXJyb3IgU3RhdGVGaWVsZCBjb250YWluaW5nIHRoZSBjdXJyZW50IExpbmUgQXV0aG9yaW5nID09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBUaGUgQ29kZW1pcnJvciB7QGxpbmsgU3RhdGVGaWVsZH0gd2hpY2ggY29udGFpbnMgdGhlIGN1cnJlbnQge0BsaW5rIExpbmVBdXRob3Jpbmd9XG4gKiB0aGF0IGlzIGJlaW5nIHNob3duLlxuICpcbiAqIFRoZSB1cGRhdGUgbWV0aG9kIGV4dHJhY3RzIHRoZSB2YWx1ZSBmcm9tIHRoZSBhbm5vdGF0aW9uLCBpZiBvbmUgaXMgcHJvdmlkZWQuXG4gKlxuICogU3RyaWN0bHkgc3BlYWtpbmcsIGlmIHRoZSBhbm5vdGF0aW9uIG9mIGEgcHJldmlvdXMgYW5kIG91dGRhdGVkIGNvbXB1dGF0aW9uXG4gKiBhcHBlYXJzIGFmdGVyIGEgbmV3IGEgcmVjZW50IG9uZSwgaXQgbWlnaHQgaGFwcGVuLCB0aGF0IHRoZSBvbGQgYW5kIHN0YWxlIG9uZVxuICogd2lsbCBiZSBzaG93biBpbnN0ZWFkLiBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBldmVyIHNob3cgdGhlIGFubm90YXRpb24gd2hpY2hcbiAqIHdhcyBtb3N0IHJlY2VudGx5IGluIGEgdHJhbnNhY3Rpb24gLSBhbmQgd2UgZG8gbm90IHRyYWNrIGFueSB0aW1lIGhlcmUuXG4gKlxuICogV2hlbiBjYWNoaW5nIHRoaXMsIHBsZWFzZSB1c2Uge0BsaW5rIGxhU3RhdGVEaWdlc3R9IHRvIGNvbXB1dGUgdGhlIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxpbmVBdXRob3JTdGF0ZTogU3RhdGVGaWVsZDxMaW5lQXV0aG9yaW5nV2l0aENoYW5nZXMgfCB1bmRlZmluZWQ+ID1cbiAgICBTdGF0ZUZpZWxkLmRlZmluZTxMaW5lQXV0aG9yaW5nV2l0aENoYW5nZXMgfCB1bmRlZmluZWQ+KHtcbiAgICAgICAgY3JlYXRlOiAoX3N0YXRlKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc3RhdGUgY2FuIGJlIHVwZGF0ZWQgZnJvbSBlaXRoZXIgYW4gYW5ub3RhdGVkIHRyYW5zYWN0aW9uIGNvbnRhaW5pbmdcbiAgICAgICAgICogdGhlIG5ld2VzdCBsaW5lIGF1dGhvcmluZyAoZm9yIHRoZSBzYXZlZCBkb2N1bWVudCkgLSBvciBmcm9tXG4gICAgICAgICAqIHVuc2F2ZWQgY2hhbmdlcyBvZiB0aGUgZG9jdW1lbnQgYXMgdGhlIHVzZXIgaXMgYWN0aXZlbHkgdHlwaW5nIGluIHRoZSBlZGl0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEluIHRoZSBmaXJzdCBjYXNlLCB3ZSB0YWtlIHRoZSBuZXcgbGluZSBhdXRob3JpbmcgYW5kIGRpc2NhcmQgYW55dGhpbmcgd2UgaGFkIHJlbWVtYmVyZWRcbiAgICAgICAgICogZnJvbSB1bnNhdmVkIGNoYW5nZXMuIEluIHRoZSBzZWNvbmQgY2FzZSwgd2UgdXNlIHRoZSB1bnNhdmVkIGNoYW5nZXMgaW4ge0BsaW5rIGVucmljaFVuc2F2ZWRDaGFuZ2VzfSB0byBwcmUtY29tcHV0ZSBpbmZvcm1hdGlvbiB0byBpbW1lZGlhdGVseSB1cGRhdGUgdGhlXG4gICAgICAgICAqIGxpbmUgYXV0aG9yIGd1dHRlciB3aXRob3V0IG5lZWRpbmcgdG8gd2FpdCB1bnRpbCB0aGUgZG9jdW1lbnQgaXMgc2F2ZWQgYW5kIHRoZVxuICAgICAgICAgKiBsaW5lIGF1dGhvcmluZyBpcyBwcm9wZXJseSBjb21wdXRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZTogKHByZXZpb3VzLCB0cmFuc2FjdGlvbikgPT5cbiAgICAgICAgICAgIGdldExpbmVBdXRob3JBbm5vdGF0aW9uKHRyYW5zYWN0aW9uKSA/P1xuICAgICAgICAgICAgZW5yaWNoVW5zYXZlZENoYW5nZXModHJhbnNhY3Rpb24sIHByZXZpb3VzKSxcbiAgICAgICAgLy8gY29tcGFyZSBjYWNoZSBrZXlzLlxuICAgICAgICAvLyBlcXVhbGl0eSByYXRlIGlzID49IDk1JSA6KVxuICAgICAgICAvLyBoZW5jZSBhdm9pZHMgcmVjb21wdXRhdGlvbiBvZiB2aWV3c1xuICAgICAgICBjb21wYXJlOiAobCwgcikgPT4gbD8ua2V5ID09PSByPy5rZXksXG4gICAgfSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBsYVN0YXRlRGlnZXN0KFxuICAgIGxhU3RhdGU6IExpbmVBdXRob3JpbmdXaXRoQ2hhbmdlcyB8IHVuZGVmaW5lZFxuKTogSGFzaGVyIHtcbiAgICBjb25zdCBkaWdlc3QgPSBzaGEyNTYuY3JlYXRlKCk7XG4gICAgaWYgKCFsYVN0YXRlKSByZXR1cm4gZGlnZXN0O1xuXG4gICAgY29uc3QgeyBsYSwga2V5LCBsaW5lT2Zmc2V0c0Zyb21VbnNhdmVkQ2hhbmdlcyB9ID0gbGFTdGF0ZTtcbiAgICBkaWdlc3QudXBkYXRlKGxhID09PSBcInVudHJhY2tlZFwiID8gXCJ0XCIgOiBcImZcIik7XG4gICAgZGlnZXN0LnVwZGF0ZShrZXkpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIGxpbmVPZmZzZXRzRnJvbVVuc2F2ZWRDaGFuZ2VzLmVudHJpZXMoKSA/PyBbXSlcbiAgICAgICAgZGlnZXN0LnVwZGF0ZShbaywgdl0pO1xuICAgIHJldHVybiBkaWdlc3Q7XG59XG5cbi8vID09PT09PT09PT09PT09PSBMaW5lIEF1dGhvcmluZyBTZXR0aW5ncyA9PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBMaW5lQXV0aG9yU2V0dGluZ3MgPSB7XG4gICAgc2hvdzogYm9vbGVhbjtcbiAgICBzaG93Q29tbWl0SGFzaDogYm9vbGVhbjtcbiAgICBmb2xsb3dNb3ZlbWVudDogTGluZUF1dGhvckZvbGxvd01vdmVtZW50O1xuICAgIGF1dGhvckRpc3BsYXk6IExpbmVBdXRob3JEaXNwbGF5O1xuICAgIGxhc3RTaG93bkF1dGhvckRpc3BsYXk/OiBMaW5lQXV0aG9yRGlzcGxheTtcbiAgICBkYXRlVGltZUZvcm1hdE9wdGlvbnM6IExpbmVBdXRob3JEYXRlVGltZUZvcm1hdE9wdGlvbnM7XG4gICAgbGFzdFNob3duRGF0ZVRpbWVGb3JtYXRPcHRpb25zPzogTGluZUF1dGhvckRhdGVUaW1lRm9ybWF0T3B0aW9ucztcbiAgICBkYXRlVGltZUZvcm1hdEN1c3RvbVN0cmluZzogc3RyaW5nO1xuICAgIGRhdGVUaW1lVGltZXpvbmU6IExpbmVBdXRob3JUaW1lem9uZU9wdGlvbjtcbiAgICBjb2xvcmluZ01heEFnZTogc3RyaW5nO1xuICAgIGNvbG9yT2xkOiBSR0I7XG4gICAgY29sb3JOZXc6IFJHQjtcbiAgICB0ZXh0Q29sb3JDc3M6IHN0cmluZztcbiAgICBpZ25vcmVXaGl0ZXNwYWNlOiBib29sZWFuO1xuICAgIGd1dHRlclNwYWNpbmdGYWxsYmFja0xlbmd0aDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTGluZUF1dGhvckZvbGxvd01vdmVtZW50ID1cbiAgICB8IFwiaW5hY3RpdmVcIlxuICAgIHwgXCJzYW1lLWNvbW1pdFwiXG4gICAgfCBcImFsbC1jb21taXRzXCI7XG5cbmV4cG9ydCB0eXBlIExpbmVBdXRob3JEaXNwbGF5ID1cbiAgICB8IFwiaGlkZVwiXG4gICAgfCBcImZ1bGxcIlxuICAgIHwgXCJmaXJzdCBuYW1lXCJcbiAgICB8IFwibGFzdCBuYW1lXCJcbiAgICB8IFwiaW5pdGlhbHNcIjtcblxuZXhwb3J0IHR5cGUgTGluZUF1dGhvckRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9XG4gICAgfCBcImhpZGVcIlxuICAgIHwgXCJkYXRlXCJcbiAgICB8IFwiZGF0ZXRpbWVcIlxuICAgIHwgXCJuYXR1cmFsIGxhbmd1YWdlXCJcbiAgICB8IFwiY3VzdG9tXCI7XG5cbmV4cG9ydCB0eXBlIExpbmVBdXRob3JUaW1lem9uZU9wdGlvbiA9XG4gICAgfCBcInZpZXdlci1sb2NhbFwiXG4gICAgfCBcImF1dGhvci1sb2NhbFwiXG4gICAgfCBcInV0YzAwMDBcIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2xvYmFsIG11dGFibGUgY29udGFpbmVyIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGxhdGVzdCBPYnNpZGlhbiBzZXR0aW5ncy5cbiAqXG4gKiBUaGlzIGlzIHN0b3JlZCBoZXJlIGdsb2JhbGx5IGFuZCBwb3B1bGF0ZWQgZHVyaW5nIGxpbmUgYXV0aG9yIGZlYXR1cmUgbG9hZGluZ1xuICogdmlhIHtAbGluayBwcm92aWRlU2V0dGluZ3NBY2Nlc3N9LlxuICpcbiAqIEl0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgZWRpdG9ycyB3aXRoIHRoZSByZWNlbnQgc2V0dGluZ3Mgd2hlbiBjcmVhdGVkLCBhcyB0aGlzIGFsbG93c1xuICogdXMgdG8gY3JlYXRlIHRoZSBjb3JyZWN0IHNwYWNpbmcgdXAtZnJvbnQgYXMgd2VsbCBhcyBoYXZlIHRoZSBsYXRlc3Qgc2V0dGluZ3NcbiAqIHdoZW4gcmVuZGVyaW5nLlxuICovXG5leHBvcnQgY29uc3QgbGF0ZXN0U2V0dGluZ3MgPSB7XG4gICAgZ2V0OiB1bmRlZmluZWQhIGFzICgpID0+IExpbmVBdXRob3JTZXR0aW5ncyxcbiAgICBzYXZlOiB1bmRlZmluZWQhIGFzIChzZXR0aW5nczogTGluZUF1dGhvclNldHRpbmdzKSA9PiB2b2lkLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVTZXR0aW5nc0FjY2VzcyhcbiAgICBzZXR0aW5nc0dldHRlcjogKCkgPT4gTGluZUF1dGhvclNldHRpbmdzLFxuICAgIHNldHRpbmdzU2V0dGVyOiAoc2V0dGluZ3M6IExpbmVBdXRob3JTZXR0aW5ncykgPT4gdm9pZFxuKSB7XG4gICAgbGF0ZXN0U2V0dGluZ3MuZ2V0ID0gc2V0dGluZ3NHZXR0ZXI7XG4gICAgbGF0ZXN0U2V0dGluZ3Muc2F2ZSA9IHNldHRpbmdzU2V0dGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF4QWdlSW5EYXlzRnJvbVNldHRpbmdzKHNldHRpbmdzOiBMaW5lQXV0aG9yU2V0dGluZ3MpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBwYXJzZUNvbG9yaW5nTWF4QWdlRHVyYXRpb24oc2V0dGluZ3MuY29sb3JpbmdNYXhBZ2UpPy5hc0RheXMoKSA/P1xuICAgICAgICBwYXJzZUNvbG9yaW5nTWF4QWdlRHVyYXRpb24oXG4gICAgICAgICAgICBERUZBVUxUX1NFVFRJTkdTLmxpbmVBdXRob3IuY29sb3JpbmdNYXhBZ2VcbiAgICAgICAgKSEuYXNEYXlzKClcbiAgICApO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgdHJhbnNhY3Rpb24gY29udGFpbmluZyBlZGl0b3IgY2hhbmdlcyBhbmQgdGhlIHByZXZpb3VzIGxpbmUgYXV0aG9yIHN0YXRlLFxuICogd2Ugd2FudCB0byB1cGRhdGUgdGhlIGBsaW5lT2Zmc2V0c0Zyb21VbnNhdmVkQ2hhbmdlc2AgaW4ge0BsaW5rIExpbmVBdXRob3JpbmdXaXRoQ2hhbmdlc30uXG4gKlxuICogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBmb3IgZWFjaCBsaW5lIGBsbmAgaW4gdGhlIG5ldyBkb2N1bWVudCB0aGUgZm9sbG93aW5nOlxuICogKiBpZiB0aGUgbGluZSBoYXMgbm90IGJlZW4gY2hhbmdlZCwgdGhlbiBpdCBpcyBub3QgY29udGFpbmVkIGFuZCBgPG1hcD4uZ2V0KGxuKWAgaXMgdW5kZWZpbmVkLlxuICogKiBpZiB0aGUgbGluZSBoYXMgYmVlbiBjaGFuZ2VkIGFuZCBpdHMgQ2hhbmdlU2V0IGRvZXMgbm90IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGxpbmVzLFxuICogICB0aGVuIGA8bWFwPi5nZXQobG4pYCBpcyAwLlxuICogKiBpZiB0aGUgbGluZSBoYXMgYmVlbiBjaGFuZ2VkIGFuZCBpdHMgQ2hhbmdlU2V0IGluZGljYXRlcyB0aGF0IHRoZSBudW1iZXIgb2YgbGluZXMgaGFzIGNoYW5nZWRcbiAqICAgKGUuZy4gcmVtb3ZlZCBvciBhZGRlZCBsaW5lcyksIHRoZW4gYWxsIGJ1dCB0aGUgbGFzdCBsaW5lcyBpbiB0aGUgQ2hhbmdlU2V0IHdpbGwgaGF2ZVxuICogICBgPG1hcD4uZ2V0KGxuKT0wYCBhbmQgdGhlIGxhc3QgbGluZSB3aWxsIGhhdmUgYDxtYXA+LmdldChsbik9bmAgd2hlcmUgYG5gIGlzIHRoZSBudW1iZXJcbiAqICAgb2YgYWRkZWQgbGluZXMuIElmIGBuYCBpcyBuZWdhdGl2ZSwgdGhlbiBsaW5lcyBoYXZlIGJlZW4gcmVtb3ZlZCBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBlbnJpY2hVbnNhdmVkQ2hhbmdlcyhcbiAgICB0cjogVHJhbnNhY3Rpb24sXG4gICAgcHJldjogTGluZUF1dGhvcmluZ1dpdGhDaGFuZ2VzIHwgdW5kZWZpbmVkXG4pOiBMaW5lQXV0aG9yaW5nV2l0aENoYW5nZXMgfCB1bmRlZmluZWQge1xuICAgIGlmICghcHJldikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICghdHIuY2hhbmdlcy5lbXB0eSkge1xuICAgICAgICB0ci5jaGFuZ2VzLml0ZXJDaGFuZ2VzKChmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGREb2MgPSB0ci5zdGFydFN0YXRlLmRvYztcbiAgICAgICAgICAgIGNvbnN0IHsgbmV3RG9jIH0gPSB0cjtcblxuICAgICAgICAgICAgY29uc3QgYmVmb3JlRnJvbSA9IG9sZERvYy5saW5lQXQoZnJvbUEpLm51bWJlcjtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZVRvID0gb2xkRG9jLmxpbmVBdCh0b0EpLm51bWJlcjtcblxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJGcm9tID0gbmV3RG9jLmxpbmVBdChmcm9tQikubnVtYmVyO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXJUbyA9IG5ld0RvYy5saW5lQXQodG9CKS5udW1iZXI7XG5cbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZUxlbiA9IGJlZm9yZVRvIC0gYmVmb3JlRnJvbSArIDE7XG4gICAgICAgICAgICBjb25zdCBhZnRlckxlbiA9IGFmdGVyVG8gLSBhZnRlckZyb20gKyAxO1xuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgQ3VycmVudCBjaGFuZ2U6XG4gICAgICAgICAgICBUaGUgbGluZXMgYmVmb3JlRnJvbS4uYmVmb3JlVG8gKGNvbnRhaW5pbmcgYmVmb3JlTGVuIGxpbmVzKSBpbiB0aGUgb2xkIGRvY1xuICAgICAgICAgICAgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5XG4gICAgICAgICAgICB0aGUgbGluZXMgYWZ0ZXJGcm9tLi5hZnRlclRvIChjb250YWluaW5nIGFmdGVyTGVuIGxpbmVzKSBpbiB0aGUgbmV3IGRvYy5cbiAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIFRoZSBsaW5lcyBhZnRlckZyb20uLmFmdGVyVG8gZm9yIHdoaWNoIHdlIHdhbnQgdG9cbiAgICAgICAgICAgIC8vIHNldCBhbiBvZmZzZXQgaW4gbGluZU9mZnNldHNGcm9tVW5zYXZlZENoYW5nZXMuXG4gICAgICAgICAgICBmb3IgKGxldCBhZnRlckkgPSBhZnRlckZyb207IGFmdGVySSA8PSBhZnRlclRvOyBhZnRlckkrKykge1xuICAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIGNoYW5nZXMgY2FuIGJlIG1hZGUgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvblxuICAgICAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgZnJvbSBwcmV2aW91cyB0cmFuc2FjdGlvbnMgc2luY2UgdGhlIGxhc3QgZG9jdW1lbnQgc2F2ZS5cbiAgICAgICAgICAgICAgICAvLyBIZW5jZSwgd2Ugd2FudCB0byBjdW11bGF0ZSBhbGwgb2Zmc2V0cy5cbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID1cbiAgICAgICAgICAgICAgICAgICAgcHJldi5saW5lT2Zmc2V0c0Zyb21VbnNhdmVkQ2hhbmdlcy5nZXQoYWZ0ZXJJKSA/PyAwO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNMYXN0TGluZSA9IGFmdGVyVG8gPT09IGFmdGVySTtcblxuICAgICAgICAgICAgICAgIC8vIHBvc2l0aXZlID0gYWRkZWQgbGluZXMsIG5lZ2F0aXZlID0gcmVtb3ZlZCBsaW5lcy5cbiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VJbk51bWJlck9mTGluZXMgPSBhZnRlckxlbiAtIGJlZm9yZUxlbjtcbiAgICAgICAgICAgICAgICBpZiAoaXNMYXN0TGluZSkgb2Zmc2V0ICs9IGNoYW5nZUluTnVtYmVyT2ZMaW5lcztcblxuICAgICAgICAgICAgICAgIHByZXYubGluZU9mZnNldHNGcm9tVW5zYXZlZENoYW5nZXMuc2V0KGFmdGVySSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXY7XG59XG4iLCAiaW1wb3J0IHtcbiAgICBtb21lbnQsXG4gICAgTm90aWNlLFxuICAgIFBsYXRmb3JtLFxuICAgIFBsdWdpblNldHRpbmdUYWIsXG4gICAgUkdCLFxuICAgIFNldHRpbmcsXG59IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHtcbiAgICBEQVRFX1RJTUVfRk9STUFUX1NFQ09ORFMsXG4gICAgREVGQVVMVF9TRVRUSU5HUyxcbiAgICBHSVRfTElORV9BVVRIT1JJTkdfTU9WRU1FTlRfREVURUNUSU9OX01JTklNQUxfTEVOR1RILFxufSBmcm9tIFwic3JjL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSXNvbW9ycGhpY0dpdCB9IGZyb20gXCJzcmMvZ2l0TWFuYWdlci9pc29tb3JwaGljR2l0XCI7XG5pbXBvcnQgeyBTaW1wbGVHaXQgfSBmcm9tIFwic3JjL2dpdE1hbmFnZXIvc2ltcGxlR2l0XCI7XG5pbXBvcnQgeyBwcmV2aWV3Q29sb3IgfSBmcm9tIFwic3JjL2xpbmVBdXRob3IvbGluZUF1dGhvclByb3ZpZGVyXCI7XG5pbXBvcnQge1xuICAgIExpbmVBdXRob3JEYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gICAgTGluZUF1dGhvckRpc3BsYXksXG4gICAgTGluZUF1dGhvckZvbGxvd01vdmVtZW50LFxuICAgIExpbmVBdXRob3JTZXR0aW5ncyxcbiAgICBMaW5lQXV0aG9yVGltZXpvbmVPcHRpb24sXG59IGZyb20gXCJzcmMvbGluZUF1dGhvci9tb2RlbFwiO1xuaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCJzcmMvbWFpblwiO1xuaW1wb3J0IHtcbiAgICBPYnNpZGlhbkdpdFNldHRpbmdzLFxuICAgIFNob3dBdXRob3JJbkhpc3RvcnlWaWV3LFxuICAgIFN5bmNNZXRob2QsXG59IGZyb20gXCJzcmMvdHlwZXNcIjtcbmltcG9ydCB7IGNvbnZlcnRUb1JnYiwgcmdiVG9TdHJpbmcsIGZvcm1hdE1pbnV0ZXMgfSBmcm9tIFwic3JjL3V0aWxzXCI7XG5cbmNvbnN0IEZPUk1BVF9TVFJJTkdfUkVGRVJFTkNFX1VSTCA9XG4gICAgXCJodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyMvcGFyc2luZy9zdHJpbmctZm9ybWF0L1wiO1xuY29uc3QgTElORV9BVVRIT1JfRkVBVFVSRV9XSUtJX0xJTksgPVxuICAgIFwiaHR0cHM6Ly9wdWJsaXNoLm9ic2lkaWFuLm1kL2dpdC1kb2MvTGluZStBdXRob3JpbmdcIjtcblxuZXhwb3J0IGNsYXNzIE9ic2lkaWFuR2l0U2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgICBsaW5lQXV0aG9yQ29sb3JTZXR0aW5nczogTWFwPFwib2xkZXN0XCIgfCBcIm5ld2VzdFwiLCBTZXR0aW5nPiA9IG5ldyBNYXAoKTtcblxuICAgIGRlY2xhcmUgcGx1Z2luOiBPYnNpZGlhbkdpdDsgLy8gbmFycm93IHR5cGUgZnJvbSBQbHVnaW5TZXR0aW5nVGFiLnBsdWdpblxuXG4gICAgcHJpdmF0ZSBnZXQgc2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbi5zZXR0aW5ncztcbiAgICB9XG5cbiAgICBkaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBwbHVnaW46IE9ic2lkaWFuR2l0ID0gKHRoaXMgYXMgYW55KS5wbHVnaW47XG4gICAgICAgIGNvbnN0IGNvbW1pdE9yQmFja3VwID0gcGx1Z2luLnNldHRpbmdzLmRpZmZlcmVudEludGVydmFsQ29tbWl0QW5kUHVzaFxuICAgICAgICAgICAgPyBcImNvbW1pdFwiXG4gICAgICAgICAgICA6IFwiYmFja3VwXCI7XG4gICAgICAgIGNvbnN0IGdpdFJlYWR5ID0gcGx1Z2luLmdpdFJlYWR5O1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDJcIiwgeyB0ZXh0OiBcIkdpdCBCYWNrdXAgc2V0dGluZ3NcIiB9KTtcbiAgICAgICAgaWYgKCFnaXRSZWFkeSkge1xuICAgICAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIsIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkdpdCBpcyBub3QgcmVhZHkuIFdoZW4gYWxsIHNldHRpbmdzIGFyZSBjb3JyZWN0IHlvdSBjYW4gY29uZmlndXJlIGF1dG8gYmFja3VwLCBldGMuXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnaXRSZWFkeSkge1xuICAgICAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJiclwiKTtcbiAgICAgICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwgeyB0ZXh0OiBcIkF1dG9tYXRpY1wiIH0pO1xuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJTcGxpdCBhdXRvbWF0aWMgY29tbWl0IGFuZCBwdXNoXCIpXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXCJFbmFibGUgdG8gdXNlIHNlcGFyYXRlIHRpbWVyIGZvciBjb21taXQgYW5kIHB1c2hcIilcbiAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5kaWZmZXJlbnRJbnRlcnZhbENvbW1pdEFuZFB1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuZGlmZmVyZW50SW50ZXJ2YWxDb21taXRBbmRQdXNoID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5jbGVhckF1dG9CYWNrdXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uY2xlYXJBdXRvUHVzaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnN0YXJ0QXV0b0JhY2t1cChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBwbHVnaW4uc2V0dGluZ3MuYXV0b1B1c2hJbnRlcnZhbCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnN0YXJ0QXV0b1B1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1B1c2hJbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoYFZhdWx0ICR7Y29tbWl0T3JCYWNrdXB9IGludGVydmFsIChtaW51dGVzKWApXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgICAgIGAke1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmRpZmZlcmVudEludGVydmFsQ29tbWl0QW5kUHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJDb21taXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJDb21taXQgYW5kIHB1c2hcIlxuICAgICAgICAgICAgICAgICAgICB9IGNoYW5nZXMgZXZlcnkgWCBtaW51dGVzLiBTZXQgdG8gMCAoZGVmYXVsdCkgdG8gZGlzYWJsZS4gKFNlZSBiZWxvdyBzZXR0aW5nIGZvciBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24hKWBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShTdHJpbmcocGx1Z2luLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWwpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWwgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5jbGVhckF1dG9CYWNrdXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zdGFydEF1dG9CYWNrdXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBBdXRvbWF0aWMgJHtjb21taXRPckJhY2t1cH0gZW5hYmxlZCEgRXZlcnkgJHtmb3JtYXRNaW51dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9LmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCA8PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmNsZWFyQXV0b0JhY2t1cCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEF1dG9tYXRpYyAke2NvbW1pdE9yQmFja3VwfSBkaXNhYmxlZCFgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG51bWJlci5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIXBsdWdpbi5zZXR0aW5ncy5zZXRMYXN0U2F2ZVRvTGFzdENvbW1pdClcbiAgICAgICAgICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoYEF1dG8gQmFja3VwIGFmdGVyIHN0b3BwaW5nIGZpbGUgZWRpdHNgKVxuICAgICAgICAgICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBSZXF1aXJlcyB0aGUgJHtjb21taXRPckJhY2t1cH0gaW50ZXJ2YWwgbm90IHRvIGJlIDAuXG4gICAgICAgICAgICAgICAgICAgICAgICBJZiB0dXJuZWQgb24sIGRvIGF1dG8gJHtjb21taXRPckJhY2t1cH0gZXZlcnkgJHtmb3JtYXRNaW51dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsXG4gICAgICAgICAgICAgICAgICAgICAgICApfSBhZnRlciBzdG9wcGluZyBmaWxlIGVkaXRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbHNvIHByZXZlbnRzIGF1dG8gJHtjb21taXRPckJhY2t1cH0gd2hpbGUgZWRpdGluZyBhIGZpbGUuIElmIHR1cm5lZCBvZmYsIGl0J3MgaW5kZXBlbmRlbnQgZnJvbSB0aGUgbGFzdCBjaGFuZ2UuYFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuYXV0b0JhY2t1cEFmdGVyRmlsZUNoYW5nZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5hdXRvQmFja3VwQWZ0ZXJGaWxlQ2hhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uY2xlYXJBdXRvQmFja3VwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zdGFydEF1dG9CYWNrdXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIXBsdWdpbi5zZXR0aW5ncy5hdXRvQmFja3VwQWZ0ZXJGaWxlQ2hhbmdlKVxuICAgICAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShgQXV0byAke2NvbW1pdE9yQmFja3VwfSBhZnRlciBsYXRlc3QgY29tbWl0YClcbiAgICAgICAgICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgICAgICAgICBgSWYgdHVybmVkIG9uLCBzZXQgbGFzdCBhdXRvICR7Y29tbWl0T3JCYWNrdXB9IHRpbWUgdG8gbGF0ZXN0IGNvbW1pdGBcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLnNldExhc3RTYXZlVG9MYXN0Q29tbWl0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLnNldExhc3RTYXZlVG9MYXN0Q29tbWl0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5jbGVhckF1dG9CYWNrdXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNldFVwQXV0b0JhY2t1cCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChwbHVnaW4uc2V0dGluZ3MuZGlmZmVyZW50SW50ZXJ2YWxDb21taXRBbmRQdXNoKSB7XG4gICAgICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKGBWYXVsdCBwdXNoIGludGVydmFsIChtaW51dGVzKWApXG4gICAgICAgICAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQdXNoIGNoYW5nZXMgZXZlcnkgWCBtaW51dGVzLiBTZXQgdG8gMCAoZGVmYXVsdCkgdG8gZGlzYWJsZS5cIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShTdHJpbmcocGx1Z2luLnNldHRpbmdzLmF1dG9QdXNoSW50ZXJ2YWwpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihOdW1iZXIodmFsdWUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9QdXNoSW50ZXJ2YWwgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc2V0dGluZ3MuYXV0b1B1c2hJbnRlcnZhbCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uY2xlYXJBdXRvUHVzaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zdGFydEF1dG9QdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1B1c2hJbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEF1dG9tYXRpYyBwdXNoIGVuYWJsZWQhIEV2ZXJ5ICR7Zm9ybWF0TWludXRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVzaEludGVydmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9LmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1B1c2hJbnRlcnZhbCA8PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uY2xlYXJBdXRvUHVzaCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkF1dG9tYXRpYyBwdXNoIGRpc2FibGVkIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBudW1iZXIuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIkF1dG8gcHVsbCBpbnRlcnZhbCAobWludXRlcylcIilcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAgICAgXCJQdWxsIGNoYW5nZXMgZXZlcnkgWCBtaW51dGVzLiBTZXQgdG8gMCAoZGVmYXVsdCkgdG8gZGlzYWJsZS5cIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKFN0cmluZyhwbHVnaW4uc2V0dGluZ3MuYXV0b1B1bGxJbnRlcnZhbCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihOdW1iZXIodmFsdWUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1B1bGxJbnRlcnZhbCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbEludGVydmFsID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmNsZWFyQXV0b1B1bGwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zdGFydEF1dG9QdWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbEludGVydmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQXV0b21hdGljIHB1bGwgZW5hYmxlZCEgRXZlcnkgJHtmb3JtYXRNaW51dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1B1bGxJbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9LmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1B1bGxJbnRlcnZhbCA8PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmNsZWFyQXV0b1B1bGwoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJBdXRvbWF0aWMgcHVsbCBkaXNhYmxlZCFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBudW1iZXIuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJTcGVjaWZ5IGN1c3RvbSBjb21taXQgbWVzc2FnZSBvbiBhdXRvIGJhY2t1cFwiKVxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiWW91IHdpbGwgZ2V0IGEgcG9wIHVwIHRvIHNwZWNpZnkgeW91ciBtZXNzYWdlXCIpXG4gICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuY3VzdG9tTWVzc2FnZU9uQXV0b0JhY2t1cClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY3VzdG9tTWVzc2FnZU9uQXV0b0JhY2t1cCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJDb21taXQgbWVzc2FnZSBvbiBhdXRvIGJhY2t1cC9jb21taXRcIilcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAgICAgXCJBdmFpbGFibGUgcGxhY2Vob2xkZXJzOiB7e2RhdGV9fVwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIChzZWUgYmVsb3cpLCB7e2hvc3RuYW1lfX0gKHNlZSBiZWxvdyksIHt7bnVtRmlsZXN9fSAobnVtYmVyIG9mIGNoYW5nZWQgZmlsZXMgaW4gdGhlIGNvbW1pdCkgYW5kIHt7ZmlsZXN9fSAoY2hhbmdlZCBmaWxlcyBpbiBjb21taXQgbWVzc2FnZSlcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYWRkVGV4dEFyZWEoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcInZhdWx0IGJhY2t1cDoge3tkYXRlfX1cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuYXV0b0NvbW1pdE1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9Db21taXRNZXNzYWdlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImJyXCIpO1xuICAgICAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoM1wiLCB7IHRleHQ6IFwiQ29tbWl0IG1lc3NhZ2VcIiB9KTtcblxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJDb21taXQgbWVzc2FnZSBvbiBtYW51YWwgYmFja3VwL2NvbW1pdFwiKVxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICAgICBcIkF2YWlsYWJsZSBwbGFjZWhvbGRlcnM6IHt7ZGF0ZX19XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIgKHNlZSBiZWxvdyksIHt7aG9zdG5hbWV9fSAoc2VlIGJlbG93KSwge3tudW1GaWxlc319IChudW1iZXIgb2YgY2hhbmdlZCBmaWxlcyBpbiB0aGUgY29tbWl0KSBhbmQge3tmaWxlc319IChjaGFuZ2VkIGZpbGVzIGluIGNvbW1pdCBtZXNzYWdlKVwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5hZGRUZXh0QXJlYSgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwidmF1bHQgYmFja3VwOiB7e2RhdGV9fVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5jb21taXRNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGx1Z2luLnNldHRpbmdzLmNvbW1pdE1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmNvbW1pdE1lc3NhZ2UgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGVQbGFjZWhvbGRlclNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcInt7ZGF0ZX19IHBsYWNlaG9sZGVyIGZvcm1hdFwiKVxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIocGx1Z2luLnNldHRpbmdzLmNvbW1pdERhdGVGb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLmNvbW1pdERhdGVGb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmNvbW1pdERhdGVGb3JtYXQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkYXRlUGxhY2Vob2xkZXJTZXR0aW5nLmRlc2NFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICBTcGVjaWZ5IGN1c3RvbSBkYXRlIGZvcm1hdC4gRS5nLiBcIiR7REFURV9USU1FX0ZPUk1BVF9TRUNPTkRTfS4gU2VlIDxhIGhyZWY9XCJodHRwczovL21vbWVudGpzLmNvbVwiPk1vbWVudC5qczwvYT4gZm9yIG1vcmUgZm9ybWF0cy5gO1xuXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcInt7aG9zdG5hbWV9fSBwbGFjZWhvbGRlciByZXBsYWNlbWVudFwiKVxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiU3BlY2lmeSBjdXN0b20gaG9zdG5hbWUgZm9yIGV2ZXJ5IGRldmljZS5cIilcbiAgICAgICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5sb2NhbFN0b3JhZ2UuZ2V0SG9zdG5hbWUoKSA/PyBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5sb2NhbFN0b3JhZ2Uuc2V0SG9zdG5hbWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIlByZXZpZXcgY29tbWl0IG1lc3NhZ2VcIilcbiAgICAgICAgICAgICAgICAuYWRkQnV0dG9uKChidXR0b24pID0+XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRCdXR0b25UZXh0KFwiUHJldmlld1wiKS5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1pdE1lc3NhZ2VQcmV2aWV3ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uZ2l0TWFuYWdlci5mb3JtYXRDb21taXRNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY29tbWl0TWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGAke2NvbW1pdE1lc3NhZ2VQcmV2aWV3fWApO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiTGlzdCBmaWxlbmFtZXMgYWZmZWN0ZWQgYnkgY29tbWl0IGluIHRoZSBjb21taXQgYm9keVwiKVxuICAgICAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLmxpc3RDaGFuZ2VkRmlsZXNJbk1lc3NhZ2VCb2R5KVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5saXN0Q2hhbmdlZEZpbGVzSW5NZXNzYWdlQm9keSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJiclwiKTtcbiAgICAgICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwgeyB0ZXh0OiBcIkJhY2t1cFwiIH0pO1xuXG4gICAgICAgICAgICBpZiAocGx1Z2luLmdpdE1hbmFnZXIgaW5zdGFuY2VvZiBTaW1wbGVHaXQpXG4gICAgICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiU3luYyBNZXRob2RcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlNlbGVjdHMgdGhlIG1ldGhvZCB1c2VkIGZvciBoYW5kbGluZyBuZXcgY2hhbmdlcyBmb3VuZCBpbiB5b3VyIHJlbW90ZSBnaXQgcmVwb3NpdG9yeS5cIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxTeW5jTWV0aG9kLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlOiBcIk1lcmdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmViYXNlOiBcIlJlYmFzZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0OiBcIk90aGVyIHN5bmMgc2VydmljZSAoT25seSB1cGRhdGVzIHRoZSBIRUFEIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5KVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3Muc3luY01ldGhvZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jIChvcHRpb246IFN5bmNNZXRob2QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3Muc3luY01ldGhvZCA9IG9wdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiUHVsbCB1cGRhdGVzIG9uIHN0YXJ0dXBcIilcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcIkF1dG9tYXRpY2FsbHkgcHVsbCB1cGRhdGVzIHdoZW4gT2JzaWRpYW4gc3RhcnRzXCIpXG4gICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuYXV0b1B1bGxPbkJvb3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9QdWxsT25Cb290ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIlB1c2ggb24gYmFja3VwXCIpXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXCJEaXNhYmxlIHRvIG9ubHkgY29tbWl0IGNoYW5nZXNcIilcbiAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKCFwbHVnaW4uc2V0dGluZ3MuZGlzYWJsZVB1c2gpXG4gICAgICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmRpc2FibGVQdXNoID0gIXZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJQdWxsIGNoYW5nZXMgYmVmb3JlIHB1c2hcIilcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcIkNvbW1pdCAtPiBwdWxsIC0+IHB1c2ggKE9ubHkgaWYgcHVzaGluZyBpcyBlbmFibGVkKVwiKVxuICAgICAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLnB1bGxCZWZvcmVQdXNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5wdWxsQmVmb3JlUHVzaCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5naXRNYW5hZ2VyIGluc3RhbmNlb2YgU2ltcGxlR2l0KSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJiclwiKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogXCJMaW5lIGF1dGhvciBpbmZvcm1hdGlvblwiIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRMaW5lQXV0aG9ySW5mb1NldHRpbmdzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImJyXCIpO1xuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogXCJIaXN0b3J5IFZpZXdcIiB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiU2hvdyBBdXRob3JcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiU2hvdyB0aGUgYXV0aG9yIG9mIHRoZSBjb21taXQgaW4gdGhlIGhpc3Rvcnkgdmlld1wiKVxuICAgICAgICAgICAgLmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxTaG93QXV0aG9ySW5IaXN0b3J5Vmlldywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGlkZTogXCJIaWRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGw6IFwiRnVsbFwiLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsczogXCJJbml0aWFsc1wiLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuYXV0aG9ySW5IaXN0b3J5Vmlldyk7XG4gICAgICAgICAgICAgICAgZHJvcGRvd24ub25DaGFuZ2UoYXN5bmMgKG9wdGlvbjogU2hvd0F1dGhvckluSGlzdG9yeVZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dGhvckluSGlzdG9yeVZpZXcgPSBvcHRpb247XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJTaG93IERhdGVcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgIFwiU2hvdyB0aGUgZGF0ZSBvZiB0aGUgY29tbWl0IGluIHRoZSBoaXN0b3J5IHZpZXcuIFRoZSB7e2RhdGV9fSBwbGFjZWhvbGRlciBmb3JtYXQgaXMgdXNlZCB0byBkaXNwbGF5IHRoZSBkYXRlLlwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuZGF0ZUluSGlzdG9yeVZpZXcpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5kYXRlSW5IaXN0b3J5VmlldyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJiclwiKTtcbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoM1wiLCB7IHRleHQ6IFwiU291cmNlIENvbnRyb2wgVmlld1wiIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXG4gICAgICAgICAgICAgICAgXCJBdXRvbWF0aWNhbGx5IHJlZnJlc2ggU291cmNlIENvbnRyb2wgVmlldyBvbiBmaWxlIGNoYW5nZXNcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgXCJPbiBzbG93ZXIgbWFjaGluZXMgdGhpcyBtYXkgY2F1c2UgbGFncy4gSWYgc28sIGp1c3QgZGlzYWJsZSB0aGlzIG9wdGlvblwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MucmVmcmVzaFNvdXJjZUNvbnRyb2wpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5yZWZyZXNoU291cmNlQ29udHJvbCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiU291cmNlIENvbnRyb2wgVmlldyByZWZyZXNoIGludGVydmFsXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBcIk1pbGxpc2Vjb25kcyB0byB3YWl0IGFmdGVyIGZpbGUgY2hhbmdlIGJlZm9yZSByZWZyZXNoaW5nIHRoZSBTb3VyY2UgQ29udHJvbCBWaWV3XCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5yZWZyZXNoU291cmNlQ29udHJvbFRpbWVyLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCI3MDAwXCIpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5yZWZyZXNoU291cmNlQ29udHJvbFRpbWVyID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQodmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXRSZWZyZXNoRGVib3VuY2VyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImJyXCIpO1xuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogXCJNaXNjZWxsYW5lb3VzXCIgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkRpc2FibGUgbm90aWZpY2F0aW9uc1wiKVxuICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgXCJEaXNhYmxlIG5vdGlmaWNhdGlvbnMgZm9yIGdpdCBvcGVyYXRpb25zIHRvIG1pbmltaXplIGRpc3RyYWN0aW9uIChyZWZlciB0byBzdGF0dXMgYmFyIGZvciB1cGRhdGVzKS4gRXJyb3JzIGFyZSBzdGlsbCBzaG93biBhcyBub3RpZmljYXRpb25zIGV2ZW4gaWYgeW91IGVuYWJsZSB0aGlzIHNldHRpbmdcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLmRpc2FibGVQb3B1cHMpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlUG9wdXBzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFwbHVnaW4uc2V0dGluZ3MuZGlzYWJsZVBvcHVwcylcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiSGlkZSBub3RpZmljYXRpb25zIGZvciBubyBjaGFuZ2VzXCIpXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgICAgIFwiRG9uJ3Qgc2hvdyBub3RpZmljYXRpb25zIHdoZW4gdGhlcmUgYXJlIG5vIGNoYW5nZXMgdG8gY29tbWl0L3B1c2hcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlUG9wdXBzRm9yTm9DaGFuZ2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlUG9wdXBzRm9yTm9DaGFuZ2VzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJTaG93IHN0YXR1cyBiYXJcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgIFwiT2JzaWRpYW4gbXVzdCBiZSByZXN0YXJ0ZWQgZm9yIHRoZSBjaGFuZ2VzIHRvIHRha2UgYWZmZWN0XCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5zaG93U3RhdHVzQmFyKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3Muc2hvd1N0YXR1c0JhciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiU2hvdyBzdGFnZS91bnN0YWdlIGJ1dHRvbiBpbiBmaWxlIG1lbnVcIilcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5zaG93RmlsZU1lbnUpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5zaG93RmlsZU1lbnUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIlNob3cgYnJhbmNoIHN0YXR1cyBiYXJcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgIFwiT2JzaWRpYW4gbXVzdCBiZSByZXN0YXJ0ZWQgZm9yIHRoZSBjaGFuZ2VzIHRvIHRha2UgYWZmZWN0XCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5zaG93QnJhbmNoU3RhdHVzQmFyKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3Muc2hvd0JyYW5jaFN0YXR1c0JhciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiU2hvdyB0aGUgY291bnQgb2YgbW9kaWZpZWQgZmlsZXMgaW4gdGhlIHN0YXR1cyBiYXJcIilcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5jaGFuZ2VkRmlsZXNJblN0YXR1c0JhcilcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmNoYW5nZWRGaWxlc0luU3RhdHVzQmFyID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiYnJcIik7XG4gICAgICAgIGlmIChwbHVnaW4uZ2l0TWFuYWdlciBpbnN0YW5jZW9mIElzb21vcnBoaWNHaXQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwge1xuICAgICAgICAgICAgICAgIHRleHQ6IFwiQXV0aGVudGljYXRpb24vQ29tbWl0IEF1dGhvclwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogXCJDb21taXQgQXV0aG9yXCIgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGx1Z2luLmdpdE1hbmFnZXIgaW5zdGFuY2VvZiBJc29tb3JwaGljR2l0KVxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXG4gICAgICAgICAgICAgICAgICAgIFwiVXNlcm5hbWUgb24geW91ciBnaXQgc2VydmVyLiBFLmcuIHlvdXIgdXNlcm5hbWUgb24gR2l0SHViXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFkZFRleHQoKGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNiLnNldFZhbHVlKHBsdWdpbi5sb2NhbFN0b3JhZ2UuZ2V0VXNlcm5hbWUoKSA/PyBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgY2Iub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4ubG9jYWxTdG9yYWdlLnNldFVzZXJuYW1lKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBsdWdpbi5naXRNYW5hZ2VyIGluc3RhbmNlb2YgSXNvbW9ycGhpY0dpdClcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiUGFzc3dvcmQvUGVyc29uYWwgYWNjZXNzIHRva2VuXCIpXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgICAgIFwiVHlwZSBpbiB5b3VyIHBhc3N3b3JkLiBZb3Ugd29uJ3QgYmUgYWJsZSB0byBzZWUgaXQgYWdhaW4uXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFkZFRleHQoKGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNiLmlucHV0RWwuYXV0b2NhcGl0YWxpemUgPSBcIm9mZlwiO1xuICAgICAgICAgICAgICAgICAgICBjYi5pbnB1dEVsLmF1dG9jb21wbGV0ZSA9IFwib2ZmXCI7XG4gICAgICAgICAgICAgICAgICAgIGNiLmlucHV0RWwuc3BlbGxjaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjYi5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5sb2NhbFN0b3JhZ2Uuc2V0UGFzc3dvcmQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGx1Z2luLmdpdFJlYWR5KVxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJBdXRob3IgbmFtZSBmb3IgY29tbWl0XCIpXG4gICAgICAgICAgICAgICAgLmFkZFRleHQoYXN5bmMgKGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNiLnNldFZhbHVlKGF3YWl0IHBsdWdpbi5naXRNYW5hZ2VyLmdldENvbmZpZyhcInVzZXIubmFtZVwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGNiLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmdpdE1hbmFnZXIuc2V0Q29uZmlnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidXNlci5uYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT0gXCJcIiA/IHVuZGVmaW5lZCA6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGx1Z2luLmdpdFJlYWR5KVxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJBdXRob3IgZW1haWwgZm9yIGNvbW1pdFwiKVxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KGFzeW5jIChjYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjYi5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5naXRNYW5hZ2VyLmdldENvbmZpZyhcInVzZXIuZW1haWxcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY2Iub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uZ2l0TWFuYWdlci5zZXRDb25maWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ1c2VyLmVtYWlsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT0gXCJcIiA/IHVuZGVmaW5lZCA6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImJyXCIpO1xuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogXCJBZHZhbmNlZFwiIH0pO1xuXG4gICAgICAgIGlmIChwbHVnaW4uZ2l0TWFuYWdlciBpbnN0YW5jZW9mIFNpbXBsZUdpdCkge1xuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJVcGRhdGUgc3VibW9kdWxlc1wiKVxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICAgICAnXCJDcmVhdGUgYmFja3VwXCIgYW5kIFwicHVsbFwiIHRha2VzIGNhcmUgb2Ygc3VibW9kdWxlcy4gTWlzc2luZyBmZWF0dXJlczogQ29uZmxpY3RlZCBmaWxlcywgY291bnQgb2YgcHVsbGVkL3B1c2hlZC9jb21taXR0ZWQgZmlsZXMuIFRyYWNraW5nIGJyYW5jaCBuZWVkcyB0byBiZSBzZXQgZm9yIGVhY2ggc3VibW9kdWxlJ1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy51cGRhdGVTdWJtb2R1bGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy51cGRhdGVTdWJtb2R1bGVzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHBsdWdpbi5zZXR0aW5ncy51cGRhdGVTdWJtb2R1bGVzKSB7XG4gICAgICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiU3VibW9kdWxlIHJlY3Vyc2UgY2hlY2tvdXQvc3dpdGNoXCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJXaGVuZXZlciBhIGNoZWNrb3V0IGhhcHBlbnMgb24gdGhlIHJvb3QgcmVwb3NpdG9yeSwgcmVjdXJzZSB0aGUgY2hlY2tvdXQgb24gdGhlIHN1Ym1vZHVsZXMgKGlmIHRoZSBicmFuY2hlcyBleGlzdCkuXCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLnN1Ym1vZHVsZVJlY3Vyc2VDaGVja291dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5zdWJtb2R1bGVSZWN1cnNlQ2hlY2tvdXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsdWdpbi5naXRNYW5hZ2VyIGluc3RhbmNlb2YgU2ltcGxlR2l0KVxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJDdXN0b20gR2l0IGJpbmFyeSBwYXRoXCIpXG4gICAgICAgICAgICAgICAgLmFkZFRleHQoKGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNiLnNldFZhbHVlKHBsdWdpbi5sb2NhbFN0b3JhZ2UuZ2V0R2l0UGF0aCgpID8/IFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICBjYi5zZXRQbGFjZWhvbGRlcihcImdpdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY2Iub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4ubG9jYWxTdG9yYWdlLnNldEdpdFBhdGgodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmdpdE1hbmFnZXIudXBkYXRlR2l0UGF0aCh2YWx1ZSB8fCBcImdpdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBsdWdpbi5naXRNYW5hZ2VyIGluc3RhbmNlb2YgU2ltcGxlR2l0KVxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlc1wiKVxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICAgICBcIlVzZSBlYWNoIGxpbmUgZm9yIGEgbmV3IGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSBmb3JtYXQgS0VZPVZBTFVFXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFkZFRleHRBcmVhKChjYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjYi5zZXRQbGFjZWhvbGRlcihcIkdJVF9ESVI9L3BhdGgvdG8vZ2l0L2RpclwiKTtcbiAgICAgICAgICAgICAgICAgICAgY2Iuc2V0VmFsdWUocGx1Z2luLmxvY2FsU3RvcmFnZS5nZXRFbnZWYXJzKCkuam9pbihcIlxcblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGNiLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmxvY2FsU3RvcmFnZS5zZXRFbnZWYXJzKHZhbHVlLnNwbGl0KFwiXFxuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBsdWdpbi5naXRNYW5hZ2VyIGluc3RhbmNlb2YgU2ltcGxlR2l0KVxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJBZGRpdGlvbmFsIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgcGF0aHNcIilcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcIlVzZSBlYWNoIGxpbmUgZm9yIG9uZSBwYXRoXCIpXG4gICAgICAgICAgICAgICAgLmFkZFRleHRBcmVhKChjYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjYi5zZXRWYWx1ZShwbHVnaW4ubG9jYWxTdG9yYWdlLmdldFBBVEhQYXRocygpLmpvaW4oXCJcXG5cIikpO1xuICAgICAgICAgICAgICAgICAgICBjYi5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5sb2NhbFN0b3JhZ2Uuc2V0UEFUSFBhdGhzKHZhbHVlLnNwbGl0KFwiXFxuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmIChwbHVnaW4uZ2l0TWFuYWdlciBpbnN0YW5jZW9mIFNpbXBsZUdpdClcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiUmVsb2FkIHdpdGggbmV3IGVudmlyb25tZW50IHZhcmlhYmxlc1wiKVxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICAgICBcIlJlbW92aW5nIHByZXZpb3VzbHkgYWRkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbGwgbm90IHRha2UgZWZmZWN0IHVudGlsIE9ic2lkaWFuIGlzIHJlc3RhcnRlZC5cIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYWRkQnV0dG9uKChjYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjYi5zZXRCdXR0b25UZXh0KFwiUmVsb2FkXCIpO1xuICAgICAgICAgICAgICAgICAgICBjYi5zZXRDdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgY2Iub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAocGx1Z2luLmdpdE1hbmFnZXIgYXMgU2ltcGxlR2l0KS5zZXRHaXRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiQ3VzdG9tIGJhc2UgcGF0aCAoR2l0IHJlcG9zaXRvcnkgcGF0aClcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIFNldHMgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHZhdWx0IGZyb20gd2hpY2ggdGhlIEdpdCBiaW5hcnkgc2hvdWxkIGJlIGV4ZWN1dGVkLlxuICAgICAgICAgICAgIE1vc3RseSB1c2VkIHRvIHNldCB0aGUgcGF0aCB0byB0aGUgR2l0IHJlcG9zaXRvcnksIHdoaWNoIGlzIG9ubHkgcmVxdWlyZWQgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIGJlbG93IHRoZSB2YXVsdCByb290IGRpcmVjdG9yeS4gVXNlIFwiXFxcXFwiIGluc3RlYWQgb2YgXCIvXCIgb24gV2luZG93cy5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUZXh0KChjYikgPT4ge1xuICAgICAgICAgICAgICAgIGNiLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5iYXNlUGF0aCk7XG4gICAgICAgICAgICAgICAgY2Iuc2V0UGxhY2Vob2xkZXIoXCJkaXJlY3RvcnkvZGlyZWN0b3J5LXdpdGgtZ2l0LXJlcG9cIik7XG4gICAgICAgICAgICAgICAgY2Iub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5iYXNlUGF0aCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5naXRNYW5hZ2VyLnVwZGF0ZUJhc2VQYXRoKHZhbHVlIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkN1c3RvbSBHaXQgZGlyZWN0b3J5IHBhdGggKEluc3RlYWQgb2YgJy5naXQnKVwiKVxuICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgYFJlcXVpcmVzIHJlc3RhcnQgb2YgT2JzaWRpYW4gdG8gdGFrZSBlZmZlY3QuIFVzZSBcIlxcXFxcIiBpbnN0ZWFkIG9mIFwiL1wiIG9uIFdpbmRvd3MuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZFRleHQoKGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgY2Iuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLmdpdERpcik7XG4gICAgICAgICAgICAgICAgY2Iuc2V0UGxhY2Vob2xkZXIoXCIuZ2l0XCIpO1xuICAgICAgICAgICAgICAgIGNiLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuZ2l0RGlyID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJEaXNhYmxlIG9uIHRoaXMgZGV2aWNlXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBcIkRpc2FibGVzIHRoZSBwbHVnaW4gb24gdGhpcyBkZXZpY2UuIFRoaXMgc2V0dGluZyBpcyBub3Qgc3luY2VkLlwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4ubG9jYWxTdG9yYWdlLmdldFBsdWdpbkRpc2FibGVkKCkpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5sb2NhbFN0b3JhZ2Uuc2V0UGx1Z2luRGlzYWJsZWQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnVubG9hZFBsdWdpbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4ubG9hZFBsdWdpbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk9ic2lkaWFuIG11c3QgYmUgcmVzdGFydGVkIGZvciB0aGUgY2hhbmdlcyB0byB0YWtlIGFmZmVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRG9uYXRlXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBcIklmIHlvdSBsaWtlIHRoaXMgUGx1Z2luLCBjb25zaWRlciBkb25hdGluZyB0byBzdXBwb3J0IGNvbnRpbnVlZCBkZXZlbG9wbWVudC5cIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEJ1dHRvbigoYnQpID0+IHtcbiAgICAgICAgICAgICAgICBidC5idXR0b25FbC5vdXRlckhUTUwgPVxuICAgICAgICAgICAgICAgICAgICBcIjxhIGhyZWY9J2h0dHBzOi8va28tZmkuY29tL0YxRjE5NUlRNScgdGFyZ2V0PSdfYmxhbmsnPjxpbWcgaGVpZ2h0PSczNicgc3R5bGU9J2JvcmRlcjowcHg7aGVpZ2h0OjM2cHg7JyBzcmM9J2h0dHBzOi8vY2RuLmtvLWZpLmNvbS9jZG4va29maTMucG5nP3Y9MycgYm9yZGVyPScwJyBhbHQ9J0J1eSBNZSBhIENvZmZlZSBhdCBrby1maS5jb20nIC8+PC9hPlwiO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaW5mbyA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdigpO1xuICAgICAgICBpbmZvLnNldEF0dHIoXCJhbGlnblwiLCBcImNlbnRlclwiKTtcbiAgICAgICAgaW5mby5zZXRUZXh0KFxuICAgICAgICAgICAgXCJEZWJ1Z2dpbmcgYW5kIGxvZ2dpbmc6XFxuWW91IGNhbiBhbHdheXMgc2VlIHRoZSBsb2dzIG9mIHRoaXMgYW5kIGV2ZXJ5IG90aGVyIHBsdWdpbiBieSBvcGVuaW5nIHRoZSBjb25zb2xlIHdpdGhcIlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBrZXlzID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KCk7XG4gICAgICAgIGtleXMuc2V0QXR0cihcImFsaWduXCIsIFwiY2VudGVyXCIpO1xuICAgICAgICBrZXlzLmFkZENsYXNzKFwib2JzaWRpYW4tZ2l0LXNob3J0Y3V0c1wiKTtcbiAgICAgICAgaWYgKFBsYXRmb3JtLmlzTWFjT1MgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGtleXMuY3JlYXRlRWwoXCJrYmRcIiwgeyB0ZXh0OiBcIkNNRCAoXHUyMzE4KSArIE9QVElPTiAoXHUyMzI1KSArIElcIiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtleXMuY3JlYXRlRWwoXCJrYmRcIiwgeyB0ZXh0OiBcIkNUUkwgKyBTSElGVCArIElcIiB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb25maWd1cmVMaW5lQXV0aG9yU2hvd1N0YXR1cyhzaG93OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MubGluZUF1dGhvci5zaG93ID0gc2hvdztcbiAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cbiAgICAgICAgaWYgKHNob3cpIHRoaXMucGx1Z2luLmxpbmVBdXRob3JpbmdGZWF0dXJlLmFjdGl2YXRlRmVhdHVyZSgpO1xuICAgICAgICBlbHNlIHRoaXMucGx1Z2luLmxpbmVBdXRob3JpbmdGZWF0dXJlLmRlYWN0aXZhdGVGZWF0dXJlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyc2lzdHMgdGhlIHNldHRpbmcge0BsaW5rIGtleX0gd2l0aCB2YWx1ZSB7QGxpbmsgdmFsdWV9IGFuZFxuICAgICAqIHJlZnJlc2hlcyB0aGUgbGluZSBhdXRob3IgaW5mbyB2aWV3cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGluZUF1dGhvclNldHRpbmdIYW5kbGVyPFxuICAgICAgICBLIGV4dGVuZHMga2V5b2YgT2JzaWRpYW5HaXRTZXR0aW5nc1tcImxpbmVBdXRob3JcIl0sXG4gICAgPihrZXk6IEssIHZhbHVlOiBPYnNpZGlhbkdpdFNldHRpbmdzW1wibGluZUF1dGhvclwiXVtLXSkge1xuICAgICAgICB0aGlzLnNldHRpbmdzLmxpbmVBdXRob3Jba2V5XSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgdGhpcy5wbHVnaW4ubGluZUF1dGhvcmluZ0ZlYXR1cmUucmVmcmVzaExpbmVBdXRob3JWaWV3cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuc3VyZSwgdGhhdCBjZXJ0YWluIGxhc3Qgc2hvd24gdmFsdWVzIGFyZSBwZXJzaXN0ZW4gaW4gdGhlIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogTmVjZXNzYXJ5IGZvciB0aGUgbGluZSBhdXRob3IgaW5mbyBndXR0ZXIgY29udGV4dCBtZW51cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYmVmb3JlU2F2ZVNldHRpbmdzKCkge1xuICAgICAgICBjb25zdCBsYVNldHRpbmdzID0gdGhpcy5zZXR0aW5ncy5saW5lQXV0aG9yO1xuICAgICAgICBpZiAobGFTZXR0aW5ncy5hdXRob3JEaXNwbGF5ICE9PSBcImhpZGVcIikge1xuICAgICAgICAgICAgbGFTZXR0aW5ncy5sYXN0U2hvd25BdXRob3JEaXNwbGF5ID0gbGFTZXR0aW5ncy5hdXRob3JEaXNwbGF5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYVNldHRpbmdzLmRhdGVUaW1lRm9ybWF0T3B0aW9ucyAhPT0gXCJoaWRlXCIpIHtcbiAgICAgICAgICAgIGxhU2V0dGluZ3MubGFzdFNob3duRGF0ZVRpbWVGb3JtYXRPcHRpb25zID1cbiAgICAgICAgICAgICAgICBsYVNldHRpbmdzLmRhdGVUaW1lRm9ybWF0T3B0aW9ucztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkTGluZUF1dGhvckluZm9TZXR0aW5ncygpIHtcbiAgICAgICAgY29uc3QgYmFzZUxpbmVBdXRob3JJbmZvU2V0dGluZyA9IG5ldyBTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwpLnNldE5hbWUoXG4gICAgICAgICAgICBcIlNob3cgY29tbWl0IGF1dGhvcmluZyBpbmZvcm1hdGlvbiBuZXh0IHRvIGVhY2ggbGluZVwiXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnBsdWdpbi5saW5lQXV0aG9yaW5nRmVhdHVyZS5pc0F2YWlsYWJsZU9uQ3VycmVudFBsYXRmb3JtKCkpIHtcbiAgICAgICAgICAgIGJhc2VMaW5lQXV0aG9ySW5mb1NldHRpbmdcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcIk9ubHkgYXZhaWxhYmxlIG9uIGRlc2t0b3AgY3VycmVudGx5LlwiKVxuICAgICAgICAgICAgICAgIC5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJhc2VMaW5lQXV0aG9ySW5mb1NldHRpbmcuZGVzY0VsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgIDxhIGhyZWY9XCIke0xJTkVfQVVUSE9SX0ZFQVRVUkVfV0lLSV9MSU5LfVwiPkZlYXR1cmUgZ3VpZGUgYW5kIHF1aWNrIGV4YW1wbGVzPC9hPjwvYnI+XG4gICAgICAgICAgICBUaGUgY29tbWl0IGhhc2gsIGF1dGhvciBuYW1lIGFuZCBhdXRob3JpbmcgZGF0ZSBjYW4gYWxsIGJlIGluZGl2aWR1YWxseSB0b2dnbGVkLjwvYnI+SGlkZSBldmVyeXRoaW5nLCB0byBvbmx5IHNob3cgdGhlIGFnZS1jb2xvcmVkIHNpZGViYXIuYDtcblxuICAgICAgICBiYXNlTGluZUF1dGhvckluZm9TZXR0aW5nLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMuc2V0dGluZ3MubGluZUF1dGhvci5zaG93KS5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZUxpbmVBdXRob3JTaG93U3RhdHVzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubGluZUF1dGhvci5zaG93KSB7XG4gICAgICAgICAgICBjb25zdCB0cmFja01vdmVtZW50ID0gbmV3IFNldHRpbmcodGhpcy5jb250YWluZXJFbClcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIkZvbGxvdyBtb3ZlbWVudCBhbmQgY29waWVzIGFjcm9zcyBmaWxlcyBhbmQgY29tbWl0c1wiKVxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiXCIpXG4gICAgICAgICAgICAgICAgLmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5hZGRPcHRpb25zKDxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZDxMaW5lQXV0aG9yRm9sbG93TW92ZW1lbnQsIHN0cmluZz5cbiAgICAgICAgICAgICAgICAgICAgPntcbiAgICAgICAgICAgICAgICAgICAgICAgIGluYWN0aXZlOiBcIkRvIG5vdCBmb2xsb3cgKGRlZmF1bHQpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNhbWUtY29tbWl0XCI6IFwiRm9sbG93IHdpdGhpbiBzYW1lIGNvbW1pdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhbGwtY29tbWl0c1wiOiBcIkZvbGxvdyB3aXRoaW4gYWxsIGNvbW1pdHMgKG1heWJlIHNsb3cpXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnNldHRpbmdzLmxpbmVBdXRob3IuZm9sbG93TW92ZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5vbkNoYW5nZSgodmFsdWU6IExpbmVBdXRob3JGb2xsb3dNb3ZlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUF1dGhvclNldHRpbmdIYW5kbGVyKFwiZm9sbG93TW92ZW1lbnRcIiwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0cmFja01vdmVtZW50LmRlc2NFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgICAgQnkgZGVmYXVsdCAoZGVhY3RpdmF0ZWQpLCBlYWNoIGxpbmUgb25seSBzaG93cyB0aGUgbmV3ZXN0IGNvbW1pdCB3aGVyZSBpdCB3YXMgY2hhbmdlZC5cbiAgICAgICAgICAgICAgICA8YnIvPlxuICAgICAgICAgICAgICAgIFdpdGggPGk+c2FtZSBjb21taXQ8L2k+LCBjdXQtY29weS1wYXN0ZS1pbmcgb2YgdGV4dCBpcyBmb2xsb3dlZCB3aXRoaW4gdGhlIHNhbWUgY29tbWl0IGFuZCB0aGUgb3JpZ2luYWwgY29tbWl0IG9mIGF1dGhvcmluZyB3aWxsIGJlIHNob3duLlxuICAgICAgICAgICAgICAgIDxici8+XG4gICAgICAgICAgICAgICAgV2l0aCA8aT5hbGwgY29tbWl0czwvaT4sIGN1dC1jb3B5LXBhc3RlLWluZyB0ZXh0IGluYmV0d2VlbiBtdWx0aXBsZSBjb21taXRzIHdpbGwgYmUgZGV0ZWN0ZWQuXG4gICAgICAgICAgICAgICAgPGJyLz5cbiAgICAgICAgICAgICAgICBJdCB1c2VzIDxhIGhyZWY9XCJodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LWJsYW1lXCI+Z2l0LWJsYW1lPC9hPiBhbmRcbiAgICAgICAgICAgICAgICBmb3IgbWF0Y2hlcyAoYXQgbGVhc3QgJHtHSVRfTElORV9BVVRIT1JJTkdfTU9WRU1FTlRfREVURUNUSU9OX01JTklNQUxfTEVOR1RIfSBjaGFyYWN0ZXJzKSB3aXRoaW4gdGhlIHNhbWUgKG9yIGFsbCkgY29tbWl0KHMpLCA8ZW0+dGhlIG9yaWdpbmF0aW5nPC9lbT4gY29tbWl0J3MgaW5mb3JtYXRpb24gaXMgc2hvd24uYDtcblxuICAgICAgICAgICAgbmV3IFNldHRpbmcodGhpcy5jb250YWluZXJFbClcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIlNob3cgY29tbWl0IGhhc2hcIilcbiAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKCh0Z2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGdsLnNldFZhbHVlKHRoaXMuc2V0dGluZ3MubGluZUF1dGhvci5zaG93Q29tbWl0SGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIHRnbC5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVBdXRob3JTZXR0aW5nSGFuZGxlcihcInNob3dDb21taXRIYXNoXCIsIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiQXV0aG9yIG5hbWUgZGlzcGxheVwiKVxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiSWYgYW5kIGhvdyB0aGUgYXV0aG9yIGlzIGRpc3BsYXllZFwiKVxuICAgICAgICAgICAgICAgIC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPExpbmVBdXRob3JEaXNwbGF5LCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZTogXCJIaWRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsczogXCJJbml0aWFscyAoZGVmYXVsdClcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZmlyc3QgbmFtZVwiOiBcIkZpcnN0IG5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFzdCBuYW1lXCI6IFwiTGFzdCBuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmdWxsOiBcIkZ1bGwgbmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5hZGRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnNldHRpbmdzLmxpbmVBdXRob3IuYXV0aG9yRGlzcGxheSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24ub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBMaW5lQXV0aG9yRGlzcGxheSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUF1dGhvclNldHRpbmdIYW5kbGVyKFwiYXV0aG9yRGlzcGxheVwiLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbmV3IFNldHRpbmcodGhpcy5jb250YWluZXJFbClcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIkF1dGhvcmluZyBkYXRlIGRpc3BsYXlcIilcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAgICAgXCJJZiBhbmQgaG93IHRoZSBkYXRlIGFuZCB0aW1lIG9mIGF1dGhvcmluZyB0aGUgbGluZSBpcyBkaXNwbGF5ZWRcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYWRkRHJvcGRvd24oKGRyb3Bkb3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVBdXRob3JEYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgPiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGU6IFwiSGlkZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogXCJEYXRlIChkZWZhdWx0KVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWU6IFwiRGF0ZSBhbmQgdGltZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJuYXR1cmFsIGxhbmd1YWdlXCI6IFwiTmF0dXJhbCBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tOiBcIkN1c3RvbVwiLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5hZGRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MubGluZUF1dGhvci5kYXRlVGltZUZvcm1hdE9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5vbkNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jICh2YWx1ZTogTGluZUF1dGhvckRhdGVUaW1lRm9ybWF0T3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUF1dGhvclNldHRpbmdIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRhdGVUaW1lRm9ybWF0T3B0aW9uc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmxpbmVBdXRob3IuZGF0ZVRpbWVGb3JtYXRPcHRpb25zID09PSBcImN1c3RvbVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVGb3JtYXRDdXN0b21TdHJpbmdTZXR0aW5nID0gbmV3IFNldHRpbmcoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyRWxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVGb3JtYXRDdXN0b21TdHJpbmdTZXR0aW5nXG4gICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiQ3VzdG9tIGF1dGhvcmluZyBkYXRlIGZvcm1hdFwiKVxuICAgICAgICAgICAgICAgICAgICAuYWRkVGV4dCgoY2IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MubGluZUF1dGhvci5kYXRlVGltZUZvcm1hdEN1c3RvbVN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLnNldFBsYWNlaG9sZGVyKFwiWVlZWS1NTS1ERCBISDptbVwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2Iub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lQXV0aG9yU2V0dGluZ0hhbmRsZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0ZVRpbWVGb3JtYXRDdXN0b21TdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVUaW1lRm9ybWF0Q3VzdG9tU3RyaW5nU2V0dGluZy5kZXNjRWwuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3Q3VzdG9tRGF0ZVRpbWVEZXNjcmlwdGlvbkh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVGb3JtYXRDdXN0b21TdHJpbmdTZXR0aW5nLmRlc2NFbC5pbm5lckhUTUwgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdDdXN0b21EYXRlVGltZURlc2NyaXB0aW9uSHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MubGluZUF1dGhvci5kYXRlVGltZUZvcm1hdEN1c3RvbVN0cmluZ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiQXV0aG9yaW5nIGRhdGUgZGlzcGxheSB0aW1lem9uZVwiKVxuICAgICAgICAgICAgICAgIC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPExpbmVBdXRob3JUaW1lem9uZU9wdGlvbiwgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidmlld2VyLWxvY2FsXCI6IFwiTXkgbG9jYWwgKGRlZmF1bHQpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImF1dGhvci1sb2NhbFwiOiBcIkF1dGhvcidzIGxvY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGMwMDAwOiBcIlVUQyswMDAwL1pcIixcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24uc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmxpbmVBdXRob3IuZGF0ZVRpbWVUaW1lem9uZVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogTGluZUF1dGhvclRpbWV6b25lT3B0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lQXV0aG9yU2V0dGluZ0hhbmRsZXIoXCJkYXRlVGltZVRpbWV6b25lXCIsIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pLmRlc2NFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgICAgICAgIFRoZSB0aW1lLXpvbmUgaW4gd2hpY2ggdGhlIGF1dGhvcmluZyBkYXRlIHNob3VsZCBiZSBzaG93bi5cbiAgICAgICAgICAgICAgICAgICAgRWl0aGVyIHlvdXIgbG9jYWwgdGltZS16b25lIChkZWZhdWx0KSxcbiAgICAgICAgICAgICAgICAgICAgdGhlIGF1dGhvcidzIHRpbWUtem9uZSBkdXJpbmcgY29tbWl0IGNyZWF0aW9uIG9yXG4gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEMlQzIlQjEwMDowMFwiPlVUQ1x1MDBCMTAwOjAwPC9hPi5cbiAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIGNvbnN0IG9sZGVzdEFnZVNldHRpbmcgPSBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKS5zZXROYW1lKFxuICAgICAgICAgICAgICAgIFwiT2xkZXN0IGFnZSBpbiBjb2xvcmluZ1wiXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBvbGRlc3RBZ2VTZXR0aW5nLmRlc2NFbC5pbm5lckhUTUwgPVxuICAgICAgICAgICAgICAgIHRoaXMucHJldmlld09sZGVzdEFnZURlc2NyaXB0aW9uSHRtbChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5saW5lQXV0aG9yLmNvbG9yaW5nTWF4QWdlXG4gICAgICAgICAgICAgICAgKVswXTtcblxuICAgICAgICAgICAgb2xkZXN0QWdlU2V0dGluZy5hZGRUZXh0KCh0ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRQbGFjZWhvbGRlcihcIjF5XCIpO1xuICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUodGhpcy5zZXR0aW5ncy5saW5lQXV0aG9yLmNvbG9yaW5nTWF4QWdlKTtcbiAgICAgICAgICAgICAgICB0ZXh0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbcHJldmlldywgdmFsaWRdID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlld09sZGVzdEFnZURlc2NyaXB0aW9uSHRtbCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG9sZGVzdEFnZVNldHRpbmcuZGVzY0VsLmlubmVySFRNTCA9IHByZXZpZXc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lQXV0aG9yU2V0dGluZ0hhbmRsZXIoXCJjb2xvcmluZ01heEFnZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hDb2xvclNldHRpbmdzTmFtZShcIm9sZGVzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29sb3JTZXR0aW5nKFwibmV3ZXN0XCIpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDb2xvclNldHRpbmcoXCJvbGRlc3RcIik7XG5cbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJUZXh0IGNvbG9yXCIpXG4gICAgICAgICAgICAgICAgLmFkZFRleHQoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKHRoaXMuc2V0dGluZ3MubGluZUF1dGhvci50ZXh0Q29sb3JDc3MpO1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUF1dGhvclNldHRpbmdIYW5kbGVyKFwidGV4dENvbG9yQ3NzXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkuZGVzY0VsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICAgICAgVGhlIENTUyBjb2xvciBvZiB0aGUgZ3V0dGVyIHRleHQuPGJyLz5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIEl0IGlzIGhpZ2x5IHJlY29tbWVuZGVkIHRvIHVzZVxuICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL1VzaW5nX0NTU19jdXN0b21fcHJvcGVydGllc1wiPlxuICAgICAgICAgICAgICAgICAgICBDU1MgdmFyaWFibGVzPC9hPlxuICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZW1lc1xuICAgICAgICAgICAgICAgICAgICAoZS5nLiA8cHJlIHN0eWxlPVwiZGlzcGxheTppbmxpbmVcIj52YXIoLS10ZXh0LW11dGVkKTwvcHJlPiBvclxuICAgICAgICAgICAgICAgICAgICA8cHJlIHN0eWxlPVwiZGlzcGxheTppbmxpbmVcIj52YXIoLS10ZXh0LW9uLWFjY2VudCk8L3ByZT4sXG4gICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhleSBhdXRvbWF0aWNhbGx5IGFkYXB0IHRvIHRoZW1lIGNoYW5nZXMuPGJyLz5cblxuICAgICAgICAgICAgICAgICAgICBTZWU6IDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vb2JzaWRpYW4tY29tbXVuaXR5L29ic2lkaWFuLXRoZW1lLXRlbXBsYXRlL2Jsb2IvbWFpbi9vYnNpZGlhbi5jc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgTGlzdCBvZiBhdmFpbGFibGUgQ1NTIHZhcmlhYmxlcyBpbiBPYnNpZGlhblxuICAgICAgICAgICAgICAgICAgICA8YS8+XG4gICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgbmV3IFNldHRpbmcodGhpcy5jb250YWluZXJFbClcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIklnbm9yZSB3aGl0ZXNwYWNlIGFuZCBuZXdsaW5lcyBpbiBjaGFuZ2VzXCIpXG4gICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSgodGdsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRnbC5zZXRWYWx1ZSh0aGlzLnNldHRpbmdzLmxpbmVBdXRob3IuaWdub3JlV2hpdGVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIHRnbC5vbkNoYW5nZSgodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVBdXRob3JTZXR0aW5nSGFuZGxlcihcImlnbm9yZVdoaXRlc3BhY2VcIiwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSkuZGVzY0VsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICAgICAgV2hpdGVzcGFjZSBhbmQgbmV3bGluZXMgYXJlIGludGVycHJldGVkIGFzXG4gICAgICAgICAgICAgICAgICAgIHBhcnQgb2YgdGhlIGRvY3VtZW50IGFuZCBpbiBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIGJ5IGRlZmF1bHQgKGhlbmNlIG5vdCBpZ25vcmVkKS5cbiAgICAgICAgICAgICAgICAgICAgVGhpcyBtYWtlcyB0aGUgbGFzdCBsaW5lIGJlaW5nIHNob3duIGFzICdjaGFuZ2VkJ1xuICAgICAgICAgICAgICAgICAgICB3aGVuIGEgbmV3IHN1YnNlcXVlbnQgbGluZSBpcyBhZGRlZCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbiBpZiB0aGUgcHJldmlvdXNseSBsYXN0IGxpbmUncyB0ZXh0IGlzIHRoZSBzYW1lLlxuICAgICAgICAgICAgICAgICAgICA8YnI+XG4gICAgICAgICAgICAgICAgICAgIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IHB1cmVseS13aGl0ZXNwYWNlIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgKGUuZy4gbGlzdCBuZXN0aW5nIC8gcXVvdGUgaW5kZW50YXRpb24gY2hhbmdlcyksXG4gICAgICAgICAgICAgICAgICAgIHRoZW4gYWN0aXZhdGluZyB0aGlzIHdpbGwgcHJvdmlkZSBtb3JlIG1lYW5pbmdmdWwgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb2xvclNldHRpbmcod2hpY2g6IFwib2xkZXN0XCIgfCBcIm5ld2VzdFwiKSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmcgPSBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJcIilcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3IgPSBwaWNrQ29sb3Iod2hpY2gsIHRoaXMuc2V0dGluZ3MubGluZUF1dGhvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdENvbG9yID0gcGlja0NvbG9yKFxuICAgICAgICAgICAgICAgICAgICB3aGljaCxcbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5saW5lQXV0aG9yXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0ZXh0LnNldFBsYWNlaG9sZGVyKHJnYlRvU3RyaW5nKGRlZmF1bHRDb2xvcikpO1xuICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUocmdiVG9TdHJpbmcoY29sb3IpKTtcbiAgICAgICAgICAgICAgICB0ZXh0Lm9uQ2hhbmdlKChjb2xvck5ldykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZ2IgPSBjb252ZXJ0VG9SZ2IoY29sb3JOZXcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmdiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggPT09IFwibmV3ZXN0XCIgPyBcImNvbG9yTmV3XCIgOiBcImNvbG9yT2xkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVBdXRob3JTZXR0aW5nSGFuZGxlcihrZXksIHJnYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29sb3JTZXR0aW5nc0Rlc2Mod2hpY2gsIHJnYik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5saW5lQXV0aG9yQ29sb3JTZXR0aW5ncy5zZXQod2hpY2gsIHNldHRpbmcpO1xuXG4gICAgICAgIHRoaXMucmVmcmVzaENvbG9yU2V0dGluZ3NOYW1lKHdoaWNoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29sb3JTZXR0aW5nc0Rlc2MoXG4gICAgICAgICAgICB3aGljaCxcbiAgICAgICAgICAgIHBpY2tDb2xvcih3aGljaCwgdGhpcy5zZXR0aW5ncy5saW5lQXV0aG9yKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaENvbG9yU2V0dGluZ3NOYW1lKHdoaWNoOiBcIm9sZGVzdFwiIHwgXCJuZXdlc3RcIikge1xuICAgICAgICBjb25zdCBzZXR0aW5nc0RvbSA9IHRoaXMubGluZUF1dGhvckNvbG9yU2V0dGluZ3MuZ2V0KHdoaWNoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzRG9tKSB7XG4gICAgICAgICAgICBjb25zdCB3aGljaERlc2NyaWJlciA9XG4gICAgICAgICAgICAgICAgd2hpY2ggPT09IFwib2xkZXN0XCJcbiAgICAgICAgICAgICAgICAgICAgPyBgb2xkZXN0ICgke3RoaXMuc2V0dGluZ3MubGluZUF1dGhvci5jb2xvcmluZ01heEFnZX0gb3Igb2xkZXIpYFxuICAgICAgICAgICAgICAgICAgICA6IFwibmV3ZXN0XCI7XG4gICAgICAgICAgICBzZXR0aW5nc0RvbS5uYW1lRWwuaW5uZXJUZXh0ID0gYENvbG9yIGZvciAke3doaWNoRGVzY3JpYmVyfSBjb21taXRzYDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaENvbG9yU2V0dGluZ3NEZXNjKHdoaWNoOiBcIm9sZGVzdFwiIHwgXCJuZXdlc3RcIiwgcmdiPzogUkdCKSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzRG9tID0gdGhpcy5saW5lQXV0aG9yQ29sb3JTZXR0aW5ncy5nZXQod2hpY2gpO1xuICAgICAgICBpZiAoc2V0dGluZ3NEb20pIHtcbiAgICAgICAgICAgIHNldHRpbmdzRG9tLmRlc2NFbC5pbm5lckhUTUwgPSB0aGlzLmNvbG9yU2V0dGluZ1ByZXZpZXdEZXNjSHRtbChcbiAgICAgICAgICAgICAgICB3aGljaCxcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmxpbmVBdXRob3IsXG4gICAgICAgICAgICAgICAgcmdiICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbG9yU2V0dGluZ1ByZXZpZXdEZXNjSHRtbChcbiAgICAgICAgd2hpY2g6IFwib2xkZXN0XCIgfCBcIm5ld2VzdFwiLFxuICAgICAgICBsYVNldHRpbmdzOiBMaW5lQXV0aG9yU2V0dGluZ3MsXG4gICAgICAgIGNvbG9ySXNWYWxpZDogYm9vbGVhblxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJnYlN0ciA9IGNvbG9ySXNWYWxpZFxuICAgICAgICAgICAgPyBwcmV2aWV3Q29sb3Iod2hpY2gsIGxhU2V0dGluZ3MpXG4gICAgICAgICAgICA6IGByZ2JhKDEyNywxMjcsMTI3LDAuMylgO1xuICAgICAgICBjb25zdCB0b2RheSA9IG1vbWVudC51bml4KG1vbWVudC5ub3coKSAvIDEwMDApLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICAgIGNvbnN0IHRleHQgPSBjb2xvcklzVmFsaWRcbiAgICAgICAgICAgID8gYGFiY2RlZiBBdXRob3IgTmFtZSAke3RvZGF5fWBcbiAgICAgICAgICAgIDogXCJpbnZhbGlkIGNvbG9yXCI7XG4gICAgICAgIGNvbnN0IHByZXZpZXcgPSBgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJsaW5lLWF1dGhvci1zZXR0aW5ncy1wcmV2aWV3XCJcbiAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogJHtyZ2JTdHJ9OyB3aWR0aDogMzBjaDtcIlxuICAgICAgICAgICAgPiR7dGV4dH08L2Rpdj5gO1xuXG4gICAgICAgIHJldHVybiBgU3VwcG9ydHMgJ3JnYihyLGcsYiknLCAnaHNsKGgscyxsKScsIGhleCAoIykgYW5kXG4gICAgICAgICAgICBuYW1lZCBjb2xvcnMgKGUuZy4gJ2JsYWNrJywgJ3B1cnBsZScpLiBDb2xvciBwcmV2aWV3OiAke3ByZXZpZXd9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXZpZXdDdXN0b21EYXRlVGltZURlc2NyaXB0aW9uSHRtbChcbiAgICAgICAgZGF0ZVRpbWVGb3JtYXRDdXN0b21TdHJpbmc6IHN0cmluZ1xuICAgICkge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlVGltZSA9IG1vbWVudCgpLmZvcm1hdChkYXRlVGltZUZvcm1hdEN1c3RvbVN0cmluZyk7XG4gICAgICAgIHJldHVybiBgPGEgaHJlZj1cIiR7Rk9STUFUX1NUUklOR19SRUZFUkVOQ0VfVVJMfVwiPkZvcm1hdCBzdHJpbmc8L2E+IHRvIGRpc3BsYXkgdGhlIGF1dGhvcmluZyBkYXRlLjwvYnI+Q3VycmVudGx5OiAke2Zvcm1hdHRlZERhdGVUaW1lfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmV2aWV3T2xkZXN0QWdlRGVzY3JpcHRpb25IdG1sKGNvbG9yaW5nTWF4QWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBwYXJzZUNvbG9yaW5nTWF4QWdlRHVyYXRpb24oY29sb3JpbmdNYXhBZ2UpO1xuICAgICAgICBjb25zdCBkdXJhdGlvblN0cmluZyA9XG4gICAgICAgICAgICBkdXJhdGlvbiAhPT0gdW5kZWZpbmVkID8gYCR7ZHVyYXRpb24uYXNEYXlzKCl9IGRheXNgIDogXCJpbnZhbGlkIVwiO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYFRoZSBvbGRlc3QgYWdlIGluIHRoZSBsaW5lIGF1dGhvciBjb2xvcmluZy4gRXZlcnl0aGluZyBvbGRlciB3aWxsIGhhdmUgdGhlIHNhbWUgY29sb3IuXG4gICAgICAgICAgICA8L2JyPlNtYWxsZXN0IHZhbGlkIGFnZSBpcyBcIjFkXCIuIEN1cnJlbnRseTogJHtkdXJhdGlvblN0cmluZ31gLFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIF0gYXMgY29uc3Q7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGlja0NvbG9yKFxuICAgIHdoaWNoOiBcIm9sZGVzdFwiIHwgXCJuZXdlc3RcIixcbiAgICBsYXM6IExpbmVBdXRob3JTZXR0aW5nc1xuKTogUkdCIHtcbiAgICByZXR1cm4gd2hpY2ggPT09IFwib2xkZXN0XCIgPyBsYXMuY29sb3JPbGQgOiBsYXMuY29sb3JOZXc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbG9yaW5nTWF4QWdlRHVyYXRpb24oXG4gICAgZHVyYXRpb25TdHJpbmc6IHN0cmluZ1xuKTogbW9tZW50LkR1cmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyMvZHVyYXRpb25zL2NyZWF0aW5nL1xuICAgIGNvbnN0IGR1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKFwiUFwiICsgZHVyYXRpb25TdHJpbmcudG9VcHBlckNhc2UoKSk7XG4gICAgcmV0dXJuIGR1cmF0aW9uLmlzVmFsaWQoKSAmJiBkdXJhdGlvbi5hc0RheXMoKSAmJiBkdXJhdGlvbi5hc0RheXMoKSA+PSAxXG4gICAgICAgID8gZHVyYXRpb25cbiAgICAgICAgOiB1bmRlZmluZWQ7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlUGF0Y2ggfSBmcm9tIFwiZGlmZlwiO1xuaW1wb3J0IGdpdCwge1xuICAgIEF1dGhDYWxsYmFjayxcbiAgICBBdXRoRmFpbHVyZUNhbGxiYWNrLFxuICAgIEVycm9ycyxcbiAgICBHaXRIdHRwUmVxdWVzdCxcbiAgICBHaXRIdHRwUmVzcG9uc2UsXG4gICAgR2l0UHJvZ3Jlc3NFdmVudCxcbiAgICBIdHRwQ2xpZW50LFxuICAgIHJlYWRCbG9iLFxuICAgIFdhbGtlcixcbiAgICBXYWxrZXJNYXAsXG59IGZyb20gXCJpc29tb3JwaGljLWdpdFwiO1xuaW1wb3J0IHsgTm90aWNlLCByZXF1ZXN0VXJsIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgT2JzaWRpYW5HaXQgZnJvbSBcIi4uL21haW5cIjtcbmltcG9ydCB7XG4gICAgQnJhbmNoSW5mbyxcbiAgICBGaWxlU3RhdHVzUmVzdWx0LFxuICAgIExvZ0VudHJ5LFxuICAgIFBsdWdpblN0YXRlLFxuICAgIFN0YXR1cyxcbiAgICBVbnN0YWdlZEZpbGUsXG4gICAgV2Fsa0RpZmZlcmVuY2UsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgR2VuZXJhbE1vZGFsIH0gZnJvbSBcIi4uL3VpL21vZGFscy9nZW5lcmFsTW9kYWxcIjtcbmltcG9ydCB7IHNwbGl0UmVtb3RlQnJhbmNoLCB3b3J0aFdhbGtpbmcgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEdpdE1hbmFnZXIgfSBmcm9tIFwiLi9naXRNYW5hZ2VyXCI7XG5pbXBvcnQgeyBNeUFkYXB0ZXIgfSBmcm9tIFwiLi9teUFkYXB0ZXJcIjtcblxuZXhwb3J0IGNsYXNzIElzb21vcnBoaWNHaXQgZXh0ZW5kcyBHaXRNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IEZJTEUgPSAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgSEVBRCA9IDE7XG4gICAgcHJpdmF0ZSByZWFkb25seSBXT1JLRElSID0gMjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFNUQUdFID0gMztcbiAgICAvLyBNYXBwaW5nIGZyb20gc3RhdHVzTWF0cml4IHRvIGdpdCBzdGF0dXMgY29kZXMgYmFzZWQgb2ZmIGdpdCBzdGF0dXMgLS1zaG9ydFxuICAgIC8vIFNlZTogaHR0cHM6Ly9pc29tb3JwaGljLWdpdC5vcmcvZG9jcy9lbi9zdGF0dXNNYXRyaXhcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXR1c19tYXBwaW5nID0ge1xuICAgICAgICBcIjAwMFwiOiBcIiAgXCIsXG4gICAgICAgIFwiMDAzXCI6IFwiQURcIixcbiAgICAgICAgXCIwMjBcIjogXCI/P1wiLFxuICAgICAgICBcIjAyMlwiOiBcIkEgXCIsXG4gICAgICAgIFwiMDIzXCI6IFwiQU1cIixcbiAgICAgICAgXCIxMDBcIjogXCJEIFwiLFxuICAgICAgICBcIjEwMVwiOiBcIiBEXCIsXG4gICAgICAgIFwiMTAzXCI6IFwiTURcIixcbiAgICAgICAgXCIxMTBcIjogXCJEQVwiLCAvLyBUZWNobmljYWxseSwgdHdvIGZpbGVzOiBmaXJzdCBvbmUgaXMgZGVsZXRlZCBcIkQgXCIgYW5kIHNlY29uZCBvbmUgaXMgdW50cmFja2VkIFwiPz9cIlxuICAgICAgICBcIjExMVwiOiBcIiAgXCIsXG4gICAgICAgIFwiMTEzXCI6IFwiTU1cIixcbiAgICAgICAgXCIxMjBcIjogXCJEQVwiLCAvLyBTYW1lIGFzIFwiMTEwXCJcbiAgICAgICAgXCIxMjFcIjogXCIgTVwiLFxuICAgICAgICBcIjEyMlwiOiBcIk0gXCIsXG4gICAgICAgIFwiMTIzXCI6IFwiTU1cIixcbiAgICB9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbm90aWNlTGVuZ3RoID0gOTk5Xzk5OTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZzID0gbmV3IE15QWRhcHRlcih0aGlzLmFwcC52YXVsdCwgdGhpcy5wbHVnaW4pO1xuXG4gICAgY29uc3RydWN0b3IocGx1Z2luOiBPYnNpZGlhbkdpdCkge1xuICAgICAgICBzdXBlcihwbHVnaW4pO1xuICAgIH1cblxuICAgIGdldFJlcG8oKToge1xuICAgICAgICBmczogTXlBZGFwdGVyO1xuICAgICAgICBkaXI6IHN0cmluZztcbiAgICAgICAgZ2l0ZGlyPzogc3RyaW5nO1xuICAgICAgICBvbkF1dGg6IEF1dGhDYWxsYmFjaztcbiAgICAgICAgb25BdXRoRmFpbHVyZTogQXV0aEZhaWx1cmVDYWxsYmFjaztcbiAgICAgICAgaHR0cDogSHR0cENsaWVudDtcbiAgICB9IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZzOiB0aGlzLmZzLFxuICAgICAgICAgICAgZGlyOiB0aGlzLnBsdWdpbi5zZXR0aW5ncy5iYXNlUGF0aCxcbiAgICAgICAgICAgIGdpdGRpcjogdGhpcy5wbHVnaW4uc2V0dGluZ3MuZ2l0RGlyIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9uQXV0aDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9jYWxTdG9yYWdlLmdldFVzZXJuYW1lKCkgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvY2FsU3RvcmFnZS5nZXRQYXNzd29yZCgpID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQXV0aEZhaWx1cmU6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFxuICAgICAgICAgICAgICAgICAgICBcIkF1dGhlbnRpY2F0aW9uIGZhaWxlZC4gUGxlYXNlIHRyeSB3aXRoIGRpZmZlcmVudCBjcmVkZW50aWFsc1wiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VybmFtZSA9IGF3YWl0IG5ldyBHZW5lcmFsTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJTcGVjaWZ5IHlvdXIgdXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICB9KS5vcGVuKCk7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXJuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkID0gYXdhaXQgbmV3IEdlbmVyYWxNb2RhbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNwZWNpZnkgeW91ciBwYXNzd29yZC9wZXJzb25hbCBhY2Nlc3MgdG9rZW5cIixcbiAgICAgICAgICAgICAgICAgICAgfSkub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvY2FsU3RvcmFnZS5zZXRVc2VybmFtZSh1c2VybmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2NhbFN0b3JhZ2Uuc2V0UGFzc3dvcmQocGFzc3dvcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2FuY2VsOiB0cnVlIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaHR0cDoge1xuICAgICAgICAgICAgICAgIGFzeW5jIHJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICB9OiBHaXRIdHRwUmVxdWVzdCk6IFByb21pc2U8R2l0SHR0cFJlc3BvbnNlPiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHN0cmVhbSB5ZXQsIHNvIGNvbGxlY3QgYm9keSBhbmQgc2V0IGl0IHRvIHRoZSBBcnJheUJ1ZmZlclxuICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQncyB3aGF0IHJlcXVlc3RVcmwgZXhwZWN0c1xuICAgICAgICAgICAgICAgICAgICBpZiAoYm9keSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IGF3YWl0IGNvbGxlY3QoYm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gYm9keS5idWZmZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCByZXF1ZXN0VXJsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogW25ldyBVaW50OEFycmF5KHJlcy5hcnJheUJ1ZmZlcildLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlcy5zdGF0dXMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyB3cmFwRlM8VD4oY2FsbDogUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY2FsbDtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnMuc2F2ZUFuZENsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcy5zYXZlQW5kQ2xlYXIoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc3RhdHVzKCk6IFByb21pc2U8U3RhdHVzPiB7XG4gICAgICAgIGxldCBub3RpY2U6IE5vdGljZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5vdGljZSA9IG5ldyBOb3RpY2UoXG4gICAgICAgICAgICAgICAgXCJUaGlzIHRha2VzIGxvbmdlcjogR2V0dGluZyBzdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGljZUxlbmd0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSwgMjAwMDApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuc3RhdHVzKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IChcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLndyYXBGUyhnaXQuc3RhdHVzTWF0cml4KHsgLi4udGhpcy5nZXRSZXBvKCkgfSkpXG4gICAgICAgICAgICApLm1hcCgocm93KSA9PiB0aGlzLmdldEZpbGVTdGF0dXNSZXN1bHQocm93KSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZWQgPSBzdGF0dXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChmaWxlU3RhdHVzKSA9PiBmaWxlU3RhdHVzLndvcmtpbmdfZGlyICE9PSBcIiBcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YXR1cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGZpbGVTdGF0dXMpID0+XG4gICAgICAgICAgICAgICAgICAgIGZpbGVTdGF0dXMuaW5kZXggIT09IFwiIFwiICYmIGZpbGVTdGF0dXMuaW5kZXggIT09IFwiVVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY29uZmxpY3RlZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICBub3RpY2U/LmhpZGUoKTtcbiAgICAgICAgICAgIHJldHVybiB7IGFsbDogc3RhdHVzLCBjaGFuZ2VkLCBzdGFnZWQsIGNvbmZsaWN0ZWQgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICBub3RpY2U/LmhpZGUoKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmRpc3BsYXlFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGNvbW1pdEFsbCh7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgdW5zdGFnZWRGaWxlcyxcbiAgICB9OiB7XG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgc3RhdHVzPzogU3RhdHVzO1xuICAgICAgICB1bnN0YWdlZEZpbGVzPzogVW5zdGFnZWRGaWxlW107XG4gICAgfSk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXV0aG9ySW5mbygpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0YWdlQWxsKHsgc3RhdHVzLCB1bnN0YWdlZEZpbGVzIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbWl0KHsgbWVzc2FnZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmRpc3BsYXlFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGNvbW1pdCh7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgfToge1xuICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgIGFtZW5kPzogYm9vbGVhbjtcbiAgICB9KTogUHJvbWlzZTx1bmRlZmluZWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBdXRob3JJbmZvKCk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5jb21taXQpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0TWVzc2FnZSA9IGF3YWl0IHRoaXMuZm9ybWF0Q29tbWl0TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgIGNvbnN0IGhhZENvbmZsaWN0ID0gdGhpcy5wbHVnaW4ubG9jYWxTdG9yYWdlLmdldENvbmZsaWN0KCk7XG4gICAgICAgICAgICBsZXQgcGFyZW50OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgaWYgKGhhZENvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnJhbmNoSW5mbyA9IGF3YWl0IHRoaXMuYnJhbmNoSW5mbygpO1xuICAgICAgICAgICAgICAgIHBhcmVudCA9IFticmFuY2hJbmZvLmN1cnJlbnQhLCBicmFuY2hJbmZvLnRyYWNraW5nIV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JhcEZTKFxuICAgICAgICAgICAgICAgIGdpdC5jb21taXQoe1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFJlcG8oKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0TWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2NhbFN0b3JhZ2Uuc2V0Q29uZmxpY3QoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc3RhZ2UoZmlsZXBhdGg6IHN0cmluZywgcmVsYXRpdmVUb1ZhdWx0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGdpdFBhdGggPSB0aGlzLmdldFJlbGF0aXZlUmVwb1BhdGgoZmlsZXBhdGgsIHJlbGF0aXZlVG9WYXVsdCk7XG4gICAgICAgIGxldCB2YXVsdFBhdGg6IHN0cmluZztcbiAgICAgICAgaWYgKHJlbGF0aXZlVG9WYXVsdCkge1xuICAgICAgICAgICAgdmF1bHRQYXRoID0gZmlsZXBhdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXVsdFBhdGggPSB0aGlzLmdldFJlbGF0aXZlVmF1bHRQYXRoKGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuYWRkKTtcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyh2YXVsdFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy53cmFwRlMoXG4gICAgICAgICAgICAgICAgICAgIGdpdC5hZGQoeyAuLi50aGlzLmdldFJlcG8oKSwgZmlsZXBhdGg6IGdpdFBhdGggfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLndyYXBGUyhcbiAgICAgICAgICAgICAgICAgICAgZ2l0LnJlbW92ZSh7IC4uLnRoaXMuZ2V0UmVwbygpLCBmaWxlcGF0aDogZ2l0UGF0aCB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5kaXNwbGF5RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzdGFnZUFsbCh7XG4gICAgICAgIGRpcixcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICB1bnN0YWdlZEZpbGVzLFxuICAgIH06IHtcbiAgICAgICAgZGlyPzogc3RyaW5nO1xuICAgICAgICBzdGF0dXM/OiBTdGF0dXM7XG4gICAgICAgIHVuc3RhZ2VkRmlsZXM/OiBVbnN0YWdlZEZpbGVbXTtcbiAgICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5jaGFuZ2VkLm1hcCgoZmlsZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUud29ya2luZ19kaXIgIT09IFwiRFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLndyYXBGUyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXQuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRSZXBvKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoOiBmaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdpdC5yZW1vdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVwbygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoOiBmaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXNUb1N0YWdlID1cbiAgICAgICAgICAgICAgICAgICAgdW5zdGFnZWRGaWxlcyA/PyAoYXdhaXQgdGhpcy5nZXRVbnN0YWdlZEZpbGVzKGRpciA/PyBcIi5cIikpO1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICBmaWxlc1RvU3RhZ2UubWFwKCh7IGZpbGVwYXRoLCBkZWxldGVkIH0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnaXQucmVtb3ZlKHsgLi4udGhpcy5nZXRSZXBvKCksIGZpbGVwYXRoIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLndyYXBGUyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXQuYWRkKHsgLi4udGhpcy5nZXRSZXBvKCksIGZpbGVwYXRoIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdW5zdGFnZShmaWxlcGF0aDogc3RyaW5nLCByZWxhdGl2ZVRvVmF1bHQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLmFkZCk7XG4gICAgICAgICAgICBmaWxlcGF0aCA9IHRoaXMuZ2V0UmVsYXRpdmVSZXBvUGF0aChmaWxlcGF0aCwgcmVsYXRpdmVUb1ZhdWx0KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JhcEZTKFxuICAgICAgICAgICAgICAgIGdpdC5yZXNldEluZGV4KHsgLi4udGhpcy5nZXRSZXBvKCksIGZpbGVwYXRoOiBmaWxlcGF0aCB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmRpc3BsYXlFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHVuc3RhZ2VBbGwoe1xuICAgICAgICBkaXIsXG4gICAgICAgIHN0YXR1cyxcbiAgICB9OiB7XG4gICAgICAgIGRpcj86IHN0cmluZztcbiAgICAgICAgc3RhdHVzPzogU3RhdHVzO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBzdGFnZWQ6IHN0cmluZ1tdO1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YWdlZCA9IHN0YXR1cy5zdGFnZWQubWFwKChmaWxlKSA9PiBmaWxlLnBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdldFN0YWdlZEZpbGVzKGRpciA/PyBcIi5cIik7XG4gICAgICAgICAgICAgICAgc3RhZ2VkID0gcmVzLm1hcCgoeyBmaWxlcGF0aCB9KSA9PiBmaWxlcGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyYXBGUyhcbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgc3RhZ2VkLm1hcCgoZmlsZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGdpdC5yZXNldEluZGV4KHsgLi4udGhpcy5nZXRSZXBvKCksIGZpbGVwYXRoOiBmaWxlIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZGlzY2FyZChmaWxlcGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5hZGQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy53cmFwRlMoXG4gICAgICAgICAgICAgICAgZ2l0LmNoZWNrb3V0KHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRSZXBvKCksXG4gICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoczogW2ZpbGVwYXRoXSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5kaXNwbGF5RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBkaXNjYXJkQWxsKHtcbiAgICAgICAgZGlyLFxuICAgICAgICBzdGF0dXMsXG4gICAgfToge1xuICAgICAgICBkaXI/OiBzdHJpbmc7XG4gICAgICAgIHN0YXR1cz86IFN0YXR1cztcbiAgICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKGRpciAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBmaWxlcyA9IHN0YXR1cy5jaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUucGF0aC5zdGFydHNXaXRoKGRpcikpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGZpbGUpID0+IGZpbGUucGF0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbGVzID0gc3RhdHVzLmNoYW5nZWQubWFwKChmaWxlKSA9PiBmaWxlLnBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmlsZXMgPSAoYXdhaXQgdGhpcy5nZXRVbnN0YWdlZEZpbGVzKGRpcikpLm1hcChcbiAgICAgICAgICAgICAgICAoeyBmaWxlcGF0aCB9KSA9PiBmaWxlcGF0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyYXBGUyhcbiAgICAgICAgICAgICAgICBnaXQuY2hlY2tvdXQoe1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFJlcG8oKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZXBhdGhzOiBmaWxlcyxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5kaXNwbGF5RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRQcm9ncmVzc1RleHQoYWN0aW9uOiBzdHJpbmcsIGV2ZW50OiBHaXRQcm9ncmVzc0V2ZW50KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG91dCA9IGAke2FjdGlvbn0gcHJvZ3Jlc3M6YDtcbiAgICAgICAgaWYgKGV2ZW50LnBoYXNlKSB7XG4gICAgICAgICAgICBvdXQgPSBgJHtvdXR9ICR7ZXZlbnQucGhhc2V9OmA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmxvYWRlZCkge1xuICAgICAgICAgICAgb3V0ID0gYCR7b3V0fSAke2V2ZW50LmxvYWRlZH1gO1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRvdGFsKSB7XG4gICAgICAgICAgICAgICAgb3V0ID0gYCR7b3V0fSBvZiAke2V2ZW50LnRvdGFsfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICByZXNvbHZlUmVmKHJlZjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMud3JhcEZTKGdpdC5yZXNvbHZlUmVmKHsgLi4udGhpcy5nZXRSZXBvKCksIHJlZiB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcHVsbCgpOiBQcm9taXNlPEZpbGVTdGF0dXNSZXN1bHRbXT4ge1xuICAgICAgICBjb25zdCBwcm9ncmVzc05vdGljZSA9IHRoaXMuc2hvd05vdGljZShcIkluaXRpYWxpemluZyBwdWxsXCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUucHVsbCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsQ29tbWl0ID0gYXdhaXQgdGhpcy5yZXNvbHZlUmVmKFwiSEVBRFwiKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2goKTtcbiAgICAgICAgICAgIGNvbnN0IGJyYW5jaEluZm8gPSBhd2FpdCB0aGlzLmJyYW5jaEluZm8oKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja0F1dGhvckluZm8oKTtcblxuICAgICAgICAgICAgY29uc3QgbWVyZ2VSZXMgPSBhd2FpdCB0aGlzLndyYXBGUyhcbiAgICAgICAgICAgICAgICBnaXQubWVyZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFJlcG8oKSxcbiAgICAgICAgICAgICAgICAgICAgb3VyczogYnJhbmNoSW5mby5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICB0aGVpcnM6IGJyYW5jaEluZm8udHJhY2tpbmchLFxuICAgICAgICAgICAgICAgICAgICBhYm9ydE9uQ29uZmxpY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFtZXJnZVJlcy5hbHJlYWR5TWVyZ2VkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy53cmFwRlMoXG4gICAgICAgICAgICAgICAgICAgIGdpdC5jaGVja291dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFJlcG8oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogYnJhbmNoSW5mby5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgb25Qcm9ncmVzczogKHByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzTm90aWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2dyZXNzTm90aWNlIGFzIGFueSkubm90aWNlRWwuaW5uZXJUZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvZ3Jlc3NUZXh0KFwiQ2hlY2tvdXRcIiwgcHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdGU6IGJyYW5jaEluZm8ucmVtb3RlLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9ncmVzc05vdGljZT8uaGlkZSgpO1xuXG4gICAgICAgICAgICBjb25zdCB1cHN0cmVhbUNvbW1pdCA9IGF3YWl0IHRoaXMucmVzb2x2ZVJlZihcIkhFQURcIik7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VkRmlsZXMgPSBhd2FpdCB0aGlzLmdldEZpbGVDaGFuZ2VzQ291bnQoXG4gICAgICAgICAgICAgICAgbG9jYWxDb21taXQsXG4gICAgICAgICAgICAgICAgdXBzdHJlYW1Db21taXRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd05vdGljZShcIkZpbmlzaGVkIHB1bGxcIiwgZmFsc2UpO1xuXG4gICAgICAgICAgICByZXR1cm4gY2hhbmdlZEZpbGVzLm1hcDxGaWxlU3RhdHVzUmVzdWx0PigoZmlsZSkgPT4gKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBmaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgd29ya2luZ19kaXI6IFwiUFwiLFxuICAgICAgICAgICAgICAgIGluZGV4OiBcIlBcIixcbiAgICAgICAgICAgICAgICB2YXVsdF9wYXRoOiB0aGlzLmdldFJlbGF0aXZlVmF1bHRQYXRoKGZpbGUucGF0aCksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBwcm9ncmVzc05vdGljZT8uaGlkZSgpO1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3JzLk1lcmdlQ29uZmxpY3RFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmhhbmRsZUNvbmZsaWN0KFxuICAgICAgICAgICAgICAgICAgICBlcnJvci5kYXRhLmZpbGVwYXRocy5tYXAoKGZpbGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlbGF0aXZlVmF1bHRQYXRoKGZpbGUpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5kaXNwbGF5RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBwdXNoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuY2FuUHVzaCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvZ3Jlc3NOb3RpY2UgPSB0aGlzLnNob3dOb3RpY2UoXCJJbml0aWFsaXppbmcgcHVzaFwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLnN0YXR1cyk7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmJyYW5jaEluZm8oKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNraW5nQnJhbmNoID0gc3RhdHVzLnRyYWNraW5nO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEJyYW5jaCA9IHN0YXR1cy5jdXJyZW50O1xuICAgICAgICAgICAgY29uc3QgbnVtQ2hhbmdlZEZpbGVzID0gKFxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0RmlsZUNoYW5nZXNDb3VudChjdXJyZW50QnJhbmNoISwgdHJhY2tpbmdCcmFuY2ghKVxuICAgICAgICAgICAgKS5sZW5ndGg7XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldFN0YXRlKFBsdWdpblN0YXRlLnB1c2gpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyYXBGUyhcbiAgICAgICAgICAgICAgICBnaXQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVwbygpLFxuICAgICAgICAgICAgICAgICAgICBvblByb2dyZXNzOiAocHJvZ3Jlc3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc05vdGljZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2dyZXNzTm90aWNlIGFzIGFueSkubm90aWNlRWwuaW5uZXJUZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9ncmVzc1RleHQoXCJQdXNoaW5nXCIsIHByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2dyZXNzTm90aWNlPy5oaWRlKCk7XG4gICAgICAgICAgICByZXR1cm4gbnVtQ2hhbmdlZEZpbGVzO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcHJvZ3Jlc3NOb3RpY2U/LmhpZGUoKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmRpc3BsYXlFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldFVucHVzaGVkQ29tbWl0cygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmJyYW5jaEluZm8oKTtcbiAgICAgICAgY29uc3QgdHJhY2tpbmdCcmFuY2ggPSBzdGF0dXMudHJhY2tpbmc7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCcmFuY2ggPSBzdGF0dXMuY3VycmVudDtcblxuICAgICAgICBpZiAodHJhY2tpbmdCcmFuY2ggPT0gbnVsbCB8fCBjdXJyZW50QnJhbmNoID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jYWxDb21taXQgPSBhd2FpdCB0aGlzLnJlc29sdmVSZWYoY3VycmVudEJyYW5jaCk7XG4gICAgICAgIGNvbnN0IHVwc3RyZWFtQ29tbWl0ID0gYXdhaXQgdGhpcy5yZXNvbHZlUmVmKHRyYWNraW5nQnJhbmNoKTtcblxuICAgICAgICBjb25zdCBjaGFuZ2VkRmlsZXMgPSBhd2FpdCB0aGlzLmdldEZpbGVDaGFuZ2VzQ291bnQoXG4gICAgICAgICAgICBsb2NhbENvbW1pdCxcbiAgICAgICAgICAgIHVwc3RyZWFtQ29tbWl0XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGNoYW5nZWRGaWxlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgYXN5bmMgY2FuUHVzaCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5icmFuY2hJbmZvKCk7XG4gICAgICAgIGNvbnN0IHRyYWNraW5nQnJhbmNoID0gc3RhdHVzLnRyYWNraW5nO1xuICAgICAgICBjb25zdCBjdXJyZW50QnJhbmNoID0gc3RhdHVzLmN1cnJlbnQ7XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMucmVzb2x2ZVJlZihjdXJyZW50QnJhbmNoISk7XG4gICAgICAgIGNvbnN0IHRyYWNraW5nID0gYXdhaXQgdGhpcy5yZXNvbHZlUmVmKHRyYWNraW5nQnJhbmNoISk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgIT0gdHJhY2tpbmc7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tSZXF1aXJlbWVudHMoKTogUHJvbWlzZTxcInZhbGlkXCIgfCBcIm1pc3NpbmctcmVwb1wiPiB7XG4gICAgICAgIGNvbnN0IGhlYWRFeGlzdHMgPSBhd2FpdCB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMoXG4gICAgICAgICAgICBgJHt0aGlzLmdldFJlcG8oKS5kaXJ9Ly5naXQvSEVBRGBcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gaGVhZEV4aXN0cyA/IFwidmFsaWRcIiA6IFwibWlzc2luZy1yZXBvXCI7XG4gICAgfVxuXG4gICAgYXN5bmMgYnJhbmNoSW5mbygpOiBQcm9taXNlPEJyYW5jaEluZm8gJiB7IHJlbW90ZTogc3RyaW5nIH0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoYXdhaXQgZ2l0LmN1cnJlbnRCcmFuY2godGhpcy5nZXRSZXBvKCkpKSB8fCBcIlwiO1xuXG4gICAgICAgICAgICBjb25zdCBicmFuY2hlcyA9IGF3YWl0IGdpdC5saXN0QnJhbmNoZXModGhpcy5nZXRSZXBvKCkpO1xuXG4gICAgICAgICAgICBjb25zdCByZW1vdGUgPVxuICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmdldENvbmZpZyhgYnJhbmNoLiR7Y3VycmVudH0ucmVtb3RlYCkpID8/IFwib3JpZ2luXCI7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYWNraW5nQnJhbmNoID0gKFxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0Q29uZmlnKGBicmFuY2guJHtjdXJyZW50fS5tZXJnZWApXG4gICAgICAgICAgICApPy5zcGxpdChcInJlZnMvaGVhZHNcIilbMV07XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYWNraW5nID0gdHJhY2tpbmdCcmFuY2hcbiAgICAgICAgICAgICAgICA/IHJlbW90ZSArIHRyYWNraW5nQnJhbmNoXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgICAgICAgICAgICB0cmFja2luZzogdHJhY2tpbmcsXG4gICAgICAgICAgICAgICAgYnJhbmNoZXM6IGJyYW5jaGVzLFxuICAgICAgICAgICAgICAgIHJlbW90ZTogcmVtb3RlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmRpc3BsYXlFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldEN1cnJlbnRSZW1vdGUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IChhd2FpdCBnaXQuY3VycmVudEJyYW5jaCh0aGlzLmdldFJlcG8oKSkpIHx8IFwiXCI7XG5cbiAgICAgICAgY29uc3QgcmVtb3RlID1cbiAgICAgICAgICAgIChhd2FpdCB0aGlzLmdldENvbmZpZyhgYnJhbmNoLiR7Y3VycmVudH0ucmVtb3RlYCkpID8/IFwib3JpZ2luXCI7XG4gICAgICAgIHJldHVybiByZW1vdGU7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tvdXQoYnJhbmNoOiBzdHJpbmcsIHJlbW90ZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcEZTKFxuICAgICAgICAgICAgICAgIGdpdC5jaGVja291dCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVwbygpLFxuICAgICAgICAgICAgICAgICAgICByZWY6IGJyYW5jaCxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6ICEhcmVtb3RlLFxuICAgICAgICAgICAgICAgICAgICByZW1vdGUsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5kaXNwbGF5RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVCcmFuY2goYnJhbmNoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JhcEZTKFxuICAgICAgICAgICAgICAgIGdpdC5icmFuY2goeyAuLi50aGlzLmdldFJlcG8oKSwgcmVmOiBicmFuY2gsIGNoZWNrb3V0OiB0cnVlIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlQnJhbmNoKGJyYW5jaDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyYXBGUyhcbiAgICAgICAgICAgICAgICBnaXQuZGVsZXRlQnJhbmNoKHsgLi4udGhpcy5nZXRSZXBvKCksIHJlZjogYnJhbmNoIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgYnJhbmNoSXNNZXJnZWQoXzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyYXBGUyhnaXQuaW5pdCh0aGlzLmdldFJlcG8oKSkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgY2xvbmUodXJsOiBzdHJpbmcsIGRpcjogc3RyaW5nLCBkZXB0aD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwcm9ncmVzc05vdGljZSA9IHRoaXMuc2hvd05vdGljZShcIkluaXRpYWxpemluZyBjbG9uZVwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JhcEZTKFxuICAgICAgICAgICAgICAgIGdpdC5jbG9uZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVwbygpLFxuICAgICAgICAgICAgICAgICAgICBkaXI6IGRpcixcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoOiBkZXB0aCxcbiAgICAgICAgICAgICAgICAgICAgb25Qcm9ncmVzczogKHByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NOb3RpY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9ncmVzc05vdGljZSBhcyBhbnkpLm5vdGljZUVsLmlubmVyVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvZ3Jlc3NUZXh0KFwiQ2xvbmluZ1wiLCBwcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9ncmVzc05vdGljZT8uaGlkZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcHJvZ3Jlc3NOb3RpY2U/LmhpZGUoKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmRpc3BsYXlFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHNldENvbmZpZyhcbiAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcEZTKFxuICAgICAgICAgICAgICAgIGdpdC5zZXRDb25maWcoe1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFJlcG8oKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Q29uZmlnKHBhdGg6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwRlMoXG4gICAgICAgICAgICAgICAgZ2l0LmdldENvbmZpZyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVwbygpLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2gocmVtb3RlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzTm90aWNlID0gdGhpcy5zaG93Tm90aWNlKFwiSW5pdGlhbGl6aW5nIGZldGNoXCIpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRSZXBvKCksXG4gICAgICAgICAgICAgICAgb25Qcm9ncmVzczogKHByb2dyZXNzOiBHaXRQcm9ncmVzc0V2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc05vdGljZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAocHJvZ3Jlc3NOb3RpY2UgYXMgYW55KS5ub3RpY2VFbC5pbm5lclRleHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvZ3Jlc3NUZXh0KFwiRmV0Y2hpbmdcIiwgcHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW1vdGU6IHJlbW90ZSA/PyAoYXdhaXQgdGhpcy5nZXRDdXJyZW50UmVtb3RlKCkpLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy53cmFwRlMoZ2l0LmZldGNoKGFyZ3MpKTtcbiAgICAgICAgICAgIHByb2dyZXNzTm90aWNlPy5oaWRlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5kaXNwbGF5RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcHJvZ3Jlc3NOb3RpY2U/LmhpZGUoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0UmVtb3RlKG5hbWU6IHN0cmluZywgdXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JhcEZTKFxuICAgICAgICAgICAgICAgIGdpdC5hZGRSZW1vdGUoe1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFJlcG8oKSxcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5kaXNwbGF5RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRSZW1vdGVCcmFuY2hlcyhyZW1vdGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgbGV0IHJlbW90ZUJyYW5jaGVzID0gW107XG4gICAgICAgIHJlbW90ZUJyYW5jaGVzLnB1c2goXG4gICAgICAgICAgICAuLi4oYXdhaXQgdGhpcy53cmFwRlMoXG4gICAgICAgICAgICAgICAgZ2l0Lmxpc3RCcmFuY2hlcyh7IC4uLnRoaXMuZ2V0UmVwbygpLCByZW1vdGU6IHJlbW90ZSB9KVxuICAgICAgICAgICAgKSlcbiAgICAgICAgKTtcblxuICAgICAgICByZW1vdGVCcmFuY2hlcy5yZW1vdmUoXCJIRUFEXCIpO1xuXG4gICAgICAgIC8vQWxpZ24gd2l0aCBzaW1wbGUtZ2l0XG4gICAgICAgIHJlbW90ZUJyYW5jaGVzID0gcmVtb3RlQnJhbmNoZXMubWFwKChlKSA9PiBgJHtyZW1vdGV9LyR7ZX1gKTtcbiAgICAgICAgcmV0dXJuIHJlbW90ZUJyYW5jaGVzO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFJlbW90ZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMud3JhcEZTKGdpdC5saXN0UmVtb3Rlcyh7IC4uLnRoaXMuZ2V0UmVwbygpIH0pKSkubWFwKFxuICAgICAgICAgICAgKHJlbW90ZVVybCkgPT4gcmVtb3RlVXJsLnJlbW90ZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIHJlbW92ZVJlbW90ZShyZW1vdGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53cmFwRlMoXG4gICAgICAgICAgICBnaXQuZGVsZXRlUmVtb3RlKHsgLi4udGhpcy5nZXRSZXBvKCksIHJlbW90ZTogcmVtb3RlTmFtZSB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFJlbW90ZVVybChyZW1vdGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyYXBGUyhnaXQubGlzdFJlbW90ZXMoeyAuLi50aGlzLmdldFJlcG8oKSB9KSlcbiAgICAgICAgKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ucmVtb3RlID09IHJlbW90ZSlbMF0/LnVybDtcbiAgICB9XG5cbiAgICBhc3luYyBsb2coXz86IHN0cmluZywgX18gPSB0cnVlLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8TG9nRW50cnlbXT4ge1xuICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy53cmFwRlMoXG4gICAgICAgICAgICBnaXQubG9nKHsgLi4udGhpcy5nZXRSZXBvKCksIGRlcHRoOiBsaW1pdCB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGxvZ3MubWFwKGFzeW5jIChsb2cpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZU1lc3NhZ2UgPSBsb2cuY29tbWl0Lm1lc3NhZ2Uuc3BsaXQoXCJcXG5cXG5cIik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjb21wbGV0ZU1lc3NhZ2VbMF0sXG4gICAgICAgICAgICAgICAgICAgIGF1dGhvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbG9nLmNvbW1pdC5hdXRob3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBsb2cuY29tbWl0LmF1dGhvci5lbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogY29tcGxldGVNZXNzYWdlLnNsaWNlKDEpLmpvaW4oXCJcXG5cXG5cIiksXG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmNvbW1pdC5jb21taXR0ZXIudGltZXN0YW1wXG4gICAgICAgICAgICAgICAgICAgICkudG9EYXRlU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIGRpZmY6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQ6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0RmlsZUNoYW5nZXNDb3VudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmNvbW1pdC5wYXJlbnQuZmlyc3QoKSEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5vaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGl0ZW0ucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBpdGVtLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhdWx0X3BhdGg6IHRoaXMuZ2V0UmVsYXRpdmVWYXVsdFBhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDogbG9nLm9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5OiB1bmRlZmluZWQhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaGFzaDogbG9nLm9pZCxcbiAgICAgICAgICAgICAgICAgICAgcmVmczogW10sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBkYXRlQmFzZVBhdGgoYmFzZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmdldFJlcG8oKS5kaXIgPSBiYXNlUGF0aDtcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVVcHN0cmVhbUJyYW5jaChyZW1vdGVCcmFuY2g6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBbcmVtb3RlLCBicmFuY2hdID0gc3BsaXRSZW1vdGVCcmFuY2gocmVtb3RlQnJhbmNoKTtcbiAgICAgICAgY29uc3QgYnJhbmNoSW5mbyA9IGF3YWl0IHRoaXMuYnJhbmNoSW5mbygpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q29uZmlnKFxuICAgICAgICAgICAgYGJyYW5jaC4ke2JyYW5jaEluZm8uY3VycmVudH0ubWVyZ2VgLFxuICAgICAgICAgICAgYHJlZnMvaGVhZHMvJHticmFuY2h9YFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLnNldENvbmZpZyhgYnJhbmNoLiR7YnJhbmNofS5yZW1vdGVgLCByZW1vdGUpO1xuICAgIH1cblxuICAgIHVwZGF0ZUdpdFBhdGgoXzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIC8vIGlzb21vcnBoaWMtZ2l0IGxpYnJhcnkgaGFzIGl0cyBvd24gZ2l0IGNsaWVudFxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RmlsZUNoYW5nZXNDb3VudChcbiAgICAgICAgY29tbWl0SGFzaDE6IHN0cmluZyxcbiAgICAgICAgY29tbWl0SGFzaDI6IHN0cmluZ1xuICAgICk6IFByb21pc2U8V2Fsa0RpZmZlcmVuY2VbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy53YWxrRGlmZmVyZW5jZSh7XG4gICAgICAgICAgICB3YWxrZXJzOiBbXG4gICAgICAgICAgICAgICAgZ2l0LlRSRUUoeyByZWY6IGNvbW1pdEhhc2gxIH0pLFxuICAgICAgICAgICAgICAgIGdpdC5UUkVFKHsgcmVmOiBjb21taXRIYXNoMiB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIHdhbGtEaWZmZXJlbmNlKHtcbiAgICAgICAgd2Fsa2VycyxcbiAgICAgICAgZGlyOiBiYXNlLFxuICAgIH06IHtcbiAgICAgICAgd2Fsa2VyczogV2Fsa2VyW107XG4gICAgICAgIGRpcj86IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTxXYWxrRGlmZmVyZW5jZVtdPiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMud3JhcEZTKFxuICAgICAgICAgICAgZ2l0LndhbGsoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVwbygpLFxuICAgICAgICAgICAgICAgIHRyZWVzOiB3YWxrZXJzLFxuICAgICAgICAgICAgICAgIG1hcDogYXN5bmMgZnVuY3Rpb24gKGZpbGVwYXRoLCBbQSwgQl0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3b3J0aFdhbGtpbmcoZmlsZXBhdGgsIGJhc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCBBPy50eXBlKCkpID09PSBcInRyZWVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IEI/LnR5cGUoKSkgPT09IFwidHJlZVwiXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgaWRzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IEFvaWQgPSBhd2FpdCBBPy5vaWQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgQm9pZCA9IGF3YWl0IEI/Lm9pZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBtb2RpZmljYXRpb24gdHlwZVxuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IFwiZXF1YWxcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFvaWQgIT09IEJvaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBcIk1cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoQW9pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gXCJBXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKEJvaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFwiRFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEFvaWQgPT09IHVuZGVmaW5lZCAmJiBCb2lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU29tZXRoaW5nIHdlaXJkIGhhcHBlbmVkOlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKEEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coQik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiZXF1YWxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBhc3luYyBnZXRTdGFnZWRGaWxlcyhcbiAgICAgICAgZGlyID0gXCIuXCJcbiAgICApOiBQcm9taXNlPHsgdmF1bHRfcGF0aDogc3RyaW5nOyBmaWxlcGF0aDogc3RyaW5nIH1bXT4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLndhbGtEaWZmZXJlbmNlKHtcbiAgICAgICAgICAgIHdhbGtlcnM6IFtnaXQuVFJFRSh7IHJlZjogXCJIRUFEXCIgfSksIGdpdC5TVEFHRSgpXSxcbiAgICAgICAgICAgIGRpcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXMubWFwKChmaWxlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhdWx0X3BhdGg6IHRoaXMuZ2V0UmVsYXRpdmVWYXVsdFBhdGgoZmlsZS5wYXRoKSxcbiAgICAgICAgICAgICAgICBmaWxlcGF0aDogZmlsZS5wYXRoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0VW5zdGFnZWRGaWxlcyhiYXNlID0gXCIuXCIpOiBQcm9taXNlPFVuc3RhZ2VkRmlsZVtdPiB7XG4gICAgICAgIGxldCBub3RpY2U6IE5vdGljZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5vdGljZSA9IG5ldyBOb3RpY2UoXG4gICAgICAgICAgICAgICAgXCJUaGlzIHRha2VzIGxvbmdlcjogR2V0dGluZyBzdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGljZUxlbmd0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSwgMjAwMDApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZ2V0UmVwbygpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy53cmFwRlM8UHJvbWlzZTxVbnN0YWdlZEZpbGVbXT4+KFxuICAgICAgICAgICAgICAgIC8vTW9kaWZpZWQgZnJvbSBgZ2l0LnN0YXR1c01hdHJpeGBcbiAgICAgICAgICAgICAgICBnaXQud2Fsayh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnJlcG8sXG4gICAgICAgICAgICAgICAgICAgIHRyZWVzOiBbZ2l0LldPUktESVIoKSwgZ2l0LlNUQUdFKCldLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgW3dvcmtkaXIsIHN0YWdlXVxuICAgICAgICAgICAgICAgICAgICApOiBQcm9taXNlPFVuc3RhZ2VkRmlsZSB8IG51bGwgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZ25vcmVkIGZpbGVzLCBidXQgb25seSBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSB0cmFja2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFnZSAmJiB3b3JrZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNJZ25vcmVkID0gYXdhaXQgZ2l0LmlzSWdub3JlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlcG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0lnbm9yZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggYWdhaW5zdCBiYXNlIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd29ydGhXYWxraW5nKGZpbGVwYXRoLCBiYXNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZSBmaWx0ZXIgYWdhaW5zdCBmaWxlIG5hbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWYgKCFmaWx0ZXIoZmlsZXBhdGgpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3b3JrZGlyVHlwZSwgc3RhZ2VUeXBlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZGlyICYmIHdvcmtkaXIudHlwZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlICYmIHN0YWdlLnR5cGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0Jsb2IgPSBbd29ya2RpclR5cGUsIHN0YWdlVHlwZV0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJibG9iXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3csIGJhaWwgb24gZGlyZWN0b3JpZXMgdW5sZXNzIHRoZSBmaWxlIGlzIGFsc28gYSBibG9iIGluIGFub3RoZXIgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZGlyVHlwZSA9PT0gXCJ0cmVlXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2RpclR5cGUgPT09IFwic3BlY2lhbFwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0Jsb2JcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFnZVR5cGUgPT09IFwiY29tbWl0XCIpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGFnZVR5cGUgPT09IFwidHJlZVwiIHx8IHN0YWdlVHlwZSA9PT0gXCJzcGVjaWFsXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzQmxvYlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgb2lkcyBmb3IgZmlsZXMsIHVzaW5nIHRoZSBzdGFnZWQgb2lkIGZvciB0aGUgd29ya2luZyBkaXIgb2lkIGlmIHRoZSBzdGF0cyBtYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWdlT2lkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZVR5cGUgPT09IFwiYmxvYlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXdhaXQgc3RhZ2UhLm9pZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmtkaXJPaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2RpclR5cGUgPT09IFwiYmxvYlwiICYmIHN0YWdlVHlwZSAhPT0gXCJibG9iXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBhY3R1YWxseSBORUVEIHRoZSBzaGEuIEFueSBzaGEgd2lsbCBkb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtkaXJPaWQgPSBcIjQyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdvcmtkaXJUeXBlID09PSBcImJsb2JcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtkaXJPaWQgPSBhd2FpdCB3b3JrZGlyIS5vaWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd29ya2Rpck9pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoOiBmaWxlcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Rpck9pZCAhPT0gc3RhZ2VPaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcGF0aDogZmlsZXBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGVudHJ5ID0gW3VuZGVmaW5lZCwgaGVhZE9pZCwgd29ya2Rpck9pZCwgc3RhZ2VPaWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVzdWx0ID0gZW50cnkubWFwKHZhbHVlID0+IGVudHJ5LmluZGV4T2YodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdC5zaGlmdCgpOyAvLyByZW1vdmUgbGVhZGluZyB1bmRlZmluZWQgZW50cnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBbZmlsZXBhdGgsIC4uLnJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgbm90aWNlPy5oaWRlKCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIG5vdGljZT8uaGlkZSgpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RGlmZlN0cmluZyhcbiAgICAgICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICAgICAgc3RhZ2VkQ2hhbmdlcyA9IGZhbHNlLFxuICAgICAgICBoYXNoPzogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgdmF1bHRQYXRoID0gdGhpcy5nZXRSZWxhdGl2ZVZhdWx0UGF0aChmaWxlUGF0aCk7XG5cbiAgICAgICAgY29uc3QgbWFwOiBXYWxrZXJNYXAgPSBhc3luYyAoZmlsZSwgW0FdKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZVBhdGggPT0gZmlsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9pZCA9IGF3YWl0IEEhLm9pZCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gYXdhaXQgZ2l0LnJlYWRCbG9iKHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRSZXBvKCksXG4gICAgICAgICAgICAgICAgICAgIG9pZDogb2lkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50cy5ibG9iO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoaGFzaCkge1xuICAgICAgICAgICAgY29uc3QgY29tbWl0Q29udGVudCA9IGF3YWl0IHJlYWRCbG9iKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldFJlcG8oKSxcbiAgICAgICAgICAgICAgICBmaWxlcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgb2lkOiBoYXNoLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigoaGVhZEJsb2IpID0+IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShoZWFkQmxvYi5ibG9iKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgZ2l0LkVycm9ycy5Ob3RGb3VuZEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgY29tbWl0ID0gYXdhaXQgZ2l0LnJlYWRDb21taXQoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVwbygpLFxuICAgICAgICAgICAgICAgIG9pZDogaGFzaCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0NvbnRlbnQgPSBhd2FpdCByZWFkQmxvYih7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRSZXBvKCksXG4gICAgICAgICAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIG9pZDogY29tbWl0LmNvbW1pdC5wYXJlbnQuZmlyc3QoKSEsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKChoZWFkQmxvYikgPT4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGhlYWRCbG9iLmJsb2IpKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBnaXQuRXJyb3JzLk5vdEZvdW5kRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBjcmVhdGVQYXRjaChcbiAgICAgICAgICAgICAgICB2YXVsdFBhdGgsXG4gICAgICAgICAgICAgICAgcHJldmlvdXNDb250ZW50ID8/IFwiXCIsXG4gICAgICAgICAgICAgICAgY29tbWl0Q29udGVudCA/PyBcIlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFnZWRCbG9iID0gKFxuICAgICAgICAgICAgYXdhaXQgZ2l0LndhbGsoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVwbygpLFxuICAgICAgICAgICAgICAgIHRyZWVzOiBbZ2l0LlNUQUdFKCldLFxuICAgICAgICAgICAgICAgIG1hcCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkuZmlyc3QoKTtcbiAgICAgICAgY29uc3Qgc3RhZ2VkQ29udGVudCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShzdGFnZWRCbG9iKTtcblxuICAgICAgICBpZiAoc3RhZ2VkQ2hhbmdlcykge1xuICAgICAgICAgICAgY29uc3QgaGVhZENvbnRlbnQgPSBhd2FpdCB0aGlzLnJlc29sdmVSZWYoXCJIRUFEXCIpXG4gICAgICAgICAgICAgICAgLnRoZW4oKG9pZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgcmVhZEJsb2Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRSZXBvKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBvaWQ6IG9pZCxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnRoZW4oKGhlYWRCbG9iKSA9PiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoaGVhZEJsb2IuYmxvYikpXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIGdpdC5FcnJvcnMuTm90Rm91bmRFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZGlmZiA9IGNyZWF0ZVBhdGNoKFxuICAgICAgICAgICAgICAgIHZhdWx0UGF0aCxcbiAgICAgICAgICAgICAgICBoZWFkQ29udGVudCA/PyBcIlwiLFxuICAgICAgICAgICAgICAgIHN0YWdlZENvbnRlbnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB3b3JrZGlyQ29udGVudDogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHZhdWx0UGF0aCkpIHtcbiAgICAgICAgICAgICAgICB3b3JrZGlyQ29udGVudCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIucmVhZCh2YXVsdFBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3b3JrZGlyQ29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBjcmVhdGVQYXRjaCh2YXVsdFBhdGgsIHN0YWdlZENvbnRlbnQsIHdvcmtkaXJDb250ZW50KTtcbiAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TGFzdENvbW1pdFRpbWUoKTogUHJvbWlzZTxEYXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmdldFJlcG8oKTtcbiAgICAgICAgY29uc3Qgb2lkID0gYXdhaXQgdGhpcy5yZXNvbHZlUmVmKFwiSEVBRFwiKTtcbiAgICAgICAgY29uc3QgY29tbWl0ID0gYXdhaXQgZ2l0LnJlYWRDb21taXQoeyAuLi5yZXBvLCBvaWQ6IG9pZCB9KTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IGNvbW1pdC5jb21taXQuY29tbWl0dGVyLnRpbWVzdGFtcDtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpbGVTdGF0dXNSZXN1bHQoXG4gICAgICAgIHJvdzogW3N0cmluZywgMCB8IDEsIDAgfCAxIHwgMiwgMCB8IDEgfCAyIHwgM11cbiAgICApOiBGaWxlU3RhdHVzUmVzdWx0IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gKHRoaXMuc3RhdHVzX21hcHBpbmcgYXMgYW55KVtcbiAgICAgICAgICAgIGAke3Jvd1t0aGlzLkhFQURdfSR7cm93W3RoaXMuV09SS0RJUl19JHtyb3dbdGhpcy5TVEFHRV19YFxuICAgICAgICBdO1xuICAgICAgICAvLyBzdGF0dXMgd2lsbCBhbHdheXMgYmUgdHdvIGNoYXJhY3RlcnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4OiBzdGF0dXNbMF0gPT0gXCI/XCIgPyBcIlVcIiA6IHN0YXR1c1swXSxcbiAgICAgICAgICAgIHdvcmtpbmdfZGlyOiBzdGF0dXNbMV0gPT0gXCI/XCIgPyBcIlVcIiA6IHN0YXR1c1sxXSxcbiAgICAgICAgICAgIHBhdGg6IHJvd1t0aGlzLkZJTEVdLFxuICAgICAgICAgICAgdmF1bHRfcGF0aDogdGhpcy5nZXRSZWxhdGl2ZVZhdWx0UGF0aChyb3dbdGhpcy5GSUxFXSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja0F1dGhvckluZm8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBhd2FpdCB0aGlzLmdldENvbmZpZyhcInVzZXIubmFtZVwiKTtcbiAgICAgICAgY29uc3QgZW1haWwgPSBhd2FpdCB0aGlzLmdldENvbmZpZyhcInVzZXIuZW1haWxcIik7XG4gICAgICAgIGlmICghbmFtZSB8fCAhZW1haWwpIHtcbiAgICAgICAgICAgIHRocm93IFwiR2l0IGF1dGhvciBpbmZvcm1hdGlvbiBpcyBub3Qgc2V0LiBQbGVhc2Ugc2V0IGl0IGluIHRoZSBzZXR0aW5ncy5cIjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd05vdGljZShtZXNzYWdlOiBzdHJpbmcsIGluZmluaXR5ID0gdHJ1ZSk6IE5vdGljZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGlzYWJsZVBvcHVwcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb3RpY2UoXG4gICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBpbmZpbml0eSA/IHRoaXMubm90aWNlTGVuZ3RoIDogdW5kZWZpbmVkXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBBbGwgYmVjYXVzZSB3ZSBjYW4ndCB1c2UgKGZvciBhd2FpdCkuLi5cblxuLy8gQ29udmVydCBhIHZhbHVlIHRvIGFuIEFzeW5jIEl0ZXJhdG9yXG4vLyBUaGlzIHdpbGwgYmUgZWFzaWVyIHdpdGggYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9ucy5cbmZ1bmN0aW9uIGZyb21WYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgbGV0IHF1ZXVlID0gW3ZhbHVlXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgZG9uZTogcXVldWUubGVuZ3RoID09PSAwLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBxdWV1ZS5wb3AoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXR1cm4oKSB7XG4gICAgICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9LFxuICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0SXRlcmF0b3IoaXRlcmFibGU6IGFueSkge1xuICAgIGlmIChpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgIH1cbiAgICBpZiAoaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgICByZXR1cm4gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIH1cbiAgICBpZiAoaXRlcmFibGUubmV4dCkge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgfVxuICAgIHJldHVybiBmcm9tVmFsdWUoaXRlcmFibGUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmb3JBd2FpdChpdGVyYWJsZTogYW55LCBjYjogYW55KSB7XG4gICAgY29uc3QgaXRlciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlKTtcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgICAgaWYgKHZhbHVlKSBhd2FpdCBjYih2YWx1ZSk7XG4gICAgICAgIGlmIChkb25lKSBicmVhaztcbiAgICB9XG4gICAgaWYgKGl0ZXIucmV0dXJuKSBpdGVyLnJldHVybigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0KGl0ZXJhYmxlOiBhbnkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgY29uc3QgYnVmZmVyczogVWludDhBcnJheVtdID0gW107XG4gICAgLy8gVGhpcyB3aWxsIGJlIGVhc2llciBvbmNlIGBmb3IgYXdhaXQgLi4uIG9mYCBsb29wcyBhcmUgYXZhaWxhYmxlLlxuICAgIGF3YWl0IGZvckF3YWl0KGl0ZXJhYmxlLCAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBidWZmZXJzLnB1c2godmFsdWUpO1xuICAgICAgICBzaXplICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgbGV0IG5leHRJbmRleCA9IDA7XG4gICAgZm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVycykge1xuICAgICAgICByZXN1bHQuc2V0KGJ1ZmZlciwgbmV4dEluZGV4KTtcbiAgICAgICAgbmV4dEluZGV4ICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwgImZ1bmN0aW9uIERpZmYoKSB7fVxuRGlmZi5wcm90b3R5cGUgPSB7XG4gIGRpZmY6IGZ1bmN0aW9uIGRpZmYob2xkU3RyaW5nLCBuZXdTdHJpbmcpIHtcbiAgICB2YXIgX29wdGlvbnMkdGltZW91dDtcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICB2YXIgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBkb25lKHZhbHVlKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FsbGJhY2sodW5kZWZpbmVkLCB2YWx1ZSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuXG5cbiAgICBvbGRTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChvbGRTdHJpbmcpO1xuICAgIG5ld1N0cmluZyA9IHRoaXMuY2FzdElucHV0KG5ld1N0cmluZyk7XG4gICAgb2xkU3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG9sZFN0cmluZykpO1xuICAgIG5ld1N0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShuZXdTdHJpbmcpKTtcbiAgICB2YXIgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICB2YXIgZWRpdExlbmd0aCA9IDE7XG4gICAgdmFyIG1heEVkaXRMZW5ndGggPSBuZXdMZW4gKyBvbGRMZW47XG5cbiAgICBpZiAob3B0aW9ucy5tYXhFZGl0TGVuZ3RoKSB7XG4gICAgICBtYXhFZGl0TGVuZ3RoID0gTWF0aC5taW4obWF4RWRpdExlbmd0aCwgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoKTtcbiAgICB9XG5cbiAgICB2YXIgbWF4RXhlY3V0aW9uVGltZSA9IChfb3B0aW9ucyR0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0KSAhPT0gbnVsbCAmJiBfb3B0aW9ucyR0aW1lb3V0ICE9PSB2b2lkIDAgPyBfb3B0aW9ucyR0aW1lb3V0IDogSW5maW5pdHk7XG4gICAgdmFyIGFib3J0QWZ0ZXJUaW1lc3RhbXAgPSBEYXRlLm5vdygpICsgbWF4RXhlY3V0aW9uVGltZTtcbiAgICB2YXIgYmVzdFBhdGggPSBbe1xuICAgICAgb2xkUG9zOiAtMSxcbiAgICAgIGxhc3RDb21wb25lbnQ6IHVuZGVmaW5lZFxuICAgIH1dOyAvLyBTZWVkIGVkaXRMZW5ndGggPSAwLCBpLmUuIHRoZSBjb250ZW50IHN0YXJ0cyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuXG4gICAgdmFyIG5ld1BvcyA9IHRoaXMuZXh0cmFjdENvbW1vbihiZXN0UGF0aFswXSwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIDApO1xuXG4gICAgaWYgKGJlc3RQYXRoWzBdLm9sZFBvcyArIDEgPj0gb2xkTGVuICYmIG5ld1BvcyArIDEgPj0gbmV3TGVuKSB7XG4gICAgICAvLyBJZGVudGl0eSBwZXIgdGhlIGVxdWFsaXR5IGFuZCB0b2tlbml6ZXJcbiAgICAgIHJldHVybiBkb25lKFt7XG4gICAgICAgIHZhbHVlOiB0aGlzLmpvaW4obmV3U3RyaW5nKSxcbiAgICAgICAgY291bnQ6IG5ld1N0cmluZy5sZW5ndGhcbiAgICAgIH1dKTtcbiAgICB9IC8vIE9uY2Ugd2UgaGl0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBlZGl0IGdyYXBoIG9uIHNvbWUgZGlhZ29uYWwgaywgd2UgY2FuXG4gICAgLy8gZGVmaW5pdGVseSByZWFjaCB0aGUgZW5kIG9mIHRoZSBlZGl0IGdyYXBoIGluIG5vIG1vcmUgdGhhbiBrIGVkaXRzLCBzb1xuICAgIC8vIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gY29uc2lkZXJpbmcgYW55IG1vdmVzIHRvIGRpYWdvbmFsIGsrMSBhbnkgbW9yZSAoZnJvbVxuICAgIC8vIHdoaWNoIHdlJ3JlIGd1YXJhbnRlZWQgdG8gbmVlZCBhdCBsZWFzdCBrKzEgbW9yZSBlZGl0cykuXG4gICAgLy8gU2ltaWxhcmx5LCBvbmNlIHdlJ3ZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgZWRpdCBncmFwaCwgdGhlcmUncyBub1xuICAgIC8vIHBvaW50IGNvbnNpZGVyaW5nIG1vdmVzIHRvIGxvd2VyIGRpYWdvbmFscy5cbiAgICAvLyBXZSByZWNvcmQgdGhpcyBmYWN0IGJ5IHNldHRpbmcgbWluRGlhZ29uYWxUb0NvbnNpZGVyIGFuZFxuICAgIC8vIG1heERpYWdvbmFsVG9Db25zaWRlciB0byBzb21lIGZpbml0ZSB2YWx1ZSBvbmNlIHdlJ3ZlIGhpdCB0aGUgZWRnZSBvZlxuICAgIC8vIHRoZSBlZGl0IGdyYXBoLlxuICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGlzIG5vdCBmYWl0aGZ1bCB0byB0aGUgb3JpZ2luYWwgYWxnb3JpdGhtIHByZXNlbnRlZCBpblxuICAgIC8vIE15ZXJzJ3MgcGFwZXIsIHdoaWNoIGluc3RlYWQgcG9pbnRsZXNzbHkgZXh0ZW5kcyBELXBhdGhzIG9mZiB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIGVkaXQgZ3JhcGggLSBzZWUgcGFnZSA3IG9mIE15ZXJzJ3MgcGFwZXIgd2hpY2ggbm90ZXMgdGhpcyBwb2ludFxuICAgIC8vIGV4cGxpY2l0bHkgYW5kIGlsbHVzdHJhdGVzIGl0IHdpdGggYSBkaWFncmFtLiBUaGlzIGhhcyBtYWpvciBwZXJmb3JtYW5jZVxuICAgIC8vIGltcGxpY2F0aW9ucyBmb3Igc29tZSBjb21tb24gc2NlbmFyaW9zLiBGb3IgaW5zdGFuY2UsIHRvIGNvbXB1dGUgYSBkaWZmXG4gICAgLy8gd2hlcmUgdGhlIG5ldyB0ZXh0IHNpbXBseSBhcHBlbmRzIGQgY2hhcmFjdGVycyBvbiB0aGUgZW5kIG9mIHRoZVxuICAgIC8vIG9yaWdpbmFsIHRleHQgb2YgbGVuZ3RoIG4sIHRoZSB0cnVlIE15ZXJzIGFsZ29yaXRobSB3aWxsIHRha2UgTyhuK2ReMilcbiAgICAvLyB0aW1lIHdoaWxlIHRoaXMgb3B0aW1pemF0aW9uIG5lZWRzIG9ubHkgTyhuK2QpIHRpbWUuXG5cblxuICAgIHZhciBtaW5EaWFnb25hbFRvQ29uc2lkZXIgPSAtSW5maW5pdHksXG4gICAgICAgIG1heERpYWdvbmFsVG9Db25zaWRlciA9IEluZmluaXR5OyAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG5cbiAgICBmdW5jdGlvbiBleGVjRWRpdExlbmd0aCgpIHtcbiAgICAgIGZvciAodmFyIGRpYWdvbmFsUGF0aCA9IE1hdGgubWF4KG1pbkRpYWdvbmFsVG9Db25zaWRlciwgLWVkaXRMZW5ndGgpOyBkaWFnb25hbFBhdGggPD0gTWF0aC5taW4obWF4RGlhZ29uYWxUb0NvbnNpZGVyLCBlZGl0TGVuZ3RoKTsgZGlhZ29uYWxQYXRoICs9IDIpIHtcbiAgICAgICAgdmFyIGJhc2VQYXRoID0gdm9pZCAwO1xuICAgICAgICB2YXIgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdLFxuICAgICAgICAgICAgYWRkUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCArIDFdO1xuXG4gICAgICAgIGlmIChyZW1vdmVQYXRoKSB7XG4gICAgICAgICAgLy8gTm8gb25lIGVsc2UgaXMgZ29pbmcgdG8gYXR0ZW1wdCB0byB1c2UgdGhpcyB2YWx1ZSwgY2xlYXIgaXRcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjYW5BZGQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgIC8vIHdoYXQgbmV3UG9zIHdpbGwgYmUgYWZ0ZXIgd2UgZG8gYW4gaW5zZXJ0aW9uOlxuICAgICAgICAgIHZhciBhZGRQYXRoTmV3UG9zID0gYWRkUGF0aC5vbGRQb3MgLSBkaWFnb25hbFBhdGg7XG4gICAgICAgICAgY2FuQWRkID0gYWRkUGF0aCAmJiAwIDw9IGFkZFBhdGhOZXdQb3MgJiYgYWRkUGF0aE5ld1BvcyA8IG5ld0xlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjYW5SZW1vdmUgPSByZW1vdmVQYXRoICYmIHJlbW92ZVBhdGgub2xkUG9zICsgMSA8IG9sZExlbjtcblxuICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBwYXRoIGlzIGEgdGVybWluYWwgdGhlbiBwcnVuZVxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gU2VsZWN0IHRoZSBkaWFnb25hbCB0aGF0IHdlIHdhbnQgdG8gYnJhbmNoIGZyb20uIFdlIHNlbGVjdCB0aGUgcHJpb3JcbiAgICAgICAgLy8gcGF0aCB3aG9zZSBwb3NpdGlvbiBpbiB0aGUgb2xkIHN0cmluZyBpcyB0aGUgZmFydGhlc3QgZnJvbSB0aGUgb3JpZ2luXG4gICAgICAgIC8vIGFuZCBkb2VzIG5vdCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGRpZmYgZ3JhcGhcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBgKyAxYCBoZXJlIHRvIG1ha2UgYmVoYXZpb3IgbWF0Y2ggTXllcnMgYWxnb3JpdGhtXG4gICAgICAgIC8vICAgICAgIGFuZCBwcmVmZXIgdG8gb3JkZXIgcmVtb3ZhbHMgYmVmb3JlIGluc2VydGlvbnMuXG5cblxuICAgICAgICBpZiAoIWNhblJlbW92ZSB8fCBjYW5BZGQgJiYgcmVtb3ZlUGF0aC5vbGRQb3MgKyAxIDwgYWRkUGF0aC5vbGRQb3MpIHtcbiAgICAgICAgICBiYXNlUGF0aCA9IHNlbGYuYWRkVG9QYXRoKGFkZFBhdGgsIHRydWUsIHVuZGVmaW5lZCwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFzZVBhdGggPSBzZWxmLmFkZFRvUGF0aChyZW1vdmVQYXRoLCB1bmRlZmluZWQsIHRydWUsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3UG9zID0gc2VsZi5leHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKTtcblxuICAgICAgICBpZiAoYmFzZVBhdGgub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgZW5kIG9mIGJvdGggc3RyaW5ncywgdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmxhc3RDb21wb25lbnQsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcblxuICAgICAgICAgIGlmIChiYXNlUGF0aC5vbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgICAgICAgbWF4RGlhZ29uYWxUb0NvbnNpZGVyID0gTWF0aC5taW4obWF4RGlhZ29uYWxUb0NvbnNpZGVyLCBkaWFnb25hbFBhdGggLSAxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgICAgICAgIG1pbkRpYWdvbmFsVG9Db25zaWRlciA9IE1hdGgubWF4KG1pbkRpYWdvbmFsVG9Db25zaWRlciwgZGlhZ29uYWxQYXRoICsgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVkaXRMZW5ndGgrKztcbiAgICB9IC8vIFBlcmZvcm1zIHRoZSBsZW5ndGggb2YgZWRpdCBpdGVyYXRpb24uIElzIGEgYml0IGZ1Z2x5IGFzIHRoaXMgaGFzIHRvIHN1cHBvcnQgdGhlXG4gICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgIC8vIGlzIHByb2R1Y2VkLCBvciB1bnRpbCB0aGUgZWRpdCBsZW5ndGggZXhjZWVkcyBvcHRpb25zLm1heEVkaXRMZW5ndGggKGlmIGdpdmVuKSxcbiAgICAvLyBpbiB3aGljaCBjYXNlIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cblxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAoZnVuY3Rpb24gZXhlYygpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGVkaXRMZW5ndGggPiBtYXhFZGl0TGVuZ3RoIHx8IERhdGUubm93KCkgPiBhYm9ydEFmdGVyVGltZXN0YW1wKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWV4ZWNFZGl0TGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIGV4ZWMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgfSkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKGVkaXRMZW5ndGggPD0gbWF4RWRpdExlbmd0aCAmJiBEYXRlLm5vdygpIDw9IGFib3J0QWZ0ZXJUaW1lc3RhbXApIHtcbiAgICAgICAgdmFyIHJldCA9IGV4ZWNFZGl0TGVuZ3RoKCk7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGFkZFRvUGF0aDogZnVuY3Rpb24gYWRkVG9QYXRoKHBhdGgsIGFkZGVkLCByZW1vdmVkLCBvbGRQb3NJbmMpIHtcbiAgICB2YXIgbGFzdCA9IHBhdGgubGFzdENvbXBvbmVudDtcblxuICAgIGlmIChsYXN0ICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2xkUG9zOiBwYXRoLm9sZFBvcyArIG9sZFBvc0luYyxcbiAgICAgICAgbGFzdENvbXBvbmVudDoge1xuICAgICAgICAgIGNvdW50OiBsYXN0LmNvdW50ICsgMSxcbiAgICAgICAgICBhZGRlZDogYWRkZWQsXG4gICAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZCxcbiAgICAgICAgICBwcmV2aW91c0NvbXBvbmVudDogbGFzdC5wcmV2aW91c0NvbXBvbmVudFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbGRQb3M6IHBhdGgub2xkUG9zICsgb2xkUG9zSW5jLFxuICAgICAgICBsYXN0Q29tcG9uZW50OiB7XG4gICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgYWRkZWQ6IGFkZGVkLFxuICAgICAgICAgIHJlbW92ZWQ6IHJlbW92ZWQsXG4gICAgICAgICAgcHJldmlvdXNDb21wb25lbnQ6IGxhc3RcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIGV4dHJhY3RDb21tb246IGZ1bmN0aW9uIGV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpIHtcbiAgICB2YXIgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkUG9zID0gYmFzZVBhdGgub2xkUG9zLFxuICAgICAgICBuZXdQb3MgPSBvbGRQb3MgLSBkaWFnb25hbFBhdGgsXG4gICAgICAgIGNvbW1vbkNvdW50ID0gMDtcblxuICAgIHdoaWxlIChuZXdQb3MgKyAxIDwgbmV3TGVuICYmIG9sZFBvcyArIDEgPCBvbGRMZW4gJiYgdGhpcy5lcXVhbHMobmV3U3RyaW5nW25ld1BvcyArIDFdLCBvbGRTdHJpbmdbb2xkUG9zICsgMV0pKSB7XG4gICAgICBuZXdQb3MrKztcbiAgICAgIG9sZFBvcysrO1xuICAgICAgY29tbW9uQ291bnQrKztcbiAgICB9XG5cbiAgICBpZiAoY29tbW9uQ291bnQpIHtcbiAgICAgIGJhc2VQYXRoLmxhc3RDb21wb25lbnQgPSB7XG4gICAgICAgIGNvdW50OiBjb21tb25Db3VudCxcbiAgICAgICAgcHJldmlvdXNDb21wb25lbnQ6IGJhc2VQYXRoLmxhc3RDb21wb25lbnRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgYmFzZVBhdGgub2xkUG9zID0gb2xkUG9zO1xuICAgIHJldHVybiBuZXdQb3M7XG4gIH0sXG4gIGVxdWFsczogZnVuY3Rpb24gZXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgdGhpcy5vcHRpb25zLmlnbm9yZUNhc2UgJiYgbGVmdC50b0xvd2VyQ2FzZSgpID09PSByaWdodC50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlRW1wdHk6IGZ1bmN0aW9uIHJlbW92ZUVtcHR5KGFycmF5KSB7XG4gICAgdmFyIHJldCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycmF5W2ldKSB7XG4gICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICBjYXN0SW5wdXQ6IGZ1bmN0aW9uIGNhc3RJbnB1dCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgdG9rZW5pemU6IGZ1bmN0aW9uIHRva2VuaXplKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKTtcbiAgfSxcbiAgam9pbjogZnVuY3Rpb24gam9pbihjaGFycykge1xuICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYnVpbGRWYWx1ZXMoZGlmZiwgbGFzdENvbXBvbmVudCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHVzZUxvbmdlc3RUb2tlbikge1xuICAvLyBGaXJzdCB3ZSBjb252ZXJ0IG91ciBsaW5rZWQgbGlzdCBvZiBjb21wb25lbnRzIGluIHJldmVyc2Ugb3JkZXIgdG8gYW5cbiAgLy8gYXJyYXkgaW4gdGhlIHJpZ2h0IG9yZGVyOlxuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICB2YXIgbmV4dENvbXBvbmVudDtcblxuICB3aGlsZSAobGFzdENvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudHMucHVzaChsYXN0Q29tcG9uZW50KTtcbiAgICBuZXh0Q29tcG9uZW50ID0gbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICBkZWxldGUgbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICBsYXN0Q29tcG9uZW50ID0gbmV4dENvbXBvbmVudDtcbiAgfVxuXG4gIGNvbXBvbmVudHMucmV2ZXJzZSgpO1xuICB2YXIgY29tcG9uZW50UG9zID0gMCxcbiAgICAgIGNvbXBvbmVudExlbiA9IGNvbXBvbmVudHMubGVuZ3RoLFxuICAgICAgbmV3UG9zID0gMCxcbiAgICAgIG9sZFBvcyA9IDA7XG5cbiAgZm9yICg7IGNvbXBvbmVudFBvcyA8IGNvbXBvbmVudExlbjsgY29tcG9uZW50UG9zKyspIHtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuXG4gICAgaWYgKCFjb21wb25lbnQucmVtb3ZlZCkge1xuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQgJiYgdXNlTG9uZ2VzdFRva2VuKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IG9sZFN0cmluZ1tvbGRQb3MgKyBpXTtcbiAgICAgICAgICByZXR1cm4gb2xkVmFsdWUubGVuZ3RoID4gdmFsdWUubGVuZ3RoID8gb2xkVmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4obmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICB9XG5cbiAgICAgIG5ld1BvcyArPSBjb21wb25lbnQuY291bnQ7IC8vIENvbW1vbiBjYXNlXG5cbiAgICAgIGlmICghY29tcG9uZW50LmFkZGVkKSB7XG4gICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihvbGRTdHJpbmcuc2xpY2Uob2xkUG9zLCBvbGRQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7IC8vIFJldmVyc2UgYWRkIGFuZCByZW1vdmUgc28gcmVtb3ZlcyBhcmUgb3V0cHV0IGZpcnN0IHRvIG1hdGNoIGNvbW1vbiBjb252ZW50aW9uXG4gICAgICAvLyBUaGUgZGlmZmluZyBhbGdvcml0aG0gaXMgdGllZCB0byBhZGQgdGhlbiByZW1vdmUgb3V0cHV0IGFuZCB0aGlzIGlzIHRoZSBzaW1wbGVzdFxuICAgICAgLy8gcm91dGUgdG8gZ2V0IHRoZSBkZXNpcmVkIG91dHB1dCB3aXRoIG1pbmltYWwgb3ZlcmhlYWQuXG5cbiAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuICAgICAgICB2YXIgdG1wID0gY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXSA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBTcGVjaWFsIGNhc2UgaGFuZGxlIGZvciB3aGVuIG9uZSB0ZXJtaW5hbCBpcyBpZ25vcmVkIChpLmUuIHdoaXRlc3BhY2UpLlxuICAvLyBGb3IgdGhpcyBjYXNlIHdlIG1lcmdlIHRoZSB0ZXJtaW5hbCBpbnRvIHRoZSBwcmlvciBzdHJpbmcgYW5kIGRyb3AgdGhlIGNoYW5nZS5cbiAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3RyaW5nIG1vZGUuXG5cblxuICB2YXIgZmluYWxDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDFdO1xuXG4gIGlmIChjb21wb25lbnRMZW4gPiAxICYmIHR5cGVvZiBmaW5hbENvbXBvbmVudC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgKGZpbmFsQ29tcG9uZW50LmFkZGVkIHx8IGZpbmFsQ29tcG9uZW50LnJlbW92ZWQpICYmIGRpZmYuZXF1YWxzKCcnLCBmaW5hbENvbXBvbmVudC52YWx1ZSkpIHtcbiAgICBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDJdLnZhbHVlICs9IGZpbmFsQ29tcG9uZW50LnZhbHVlO1xuICAgIGNvbXBvbmVudHMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50cztcbn1cblxudmFyIGNoYXJhY3RlckRpZmYgPSBuZXcgRGlmZigpO1xuZnVuY3Rpb24gZGlmZkNoYXJzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjaGFyYWN0ZXJEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU9wdGlvbnMob3B0aW9ucywgZGVmYXVsdHMpIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGVmYXVsdHMuY2FsbGJhY2sgPSBvcHRpb25zO1xuICB9IGVsc2UgaWYgKG9wdGlvbnMpIHtcbiAgICBmb3IgKHZhciBuYW1lIGluIG9wdGlvbnMpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBkZWZhdWx0c1tuYW1lXSA9IG9wdGlvbnNbbmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRzO1xufVxuXG4vL1xuLy8gUmFuZ2VzIGFuZCBleGNlcHRpb25zOlxuLy8gTGF0aW4tMSBTdXBwbGVtZW50LCAwMDgwXHUyMDEzMDBGRlxuLy8gIC0gVSswMEQ3ICBcdTAwRDcgTXVsdGlwbGljYXRpb24gc2lnblxuLy8gIC0gVSswMEY3ICBcdTAwRjcgRGl2aXNpb24gc2lnblxuLy8gTGF0aW4gRXh0ZW5kZWQtQSwgMDEwMFx1MjAxMzAxN0Zcbi8vIExhdGluIEV4dGVuZGVkLUIsIDAxODBcdTIwMTMwMjRGXG4vLyBJUEEgRXh0ZW5zaW9ucywgMDI1MFx1MjAxMzAyQUZcbi8vIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycywgMDJCMFx1MjAxMzAyRkZcbi8vICAtIFUrMDJDNyAgXHUwMkM3ICYjNzExOyAgQ2Fyb25cbi8vICAtIFUrMDJEOCAgXHUwMkQ4ICYjNzI4OyAgQnJldmVcbi8vICAtIFUrMDJEOSAgXHUwMkQ5ICYjNzI5OyAgRG90IEFib3ZlXG4vLyAgLSBVKzAyREEgIFx1MDJEQSAmIzczMDsgIFJpbmcgQWJvdmVcbi8vICAtIFUrMDJEQiAgXHUwMkRCICYjNzMxOyAgT2dvbmVrXG4vLyAgLSBVKzAyREMgIFx1MDJEQyAmIzczMjsgIFNtYWxsIFRpbGRlXG4vLyAgLSBVKzAyREQgIFx1MDJERCAmIzczMzsgIERvdWJsZSBBY3V0ZSBBY2NlbnRcbi8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwsIDFFMDBcdTIwMTMxRUZGXG5cbnZhciBleHRlbmRlZFdvcmRDaGFycyA9IC9eW0EtWmEtelxceEMwLVxcdTAyQzZcXHUwMkM4LVxcdTAyRDdcXHUwMkRFLVxcdTAyRkZcXHUxRTAwLVxcdTFFRkZdKyQvO1xudmFyIHJlV2hpdGVzcGFjZSA9IC9cXFMvO1xudmFyIHdvcmREaWZmID0gbmV3IERpZmYoKTtcblxud29yZERpZmYuZXF1YWxzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSkge1xuICAgIGxlZnQgPSBsZWZ0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmlnaHQgPSByaWdodC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IHRoaXMub3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlICYmICFyZVdoaXRlc3BhY2UudGVzdChsZWZ0KSAmJiAhcmVXaGl0ZXNwYWNlLnRlc3QocmlnaHQpO1xufTtcblxud29yZERpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgLy8gQWxsIHdoaXRlc3BhY2Ugc3ltYm9scyBleGNlcHQgbmV3bGluZSBncm91cCBpbnRvIG9uZSB0b2tlbiwgZWFjaCBuZXdsaW5lIC0gaW4gc2VwYXJhdGUgdG9rZW5cbiAgdmFyIHRva2VucyA9IHZhbHVlLnNwbGl0KC8oW15cXFNcXHJcXG5dK3xbKClbXFxde30nXCJcXHJcXG5dfFxcYikvKTsgLy8gSm9pbiB0aGUgYm91bmRhcnkgc3BsaXRzIHRoYXQgd2UgZG8gbm90IGNvbnNpZGVyIHRvIGJlIGJvdW5kYXJpZXMuIFRoaXMgaXMgcHJpbWFyaWx5IHRoZSBleHRlbmRlZCBMYXRpbiBjaGFyYWN0ZXIgc2V0LlxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBuZXh0IGZpZWxkIGFuZCB3ZSBoYXZlIG9ubHkgd29yZCBjaGFycyBiZWZvcmUgYW5kIGFmdGVyLCBtZXJnZVxuICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdICYmIGV4dGVuZGVkV29yZENoYXJzLnRlc3QodG9rZW5zW2ldKSAmJiBleHRlbmRlZFdvcmRDaGFycy50ZXN0KHRva2Vuc1tpICsgMl0pKSB7XG4gICAgICB0b2tlbnNbaV0gKz0gdG9rZW5zW2kgKyAyXTtcbiAgICAgIHRva2Vucy5zcGxpY2UoaSArIDEsIDIpO1xuICAgICAgaS0tO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59O1xuXG5mdW5jdGlvbiBkaWZmV29yZHMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucyhvcHRpb25zLCB7XG4gICAgaWdub3JlV2hpdGVzcGFjZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gZGlmZldvcmRzV2l0aFNwYWNlKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG4gIHJldHVybiB3b3JkRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cblxudmFyIGxpbmVEaWZmID0gbmV3IERpZmYoKTtcblxubGluZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5zdHJpcFRyYWlsaW5nQ3IpIHtcbiAgICAvLyByZW1vdmUgb25lIFxcciBiZWZvcmUgXFxuIHRvIG1hdGNoIEdOVSBkaWZmJ3MgLS1zdHJpcC10cmFpbGluZy1jciBiZWhhdmlvclxuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKTtcbiAgfVxuXG4gIHZhciByZXRMaW5lcyA9IFtdLFxuICAgICAgbGluZXNBbmROZXdsaW5lcyA9IHZhbHVlLnNwbGl0KC8oXFxufFxcclxcbikvKTsgLy8gSWdub3JlIHRoZSBmaW5hbCBlbXB0eSB0b2tlbiB0aGF0IG9jY3VycyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhIG5ldyBsaW5lXG5cbiAgaWYgKCFsaW5lc0FuZE5ld2xpbmVzW2xpbmVzQW5kTmV3bGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICBsaW5lc0FuZE5ld2xpbmVzLnBvcCgpO1xuICB9IC8vIE1lcmdlIHRoZSBjb250ZW50IGFuZCBsaW5lIHNlcGFyYXRvcnMgaW50byBzaW5nbGUgdG9rZW5zXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzQW5kTmV3bGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGluZSA9IGxpbmVzQW5kTmV3bGluZXNbaV07XG5cbiAgICBpZiAoaSAlIDIgJiYgIXRoaXMub3B0aW9ucy5uZXdsaW5lSXNUb2tlbikge1xuICAgICAgcmV0TGluZXNbcmV0TGluZXMubGVuZ3RoIC0gMV0gKz0gbGluZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlKSB7XG4gICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIH1cblxuICAgICAgcmV0TGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0TGluZXM7XG59O1xuXG5mdW5jdGlvbiBkaWZmTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiBkaWZmVHJpbW1lZExpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICB2YXIgb3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucyhjYWxsYmFjaywge1xuICAgIGlnbm9yZVdoaXRlc3BhY2U6IHRydWVcbiAgfSk7XG4gIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cblxudmFyIHNlbnRlbmNlRGlmZiA9IG5ldyBEaWZmKCk7XG5cbnNlbnRlbmNlRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhcXFMuKz9bLiE/XSkoPz1cXHMrfCQpLyk7XG59O1xuXG5mdW5jdGlvbiBkaWZmU2VudGVuY2VzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICByZXR1cm4gc2VudGVuY2VEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKTtcbn1cblxudmFyIGNzc0RpZmYgPSBuZXcgRGlmZigpO1xuXG5jc3NEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgvKFt7fTo7LF18XFxzKykvKTtcbn07XG5cbmZ1bmN0aW9uIGRpZmZDc3Mob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBjc3NEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICByZXR1cm4gYXJyMjtcbn1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxudmFyIG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBqc29uRGlmZiA9IG5ldyBEaWZmKCk7IC8vIERpc2NyaW1pbmF0ZSBiZXR3ZWVuIHR3byBsaW5lcyBvZiBwcmV0dHktcHJpbnRlZCwgc2VyaWFsaXplZCBKU09OIHdoZXJlIG9uZSBvZiB0aGVtIGhhcyBhXG4vLyBkYW5nbGluZyBjb21tYSBhbmQgdGhlIG90aGVyIGRvZXNuJ3QuIFR1cm5zIG91dCBpbmNsdWRpbmcgdGhlIGRhbmdsaW5nIGNvbW1hIHlpZWxkcyB0aGUgbmljZXN0IG91dHB1dDpcblxuanNvbkRpZmYudXNlTG9uZ2VzdFRva2VuID0gdHJ1ZTtcbmpzb25EaWZmLnRva2VuaXplID0gbGluZURpZmYudG9rZW5pemU7XG5cbmpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgX3RoaXMkb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgIHVuZGVmaW5lZFJlcGxhY2VtZW50ID0gX3RoaXMkb3B0aW9ucy51bmRlZmluZWRSZXBsYWNlbWVudCxcbiAgICAgIF90aGlzJG9wdGlvbnMkc3RyaW5naSA9IF90aGlzJG9wdGlvbnMuc3RyaW5naWZ5UmVwbGFjZXIsXG4gICAgICBzdHJpbmdpZnlSZXBsYWNlciA9IF90aGlzJG9wdGlvbnMkc3RyaW5naSA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKGssIHYpIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkUmVwbGFjZW1lbnQgOiB2O1xuICB9IDogX3RoaXMkb3B0aW9ucyRzdHJpbmdpO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplKHZhbHVlLCBudWxsLCBudWxsLCBzdHJpbmdpZnlSZXBsYWNlciksIHN0cmluZ2lmeVJlcGxhY2VyLCAnICAnKTtcbn07XG5cbmpzb25EaWZmLmVxdWFscyA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkge1xuICByZXR1cm4gRGlmZi5wcm90b3R5cGUuZXF1YWxzLmNhbGwoanNvbkRpZmYsIGxlZnQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIHJpZ2h0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpKTtcbn07XG5cbmZ1bmN0aW9uIGRpZmZKc29uKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKSB7XG4gIHJldHVybiBqc29uRGlmZi5kaWZmKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKTtcbn0gLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG4vLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlcGxhY2VyXG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShvYmosIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KSB7XG4gIHN0YWNrID0gc3RhY2sgfHwgW107XG4gIHJlcGxhY2VtZW50U3RhY2sgPSByZXBsYWNlbWVudFN0YWNrIHx8IFtdO1xuXG4gIGlmIChyZXBsYWNlcikge1xuICAgIG9iaiA9IHJlcGxhY2VyKGtleSwgb2JqKTtcbiAgfVxuXG4gIHZhciBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChzdGFja1tpXSA9PT0gb2JqKSB7XG4gICAgICByZXR1cm4gcmVwbGFjZW1lbnRTdGFja1tpXTtcbiAgICB9XG4gIH1cblxuICB2YXIgY2Fub25pY2FsaXplZE9iajtcblxuICBpZiAoJ1tvYmplY3QgQXJyYXldJyA9PT0gb2JqZWN0UHJvdG90eXBlVG9TdHJpbmcuY2FsbChvYmopKSB7XG4gICAgc3RhY2sucHVzaChvYmopO1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICAgIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xuICB9XG5cbiAgaWYgKG9iaiAmJiBvYmoudG9KU09OKSB7XG4gICAgb2JqID0gb2JqLnRvSlNPTigpO1xuICB9XG5cbiAgaWYgKF90eXBlb2Yob2JqKSA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XG4gICAgc3RhY2sucHVzaChvYmopO1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB7fTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG5cbiAgICB2YXIgc29ydGVkS2V5cyA9IFtdLFxuICAgICAgICBfa2V5O1xuXG4gICAgZm9yIChfa2V5IGluIG9iaikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoX2tleSkpIHtcbiAgICAgICAgc29ydGVkS2V5cy5wdXNoKF9rZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNvcnRlZEtleXMuc29ydCgpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvcnRlZEtleXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIF9rZXkgPSBzb3J0ZWRLZXlzW2ldO1xuICAgICAgY2Fub25pY2FsaXplZE9ialtfa2V5XSA9IGNhbm9uaWNhbGl6ZShvYmpbX2tleV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwgX2tleSk7XG4gICAgfVxuXG4gICAgc3RhY2sucG9wKCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBjYW5vbmljYWxpemVkT2JqID0gb2JqO1xuICB9XG5cbiAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG59XG5cbnZhciBhcnJheURpZmYgPSBuZXcgRGlmZigpO1xuXG5hcnJheURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG59O1xuXG5hcnJheURpZmYuam9pbiA9IGFycmF5RGlmZi5yZW1vdmVFbXB0eSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5mdW5jdGlvbiBkaWZmQXJyYXlzKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjaykge1xuICByZXR1cm4gYXJyYXlEaWZmLmRpZmYob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICB2YXIgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpOyAvLyBQYXJzZSBkaWZmIG1ldGFkYXRhXG5cbiAgICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgICB2YXIgbGluZSA9IGRpZmZzdHJbaV07IC8vIEZpbGUgaGVhZGVyIGZvdW5kLCBlbmQgcGFyc2luZyBkaWZmIG1ldGFkYXRhXG5cbiAgICAgIGlmICgvXihcXC1cXC1cXC18XFwrXFwrXFwrfEBAKVxccy8udGVzdChsaW5lKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gRGlmZiBpbmRleFxuXG5cbiAgICAgIHZhciBoZWFkZXIgPSAvXig/OkluZGV4OnxkaWZmKD86IC1yIFxcdyspKylcXHMrKC4rPylcXHMqJC8uZXhlYyhsaW5lKTtcblxuICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICBpbmRleC5pbmRleCA9IGhlYWRlclsxXTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH0gLy8gUGFyc2UgZmlsZSBoZWFkZXJzIGlmIHRoZXkgYXJlIGRlZmluZWQuIFVuaWZpZWQgZGlmZiByZXF1aXJlcyB0aGVtLCBidXRcbiAgICAvLyB0aGVyZSdzIG5vIHRlY2huaWNhbCBpc3N1ZXMgdG8gaGF2ZSBhbiBpc29sYXRlZCBodW5rIHdpdGhvdXQgZmlsZSBoZWFkZXJcblxuXG4gICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcbiAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpOyAvLyBQYXJzZSBodW5rc1xuXG4gICAgaW5kZXguaHVua3MgPSBbXTtcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIHZhciBfbGluZSA9IGRpZmZzdHJbaV07XG5cbiAgICAgIGlmICgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8udGVzdChfbGluZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKC9eQEAvLnRlc3QoX2xpbmUpKSB7XG4gICAgICAgIGluZGV4Lmh1bmtzLnB1c2gocGFyc2VIdW5rKCkpO1xuICAgICAgfSBlbHNlIGlmIChfbGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KF9saW5lKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFBhcnNlcyB0aGUgLS0tIGFuZCArKysgaGVhZGVycywgaWYgbm9uZSBhcmUgZm91bmQsIG5vIGxpbmVzXG4gIC8vIGFyZSBjb25zdW1lZC5cblxuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIHZhciBmaWxlSGVhZGVyID0gL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvLmV4ZWMoZGlmZnN0cltpXSk7XG5cbiAgICBpZiAoZmlsZUhlYWRlcikge1xuICAgICAgdmFyIGtleVByZWZpeCA9IGZpbGVIZWFkZXJbMV0gPT09ICctLS0nID8gJ29sZCcgOiAnbmV3JztcbiAgICAgIHZhciBkYXRhID0gZmlsZUhlYWRlclsyXS5zcGxpdCgnXFx0JywgMik7XG4gICAgICB2YXIgZmlsZU5hbWUgPSBkYXRhWzBdLnJlcGxhY2UoL1xcXFxcXFxcL2csICdcXFxcJyk7XG5cbiAgICAgIGlmICgvXlwiLipcIiQvLnRlc3QoZmlsZU5hbWUpKSB7XG4gICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyKDEsIGZpbGVOYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgfVxuXG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnRmlsZU5hbWUnXSA9IGZpbGVOYW1lO1xuICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0hlYWRlciddID0gKGRhdGFbMV0gfHwgJycpLnRyaW0oKTtcbiAgICAgIGkrKztcbiAgICB9XG4gIH0gLy8gUGFyc2VzIGEgaHVua1xuICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgaHVuay5cblxuXG4gIGZ1bmN0aW9uIHBhcnNlSHVuaygpIHtcbiAgICB2YXIgY2h1bmtIZWFkZXJJbmRleCA9IGksXG4gICAgICAgIGNodW5rSGVhZGVyTGluZSA9IGRpZmZzdHJbaSsrXSxcbiAgICAgICAgY2h1bmtIZWFkZXIgPSBjaHVua0hlYWRlckxpbmUuc3BsaXQoL0BAIC0oXFxkKykoPzosKFxcZCspKT8gXFwrKFxcZCspKD86LChcXGQrKSk/IEBALyk7XG4gICAgdmFyIGh1bmsgPSB7XG4gICAgICBvbGRTdGFydDogK2NodW5rSGVhZGVyWzFdLFxuICAgICAgb2xkTGluZXM6IHR5cGVvZiBjaHVua0hlYWRlclsyXSA9PT0gJ3VuZGVmaW5lZCcgPyAxIDogK2NodW5rSGVhZGVyWzJdLFxuICAgICAgbmV3U3RhcnQ6ICtjaHVua0hlYWRlclszXSxcbiAgICAgIG5ld0xpbmVzOiB0eXBlb2YgY2h1bmtIZWFkZXJbNF0gPT09ICd1bmRlZmluZWQnID8gMSA6ICtjaHVua0hlYWRlcls0XSxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGxpbmVkZWxpbWl0ZXJzOiBbXVxuICAgIH07IC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuXG4gICAgaWYgKGh1bmsub2xkTGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsub2xkU3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICBpZiAoaHVuay5uZXdMaW5lcyA9PT0gMCkge1xuICAgICAgaHVuay5uZXdTdGFydCArPSAxO1xuICAgIH1cblxuICAgIHZhciBhZGRDb3VudCA9IDAsXG4gICAgICAgIHJlbW92ZUNvdW50ID0gMDtcblxuICAgIGZvciAoOyBpIDwgZGlmZnN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gTGluZXMgc3RhcnRpbmcgd2l0aCAnLS0tJyBjb3VsZCBiZSBtaXN0YWtlbiBmb3IgdGhlIFwicmVtb3ZlIGxpbmVcIiBvcGVyYXRpb25cbiAgICAgIC8vIEJ1dCB0aGV5IGNvdWxkIGJlIHRoZSBoZWFkZXIgZm9yIHRoZSBuZXh0IGZpbGUuIFRoZXJlZm9yZSBwcnVuZSBzdWNoIGNhc2VzIG91dC5cbiAgICAgIGlmIChkaWZmc3RyW2ldLmluZGV4T2YoJy0tLSAnKSA9PT0gMCAmJiBpICsgMiA8IGRpZmZzdHIubGVuZ3RoICYmIGRpZmZzdHJbaSArIDFdLmluZGV4T2YoJysrKyAnKSA9PT0gMCAmJiBkaWZmc3RyW2kgKyAyXS5pbmRleE9mKCdAQCcpID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3BlcmF0aW9uID0gZGlmZnN0cltpXS5sZW5ndGggPT0gMCAmJiBpICE9IGRpZmZzdHIubGVuZ3RoIC0gMSA/ICcgJyA6IGRpZmZzdHJbaV1bMF07XG5cbiAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJyB8fCBvcGVyYXRpb24gPT09ICctJyB8fCBvcGVyYXRpb24gPT09ICcgJyB8fCBvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBodW5rLmxpbmVzLnB1c2goZGlmZnN0cltpXSk7XG4gICAgICAgIGh1bmsubGluZWRlbGltaXRlcnMucHVzaChkZWxpbWl0ZXJzW2ldIHx8ICdcXG4nKTtcblxuICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICBhZGRDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgICAgcmVtb3ZlQ291bnQrKztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICcgJykge1xuICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgICAgcmVtb3ZlQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBIYW5kbGUgdGhlIGVtcHR5IGJsb2NrIGNvdW50IGNhc2VcblxuXG4gICAgaWYgKCFhZGRDb3VudCAmJiBodW5rLm5ld0xpbmVzID09PSAxKSB7XG4gICAgICBodW5rLm5ld0xpbmVzID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIXJlbW92ZUNvdW50ICYmIGh1bmsub2xkTGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuICAgIH0gLy8gUGVyZm9ybSBvcHRpb25hbCBzYW5pdHkgY2hlY2tpbmdcblxuXG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGRlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1vdmVDb3VudCAhPT0gaHVuay5vbGRMaW5lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbW92ZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBodW5rO1xuICB9XG5cbiAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgIHBhcnNlSW5kZXgoKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0O1xufVxuXG4vLyBJdGVyYXRvciB0aGF0IHRyYXZlcnNlcyBpbiB0aGUgcmFuZ2Ugb2YgW21pbiwgbWF4XSwgc3RlcHBpbmdcbi8vIGJ5IGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdGFydCBwb3NpdGlvbi4gSS5lLiBmb3IgWzAsIDRdLCB3aXRoXG4vLyBzdGFydCBvZiAyLCB0aGlzIHdpbGwgaXRlcmF0ZSAyLCAzLCAxLCA0LCAwLlxuZnVuY3Rpb24gZGlzdGFuY2VJdGVyYXRvciAoc3RhcnQsIG1pbkxpbmUsIG1heExpbmUpIHtcbiAgdmFyIHdhbnRGb3J3YXJkID0gdHJ1ZSxcbiAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG4gICAgICBmb3J3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG4gICAgICBsb2NhbE9mZnNldCA9IDE7XG4gIHJldHVybiBmdW5jdGlvbiBpdGVyYXRvcigpIHtcbiAgICBpZiAod2FudEZvcndhcmQgJiYgIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgIGlmIChiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICBsb2NhbE9mZnNldCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FudEZvcndhcmQgPSBmYWxzZTtcbiAgICAgIH0gLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZXlvbmQgdGV4dCBsZW5ndGgsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG5cblxuICAgICAgaWYgKHN0YXJ0ICsgbG9jYWxPZmZzZXQgPD0gbWF4TGluZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGZvcndhcmRFeGhhdXN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghYmFja3dhcmRFeGhhdXN0ZWQpIHtcbiAgICAgIGlmICghZm9yd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICB3YW50Rm9yd2FyZCA9IHRydWU7XG4gICAgICB9IC8vIENoZWNrIGlmIHRyeWluZyB0byBmaXQgYmVmb3JlIHRleHQgYmVnaW5uaW5nLCBhbmQgaWYgbm90LCBjaGVjayBpdCBmaXRzXG4gICAgICAvLyBiZWZvcmUgb2Zmc2V0IGxvY2F0aW9uXG5cblxuICAgICAgaWYgKG1pbkxpbmUgPD0gc3RhcnQgLSBsb2NhbE9mZnNldCkge1xuICAgICAgICByZXR1cm4gLWxvY2FsT2Zmc2V0Kys7XG4gICAgICB9XG5cbiAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBpdGVyYXRvcigpO1xuICAgIH0gLy8gV2UgdHJpZWQgdG8gZml0IGh1bmsgYmVmb3JlIHRleHQgYmVnaW5uaW5nIGFuZCBiZXlvbmQgdGV4dCBsZW5ndGgsIHRoZW5cbiAgICAvLyBodW5rIGNhbid0IGZpdCBvbiB0aGUgdGV4dC4gUmV0dXJuIHVuZGVmaW5lZFxuXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICBpZiAodHlwZW9mIHVuaURpZmYgPT09ICdzdHJpbmcnKSB7XG4gICAgdW5pRGlmZiA9IHBhcnNlUGF0Y2godW5pRGlmZik7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh1bmlEaWZmKSkge1xuICAgIGlmICh1bmlEaWZmLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXBwbHlQYXRjaCBvbmx5IHdvcmtzIHdpdGggYSBzaW5nbGUgaW5wdXQuJyk7XG4gICAgfVxuXG4gICAgdW5pRGlmZiA9IHVuaURpZmZbMF07XG4gIH0gLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG5cblxuICB2YXIgbGluZXMgPSBzb3VyY2Uuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICBkZWxpbWl0ZXJzID0gc291cmNlLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcbiAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcbiAgICAgIGNvbXBhcmVMaW5lID0gb3B0aW9ucy5jb21wYXJlTGluZSB8fCBmdW5jdGlvbiAobGluZU51bWJlciwgbGluZSwgb3BlcmF0aW9uLCBwYXRjaENvbnRlbnQpIHtcbiAgICByZXR1cm4gbGluZSA9PT0gcGF0Y2hDb250ZW50O1xuICB9LFxuICAgICAgZXJyb3JDb3VudCA9IDAsXG4gICAgICBmdXp6RmFjdG9yID0gb3B0aW9ucy5mdXp6RmFjdG9yIHx8IDAsXG4gICAgICBtaW5MaW5lID0gMCxcbiAgICAgIG9mZnNldCA9IDAsXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBodW5rIGV4YWN0bHkgZml0cyBvbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cbiAgICovXG5cblxuICBmdW5jdGlvbiBodW5rRml0cyhodW5rLCB0b1Bvcykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmVbMF0gOiAnICcsXG4gICAgICAgICAgY29udGVudCA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIC8vIENvbnRleHQgc2FuaXR5IGNoZWNrXG4gICAgICAgIGlmICghY29tcGFyZUxpbmUodG9Qb3MgKyAxLCBsaW5lc1t0b1Bvc10sIG9wZXJhdGlvbiwgY29udGVudCkpIHtcbiAgICAgICAgICBlcnJvckNvdW50Kys7XG5cbiAgICAgICAgICBpZiAoZXJyb3JDb3VudCA+IGZ1enpGYWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIFNlYXJjaCBiZXN0IGZpdCBvZmZzZXRzIGZvciBlYWNoIGh1bmsgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9uZXNcblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaHVuayA9IGh1bmtzW2ldLFxuICAgICAgICBtYXhMaW5lID0gbGluZXMubGVuZ3RoIC0gaHVuay5vbGRMaW5lcyxcbiAgICAgICAgbG9jYWxPZmZzZXQgPSAwLFxuICAgICAgICB0b1BvcyA9IG9mZnNldCArIGh1bmsub2xkU3RhcnQgLSAxO1xuICAgIHZhciBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gU2V0IGxvd2VyIHRleHQgbGltaXQgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGh1bmssIHNvIG5leHQgb25lcyBkb24ndCB0cnlcbiAgICAvLyB0byBmaXQgb3ZlciBhbHJlYWR5IHBhdGNoZWQgdGV4dFxuXG5cbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfSAvLyBBcHBseSBwYXRjaCBodW5rc1xuXG5cbiAgdmFyIGRpZmZPZmZzZXQgPSAwO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBodW5rcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX2h1bmsgPSBodW5rc1tfaV0sXG4gICAgICAgIF90b1BvcyA9IF9odW5rLm9sZFN0YXJ0ICsgX2h1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG5cbiAgICBkaWZmT2Zmc2V0ICs9IF9odW5rLm5ld0xpbmVzIC0gX2h1bmsub2xkTGluZXM7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9odW5rLmxpbmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbGluZSA9IF9odW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmVbMF0gOiAnICcsXG4gICAgICAgICAgY29udGVudCA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSxcbiAgICAgICAgICBkZWxpbWl0ZXIgPSBfaHVuay5saW5lZGVsaW1pdGVycyAmJiBfaHVuay5saW5lZGVsaW1pdGVyc1tqXSB8fCAnXFxuJztcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIF90b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICBsaW5lcy5zcGxpY2UoX3RvUG9zLCAxKTtcbiAgICAgICAgZGVsaW1pdGVycy5zcGxpY2UoX3RvUG9zLCAxKTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgbGluZXMuc3BsaWNlKF90b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKF90b1BvcywgMCwgZGVsaW1pdGVyKTtcbiAgICAgICAgX3RvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIHZhciBwcmV2aW91c09wZXJhdGlvbiA9IF9odW5rLmxpbmVzW2ogLSAxXSA/IF9odW5rLmxpbmVzW2ogLSAxXVswXSA6IG51bGw7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBIYW5kbGUgRU9GTkwgaW5zZXJ0aW9uL3JlbW92YWxcblxuXG4gIGlmIChyZW1vdmVFT0ZOTCkge1xuICAgIHdoaWxlICghbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICAgIGxpbmVzLnBvcCgpO1xuICAgICAgZGVsaW1pdGVycy5wb3AoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYWRkRU9GTkwpIHtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBkZWxpbWl0ZXJzLnB1c2goJ1xcbicpO1xuICB9XG5cbiAgZm9yICh2YXIgX2sgPSAwOyBfayA8IGxpbmVzLmxlbmd0aCAtIDE7IF9rKyspIHtcbiAgICBsaW5lc1tfa10gPSBsaW5lc1tfa10gKyBkZWxpbWl0ZXJzW19rXTtcbiAgfVxuXG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn0gLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuXG5mdW5jdGlvbiBhcHBseVBhdGNoZXModW5pRGlmZiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHVuaURpZmYgPT09ICdzdHJpbmcnKSB7XG4gICAgdW5pRGlmZiA9IHBhcnNlUGF0Y2godW5pRGlmZik7XG4gIH1cblxuICB2YXIgY3VycmVudEluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgdmFyIGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG5cbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9wdGlvbnMubG9hZEZpbGUoaW5kZXgsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZShlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzc0luZGV4KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb2Nlc3NJbmRleCgpO1xufVxuXG5mdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0aW9ucy5jb250ZXh0ID0gNDtcbiAgfVxuXG4gIHZhciBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcblxuICBpZiAoIWRpZmYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaWZmLnB1c2goe1xuICAgIHZhbHVlOiAnJyxcbiAgICBsaW5lczogW11cbiAgfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgIHJldHVybiAnICcgKyBlbnRyeTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBodW5rcyA9IFtdO1xuICB2YXIgb2xkUmFuZ2VTdGFydCA9IDAsXG4gICAgICBuZXdSYW5nZVN0YXJ0ID0gMCxcbiAgICAgIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSxcbiAgICAgIG5ld0xpbmUgPSAxO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICB2YXIgY3VycmVudCA9IGRpZmZbaV0sXG4gICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgdmFyIF9jdXJSYW5nZTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICB2YXIgcHJldiA9IGRpZmZbaSAtIDFdO1xuICAgICAgICBvbGRSYW5nZVN0YXJ0ID0gb2xkTGluZTtcbiAgICAgICAgbmV3UmFuZ2VTdGFydCA9IG5ld0xpbmU7XG5cbiAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICBjdXJSYW5nZSA9IG9wdGlvbnMuY29udGV4dCA+IDAgPyBjb250ZXh0TGluZXMocHJldi5saW5lcy5zbGljZSgtb3B0aW9ucy5jb250ZXh0KSkgOiBbXTtcbiAgICAgICAgICBvbGRSYW5nZVN0YXJ0IC09IGN1clJhbmdlLmxlbmd0aDtcbiAgICAgICAgICBuZXdSYW5nZVN0YXJ0IC09IGN1clJhbmdlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBPdXRwdXQgb3VyIGNoYW5nZXNcblxuXG4gICAgICAoX2N1clJhbmdlID0gY3VyUmFuZ2UpLnB1c2guYXBwbHkoX2N1clJhbmdlLCBfdG9Db25zdW1hYmxlQXJyYXkobGluZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICByZXR1cm4gKGN1cnJlbnQuYWRkZWQgPyAnKycgOiAnLScpICsgZW50cnk7XG4gICAgICB9KSkpOyAvLyBUcmFjayB0aGUgdXBkYXRlZCBmaWxlIHBvc2l0aW9uXG5cblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICB2YXIgX2N1clJhbmdlMjtcblxuICAgICAgICAgIC8vIE92ZXJsYXBwaW5nXG4gICAgICAgICAgKF9jdXJSYW5nZTIgPSBjdXJSYW5nZSkucHVzaC5hcHBseShfY3VyUmFuZ2UyLCBfdG9Db25zdW1hYmxlQXJyYXkoY29udGV4dExpbmVzKGxpbmVzKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfY3VyUmFuZ2UzO1xuXG4gICAgICAgICAgLy8gZW5kIHRoZSByYW5nZSBhbmQgb3V0cHV0XG4gICAgICAgICAgdmFyIGNvbnRleHRTaXplID0gTWF0aC5taW4obGluZXMubGVuZ3RoLCBvcHRpb25zLmNvbnRleHQpO1xuXG4gICAgICAgICAgKF9jdXJSYW5nZTMgPSBjdXJSYW5nZSkucHVzaC5hcHBseShfY3VyUmFuZ2UzLCBfdG9Db25zdW1hYmxlQXJyYXkoY29udGV4dExpbmVzKGxpbmVzLnNsaWNlKDAsIGNvbnRleHRTaXplKSkpKTtcblxuICAgICAgICAgIHZhciBodW5rID0ge1xuICAgICAgICAgICAgb2xkU3RhcnQ6IG9sZFJhbmdlU3RhcnQsXG4gICAgICAgICAgICBvbGRMaW5lczogb2xkTGluZSAtIG9sZFJhbmdlU3RhcnQgKyBjb250ZXh0U2l6ZSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IG5ld0xpbmUgLSBuZXdSYW5nZVN0YXJ0ICsgY29udGV4dFNpemUsXG4gICAgICAgICAgICBsaW5lczogY3VyUmFuZ2VcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICB2YXIgb2xkRU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG9sZFN0cik7XG4gICAgICAgICAgICB2YXIgbmV3RU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG5ld1N0cik7XG4gICAgICAgICAgICB2YXIgbm9ObEJlZm9yZUFkZHMgPSBsaW5lcy5sZW5ndGggPT0gMCAmJiBjdXJSYW5nZS5sZW5ndGggPiBodW5rLm9sZExpbmVzO1xuXG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFvbGRFT0ZOZXdsaW5lICYmICFub05sQmVmb3JlQWRkcyB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBodW5rcy5wdXNoKGh1bmspO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICBuZXdMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmxlbmd0aDsgaSsrKSB7XG4gICAgX2xvb3AoaSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9sZEZpbGVOYW1lOiBvbGRGaWxlTmFtZSxcbiAgICBuZXdGaWxlTmFtZTogbmV3RmlsZU5hbWUsXG4gICAgb2xkSGVhZGVyOiBvbGRIZWFkZXIsXG4gICAgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5mdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRpZmYpKSB7XG4gICAgcmV0dXJuIGRpZmYubWFwKGZvcm1hdFBhdGNoKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHZhciByZXQgPSBbXTtcblxuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cblxuICByZXQucHVzaCgnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuICByZXQucHVzaCgnLS0tICcgKyBkaWZmLm9sZEZpbGVOYW1lICsgKHR5cGVvZiBkaWZmLm9sZEhlYWRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6ICdcXHQnICsgZGlmZi5vbGRIZWFkZXIpKTtcbiAgcmV0LnB1c2goJysrKyAnICsgZGlmZi5uZXdGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5uZXdIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYubmV3SGVhZGVyKSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGh1bmsgPSBkaWZmLmh1bmtzW2ldOyAvLyBVbmlmaWVkIERpZmYgRm9ybWF0IHF1aXJrOiBJZiB0aGUgY2h1bmsgc2l6ZSBpcyAwLFxuICAgIC8vIHRoZSBmaXJzdCBudW1iZXIgaXMgb25lIGxvd2VyIHRoYW4gb25lIHdvdWxkIGV4cGVjdC5cbiAgICAvLyBodHRwczovL3d3dy5hcnRpbWEuY29tL3dlYmxvZ3Mvdmlld3Bvc3QuanNwP3RocmVhZD0xNjQyOTNcblxuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuXG4gICAgaWYgKGh1bmsubmV3TGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsubmV3U3RhcnQgLT0gMTtcbiAgICB9XG5cbiAgICByZXQucHVzaCgnQEAgLScgKyBodW5rLm9sZFN0YXJ0ICsgJywnICsgaHVuay5vbGRMaW5lcyArICcgKycgKyBodW5rLm5ld1N0YXJ0ICsgJywnICsgaHVuay5uZXdMaW5lcyArICcgQEAnKTtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gZm9ybWF0UGF0Y2goc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gYXJyYXlFcXVhbChhLCBiKSB7XG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gYXJyYXlTdGFydHNXaXRoKGEsIGIpO1xufVxuZnVuY3Rpb24gYXJyYXlTdGFydHNXaXRoKGFycmF5LCBzdGFydCkge1xuICBpZiAoc3RhcnQubGVuZ3RoID4gYXJyYXkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdGFydFtpXSAhPT0gYXJyYXlbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2FsY0xpbmVDb3VudChodW5rKSB7XG4gIHZhciBfY2FsY09sZE5ld0xpbmVDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQoaHVuay5saW5lcyksXG4gICAgICBvbGRMaW5lcyA9IF9jYWxjT2xkTmV3TGluZUNvdW50Lm9sZExpbmVzLFxuICAgICAgbmV3TGluZXMgPSBfY2FsY09sZE5ld0xpbmVDb3VudC5uZXdMaW5lcztcblxuICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGh1bmsub2xkTGluZXMgPSBvbGRMaW5lcztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaHVuay5uZXdMaW5lcyA9IG5ld0xpbmVzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBodW5rLm5ld0xpbmVzO1xuICB9XG59XG5mdW5jdGlvbiBtZXJnZShtaW5lLCB0aGVpcnMsIGJhc2UpIHtcbiAgbWluZSA9IGxvYWRQYXRjaChtaW5lLCBiYXNlKTtcbiAgdGhlaXJzID0gbG9hZFBhdGNoKHRoZWlycywgYmFzZSk7XG4gIHZhciByZXQgPSB7fTsgLy8gRm9yIGluZGV4IHdlIGp1c3QgbGV0IGl0IHBhc3MgdGhyb3VnaCBhcyBpdCBkb2Vzbid0IGhhdmUgYW55IG5lY2Vzc2FyeSBtZWFuaW5nLlxuICAvLyBMZWF2aW5nIHNhbml0eSBjaGVja3Mgb24gdGhpcyB0byB0aGUgQVBJIGNvbnN1bWVyIHRoYXQgbWF5IGtub3cgbW9yZSBhYm91dCB0aGVcbiAgLy8gbWVhbmluZyBpbiB0aGVpciBvd24gY29udGV4dC5cblxuICBpZiAobWluZS5pbmRleCB8fCB0aGVpcnMuaW5kZXgpIHtcbiAgICByZXQuaW5kZXggPSBtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleDtcbiAgfVxuXG4gIGlmIChtaW5lLm5ld0ZpbGVOYW1lIHx8IHRoZWlycy5uZXdGaWxlTmFtZSkge1xuICAgIGlmICghZmlsZU5hbWVDaGFuZ2VkKG1pbmUpKSB7XG4gICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIG91cnMsIHVzZSB0aGVpcnMgKGFuZCBvdXJzIGlmIHRoZWlycyBkb2VzIG5vdCBleGlzdClcbiAgICAgIHJldC5vbGRGaWxlTmFtZSA9IHRoZWlycy5vbGRGaWxlTmFtZSB8fCBtaW5lLm9sZEZpbGVOYW1lO1xuICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gdGhlaXJzLm5ld0ZpbGVOYW1lIHx8IG1pbmUubmV3RmlsZU5hbWU7XG4gICAgICByZXQub2xkSGVhZGVyID0gdGhlaXJzLm9sZEhlYWRlciB8fCBtaW5lLm9sZEhlYWRlcjtcbiAgICAgIHJldC5uZXdIZWFkZXIgPSB0aGVpcnMubmV3SGVhZGVyIHx8IG1pbmUubmV3SGVhZGVyO1xuICAgIH0gZWxzZSBpZiAoIWZpbGVOYW1lQ2hhbmdlZCh0aGVpcnMpKSB7XG4gICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIHRoZWlycywgdXNlIG91cnNcbiAgICAgIHJldC5vbGRGaWxlTmFtZSA9IG1pbmUub2xkRmlsZU5hbWU7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSBtaW5lLm5ld0ZpbGVOYW1lO1xuICAgICAgcmV0Lm9sZEhlYWRlciA9IG1pbmUub2xkSGVhZGVyO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IG1pbmUubmV3SGVhZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb3RoIGNoYW5nZWQuLi4gZmlndXJlIGl0IG91dFxuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEZpbGVOYW1lLCB0aGVpcnMub2xkRmlsZU5hbWUpO1xuICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0ZpbGVOYW1lLCB0aGVpcnMubmV3RmlsZU5hbWUpO1xuICAgICAgcmV0Lm9sZEhlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5vbGRIZWFkZXIsIHRoZWlycy5vbGRIZWFkZXIpO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5uZXdIZWFkZXIsIHRoZWlycy5uZXdIZWFkZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldC5odW5rcyA9IFtdO1xuICB2YXIgbWluZUluZGV4ID0gMCxcbiAgICAgIHRoZWlyc0luZGV4ID0gMCxcbiAgICAgIG1pbmVPZmZzZXQgPSAwLFxuICAgICAgdGhlaXJzT2Zmc2V0ID0gMDtcblxuICB3aGlsZSAobWluZUluZGV4IDwgbWluZS5odW5rcy5sZW5ndGggfHwgdGhlaXJzSW5kZXggPCB0aGVpcnMuaHVua3MubGVuZ3RoKSB7XG4gICAgdmFyIG1pbmVDdXJyZW50ID0gbWluZS5odW5rc1ttaW5lSW5kZXhdIHx8IHtcbiAgICAgIG9sZFN0YXJ0OiBJbmZpbml0eVxuICAgIH0sXG4gICAgICAgIHRoZWlyc0N1cnJlbnQgPSB0aGVpcnMuaHVua3NbdGhlaXJzSW5kZXhdIHx8IHtcbiAgICAgIG9sZFN0YXJ0OiBJbmZpbml0eVxuICAgIH07XG5cbiAgICBpZiAoaHVua0JlZm9yZShtaW5lQ3VycmVudCwgdGhlaXJzQ3VycmVudCkpIHtcbiAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG4gICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsobWluZUN1cnJlbnQsIG1pbmVPZmZzZXQpKTtcbiAgICAgIG1pbmVJbmRleCsrO1xuICAgICAgdGhlaXJzT2Zmc2V0ICs9IG1pbmVDdXJyZW50Lm5ld0xpbmVzIC0gbWluZUN1cnJlbnQub2xkTGluZXM7XG4gICAgfSBlbHNlIGlmIChodW5rQmVmb3JlKHRoZWlyc0N1cnJlbnQsIG1pbmVDdXJyZW50KSkge1xuICAgICAgLy8gVGhpcyBwYXRjaCBkb2VzIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBvdGhlcnMsIHlheS5cbiAgICAgIHJldC5odW5rcy5wdXNoKGNsb25lSHVuayh0aGVpcnNDdXJyZW50LCB0aGVpcnNPZmZzZXQpKTtcbiAgICAgIHRoZWlyc0luZGV4Kys7XG4gICAgICBtaW5lT2Zmc2V0ICs9IHRoZWlyc0N1cnJlbnQubmV3TGluZXMgLSB0aGVpcnNDdXJyZW50Lm9sZExpbmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdmVybGFwLCBtZXJnZSBhcyBiZXN0IHdlIGNhblxuICAgICAgdmFyIG1lcmdlZEh1bmsgPSB7XG4gICAgICAgIG9sZFN0YXJ0OiBNYXRoLm1pbihtaW5lQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCksXG4gICAgICAgIG9sZExpbmVzOiAwLFxuICAgICAgICBuZXdTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQubmV3U3RhcnQgKyBtaW5lT2Zmc2V0LCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0ICsgdGhlaXJzT2Zmc2V0KSxcbiAgICAgICAgbmV3TGluZXM6IDAsXG4gICAgICAgIGxpbmVzOiBbXVxuICAgICAgfTtcbiAgICAgIG1lcmdlTGluZXMobWVyZ2VkSHVuaywgbWluZUN1cnJlbnQub2xkU3RhcnQsIG1pbmVDdXJyZW50LmxpbmVzLCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0LCB0aGVpcnNDdXJyZW50LmxpbmVzKTtcbiAgICAgIHRoZWlyc0luZGV4Kys7XG4gICAgICBtaW5lSW5kZXgrKztcbiAgICAgIHJldC5odW5rcy5wdXNoKG1lcmdlZEh1bmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGxvYWRQYXRjaChwYXJhbSwgYmFzZSkge1xuICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgIGlmICgvXkBAL20udGVzdChwYXJhbSkgfHwgL15JbmRleDovbS50ZXN0KHBhcmFtKSkge1xuICAgICAgcmV0dXJuIHBhcnNlUGF0Y2gocGFyYW0pWzBdO1xuICAgIH1cblxuICAgIGlmICghYmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYSBiYXNlIHJlZmVyZW5jZSBvciBwYXNzIGluIGEgcGF0Y2gnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RydWN0dXJlZFBhdGNoKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBiYXNlLCBwYXJhbSk7XG4gIH1cblxuICByZXR1cm4gcGFyYW07XG59XG5cbmZ1bmN0aW9uIGZpbGVOYW1lQ2hhbmdlZChwYXRjaCkge1xuICByZXR1cm4gcGF0Y2gubmV3RmlsZU5hbWUgJiYgcGF0Y2gubmV3RmlsZU5hbWUgIT09IHBhdGNoLm9sZEZpbGVOYW1lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RGaWVsZChpbmRleCwgbWluZSwgdGhlaXJzKSB7XG4gIGlmIChtaW5lID09PSB0aGVpcnMpIHtcbiAgICByZXR1cm4gbWluZTtcbiAgfSBlbHNlIHtcbiAgICBpbmRleC5jb25mbGljdCA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbmU6IG1pbmUsXG4gICAgICB0aGVpcnM6IHRoZWlyc1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaHVua0JlZm9yZSh0ZXN0LCBjaGVjaykge1xuICByZXR1cm4gdGVzdC5vbGRTdGFydCA8IGNoZWNrLm9sZFN0YXJ0ICYmIHRlc3Qub2xkU3RhcnQgKyB0ZXN0Lm9sZExpbmVzIDwgY2hlY2sub2xkU3RhcnQ7XG59XG5cbmZ1bmN0aW9uIGNsb25lSHVuayhodW5rLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBvbGRTdGFydDogaHVuay5vbGRTdGFydCxcbiAgICBvbGRMaW5lczogaHVuay5vbGRMaW5lcyxcbiAgICBuZXdTdGFydDogaHVuay5uZXdTdGFydCArIG9mZnNldCxcbiAgICBuZXdMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICBsaW5lczogaHVuay5saW5lc1xuICB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZUxpbmVzKGh1bmssIG1pbmVPZmZzZXQsIG1pbmVMaW5lcywgdGhlaXJPZmZzZXQsIHRoZWlyTGluZXMpIHtcbiAgLy8gVGhpcyB3aWxsIGdlbmVyYWxseSByZXN1bHQgaW4gYSBjb25mbGljdGVkIGh1bmssIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIGNvbnRleHRcbiAgLy8gaXMgdGhlIG9ubHkgb3ZlcmxhcCB3aGVyZSB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IG1lcmdlIHRoZSBjb250ZW50IGhlcmUuXG4gIHZhciBtaW5lID0ge1xuICAgIG9mZnNldDogbWluZU9mZnNldCxcbiAgICBsaW5lczogbWluZUxpbmVzLFxuICAgIGluZGV4OiAwXG4gIH0sXG4gICAgICB0aGVpciA9IHtcbiAgICBvZmZzZXQ6IHRoZWlyT2Zmc2V0LFxuICAgIGxpbmVzOiB0aGVpckxpbmVzLFxuICAgIGluZGV4OiAwXG4gIH07IC8vIEhhbmRsZSBhbnkgbGVhZGluZyBjb250ZW50XG5cbiAgaW5zZXJ0TGVhZGluZyhodW5rLCBtaW5lLCB0aGVpcik7XG4gIGluc2VydExlYWRpbmcoaHVuaywgdGhlaXIsIG1pbmUpOyAvLyBOb3cgaW4gdGhlIG92ZXJsYXAgY29udGVudC4gU2NhbiB0aHJvdWdoIGFuZCBzZWxlY3QgdGhlIGJlc3QgY2hhbmdlcyBmcm9tIGVhY2guXG5cbiAgd2hpbGUgKG1pbmUuaW5kZXggPCBtaW5lLmxpbmVzLmxlbmd0aCAmJiB0aGVpci5pbmRleCA8IHRoZWlyLmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBtaW5lQ3VycmVudCA9IG1pbmUubGluZXNbbWluZS5pbmRleF0sXG4gICAgICAgIHRoZWlyQ3VycmVudCA9IHRoZWlyLmxpbmVzW3RoZWlyLmluZGV4XTtcblxuICAgIGlmICgobWluZUN1cnJlbnRbMF0gPT09ICctJyB8fCBtaW5lQ3VycmVudFswXSA9PT0gJysnKSAmJiAodGhlaXJDdXJyZW50WzBdID09PSAnLScgfHwgdGhlaXJDdXJyZW50WzBdID09PSAnKycpKSB7XG4gICAgICAvLyBCb3RoIG1vZGlmaWVkIC4uLlxuICAgICAgbXV0dWFsQ2hhbmdlKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50WzBdID09PSAnKycgJiYgdGhlaXJDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIHZhciBfaHVuayRsaW5lcztcblxuICAgICAgLy8gTWluZSBpbnNlcnRlZFxuICAgICAgKF9odW5rJGxpbmVzID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lcywgX3RvQ29uc3VtYWJsZUFycmF5KGNvbGxlY3RDaGFuZ2UobWluZSkpKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJysnICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIHZhciBfaHVuayRsaW5lczI7XG5cbiAgICAgIC8vIFRoZWlycyBpbnNlcnRlZFxuICAgICAgKF9odW5rJGxpbmVzMiA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXMyLCBfdG9Db25zdW1hYmxlQXJyYXkoY29sbGVjdENoYW5nZSh0aGVpcikpKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50WzBdID09PSAnLScgJiYgdGhlaXJDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIE1pbmUgcmVtb3ZlZCBvciBlZGl0ZWRcbiAgICAgIHJlbW92YWwoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgIH0gZWxzZSBpZiAodGhlaXJDdXJyZW50WzBdID09PSAnLScgJiYgbWluZUN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgLy8gVGhlaXIgcmVtb3ZlZCBvciBlZGl0ZWRcbiAgICAgIHJlbW92YWwoaHVuaywgdGhlaXIsIG1pbmUsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnQgPT09IHRoZWlyQ3VycmVudCkge1xuICAgICAgLy8gQ29udGV4dCBpZGVudGl0eVxuICAgICAgaHVuay5saW5lcy5wdXNoKG1pbmVDdXJyZW50KTtcbiAgICAgIG1pbmUuaW5kZXgrKztcbiAgICAgIHRoZWlyLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRleHQgbWlzbWF0Y2hcbiAgICAgIGNvbmZsaWN0KGh1bmssIGNvbGxlY3RDaGFuZ2UobWluZSksIGNvbGxlY3RDaGFuZ2UodGhlaXIpKTtcbiAgICB9XG4gIH0gLy8gTm93IHB1c2ggYW55dGhpbmcgdGhhdCBtYXkgYmUgcmVtYWluaW5nXG5cblxuICBpbnNlcnRUcmFpbGluZyhodW5rLCBtaW5lKTtcbiAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgdGhlaXIpO1xuICBjYWxjTGluZUNvdW50KGh1bmspO1xufVxuXG5mdW5jdGlvbiBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgdmFyIG15Q2hhbmdlcyA9IGNvbGxlY3RDaGFuZ2UobWluZSksXG4gICAgICB0aGVpckNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKHRoZWlyKTtcblxuICBpZiAoYWxsUmVtb3ZlcyhteUNoYW5nZXMpICYmIGFsbFJlbW92ZXModGhlaXJDaGFuZ2VzKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgcmVtb3ZlIGNoYW5nZXMgdGhhdCBhcmUgc3VwZXJzZXRzIG9mIG9uZSBhbm90aGVyXG4gICAgaWYgKGFycmF5U3RhcnRzV2l0aChteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcykgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KHRoZWlyLCBteUNoYW5nZXMsIG15Q2hhbmdlcy5sZW5ndGggLSB0aGVpckNoYW5nZXMubGVuZ3RoKSkge1xuICAgICAgdmFyIF9odW5rJGxpbmVzMztcblxuICAgICAgKF9odW5rJGxpbmVzMyA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXMzLCBfdG9Db25zdW1hYmxlQXJyYXkobXlDaGFuZ2VzKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGFycmF5U3RhcnRzV2l0aCh0aGVpckNoYW5nZXMsIG15Q2hhbmdlcykgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KG1pbmUsIHRoZWlyQ2hhbmdlcywgdGhlaXJDaGFuZ2VzLmxlbmd0aCAtIG15Q2hhbmdlcy5sZW5ndGgpKSB7XG4gICAgICB2YXIgX2h1bmskbGluZXM0O1xuXG4gICAgICAoX2h1bmskbGluZXM0ID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lczQsIF90b0NvbnN1bWFibGVBcnJheSh0aGVpckNoYW5nZXMpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhcnJheUVxdWFsKG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKSkge1xuICAgIHZhciBfaHVuayRsaW5lczU7XG5cbiAgICAoX2h1bmskbGluZXM1ID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lczUsIF90b0NvbnN1bWFibGVBcnJheShteUNoYW5nZXMpKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbmZsaWN0KGh1bmssIG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZhbChodW5rLCBtaW5lLCB0aGVpciwgc3dhcCkge1xuICB2YXIgbXlDaGFuZ2VzID0gY29sbGVjdENoYW5nZShtaW5lKSxcbiAgICAgIHRoZWlyQ2hhbmdlcyA9IGNvbGxlY3RDb250ZXh0KHRoZWlyLCBteUNoYW5nZXMpO1xuXG4gIGlmICh0aGVpckNoYW5nZXMubWVyZ2VkKSB7XG4gICAgdmFyIF9odW5rJGxpbmVzNjtcblxuICAgIChfaHVuayRsaW5lczYgPSBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KF9odW5rJGxpbmVzNiwgX3RvQ29uc3VtYWJsZUFycmF5KHRoZWlyQ2hhbmdlcy5tZXJnZWQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25mbGljdChodW5rLCBzd2FwID8gdGhlaXJDaGFuZ2VzIDogbXlDaGFuZ2VzLCBzd2FwID8gbXlDaGFuZ2VzIDogdGhlaXJDaGFuZ2VzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25mbGljdChodW5rLCBtaW5lLCB0aGVpcikge1xuICBodW5rLmNvbmZsaWN0ID0gdHJ1ZTtcbiAgaHVuay5saW5lcy5wdXNoKHtcbiAgICBjb25mbGljdDogdHJ1ZSxcbiAgICBtaW5lOiBtaW5lLFxuICAgIHRoZWlyczogdGhlaXJcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydExlYWRpbmcoaHVuaywgaW5zZXJ0LCB0aGVpcikge1xuICB3aGlsZSAoaW5zZXJ0Lm9mZnNldCA8IHRoZWlyLm9mZnNldCAmJiBpbnNlcnQuaW5kZXggPCBpbnNlcnQubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIGxpbmUgPSBpbnNlcnQubGluZXNbaW5zZXJ0LmluZGV4KytdO1xuICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcbiAgICBpbnNlcnQub2Zmc2V0Kys7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0VHJhaWxpbmcoaHVuaywgaW5zZXJ0KSB7XG4gIHdoaWxlIChpbnNlcnQuaW5kZXggPCBpbnNlcnQubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIGxpbmUgPSBpbnNlcnQubGluZXNbaW5zZXJ0LmluZGV4KytdO1xuICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0Q2hhbmdlKHN0YXRlKSB7XG4gIHZhciByZXQgPSBbXSxcbiAgICAgIG9wZXJhdGlvbiA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XVswXTtcblxuICB3aGlsZSAoc3RhdGUuaW5kZXggPCBzdGF0ZS5saW5lcy5sZW5ndGgpIHtcbiAgICB2YXIgbGluZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XTsgLy8gR3JvdXAgYWRkaXRpb25zIHRoYXQgYXJlIGltbWVkaWF0ZWx5IGFmdGVyIHN1YnRyYWN0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyBvbmUgXCJhdG9taWNcIiBtb2RpZnkgY2hhbmdlLlxuXG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gJy0nICYmIGxpbmVbMF0gPT09ICcrJykge1xuICAgICAgb3BlcmF0aW9uID0gJysnO1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRpb24gPT09IGxpbmVbMF0pIHtcbiAgICAgIHJldC5wdXNoKGxpbmUpO1xuICAgICAgc3RhdGUuaW5kZXgrKztcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gY29sbGVjdENvbnRleHQoc3RhdGUsIG1hdGNoQ2hhbmdlcykge1xuICB2YXIgY2hhbmdlcyA9IFtdLFxuICAgICAgbWVyZ2VkID0gW10sXG4gICAgICBtYXRjaEluZGV4ID0gMCxcbiAgICAgIGNvbnRleHRDaGFuZ2VzID0gZmFsc2UsXG4gICAgICBjb25mbGljdGVkID0gZmFsc2U7XG5cbiAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoICYmIHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIGNoYW5nZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XSxcbiAgICAgICAgbWF0Y2ggPSBtYXRjaENoYW5nZXNbbWF0Y2hJbmRleF07IC8vIE9uY2Ugd2UndmUgaGl0IG91ciBhZGQsIHRoZW4gd2UgYXJlIGRvbmVcblxuICAgIGlmIChtYXRjaFswXSA9PT0gJysnKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb250ZXh0Q2hhbmdlcyA9IGNvbnRleHRDaGFuZ2VzIHx8IGNoYW5nZVswXSAhPT0gJyAnO1xuICAgIG1lcmdlZC5wdXNoKG1hdGNoKTtcbiAgICBtYXRjaEluZGV4Kys7IC8vIENvbnN1bWUgYW55IGFkZGl0aW9ucyBpbiB0aGUgb3RoZXIgYmxvY2sgYXMgYSBjb25mbGljdCB0byBhdHRlbXB0XG4gICAgLy8gdG8gcHVsbCBpbiB0aGUgcmVtYWluaW5nIGNvbnRleHQgYWZ0ZXIgdGhpc1xuXG4gICAgaWYgKGNoYW5nZVswXSA9PT0gJysnKSB7XG4gICAgICBjb25mbGljdGVkID0gdHJ1ZTtcblxuICAgICAgd2hpbGUgKGNoYW5nZVswXSA9PT0gJysnKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaChjaGFuZ2UpO1xuICAgICAgICBjaGFuZ2UgPSBzdGF0ZS5saW5lc1srK3N0YXRlLmluZGV4XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWF0Y2guc3Vic3RyKDEpID09PSBjaGFuZ2Uuc3Vic3RyKDEpKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgIHN0YXRlLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICgobWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdIHx8ICcnKVswXSA9PT0gJysnICYmIGNvbnRleHRDaGFuZ2VzKSB7XG4gICAgY29uZmxpY3RlZCA9IHRydWU7XG4gIH1cblxuICBpZiAoY29uZmxpY3RlZCkge1xuICAgIHJldHVybiBjaGFuZ2VzO1xuICB9XG5cbiAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoKSB7XG4gICAgbWVyZ2VkLnB1c2gobWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXgrK10pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXJnZWQ6IG1lcmdlZCxcbiAgICBjaGFuZ2VzOiBjaGFuZ2VzXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFsbFJlbW92ZXMoY2hhbmdlcykge1xuICByZXR1cm4gY2hhbmdlcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGNoYW5nZSkge1xuICAgIHJldHVybiBwcmV2ICYmIGNoYW5nZVswXSA9PT0gJy0nO1xuICB9LCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gc2tpcFJlbW92ZVN1cGVyc2V0KHN0YXRlLCByZW1vdmVDaGFuZ2VzLCBkZWx0YSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHtcbiAgICB2YXIgY2hhbmdlQ29udGVudCA9IHJlbW92ZUNoYW5nZXNbcmVtb3ZlQ2hhbmdlcy5sZW5ndGggLSBkZWx0YSArIGldLnN1YnN0cigxKTtcblxuICAgIGlmIChzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleCArIGldICE9PSAnICcgKyBjaGFuZ2VDb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUuaW5kZXggKz0gZGVsdGE7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmVzKSB7XG4gIHZhciBvbGRMaW5lcyA9IDA7XG4gIHZhciBuZXdMaW5lcyA9IDA7XG4gIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICBpZiAodHlwZW9mIGxpbmUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgbXlDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS5taW5lKTtcbiAgICAgIHZhciB0aGVpckNvdW50ID0gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lLnRoZWlycyk7XG5cbiAgICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChteUNvdW50Lm9sZExpbmVzID09PSB0aGVpckNvdW50Lm9sZExpbmVzKSB7XG4gICAgICAgICAgb2xkTGluZXMgKz0gbXlDb3VudC5vbGRMaW5lcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbGRMaW5lcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobXlDb3VudC5uZXdMaW5lcyA9PT0gdGhlaXJDb3VudC5uZXdMaW5lcykge1xuICAgICAgICAgIG5ld0xpbmVzICs9IG15Q291bnQubmV3TGluZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGluZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQgJiYgKGxpbmVbMF0gPT09ICcrJyB8fCBsaW5lWzBdID09PSAnICcpKSB7XG4gICAgICAgIG5ld0xpbmVzKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnLScgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuICAgICAgICBvbGRMaW5lcysrO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7XG4gICAgb2xkTGluZXM6IG9sZExpbmVzLFxuICAgIG5ld0xpbmVzOiBuZXdMaW5lc1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXZlcnNlUGF0Y2goc3RydWN0dXJlZFBhdGNoKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0cnVjdHVyZWRQYXRjaCkpIHtcbiAgICByZXR1cm4gc3RydWN0dXJlZFBhdGNoLm1hcChyZXZlcnNlUGF0Y2gpLnJldmVyc2UoKTtcbiAgfVxuXG4gIHJldHVybiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgc3RydWN0dXJlZFBhdGNoKSwge30sIHtcbiAgICBvbGRGaWxlTmFtZTogc3RydWN0dXJlZFBhdGNoLm5ld0ZpbGVOYW1lLFxuICAgIG9sZEhlYWRlcjogc3RydWN0dXJlZFBhdGNoLm5ld0hlYWRlcixcbiAgICBuZXdGaWxlTmFtZTogc3RydWN0dXJlZFBhdGNoLm9sZEZpbGVOYW1lLFxuICAgIG5ld0hlYWRlcjogc3RydWN0dXJlZFBhdGNoLm9sZEhlYWRlcixcbiAgICBodW5rczogc3RydWN0dXJlZFBhdGNoLmh1bmtzLm1hcChmdW5jdGlvbiAoaHVuaykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2xkTGluZXM6IGh1bmsubmV3TGluZXMsXG4gICAgICAgIG9sZFN0YXJ0OiBodW5rLm5ld1N0YXJ0LFxuICAgICAgICBuZXdMaW5lczogaHVuay5vbGRMaW5lcyxcbiAgICAgICAgbmV3U3RhcnQ6IGh1bmsub2xkU3RhcnQsXG4gICAgICAgIGxpbmVkZWxpbWl0ZXJzOiBodW5rLmxpbmVkZWxpbWl0ZXJzLFxuICAgICAgICBsaW5lczogaHVuay5saW5lcy5tYXAoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgICBpZiAobC5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgICAgIHJldHVybiBcIitcIi5jb25jYXQobC5zbGljZSgxKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGwuc3RhcnRzV2l0aCgnKycpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCItXCIuY29uY2F0KGwuc2xpY2UoMSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBsO1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9KVxuICB9KTtcbn1cblxuLy8gU2VlOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLWRpZmYtbWF0Y2gtcGF0Y2gvd2lraS9BUElcbmZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9ETVAoY2hhbmdlcykge1xuICB2YXIgcmV0ID0gW10sXG4gICAgICBjaGFuZ2UsXG4gICAgICBvcGVyYXRpb247XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhbmdlID0gY2hhbmdlc1tpXTtcblxuICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgIG9wZXJhdGlvbiA9IDE7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgb3BlcmF0aW9uID0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wZXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goW29wZXJhdGlvbiwgY2hhbmdlLnZhbHVlXSk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvWE1MKGNoYW5nZXMpIHtcbiAgdmFyIHJldCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuXG4gICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgcmV0LnB1c2goJzxpbnM+Jyk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgcmV0LnB1c2goJzxkZWw+Jyk7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goZXNjYXBlSFRNTChjaGFuZ2UudmFsdWUpKTtcblxuICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8L2lucz4nKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICByZXQucHVzaCgnPC9kZWw+Jyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlSFRNTChzKSB7XG4gIHZhciBuID0gcztcbiAgbiA9IG4ucmVwbGFjZSgvJi9nLCAnJmFtcDsnKTtcbiAgbiA9IG4ucmVwbGFjZSgvPC9nLCAnJmx0OycpO1xuICBuID0gbi5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gIG4gPSBuLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbiAgcmV0dXJuIG47XG59XG5cbmV4cG9ydCB7IERpZmYsIGFwcGx5UGF0Y2gsIGFwcGx5UGF0Y2hlcywgY2Fub25pY2FsaXplLCBjb252ZXJ0Q2hhbmdlc1RvRE1QLCBjb252ZXJ0Q2hhbmdlc1RvWE1MLCBjcmVhdGVQYXRjaCwgY3JlYXRlVHdvRmlsZXNQYXRjaCwgZGlmZkFycmF5cywgZGlmZkNoYXJzLCBkaWZmQ3NzLCBkaWZmSnNvbiwgZGlmZkxpbmVzLCBkaWZmU2VudGVuY2VzLCBkaWZmVHJpbW1lZExpbmVzLCBkaWZmV29yZHMsIGRpZmZXb3Jkc1dpdGhTcGFjZSwgZm9ybWF0UGF0Y2gsIG1lcmdlLCBwYXJzZVBhdGNoLCByZXZlcnNlUGF0Y2gsIHN0cnVjdHVyZWRQYXRjaCB9O1xuIiwgImltcG9ydCB7IFN1Z2dlc3RNb2RhbCB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbmFsR2VuZXJhbE1vZGFsQ29uZmlnIHtcbiAgICBvcHRpb25zPzogc3RyaW5nW107XG4gICAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgYWxsb3dFbXB0eT86IGJvb2xlYW47XG4gICAgb25seVNlbGVjdGlvbj86IGJvb2xlYW47XG4gICAgaW5pdGlhbFZhbHVlPzogc3RyaW5nO1xufVxuaW50ZXJmYWNlIEdlbmVyYWxNb2RhbENvbmZpZyB7XG4gICAgb3B0aW9uczogc3RyaW5nW107XG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICBhbGxvd0VtcHR5OiBib29sZWFuO1xuICAgIG9ubHlTZWxlY3Rpb246IGJvb2xlYW47XG4gICAgaW5pdGlhbFZhbHVlPzogc3RyaW5nO1xufVxuXG5jb25zdCBnZW5lcmFsTW9kYWxDb25maWdEZWZhdWx0czogR2VuZXJhbE1vZGFsQ29uZmlnID0ge1xuICAgIG9wdGlvbnM6IFtdLFxuICAgIHBsYWNlaG9sZGVyOiBcIlwiLFxuICAgIGFsbG93RW1wdHk6IGZhbHNlLFxuICAgIG9ubHlTZWxlY3Rpb246IGZhbHNlLFxuICAgIGluaXRpYWxWYWx1ZTogdW5kZWZpbmVkLFxufTtcblxuZXhwb3J0IGNsYXNzIEdlbmVyYWxNb2RhbCBleHRlbmRzIFN1Z2dlc3RNb2RhbDxzdHJpbmc+IHtcbiAgICByZXNvbHZlOiAoXG4gICAgICAgIHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBQcm9taXNlTGlrZTxzdHJpbmcgfCB1bmRlZmluZWQ+XG4gICAgKSA9PiB2b2lkO1xuICAgIGNvbmZpZzogR2VuZXJhbE1vZGFsQ29uZmlnO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBPcHRpb25hbEdlbmVyYWxNb2RhbENvbmZpZykge1xuICAgICAgICBzdXBlcihhcHApO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uZ2VuZXJhbE1vZGFsQ29uZmlnRGVmYXVsdHMsIC4uLmNvbmZpZyB9O1xuICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKHRoaXMuY29uZmlnLnBsYWNlaG9sZGVyKTtcbiAgICB9XG5cbiAgICBvcGVuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHN1cGVyLm9wZW4oKTtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcuaW5pdGlhbFZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dEVsLnZhbHVlID0gdGhpcy5jb25maWcuaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5pbnB1dEVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZWxlY3RTdWdnZXN0aW9uKHZhbHVlOiBzdHJpbmcsIGV2dDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZSkge1xuICAgICAgICAgICAgbGV0IHJlcztcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd0VtcHR5ICYmIHZhbHVlID09PSBcIiBcIikgcmVzID0gXCJcIjtcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSBcIi4uLlwiKSByZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbHNlIHJlcyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuc2VsZWN0U3VnZ2VzdGlvbih2YWx1ZSwgZXZ0KTtcbiAgICB9XG5cbiAgICBvbkNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5yZXNvbHZlKSB0aGlzLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBnZXRTdWdnZXN0aW9ucyhxdWVyeTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgICBpZiAodGhpcy5jb25maWcub25seVNlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLm9wdGlvbnM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcuYWxsb3dFbXB0eSkge1xuICAgICAgICAgICAgcmV0dXJuIFtxdWVyeS5sZW5ndGggPiAwID8gcXVlcnkgOiBcIiBcIiwgLi4udGhpcy5jb25maWcub3B0aW9uc107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3F1ZXJ5Lmxlbmd0aCA+IDAgPyBxdWVyeSA6IFwiLi4uXCIsIC4uLnRoaXMuY29uZmlnLm9wdGlvbnNdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyU3VnZ2VzdGlvbih2YWx1ZTogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgZWwuc2V0VGV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgb25DaG9vc2VTdWdnZXN0aW9uKGl0ZW06IHN0cmluZywgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCkge31cbn1cbiIsICJpbXBvcnQgeyBEYXRhQWRhcHRlciwgbm9ybWFsaXplUGF0aCwgVEZpbGUsIFZhdWx0IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgT2JzaWRpYW5HaXQgZnJvbSBcIi4uL21haW5cIjtcblxuZXhwb3J0IGNsYXNzIE15QWRhcHRlciB7XG4gICAgcHJvbWlzZXM6IGFueSA9IHt9O1xuICAgIGFkYXB0ZXI6IERhdGFBZGFwdGVyO1xuICAgIHZhdWx0OiBWYXVsdDtcbiAgICBpbmRleDogYW55O1xuICAgIGluZGV4Y3RpbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBpbmRleG10aW1lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGFzdEJhc2VQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgdmF1bHQ6IFZhdWx0LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogT2JzaWRpYW5HaXRcbiAgICApIHtcbiAgICAgICAgdGhpcy5hZGFwdGVyID0gdmF1bHQuYWRhcHRlcjtcbiAgICAgICAgdGhpcy52YXVsdCA9IHZhdWx0O1xuICAgICAgICB0aGlzLmxhc3RCYXNlUGF0aCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLmJhc2VQYXRoO1xuXG4gICAgICAgIHRoaXMucHJvbWlzZXMucmVhZEZpbGUgPSB0aGlzLnJlYWRGaWxlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZXMud3JpdGVGaWxlID0gdGhpcy53cml0ZUZpbGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9taXNlcy5yZWFkZGlyID0gdGhpcy5yZWFkZGlyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZXMubWtkaXIgPSB0aGlzLm1rZGlyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZXMucm1kaXIgPSB0aGlzLnJtZGlyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZXMuc3RhdCA9IHRoaXMuc3RhdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnByb21pc2VzLnVubGluayA9IHRoaXMudW5saW5rLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZXMubHN0YXQgPSB0aGlzLmxzdGF0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZXMucmVhZGxpbmsgPSB0aGlzLnJlYWRsaW5rLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZXMuc3ltbGluayA9IHRoaXMuc3ltbGluay5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBhc3luYyByZWFkRmlsZShwYXRoOiBzdHJpbmcsIG9wdHM6IGFueSkge1xuICAgICAgICB0aGlzLm1heWJlTG9nKFwiUmVhZDogXCIgKyBwYXRoICsgSlNPTi5zdHJpbmdpZnkob3B0cykpO1xuICAgICAgICBpZiAob3B0cyA9PSBcInV0ZjhcIiB8fCBvcHRzLmVuY29kaW5nID09IFwidXRmOFwiKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gdGhpcy52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgocGF0aCk7XG4gICAgICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXliZUxvZyhcIlJldXNlXCIpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmF1bHQucmVhZChmaWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZWFkKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgodGhpcy5naXREaXIgKyBcIi9pbmRleFwiKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5iYXNlUGF0aCAhPSB0aGlzLmxhc3RCYXNlUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW5kZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0QmFzZVBhdGggPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5iYXNlUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZWFkQmluYXJ5KHBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA/PyB0aGlzLmFkYXB0ZXIucmVhZEJpbmFyeShwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoKTtcbiAgICAgICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1heWJlTG9nKFwiUmV1c2VcIik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YXVsdC5yZWFkQmluYXJ5KGZpbGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJlYWRCaW5hcnkocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgd3JpdGVGaWxlKHBhdGg6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgICAgIHRoaXMubWF5YmVMb2coXCJXcml0ZTogXCIgKyBwYXRoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoKTtcbiAgICAgICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YXVsdC5tb2RpZnkoZmlsZSwgZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIud3JpdGUocGF0aCwgZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCh0aGlzLmdpdERpciArIFwiL2luZGV4XCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleG10aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmFkYXB0ZXIud3JpdGVCaW5hcnkocGF0aCwgZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhdWx0Lm1vZGlmeUJpbmFyeShmaWxlLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLndyaXRlQmluYXJ5KHBhdGgsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZWFkZGlyKHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAocGF0aCA9PT0gXCIuXCIpIHBhdGggPSBcIi9cIjtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmxpc3QocGF0aCk7XG4gICAgICAgIGNvbnN0IGFsbCA9IFsuLi5yZXMuZmlsZXMsIC4uLnJlcy5mb2xkZXJzXTtcbiAgICAgICAgbGV0IGZvcm1hdHRlZEFsbDtcbiAgICAgICAgaWYgKHBhdGggIT09IFwiL1wiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRBbGwgPSBhbGwubWFwKChlKSA9PlxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZVBhdGgoZS5zdWJzdHJpbmcocGF0aC5sZW5ndGgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZEFsbCA9IGFsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkQWxsO1xuICAgIH1cbiAgICBhc3luYyBta2RpcihwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5ta2RpcihwYXRoKTtcbiAgICB9XG4gICAgYXN5bmMgcm1kaXIocGF0aDogc3RyaW5nLCBvcHRzOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5ybWRpcihwYXRoLCBvcHRzPy5vcHRpb25zPy5yZWN1cnNpdmUgPz8gZmFsc2UpO1xuICAgIH1cbiAgICBhc3luYyBzdGF0KHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCh0aGlzLmdpdERpciArIFwiL2luZGV4XCIpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleGN0aW1lICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhtdGltZSAhPSB1bmRlZmluZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzRmlsZTogKCkgPT4gdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3Rvcnk6ICgpID0+IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc1N5bWJvbGljTGluazogKCkgPT4gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IHRoaXMuaW5kZXgubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgY3RpbWVNczogdGhpcy5pbmRleGN0aW1lLFxuICAgICAgICAgICAgICAgICAgICBtdGltZU1zOiB0aGlzLmluZGV4bXRpbWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdGF0KHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyB7IGNvZGU6IFwiRU5PRU5UXCIgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleGN0aW1lID0gc3RhdC5jdGltZTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4bXRpbWUgPSBzdGF0Lm10aW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGN0aW1lTXM6IHN0YXQuY3RpbWUsXG4gICAgICAgICAgICAgICAgICAgIG10aW1lTXM6IHN0YXQubXRpbWUsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IHN0YXQuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgICAgICAgICAgICAgIGlzRmlsZTogKCkgPT4gdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3Rvcnk6ICgpID0+IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc1N5bWJvbGljTGluazogKCkgPT4gZmFsc2UsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aCA9PT0gXCIuXCIpIHBhdGggPSBcIi9cIjtcbiAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHBhdGgpO1xuICAgICAgICB0aGlzLm1heWJlTG9nKFwiU3RhdDogXCIgKyBwYXRoKTtcbiAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgdGhpcy5tYXliZUxvZyhcIlJldXNlIHN0YXRcIik7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGN0aW1lTXM6IGZpbGUuc3RhdC5jdGltZSxcbiAgICAgICAgICAgICAgICBtdGltZU1zOiBmaWxlLnN0YXQubXRpbWUsXG4gICAgICAgICAgICAgICAgc2l6ZTogZmlsZS5zdGF0LnNpemUsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgICAgICAgICAgaXNGaWxlOiAoKSA9PiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5OiAoKSA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1N5bWJvbGljTGluazogKCkgPT4gZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdGF0KHBhdGgpO1xuICAgICAgICAgICAgaWYgKHN0YXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjdGltZU1zOiBzdGF0LmN0aW1lLFxuICAgICAgICAgICAgICAgICAgICBtdGltZU1zOiBzdGF0Lm10aW1lLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBzdGF0LnNpemUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHN0YXQudHlwZSA9PT0gXCJmb2xkZXJcIiA/IFwiZGlyZWN0b3J5XCIgOiBzdGF0LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGlzRmlsZTogKCkgPT4gc3RhdC50eXBlID09PSBcImZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3Rvcnk6ICgpID0+IHN0YXQudHlwZSA9PT0gXCJmb2xkZXJcIixcbiAgICAgICAgICAgICAgICAgICAgaXNTeW1ib2xpY0xpbms6ICgpID0+IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWxlIGV4aXN0cyBvciBub3RcbiAgICAgICAgICAgICAgICB0aHJvdyB7IGNvZGU6IFwiRU5PRU5UXCIgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyB1bmxpbmsocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmVtb3ZlKHBhdGgpO1xuICAgIH1cbiAgICBhc3luYyBsc3RhdChwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdChwYXRoKTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZGxpbmsocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVhZGxpbmsgb2YgKCR7cGF0aH0pIGlzIG5vdCBpbXBsZW1lbnRlZC5gKTtcbiAgICB9XG4gICAgYXN5bmMgc3ltbGluayhwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzeW1saW5rIG9mICgke3BhdGh9KSBpcyBub3QgaW1wbGVtZW50ZWQuYCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZUFuZENsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIud3JpdGVCaW5hcnkoXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZ2l0TWFuYWdlci5nZXRSZWxhdGl2ZVZhdWx0UGF0aChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5naXREaXIgKyBcIi9pbmRleFwiXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY3RpbWU6IHRoaXMuaW5kZXhjdGltZSxcbiAgICAgICAgICAgICAgICAgICAgbXRpbWU6IHRoaXMuaW5kZXhtdGltZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYXJJbmRleCgpO1xuICAgIH1cblxuICAgIGNsZWFySW5kZXgoKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaW5kZXhjdGltZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pbmRleG10aW1lID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGdpdERpcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW4uc2V0dGluZ3MuZ2l0RGlyIHx8IFwiLmdpdFwiO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWF5YmVMb2codGV4dDogc3RyaW5nKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRleHQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBSYW5nZVNldCB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHsgR3V0dGVyTWFya2VyIH0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcbmltcG9ydCB7IGxhdGVzdFNldHRpbmdzIH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL21vZGVsXCI7XG5pbXBvcnQgeyBMaW5lQXV0aG9yaW5nR3V0dGVyIH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL3ZpZXcvZ3V0dGVyL2d1dHRlclwiO1xuaW1wb3J0IHsgbWVkaWFuIH0gZnJvbSBcInNyYy91dGlsc1wiO1xuXG4vKlxuVklFVy1DQUNIRVxuVGhpcyBmaWxlIGNvbnRhaW5zIHRlbXBvcmFyaWx5IGNhY2hlZCBpbmZvcm1hdGlvbiB1c2VkIGluIHRoZSB2aWV3LlxuVGhleSBtYWtlIGl0IGFsc28gcG9zc2libGUgdG8gaGF2ZSB1bmludHJ1c2l2ZSBhbmQgc29mdCBVSSB1cGRhdGVzLCB3aGVuXG50aGUgZ2l0IGxpbmUgYXV0aG9yIGluZm9ybWF0aW9uIGFwcGVhcnMgZGVsYXllZC5cblRoZSBjYWNoZXMgaGVyZSBhcmUgZXZpY3RlZCB3aGVuZXZlciB0aGUgbGluZSBhdXRob3IgZmVhdHVyZSBpcyBkaXNhYmxlZC9yZWZyZXNoZWQuXG4qL1xuXG4vKipcbiAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgc2V0dGluZ3MgYXJlIGNoYW5nZWQuXG4gKlxuICogQ3VycmVudGx5LCB0aGUgZW50aXJlIGZlYXR1cmUgaXMgcmUtbG9hZGVkLCB3aGljaCBpcyB3aHkgaXQgc3VmZmljZXMgdGhpcyB0byBiZSBjYWxsZWRcbiAqIGluIHRoZSBkaXNhYmxlciBpbiBgbGluZUF1dGhvckludGVncmF0aW9uLnRzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyVmlld0NhY2hlKCkge1xuICAgIGxvbmdlc3RSZW5kZXJlZEd1dHRlciA9IHVuZGVmaW5lZDtcblxuICAgIHJlbmRlcmVkQWdlSW5EYXlzRm9yQWRhcHRpdmVJbml0aWFsQ29sb3JpbmcgPSBbXTtcbiAgICBhZ2VJZHggPSAwO1xuXG4gICAgZ3V0dGVySW5zdGFuY2VzLmNsZWFyKCk7XG4gICAgZ3V0dGVyTWFya2Vyc1JhbmdlU2V0LmNsZWFyKCk7XG5cbiAgICBhdHRhY2hlZEd1dHRlckVsZW1lbnRzLmNsZWFyKCk7XG59XG5cbi8qKlxuICogQSBjYWNoZSBjb250YWluaW5nIHRoZSBsYXN0IG1heGltYWxseS1zaXplZCBlbmNvdW50ZXJlZCBndXR0ZXIgdG9nZXRoZXIgd2l0aCBpdHMgbGVuZ3RoIGFuZCB0ZXh0LlxuICpcbiAqIFdoZW5ldmVyIGEgbG9uZ2VyIGd1dHRlciBpcyBlbmNvdW50ZXJlZCwgaXQgaXMgc2F2ZWQgdmlhIHtAbGluayBjb25kaXRpb25hbGx5VXBkYXRlTG9uZ2VzdFJlbmRlcmVkR3V0dGVyfS5cbiAqL1xudHlwZSBMb25nZXN0R3V0dGVyQ2FjaGUgPSB7XG4gICAgZ3V0dGVyOiBMaW5lQXV0aG9yaW5nR3V0dGVyO1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIHRleHQ6IHN0cmluZztcbn07XG5sZXQgbG9uZ2VzdFJlbmRlcmVkR3V0dGVyOiBMb25nZXN0R3V0dGVyQ2FjaGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBnZXRMb25nZXN0UmVuZGVyZWRHdXR0ZXIgPSAoKSA9PiBsb25nZXN0UmVuZGVyZWRHdXR0ZXI7XG5cbi8qKlxuICogR2l2ZW4gYSBuZXdseSByZW5kZXJlZCBndXR0ZXIsIHVwZGF0ZSB0aGUge0BsaW5rIGxvbmdlc3RSZW5kZXJlZEd1dHRlcn0gYnkgY29tcGFyaW5nIHRoZVxuICogdGV4dCBsZW5ndGhzLlxuICpcbiAqIElmIGJpZ2dlciwgdGhlbiB1cGRhdGUgdGhlIGdsb2JhbCB2YXJpYWJsZSBhbmQgcGVyc2lzdCB0aGUgc2V0dGluZ3MgdmlhIHtAbGluayBsYXRlc3RTZXR0aW5ncy5zYXZlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxseVVwZGF0ZUxvbmdlc3RSZW5kZXJlZEd1dHRlcihcbiAgICBndXR0ZXI6IExpbmVBdXRob3JpbmdHdXR0ZXIsXG4gICAgdGV4dDogc3RyaW5nXG4pIHtcbiAgICBjb25zdCBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPCAobG9uZ2VzdFJlbmRlcmVkR3V0dGVyPy5sZW5ndGggPz8gMCkpIHJldHVybjtcblxuICAgIGxvbmdlc3RSZW5kZXJlZEd1dHRlciA9IHsgZ3V0dGVyLCBsZW5ndGgsIHRleHQgfTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gbGF0ZXN0U2V0dGluZ3MuZ2V0KCk7XG4gICAgaWYgKGxlbmd0aCAhPT0gc2V0dGluZ3MuZ3V0dGVyU3BhY2luZ0ZhbGxiYWNrTGVuZ3RoKSB7XG4gICAgICAgIHNldHRpbmdzLmd1dHRlclNwYWNpbmdGYWxsYmFja0xlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgbGF0ZXN0U2V0dGluZ3Muc2F2ZShzZXR0aW5ncyk7XG4gICAgfVxufVxuXG4vKipcbiAqIFdoZW4gYSBuZXcgZmlsZSBpcyBvcGVuZWQsIHdlIG5lZWQgdG8gYWxyZWFkeSByZW5kZXIgdGhlIGxpbmUgZ3V0dGVyIGV2ZW4gYmVmb3JlIHdlXG4gKiBrbm93IHRoZSB0cnVlIGdpdCBsaW5lIGF1dGhvcmluZyAtIGFuZCB0aGVpciB0cnVlIGNvbG9ycy5cbiAqXG4gKiBTaW1wbHkgcmVuZGVyaW5nIHRoZW0gd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBpbml0aWFsbHkgaXMgbm90IGdvb2QsIGFzIHRoZVxuICogVUkgdXBkYXRlLCB3aGVuIHRoZSByZXN1bHQgaXMgYXZhaWxhYmxlLCBpcyBkaXN0cmFjdGluZyBhbmQgZmxpY2tlcmluZy5cbiAqXG4gKiBIZW5jZSwgd2UgYWRhcHQgdGhlIGluaXRpYWwgY29sb3Igc2hvd24gd2hlbiBvcGVuaW5nIGFuZCBzd2l0Y2hpbmcgcGFuZXMuXG4gKlxuICogVGhlIGluaXRpYWwgY29sb3IgaXMgY29tcHV0ZWQgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIG9mIGFnZXMgb2YgZWFjaCBsaW5lIGNvbW1pdFxuICogKGluIGRheXMpLiBDdXJyZW50bHksIHdlIHVzZSB7QGxpbmsgQURBUFRJVkVfSU5JVElBTF9DT0xPUklOR19BR0VfQ0FDSEVfU0laRX1gPTUwYFxuICogZWxlbWVudHMgYW5kIHRoZSBgbWVkaWFuYCB0byBjb21wdXRlIHRoZSBjb2xvci5cbiAqL1xubGV0IHJlbmRlcmVkQWdlSW5EYXlzRm9yQWRhcHRpdmVJbml0aWFsQ29sb3Jpbmc6IG51bWJlcltdID0gW107XG5cbmNvbnN0IEFEQVBUSVZFX0lOSVRJQUxfQ09MT1JJTkdfQUdFX0NBQ0hFX1NJWkUgPSAxNTtcblxubGV0IGFnZUlkeCA9IDA7XG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkUmVuZGVyZWRBZ2VJbkRheXMoYWdlOiBudW1iZXIpIHtcbiAgICByZW5kZXJlZEFnZUluRGF5c0ZvckFkYXB0aXZlSW5pdGlhbENvbG9yaW5nW2FnZUlkeF0gPSBhZ2U7XG4gICAgYWdlSWR4ID0gKGFnZUlkeCArIDEpICUgQURBUFRJVkVfSU5JVElBTF9DT0xPUklOR19BR0VfQ0FDSEVfU0laRTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVBZGFwdGl2ZUluaXRpYWxDb2xvcmluZ0FnZUluRGF5cygpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtZWRpYW4ocmVuZGVyZWRBZ2VJbkRheXNGb3JBZGFwdGl2ZUluaXRpYWxDb2xvcmluZyk7XG59XG5cbi8qKlxuICogQ2FjaGVzIHRoZSB7QGxpbmsgTGluZUF1dGhvcmluZ0d1dHRlcn0gaW5zdGFuY2VzIGNyZWF0ZWQgaW4gYGd1dHRlci50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBndXR0ZXJJbnN0YW5jZXM6IE1hcDxzdHJpbmcsIExpbmVBdXRob3JpbmdHdXR0ZXI+ID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIENhY2hlcyB0aGUgY29tcHV0YXRpb24gb2Yge0BsaW5rIGNvbXB1dGVMaW5lQXV0aG9yaW5nR3V0dGVyTWFya2Vyc1JhbmdlU2V0fS5cbiAqXG4gKiBEZXNwaXRlIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgZG9jdW1lbnQgZGlnZXN0IGFuZCBsaW5lLWJsb2NrcywgdGhlIHBlcmZvcm1hbmNlXG4gKiB3YXMgbWVhc3VyZWQgdG8gYmUgZmFzdGVyIHdpdGggdGhlIGNhY2hpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBndXR0ZXJNYXJrZXJzUmFuZ2VTZXQ6IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgUmFuZ2VTZXQ8R3V0dGVyTWFya2VyPlxuPiA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBTdG9yZXMgYWxsIERPTS1hdHRhY2hlZCBndXR0ZXIgZWxlbWVudHMgc28gdGhhdCB0aGV5IGNhbiBiZSBjaGVja2VkIGZvciBiZWluZ1xuICogdW5kZXIgdGhlIG1vdXNlIGR1cmluZyBhIGd1dHRlciBjb250ZXh0LW1lbnUgZXZlbnQ7XG4gKi9cbmV4cG9ydCBjb25zdCBhdHRhY2hlZEd1dHRlckVsZW1lbnRzOiBTZXQ8SFRNTEVsZW1lbnQ+ID0gbmV3IFNldCgpO1xuIiwgImltcG9ydCB7IEV4dGVuc2lvbiwgUmFuZ2UsIFJhbmdlU2V0LCBUZXh0IH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBFZGl0b3JWaWV3LCBndXR0ZXIsIEd1dHRlck1hcmtlciB9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQge1xuICAgIGxhU3RhdGVEaWdlc3QsXG4gICAgbGF0ZXN0U2V0dGluZ3MsXG4gICAgTGluZUF1dGhvcmluZ1dpdGhDaGFuZ2VzLFxuICAgIExpbmVBdXRob3JTZXR0aW5ncyxcbiAgICBsaW5lQXV0aG9yU3RhdGUsXG59IGZyb20gXCJzcmMvbGluZUF1dGhvci9tb2RlbFwiO1xuaW1wb3J0IHtcbiAgICBnZXRMb25nZXN0UmVuZGVyZWRHdXR0ZXIsXG4gICAgZ3V0dGVyTWFya2Vyc1JhbmdlU2V0LFxufSBmcm9tIFwic3JjL2xpbmVBdXRob3Ivdmlldy9jYWNoZVwiO1xuaW1wb3J0IHtcbiAgICBsaW5lQXV0aG9yaW5nR3V0dGVyTWFya2VyLFxuICAgIFRleHRHdXR0ZXIsXG59IGZyb20gXCJzcmMvbGluZUF1dGhvci92aWV3L2d1dHRlci9ndXR0ZXJcIjtcbmltcG9ydCB7XG4gICAgaW5pdGlhbExpbmVBdXRob3JpbmdHdXR0ZXIsXG4gICAgaW5pdGlhbFNwYWNpbmdHdXR0ZXIsXG59IGZyb20gXCJzcmMvbGluZUF1dGhvci92aWV3L2d1dHRlci9pbml0aWFsXCI7XG5pbXBvcnQgeyBuZXdVbnRyYWNrZWRGaWxlR3V0dGVyIH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL3ZpZXcvZ3V0dGVyL3VudHJhY2tlZEZpbGVcIjtcbmltcG9ydCB7IGJldHdlZW4gfSBmcm9tIFwic3JjL3V0aWxzXCI7XG5cbi8qXG49PT09PT09PT09PT09PT09PT0gVklFVyA9PT09PT09PT09PT09PT09PT09PT09XG5Db250YWlucyBjbGFzc2VzLCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBkZXNjcmliaW5nXG5ob3cgdGhlIE1PREVMIGlzIHJlbmRlcmVkIHRvIGEgdmlldy5cbiovXG5cbmNvbnN0IFVORElTUExBWUVEID0gbmV3IFRleHRHdXR0ZXIoXCJcIik7XG5cbi8qKlxuICogVGhlIGxpbmUgYXV0aG9yIGd1dHRlciBhcyBhIENvZGVtaXJyb3Ige0BsaW5rIEV4dGVuc2lvbn0uXG4gKlxuICogSXQgc2ltcGx5IHJlbmRlcmVzIHRoZSBsaW5lIGF1dGhvcmluZyBzdGF0ZSBmcm9tIHRoZSB7QGxpbmsgbGluZUF1dGhvclN0YXRlfSBzdGF0ZS1maWVsZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGxpbmVBdXRob3JHdXR0ZXI6IEV4dGVuc2lvbiA9IGd1dHRlcih7XG4gICAgY2xhc3M6IFwibGluZS1hdXRob3ItZ3V0dGVyLWNvbnRhaW5lclwiLFxuICAgIG1hcmtlcnModmlldykge1xuICAgICAgICAvLyB0aGlzIGlzIGNhbGxlZCBhIGZldyB0aW1lcyBvbiBldmVyeSBrZXlzdHJva2UgLyBjdXJzb3ItbW92ZS4gSGVuY2UsIGl0IGlzIGVmZmljaWVudFxuICAgICAgICBjb25zdCBsaW5lQXV0aG9yaW5nID0gdmlldy5zdGF0ZS5maWVsZChsaW5lQXV0aG9yU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGxpbmVBdXRob3JpbmdHdXR0ZXJNYXJrZXJzUmFuZ2VTZXQodmlldywgbGluZUF1dGhvcmluZyk7XG4gICAgfSxcbiAgICBsaW5lTWFya2VyQ2hhbmdlKHVwZGF0ZSkge1xuICAgICAgICBjb25zdCBuZXdMaW5lQXV0aG9yaW5nSWQgPSBsYVN0YXRlRGlnZXN0KFxuICAgICAgICAgICAgdXBkYXRlLnN0YXRlLmZpZWxkKGxpbmVBdXRob3JTdGF0ZSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgb2xkTGluZUF1dGhvcmluZ0lkID0gbGFTdGF0ZURpZ2VzdChcbiAgICAgICAgICAgIHVwZGF0ZS5zdGFydFN0YXRlLmZpZWxkKGxpbmVBdXRob3JTdGF0ZSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG9sZExpbmVBdXRob3JpbmdJZCAhPT0gbmV3TGluZUF1dGhvcmluZ0lkO1xuICAgIH0sXG4gICAgcmVuZGVyRW1wdHlFbGVtZW50czogdHJ1ZSxcbiAgICBpbml0aWFsU3BhY2VyOiAodmlldykgPT4ge1xuICAgICAgICB0ZW1wb3JhcnlXb3JrYXJvdW5kR3V0dGVyU3BhY2luZ0ZvclJlbmRlcmVkTGluZUF1dGhvcmluZyh2aWV3KTtcbiAgICAgICAgcmV0dXJuIGluaXRpYWxTcGFjaW5nR3V0dGVyKCk7XG4gICAgfSxcbiAgICB1cGRhdGVTcGFjZXI6IChfc3AsIHVwZGF0ZSkgPT4ge1xuICAgICAgICB0ZW1wb3JhcnlXb3JrYXJvdW5kR3V0dGVyU3BhY2luZ0ZvclJlbmRlcmVkTGluZUF1dGhvcmluZyh1cGRhdGUudmlldyk7XG4gICAgICAgIHJldHVybiBnZXRMb25nZXN0UmVuZGVyZWRHdXR0ZXIoKT8uZ3V0dGVyID8/IGluaXRpYWxTcGFjaW5nR3V0dGVyKCk7XG4gICAgfSxcbn0pO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGd1dHRlciBtYXJrZXJzIGFzIGEge0BsaW5rIFJhbmdlU2V0fS5cbiAqXG4gKiBUaGUgY29tcHV0YXRpb24gcmVzdWx0IGlzIGNhY2hlZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIHZpYSBhIFNIQS0yNTYgYGNhY2hlS2V5YC5cbiAqIFRoZSBhY3R1YWwgY29tcHV0YXRpb24gaGFwcGVucyBpbiB7QGxpbmsgY29tcHV0ZUxpbmVBdXRob3JpbmdHdXR0ZXJNYXJrZXJzUmFuZ2VTZXR9LlxuICovXG5mdW5jdGlvbiBsaW5lQXV0aG9yaW5nR3V0dGVyTWFya2Vyc1JhbmdlU2V0KFxuICAgIHZpZXc6IEVkaXRvclZpZXcsXG4gICAgb3B0TEE/OiBMaW5lQXV0aG9yaW5nV2l0aENoYW5nZXNcbik6IFJhbmdlU2V0PEd1dHRlck1hcmtlcj4ge1xuICAgIGNvbnN0IGRpZ2VzdCA9IGxhU3RhdGVEaWdlc3Qob3B0TEEpO1xuXG4gICAgY29uc3QgZG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgLy8gV2UgZG9uJ3QgZGlnZXN0IHRoaXMsIGV2ZW4gdGhvdWdoIGl0IGlzIHVzZWQgYXMgYW4gYXJndW1lbnQgZm9yIHRoZSBjb21wdXRhdGlvblxuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBhIGNoYW5nZSBpbiB0aGUgZG9jIGlzIG9ubHkgcmVmbGVjdGVkIGluIHRoZSBsaW5lIGF1dGhvcmluZ1xuICAgIC8vIHdoZW4gdGhlIGRvYyBpcyBzYXZlZC4gQnV0IHNhdmluZyBjaGFuZ2VzIHRoZSBsaW5lIGF1dGhvcmluZyBrZXkgYW55d2F5cy5cblxuICAgIC8vIEVhY2ggbGluZSBpcyBwYXJ0IG9mIGEgYmxvY2sgb2YgMSBvciBtb3JlIGxpbmVzLiBXaXRoaW4gYSBibG9jayBvbmx5IHRoZSBuZXdlc3RcbiAgICAvLyBjb21taXQgc2hvdWxkIGJlIHNob3duLiBIZW5jZSwgd2UgY29sbGVjdCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgZm9yIGVhY2ggYmxvY2sgaGVyZS5cbiAgICBjb25zdCBsaW5lQmxvY2tFbmRQb3M6IE1hcDxudW1iZXIsIFtudW1iZXIsIG51bWJlcl0+ID0gbmV3IE1hcCgpO1xuICAgIGZvciAobGV0IGxpbmUgPSAxOyBsaW5lIDw9IGRvYy5saW5lczsgbGluZSsrKSB7XG4gICAgICAgIGNvbnN0IGZyb20gPSBkb2MubGluZShsaW5lKS5mcm9tO1xuICAgICAgICBjb25zdCB0byA9IHZpZXcubGluZUJsb2NrQXQoZnJvbSkudG87XG4gICAgICAgIGxpbmVCbG9ja0VuZFBvcy5zZXQobGluZSwgW2Zyb20sIHRvXSk7XG4gICAgICAgIGRpZ2VzdC51cGRhdGUoW2Zyb20sIHRvLCAwXSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGFTZXR0aW5ncyA9IGxhdGVzdFNldHRpbmdzLmdldCgpO1xuICAgIGRpZ2VzdC51cGRhdGUoXCJzXCIgKyBPYmplY3QudmFsdWVzKGxhdGVzdFNldHRpbmdzKS5qb2luKFwiLFwiKSk7XG5cbiAgICBjb25zdCBjYWNoZUtleSA9IGRpZ2VzdC5oZXgoKTtcblxuICAgIGNvbnN0IGNhY2hlZCA9IGd1dHRlck1hcmtlcnNSYW5nZVNldC5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgICAvLyBUaGlzIGlzIGNhbGxlZCBpbmZyZXF1ZW50bHkgZW5vdWdoIHRvIHB1dCB0aGUgY29tcHV0YXRpb24gdGhlcmUuXG4gICAgY29uc3QgeyByZXN1bHQsIGFsbG93Q2FjaGUgfSA9IGNvbXB1dGVMaW5lQXV0aG9yaW5nR3V0dGVyTWFya2Vyc1JhbmdlU2V0KFxuICAgICAgICBkb2MsXG4gICAgICAgIGxpbmVCbG9ja0VuZFBvcyxcbiAgICAgICAgbGFTZXR0aW5ncyxcbiAgICAgICAgb3B0TEFcbiAgICApO1xuICAgIGlmIChhbGxvd0NhY2hlKSBndXR0ZXJNYXJrZXJzUmFuZ2VTZXQuc2V0KGNhY2hlS2V5LCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVMaW5lQXV0aG9yaW5nR3V0dGVyTWFya2Vyc1JhbmdlU2V0KFxuICAgIGRvYzogVGV4dCxcbiAgICBibG9ja3NQZXJMaW5lOiBNYXA8bnVtYmVyLCBbbnVtYmVyLCBudW1iZXJdPixcbiAgICBzZXR0aW5nczogTGluZUF1dGhvclNldHRpbmdzLFxuICAgIG9wdExBPzogTGluZUF1dGhvcmluZ1dpdGhDaGFuZ2VzXG4pOiB7IHJlc3VsdDogUmFuZ2VTZXQ8R3V0dGVyTWFya2VyPjsgYWxsb3dDYWNoZTogYm9vbGVhbiB9IHtcbiAgICBsZXQgYWxsb3dDYWNoZSA9IHRydWU7IC8vIGludm9jYXRpb25zIG9mIGluaXRpYWxMaW5lQXV0aG9yaW5nR3V0dGVyIHNob3VsZG4ndCBiZSBjYWNoZWRcblxuICAgIGNvbnN0IGRvY0xhc3RMaW5lID0gZG9jLmxpbmVzO1xuXG4gICAgY29uc3QgcmFuZ2VzOiBSYW5nZTxHdXR0ZXJNYXJrZXI+W10gPSBbXTtcbiAgICBmdW5jdGlvbiBhZGQoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyIHwgdW5kZWZpbmVkLCBndXR0ZXI6IEd1dHRlck1hcmtlcikge1xuICAgICAgICByZXR1cm4gcmFuZ2VzLnB1c2goZ3V0dGVyLnJhbmdlKGZyb20sIHRvKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZUZyb20gPSBjb21wdXRlTGluZU1hcHBpbmdGb3JVbnNhdmVkQ2hhbmdlcyhkb2NMYXN0TGluZSwgb3B0TEEpO1xuXG4gICAgY29uc3QgZW1wdHlEb2MgPSBkb2MubGVuZ3RoID09PSAwO1xuXG4gICAgY29uc3QgbGFzdExpbmVJc0VtcHR5ID1cbiAgICAgICAgZG9jLml0ZXJMaW5lcyhkb2NMYXN0TGluZSwgZG9jTGFzdExpbmUgKyAxKS5uZXh0KCkudmFsdWUgPT09IFwiXCI7XG5cbiAgICBmb3IgKGxldCBzdGFydExpbmUgPSAxOyBzdGFydExpbmUgPD0gZG9jTGFzdExpbmU7IHN0YXJ0TGluZSsrKSB7XG4gICAgICAgIGNvbnN0IFtmcm9tLCB0b10gPSBibG9ja3NQZXJMaW5lLmdldChzdGFydExpbmUpITtcbiAgICAgICAgY29uc3QgZW5kTGluZSA9IGRvYy5saW5lQXQodG8pLm51bWJlcjtcblxuICAgICAgICBpZiAoZW1wdHlEb2MpIHtcbiAgICAgICAgICAgIGFkZChmcm9tLCB0bywgVU5ESVNQTEFZRUQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnRMaW5lID09PSBkb2NMYXN0TGluZSAmJiBsYXN0TGluZUlzRW1wdHkpIHtcbiAgICAgICAgICAgIGFkZChmcm9tLCB0bywgVU5ESVNQTEFZRUQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0TEEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYWRkKGZyb20sIHRvLCBpbml0aWFsTGluZUF1dGhvcmluZ0d1dHRlcihzZXR0aW5ncykpO1xuICAgICAgICAgICAgYWxsb3dDYWNoZSA9IGZhbHNlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGtleSwgbGEgfSA9IG9wdExBO1xuXG4gICAgICAgIGlmIChsYSA9PT0gXCJ1bnRyYWNrZWRcIikge1xuICAgICAgICAgICAgYWRkKGZyb20sIHRvLCBuZXdVbnRyYWNrZWRGaWxlR3V0dGVyKGxhLCBzZXR0aW5ncykpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0QXV0aG9yTGluZSA9IGxhLmhhc2hQZXJMaW5lLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgY29uc3QgbGFTdGFydExpbmUgPSBsaW5lRnJvbVtzdGFydExpbmVdO1xuICAgICAgICBjb25zdCBsYUVuZExpbmUgPSBsaW5lRnJvbVtlbmRMaW5lXTtcblxuICAgICAgICBpZiAobGFFbmRMaW5lICYmIGxhRW5kTGluZSA+IGxhc3RBdXRob3JMaW5lKSB7XG4gICAgICAgICAgICBhZGQoZnJvbSwgdG8sIFVORElTUExBWUVEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGxhU3RhcnRMaW5lICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGJldHdlZW4oMSwgbGFTdGFydExpbmUsIGxhc3RBdXRob3JMaW5lKSAmJlxuICAgICAgICAgICAgbGFFbmRMaW5lICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGJldHdlZW4oMSwgbGFFbmRMaW5lLCBsYXN0QXV0aG9yTGluZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhZGQoXG4gICAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgICAgICBsaW5lQXV0aG9yaW5nR3V0dGVyTWFya2VyKFxuICAgICAgICAgICAgICAgICAgICBsYSxcbiAgICAgICAgICAgICAgICAgICAgbGFTdGFydExpbmUsXG4gICAgICAgICAgICAgICAgICAgIGxhRW5kTGluZSxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVuc2F2ZWQgY2hhbmdlcyBxdWljayBndXR0ZXIgdXBkYXRlLiBzY2VuYXJpbyAxXG4gICAgICAgIGlmIChsYXN0QXV0aG9yTGluZSA8IDEpIHtcbiAgICAgICAgICAgIC8vIGZpbGUgd2FzIGVtcHR5LCBidXQgbm93IGl0J3MgYmVpbmcgd3JpdHRlblxuICAgICAgICAgICAgYWRkKGZyb20sIHRvLCBpbml0aWFsTGluZUF1dGhvcmluZ0d1dHRlcihzZXR0aW5ncykpO1xuICAgICAgICAgICAgYWxsb3dDYWNoZSA9IGZhbHNlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1bnNhdmVkIGNoYW5nZXMgcXVpY2sgZ3V0dGVyIHVwZGF0ZS4gc2NlbmFyaW8gMlxuICAgICAgICBjb25zdCBzdGFydCA9IE1hdGguY2xhbXAobGFTdGFydExpbmUgPz8gc3RhcnRMaW5lLCAxLCBsYXN0QXV0aG9yTGluZSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IE1hdGguY2xhbXAobGFFbmRMaW5lID8/IGVuZExpbmUsIDEsIGxhc3RBdXRob3JMaW5lKTtcblxuICAgICAgICBhZGQoXG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICBsaW5lQXV0aG9yaW5nR3V0dGVyTWFya2VyKFxuICAgICAgICAgICAgICAgIGxhLFxuICAgICAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgICAgICBrZXkgKyBcImNvbXB1dGluZ1wiLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICAgIFwid2FpdGluZy1mb3ItcmVzdWx0XCJcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyByZXN1bHQ6IFJhbmdlU2V0Lm9mKHJhbmdlcywgLyogc29ydCA9ICovIHRydWUpLCBhbGxvd0NhY2hlIH07XG59XG5cbi8vIHRvZG8uIGV4cGxhaW4uXG5mdW5jdGlvbiBjb21wdXRlTGluZU1hcHBpbmdGb3JVbnNhdmVkQ2hhbmdlcyhcbiAgICBkb2NMYXN0TGluZTogbnVtYmVyLFxuICAgIG9wdExBOiBMaW5lQXV0aG9yaW5nV2l0aENoYW5nZXMgfCB1bmRlZmluZWRcbikge1xuICAgIGlmICghb3B0TEE/LmxpbmVPZmZzZXRzRnJvbVVuc2F2ZWRDaGFuZ2VzKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBBcnJheShkb2NMYXN0TGluZSArIDEpLCAobG4pID0+IGxuKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lRnJvbTogKG51bWJlciB8IHVuZGVmaW5lZClbXSA9IFt1bmRlZmluZWRdO1xuICAgIGxldCBjdW11bGF0aXZlTGluZU9mZnNldCA9IDA7IC8vIG1heSBiZSBuZWdhdGl2ZVxuXG4gICAgZm9yIChsZXQgbG4gPSAxOyBsbiA8PSBkb2NMYXN0TGluZTsgbG4rKykge1xuICAgICAgICBjb25zdCB1bnNhdmVkQ2hhbmdlcyA9IG9wdExBLmxpbmVPZmZzZXRzRnJvbVVuc2F2ZWRDaGFuZ2VzLmdldChsbik7XG4gICAgICAgIGN1bXVsYXRpdmVMaW5lT2Zmc2V0ICs9IHVuc2F2ZWRDaGFuZ2VzID8/IDA7IC8vIGNvbXB1dGUgY3VtdWxhdGl2ZSBzdW0gb2YgbGluZSBvZmZzZXRzXG4gICAgICAgIC8vIGlmIG5vIHVuc2F2ZWQgY2hhbmdlcyBhcmUgdGhlcmUgZm9yIHRoZSBjdXJyZW50IGxpbmUsIHRoZW4gdXNlXG4gICAgICAgIC8vIHRoZSBjdW11bGF0aXZlIG9mZnNldCwgb3RoZXJ3aXNlIHJldHVybiB1bmRlZmluZWQgLSB3aGljaCB3aWxsIGJlIHJlbmRlcmVkIGFzICdjb21wdXRpbmcnXG4gICAgICAgIGxpbmVGcm9tW2xuXSA9XG4gICAgICAgICAgICB1bnNhdmVkQ2hhbmdlcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBsbiAtIGN1bXVsYXRpdmVMaW5lT2Zmc2V0XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVGcm9tO1xufVxuXG4vKipcbiAqIFRoaXMgYXBwbGllcyBhIHRlbXBvYXJ5IHdvcmthcm91bmQgZm9yIGN1c3RvbSBndXR0ZXJzIGZvciBPYnNpZGlhbiB2MS4wLlxuICpcbiAqIEFzIG9mIHdyaXRpbmcsIHRoZSBmb2xsb3dpbmcgcHJvYmxlbSBleGlzdHM6XG4gKiAqIFdoZW4gdGhlIGxpbmUgYXV0aG9yaW5nIGlzIHJlbmRlcmVkIHdpdGhvdXQgYW55dGhpbmcgZWxzZSAoaS5lLiBsaW5lIG51bWJlcnMpXG4gKiAgIHRoZSBzcGFjaW5nIGlzIG1lc3NlZCB1cCBhbmQgb2JzY3VyZXMgdGhlIHRleHQuXG4gKiAqIFdoZW4gdGhlIGxpbmUgYXV0aG9yaW5nIGlzIHNob3duIHRvZ2V0aGVyIHdpdGggdGhlIGxpbmUgbnVtYmVycyBldmVyeXRoaW5nIGlzIGZpbmUuXG4gKlxuICogU2VlIHRoZSBidWcgcmVwb3J0OiBodHRwczovL2ZvcnVtLm9ic2lkaWFuLm1kL3QvYWRkZWQtZWRpdG9yLWd1dHRlci1vdmVybGFwcy1hbmQtb2JzY3VyZXMtZWRpdG9yLWNvbnRlbnQvNDUyMTdcbiAqXG4gKiBUaGUgY29uY2x1c2lvbiBvZiB0aGUgYW5hbHlzaXMgaXMsIHRoYXQgd2Ugd2FudCB0byByZXNldCB0aGUgYG1hcmdpbi1sZWZ0YCBzdHlsZVxuICogcHJvcGVydHkgb2YgdGhlIGAuY20tZ3V0dGVyc2AgY29udGFpbmVyIGVsZW1lbnQgKippZiBhbmQgb25seSBpZioqIHRoZSBsaW5lIGF1dGhvcmluZ1xuICogaXMgcmVuZGVyZWQuIEZvciB0aGlzIHJlYXNvbiwgdGhlIGluaXRpYWxTcGFjZXIgYW5kIHVwZGF0ZXNTcGFjZXIgY2FsbGJhY2tzIGluXG4gKiB7QGxpbmsgbGluZUF1dGhvckd1dHRlcn0gY2FsbCB0aGlzIGZ1bmN0aW9uIHdoaWNoIHJlc2V0IHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlLlxuICpcbiAqIFRPRE86IFJlbW92ZSB0aGlzIHdvcmthcm91bmQsIHdoZW4gdGhpcyBpcyBmaXhlZCB3aXRoaW4gT2JzaWRpYW4gaXRzZWxmLlxuICovXG5mdW5jdGlvbiB0ZW1wb3JhcnlXb3JrYXJvdW5kR3V0dGVyU3BhY2luZ0ZvclJlbmRlcmVkTGluZUF1dGhvcmluZyhcbiAgICB2aWV3OiBFZGl0b3JWaWV3XG4pIHtcbiAgICBjb25zdCBndXR0ZXJzQ29udGFpbmVycyA9IHZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgIFwiLmNtLWd1dHRlcnNcIlxuICAgICkgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD47XG4gICAgZ3V0dGVyc0NvbnRhaW5lcnMuZm9yRWFjaCgoY29udCkgPT4ge1xuICAgICAgICBpZiAoIWNvbnQ/LnN0eWxlKSByZXR1cm47XG4gICAgICAgIGlmICghY29udC5zdHlsZS5tYXJnaW5MZWZ0KSB7XG4gICAgICAgICAgICBjb250LnN0eWxlLm1hcmdpbkxlZnQgPSBcInVuc2V0XCI7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBHdXR0ZXJNYXJrZXIgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSBcImpzLXNoYTI1NlwiO1xuaW1wb3J0IHsgbW9tZW50IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBEQVRFX0ZPUk1BVCwgREFURV9USU1FX0ZPUk1BVF9NSU5VVEVTIH0gZnJvbSBcInNyYy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gICAgTGluZUF1dGhvckRhdGVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgICBMaW5lQXV0aG9yRGlzcGxheSxcbiAgICBMaW5lQXV0aG9yU2V0dGluZ3MsXG4gICAgTGluZUF1dGhvclRpbWV6b25lT3B0aW9uLFxuICAgIExpbmVBdXRob3JpbmcsXG4gICAgbGF0ZXN0U2V0dGluZ3MsXG59IGZyb20gXCJzcmMvbGluZUF1dGhvci9tb2RlbFwiO1xuaW1wb3J0IHtcbiAgICBhdHRhY2hlZEd1dHRlckVsZW1lbnRzLFxuICAgIGNvbmRpdGlvbmFsbHlVcGRhdGVMb25nZXN0UmVuZGVyZWRHdXR0ZXIsXG4gICAgZ2V0TG9uZ2VzdFJlbmRlcmVkR3V0dGVyLFxuICAgIGd1dHRlckluc3RhbmNlcyxcbiAgICByZWNvcmRSZW5kZXJlZEFnZUluRGF5cyxcbn0gZnJvbSBcInNyYy9saW5lQXV0aG9yL3ZpZXcvY2FjaGVcIjtcbmltcG9ydCB7IGVucmljaENvbW1pdEluZm9Gb3JDb250ZXh0TWVudSB9IGZyb20gXCJzcmMvbGluZUF1dGhvci92aWV3L2NvbnRleHRNZW51XCI7XG5pbXBvcnQgeyBjb2xvcmluZ0Jhc2VkT25Db21taXRBZ2UgfSBmcm9tIFwic3JjL2xpbmVBdXRob3Ivdmlldy9ndXR0ZXIvY29sb3JpbmdcIjtcbmltcG9ydCB7IGNob29zZU5ld2VzdENvbW1pdCB9IGZyb20gXCJzcmMvbGluZUF1dGhvci92aWV3L2d1dHRlci9jb21taXRDaG9pY2VcIjtcbmltcG9ydCB7IEJsYW1lQ29tbWl0IH0gZnJvbSBcInNyYy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgICBpbXBvc3NpYmxlQnJhbmNoLFxuICAgIHByZWZpeE9mTGVuZ3RoQXNXaGl0ZXNwYWNlLFxuICAgIHJlc2l6ZVRvTGVuZ3RoLFxuICAgIHN0cmljdERlZXBFcXVhbCxcbn0gZnJvbSBcInNyYy91dGlsc1wiO1xuXG5jb25zdCBWQUxVRV9OT1RfRk9VTkRfRkFMTEJBQ0sgPSBcIi1cIjtcblxuY29uc3QgTkVXX0NIQU5HRV9DSEFSQUNURVIgPSBcIitcIjtcbmNvbnN0IE5FV19DSEFOR0VfTlVNQkVSX09GX0NIQVJBQ1RFUlMgPSAzO1xuXG5jb25zdCBESUZGRVJJTkdfQVVUSE9SX0NPTU1JVFRFUl9NQVJLRVIgPSBcIipcIjtcblxuY29uc3QgTk9OX1dISVRFU1BBQ0VfUkVHRVhQID0gL1xcUy9nO1xuY29uc3QgVU5JTlRSVVNJVkVfQ0hBUkFDVEVSX0ZPUl9XQUlUSU5HX1JFTkRFUklORyA9IFwiJVwiO1xuXG4vKipcbiAqIEEgc2ltcGxlIHRleHQgZ3V0dGVyIHVzZWQgdG8gaG9sZCBzcGFjZSB1bnRpbCB0aGUgcmVhbCByZXN1bHRzIGFyZSBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0R3V0dGVyIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgZXEob3RoZXI6IEd1dHRlck1hcmtlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0ID09PSAoPGFueT5vdGhlcik/LnRleHQ7XG4gICAgfVxuXG4gICAgdG9ET00oKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnRleHQpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koZG9tOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoZG9tKSkgZG9tLnJlbW92ZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBnaXZlbiB7QGxpbmsgTGluZUF1dGhvcmluZ30gZm9yIHRoZSBsaW5lcyB7QGxpbmsgc3RhcnRMaW5lfVxuICogdG8ge0BsaW5rIGVuZExpbmV9LlxuICovXG5leHBvcnQgY2xhc3MgTGluZUF1dGhvcmluZ0d1dHRlciBleHRlbmRzIEd1dHRlck1hcmtlciB7XG4gICAgcHJpdmF0ZSBwcmVjb21wdXRlZERvbVByb3ZpZGVyPzogKCkgPT4gSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIHJlYWRvbmx5IHBvaW50ID0gZmFsc2U7XG4gICAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnRDbGFzcyA9IFwib2JzLWdpdC1ibGFtZS1ndXR0ZXJcIjtcblxuICAgIC8qKlxuICAgICAqICoqVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQge0BsaW5rIGxpbmVBdXRob3JpbmdHdXR0ZXJNYXJrZXJ9ISoqXG4gICAgICpcbiAgICAgKiBXZSB3YW50IHRvIGF2b2lkIGNyZWF0aW5nIHRoZSBzYW1lIGluc3RhbmNlIG11bHRpcGxlIHRpbWVzIGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGxpbmVBdXRob3Jpbmc6IEV4Y2x1ZGU8TGluZUF1dGhvcmluZywgXCJ1bnRyYWNrZWRcIj4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGFydExpbmU6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVuZExpbmU6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2V0dGluZ3M6IExpbmVBdXRob3JTZXR0aW5ncyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM/OiBcIndhaXRpbmctZm9yLXJlc3VsdFwiXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLy8gRXF1YWxpdHkgdXNlZCBieSBDb2RlTWlycm9yIGZvciBvcHRpbWlzYXRpb25zXG4gICAgcHVibGljIGVxKG90aGVyOiBHdXR0ZXJNYXJrZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMua2V5ID09PSAoPExpbmVBdXRob3JpbmdHdXR0ZXI+b3RoZXIpPy5rZXkgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhcnRMaW5lID09PSAoPExpbmVBdXRob3JpbmdHdXR0ZXI+b3RoZXIpPy5zdGFydExpbmUgJiZcbiAgICAgICAgICAgIHRoaXMuZW5kTGluZSA9PT0gKDxMaW5lQXV0aG9yaW5nR3V0dGVyPm90aGVyKT8uZW5kTGluZSAmJlxuICAgICAgICAgICAgdGhpcz8ub3B0aW9ucyA9PT0gKDxMaW5lQXV0aG9yaW5nR3V0dGVyPm90aGVyKT8ub3B0aW9uc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdG8gYSBIdG1sIG5vZGUuXG4gICAgICpcbiAgICAgKiBJdCBjaG9zZXMgdGhlIG5ld2VzdCBjb21taXQgd2l0aGluIHRoZSBsaW5lLXJhbmdlLFxuICAgICAqIHJlbmRlcnMgaXQsIG1ha2VzIGFkanVzdG1lbnRzIGZvciBmYWtlLWNvbW1pdHMgYW5kIGZpbmFsbHkgd2FycHNcbiAgICAgKiBpdCBpbnRvIEhUTUwuXG4gICAgICpcbiAgICAgKiBUaGUgRE9NIGlzIGFjdHVhbGx5IHByZWNvbXB1dGVkIHdpdGgge0BsaW5rIGNvbXB1dGVEb219LFxuICAgICAqIHdoaWNoIHByb3ZpZGVzIGEgZmluYWxpc2VyIHRvIHJ1biBiZWZvcmUgdGhlIERPTSBpcyBoYW5kZWQgb3ZlciB0byBDb2RlTWlycm9yLlxuICAgICAqIFRoaXMgaXMgZG9uZSwgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJlcXVlbnRseS4gSXQgaXMgY2FsbGVkLFxuICAgICAqIHdoZW5ldmVyIGEgZ3V0dGVyIGdldHMgaW50byB0aGUgdmlld3BvcnQgYW5kIG5lZWRzIHRvIGJlIHJlbmRlcmVkLlxuICAgICAqXG4gICAgICogVGhlIGFnZSBpbiBkYXlzIGlzIHJlY29yZGVkIHZpYSB7QGxpbmsgcmVjb3JkUmVuZGVyZWRBZ2VJbkRheXN9IHRvIGVuYWJsZSBhZGFwdGl2ZSBjb2xvcmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9ET00oKSB7XG4gICAgICAgIHRoaXMucHJlY29tcHV0ZWREb21Qcm92aWRlciA9XG4gICAgICAgICAgICB0aGlzLnByZWNvbXB1dGVkRG9tUHJvdmlkZXIgPz8gdGhpcy5jb21wdXRlRG9tKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkRG9tUHJvdmlkZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzdHJveShkb206IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIC8vIHRoaXMgaXMgY2FsbGVkIGZyZXF1ZW50bHksIHdoZW4gdGhlIGd1dHRlciBtb3ZlcyBvdXRzaWRlIG9mIHRoZSB2aWV3LlxuICAgICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoZG9tKSkge1xuICAgICAgICAgICAgZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgYXR0YWNoZWRHdXR0ZXJFbGVtZW50cy5kZWxldGUoZG9tKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIHRoZSBET00gZm9yIHRoaXMgZ3V0dGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29tcHV0ZURvbSgpIHtcbiAgICAgICAgY29uc3QgY29tbWl0ID0gY2hvb3NlTmV3ZXN0Q29tbWl0KFxuICAgICAgICAgICAgdGhpcy5saW5lQXV0aG9yaW5nLFxuICAgICAgICAgICAgdGhpcy5zdGFydExpbmUsXG4gICAgICAgICAgICB0aGlzLmVuZExpbmVcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgdG9CZVJlbmRlcmVkVGV4dCA9IGNvbW1pdC5pc1plcm9Db21taXRcbiAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgOiB0aGlzLnJlbmRlck5vblplcm9Db21taXQoY29tbWl0KTtcblxuICAgICAgICBjb25zdCBpc1RydWVDb21taXQgPVxuICAgICAgICAgICAgIWNvbW1pdC5pc1plcm9Db21taXQgJiYgdGhpcy5vcHRpb25zICE9PSBcIndhaXRpbmctZm9yLXJlc3VsdFwiO1xuXG4gICAgICAgIGlmIChpc1RydWVDb21taXQpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsbHlVcGRhdGVMb25nZXN0UmVuZGVyZWRHdXR0ZXIodGhpcywgdG9CZVJlbmRlcmVkVGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0b0JlUmVuZGVyZWRUZXh0ID0gdGhpcy5hZGFwdFRleHRGb3JGYWtlQ29tbWl0KFxuICAgICAgICAgICAgICAgIGNvbW1pdCxcbiAgICAgICAgICAgICAgICB0b0JlUmVuZGVyZWRUZXh0LFxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRvbVByb3ZpZGVyID0gdGhpcy5jcmVhdGVIdG1sTm9kZShcbiAgICAgICAgICAgIGNvbW1pdCxcbiAgICAgICAgICAgIHRvQmVSZW5kZXJlZFRleHQsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPT09IFwid2FpdGluZy1mb3ItcmVzdWx0XCJcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gZG9tUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVIdG1sTm9kZShcbiAgICAgICAgY29tbWl0OiBCbGFtZUNvbW1pdCxcbiAgICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgICBpc1dhaXRpbmdHdXR0ZXI6IGJvb2xlYW5cbiAgICApIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVFbHQgPSB3aW5kb3cuY3JlYXRlRGl2KCk7XG5cbiAgICAgICAgdGVtcGxhdGVFbHQuaW5uZXJUZXh0ID0gdGV4dDtcblxuICAgICAgICBjb25zdCB7IGNvbG9yLCBkYXlzU2luY2VDb21taXQgfSA9IGNvbG9yaW5nQmFzZWRPbkNvbW1pdEFnZShcbiAgICAgICAgICAgIGNvbW1pdD8uYXV0aG9yPy5lcG9jaFNlY29uZHMsXG4gICAgICAgICAgICBjb21taXQ/LmlzWmVyb0NvbW1pdCxcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3NcbiAgICAgICAgKTtcblxuICAgICAgICB0ZW1wbGF0ZUVsdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcblxuICAgICAgICBlbnJpY2hDb21taXRJbmZvRm9yQ29udGV4dE1lbnUoY29tbWl0LCBpc1dhaXRpbmdHdXR0ZXIsIHRlbXBsYXRlRWx0KTtcblxuICAgICAgICBmdW5jdGlvbiBwcmVwYXJlRm9yRG9tQXR0YWNobWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgICAgICAvLyBjbG9uZSBub2RlIGJlZm9yZSBhdHRhY2htZW50LCBhcyBhdHRhY2hlZCBET01zIG1heSBnZXQgZGVzdHJveWVkLlxuICAgICAgICAgICAgY29uc3QgZWx0ID0gdGVtcGxhdGVFbHQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgYXR0YWNoZWRHdXR0ZXJFbGVtZW50cy5hZGQoZWx0KTtcbiAgICAgICAgICAgIC8vIG9ubHkgcmVjb3JkIHJlYWwgZGF0ZXNcbiAgICAgICAgICAgIGlmICghaXNXYWl0aW5nR3V0dGVyKSByZWNvcmRSZW5kZXJlZEFnZUluRGF5cyhkYXlzU2luY2VDb21taXQpO1xuICAgICAgICAgICAgcmV0dXJuIGVsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmVwYXJlRm9yRG9tQXR0YWNobWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlck5vblplcm9Db21taXQoY29tbWl0OiBCbGFtZUNvbW1pdCkge1xuICAgICAgICBjb25zdCBvcHRpb25hbFNob3J0SGFzaCA9IHRoaXMuc2V0dGluZ3Muc2hvd0NvbW1pdEhhc2hcbiAgICAgICAgICAgID8gdGhpcy5yZW5kZXJIYXNoKGNvbW1pdClcbiAgICAgICAgICAgIDogXCJcIjtcblxuICAgICAgICBjb25zdCBvcHRpb25hbEF1dGhvck5hbWUgPVxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5hdXRob3JEaXNwbGF5ID09PSBcImhpZGVcIlxuICAgICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICAgIDogYCR7dGhpcy5yZW5kZXJBdXRob3JOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdCxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmF1dGhvckRpc3BsYXlcbiAgICAgICAgICAgICAgICAgICl9YDtcblxuICAgICAgICBjb25zdCBvcHRpb25hbEF1dGhvcmluZ0RhdGUgPVxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5kYXRlVGltZUZvcm1hdE9wdGlvbnMgPT09IFwiaGlkZVwiXG4gICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgOiBgJHt0aGlzLnJlbmRlckF1dGhvcmluZ0RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgY29tbWl0LFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuZGF0ZVRpbWVGb3JtYXRPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuZGF0ZVRpbWVGb3JtYXRDdXN0b21TdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5kYXRlVGltZVRpbWV6b25lXG4gICAgICAgICAgICAgICAgICApfWA7XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgICAgICBvcHRpb25hbFNob3J0SGFzaCxcbiAgICAgICAgICAgIG9wdGlvbmFsQXV0aG9yTmFtZSxcbiAgICAgICAgICAgIG9wdGlvbmFsQXV0aG9yaW5nRGF0ZSxcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gcGFydHMuZmlsdGVyKCh4KSA9PiB4Lmxlbmd0aCA+PSAxKS5qb2luKFwiIFwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckhhc2gobm9uWmVyb0NvbW1pdDogQmxhbWVDb21taXQpIHtcbiAgICAgICAgcmV0dXJuIG5vblplcm9Db21taXQuaGFzaC5zdWJzdHJpbmcoMCwgNik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJBdXRob3JOYW1lKFxuICAgICAgICBub25aZXJvQ29tbWl0OiBCbGFtZUNvbW1pdCxcbiAgICAgICAgYXV0aG9yRGlzcGxheTogRXhjbHVkZTxMaW5lQXV0aG9yRGlzcGxheSwgXCJoaWRlXCI+XG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG5vblplcm9Db21taXQ/LmF1dGhvcj8ubmFtZSA/PyBcIlwiO1xuICAgICAgICBjb25zdCB3b3JkcyA9IG5hbWUuc3BsaXQoXCIgXCIpLmZpbHRlcigod29yZCkgPT4gd29yZC5sZW5ndGggPj0gMSk7IC8vIG5vbi1lbXB0eSB3b3Jkc1xuXG4gICAgICAgIGxldCByZW5kZXJlZDtcbiAgICAgICAgc3dpdGNoIChhdXRob3JEaXNwbGF5KSB7XG4gICAgICAgICAgICBjYXNlIFwiaW5pdGlhbHNcIjogLy8gdGFrZSBldmVyeSB3b3JkcyBmaXJzdCBsZXR0ZXIgY2FwdGl0YWxpemVkXG4gICAgICAgICAgICAgICAgcmVuZGVyZWQgPSB3b3Jkcy5tYXAoKHdvcmQpID0+IHdvcmRbMF0udG9VcHBlckNhc2UoKSkuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJmaXJzdCBuYW1lXCI6XG4gICAgICAgICAgICAgICAgcmVuZGVyZWQgPSB3b3Jkcy5maXJzdCgpID8/IFZBTFVFX05PVF9GT1VORF9GQUxMQkFDSztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsYXN0IG5hbWVcIjpcbiAgICAgICAgICAgICAgICByZW5kZXJlZCA9IHdvcmRzLmxhc3QoKSA/PyBWQUxVRV9OT1RfRk9VTkRfRkFMTEJBQ0s7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZnVsbFwiOlxuICAgICAgICAgICAgICAgIHJlbmRlcmVkID0gbmFtZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcG9zc2libGVCcmFuY2goYXV0aG9yRGlzcGxheSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgdHJhaWxpbmcgKiBpZiBhdXRob3IgYW5kIGNvbWl0dGVyIGFyZSBkaWZmZXJlbnQuXG4gICAgICAgIGlmICghc3RyaWN0RGVlcEVxdWFsKG5vblplcm9Db21taXQ/LmF1dGhvciwgbm9uWmVyb0NvbW1pdD8uY29tbWl0dGVyKSkge1xuICAgICAgICAgICAgcmVuZGVyZWQgPSByZW5kZXJlZCArIERJRkZFUklOR19BVVRIT1JfQ09NTUlUVEVSX01BUktFUjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW5kZXJlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckF1dGhvcmluZ0RhdGUoXG4gICAgICAgIG5vblplcm9Db21taXQ6IEJsYW1lQ29tbWl0LFxuICAgICAgICBkYXRlVGltZUZvcm1hdE9wdGlvbnM6IEV4Y2x1ZGU8TGluZUF1dGhvckRhdGVUaW1lRm9ybWF0T3B0aW9ucywgXCJoaWRlXCI+LFxuICAgICAgICBkYXRlVGltZUZvcm1hdEN1c3RvbVN0cmluZzogc3RyaW5nLFxuICAgICAgICBkYXRlVGltZVRpbWV6b25lOiBMaW5lQXV0aG9yVGltZXpvbmVPcHRpb25cbiAgICApIHtcbiAgICAgICAgY29uc3QgRkFMTEJBQ0tfQ09NTUlUX0RBVEUgPSBcIj9cIjtcbiAgICAgICAgaWYgKG5vblplcm9Db21taXQ/LmF1dGhvcj8uZXBvY2hTZWNvbmRzID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gRkFMTEJBQ0tfQ09NTUlUX0RBVEU7XG5cbiAgICAgICAgbGV0IGRhdGVUaW1lRm9ybWF0dGluZzogc3RyaW5nIHwgKCh0aW1lOiBtb21lbnQuTW9tZW50KSA9PiBzdHJpbmcpO1xuXG4gICAgICAgIC8vIGFkYXB0IGRhdGVUaW1lRm9ybWF0dGluZyBiYXNlZCBvbiB0aGUgc2V0dGluZ3NcbiAgICAgICAgc3dpdGNoIChkYXRlVGltZUZvcm1hdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVGb3JtYXR0aW5nID0gREFURV9GT1JNQVQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgICAgICAgICBkYXRlVGltZUZvcm1hdHRpbmcgPSBEQVRFX1RJTUVfRk9STUFUX01JTlVURVM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY3VzdG9tXCI6XG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVGb3JtYXR0aW5nID0gZGF0ZVRpbWVGb3JtYXRDdXN0b21TdHJpbmc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibmF0dXJhbCBsYW5ndWFnZVwiOlxuICAgICAgICAgICAgICAgIGRhdGVUaW1lRm9ybWF0dGluZyA9ICh0aW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aW1lLmRpZmYobW9tZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRGbHVlbnRTdWZmaXggPSB0cnVlOyAvLyAyIHdlZWtzIC0+IDIgd2Vla3MgYWdvXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb21lbnQuZHVyYXRpb24oZGlmZikuaHVtYW5pemUoYWRkRmx1ZW50U3VmZml4KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gaW1wb3NzaWJsZUJyYW5jaChkYXRlVGltZUZvcm1hdE9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGF1dGhvcmluZ0RhdGU6IG1vbWVudC5Nb21lbnQgPSBtb21lbnQudW5peChcbiAgICAgICAgICAgIG5vblplcm9Db21taXQuYXV0aG9yLmVwb2NoU2Vjb25kc1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIG1vbWVudCB1c3VhbGx5IHNob3dzIHRoZSBhYm92ZSBhdXRob3JpbmcgZGF0ZSBpbiB0aGUgdmlld2VyIGxvY2FsIHRpbWV6b25lLlxuICAgICAgICAvLyB3aGVuIHdlIHdhbnQgdG8gc2hvdyBpdCBpbiB0aGUgYWJzb2x1dGUgVVRDIHRpbWUtem9uZSwgd2UnbGwgbmVlZCB0byBwcm92aWRlXG4gICAgICAgIC8vIGFuZCBhZGFwdCB0aGUgdXRjT2Zmc2V0XG4gICAgICAgIHN3aXRjaCAoZGF0ZVRpbWVUaW1lem9uZSkge1xuICAgICAgICAgICAgY2FzZSBcInZpZXdlci1sb2NhbFwiOiAvLyBtb21lbnQgdXNlcyBsb2NhbCB0aW1lem9uZSBieSBkZWZhdWx0LlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImF1dGhvci1sb2NhbFwiOlxuICAgICAgICAgICAgICAgIGF1dGhvcmluZ0RhdGUgPSBhdXRob3JpbmdEYXRlLnV0Y09mZnNldChcbiAgICAgICAgICAgICAgICAgICAgbm9uWmVyb0NvbW1pdC5hdXRob3IudHpcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRhdGVUaW1lRm9ybWF0dGluZyArPSBcIiBaXCI7IC8vIGFkZCBleHBsaWNpdCB0aW1lLXpvbmUsIGFzIHRoaXMgaXMgbm90IGNsZWFyIG5vdy5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ1dGMwMDAwXCI6XG4gICAgICAgICAgICAgICAgYXV0aG9yaW5nRGF0ZSA9IGF1dGhvcmluZ0RhdGUudXRjKCk7IC8vIGNvbnZlcnQgdG8gdXRjXG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVGb3JtYXR0aW5nICs9IFwiW1pdXCI7IC8vIGFkZCBcIlpcIiB0byBpbmRpY2F0ZSwgdGhhdCB0aGlzIGlzIFVUQyswMDAwIHRpbWUuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBvc3NpYmxlQnJhbmNoKGRhdGVUaW1lVGltZXpvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29tcHV0ZSBmb3JtYXR0aW5nIGJhc2VkIG9uIGRhdGVUaW1lRm9ybWF0dGluZ1xuICAgICAgICBpZiAodHlwZW9mIGRhdGVUaW1lRm9ybWF0dGluZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGF1dGhvcmluZ0RhdGUuZm9ybWF0KGRhdGVUaW1lRm9ybWF0dGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZVRpbWVGb3JtYXR0aW5nKGF1dGhvcmluZ0RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGFwdFRleHRGb3JGYWtlQ29tbWl0KFxuICAgICAgICBjb21taXQ6IEJsYW1lQ29tbWl0LFxuICAgICAgICB0b0JlUmVuZGVyZWRUZXh0OiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBcIndhaXRpbmctZm9yLXJlc3VsdFwiXG4gICAgKSB7XG4gICAgICAgIC8vIGF0dGVtcHQgdG8gdXNlIGxvbmdlc3QgdGV4dCBhcyB0ZW1wbGF0ZSBmb3IgZmFrZSBjb21taXQuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gZ2V0TG9uZ2VzdFJlbmRlcmVkR3V0dGVyKCk/LnRleHQgPz8gdG9CZVJlbmRlcmVkVGV4dDtcblxuICAgICAgICAvLyByZXBsYWNlIHRlbXBsYXRlIHdpdGggKyBvciAlIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0cyBhIHplcm8gY29tbWl0IG9yIHdhaXRpbmctZm9yLXJlc3VsdC5cbiAgICAgICAgLy8gdGhlICUgaXMgdXNlZCB0byBtYWtlIHRoZSBVSSB1cGRhdGUgZnJvbSAlIHRvIHRoZSB0cnVlIGNoYXJhY3RlcnMgdW5pbnRydXNpdmVcbiAgICAgICAgLy8gd2FpdGluZy1mb3ItcmVzdWx0IGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhbiB6ZXJvIGNvbW1pdFxuICAgICAgICBjb25zdCBmaWxsQ2hhcmFjdGVyID1cbiAgICAgICAgICAgIG9wdGlvbnMgIT09IFwid2FpdGluZy1mb3ItcmVzdWx0XCIgJiYgY29tbWl0LmlzWmVyb0NvbW1pdFxuICAgICAgICAgICAgICAgID8gTkVXX0NIQU5HRV9DSEFSQUNURVJcbiAgICAgICAgICAgICAgICA6IFVOSU5UUlVTSVZFX0NIQVJBQ1RFUl9GT1JfV0FJVElOR19SRU5ERVJJTkc7XG5cbiAgICAgICAgdG9CZVJlbmRlcmVkVGV4dCA9IG9yaWdpbmFsLnJlcGxhY2UoXG4gICAgICAgICAgICBOT05fV0hJVEVTUEFDRV9SRUdFWFAsXG4gICAgICAgICAgICBmaWxsQ2hhcmFjdGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQWRhcHQgdGhlIHRleHQgdG8gdGhlIHNhbWUgbGVuZ3RoIGFzIHByZXZpb3VzbHkgcmVuZGVyZWQgZ3V0dGVycy5cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzLCB0aGF0IHRoZSBmcmVxdWVudCBVSSB1cGRhdGVzIHdpdGggZGlmZmVyaW5nIGxpbmUgYXV0aG9yIGxlbmd0aHNcbiAgICAgICAgLy8gZG9uJ3QgZnJlcXVlbnRseSBzaGlmdCB0aGUgZ3V0dGVyIHNpemUgLSB3aGljaCB3b3VsZCBhbHNvIGNhdXNlIGRpc3RyYWN0aW5nIFVJIHVwZGF0ZXMuXG4gICAgICAgIGNvbnN0IGRlc2lyZWRUZXh0TGVuZ3RoID1cbiAgICAgICAgICAgIGxhdGVzdFNldHRpbmdzLmdldCgpPy5ndXR0ZXJTcGFjaW5nRmFsbGJhY2tMZW5ndGggPz9cbiAgICAgICAgICAgIHRvQmVSZW5kZXJlZFRleHQubGVuZ3RoO1xuXG4gICAgICAgIHRvQmVSZW5kZXJlZFRleHQgPSByZXNpemVUb0xlbmd0aChcbiAgICAgICAgICAgIHRvQmVSZW5kZXJlZFRleHQsXG4gICAgICAgICAgICBkZXNpcmVkVGV4dExlbmd0aCxcbiAgICAgICAgICAgIGZpbGxDaGFyYWN0ZXJcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBGb3IgbmV3IGNoYW5nZXMsIHNob3cgb25seSB0aGUgYSBmZXcgKyBjaGFyYWN0ZXJzLlxuICAgICAgICBpZiAob3B0aW9ucyAhPT0gXCJ3YWl0aW5nLWZvci1yZXN1bHRcIiAmJiBjb21taXQuaXNaZXJvQ29tbWl0KSB7XG4gICAgICAgICAgICBjb25zdCBudW1iZXJPZkxhc3RDaGFyYWN0ZXJzVG9LZWVwID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgZGVzaXJlZFRleHRMZW5ndGgsXG4gICAgICAgICAgICAgICAgTkVXX0NIQU5HRV9OVU1CRVJfT0ZfQ0hBUkFDVEVSU1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRvQmVSZW5kZXJlZFRleHQgPSBwcmVmaXhPZkxlbmd0aEFzV2hpdGVzcGFjZShcbiAgICAgICAgICAgICAgICB0b0JlUmVuZGVyZWRUZXh0LFxuICAgICAgICAgICAgICAgIGRlc2lyZWRUZXh0TGVuZ3RoIC0gbnVtYmVyT2ZMYXN0Q2hhcmFjdGVyc1RvS2VlcFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b0JlUmVuZGVyZWRUZXh0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIExpbmVBdXRob3JpbmdHdXR0ZXJ9LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBkaXJlY3RseSBjYWxsaW5nIHRoZSBjb25zdHJ1Y3RvcixcbiAqIGFzIHdlIGRvbid0IHdhbnQgdG8gcmUtY3JlYXRlIHRoZSBzYW1lIGluc3RhbmNlIG11bHRpcGxlIHRpbWVzLCB3aGVuZXZlciB0aGUgdXNlclxuICogc2Nyb2xscyB0aHJvdWdoIGEgZG9jdW1lbnQuIEl0IHNpbXBseSBzdG9yZXMgdGhlIGluc3RhbmNlcyBpbiB0aGUgY2FjaGUge0BsaW5rIGd1dHRlckluc3RhbmNlc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5lQXV0aG9yaW5nR3V0dGVyTWFya2VyKFxuICAgIGxhOiBFeGNsdWRlPExpbmVBdXRob3JpbmcsIFwidW50cmFja2VkXCI+LFxuICAgIHN0YXJ0TGluZTogbnVtYmVyLFxuICAgIGVuZExpbmU6IG51bWJlcixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBzZXR0aW5nczogTGluZUF1dGhvclNldHRpbmdzLFxuICAgIG9wdGlvbnM/OiBcIndhaXRpbmctZm9yLXJlc3VsdFwiXG4pIHtcbiAgICBjb25zdCBkaWdlc3QgPSBzaGEyNTYuY3JlYXRlKCk7XG4gICAgZGlnZXN0LnVwZGF0ZShPYmplY3QudmFsdWVzKHNldHRpbmdzKS5qb2luKFwiLFwiKSk7XG4gICAgZGlnZXN0LnVwZGF0ZShgcyR7c3RhcnRMaW5lfS1lJHtlbmRMaW5lfS1rJHtrZXl9LW8ke29wdGlvbnN9YCk7XG5cbiAgICBjb25zdCBjYWNoZUtleSA9IGRpZ2VzdC5oZXgoKTtcblxuICAgIGNvbnN0IGNhY2hlZCA9IGd1dHRlckluc3RhbmNlcy5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTGluZUF1dGhvcmluZ0d1dHRlcihcbiAgICAgICAgbGEsXG4gICAgICAgIHN0YXJ0TGluZSxcbiAgICAgICAgZW5kTGluZSxcbiAgICAgICAga2V5LFxuICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgb3B0aW9uc1xuICAgICk7XG4gICAgZ3V0dGVySW5zdGFuY2VzLnNldChjYWNoZUtleSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwgImltcG9ydCB7IEVkaXRvciwgTWFya2Rvd25WaWV3LCBNZW51IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBERUZBVUxUX1NFVFRJTkdTIH0gZnJvbSBcInNyYy9jb25zdGFudHNcIjtcbmltcG9ydCB7IExpbmVBdXRob3JTZXR0aW5ncyB9IGZyb20gXCJzcmMvbGluZUF1dGhvci9tb2RlbFwiO1xuaW1wb3J0IHsgZmluZEd1dHRlckVsZW1lbnRVbmRlck1vdXNlIH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL3ZpZXcvZ3V0dGVyL2d1dHRlckVsZW1lbnRTZWFyY2hcIjtcbmltcG9ydCB7IHBsdWdpblJlZiB9IGZyb20gXCJzcmMvcGx1Z2luR2xvYmFsUmVmXCI7XG5pbXBvcnQgeyBCbGFtZUNvbW1pdCB9IGZyb20gXCJzcmMvdHlwZXNcIjtcbmltcG9ydCB7IGltcG9zc2libGVCcmFuY2ggfSBmcm9tIFwic3JjL3V0aWxzXCI7XG5cbnR5cGUgQ29udGV4dE1lbnVDb25maWd1cmFibGVTZXR0aW5nc0tleXMgPVxuICAgIHwgXCJzaG93Q29tbWl0SGFzaFwiXG4gICAgfCBcImF1dGhvckRpc3BsYXlcIlxuICAgIHwgXCJkYXRlVGltZUZvcm1hdE9wdGlvbnNcIjtcblxudHlwZSBDdHhNZW51Q29tbWl0SW5mbyA9IFBpY2s8QmxhbWVDb21taXQsIFwiaGFzaFwiIHwgXCJpc1plcm9Db21taXRcIj4gJiB7XG4gICAgaXNXYWl0aW5nR3V0dGVyOiBib29sZWFuO1xufTtcbmNvbnN0IENPTU1JVF9BVFRSID0gXCJkYXRhLWNvbW1pdFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlQ29udGV4dE1lbnUoXG4gICAgbWVudTogTWVudSxcbiAgICBlZGl0b3I6IEVkaXRvcixcbiAgICBfbWR2OiBNYXJrZG93blZpZXdcbikge1xuICAgIC8vIENsaWNrIHdhcyBpbnNpZGUgdGV4dC1lZGl0b3Igd2l0aCBhY3RpdmUgY3Vyc29yLiBEb24ndCB0cmlnZ2VyIHRoZXJlLlxuICAgIGlmIChlZGl0b3IuaGFzRm9jdXMoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZ3V0dGVyRWxlbWVudCA9IGZpbmRHdXR0ZXJFbGVtZW50VW5kZXJNb3VzZSgpO1xuICAgIGlmICghZ3V0dGVyRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaW5mbyA9IGdldENvbW1pdEluZm8oZ3V0dGVyRWxlbWVudCk7XG4gICAgaWYgKCFpbmZvKSByZXR1cm47XG5cbiAgICAvLyBaZXJvLWNvbW1pdCBhbmQgd2FpdGluZy1mb3ItcmVzdWx0IG11c3Qgbm90IGJlIGNvcGllZFxuICAgIGlmICghaW5mby5pc1plcm9Db21taXQgJiYgIWluZm8uaXNXYWl0aW5nR3V0dGVyKSB7XG4gICAgICAgIGFkZENvcHlIYXNoTWVudUl0ZW0oaW5mbywgbWVudSk7XG4gICAgfVxuXG4gICAgYWRkQ29uZmlndXJhYmxlTGluZUF1dGhvclNldHRpbmdzKFwic2hvd0NvbW1pdEhhc2hcIiwgbWVudSk7XG4gICAgYWRkQ29uZmlndXJhYmxlTGluZUF1dGhvclNldHRpbmdzKFwiYXV0aG9yRGlzcGxheVwiLCBtZW51KTtcbiAgICBhZGRDb25maWd1cmFibGVMaW5lQXV0aG9yU2V0dGluZ3MoXCJkYXRlVGltZUZvcm1hdE9wdGlvbnNcIiwgbWVudSk7XG59XG5cbmZ1bmN0aW9uIGFkZENvcHlIYXNoTWVudUl0ZW0oY29tbWl0OiBDdHhNZW51Q29tbWl0SW5mbywgbWVudTogTWVudSkge1xuICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT5cbiAgICAgICAgaXRlbVxuICAgICAgICAgICAgLnNldFRpdGxlKFwiQ29weSBjb21taXQgaGFzaFwiKVxuICAgICAgICAgICAgLnNldEljb24oXCJjb3B5XCIpXG4gICAgICAgICAgICAuc2V0U2VjdGlvbihcIm9icy1naXQtbGluZS1hdXRob3ItY29weVwiKVxuICAgICAgICAgICAgLm9uQ2xpY2soKF9lKSA9PiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb21taXQuaGFzaCkpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gYWRkQ29uZmlndXJhYmxlTGluZUF1dGhvclNldHRpbmdzKFxuICAgIGtleTogQ29udGV4dE1lbnVDb25maWd1cmFibGVTZXR0aW5nc0tleXMsXG4gICAgbWVudTogTWVudVxuKSB7XG4gICAgbGV0IHRpdGxlOiBzdHJpbmc7XG4gICAgbGV0IGFjdGlvbk5ld1ZhbHVlOiBMaW5lQXV0aG9yU2V0dGluZ3NbdHlwZW9mIGtleV07XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHBsdWdpblJlZi5wbHVnaW4hLnNldHRpbmdzLmxpbmVBdXRob3I7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gc2V0dGluZ3Nba2V5XTtcbiAgICBjb25zdCBjdXJyZW50bHlTaG93biA9XG4gICAgICAgIHR5cGVvZiBjdXJyZW50VmFsdWUgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IGN1cnJlbnRWYWx1ZVxuICAgICAgICAgICAgOiBjdXJyZW50VmFsdWUgIT09IFwiaGlkZVwiO1xuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gREVGQVVMVF9TRVRUSU5HUy5saW5lQXV0aG9yW2tleV07XG5cbiAgICBpZiAoa2V5ID09PSBcInNob3dDb21taXRIYXNoXCIpIHtcbiAgICAgICAgdGl0bGUgPSBcIlNob3cgY29tbWl0IGhhc2hcIjtcbiAgICAgICAgYWN0aW9uTmV3VmFsdWUgPSA8TGluZUF1dGhvclNldHRpbmdzW1wic2hvd0NvbW1pdEhhc2hcIl0+IWN1cnJlbnRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJhdXRob3JEaXNwbGF5XCIpIHtcbiAgICAgICAgY29uc3Qgc2hvd09wdGlvbiA9IHNldHRpbmdzLmxhc3RTaG93bkF1dGhvckRpc3BsYXkgPz8gZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aXRsZSA9IFwiU2hvdyBhdXRob3IgXCIgKyAoY3VycmVudGx5U2hvd24gPyBjdXJyZW50VmFsdWUgOiBzaG93T3B0aW9uKTtcbiAgICAgICAgYWN0aW9uTmV3VmFsdWUgPSBjdXJyZW50bHlTaG93biA/IFwiaGlkZVwiIDogc2hvd09wdGlvbjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJkYXRlVGltZUZvcm1hdE9wdGlvbnNcIikge1xuICAgICAgICBjb25zdCBzaG93T3B0aW9uID1cbiAgICAgICAgICAgIHNldHRpbmdzLmxhc3RTaG93bkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA/PyBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHRpdGxlID0gXCJTaG93IFwiICsgKGN1cnJlbnRseVNob3duID8gY3VycmVudFZhbHVlIDogc2hvd09wdGlvbik7XG4gICAgICAgIHRpdGxlICs9ICF0aXRsZS5jb250YWlucyhcImRhdGVcIikgPyBcIiBkYXRlXCIgOiBcIlwiO1xuICAgICAgICBhY3Rpb25OZXdWYWx1ZSA9IGN1cnJlbnRseVNob3duID8gXCJoaWRlXCIgOiBzaG93T3B0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGltcG9zc2libGVCcmFuY2goa2V5KTtcbiAgICB9XG5cbiAgICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+XG4gICAgICAgIGl0ZW1cbiAgICAgICAgICAgIC5zZXRUaXRsZSh0aXRsZSlcbiAgICAgICAgICAgIC5zZXRTZWN0aW9uKFwib2JzLWdpdC1saW5lLWF1dGhvci1jb25maWd1cmVcIikgLy8gZ3JvdXAgc2V0dGluZ3MgdG9nZXRoZXJcbiAgICAgICAgICAgIC5zZXRDaGVja2VkKGN1cnJlbnRseVNob3duKVxuICAgICAgICAgICAgLm9uQ2xpY2soKF9lKSA9PlxuICAgICAgICAgICAgICAgIHBsdWdpblJlZi5wbHVnaW4/LnNldHRpbmdzVGFiPy5saW5lQXV0aG9yU2V0dGluZ0hhbmRsZXIoXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uTmV3VmFsdWVcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVucmljaENvbW1pdEluZm9Gb3JDb250ZXh0TWVudShcbiAgICBjb21taXQ6IEJsYW1lQ29tbWl0LFxuICAgIGlzV2FpdGluZ0d1dHRlcjogYm9vbGVhbixcbiAgICBlbHQ6IEhUTUxFbGVtZW50XG4pIHtcbiAgICBlbHQuc2V0QXR0cihcbiAgICAgICAgQ09NTUlUX0FUVFIsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KDxDdHhNZW51Q29tbWl0SW5mbz57XG4gICAgICAgICAgICBoYXNoOiBjb21taXQuaGFzaCxcbiAgICAgICAgICAgIGlzWmVyb0NvbW1pdDogY29tbWl0LmlzWmVyb0NvbW1pdCxcbiAgICAgICAgICAgIGlzV2FpdGluZ0d1dHRlcixcbiAgICAgICAgfSlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBnZXRDb21taXRJbmZvKGVsdDogSFRNTEVsZW1lbnQpOiBDdHhNZW51Q29tbWl0SW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29tbWl0SW5mb1N0ciA9IGVsdC5nZXRBdHRyKENPTU1JVF9BVFRSKTtcbiAgICByZXR1cm4gY29tbWl0SW5mb1N0ciA/IEpTT04ucGFyc2UoY29tbWl0SW5mb1N0cikgOiB1bmRlZmluZWQ7XG59XG4iLCAiaW1wb3J0IHsgYXR0YWNoZWRHdXR0ZXJFbGVtZW50cyB9IGZyb20gXCJzcmMvbGluZUF1dGhvci92aWV3L2NhY2hlXCI7XG5cbmNvbnN0IG1vdXNlWFkgPSB7IHg6IC0xMCwgeTogLTEwIH07XG5cbi8vIHRvZG8uIEFjY29yZGluZyB0byBhIGRpc2NvcmQgbWVzc2FnZSBmcm9tIHRoZSBPYnNpZGlhbiBUZWFtLCB0aGUgc291cmNlIGJ1Z1xuLy8gd2lsbCBiZSBmaXhlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiBUaGVuIHRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZC5cbi8qKlxuICogU3RvcmVzIHRoZSBsYXN0IE1vdXNlRG93bkV2ZW50IGNsaWVudFggYW5kIGNsaWVudFkgcG9zaXRpb24uXG4gKlxuICogVGhpcyBpcyBwYXJ0IG9mIHRoZSAnaGFjaycgdG8gYmUgYWJsZSB0byBkZXRlY3QgdGhlIGxpbmUgYXV0aG9yIGd1dHRlciBlbGVtZW50IGJlbG93XG4gKiB0aGUgbW91c2UgYXMgcGFydCBvZiB0aGUgY29udGV4dCBtZW51LiBUaGlzIGlzIG5lY2Vzc2FyeSwgYXMgSSBjb3VsZG4ndCBmaW5kXG4gKiBhIHdheSB0byByZXRyaWV2ZSB0aGUgdGFyZ2V0IGd1dHRlciBmcm9tIHRoZSBPYnNpZGlhbiBcImVkaXRvci1tZW51XCIgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlR3V0dGVyU2VhcmNoRm9yQ29udGV4dE1lbnVIYW5kbGluZygpIHtcbiAgICBpZiAobW91c2VYWS54ID09PSAtMTApIHtcbiAgICAgICAgLy8gZXZlbnQgbGlzdGVuZXIgaXMgbm90IHlldCByZWdpc3RlcmVkXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIChlKSA9PiB7XG4gICAgICAgICAgICBtb3VzZVhZLnggPSBlLmNsaWVudFg7XG4gICAgICAgICAgICBtb3VzZVhZLnkgPSBlLmNsaWVudFk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRHdXR0ZXJFbGVtZW50VW5kZXJNb3VzZSgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBlbHQgb2YgYXR0YWNoZWRHdXR0ZXJFbGVtZW50cykge1xuICAgICAgICBpZiAoY29udGFpbnMoZWx0LCBtb3VzZVhZKSkgcmV0dXJuIGVsdDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKGVsdDogSFRNTEVsZW1lbnQsIHB0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGVsdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4geCA8PSBwdC54ICYmIHB0LnggPD0geCArIHdpZHRoICYmIHkgPD0gcHQueSAmJiBwdC55IDw9IHkgKyBoZWlnaHQ7XG59XG4iLCAiaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCJzcmMvbWFpblwiO1xuXG4vKipcbiAqIFN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHtAbGluayBPYnNpZGlhbkdpdH0gcGx1Z2luIGdsb2JhbGx5LCBzbyB0aGF0XG4gKiB0aGUgbGluZSBhdXRob3IgZ3V0dGVyIGNvbnRleHQgbWVudSBjYW4gYWNjZXNzIGl0IGZvciBxdWljayBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgcGx1Z2luUmVmOiB7IHBsdWdpbj86IE9ic2lkaWFuR2l0IH0gPSB7fTtcbiIsICJpbXBvcnQge1xuICAgIExpbmVBdXRob3JTZXR0aW5ncyxcbiAgICBtYXhBZ2VJbkRheXNGcm9tU2V0dGluZ3MsXG59IGZyb20gXCJzcmMvbGluZUF1dGhvci9tb2RlbFwiO1xuaW1wb3J0IHsgR2l0VGltZXN0YW1wIH0gZnJvbSBcInNyYy90eXBlc1wiO1xuXG4vKipcbiAqIEdpdmVuIHRoZSBzZXR0aW5ncywgaXQgY29tcHV0ZXMgdGhlIGJhY2tncm91bmQgZ3V0dGVyIGNvbG9yIGZvciB0aGVcbiAqIG9sZGVzdCBhbmQgbmV3ZXN0IGNvbW1pdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXZpZXdDb2xvcihcbiAgICB3aGljaDogXCJvbGRlc3RcIiB8IFwibmV3ZXN0XCIsXG4gICAgc2V0dGluZ3M6IExpbmVBdXRob3JTZXR0aW5nc1xuKSB7XG4gICAgcmV0dXJuIHdoaWNoID09PSBcIm9sZGVzdFwiXG4gICAgICAgID8gY29sb3JpbmdCYXNlZE9uQ29tbWl0QWdlKDAgLyogZXBvY2ggdGltZTogMTk3MCAqLywgZmFsc2UsIHNldHRpbmdzKVxuICAgICAgICAgICAgICAuY29sb3JcbiAgICAgICAgOiBjb2xvcmluZ0Jhc2VkT25Db21taXRBZ2UodW5kZWZpbmVkLCB0cnVlLCBzZXR0aW5ncykuY29sb3I7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGByZ2JhKC4uLilgIGNvbG9yIHN0cmluZyBkZXNjcmliaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yXG4gKiBmb3IgYSBjb21taXQgdGltZXN0YW1wIHtAbGluayBHaXRUaW1lc3RhbXB9IGFuZCB0aGUgc2V0dGluZ3MuXG4gKlxuICogSXQgZmlyc3QgY29tcHV0ZXMgdGhlIGFnZSB4IChmcm9tIDAgdG8gMSkgb2YgdGhlIGNvbW1pdCB3aGVyZVxuICogMCBtZWFucyBub3cgYW5kIDEgbWVhbnMgbWF4aW11bSBhZ2UgKHNldHRpbmdzKSBvciBvbGRlci5cbiAqXG4gKiBUaGUgemVybyBjb21taXQgZ2V0cyB0aGUgYWdlIDAuXG4gKlxuICogVGhlIGNvbG9yaW5nIGlzIHRoZW4gbGluZWFybHkgaW50ZXJwb2xhdGVkIGJldHdlZW4gdGhlIHR3byBjb2xvcnMgcHJvdmlkZWQgaW4gdGhlIHNldHRpbmdzLlxuICpcbiAqIEFkZGl0aW9uYWwgbWlub3IgYWRqdXN0bWVudHMgd2VyZSBtYWRlIGZvciBkYXJrL2xpZ2h0IG1vZGUsIHRyYW5zcGFyZW5jeSwgc2NhbGluZ1xuICogYW5kIGFsc28gdXNpbmcgbW9yZSByZWQtbGlrZSBjb2xvcnMgbmVhciB0aGUgbmV3ZXIgYWdlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yaW5nQmFzZWRPbkNvbW1pdEFnZShcbiAgICBjb21taXRBdXRob3JFcG9jaFNlb25kczogR2l0VGltZXN0YW1wW1wiZXBvY2hTZWNvbmRzXCJdIHwgdW5kZWZpbmVkLFxuICAgIGlzWmVyb0NvbW1pdDogYm9vbGVhbixcbiAgICBzZXR0aW5nczogTGluZUF1dGhvclNldHRpbmdzXG4pOiB7IGNvbG9yOiBzdHJpbmc7IGRheXNTaW5jZUNvbW1pdDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IG1heEFnZUluRGF5cyA9IG1heEFnZUluRGF5c0Zyb21TZXR0aW5ncyhzZXR0aW5ncyk7XG5cbiAgICBjb25zdCBlcG9jaFNlY29uZHNOb3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICBjb25zdCBhdXRob3JpbmdFcG9jaFNlY29uZHMgPSBjb21taXRBdXRob3JFcG9jaFNlb25kcyA/PyAwO1xuXG4gICAgY29uc3Qgc2Vjb25kc1NpbmNlQ29tbWl0ID0gaXNaZXJvQ29tbWl0XG4gICAgICAgID8gMFxuICAgICAgICA6IGVwb2NoU2Vjb25kc05vdyAtIGF1dGhvcmluZ0Vwb2NoU2Vjb25kcztcblxuICAgIGNvbnN0IGRheXNTaW5jZUNvbW1pdCA9IHNlY29uZHNTaW5jZUNvbW1pdCAvIDYwIC8gNjAgLyAyNDtcblxuICAgIC8vIDAgPD0geCA8PSAxLCBsYXJnZXIgbWVhbnMgb2xkZXJcbiAgICAvLyB1c2Ugbi10aC1yb290IHRvIG1ha2UgcmVjZW50IGNoYW5nZXMgbW9yZSBwcm5vdW5jZWRcbiAgICBjb25zdCB4ID0gTWF0aC5wb3coXG4gICAgICAgIE1hdGguY2xhbXAoZGF5c1NpbmNlQ29tbWl0IC8gbWF4QWdlSW5EYXlzLCAwLCAxKSxcbiAgICAgICAgMSAvIDIuM1xuICAgICk7XG5cbiAgICBjb25zdCBkYXJrID0gaXNEYXJrTW9kZSgpO1xuXG4gICAgY29uc3QgY29sb3IwID0gc2V0dGluZ3MuY29sb3JOZXc7XG4gICAgY29uc3QgY29sb3IxID0gc2V0dGluZ3MuY29sb3JPbGQ7XG5cbiAgICBjb25zdCBzY2FsaW5nID0gZGFyayA/IDAuNCA6IDE7XG4gICAgY29uc3QgciA9IGxpbihjb2xvcjAuciwgY29sb3IxLnIsIHgpICogc2NhbGluZztcbiAgICBjb25zdCBnID0gbGluKGNvbG9yMC5nLCBjb2xvcjEuZywgeCkgKiBzY2FsaW5nO1xuICAgIGNvbnN0IGIgPSBsaW4oY29sb3IwLmIsIGNvbG9yMS5iLCB4KSAqIHNjYWxpbmc7XG4gICAgY29uc3QgYSA9IGRhcmsgPyAwLjc1IDogMC4yNTtcblxuICAgIHJldHVybiB7IGNvbG9yOiBgcmdiYSgke3J9LCR7Z30sJHtifSwke2F9KWAsIGRheXNTaW5jZUNvbW1pdCB9O1xufVxuXG5mdW5jdGlvbiBsaW4oejA6IG51bWJlciwgejE6IG51bWJlciwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gejAgKyAoejEgLSB6MCkgKiB4O1xufVxuXG5mdW5jdGlvbiBpc0RhcmtNb2RlKCkge1xuICAgIGNvbnN0IG9ic2lkaWFuID0gKDxhbnk+d2luZG93KT8uYXBwO1xuICAgIHJldHVybiBvYnNpZGlhbj8uZ2V0VGhlbWUoKSA9PT0gXCJvYnNpZGlhblwiOyAvLyBsaWdodCBtb2RlIGlzIFwibW9vbnN0b25lXCJcbn1cblxuLyoqXG4gKiBTZXQgdGhlIENTUyB2YXJpYWJsZSBgLS1vYnMtZ2l0LWd1dHRlci10ZXh0YCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZFxuICogdmFsdWUgaW4gdGhlIGxpbmUgYXV0aG9yIHNldHRpbmdzLiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIHRleHQgY29sb3JpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUZXh0Q29sb3JDc3NCYXNlZE9uU2V0dGluZyhzZXR0aW5nczogTGluZUF1dGhvclNldHRpbmdzKSB7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgXCItLW9icy1naXQtZ3V0dGVyLXRleHRcIixcbiAgICAgICAgc2V0dGluZ3MudGV4dENvbG9yQ3NzXG4gICAgKTtcbn1cbiIsICJpbXBvcnQgeyBMaW5lQXV0aG9yaW5nIH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL21vZGVsXCI7XG5pbXBvcnQgeyBCbGFtZUNvbW1pdCB9IGZyb20gXCJzcmMvdHlwZXNcIjtcblxuLyoqXG4gKiBDaG9vc2VzIHRoZSBuZXdlc3QgY29tbWl0IGZyb20gdGhlIHtAbGluayBMaW5lQXV0aG9yaW5nfSBmb3IgdGhlXG4gKiBsaW5lcyB7QGxpbmsgc3RhcnRMaW5lfSB0byB7QGxpbmsgZW5kTGluZX0gKGluY2x1c2l2ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaG9vc2VOZXdlc3RDb21taXQoXG4gICAgbGluZUF1dGhvcmluZzogRXhjbHVkZTxMaW5lQXV0aG9yaW5nLCBcInVudHJhY2tlZFwiPixcbiAgICBzdGFydExpbmU6IG51bWJlcixcbiAgICBlbmRMaW5lOiBudW1iZXJcbik6IEJsYW1lQ29tbWl0IHtcbiAgICBsZXQgbmV3ZXN0OiBCbGFtZUNvbW1pdCA9IHVuZGVmaW5lZCE7XG5cbiAgICBmb3IgKGxldCBsaW5lID0gc3RhcnRMaW5lOyBsaW5lIDw9IGVuZExpbmU7IGxpbmUrKykge1xuICAgICAgICBjb25zdCBjdXJyZW50SGFzaCA9IGxpbmVBdXRob3JpbmcuaGFzaFBlckxpbmVbbGluZV07XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb21taXQgPSBsaW5lQXV0aG9yaW5nLmNvbW1pdHMuZ2V0KGN1cnJlbnRIYXNoKSE7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW5ld2VzdCB8fFxuICAgICAgICAgICAgY3VycmVudENvbW1pdC5pc1plcm9Db21taXQgfHxcbiAgICAgICAgICAgIGlzTmV3ZXJUaGFuKGN1cnJlbnRDb21taXQsIG5ld2VzdClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBuZXdlc3QgPSBjdXJyZW50Q29tbWl0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld2VzdDtcbn1cblxuZnVuY3Rpb24gaXNOZXdlclRoYW4obGVmdDogQmxhbWVDb21taXQsIHJpZ2h0OiBCbGFtZUNvbW1pdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGwgPSBsZWZ0LmF1dGhvcj8uZXBvY2hTZWNvbmRzID8/IDA7XG4gICAgY29uc3QgciA9IHJpZ2h0LmF1dGhvcj8uZXBvY2hTZWNvbmRzID8/IDA7XG4gICAgcmV0dXJuIGwgPiByO1xufVxuIiwgImltcG9ydCB7IG1vbWVudCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gXCJzcmMvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICAgIGxhdGVzdFNldHRpbmdzLFxuICAgIExpbmVBdXRob3JpbmcsXG4gICAgTGluZUF1dGhvclNldHRpbmdzLFxuICAgIG1heEFnZUluRGF5c0Zyb21TZXR0aW5ncyxcbn0gZnJvbSBcInNyYy9saW5lQXV0aG9yL21vZGVsXCI7XG5pbXBvcnQgeyBjb21wdXRlQWRhcHRpdmVJbml0aWFsQ29sb3JpbmdBZ2VJbkRheXMgfSBmcm9tIFwic3JjL2xpbmVBdXRob3Ivdmlldy9jYWNoZVwiO1xuaW1wb3J0IHtcbiAgICBsaW5lQXV0aG9yaW5nR3V0dGVyTWFya2VyLFxuICAgIFRleHRHdXR0ZXIsXG59IGZyb20gXCJzcmMvbGluZUF1dGhvci92aWV3L2d1dHRlci9ndXR0ZXJcIjtcbmltcG9ydCB7IEJsYW1lLCBCbGFtZUNvbW1pdCwgR2l0VGltZXN0YW1wLCBVc2VyRW1haWwgfSBmcm9tIFwic3JjL3R5cGVzXCI7XG5pbXBvcnQgeyBtb21lbnRUb0Vwb2NoU2Vjb25kcyB9IGZyb20gXCJzcmMvdXRpbHNcIjtcblxuLyoqXG4gKiBUaGUgZ3V0dGVyIHVzZWQgdG8gcmVzZXJ2ZSB0aGUgc3BhY2UgdXNlZCBmb3IgdGhlIGxpbmUgYXV0aG9yaW5nIGJlZm9yZSBpdCBpcyBsb2FkZWQuXG4gKlxuICogVW50aWwgdGhlIHRydWUgbGVuZ3RoIGlzIGtub3duLCBpdCB1c2VzIHRoZSBsYXN0IHNhdmVkIGBndXR0ZXJTcGFjaW5nRmFsbGJhY2tMZW5ndGhgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbFNwYWNpbmdHdXR0ZXIoKSB7XG4gICAgY29uc3QgbGVuZ3RoID1cbiAgICAgICAgbGF0ZXN0U2V0dGluZ3MuZ2V0KCk/Lmd1dHRlclNwYWNpbmdGYWxsYmFja0xlbmd0aCA/P1xuICAgICAgICBERUZBVUxUX1NFVFRJTkdTLmxpbmVBdXRob3IuZ3V0dGVyU3BhY2luZ0ZhbGxiYWNrTGVuZ3RoO1xuICAgIHJldHVybiBuZXcgVGV4dEd1dHRlcihBcnJheShsZW5ndGgpLmZpbGwoXCItXCIpLmpvaW4oXCJcIikpO1xufVxuXG4vKipcbiAqIEluaXRpYWwgbGluZSBhdXRob3JpbmcgZ3V0dGVyIHdpdGggYWRhcHRpdmUgY29sb3JpbmcgZm9yIHNvZnRlciBVSSB1cGRhdGVzLlxuICpcbiAqICoqRE8gTk9UIENBQ0hFIFRISVMgRlVOQ1RJT04gQ0FMTCwgQVMgVEhFIEFEQVBUSVZFIENPTE9SIE5FRUQgVE8gQkUgRlJFU0hMWSBDQUxDVUxBVEVELioqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsTGluZUF1dGhvcmluZ0d1dHRlcihzZXR0aW5nczogTGluZUF1dGhvclNldHRpbmdzKSB7XG4gICAgY29uc3QgeyBsaW5lQXV0aG9yaW5nLCBhZ2VGb3JJbml0aWFsUmVuZGVyIH0gPVxuICAgICAgICBhZGFwdGl2ZUluaXRpYWxDb2xvcmVkV2FpdGluZ0xpbmVBdXRob3Jpbmcoc2V0dGluZ3MpO1xuICAgIHJldHVybiBsaW5lQXV0aG9yaW5nR3V0dGVyTWFya2VyKFxuICAgICAgICBsaW5lQXV0aG9yaW5nLFxuICAgICAgICAxLFxuICAgICAgICAxLFxuICAgICAgICBcImluaXRpYWxHdXR0ZXJcIiArIGFnZUZvckluaXRpYWxSZW5kZXIsIC8vIHVzZSBhIGFnZSBjb2xvcmluZyBiYXNlZCBjYWNoZSBrZXlcbiAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgIFwid2FpdGluZy1mb3ItcmVzdWx0XCJcbiAgICApO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsaW5lIGF1dGhvcmluZyB3aXRoIGFuIGFkYXB0aXZlIGluaXRpYWwgY29sb3IgYmFzZWQgb24ge0BsaW5rIGNvbXB1dGVBZGFwdGl2ZUluaXRpYWxDb2xvcmluZ0FnZUluRGF5c30gKHByZXZpb3VzbHkgcmVjb3JkZWQgYWdlcykuXG4gKlxuICogSWYgbm8gc3VjaCBjb2xvciBpcyBhdmFpbGFibGUsIHRoZW4gaXQgdGFrZXMgdGhlIDI1JSBvZiB0aGUgbWF4IGFnZSBhcyB0aGUgY29sb3IuXG4gKiBlLmcuIGZvciBtYXggYWdlID0gMTAwIGRheXMsIHRoaXMgbWVhbnMgaXQnbGwgdXNlIHRoZSBjb2xvciBmb3IgdGhlIGFnZSBvZiAyNSBkYXlzLlxuICogVGhpcyBjYXNlIG9ubHkgaGFwcGVucyBvbiBlYWNoIChyZS0pc3RhcnQgb2YgT2JzaWRpYW4uXG4gKlxuICogV2UgdXNlIGEgd2FpdGluZy1ndXR0ZXIsIHRvIGhhdmUgaXQgcmVuZGVyZWQgLSBzbyB0aGF0IHdlIGNhbiB1c2UgaXQncyByZW5kZXJlZCB0ZXh0XG4gKiBhbmQgdHJhbnNmb3JtIGl0IGludG8gdW5pbnRydXNpdmUgcGxhY2Vob2xkZXIgY2hhcmFjdGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0aXZlSW5pdGlhbENvbG9yZWRXYWl0aW5nTGluZUF1dGhvcmluZyhcbiAgICBzZXR0aW5nczogTGluZUF1dGhvclNldHRpbmdzXG4pOiB7XG4gICAgbGluZUF1dGhvcmluZzogRXhjbHVkZTxMaW5lQXV0aG9yaW5nLCBcInVudHJhY2tlZFwiPjtcbiAgICBhZ2VGb3JJbml0aWFsUmVuZGVyOiBudW1iZXI7XG59IHtcbiAgICBjb25zdCBhZ2VGb3JJbml0aWFsUmVuZGVyOiBudW1iZXIgPVxuICAgICAgICBjb21wdXRlQWRhcHRpdmVJbml0aWFsQ29sb3JpbmdBZ2VJbkRheXMoKSA/P1xuICAgICAgICBtYXhBZ2VJbkRheXNGcm9tU2V0dGluZ3Moc2V0dGluZ3MpICogMC4yNTtcblxuICAgIGNvbnN0IHNsaWdodGx5T2xkZXJBZ2VGb3JJbml0aWFsUmVuZGVyOiBtb21lbnQuTW9tZW50ID0gbW9tZW50KCkuYWRkKFxuICAgICAgICAtYWdlRm9ySW5pdGlhbFJlbmRlcixcbiAgICAgICAgXCJkYXlzXCJcbiAgICApO1xuXG4gICAgY29uc3QgZHVtbXlBdXRob3IgPSA8VXNlckVtYWlsICYgR2l0VGltZXN0YW1wPntcbiAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgZXBvY2hTZWNvbmRzOiBtb21lbnRUb0Vwb2NoU2Vjb25kcyhzbGlnaHRseU9sZGVyQWdlRm9ySW5pdGlhbFJlbmRlciksXG4gICAgICAgIHR6OiBcIiswMDAwXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGR1bW15Q29tbWl0ID0gPEJsYW1lQ29tbWl0PntcbiAgICAgICAgaGFzaDogXCJ3YWl0aW5nLWZvci1yZXN1bHRcIixcbiAgICAgICAgYXV0aG9yOiBkdW1teUF1dGhvcixcbiAgICAgICAgY29tbWl0dGVyOiBkdW1teUF1dGhvcixcbiAgICAgICAgaXNaZXJvQ29tbWl0OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGluZUF1dGhvcmluZzogPEJsYW1lPntcbiAgICAgICAgICAgIGhhc2hQZXJMaW5lOiBbdW5kZWZpbmVkISwgXCJ3YWl0aW5nLWZvci1yZXN1bHRcIl0sXG4gICAgICAgICAgICBjb21taXRzOiBuZXcgTWFwKFtbXCJ3YWl0aW5nLWZvci1yZXN1bHRcIiwgZHVtbXlDb21taXRdXSksXG4gICAgICAgIH0sXG4gICAgICAgIGFnZUZvckluaXRpYWxSZW5kZXIsXG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyB6ZXJvQ29tbWl0IH0gZnJvbSBcInNyYy9naXRNYW5hZ2VyL3NpbXBsZUdpdFwiO1xuaW1wb3J0IHsgTGluZUF1dGhvclNldHRpbmdzIH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL21vZGVsXCI7XG5pbXBvcnQgeyBsaW5lQXV0aG9yaW5nR3V0dGVyTWFya2VyIH0gZnJvbSBcInNyYy9saW5lQXV0aG9yL3ZpZXcvZ3V0dGVyL2d1dHRlclwiO1xuaW1wb3J0IHsgQmxhbWUgfSBmcm9tIFwic3JjL3R5cGVzXCI7XG5cbi8qKlxuICogVGhlIGd1dHRlciB0byBzaG93IG9uIHVudHJhY2tlZCBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld1VudHJhY2tlZEZpbGVHdXR0ZXIoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgc2V0dGluZ3M6IExpbmVBdXRob3JTZXR0aW5nc1xuKSB7XG4gICAgY29uc3QgZHVtbXlMaW5lQXV0aG9yaW5nID0gPEJsYW1lPntcbiAgICAgICAgaGFzaFBlckxpbmU6IFt1bmRlZmluZWQhLCBcIjAwMDAwMFwiXSxcbiAgICAgICAgY29tbWl0czogbmV3IE1hcChbW1wiMDAwMDAwXCIsIHplcm9Db21taXRdXSksXG4gICAgfTtcbiAgICByZXR1cm4gbGluZUF1dGhvcmluZ0d1dHRlck1hcmtlcihkdW1teUxpbmVBdXRob3JpbmcsIDEsIDEsIGtleSwgc2V0dGluZ3MpO1xufVxuIiwgImV4cG9ydCBjbGFzcyBQcm9taXNlUXVldWUge1xuICAgIHRhc2tzOiAoKCkgPT4gUHJvbWlzZTxhbnk+KVtdID0gW107XG5cbiAgICBhZGRUYXNrKHRhc2s6ICgpID0+IFByb21pc2U8YW55Pikge1xuICAgICAgICB0aGlzLnRhc2tzLnB1c2godGFzayk7XG4gICAgICAgIGlmICh0aGlzLnRhc2tzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVUYXNrKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgaGFuZGxlVGFzaygpIHtcbiAgICAgICAgaWYgKHRoaXMudGFza3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50YXNrc1swXSgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFza3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRhc2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7IHNldEljb24gfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBPYnNpZGlhbkdpdCBmcm9tIFwiLi9tYWluXCI7XG5pbXBvcnQgeyBQbHVnaW5TdGF0ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmludGVyZmFjZSBTdGF0dXNCYXJNZXNzYWdlIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgdGltZW91dDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhdHVzQmFyIHtcbiAgICBwcml2YXRlIG1lc3NhZ2VzOiBTdGF0dXNCYXJNZXNzYWdlW10gPSBbXTtcbiAgICBwcml2YXRlIGN1cnJlbnRNZXNzYWdlOiBTdGF0dXNCYXJNZXNzYWdlIHwgbnVsbDtcbiAgICBwcml2YXRlIGxhc3RDb21taXRUaW1lc3RhbXA/OiBEYXRlO1xuICAgIHByaXZhdGUgdW5QdXNoZWRDb21taXRzPzogbnVtYmVyO1xuICAgIHB1YmxpYyBsYXN0TWVzc2FnZVRpbWVzdGFtcDogbnVtYmVyIHwgbnVsbDtcbiAgICBwcml2YXRlIGJhc2UgPSBcIm9ic2lkaWFuLWdpdC1zdGF0dXNiYXItXCI7XG4gICAgcHJpdmF0ZSBpY29uRWw6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgdGV4dEVsOiBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHN0YXR1c0JhckVsOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW46IE9ic2lkaWFuR2l0XG4gICAgKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0QXR0cmlidXRlKFwiZGF0YS10b29sdGlwLXBvc2l0aW9uXCIsIFwidG9wXCIpO1xuXG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJnaXQtcmVmcmVzaFwiLCB0aGlzLnJlZnJlc2hDb21taXRUaW1lc3RhbXAuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3BsYXlNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgdGltZW91dDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgR2l0OiAke21lc3NhZ2Uuc2xpY2UoMCwgMTAwKX1gLFxuICAgICAgICAgICAgdGltZW91dDogdGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwbGF5KCkge1xuICAgICAgICBpZiAodGhpcy5tZXNzYWdlcy5sZW5ndGggPiAwICYmICF0aGlzLmN1cnJlbnRNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlID0gdGhpcy5tZXNzYWdlcy5zaGlmdCgpIGFzIFN0YXR1c0Jhck1lc3NhZ2U7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFkZENsYXNzKHRoaXMuYmFzZSArIFwibWVzc2FnZVwiKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuYXJpYUxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dCh0aGlzLmN1cnJlbnRNZXNzYWdlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5sYXN0TWVzc2FnZVRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50TWVzc2FnZSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUFnZSA9XG4gICAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtICh0aGlzLmxhc3RNZXNzYWdlVGltZXN0YW1wIGFzIG51bWJlcik7XG4gICAgICAgICAgICBpZiAobWVzc2FnZUFnZSA+PSB0aGlzLmN1cnJlbnRNZXNzYWdlLnRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RNZXNzYWdlVGltZXN0YW1wID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheVN0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc3BsYXlTdGF0ZSgpIHtcbiAgICAgICAgLy9NZXNzYWdlcyBoYXZlIHRvIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBzdGF0ZSBpcyBzZXRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5nZXRUZXh0KCkubGVuZ3RoID4gMyB8fFxuICAgICAgICAgICAgIXRoaXMuc3RhdHVzQmFyRWwuaGFzQ2hpbGROb2RlcygpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5lbXB0eSgpO1xuXG4gICAgICAgICAgICB0aGlzLmljb25FbCA9IHRoaXMuc3RhdHVzQmFyRWwuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICB0aGlzLnRleHRFbCA9IHRoaXMuc3RhdHVzQmFyRWwuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICB0aGlzLnRleHRFbC5zdHlsZS5mbG9hdCA9IFwicmlnaHRcIjtcbiAgICAgICAgICAgIHRoaXMudGV4dEVsLnN0eWxlLm1hcmdpbkxlZnQgPSBcIjVweFwiO1xuICAgICAgICAgICAgdGhpcy5pY29uRWwuc3R5bGUuZmxvYXQgPSBcImxlZnRcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbHVnaW4uc3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUuaWRsZTpcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGcm9tTm93KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsdWdpblN0YXRlLnN0YXR1czpcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFyaWFMYWJlbCA9IFwiQ2hlY2tpbmcgcmVwb3NpdG9yeSBzdGF0dXMuLi5cIjtcbiAgICAgICAgICAgICAgICBzZXRJY29uKHRoaXMuaWNvbkVsLCBcInJlZnJlc2gtY3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5hZGRDbGFzcyh0aGlzLmJhc2UgKyBcInN0YXR1c1wiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUuYWRkOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuYXJpYUxhYmVsID0gXCJBZGRpbmcgZmlsZXMuLi5cIjtcbiAgICAgICAgICAgICAgICBzZXRJY29uKHRoaXMuaWNvbkVsLCBcInJlZnJlc2gtd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFkZENsYXNzKHRoaXMuYmFzZSArIFwiYWRkXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbHVnaW5TdGF0ZS5jb21taXQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5hcmlhTGFiZWwgPSBcIkNvbW1pdHRpbmcgY2hhbmdlcy4uLlwiO1xuICAgICAgICAgICAgICAgIHNldEljb24odGhpcy5pY29uRWwsIFwiZ2l0LWNvbW1pdFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFkZENsYXNzKHRoaXMuYmFzZSArIFwiY29tbWl0XCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbHVnaW5TdGF0ZS5wdXNoOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuYXJpYUxhYmVsID0gXCJQdXNoaW5nIGNoYW5nZXMuLi5cIjtcbiAgICAgICAgICAgICAgICBzZXRJY29uKHRoaXMuaWNvbkVsLCBcInVwbG9hZFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFkZENsYXNzKHRoaXMuYmFzZSArIFwicHVzaFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUucHVsbDpcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFyaWFMYWJlbCA9IFwiUHVsbGluZyBjaGFuZ2VzLi4uXCI7XG4gICAgICAgICAgICAgICAgc2V0SWNvbih0aGlzLmljb25FbCwgXCJkb3dubG9hZFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFkZENsYXNzKHRoaXMuYmFzZSArIFwicHVsbFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUuY29uZmxpY3RlZDpcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFyaWFMYWJlbCA9IFwiWW91IGhhdmUgY29uZmxpY3QgZmlsZXMuLi5cIjtcbiAgICAgICAgICAgICAgICBzZXRJY29uKHRoaXMuaWNvbkVsLCBcImFsZXJ0LWNpcmNsZVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFkZENsYXNzKHRoaXMuYmFzZSArIFwiY29uZmxpY3RcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuYXJpYUxhYmVsID0gXCJGYWlsZWQgb24gaW5pdGlhbGl6YXRpb24hXCI7XG4gICAgICAgICAgICAgICAgc2V0SWNvbih0aGlzLmljb25FbCwgXCJhbGVydC10cmlhbmdsZVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFkZENsYXNzKHRoaXMuYmFzZSArIFwiZmFpbGVkLWluaXRcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc3BsYXlGcm9tTm93KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmxhc3RDb21taXRUaW1lc3RhbXA7XG4gICAgICAgIGlmICh0aW1lc3RhbXApIHtcbiAgICAgICAgICAgIGNvbnN0IG1vbWVudCA9ICh3aW5kb3cgYXMgYW55KS5tb21lbnQ7XG4gICAgICAgICAgICBjb25zdCBmcm9tTm93ID0gbW9tZW50KHRpbWVzdGFtcCkuZnJvbU5vdygpO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5hcmlhTGFiZWwgPSBgJHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5vZmZsaW5lTW9kZSA/IFwiT2ZmbGluZTogXCIgOiBcIlwiXG4gICAgICAgICAgICB9TGFzdCBDb21taXQ6ICR7ZnJvbU5vd31gO1xuXG4gICAgICAgICAgICBpZiAodGhpcy51blB1c2hlZENvbW1pdHMgPz8gMCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLmFyaWFMYWJlbCArPSBgXFxuKCR7dGhpcy51blB1c2hlZENvbW1pdHN9IHVucHVzaGVkIGNvbW1pdHMpYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuYXJpYUxhYmVsID0gdGhpcy5wbHVnaW4ub2ZmbGluZU1vZGVcbiAgICAgICAgICAgICAgICA/IFwiR2l0IGlzIG9mZmxpbmVcIlxuICAgICAgICAgICAgICAgIDogXCJHaXQgaXMgcmVhZHlcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbi5vZmZsaW5lTW9kZSkge1xuICAgICAgICAgICAgc2V0SWNvbih0aGlzLmljb25FbCwgXCJnbG9iZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldEljb24odGhpcy5pY29uRWwsIFwiY2hlY2tcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuY2hhbmdlZEZpbGVzSW5TdGF0dXNCYXIgJiZcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmNhY2hlZFN0YXR1c1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEVsLnNldFRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY2FjaGVkU3RhdHVzLmNoYW5nZWQubGVuZ3RoLnRvU3RyaW5nKClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5hZGRDbGFzcyh0aGlzLmJhc2UgKyBcImlkbGVcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWZyZXNoQ29tbWl0VGltZXN0YW1wKCkge1xuICAgICAgICB0aGlzLmxhc3RDb21taXRUaW1lc3RhbXAgPVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uZ2l0TWFuYWdlci5nZXRMYXN0Q29tbWl0VGltZSgpO1xuICAgICAgICB0aGlzLnVuUHVzaGVkQ29tbWl0cyA9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5naXRNYW5hZ2VyLmdldFVucHVzaGVkQ29tbWl0cygpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBGdXp6eVN1Z2dlc3RNb2RhbCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCJzcmMvbWFpblwiO1xuaW1wb3J0IHsgRmlsZVN0YXR1c1Jlc3VsdCB9IGZyb20gXCJzcmMvdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZWRGaWxlc01vZGFsIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8RmlsZVN0YXR1c1Jlc3VsdD4ge1xuICAgIHBsdWdpbjogT2JzaWRpYW5HaXQ7XG4gICAgY2hhbmdlZEZpbGVzOiBGaWxlU3RhdHVzUmVzdWx0W107XG5cbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IE9ic2lkaWFuR2l0LCBjaGFuZ2VkRmlsZXM6IEZpbGVTdGF0dXNSZXN1bHRbXSkge1xuICAgICAgICBzdXBlcihwbHVnaW4uYXBwKTtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgICAgIHRoaXMuY2hhbmdlZEZpbGVzID0gY2hhbmdlZEZpbGVzO1xuICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKFxuICAgICAgICAgICAgXCJOb3Qgc3VwcG9ydGVkIGZpbGVzIHdpbGwgYmUgb3BlbmVkIGJ5IGRlZmF1bHQgYXBwIVwiXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0SXRlbXMoKTogRmlsZVN0YXR1c1Jlc3VsdFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlZEZpbGVzO1xuICAgIH1cblxuICAgIGdldEl0ZW1UZXh0KGl0ZW06IEZpbGVTdGF0dXNSZXN1bHQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoaXRlbS5pbmRleCA9PSBcIlVcIiAmJiBpdGVtLndvcmtpbmdfZGlyID09IFwiVVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYFVudHJhY2tlZCB8ICR7aXRlbS52YXVsdF9wYXRofWA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgd29ya2luZ19kaXIgPSBcIlwiO1xuICAgICAgICBsZXQgaW5kZXggPSBcIlwiO1xuXG4gICAgICAgIGlmIChpdGVtLndvcmtpbmdfZGlyICE9IFwiIFwiKVxuICAgICAgICAgICAgd29ya2luZ19kaXIgPSBgV29ya2luZyBEaXI6ICR7aXRlbS53b3JraW5nX2Rpcn0gYDtcbiAgICAgICAgaWYgKGl0ZW0uaW5kZXggIT0gXCIgXCIpIGluZGV4ID0gYEluZGV4OiAke2l0ZW0uaW5kZXh9YDtcblxuICAgICAgICByZXR1cm4gYCR7d29ya2luZ19kaXJ9JHtpbmRleH0gfCAke2l0ZW0udmF1bHRfcGF0aH1gO1xuICAgIH1cblxuICAgIG9uQ2hvb3NlSXRlbShpdGVtOiBGaWxlU3RhdHVzUmVzdWx0LCBfOiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChcbiAgICAgICAgICAgICAgICBpdGVtLnZhdWx0X3BhdGgsXG4gICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgKSA9PSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgICAgKHRoaXMuYXBwIGFzIGFueSkub3BlbldpdGhEZWZhdWx0QXBwKGl0ZW0udmF1bHRfcGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5hcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChpdGVtLnZhdWx0X3BhdGgsIFwiL1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTdWdnZXN0TW9kYWwgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBPYnNpZGlhbkdpdCBmcm9tIFwic3JjL21haW5cIjtcblxuZXhwb3J0IGNsYXNzIEN1c3RvbU1lc3NhZ2VNb2RhbCBleHRlbmRzIFN1Z2dlc3RNb2RhbDxzdHJpbmc+IHtcbiAgICBwbHVnaW46IE9ic2lkaWFuR2l0O1xuXG4gICAgcmVzb2x2ZTpcbiAgICAgICAgfCAoKHZhbHVlOiBzdHJpbmcgfCBQcm9taXNlTGlrZTxzdHJpbmc+IHwgdW5kZWZpbmVkKSA9PiB2b2lkKVxuICAgICAgICB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwbHVnaW46IE9ic2lkaWFuR2l0LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGZyb21BdXRvQmFja3VwOiBib29sZWFuXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKHBsdWdpbi5hcHApO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgdGhpcy5zZXRQbGFjZWhvbGRlcihcbiAgICAgICAgICAgIFwiVHlwZSB5b3VyIG1lc3NhZ2UgYW5kIHNlbGVjdCBvcHRpb25hbCB0aGUgdmVyc2lvbiB3aXRoIHRoZSBhZGRlZCBkYXRlLlwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIG9wZW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgc3VwZXIub3BlbigpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc29sdmUpIHRoaXMucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHNlbGVjdFN1Z2dlc3Rpb24odmFsdWU6IHN0cmluZywgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZXNvbHZlKSB0aGlzLnJlc29sdmUodmFsdWUpO1xuICAgICAgICBzdXBlci5zZWxlY3RTdWdnZXN0aW9uKHZhbHVlLCBldnQpO1xuICAgIH1cblxuICAgIGdldFN1Z2dlc3Rpb25zKHF1ZXJ5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSAod2luZG93IGFzIGFueSlcbiAgICAgICAgICAgIC5tb21lbnQoKVxuICAgICAgICAgICAgLmZvcm1hdCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb21taXREYXRlRm9ybWF0KTtcbiAgICAgICAgaWYgKHF1ZXJ5ID09IFwiXCIpIHF1ZXJ5ID0gXCIuLi5cIjtcbiAgICAgICAgcmV0dXJuIFtxdWVyeSwgYCR7ZGF0ZX06ICR7cXVlcnl9YCwgYCR7cXVlcnl9OiAke2RhdGV9YF07XG4gICAgfVxuXG4gICAgcmVuZGVyU3VnZ2VzdGlvbih2YWx1ZTogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgZWwuaW5uZXJUZXh0ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgb25DaG9vc2VTdWdnZXN0aW9uKGl0ZW06IHN0cmluZywgXzogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQpIHt9XG59XG4iLCAiaW1wb3J0IHsgRWRpdG9yLCBOb3RpY2UsIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBHaXRNYW5hZ2VyIH0gZnJvbSBcIi4vZ2l0TWFuYWdlci9naXRNYW5hZ2VyXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuTGluZUluR2l0SHViKFxuICAgIGVkaXRvcjogRWRpdG9yLFxuICAgIGZpbGU6IFRGaWxlLFxuICAgIG1hbmFnZXI6IEdpdE1hbmFnZXJcbikge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXREYXRhKG1hbmFnZXIpO1xuXG4gICAgaWYgKGRhdGEucmVzdWx0ID09PSBcImZhaWx1cmVcIikge1xuICAgICAgICBuZXcgTm90aWNlKGRhdGEucmVhc29uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaXNHaXRIdWIsIGJyYW5jaCwgcmVwbywgdXNlciB9ID0gZGF0YTtcbiAgICBpZiAoaXNHaXRIdWIpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IG1hbmFnZXIuZ2V0UmVsYXRpdmVSZXBvUGF0aChmaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBmcm9tID0gZWRpdG9yLmdldEN1cnNvcihcImZyb21cIikubGluZSArIDE7XG4gICAgICAgIGNvbnN0IHRvID0gZWRpdG9yLmdldEN1cnNvcihcInRvXCIpLmxpbmUgKyAxO1xuICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKFxuICAgICAgICAgICAgICAgIGBodHRwczovL2dpdGh1Yi5jb20vJHt1c2VyfS8ke3JlcG99L2Jsb2IvJHticmFuY2h9LyR7cGF0aH0/cGxhaW49MSNMJHtmcm9tfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aW5kb3cub3BlbihcbiAgICAgICAgICAgICAgICBgaHR0cHM6Ly9naXRodWIuY29tLyR7dXNlcn0vJHtyZXBvfS9ibG9iLyR7YnJhbmNofS8ke3BhdGh9P3BsYWluPTEjTCR7ZnJvbX0tTCR7dG99YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG5ldyBOb3RpY2UoXCJJdCBzZWVtcyBsaWtlIHlvdSBhcmUgbm90IHVzaW5nIEdpdEh1YlwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuSGlzdG9yeUluR2l0SHViKGZpbGU6IFRGaWxlLCBtYW5hZ2VyOiBHaXRNYW5hZ2VyKSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldERhdGEobWFuYWdlcik7XG5cbiAgICBpZiAoZGF0YS5yZXN1bHQgPT09IFwiZmFpbHVyZVwiKSB7XG4gICAgICAgIG5ldyBOb3RpY2UoZGF0YS5yZWFzb24pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBpc0dpdEh1YiwgYnJhbmNoLCByZXBvLCB1c2VyIH0gPSBkYXRhO1xuICAgIGNvbnN0IHBhdGggPSBtYW5hZ2VyLmdldFJlbGF0aXZlUmVwb1BhdGgoZmlsZS5wYXRoKTtcblxuICAgIGlmIChpc0dpdEh1Yikge1xuICAgICAgICB3aW5kb3cub3BlbihcbiAgICAgICAgICAgIGBodHRwczovL2dpdGh1Yi5jb20vJHt1c2VyfS8ke3JlcG99L2NvbW1pdHMvJHticmFuY2h9LyR7cGF0aH1gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbmV3IE5vdGljZShcIkl0IHNlZW1zIGxpa2UgeW91IGFyZSBub3QgdXNpbmcgR2l0SHViXCIpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGF0YShtYW5hZ2VyOiBHaXRNYW5hZ2VyKTogUHJvbWlzZTxcbiAgICB8IHtcbiAgICAgICAgICByZXN1bHQ6IFwic3VjY2Vzc1wiO1xuICAgICAgICAgIGlzR2l0SHViOiBib29sZWFuO1xuICAgICAgICAgIHVzZXI6IHN0cmluZztcbiAgICAgICAgICByZXBvOiBzdHJpbmc7XG4gICAgICAgICAgYnJhbmNoOiBzdHJpbmc7XG4gICAgICB9XG4gICAgfCB7IHJlc3VsdDogXCJmYWlsdXJlXCI7IHJlYXNvbjogc3RyaW5nIH1cbj4ge1xuICAgIGNvbnN0IGJyYW5jaEluZm8gPSBhd2FpdCBtYW5hZ2VyLmJyYW5jaEluZm8oKTtcbiAgICBjb25zdCByZW1vdGVCcmFuY2ggPSBicmFuY2hJbmZvLnRyYWNraW5nO1xuICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaEluZm8uY3VycmVudDtcblxuICAgIGlmIChyZW1vdGVCcmFuY2ggPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzdWx0OiBcImZhaWx1cmVcIixcbiAgICAgICAgICAgIHJlYXNvbjogXCJSZW1vdGUgYnJhbmNoIGlzIG5vdCBjb25maWd1cmVkXCIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGJyYW5jaCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXN1bHQ6IFwiZmFpbHVyZVwiLFxuICAgICAgICAgICAgcmVhc29uOiBcIkZhaWxlZCB0byBnZXQgY3VycmVudCBicmFuY2ggbmFtZVwiLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlbW90ZSA9IHJlbW90ZUJyYW5jaC5zdWJzdHJpbmcoMCwgcmVtb3RlQnJhbmNoLmluZGV4T2YoXCIvXCIpKTtcbiAgICBjb25zdCByZW1vdGVVcmwgPSAoYXdhaXQgbWFuYWdlci5nZXRDb25maWcoXG4gICAgICAgIGByZW1vdGUuJHtyZW1vdGV9LnVybGBcbiAgICApKSBhcyBzdHJpbmc7XG4gICAgLy8gVE9ETzogVGhpcyBwcm9jZXNzIGFsd2F5cyBjYXVzZXMgYSBydW50aW1lIGVycm9yIGlmIHRoZSByZW1vdGUgdXJsIGlzIG5vdCBnaXRodWIuY29tLCBzbyBpdCBzaG91bGQgYmUgZml4ZWQuXG4gICAgLy8gSG93ZXZlciwgdGhpcyBydW50aW1lIGVycm9yIGRvZXMgbm90IGhhdmUgYSBmYXRhbCBuZWdhdGl2ZSBpbXBhY3QsIHNvIHdlIHRlbXBvcmFyeSBpZ25vcmUuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IFtpc0dpdEh1YiwgaHR0cHNVc2VyLCBodHRwc1JlcG8sIHNzaFVzZXIsIHNzaFJlcG9dID0gcmVtb3RlVXJsLm1hdGNoKFxuICAgICAgICAvKD86Xmh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyguKilcXC8oLiopXFwuZ2l0JCl8KD86XlthLXpBLVpdK0BnaXRodWJcXC5jb206KC4qKVxcLyguKilcXC5naXQkKS9cbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdDogXCJzdWNjZXNzXCIsXG4gICAgICAgIGlzR2l0SHViOiAhIWlzR2l0SHViLFxuICAgICAgICByZXBvOiBodHRwc1JlcG8gfHwgc3NoUmVwbyxcbiAgICAgICAgdXNlcjogaHR0cHNVc2VyIHx8IHNzaFVzZXIsXG4gICAgICAgIGJyYW5jaDogYnJhbmNoLFxuICAgIH07XG59XG4iLCAiaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCIuLi9tYWluXCI7XG5leHBvcnQgY2xhc3MgTG9jYWxTdG9yYWdlU2V0dGluZ3Mge1xuICAgIHByaXZhdGUgcHJlZml4OiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwbHVnaW46IE9ic2lkaWFuR2l0KSB7XG4gICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5wbHVnaW4ubWFuaWZlc3QuaWQgKyBcIjpcIjtcbiAgICB9XG5cbiAgICBtaWdyYXRlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXlzID0gW1xuICAgICAgICAgICAgXCJwYXNzd29yZFwiLFxuICAgICAgICAgICAgXCJob3N0bmFtZVwiLFxuICAgICAgICAgICAgXCJjb25mbGljdFwiLFxuICAgICAgICAgICAgXCJsYXN0QXV0b1B1bGxcIixcbiAgICAgICAgICAgIFwibGFzdEF1dG9CYWNrdXBcIixcbiAgICAgICAgICAgIFwibGFzdEF1dG9QdXNoXCIsXG4gICAgICAgICAgICBcImdpdFBhdGhcIixcbiAgICAgICAgICAgIFwicGx1Z2luRGlzYWJsZWRcIixcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgY29uc3Qgb2xkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5wcmVmaXggKyBrZXkpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFwcC5sb2FkTG9jYWxTdG9yYWdlKHRoaXMucHJlZml4ICsga2V5KSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgb2xkICE9IG51bGxcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChvbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBhcHAuc2F2ZUxvY2FsU3RvcmFnZSh0aGlzLnByZWZpeCArIGtleSwgb2xkKTtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5wcmVmaXggKyBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhc3N3b3JkKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gYXBwLmxvYWRMb2NhbFN0b3JhZ2UodGhpcy5wcmVmaXggKyBcInBhc3N3b3JkXCIpO1xuICAgIH1cblxuICAgIHNldFBhc3N3b3JkKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIGFwcC5zYXZlTG9jYWxTdG9yYWdlKHRoaXMucHJlZml4ICsgXCJwYXNzd29yZFwiLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0VXNlcm5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBhcHAubG9hZExvY2FsU3RvcmFnZSh0aGlzLnByZWZpeCArIFwidXNlcm5hbWVcIik7XG4gICAgfVxuXG4gICAgc2V0VXNlcm5hbWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICByZXR1cm4gYXBwLnNhdmVMb2NhbFN0b3JhZ2UodGhpcy5wcmVmaXggKyBcInVzZXJuYW1lXCIsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXRIb3N0bmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGFwcC5sb2FkTG9jYWxTdG9yYWdlKHRoaXMucHJlZml4ICsgXCJob3N0bmFtZVwiKTtcbiAgICB9XG5cbiAgICBzZXRIb3N0bmFtZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHJldHVybiBhcHAuc2F2ZUxvY2FsU3RvcmFnZSh0aGlzLnByZWZpeCArIFwiaG9zdG5hbWVcIiwgdmFsdWUpO1xuICAgIH1cblxuICAgIGdldENvbmZsaWN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gYXBwLmxvYWRMb2NhbFN0b3JhZ2UodGhpcy5wcmVmaXggKyBcImNvbmZsaWN0XCIpID09IFwidHJ1ZVwiO1xuICAgIH1cblxuICAgIHNldENvbmZsaWN0KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHJldHVybiBhcHAuc2F2ZUxvY2FsU3RvcmFnZSh0aGlzLnByZWZpeCArIFwiY29uZmxpY3RcIiwgYCR7dmFsdWV9YCk7XG4gICAgfVxuXG4gICAgZ2V0TGFzdEF1dG9QdWxsKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gYXBwLmxvYWRMb2NhbFN0b3JhZ2UodGhpcy5wcmVmaXggKyBcImxhc3RBdXRvUHVsbFwiKTtcbiAgICB9XG5cbiAgICBzZXRMYXN0QXV0b1B1bGwodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICByZXR1cm4gYXBwLnNhdmVMb2NhbFN0b3JhZ2UodGhpcy5wcmVmaXggKyBcImxhc3RBdXRvUHVsbFwiLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0TGFzdEF1dG9CYWNrdXAoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBhcHAubG9hZExvY2FsU3RvcmFnZSh0aGlzLnByZWZpeCArIFwibGFzdEF1dG9CYWNrdXBcIik7XG4gICAgfVxuXG4gICAgc2V0TGFzdEF1dG9CYWNrdXAodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICByZXR1cm4gYXBwLnNhdmVMb2NhbFN0b3JhZ2UodGhpcy5wcmVmaXggKyBcImxhc3RBdXRvQmFja3VwXCIsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXRMYXN0QXV0b1B1c2goKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBhcHAubG9hZExvY2FsU3RvcmFnZSh0aGlzLnByZWZpeCArIFwibGFzdEF1dG9QdXNoXCIpO1xuICAgIH1cblxuICAgIHNldExhc3RBdXRvUHVzaCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHJldHVybiBhcHAuc2F2ZUxvY2FsU3RvcmFnZSh0aGlzLnByZWZpeCArIFwibGFzdEF1dG9QdXNoXCIsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXRHaXRQYXRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gYXBwLmxvYWRMb2NhbFN0b3JhZ2UodGhpcy5wcmVmaXggKyBcImdpdFBhdGhcIik7XG4gICAgfVxuXG4gICAgc2V0R2l0UGF0aCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHJldHVybiBhcHAuc2F2ZUxvY2FsU3RvcmFnZSh0aGlzLnByZWZpeCArIFwiZ2l0UGF0aFwiLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0UEFUSFBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGFwcC5sb2FkTG9jYWxTdG9yYWdlKHRoaXMucHJlZml4ICsgXCJQQVRIUGF0aHNcIik/LnNwbGl0KFwiOlwiKSA/PyBbXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldFBBVEhQYXRocyh2YWx1ZTogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIGFwcC5zYXZlTG9jYWxTdG9yYWdlKHRoaXMucHJlZml4ICsgXCJQQVRIUGF0aHNcIiwgdmFsdWUuam9pbihcIjpcIikpO1xuICAgIH1cblxuICAgIGdldEVudlZhcnMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgICAgIGFwcC5sb2FkTG9jYWxTdG9yYWdlKHRoaXMucHJlZml4ICsgXCJlbnZWYXJzXCIpID8/IFwiW11cIlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldEVudlZhcnModmFsdWU6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIHJldHVybiBhcHAuc2F2ZUxvY2FsU3RvcmFnZShcbiAgICAgICAgICAgIHRoaXMucHJlZml4ICsgXCJlbnZWYXJzXCIsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRQbHVnaW5EaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGFwcC5sb2FkTG9jYWxTdG9yYWdlKHRoaXMucHJlZml4ICsgXCJwbHVnaW5EaXNhYmxlZFwiKSA9PSBcInRydWVcIjtcbiAgICB9XG5cbiAgICBzZXRQbHVnaW5EaXNhYmxlZCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICByZXR1cm4gYXBwLnNhdmVMb2NhbFN0b3JhZ2UodGhpcy5wcmVmaXggKyBcInBsdWdpbkRpc2FibGVkXCIsIGAke3ZhbHVlfWApO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSBcImRpZmYyaHRtbFwiO1xuaW1wb3J0IHsgSXRlbVZpZXcsIFBsYXRmb3JtLCBWaWV3U3RhdGVSZXN1bHQsIFdvcmtzcGFjZUxlYWYgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IERJRkZfVklFV19DT05GSUcgfSBmcm9tIFwic3JjL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU2ltcGxlR2l0IH0gZnJvbSBcInNyYy9naXRNYW5hZ2VyL3NpbXBsZUdpdFwiO1xuaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCJzcmMvbWFpblwiO1xuaW1wb3J0IHsgRGlmZlZpZXdTdGF0ZSB9IGZyb20gXCJzcmMvdHlwZXNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlmZlZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XG4gICAgcGFyc2VyOiBET01QYXJzZXI7XG4gICAgZ2V0dGluZ0RpZmYgPSBmYWxzZTtcbiAgICBzdGF0ZTogRGlmZlZpZXdTdGF0ZTtcbiAgICBnaXRSZWZyZXNoQmluZCA9IHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpO1xuICAgIGdpdFZpZXdSZWZyZXNoQmluZCA9IHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGxlYWY6IFdvcmtzcGFjZUxlYWYsXG4gICAgICAgIHByaXZhdGUgcGx1Z2luOiBPYnNpZGlhbkdpdFxuICAgICkge1xuICAgICAgICBzdXBlcihsZWFmKTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbiA9IHRydWU7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJnaXQtcmVmcmVzaFwiLCB0aGlzLmdpdFJlZnJlc2hCaW5kKTtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihcImdpdC12aWV3LXJlZnJlc2hcIiwgdGhpcy5naXRWaWV3UmVmcmVzaEJpbmQpO1xuICAgIH1cblxuICAgIGdldFZpZXdUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBESUZGX1ZJRVdfQ09ORklHLnR5cGU7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheVRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGU/LmZpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGZpbGVOYW1lID0gdGhpcy5zdGF0ZS5maWxlLnNwbGl0KFwiL1wiKS5sYXN0KCk7XG4gICAgICAgICAgICBpZiAoZmlsZU5hbWU/LmVuZHNXaXRoKFwiLm1kXCIpKSBmaWxlTmFtZSA9IGZpbGVOYW1lLnNsaWNlKDAsIC0zKTtcblxuICAgICAgICAgICAgcmV0dXJuIERJRkZfVklFV19DT05GSUcubmFtZSArIGAgKCR7ZmlsZU5hbWV9KWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERJRkZfVklFV19DT05GSUcubmFtZTtcbiAgICB9XG5cbiAgICBnZXRJY29uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBESUZGX1ZJRVdfQ09ORklHLmljb247XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0U3RhdGUoc3RhdGU6IGFueSwgcmVzdWx0OiBWaWV3U3RhdGVSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuXG4gICAgICAgIGlmIChQbGF0Zm9ybS5pc01vYmlsZSkge1xuICAgICAgICAgICAgLy9VcGRhdGUgdmlldyB0aXRsZSBvbiBtb2JpbGUgb25seSB0byBzaG93IHRoZSBmaWxlIG5hbWUgb2YgdGhlIGRpZmZcbiAgICAgICAgICAgIHRoaXMubGVhZi52aWV3LnRpdGxlRWwudGV4dENvbnRlbnQgPSB0aGlzLmdldERpc3BsYXlUZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICBnZXRTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcImdpdC1yZWZyZXNoXCIsIHRoaXMuZ2l0UmVmcmVzaEJpbmQpO1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwiZ2l0LXZpZXctcmVmcmVzaFwiLCB0aGlzLmdpdFZpZXdSZWZyZXNoQmluZCk7XG4gICAgICAgIHJldHVybiBzdXBlci5vbkNsb3NlKCk7XG4gICAgfVxuXG4gICAgb25PcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uT3BlbigpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlPy5maWxlICYmICF0aGlzLmdldHRpbmdEaWZmICYmIHRoaXMucGx1Z2luLmdpdE1hbmFnZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0dGluZ0RpZmYgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgZGlmZiA9IGF3YWl0IHRoaXMucGx1Z2luLmdpdE1hbmFnZXIuZ2V0RGlmZlN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5maWxlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnN0YWdlZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5oYXNoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFkaWZmKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmdpdE1hbmFnZXIgaW5zdGFuY2VvZiBTaW1wbGVHaXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLnBsdWdpbi5naXRNYW5hZ2VyLmlzVHJhY2tlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tICR7dGhpcy5zdGF0ZS5maWxlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCsrKyAke3RoaXMuc3RhdGUuZmlsZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5yZWFkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmdpdE1hbmFnZXIuZ2V0UmVsYXRpdmVWYXVsdFBhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBgLS0tIC9kZXYvbnVsbFxuKysrICR7dGhpcy5zdGF0ZS5maWxlfVxuQEAgLTAsMCArMSwke2NvbnRlbnQuc3BsaXQoXCJcXG5cIikubGVuZ3RofSBAQGA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaGVhZGVyLnNwbGl0KFwiXFxuXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNvbnRlbnQuc3BsaXQoXCJcXG5cIikubWFwKChsaW5lKSA9PiBgKyR7bGluZX1gKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRpZmZFbCA9IHRoaXMucGFyc2VyXG4gICAgICAgICAgICAgICAgICAgIC5wYXJzZUZyb21TdHJpbmcoaHRtbChkaWZmKSwgXCJ0ZXh0L2h0bWxcIilcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCIuZDJoLWZpbGUtZGlmZlwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbC5hcHBlbmQoZGlmZkVsISk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZGl2ID0gdGhpcy5jb250ZW50RWwuY3JlYXRlRGl2KHsgY2xzOiAnZGlmZi1lcnInIH0pO1xuICAgICAgICAgICAgICAgIC8vIGRpdi5jcmVhdGVTcGFuKHsgdGV4dDogJ1x1MjZBMFx1RkUwRicsIGNsczogJ2RpZmYtZXJyLXNpZ24nIH0pO1xuICAgICAgICAgICAgICAgIC8vIGRpdi5jcmVhdGVFbCgnYnInKTtcbiAgICAgICAgICAgICAgICAvLyBkaXYuY3JlYXRlU3Bhbih7IHRleHQ6ICdObyBjaGFuZ2VzIHRvICcgKyB0aGlzLnN0YXRlLmZpbGUgfSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0dGluZ0RpZmYgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJmdW5jdGlvbiBEaWZmKCkge31cbkRpZmYucHJvdG90eXBlID0ge1xuICBkaWZmOiBmdW5jdGlvbiBkaWZmKG9sZFN0cmluZywgbmV3U3RyaW5nKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHZhciBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0gLy8gQWxsb3cgc3ViY2xhc3NlcyB0byBtYXNzYWdlIHRoZSBpbnB1dCBwcmlvciB0byBydW5uaW5nXG5cblxuICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcbiAgICBvbGRTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUob2xkU3RyaW5nKSk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG5ld1N0cmluZykpO1xuICAgIHZhciBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuICAgICAgICBvbGRMZW4gPSBvbGRTdHJpbmcubGVuZ3RoO1xuICAgIHZhciBlZGl0TGVuZ3RoID0gMTtcbiAgICB2YXIgbWF4RWRpdExlbmd0aCA9IG5ld0xlbiArIG9sZExlbjtcblxuICAgIGlmIChvcHRpb25zLm1heEVkaXRMZW5ndGgpIHtcbiAgICAgIG1heEVkaXRMZW5ndGggPSBNYXRoLm1pbihtYXhFZGl0TGVuZ3RoLCBvcHRpb25zLm1heEVkaXRMZW5ndGgpO1xuICAgIH1cblxuICAgIHZhciBiZXN0UGF0aCA9IFt7XG4gICAgICBuZXdQb3M6IC0xLFxuICAgICAgY29tcG9uZW50czogW11cbiAgICB9XTsgLy8gU2VlZCBlZGl0TGVuZ3RoID0gMCwgaS5lLiB0aGUgY29udGVudCBzdGFydHMgd2l0aCB0aGUgc2FtZSB2YWx1ZXNcblxuICAgIHZhciBvbGRQb3MgPSB0aGlzLmV4dHJhY3RDb21tb24oYmVzdFBhdGhbMF0sIG5ld1N0cmluZywgb2xkU3RyaW5nLCAwKTtcblxuICAgIGlmIChiZXN0UGF0aFswXS5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgLy8gSWRlbnRpdHkgcGVyIHRoZSBlcXVhbGl0eSBhbmQgdG9rZW5pemVyXG4gICAgICByZXR1cm4gZG9uZShbe1xuICAgICAgICB2YWx1ZTogdGhpcy5qb2luKG5ld1N0cmluZyksXG4gICAgICAgIGNvdW50OiBuZXdTdHJpbmcubGVuZ3RoXG4gICAgICB9XSk7XG4gICAgfSAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG5cblxuICAgIGZ1bmN0aW9uIGV4ZWNFZGl0TGVuZ3RoKCkge1xuICAgICAgZm9yICh2YXIgZGlhZ29uYWxQYXRoID0gLTEgKiBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggPD0gZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoICs9IDIpIHtcbiAgICAgICAgdmFyIGJhc2VQYXRoID0gdm9pZCAwO1xuXG4gICAgICAgIHZhciBhZGRQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0sXG4gICAgICAgICAgICByZW1vdmVQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoICsgMV0sXG4gICAgICAgICAgICBfb2xkUG9zID0gKHJlbW92ZVBhdGggPyByZW1vdmVQYXRoLm5ld1BvcyA6IDApIC0gZGlhZ29uYWxQYXRoO1xuXG4gICAgICAgIGlmIChhZGRQYXRoKSB7XG4gICAgICAgICAgLy8gTm8gb25lIGVsc2UgaXMgZ29pbmcgdG8gYXR0ZW1wdCB0byB1c2UgdGhpcyB2YWx1ZSwgY2xlYXIgaXRcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjYW5BZGQgPSBhZGRQYXRoICYmIGFkZFBhdGgubmV3UG9zICsgMSA8IG5ld0xlbixcbiAgICAgICAgICAgIGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgMCA8PSBfb2xkUG9zICYmIF9vbGRQb3MgPCBvbGRMZW47XG5cbiAgICAgICAgaWYgKCFjYW5BZGQgJiYgIWNhblJlbW92ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgcGF0aCBpcyBhIHRlcm1pbmFsIHRoZW4gcHJ1bmVcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IC8vIFNlbGVjdCB0aGUgZGlhZ29uYWwgdGhhdCB3ZSB3YW50IHRvIGJyYW5jaCBmcm9tLiBXZSBzZWxlY3QgdGhlIHByaW9yXG4gICAgICAgIC8vIHBhdGggd2hvc2UgcG9zaXRpb24gaW4gdGhlIG5ldyBzdHJpbmcgaXMgdGhlIGZhcnRoZXN0IGZyb20gdGhlIG9yaWdpblxuICAgICAgICAvLyBhbmQgZG9lcyBub3QgcGFzcyB0aGUgYm91bmRzIG9mIHRoZSBkaWZmIGdyYXBoXG5cblxuICAgICAgICBpZiAoIWNhbkFkZCB8fCBjYW5SZW1vdmUgJiYgYWRkUGF0aC5uZXdQb3MgPCByZW1vdmVQYXRoLm5ld1Bvcykge1xuICAgICAgICAgIGJhc2VQYXRoID0gY2xvbmVQYXRoKHJlbW92ZVBhdGgpO1xuICAgICAgICAgIHNlbGYucHVzaENvbXBvbmVudChiYXNlUGF0aC5jb21wb25lbnRzLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhc2VQYXRoID0gYWRkUGF0aDsgLy8gTm8gbmVlZCB0byBjbG9uZSwgd2UndmUgcHVsbGVkIGl0IGZyb20gdGhlIGxpc3RcblxuICAgICAgICAgIGJhc2VQYXRoLm5ld1BvcysrO1xuICAgICAgICAgIHNlbGYucHVzaENvbXBvbmVudChiYXNlUGF0aC5jb21wb25lbnRzLCB0cnVlLCB1bmRlZmluZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgX29sZFBvcyA9IHNlbGYuZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCk7IC8vIElmIHdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgYm90aCBzdHJpbmdzLCB0aGVuIHdlIGFyZSBkb25lXG5cbiAgICAgICAgaWYgKGJhc2VQYXRoLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIF9vbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSB0cmFjayB0aGlzIHBhdGggYXMgYSBwb3RlbnRpYWwgY2FuZGlkYXRlIGFuZCBjb250aW51ZS5cbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWRpdExlbmd0aCsrO1xuICAgIH0gLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcbiAgICAvLyBzeW5jIGFuZCBhc3luYyBtb2RlIHdoaWNoIGlzIG5ldmVyIGZ1bi4gTG9vcHMgb3ZlciBleGVjRWRpdExlbmd0aCB1bnRpbCBhIHZhbHVlXG4gICAgLy8gaXMgcHJvZHVjZWQsIG9yIHVudGlsIHRoZSBlZGl0IGxlbmd0aCBleGNlZWRzIG9wdGlvbnMubWF4RWRpdExlbmd0aCAoaWYgZ2l2ZW4pLFxuICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuXG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZWRpdExlbmd0aCA+IG1heEVkaXRMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZXhlY0VkaXRMZW5ndGgoKSkge1xuICAgICAgICAgICAgZXhlYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoZWRpdExlbmd0aCA8PSBtYXhFZGl0TGVuZ3RoKSB7XG4gICAgICAgIHZhciByZXQgPSBleGVjRWRpdExlbmd0aCgpO1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBwdXNoQ29tcG9uZW50OiBmdW5jdGlvbiBwdXNoQ29tcG9uZW50KGNvbXBvbmVudHMsIGFkZGVkLCByZW1vdmVkKSB7XG4gICAgdmFyIGxhc3QgPSBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAobGFzdCAmJiBsYXN0LmFkZGVkID09PSBhZGRlZCAmJiBsYXN0LnJlbW92ZWQgPT09IHJlbW92ZWQpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgaGVyZSBhcyB0aGUgY29tcG9uZW50IGNsb25lIG9wZXJhdGlvbiBpcyBqdXN0XG4gICAgICAvLyBhcyBzaGFsbG93IGFycmF5IGNsb25lXG4gICAgICBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV0gPSB7XG4gICAgICAgIGNvdW50OiBsYXN0LmNvdW50ICsgMSxcbiAgICAgICAgYWRkZWQ6IGFkZGVkLFxuICAgICAgICByZW1vdmVkOiByZW1vdmVkXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goe1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgYWRkZWQ6IGFkZGVkLFxuICAgICAgICByZW1vdmVkOiByZW1vdmVkXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIGV4dHJhY3RDb21tb246IGZ1bmN0aW9uIGV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpIHtcbiAgICB2YXIgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aCxcbiAgICAgICAgbmV3UG9zID0gYmFzZVBhdGgubmV3UG9zLFxuICAgICAgICBvbGRQb3MgPSBuZXdQb3MgLSBkaWFnb25hbFBhdGgsXG4gICAgICAgIGNvbW1vbkNvdW50ID0gMDtcblxuICAgIHdoaWxlIChuZXdQb3MgKyAxIDwgbmV3TGVuICYmIG9sZFBvcyArIDEgPCBvbGRMZW4gJiYgdGhpcy5lcXVhbHMobmV3U3RyaW5nW25ld1BvcyArIDFdLCBvbGRTdHJpbmdbb2xkUG9zICsgMV0pKSB7XG4gICAgICBuZXdQb3MrKztcbiAgICAgIG9sZFBvcysrO1xuICAgICAgY29tbW9uQ291bnQrKztcbiAgICB9XG5cbiAgICBpZiAoY29tbW9uQ291bnQpIHtcbiAgICAgIGJhc2VQYXRoLmNvbXBvbmVudHMucHVzaCh7XG4gICAgICAgIGNvdW50OiBjb21tb25Db3VudFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYmFzZVBhdGgubmV3UG9zID0gbmV3UG9zO1xuICAgIHJldHVybiBvbGRQb3M7XG4gIH0sXG4gIGVxdWFsczogZnVuY3Rpb24gZXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgdGhpcy5vcHRpb25zLmlnbm9yZUNhc2UgJiYgbGVmdC50b0xvd2VyQ2FzZSgpID09PSByaWdodC50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlRW1wdHk6IGZ1bmN0aW9uIHJlbW92ZUVtcHR5KGFycmF5KSB7XG4gICAgdmFyIHJldCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycmF5W2ldKSB7XG4gICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICBjYXN0SW5wdXQ6IGZ1bmN0aW9uIGNhc3RJbnB1dCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgdG9rZW5pemU6IGZ1bmN0aW9uIHRva2VuaXplKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKTtcbiAgfSxcbiAgam9pbjogZnVuY3Rpb24gam9pbihjaGFycykge1xuICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYnVpbGRWYWx1ZXMoZGlmZiwgY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHVzZUxvbmdlc3RUb2tlbikge1xuICB2YXIgY29tcG9uZW50UG9zID0gMCxcbiAgICAgIGNvbXBvbmVudExlbiA9IGNvbXBvbmVudHMubGVuZ3RoLFxuICAgICAgbmV3UG9zID0gMCxcbiAgICAgIG9sZFBvcyA9IDA7XG5cbiAgZm9yICg7IGNvbXBvbmVudFBvcyA8IGNvbXBvbmVudExlbjsgY29tcG9uZW50UG9zKyspIHtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuXG4gICAgaWYgKCFjb21wb25lbnQucmVtb3ZlZCkge1xuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQgJiYgdXNlTG9uZ2VzdFRva2VuKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IG9sZFN0cmluZ1tvbGRQb3MgKyBpXTtcbiAgICAgICAgICByZXR1cm4gb2xkVmFsdWUubGVuZ3RoID4gdmFsdWUubGVuZ3RoID8gb2xkVmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4obmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICB9XG5cbiAgICAgIG5ld1BvcyArPSBjb21wb25lbnQuY291bnQ7IC8vIENvbW1vbiBjYXNlXG5cbiAgICAgIGlmICghY29tcG9uZW50LmFkZGVkKSB7XG4gICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihvbGRTdHJpbmcuc2xpY2Uob2xkUG9zLCBvbGRQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7IC8vIFJldmVyc2UgYWRkIGFuZCByZW1vdmUgc28gcmVtb3ZlcyBhcmUgb3V0cHV0IGZpcnN0IHRvIG1hdGNoIGNvbW1vbiBjb252ZW50aW9uXG4gICAgICAvLyBUaGUgZGlmZmluZyBhbGdvcml0aG0gaXMgdGllZCB0byBhZGQgdGhlbiByZW1vdmUgb3V0cHV0IGFuZCB0aGlzIGlzIHRoZSBzaW1wbGVzdFxuICAgICAgLy8gcm91dGUgdG8gZ2V0IHRoZSBkZXNpcmVkIG91dHB1dCB3aXRoIG1pbmltYWwgb3ZlcmhlYWQuXG5cbiAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuICAgICAgICB2YXIgdG1wID0gY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXSA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBTcGVjaWFsIGNhc2UgaGFuZGxlIGZvciB3aGVuIG9uZSB0ZXJtaW5hbCBpcyBpZ25vcmVkIChpLmUuIHdoaXRlc3BhY2UpLlxuICAvLyBGb3IgdGhpcyBjYXNlIHdlIG1lcmdlIHRoZSB0ZXJtaW5hbCBpbnRvIHRoZSBwcmlvciBzdHJpbmcgYW5kIGRyb3AgdGhlIGNoYW5nZS5cbiAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3RyaW5nIG1vZGUuXG5cblxuICB2YXIgbGFzdENvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMV07XG5cbiAgaWYgKGNvbXBvbmVudExlbiA+IDEgJiYgdHlwZW9mIGxhc3RDb21wb25lbnQudmFsdWUgPT09ICdzdHJpbmcnICYmIChsYXN0Q29tcG9uZW50LmFkZGVkIHx8IGxhc3RDb21wb25lbnQucmVtb3ZlZCkgJiYgZGlmZi5lcXVhbHMoJycsIGxhc3RDb21wb25lbnQudmFsdWUpKSB7XG4gICAgY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAyXS52YWx1ZSArPSBsYXN0Q29tcG9uZW50LnZhbHVlO1xuICAgIGNvbXBvbmVudHMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50cztcbn1cblxuZnVuY3Rpb24gY2xvbmVQYXRoKHBhdGgpIHtcbiAgcmV0dXJuIHtcbiAgICBuZXdQb3M6IHBhdGgubmV3UG9zLFxuICAgIGNvbXBvbmVudHM6IHBhdGguY29tcG9uZW50cy5zbGljZSgwKVxuICB9O1xufVxuXG52YXIgY2hhcmFjdGVyRGlmZiA9IG5ldyBEaWZmKCk7XG5mdW5jdGlvbiBkaWZmQ2hhcnMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGNoYXJhY3RlckRpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlT3B0aW9ucyhvcHRpb25zLCBkZWZhdWx0cykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZWZhdWx0cy5jYWxsYmFjayA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAob3B0aW9ucykge1xuICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRzW25hbWVdID0gb3B0aW9uc1tuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdHM7XG59XG5cbi8vXG4vLyBSYW5nZXMgYW5kIGV4Y2VwdGlvbnM6XG4vLyBMYXRpbi0xIFN1cHBsZW1lbnQsIDAwODBcdTIwMTMwMEZGXG4vLyAgLSBVKzAwRDcgIFx1MDBENyBNdWx0aXBsaWNhdGlvbiBzaWduXG4vLyAgLSBVKzAwRjcgIFx1MDBGNyBEaXZpc2lvbiBzaWduXG4vLyBMYXRpbiBFeHRlbmRlZC1BLCAwMTAwXHUyMDEzMDE3RlxuLy8gTGF0aW4gRXh0ZW5kZWQtQiwgMDE4MFx1MjAxMzAyNEZcbi8vIElQQSBFeHRlbnNpb25zLCAwMjUwXHUyMDEzMDJBRlxuLy8gU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzLCAwMkIwXHUyMDEzMDJGRlxuLy8gIC0gVSswMkM3ICBcdTAyQzcgJiM3MTE7ICBDYXJvblxuLy8gIC0gVSswMkQ4ICBcdTAyRDggJiM3Mjg7ICBCcmV2ZVxuLy8gIC0gVSswMkQ5ICBcdTAyRDkgJiM3Mjk7ICBEb3QgQWJvdmVcbi8vICAtIFUrMDJEQSAgXHUwMkRBICYjNzMwOyAgUmluZyBBYm92ZVxuLy8gIC0gVSswMkRCICBcdTAyREIgJiM3MzE7ICBPZ29uZWtcbi8vICAtIFUrMDJEQyAgXHUwMkRDICYjNzMyOyAgU21hbGwgVGlsZGVcbi8vICAtIFUrMDJERCAgXHUwMkREICYjNzMzOyAgRG91YmxlIEFjdXRlIEFjY2VudFxuLy8gTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCwgMUUwMFx1MjAxMzFFRkZcblxudmFyIGV4dGVuZGVkV29yZENoYXJzID0gL15bQS1aYS16XFx4QzAtXFx1MDJDNlxcdTAyQzgtXFx1MDJEN1xcdTAyREUtXFx1MDJGRlxcdTFFMDAtXFx1MUVGRl0rJC87XG52YXIgcmVXaGl0ZXNwYWNlID0gL1xcUy87XG52YXIgd29yZERpZmYgPSBuZXcgRGlmZigpO1xuXG53b3JkRGlmZi5lcXVhbHMgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlKSB7XG4gICAgbGVmdCA9IGxlZnQudG9Mb3dlckNhc2UoKTtcbiAgICByaWdodCA9IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgdGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KGxlZnQpICYmICFyZVdoaXRlc3BhY2UudGVzdChyaWdodCk7XG59O1xuXG53b3JkRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAvLyBBbGwgd2hpdGVzcGFjZSBzeW1ib2xzIGV4Y2VwdCBuZXdsaW5lIGdyb3VwIGludG8gb25lIHRva2VuLCBlYWNoIG5ld2xpbmUgLSBpbiBzZXBhcmF0ZSB0b2tlblxuICB2YXIgdG9rZW5zID0gdmFsdWUuc3BsaXQoLyhbXlxcU1xcclxcbl0rfFsoKVtcXF17fSdcIlxcclxcbl18XFxiKS8pOyAvLyBKb2luIHRoZSBib3VuZGFyeSBzcGxpdHMgdGhhdCB3ZSBkbyBub3QgY29uc2lkZXIgdG8gYmUgYm91bmRhcmllcy4gVGhpcyBpcyBwcmltYXJpbHkgdGhlIGV4dGVuZGVkIExhdGluIGNoYXJhY3RlciBzZXQuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIG5leHQgZmllbGQgYW5kIHdlIGhhdmUgb25seSB3b3JkIGNoYXJzIGJlZm9yZSBhbmQgYWZ0ZXIsIG1lcmdlXG4gICAgaWYgKCF0b2tlbnNbaSArIDFdICYmIHRva2Vuc1tpICsgMl0gJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaV0pICYmIGV4dGVuZGVkV29yZENoYXJzLnRlc3QodG9rZW5zW2kgKyAyXSkpIHtcbiAgICAgIHRva2Vuc1tpXSArPSB0b2tlbnNbaSArIDJdO1xuICAgICAgdG9rZW5zLnNwbGljZShpICsgMSwgMik7XG4gICAgICBpLS07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn07XG5cbmZ1bmN0aW9uIGRpZmZXb3JkcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICBvcHRpb25zID0gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIHtcbiAgICBpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBkaWZmV29yZHNXaXRoU3BhY2Uob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuXG52YXIgbGluZURpZmYgPSBuZXcgRGlmZigpO1xuXG5saW5lRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcmV0TGluZXMgPSBbXSxcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7IC8vIElnbm9yZSB0aGUgZmluYWwgZW1wdHkgdG9rZW4gdGhhdCBvY2N1cnMgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggYSBuZXcgbGluZVxuXG4gIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgfSAvLyBNZXJnZSB0aGUgY29udGVudCBhbmQgbGluZSBzZXBhcmF0b3JzIGludG8gc2luZ2xlIHRva2Vuc1xuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG4gICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG4gICAgICB9XG5cbiAgICAgIHJldExpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldExpbmVzO1xufTtcblxuZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgdmFyIG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMoY2FsbGJhY2ssIHtcbiAgICBpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG5cbnZhciBzZW50ZW5jZURpZmYgPSBuZXcgRGlmZigpO1xuXG5zZW50ZW5jZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnNwbGl0KC8oXFxTLis/Wy4hP10pKD89XFxzK3wkKS8pO1xufTtcblxuZnVuY3Rpb24gZGlmZlNlbnRlbmNlcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHNlbnRlbmNlRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7XG59XG5cbnZhciBjc3NEaWZmID0gbmV3IERpZmYoKTtcblxuY3NzRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhbe306OyxdfFxccyspLyk7XG59O1xuXG5mdW5jdGlvbiBkaWZmQ3NzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICByZXR1cm4gY3NzRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICByZXR1cm4gYXJyMjtcbn1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxudmFyIG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBqc29uRGlmZiA9IG5ldyBEaWZmKCk7IC8vIERpc2NyaW1pbmF0ZSBiZXR3ZWVuIHR3byBsaW5lcyBvZiBwcmV0dHktcHJpbnRlZCwgc2VyaWFsaXplZCBKU09OIHdoZXJlIG9uZSBvZiB0aGVtIGhhcyBhXG4vLyBkYW5nbGluZyBjb21tYSBhbmQgdGhlIG90aGVyIGRvZXNuJ3QuIFR1cm5zIG91dCBpbmNsdWRpbmcgdGhlIGRhbmdsaW5nIGNvbW1hIHlpZWxkcyB0aGUgbmljZXN0IG91dHB1dDpcblxuanNvbkRpZmYudXNlTG9uZ2VzdFRva2VuID0gdHJ1ZTtcbmpzb25EaWZmLnRva2VuaXplID0gbGluZURpZmYudG9rZW5pemU7XG5cbmpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgX3RoaXMkb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgIHVuZGVmaW5lZFJlcGxhY2VtZW50ID0gX3RoaXMkb3B0aW9ucy51bmRlZmluZWRSZXBsYWNlbWVudCxcbiAgICAgIF90aGlzJG9wdGlvbnMkc3RyaW5naSA9IF90aGlzJG9wdGlvbnMuc3RyaW5naWZ5UmVwbGFjZXIsXG4gICAgICBzdHJpbmdpZnlSZXBsYWNlciA9IF90aGlzJG9wdGlvbnMkc3RyaW5naSA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKGssIHYpIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkUmVwbGFjZW1lbnQgOiB2O1xuICB9IDogX3RoaXMkb3B0aW9ucyRzdHJpbmdpO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplKHZhbHVlLCBudWxsLCBudWxsLCBzdHJpbmdpZnlSZXBsYWNlciksIHN0cmluZ2lmeVJlcGxhY2VyLCAnICAnKTtcbn07XG5cbmpzb25EaWZmLmVxdWFscyA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkge1xuICByZXR1cm4gRGlmZi5wcm90b3R5cGUuZXF1YWxzLmNhbGwoanNvbkRpZmYsIGxlZnQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIHJpZ2h0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpKTtcbn07XG5cbmZ1bmN0aW9uIGRpZmZKc29uKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKSB7XG4gIHJldHVybiBqc29uRGlmZi5kaWZmKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKTtcbn0gLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG4vLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlcGxhY2VyXG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShvYmosIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KSB7XG4gIHN0YWNrID0gc3RhY2sgfHwgW107XG4gIHJlcGxhY2VtZW50U3RhY2sgPSByZXBsYWNlbWVudFN0YWNrIHx8IFtdO1xuXG4gIGlmIChyZXBsYWNlcikge1xuICAgIG9iaiA9IHJlcGxhY2VyKGtleSwgb2JqKTtcbiAgfVxuXG4gIHZhciBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChzdGFja1tpXSA9PT0gb2JqKSB7XG4gICAgICByZXR1cm4gcmVwbGFjZW1lbnRTdGFja1tpXTtcbiAgICB9XG4gIH1cblxuICB2YXIgY2Fub25pY2FsaXplZE9iajtcblxuICBpZiAoJ1tvYmplY3QgQXJyYXldJyA9PT0gb2JqZWN0UHJvdG90eXBlVG9TdHJpbmcuY2FsbChvYmopKSB7XG4gICAgc3RhY2sucHVzaChvYmopO1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICAgIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xuICB9XG5cbiAgaWYgKG9iaiAmJiBvYmoudG9KU09OKSB7XG4gICAgb2JqID0gb2JqLnRvSlNPTigpO1xuICB9XG5cbiAgaWYgKF90eXBlb2Yob2JqKSA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XG4gICAgc3RhY2sucHVzaChvYmopO1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB7fTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG5cbiAgICB2YXIgc29ydGVkS2V5cyA9IFtdLFxuICAgICAgICBfa2V5O1xuXG4gICAgZm9yIChfa2V5IGluIG9iaikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoX2tleSkpIHtcbiAgICAgICAgc29ydGVkS2V5cy5wdXNoKF9rZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNvcnRlZEtleXMuc29ydCgpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvcnRlZEtleXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIF9rZXkgPSBzb3J0ZWRLZXlzW2ldO1xuICAgICAgY2Fub25pY2FsaXplZE9ialtfa2V5XSA9IGNhbm9uaWNhbGl6ZShvYmpbX2tleV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwgX2tleSk7XG4gICAgfVxuXG4gICAgc3RhY2sucG9wKCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBjYW5vbmljYWxpemVkT2JqID0gb2JqO1xuICB9XG5cbiAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG59XG5cbnZhciBhcnJheURpZmYgPSBuZXcgRGlmZigpO1xuXG5hcnJheURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG59O1xuXG5hcnJheURpZmYuam9pbiA9IGFycmF5RGlmZi5yZW1vdmVFbXB0eSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5mdW5jdGlvbiBkaWZmQXJyYXlzKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjaykge1xuICByZXR1cm4gYXJyYXlEaWZmLmRpZmYob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICB2YXIgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpOyAvLyBQYXJzZSBkaWZmIG1ldGFkYXRhXG5cbiAgICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgICB2YXIgbGluZSA9IGRpZmZzdHJbaV07IC8vIEZpbGUgaGVhZGVyIGZvdW5kLCBlbmQgcGFyc2luZyBkaWZmIG1ldGFkYXRhXG5cbiAgICAgIGlmICgvXihcXC1cXC1cXC18XFwrXFwrXFwrfEBAKVxccy8udGVzdChsaW5lKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gRGlmZiBpbmRleFxuXG5cbiAgICAgIHZhciBoZWFkZXIgPSAvXig/OkluZGV4OnxkaWZmKD86IC1yIFxcdyspKylcXHMrKC4rPylcXHMqJC8uZXhlYyhsaW5lKTtcblxuICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICBpbmRleC5pbmRleCA9IGhlYWRlclsxXTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH0gLy8gUGFyc2UgZmlsZSBoZWFkZXJzIGlmIHRoZXkgYXJlIGRlZmluZWQuIFVuaWZpZWQgZGlmZiByZXF1aXJlcyB0aGVtLCBidXRcbiAgICAvLyB0aGVyZSdzIG5vIHRlY2huaWNhbCBpc3N1ZXMgdG8gaGF2ZSBhbiBpc29sYXRlZCBodW5rIHdpdGhvdXQgZmlsZSBoZWFkZXJcblxuXG4gICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcbiAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpOyAvLyBQYXJzZSBodW5rc1xuXG4gICAgaW5kZXguaHVua3MgPSBbXTtcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIHZhciBfbGluZSA9IGRpZmZzdHJbaV07XG5cbiAgICAgIGlmICgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8udGVzdChfbGluZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKC9eQEAvLnRlc3QoX2xpbmUpKSB7XG4gICAgICAgIGluZGV4Lmh1bmtzLnB1c2gocGFyc2VIdW5rKCkpO1xuICAgICAgfSBlbHNlIGlmIChfbGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KF9saW5lKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFBhcnNlcyB0aGUgLS0tIGFuZCArKysgaGVhZGVycywgaWYgbm9uZSBhcmUgZm91bmQsIG5vIGxpbmVzXG4gIC8vIGFyZSBjb25zdW1lZC5cblxuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIHZhciBmaWxlSGVhZGVyID0gL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvLmV4ZWMoZGlmZnN0cltpXSk7XG5cbiAgICBpZiAoZmlsZUhlYWRlcikge1xuICAgICAgdmFyIGtleVByZWZpeCA9IGZpbGVIZWFkZXJbMV0gPT09ICctLS0nID8gJ29sZCcgOiAnbmV3JztcbiAgICAgIHZhciBkYXRhID0gZmlsZUhlYWRlclsyXS5zcGxpdCgnXFx0JywgMik7XG4gICAgICB2YXIgZmlsZU5hbWUgPSBkYXRhWzBdLnJlcGxhY2UoL1xcXFxcXFxcL2csICdcXFxcJyk7XG5cbiAgICAgIGlmICgvXlwiLipcIiQvLnRlc3QoZmlsZU5hbWUpKSB7XG4gICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyKDEsIGZpbGVOYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgfVxuXG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnRmlsZU5hbWUnXSA9IGZpbGVOYW1lO1xuICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0hlYWRlciddID0gKGRhdGFbMV0gfHwgJycpLnRyaW0oKTtcbiAgICAgIGkrKztcbiAgICB9XG4gIH0gLy8gUGFyc2VzIGEgaHVua1xuICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgaHVuay5cblxuXG4gIGZ1bmN0aW9uIHBhcnNlSHVuaygpIHtcbiAgICB2YXIgY2h1bmtIZWFkZXJJbmRleCA9IGksXG4gICAgICAgIGNodW5rSGVhZGVyTGluZSA9IGRpZmZzdHJbaSsrXSxcbiAgICAgICAgY2h1bmtIZWFkZXIgPSBjaHVua0hlYWRlckxpbmUuc3BsaXQoL0BAIC0oXFxkKykoPzosKFxcZCspKT8gXFwrKFxcZCspKD86LChcXGQrKSk/IEBALyk7XG4gICAgdmFyIGh1bmsgPSB7XG4gICAgICBvbGRTdGFydDogK2NodW5rSGVhZGVyWzFdLFxuICAgICAgb2xkTGluZXM6IHR5cGVvZiBjaHVua0hlYWRlclsyXSA9PT0gJ3VuZGVmaW5lZCcgPyAxIDogK2NodW5rSGVhZGVyWzJdLFxuICAgICAgbmV3U3RhcnQ6ICtjaHVua0hlYWRlclszXSxcbiAgICAgIG5ld0xpbmVzOiB0eXBlb2YgY2h1bmtIZWFkZXJbNF0gPT09ICd1bmRlZmluZWQnID8gMSA6ICtjaHVua0hlYWRlcls0XSxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGxpbmVkZWxpbWl0ZXJzOiBbXVxuICAgIH07IC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuXG4gICAgaWYgKGh1bmsub2xkTGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsub2xkU3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICBpZiAoaHVuay5uZXdMaW5lcyA9PT0gMCkge1xuICAgICAgaHVuay5uZXdTdGFydCArPSAxO1xuICAgIH1cblxuICAgIHZhciBhZGRDb3VudCA9IDAsXG4gICAgICAgIHJlbW92ZUNvdW50ID0gMDtcblxuICAgIGZvciAoOyBpIDwgZGlmZnN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gTGluZXMgc3RhcnRpbmcgd2l0aCAnLS0tJyBjb3VsZCBiZSBtaXN0YWtlbiBmb3IgdGhlIFwicmVtb3ZlIGxpbmVcIiBvcGVyYXRpb25cbiAgICAgIC8vIEJ1dCB0aGV5IGNvdWxkIGJlIHRoZSBoZWFkZXIgZm9yIHRoZSBuZXh0IGZpbGUuIFRoZXJlZm9yZSBwcnVuZSBzdWNoIGNhc2VzIG91dC5cbiAgICAgIGlmIChkaWZmc3RyW2ldLmluZGV4T2YoJy0tLSAnKSA9PT0gMCAmJiBpICsgMiA8IGRpZmZzdHIubGVuZ3RoICYmIGRpZmZzdHJbaSArIDFdLmluZGV4T2YoJysrKyAnKSA9PT0gMCAmJiBkaWZmc3RyW2kgKyAyXS5pbmRleE9mKCdAQCcpID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3BlcmF0aW9uID0gZGlmZnN0cltpXS5sZW5ndGggPT0gMCAmJiBpICE9IGRpZmZzdHIubGVuZ3RoIC0gMSA/ICcgJyA6IGRpZmZzdHJbaV1bMF07XG5cbiAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJyB8fCBvcGVyYXRpb24gPT09ICctJyB8fCBvcGVyYXRpb24gPT09ICcgJyB8fCBvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBodW5rLmxpbmVzLnB1c2goZGlmZnN0cltpXSk7XG4gICAgICAgIGh1bmsubGluZWRlbGltaXRlcnMucHVzaChkZWxpbWl0ZXJzW2ldIHx8ICdcXG4nKTtcblxuICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICBhZGRDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgICAgcmVtb3ZlQ291bnQrKztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICcgJykge1xuICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgICAgcmVtb3ZlQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBIYW5kbGUgdGhlIGVtcHR5IGJsb2NrIGNvdW50IGNhc2VcblxuXG4gICAgaWYgKCFhZGRDb3VudCAmJiBodW5rLm5ld0xpbmVzID09PSAxKSB7XG4gICAgICBodW5rLm5ld0xpbmVzID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIXJlbW92ZUNvdW50ICYmIGh1bmsub2xkTGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuICAgIH0gLy8gUGVyZm9ybSBvcHRpb25hbCBzYW5pdHkgY2hlY2tpbmdcblxuXG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGRlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1vdmVDb3VudCAhPT0gaHVuay5vbGRMaW5lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbW92ZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBodW5rO1xuICB9XG5cbiAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgIHBhcnNlSW5kZXgoKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0O1xufVxuXG4vLyBJdGVyYXRvciB0aGF0IHRyYXZlcnNlcyBpbiB0aGUgcmFuZ2Ugb2YgW21pbiwgbWF4XSwgc3RlcHBpbmdcbi8vIGJ5IGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdGFydCBwb3NpdGlvbi4gSS5lLiBmb3IgWzAsIDRdLCB3aXRoXG4vLyBzdGFydCBvZiAyLCB0aGlzIHdpbGwgaXRlcmF0ZSAyLCAzLCAxLCA0LCAwLlxuZnVuY3Rpb24gZGlzdGFuY2VJdGVyYXRvciAoc3RhcnQsIG1pbkxpbmUsIG1heExpbmUpIHtcbiAgdmFyIHdhbnRGb3J3YXJkID0gdHJ1ZSxcbiAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG4gICAgICBmb3J3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG4gICAgICBsb2NhbE9mZnNldCA9IDE7XG4gIHJldHVybiBmdW5jdGlvbiBpdGVyYXRvcigpIHtcbiAgICBpZiAod2FudEZvcndhcmQgJiYgIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgIGlmIChiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICBsb2NhbE9mZnNldCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FudEZvcndhcmQgPSBmYWxzZTtcbiAgICAgIH0gLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZXlvbmQgdGV4dCBsZW5ndGgsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG5cblxuICAgICAgaWYgKHN0YXJ0ICsgbG9jYWxPZmZzZXQgPD0gbWF4TGluZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGZvcndhcmRFeGhhdXN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghYmFja3dhcmRFeGhhdXN0ZWQpIHtcbiAgICAgIGlmICghZm9yd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICB3YW50Rm9yd2FyZCA9IHRydWU7XG4gICAgICB9IC8vIENoZWNrIGlmIHRyeWluZyB0byBmaXQgYmVmb3JlIHRleHQgYmVnaW5uaW5nLCBhbmQgaWYgbm90LCBjaGVjayBpdCBmaXRzXG4gICAgICAvLyBiZWZvcmUgb2Zmc2V0IGxvY2F0aW9uXG5cblxuICAgICAgaWYgKG1pbkxpbmUgPD0gc3RhcnQgLSBsb2NhbE9mZnNldCkge1xuICAgICAgICByZXR1cm4gLWxvY2FsT2Zmc2V0Kys7XG4gICAgICB9XG5cbiAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBpdGVyYXRvcigpO1xuICAgIH0gLy8gV2UgdHJpZWQgdG8gZml0IGh1bmsgYmVmb3JlIHRleHQgYmVnaW5uaW5nIGFuZCBiZXlvbmQgdGV4dCBsZW5ndGgsIHRoZW5cbiAgICAvLyBodW5rIGNhbid0IGZpdCBvbiB0aGUgdGV4dC4gUmV0dXJuIHVuZGVmaW5lZFxuXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICBpZiAodHlwZW9mIHVuaURpZmYgPT09ICdzdHJpbmcnKSB7XG4gICAgdW5pRGlmZiA9IHBhcnNlUGF0Y2godW5pRGlmZik7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh1bmlEaWZmKSkge1xuICAgIGlmICh1bmlEaWZmLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXBwbHlQYXRjaCBvbmx5IHdvcmtzIHdpdGggYSBzaW5nbGUgaW5wdXQuJyk7XG4gICAgfVxuXG4gICAgdW5pRGlmZiA9IHVuaURpZmZbMF07XG4gIH0gLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG5cblxuICB2YXIgbGluZXMgPSBzb3VyY2Uuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICBkZWxpbWl0ZXJzID0gc291cmNlLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcbiAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcbiAgICAgIGNvbXBhcmVMaW5lID0gb3B0aW9ucy5jb21wYXJlTGluZSB8fCBmdW5jdGlvbiAobGluZU51bWJlciwgbGluZSwgb3BlcmF0aW9uLCBwYXRjaENvbnRlbnQpIHtcbiAgICByZXR1cm4gbGluZSA9PT0gcGF0Y2hDb250ZW50O1xuICB9LFxuICAgICAgZXJyb3JDb3VudCA9IDAsXG4gICAgICBmdXp6RmFjdG9yID0gb3B0aW9ucy5mdXp6RmFjdG9yIHx8IDAsXG4gICAgICBtaW5MaW5lID0gMCxcbiAgICAgIG9mZnNldCA9IDAsXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBodW5rIGV4YWN0bHkgZml0cyBvbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cbiAgICovXG5cblxuICBmdW5jdGlvbiBodW5rRml0cyhodW5rLCB0b1Bvcykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmVbMF0gOiAnICcsXG4gICAgICAgICAgY29udGVudCA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIC8vIENvbnRleHQgc2FuaXR5IGNoZWNrXG4gICAgICAgIGlmICghY29tcGFyZUxpbmUodG9Qb3MgKyAxLCBsaW5lc1t0b1Bvc10sIG9wZXJhdGlvbiwgY29udGVudCkpIHtcbiAgICAgICAgICBlcnJvckNvdW50Kys7XG5cbiAgICAgICAgICBpZiAoZXJyb3JDb3VudCA+IGZ1enpGYWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIFNlYXJjaCBiZXN0IGZpdCBvZmZzZXRzIGZvciBlYWNoIGh1bmsgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9uZXNcblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaHVuayA9IGh1bmtzW2ldLFxuICAgICAgICBtYXhMaW5lID0gbGluZXMubGVuZ3RoIC0gaHVuay5vbGRMaW5lcyxcbiAgICAgICAgbG9jYWxPZmZzZXQgPSAwLFxuICAgICAgICB0b1BvcyA9IG9mZnNldCArIGh1bmsub2xkU3RhcnQgLSAxO1xuICAgIHZhciBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gU2V0IGxvd2VyIHRleHQgbGltaXQgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGh1bmssIHNvIG5leHQgb25lcyBkb24ndCB0cnlcbiAgICAvLyB0byBmaXQgb3ZlciBhbHJlYWR5IHBhdGNoZWQgdGV4dFxuXG5cbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfSAvLyBBcHBseSBwYXRjaCBodW5rc1xuXG5cbiAgdmFyIGRpZmZPZmZzZXQgPSAwO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBodW5rcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX2h1bmsgPSBodW5rc1tfaV0sXG4gICAgICAgIF90b1BvcyA9IF9odW5rLm9sZFN0YXJ0ICsgX2h1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG5cbiAgICBkaWZmT2Zmc2V0ICs9IF9odW5rLm5ld0xpbmVzIC0gX2h1bmsub2xkTGluZXM7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9odW5rLmxpbmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbGluZSA9IF9odW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmVbMF0gOiAnICcsXG4gICAgICAgICAgY29udGVudCA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSxcbiAgICAgICAgICBkZWxpbWl0ZXIgPSBfaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIF90b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICBsaW5lcy5zcGxpY2UoX3RvUG9zLCAxKTtcbiAgICAgICAgZGVsaW1pdGVycy5zcGxpY2UoX3RvUG9zLCAxKTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgbGluZXMuc3BsaWNlKF90b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKF90b1BvcywgMCwgZGVsaW1pdGVyKTtcbiAgICAgICAgX3RvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIHZhciBwcmV2aW91c09wZXJhdGlvbiA9IF9odW5rLmxpbmVzW2ogLSAxXSA/IF9odW5rLmxpbmVzW2ogLSAxXVswXSA6IG51bGw7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBIYW5kbGUgRU9GTkwgaW5zZXJ0aW9uL3JlbW92YWxcblxuXG4gIGlmIChyZW1vdmVFT0ZOTCkge1xuICAgIHdoaWxlICghbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICAgIGxpbmVzLnBvcCgpO1xuICAgICAgZGVsaW1pdGVycy5wb3AoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYWRkRU9GTkwpIHtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBkZWxpbWl0ZXJzLnB1c2goJ1xcbicpO1xuICB9XG5cbiAgZm9yICh2YXIgX2sgPSAwOyBfayA8IGxpbmVzLmxlbmd0aCAtIDE7IF9rKyspIHtcbiAgICBsaW5lc1tfa10gPSBsaW5lc1tfa10gKyBkZWxpbWl0ZXJzW19rXTtcbiAgfVxuXG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn0gLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuXG5mdW5jdGlvbiBhcHBseVBhdGNoZXModW5pRGlmZiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHVuaURpZmYgPT09ICdzdHJpbmcnKSB7XG4gICAgdW5pRGlmZiA9IHBhcnNlUGF0Y2godW5pRGlmZik7XG4gIH1cblxuICB2YXIgY3VycmVudEluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgdmFyIGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG5cbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9wdGlvbnMubG9hZEZpbGUoaW5kZXgsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZShlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzc0luZGV4KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb2Nlc3NJbmRleCgpO1xufVxuXG5mdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0aW9ucy5jb250ZXh0ID0gNDtcbiAgfVxuXG4gIHZhciBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcblxuICBpZiAoIWRpZmYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaWZmLnB1c2goe1xuICAgIHZhbHVlOiAnJyxcbiAgICBsaW5lczogW11cbiAgfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgIHJldHVybiAnICcgKyBlbnRyeTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBodW5rcyA9IFtdO1xuICB2YXIgb2xkUmFuZ2VTdGFydCA9IDAsXG4gICAgICBuZXdSYW5nZVN0YXJ0ID0gMCxcbiAgICAgIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSxcbiAgICAgIG5ld0xpbmUgPSAxO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICB2YXIgY3VycmVudCA9IGRpZmZbaV0sXG4gICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgdmFyIF9jdXJSYW5nZTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICB2YXIgcHJldiA9IGRpZmZbaSAtIDFdO1xuICAgICAgICBvbGRSYW5nZVN0YXJ0ID0gb2xkTGluZTtcbiAgICAgICAgbmV3UmFuZ2VTdGFydCA9IG5ld0xpbmU7XG5cbiAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICBjdXJSYW5nZSA9IG9wdGlvbnMuY29udGV4dCA+IDAgPyBjb250ZXh0TGluZXMocHJldi5saW5lcy5zbGljZSgtb3B0aW9ucy5jb250ZXh0KSkgOiBbXTtcbiAgICAgICAgICBvbGRSYW5nZVN0YXJ0IC09IGN1clJhbmdlLmxlbmd0aDtcbiAgICAgICAgICBuZXdSYW5nZVN0YXJ0IC09IGN1clJhbmdlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBPdXRwdXQgb3VyIGNoYW5nZXNcblxuXG4gICAgICAoX2N1clJhbmdlID0gY3VyUmFuZ2UpLnB1c2guYXBwbHkoX2N1clJhbmdlLCBfdG9Db25zdW1hYmxlQXJyYXkobGluZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICByZXR1cm4gKGN1cnJlbnQuYWRkZWQgPyAnKycgOiAnLScpICsgZW50cnk7XG4gICAgICB9KSkpOyAvLyBUcmFjayB0aGUgdXBkYXRlZCBmaWxlIHBvc2l0aW9uXG5cblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICB2YXIgX2N1clJhbmdlMjtcblxuICAgICAgICAgIC8vIE92ZXJsYXBwaW5nXG4gICAgICAgICAgKF9jdXJSYW5nZTIgPSBjdXJSYW5nZSkucHVzaC5hcHBseShfY3VyUmFuZ2UyLCBfdG9Db25zdW1hYmxlQXJyYXkoY29udGV4dExpbmVzKGxpbmVzKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfY3VyUmFuZ2UzO1xuXG4gICAgICAgICAgLy8gZW5kIHRoZSByYW5nZSBhbmQgb3V0cHV0XG4gICAgICAgICAgdmFyIGNvbnRleHRTaXplID0gTWF0aC5taW4obGluZXMubGVuZ3RoLCBvcHRpb25zLmNvbnRleHQpO1xuXG4gICAgICAgICAgKF9jdXJSYW5nZTMgPSBjdXJSYW5nZSkucHVzaC5hcHBseShfY3VyUmFuZ2UzLCBfdG9Db25zdW1hYmxlQXJyYXkoY29udGV4dExpbmVzKGxpbmVzLnNsaWNlKDAsIGNvbnRleHRTaXplKSkpKTtcblxuICAgICAgICAgIHZhciBodW5rID0ge1xuICAgICAgICAgICAgb2xkU3RhcnQ6IG9sZFJhbmdlU3RhcnQsXG4gICAgICAgICAgICBvbGRMaW5lczogb2xkTGluZSAtIG9sZFJhbmdlU3RhcnQgKyBjb250ZXh0U2l6ZSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IG5ld0xpbmUgLSBuZXdSYW5nZVN0YXJ0ICsgY29udGV4dFNpemUsXG4gICAgICAgICAgICBsaW5lczogY3VyUmFuZ2VcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICB2YXIgb2xkRU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG9sZFN0cik7XG4gICAgICAgICAgICB2YXIgbmV3RU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG5ld1N0cik7XG4gICAgICAgICAgICB2YXIgbm9ObEJlZm9yZUFkZHMgPSBsaW5lcy5sZW5ndGggPT0gMCAmJiBjdXJSYW5nZS5sZW5ndGggPiBodW5rLm9sZExpbmVzO1xuXG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFvbGRFT0ZOZXdsaW5lICYmICFub05sQmVmb3JlQWRkcyB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBodW5rcy5wdXNoKGh1bmspO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICBuZXdMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmxlbmd0aDsgaSsrKSB7XG4gICAgX2xvb3AoaSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9sZEZpbGVOYW1lOiBvbGRGaWxlTmFtZSxcbiAgICBuZXdGaWxlTmFtZTogbmV3RmlsZU5hbWUsXG4gICAgb2xkSGVhZGVyOiBvbGRIZWFkZXIsXG4gICAgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5mdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIHZhciByZXQgPSBbXTtcblxuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cblxuICByZXQucHVzaCgnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuICByZXQucHVzaCgnLS0tICcgKyBkaWZmLm9sZEZpbGVOYW1lICsgKHR5cGVvZiBkaWZmLm9sZEhlYWRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6ICdcXHQnICsgZGlmZi5vbGRIZWFkZXIpKTtcbiAgcmV0LnB1c2goJysrKyAnICsgZGlmZi5uZXdGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5uZXdIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYubmV3SGVhZGVyKSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGh1bmsgPSBkaWZmLmh1bmtzW2ldOyAvLyBVbmlmaWVkIERpZmYgRm9ybWF0IHF1aXJrOiBJZiB0aGUgY2h1bmsgc2l6ZSBpcyAwLFxuICAgIC8vIHRoZSBmaXJzdCBudW1iZXIgaXMgb25lIGxvd2VyIHRoYW4gb25lIHdvdWxkIGV4cGVjdC5cbiAgICAvLyBodHRwczovL3d3dy5hcnRpbWEuY29tL3dlYmxvZ3Mvdmlld3Bvc3QuanNwP3RocmVhZD0xNjQyOTNcblxuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuXG4gICAgaWYgKGh1bmsubmV3TGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsubmV3U3RhcnQgLT0gMTtcbiAgICB9XG5cbiAgICByZXQucHVzaCgnQEAgLScgKyBodW5rLm9sZFN0YXJ0ICsgJywnICsgaHVuay5vbGRMaW5lcyArICcgKycgKyBodW5rLm5ld1N0YXJ0ICsgJywnICsgaHVuay5uZXdMaW5lcyArICcgQEAnKTtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gZm9ybWF0UGF0Y2goc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gYXJyYXlFcXVhbChhLCBiKSB7XG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gYXJyYXlTdGFydHNXaXRoKGEsIGIpO1xufVxuZnVuY3Rpb24gYXJyYXlTdGFydHNXaXRoKGFycmF5LCBzdGFydCkge1xuICBpZiAoc3RhcnQubGVuZ3RoID4gYXJyYXkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdGFydFtpXSAhPT0gYXJyYXlbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2FsY0xpbmVDb3VudChodW5rKSB7XG4gIHZhciBfY2FsY09sZE5ld0xpbmVDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQoaHVuay5saW5lcyksXG4gICAgICBvbGRMaW5lcyA9IF9jYWxjT2xkTmV3TGluZUNvdW50Lm9sZExpbmVzLFxuICAgICAgbmV3TGluZXMgPSBfY2FsY09sZE5ld0xpbmVDb3VudC5uZXdMaW5lcztcblxuICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGh1bmsub2xkTGluZXMgPSBvbGRMaW5lcztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaHVuay5uZXdMaW5lcyA9IG5ld0xpbmVzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBodW5rLm5ld0xpbmVzO1xuICB9XG59XG5mdW5jdGlvbiBtZXJnZShtaW5lLCB0aGVpcnMsIGJhc2UpIHtcbiAgbWluZSA9IGxvYWRQYXRjaChtaW5lLCBiYXNlKTtcbiAgdGhlaXJzID0gbG9hZFBhdGNoKHRoZWlycywgYmFzZSk7XG4gIHZhciByZXQgPSB7fTsgLy8gRm9yIGluZGV4IHdlIGp1c3QgbGV0IGl0IHBhc3MgdGhyb3VnaCBhcyBpdCBkb2Vzbid0IGhhdmUgYW55IG5lY2Vzc2FyeSBtZWFuaW5nLlxuICAvLyBMZWF2aW5nIHNhbml0eSBjaGVja3Mgb24gdGhpcyB0byB0aGUgQVBJIGNvbnN1bWVyIHRoYXQgbWF5IGtub3cgbW9yZSBhYm91dCB0aGVcbiAgLy8gbWVhbmluZyBpbiB0aGVpciBvd24gY29udGV4dC5cblxuICBpZiAobWluZS5pbmRleCB8fCB0aGVpcnMuaW5kZXgpIHtcbiAgICByZXQuaW5kZXggPSBtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleDtcbiAgfVxuXG4gIGlmIChtaW5lLm5ld0ZpbGVOYW1lIHx8IHRoZWlycy5uZXdGaWxlTmFtZSkge1xuICAgIGlmICghZmlsZU5hbWVDaGFuZ2VkKG1pbmUpKSB7XG4gICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIG91cnMsIHVzZSB0aGVpcnMgKGFuZCBvdXJzIGlmIHRoZWlycyBkb2VzIG5vdCBleGlzdClcbiAgICAgIHJldC5vbGRGaWxlTmFtZSA9IHRoZWlycy5vbGRGaWxlTmFtZSB8fCBtaW5lLm9sZEZpbGVOYW1lO1xuICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gdGhlaXJzLm5ld0ZpbGVOYW1lIHx8IG1pbmUubmV3RmlsZU5hbWU7XG4gICAgICByZXQub2xkSGVhZGVyID0gdGhlaXJzLm9sZEhlYWRlciB8fCBtaW5lLm9sZEhlYWRlcjtcbiAgICAgIHJldC5uZXdIZWFkZXIgPSB0aGVpcnMubmV3SGVhZGVyIHx8IG1pbmUubmV3SGVhZGVyO1xuICAgIH0gZWxzZSBpZiAoIWZpbGVOYW1lQ2hhbmdlZCh0aGVpcnMpKSB7XG4gICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIHRoZWlycywgdXNlIG91cnNcbiAgICAgIHJldC5vbGRGaWxlTmFtZSA9IG1pbmUub2xkRmlsZU5hbWU7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSBtaW5lLm5ld0ZpbGVOYW1lO1xuICAgICAgcmV0Lm9sZEhlYWRlciA9IG1pbmUub2xkSGVhZGVyO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IG1pbmUubmV3SGVhZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb3RoIGNoYW5nZWQuLi4gZmlndXJlIGl0IG91dFxuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEZpbGVOYW1lLCB0aGVpcnMub2xkRmlsZU5hbWUpO1xuICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0ZpbGVOYW1lLCB0aGVpcnMubmV3RmlsZU5hbWUpO1xuICAgICAgcmV0Lm9sZEhlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5vbGRIZWFkZXIsIHRoZWlycy5vbGRIZWFkZXIpO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5uZXdIZWFkZXIsIHRoZWlycy5uZXdIZWFkZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldC5odW5rcyA9IFtdO1xuICB2YXIgbWluZUluZGV4ID0gMCxcbiAgICAgIHRoZWlyc0luZGV4ID0gMCxcbiAgICAgIG1pbmVPZmZzZXQgPSAwLFxuICAgICAgdGhlaXJzT2Zmc2V0ID0gMDtcblxuICB3aGlsZSAobWluZUluZGV4IDwgbWluZS5odW5rcy5sZW5ndGggfHwgdGhlaXJzSW5kZXggPCB0aGVpcnMuaHVua3MubGVuZ3RoKSB7XG4gICAgdmFyIG1pbmVDdXJyZW50ID0gbWluZS5odW5rc1ttaW5lSW5kZXhdIHx8IHtcbiAgICAgIG9sZFN0YXJ0OiBJbmZpbml0eVxuICAgIH0sXG4gICAgICAgIHRoZWlyc0N1cnJlbnQgPSB0aGVpcnMuaHVua3NbdGhlaXJzSW5kZXhdIHx8IHtcbiAgICAgIG9sZFN0YXJ0OiBJbmZpbml0eVxuICAgIH07XG5cbiAgICBpZiAoaHVua0JlZm9yZShtaW5lQ3VycmVudCwgdGhlaXJzQ3VycmVudCkpIHtcbiAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG4gICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsobWluZUN1cnJlbnQsIG1pbmVPZmZzZXQpKTtcbiAgICAgIG1pbmVJbmRleCsrO1xuICAgICAgdGhlaXJzT2Zmc2V0ICs9IG1pbmVDdXJyZW50Lm5ld0xpbmVzIC0gbWluZUN1cnJlbnQub2xkTGluZXM7XG4gICAgfSBlbHNlIGlmIChodW5rQmVmb3JlKHRoZWlyc0N1cnJlbnQsIG1pbmVDdXJyZW50KSkge1xuICAgICAgLy8gVGhpcyBwYXRjaCBkb2VzIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBvdGhlcnMsIHlheS5cbiAgICAgIHJldC5odW5rcy5wdXNoKGNsb25lSHVuayh0aGVpcnNDdXJyZW50LCB0aGVpcnNPZmZzZXQpKTtcbiAgICAgIHRoZWlyc0luZGV4Kys7XG4gICAgICBtaW5lT2Zmc2V0ICs9IHRoZWlyc0N1cnJlbnQubmV3TGluZXMgLSB0aGVpcnNDdXJyZW50Lm9sZExpbmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdmVybGFwLCBtZXJnZSBhcyBiZXN0IHdlIGNhblxuICAgICAgdmFyIG1lcmdlZEh1bmsgPSB7XG4gICAgICAgIG9sZFN0YXJ0OiBNYXRoLm1pbihtaW5lQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCksXG4gICAgICAgIG9sZExpbmVzOiAwLFxuICAgICAgICBuZXdTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQubmV3U3RhcnQgKyBtaW5lT2Zmc2V0LCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0ICsgdGhlaXJzT2Zmc2V0KSxcbiAgICAgICAgbmV3TGluZXM6IDAsXG4gICAgICAgIGxpbmVzOiBbXVxuICAgICAgfTtcbiAgICAgIG1lcmdlTGluZXMobWVyZ2VkSHVuaywgbWluZUN1cnJlbnQub2xkU3RhcnQsIG1pbmVDdXJyZW50LmxpbmVzLCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0LCB0aGVpcnNDdXJyZW50LmxpbmVzKTtcbiAgICAgIHRoZWlyc0luZGV4Kys7XG4gICAgICBtaW5lSW5kZXgrKztcbiAgICAgIHJldC5odW5rcy5wdXNoKG1lcmdlZEh1bmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGxvYWRQYXRjaChwYXJhbSwgYmFzZSkge1xuICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgIGlmICgvXkBAL20udGVzdChwYXJhbSkgfHwgL15JbmRleDovbS50ZXN0KHBhcmFtKSkge1xuICAgICAgcmV0dXJuIHBhcnNlUGF0Y2gocGFyYW0pWzBdO1xuICAgIH1cblxuICAgIGlmICghYmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYSBiYXNlIHJlZmVyZW5jZSBvciBwYXNzIGluIGEgcGF0Y2gnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RydWN0dXJlZFBhdGNoKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBiYXNlLCBwYXJhbSk7XG4gIH1cblxuICByZXR1cm4gcGFyYW07XG59XG5cbmZ1bmN0aW9uIGZpbGVOYW1lQ2hhbmdlZChwYXRjaCkge1xuICByZXR1cm4gcGF0Y2gubmV3RmlsZU5hbWUgJiYgcGF0Y2gubmV3RmlsZU5hbWUgIT09IHBhdGNoLm9sZEZpbGVOYW1lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RGaWVsZChpbmRleCwgbWluZSwgdGhlaXJzKSB7XG4gIGlmIChtaW5lID09PSB0aGVpcnMpIHtcbiAgICByZXR1cm4gbWluZTtcbiAgfSBlbHNlIHtcbiAgICBpbmRleC5jb25mbGljdCA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbmU6IG1pbmUsXG4gICAgICB0aGVpcnM6IHRoZWlyc1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaHVua0JlZm9yZSh0ZXN0LCBjaGVjaykge1xuICByZXR1cm4gdGVzdC5vbGRTdGFydCA8IGNoZWNrLm9sZFN0YXJ0ICYmIHRlc3Qub2xkU3RhcnQgKyB0ZXN0Lm9sZExpbmVzIDwgY2hlY2sub2xkU3RhcnQ7XG59XG5cbmZ1bmN0aW9uIGNsb25lSHVuayhodW5rLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBvbGRTdGFydDogaHVuay5vbGRTdGFydCxcbiAgICBvbGRMaW5lczogaHVuay5vbGRMaW5lcyxcbiAgICBuZXdTdGFydDogaHVuay5uZXdTdGFydCArIG9mZnNldCxcbiAgICBuZXdMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICBsaW5lczogaHVuay5saW5lc1xuICB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZUxpbmVzKGh1bmssIG1pbmVPZmZzZXQsIG1pbmVMaW5lcywgdGhlaXJPZmZzZXQsIHRoZWlyTGluZXMpIHtcbiAgLy8gVGhpcyB3aWxsIGdlbmVyYWxseSByZXN1bHQgaW4gYSBjb25mbGljdGVkIGh1bmssIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIGNvbnRleHRcbiAgLy8gaXMgdGhlIG9ubHkgb3ZlcmxhcCB3aGVyZSB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IG1lcmdlIHRoZSBjb250ZW50IGhlcmUuXG4gIHZhciBtaW5lID0ge1xuICAgIG9mZnNldDogbWluZU9mZnNldCxcbiAgICBsaW5lczogbWluZUxpbmVzLFxuICAgIGluZGV4OiAwXG4gIH0sXG4gICAgICB0aGVpciA9IHtcbiAgICBvZmZzZXQ6IHRoZWlyT2Zmc2V0LFxuICAgIGxpbmVzOiB0aGVpckxpbmVzLFxuICAgIGluZGV4OiAwXG4gIH07IC8vIEhhbmRsZSBhbnkgbGVhZGluZyBjb250ZW50XG5cbiAgaW5zZXJ0TGVhZGluZyhodW5rLCBtaW5lLCB0aGVpcik7XG4gIGluc2VydExlYWRpbmcoaHVuaywgdGhlaXIsIG1pbmUpOyAvLyBOb3cgaW4gdGhlIG92ZXJsYXAgY29udGVudC4gU2NhbiB0aHJvdWdoIGFuZCBzZWxlY3QgdGhlIGJlc3QgY2hhbmdlcyBmcm9tIGVhY2guXG5cbiAgd2hpbGUgKG1pbmUuaW5kZXggPCBtaW5lLmxpbmVzLmxlbmd0aCAmJiB0aGVpci5pbmRleCA8IHRoZWlyLmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBtaW5lQ3VycmVudCA9IG1pbmUubGluZXNbbWluZS5pbmRleF0sXG4gICAgICAgIHRoZWlyQ3VycmVudCA9IHRoZWlyLmxpbmVzW3RoZWlyLmluZGV4XTtcblxuICAgIGlmICgobWluZUN1cnJlbnRbMF0gPT09ICctJyB8fCBtaW5lQ3VycmVudFswXSA9PT0gJysnKSAmJiAodGhlaXJDdXJyZW50WzBdID09PSAnLScgfHwgdGhlaXJDdXJyZW50WzBdID09PSAnKycpKSB7XG4gICAgICAvLyBCb3RoIG1vZGlmaWVkIC4uLlxuICAgICAgbXV0dWFsQ2hhbmdlKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50WzBdID09PSAnKycgJiYgdGhlaXJDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIHZhciBfaHVuayRsaW5lcztcblxuICAgICAgLy8gTWluZSBpbnNlcnRlZFxuICAgICAgKF9odW5rJGxpbmVzID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lcywgX3RvQ29uc3VtYWJsZUFycmF5KGNvbGxlY3RDaGFuZ2UobWluZSkpKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJysnICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIHZhciBfaHVuayRsaW5lczI7XG5cbiAgICAgIC8vIFRoZWlycyBpbnNlcnRlZFxuICAgICAgKF9odW5rJGxpbmVzMiA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXMyLCBfdG9Db25zdW1hYmxlQXJyYXkoY29sbGVjdENoYW5nZSh0aGVpcikpKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50WzBdID09PSAnLScgJiYgdGhlaXJDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIE1pbmUgcmVtb3ZlZCBvciBlZGl0ZWRcbiAgICAgIHJlbW92YWwoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgIH0gZWxzZSBpZiAodGhlaXJDdXJyZW50WzBdID09PSAnLScgJiYgbWluZUN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgLy8gVGhlaXIgcmVtb3ZlZCBvciBlZGl0ZWRcbiAgICAgIHJlbW92YWwoaHVuaywgdGhlaXIsIG1pbmUsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnQgPT09IHRoZWlyQ3VycmVudCkge1xuICAgICAgLy8gQ29udGV4dCBpZGVudGl0eVxuICAgICAgaHVuay5saW5lcy5wdXNoKG1pbmVDdXJyZW50KTtcbiAgICAgIG1pbmUuaW5kZXgrKztcbiAgICAgIHRoZWlyLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRleHQgbWlzbWF0Y2hcbiAgICAgIGNvbmZsaWN0KGh1bmssIGNvbGxlY3RDaGFuZ2UobWluZSksIGNvbGxlY3RDaGFuZ2UodGhlaXIpKTtcbiAgICB9XG4gIH0gLy8gTm93IHB1c2ggYW55dGhpbmcgdGhhdCBtYXkgYmUgcmVtYWluaW5nXG5cblxuICBpbnNlcnRUcmFpbGluZyhodW5rLCBtaW5lKTtcbiAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgdGhlaXIpO1xuICBjYWxjTGluZUNvdW50KGh1bmspO1xufVxuXG5mdW5jdGlvbiBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgdmFyIG15Q2hhbmdlcyA9IGNvbGxlY3RDaGFuZ2UobWluZSksXG4gICAgICB0aGVpckNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKHRoZWlyKTtcblxuICBpZiAoYWxsUmVtb3ZlcyhteUNoYW5nZXMpICYmIGFsbFJlbW92ZXModGhlaXJDaGFuZ2VzKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgcmVtb3ZlIGNoYW5nZXMgdGhhdCBhcmUgc3VwZXJzZXRzIG9mIG9uZSBhbm90aGVyXG4gICAgaWYgKGFycmF5U3RhcnRzV2l0aChteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcykgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KHRoZWlyLCBteUNoYW5nZXMsIG15Q2hhbmdlcy5sZW5ndGggLSB0aGVpckNoYW5nZXMubGVuZ3RoKSkge1xuICAgICAgdmFyIF9odW5rJGxpbmVzMztcblxuICAgICAgKF9odW5rJGxpbmVzMyA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXMzLCBfdG9Db25zdW1hYmxlQXJyYXkobXlDaGFuZ2VzKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGFycmF5U3RhcnRzV2l0aCh0aGVpckNoYW5nZXMsIG15Q2hhbmdlcykgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KG1pbmUsIHRoZWlyQ2hhbmdlcywgdGhlaXJDaGFuZ2VzLmxlbmd0aCAtIG15Q2hhbmdlcy5sZW5ndGgpKSB7XG4gICAgICB2YXIgX2h1bmskbGluZXM0O1xuXG4gICAgICAoX2h1bmskbGluZXM0ID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lczQsIF90b0NvbnN1bWFibGVBcnJheSh0aGVpckNoYW5nZXMpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhcnJheUVxdWFsKG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKSkge1xuICAgIHZhciBfaHVuayRsaW5lczU7XG5cbiAgICAoX2h1bmskbGluZXM1ID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lczUsIF90b0NvbnN1bWFibGVBcnJheShteUNoYW5nZXMpKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbmZsaWN0KGh1bmssIG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZhbChodW5rLCBtaW5lLCB0aGVpciwgc3dhcCkge1xuICB2YXIgbXlDaGFuZ2VzID0gY29sbGVjdENoYW5nZShtaW5lKSxcbiAgICAgIHRoZWlyQ2hhbmdlcyA9IGNvbGxlY3RDb250ZXh0KHRoZWlyLCBteUNoYW5nZXMpO1xuXG4gIGlmICh0aGVpckNoYW5nZXMubWVyZ2VkKSB7XG4gICAgdmFyIF9odW5rJGxpbmVzNjtcblxuICAgIChfaHVuayRsaW5lczYgPSBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KF9odW5rJGxpbmVzNiwgX3RvQ29uc3VtYWJsZUFycmF5KHRoZWlyQ2hhbmdlcy5tZXJnZWQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25mbGljdChodW5rLCBzd2FwID8gdGhlaXJDaGFuZ2VzIDogbXlDaGFuZ2VzLCBzd2FwID8gbXlDaGFuZ2VzIDogdGhlaXJDaGFuZ2VzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25mbGljdChodW5rLCBtaW5lLCB0aGVpcikge1xuICBodW5rLmNvbmZsaWN0ID0gdHJ1ZTtcbiAgaHVuay5saW5lcy5wdXNoKHtcbiAgICBjb25mbGljdDogdHJ1ZSxcbiAgICBtaW5lOiBtaW5lLFxuICAgIHRoZWlyczogdGhlaXJcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydExlYWRpbmcoaHVuaywgaW5zZXJ0LCB0aGVpcikge1xuICB3aGlsZSAoaW5zZXJ0Lm9mZnNldCA8IHRoZWlyLm9mZnNldCAmJiBpbnNlcnQuaW5kZXggPCBpbnNlcnQubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIGxpbmUgPSBpbnNlcnQubGluZXNbaW5zZXJ0LmluZGV4KytdO1xuICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcbiAgICBpbnNlcnQub2Zmc2V0Kys7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0VHJhaWxpbmcoaHVuaywgaW5zZXJ0KSB7XG4gIHdoaWxlIChpbnNlcnQuaW5kZXggPCBpbnNlcnQubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIGxpbmUgPSBpbnNlcnQubGluZXNbaW5zZXJ0LmluZGV4KytdO1xuICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0Q2hhbmdlKHN0YXRlKSB7XG4gIHZhciByZXQgPSBbXSxcbiAgICAgIG9wZXJhdGlvbiA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XVswXTtcblxuICB3aGlsZSAoc3RhdGUuaW5kZXggPCBzdGF0ZS5saW5lcy5sZW5ndGgpIHtcbiAgICB2YXIgbGluZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XTsgLy8gR3JvdXAgYWRkaXRpb25zIHRoYXQgYXJlIGltbWVkaWF0ZWx5IGFmdGVyIHN1YnRyYWN0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyBvbmUgXCJhdG9taWNcIiBtb2RpZnkgY2hhbmdlLlxuXG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gJy0nICYmIGxpbmVbMF0gPT09ICcrJykge1xuICAgICAgb3BlcmF0aW9uID0gJysnO1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRpb24gPT09IGxpbmVbMF0pIHtcbiAgICAgIHJldC5wdXNoKGxpbmUpO1xuICAgICAgc3RhdGUuaW5kZXgrKztcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gY29sbGVjdENvbnRleHQoc3RhdGUsIG1hdGNoQ2hhbmdlcykge1xuICB2YXIgY2hhbmdlcyA9IFtdLFxuICAgICAgbWVyZ2VkID0gW10sXG4gICAgICBtYXRjaEluZGV4ID0gMCxcbiAgICAgIGNvbnRleHRDaGFuZ2VzID0gZmFsc2UsXG4gICAgICBjb25mbGljdGVkID0gZmFsc2U7XG5cbiAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoICYmIHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIGNoYW5nZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XSxcbiAgICAgICAgbWF0Y2ggPSBtYXRjaENoYW5nZXNbbWF0Y2hJbmRleF07IC8vIE9uY2Ugd2UndmUgaGl0IG91ciBhZGQsIHRoZW4gd2UgYXJlIGRvbmVcblxuICAgIGlmIChtYXRjaFswXSA9PT0gJysnKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb250ZXh0Q2hhbmdlcyA9IGNvbnRleHRDaGFuZ2VzIHx8IGNoYW5nZVswXSAhPT0gJyAnO1xuICAgIG1lcmdlZC5wdXNoKG1hdGNoKTtcbiAgICBtYXRjaEluZGV4Kys7IC8vIENvbnN1bWUgYW55IGFkZGl0aW9ucyBpbiB0aGUgb3RoZXIgYmxvY2sgYXMgYSBjb25mbGljdCB0byBhdHRlbXB0XG4gICAgLy8gdG8gcHVsbCBpbiB0aGUgcmVtYWluaW5nIGNvbnRleHQgYWZ0ZXIgdGhpc1xuXG4gICAgaWYgKGNoYW5nZVswXSA9PT0gJysnKSB7XG4gICAgICBjb25mbGljdGVkID0gdHJ1ZTtcblxuICAgICAgd2hpbGUgKGNoYW5nZVswXSA9PT0gJysnKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaChjaGFuZ2UpO1xuICAgICAgICBjaGFuZ2UgPSBzdGF0ZS5saW5lc1srK3N0YXRlLmluZGV4XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWF0Y2guc3Vic3RyKDEpID09PSBjaGFuZ2Uuc3Vic3RyKDEpKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgIHN0YXRlLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICgobWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdIHx8ICcnKVswXSA9PT0gJysnICYmIGNvbnRleHRDaGFuZ2VzKSB7XG4gICAgY29uZmxpY3RlZCA9IHRydWU7XG4gIH1cblxuICBpZiAoY29uZmxpY3RlZCkge1xuICAgIHJldHVybiBjaGFuZ2VzO1xuICB9XG5cbiAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoKSB7XG4gICAgbWVyZ2VkLnB1c2gobWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXgrK10pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXJnZWQ6IG1lcmdlZCxcbiAgICBjaGFuZ2VzOiBjaGFuZ2VzXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFsbFJlbW92ZXMoY2hhbmdlcykge1xuICByZXR1cm4gY2hhbmdlcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGNoYW5nZSkge1xuICAgIHJldHVybiBwcmV2ICYmIGNoYW5nZVswXSA9PT0gJy0nO1xuICB9LCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gc2tpcFJlbW92ZVN1cGVyc2V0KHN0YXRlLCByZW1vdmVDaGFuZ2VzLCBkZWx0YSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHtcbiAgICB2YXIgY2hhbmdlQ29udGVudCA9IHJlbW92ZUNoYW5nZXNbcmVtb3ZlQ2hhbmdlcy5sZW5ndGggLSBkZWx0YSArIGldLnN1YnN0cigxKTtcblxuICAgIGlmIChzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleCArIGldICE9PSAnICcgKyBjaGFuZ2VDb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUuaW5kZXggKz0gZGVsdGE7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmVzKSB7XG4gIHZhciBvbGRMaW5lcyA9IDA7XG4gIHZhciBuZXdMaW5lcyA9IDA7XG4gIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICBpZiAodHlwZW9mIGxpbmUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgbXlDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS5taW5lKTtcbiAgICAgIHZhciB0aGVpckNvdW50ID0gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lLnRoZWlycyk7XG5cbiAgICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChteUNvdW50Lm9sZExpbmVzID09PSB0aGVpckNvdW50Lm9sZExpbmVzKSB7XG4gICAgICAgICAgb2xkTGluZXMgKz0gbXlDb3VudC5vbGRMaW5lcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbGRMaW5lcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobXlDb3VudC5uZXdMaW5lcyA9PT0gdGhlaXJDb3VudC5uZXdMaW5lcykge1xuICAgICAgICAgIG5ld0xpbmVzICs9IG15Q291bnQubmV3TGluZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGluZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQgJiYgKGxpbmVbMF0gPT09ICcrJyB8fCBsaW5lWzBdID09PSAnICcpKSB7XG4gICAgICAgIG5ld0xpbmVzKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnLScgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuICAgICAgICBvbGRMaW5lcysrO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7XG4gICAgb2xkTGluZXM6IG9sZExpbmVzLFxuICAgIG5ld0xpbmVzOiBuZXdMaW5lc1xuICB9O1xufVxuXG4vLyBTZWU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1wYXRjaC93aWtpL0FQSVxuZnVuY3Rpb24gY29udmVydENoYW5nZXNUb0RNUChjaGFuZ2VzKSB7XG4gIHZhciByZXQgPSBbXSxcbiAgICAgIGNoYW5nZSxcbiAgICAgIG9wZXJhdGlvbjtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuXG4gICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgb3BlcmF0aW9uID0gMTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICBvcGVyYXRpb24gPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlcmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICByZXQucHVzaChbb3BlcmF0aW9uLCBjaGFuZ2UudmFsdWVdKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9YTUwoY2hhbmdlcykge1xuICB2YXIgcmV0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaV07XG5cbiAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICByZXQucHVzaCgnPGlucz4nKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICByZXQucHVzaCgnPGRlbD4nKTtcbiAgICB9XG5cbiAgICByZXQucHVzaChlc2NhcGVIVE1MKGNoYW5nZS52YWx1ZSkpO1xuXG4gICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgcmV0LnB1c2goJzwvaW5zPicpO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8L2RlbD4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0LmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVIVE1MKHMpIHtcbiAgdmFyIG4gPSBzO1xuICBuID0gbi5yZXBsYWNlKC8mL2csICcmYW1wOycpO1xuICBuID0gbi5yZXBsYWNlKC88L2csICcmbHQ7Jyk7XG4gIG4gPSBuLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbiAgbiA9IG4ucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuICByZXR1cm4gbjtcbn1cblxuZXhwb3J0IHsgRGlmZiwgYXBwbHlQYXRjaCwgYXBwbHlQYXRjaGVzLCBjYW5vbmljYWxpemUsIGNvbnZlcnRDaGFuZ2VzVG9ETVAsIGNvbnZlcnRDaGFuZ2VzVG9YTUwsIGNyZWF0ZVBhdGNoLCBjcmVhdGVUd29GaWxlc1BhdGNoLCBkaWZmQXJyYXlzLCBkaWZmQ2hhcnMsIGRpZmZDc3MsIGRpZmZKc29uLCBkaWZmTGluZXMsIGRpZmZTZW50ZW5jZXMsIGRpZmZUcmltbWVkTGluZXMsIGRpZmZXb3JkcywgZGlmZldvcmRzV2l0aFNwYWNlLCBtZXJnZSwgcGFyc2VQYXRjaCwgc3RydWN0dXJlZFBhdGNoIH07XG4iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiaW1wb3J0IHsgSG92ZXJQYXJlbnQsIEhvdmVyUG9wb3ZlciwgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IEhJU1RPUllfVklFV19DT05GSUcgfSBmcm9tIFwic3JjL2NvbnN0YW50c1wiO1xuaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCJzcmMvbWFpblwiO1xuLy8gQHRzY29uZmlnL3N2ZWx0ZSBpcyByZXF1aXJlZCB0byByZXNvbHZlIHRoaXMgZXJyb3IuXG4vLyBJZ25vcmUgdGVtcG9yYXJpbHkuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgSGlzdG9yeVZpZXdDb21wb25lbnQgZnJvbSBcIi4vaGlzdG9yeVZpZXcuc3ZlbHRlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpc3RvcnlWaWV3IGV4dGVuZHMgSXRlbVZpZXcgaW1wbGVtZW50cyBIb3ZlclBhcmVudCB7XG4gICAgcGx1Z2luOiBPYnNpZGlhbkdpdDtcbiAgICBwcml2YXRlIF92aWV3OiBIaXN0b3J5Vmlld0NvbXBvbmVudDtcbiAgICBob3ZlclBvcG92ZXI6IEhvdmVyUG9wb3ZlciB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwbHVnaW46IE9ic2lkaWFuR2l0KSB7XG4gICAgICAgIHN1cGVyKGxlYWYpO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgdGhpcy5ob3ZlclBvcG92ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGdldFZpZXdUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBISVNUT1JZX1ZJRVdfQ09ORklHLnR5cGU7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheVRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEhJU1RPUllfVklFV19DT05GSUcubmFtZTtcbiAgICB9XG5cbiAgICBnZXRJY29uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBISVNUT1JZX1ZJRVdfQ09ORklHLmljb247XG4gICAgfVxuXG4gICAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uQ2xvc2UoKTtcbiAgICB9XG5cbiAgICBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuX3ZpZXcgPSBuZXcgSGlzdG9yeVZpZXdDb21wb25lbnQoe1xuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLmNvbnRlbnRFbCxcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgcGx1Z2luOiB0aGlzLnBsdWdpbixcbiAgICAgICAgICAgICAgICB2aWV3OiB0aGlzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdXBlci5vbk9wZW4oKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0ICogZnJvbSAnLi9hbmltYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXdhaXRfYmxvY2suanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kb20uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbnZpcm9ubWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2dsb2JhbHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lYWNoLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbGlmZWN5Y2xlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9vcC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVkdWxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NwcmVhZC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Nzci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3RyYW5zaXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db21wb25lbnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kZXYuanMnO1xuIiwgImltcG9ydCB7IGlkZW50aXR5IGFzIGxpbmVhciwgbm9vcCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgbm93IH0gZnJvbSAnLi9lbnZpcm9ubWVudC5qcyc7XG5pbXBvcnQgeyBsb29wIH0gZnJvbSAnLi9sb29wLmpzJztcbmltcG9ydCB7IGNyZWF0ZV9ydWxlLCBkZWxldGVfcnVsZSB9IGZyb20gJy4vc3R5bGVfbWFuYWdlci5qcyc7XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50ICYgRWxlbWVudENTU0lubGluZVN0eWxlfSBub2RlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9wcml2YXRlLmpzJykuUG9zaXRpb25SZWN0fSBmcm9tXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9wcml2YXRlLmpzJykuQW5pbWF0aW9uRm59IGZuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVfYW5pbWF0aW9uKG5vZGUsIGZyb20sIGZuLCBwYXJhbXMpIHtcblx0aWYgKCFmcm9tKSByZXR1cm4gbm9vcDtcblx0Y29uc3QgdG8gPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRpZiAoXG5cdFx0ZnJvbS5sZWZ0ID09PSB0by5sZWZ0ICYmXG5cdFx0ZnJvbS5yaWdodCA9PT0gdG8ucmlnaHQgJiZcblx0XHRmcm9tLnRvcCA9PT0gdG8udG9wICYmXG5cdFx0ZnJvbS5ib3R0b20gPT09IHRvLmJvdHRvbVxuXHQpXG5cdFx0cmV0dXJuIG5vb3A7XG5cdGNvbnN0IHtcblx0XHRkZWxheSA9IDAsXG5cdFx0ZHVyYXRpb24gPSAzMDAsXG5cdFx0ZWFzaW5nID0gbGluZWFyLFxuXHRcdC8vIEB0cy1pZ25vcmUgdG9kbzogc2hvdWxkIHRoaXMgYmUgc2VwYXJhdGVkIGZyb20gZGVzdHJ1Y3R1cmluZz8gT3Igc3RhcnQvZW5kIGFkZGVkIHRvIHB1YmxpYyBhcGkgYW5kIGRvY3VtZW50YXRpb24/XG5cdFx0c3RhcnQ6IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5LFxuXHRcdC8vIEB0cy1pZ25vcmUgdG9kbzpcblx0XHRlbmQgPSBzdGFydF90aW1lICsgZHVyYXRpb24sXG5cdFx0dGljayA9IG5vb3AsXG5cdFx0Y3NzXG5cdH0gPSBmbihub2RlLCB7IGZyb20sIHRvIH0sIHBhcmFtcyk7XG5cdGxldCBydW5uaW5nID0gdHJ1ZTtcblx0bGV0IHN0YXJ0ZWQgPSBmYWxzZTtcblx0bGV0IG5hbWU7XG5cdC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cblx0ZnVuY3Rpb24gc3RhcnQoKSB7XG5cdFx0aWYgKGNzcykge1xuXHRcdFx0bmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDAsIDEsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuXHRcdH1cblx0XHRpZiAoIWRlbGF5KSB7XG5cdFx0XHRzdGFydGVkID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0LyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdGlmIChjc3MpIGRlbGV0ZV9ydWxlKG5vZGUsIG5hbWUpO1xuXHRcdHJ1bm5pbmcgPSBmYWxzZTtcblx0fVxuXHRsb29wKChub3cpID0+IHtcblx0XHRpZiAoIXN0YXJ0ZWQgJiYgbm93ID49IHN0YXJ0X3RpbWUpIHtcblx0XHRcdHN0YXJ0ZWQgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoc3RhcnRlZCAmJiBub3cgPj0gZW5kKSB7XG5cdFx0XHR0aWNrKDEsIDApO1xuXHRcdFx0c3RvcCgpO1xuXHRcdH1cblx0XHRpZiAoIXJ1bm5pbmcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKHN0YXJ0ZWQpIHtcblx0XHRcdGNvbnN0IHAgPSBub3cgLSBzdGFydF90aW1lO1xuXHRcdFx0Y29uc3QgdCA9IDAgKyAxICogZWFzaW5nKHAgLyBkdXJhdGlvbik7XG5cdFx0XHR0aWNrKHQsIDEgLSB0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0pO1xuXHRzdGFydCgpO1xuXHR0aWNrKDAsIDEpO1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnQgJiBFbGVtZW50Q1NTSW5saW5lU3R5bGV9IG5vZGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZml4X3Bvc2l0aW9uKG5vZGUpIHtcblx0Y29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuXHRpZiAoc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcblx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHN0eWxlO1xuXHRcdGNvbnN0IGEgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdG5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdG5vZGUuc3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRub2RlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcblx0XHRhZGRfdHJhbnNmb3JtKG5vZGUsIGEpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50ICYgRWxlbWVudENTU0lubGluZVN0eWxlfSBub2RlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9wcml2YXRlLmpzJykuUG9zaXRpb25SZWN0fSBhXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZF90cmFuc2Zvcm0obm9kZSwgYSkge1xuXHRjb25zdCBiID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0aWYgKGEubGVmdCAhPT0gYi5sZWZ0IHx8IGEudG9wICE9PSBiLnRvcCkge1xuXHRcdGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcblx0XHRjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuXHRcdG5vZGUuc3R5bGUudHJhbnNmb3JtID0gYCR7dHJhbnNmb3JtfSB0cmFuc2xhdGUoJHthLmxlZnQgLSBiLmxlZnR9cHgsICR7YS50b3AgLSBiLnRvcH1weClgO1xuXHR9XG59XG4iLCAiLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5leHBvcnQgY29uc3QgaWRlbnRpdHkgPSAoeCkgPT4geDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFNcbiAqIEBwYXJhbSB7VH0gdGFyXG4gKiBAcGFyYW0ge1N9IHNyY1xuICogQHJldHVybnMge1QgJiBTfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduKHRhciwgc3JjKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0Zm9yIChjb25zdCBrIGluIHNyYykgdGFyW2tdID0gc3JjW2tdO1xuXHRyZXR1cm4gLyoqIEB0eXBlIHtUICYgU30gKi8gKHRhcik7XG59XG5cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vdGhlbi9pcy1wcm9taXNlL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBNSVQgTGljZW5zZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbi9pcy1wcm9taXNlL2Jsb2IvbWFzdGVyL0xJQ0VOU0Vcbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUHJvbWlzZUxpa2U8YW55Pn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzX3Byb21pc2UodmFsdWUpIHtcblx0cmV0dXJuIChcblx0XHQhIXZhbHVlICYmXG5cdFx0KHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSAmJlxuXHRcdHR5cGVvZiAoLyoqIEB0eXBlIHthbnl9ICovICh2YWx1ZSkudGhlbikgPT09ICdmdW5jdGlvbidcblx0KTtcbn1cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZF9sb2NhdGlvbihlbGVtZW50LCBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIpIHtcblx0ZWxlbWVudC5fX3N2ZWx0ZV9tZXRhID0ge1xuXHRcdGxvYzogeyBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIgfVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuKGZuKSB7XG5cdHJldHVybiBmbigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmxhbmtfb2JqZWN0KCkge1xuXHRyZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Z1bmN0aW9uW119IGZuc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5fYWxsKGZucykge1xuXHRmbnMuZm9yRWFjaChydW4pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB0aGluZ1xuICogQHJldHVybnMge3RoaW5nIGlzIEZ1bmN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNfZnVuY3Rpb24odGhpbmcpIHtcblx0cmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVfbm90X2VxdWFsKGEsIGIpIHtcblx0cmV0dXJuIGEgIT0gYSA/IGIgPT0gYiA6IGEgIT09IGIgfHwgKGEgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB8fCB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxubGV0IHNyY191cmxfZXF1YWxfYW5jaG9yO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbGVtZW50X3NyY1xuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcmNfdXJsX2VxdWFsKGVsZW1lbnRfc3JjLCB1cmwpIHtcblx0aWYgKGVsZW1lbnRfc3JjID09PSB1cmwpIHJldHVybiB0cnVlO1xuXHRpZiAoIXNyY191cmxfZXF1YWxfYW5jaG9yKSB7XG5cdFx0c3JjX3VybF9lcXVhbF9hbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdH1cblx0Ly8gVGhpcyBpcyBhY3R1YWxseSBmYXN0ZXIgdGhhbiBkb2luZyBVUkwoLi4pLmhyZWZcblx0c3JjX3VybF9lcXVhbF9hbmNob3IuaHJlZiA9IHVybDtcblx0cmV0dXJuIGVsZW1lbnRfc3JjID09PSBzcmNfdXJsX2VxdWFsX2FuY2hvci5ocmVmO1xufVxuXG4vKiogQHBhcmFtIHtzdHJpbmd9IHNyY3NldCAqL1xuZnVuY3Rpb24gc3BsaXRfc3Jjc2V0KHNyY3NldCkge1xuXHRyZXR1cm4gc3Jjc2V0LnNwbGl0KCcsJykubWFwKChzcmMpID0+IHNyYy50cmltKCkuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTFNvdXJjZUVsZW1lbnQgfCBIVE1MSW1hZ2VFbGVtZW50fSBlbGVtZW50X3NyY3NldFxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsfSBzcmNzZXRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3Jjc2V0X3VybF9lcXVhbChlbGVtZW50X3NyY3NldCwgc3Jjc2V0KSB7XG5cdGNvbnN0IGVsZW1lbnRfdXJscyA9IHNwbGl0X3NyY3NldChlbGVtZW50X3NyY3NldC5zcmNzZXQpO1xuXHRjb25zdCB1cmxzID0gc3BsaXRfc3Jjc2V0KHNyY3NldCB8fCAnJyk7XG5cblx0cmV0dXJuIChcblx0XHR1cmxzLmxlbmd0aCA9PT0gZWxlbWVudF91cmxzLmxlbmd0aCAmJlxuXHRcdHVybHMuZXZlcnkoXG5cdFx0XHQoW3VybCwgd2lkdGhdLCBpKSA9PlxuXHRcdFx0XHR3aWR0aCA9PT0gZWxlbWVudF91cmxzW2ldWzFdICYmXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gdGVzdCBib3RoIHdheXMgYmVjYXVzZSBWaXRlIHdpbGwgY3JlYXRlIGFuIGEgZnVsbCBVUkwgd2l0aFxuXHRcdFx0XHQvLyBgbmV3IFVSTChhc3NldCwgaW1wb3J0Lm1ldGEudXJsKS5ocmVmYCBmb3IgdGhlIGNsaWVudCB3aGVuIGBiYXNlOiAnLi8nYCwgYW5kIHRoZVxuXHRcdFx0XHQvLyByZWxhdGl2ZSBVUkxzIGluc2lkZSBzcmNzZXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHJlc29sdmVkIHRvIGFic29sdXRlIFVSTHMgYnlcblx0XHRcdFx0Ly8gYnJvd3NlcnMgKGluIGNvbnRyYXN0IHRvIGltZy5zcmMpLiBUaGlzIG1lYW5zIGJvdGggU1NSIGFuZCBET00gY29kZSBjb3VsZFxuXHRcdFx0XHQvLyBjb250YWluIHJlbGF0aXZlIG9yIGFic29sdXRlIFVSTHMuXG5cdFx0XHRcdChzcmNfdXJsX2VxdWFsKGVsZW1lbnRfdXJsc1tpXVswXSwgdXJsKSB8fCBzcmNfdXJsX2VxdWFsKHVybCwgZWxlbWVudF91cmxzW2ldWzBdKSlcblx0XHQpXG5cdCk7XG59XG5cbi8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RfZXF1YWwoYSwgYikge1xuXHRyZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYjtcbn1cblxuLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzX2VtcHR5KG9iaikge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9zdG9yZShzdG9yZSwgbmFtZSkge1xuXHRpZiAoc3RvcmUgIT0gbnVsbCAmJiB0eXBlb2Ygc3RvcmUuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgaXMgbm90IGEgc3RvcmUgd2l0aCBhICdzdWJzY3JpYmUnIG1ldGhvZGApO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmUoc3RvcmUsIC4uLmNhbGxiYWNrcykge1xuXHRpZiAoc3RvcmUgPT0gbnVsbCkge1xuXHRcdGZvciAoY29uc3QgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKSB7XG5cdFx0XHRjYWxsYmFjayh1bmRlZmluZWQpO1xuXHRcdH1cblx0XHRyZXR1cm4gbm9vcDtcblx0fVxuXHRjb25zdCB1bnN1YiA9IHN0b3JlLnN1YnNjcmliZSguLi5jYWxsYmFja3MpO1xuXHRyZXR1cm4gdW5zdWIudW5zdWJzY3JpYmUgPyAoKSA9PiB1bnN1Yi51bnN1YnNjcmliZSgpIDogdW5zdWI7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIGZyb20gYSBzdG9yZSBieSBzdWJzY3JpYmluZyBhbmQgaW1tZWRpYXRlbHkgdW5zdWJzY3JpYmluZy5cbiAqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtc3RvcmUjZ2V0XG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtpbXBvcnQoJy4uL3N0b3JlL3B1YmxpYy5qcycpLlJlYWRhYmxlPFQ+fSBzdG9yZVxuICogQHJldHVybnMge1R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRfc3RvcmVfdmFsdWUoc3RvcmUpIHtcblx0bGV0IHZhbHVlO1xuXHRzdWJzY3JpYmUoc3RvcmUsIChfKSA9PiAodmFsdWUgPSBfKSkoKTtcblx0cmV0dXJuIHZhbHVlO1xufVxuXG4vKiogQHJldHVybnMge3ZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9uZW50X3N1YnNjcmliZShjb21wb25lbnQsIHN0b3JlLCBjYWxsYmFjaykge1xuXHRjb21wb25lbnQuJCQub25fZGVzdHJveS5wdXNoKHN1YnNjcmliZShzdG9yZSwgY2FsbGJhY2spKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZV9zbG90KGRlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZm4pIHtcblx0aWYgKGRlZmluaXRpb24pIHtcblx0XHRjb25zdCBzbG90X2N0eCA9IGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbik7XG5cdFx0cmV0dXJuIGRlZmluaXRpb25bMF0oc2xvdF9jdHgpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuXHRyZXR1cm4gZGVmaW5pdGlvblsxXSAmJiBmbiA/IGFzc2lnbigkJHNjb3BlLmN0eC5zbGljZSgpLCBkZWZpbml0aW9uWzFdKGZuKGN0eCkpKSA6ICQkc2NvcGUuY3R4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0X3Nsb3RfY2hhbmdlcyhkZWZpbml0aW9uLCAkJHNjb3BlLCBkaXJ0eSwgZm4pIHtcblx0aWYgKGRlZmluaXRpb25bMl0gJiYgZm4pIHtcblx0XHRjb25zdCBsZXRzID0gZGVmaW5pdGlvblsyXShmbihkaXJ0eSkpO1xuXHRcdGlmICgkJHNjb3BlLmRpcnR5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBsZXRzO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIGxldHMgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRjb25zdCBtZXJnZWQgPSBbXTtcblx0XHRcdGNvbnN0IGxlbiA9IE1hdGgubWF4KCQkc2NvcGUuZGlydHkubGVuZ3RoLCBsZXRzLmxlbmd0aCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG5cdFx0XHRcdG1lcmdlZFtpXSA9ICQkc2NvcGUuZGlydHlbaV0gfCBsZXRzW2ldO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1lcmdlZDtcblx0XHR9XG5cdFx0cmV0dXJuICQkc2NvcGUuZGlydHkgfCBsZXRzO1xuXHR9XG5cdHJldHVybiAkJHNjb3BlLmRpcnR5O1xufVxuXG4vKiogQHJldHVybnMge3ZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlX3Nsb3RfYmFzZShcblx0c2xvdCxcblx0c2xvdF9kZWZpbml0aW9uLFxuXHRjdHgsXG5cdCQkc2NvcGUsXG5cdHNsb3RfY2hhbmdlcyxcblx0Z2V0X3Nsb3RfY29udGV4dF9mblxuKSB7XG5cdGlmIChzbG90X2NoYW5nZXMpIHtcblx0XHRjb25zdCBzbG90X2NvbnRleHQgPSBnZXRfc2xvdF9jb250ZXh0KHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBnZXRfc2xvdF9jb250ZXh0X2ZuKTtcblx0XHRzbG90LnAoc2xvdF9jb250ZXh0LCBzbG90X2NoYW5nZXMpO1xuXHR9XG59XG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVfc2xvdChcblx0c2xvdCxcblx0c2xvdF9kZWZpbml0aW9uLFxuXHRjdHgsXG5cdCQkc2NvcGUsXG5cdGRpcnR5LFxuXHRnZXRfc2xvdF9jaGFuZ2VzX2ZuLFxuXHRnZXRfc2xvdF9jb250ZXh0X2ZuXG4pIHtcblx0Y29uc3Qgc2xvdF9jaGFuZ2VzID0gZ2V0X3Nsb3RfY2hhbmdlcyhzbG90X2RlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuKTtcblx0dXBkYXRlX3Nsb3RfYmFzZShzbG90LCBzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgc2xvdF9jaGFuZ2VzLCBnZXRfc2xvdF9jb250ZXh0X2ZuKTtcbn1cblxuLyoqIEByZXR1cm5zIHthbnlbXSB8IC0xfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldF9hbGxfZGlydHlfZnJvbV9zY29wZSgkJHNjb3BlKSB7XG5cdGlmICgkJHNjb3BlLmN0eC5sZW5ndGggPiAzMikge1xuXHRcdGNvbnN0IGRpcnR5ID0gW107XG5cdFx0Y29uc3QgbGVuZ3RoID0gJCRzY29wZS5jdHgubGVuZ3RoIC8gMzI7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdFx0ZGlydHlbaV0gPSAtMTtcblx0XHR9XG5cdFx0cmV0dXJuIGRpcnR5O1xuXHR9XG5cdHJldHVybiAtMTtcbn1cblxuLyoqIEByZXR1cm5zIHt7fX0gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGNsdWRlX2ludGVybmFsX3Byb3BzKHByb3BzKSB7XG5cdGNvbnN0IHJlc3VsdCA9IHt9O1xuXHRmb3IgKGNvbnN0IGsgaW4gcHJvcHMpIGlmIChrWzBdICE9PSAnJCcpIHJlc3VsdFtrXSA9IHByb3BzW2tdO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQHJldHVybnMge3t9fSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVfcmVzdF9wcm9wcyhwcm9wcywga2V5cykge1xuXHRjb25zdCByZXN0ID0ge307XG5cdGtleXMgPSBuZXcgU2V0KGtleXMpO1xuXHRmb3IgKGNvbnN0IGsgaW4gcHJvcHMpIGlmICgha2V5cy5oYXMoaykgJiYga1swXSAhPT0gJyQnKSByZXN0W2tdID0gcHJvcHNba107XG5cdHJldHVybiByZXN0O1xufVxuXG4vKiogQHJldHVybnMge3t9fSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVfc2xvdHMoc2xvdHMpIHtcblx0Y29uc3QgcmVzdWx0ID0ge307XG5cdGZvciAoY29uc3Qga2V5IGluIHNsb3RzKSB7XG5cdFx0cmVzdWx0W2tleV0gPSB0cnVlO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBAcmV0dXJucyB7KHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IHZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gb25jZShmbikge1xuXHRsZXQgcmFuID0gZmFsc2U7XG5cdHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuXHRcdGlmIChyYW4pIHJldHVybjtcblx0XHRyYW4gPSB0cnVlO1xuXHRcdGZuLmNhbGwodGhpcywgLi4uYXJncyk7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBudWxsX3RvX2VtcHR5KHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldF9zdG9yZV92YWx1ZShzdG9yZSwgcmV0LCB2YWx1ZSkge1xuXHRzdG9yZS5zZXQodmFsdWUpO1xuXHRyZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgY29uc3QgaGFzX3Byb3AgPSAob2JqLCBwcm9wKSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFjdGlvbl9kZXN0cm95ZXIoYWN0aW9uX3Jlc3VsdCkge1xuXHRyZXR1cm4gYWN0aW9uX3Jlc3VsdCAmJiBpc19mdW5jdGlvbihhY3Rpb25fcmVzdWx0LmRlc3Ryb3kpID8gYWN0aW9uX3Jlc3VsdC5kZXN0cm95IDogbm9vcDtcbn1cblxuLyoqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSB2YWx1ZVxuICogQHJldHVybnMge1tudW1iZXIsIHN0cmluZ119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdF9jc3NfdW5pdCh2YWx1ZSkge1xuXHRjb25zdCBzcGxpdCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubWF0Y2goL15cXHMqKC0/W1xcZC5dKykoW15cXHNdKilcXHMqJC8pO1xuXHRyZXR1cm4gc3BsaXQgPyBbcGFyc2VGbG9hdChzcGxpdFsxXSksIHNwbGl0WzJdIHx8ICdweCddIDogWy8qKiBAdHlwZSB7bnVtYmVyfSAqLyAodmFsdWUpLCAncHgnXTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRlbnRlZGl0YWJsZV90cnV0aHlfdmFsdWVzID0gWycnLCB0cnVlLCAxLCAndHJ1ZScsICdjb250ZW50ZWRpdGFibGUnXTtcbiIsICJpbXBvcnQgeyBub29wIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjb25zdCBpc19jbGllbnQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcblxuLyoqIEB0eXBlIHsoKSA9PiBudW1iZXJ9ICovXG5leHBvcnQgbGV0IG5vdyA9IGlzX2NsaWVudCA/ICgpID0+IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSA6ICgpID0+IERhdGUubm93KCk7XG5cbmV4cG9ydCBsZXQgcmFmID0gaXNfY2xpZW50ID8gKGNiKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2IpIDogbm9vcDtcblxuLy8gdXNlZCBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nXG4vKiogQHJldHVybnMge3ZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gc2V0X25vdyhmbikge1xuXHRub3cgPSBmbjtcbn1cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldF9yYWYoZm4pIHtcblx0cmFmID0gZm47XG59XG4iLCAiaW1wb3J0IHsgcmFmIH0gZnJvbSAnLi9lbnZpcm9ubWVudC5qcyc7XG5cbmNvbnN0IHRhc2tzID0gbmV3IFNldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBub3dcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBydW5fdGFza3Mobm93KSB7XG5cdHRhc2tzLmZvckVhY2goKHRhc2spID0+IHtcblx0XHRpZiAoIXRhc2suYyhub3cpKSB7XG5cdFx0XHR0YXNrcy5kZWxldGUodGFzayk7XG5cdFx0XHR0YXNrLmYoKTtcblx0XHR9XG5cdH0pO1xuXHRpZiAodGFza3Muc2l6ZSAhPT0gMCkgcmFmKHJ1bl90YXNrcyk7XG59XG5cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSFcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJfbG9vcHMoKSB7XG5cdHRhc2tzLmNsZWFyKCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0YXNrIHRoYXQgcnVucyBvbiBlYWNoIHJhZiBmcmFtZVxuICogdW50aWwgaXQgcmV0dXJucyBhIGZhbHN5IHZhbHVlIG9yIGlzIGFib3J0ZWRcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3ByaXZhdGUuanMnKS5UYXNrQ2FsbGJhY2t9IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL3ByaXZhdGUuanMnKS5UYXNrfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9vcChjYWxsYmFjaykge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9wcml2YXRlLmpzJykuVGFza0VudHJ5fSAqL1xuXHRsZXQgdGFzaztcblx0aWYgKHRhc2tzLnNpemUgPT09IDApIHJhZihydW5fdGFza3MpO1xuXHRyZXR1cm4ge1xuXHRcdHByb21pc2U6IG5ldyBQcm9taXNlKChmdWxmaWxsKSA9PiB7XG5cdFx0XHR0YXNrcy5hZGQoKHRhc2sgPSB7IGM6IGNhbGxiYWNrLCBmOiBmdWxmaWxsIH0pKTtcblx0XHR9KSxcblx0XHRhYm9ydCgpIHtcblx0XHRcdHRhc2tzLmRlbGV0ZSh0YXNrKTtcblx0XHR9XG5cdH07XG59XG4iLCAiaW1wb3J0IHsgYXBwZW5kX2VtcHR5X3N0eWxlc2hlZXQsIGRldGFjaCwgZ2V0X3Jvb3RfZm9yX3N0eWxlIH0gZnJvbSAnLi9kb20uanMnO1xuaW1wb3J0IHsgcmFmIH0gZnJvbSAnLi9lbnZpcm9ubWVudC5qcyc7XG5cbi8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciBtdWx0aXBsZSBkb2N1bWVudHMgYmVjYXVzZSBhIFN2ZWx0ZSBhcHBsaWNhdGlvbiBjb3VsZCBhbHNvIGNvbnRhaW4gaWZyYW1lc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3N2ZWx0ZWpzL3N2ZWx0ZS9pc3N1ZXMvMzYyNFxuLyoqIEB0eXBlIHtNYXA8RG9jdW1lbnQgfCBTaGFkb3dSb290LCBpbXBvcnQoJy4vcHJpdmF0ZS5kLnRzJykuU3R5bGVJbmZvcm1hdGlvbj59ICovXG5jb25zdCBtYW5hZ2VkX3N0eWxlcyA9IG5ldyBNYXAoKTtcblxubGV0IGFjdGl2ZSA9IDA7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJrc2t5YXBwL3N0cmluZy1oYXNoL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGhhc2goc3RyKSB7XG5cdGxldCBoYXNoID0gNTM4MTtcblx0bGV0IGkgPSBzdHIubGVuZ3RoO1xuXHR3aGlsZSAoaS0tKSBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgXiBzdHIuY2hhckNvZGVBdChpKTtcblx0cmV0dXJuIGhhc2ggPj4+IDA7XG59XG5cbi8qKlxuICogQHBhcmFtIHtEb2N1bWVudCB8IFNoYWRvd1Jvb3R9IGRvY1xuICogQHBhcmFtIHtFbGVtZW50ICYgRWxlbWVudENTU0lubGluZVN0eWxlfSBub2RlXG4gKiBAcmV0dXJucyB7eyBzdHlsZXNoZWV0OiBhbnk7IHJ1bGVzOiB7fTsgfX1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlX3N0eWxlX2luZm9ybWF0aW9uKGRvYywgbm9kZSkge1xuXHRjb25zdCBpbmZvID0geyBzdHlsZXNoZWV0OiBhcHBlbmRfZW1wdHlfc3R5bGVzaGVldChub2RlKSwgcnVsZXM6IHt9IH07XG5cdG1hbmFnZWRfc3R5bGVzLnNldChkb2MsIGluZm8pO1xuXHRyZXR1cm4gaW5mbztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnQgJiBFbGVtZW50Q1NTSW5saW5lU3R5bGV9IG5vZGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYlxuICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAqIEBwYXJhbSB7KHQ6IG51bWJlcikgPT4gbnVtYmVyfSBlYXNlXG4gKiBAcGFyYW0geyh0OiBudW1iZXIsIHU6IG51bWJlcikgPT4gc3RyaW5nfSBmblxuICogQHBhcmFtIHtudW1iZXJ9IHVpZFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZV9ydWxlKG5vZGUsIGEsIGIsIGR1cmF0aW9uLCBkZWxheSwgZWFzZSwgZm4sIHVpZCA9IDApIHtcblx0Y29uc3Qgc3RlcCA9IDE2LjY2NiAvIGR1cmF0aW9uO1xuXHRsZXQga2V5ZnJhbWVzID0gJ3tcXG4nO1xuXHRmb3IgKGxldCBwID0gMDsgcCA8PSAxOyBwICs9IHN0ZXApIHtcblx0XHRjb25zdCB0ID0gYSArIChiIC0gYSkgKiBlYXNlKHApO1xuXHRcdGtleWZyYW1lcyArPSBwICogMTAwICsgYCV7JHtmbih0LCAxIC0gdCl9fVxcbmA7XG5cdH1cblx0Y29uc3QgcnVsZSA9IGtleWZyYW1lcyArIGAxMDAlIHske2ZuKGIsIDEgLSBiKX19XFxufWA7XG5cdGNvbnN0IG5hbWUgPSBgX19zdmVsdGVfJHtoYXNoKHJ1bGUpfV8ke3VpZH1gO1xuXHRjb25zdCBkb2MgPSBnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSk7XG5cdGNvbnN0IHsgc3R5bGVzaGVldCwgcnVsZXMgfSA9IG1hbmFnZWRfc3R5bGVzLmdldChkb2MpIHx8IGNyZWF0ZV9zdHlsZV9pbmZvcm1hdGlvbihkb2MsIG5vZGUpO1xuXHRpZiAoIXJ1bGVzW25hbWVdKSB7XG5cdFx0cnVsZXNbbmFtZV0gPSB0cnVlO1xuXHRcdHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShgQGtleWZyYW1lcyAke25hbWV9ICR7cnVsZX1gLCBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG5cdH1cblx0Y29uc3QgYW5pbWF0aW9uID0gbm9kZS5zdHlsZS5hbmltYXRpb24gfHwgJyc7XG5cdG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gYCR7XG5cdFx0YW5pbWF0aW9uID8gYCR7YW5pbWF0aW9ufSwgYCA6ICcnXG5cdH0ke25hbWV9ICR7ZHVyYXRpb259bXMgbGluZWFyICR7ZGVsYXl9bXMgMSBib3RoYDtcblx0YWN0aXZlICs9IDE7XG5cdHJldHVybiBuYW1lO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudCAmIEVsZW1lbnRDU1NJbmxpbmVTdHlsZX0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVfcnVsZShub2RlLCBuYW1lKSB7XG5cdGNvbnN0IHByZXZpb3VzID0gKG5vZGUuc3R5bGUuYW5pbWF0aW9uIHx8ICcnKS5zcGxpdCgnLCAnKTtcblx0Y29uc3QgbmV4dCA9IHByZXZpb3VzLmZpbHRlcihcblx0XHRuYW1lXG5cdFx0XHQ/IChhbmltKSA9PiBhbmltLmluZGV4T2YobmFtZSkgPCAwIC8vIHJlbW92ZSBzcGVjaWZpYyBhbmltYXRpb25cblx0XHRcdDogKGFuaW0pID0+IGFuaW0uaW5kZXhPZignX19zdmVsdGUnKSA9PT0gLTEgLy8gcmVtb3ZlIGFsbCBTdmVsdGUgYW5pbWF0aW9uc1xuXHQpO1xuXHRjb25zdCBkZWxldGVkID0gcHJldmlvdXMubGVuZ3RoIC0gbmV4dC5sZW5ndGg7XG5cdGlmIChkZWxldGVkKSB7XG5cdFx0bm9kZS5zdHlsZS5hbmltYXRpb24gPSBuZXh0LmpvaW4oJywgJyk7XG5cdFx0YWN0aXZlIC09IGRlbGV0ZWQ7XG5cdFx0aWYgKCFhY3RpdmUpIGNsZWFyX3J1bGVzKCk7XG5cdH1cbn1cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyX3J1bGVzKCkge1xuXHRyYWYoKCkgPT4ge1xuXHRcdGlmIChhY3RpdmUpIHJldHVybjtcblx0XHRtYW5hZ2VkX3N0eWxlcy5mb3JFYWNoKChpbmZvKSA9PiB7XG5cdFx0XHRjb25zdCB7IG93bmVyTm9kZSB9ID0gaW5mby5zdHlsZXNoZWV0O1xuXHRcdFx0Ly8gdGhlcmUgaXMgbm8gb3duZXJOb2RlIGlmIGl0IHJ1bnMgb24ganNkb20uXG5cdFx0XHRpZiAob3duZXJOb2RlKSBkZXRhY2gob3duZXJOb2RlKTtcblx0XHR9KTtcblx0XHRtYW5hZ2VkX3N0eWxlcy5jbGVhcigpO1xuXHR9KTtcbn1cbiIsICJpbXBvcnQgeyBjb250ZW50ZWRpdGFibGVfdHJ1dGh5X3ZhbHVlcywgaGFzX3Byb3AgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJTaW5nbGV0b24gfSBmcm9tICcuL1Jlc2l6ZU9ic2VydmVyU2luZ2xldG9uLmpzJztcblxuLy8gVHJhY2sgd2hpY2ggbm9kZXMgYXJlIGNsYWltZWQgZHVyaW5nIGh5ZHJhdGlvbi4gVW5jbGFpbWVkIG5vZGVzIGNhbiB0aGVuIGJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4vLyBhdCB0aGUgZW5kIG9mIGh5ZHJhdGlvbiB3aXRob3V0IHRvdWNoaW5nIHRoZSByZW1haW5pbmcgbm9kZXMuXG5sZXQgaXNfaHlkcmF0aW5nID0gZmFsc2U7XG5cbi8qKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydF9oeWRyYXRpbmcoKSB7XG5cdGlzX2h5ZHJhdGluZyA9IHRydWU7XG59XG5cbi8qKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmRfaHlkcmF0aW5nKCkge1xuXHRpc19oeWRyYXRpbmcgPSBmYWxzZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gbG93XG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaFxuICogQHBhcmFtIHsoaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyfSBrZXlcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gdXBwZXJfYm91bmQobG93LCBoaWdoLCBrZXksIHZhbHVlKSB7XG5cdC8vIFJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZSBsYXJnZXIgdGhhbiBpbnB1dCB2YWx1ZSBpbiB0aGUgcmFuZ2UgW2xvdywgaGlnaClcblx0d2hpbGUgKGxvdyA8IGhpZ2gpIHtcblx0XHRjb25zdCBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpO1xuXHRcdGlmIChrZXkobWlkKSA8PSB2YWx1ZSkge1xuXHRcdFx0bG93ID0gbWlkICsgMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aGlnaCA9IG1pZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGxvdztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge05vZGVFeH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gaW5pdF9oeWRyYXRlKHRhcmdldCkge1xuXHRpZiAodGFyZ2V0Lmh5ZHJhdGVfaW5pdCkgcmV0dXJuO1xuXHR0YXJnZXQuaHlkcmF0ZV9pbml0ID0gdHJ1ZTtcblx0Ly8gV2Uga25vdyB0aGF0IGFsbCBjaGlsZHJlbiBoYXZlIGNsYWltX29yZGVyIHZhbHVlcyBzaW5jZSB0aGUgdW5jbGFpbWVkIGhhdmUgYmVlbiBkZXRhY2hlZCBpZiB0YXJnZXQgaXMgbm90IDxoZWFkPlxuXG5cdGxldCBjaGlsZHJlbiA9IC8qKiBAdHlwZSB7QXJyYXlMaWtlPE5vZGVFeDI+fSAqLyAodGFyZ2V0LmNoaWxkTm9kZXMpO1xuXHQvLyBJZiB0YXJnZXQgaXMgPGhlYWQ+LCB0aGVyZSBtYXkgYmUgY2hpbGRyZW4gd2l0aG91dCBjbGFpbV9vcmRlclxuXHRpZiAodGFyZ2V0Lm5vZGVOYW1lID09PSAnSEVBRCcpIHtcblx0XHRjb25zdCBteV9jaGlsZHJlbiA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IG5vZGUgPSBjaGlsZHJlbltpXTtcblx0XHRcdGlmIChub2RlLmNsYWltX29yZGVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bXlfY2hpbGRyZW4ucHVzaChub2RlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y2hpbGRyZW4gPSBteV9jaGlsZHJlbjtcblx0fVxuXHQvKlxuXHQgKiBSZW9yZGVyIGNsYWltZWQgY2hpbGRyZW4gb3B0aW1hbGx5LlxuXHQgKiBXZSBjYW4gcmVvcmRlciBjbGFpbWVkIGNoaWxkcmVuIG9wdGltYWxseSBieSBmaW5kaW5nIHRoZSBsb25nZXN0IHN1YnNlcXVlbmNlIG9mXG5cdCAqIG5vZGVzIHRoYXQgYXJlIGFscmVhZHkgY2xhaW1lZCBpbiBvcmRlciBhbmQgb25seSBtb3ZpbmcgdGhlIHJlc3QuIFRoZSBsb25nZXN0XG5cdCAqIHN1YnNlcXVlbmNlIG9mIG5vZGVzIHRoYXQgYXJlIGNsYWltZWQgaW4gb3JkZXIgY2FuIGJlIGZvdW5kIGJ5XG5cdCAqIGNvbXB1dGluZyB0aGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIC5jbGFpbV9vcmRlciB2YWx1ZXMuXG5cdCAqXG5cdCAqIFRoaXMgYWxnb3JpdGhtIGlzIG9wdGltYWwgaW4gZ2VuZXJhdGluZyB0aGUgbGVhc3QgYW1vdW50IG9mIHJlb3JkZXIgb3BlcmF0aW9uc1xuXHQgKiBwb3NzaWJsZS5cblx0ICpcblx0ICogUHJvb2Y6XG5cdCAqIFdlIGtub3cgdGhhdCwgZ2l2ZW4gYSBzZXQgb2YgcmVvcmRlcmluZyBvcGVyYXRpb25zLCB0aGUgbm9kZXMgdGhhdCBkbyBub3QgbW92ZVxuXHQgKiBhbHdheXMgZm9ybSBhbiBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlLCBzaW5jZSB0aGV5IGRvIG5vdCBtb3ZlIGFtb25nIGVhY2ggb3RoZXJcblx0ICogbWVhbmluZyB0aGF0IHRoZXkgbXVzdCBiZSBhbHJlYWR5IG9yZGVyZWQgYW1vbmcgZWFjaCBvdGhlci4gVGh1cywgdGhlIG1heGltYWxcblx0ICogc2V0IG9mIG5vZGVzIHRoYXQgZG8gbm90IG1vdmUgZm9ybSBhIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZS5cblx0ICovXG5cdC8vIENvbXB1dGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlXG5cdC8vIG06IHN1YnNlcXVlbmNlIGxlbmd0aCBqID0+IGluZGV4IGsgb2Ygc21hbGxlc3QgdmFsdWUgdGhhdCBlbmRzIGFuIGluY3JlYXNpbmcgc3Vic2VxdWVuY2Ugb2YgbGVuZ3RoIGpcblx0Y29uc3QgbSA9IG5ldyBJbnQzMkFycmF5KGNoaWxkcmVuLmxlbmd0aCArIDEpO1xuXHQvLyBQcmVkZWNlc3NvciBpbmRpY2VzICsgMVxuXHRjb25zdCBwID0gbmV3IEludDMyQXJyYXkoY2hpbGRyZW4ubGVuZ3RoKTtcblx0bVswXSA9IC0xO1xuXHRsZXQgbG9uZ2VzdCA9IDA7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBjdXJyZW50ID0gY2hpbGRyZW5baV0uY2xhaW1fb3JkZXI7XG5cdFx0Ly8gRmluZCB0aGUgbGFyZ2VzdCBzdWJzZXF1ZW5jZSBsZW5ndGggc3VjaCB0aGF0IGl0IGVuZHMgaW4gYSB2YWx1ZSBsZXNzIHRoYW4gb3VyIGN1cnJlbnQgdmFsdWVcblx0XHQvLyB1cHBlcl9ib3VuZCByZXR1cm5zIGZpcnN0IGdyZWF0ZXIgdmFsdWUsIHNvIHdlIHN1YnRyYWN0IG9uZVxuXHRcdC8vIHdpdGggZmFzdCBwYXRoIGZvciB3aGVuIHdlIGFyZSBvbiB0aGUgY3VycmVudCBsb25nZXN0IHN1YnNlcXVlbmNlXG5cdFx0Y29uc3Qgc2VxX2xlbiA9XG5cdFx0XHQobG9uZ2VzdCA+IDAgJiYgY2hpbGRyZW5bbVtsb25nZXN0XV0uY2xhaW1fb3JkZXIgPD0gY3VycmVudFxuXHRcdFx0XHQ/IGxvbmdlc3QgKyAxXG5cdFx0XHRcdDogdXBwZXJfYm91bmQoMSwgbG9uZ2VzdCwgKGlkeCkgPT4gY2hpbGRyZW5bbVtpZHhdXS5jbGFpbV9vcmRlciwgY3VycmVudCkpIC0gMTtcblx0XHRwW2ldID0gbVtzZXFfbGVuXSArIDE7XG5cdFx0Y29uc3QgbmV3X2xlbiA9IHNlcV9sZW4gKyAxO1xuXHRcdC8vIFdlIGNhbiBndWFyYW50ZWUgdGhhdCBjdXJyZW50IGlzIHRoZSBzbWFsbGVzdCB2YWx1ZS4gT3RoZXJ3aXNlLCB3ZSB3b3VsZCBoYXZlIGdlbmVyYXRlZCBhIGxvbmdlciBzZXF1ZW5jZS5cblx0XHRtW25ld19sZW5dID0gaTtcblx0XHRsb25nZXN0ID0gTWF0aC5tYXgobmV3X2xlbiwgbG9uZ2VzdCk7XG5cdH1cblx0Ly8gVGhlIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBub2RlcyAoaW5pdGlhbGx5IHJldmVyc2VkKVxuXG5cdC8qKlxuXHQgKiBAdHlwZSB7Tm9kZUV4MltdfVxuXHQgKi9cblx0Y29uc3QgbGlzID0gW107XG5cdC8vIFRoZSByZXN0IG9mIHRoZSBub2Rlcywgbm9kZXMgdGhhdCB3aWxsIGJlIG1vdmVkXG5cblx0LyoqXG5cdCAqIEB0eXBlIHtOb2RlRXgyW119XG5cdCAqL1xuXHRjb25zdCB0b19tb3ZlID0gW107XG5cdGxldCBsYXN0ID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTtcblx0Zm9yIChsZXQgY3VyID0gbVtsb25nZXN0XSArIDE7IGN1ciAhPSAwOyBjdXIgPSBwW2N1ciAtIDFdKSB7XG5cdFx0bGlzLnB1c2goY2hpbGRyZW5bY3VyIC0gMV0pO1xuXHRcdGZvciAoOyBsYXN0ID49IGN1cjsgbGFzdC0tKSB7XG5cdFx0XHR0b19tb3ZlLnB1c2goY2hpbGRyZW5bbGFzdF0pO1xuXHRcdH1cblx0XHRsYXN0LS07XG5cdH1cblx0Zm9yICg7IGxhc3QgPj0gMDsgbGFzdC0tKSB7XG5cdFx0dG9fbW92ZS5wdXNoKGNoaWxkcmVuW2xhc3RdKTtcblx0fVxuXHRsaXMucmV2ZXJzZSgpO1xuXHQvLyBXZSBzb3J0IHRoZSBub2RlcyBiZWluZyBtb3ZlZCB0byBndWFyYW50ZWUgdGhhdCB0aGVpciBpbnNlcnRpb24gb3JkZXIgbWF0Y2hlcyB0aGUgY2xhaW0gb3JkZXJcblx0dG9fbW92ZS5zb3J0KChhLCBiKSA9PiBhLmNsYWltX29yZGVyIC0gYi5jbGFpbV9vcmRlcik7XG5cdC8vIEZpbmFsbHksIHdlIG1vdmUgdGhlIG5vZGVzXG5cdGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IHRvX21vdmUubGVuZ3RoOyBpKyspIHtcblx0XHR3aGlsZSAoaiA8IGxpcy5sZW5ndGggJiYgdG9fbW92ZVtpXS5jbGFpbV9vcmRlciA+PSBsaXNbal0uY2xhaW1fb3JkZXIpIHtcblx0XHRcdGorKztcblx0XHR9XG5cdFx0Y29uc3QgYW5jaG9yID0gaiA8IGxpcy5sZW5ndGggPyBsaXNbal0gOiBudWxsO1xuXHRcdHRhcmdldC5pbnNlcnRCZWZvcmUodG9fbW92ZVtpXSwgYW5jaG9yKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kKHRhcmdldCwgbm9kZSkge1xuXHR0YXJnZXQuYXBwZW5kQ2hpbGQobm9kZSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZV9zaGVldF9pZFxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRfc3R5bGVzKHRhcmdldCwgc3R5bGVfc2hlZXRfaWQsIHN0eWxlcykge1xuXHRjb25zdCBhcHBlbmRfc3R5bGVzX3RvID0gZ2V0X3Jvb3RfZm9yX3N0eWxlKHRhcmdldCk7XG5cdGlmICghYXBwZW5kX3N0eWxlc190by5nZXRFbGVtZW50QnlJZChzdHlsZV9zaGVldF9pZCkpIHtcblx0XHRjb25zdCBzdHlsZSA9IGVsZW1lbnQoJ3N0eWxlJyk7XG5cdFx0c3R5bGUuaWQgPSBzdHlsZV9zaGVldF9pZDtcblx0XHRzdHlsZS50ZXh0Q29udGVudCA9IHN0eWxlcztcblx0XHRhcHBlbmRfc3R5bGVzaGVldChhcHBlbmRfc3R5bGVzX3RvLCBzdHlsZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm5zIHtTaGFkb3dSb290IHwgRG9jdW1lbnR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSkge1xuXHRpZiAoIW5vZGUpIHJldHVybiBkb2N1bWVudDtcblx0Y29uc3Qgcm9vdCA9IG5vZGUuZ2V0Um9vdE5vZGUgPyBub2RlLmdldFJvb3ROb2RlKCkgOiBub2RlLm93bmVyRG9jdW1lbnQ7XG5cdGlmIChyb290ICYmIC8qKiBAdHlwZSB7U2hhZG93Um9vdH0gKi8gKHJvb3QpLmhvc3QpIHtcblx0XHRyZXR1cm4gLyoqIEB0eXBlIHtTaGFkb3dSb290fSAqLyAocm9vdCk7XG5cdH1cblx0cmV0dXJuIG5vZGUub3duZXJEb2N1bWVudDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm5zIHtDU1NTdHlsZVNoZWV0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kX2VtcHR5X3N0eWxlc2hlZXQobm9kZSkge1xuXHRjb25zdCBzdHlsZV9lbGVtZW50ID0gZWxlbWVudCgnc3R5bGUnKTtcblx0Ly8gRm9yIHRyYW5zaXRpb25zIHRvIHdvcmsgd2l0aG91dCAnc3R5bGUtc3JjOiB1bnNhZmUtaW5saW5lJyBDb250ZW50IFNlY3VyaXR5IFBvbGljeSxcblx0Ly8gdGhlc2UgZW1wdHkgdGFncyBuZWVkIHRvIGJlIGFsbG93ZWQgd2l0aCBhIGhhc2ggYXMgYSB3b3JrYXJvdW5kIHVudGlsIHdlIG1vdmUgdG8gdGhlIFdlYiBBbmltYXRpb25zIEFQSS5cblx0Ly8gVXNpbmcgdGhlIGhhc2ggZm9yIHRoZSBlbXB0eSBzdHJpbmcgKGZvciBhbiBlbXB0eSB0YWcpIHdvcmtzIGluIGFsbCBicm93c2VycyBleGNlcHQgU2FmYXJpLlxuXHQvLyBTbyBhcyBhIHdvcmthcm91bmQgZm9yIHRoZSB3b3JrYXJvdW5kLCB3aGVuIHdlIGFwcGVuZCBlbXB0eSBzdHlsZSB0YWdzIHdlIHNldCB0aGVpciBjb250ZW50IHRvIC8qIGVtcHR5ICovLlxuXHQvLyBUaGUgaGFzaCAnc2hhMjU2LTlPbE5PMERORWVhVnpITDRSWndDTHNCSEE4V0JROHRvQnAvNEY1WFYybmM9JyB3aWxsIHRoZW4gd29yayBldmVuIGluIFNhZmFyaS5cblx0c3R5bGVfZWxlbWVudC50ZXh0Q29udGVudCA9ICcvKiBlbXB0eSAqLyc7XG5cdGFwcGVuZF9zdHlsZXNoZWV0KGdldF9yb290X2Zvcl9zdHlsZShub2RlKSwgc3R5bGVfZWxlbWVudCk7XG5cdHJldHVybiBzdHlsZV9lbGVtZW50LnNoZWV0O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7U2hhZG93Um9vdCB8IERvY3VtZW50fSBub2RlXG4gKiBAcGFyYW0ge0hUTUxTdHlsZUVsZW1lbnR9IHN0eWxlXG4gKiBAcmV0dXJucyB7Q1NTU3R5bGVTaGVldH1cbiAqL1xuZnVuY3Rpb24gYXBwZW5kX3N0eWxlc2hlZXQobm9kZSwgc3R5bGUpIHtcblx0YXBwZW5kKC8qKiBAdHlwZSB7RG9jdW1lbnR9ICovIChub2RlKS5oZWFkIHx8IG5vZGUsIHN0eWxlKTtcblx0cmV0dXJuIHN0eWxlLnNoZWV0O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Tm9kZUV4fSB0YXJnZXRcbiAqIEBwYXJhbSB7Tm9kZUV4fSBub2RlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZF9oeWRyYXRpb24odGFyZ2V0LCBub2RlKSB7XG5cdGlmIChpc19oeWRyYXRpbmcpIHtcblx0XHRpbml0X2h5ZHJhdGUodGFyZ2V0KTtcblx0XHRpZiAoXG5cdFx0XHR0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHQodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgIT09IG51bGwgJiYgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQucGFyZW50Tm9kZSAhPT0gdGFyZ2V0KVxuXHRcdCkge1xuXHRcdFx0dGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZDtcblx0XHR9XG5cdFx0Ly8gU2tpcCBub2RlcyBvZiB1bmRlZmluZWQgb3JkZXJpbmdcblx0XHR3aGlsZSAodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgIT09IG51bGwgJiYgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQuY2xhaW1fb3JkZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgPSB0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZC5uZXh0U2libGluZztcblx0XHR9XG5cdFx0aWYgKG5vZGUgIT09IHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGluc2VydCBpZiB0aGUgb3JkZXJpbmcgb2YgdGhpcyBub2RlIHNob3VsZCBiZSBtb2RpZmllZCBvciB0aGUgcGFyZW50IG5vZGUgaXMgbm90IHRhcmdldFxuXHRcdFx0aWYgKG5vZGUuY2xhaW1fb3JkZXIgIT09IHVuZGVmaW5lZCB8fCBub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCkge1xuXHRcdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgPSBub2RlLm5leHRTaWJsaW5nO1xuXHRcdH1cblx0fSBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCB8fCBub2RlLm5leHRTaWJsaW5nICE9PSBudWxsKSB7XG5cdFx0dGFyZ2V0LmFwcGVuZENoaWxkKG5vZGUpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogQHBhcmFtIHtOb2RlfSBbYW5jaG9yXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnQodGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcblx0dGFyZ2V0Lmluc2VydEJlZm9yZShub2RlLCBhbmNob3IgfHwgbnVsbCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlRXh9IHRhcmdldFxuICogQHBhcmFtIHtOb2RlRXh9IG5vZGVcbiAqIEBwYXJhbSB7Tm9kZUV4fSBbYW5jaG9yXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG5cdGlmIChpc19oeWRyYXRpbmcgJiYgIWFuY2hvcikge1xuXHRcdGFwcGVuZF9oeWRyYXRpb24odGFyZ2V0LCBub2RlKTtcblx0fSBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCB8fCBub2RlLm5leHRTaWJsaW5nICE9IGFuY2hvcikge1xuXHRcdHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSBub2RlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGFjaChub2RlKSB7XG5cdGlmIChub2RlLnBhcmVudE5vZGUpIHtcblx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95X2VhY2goaXRlcmF0aW9ucywgZGV0YWNoaW5nKSB7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGlmIChpdGVyYXRpb25zW2ldKSBpdGVyYXRpb25zW2ldLmQoZGV0YWNoaW5nKTtcblx0fVxufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7a2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwfSBLXG4gKiBAcGFyYW0ge0t9IG5hbWVcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFRhZ05hbWVNYXBbS119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50KG5hbWUpIHtcblx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIHtrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXB9IEtcbiAqIEBwYXJhbSB7S30gbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGlzXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudF9pcyhuYW1lLCBpcykge1xuXHRyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lLCB7IGlzIH0pO1xufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge2tleW9mIFR9IEtcbiAqIEBwYXJhbSB7VH0gb2JqXG4gKiBAcGFyYW0ge0tbXX0gZXhjbHVkZVxuICogQHJldHVybnMge1BpY2s8VCwgRXhjbHVkZTxrZXlvZiBULCBLPj59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzKG9iaiwgZXhjbHVkZSkge1xuXHRjb25zdCB0YXJnZXQgPSAvKiogQHR5cGUge1BpY2s8VCwgRXhjbHVkZTxrZXlvZiBULCBLPj59ICovICh7fSk7XG5cdGZvciAoY29uc3QgayBpbiBvYmopIHtcblx0XHRpZiAoXG5cdFx0XHRoYXNfcHJvcChvYmosIGspICYmXG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRleGNsdWRlLmluZGV4T2YoaykgPT09IC0xXG5cdFx0KSB7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR0YXJnZXRba10gPSBvYmpba107XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIHtrZXlvZiBTVkdFbGVtZW50VGFnTmFtZU1hcH0gS1xuICogQHBhcmFtIHtLfSBuYW1lXG4gKiBAcmV0dXJucyB7U1ZHRWxlbWVudH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN2Z19lbGVtZW50KG5hbWUpIHtcblx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCBuYW1lKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YVxuICogQHJldHVybnMge1RleHR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KGRhdGEpIHtcblx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEpO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtUZXh0fSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYWNlKCkge1xuXHRyZXR1cm4gdGV4dCgnICcpO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtUZXh0fSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5KCkge1xuXHRyZXR1cm4gdGV4dCgnJyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAqIEByZXR1cm5zIHtDb21tZW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWVudChjb250ZW50KSB7XG5cdHJldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KGNvbnRlbnQpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0fSBoYW5kbGVyXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB8IEV2ZW50TGlzdGVuZXJPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuKG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG5cdG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG5cdHJldHVybiAoKSA9PiBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHsoZXZlbnQ6IGFueSkgPT4gYW55fSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXZlbnRfZGVmYXVsdChmbikge1xuXHRyZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0cmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuXHR9O1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHsoZXZlbnQ6IGFueSkgPT4gYW55fSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3BfcHJvcGFnYXRpb24oZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRyZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG5cdH07XG59XG5cbi8qKlxuICogQHJldHVybnMgeyhldmVudDogYW55KSA9PiBhbnl9ICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcF9pbW1lZGlhdGVfcHJvcGFnYXRpb24oZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRyZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG5cdH07XG59XG5cbi8qKlxuICogQHJldHVybnMgeyhldmVudDogYW55KSA9PiB2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGYoZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzKSBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcblx0fTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7KGV2ZW50OiBhbnkpID0+IHZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1c3RlZChmbikge1xuXHRyZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmIChldmVudC5pc1RydXN0ZWQpIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuXHR9O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG5cdGlmICh2YWx1ZSA9PSBudWxsKSBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuXHRlbHNlIGlmIChub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpICE9PSB2YWx1ZSkgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG59XG4vKipcbiAqIExpc3Qgb2YgYXR0cmlidXRlcyB0aGF0IHNob3VsZCBhbHdheXMgYmUgc2V0IHRocm91Z2ggdGhlIGF0dHIgbWV0aG9kLFxuICogYmVjYXVzZSB1cGRhdGluZyB0aGVtIHRocm91Z2ggdGhlIHByb3BlcnR5IHNldHRlciBkb2Vzbid0IHdvcmsgcmVsaWFibHkuXG4gKiBJbiB0aGUgZXhhbXBsZSBvZiBgd2lkdGhgL2BoZWlnaHRgLCB0aGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBzZXR0ZXIgb25seVxuICogYWNjZXB0cyBudW1lcmljIHZhbHVlcywgYnV0IHRoZSBhdHRyaWJ1dGUgY2FuIGFsc28gYmUgc2V0IHRvIGEgc3RyaW5nIGxpa2UgYDUwJWAuXG4gKiBJZiB0aGlzIGxpc3QgYmVjb21lcyB0b28gYmlnLCByZXRoaW5rIHRoaXMgYXBwcm9hY2guXG4gKi9cbmNvbnN0IGFsd2F5c19zZXRfdGhyb3VnaF9zZXRfYXR0cmlidXRlID0gWyd3aWR0aCcsICdoZWlnaHQnXTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnQgJiBFbGVtZW50Q1NTSW5saW5lU3R5bGV9IG5vZGVcbiAqIEBwYXJhbSB7eyBbeDogc3RyaW5nXTogc3RyaW5nIH19IGF0dHJpYnV0ZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0X2F0dHJpYnV0ZXMobm9kZSwgYXR0cmlidXRlcykge1xuXHQvLyBAdHMtaWdub3JlXG5cdGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobm9kZS5fX3Byb3RvX18pO1xuXHRmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG5cdFx0aWYgKGF0dHJpYnV0ZXNba2V5XSA9PSBudWxsKSB7XG5cdFx0XHRub2RlLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuXHRcdH0gZWxzZSBpZiAoa2V5ID09PSAnc3R5bGUnKSB7XG5cdFx0XHRub2RlLnN0eWxlLmNzc1RleHQgPSBhdHRyaWJ1dGVzW2tleV07XG5cdFx0fSBlbHNlIGlmIChrZXkgPT09ICdfX3ZhbHVlJykge1xuXHRcdFx0LyoqIEB0eXBlIHthbnl9ICovIChub2RlKS52YWx1ZSA9IG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0ZGVzY3JpcHRvcnNba2V5XSAmJlxuXHRcdFx0ZGVzY3JpcHRvcnNba2V5XS5zZXQgJiZcblx0XHRcdGFsd2F5c19zZXRfdGhyb3VnaF9zZXRfYXR0cmlidXRlLmluZGV4T2Yoa2V5KSA9PT0gLTFcblx0XHQpIHtcblx0XHRcdG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YXR0cihub2RlLCBrZXksIGF0dHJpYnV0ZXNba2V5XSk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50ICYgRWxlbWVudENTU0lubGluZVN0eWxlfSBub2RlXG4gKiBAcGFyYW0ge3sgW3g6IHN0cmluZ106IHN0cmluZyB9fSBhdHRyaWJ1dGVzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldF9zdmdfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG5cdGZvciAoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpIHtcblx0XHRhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGRhdGFfbWFwXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldF9jdXN0b21fZWxlbWVudF9kYXRhX21hcChub2RlLCBkYXRhX21hcCkge1xuXHRPYmplY3Qua2V5cyhkYXRhX21hcCkuZm9yRWFjaCgoa2V5KSA9PiB7XG5cdFx0c2V0X2N1c3RvbV9lbGVtZW50X2RhdGEobm9kZSwga2V5LCBkYXRhX21hcFtrZXldKTtcblx0fSk7XG59XG5cbi8qKlxuICogQHJldHVybnMge3ZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gc2V0X2N1c3RvbV9lbGVtZW50X2RhdGEobm9kZSwgcHJvcCwgdmFsdWUpIHtcblx0Y29uc3QgbG93ZXIgPSBwcm9wLnRvTG93ZXJDYXNlKCk7IC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGJlaGF2aW9yIHdlIGRvIGxvd2VyY2FzZSBmaXJzdFxuXHRpZiAobG93ZXIgaW4gbm9kZSkge1xuXHRcdG5vZGVbbG93ZXJdID0gdHlwZW9mIG5vZGVbbG93ZXJdID09PSAnYm9vbGVhbicgJiYgdmFsdWUgPT09ICcnID8gdHJ1ZSA6IHZhbHVlO1xuXHR9IGVsc2UgaWYgKHByb3AgaW4gbm9kZSkge1xuXHRcdG5vZGVbcHJvcF0gPSB0eXBlb2Ygbm9kZVtwcm9wXSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlID09PSAnJyA/IHRydWUgOiB2YWx1ZTtcblx0fSBlbHNlIHtcblx0XHRhdHRyKG5vZGUsIHByb3AsIHZhbHVlKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldF9keW5hbWljX2VsZW1lbnRfZGF0YSh0YWcpIHtcblx0cmV0dXJuIC8tLy50ZXN0KHRhZykgPyBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YV9tYXAgOiBzZXRfYXR0cmlidXRlcztcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhsaW5rX2F0dHIobm9kZSwgYXR0cmlidXRlLCB2YWx1ZSkge1xuXHRub2RlLnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldF9zdmVsdGVfZGF0YXNldChub2RlKSB7XG5cdHJldHVybiBub2RlLmRhdGFzZXQuc3ZlbHRlSDtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7dW5rbm93bltdfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldF9iaW5kaW5nX2dyb3VwX3ZhbHVlKGdyb3VwLCBfX3ZhbHVlLCBjaGVja2VkKSB7XG5cdGNvbnN0IHZhbHVlID0gbmV3IFNldCgpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0aWYgKGdyb3VwW2ldLmNoZWNrZWQpIHZhbHVlLmFkZChncm91cFtpXS5fX3ZhbHVlKTtcblx0fVxuXHRpZiAoIWNoZWNrZWQpIHtcblx0XHR2YWx1ZS5kZWxldGUoX192YWx1ZSk7XG5cdH1cblx0cmV0dXJuIEFycmF5LmZyb20odmFsdWUpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudFtdfSBncm91cFxuICogQHJldHVybnMge3sgcCguLi5pbnB1dHM6IEhUTUxJbnB1dEVsZW1lbnRbXSk6IHZvaWQ7IHIoKTogdm9pZDsgfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRfYmluZGluZ19ncm91cChncm91cCkge1xuXHQvKipcblx0ICogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnRbXX0gKi9cblx0bGV0IF9pbnB1dHM7XG5cdHJldHVybiB7XG5cdFx0LyogcHVzaCAqLyBwKC4uLmlucHV0cykge1xuXHRcdFx0X2lucHV0cyA9IGlucHV0cztcblx0XHRcdF9pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IGdyb3VwLnB1c2goaW5wdXQpKTtcblx0XHR9LFxuXHRcdC8qIHJlbW92ZSAqLyByKCkge1xuXHRcdFx0X2lucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4gZ3JvdXAuc3BsaWNlKGdyb3VwLmluZGV4T2YoaW5wdXQpLCAxKSk7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyW119IGluZGV4ZXNcbiAqIEByZXR1cm5zIHt7IHUobmV3X2luZGV4ZXM6IG51bWJlcltdKTogdm9pZDsgcCguLi5pbnB1dHM6IEhUTUxJbnB1dEVsZW1lbnRbXSk6IHZvaWQ7IHI6ICgpID0+IHZvaWQ7IH19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0X2JpbmRpbmdfZ3JvdXBfZHluYW1pYyhncm91cCwgaW5kZXhlcykge1xuXHQvKipcblx0ICogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnRbXX0gKi9cblx0bGV0IF9ncm91cCA9IGdldF9iaW5kaW5nX2dyb3VwKGdyb3VwKTtcblxuXHQvKipcblx0ICogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnRbXX0gKi9cblx0bGV0IF9pbnB1dHM7XG5cblx0ZnVuY3Rpb24gZ2V0X2JpbmRpbmdfZ3JvdXAoZ3JvdXApIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGdyb3VwID0gZ3JvdXBbaW5kZXhlc1tpXV0gPSBncm91cFtpbmRleGVzW2ldXSB8fCBbXTtcblx0XHR9XG5cdFx0cmV0dXJuIGdyb3VwO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm5zIHt2b2lkfSAqL1xuXHRmdW5jdGlvbiBwdXNoKCkge1xuXHRcdF9pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IF9ncm91cC5wdXNoKGlucHV0KSk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybnMge3ZvaWR9ICovXG5cdGZ1bmN0aW9uIHJlbW92ZSgpIHtcblx0XHRfaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiBfZ3JvdXAuc3BsaWNlKF9ncm91cC5pbmRleE9mKGlucHV0KSwgMSkpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0LyogdXBkYXRlICovIHUobmV3X2luZGV4ZXMpIHtcblx0XHRcdGluZGV4ZXMgPSBuZXdfaW5kZXhlcztcblx0XHRcdGNvbnN0IG5ld19ncm91cCA9IGdldF9iaW5kaW5nX2dyb3VwKGdyb3VwKTtcblx0XHRcdGlmIChuZXdfZ3JvdXAgIT09IF9ncm91cCkge1xuXHRcdFx0XHRyZW1vdmUoKTtcblx0XHRcdFx0X2dyb3VwID0gbmV3X2dyb3VwO1xuXHRcdFx0XHRwdXNoKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKiBwdXNoICovIHAoLi4uaW5wdXRzKSB7XG5cdFx0XHRfaW5wdXRzID0gaW5wdXRzO1xuXHRcdFx0cHVzaCgpO1xuXHRcdH0sXG5cdFx0LyogcmVtb3ZlICovIHI6IHJlbW92ZVxuXHR9O1xufVxuXG4vKiogQHJldHVybnMge251bWJlcn0gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b19udW1iZXIodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlID09PSAnJyA/IG51bGwgOiArdmFsdWU7XG59XG5cbi8qKiBAcmV0dXJucyB7YW55W119ICovXG5leHBvcnQgZnVuY3Rpb24gdGltZV9yYW5nZXNfdG9fYXJyYXkocmFuZ2VzKSB7XG5cdGNvbnN0IGFycmF5ID0gW107XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0YXJyYXkucHVzaCh7IHN0YXJ0OiByYW5nZXMuc3RhcnQoaSksIGVuZDogcmFuZ2VzLmVuZChpKSB9KTtcblx0fVxuXHRyZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7Q2hpbGROb2RlW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZHJlbihlbGVtZW50KSB7XG5cdHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGROb2Rlcyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDaGlsZE5vZGVBcnJheX0gbm9kZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBpbml0X2NsYWltX2luZm8obm9kZXMpIHtcblx0aWYgKG5vZGVzLmNsYWltX2luZm8gPT09IHVuZGVmaW5lZCkge1xuXHRcdG5vZGVzLmNsYWltX2luZm8gPSB7IGxhc3RfaW5kZXg6IDAsIHRvdGFsX2NsYWltZWQ6IDAgfTtcblx0fVxufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q2hpbGROb2RlRXh9IFJcbiAqIEBwYXJhbSB7Q2hpbGROb2RlQXJyYXl9IG5vZGVzXG4gKiBAcGFyYW0geyhub2RlOiBDaGlsZE5vZGVFeCkgPT4gbm9kZSBpcyBSfSBwcmVkaWNhdGVcbiAqIEBwYXJhbSB7KG5vZGU6IENoaWxkTm9kZUV4KSA9PiBDaGlsZE5vZGVFeCB8IHVuZGVmaW5lZH0gcHJvY2Vzc19ub2RlXG4gKiBAcGFyYW0geygpID0+IFJ9IGNyZWF0ZV9ub2RlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGRvbnRfdXBkYXRlX2xhc3RfaW5kZXhcbiAqIEByZXR1cm5zIHtSfVxuICovXG5mdW5jdGlvbiBjbGFpbV9ub2RlKG5vZGVzLCBwcmVkaWNhdGUsIHByb2Nlc3Nfbm9kZSwgY3JlYXRlX25vZGUsIGRvbnRfdXBkYXRlX2xhc3RfaW5kZXggPSBmYWxzZSkge1xuXHQvLyBUcnkgdG8gZmluZCBub2RlcyBpbiBhbiBvcmRlciBzdWNoIHRoYXQgd2UgbGVuZ3RoZW4gdGhlIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZVxuXHRpbml0X2NsYWltX2luZm8obm9kZXMpO1xuXHRjb25zdCByZXN1bHRfbm9kZSA9ICgoKSA9PiB7XG5cdFx0Ly8gV2UgZmlyc3QgdHJ5IHRvIGZpbmQgYW4gZWxlbWVudCBhZnRlciB0aGUgcHJldmlvdXMgb25lXG5cdFx0Zm9yIChsZXQgaSA9IG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBub2RlID0gbm9kZXNbaV07XG5cdFx0XHRpZiAocHJlZGljYXRlKG5vZGUpKSB7XG5cdFx0XHRcdGNvbnN0IHJlcGxhY2VtZW50ID0gcHJvY2Vzc19ub2RlKG5vZGUpO1xuXHRcdFx0XHRpZiAocmVwbGFjZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG5vZGVzLnNwbGljZShpLCAxKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRub2Rlc1tpXSA9IHJlcGxhY2VtZW50O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghZG9udF91cGRhdGVfbGFzdF9pbmRleCkge1xuXHRcdFx0XHRcdG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCA9IGk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIE90aGVyd2lzZSwgd2UgdHJ5IHRvIGZpbmQgb25lIGJlZm9yZVxuXHRcdC8vIFdlIGl0ZXJhdGUgaW4gcmV2ZXJzZSBzbyB0aGF0IHdlIGRvbid0IGdvIHRvbyBmYXIgYmFja1xuXHRcdGZvciAobGV0IGkgPSBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0Y29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuXHRcdFx0aWYgKHByZWRpY2F0ZShub2RlKSkge1xuXHRcdFx0XHRjb25zdCByZXBsYWNlbWVudCA9IHByb2Nlc3Nfbm9kZShub2RlKTtcblx0XHRcdFx0aWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRub2Rlcy5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bm9kZXNbaV0gPSByZXBsYWNlbWVudDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIWRvbnRfdXBkYXRlX2xhc3RfaW5kZXgpIHtcblx0XHRcdFx0XHRub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXggPSBpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHQvLyBTaW5jZSB3ZSBzcGxpY2VkIGJlZm9yZSB0aGUgbGFzdF9pbmRleCwgd2UgZGVjcmVhc2UgaXRcblx0XHRcdFx0XHRub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbm9kZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gSWYgd2UgY2FuJ3QgZmluZCBhbnkgbWF0Y2hpbmcgbm9kZSwgd2UgY3JlYXRlIGEgbmV3IG9uZVxuXHRcdHJldHVybiBjcmVhdGVfbm9kZSgpO1xuXHR9KSgpO1xuXHRyZXN1bHRfbm9kZS5jbGFpbV9vcmRlciA9IG5vZGVzLmNsYWltX2luZm8udG90YWxfY2xhaW1lZDtcblx0bm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkICs9IDE7XG5cdHJldHVybiByZXN1bHRfbm9kZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0NoaWxkTm9kZUFycmF5fSBub2Rlc1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBib29sZWFuIH19IGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7KG5hbWU6IHN0cmluZykgPT4gRWxlbWVudCB8IFNWR0VsZW1lbnR9IGNyZWF0ZV9lbGVtZW50XG4gKiBAcmV0dXJucyB7RWxlbWVudCB8IFNWR0VsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGNsYWltX2VsZW1lbnRfYmFzZShub2RlcywgbmFtZSwgYXR0cmlidXRlcywgY3JlYXRlX2VsZW1lbnQpIHtcblx0cmV0dXJuIGNsYWltX25vZGUoXG5cdFx0bm9kZXMsXG5cdFx0LyoqIEByZXR1cm5zIHtub2RlIGlzIEVsZW1lbnQgfCBTVkdFbGVtZW50fSAqL1xuXHRcdChub2RlKSA9PiBub2RlLm5vZGVOYW1lID09PSBuYW1lLFxuXHRcdC8qKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgKi9cblx0XHQobm9kZSkgPT4ge1xuXHRcdFx0Y29uc3QgcmVtb3ZlID0gW107XG5cdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IG5vZGUuYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBub2RlLmF0dHJpYnV0ZXNbal07XG5cdFx0XHRcdGlmICghYXR0cmlidXRlc1thdHRyaWJ1dGUubmFtZV0pIHtcblx0XHRcdFx0XHRyZW1vdmUucHVzaChhdHRyaWJ1dGUubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJlbW92ZS5mb3JFYWNoKCh2KSA9PiBub2RlLnJlbW92ZUF0dHJpYnV0ZSh2KSk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0KCkgPT4gY3JlYXRlX2VsZW1lbnQobmFtZSlcblx0KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0NoaWxkTm9kZUFycmF5fSBub2Rlc1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBib29sZWFuIH19IGF0dHJpYnV0ZXNcbiAqIEByZXR1cm5zIHtFbGVtZW50IHwgU1ZHRWxlbWVudH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYWltX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcblx0cmV0dXJuIGNsYWltX2VsZW1lbnRfYmFzZShub2RlcywgbmFtZSwgYXR0cmlidXRlcywgZWxlbWVudCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDaGlsZE5vZGVBcnJheX0gbm9kZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9fSBhdHRyaWJ1dGVzXG4gKiBAcmV0dXJucyB7RWxlbWVudCB8IFNWR0VsZW1lbnR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFpbV9zdmdfZWxlbWVudChub2RlcywgbmFtZSwgYXR0cmlidXRlcykge1xuXHRyZXR1cm4gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBzdmdfZWxlbWVudCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDaGlsZE5vZGVBcnJheX0gbm9kZXNcbiAqIEByZXR1cm5zIHtUZXh0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhaW1fdGV4dChub2RlcywgZGF0YSkge1xuXHRyZXR1cm4gY2xhaW1fbm9kZShcblx0XHRub2Rlcyxcblx0XHQvKiogQHJldHVybnMge25vZGUgaXMgVGV4dH0gKi9cblx0XHQobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMyxcblx0XHQvKiogQHBhcmFtIHtUZXh0fSBub2RlICovXG5cdFx0KG5vZGUpID0+IHtcblx0XHRcdGNvbnN0IGRhdGFfc3RyID0gJycgKyBkYXRhO1xuXHRcdFx0aWYgKG5vZGUuZGF0YS5zdGFydHNXaXRoKGRhdGFfc3RyKSkge1xuXHRcdFx0XHRpZiAobm9kZS5kYXRhLmxlbmd0aCAhPT0gZGF0YV9zdHIubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5vZGUuc3BsaXRUZXh0KGRhdGFfc3RyLmxlbmd0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5vZGUuZGF0YSA9IGRhdGFfc3RyO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0KCkgPT4gdGV4dChkYXRhKSxcblx0XHR0cnVlIC8vIFRleHQgbm9kZXMgc2hvdWxkIG5vdCB1cGRhdGUgbGFzdCBpbmRleCBzaW5jZSBpdCBpcyBsaWtlbHkgbm90IHdvcnRoIGl0IHRvIGVsaW1pbmF0ZSBhbiBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIGFjdHVhbCBlbGVtZW50c1xuXHQpO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtUZXh0fSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYWltX3NwYWNlKG5vZGVzKSB7XG5cdHJldHVybiBjbGFpbV90ZXh0KG5vZGVzLCAnICcpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Q2hpbGROb2RlQXJyYXl9IG5vZGVzXG4gKiBAcmV0dXJucyB7Q29tbWVudH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYWltX2NvbW1lbnQobm9kZXMsIGRhdGEpIHtcblx0cmV0dXJuIGNsYWltX25vZGUoXG5cdFx0bm9kZXMsXG5cdFx0LyoqIEByZXR1cm5zIHtub2RlIGlzIENvbW1lbnR9ICovXG5cdFx0KG5vZGUpID0+IG5vZGUubm9kZVR5cGUgPT09IDgsXG5cdFx0LyoqIEBwYXJhbSB7Q29tbWVudH0gbm9kZSAqL1xuXHRcdChub2RlKSA9PiB7XG5cdFx0XHRub2RlLmRhdGEgPSAnJyArIGRhdGE7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0KCkgPT4gY29tbWVudChkYXRhKSxcblx0XHR0cnVlXG5cdCk7XG59XG5cbmZ1bmN0aW9uIGdldF9jb21tZW50X2lkeChub2RlcywgdGV4dCwgc3RhcnQpIHtcblx0Zm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRjb25zdCBub2RlID0gbm9kZXNbaV07XG5cdFx0aWYgKG5vZGUubm9kZVR5cGUgPT09IDggLyogY29tbWVudCBub2RlICovICYmIG5vZGUudGV4dENvbnRlbnQudHJpbSgpID09PSB0ZXh0KSB7XG5cdFx0XHRyZXR1cm4gaTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNfc3ZnXG4gKiBAcmV0dXJucyB7SHRtbFRhZ0h5ZHJhdGlvbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYWltX2h0bWxfdGFnKG5vZGVzLCBpc19zdmcpIHtcblx0Ly8gZmluZCBodG1sIG9wZW5pbmcgdGFnXG5cdGNvbnN0IHN0YXJ0X2luZGV4ID0gZ2V0X2NvbW1lbnRfaWR4KG5vZGVzLCAnSFRNTF9UQUdfU1RBUlQnLCAwKTtcblx0Y29uc3QgZW5kX2luZGV4ID0gZ2V0X2NvbW1lbnRfaWR4KG5vZGVzLCAnSFRNTF9UQUdfRU5EJywgc3RhcnRfaW5kZXggKyAxKTtcblx0aWYgKHN0YXJ0X2luZGV4ID09PSAtMSB8fCBlbmRfaW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIG5ldyBIdG1sVGFnSHlkcmF0aW9uKGlzX3N2Zyk7XG5cdH1cblxuXHRpbml0X2NsYWltX2luZm8obm9kZXMpO1xuXHRjb25zdCBodG1sX3RhZ19ub2RlcyA9IG5vZGVzLnNwbGljZShzdGFydF9pbmRleCwgZW5kX2luZGV4IC0gc3RhcnRfaW5kZXggKyAxKTtcblx0ZGV0YWNoKGh0bWxfdGFnX25vZGVzWzBdKTtcblx0ZGV0YWNoKGh0bWxfdGFnX25vZGVzW2h0bWxfdGFnX25vZGVzLmxlbmd0aCAtIDFdKTtcblx0Y29uc3QgY2xhaW1lZF9ub2RlcyA9IGh0bWxfdGFnX25vZGVzLnNsaWNlKDEsIGh0bWxfdGFnX25vZGVzLmxlbmd0aCAtIDEpO1xuXHRpZiAoY2xhaW1lZF9ub2Rlcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gbmV3IEh0bWxUYWdIeWRyYXRpb24oaXNfc3ZnKTtcblx0fVxuXHRmb3IgKGNvbnN0IG4gb2YgY2xhaW1lZF9ub2Rlcykge1xuXHRcdG4uY2xhaW1fb3JkZXIgPSBub2Rlcy5jbGFpbV9pbmZvLnRvdGFsX2NsYWltZWQ7XG5cdFx0bm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkICs9IDE7XG5cdH1cblx0cmV0dXJuIG5ldyBIdG1sVGFnSHlkcmF0aW9uKGlzX3N2ZywgY2xhaW1lZF9ub2Rlcyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtUZXh0fSB0ZXh0XG4gKiBAcGFyYW0ge3Vua25vd259IGRhdGFcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0X2RhdGEodGV4dCwgZGF0YSkge1xuXHRkYXRhID0gJycgKyBkYXRhO1xuXHRpZiAodGV4dC5kYXRhID09PSBkYXRhKSByZXR1cm47XG5cdHRleHQuZGF0YSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGF0YSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtUZXh0fSB0ZXh0XG4gKiBAcGFyYW0ge3Vua25vd259IGRhdGFcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0X2RhdGFfY29udGVudGVkaXRhYmxlKHRleHQsIGRhdGEpIHtcblx0ZGF0YSA9ICcnICsgZGF0YTtcblx0aWYgKHRleHQud2hvbGVUZXh0ID09PSBkYXRhKSByZXR1cm47XG5cdHRleHQuZGF0YSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGF0YSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtUZXh0fSB0ZXh0XG4gKiBAcGFyYW0ge3Vua25vd259IGRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyX3ZhbHVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldF9kYXRhX21heWJlX2NvbnRlbnRlZGl0YWJsZSh0ZXh0LCBkYXRhLCBhdHRyX3ZhbHVlKSB7XG5cdGlmICh+Y29udGVudGVkaXRhYmxlX3RydXRoeV92YWx1ZXMuaW5kZXhPZihhdHRyX3ZhbHVlKSkge1xuXHRcdHNldF9kYXRhX2NvbnRlbnRlZGl0YWJsZSh0ZXh0LCBkYXRhKTtcblx0fSBlbHNlIHtcblx0XHRzZXRfZGF0YSh0ZXh0LCBkYXRhKTtcblx0fVxufVxuXG4vKipcbiAqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldF9pbnB1dF92YWx1ZShpbnB1dCwgdmFsdWUpIHtcblx0aW5wdXQudmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRfaW5wdXRfdHlwZShpbnB1dCwgdHlwZSkge1xuXHR0cnkge1xuXHRcdGlucHV0LnR5cGUgPSB0eXBlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gZG8gbm90aGluZ1xuXHR9XG59XG5cbi8qKlxuICogQHJldHVybnMge3ZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gc2V0X3N0eWxlKG5vZGUsIGtleSwgdmFsdWUsIGltcG9ydGFudCkge1xuXHRpZiAodmFsdWUgPT0gbnVsbCkge1xuXHRcdG5vZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoa2V5KTtcblx0fSBlbHNlIHtcblx0XHRub2RlLnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWUsIGltcG9ydGFudCA/ICdpbXBvcnRhbnQnIDogJycpO1xuXHR9XG59XG5cbi8qKlxuICogQHJldHVybnMge3ZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0X29wdGlvbihzZWxlY3QsIHZhbHVlLCBtb3VudGluZykge1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0Y29uc3Qgb3B0aW9uID0gc2VsZWN0Lm9wdGlvbnNbaV07XG5cdFx0aWYgKG9wdGlvbi5fX3ZhbHVlID09PSB2YWx1ZSkge1xuXHRcdFx0b3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblx0aWYgKCFtb3VudGluZyB8fCB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0c2VsZWN0LnNlbGVjdGVkSW5kZXggPSAtMTsgLy8gbm8gb3B0aW9uIHNob3VsZCBiZSBzZWxlY3RlZFxuXHR9XG59XG5cbi8qKlxuICogQHJldHVybnMge3ZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0X29wdGlvbnMoc2VsZWN0LCB2YWx1ZSkge1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0Y29uc3Qgb3B0aW9uID0gc2VsZWN0Lm9wdGlvbnNbaV07XG5cdFx0b3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RfdmFsdWUoc2VsZWN0KSB7XG5cdGNvbnN0IHNlbGVjdGVkX29wdGlvbiA9IHNlbGVjdC5xdWVyeVNlbGVjdG9yKCc6Y2hlY2tlZCcpO1xuXHRyZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuXHRyZXR1cm4gW10ubWFwLmNhbGwoc2VsZWN0LnF1ZXJ5U2VsZWN0b3JBbGwoJzpjaGVja2VkJyksIChvcHRpb24pID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbi8vIHVuZm9ydHVuYXRlbHkgdGhpcyBjYW4ndCBiZSBhIGNvbnN0YW50IGFzIHRoYXQgd291bGRuJ3QgYmUgdHJlZS1zaGFrZWFibGVcbi8vIHNvIHdlIGNhY2hlIHRoZSByZXN1bHQgaW5zdGVhZFxuXG4vKipcbiAqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGNyb3Nzb3JpZ2luO1xuXG4vKipcbiAqIEByZXR1cm5zIHtib29sZWFufSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzX2Nyb3Nzb3JpZ2luKCkge1xuXHRpZiAoY3Jvc3NvcmlnaW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdGNyb3Nzb3JpZ2luID0gZmFsc2U7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGFyZW50KSB7XG5cdFx0XHRcdHZvaWQgd2luZG93LnBhcmVudC5kb2N1bWVudDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y3Jvc3NvcmlnaW4gPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY3Jvc3NvcmlnaW47XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBmblxuICogQHJldHVybnMgeygpID0+IHZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRfaWZyYW1lX3Jlc2l6ZV9saXN0ZW5lcihub2RlLCBmbikge1xuXHRjb25zdCBjb21wdXRlZF9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG5cdGlmIChjb21wdXRlZF9zdHlsZS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcblx0XHRub2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcblx0fVxuXHRjb25zdCBpZnJhbWUgPSBlbGVtZW50KCdpZnJhbWUnKTtcblx0aWZyYW1lLnNldEF0dHJpYnV0ZShcblx0XHQnc3R5bGUnLFxuXHRcdCdkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7ICcgK1xuXHRcdFx0J292ZXJmbG93OiBoaWRkZW47IGJvcmRlcjogMDsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOydcblx0KTtcblx0aWZyYW1lLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXHRpZnJhbWUudGFiSW5kZXggPSAtMTtcblx0Y29uc3QgY3Jvc3NvcmlnaW4gPSBpc19jcm9zc29yaWdpbigpO1xuXG5cdC8qKlxuXHQgKiBAdHlwZSB7KCkgPT4gdm9pZH1cblx0ICovXG5cdGxldCB1bnN1YnNjcmliZTtcblx0aWYgKGNyb3Nzb3JpZ2luKSB7XG5cdFx0aWZyYW1lLnNyYyA9IFwiZGF0YTp0ZXh0L2h0bWwsPHNjcmlwdD5vbnJlc2l6ZT1mdW5jdGlvbigpe3BhcmVudC5wb3N0TWVzc2FnZSgwLCcqJyl9PC9zY3JpcHQ+XCI7XG5cdFx0dW5zdWJzY3JpYmUgPSBsaXN0ZW4oXG5cdFx0XHR3aW5kb3csXG5cdFx0XHQnbWVzc2FnZScsXG5cdFx0XHQvKiogQHBhcmFtIHtNZXNzYWdlRXZlbnR9IGV2ZW50ICovIChldmVudCkgPT4ge1xuXHRcdFx0XHRpZiAoZXZlbnQuc291cmNlID09PSBpZnJhbWUuY29udGVudFdpbmRvdykgZm4oKTtcblx0XHRcdH1cblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGlmcmFtZS5zcmMgPSAnYWJvdXQ6YmxhbmsnO1xuXHRcdGlmcmFtZS5vbmxvYWQgPSAoKSA9PiB7XG5cdFx0XHR1bnN1YnNjcmliZSA9IGxpc3RlbihpZnJhbWUuY29udGVudFdpbmRvdywgJ3Jlc2l6ZScsIGZuKTtcblx0XHRcdC8vIG1ha2Ugc3VyZSBhbiBpbml0aWFsIHJlc2l6ZSBldmVudCBpcyBmaXJlZCBfYWZ0ZXJfIHRoZSBpZnJhbWUgaXMgbG9hZGVkICh3aGljaCBpcyBhc3luY2hyb25vdXMpXG5cdFx0XHQvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3N2ZWx0ZWpzL3N2ZWx0ZS9pc3N1ZXMvNDIzM1xuXHRcdFx0Zm4oKTtcblx0XHR9O1xuXHR9XG5cdGFwcGVuZChub2RlLCBpZnJhbWUpO1xuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmIChjcm9zc29yaWdpbikge1xuXHRcdFx0dW5zdWJzY3JpYmUoKTtcblx0XHR9IGVsc2UgaWYgKHVuc3Vic2NyaWJlICYmIGlmcmFtZS5jb250ZW50V2luZG93KSB7XG5cdFx0XHR1bnN1YnNjcmliZSgpO1xuXHRcdH1cblx0XHRkZXRhY2goaWZyYW1lKTtcblx0fTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVfb2JzZXJ2ZXJfY29udGVudF9ib3ggPSAvKiBAX19QVVJFX18gKi8gbmV3IFJlc2l6ZU9ic2VydmVyU2luZ2xldG9uKHtcblx0Ym94OiAnY29udGVudC1ib3gnXG59KTtcbmV4cG9ydCBjb25zdCByZXNpemVfb2JzZXJ2ZXJfYm9yZGVyX2JveCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgUmVzaXplT2JzZXJ2ZXJTaW5nbGV0b24oe1xuXHRib3g6ICdib3JkZXItYm94J1xufSk7XG5leHBvcnQgY29uc3QgcmVzaXplX29ic2VydmVyX2RldmljZV9waXhlbF9jb250ZW50X2JveCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgUmVzaXplT2JzZXJ2ZXJTaW5nbGV0b24oXG5cdHsgYm94OiAnZGV2aWNlLXBpeGVsLWNvbnRlbnQtYm94JyB9XG4pO1xuZXhwb3J0IHsgUmVzaXplT2JzZXJ2ZXJTaW5nbGV0b24gfTtcblxuLyoqXG4gKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVfY2xhc3MoZWxlbWVudCwgbmFtZSwgdG9nZ2xlKSB7XG5cdC8vIFRoZSBgISFgIGlzIHJlcXVpcmVkIGJlY2F1c2UgYW4gYHVuZGVmaW5lZGAgZmxhZyBtZWFucyBmbGlwcGluZyB0aGUgY3VycmVudCBzdGF0ZS5cblx0ZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsICEhdG9nZ2xlKTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7VH0gW2RldGFpbF1cbiAqIEBwYXJhbSB7eyBidWJibGVzPzogYm9vbGVhbiwgY2FuY2VsYWJsZT86IGJvb2xlYW4gfX0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnQ8VD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b21fZXZlbnQodHlwZSwgZGV0YWlsLCB7IGJ1YmJsZXMgPSBmYWxzZSwgY2FuY2VsYWJsZSA9IGZhbHNlIH0gPSB7fSkge1xuXHRyZXR1cm4gbmV3IEN1c3RvbUV2ZW50KHR5cGUsIHsgZGV0YWlsLCBidWJibGVzLCBjYW5jZWxhYmxlIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50XG4gKiBAcmV0dXJucyB7Q2hpbGROb2RlQXJyYXl9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeV9zZWxlY3Rvcl9hbGwoc2VsZWN0b3IsIHBhcmVudCA9IGRvY3VtZW50LmJvZHkpIHtcblx0cmV0dXJuIEFycmF5LmZyb20ocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbm9kZUlkXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBoZWFkXG4gKiBAcmV0dXJucyB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWFkX3NlbGVjdG9yKG5vZGVJZCwgaGVhZCkge1xuXHRjb25zdCByZXN1bHQgPSBbXTtcblx0bGV0IHN0YXJ0ZWQgPSAwO1xuXHRmb3IgKGNvbnN0IG5vZGUgb2YgaGVhZC5jaGlsZE5vZGVzKSB7XG5cdFx0aWYgKG5vZGUubm9kZVR5cGUgPT09IDggLyogY29tbWVudCBub2RlICovKSB7XG5cdFx0XHRjb25zdCBjb21tZW50ID0gbm9kZS50ZXh0Q29udGVudC50cmltKCk7XG5cdFx0XHRpZiAoY29tbWVudCA9PT0gYEhFQURfJHtub2RlSWR9X0VORGApIHtcblx0XHRcdFx0c3RhcnRlZCAtPSAxO1xuXHRcdFx0XHRyZXN1bHQucHVzaChub2RlKTtcblx0XHRcdH0gZWxzZSBpZiAoY29tbWVudCA9PT0gYEhFQURfJHtub2RlSWR9X1NUQVJUYCkge1xuXHRcdFx0XHRzdGFydGVkICs9IDE7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKG5vZGUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc3RhcnRlZCA+IDApIHtcblx0XHRcdHJlc3VsdC5wdXNoKG5vZGUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuLyoqICovXG5leHBvcnQgY2xhc3MgSHRtbFRhZyB7XG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAZGVmYXVsdCBmYWxzZVxuXHQgKi9cblx0aXNfc3ZnID0gZmFsc2U7XG5cdC8qKiBwYXJlbnQgZm9yIGNyZWF0aW5nIG5vZGUgKi9cblx0ZSA9IHVuZGVmaW5lZDtcblx0LyoqIGh0bWwgdGFnIG5vZGVzICovXG5cdG4gPSB1bmRlZmluZWQ7XG5cdC8qKiB0YXJnZXQgKi9cblx0dCA9IHVuZGVmaW5lZDtcblx0LyoqIGFuY2hvciAqL1xuXHRhID0gdW5kZWZpbmVkO1xuXHRjb25zdHJ1Y3Rvcihpc19zdmcgPSBmYWxzZSkge1xuXHRcdHRoaXMuaXNfc3ZnID0gaXNfc3ZnO1xuXHRcdHRoaXMuZSA9IHRoaXMubiA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcblx0ICogQHJldHVybnMge3ZvaWR9XG5cdCAqL1xuXHRjKGh0bWwpIHtcblx0XHR0aGlzLmgoaHRtbCk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnR9IHRhcmdldFxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50IHwgU1ZHRWxlbWVudH0gYW5jaG9yXG5cdCAqIEByZXR1cm5zIHt2b2lkfVxuXHQgKi9cblx0bShodG1sLCB0YXJnZXQsIGFuY2hvciA9IG51bGwpIHtcblx0XHRpZiAoIXRoaXMuZSkge1xuXHRcdFx0aWYgKHRoaXMuaXNfc3ZnKVxuXHRcdFx0XHR0aGlzLmUgPSBzdmdfZWxlbWVudCgvKiogQHR5cGUge2tleW9mIFNWR0VsZW1lbnRUYWdOYW1lTWFwfSAqLyAodGFyZ2V0Lm5vZGVOYW1lKSk7XG5cdFx0XHQvKiogIzczNjQgIHRhcmdldCBmb3IgPHRlbXBsYXRlPiBtYXkgYmUgcHJvdmlkZWQgYXMgI2RvY3VtZW50LWZyYWdtZW50KDExKSAqLyBlbHNlXG5cdFx0XHRcdHRoaXMuZSA9IGVsZW1lbnQoXG5cdFx0XHRcdFx0LyoqIEB0eXBlIHtrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXB9ICovIChcblx0XHRcdFx0XHRcdHRhcmdldC5ub2RlVHlwZSA9PT0gMTEgPyAnVEVNUExBVEUnIDogdGFyZ2V0Lm5vZGVOYW1lXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0dGhpcy50ID1cblx0XHRcdFx0dGFyZ2V0LnRhZ05hbWUgIT09ICdURU1QTEFURSdcblx0XHRcdFx0XHQ/IHRhcmdldFxuXHRcdFx0XHRcdDogLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyAodGFyZ2V0KS5jb250ZW50O1xuXHRcdFx0dGhpcy5jKGh0bWwpO1xuXHRcdH1cblx0XHR0aGlzLmkoYW5jaG9yKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuXHQgKiBAcmV0dXJucyB7dm9pZH1cblx0ICovXG5cdGgoaHRtbCkge1xuXHRcdHRoaXMuZS5pbm5lckhUTUwgPSBodG1sO1xuXHRcdHRoaXMubiA9IEFycmF5LmZyb20oXG5cdFx0XHR0aGlzLmUubm9kZU5hbWUgPT09ICdURU1QTEFURScgPyB0aGlzLmUuY29udGVudC5jaGlsZE5vZGVzIDogdGhpcy5lLmNoaWxkTm9kZXNcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm5zIHt2b2lkfSAqL1xuXHRpKGFuY2hvcikge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHRpbnNlcnQodGhpcy50LCB0aGlzLm5baV0sIGFuY2hvcik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG5cdCAqIEByZXR1cm5zIHt2b2lkfVxuXHQgKi9cblx0cChodG1sKSB7XG5cdFx0dGhpcy5kKCk7XG5cdFx0dGhpcy5oKGh0bWwpO1xuXHRcdHRoaXMuaSh0aGlzLmEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm5zIHt2b2lkfSAqL1xuXHRkKCkge1xuXHRcdHRoaXMubi5mb3JFYWNoKGRldGFjaCk7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIEh0bWxUYWdIeWRyYXRpb24gZXh0ZW5kcyBIdG1sVGFnIHtcblx0LyoqIEB0eXBlIHtFbGVtZW50W119IGh5ZHJhdGlvbiBjbGFpbWVkIG5vZGVzICovXG5cdGwgPSB1bmRlZmluZWQ7XG5cblx0Y29uc3RydWN0b3IoaXNfc3ZnID0gZmFsc2UsIGNsYWltZWRfbm9kZXMpIHtcblx0XHRzdXBlcihpc19zdmcpO1xuXHRcdHRoaXMuZSA9IHRoaXMubiA9IG51bGw7XG5cdFx0dGhpcy5sID0gY2xhaW1lZF9ub2Rlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuXHQgKiBAcmV0dXJucyB7dm9pZH1cblx0ICovXG5cdGMoaHRtbCkge1xuXHRcdGlmICh0aGlzLmwpIHtcblx0XHRcdHRoaXMubiA9IHRoaXMubDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3VwZXIuYyhodG1sKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybnMge3ZvaWR9ICovXG5cdGkoYW5jaG9yKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdGluc2VydF9oeWRyYXRpb24odGhpcy50LCB0aGlzLm5baV0sIGFuY2hvcik7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtOYW1lZE5vZGVNYXB9IGF0dHJpYnV0ZXNcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dHJpYnV0ZV90b19vYmplY3QoYXR0cmlidXRlcykge1xuXHRjb25zdCByZXN1bHQgPSB7fTtcblx0Zm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuXHRcdHJlc3VsdFthdHRyaWJ1dGUubmFtZV0gPSBhdHRyaWJ1dGUudmFsdWU7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgZXNjYXBlZCA9IHtcblx0J1wiJzogJyZxdW90OycsXG5cdCcmJzogJyZhbXA7Jyxcblx0JzwnOiAnJmx0Oydcbn07XG5cbmNvbnN0IHJlZ2V4X2F0dHJpYnV0ZV9jaGFyYWN0ZXJzX3RvX2VzY2FwZSA9IC9bXCImPF0vZztcblxuLyoqXG4gKiBOb3RlIHRoYXQgdGhlIGF0dHJpYnV0ZSBpdHNlbGYgc2hvdWxkIGJlIHN1cnJvdW5kZWQgaW4gZG91YmxlIHF1b3Rlc1xuICogQHBhcmFtIHthbnl9IGF0dHJpYnV0ZVxuICovXG5mdW5jdGlvbiBlc2NhcGVfYXR0cmlidXRlKGF0dHJpYnV0ZSkge1xuXHRyZXR1cm4gU3RyaW5nKGF0dHJpYnV0ZSkucmVwbGFjZShyZWdleF9hdHRyaWJ1dGVfY2hhcmFjdGVyc190b19lc2NhcGUsIChtYXRjaCkgPT4gZXNjYXBlZFttYXRjaF0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gYXR0cmlidXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5X3NwcmVhZChhdHRyaWJ1dGVzKSB7XG5cdGxldCBzdHIgPSAnICc7XG5cdGZvciAoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpIHtcblx0XHRpZiAoYXR0cmlidXRlc1trZXldICE9IG51bGwpIHtcblx0XHRcdHN0ciArPSBgJHtrZXl9PVwiJHtlc2NhcGVfYXR0cmlidXRlKGF0dHJpYnV0ZXNba2V5XSl9XCIgYDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldF9jdXN0b21fZWxlbWVudHNfc2xvdHMoZWxlbWVudCkge1xuXHRjb25zdCByZXN1bHQgPSB7fTtcblx0ZWxlbWVudC5jaGlsZE5vZGVzLmZvckVhY2goXG5cdFx0LyoqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSAqLyAobm9kZSkgPT4ge1xuXHRcdFx0cmVzdWx0W25vZGUuc2xvdCB8fCAnZGVmYXVsdCddID0gdHJ1ZTtcblx0XHR9XG5cdCk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3Rfc3ZlbHRlX2NvbXBvbmVudChjb21wb25lbnQsIHByb3BzKSB7XG5cdHJldHVybiBuZXcgY29tcG9uZW50KHByb3BzKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7Tm9kZSAmIHtcbiAqIFx0Y2xhaW1fb3JkZXI/OiBudW1iZXI7XG4gKiBcdGh5ZHJhdGVfaW5pdD86IHRydWU7XG4gKiBcdGFjdHVhbF9lbmRfY2hpbGQ/OiBOb2RlRXg7XG4gKiBcdGNoaWxkTm9kZXM6IE5vZGVMaXN0T2Y8Tm9kZUV4PjtcbiAqIH19IE5vZGVFeFxuICovXG5cbi8qKiBAdHlwZWRlZiB7Q2hpbGROb2RlICYgTm9kZUV4fSBDaGlsZE5vZGVFeCAqL1xuXG4vKiogQHR5cGVkZWYge05vZGVFeCAmIHsgY2xhaW1fb3JkZXI6IG51bWJlciB9fSBOb2RlRXgyICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NoaWxkTm9kZUV4W10gJiB7XG4gKiBcdGNsYWltX2luZm8/OiB7XG4gKiBcdFx0bGFzdF9pbmRleDogbnVtYmVyO1xuICogXHRcdHRvdGFsX2NsYWltZWQ6IG51bWJlcjtcbiAqIFx0fTtcbiAqIH19IENoaWxkTm9kZUFycmF5XG4gKi9cbiIsICJpbXBvcnQgeyBnbG9iYWxzIH0gZnJvbSAnLi9nbG9iYWxzLmpzJztcblxuLyoqXG4gKiBSZXNpemUgb2JzZXJ2ZXIgc2luZ2xldG9uLlxuICogT25lIGxpc3RlbmVyIHBlciBlbGVtZW50IG9ubHkhXG4gKiBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2EvY2hyb21pdW0ub3JnL2cvYmxpbmstZGV2L2MvejZpZW5PTlViNUEvbS9GNS1WY1VadEJBQUpcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc2l6ZU9ic2VydmVyU2luZ2xldG9uIHtcblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEByZWFkb25seVxuXHQgKiBAdHlwZSB7V2Vha01hcDxFbGVtZW50LCBpbXBvcnQoJy4vcHJpdmF0ZS5qcycpLkxpc3RlbmVyPn1cblx0ICovXG5cdF9saXN0ZW5lcnMgPSAnV2Vha01hcCcgaW4gZ2xvYmFscyA/IG5ldyBXZWFrTWFwKCkgOiB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB0eXBlIHtSZXNpemVPYnNlcnZlcn1cblx0ICovXG5cdF9vYnNlcnZlciA9IHVuZGVmaW5lZDtcblxuXHQvKiogQHR5cGUge1Jlc2l6ZU9ic2VydmVyT3B0aW9uc30gKi9cblx0b3B0aW9ucztcblxuXHQvKiogQHBhcmFtIHtSZXNpemVPYnNlcnZlck9wdGlvbnN9IG9wdGlvbnMgKi9cblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG5cdCAqIEBwYXJhbSB7aW1wb3J0KCcuL3ByaXZhdGUuanMnKS5MaXN0ZW5lcn0gbGlzdGVuZXJcblx0ICogQHJldHVybnMgeygpID0+IHZvaWR9XG5cdCAqL1xuXHRvYnNlcnZlKGVsZW1lbnQsIGxpc3RlbmVyKSB7XG5cdFx0dGhpcy5fbGlzdGVuZXJzLnNldChlbGVtZW50LCBsaXN0ZW5lcik7XG5cdFx0dGhpcy5fZ2V0T2JzZXJ2ZXIoKS5vYnNlcnZlKGVsZW1lbnQsIHRoaXMub3B0aW9ucyk7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRoaXMuX2xpc3RlbmVycy5kZWxldGUoZWxlbWVudCk7XG5cdFx0XHR0aGlzLl9vYnNlcnZlci51bm9ic2VydmUoZWxlbWVudCk7IC8vIHRoaXMgbGluZSBjYW4gcHJvYmFibHkgYmUgcmVtb3ZlZFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRPYnNlcnZlcigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0dGhpcy5fb2JzZXJ2ZXIgPz9cblx0XHRcdCh0aGlzLl9vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcblx0XHRcdFx0XHRSZXNpemVPYnNlcnZlclNpbmdsZXRvbi5lbnRyaWVzLnNldChlbnRyeS50YXJnZXQsIGVudHJ5KTtcblx0XHRcdFx0XHR0aGlzLl9saXN0ZW5lcnMuZ2V0KGVudHJ5LnRhcmdldCk/LihlbnRyeSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pKVxuXHRcdCk7XG5cdH1cbn1cblxuLy8gTmVlZHMgdG8gYmUgd3JpdHRlbiBsaWtlIHRoaXMgdG8gcGFzcyB0aGUgdHJlZS1zaGFrZS10ZXN0XG5SZXNpemVPYnNlcnZlclNpbmdsZXRvbi5lbnRyaWVzID0gJ1dlYWtNYXAnIGluIGdsb2JhbHMgPyBuZXcgV2Vha01hcCgpIDogdW5kZWZpbmVkO1xuIiwgIi8qKiBAdHlwZSB7dHlwZW9mIGdsb2JhbFRoaXN9ICovXG5leHBvcnQgY29uc3QgZ2xvYmFscyA9XG5cdHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG5cdFx0PyB3aW5kb3dcblx0XHQ6IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJ1xuXHRcdD8gZ2xvYmFsVGhpc1xuXHRcdDogLy8gQHRzLWlnbm9yZSBOb2RlIHR5cGluZ3MgaGF2ZSB0aGlzXG5cdFx0ICBnbG9iYWw7XG4iLCAiaW1wb3J0IHsgaXNfcHJvbWlzZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgY2hlY2tfb3V0cm9zLCBncm91cF9vdXRyb3MsIHRyYW5zaXRpb25faW4sIHRyYW5zaXRpb25fb3V0IH0gZnJvbSAnLi90cmFuc2l0aW9ucy5qcyc7XG5pbXBvcnQgeyBmbHVzaCB9IGZyb20gJy4vc2NoZWR1bGVyLmpzJztcbmltcG9ydCB7IGdldF9jdXJyZW50X2NvbXBvbmVudCwgc2V0X2N1cnJlbnRfY29tcG9uZW50IH0gZnJvbSAnLi9saWZlY3ljbGUuanMnO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1Byb21pc2U8VD59IHByb21pc2VcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3ByaXZhdGUuanMnKS5Qcm9taXNlSW5mbzxUPn0gaW5mb1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVfcHJvbWlzZShwcm9taXNlLCBpbmZvKSB7XG5cdGNvbnN0IHRva2VuID0gKGluZm8udG9rZW4gPSB7fSk7XG5cdC8qKlxuXHQgKiBAcGFyYW0ge2ltcG9ydCgnLi9wcml2YXRlLmpzJykuRnJhZ21lbnRGYWN0b3J5fSB0eXBlXG5cdCAqIEBwYXJhbSB7MCB8IDEgfCAyfSBpbmRleFxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2tleV1cblx0ICogQHBhcmFtIHthbnl9IFt2YWx1ZV1cblx0ICogQHJldHVybnMge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiB1cGRhdGUodHlwZSwgaW5kZXgsIGtleSwgdmFsdWUpIHtcblx0XHRpZiAoaW5mby50b2tlbiAhPT0gdG9rZW4pIHJldHVybjtcblx0XHRpbmZvLnJlc29sdmVkID0gdmFsdWU7XG5cdFx0bGV0IGNoaWxkX2N0eCA9IGluZm8uY3R4O1xuXHRcdGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y2hpbGRfY3R4ID0gY2hpbGRfY3R4LnNsaWNlKCk7XG5cdFx0XHRjaGlsZF9jdHhba2V5XSA9IHZhbHVlO1xuXHRcdH1cblx0XHRjb25zdCBibG9jayA9IHR5cGUgJiYgKGluZm8uY3VycmVudCA9IHR5cGUpKGNoaWxkX2N0eCk7XG5cdFx0bGV0IG5lZWRzX2ZsdXNoID0gZmFsc2U7XG5cdFx0aWYgKGluZm8uYmxvY2spIHtcblx0XHRcdGlmIChpbmZvLmJsb2Nrcykge1xuXHRcdFx0XHRpbmZvLmJsb2Nrcy5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuXHRcdFx0XHRcdGlmIChpICE9PSBpbmRleCAmJiBibG9jaykge1xuXHRcdFx0XHRcdFx0Z3JvdXBfb3V0cm9zKCk7XG5cdFx0XHRcdFx0XHR0cmFuc2l0aW9uX291dChibG9jaywgMSwgMSwgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoaW5mby5ibG9ja3NbaV0gPT09IGJsb2NrKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW5mby5ibG9ja3NbaV0gPSBudWxsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGNoZWNrX291dHJvcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbmZvLmJsb2NrLmQoMSk7XG5cdFx0XHR9XG5cdFx0XHRibG9jay5jKCk7XG5cdFx0XHR0cmFuc2l0aW9uX2luKGJsb2NrLCAxKTtcblx0XHRcdGJsb2NrLm0oaW5mby5tb3VudCgpLCBpbmZvLmFuY2hvcik7XG5cdFx0XHRuZWVkc19mbHVzaCA9IHRydWU7XG5cdFx0fVxuXHRcdGluZm8uYmxvY2sgPSBibG9jaztcblx0XHRpZiAoaW5mby5ibG9ja3MpIGluZm8uYmxvY2tzW2luZGV4XSA9IGJsb2NrO1xuXHRcdGlmIChuZWVkc19mbHVzaCkge1xuXHRcdFx0Zmx1c2goKTtcblx0XHR9XG5cdH1cblx0aWYgKGlzX3Byb21pc2UocHJvbWlzZSkpIHtcblx0XHRjb25zdCBjdXJyZW50X2NvbXBvbmVudCA9IGdldF9jdXJyZW50X2NvbXBvbmVudCgpO1xuXHRcdHByb21pc2UudGhlbihcblx0XHRcdCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuXHRcdFx0XHR1cGRhdGUoaW5mby50aGVuLCAxLCBpbmZvLnZhbHVlLCB2YWx1ZSk7XG5cdFx0XHRcdHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcblx0XHRcdH0sXG5cdFx0XHQoZXJyb3IpID0+IHtcblx0XHRcdFx0c2V0X2N1cnJlbnRfY29tcG9uZW50KGN1cnJlbnRfY29tcG9uZW50KTtcblx0XHRcdFx0dXBkYXRlKGluZm8uY2F0Y2gsIDIsIGluZm8uZXJyb3IsIGVycm9yKTtcblx0XHRcdFx0c2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuXHRcdFx0XHRpZiAoIWluZm8uaGFzQ2F0Y2gpIHtcblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdCk7XG5cdFx0Ly8gaWYgd2UgcHJldmlvdXNseSBoYWQgYSB0aGVuL2NhdGNoIGJsb2NrLCBkZXN0cm95IGl0XG5cdFx0aWYgKGluZm8uY3VycmVudCAhPT0gaW5mby5wZW5kaW5nKSB7XG5cdFx0XHR1cGRhdGUoaW5mby5wZW5kaW5nLCAwKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnRoZW4pIHtcblx0XHRcdHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHByb21pc2UpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGluZm8ucmVzb2x2ZWQgPSAvKiogQHR5cGUge1R9ICovIChwcm9taXNlKTtcblx0fVxufVxuXG4vKiogQHJldHVybnMge3ZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlX2F3YWl0X2Jsb2NrX2JyYW5jaChpbmZvLCBjdHgsIGRpcnR5KSB7XG5cdGNvbnN0IGNoaWxkX2N0eCA9IGN0eC5zbGljZSgpO1xuXHRjb25zdCB7IHJlc29sdmVkIH0gPSBpbmZvO1xuXHRpZiAoaW5mby5jdXJyZW50ID09PSBpbmZvLnRoZW4pIHtcblx0XHRjaGlsZF9jdHhbaW5mby52YWx1ZV0gPSByZXNvbHZlZDtcblx0fVxuXHRpZiAoaW5mby5jdXJyZW50ID09PSBpbmZvLmNhdGNoKSB7XG5cdFx0Y2hpbGRfY3R4W2luZm8uZXJyb3JdID0gcmVzb2x2ZWQ7XG5cdH1cblx0aW5mby5ibG9jay5wKGNoaWxkX2N0eCwgZGlydHkpO1xufVxuIiwgImltcG9ydCB7IGlkZW50aXR5IGFzIGxpbmVhciwgaXNfZnVuY3Rpb24sIG5vb3AsIHJ1bl9hbGwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IG5vdyB9IGZyb20gJy4vZW52aXJvbm1lbnQuanMnO1xuaW1wb3J0IHsgbG9vcCB9IGZyb20gJy4vbG9vcC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVfcnVsZSwgZGVsZXRlX3J1bGUgfSBmcm9tICcuL3N0eWxlX21hbmFnZXIuanMnO1xuaW1wb3J0IHsgY3VzdG9tX2V2ZW50IH0gZnJvbSAnLi9kb20uanMnO1xuaW1wb3J0IHsgYWRkX3JlbmRlcl9jYWxsYmFjayB9IGZyb20gJy4vc2NoZWR1bGVyLmpzJztcblxuLyoqXG4gKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9XG4gKi9cbmxldCBwcm9taXNlO1xuXG4vKipcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5mdW5jdGlvbiB3YWl0KCkge1xuXHRpZiAoIXByb21pc2UpIHtcblx0XHRwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0cHJvbWlzZS50aGVuKCgpID0+IHtcblx0XHRcdHByb21pc2UgPSBudWxsO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBwcm9taXNlO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtJTlRSTyB8IE9VVFJPIHwgYm9vbGVhbn0gZGlyZWN0aW9uXG4gKiBAcGFyYW0geydzdGFydCcgfCAnZW5kJ30ga2luZFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoKG5vZGUsIGRpcmVjdGlvbiwga2luZCkge1xuXHRub2RlLmRpc3BhdGNoRXZlbnQoY3VzdG9tX2V2ZW50KGAke2RpcmVjdGlvbiA/ICdpbnRybycgOiAnb3V0cm8nfSR7a2luZH1gKSk7XG59XG5cbmNvbnN0IG91dHJvaW5nID0gbmV3IFNldCgpO1xuXG4vKipcbiAqIEB0eXBlIHtPdXRyb31cbiAqL1xubGV0IG91dHJvcztcblxuLyoqXG4gKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cF9vdXRyb3MoKSB7XG5cdG91dHJvcyA9IHtcblx0XHRyOiAwLFxuXHRcdGM6IFtdLFxuXHRcdHA6IG91dHJvcyAvLyBwYXJlbnQgZ3JvdXBcblx0fTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja19vdXRyb3MoKSB7XG5cdGlmICghb3V0cm9zLnIpIHtcblx0XHRydW5fYWxsKG91dHJvcy5jKTtcblx0fVxuXHRvdXRyb3MgPSBvdXRyb3MucDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9wcml2YXRlLmpzJykuRnJhZ21lbnR9IGJsb2NrXG4gKiBAcGFyYW0gezAgfCAxfSBbbG9jYWxdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zaXRpb25faW4oYmxvY2ssIGxvY2FsKSB7XG5cdGlmIChibG9jayAmJiBibG9jay5pKSB7XG5cdFx0b3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcblx0XHRibG9jay5pKGxvY2FsKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3ByaXZhdGUuanMnKS5GcmFnbWVudH0gYmxvY2tcbiAqIEBwYXJhbSB7MCB8IDF9IGxvY2FsXG4gKiBAcGFyYW0gezAgfCAxfSBbZGV0YWNoXVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBbY2FsbGJhY2tdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zaXRpb25fb3V0KGJsb2NrLCBsb2NhbCwgZGV0YWNoLCBjYWxsYmFjaykge1xuXHRpZiAoYmxvY2sgJiYgYmxvY2subykge1xuXHRcdGlmIChvdXRyb2luZy5oYXMoYmxvY2spKSByZXR1cm47XG5cdFx0b3V0cm9pbmcuYWRkKGJsb2NrKTtcblx0XHRvdXRyb3MuYy5wdXNoKCgpID0+IHtcblx0XHRcdG91dHJvaW5nLmRlbGV0ZShibG9jayk7XG5cdFx0XHRpZiAoY2FsbGJhY2spIHtcblx0XHRcdFx0aWYgKGRldGFjaCkgYmxvY2suZCgxKTtcblx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRibG9jay5vKGxvY2FsKTtcblx0fSBlbHNlIGlmIChjYWxsYmFjaykge1xuXHRcdGNhbGxiYWNrKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7aW1wb3J0KCcuLi90cmFuc2l0aW9uL3B1YmxpYy5qcycpLlRyYW5zaXRpb25Db25maWd9XG4gKi9cbmNvbnN0IG51bGxfdHJhbnNpdGlvbiA9IHsgZHVyYXRpb246IDAgfTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnQgJiBFbGVtZW50Q1NTSW5saW5lU3R5bGV9IG5vZGVcbiAqIEBwYXJhbSB7VHJhbnNpdGlvbkZufSBmblxuICogQHBhcmFtIHthbnl9IHBhcmFtc1xuICogQHJldHVybnMge3sgc3RhcnQoKTogdm9pZDsgaW52YWxpZGF0ZSgpOiB2b2lkOyBlbmQoKTogdm9pZDsgfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZV9pbl90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcblx0LyoqXG5cdCAqIEB0eXBlIHtUcmFuc2l0aW9uT3B0aW9uc30gKi9cblx0Y29uc3Qgb3B0aW9ucyA9IHsgZGlyZWN0aW9uOiAnaW4nIH07XG5cdGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMsIG9wdGlvbnMpO1xuXHRsZXQgcnVubmluZyA9IGZhbHNlO1xuXHRsZXQgYW5pbWF0aW9uX25hbWU7XG5cdGxldCB0YXNrO1xuXHRsZXQgdWlkID0gMDtcblxuXHQvKipcblx0ICogQHJldHVybnMge3ZvaWR9ICovXG5cdGZ1bmN0aW9uIGNsZWFudXAoKSB7XG5cdFx0aWYgKGFuaW1hdGlvbl9uYW1lKSBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybnMge3ZvaWR9ICovXG5cdGZ1bmN0aW9uIGdvKCkge1xuXHRcdGNvbnN0IHtcblx0XHRcdGRlbGF5ID0gMCxcblx0XHRcdGR1cmF0aW9uID0gMzAwLFxuXHRcdFx0ZWFzaW5nID0gbGluZWFyLFxuXHRcdFx0dGljayA9IG5vb3AsXG5cdFx0XHRjc3Ncblx0XHR9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcblx0XHRpZiAoY3NzKSBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDAsIDEsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MsIHVpZCsrKTtcblx0XHR0aWNrKDAsIDEpO1xuXHRcdGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuXHRcdGNvbnN0IGVuZF90aW1lID0gc3RhcnRfdGltZSArIGR1cmF0aW9uO1xuXHRcdGlmICh0YXNrKSB0YXNrLmFib3J0KCk7XG5cdFx0cnVubmluZyA9IHRydWU7XG5cdFx0YWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCB0cnVlLCAnc3RhcnQnKSk7XG5cdFx0dGFzayA9IGxvb3AoKG5vdykgPT4ge1xuXHRcdFx0aWYgKHJ1bm5pbmcpIHtcblx0XHRcdFx0aWYgKG5vdyA+PSBlbmRfdGltZSkge1xuXHRcdFx0XHRcdHRpY2soMSwgMCk7XG5cdFx0XHRcdFx0ZGlzcGF0Y2gobm9kZSwgdHJ1ZSwgJ2VuZCcpO1xuXHRcdFx0XHRcdGNsZWFudXAoKTtcblx0XHRcdFx0XHRyZXR1cm4gKHJ1bm5pbmcgPSBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG5cdFx0XHRcdFx0Y29uc3QgdCA9IGVhc2luZygobm93IC0gc3RhcnRfdGltZSkgLyBkdXJhdGlvbik7XG5cdFx0XHRcdFx0dGljayh0LCAxIC0gdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBydW5uaW5nO1xuXHRcdH0pO1xuXHR9XG5cdGxldCBzdGFydGVkID0gZmFsc2U7XG5cdHJldHVybiB7XG5cdFx0c3RhcnQoKSB7XG5cdFx0XHRpZiAoc3RhcnRlZCkgcmV0dXJuO1xuXHRcdFx0c3RhcnRlZCA9IHRydWU7XG5cdFx0XHRkZWxldGVfcnVsZShub2RlKTtcblx0XHRcdGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG5cdFx0XHRcdGNvbmZpZyA9IGNvbmZpZyhvcHRpb25zKTtcblx0XHRcdFx0d2FpdCgpLnRoZW4oZ28pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Z28oKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGludmFsaWRhdGUoKSB7XG5cdFx0XHRzdGFydGVkID0gZmFsc2U7XG5cdFx0fSxcblx0XHRlbmQoKSB7XG5cdFx0XHRpZiAocnVubmluZykge1xuXHRcdFx0XHRjbGVhbnVwKCk7XG5cdFx0XHRcdHJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50ICYgRWxlbWVudENTU0lubGluZVN0eWxlfSBub2RlXG4gKiBAcGFyYW0ge1RyYW5zaXRpb25Gbn0gZm5cbiAqIEBwYXJhbSB7YW55fSBwYXJhbXNcbiAqIEByZXR1cm5zIHt7IGVuZChyZXNldDogYW55KTogdm9pZDsgfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zKSB7XG5cdC8qKiBAdHlwZSB7VHJhbnNpdGlvbk9wdGlvbnN9ICovXG5cdGNvbnN0IG9wdGlvbnMgPSB7IGRpcmVjdGlvbjogJ291dCcgfTtcblx0bGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcywgb3B0aW9ucyk7XG5cdGxldCBydW5uaW5nID0gdHJ1ZTtcblx0bGV0IGFuaW1hdGlvbl9uYW1lO1xuXHRjb25zdCBncm91cCA9IG91dHJvcztcblx0Z3JvdXAuciArPSAxO1xuXHQvKiogQHR5cGUge2Jvb2xlYW59ICovXG5cdGxldCBvcmlnaW5hbF9pbmVydF92YWx1ZTtcblxuXHQvKipcblx0ICogQHJldHVybnMge3ZvaWR9ICovXG5cdGZ1bmN0aW9uIGdvKCkge1xuXHRcdGNvbnN0IHtcblx0XHRcdGRlbGF5ID0gMCxcblx0XHRcdGR1cmF0aW9uID0gMzAwLFxuXHRcdFx0ZWFzaW5nID0gbGluZWFyLFxuXHRcdFx0dGljayA9IG5vb3AsXG5cdFx0XHRjc3Ncblx0XHR9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcblxuXHRcdGlmIChjc3MpIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMSwgMCwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG5cblx0XHRjb25zdCBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheTtcblx0XHRjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcblx0XHRhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIGZhbHNlLCAnc3RhcnQnKSk7XG5cblx0XHRpZiAoJ2luZXJ0JyBpbiBub2RlKSB7XG5cdFx0XHRvcmlnaW5hbF9pbmVydF92YWx1ZSA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovIChub2RlKS5pbmVydDtcblx0XHRcdG5vZGUuaW5lcnQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGxvb3AoKG5vdykgPT4ge1xuXHRcdFx0aWYgKHJ1bm5pbmcpIHtcblx0XHRcdFx0aWYgKG5vdyA+PSBlbmRfdGltZSkge1xuXHRcdFx0XHRcdHRpY2soMCwgMSk7XG5cdFx0XHRcdFx0ZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdlbmQnKTtcblx0XHRcdFx0XHRpZiAoIS0tZ3JvdXAucikge1xuXHRcdFx0XHRcdFx0Ly8gdGhpcyB3aWxsIHJlc3VsdCBpbiBgZW5kKClgIGJlaW5nIGNhbGxlZCxcblx0XHRcdFx0XHRcdC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gY2xlYW4gdXAgaGVyZVxuXHRcdFx0XHRcdFx0cnVuX2FsbChncm91cC5jKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChub3cgPj0gc3RhcnRfdGltZSkge1xuXHRcdFx0XHRcdGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuXHRcdFx0XHRcdHRpY2soMSAtIHQsIHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcnVubmluZztcblx0XHR9KTtcblx0fVxuXG5cdGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG5cdFx0d2FpdCgpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0Y29uZmlnID0gY29uZmlnKG9wdGlvbnMpO1xuXHRcdFx0Z28oKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRnbygpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRlbmQocmVzZXQpIHtcblx0XHRcdGlmIChyZXNldCAmJiAnaW5lcnQnIGluIG5vZGUpIHtcblx0XHRcdFx0bm9kZS5pbmVydCA9IG9yaWdpbmFsX2luZXJ0X3ZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlc2V0ICYmIGNvbmZpZy50aWNrKSB7XG5cdFx0XHRcdGNvbmZpZy50aWNrKDEsIDApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJ1bm5pbmcpIHtcblx0XHRcdFx0aWYgKGFuaW1hdGlvbl9uYW1lKSBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG5cdFx0XHRcdHJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50ICYgRWxlbWVudENTU0lubGluZVN0eWxlfSBub2RlXG4gKiBAcGFyYW0ge1RyYW5zaXRpb25Gbn0gZm5cbiAqIEBwYXJhbSB7YW55fSBwYXJhbXNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW50cm9cbiAqIEByZXR1cm5zIHt7IHJ1bihiOiAwIHwgMSk6IHZvaWQ7IGVuZCgpOiB2b2lkOyB9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zLCBpbnRybykge1xuXHQvKipcblx0ICogQHR5cGUge1RyYW5zaXRpb25PcHRpb25zfSAqL1xuXHRjb25zdCBvcHRpb25zID0geyBkaXJlY3Rpb246ICdib3RoJyB9O1xuXHRsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zLCBvcHRpb25zKTtcblx0bGV0IHQgPSBpbnRybyA/IDAgOiAxO1xuXG5cdC8qKlxuXHQgKiBAdHlwZSB7UHJvZ3JhbSB8IG51bGx9ICovXG5cdGxldCBydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuXG5cdC8qKlxuXHQgKiBAdHlwZSB7UGVuZGluZ1Byb2dyYW0gfCBudWxsfSAqL1xuXHRsZXQgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcblx0bGV0IGFuaW1hdGlvbl9uYW1lID0gbnVsbDtcblxuXHQvKiogQHR5cGUge2Jvb2xlYW59ICovXG5cdGxldCBvcmlnaW5hbF9pbmVydF92YWx1ZTtcblxuXHQvKipcblx0ICogQHJldHVybnMge3ZvaWR9ICovXG5cdGZ1bmN0aW9uIGNsZWFyX2FuaW1hdGlvbigpIHtcblx0XHRpZiAoYW5pbWF0aW9uX25hbWUpIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge1BlbmRpbmdQcm9ncmFtfSBwcm9ncmFtXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvblxuXHQgKiBAcmV0dXJucyB7UHJvZ3JhbX1cblx0ICovXG5cdGZ1bmN0aW9uIGluaXQocHJvZ3JhbSwgZHVyYXRpb24pIHtcblx0XHRjb25zdCBkID0gLyoqIEB0eXBlIHtQcm9ncmFtWydkJ119ICovIChwcm9ncmFtLmIgLSB0KTtcblx0XHRkdXJhdGlvbiAqPSBNYXRoLmFicyhkKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0YTogdCxcblx0XHRcdGI6IHByb2dyYW0uYixcblx0XHRcdGQsXG5cdFx0XHRkdXJhdGlvbixcblx0XHRcdHN0YXJ0OiBwcm9ncmFtLnN0YXJ0LFxuXHRcdFx0ZW5kOiBwcm9ncmFtLnN0YXJ0ICsgZHVyYXRpb24sXG5cdFx0XHRncm91cDogcHJvZ3JhbS5ncm91cFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtJTlRSTyB8IE9VVFJPfSBiXG5cdCAqIEByZXR1cm5zIHt2b2lkfVxuXHQgKi9cblx0ZnVuY3Rpb24gZ28oYikge1xuXHRcdGNvbnN0IHtcblx0XHRcdGRlbGF5ID0gMCxcblx0XHRcdGR1cmF0aW9uID0gMzAwLFxuXHRcdFx0ZWFzaW5nID0gbGluZWFyLFxuXHRcdFx0dGljayA9IG5vb3AsXG5cdFx0XHRjc3Ncblx0XHR9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcblxuXHRcdC8qKlxuXHRcdCAqIEB0eXBlIHtQZW5kaW5nUHJvZ3JhbX0gKi9cblx0XHRjb25zdCBwcm9ncmFtID0ge1xuXHRcdFx0c3RhcnQ6IG5vdygpICsgZGVsYXksXG5cdFx0XHRiXG5cdFx0fTtcblxuXHRcdGlmICghYikge1xuXHRcdFx0Ly8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3Ncblx0XHRcdHByb2dyYW0uZ3JvdXAgPSBvdXRyb3M7XG5cdFx0XHRvdXRyb3MuciArPSAxO1xuXHRcdH1cblxuXHRcdGlmICgnaW5lcnQnIGluIG5vZGUpIHtcblx0XHRcdGlmIChiKSB7XG5cdFx0XHRcdGlmIChvcmlnaW5hbF9pbmVydF92YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Ly8gYWJvcnRlZC9yZXZlcnNlZCBvdXRybyBcdTIwMTQgcmVzdG9yZSBwcmV2aW91cyBpbmVydCB2YWx1ZVxuXHRcdFx0XHRcdG5vZGUuaW5lcnQgPSBvcmlnaW5hbF9pbmVydF92YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3JpZ2luYWxfaW5lcnRfdmFsdWUgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLyAobm9kZSkuaW5lcnQ7XG5cdFx0XHRcdG5vZGUuaW5lcnQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChydW5uaW5nX3Byb2dyYW0gfHwgcGVuZGluZ19wcm9ncmFtKSB7XG5cdFx0XHRwZW5kaW5nX3Byb2dyYW0gPSBwcm9ncmFtO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpZiB0aGlzIGlzIGFuIGludHJvLCBhbmQgdGhlcmUncyBhIGRlbGF5LCB3ZSBuZWVkIHRvIGRvXG5cdFx0XHQvLyBhbiBpbml0aWFsIHRpY2sgYW5kL29yIGFwcGx5IENTUyBhbmltYXRpb24gaW1tZWRpYXRlbHlcblx0XHRcdGlmIChjc3MpIHtcblx0XHRcdFx0Y2xlYXJfYW5pbWF0aW9uKCk7XG5cdFx0XHRcdGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoYikgdGljaygwLCAxKTtcblx0XHRcdHJ1bm5pbmdfcHJvZ3JhbSA9IGluaXQocHJvZ3JhbSwgZHVyYXRpb24pO1xuXHRcdFx0YWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBiLCAnc3RhcnQnKSk7XG5cdFx0XHRsb29wKChub3cpID0+IHtcblx0XHRcdFx0aWYgKHBlbmRpbmdfcHJvZ3JhbSAmJiBub3cgPiBwZW5kaW5nX3Byb2dyYW0uc3RhcnQpIHtcblx0XHRcdFx0XHRydW5uaW5nX3Byb2dyYW0gPSBpbml0KHBlbmRpbmdfcHJvZ3JhbSwgZHVyYXRpb24pO1xuXHRcdFx0XHRcdHBlbmRpbmdfcHJvZ3JhbSA9IG51bGw7XG5cdFx0XHRcdFx0ZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdzdGFydCcpO1xuXHRcdFx0XHRcdGlmIChjc3MpIHtcblx0XHRcdFx0XHRcdGNsZWFyX2FuaW1hdGlvbigpO1xuXHRcdFx0XHRcdFx0YW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShcblx0XHRcdFx0XHRcdFx0bm9kZSxcblx0XHRcdFx0XHRcdFx0dCxcblx0XHRcdFx0XHRcdFx0cnVubmluZ19wcm9ncmFtLmIsXG5cdFx0XHRcdFx0XHRcdHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbixcblx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0ZWFzaW5nLFxuXHRcdFx0XHRcdFx0XHRjb25maWcuY3NzXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocnVubmluZ19wcm9ncmFtKSB7XG5cdFx0XHRcdFx0aWYgKG5vdyA+PSBydW5uaW5nX3Byb2dyYW0uZW5kKSB7XG5cdFx0XHRcdFx0XHR0aWNrKCh0ID0gcnVubmluZ19wcm9ncmFtLmIpLCAxIC0gdCk7XG5cdFx0XHRcdFx0XHRkaXNwYXRjaChub2RlLCBydW5uaW5nX3Byb2dyYW0uYiwgJ2VuZCcpO1xuXHRcdFx0XHRcdFx0aWYgKCFwZW5kaW5nX3Byb2dyYW0pIHtcblx0XHRcdFx0XHRcdFx0Ly8gd2UncmUgZG9uZVxuXHRcdFx0XHRcdFx0XHRpZiAocnVubmluZ19wcm9ncmFtLmIpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbnRybyBcdTIwMTQgd2UgY2FuIHRpZHkgdXAgaW1tZWRpYXRlbHlcblx0XHRcdFx0XHRcdFx0XHRjbGVhcl9hbmltYXRpb24oKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBvdXRybyBcdTIwMTQgbmVlZHMgdG8gYmUgY29vcmRpbmF0ZWRcblx0XHRcdFx0XHRcdFx0XHRpZiAoIS0tcnVubmluZ19wcm9ncmFtLmdyb3VwLnIpIHJ1bl9hbGwocnVubmluZ19wcm9ncmFtLmdyb3VwLmMpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAobm93ID49IHJ1bm5pbmdfcHJvZ3JhbS5zdGFydCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgcCA9IG5vdyAtIHJ1bm5pbmdfcHJvZ3JhbS5zdGFydDtcblx0XHRcdFx0XHRcdHQgPSBydW5uaW5nX3Byb2dyYW0uYSArIHJ1bm5pbmdfcHJvZ3JhbS5kICogZWFzaW5nKHAgLyBydW5uaW5nX3Byb2dyYW0uZHVyYXRpb24pO1xuXHRcdFx0XHRcdFx0dGljayh0LCAxIC0gdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiAhIShydW5uaW5nX3Byb2dyYW0gfHwgcGVuZGluZ19wcm9ncmFtKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4ge1xuXHRcdHJ1bihiKSB7XG5cdFx0XHRpZiAoaXNfZnVuY3Rpb24oY29uZmlnKSkge1xuXHRcdFx0XHR3YWl0KCkudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb3B0cyA9IHsgZGlyZWN0aW9uOiBiID8gJ2luJyA6ICdvdXQnIH07XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGNvbmZpZyA9IGNvbmZpZyhvcHRzKTtcblx0XHRcdFx0XHRnbyhiKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRnbyhiKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGVuZCgpIHtcblx0XHRcdGNsZWFyX2FuaW1hdGlvbigpO1xuXHRcdFx0cnVubmluZ19wcm9ncmFtID0gcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcblx0XHR9XG5cdH07XG59XG5cbi8qKiBAdHlwZWRlZiB7MX0gSU5UUk8gKi9cbi8qKiBAdHlwZWRlZiB7MH0gT1VUUk8gKi9cbi8qKiBAdHlwZWRlZiB7eyBkaXJlY3Rpb246ICdpbicgfCAnb3V0JyB8ICdib3RoJyB9fSBUcmFuc2l0aW9uT3B0aW9ucyAqL1xuLyoqIEB0eXBlZGVmIHsobm9kZTogRWxlbWVudCwgcGFyYW1zOiBhbnksIG9wdGlvbnM6IFRyYW5zaXRpb25PcHRpb25zKSA9PiBpbXBvcnQoJy4uL3RyYW5zaXRpb24vcHVibGljLmpzJykuVHJhbnNpdGlvbkNvbmZpZ30gVHJhbnNpdGlvbkZuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gT3V0cm9cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uW119IGNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQZW5kaW5nUHJvZ3JhbVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN0YXJ0XG4gKiBAcHJvcGVydHkge0lOVFJPfE9VVFJPfSBiXG4gKiBAcHJvcGVydHkge091dHJvfSBbZ3JvdXBdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm9ncmFtXG4gKiBAcHJvcGVydHkge251bWJlcn0gYVxuICogQHByb3BlcnR5IHtJTlRST3xPVVRST30gYlxuICogQHByb3BlcnR5IHsxfC0xfSBkXG4gKiBAcHJvcGVydHkge251bWJlcn0gZHVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzdGFydFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGVuZFxuICogQHByb3BlcnR5IHtPdXRyb30gW2dyb3VwXVxuICovXG4iLCAiaW1wb3J0IHsgcnVuX2FsbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgY3VycmVudF9jb21wb25lbnQsIHNldF9jdXJyZW50X2NvbXBvbmVudCB9IGZyb20gJy4vbGlmZWN5Y2xlLmpzJztcblxuZXhwb3J0IGNvbnN0IGRpcnR5X2NvbXBvbmVudHMgPSBbXTtcbmV4cG9ydCBjb25zdCBpbnRyb3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH07XG5leHBvcnQgY29uc3QgYmluZGluZ19jYWxsYmFja3MgPSBbXTtcblxubGV0IHJlbmRlcl9jYWxsYmFja3MgPSBbXTtcblxuY29uc3QgZmx1c2hfY2FsbGJhY2tzID0gW107XG5cbmNvbnN0IHJlc29sdmVkX3Byb21pc2UgPSAvKiBAX19QVVJFX18gKi8gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbmxldCB1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7XG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2hlZHVsZV91cGRhdGUoKSB7XG5cdGlmICghdXBkYXRlX3NjaGVkdWxlZCkge1xuXHRcdHVwZGF0ZV9zY2hlZHVsZWQgPSB0cnVlO1xuXHRcdHJlc29sdmVkX3Byb21pc2UudGhlbihmbHVzaCk7XG5cdH1cbn1cblxuLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpY2soKSB7XG5cdHNjaGVkdWxlX3VwZGF0ZSgpO1xuXHRyZXR1cm4gcmVzb2x2ZWRfcHJvbWlzZTtcbn1cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZF9yZW5kZXJfY2FsbGJhY2soZm4pIHtcblx0cmVuZGVyX2NhbGxiYWNrcy5wdXNoKGZuKTtcbn1cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZF9mbHVzaF9jYWxsYmFjayhmbikge1xuXHRmbHVzaF9jYWxsYmFja3MucHVzaChmbik7XG59XG5cbi8vIGZsdXNoKCkgY2FsbHMgY2FsbGJhY2tzIGluIHRoaXMgb3JkZXI6XG4vLyAxLiBBbGwgYmVmb3JlVXBkYXRlIGNhbGxiYWNrcywgaW4gb3JkZXI6IHBhcmVudHMgYmVmb3JlIGNoaWxkcmVuXG4vLyAyLiBBbGwgYmluZDp0aGlzIGNhbGxiYWNrcywgaW4gcmV2ZXJzZSBvcmRlcjogY2hpbGRyZW4gYmVmb3JlIHBhcmVudHMuXG4vLyAzLiBBbGwgYWZ0ZXJVcGRhdGUgY2FsbGJhY2tzLCBpbiBvcmRlcjogcGFyZW50cyBiZWZvcmUgY2hpbGRyZW4uIEVYQ0VQVFxuLy8gICAgZm9yIGFmdGVyVXBkYXRlcyBjYWxsZWQgZHVyaW5nIHRoZSBpbml0aWFsIG9uTW91bnQsIHdoaWNoIGFyZSBjYWxsZWQgaW5cbi8vICAgIHJldmVyc2Ugb3JkZXI6IGNoaWxkcmVuIGJlZm9yZSBwYXJlbnRzLlxuLy8gU2luY2UgY2FsbGJhY2tzIG1pZ2h0IHVwZGF0ZSBjb21wb25lbnQgdmFsdWVzLCB3aGljaCBjb3VsZCB0cmlnZ2VyIGFub3RoZXJcbi8vIGNhbGwgdG8gZmx1c2goKSwgdGhlIGZvbGxvd2luZyBzdGVwcyBndWFyZCBhZ2FpbnN0IHRoaXM6XG4vLyAxLiBEdXJpbmcgYmVmb3JlVXBkYXRlLCBhbnkgdXBkYXRlZCBjb21wb25lbnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyAgICBkaXJ0eV9jb21wb25lbnRzIGFycmF5IGFuZCB3aWxsIGNhdXNlIGEgcmVlbnRyYW50IGNhbGwgdG8gZmx1c2goKS4gQmVjYXVzZVxuLy8gICAgdGhlIGZsdXNoIGluZGV4IGlzIGtlcHQgb3V0c2lkZSB0aGUgZnVuY3Rpb24sIHRoZSByZWVudHJhbnQgY2FsbCB3aWxsIHBpY2tcbi8vICAgIHVwIHdoZXJlIHRoZSBlYXJsaWVyIGNhbGwgbGVmdCBvZmYgYW5kIGdvIHRocm91Z2ggYWxsIGRpcnR5IGNvbXBvbmVudHMuIFRoZVxuLy8gICAgY3VycmVudF9jb21wb25lbnQgdmFsdWUgaXMgc2F2ZWQgYW5kIHJlc3RvcmVkIHNvIHRoYXQgdGhlIHJlZW50cmFudCBjYWxsIHdpbGxcbi8vICAgIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgXCJwYXJlbnRcIiBmbHVzaCgpIGNhbGwuXG4vLyAyLiBiaW5kOnRoaXMgY2FsbGJhY2tzIGNhbm5vdCB0cmlnZ2VyIG5ldyBmbHVzaCgpIGNhbGxzLlxuLy8gMy4gRHVyaW5nIGFmdGVyVXBkYXRlLCBhbnkgdXBkYXRlZCBjb21wb25lbnRzIHdpbGwgTk9UIGhhdmUgdGhlaXIgYWZ0ZXJVcGRhdGVcbi8vICAgIGNhbGxiYWNrIGNhbGxlZCBhIHNlY29uZCB0aW1lOyB0aGUgc2Vlbl9jYWxsYmFja3Mgc2V0LCBvdXRzaWRlIHRoZSBmbHVzaCgpXG4vLyAgICBmdW5jdGlvbiwgZ3VhcmFudGVlcyB0aGlzIGJlaGF2aW9yLlxuY29uc3Qgc2Vlbl9jYWxsYmFja3MgPSBuZXcgU2V0KCk7XG5cbmxldCBmbHVzaGlkeCA9IDA7IC8vIERvICpub3QqIG1vdmUgdGhpcyBpbnNpZGUgdGhlIGZsdXNoKCkgZnVuY3Rpb25cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoKCkge1xuXHQvLyBEbyBub3QgcmVlbnRlciBmbHVzaCB3aGlsZSBkaXJ0eSBjb21wb25lbnRzIGFyZSB1cGRhdGVkLCBhcyB0aGlzIGNhblxuXHQvLyByZXN1bHQgaW4gYW4gaW5maW5pdGUgbG9vcC4gSW5zdGVhZCwgbGV0IHRoZSBpbm5lciBmbHVzaCBoYW5kbGUgaXQuXG5cdC8vIFJlZW50cmFuY3kgaXMgb2sgYWZ0ZXJ3YXJkcyBmb3IgYmluZGluZ3MgZXRjLlxuXHRpZiAoZmx1c2hpZHggIT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3Qgc2F2ZWRfY29tcG9uZW50ID0gY3VycmVudF9jb21wb25lbnQ7XG5cdGRvIHtcblx0XHQvLyBmaXJzdCwgY2FsbCBiZWZvcmVVcGRhdGUgZnVuY3Rpb25zXG5cdFx0Ly8gYW5kIHVwZGF0ZSBjb21wb25lbnRzXG5cdFx0dHJ5IHtcblx0XHRcdHdoaWxlIChmbHVzaGlkeCA8IGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IGNvbXBvbmVudCA9IGRpcnR5X2NvbXBvbmVudHNbZmx1c2hpZHhdO1xuXHRcdFx0XHRmbHVzaGlkeCsrO1xuXHRcdFx0XHRzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcblx0XHRcdFx0dXBkYXRlKGNvbXBvbmVudC4kJCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0Ly8gcmVzZXQgZGlydHkgc3RhdGUgdG8gbm90IGVuZCB1cCBpbiBhIGRlYWRsb2NrZWQgc3RhdGUgYW5kIHRoZW4gcmV0aHJvd1xuXHRcdFx0ZGlydHlfY29tcG9uZW50cy5sZW5ndGggPSAwO1xuXHRcdFx0Zmx1c2hpZHggPSAwO1xuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cdFx0c2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuXHRcdGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoID0gMDtcblx0XHRmbHVzaGlkeCA9IDA7XG5cdFx0d2hpbGUgKGJpbmRpbmdfY2FsbGJhY2tzLmxlbmd0aCkgYmluZGluZ19jYWxsYmFja3MucG9wKCkoKTtcblx0XHQvLyB0aGVuLCBvbmNlIGNvbXBvbmVudHMgYXJlIHVwZGF0ZWQsIGNhbGxcblx0XHQvLyBhZnRlclVwZGF0ZSBmdW5jdGlvbnMuIFRoaXMgbWF5IGNhdXNlXG5cdFx0Ly8gc3Vic2VxdWVudCB1cGRhdGVzLi4uXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByZW5kZXJfY2FsbGJhY2tzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHRjb25zdCBjYWxsYmFjayA9IHJlbmRlcl9jYWxsYmFja3NbaV07XG5cdFx0XHRpZiAoIXNlZW5fY2FsbGJhY2tzLmhhcyhjYWxsYmFjaykpIHtcblx0XHRcdFx0Ly8gLi4uc28gZ3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBsb29wc1xuXHRcdFx0XHRzZWVuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuXHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZW5kZXJfY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG5cdH0gd2hpbGUgKGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKTtcblx0d2hpbGUgKGZsdXNoX2NhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRmbHVzaF9jYWxsYmFja3MucG9wKCkoKTtcblx0fVxuXHR1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7XG5cdHNlZW5fY2FsbGJhY2tzLmNsZWFyKCk7XG5cdHNldF9jdXJyZW50X2NvbXBvbmVudChzYXZlZF9jb21wb25lbnQpO1xufVxuXG4vKiogQHJldHVybnMge3ZvaWR9ICovXG5mdW5jdGlvbiB1cGRhdGUoJCQpIHtcblx0aWYgKCQkLmZyYWdtZW50ICE9PSBudWxsKSB7XG5cdFx0JCQudXBkYXRlKCk7XG5cdFx0cnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcblx0XHRjb25zdCBkaXJ0eSA9ICQkLmRpcnR5O1xuXHRcdCQkLmRpcnR5ID0gWy0xXTtcblx0XHQkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5wKCQkLmN0eCwgZGlydHkpO1xuXHRcdCQkLmFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xuXHR9XG59XG5cbi8qKlxuICogVXNlZnVsIGZvciBleGFtcGxlIHRvIGV4ZWN1dGUgcmVtYWluaW5nIGBhZnRlclVwZGF0ZWAgY2FsbGJhY2tzIGJlZm9yZSBleGVjdXRpbmcgYGRlc3Ryb3lgLlxuICogQHBhcmFtIHtGdW5jdGlvbltdfSBmbnNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hfcmVuZGVyX2NhbGxiYWNrcyhmbnMpIHtcblx0Y29uc3QgZmlsdGVyZWQgPSBbXTtcblx0Y29uc3QgdGFyZ2V0cyA9IFtdO1xuXHRyZW5kZXJfY2FsbGJhY2tzLmZvckVhY2goKGMpID0+IChmbnMuaW5kZXhPZihjKSA9PT0gLTEgPyBmaWx0ZXJlZC5wdXNoKGMpIDogdGFyZ2V0cy5wdXNoKGMpKSk7XG5cdHRhcmdldHMuZm9yRWFjaCgoYykgPT4gYygpKTtcblx0cmVuZGVyX2NhbGxiYWNrcyA9IGZpbHRlcmVkO1xufVxuIiwgImltcG9ydCB7IGN1c3RvbV9ldmVudCB9IGZyb20gJy4vZG9tLmpzJztcblxuZXhwb3J0IGxldCBjdXJyZW50X2NvbXBvbmVudDtcblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHtcblx0Y3VycmVudF9jb21wb25lbnQgPSBjb21wb25lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRfY3VycmVudF9jb21wb25lbnQoKSB7XG5cdGlmICghY3VycmVudF9jb21wb25lbnQpIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gY2FsbGVkIG91dHNpZGUgY29tcG9uZW50IGluaXRpYWxpemF0aW9uJyk7XG5cdHJldHVybiBjdXJyZW50X2NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZXMgYSBjYWxsYmFjayB0byBydW4gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgdXBkYXRlZCBhZnRlciBhbnkgc3RhdGUgY2hhbmdlLlxuICpcbiAqIFRoZSBmaXJzdCB0aW1lIHRoZSBjYWxsYmFjayBydW5zIHdpbGwgYmUgYmVmb3JlIHRoZSBpbml0aWFsIGBvbk1vdW50YFxuICpcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZSNiZWZvcmV1cGRhdGVcbiAqIEBwYXJhbSB7KCkgPT4gYW55fSBmblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmVVcGRhdGUoZm4pIHtcblx0Z2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuYmVmb3JlX3VwZGF0ZS5wdXNoKGZuKTtcbn1cblxuLyoqXG4gKiBUaGUgYG9uTW91bnRgIGZ1bmN0aW9uIHNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHJ1biBhcyBzb29uIGFzIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gbW91bnRlZCB0byB0aGUgRE9NLlxuICogSXQgbXVzdCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBjb21wb25lbnQncyBpbml0aWFsaXNhdGlvbiAoYnV0IGRvZXNuJ3QgbmVlZCB0byBsaXZlICppbnNpZGUqIHRoZSBjb21wb25lbnQ7XG4gKiBpdCBjYW4gYmUgY2FsbGVkIGZyb20gYW4gZXh0ZXJuYWwgbW9kdWxlKS5cbiAqXG4gKiBJZiBhIGZ1bmN0aW9uIGlzIHJldHVybmVkIF9zeW5jaHJvbm91c2x5XyBmcm9tIGBvbk1vdW50YCwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHVubW91bnRlZC5cbiAqXG4gKiBgb25Nb3VudGAgZG9lcyBub3QgcnVuIGluc2lkZSBhIFtzZXJ2ZXItc2lkZSBjb21wb25lbnRdKGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzI3J1bi10aW1lLXNlcnZlci1zaWRlLWNvbXBvbmVudC1hcGkpLlxuICpcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZSNvbm1vdW50XG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBpbXBvcnQoJy4vcHJpdmF0ZS5qcycpLk5vdEZ1bmN0aW9uPFQ+IHwgUHJvbWlzZTxpbXBvcnQoJy4vcHJpdmF0ZS5qcycpLk5vdEZ1bmN0aW9uPFQ+PiB8ICgoKSA9PiBhbnkpfSBmblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbk1vdW50KGZuKSB7XG5cdGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX21vdW50LnB1c2goZm4pO1xufVxuXG4vKipcbiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHJ1biBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHVwZGF0ZWQuXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIHJ1bnMgd2lsbCBiZSBhZnRlciB0aGUgaW5pdGlhbCBgb25Nb3VudGBcbiAqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUjYWZ0ZXJ1cGRhdGVcbiAqIEBwYXJhbSB7KCkgPT4gYW55fSBmblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlclVwZGF0ZShmbikge1xuXHRnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5hZnRlcl91cGRhdGUucHVzaChmbik7XG59XG5cbi8qKlxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gcnVuIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIHVubW91bnRlZC5cbiAqXG4gKiBPdXQgb2YgYG9uTW91bnRgLCBgYmVmb3JlVXBkYXRlYCwgYGFmdGVyVXBkYXRlYCBhbmQgYG9uRGVzdHJveWAsIHRoaXMgaXMgdGhlXG4gKiBvbmx5IG9uZSB0aGF0IHJ1bnMgaW5zaWRlIGEgc2VydmVyLXNpZGUgY29tcG9uZW50LlxuICpcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZSNvbmRlc3Ryb3lcbiAqIEBwYXJhbSB7KCkgPT4gYW55fSBmblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkRlc3Ryb3koZm4pIHtcblx0Z2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fZGVzdHJveS5wdXNoKGZuKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGV2ZW50IGRpc3BhdGNoZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBkaXNwYXRjaCBbY29tcG9uZW50IGV2ZW50c10oaHR0cHM6Ly9zdmVsdGUuZGV2L2RvY3MjdGVtcGxhdGUtc3ludGF4LWNvbXBvbmVudC1kaXJlY3RpdmVzLW9uLWV2ZW50bmFtZSkuXG4gKiBFdmVudCBkaXNwYXRjaGVycyBhcmUgZnVuY3Rpb25zIHRoYXQgY2FuIHRha2UgdHdvIGFyZ3VtZW50czogYG5hbWVgIGFuZCBgZGV0YWlsYC5cbiAqXG4gKiBDb21wb25lbnQgZXZlbnRzIGNyZWF0ZWQgd2l0aCBgY3JlYXRlRXZlbnREaXNwYXRjaGVyYCBjcmVhdGUgYVxuICogW0N1c3RvbUV2ZW50XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3VzdG9tRXZlbnQpLlxuICogVGhlc2UgZXZlbnRzIGRvIG5vdCBbYnViYmxlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0xlYXJuL0phdmFTY3JpcHQvQnVpbGRpbmdfYmxvY2tzL0V2ZW50cyNFdmVudF9idWJibGluZ19hbmRfY2FwdHVyZSkuXG4gKiBUaGUgYGRldGFpbGAgYXJndW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIFtDdXN0b21FdmVudC5kZXRhaWxdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DdXN0b21FdmVudC9kZXRhaWwpXG4gKiBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYW55IHR5cGUgb2YgZGF0YS5cbiAqXG4gKiBUaGUgZXZlbnQgZGlzcGF0Y2hlciBjYW4gYmUgdHlwZWQgdG8gbmFycm93IHRoZSBhbGxvd2VkIGV2ZW50IG5hbWVzIGFuZCB0aGUgdHlwZSBvZiB0aGUgYGRldGFpbGAgYXJndW1lbnQ6XG4gKiBgYGB0c1xuICogY29uc3QgZGlzcGF0Y2ggPSBjcmVhdGVFdmVudERpc3BhdGNoZXI8e1xuICogIGxvYWRlZDogbmV2ZXI7IC8vIGRvZXMgbm90IHRha2UgYSBkZXRhaWwgYXJndW1lbnRcbiAqICBjaGFuZ2U6IHN0cmluZzsgLy8gdGFrZXMgYSBkZXRhaWwgYXJndW1lbnQgb2YgdHlwZSBzdHJpbmcsIHdoaWNoIGlzIHJlcXVpcmVkXG4gKiAgb3B0aW9uYWw6IG51bWJlciB8IG51bGw7IC8vIHRha2VzIGFuIG9wdGlvbmFsIGRldGFpbCBhcmd1bWVudCBvZiB0eXBlIG51bWJlclxuICogfT4oKTtcbiAqIGBgYFxuICpcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZSNjcmVhdGVldmVudGRpc3BhdGNoZXJcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW0V2ZW50TWFwPWFueV1cbiAqIEByZXR1cm5zIHtpbXBvcnQoJy4vcHVibGljLmpzJykuRXZlbnREaXNwYXRjaGVyPEV2ZW50TWFwPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlcigpIHtcblx0Y29uc3QgY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG5cdHJldHVybiAodHlwZSwgZGV0YWlsLCB7IGNhbmNlbGFibGUgPSBmYWxzZSB9ID0ge30pID0+IHtcblx0XHRjb25zdCBjYWxsYmFja3MgPSBjb21wb25lbnQuJCQuY2FsbGJhY2tzW3R5cGVdO1xuXHRcdGlmIChjYWxsYmFja3MpIHtcblx0XHRcdC8vIFRPRE8gYXJlIHRoZXJlIHNpdHVhdGlvbnMgd2hlcmUgZXZlbnRzIGNvdWxkIGJlIGRpc3BhdGNoZWRcblx0XHRcdC8vIGluIGEgc2VydmVyIChub24tRE9NKSBlbnZpcm9ubWVudD9cblx0XHRcdGNvbnN0IGV2ZW50ID0gY3VzdG9tX2V2ZW50KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAodHlwZSksIGRldGFpbCwgeyBjYW5jZWxhYmxlIH0pO1xuXHRcdFx0Y2FsbGJhY2tzLnNsaWNlKCkuZm9yRWFjaCgoZm4pID0+IHtcblx0XHRcdFx0Zm4uY2FsbChjb21wb25lbnQsIGV2ZW50KTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuICFldmVudC5kZWZhdWx0UHJldmVudGVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcbn1cblxuLyoqXG4gKiBBc3NvY2lhdGVzIGFuIGFyYml0cmFyeSBgY29udGV4dGAgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCB0aGUgc3BlY2lmaWVkIGBrZXlgXG4gKiBhbmQgcmV0dXJucyB0aGF0IG9iamVjdC4gVGhlIGNvbnRleHQgaXMgdGhlbiBhdmFpbGFibGUgdG8gY2hpbGRyZW4gb2YgdGhlIGNvbXBvbmVudFxuICogKGluY2x1ZGluZyBzbG90dGVkIGNvbnRlbnQpIHdpdGggYGdldENvbnRleHRgLlxuICpcbiAqIExpa2UgbGlmZWN5Y2xlIGZ1bmN0aW9ucywgdGhpcyBtdXN0IGJlIGNhbGxlZCBkdXJpbmcgY29tcG9uZW50IGluaXRpYWxpc2F0aW9uLlxuICpcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZSNzZXRjb250ZXh0XG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHthbnl9IGtleVxuICogQHBhcmFtIHtUfSBjb250ZXh0XG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRleHQoa2V5LCBjb250ZXh0KSB7XG5cdGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuc2V0KGtleSwgY29udGV4dCk7XG5cdHJldHVybiBjb250ZXh0O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY29udGV4dCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGNsb3Nlc3QgcGFyZW50IGNvbXBvbmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgYGtleWAuXG4gKiBNdXN0IGJlIGNhbGxlZCBkdXJpbmcgY29tcG9uZW50IGluaXRpYWxpc2F0aW9uLlxuICpcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZSNnZXRjb250ZXh0XG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHthbnl9IGtleVxuICogQHJldHVybnMge1R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250ZXh0KGtleSkge1xuXHRyZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5nZXQoa2V5KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHdob2xlIGNvbnRleHQgbWFwIHRoYXQgYmVsb25ncyB0byB0aGUgY2xvc2VzdCBwYXJlbnQgY29tcG9uZW50LlxuICogTXVzdCBiZSBjYWxsZWQgZHVyaW5nIGNvbXBvbmVudCBpbml0aWFsaXNhdGlvbi4gVXNlZnVsLCBmb3IgZXhhbXBsZSwgaWYgeW91XG4gKiBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZSBhIGNvbXBvbmVudCBhbmQgd2FudCB0byBwYXNzIHRoZSBleGlzdGluZyBjb250ZXh0IHRvIGl0LlxuICpcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZSNnZXRhbGxjb250ZXh0c1xuICogQHRlbXBsYXRlIHtNYXA8YW55LCBhbnk+fSBbVD1NYXA8YW55LCBhbnk+XVxuICogQHJldHVybnMge1R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxDb250ZXh0cygpIHtcblx0cmV0dXJuIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBga2V5YCBoYXMgYmVlbiBzZXQgaW4gdGhlIGNvbnRleHQgb2YgYSBwYXJlbnQgY29tcG9uZW50LlxuICogTXVzdCBiZSBjYWxsZWQgZHVyaW5nIGNvbXBvbmVudCBpbml0aWFsaXNhdGlvbi5cbiAqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUjaGFzY29udGV4dFxuICogQHBhcmFtIHthbnl9IGtleVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDb250ZXh0KGtleSkge1xuXHRyZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5oYXMoa2V5KTtcbn1cblxuLy8gVE9ETyBmaWd1cmUgb3V0IGlmIHdlIHN0aWxsIHdhbnQgdG8gc3VwcG9ydFxuLy8gc2hvcnRoYW5kIGV2ZW50cywgb3IgaWYgd2Ugd2FudCB0byBpbXBsZW1lbnRcbi8vIGEgcmVhbCBidWJibGluZyBtZWNoYW5pc21cbi8qKlxuICogQHBhcmFtIGNvbXBvbmVudFxuICogQHBhcmFtIGV2ZW50XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1YmJsZShjb21wb25lbnQsIGV2ZW50KSB7XG5cdGNvbnN0IGNhbGxiYWNrcyA9IGNvbXBvbmVudC4kJC5jYWxsYmFja3NbZXZlbnQudHlwZV07XG5cdGlmIChjYWxsYmFja3MpIHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0Y2FsbGJhY2tzLnNsaWNlKCkuZm9yRWFjaCgoZm4pID0+IGZuLmNhbGwodGhpcywgZXZlbnQpKTtcblx0fVxufVxuIiwgImltcG9ydCB7IHRyYW5zaXRpb25faW4sIHRyYW5zaXRpb25fb3V0IH0gZnJvbSAnLi90cmFuc2l0aW9ucy5qcyc7XG5pbXBvcnQgeyBydW5fYWxsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8vIGdlbmVyYWwgZWFjaCBmdW5jdGlvbnM6XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVfYXJyYXlfbGlrZShhcnJheV9saWtlX29yX2l0ZXJhdG9yKSB7XG5cdHJldHVybiBhcnJheV9saWtlX29yX2l0ZXJhdG9yPy5sZW5ndGggIT09IHVuZGVmaW5lZFxuXHRcdD8gYXJyYXlfbGlrZV9vcl9pdGVyYXRvclxuXHRcdDogQXJyYXkuZnJvbShhcnJheV9saWtlX29yX2l0ZXJhdG9yKTtcbn1cblxuLy8ga2V5ZWQgZWFjaCBmdW5jdGlvbnM6XG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcblx0YmxvY2suZCgxKTtcblx0bG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xufVxuXG4vKiogQHJldHVybnMge3ZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuXHR0cmFuc2l0aW9uX291dChibG9jaywgMSwgMSwgKCkgPT4ge1xuXHRcdGxvb2t1cC5kZWxldGUoYmxvY2sua2V5KTtcblx0fSk7XG59XG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhfYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuXHRibG9jay5mKCk7XG5cdGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcblx0YmxvY2suZigpO1xuXHRvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cblxuLyoqIEByZXR1cm5zIHthbnlbXX0gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVfa2V5ZWRfZWFjaChcblx0b2xkX2Jsb2Nrcyxcblx0ZGlydHksXG5cdGdldF9rZXksXG5cdGR5bmFtaWMsXG5cdGN0eCxcblx0bGlzdCxcblx0bG9va3VwLFxuXHRub2RlLFxuXHRkZXN0cm95LFxuXHRjcmVhdGVfZWFjaF9ibG9jayxcblx0bmV4dCxcblx0Z2V0X2NvbnRleHRcbikge1xuXHRsZXQgbyA9IG9sZF9ibG9ja3MubGVuZ3RoO1xuXHRsZXQgbiA9IGxpc3QubGVuZ3RoO1xuXHRsZXQgaSA9IG87XG5cdGNvbnN0IG9sZF9pbmRleGVzID0ge307XG5cdHdoaWxlIChpLS0pIG9sZF9pbmRleGVzW29sZF9ibG9ja3NbaV0ua2V5XSA9IGk7XG5cdGNvbnN0IG5ld19ibG9ja3MgPSBbXTtcblx0Y29uc3QgbmV3X2xvb2t1cCA9IG5ldyBNYXAoKTtcblx0Y29uc3QgZGVsdGFzID0gbmV3IE1hcCgpO1xuXHRjb25zdCB1cGRhdGVzID0gW107XG5cdGkgPSBuO1xuXHR3aGlsZSAoaS0tKSB7XG5cdFx0Y29uc3QgY2hpbGRfY3R4ID0gZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKTtcblx0XHRjb25zdCBrZXkgPSBnZXRfa2V5KGNoaWxkX2N0eCk7XG5cdFx0bGV0IGJsb2NrID0gbG9va3VwLmdldChrZXkpO1xuXHRcdGlmICghYmxvY2spIHtcblx0XHRcdGJsb2NrID0gY3JlYXRlX2VhY2hfYmxvY2soa2V5LCBjaGlsZF9jdHgpO1xuXHRcdFx0YmxvY2suYygpO1xuXHRcdH0gZWxzZSBpZiAoZHluYW1pYykge1xuXHRcdFx0Ly8gZGVmZXIgdXBkYXRlcyB1bnRpbCBhbGwgdGhlIERPTSBzaHVmZmxpbmcgaXMgZG9uZVxuXHRcdFx0dXBkYXRlcy5wdXNoKCgpID0+IGJsb2NrLnAoY2hpbGRfY3R4LCBkaXJ0eSkpO1xuXHRcdH1cblx0XHRuZXdfbG9va3VwLnNldChrZXksIChuZXdfYmxvY2tzW2ldID0gYmxvY2spKTtcblx0XHRpZiAoa2V5IGluIG9sZF9pbmRleGVzKSBkZWx0YXMuc2V0KGtleSwgTWF0aC5hYnMoaSAtIG9sZF9pbmRleGVzW2tleV0pKTtcblx0fVxuXHRjb25zdCB3aWxsX21vdmUgPSBuZXcgU2V0KCk7XG5cdGNvbnN0IGRpZF9tb3ZlID0gbmV3IFNldCgpO1xuXHQvKiogQHJldHVybnMge3ZvaWR9ICovXG5cdGZ1bmN0aW9uIGluc2VydChibG9jaykge1xuXHRcdHRyYW5zaXRpb25faW4oYmxvY2ssIDEpO1xuXHRcdGJsb2NrLm0obm9kZSwgbmV4dCk7XG5cdFx0bG9va3VwLnNldChibG9jay5rZXksIGJsb2NrKTtcblx0XHRuZXh0ID0gYmxvY2suZmlyc3Q7XG5cdFx0bi0tO1xuXHR9XG5cdHdoaWxlIChvICYmIG4pIHtcblx0XHRjb25zdCBuZXdfYmxvY2sgPSBuZXdfYmxvY2tzW24gLSAxXTtcblx0XHRjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW28gLSAxXTtcblx0XHRjb25zdCBuZXdfa2V5ID0gbmV3X2Jsb2NrLmtleTtcblx0XHRjb25zdCBvbGRfa2V5ID0gb2xkX2Jsb2NrLmtleTtcblx0XHRpZiAobmV3X2Jsb2NrID09PSBvbGRfYmxvY2spIHtcblx0XHRcdC8vIGRvIG5vdGhpbmdcblx0XHRcdG5leHQgPSBuZXdfYmxvY2suZmlyc3Q7XG5cdFx0XHRvLS07XG5cdFx0XHRuLS07XG5cdFx0fSBlbHNlIGlmICghbmV3X2xvb2t1cC5oYXMob2xkX2tleSkpIHtcblx0XHRcdC8vIHJlbW92ZSBvbGQgYmxvY2tcblx0XHRcdGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuXHRcdFx0by0tO1xuXHRcdH0gZWxzZSBpZiAoIWxvb2t1cC5oYXMobmV3X2tleSkgfHwgd2lsbF9tb3ZlLmhhcyhuZXdfa2V5KSkge1xuXHRcdFx0aW5zZXJ0KG5ld19ibG9jayk7XG5cdFx0fSBlbHNlIGlmIChkaWRfbW92ZS5oYXMob2xkX2tleSkpIHtcblx0XHRcdG8tLTtcblx0XHR9IGVsc2UgaWYgKGRlbHRhcy5nZXQobmV3X2tleSkgPiBkZWx0YXMuZ2V0KG9sZF9rZXkpKSB7XG5cdFx0XHRkaWRfbW92ZS5hZGQobmV3X2tleSk7XG5cdFx0XHRpbnNlcnQobmV3X2Jsb2NrKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2lsbF9tb3ZlLmFkZChvbGRfa2V5KTtcblx0XHRcdG8tLTtcblx0XHR9XG5cdH1cblx0d2hpbGUgKG8tLSkge1xuXHRcdGNvbnN0IG9sZF9ibG9jayA9IG9sZF9ibG9ja3Nbb107XG5cdFx0aWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfYmxvY2sua2V5KSkgZGVzdHJveShvbGRfYmxvY2ssIGxvb2t1cCk7XG5cdH1cblx0d2hpbGUgKG4pIGluc2VydChuZXdfYmxvY2tzW24gLSAxXSk7XG5cdHJ1bl9hbGwodXBkYXRlcyk7XG5cdHJldHVybiBuZXdfYmxvY2tzO1xufVxuXG4vKiogQHJldHVybnMge3ZvaWR9ICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfZWFjaF9rZXlzKGN0eCwgbGlzdCwgZ2V0X2NvbnRleHQsIGdldF9rZXkpIHtcblx0Y29uc3Qga2V5cyA9IG5ldyBNYXAoKTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3Qga2V5ID0gZ2V0X2tleShnZXRfY29udGV4dChjdHgsIGxpc3QsIGkpKTtcblx0XHRpZiAoa2V5cy5oYXMoa2V5KSkge1xuXHRcdFx0bGV0IHZhbHVlID0gJyc7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR2YWx1ZSA9IGB3aXRoIHZhbHVlICcke1N0cmluZyhrZXkpfScgYDtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0Ly8gY2FuJ3Qgc3RyaW5naWZ5XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBDYW5ub3QgaGF2ZSBkdXBsaWNhdGUga2V5cyBpbiBhIGtleWVkIGVhY2g6IEtleXMgYXQgaW5kZXggJHtrZXlzLmdldChcblx0XHRcdFx0XHRrZXlcblx0XHRcdFx0KX0gYW5kICR7aX0gJHt2YWx1ZX1hcmUgZHVwbGljYXRlc2Bcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGtleXMuc2V0KGtleSwgaSk7XG5cdH1cbn1cbiIsICIvKiogQHJldHVybnMge3t9fSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldF9zcHJlYWRfdXBkYXRlKGxldmVscywgdXBkYXRlcykge1xuXHRjb25zdCB1cGRhdGUgPSB7fTtcblx0Y29uc3QgdG9fbnVsbF9vdXQgPSB7fTtcblx0Y29uc3QgYWNjb3VudGVkX2ZvciA9IHsgJCRzY29wZTogMSB9O1xuXHRsZXQgaSA9IGxldmVscy5sZW5ndGg7XG5cdHdoaWxlIChpLS0pIHtcblx0XHRjb25zdCBvID0gbGV2ZWxzW2ldO1xuXHRcdGNvbnN0IG4gPSB1cGRhdGVzW2ldO1xuXHRcdGlmIChuKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBvKSB7XG5cdFx0XHRcdGlmICghKGtleSBpbiBuKSkgdG9fbnVsbF9vdXRba2V5XSA9IDE7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBuKSB7XG5cdFx0XHRcdGlmICghYWNjb3VudGVkX2ZvcltrZXldKSB7XG5cdFx0XHRcdFx0dXBkYXRlW2tleV0gPSBuW2tleV07XG5cdFx0XHRcdFx0YWNjb3VudGVkX2ZvcltrZXldID0gMTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGV2ZWxzW2ldID0gbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gbykge1xuXHRcdFx0XHRhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRmb3IgKGNvbnN0IGtleSBpbiB0b19udWxsX291dCkge1xuXHRcdGlmICghKGtleSBpbiB1cGRhdGUpKSB1cGRhdGVba2V5XSA9IHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gdXBkYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0X3NwcmVhZF9vYmplY3Qoc3ByZWFkX3Byb3BzKSB7XG5cdHJldHVybiB0eXBlb2Ygc3ByZWFkX3Byb3BzID09PSAnb2JqZWN0JyAmJiBzcHJlYWRfcHJvcHMgIT09IG51bGwgPyBzcHJlYWRfcHJvcHMgOiB7fTtcbn1cbiIsICJpbXBvcnQgeyBzZXRfY3VycmVudF9jb21wb25lbnQsIGN1cnJlbnRfY29tcG9uZW50IH0gZnJvbSAnLi9saWZlY3ljbGUuanMnO1xuaW1wb3J0IHsgcnVuX2FsbCwgYmxhbmtfb2JqZWN0IH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBib29sZWFuX2F0dHJpYnV0ZXMgfSBmcm9tICcuLi8uLi9zaGFyZWQvYm9vbGVhbl9hdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGVuc3VyZV9hcnJheV9saWtlIH0gZnJvbSAnLi9lYWNoLmpzJztcbmV4cG9ydCB7IGlzX3ZvaWQgfSBmcm9tICcuLi8uLi9zaGFyZWQvdXRpbHMvbmFtZXMuanMnO1xuXG5leHBvcnQgY29uc3QgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIgPVxuXHQvW1xccydcIj4vPVxcdXtGREQwfS1cXHV7RkRFRn1cXHV7RkZGRX1cXHV7RkZGRn1cXHV7MUZGRkV9XFx1ezFGRkZGfVxcdXsyRkZGRX1cXHV7MkZGRkZ9XFx1ezNGRkZFfVxcdXszRkZGRn1cXHV7NEZGRkV9XFx1ezRGRkZGfVxcdXs1RkZGRX1cXHV7NUZGRkZ9XFx1ezZGRkZFfVxcdXs2RkZGRn1cXHV7N0ZGRkV9XFx1ezdGRkZGfVxcdXs4RkZGRX1cXHV7OEZGRkZ9XFx1ezlGRkZFfVxcdXs5RkZGRn1cXHV7QUZGRkV9XFx1e0FGRkZGfVxcdXtCRkZGRX1cXHV7QkZGRkZ9XFx1e0NGRkZFfVxcdXtDRkZGRn1cXHV7REZGRkV9XFx1e0RGRkZGfVxcdXtFRkZGRX1cXHV7RUZGRkZ9XFx1e0ZGRkZFfVxcdXtGRkZGRn1cXHV7MTBGRkZFfVxcdXsxMEZGRkZ9XS91O1xuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jbm9uY2hhcmFjdGVyXG5cbi8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwcmVhZChhcmdzLCBhdHRyc190b19hZGQpIHtcblx0Y29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpO1xuXHRpZiAoYXR0cnNfdG9fYWRkKSB7XG5cdFx0Y29uc3QgY2xhc3Nlc190b19hZGQgPSBhdHRyc190b19hZGQuY2xhc3Nlcztcblx0XHRjb25zdCBzdHlsZXNfdG9fYWRkID0gYXR0cnNfdG9fYWRkLnN0eWxlcztcblx0XHRpZiAoY2xhc3Nlc190b19hZGQpIHtcblx0XHRcdGlmIChhdHRyaWJ1dGVzLmNsYXNzID09IG51bGwpIHtcblx0XHRcdFx0YXR0cmlidXRlcy5jbGFzcyA9IGNsYXNzZXNfdG9fYWRkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXR0cmlidXRlcy5jbGFzcyArPSAnICcgKyBjbGFzc2VzX3RvX2FkZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHN0eWxlc190b19hZGQpIHtcblx0XHRcdGlmIChhdHRyaWJ1dGVzLnN0eWxlID09IG51bGwpIHtcblx0XHRcdFx0YXR0cmlidXRlcy5zdHlsZSA9IHN0eWxlX29iamVjdF90b19zdHJpbmcoc3R5bGVzX3RvX2FkZCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhdHRyaWJ1dGVzLnN0eWxlID0gc3R5bGVfb2JqZWN0X3RvX3N0cmluZyhcblx0XHRcdFx0XHRtZXJnZV9zc3Jfc3R5bGVzKGF0dHJpYnV0ZXMuc3R5bGUsIHN0eWxlc190b19hZGQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGxldCBzdHIgPSAnJztcblx0T2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGlmIChpbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX2NoYXJhY3Rlci50ZXN0KG5hbWUpKSByZXR1cm47XG5cdFx0Y29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXHRcdGlmICh2YWx1ZSA9PT0gdHJ1ZSkgc3RyICs9ICcgJyArIG5hbWU7XG5cdFx0ZWxzZSBpZiAoYm9vbGVhbl9hdHRyaWJ1dGVzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG5cdFx0XHRpZiAodmFsdWUpIHN0ciArPSAnICcgKyBuYW1lO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0c3RyICs9IGAgJHtuYW1lfT1cIiR7dmFsdWV9XCJgO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzdHI7XG59XG5cbi8qKiBAcmV0dXJucyB7e319ICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2Vfc3NyX3N0eWxlcyhzdHlsZV9hdHRyaWJ1dGUsIHN0eWxlX2RpcmVjdGl2ZSkge1xuXHRjb25zdCBzdHlsZV9vYmplY3QgPSB7fTtcblx0Zm9yIChjb25zdCBpbmRpdmlkdWFsX3N0eWxlIG9mIHN0eWxlX2F0dHJpYnV0ZS5zcGxpdCgnOycpKSB7XG5cdFx0Y29uc3QgY29sb25faW5kZXggPSBpbmRpdmlkdWFsX3N0eWxlLmluZGV4T2YoJzonKTtcblx0XHRjb25zdCBuYW1lID0gaW5kaXZpZHVhbF9zdHlsZS5zbGljZSgwLCBjb2xvbl9pbmRleCkudHJpbSgpO1xuXHRcdGNvbnN0IHZhbHVlID0gaW5kaXZpZHVhbF9zdHlsZS5zbGljZShjb2xvbl9pbmRleCArIDEpLnRyaW0oKTtcblx0XHRpZiAoIW5hbWUpIGNvbnRpbnVlO1xuXHRcdHN0eWxlX29iamVjdFtuYW1lXSA9IHZhbHVlO1xuXHR9XG5cdGZvciAoY29uc3QgbmFtZSBpbiBzdHlsZV9kaXJlY3RpdmUpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHN0eWxlX2RpcmVjdGl2ZVtuYW1lXTtcblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdHN0eWxlX29iamVjdFtuYW1lXSA9IHZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgc3R5bGVfb2JqZWN0W25hbWVdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gc3R5bGVfb2JqZWN0O1xufVxuXG5jb25zdCBBVFRSX1JFR0VYID0gL1smXCJdL2c7XG5jb25zdCBDT05URU5UX1JFR0VYID0gL1smPF0vZztcblxuLyoqXG4gKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyBwZXJmb3JtYW5jZSBzZW5zaXRpdmUgYW5kIGhhcyBiZWVuIG9wdGltaXplZFxuICogaHR0cHM6Ly9naXRodWIuY29tL3N2ZWx0ZWpzL3N2ZWx0ZS9wdWxsLzU3MDFcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGUodmFsdWUsIGlzX2F0dHIgPSBmYWxzZSkge1xuXHRjb25zdCBzdHIgPSBTdHJpbmcodmFsdWUpO1xuXHRjb25zdCBwYXR0ZXJuID0gaXNfYXR0ciA/IEFUVFJfUkVHRVggOiBDT05URU5UX1JFR0VYO1xuXHRwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG5cdGxldCBlc2NhcGVkID0gJyc7XG5cdGxldCBsYXN0ID0gMDtcblx0d2hpbGUgKHBhdHRlcm4udGVzdChzdHIpKSB7XG5cdFx0Y29uc3QgaSA9IHBhdHRlcm4ubGFzdEluZGV4IC0gMTtcblx0XHRjb25zdCBjaCA9IHN0cltpXTtcblx0XHRlc2NhcGVkICs9IHN0ci5zdWJzdHJpbmcobGFzdCwgaSkgKyAoY2ggPT09ICcmJyA/ICcmYW1wOycgOiBjaCA9PT0gJ1wiJyA/ICcmcXVvdDsnIDogJyZsdDsnKTtcblx0XHRsYXN0ID0gaSArIDE7XG5cdH1cblx0cmV0dXJuIGVzY2FwZWQgKyBzdHIuc3Vic3RyaW5nKGxhc3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZSh2YWx1ZSkge1xuXHQvLyBrZWVwIGJvb2xlYW5zLCBudWxsLCBhbmQgdW5kZWZpbmVkIGZvciB0aGUgc2FrZSBvZiBgc3ByZWFkYFxuXHRjb25zdCBzaG91bGRfZXNjYXBlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jyk7XG5cdHJldHVybiBzaG91bGRfZXNjYXBlID8gZXNjYXBlKHZhbHVlLCB0cnVlKSA6IHZhbHVlO1xufVxuXG4vKiogQHJldHVybnMge3t9fSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZV9vYmplY3Qob2JqKSB7XG5cdGNvbnN0IHJlc3VsdCA9IHt9O1xuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcblx0XHRyZXN1bHRba2V5XSA9IGVzY2FwZV9hdHRyaWJ1dGVfdmFsdWUob2JqW2tleV0pO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVhY2goaXRlbXMsIGZuKSB7XG5cdGl0ZW1zID0gZW5zdXJlX2FycmF5X2xpa2UoaXRlbXMpO1xuXHRsZXQgc3RyID0gJyc7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRzdHIgKz0gZm4oaXRlbXNbaV0sIGkpO1xuXHR9XG5cdHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBjb25zdCBtaXNzaW5nX2NvbXBvbmVudCA9IHtcblx0JCRyZW5kZXI6ICgpID0+ICcnXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfY29tcG9uZW50KGNvbXBvbmVudCwgbmFtZSkge1xuXHRpZiAoIWNvbXBvbmVudCB8fCAhY29tcG9uZW50LiQkcmVuZGVyKSB7XG5cdFx0aWYgKG5hbWUgPT09ICdzdmVsdGU6Y29tcG9uZW50JykgbmFtZSArPSAnIHRoaXM9ey4uLn0nO1xuXHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdGA8JHtuYW1lfT4gaXMgbm90IGEgdmFsaWQgU1NSIGNvbXBvbmVudC4gWW91IG1heSBuZWVkIHRvIHJldmlldyB5b3VyIGJ1aWxkIGNvbmZpZyB0byBlbnN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGNvbXBpbGVkLCByYXRoZXIgdGhhbiBpbXBvcnRlZCBhcyBwcmUtY29tcGlsZWQgbW9kdWxlcy4gT3RoZXJ3aXNlIHlvdSBtYXkgbmVlZCB0byBmaXggYSA8JHtuYW1lfT4uYFxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIGNvbXBvbmVudDtcbn1cblxuLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG5leHBvcnQgZnVuY3Rpb24gZGVidWcoZmlsZSwgbGluZSwgY29sdW1uLCB2YWx1ZXMpIHtcblx0Y29uc29sZS5sb2coYHtAZGVidWd9ICR7ZmlsZSA/IGZpbGUgKyAnICcgOiAnJ30oJHtsaW5lfToke2NvbHVtbn0pYCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXHRjb25zb2xlLmxvZyh2YWx1ZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcblx0cmV0dXJuICcnO1xufVxuXG5sZXQgb25fZGVzdHJveTtcblxuLyoqIEByZXR1cm5zIHt7IHJlbmRlcjogKHByb3BzPzoge30sIHsgJCRzbG90cywgY29udGV4dCB9PzogeyAkJHNsb3RzPzoge307IGNvbnRleHQ/OiBNYXA8YW55LCBhbnk+OyB9KSA9PiB7IGh0bWw6IGFueTsgY3NzOiB7IGNvZGU6IHN0cmluZzsgbWFwOiBhbnk7IH07IGhlYWQ6IHN0cmluZzsgfTsgJCRyZW5kZXI6IChyZXN1bHQ6IGFueSwgcHJvcHM6IGFueSwgYmluZGluZ3M6IGFueSwgc2xvdHM6IGFueSwgY29udGV4dDogYW55KSA9PiBhbnk7IH19ICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlX3Nzcl9jb21wb25lbnQoZm4pIHtcblx0ZnVuY3Rpb24gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzLCBjb250ZXh0KSB7XG5cdFx0Y29uc3QgcGFyZW50X2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuXHRcdGNvbnN0ICQkID0ge1xuXHRcdFx0b25fZGVzdHJveSxcblx0XHRcdGNvbnRleHQ6IG5ldyBNYXAoY29udGV4dCB8fCAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSksXG5cdFx0XHQvLyB0aGVzZSB3aWxsIGJlIGltbWVkaWF0ZWx5IGRpc2NhcmRlZFxuXHRcdFx0b25fbW91bnQ6IFtdLFxuXHRcdFx0YmVmb3JlX3VwZGF0ZTogW10sXG5cdFx0XHRhZnRlcl91cGRhdGU6IFtdLFxuXHRcdFx0Y2FsbGJhY2tzOiBibGFua19vYmplY3QoKVxuXHRcdH07XG5cdFx0c2V0X2N1cnJlbnRfY29tcG9uZW50KHsgJCQgfSk7XG5cdFx0Y29uc3QgaHRtbCA9IGZuKHJlc3VsdCwgcHJvcHMsIGJpbmRpbmdzLCBzbG90cyk7XG5cdFx0c2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xuXHRcdHJldHVybiBodG1sO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0cmVuZGVyOiAocHJvcHMgPSB7fSwgeyAkJHNsb3RzID0ge30sIGNvbnRleHQgPSBuZXcgTWFwKCkgfSA9IHt9KSA9PiB7XG5cdFx0XHRvbl9kZXN0cm95ID0gW107XG5cdFx0XHRjb25zdCByZXN1bHQgPSB7IHRpdGxlOiAnJywgaGVhZDogJycsIGNzczogbmV3IFNldCgpIH07XG5cdFx0XHRjb25zdCBodG1sID0gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywge30sICQkc2xvdHMsIGNvbnRleHQpO1xuXHRcdFx0cnVuX2FsbChvbl9kZXN0cm95KTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGh0bWwsXG5cdFx0XHRcdGNzczoge1xuXHRcdFx0XHRcdGNvZGU6IEFycmF5LmZyb20ocmVzdWx0LmNzcylcblx0XHRcdFx0XHRcdC5tYXAoKGNzcykgPT4gY3NzLmNvZGUpXG5cdFx0XHRcdFx0XHQuam9pbignXFxuJyksXG5cdFx0XHRcdFx0bWFwOiBudWxsIC8vIFRPRE9cblx0XHRcdFx0fSxcblx0XHRcdFx0aGVhZDogcmVzdWx0LnRpdGxlICsgcmVzdWx0LmhlYWRcblx0XHRcdH07XG5cdFx0fSxcblx0XHQkJHJlbmRlclxuXHR9O1xufVxuXG4vKiogQHJldHVybnMge3N0cmluZ30gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRfYXR0cmlidXRlKG5hbWUsIHZhbHVlLCBib29sZWFuKSB7XG5cdGlmICh2YWx1ZSA9PSBudWxsIHx8IChib29sZWFuICYmICF2YWx1ZSkpIHJldHVybiAnJztcblx0Y29uc3QgYXNzaWdubWVudCA9IGJvb2xlYW4gJiYgdmFsdWUgPT09IHRydWUgPyAnJyA6IGA9XCIke2VzY2FwZSh2YWx1ZSwgdHJ1ZSl9XCJgO1xuXHRyZXR1cm4gYCAke25hbWV9JHthc3NpZ25tZW50fWA7XG59XG5cbi8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZF9jbGFzc2VzKGNsYXNzZXMpIHtcblx0cmV0dXJuIGNsYXNzZXMgPyBgIGNsYXNzPVwiJHtjbGFzc2VzfVwiYCA6ICcnO1xufVxuXG4vKiogQHJldHVybnMge3N0cmluZ30gKi9cbmZ1bmN0aW9uIHN0eWxlX29iamVjdF90b19zdHJpbmcoc3R5bGVfb2JqZWN0KSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhzdHlsZV9vYmplY3QpXG5cdFx0LmZpbHRlcigoa2V5KSA9PiBzdHlsZV9vYmplY3Rba2V5XSlcblx0XHQubWFwKChrZXkpID0+IGAke2tleX06ICR7ZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZShzdHlsZV9vYmplY3Rba2V5XSl9O2ApXG5cdFx0LmpvaW4oJyAnKTtcbn1cblxuLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG5leHBvcnQgZnVuY3Rpb24gYWRkX3N0eWxlcyhzdHlsZV9vYmplY3QpIHtcblx0Y29uc3Qgc3R5bGVzID0gc3R5bGVfb2JqZWN0X3RvX3N0cmluZyhzdHlsZV9vYmplY3QpO1xuXHRyZXR1cm4gc3R5bGVzID8gYCBzdHlsZT1cIiR7c3R5bGVzfVwiYCA6ICcnO1xufVxuIiwgImNvbnN0IF9ib29sZWFuX2F0dHJpYnV0ZXMgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoW1xuXHQnYWxsb3dmdWxsc2NyZWVuJyxcblx0J2FsbG93cGF5bWVudHJlcXVlc3QnLFxuXHQnYXN5bmMnLFxuXHQnYXV0b2ZvY3VzJyxcblx0J2F1dG9wbGF5Jyxcblx0J2NoZWNrZWQnLFxuXHQnY29udHJvbHMnLFxuXHQnZGVmYXVsdCcsXG5cdCdkZWZlcicsXG5cdCdkaXNhYmxlZCcsXG5cdCdmb3Jtbm92YWxpZGF0ZScsXG5cdCdoaWRkZW4nLFxuXHQnaW5lcnQnLFxuXHQnaXNtYXAnLFxuXHQnbG9vcCcsXG5cdCdtdWx0aXBsZScsXG5cdCdtdXRlZCcsXG5cdCdub21vZHVsZScsXG5cdCdub3ZhbGlkYXRlJyxcblx0J29wZW4nLFxuXHQncGxheXNpbmxpbmUnLFxuXHQncmVhZG9ubHknLFxuXHQncmVxdWlyZWQnLFxuXHQncmV2ZXJzZWQnLFxuXHQnc2VsZWN0ZWQnXG5dKTtcblxuLyoqXG4gKiBMaXN0IG9mIEhUTUwgYm9vbGVhbiBhdHRyaWJ1dGVzIChlLmcuIGA8aW5wdXQgZGlzYWJsZWQ+YCkuXG4gKiBTb3VyY2U6IGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZGljZXMuaHRtbFxuICpcbiAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAqL1xuZXhwb3J0IGNvbnN0IGJvb2xlYW5fYXR0cmlidXRlcyA9IG5ldyBTZXQoWy4uLl9ib29sZWFuX2F0dHJpYnV0ZXNdKTtcblxuLyoqIEB0eXBlZGVmIHt0eXBlb2YgX2Jvb2xlYW5fYXR0cmlidXRlc1tudW1iZXJdfSBCb29sZWFuQXR0cmlidXRlcyAqL1xuIiwgIi8qKiByZWdleCBvZiBhbGwgaHRtbCB2b2lkIGVsZW1lbnQgbmFtZXMgKi9cbmNvbnN0IHZvaWRfZWxlbWVudF9uYW1lcyA9XG5cdC9eKD86YXJlYXxiYXNlfGJyfGNvbHxjb21tYW5kfGVtYmVkfGhyfGltZ3xpbnB1dHxrZXlnZW58bGlua3xtZXRhfHBhcmFtfHNvdXJjZXx0cmFja3x3YnIpJC87XG5cbi8qKiByZWdleCBvZiBhbGwgaHRtbCBlbGVtZW50IG5hbWVzLiBzdmcgYW5kIG1hdGggYXJlIG9taXR0ZWQgYmVjYXVzZSB0aGV5IGJlbG9uZyB0byB0aGUgc3ZnIGVsZW1lbnRzIG5hbWVzcGFjZSAqL1xuY29uc3QgaHRtbF9lbGVtZW50X25hbWVzID1cblx0L14oPzphfGFiYnJ8YWRkcmVzc3xhcmVhfGFydGljbGV8YXNpZGV8YXVkaW98YnxiYXNlfGJkaXxiZG98YmxvY2txdW90ZXxib2R5fGJyfGJ1dHRvbnxjYW52YXN8Y2FwdGlvbnxjaXRlfGNvZGV8Y29sfGNvbGdyb3VwfGRhdGF8ZGF0YWxpc3R8ZGR8ZGVsfGRldGFpbHN8ZGZufGRpYWxvZ3xkaXZ8ZGx8ZHR8ZW18ZW1iZWR8ZmllbGRzZXR8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGZvcm18aDF8aDJ8aDN8aDR8aDV8aDZ8aGVhZHxoZWFkZXJ8aHJ8aHRtbHxpfGlmcmFtZXxpbWd8aW5wdXR8aW5zfGtiZHxsYWJlbHxsZWdlbmR8bGl8bGlua3xtYWlufG1hcHxtYXJrfG1ldGF8bWV0ZXJ8bmF2fG5vc2NyaXB0fG9iamVjdHxvbHxvcHRncm91cHxvcHRpb258b3V0cHV0fHB8cGFyYW18cGljdHVyZXxwcmV8cHJvZ3Jlc3N8cXxycHxydHxydWJ5fHN8c2FtcHxzY3JpcHR8c2VjdGlvbnxzZWxlY3R8c21hbGx8c291cmNlfHNwYW58c3Ryb25nfHN0eWxlfHN1YnxzdW1tYXJ5fHN1cHx0YWJsZXx0Ym9keXx0ZHx0ZW1wbGF0ZXx0ZXh0YXJlYXx0Zm9vdHx0aHx0aGVhZHx0aW1lfHRpdGxlfHRyfHRyYWNrfHV8dWx8dmFyfHZpZGVvfHdicikkLztcblxuLyoqIHJlZ2V4IG9mIGFsbCBzdmcgZWxlbWVudCBuYW1lcyAqL1xuY29uc3Qgc3ZnID1cblx0L14oPzphbHRHbHlwaHxhbHRHbHlwaERlZnxhbHRHbHlwaEl0ZW18YW5pbWF0ZXxhbmltYXRlQ29sb3J8YW5pbWF0ZU1vdGlvbnxhbmltYXRlVHJhbnNmb3JtfGNpcmNsZXxjbGlwUGF0aHxjb2xvci1wcm9maWxlfGN1cnNvcnxkZWZzfGRlc2N8ZGlzY2FyZHxlbGxpcHNlfGZlQmxlbmR8ZmVDb2xvck1hdHJpeHxmZUNvbXBvbmVudFRyYW5zZmVyfGZlQ29tcG9zaXRlfGZlQ29udm9sdmVNYXRyaXh8ZmVEaWZmdXNlTGlnaHRpbmd8ZmVEaXNwbGFjZW1lbnRNYXB8ZmVEaXN0YW50TGlnaHR8ZmVEcm9wU2hhZG93fGZlRmxvb2R8ZmVGdW5jQXxmZUZ1bmNCfGZlRnVuY0d8ZmVGdW5jUnxmZUdhdXNzaWFuQmx1cnxmZUltYWdlfGZlTWVyZ2V8ZmVNZXJnZU5vZGV8ZmVNb3JwaG9sb2d5fGZlT2Zmc2V0fGZlUG9pbnRMaWdodHxmZVNwZWN1bGFyTGlnaHRpbmd8ZmVTcG90TGlnaHR8ZmVUaWxlfGZlVHVyYnVsZW5jZXxmaWx0ZXJ8Zm9udHxmb250LWZhY2V8Zm9udC1mYWNlLWZvcm1hdHxmb250LWZhY2UtbmFtZXxmb250LWZhY2Utc3JjfGZvbnQtZmFjZS11cml8Zm9yZWlnbk9iamVjdHxnfGdseXBofGdseXBoUmVmfGhhdGNofGhhdGNocGF0aHxoa2VybnxpbWFnZXxsaW5lfGxpbmVhckdyYWRpZW50fG1hcmtlcnxtYXNrfG1lc2h8bWVzaGdyYWRpZW50fG1lc2hwYXRjaHxtZXNocm93fG1ldGFkYXRhfG1pc3NpbmctZ2x5cGh8bXBhdGh8cGF0aHxwYXR0ZXJufHBvbHlnb258cG9seWxpbmV8cmFkaWFsR3JhZGllbnR8cmVjdHxzZXR8c29saWRjb2xvcnxzdG9wfHN2Z3xzd2l0Y2h8c3ltYm9sfHRleHR8dGV4dFBhdGh8dHJlZnx0c3Bhbnx1bmtub3dufHVzZXx2aWV3fHZrZXJuKSQvO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzX3ZvaWQobmFtZSkge1xuXHRyZXR1cm4gdm9pZF9lbGVtZW50X25hbWVzLnRlc3QobmFtZSkgfHwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSAnIWRvY3R5cGUnO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzX2h0bWwobmFtZSkge1xuXHRyZXR1cm4gaHRtbF9lbGVtZW50X25hbWVzLnRlc3QobmFtZSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNfc3ZnKG5hbWUpIHtcblx0cmV0dXJuIHN2Zy50ZXN0KG5hbWUpO1xufVxuIiwgImltcG9ydCB7XG5cdGFkZF9yZW5kZXJfY2FsbGJhY2ssXG5cdGZsdXNoLFxuXHRmbHVzaF9yZW5kZXJfY2FsbGJhY2tzLFxuXHRzY2hlZHVsZV91cGRhdGUsXG5cdGRpcnR5X2NvbXBvbmVudHNcbn0gZnJvbSAnLi9zY2hlZHVsZXIuanMnO1xuaW1wb3J0IHsgY3VycmVudF9jb21wb25lbnQsIHNldF9jdXJyZW50X2NvbXBvbmVudCB9IGZyb20gJy4vbGlmZWN5Y2xlLmpzJztcbmltcG9ydCB7IGJsYW5rX29iamVjdCwgaXNfZW1wdHksIGlzX2Z1bmN0aW9uLCBydW4sIHJ1bl9hbGwsIG5vb3AgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7XG5cdGNoaWxkcmVuLFxuXHRkZXRhY2gsXG5cdHN0YXJ0X2h5ZHJhdGluZyxcblx0ZW5kX2h5ZHJhdGluZyxcblx0Z2V0X2N1c3RvbV9lbGVtZW50c19zbG90cyxcblx0aW5zZXJ0LFxuXHRlbGVtZW50LFxuXHRhdHRyXG59IGZyb20gJy4vZG9tLmpzJztcbmltcG9ydCB7IHRyYW5zaXRpb25faW4gfSBmcm9tICcuL3RyYW5zaXRpb25zLmpzJztcblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmQoY29tcG9uZW50LCBuYW1lLCBjYWxsYmFjaykge1xuXHRjb25zdCBpbmRleCA9IGNvbXBvbmVudC4kJC5wcm9wc1tuYW1lXTtcblx0aWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcblx0XHRjb21wb25lbnQuJCQuYm91bmRbaW5kZXhdID0gY2FsbGJhY2s7XG5cdFx0Y2FsbGJhY2soY29tcG9uZW50LiQkLmN0eFtpbmRleF0pO1xuXHR9XG59XG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVfY29tcG9uZW50KGJsb2NrKSB7XG5cdGJsb2NrICYmIGJsb2NrLmMoKTtcbn1cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYWltX2NvbXBvbmVudChibG9jaywgcGFyZW50X25vZGVzKSB7XG5cdGJsb2NrICYmIGJsb2NrLmwocGFyZW50X25vZGVzKTtcbn1cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdW50X2NvbXBvbmVudChjb21wb25lbnQsIHRhcmdldCwgYW5jaG9yKSB7XG5cdGNvbnN0IHsgZnJhZ21lbnQsIGFmdGVyX3VwZGF0ZSB9ID0gY29tcG9uZW50LiQkO1xuXHRmcmFnbWVudCAmJiBmcmFnbWVudC5tKHRhcmdldCwgYW5jaG9yKTtcblx0Ly8gb25Nb3VudCBoYXBwZW5zIGJlZm9yZSB0aGUgaW5pdGlhbCBhZnRlclVwZGF0ZVxuXHRhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IHtcblx0XHRjb25zdCBuZXdfb25fZGVzdHJveSA9IGNvbXBvbmVudC4kJC5vbl9tb3VudC5tYXAocnVuKS5maWx0ZXIoaXNfZnVuY3Rpb24pO1xuXHRcdC8vIGlmIHRoZSBjb21wb25lbnQgd2FzIGRlc3Ryb3llZCBpbW1lZGlhdGVseVxuXHRcdC8vIGl0IHdpbGwgdXBkYXRlIHRoZSBgJCQub25fZGVzdHJveWAgcmVmZXJlbmNlIHRvIGBudWxsYC5cblx0XHQvLyB0aGUgZGVzdHJ1Y3R1cmVkIG9uX2Rlc3Ryb3kgbWF5IHN0aWxsIHJlZmVyZW5jZSB0byB0aGUgb2xkIGFycmF5XG5cdFx0aWYgKGNvbXBvbmVudC4kJC5vbl9kZXN0cm95KSB7XG5cdFx0XHRjb21wb25lbnQuJCQub25fZGVzdHJveS5wdXNoKC4uLm5ld19vbl9kZXN0cm95KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRWRnZSBjYXNlIC0gY29tcG9uZW50IHdhcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHksXG5cdFx0XHQvLyBtb3N0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBhIGJpbmRpbmcgaW5pdGlhbGlzaW5nXG5cdFx0XHRydW5fYWxsKG5ld19vbl9kZXN0cm95KTtcblx0XHR9XG5cdFx0Y29tcG9uZW50LiQkLm9uX21vdW50ID0gW107XG5cdH0pO1xuXHRhZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbn1cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc3Ryb3lfY29tcG9uZW50KGNvbXBvbmVudCwgZGV0YWNoaW5nKSB7XG5cdGNvbnN0ICQkID0gY29tcG9uZW50LiQkO1xuXHRpZiAoJCQuZnJhZ21lbnQgIT09IG51bGwpIHtcblx0XHRmbHVzaF9yZW5kZXJfY2FsbGJhY2tzKCQkLmFmdGVyX3VwZGF0ZSk7XG5cdFx0cnVuX2FsbCgkJC5vbl9kZXN0cm95KTtcblx0XHQkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5kKGRldGFjaGluZyk7XG5cdFx0Ly8gVE9ETyBudWxsIG91dCBvdGhlciByZWZzLCBpbmNsdWRpbmcgY29tcG9uZW50LiQkIChidXQgbmVlZCB0b1xuXHRcdC8vIHByZXNlcnZlIGZpbmFsIHN0YXRlPylcblx0XHQkJC5vbl9kZXN0cm95ID0gJCQuZnJhZ21lbnQgPSBudWxsO1xuXHRcdCQkLmN0eCA9IFtdO1xuXHR9XG59XG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmZ1bmN0aW9uIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKSB7XG5cdGlmIChjb21wb25lbnQuJCQuZGlydHlbMF0gPT09IC0xKSB7XG5cdFx0ZGlydHlfY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG5cdFx0c2NoZWR1bGVfdXBkYXRlKCk7XG5cdFx0Y29tcG9uZW50LiQkLmRpcnR5LmZpbGwoMCk7XG5cdH1cblx0Y29tcG9uZW50LiQkLmRpcnR5WyhpIC8gMzEpIHwgMF0gfD0gMSA8PCBpICUgMzE7XG59XG5cbi8vIFRPRE86IERvY3VtZW50IHRoZSBvdGhlciBwYXJhbXNcbi8qKlxuICogQHBhcmFtIHtTdmVsdGVDb21wb25lbnR9IGNvbXBvbmVudFxuICogQHBhcmFtIHtpbXBvcnQoJy4vcHVibGljLmpzJykuQ29tcG9uZW50Q29uc3RydWN0b3JPcHRpb25zfSBvcHRpb25zXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vdXRpbHMuanMnKVsnbm90X2VxdWFsJ119IG5vdF9lcXVhbCBVc2VkIHRvIGNvbXBhcmUgcHJvcHMgYW5kIHN0YXRlIHZhbHVlcy5cbiAqIEBwYXJhbSB7KHRhcmdldDogRWxlbWVudCB8IFNoYWRvd1Jvb3QpID0+IHZvaWR9IFthcHBlbmRfc3R5bGVzXSBGdW5jdGlvbiB0aGF0IGFwcGVuZHMgc3R5bGVzIHRvIHRoZSBET00gd2hlbiB0aGUgY29tcG9uZW50IGlzIGZpcnN0IGluaXRpYWxpc2VkLlxuICogVGhpcyB3aWxsIGJlIHRoZSBgYWRkX2Nzc2AgZnVuY3Rpb24gZnJvbSB0aGUgY29tcGlsZWQgY29tcG9uZW50LlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdChcblx0Y29tcG9uZW50LFxuXHRvcHRpb25zLFxuXHRpbnN0YW5jZSxcblx0Y3JlYXRlX2ZyYWdtZW50LFxuXHRub3RfZXF1YWwsXG5cdHByb3BzLFxuXHRhcHBlbmRfc3R5bGVzID0gbnVsbCxcblx0ZGlydHkgPSBbLTFdXG4pIHtcblx0Y29uc3QgcGFyZW50X2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuXHRzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vcHJpdmF0ZS5qcycpLlQkJH0gKi9cblx0Y29uc3QgJCQgPSAoY29tcG9uZW50LiQkID0ge1xuXHRcdGZyYWdtZW50OiBudWxsLFxuXHRcdGN0eDogW10sXG5cdFx0Ly8gc3RhdGVcblx0XHRwcm9wcyxcblx0XHR1cGRhdGU6IG5vb3AsXG5cdFx0bm90X2VxdWFsLFxuXHRcdGJvdW5kOiBibGFua19vYmplY3QoKSxcblx0XHQvLyBsaWZlY3ljbGVcblx0XHRvbl9tb3VudDogW10sXG5cdFx0b25fZGVzdHJveTogW10sXG5cdFx0b25fZGlzY29ubmVjdDogW10sXG5cdFx0YmVmb3JlX3VwZGF0ZTogW10sXG5cdFx0YWZ0ZXJfdXBkYXRlOiBbXSxcblx0XHRjb250ZXh0OiBuZXcgTWFwKG9wdGlvbnMuY29udGV4dCB8fCAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSksXG5cdFx0Ly8gZXZlcnl0aGluZyBlbHNlXG5cdFx0Y2FsbGJhY2tzOiBibGFua19vYmplY3QoKSxcblx0XHRkaXJ0eSxcblx0XHRza2lwX2JvdW5kOiBmYWxzZSxcblx0XHRyb290OiBvcHRpb25zLnRhcmdldCB8fCBwYXJlbnRfY29tcG9uZW50LiQkLnJvb3Rcblx0fSk7XG5cdGFwcGVuZF9zdHlsZXMgJiYgYXBwZW5kX3N0eWxlcygkJC5yb290KTtcblx0bGV0IHJlYWR5ID0gZmFsc2U7XG5cdCQkLmN0eCA9IGluc3RhbmNlXG5cdFx0PyBpbnN0YW5jZShjb21wb25lbnQsIG9wdGlvbnMucHJvcHMgfHwge30sIChpLCByZXQsIC4uLnJlc3QpID0+IHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSByZXN0Lmxlbmd0aCA/IHJlc3RbMF0gOiByZXQ7XG5cdFx0XHRcdGlmICgkJC5jdHggJiYgbm90X2VxdWFsKCQkLmN0eFtpXSwgKCQkLmN0eFtpXSA9IHZhbHVlKSkpIHtcblx0XHRcdFx0XHRpZiAoISQkLnNraXBfYm91bmQgJiYgJCQuYm91bmRbaV0pICQkLmJvdW5kW2ldKHZhbHVlKTtcblx0XHRcdFx0XHRpZiAocmVhZHkpIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdCAgfSlcblx0XHQ6IFtdO1xuXHQkJC51cGRhdGUoKTtcblx0cmVhZHkgPSB0cnVlO1xuXHRydW5fYWxsKCQkLmJlZm9yZV91cGRhdGUpO1xuXHQvLyBgZmFsc2VgIGFzIGEgc3BlY2lhbCBjYXNlIG9mIG5vIERPTSBjb21wb25lbnRcblx0JCQuZnJhZ21lbnQgPSBjcmVhdGVfZnJhZ21lbnQgPyBjcmVhdGVfZnJhZ21lbnQoJCQuY3R4KSA6IGZhbHNlO1xuXHRpZiAob3B0aW9ucy50YXJnZXQpIHtcblx0XHRpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG5cdFx0XHRzdGFydF9oeWRyYXRpbmcoKTtcblx0XHRcdC8vIFRPRE86IHdoYXQgaXMgdGhlIGNvcnJlY3QgdHlwZSBoZXJlP1xuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvclxuXHRcdFx0Y29uc3Qgbm9kZXMgPSBjaGlsZHJlbihvcHRpb25zLnRhcmdldCk7XG5cdFx0XHQkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5sKG5vZGVzKTtcblx0XHRcdG5vZGVzLmZvckVhY2goZGV0YWNoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cblx0XHRcdCQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LmMoKTtcblx0XHR9XG5cdFx0aWYgKG9wdGlvbnMuaW50cm8pIHRyYW5zaXRpb25faW4oY29tcG9uZW50LiQkLmZyYWdtZW50KTtcblx0XHRtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCBvcHRpb25zLnRhcmdldCwgb3B0aW9ucy5hbmNob3IpO1xuXHRcdGVuZF9oeWRyYXRpbmcoKTtcblx0XHRmbHVzaCgpO1xuXHR9XG5cdHNldF9jdXJyZW50X2NvbXBvbmVudChwYXJlbnRfY29tcG9uZW50KTtcbn1cblxuZXhwb3J0IGxldCBTdmVsdGVFbGVtZW50O1xuXG5pZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFN2ZWx0ZUVsZW1lbnQgPSBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcblx0XHQvKiogVGhlIFN2ZWx0ZSBjb21wb25lbnQgY29uc3RydWN0b3IgKi9cblx0XHQkJGN0b3I7XG5cdFx0LyoqIFNsb3RzICovXG5cdFx0JCRzO1xuXHRcdC8qKiBUaGUgU3ZlbHRlIGNvbXBvbmVudCBpbnN0YW5jZSAqL1xuXHRcdCQkYztcblx0XHQvKiogV2hldGhlciBvciBub3QgdGhlIGN1c3RvbSBlbGVtZW50IGlzIGNvbm5lY3RlZCAqL1xuXHRcdCQkY24gPSBmYWxzZTtcblx0XHQvKiogQ29tcG9uZW50IHByb3BzIGRhdGEgKi9cblx0XHQkJGQgPSB7fTtcblx0XHQvKiogYHRydWVgIGlmIGN1cnJlbnRseSBpbiB0aGUgcHJvY2VzcyBvZiByZWZsZWN0aW5nIGNvbXBvbmVudCBwcm9wcyBiYWNrIHRvIGF0dHJpYnV0ZXMgKi9cblx0XHQkJHIgPSBmYWxzZTtcblx0XHQvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRQcm9wRGVmaW5pdGlvbj59IFByb3BzIGRlZmluaXRpb24gKG5hbWUsIHJlZmxlY3RlZCwgdHlwZSBldGMpICovXG5cdFx0JCRwX2QgPSB7fTtcblx0XHQvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIEZ1bmN0aW9uW10+fSBFdmVudCBsaXN0ZW5lcnMgKi9cblx0XHQkJGwgPSB7fTtcblx0XHQvKiogQHR5cGUge01hcDxGdW5jdGlvbiwgRnVuY3Rpb24+fSBFdmVudCBsaXN0ZW5lciB1bnN1YnNjcmliZSBmdW5jdGlvbnMgKi9cblx0XHQkJGxfdSA9IG5ldyBNYXAoKTtcblxuXHRcdGNvbnN0cnVjdG9yKCQkY29tcG9uZW50Q3RvciwgJCRzbG90cywgdXNlX3NoYWRvd19kb20pIHtcblx0XHRcdHN1cGVyKCk7XG5cdFx0XHR0aGlzLiQkY3RvciA9ICQkY29tcG9uZW50Q3Rvcjtcblx0XHRcdHRoaXMuJCRzID0gJCRzbG90cztcblx0XHRcdGlmICh1c2Vfc2hhZG93X2RvbSkge1xuXHRcdFx0XHR0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG5cdFx0XHQvLyBXZSBjYW4ndCBkZXRlcm1pbmUgdXBmcm9udCBpZiB0aGUgZXZlbnQgaXMgYSBjdXN0b20gZXZlbnQgb3Igbm90LCBzbyB3ZSBoYXZlIHRvXG5cdFx0XHQvLyBsaXN0ZW4gdG8gYm90aC4gSWYgc29tZW9uZSB1c2VzIGEgY3VzdG9tIGV2ZW50IHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIHJlZ3VsYXJcblx0XHRcdC8vIGJyb3dzZXIgZXZlbnQsIHRoaXMgZmlyZXMgdHdpY2UgLSB3ZSBjYW4ndCBhdm9pZCB0aGF0LlxuXHRcdFx0dGhpcy4kJGxbdHlwZV0gPSB0aGlzLiQkbFt0eXBlXSB8fCBbXTtcblx0XHRcdHRoaXMuJCRsW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuXHRcdFx0aWYgKHRoaXMuJCRjKSB7XG5cdFx0XHRcdGNvbnN0IHVuc3ViID0gdGhpcy4kJGMuJG9uKHR5cGUsIGxpc3RlbmVyKTtcblx0XHRcdFx0dGhpcy4kJGxfdS5zZXQobGlzdGVuZXIsIHVuc3ViKTtcblx0XHRcdH1cblx0XHRcdHN1cGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcblx0XHRcdHN1cGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuXHRcdFx0aWYgKHRoaXMuJCRjKSB7XG5cdFx0XHRcdGNvbnN0IHVuc3ViID0gdGhpcy4kJGxfdS5nZXQobGlzdGVuZXIpO1xuXHRcdFx0XHRpZiAodW5zdWIpIHtcblx0XHRcdFx0XHR1bnN1YigpO1xuXHRcdFx0XHRcdHRoaXMuJCRsX3UuZGVsZXRlKGxpc3RlbmVyKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuXHRcdFx0dGhpcy4kJGNuID0gdHJ1ZTtcblx0XHRcdGlmICghdGhpcy4kJGMpIHtcblx0XHRcdFx0Ly8gV2Ugd2FpdCBvbmUgdGljayB0byBsZXQgcG9zc2libGUgY2hpbGQgc2xvdCBlbGVtZW50cyBiZSBjcmVhdGVkL21vdW50ZWRcblx0XHRcdFx0YXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdGlmICghdGhpcy4kJGNuIHx8IHRoaXMuJCRjKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZ1bmN0aW9uIGNyZWF0ZV9zbG90KG5hbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IG5vZGU7XG5cdFx0XHRcdFx0XHRjb25zdCBvYmogPSB7XG5cdFx0XHRcdFx0XHRcdGM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbWVudCgnc2xvdCcpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChuYW1lICE9PSAnZGVmYXVsdCcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGF0dHIobm9kZSwgJ25hbWUnLCBuYW1lKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdFx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXRcblx0XHRcdFx0XHRcdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW2FuY2hvcl1cblx0XHRcdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0XHRcdG06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW5zZXJ0KHRhcmdldCwgbm9kZSwgYW5jaG9yKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0ZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZGV0YWNoaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXRhY2gobm9kZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9iajtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0ICQkc2xvdHMgPSB7fTtcblx0XHRcdFx0Y29uc3QgZXhpc3Rpbmdfc2xvdHMgPSBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzKHRoaXMpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy4kJHMpIHtcblx0XHRcdFx0XHRpZiAobmFtZSBpbiBleGlzdGluZ19zbG90cykge1xuXHRcdFx0XHRcdFx0JCRzbG90c1tuYW1lXSA9IFtjcmVhdGVfc2xvdChuYW1lKV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlIG9mIHRoaXMuYXR0cmlidXRlcykge1xuXHRcdFx0XHRcdC8vIHRoaXMuJCRkYXRhIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGlzLmF0dHJpYnV0ZXNcblx0XHRcdFx0XHRjb25zdCBuYW1lID0gdGhpcy4kJGdfcChhdHRyaWJ1dGUubmFtZSk7XG5cdFx0XHRcdFx0aWYgKCEobmFtZSBpbiB0aGlzLiQkZCkpIHtcblx0XHRcdFx0XHRcdHRoaXMuJCRkW25hbWVdID0gZ2V0X2N1c3RvbV9lbGVtZW50X3ZhbHVlKG5hbWUsIGF0dHJpYnV0ZS52YWx1ZSwgdGhpcy4kJHBfZCwgJ3RvUHJvcCcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBQb3J0IG92ZXIgcHJvcHMgdGhhdCB3ZXJlIHNldCBwcm9ncmFtbWF0aWNhbGx5IGJlZm9yZSBjZSB3YXMgaW5pdGlhbGl6ZWRcblx0XHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gdGhpcy4kJHBfZCkge1xuXHRcdFx0XHRcdGlmICghKGtleSBpbiB0aGlzLiQkZCkgJiYgdGhpc1trZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHRoaXMuJCRkW2tleV0gPSB0aGlzW2tleV07IC8vIGRvbid0IHRyYW5zZm9ybSwgdGhlc2Ugd2VyZSBzZXQgdGhyb3VnaCBKYXZhU2NyaXB0XG5cdFx0XHRcdFx0XHRkZWxldGUgdGhpc1trZXldOyAvLyByZW1vdmUgdGhlIHByb3BlcnR5IHRoYXQgc2hhZG93cyB0aGUgZ2V0dGVyL3NldHRlclxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLiQkYyA9IG5ldyB0aGlzLiQkY3Rvcih7XG5cdFx0XHRcdFx0dGFyZ2V0OiB0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcyxcblx0XHRcdFx0XHRwcm9wczoge1xuXHRcdFx0XHRcdFx0Li4udGhpcy4kJGQsXG5cdFx0XHRcdFx0XHQkJHNsb3RzLFxuXHRcdFx0XHRcdFx0JCRzY29wZToge1xuXHRcdFx0XHRcdFx0XHRjdHg6IFtdXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyBSZWZsZWN0IGNvbXBvbmVudCBwcm9wcyBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdGNvbnN0IHJlZmxlY3RfYXR0cmlidXRlcyA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLiQkciA9IHRydWU7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gdGhpcy4kJHBfZCkge1xuXHRcdFx0XHRcdFx0dGhpcy4kJGRba2V5XSA9IHRoaXMuJCRjLiQkLmN0eFt0aGlzLiQkYy4kJC5wcm9wc1trZXldXTtcblx0XHRcdFx0XHRcdGlmICh0aGlzLiQkcF9kW2tleV0ucmVmbGVjdCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVfdmFsdWUgPSBnZXRfY3VzdG9tX2VsZW1lbnRfdmFsdWUoXG5cdFx0XHRcdFx0XHRcdFx0a2V5LFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuJCRkW2tleV0sXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy4kJHBfZCxcblx0XHRcdFx0XHRcdFx0XHQndG9BdHRyaWJ1dGUnXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGlmIChhdHRyaWJ1dGVfdmFsdWUgPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucmVtb3ZlQXR0cmlidXRlKHRoaXMuJCRwX2Rba2V5XS5hdHRyaWJ1dGUgfHwga2V5KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSh0aGlzLiQkcF9kW2tleV0uYXR0cmlidXRlIHx8IGtleSwgYXR0cmlidXRlX3ZhbHVlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLiQkciA9IGZhbHNlO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHR0aGlzLiQkYy4kJC5hZnRlcl91cGRhdGUucHVzaChyZWZsZWN0X2F0dHJpYnV0ZXMpO1xuXHRcdFx0XHRyZWZsZWN0X2F0dHJpYnV0ZXMoKTsgLy8gb25jZSBpbml0aWFsbHkgYmVjYXVzZSBhZnRlcl91cGRhdGUgaXMgYWRkZWQgdG9vIGxhdGUgZm9yIGZpcnN0IHJlbmRlclxuXG5cdFx0XHRcdGZvciAoY29uc3QgdHlwZSBpbiB0aGlzLiQkbCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy4kJGxbdHlwZV0pIHtcblx0XHRcdFx0XHRcdGNvbnN0IHVuc3ViID0gdGhpcy4kJGMuJG9uKHR5cGUsIGxpc3RlbmVyKTtcblx0XHRcdFx0XHRcdHRoaXMuJCRsX3Uuc2V0KGxpc3RlbmVyLCB1bnN1Yik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuJCRsID0ge307XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gV2UgZG9uJ3QgbmVlZCB0aGlzIHdoZW4gd29ya2luZyB3aXRoaW4gU3ZlbHRlIGNvZGUsIGJ1dCBmb3IgY29tcGF0aWJpbGl0eSBvZiBwZW9wbGUgdXNpbmcgdGhpcyBvdXRzaWRlIG9mIFN2ZWx0ZVxuXHRcdC8vIGFuZCBzZXR0aW5nIGF0dHJpYnV0ZXMgdGhyb3VnaCBzZXRBdHRyaWJ1dGUgZXRjLCB0aGlzIGlzIGhlbHBmdWxcblx0XHRhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYXR0ciwgX29sZFZhbHVlLCBuZXdWYWx1ZSkge1xuXHRcdFx0aWYgKHRoaXMuJCRyKSByZXR1cm47XG5cdFx0XHRhdHRyID0gdGhpcy4kJGdfcChhdHRyKTtcblx0XHRcdHRoaXMuJCRkW2F0dHJdID0gZ2V0X2N1c3RvbV9lbGVtZW50X3ZhbHVlKGF0dHIsIG5ld1ZhbHVlLCB0aGlzLiQkcF9kLCAndG9Qcm9wJyk7XG5cdFx0XHR0aGlzLiQkYz8uJHNldCh7IFthdHRyXTogdGhpcy4kJGRbYXR0cl0gfSk7XG5cdFx0fVxuXG5cdFx0ZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG5cdFx0XHR0aGlzLiQkY24gPSBmYWxzZTtcblx0XHRcdC8vIEluIGEgbWljcm90YXNrLCBiZWNhdXNlIHRoaXMgY291bGQgYmUgYSBtb3ZlIHdpdGhpbiB0aGUgRE9NXG5cdFx0XHRQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLiQkY24pIHtcblx0XHRcdFx0XHR0aGlzLiQkYy4kZGVzdHJveSgpO1xuXHRcdFx0XHRcdHRoaXMuJCRjID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQkJGdfcChhdHRyaWJ1dGVfbmFtZSkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0T2JqZWN0LmtleXModGhpcy4kJHBfZCkuZmluZChcblx0XHRcdFx0XHQoa2V5KSA9PlxuXHRcdFx0XHRcdFx0dGhpcy4kJHBfZFtrZXldLmF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlX25hbWUgfHxcblx0XHRcdFx0XHRcdCghdGhpcy4kJHBfZFtrZXldLmF0dHJpYnV0ZSAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gYXR0cmlidXRlX25hbWUpXG5cdFx0XHRcdCkgfHwgYXR0cmlidXRlX25hbWVcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudFByb3BEZWZpbml0aW9uPn0gcHJvcHNfZGVmaW5pdGlvblxuICogQHBhcmFtIHsndG9BdHRyaWJ1dGUnIHwgJ3RvUHJvcCd9IFt0cmFuc2Zvcm1dXG4gKi9cbmZ1bmN0aW9uIGdldF9jdXN0b21fZWxlbWVudF92YWx1ZShwcm9wLCB2YWx1ZSwgcHJvcHNfZGVmaW5pdGlvbiwgdHJhbnNmb3JtKSB7XG5cdGNvbnN0IHR5cGUgPSBwcm9wc19kZWZpbml0aW9uW3Byb3BdPy50eXBlO1xuXHR2YWx1ZSA9IHR5cGUgPT09ICdCb29sZWFuJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJyA/IHZhbHVlICE9IG51bGwgOiB2YWx1ZTtcblx0aWYgKCF0cmFuc2Zvcm0gfHwgIXByb3BzX2RlZmluaXRpb25bcHJvcF0pIHtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0gZWxzZSBpZiAodHJhbnNmb3JtID09PSAndG9BdHRyaWJ1dGUnKSB7XG5cdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0XHRjYXNlICdPYmplY3QnOlxuXHRcdFx0Y2FzZSAnQXJyYXknOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cdFx0XHRjYXNlICdCb29sZWFuJzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID8gJycgOiBudWxsO1xuXHRcdFx0Y2FzZSAnTnVtYmVyJzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0Y2FzZSAnT2JqZWN0Jzpcblx0XHRcdGNhc2UgJ0FycmF5Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlICYmIEpTT04ucGFyc2UodmFsdWUpO1xuXHRcdFx0Y2FzZSAnQm9vbGVhbic6XG5cdFx0XHRcdHJldHVybiB2YWx1ZTsgLy8gY29udmVyc2lvbiBhbHJlYWR5IGhhbmRsZWQgYWJvdmVcblx0XHRcdGNhc2UgJ051bWJlcic6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSAhPSBudWxsID8gK3ZhbHVlIDogdmFsdWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogVHVybiBhIFN2ZWx0ZSBjb21wb25lbnQgaW50byBhIGN1c3RvbSBlbGVtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoJy4vcHVibGljLmpzJykuQ29tcG9uZW50VHlwZX0gQ29tcG9uZW50ICBBIFN2ZWx0ZSBjb21wb25lbnQgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudFByb3BEZWZpbml0aW9uPn0gcHJvcHNfZGVmaW5pdGlvbiAgVGhlIHByb3BzIHRvIG9ic2VydmVcbiAqIEBwYXJhbSB7c3RyaW5nW119IHNsb3RzICBUaGUgc2xvdHMgdG8gY3JlYXRlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhY2Nlc3NvcnMgIE90aGVyIGFjY2Vzc29ycyBiZXNpZGVzIHRoZSBvbmVzIGZvciBwcm9wcyB0aGUgY29tcG9uZW50IGhhc1xuICogQHBhcmFtIHtib29sZWFufSB1c2Vfc2hhZG93X2RvbSAgV2hldGhlciB0byB1c2Ugc2hhZG93IERPTVxuICogQHBhcmFtIHsoY2U6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCkgPT4gbmV3ICgpID0+IEhUTUxFbGVtZW50fSBbZXh0ZW5kXVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlX2N1c3RvbV9lbGVtZW50KFxuXHRDb21wb25lbnQsXG5cdHByb3BzX2RlZmluaXRpb24sXG5cdHNsb3RzLFxuXHRhY2Nlc3NvcnMsXG5cdHVzZV9zaGFkb3dfZG9tLFxuXHRleHRlbmRcbikge1xuXHRsZXQgQ2xhc3MgPSBjbGFzcyBleHRlbmRzIFN2ZWx0ZUVsZW1lbnQge1xuXHRcdGNvbnN0cnVjdG9yKCkge1xuXHRcdFx0c3VwZXIoQ29tcG9uZW50LCBzbG90cywgdXNlX3NoYWRvd19kb20pO1xuXHRcdFx0dGhpcy4kJHBfZCA9IHByb3BzX2RlZmluaXRpb247XG5cdFx0fVxuXHRcdHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5rZXlzKHByb3BzX2RlZmluaXRpb24pLm1hcCgoa2V5KSA9PlxuXHRcdFx0XHQocHJvcHNfZGVmaW5pdGlvbltrZXldLmF0dHJpYnV0ZSB8fCBrZXkpLnRvTG93ZXJDYXNlKClcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXHRPYmplY3Qua2V5cyhwcm9wc19kZWZpbml0aW9uKS5mb3JFYWNoKChwcm9wKSA9PiB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KENsYXNzLnByb3RvdHlwZSwgcHJvcCwge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy4kJGMgJiYgcHJvcCBpbiB0aGlzLiQkYyA/IHRoaXMuJCRjW3Byb3BdIDogdGhpcy4kJGRbcHJvcF07XG5cdFx0XHR9LFxuXHRcdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHRcdHZhbHVlID0gZ2V0X2N1c3RvbV9lbGVtZW50X3ZhbHVlKHByb3AsIHZhbHVlLCBwcm9wc19kZWZpbml0aW9uKTtcblx0XHRcdFx0dGhpcy4kJGRbcHJvcF0gPSB2YWx1ZTtcblx0XHRcdFx0dGhpcy4kJGM/LiRzZXQoeyBbcHJvcF06IHZhbHVlIH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblx0YWNjZXNzb3JzLmZvckVhY2goKGFjY2Vzc29yKSA9PiB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KENsYXNzLnByb3RvdHlwZSwgYWNjZXNzb3IsIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuJCRjPy5bYWNjZXNzb3JdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblx0aWYgKGV4dGVuZCkge1xuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgLSBhc3NpZ25pbmcgaGVyZSBpcyBmaW5lXG5cdFx0Q2xhc3MgPSBleHRlbmQoQ2xhc3MpO1xuXHR9XG5cdENvbXBvbmVudC5lbGVtZW50ID0gLyoqIEB0eXBlIHthbnl9ICovIChDbGFzcyk7XG5cdHJldHVybiBDbGFzcztcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBTdmVsdGUgY29tcG9uZW50cy4gVXNlZCB3aGVuIGRldj1mYWxzZS5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IFtQcm9wcz1hbnldXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IFtFdmVudHM9YW55XVxuICovXG5leHBvcnQgY2xhc3MgU3ZlbHRlQ29tcG9uZW50IHtcblx0LyoqXG5cdCAqICMjIyBQUklWQVRFIEFQSVxuXHQgKlxuXHQgKiBEbyBub3QgdXNlLCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lXG5cdCAqXG5cdCAqIEB0eXBlIHthbnl9XG5cdCAqL1xuXHQkJCA9IHVuZGVmaW5lZDtcblx0LyoqXG5cdCAqICMjIyBQUklWQVRFIEFQSVxuXHQgKlxuXHQgKiBEbyBub3QgdXNlLCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lXG5cdCAqXG5cdCAqIEB0eXBlIHthbnl9XG5cdCAqL1xuXHQkJHNldCA9IHVuZGVmaW5lZDtcblxuXHQvKiogQHJldHVybnMge3ZvaWR9ICovXG5cdCRkZXN0cm95KCkge1xuXHRcdGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuXHRcdHRoaXMuJGRlc3Ryb3kgPSBub29wO1xuXHR9XG5cblx0LyoqXG5cdCAqIEB0ZW1wbGF0ZSB7RXh0cmFjdDxrZXlvZiBFdmVudHMsIHN0cmluZz59IEtcblx0ICogQHBhcmFtIHtLfSB0eXBlXG5cdCAqIEBwYXJhbSB7KChlOiBFdmVudHNbS10pID0+IHZvaWQpIHwgbnVsbCB8IHVuZGVmaW5lZH0gY2FsbGJhY2tcblx0ICogQHJldHVybnMgeygpID0+IHZvaWR9XG5cdCAqL1xuXHQkb24odHlwZSwgY2FsbGJhY2spIHtcblx0XHRpZiAoIWlzX2Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuXHRcdFx0cmV0dXJuIG5vb3A7XG5cdFx0fVxuXHRcdGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdIHx8ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSA9IFtdKTtcblx0XHRjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNvbnN0IGluZGV4ID0gY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spO1xuXHRcdFx0aWYgKGluZGV4ICE9PSAtMSkgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge1BhcnRpYWw8UHJvcHM+fSBwcm9wc1xuXHQgKiBAcmV0dXJucyB7dm9pZH1cblx0ICovXG5cdCRzZXQocHJvcHMpIHtcblx0XHRpZiAodGhpcy4kJHNldCAmJiAhaXNfZW1wdHkocHJvcHMpKSB7XG5cdFx0XHR0aGlzLiQkLnNraXBfYm91bmQgPSB0cnVlO1xuXHRcdFx0dGhpcy4kJHNldChwcm9wcyk7XG5cdFx0XHR0aGlzLiQkLnNraXBfYm91bmQgPSBmYWxzZTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDdXN0b21FbGVtZW50UHJvcERlZmluaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXR0cmlidXRlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVmbGVjdF1cbiAqIEBwcm9wZXJ0eSB7J1N0cmluZyd8J0Jvb2xlYW4nfCdOdW1iZXInfCdBcnJheSd8J09iamVjdCd9IFt0eXBlXVxuICovXG4iLCAiaW1wb3J0IHtcblx0Y3VzdG9tX2V2ZW50LFxuXHRhcHBlbmQsXG5cdGFwcGVuZF9oeWRyYXRpb24sXG5cdGluc2VydCxcblx0aW5zZXJ0X2h5ZHJhdGlvbixcblx0ZGV0YWNoLFxuXHRsaXN0ZW4sXG5cdGF0dHJcbn0gZnJvbSAnLi9kb20uanMnO1xuaW1wb3J0IHsgU3ZlbHRlQ29tcG9uZW50IH0gZnJvbSAnLi9Db21wb25lbnQuanMnO1xuaW1wb3J0IHsgaXNfdm9pZCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9uYW1lcy5qcyc7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgY29udGVudGVkaXRhYmxlX3RydXRoeV92YWx1ZXMgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IGVuc3VyZV9hcnJheV9saWtlIH0gZnJvbSAnLi9lYWNoLmpzJztcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7VH0gW2RldGFpbF1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hfZGV2KHR5cGUsIGRldGFpbCkge1xuXHRkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudCh0eXBlLCB7IHZlcnNpb246IFZFUlNJT04sIC4uLmRldGFpbCB9LCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kX2Rldih0YXJnZXQsIG5vZGUpIHtcblx0ZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSB9KTtcblx0YXBwZW5kKHRhcmdldCwgbm9kZSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRfaHlkcmF0aW9uX2Rldih0YXJnZXQsIG5vZGUpIHtcblx0ZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSB9KTtcblx0YXBwZW5kX2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEBwYXJhbSB7Tm9kZX0gW2FuY2hvcl1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0X2Rldih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuXHRkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlLCBhbmNob3IgfSk7XG5cdGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcik7XG59XG5cbi8qKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICogQHBhcmFtIHtOb2RlfSBub2RlXG4gKiBAcGFyYW0ge05vZGV9IFthbmNob3JdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydF9oeWRyYXRpb25fZGV2KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG5cdGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUsIGFuY2hvciB9KTtcblx0aW5zZXJ0X2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUsIGFuY2hvcik7XG59XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSBub2RlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGFjaF9kZXYobm9kZSkge1xuXHRkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVJlbW92ZScsIHsgbm9kZSB9KTtcblx0ZGV0YWNoKG5vZGUpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Tm9kZX0gYmVmb3JlXG4gKiBAcGFyYW0ge05vZGV9IGFmdGVyXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGFjaF9iZXR3ZWVuX2RldihiZWZvcmUsIGFmdGVyKSB7XG5cdHdoaWxlIChiZWZvcmUubmV4dFNpYmxpbmcgJiYgYmVmb3JlLm5leHRTaWJsaW5nICE9PSBhZnRlcikge1xuXHRcdGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Tm9kZX0gYWZ0ZXJcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0YWNoX2JlZm9yZV9kZXYoYWZ0ZXIpIHtcblx0d2hpbGUgKGFmdGVyLnByZXZpb3VzU2libGluZykge1xuXHRcdGRldGFjaF9kZXYoYWZ0ZXIucHJldmlvdXNTaWJsaW5nKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Tm9kZX0gYmVmb3JlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGFjaF9hZnRlcl9kZXYoYmVmb3JlKSB7XG5cdHdoaWxlIChiZWZvcmUubmV4dFNpYmxpbmcpIHtcblx0XHRkZXRhY2hfZGV2KGJlZm9yZS5uZXh0U2libGluZyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0fSBoYW5kbGVyXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB8IEV2ZW50TGlzdGVuZXJPcHRpb25zfSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hhc19wcmV2ZW50X2RlZmF1bHRdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtoYXNfc3RvcF9wcm9wYWdhdGlvbl1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hhc19zdG9wX2ltbWVkaWF0ZV9wcm9wYWdhdGlvbl1cbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuX2Rldihcblx0bm9kZSxcblx0ZXZlbnQsXG5cdGhhbmRsZXIsXG5cdG9wdGlvbnMsXG5cdGhhc19wcmV2ZW50X2RlZmF1bHQsXG5cdGhhc19zdG9wX3Byb3BhZ2F0aW9uLFxuXHRoYXNfc3RvcF9pbW1lZGlhdGVfcHJvcGFnYXRpb25cbikge1xuXHRjb25zdCBtb2RpZmllcnMgPVxuXHRcdG9wdGlvbnMgPT09IHRydWUgPyBbJ2NhcHR1cmUnXSA6IG9wdGlvbnMgPyBBcnJheS5mcm9tKE9iamVjdC5rZXlzKG9wdGlvbnMpKSA6IFtdO1xuXHRpZiAoaGFzX3ByZXZlbnRfZGVmYXVsdCkgbW9kaWZpZXJzLnB1c2goJ3ByZXZlbnREZWZhdWx0Jyk7XG5cdGlmIChoYXNfc3RvcF9wcm9wYWdhdGlvbikgbW9kaWZpZXJzLnB1c2goJ3N0b3BQcm9wYWdhdGlvbicpO1xuXHRpZiAoaGFzX3N0b3BfaW1tZWRpYXRlX3Byb3BhZ2F0aW9uKSBtb2RpZmllcnMucHVzaCgnc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uJyk7XG5cdGRpc3BhdGNoX2RldignU3ZlbHRlRE9NQWRkRXZlbnRMaXN0ZW5lcicsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcblx0Y29uc3QgZGlzcG9zZSA9IGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG5cdHJldHVybiAoKSA9PiB7XG5cdFx0ZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuXHRcdGRpc3Bvc2UoKTtcblx0fTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dHJfZGV2KG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcblx0YXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKTtcblx0aWYgKHZhbHVlID09IG51bGwpIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlQXR0cmlidXRlJywgeyBub2RlLCBhdHRyaWJ1dGUgfSk7XG5cdGVsc2UgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXRBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlcbiAqIEBwYXJhbSB7YW55fSBbdmFsdWVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BfZGV2KG5vZGUsIHByb3BlcnR5LCB2YWx1ZSkge1xuXHRub2RlW3Byb3BlcnR5XSA9IHZhbHVlO1xuXHRkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldFByb3BlcnR5JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5XG4gKiBAcGFyYW0ge2FueX0gW3ZhbHVlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhc2V0X2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcblx0bm9kZS5kYXRhc2V0W3Byb3BlcnR5XSA9IHZhbHVlO1xuXHRkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldERhdGFzZXQnLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1RleHR9IHRleHRcbiAqIEBwYXJhbSB7dW5rbm93bn0gZGF0YVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRfZGF0YV9kZXYodGV4dCwgZGF0YSkge1xuXHRkYXRhID0gJycgKyBkYXRhO1xuXHRpZiAodGV4dC5kYXRhID09PSBkYXRhKSByZXR1cm47XG5cdGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0RGF0YScsIHsgbm9kZTogdGV4dCwgZGF0YSB9KTtcblx0dGV4dC5kYXRhID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkYXRhKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1RleHR9IHRleHRcbiAqIEBwYXJhbSB7dW5rbm93bn0gZGF0YVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRfZGF0YV9jb250ZW50ZWRpdGFibGVfZGV2KHRleHQsIGRhdGEpIHtcblx0ZGF0YSA9ICcnICsgZGF0YTtcblx0aWYgKHRleHQud2hvbGVUZXh0ID09PSBkYXRhKSByZXR1cm47XG5cdGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0RGF0YScsIHsgbm9kZTogdGV4dCwgZGF0YSB9KTtcblx0dGV4dC5kYXRhID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkYXRhKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1RleHR9IHRleHRcbiAqIEBwYXJhbSB7dW5rbm93bn0gZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJfdmFsdWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0X2RhdGFfbWF5YmVfY29udGVudGVkaXRhYmxlX2Rldih0ZXh0LCBkYXRhLCBhdHRyX3ZhbHVlKSB7XG5cdGlmICh+Y29udGVudGVkaXRhYmxlX3RydXRoeV92YWx1ZXMuaW5kZXhPZihhdHRyX3ZhbHVlKSkge1xuXHRcdHNldF9kYXRhX2NvbnRlbnRlZGl0YWJsZV9kZXYodGV4dCwgZGF0YSk7XG5cdH0gZWxzZSB7XG5cdFx0c2V0X2RhdGFfZGV2KHRleHQsIGRhdGEpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVfYXJyYXlfbGlrZV9kZXYoYXJnKSB7XG5cdGlmIChcblx0XHR0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyAmJlxuXHRcdCEoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmICdsZW5ndGgnIGluIGFyZykgJiZcblx0XHQhKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgYXJnICYmIFN5bWJvbC5pdGVyYXRvciBpbiBhcmcpXG5cdCkge1xuXHRcdHRocm93IG5ldyBFcnJvcigneyNlYWNofSBvbmx5IHdvcmtzIHdpdGggaXRlcmFibGUgdmFsdWVzLicpO1xuXHR9XG5cdHJldHVybiBlbnN1cmVfYXJyYXlfbGlrZShhcmcpO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHt2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX3Nsb3RzKG5hbWUsIHNsb3QsIGtleXMpIHtcblx0Zm9yIChjb25zdCBzbG90X2tleSBvZiBPYmplY3Qua2V5cyhzbG90KSkge1xuXHRcdGlmICghfmtleXMuaW5kZXhPZihzbG90X2tleSkpIHtcblx0XHRcdGNvbnNvbGUud2FybihgPCR7bmFtZX0+IHJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgc2xvdCBcIiR7c2xvdF9rZXl9XCIuYCk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB0YWdcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfZHluYW1pY19lbGVtZW50KHRhZykge1xuXHRjb25zdCBpc19zdHJpbmcgPSB0eXBlb2YgdGFnID09PSAnc3RyaW5nJztcblx0aWYgKHRhZyAmJiAhaXNfc3RyaW5nKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCc8c3ZlbHRlOmVsZW1lbnQ+IGV4cGVjdHMgXCJ0aGlzXCIgYXR0cmlidXRlIHRvIGJlIGEgc3RyaW5nLicpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmRlZmluZWQgfCBzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV92b2lkX2R5bmFtaWNfZWxlbWVudCh0YWcpIHtcblx0aWYgKHRhZyAmJiBpc192b2lkKHRhZykpIHtcblx0XHRjb25zb2xlLndhcm4oYDxzdmVsdGU6ZWxlbWVudCB0aGlzPVwiJHt0YWd9XCI+IGlzIHNlbGYtY2xvc2luZyBhbmQgY2Fubm90IGhhdmUgY29udGVudC5gKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0X3N2ZWx0ZV9jb21wb25lbnRfZGV2KGNvbXBvbmVudCwgcHJvcHMpIHtcblx0Y29uc3QgZXJyb3JfbWVzc2FnZSA9ICd0aGlzPXsuLi59IG9mIDxzdmVsdGU6Y29tcG9uZW50PiBzaG91bGQgc3BlY2lmeSBhIFN2ZWx0ZSBjb21wb25lbnQuJztcblx0dHJ5IHtcblx0XHRjb25zdCBpbnN0YW5jZSA9IG5ldyBjb21wb25lbnQocHJvcHMpO1xuXHRcdGlmICghaW5zdGFuY2UuJCQgfHwgIWluc3RhbmNlLiRzZXQgfHwgIWluc3RhbmNlLiRvbiB8fCAhaW5zdGFuY2UuJGRlc3Ryb3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihlcnJvcl9tZXNzYWdlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGluc3RhbmNlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjb25zdCB7IG1lc3NhZ2UgfSA9IGVycjtcblx0XHRpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIG1lc3NhZ2UuaW5kZXhPZignaXMgbm90IGEgY29uc3RydWN0b3InKSAhPT0gLTEpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihlcnJvcl9tZXNzYWdlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFN2ZWx0ZSBjb21wb25lbnRzIHdpdGggc29tZSBtaW5vciBkZXYtZW5oYW5jZW1lbnRzLiBVc2VkIHdoZW4gZGV2PXRydWUuXG4gKlxuICogQ2FuIGJlIHVzZWQgdG8gY3JlYXRlIHN0cm9uZ2x5IHR5cGVkIFN2ZWx0ZSBjb21wb25lbnRzLlxuICpcbiAqICMjIyMgRXhhbXBsZTpcbiAqXG4gKiBZb3UgaGF2ZSBjb21wb25lbnQgbGlicmFyeSBvbiBucG0gY2FsbGVkIGBjb21wb25lbnQtbGlicmFyeWAsIGZyb20gd2hpY2hcbiAqIHlvdSBleHBvcnQgYSBjb21wb25lbnQgY2FsbGVkIGBNeUNvbXBvbmVudGAuIEZvciBTdmVsdGUrVHlwZVNjcmlwdCB1c2VycyxcbiAqIHlvdSB3YW50IHRvIHByb3ZpZGUgdHlwaW5ncy4gVGhlcmVmb3JlIHlvdSBjcmVhdGUgYSBgaW5kZXguZC50c2A6XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgU3ZlbHRlQ29tcG9uZW50IH0gZnJvbSBcInN2ZWx0ZVwiO1xuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50PHtmb286IHN0cmluZ30+IHt9XG4gKiBgYGBcbiAqIFR5cGluZyB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBJREVzIGxpa2UgVlMgQ29kZSB3aXRoIHRoZSBTdmVsdGUgZXh0ZW5zaW9uXG4gKiB0byBwcm92aWRlIGludGVsbGlzZW5zZSBhbmQgdG8gdXNlIHRoZSBjb21wb25lbnQgbGlrZSB0aGlzIGluIGEgU3ZlbHRlIGZpbGVcbiAqIHdpdGggVHlwZVNjcmlwdDpcbiAqIGBgYHN2ZWx0ZVxuICogPHNjcmlwdCBsYW5nPVwidHNcIj5cbiAqIFx0aW1wb3J0IHsgTXlDb21wb25lbnQgfSBmcm9tIFwiY29tcG9uZW50LWxpYnJhcnlcIjtcbiAqIDwvc2NyaXB0PlxuICogPE15Q29tcG9uZW50IGZvbz17J2Jhcid9IC8+XG4gKiBgYGBcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW1Byb3BzPWFueV1cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW0V2ZW50cz1hbnldXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IFtTbG90cz1hbnldXG4gKiBAZXh0ZW5kcyB7U3ZlbHRlQ29tcG9uZW50PFByb3BzLCBFdmVudHM+fVxuICovXG5leHBvcnQgY2xhc3MgU3ZlbHRlQ29tcG9uZW50RGV2IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcblx0LyoqXG5cdCAqIEZvciB0eXBlIGNoZWNraW5nIGNhcGFiaWxpdGllcyBvbmx5LlxuXHQgKiBEb2VzIG5vdCBleGlzdCBhdCBydW50aW1lLlxuXHQgKiAjIyMgRE8gTk9UIFVTRSFcblx0ICpcblx0ICogQHR5cGUge1Byb3BzfVxuXHQgKi9cblx0JCRwcm9wX2RlZjtcblx0LyoqXG5cdCAqIEZvciB0eXBlIGNoZWNraW5nIGNhcGFiaWxpdGllcyBvbmx5LlxuXHQgKiBEb2VzIG5vdCBleGlzdCBhdCBydW50aW1lLlxuXHQgKiAjIyMgRE8gTk9UIFVTRSFcblx0ICpcblx0ICogQHR5cGUge0V2ZW50c31cblx0ICovXG5cdCQkZXZlbnRzX2RlZjtcblx0LyoqXG5cdCAqIEZvciB0eXBlIGNoZWNraW5nIGNhcGFiaWxpdGllcyBvbmx5LlxuXHQgKiBEb2VzIG5vdCBleGlzdCBhdCBydW50aW1lLlxuXHQgKiAjIyMgRE8gTk9UIFVTRSFcblx0ICpcblx0ICogQHR5cGUge1Nsb3RzfVxuXHQgKi9cblx0JCRzbG90X2RlZjtcblxuXHQvKiogQHBhcmFtIHtpbXBvcnQoJy4vcHVibGljLmpzJykuQ29tcG9uZW50Q29uc3RydWN0b3JPcHRpb25zPFByb3BzPn0gb3B0aW9ucyAqL1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0aWYgKCFvcHRpb25zIHx8ICghb3B0aW9ucy50YXJnZXQgJiYgIW9wdGlvbnMuJCRpbmxpbmUpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCIndGFyZ2V0JyBpcyBhIHJlcXVpcmVkIG9wdGlvblwiKTtcblx0XHR9XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cblx0JGRlc3Ryb3koKSB7XG5cdFx0c3VwZXIuJGRlc3Ryb3koKTtcblx0XHR0aGlzLiRkZXN0cm95ID0gKCkgPT4ge1xuXHRcdFx0Y29uc29sZS53YXJuKCdDb21wb25lbnQgd2FzIGFscmVhZHkgZGVzdHJveWVkJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXHRcdH07XG5cdH1cblxuXHQvKiogQHJldHVybnMge3ZvaWR9ICovXG5cdCRjYXB0dXJlX3N0YXRlKCkge31cblxuXHQvKiogQHJldHVybnMge3ZvaWR9ICovXG5cdCRpbmplY3Rfc3RhdGUoKSB7fVxufVxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IFtQcm9wcz1hbnldXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IFtFdmVudHM9YW55XVxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbU2xvdHM9YW55XVxuICogQGRlcHJlY2F0ZWQgVXNlIGBTdmVsdGVDb21wb25lbnRgIGluc3RlYWQuIFNlZSBQUiBmb3IgbW9yZSBpbmZvcm1hdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL3N2ZWx0ZWpzL3N2ZWx0ZS9wdWxsLzg1MTJcbiAqIEBleHRlbmRzIHtTdmVsdGVDb21wb25lbnREZXY8UHJvcHMsIEV2ZW50cywgU2xvdHM+fVxuICovXG5leHBvcnQgY2xhc3MgU3ZlbHRlQ29tcG9uZW50VHlwZWQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYge31cblxuLyoqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb3BfZ3VhcmQodGltZW91dCkge1xuXHRjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKERhdGUubm93KCkgLSBzdGFydCA+IHRpbWVvdXQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW5maW5pdGUgbG9vcCBkZXRlY3RlZCcpO1xuXHRcdH1cblx0fTtcbn1cbiIsICIvLyBnZW5lcmF0ZWQgZHVyaW5nIHJlbGVhc2UsIGRvIG5vdCBtb2RpZnlcblxuLyoqXG4gKiBUaGUgY3VycmVudCB2ZXJzaW9uLCBhcyBzZXQgaW4gcGFja2FnZS5qc29uLlxuICpcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1jb21waWxlciNzdmVsdGUtdmVyc2lvblxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC4yLjE0JztcbmV4cG9ydCBjb25zdCBQVUJMSUNfVkVSU0lPTiA9ICc0JztcbiIsICJpbXBvcnQgeyBQVUJMSUNfVkVSU0lPTiB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC92ZXJzaW9uLmpzJztcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKVxuXHQvLyBAdHMtaWdub3JlXG5cdCh3aW5kb3cuX19zdmVsdGUgfHwgKHdpbmRvdy5fX3N2ZWx0ZSA9IHsgdjogbmV3IFNldCgpIH0pKS52LmFkZChQVUJMSUNfVkVSU0lPTik7XG4iLCAiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZTtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxufTtcbiIsICJleHBvcnQge1xuXHRTdmVsdGVDb21wb25lbnREZXYgYXMgU3ZlbHRlQ29tcG9uZW50LFxuXHRvbk1vdW50LFxuXHRvbkRlc3Ryb3ksXG5cdGJlZm9yZVVwZGF0ZSxcblx0YWZ0ZXJVcGRhdGUsXG5cdHNldENvbnRleHQsXG5cdGdldENvbnRleHQsXG5cdGdldEFsbENvbnRleHRzLFxuXHRoYXNDb250ZXh0LFxuXHR0aWNrLFxuXHRjcmVhdGVFdmVudERpc3BhdGNoZXIsXG5cdFN2ZWx0ZUNvbXBvbmVudFR5cGVkXG59IGZyb20gJy4vaW50ZXJuYWwvaW5kZXguanMnO1xuIiwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XG4gICAgaW1wb3J0IHsgbW9tZW50IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG4gICAgaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCJzcmMvbWFpblwiO1xuICAgIGltcG9ydCB7IExvZ0VudHJ5IH0gZnJvbSBcInNyYy90eXBlc1wiO1xuICAgIGltcG9ydCB7IHNsaWRlIH0gZnJvbSBcInN2ZWx0ZS90cmFuc2l0aW9uXCI7XG4gICAgaW1wb3J0IEhpc3RvcnlWaWV3IGZyb20gXCIuLi9oaXN0b3J5Vmlld1wiO1xuICAgIGltcG9ydCBMb2dGaWxlQ29tcG9uZW50IGZyb20gXCIuL2xvZ0ZpbGVDb21wb25lbnQuc3ZlbHRlXCI7XG4gICAgaW1wb3J0IExvZ1RyZWVDb21wb25lbnQgZnJvbSBcIi4vbG9nVHJlZUNvbXBvbmVudC5zdmVsdGVcIjtcblxuICAgIGV4cG9ydCBsZXQgbG9nOiBMb2dFbnRyeTtcbiAgICBleHBvcnQgbGV0IHZpZXc6IEhpc3RvcnlWaWV3O1xuICAgIGV4cG9ydCBsZXQgc2hvd1RyZWU6IGJvb2xlYW47XG4gICAgZXhwb3J0IGxldCBwbHVnaW46IE9ic2lkaWFuR2l0O1xuICAgICQ6IGxvZ3NIaWVyYXJjaHkgPSB7XG4gICAgICAgIHRpdGxlOiBcIlwiLFxuICAgICAgICBwYXRoOiBcIlwiLFxuICAgICAgICB2YXVsdFBhdGg6IFwiXCIsXG4gICAgICAgIGNoaWxkcmVuOiBwbHVnaW4uZ2l0TWFuYWdlci5nZXRUcmVlU3RydWN0dXJlKGxvZy5kaWZmLmZpbGVzKSxcbiAgICB9O1xuXG4gICAgJDogc2lkZSA9ICh2aWV3LmxlYWYuZ2V0Um9vdCgpIGFzIGFueSkuc2lkZSA9PSBcImxlZnRcIiA/IFwicmlnaHRcIiA6IFwibGVmdFwiO1xuICAgIGxldCBpc0NvbGxhcHNlZCA9IHRydWU7XG5cbiAgICBmdW5jdGlvbiBhdXRob3JUb1N0cmluZyhsb2c6IExvZ0VudHJ5KSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBsb2cuYXV0aG9yLm5hbWU7XG4gICAgICAgIGlmIChwbHVnaW4uc2V0dGluZ3MuYXV0aG9ySW5IaXN0b3J5VmlldyA9PSBcImZ1bGxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAocGx1Z2luLnNldHRpbmdzLmF1dGhvckluSGlzdG9yeVZpZXcgPT0gXCJpbml0aWFsc1wiKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JkcyA9IG5hbWUuc3BsaXQoXCIgXCIpLmZpbHRlcigod29yZCkgPT4gd29yZC5sZW5ndGggPiAwKTtcblxuICAgICAgICAgICAgcmV0dXJuIHdvcmRzLm1hcCgod29yZCkgPT4gd29yZFswXS50b1VwcGVyQ2FzZSgpKS5qb2luKFwiXCIpO1xuICAgICAgICB9XG4gICAgfVxuPC9zY3JpcHQ+XG5cbjwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LWNsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XG48IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgLS0+XG48bWFpbj5cbiAgICA8ZGl2IGNsYXNzPVwidHJlZS1pdGVtIG5hdi1mb2xkZXJcIiBjbGFzczppcy1jb2xsYXBzZWQ9e2lzQ29sbGFwc2VkfT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ0cmVlLWl0ZW0tc2VsZiBpcy1jbGlja2FibGUgbmF2LWZvbGRlci10aXRsZVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPXtgJHtsb2cucmVmcy5sZW5ndGggPiAwID8gbG9nLnJlZnMuam9pbihcIiwgXCIpICsgXCJcXG5cIiA6IFwiXCJ9JHtsb2cuYXV0aG9yPy5uYW1lfVxuJHttb21lbnQobG9nLmRhdGUpLmZvcm1hdChwbHVnaW4uc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdCl9XG4ke2xvZy5tZXNzYWdlfWB9XG4gICAgICAgICAgICBkYXRhLXRvb2x0aXAtcG9zaXRpb249e3NpZGV9XG4gICAgICAgICAgICBvbjpjbGljaz17KCkgPT4gKGlzQ29sbGFwc2VkID0gIWlzQ29sbGFwc2VkKX1cbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHJlZS1pdGVtLWljb24gbmF2LWZvbGRlci1jb2xsYXBzZS1pbmRpY2F0b3IgY29sbGFwc2UtaWNvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M6aXMtY29sbGFwc2VkPXtpc0NvbGxhcHNlZH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjRcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdmctaWNvbiByaWdodC10cmlhbmdsZVwiXG4gICAgICAgICAgICAgICAgICAgID48cGF0aCBkPVwiTTMgOEwxMiAxN0wyMSA4XCIgLz48L3N2Z1xuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7I2lmIGxvZy5yZWZzLmxlbmd0aCA+IDB9XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnaXQtcmVmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7bG9nLnJlZnMuam9pbihcIiwgXCIpfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7L2lmfVxuICAgICAgICAgICAgICAgIHsjaWYgcGx1Z2luLnNldHRpbmdzLmF1dGhvckluSGlzdG9yeVZpZXcgIT0gXCJoaWRlXCIgJiYgbG9nLmF1dGhvcj8ubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdpdC1hdXRob3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthdXRob3JUb1N0cmluZyhsb2cpfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7L2lmfVxuICAgICAgICAgICAgICAgIHsjaWYgcGx1Z2luLnNldHRpbmdzLmRhdGVJbkhpc3RvcnlWaWV3fVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2l0LWRhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHttb21lbnQobG9nLmRhdGUpLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdFxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgey9pZn1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmVlLWl0ZW0taW5uZXIgbmF2LWZvbGRlci10aXRsZS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIHtsb2cubWVzc2FnZX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgeyNpZiAhaXNDb2xsYXBzZWR9XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0cmVlLWl0ZW0tY2hpbGRyZW4gbmF2LWZvbGRlci1jaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjpzbGlkZXxsb2NhbD17eyBkdXJhdGlvbjogMTUwIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgeyNpZiBzaG93VHJlZX1cbiAgICAgICAgICAgICAgICAgICAgPExvZ1RyZWVDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeT17bG9nc0hpZXJhcmNoeX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHtwbHVnaW59XG4gICAgICAgICAgICAgICAgICAgICAgICB7dmlld31cbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcExldmVsPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIHs6ZWxzZX1cbiAgICAgICAgICAgICAgICAgICAgeyNlYWNoIGxvZy5kaWZmLmZpbGVzIGFzIGZpbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICA8TG9nRmlsZUNvbXBvbmVudCB7dmlld30gZGlmZj17ZmlsZX0gLz5cbiAgICAgICAgICAgICAgICAgICAgey9lYWNofVxuICAgICAgICAgICAgICAgIHsvaWZ9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgey9pZn1cbiAgICA8L2Rpdj5cbjwvbWFpbj5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG48L3N0eWxlPlxuIiwgImltcG9ydCB7IGN1YmljT3V0LCBjdWJpY0luT3V0LCBsaW5lYXIgfSBmcm9tICcuLi9lYXNpbmcvaW5kZXguanMnO1xuaW1wb3J0IHsgYXNzaWduLCBzcGxpdF9jc3NfdW5pdCwgaXNfZnVuY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbmRleC5qcyc7XG5cbi8qKlxuICogQW5pbWF0ZXMgYSBgYmx1cmAgZmlsdGVyIGFsb25nc2lkZSBhbiBlbGVtZW50J3Mgb3BhY2l0eS5cbiAqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtdHJhbnNpdGlvbiNibHVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3B1YmxpYycpLkJsdXJQYXJhbXN9IFtwYXJhbXNdXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL3B1YmxpYycpLlRyYW5zaXRpb25Db25maWd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibHVyKFxuXHRub2RlLFxuXHR7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSA0MDAsIGVhc2luZyA9IGN1YmljSW5PdXQsIGFtb3VudCA9IDUsIG9wYWNpdHkgPSAwIH0gPSB7fVxuKSB7XG5cdGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcblx0Y29uc3QgdGFyZ2V0X29wYWNpdHkgPSArc3R5bGUub3BhY2l0eTtcblx0Y29uc3QgZiA9IHN0eWxlLmZpbHRlciA9PT0gJ25vbmUnID8gJycgOiBzdHlsZS5maWx0ZXI7XG5cdGNvbnN0IG9kID0gdGFyZ2V0X29wYWNpdHkgKiAoMSAtIG9wYWNpdHkpO1xuXHRjb25zdCBbdmFsdWUsIHVuaXRdID0gc3BsaXRfY3NzX3VuaXQoYW1vdW50KTtcblx0cmV0dXJuIHtcblx0XHRkZWxheSxcblx0XHRkdXJhdGlvbixcblx0XHRlYXNpbmcsXG5cdFx0Y3NzOiAoX3QsIHUpID0+IGBvcGFjaXR5OiAke3RhcmdldF9vcGFjaXR5IC0gb2QgKiB1fTsgZmlsdGVyOiAke2Z9IGJsdXIoJHt1ICogdmFsdWV9JHt1bml0fSk7YFxuXHR9O1xufVxuXG4vKipcbiAqIEFuaW1hdGVzIHRoZSBvcGFjaXR5IG9mIGFuIGVsZW1lbnQgZnJvbSAwIHRvIHRoZSBjdXJyZW50IG9wYWNpdHkgZm9yIGBpbmAgdHJhbnNpdGlvbnMgYW5kIGZyb20gdGhlIGN1cnJlbnQgb3BhY2l0eSB0byAwIGZvciBgb3V0YCB0cmFuc2l0aW9ucy5cbiAqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtdHJhbnNpdGlvbiNmYWRlXG4gKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3B1YmxpYycpLkZhZGVQYXJhbXN9IFtwYXJhbXNdXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL3B1YmxpYycpLlRyYW5zaXRpb25Db25maWd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWRlKG5vZGUsIHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDQwMCwgZWFzaW5nID0gbGluZWFyIH0gPSB7fSkge1xuXHRjb25zdCBvID0gK2dldENvbXB1dGVkU3R5bGUobm9kZSkub3BhY2l0eTtcblx0cmV0dXJuIHtcblx0XHRkZWxheSxcblx0XHRkdXJhdGlvbixcblx0XHRlYXNpbmcsXG5cdFx0Y3NzOiAodCkgPT4gYG9wYWNpdHk6ICR7dCAqIG99YFxuXHR9O1xufVxuXG4vKipcbiAqIEFuaW1hdGVzIHRoZSB4IGFuZCB5IHBvc2l0aW9ucyBhbmQgdGhlIG9wYWNpdHkgb2YgYW4gZWxlbWVudC4gYGluYCB0cmFuc2l0aW9ucyBhbmltYXRlIGZyb20gdGhlIHByb3ZpZGVkIHZhbHVlcywgcGFzc2VkIGFzIHBhcmFtZXRlcnMgdG8gdGhlIGVsZW1lbnQncyBkZWZhdWx0IHZhbHVlcy4gYG91dGAgdHJhbnNpdGlvbnMgYW5pbWF0ZSBmcm9tIHRoZSBlbGVtZW50J3MgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIHByb3ZpZGVkIHZhbHVlcy5cbiAqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtdHJhbnNpdGlvbiNmbHlcbiAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtpbXBvcnQoJy4vcHVibGljJykuRmx5UGFyYW1zfSBbcGFyYW1zXVxuICogQHJldHVybnMge2ltcG9ydCgnLi9wdWJsaWMnKS5UcmFuc2l0aW9uQ29uZmlnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx5KFxuXHRub2RlLFxuXHR7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSA0MDAsIGVhc2luZyA9IGN1YmljT3V0LCB4ID0gMCwgeSA9IDAsIG9wYWNpdHkgPSAwIH0gPSB7fVxuKSB7XG5cdGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcblx0Y29uc3QgdGFyZ2V0X29wYWNpdHkgPSArc3R5bGUub3BhY2l0eTtcblx0Y29uc3QgdHJhbnNmb3JtID0gc3R5bGUudHJhbnNmb3JtID09PSAnbm9uZScgPyAnJyA6IHN0eWxlLnRyYW5zZm9ybTtcblx0Y29uc3Qgb2QgPSB0YXJnZXRfb3BhY2l0eSAqICgxIC0gb3BhY2l0eSk7XG5cdGNvbnN0IFt4VmFsdWUsIHhVbml0XSA9IHNwbGl0X2Nzc191bml0KHgpO1xuXHRjb25zdCBbeVZhbHVlLCB5VW5pdF0gPSBzcGxpdF9jc3NfdW5pdCh5KTtcblx0cmV0dXJuIHtcblx0XHRkZWxheSxcblx0XHRkdXJhdGlvbixcblx0XHRlYXNpbmcsXG5cdFx0Y3NzOiAodCwgdSkgPT4gYFxuXHRcdFx0dHJhbnNmb3JtOiAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7KDEgLSB0KSAqIHhWYWx1ZX0ke3hVbml0fSwgJHsoMSAtIHQpICogeVZhbHVlfSR7eVVuaXR9KTtcblx0XHRcdG9wYWNpdHk6ICR7dGFyZ2V0X29wYWNpdHkgLSBvZCAqIHV9YFxuXHR9O1xufVxuXG4vKipcbiAqIFNsaWRlcyBhbiBlbGVtZW50IGluIGFuZCBvdXQuXG4gKlxuICogaHR0cHM6Ly9zdmVsdGUuZGV2L2RvY3Mvc3ZlbHRlLXRyYW5zaXRpb24jc2xpZGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtpbXBvcnQoJy4vcHVibGljJykuU2xpZGVQYXJhbXN9IFtwYXJhbXNdXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL3B1YmxpYycpLlRyYW5zaXRpb25Db25maWd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGlkZShub2RlLCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSA0MDAsIGVhc2luZyA9IGN1YmljT3V0LCBheGlzID0gJ3knIH0gPSB7fSkge1xuXHRjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG5cdGNvbnN0IG9wYWNpdHkgPSArc3R5bGUub3BhY2l0eTtcblx0Y29uc3QgcHJpbWFyeV9wcm9wZXJ0eSA9IGF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblx0Y29uc3QgcHJpbWFyeV9wcm9wZXJ0eV92YWx1ZSA9IHBhcnNlRmxvYXQoc3R5bGVbcHJpbWFyeV9wcm9wZXJ0eV0pO1xuXHRjb25zdCBzZWNvbmRhcnlfcHJvcGVydGllcyA9IGF4aXMgPT09ICd5JyA/IFsndG9wJywgJ2JvdHRvbSddIDogWydsZWZ0JywgJ3JpZ2h0J107XG5cdGNvbnN0IGNhcGl0YWxpemVkX3NlY29uZGFyeV9wcm9wZXJ0aWVzID0gc2Vjb25kYXJ5X3Byb3BlcnRpZXMubWFwKFxuXHRcdChlKSA9PiBgJHtlWzBdLnRvVXBwZXJDYXNlKCl9JHtlLnNsaWNlKDEpfWBcblx0KTtcblx0Y29uc3QgcGFkZGluZ19zdGFydF92YWx1ZSA9IHBhcnNlRmxvYXQoc3R5bGVbYHBhZGRpbmcke2NhcGl0YWxpemVkX3NlY29uZGFyeV9wcm9wZXJ0aWVzWzBdfWBdKTtcblx0Y29uc3QgcGFkZGluZ19lbmRfdmFsdWUgPSBwYXJzZUZsb2F0KHN0eWxlW2BwYWRkaW5nJHtjYXBpdGFsaXplZF9zZWNvbmRhcnlfcHJvcGVydGllc1sxXX1gXSk7XG5cdGNvbnN0IG1hcmdpbl9zdGFydF92YWx1ZSA9IHBhcnNlRmxvYXQoc3R5bGVbYG1hcmdpbiR7Y2FwaXRhbGl6ZWRfc2Vjb25kYXJ5X3Byb3BlcnRpZXNbMF19YF0pO1xuXHRjb25zdCBtYXJnaW5fZW5kX3ZhbHVlID0gcGFyc2VGbG9hdChzdHlsZVtgbWFyZ2luJHtjYXBpdGFsaXplZF9zZWNvbmRhcnlfcHJvcGVydGllc1sxXX1gXSk7XG5cdGNvbnN0IGJvcmRlcl93aWR0aF9zdGFydF92YWx1ZSA9IHBhcnNlRmxvYXQoXG5cdFx0c3R5bGVbYGJvcmRlciR7Y2FwaXRhbGl6ZWRfc2Vjb25kYXJ5X3Byb3BlcnRpZXNbMF19V2lkdGhgXVxuXHQpO1xuXHRjb25zdCBib3JkZXJfd2lkdGhfZW5kX3ZhbHVlID0gcGFyc2VGbG9hdChcblx0XHRzdHlsZVtgYm9yZGVyJHtjYXBpdGFsaXplZF9zZWNvbmRhcnlfcHJvcGVydGllc1sxXX1XaWR0aGBdXG5cdCk7XG5cdHJldHVybiB7XG5cdFx0ZGVsYXksXG5cdFx0ZHVyYXRpb24sXG5cdFx0ZWFzaW5nLFxuXHRcdGNzczogKHQpID0+XG5cdFx0XHQnb3ZlcmZsb3c6IGhpZGRlbjsnICtcblx0XHRcdGBvcGFjaXR5OiAke01hdGgubWluKHQgKiAyMCwgMSkgKiBvcGFjaXR5fTtgICtcblx0XHRcdGAke3ByaW1hcnlfcHJvcGVydHl9OiAke3QgKiBwcmltYXJ5X3Byb3BlcnR5X3ZhbHVlfXB4O2AgK1xuXHRcdFx0YHBhZGRpbmctJHtzZWNvbmRhcnlfcHJvcGVydGllc1swXX06ICR7dCAqIHBhZGRpbmdfc3RhcnRfdmFsdWV9cHg7YCArXG5cdFx0XHRgcGFkZGluZy0ke3NlY29uZGFyeV9wcm9wZXJ0aWVzWzFdfTogJHt0ICogcGFkZGluZ19lbmRfdmFsdWV9cHg7YCArXG5cdFx0XHRgbWFyZ2luLSR7c2Vjb25kYXJ5X3Byb3BlcnRpZXNbMF19OiAke3QgKiBtYXJnaW5fc3RhcnRfdmFsdWV9cHg7YCArXG5cdFx0XHRgbWFyZ2luLSR7c2Vjb25kYXJ5X3Byb3BlcnRpZXNbMV19OiAke3QgKiBtYXJnaW5fZW5kX3ZhbHVlfXB4O2AgK1xuXHRcdFx0YGJvcmRlci0ke3NlY29uZGFyeV9wcm9wZXJ0aWVzWzBdfS13aWR0aDogJHt0ICogYm9yZGVyX3dpZHRoX3N0YXJ0X3ZhbHVlfXB4O2AgK1xuXHRcdFx0YGJvcmRlci0ke3NlY29uZGFyeV9wcm9wZXJ0aWVzWzFdfS13aWR0aDogJHt0ICogYm9yZGVyX3dpZHRoX2VuZF92YWx1ZX1weDtgXG5cdH07XG59XG5cbi8qKlxuICogQW5pbWF0ZXMgdGhlIG9wYWNpdHkgYW5kIHNjYWxlIG9mIGFuIGVsZW1lbnQuIGBpbmAgdHJhbnNpdGlvbnMgYW5pbWF0ZSBmcm9tIGFuIGVsZW1lbnQncyBjdXJyZW50IChkZWZhdWx0KSB2YWx1ZXMgdG8gdGhlIHByb3ZpZGVkIHZhbHVlcywgcGFzc2VkIGFzIHBhcmFtZXRlcnMuIGBvdXRgIHRyYW5zaXRpb25zIGFuaW1hdGUgZnJvbSB0aGUgcHJvdmlkZWQgdmFsdWVzIHRvIGFuIGVsZW1lbnQncyBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtdHJhbnNpdGlvbiNzY2FsZVxuICogQHBhcmFtIHtFbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9wdWJsaWMnKS5TY2FsZVBhcmFtc30gW3BhcmFtc11cbiAqIEByZXR1cm5zIHtpbXBvcnQoJy4vcHVibGljJykuVHJhbnNpdGlvbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKFxuXHRub2RlLFxuXHR7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSA0MDAsIGVhc2luZyA9IGN1YmljT3V0LCBzdGFydCA9IDAsIG9wYWNpdHkgPSAwIH0gPSB7fVxuKSB7XG5cdGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcblx0Y29uc3QgdGFyZ2V0X29wYWNpdHkgPSArc3R5bGUub3BhY2l0eTtcblx0Y29uc3QgdHJhbnNmb3JtID0gc3R5bGUudHJhbnNmb3JtID09PSAnbm9uZScgPyAnJyA6IHN0eWxlLnRyYW5zZm9ybTtcblx0Y29uc3Qgc2QgPSAxIC0gc3RhcnQ7XG5cdGNvbnN0IG9kID0gdGFyZ2V0X29wYWNpdHkgKiAoMSAtIG9wYWNpdHkpO1xuXHRyZXR1cm4ge1xuXHRcdGRlbGF5LFxuXHRcdGR1cmF0aW9uLFxuXHRcdGVhc2luZyxcblx0XHRjc3M6IChfdCwgdSkgPT4gYFxuXHRcdFx0dHJhbnNmb3JtOiAke3RyYW5zZm9ybX0gc2NhbGUoJHsxIC0gc2QgKiB1fSk7XG5cdFx0XHRvcGFjaXR5OiAke3RhcmdldF9vcGFjaXR5IC0gb2QgKiB1fVxuXHRcdGBcblx0fTtcbn1cblxuLyoqXG4gKiBBbmltYXRlcyB0aGUgc3Ryb2tlIG9mIGFuIFNWRyBlbGVtZW50LCBsaWtlIGEgc25ha2UgaW4gYSB0dWJlLiBgaW5gIHRyYW5zaXRpb25zIGJlZ2luIHdpdGggdGhlIHBhdGggaW52aXNpYmxlIGFuZCBkcmF3IHRoZSBwYXRoIHRvIHRoZSBzY3JlZW4gb3ZlciB0aW1lLiBgb3V0YCB0cmFuc2l0aW9ucyBzdGFydCBpbiBhIHZpc2libGUgc3RhdGUgYW5kIGdyYWR1YWxseSBlcmFzZSB0aGUgcGF0aC4gYGRyYXdgIG9ubHkgd29ya3Mgd2l0aCBlbGVtZW50cyB0aGF0IGhhdmUgYSBgZ2V0VG90YWxMZW5ndGhgIG1ldGhvZCwgbGlrZSBgPHBhdGg+YCBhbmQgYDxwb2x5bGluZT5gLlxuICpcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS10cmFuc2l0aW9uI2RyYXdcbiAqIEBwYXJhbSB7U1ZHRWxlbWVudCAmIHsgZ2V0VG90YWxMZW5ndGgoKTogbnVtYmVyIH19IG5vZGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3B1YmxpYycpLkRyYXdQYXJhbXN9IFtwYXJhbXNdXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL3B1YmxpYycpLlRyYW5zaXRpb25Db25maWd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcmF3KG5vZGUsIHsgZGVsYXkgPSAwLCBzcGVlZCwgZHVyYXRpb24sIGVhc2luZyA9IGN1YmljSW5PdXQgfSA9IHt9KSB7XG5cdGxldCBsZW4gPSBub2RlLmdldFRvdGFsTGVuZ3RoKCk7XG5cdGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcblx0aWYgKHN0eWxlLnN0cm9rZUxpbmVjYXAgIT09ICdidXR0Jykge1xuXHRcdGxlbiArPSBwYXJzZUludChzdHlsZS5zdHJva2VXaWR0aCk7XG5cdH1cblx0aWYgKGR1cmF0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRpZiAoc3BlZWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZHVyYXRpb24gPSA4MDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGR1cmF0aW9uID0gbGVuIC8gc3BlZWQ7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGR1cmF0aW9uID0gZHVyYXRpb24obGVuKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGRlbGF5LFxuXHRcdGR1cmF0aW9uLFxuXHRcdGVhc2luZyxcblx0XHRjc3M6IChfLCB1KSA9PiBgXG5cdFx0XHRzdHJva2UtZGFzaGFycmF5OiAke2xlbn07XG5cdFx0XHRzdHJva2UtZGFzaG9mZnNldDogJHt1ICogbGVufTtcblx0XHRgXG5cdH07XG59XG5cbi8qKlxuICogVGhlIGBjcm9zc2ZhZGVgIGZ1bmN0aW9uIGNyZWF0ZXMgYSBwYWlyIG9mIFt0cmFuc2l0aW9uc10oaHR0cHM6Ly9zdmVsdGUuZGV2L2RvY3MjdGVtcGxhdGUtc3ludGF4LWVsZW1lbnQtZGlyZWN0aXZlcy10cmFuc2l0aW9uLWZuKSBjYWxsZWQgYHNlbmRgIGFuZCBgcmVjZWl2ZWAuIFdoZW4gYW4gZWxlbWVudCBpcyAnc2VudCcsIGl0IGxvb2tzIGZvciBhIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBiZWluZyAncmVjZWl2ZWQnLCBhbmQgZ2VuZXJhdGVzIGEgdHJhbnNpdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGVsZW1lbnQgdG8gaXRzIGNvdW50ZXJwYXJ0J3MgcG9zaXRpb24gYW5kIGZhZGVzIGl0IG91dC4gV2hlbiBhbiBlbGVtZW50IGlzICdyZWNlaXZlZCcsIHRoZSByZXZlcnNlIGhhcHBlbnMuIElmIHRoZXJlIGlzIG5vIGNvdW50ZXJwYXJ0LCB0aGUgYGZhbGxiYWNrYCB0cmFuc2l0aW9uIGlzIHVzZWQuXG4gKlxuICogaHR0cHM6Ly9zdmVsdGUuZGV2L2RvY3Mvc3ZlbHRlLXRyYW5zaXRpb24jY3Jvc3NmYWRlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9wdWJsaWMnKS5Dcm9zc2ZhZGVQYXJhbXMgJiB7XG4gKiBcdGZhbGxiYWNrPzogKG5vZGU6IEVsZW1lbnQsIHBhcmFtczogaW1wb3J0KCcuL3B1YmxpYycpLkNyb3NzZmFkZVBhcmFtcywgaW50cm86IGJvb2xlYW4pID0+IGltcG9ydCgnLi9wdWJsaWMnKS5UcmFuc2l0aW9uQ29uZmlnO1xuICogfX0gcGFyYW1zXG4gKiBAcmV0dXJucyB7Wyhub2RlOiBhbnksIHBhcmFtczogaW1wb3J0KCcuL3B1YmxpYycpLkNyb3NzZmFkZVBhcmFtcyAmIHsga2V5OiBhbnk7IH0pID0+ICgpID0+IGltcG9ydCgnLi9wdWJsaWMnKS5UcmFuc2l0aW9uQ29uZmlnLCAobm9kZTogYW55LCBwYXJhbXM6IGltcG9ydCgnLi9wdWJsaWMnKS5Dcm9zc2ZhZGVQYXJhbXMgJiB7IGtleTogYW55OyB9KSA9PiAoKSA9PiBpbXBvcnQoJy4vcHVibGljJykuVHJhbnNpdGlvbkNvbmZpZ119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcm9zc2ZhZGUoeyBmYWxsYmFjaywgLi4uZGVmYXVsdHMgfSkge1xuXHQvKiogQHR5cGUge01hcDxhbnksIEVsZW1lbnQ+fSAqL1xuXHRjb25zdCB0b19yZWNlaXZlID0gbmV3IE1hcCgpO1xuXHQvKiogQHR5cGUge01hcDxhbnksIEVsZW1lbnQ+fSAqL1xuXHRjb25zdCB0b19zZW5kID0gbmV3IE1hcCgpO1xuXHQvKipcblx0ICogQHBhcmFtIHtFbGVtZW50fSBmcm9tX25vZGVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBub2RlXG5cdCAqIEBwYXJhbSB7aW1wb3J0KCcuL3B1YmxpYycpLkNyb3NzZmFkZVBhcmFtc30gcGFyYW1zXG5cdCAqIEByZXR1cm5zIHtpbXBvcnQoJy4vcHVibGljJykuVHJhbnNpdGlvbkNvbmZpZ31cblx0ICovXG5cdGZ1bmN0aW9uIGNyb3NzZmFkZShmcm9tX25vZGUsIG5vZGUsIHBhcmFtcykge1xuXHRcdGNvbnN0IHtcblx0XHRcdGRlbGF5ID0gMCxcblx0XHRcdGR1cmF0aW9uID0gKGQpID0+IE1hdGguc3FydChkKSAqIDMwLFxuXHRcdFx0ZWFzaW5nID0gY3ViaWNPdXRcblx0XHR9ID0gYXNzaWduKGFzc2lnbih7fSwgZGVmYXVsdHMpLCBwYXJhbXMpO1xuXHRcdGNvbnN0IGZyb20gPSBmcm9tX25vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgdG8gPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGNvbnN0IGR4ID0gZnJvbS5sZWZ0IC0gdG8ubGVmdDtcblx0XHRjb25zdCBkeSA9IGZyb20udG9wIC0gdG8udG9wO1xuXHRcdGNvbnN0IGR3ID0gZnJvbS53aWR0aCAvIHRvLndpZHRoO1xuXHRcdGNvbnN0IGRoID0gZnJvbS5oZWlnaHQgLyB0by5oZWlnaHQ7XG5cdFx0Y29uc3QgZCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG5cdFx0Y29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuXHRcdGNvbnN0IHRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBzdHlsZS50cmFuc2Zvcm07XG5cdFx0Y29uc3Qgb3BhY2l0eSA9ICtzdHlsZS5vcGFjaXR5O1xuXHRcdHJldHVybiB7XG5cdFx0XHRkZWxheSxcblx0XHRcdGR1cmF0aW9uOiBpc19mdW5jdGlvbihkdXJhdGlvbikgPyBkdXJhdGlvbihkKSA6IGR1cmF0aW9uLFxuXHRcdFx0ZWFzaW5nLFxuXHRcdFx0Y3NzOiAodCwgdSkgPT4gYFxuXHRcdFx0XHRvcGFjaXR5OiAke3QgKiBvcGFjaXR5fTtcblx0XHRcdFx0dHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7XG5cdFx0XHRcdHRyYW5zZm9ybTogJHt0cmFuc2Zvcm19IHRyYW5zbGF0ZSgke3UgKiBkeH1weCwke3UgKiBkeX1weCkgc2NhbGUoJHt0ICsgKDEgLSB0KSAqIGR3fSwgJHtcblx0XHRcdFx0dCArICgxIC0gdCkgKiBkaFxuXHRcdFx0fSk7XG5cdFx0XHRgXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge01hcDxhbnksIEVsZW1lbnQ+fSBpdGVtc1xuXHQgKiBAcGFyYW0ge01hcDxhbnksIEVsZW1lbnQ+fSBjb3VudGVycGFydHNcblx0ICogQHBhcmFtIHtib29sZWFufSBpbnRyb1xuXHQgKiBAcmV0dXJucyB7KG5vZGU6IGFueSwgcGFyYW1zOiBpbXBvcnQoJy4vcHVibGljJykuQ3Jvc3NmYWRlUGFyYW1zICYgeyBrZXk6IGFueTsgfSkgPT4gKCkgPT4gaW1wb3J0KCcuL3B1YmxpYycpLlRyYW5zaXRpb25Db25maWd9XG5cdCAqL1xuXHRmdW5jdGlvbiB0cmFuc2l0aW9uKGl0ZW1zLCBjb3VudGVycGFydHMsIGludHJvKSB7XG5cdFx0cmV0dXJuIChub2RlLCBwYXJhbXMpID0+IHtcblx0XHRcdGl0ZW1zLnNldChwYXJhbXMua2V5LCBub2RlKTtcblx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdGlmIChjb3VudGVycGFydHMuaGFzKHBhcmFtcy5rZXkpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb3RoZXJfbm9kZSA9IGNvdW50ZXJwYXJ0cy5nZXQocGFyYW1zLmtleSk7XG5cdFx0XHRcdFx0Y291bnRlcnBhcnRzLmRlbGV0ZShwYXJhbXMua2V5KTtcblx0XHRcdFx0XHRyZXR1cm4gY3Jvc3NmYWRlKG90aGVyX25vZGUsIG5vZGUsIHBhcmFtcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gaWYgdGhlIG5vZGUgaXMgZGlzYXBwZWFyaW5nIGFsdG9nZXRoZXJcblx0XHRcdFx0Ly8gKGkuZS4gd2Fzbid0IGNsYWltZWQgYnkgdGhlIG90aGVyIGxpc3QpXG5cdFx0XHRcdC8vIHRoZW4gd2UgbmVlZCB0byBzdXBwbHkgYW4gb3V0cm9cblx0XHRcdFx0aXRlbXMuZGVsZXRlKHBhcmFtcy5rZXkpO1xuXHRcdFx0XHRyZXR1cm4gZmFsbGJhY2sgJiYgZmFsbGJhY2sobm9kZSwgcGFyYW1zLCBpbnRybyk7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIFt0cmFuc2l0aW9uKHRvX3NlbmQsIHRvX3JlY2VpdmUsIGZhbHNlKSwgdHJhbnNpdGlvbih0b19yZWNlaXZlLCB0b19zZW5kLCB0cnVlKV07XG59XG4iLCAiLypcbkFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0dGRlc2xcbkRpc3RyaWJ1dGVkIHVuZGVyIE1JVCBMaWNlbnNlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0ZGVzbC9lYXNlcy9ibG9iL21hc3Rlci9MSUNFTlNFLm1kXG4qL1xuZXhwb3J0IHsgaWRlbnRpdHkgYXMgbGluZWFyIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW5kZXguanMnO1xuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFja0luT3V0KHQpIHtcblx0Y29uc3QgcyA9IDEuNzAxNTggKiAxLjUyNTtcblx0aWYgKCh0ICo9IDIpIDwgMSkgcmV0dXJuIDAuNSAqICh0ICogdCAqICgocyArIDEpICogdCAtIHMpKTtcblx0cmV0dXJuIDAuNSAqICgodCAtPSAyKSAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDIpO1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFja0luKHQpIHtcblx0Y29uc3QgcyA9IDEuNzAxNTg7XG5cdHJldHVybiB0ICogdCAqICgocyArIDEpICogdCAtIHMpO1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFja091dCh0KSB7XG5cdGNvbnN0IHMgPSAxLjcwMTU4O1xuXHRyZXR1cm4gLS10ICogdCAqICgocyArIDEpICogdCArIHMpICsgMTtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJvdW5jZU91dCh0KSB7XG5cdGNvbnN0IGEgPSA0LjAgLyAxMS4wO1xuXHRjb25zdCBiID0gOC4wIC8gMTEuMDtcblx0Y29uc3QgYyA9IDkuMCAvIDEwLjA7XG5cdGNvbnN0IGNhID0gNDM1Ni4wIC8gMzYxLjA7XG5cdGNvbnN0IGNiID0gMzU0NDIuMCAvIDE4MDUuMDtcblx0Y29uc3QgY2MgPSAxNjA2MS4wIC8gMTgwNS4wO1xuXHRjb25zdCB0MiA9IHQgKiB0O1xuXHRyZXR1cm4gdCA8IGFcblx0XHQ/IDcuNTYyNSAqIHQyXG5cdFx0OiB0IDwgYlxuXHRcdD8gOS4wNzUgKiB0MiAtIDkuOSAqIHQgKyAzLjRcblx0XHQ6IHQgPCBjXG5cdFx0PyBjYSAqIHQyIC0gY2IgKiB0ICsgY2Ncblx0XHQ6IDEwLjggKiB0ICogdCAtIDIwLjUyICogdCArIDEwLjcyO1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYm91bmNlSW5PdXQodCkge1xuXHRyZXR1cm4gdCA8IDAuNSA/IDAuNSAqICgxLjAgLSBib3VuY2VPdXQoMS4wIC0gdCAqIDIuMCkpIDogMC41ICogYm91bmNlT3V0KHQgKiAyLjAgLSAxLjApICsgMC41O1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYm91bmNlSW4odCkge1xuXHRyZXR1cm4gMS4wIC0gYm91bmNlT3V0KDEuMCAtIHQpO1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2lyY0luT3V0KHQpIHtcblx0aWYgKCh0ICo9IDIpIDwgMSkgcmV0dXJuIC0wLjUgKiAoTWF0aC5zcXJ0KDEgLSB0ICogdCkgLSAxKTtcblx0cmV0dXJuIDAuNSAqIChNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKTtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNpcmNJbih0KSB7XG5cdHJldHVybiAxLjAgLSBNYXRoLnNxcnQoMS4wIC0gdCAqIHQpO1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2lyY091dCh0KSB7XG5cdHJldHVybiBNYXRoLnNxcnQoMSAtIC0tdCAqIHQpO1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG5cdHJldHVybiB0IDwgMC41ID8gNC4wICogdCAqIHQgKiB0IDogMC41ICogTWF0aC5wb3coMi4wICogdCAtIDIuMCwgMy4wKSArIDEuMDtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuXHRyZXR1cm4gdCAqIHQgKiB0O1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuXHRjb25zdCBmID0gdCAtIDEuMDtcblx0cmV0dXJuIGYgKiBmICogZiArIDEuMDtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVsYXN0aWNJbk91dCh0KSB7XG5cdHJldHVybiB0IDwgMC41XG5cdFx0PyAwLjUgKiBNYXRoLnNpbigoKCsxMy4wICogTWF0aC5QSSkgLyAyKSAqIDIuMCAqIHQpICogTWF0aC5wb3coMi4wLCAxMC4wICogKDIuMCAqIHQgLSAxLjApKVxuXHRcdDogMC41ICpcblx0XHRcdFx0TWF0aC5zaW4oKCgtMTMuMCAqIE1hdGguUEkpIC8gMikgKiAoMi4wICogdCAtIDEuMCArIDEuMCkpICpcblx0XHRcdFx0TWF0aC5wb3coMi4wLCAtMTAuMCAqICgyLjAgKiB0IC0gMS4wKSkgK1xuXHRcdFx0XHQxLjA7XG59XG5cbi8qKlxuICogaHR0cHM6Ly9zdmVsdGUuZGV2L2RvY3Mvc3ZlbHRlLWVhc2luZ1xuICogQHBhcmFtIHtudW1iZXJ9IHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGFzdGljSW4odCkge1xuXHRyZXR1cm4gTWF0aC5zaW4oKDEzLjAgKiB0ICogTWF0aC5QSSkgLyAyKSAqIE1hdGgucG93KDIuMCwgMTAuMCAqICh0IC0gMS4wKSk7XG59XG5cbi8qKlxuICogaHR0cHM6Ly9zdmVsdGUuZGV2L2RvY3Mvc3ZlbHRlLWVhc2luZ1xuICogQHBhcmFtIHtudW1iZXJ9IHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGFzdGljT3V0KHQpIHtcblx0cmV0dXJuIE1hdGguc2luKCgtMTMuMCAqICh0ICsgMS4wKSAqIE1hdGguUEkpIC8gMikgKiBNYXRoLnBvdygyLjAsIC0xMC4wICogdCkgKyAxLjA7XG59XG5cbi8qKlxuICogaHR0cHM6Ly9zdmVsdGUuZGV2L2RvY3Mvc3ZlbHRlLWVhc2luZ1xuICogQHBhcmFtIHtudW1iZXJ9IHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvSW5PdXQodCkge1xuXHRyZXR1cm4gdCA9PT0gMC4wIHx8IHQgPT09IDEuMFxuXHRcdD8gdFxuXHRcdDogdCA8IDAuNVxuXHRcdD8gKzAuNSAqIE1hdGgucG93KDIuMCwgMjAuMCAqIHQgLSAxMC4wKVxuXHRcdDogLTAuNSAqIE1hdGgucG93KDIuMCwgMTAuMCAtIHQgKiAyMC4wKSArIDEuMDtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9Jbih0KSB7XG5cdHJldHVybiB0ID09PSAwLjAgPyB0IDogTWF0aC5wb3coMi4wLCAxMC4wICogKHQgLSAxLjApKTtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9PdXQodCkge1xuXHRyZXR1cm4gdCA9PT0gMS4wID8gdCA6IDEuMCAtIE1hdGgucG93KDIuMCwgLTEwLjAgKiB0KTtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1YWRJbk91dCh0KSB7XG5cdHQgLz0gMC41O1xuXHRpZiAodCA8IDEpIHJldHVybiAwLjUgKiB0ICogdDtcblx0dC0tO1xuXHRyZXR1cm4gLTAuNSAqICh0ICogKHQgLSAyKSAtIDEpO1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVhZEluKHQpIHtcblx0cmV0dXJuIHQgKiB0O1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVhZE91dCh0KSB7XG5cdHJldHVybiAtdCAqICh0IC0gMi4wKTtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1YXJ0SW5PdXQodCkge1xuXHRyZXR1cm4gdCA8IDAuNSA/ICs4LjAgKiBNYXRoLnBvdyh0LCA0LjApIDogLTguMCAqIE1hdGgucG93KHQgLSAxLjAsIDQuMCkgKyAxLjA7XG59XG5cbi8qKlxuICogaHR0cHM6Ly9zdmVsdGUuZGV2L2RvY3Mvc3ZlbHRlLWVhc2luZ1xuICogQHBhcmFtIHtudW1iZXJ9IHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWFydEluKHQpIHtcblx0cmV0dXJuIE1hdGgucG93KHQsIDQuMCk7XG59XG5cbi8qKlxuICogaHR0cHM6Ly9zdmVsdGUuZGV2L2RvY3Mvc3ZlbHRlLWVhc2luZ1xuICogQHBhcmFtIHtudW1iZXJ9IHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWFydE91dCh0KSB7XG5cdHJldHVybiBNYXRoLnBvdyh0IC0gMS4wLCAzLjApICogKDEuMCAtIHQpICsgMS4wO1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVpbnRJbk91dCh0KSB7XG5cdGlmICgodCAqPSAyKSA8IDEpIHJldHVybiAwLjUgKiB0ICogdCAqIHQgKiB0ICogdDtcblx0cmV0dXJuIDAuNSAqICgodCAtPSAyKSAqIHQgKiB0ICogdCAqIHQgKyAyKTtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1aW50SW4odCkge1xuXHRyZXR1cm4gdCAqIHQgKiB0ICogdCAqIHQ7XG59XG5cbi8qKlxuICogaHR0cHM6Ly9zdmVsdGUuZGV2L2RvY3Mvc3ZlbHRlLWVhc2luZ1xuICogQHBhcmFtIHtudW1iZXJ9IHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWludE91dCh0KSB7XG5cdHJldHVybiAtLXQgKiB0ICogdCAqIHQgKiB0ICsgMTtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmVJbk91dCh0KSB7XG5cdHJldHVybiAtMC41ICogKE1hdGguY29zKE1hdGguUEkgKiB0KSAtIDEpO1xufVxuXG4vKipcbiAqIGh0dHBzOi8vc3ZlbHRlLmRldi9kb2NzL3N2ZWx0ZS1lYXNpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2luZUluKHQpIHtcblx0Y29uc3QgdiA9IE1hdGguY29zKHQgKiBNYXRoLlBJICogMC41KTtcblx0aWYgKE1hdGguYWJzKHYpIDwgMWUtMTQpIHJldHVybiAxO1xuXHRlbHNlIHJldHVybiAxIC0gdjtcbn1cblxuLyoqXG4gKiBodHRwczovL3N2ZWx0ZS5kZXYvZG9jcy9zdmVsdGUtZWFzaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmVPdXQodCkge1xuXHRyZXR1cm4gTWF0aC5zaW4oKHQgKiBNYXRoLlBJKSAvIDIpO1xufVxuIiwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XG4gICAgaW1wb3J0IHsgc2V0SWNvbiwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcbiAgICBpbXBvcnQgeyBESUZGX1ZJRVdfQ09ORklHIH0gZnJvbSBcInNyYy9jb25zdGFudHNcIjtcbiAgICBpbXBvcnQgeyBEaWZmRmlsZSB9IGZyb20gXCJzcmMvdHlwZXNcIjtcbiAgICBpbXBvcnQgeyBnZXREaXNwbGF5UGF0aCwgZ2V0TmV3TGVhZiB9IGZyb20gXCJzcmMvdXRpbHNcIjtcbiAgICBpbXBvcnQgSGlzdG9yeVZpZXcgZnJvbSBcIi4uL2hpc3RvcnlWaWV3XCI7XG5cbiAgICBleHBvcnQgbGV0IGRpZmY6IERpZmZGaWxlO1xuICAgIGV4cG9ydCBsZXQgdmlldzogSGlzdG9yeVZpZXc7XG4gICAgbGV0IGJ1dHRvbnM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICAgICQ6IHNpZGUgPSAodmlldy5sZWFmLmdldFJvb3QoKSBhcyBhbnkpLnNpZGUgPT0gXCJsZWZ0XCIgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjtcblxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBidXR0b25zLmZvckVhY2goKGIpID0+IHNldEljb24oYiwgYi5nZXRBdHRyKFwiZGF0YS1pY29uXCIpISkpLFxuICAgICAgICAwXG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIG9wZW4oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHZpZXcuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChkaWZmLnZhdWx0X3BhdGgpO1xuXG4gICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgICAgICAgIGdldE5ld0xlYWYoZXZlbnQpPy5vcGVuRmlsZShmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNob3dEaWZmKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGdldE5ld0xlYWYoZXZlbnQpPy5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgdHlwZTogRElGRl9WSUVXX0NPTkZJRy50eXBlLFxuICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAgICAgICBmaWxlOiBkaWZmLnBhdGgsXG4gICAgICAgICAgICAgICAgc3RhZ2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBoYXNoOiBkaWZmLmhhc2gsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG48L3NjcmlwdD5cblxuPCEtLSBzdmVsdGUtaWdub3JlIGExMXktY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cbjwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW5vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAtLT5cbjwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW5vLW5vbmludGVyYWN0aXZlLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxuPG1haW5cbiAgICBvbjpjbGlja3xzdG9wUHJvcGFnYXRpb249e3Nob3dEaWZmfVxuICAgIG9uOmF1eGNsaWNrfHN0b3BQcm9wYWdhdGlvbj17c2hvd0RpZmZ9XG4gICAgb246Zm9jdXNcbiAgICBjbGFzcz1cInRyZWUtaXRlbSBuYXYtZmlsZVwiXG4+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInRyZWUtaXRlbS1zZWxmIGlzLWNsaWNrYWJsZSBuYXYtZmlsZS10aXRsZVwiXG4gICAgICAgIGNsYXNzOmlzLWFjdGl2ZT17dmlldy5wbHVnaW4ubGFzdERpZmZWaWV3U3RhdGU/LmZpbGUgPT1cbiAgICAgICAgICAgIGRpZmYudmF1bHRfcGF0aCAmJiB2aWV3LnBsdWdpbi5sYXN0RGlmZlZpZXdTdGF0ZT8uaGFzaH1cbiAgICAgICAgZGF0YS1wYXRoPXtkaWZmLnZhdWx0X3BhdGh9XG4gICAgICAgIGRhdGEtdG9vbHRpcC1wb3NpdGlvbj17c2lkZX1cbiAgICAgICAgYXJpYS1sYWJlbD17ZGlmZi52YXVsdF9wYXRofVxuICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRyZWUtaXRlbS1pbm5lciBuYXYtZmlsZS10aXRsZS1jb250ZW50XCI+XG4gICAgICAgICAgICB7Z2V0RGlzcGxheVBhdGgoZGlmZi52YXVsdF9wYXRoKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnaXQtdG9vbHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgeyNpZiB2aWV3LmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZGlmZi52YXVsdF9wYXRoKX1cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uPVwiZ28tdG8tZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiT3BlbiBGaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17YnV0dG9uc1swXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uOmF1eGNsaWNrfHN0b3BQcm9wYWdhdGlvbj17b3Blbn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uOmNsaWNrfHN0b3BQcm9wYWdhdGlvbj17b3Blbn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xpY2thYmxlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIHsvaWZ9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHlwZVwiIGRhdGEtdHlwZT17ZGlmZi5zdGF0dXN9PntkaWZmLnN0YXR1c308L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9tYWluPlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbiAgICBtYWluIHtcbiAgICAgICAgLm5hdi1maWxlLXRpdGxlIHtcbiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cbiAgICB9XG48L3N0eWxlPlxuIiwgIjwhLS0gdHNsaW50OmRpc2FibGUgdHMoMjM0NSkgIC0tPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbiAgICBpbXBvcnQgT2JzaWRpYW5HaXQgZnJvbSBcInNyYy9tYWluXCI7XG4gICAgaW1wb3J0IHsgSGlzdG9yeVJvb3RUcmVlSXRlbSwgVHJlZUl0ZW0gfSBmcm9tIFwic3JjL3R5cGVzXCI7XG4gICAgaW1wb3J0IHsgc2xpZGUgfSBmcm9tIFwic3ZlbHRlL3RyYW5zaXRpb25cIjtcbiAgICBpbXBvcnQgSGlzdG9yeVZpZXcgZnJvbSBcIi4uL2hpc3RvcnlWaWV3XCI7XG4gICAgaW1wb3J0IExvZ0ZpbGVDb21wb25lbnQgZnJvbSBcIi4vbG9nRmlsZUNvbXBvbmVudC5zdmVsdGVcIjtcbiAgICBleHBvcnQgbGV0IGhpZXJhcmNoeTogSGlzdG9yeVJvb3RUcmVlSXRlbTtcbiAgICBleHBvcnQgbGV0IHBsdWdpbjogT2JzaWRpYW5HaXQ7XG4gICAgZXhwb3J0IGxldCB2aWV3OiBIaXN0b3J5VmlldztcbiAgICBleHBvcnQgbGV0IHRvcExldmVsID0gZmFsc2U7XG4gICAgY29uc3QgY2xvc2VkOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgICQ6IHNpZGUgPSAodmlldy5sZWFmLmdldFJvb3QoKSBhcyBhbnkpLnNpZGUgPT0gXCJsZWZ0XCIgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjtcblxuICAgIGZ1bmN0aW9uIGZvbGQoaXRlbTogVHJlZUl0ZW0pIHtcbiAgICAgICAgY2xvc2VkW2l0ZW0udGl0bGVdID0gIWNsb3NlZFtpdGVtLnRpdGxlXTtcbiAgICB9XG48L3NjcmlwdD5cblxuPCEtLSBzdmVsdGUtaWdub3JlIGExMXktY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cbjwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW5vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAtLT5cbjxtYWluIGNsYXNzOnRvcExldmVsPlxuICAgIHsjZWFjaCBoaWVyYXJjaHkuY2hpbGRyZW4gYXMgZW50aXR5fVxuICAgICAgICB7I2lmIGVudGl0eS5kYXRhfVxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8TG9nRmlsZUNvbXBvbmVudCBkaWZmPXtlbnRpdHkuZGF0YX0ge3ZpZXd9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgezplbHNlfVxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHJlZS1pdGVtIG5hdi1mb2xkZXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzOmlzLWNvbGxhcHNlZD17Y2xvc2VkW2VudGl0eS50aXRsZV19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtaXRlbS1zZWxmIGlzLWNsaWNrYWJsZSBuYXYtZm9sZGVyLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPXtzaWRlfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtlbnRpdHkudmF1bHRQYXRofVxuICAgICAgICAgICAgICAgICAgICBvbjpjbGljaz17KCkgPT4gZm9sZChlbnRpdHkpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uPVwiZm9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1yaWdodDogNXB4OyBkaXNwbGF5OiBmbGV4OyBcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtaXRlbS1pY29uIG5hdi1mb2xkZXItY29sbGFwc2UtaW5kaWNhdG9yIGNvbGxhcHNlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6aXMtY29sbGFwc2VkPXtjbG9zZWRbZW50aXR5LnRpdGxlXX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdmctaWNvbiByaWdodC10cmlhbmdsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjxwYXRoIGQ9XCJNMyA4TDEyIDE3TDIxIDhcIiAvPjwvc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJlZS1pdGVtLWlubmVyIG5hdi1mb2xkZXItdGl0bGUtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2VudGl0eS50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICB7I2lmICFjbG9zZWRbZW50aXR5LnRpdGxlXX1cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cmVlLWl0ZW0tY2hpbGRyZW4gbmF2LWZvbGRlci1jaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOnNsaWRlfGxvY2FsPXt7IGR1cmF0aW9uOiAxNTAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZWx0ZTpzZWxmIGhpZXJhcmNoeT17ZW50aXR5fSB7cGx1Z2lufSB7dmlld30gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgey9pZn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB7L2lmfVxuICAgIHsvZWFjaH1cbjwvbWFpbj5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4gICAgbWFpbiB7XG4gICAgICAgIC5uYXYtZm9sZGVyLXRpdGxlLWNvbnRlbnQge1xuICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cbiAgICB9XG48L3N0eWxlPlxuIiwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XG4gICAgaW1wb3J0IHsgc2V0SWNvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuICAgIGltcG9ydCB7IFNpbXBsZUdpdCB9IGZyb20gXCJzcmMvZ2l0TWFuYWdlci9zaW1wbGVHaXRcIjtcbiAgICBpbXBvcnQgT2JzaWRpYW5HaXQgZnJvbSBcInNyYy9tYWluXCI7XG4gICAgaW1wb3J0IHsgTG9nRW50cnkgfSBmcm9tIFwic3JjL3R5cGVzXCI7XG4gICAgaW1wb3J0IHsgb25EZXN0cm95IH0gZnJvbSBcInN2ZWx0ZVwiO1xuICAgIGltcG9ydCBMb2dDb21wb25lbnQgZnJvbSBcIi4vY29tcG9uZW50cy9sb2dDb21wb25lbnQuc3ZlbHRlXCI7XG4gICAgaW1wb3J0IEhpc3RvcnlWaWV3IGZyb20gXCIuL2hpc3RvcnlWaWV3XCI7XG5cbiAgICBleHBvcnQgbGV0IHBsdWdpbjogT2JzaWRpYW5HaXQ7XG4gICAgZXhwb3J0IGxldCB2aWV3OiBIaXN0b3J5VmlldztcbiAgICBsZXQgbG9hZGluZzogYm9vbGVhbjtcbiAgICBsZXQgYnV0dG9uczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGxldCBsb2dzOiBMb2dFbnRyeVtdIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzaG93VHJlZTogYm9vbGVhbiA9IHBsdWdpbi5zZXR0aW5ncy50cmVlU3RydWN0dXJlO1xuXG4gICAgbGV0IGxheW91dEJ0bjogSFRNTEVsZW1lbnQ7XG4gICAgJDoge1xuICAgICAgICBpZiAobGF5b3V0QnRuKSB7XG4gICAgICAgICAgICBsYXlvdXRCdG4uZW1wdHkoKTtcbiAgICAgICAgICAgIHNldEljb24obGF5b3V0QnRuLCBzaG93VHJlZSA/IFwibGlzdFwiIDogXCJmb2xkZXJcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihcImdpdC12aWV3LXJlZnJlc2hcIiwgcmVmcmVzaCk7XG4gICAgLy9UaGlzIHNob3VsZCBnbyBpbiB0aGUgb25Nb3VudCBjYWxsYmFjaywgZm9yIHNvbWUgcmVhc29uIGl0IGRvZXNuJ3QgZmlyZSB0aG91Z2hcbiAgICAvL3NldFRpbWVvdXQncyBjYWxsYmFjayB3aWxsIGV4ZWN1dGUgYWZ0ZXIgdGhlIGN1cnJlbnQgZXZlbnQgbG9vcCBmaW5pc2hlcy5cbiAgICBwbHVnaW4uYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KCgpID0+IHtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgYnV0dG9ucy5mb3JFYWNoKChidG4pID0+IHNldEljb24oYnRuLCBidG4uZ2V0QXR0cihcImRhdGEtaWNvblwiKSEpKTtcbiAgICAgICAgICAgIHNldEljb24obGF5b3V0QnRuLCBzaG93VHJlZSA/IFwibGlzdFwiIDogXCJmb2xkZXJcIik7XG4gICAgICAgIH0sIDApO1xuICAgIH0pO1xuICAgIG9uRGVzdHJveSgoKSA9PiB7XG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJnaXQtdmlldy1yZWZyZXNoXCIsIHJlZnJlc2gpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gdHJpZ2dlclJlZnJlc2goKSB7XG4gICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgICAgIGxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBpc1NpbXBsZUdpdCA9IHBsdWdpbi5naXRNYW5hZ2VyIGluc3RhbmNlb2YgU2ltcGxlR2l0O1xuICAgICAgICBsb2dzID0gYXdhaXQgcGx1Z2luLmdpdE1hbmFnZXIubG9nKFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBpc1NpbXBsZUdpdCA/IDUwIDogMTBcbiAgICAgICAgKTtcbiAgICAgICAgbG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbjwvc2NyaXB0PlxuXG48IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxuPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxuPG1haW4+XG4gICAgPGRpdiBjbGFzcz1cIm5hdi1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGlkPVwibGF5b3V0Q2hhbmdlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNsaWNrYWJsZS1pY29uIG5hdi1hY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2hhbmdlIExheW91dFwiXG4gICAgICAgICAgICAgICAgYmluZDp0aGlzPXtsYXlvdXRCdG59XG4gICAgICAgICAgICAgICAgb246Y2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd1RyZWUgPSAhc2hvd1RyZWU7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy50cmVlU3RydWN0dXJlID0gc2hvd1RyZWU7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBpZD1cInJlZnJlc2hcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xpY2thYmxlLWljb24gbmF2LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzOmxvYWRpbmdcbiAgICAgICAgICAgICAgICBkYXRhLWljb249XCJyZWZyZXNoLWN3XCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVmcmVzaFwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW46IDFweDtcIlxuICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17YnV0dG9uc1s2XX1cbiAgICAgICAgICAgICAgICBvbjpjbGljaz17dHJpZ2dlclJlZnJlc2h9XG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJuYXYtZmlsZXMtY29udGFpbmVyXCIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XG4gICAgICAgIHsjaWYgbG9nc31cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmVlLWl0ZW0gbmF2LWZvbGRlciBtb2Qtcm9vdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmVlLWl0ZW0tY2hpbGRyZW4gbmF2LWZvbGRlci1jaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgICAgICB7I2VhY2ggbG9ncyBhcyBsb2d9XG4gICAgICAgICAgICAgICAgICAgICAgICA8TG9nQ29tcG9uZW50IHt2aWV3fSB7c2hvd1RyZWV9IHtsb2d9IHtwbHVnaW59IC8+XG4gICAgICAgICAgICAgICAgICAgIHsvZWFjaH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB7L2lmfVxuICAgIDwvZGl2PlxuPC9tYWluPlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbjwvc3R5bGU+XG4iLCAiaW1wb3J0IHsgRnV6enlTdWdnZXN0TW9kYWwgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuZXhwb3J0IGNsYXNzIEJyYW5jaE1vZGFsIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8c3RyaW5nPiB7XG4gICAgcmVzb2x2ZTogKFxuICAgICAgICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZUxpa2U8c3RyaW5nIHwgdW5kZWZpbmVkPlxuICAgICkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHN1cGVyKGFwcCk7XG4gICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoXCJTZWxlY3QgYnJhbmNoIHRvIGNoZWNrb3V0XCIpO1xuICAgIH1cblxuICAgIGdldEl0ZW1zKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoZXM7XG4gICAgfVxuICAgIGdldEl0ZW1UZXh0KGl0ZW06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgICBvbkNob29zZUl0ZW0oaXRlbTogc3RyaW5nLCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzb2x2ZShpdGVtKTtcbiAgICB9XG5cbiAgICBvcGVuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHN1cGVyLm9wZW4oKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkNsb3NlKCkge1xuICAgICAgICAvL29uQ2xvc2UgZ2V0cyBjYWxsZWQgYmVmb3JlIG9uQ2hvb3NlSXRlbVxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMCkpO1xuICAgICAgICBpZiAodGhpcy5yZXNvbHZlKSB0aGlzLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQXBwLCBNb2RhbCB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgY2xhc3MgSWdub3JlTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gICAgcmVzb2x2ZTpcbiAgICAgICAgfCAoKHZhbHVlOiBzdHJpbmcgfCBQcm9taXNlTGlrZTxzdHJpbmc+IHwgdW5kZWZpbmVkKSA9PiB2b2lkKVxuICAgICAgICB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBhcHA6IEFwcCxcbiAgICAgICAgcHJpdmF0ZSBjb250ZW50OiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgc3VwZXIoYXBwKTtcbiAgICB9XG4gICAgb3BlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBzdXBlci5vcGVuKCk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25PcGVuKCkge1xuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCwgdGl0bGVFbCB9ID0gdGhpcztcbiAgICAgICAgdGl0bGVFbC5zZXRUZXh0KFwiRWRpdCAuZ2l0aWdub3JlXCIpO1xuICAgICAgICBjb25zdCBkaXYgPSBjb250ZW50RWwuY3JlYXRlRGl2KCk7XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IGRpdi5jcmVhdGVFbChcInRleHRhcmVhXCIsIHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuY29udGVudCxcbiAgICAgICAgICAgIGNsczogW1wib2JzaWRpYW4tZ2l0LXRleHRhcmVhXCJdLFxuICAgICAgICAgICAgYXR0cjogeyByb3dzOiAxMCwgY29sczogMzAsIHdyYXA6IFwib2ZmXCIgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGl2LmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgIGNsczogW1wibW9kLWN0YVwiLCBcIm9ic2lkaWFuLWdpdC1jZW50ZXItYnV0dG9uXCJdLFxuICAgICAgICAgICAgdGV4dDogXCJTYXZlXCIsXG4gICAgICAgIH0pLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBgdGhpcy5yZXNvbHZlYCBhc3NlcnRzIG5vbi1udWxsIGhlcmUgYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgYXNzaWduZWQgd2hlbiB0aGUgYHRoaXMub3BlbigpYCBpcyBjYWxsZWRcbiAgICAgICAgICAgIC8vIGFuZCBpcyBub3QgbnVsbCBhdCB0aGUgdGltZSB0aGUgc2F2ZSBidXR0b24gaXMgY2xpY2tlZC5cbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZSEodGV4dC52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvbkNsb3NlKCkge1xuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICAgICAgLy8gYHRoaXMucmVzb2x2ZWAgYXNzZXJ0cyBub24tbnVsbCBoZXJlIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzIGFzc2lnbmVkIHdoZW4gdGhlIGB0aGlzLm9wZW4oKWAgaXMgY2FsbGVkXG4gICAgICAgIC8vIGFuZCBpcyBub3QgbnVsbCBhdCB0aGUgdGltZSB0aGUgbW9kYWwgaXMgY2xvc2VkLlxuICAgICAgICB0aGlzLnJlc29sdmUhKHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBIb3ZlclBhcmVudCwgSG92ZXJQb3BvdmVyLCBJdGVtVmlldywgV29ya3NwYWNlTGVhZiB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgU09VUkNFX0NPTlRST0xfVklFV19DT05GSUcgfSBmcm9tIFwic3JjL2NvbnN0YW50c1wiO1xuaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCJzcmMvbWFpblwiO1xuLy8gQHRzY29uZmlnL3N2ZWx0ZSBpcyByZXF1aXJlZCB0byByZXNvbHZlIHRoaXMgZXJyb3IuXG4vLyBJZ25vcmUgdGVtcG9yYXJpbHkuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgU291cmNlQ29udHJvbFZpZXdDb21wb25lbnQgZnJvbSBcIi4vc291cmNlQ29udHJvbC5zdmVsdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2l0VmlldyBleHRlbmRzIEl0ZW1WaWV3IGltcGxlbWVudHMgSG92ZXJQYXJlbnQge1xuICAgIHBsdWdpbjogT2JzaWRpYW5HaXQ7XG4gICAgcHJpdmF0ZSBfdmlldzogU291cmNlQ29udHJvbFZpZXdDb21wb25lbnQ7XG4gICAgaG92ZXJQb3BvdmVyOiBIb3ZlclBvcG92ZXIgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgcGx1Z2luOiBPYnNpZGlhbkdpdCkge1xuICAgICAgICBzdXBlcihsZWFmKTtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgICAgIHRoaXMuaG92ZXJQb3BvdmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRWaWV3VHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gU09VUkNFX0NPTlRST0xfVklFV19DT05GSUcudHlwZTtcbiAgICB9XG5cbiAgICBnZXREaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gU09VUkNFX0NPTlRST0xfVklFV19DT05GSUcubmFtZTtcbiAgICB9XG5cbiAgICBnZXRJY29uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBTT1VSQ0VfQ09OVFJPTF9WSUVXX0NPTkZJRy5pY29uO1xuICAgIH1cblxuICAgIG9uQ2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBzdXBlci5vbkNsb3NlKCk7XG4gICAgfVxuXG4gICAgb25PcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLl92aWV3ID0gbmV3IFNvdXJjZUNvbnRyb2xWaWV3Q29tcG9uZW50KHtcbiAgICAgICAgICAgIHRhcmdldDogdGhpcy5jb250ZW50RWwsXG4gICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgIHBsdWdpbjogdGhpcy5wbHVnaW4sXG4gICAgICAgICAgICAgICAgdmlldzogdGhpcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3VwZXIub25PcGVuKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEFwcCwgTW9kYWwgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuZXhwb3J0IGNsYXNzIERpc2NhcmRNb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgYXBwOiBBcHAsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRpb246IGJvb2xlYW4sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZW5hbWU6IHN0cmluZ1xuICAgICkge1xuICAgICAgICBzdXBlcihhcHApO1xuICAgIH1cbiAgICByZXNvbHZlOiAoKHZhbHVlOiBib29sZWFuIHwgUHJvbWlzZUxpa2U8Ym9vbGVhbj4pID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgbXlPcGVuKCkge1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25PcGVuKCkge1xuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCwgdGl0bGVFbCB9ID0gdGhpcztcbiAgICAgICAgdGl0bGVFbC5zZXRUZXh0KGAke3RoaXMuZGVsZXRpb24gPyBcIkRlbGV0ZVwiIDogXCJEaXNjYXJkXCJ9IHRoaXMgZmlsZT9gKTtcbiAgICAgICAgY29udGVudEVsXG4gICAgICAgICAgICAuY3JlYXRlRWwoXCJwXCIpXG4gICAgICAgICAgICAuc2V0VGV4dChcbiAgICAgICAgICAgICAgICBgRG8geW91IHJlYWxseSB3YW50IHRvICR7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRpb24gPyBcImRlbGV0ZVwiIDogXCJkaXNjYXJkIHRoZSBjaGFuZ2VzIG9mXCJcbiAgICAgICAgICAgICAgICB9IFwiJHt0aGlzLmZpbGVuYW1lfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGl2ID0gY29udGVudEVsLmNyZWF0ZURpdih7IGNsczogXCJtb2RhbC1idXR0b24tY29udGFpbmVyXCIgfSk7XG5cbiAgICAgICAgY29uc3QgZGlzY2FyZCA9IGRpdi5jcmVhdGVFbChcImJ1dHRvblwiLCB7XG4gICAgICAgICAgICBjbHM6IFwibW9kLXdhcm5pbmdcIixcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuZGVsZXRpb24gPyBcIkRlbGV0ZVwiIDogXCJEaXNjYXJkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBkaXNjYXJkLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNvbHZlKSB0aGlzLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNjYXJkLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNvbHZlKSB0aGlzLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsb3NlID0gZGl2LmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgIHRleHQ6IFwiQ2FuY2VsXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBjbG9zZS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzb2x2ZSkgdGhpcy5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjbG9zZS5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzb2x2ZSkgdGhpcy5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcbiAgICB9XG59XG4iLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cbiAgICBpbXBvcnQgeyBzZXRJY29uLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuICAgIGltcG9ydCB7IGhvdmVyUHJldmlldyB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XG4gICAgaW1wb3J0IHsgRElGRl9WSUVXX0NPTkZJRyB9IGZyb20gXCJzcmMvY29uc3RhbnRzXCI7XG4gICAgaW1wb3J0IHsgR2l0TWFuYWdlciB9IGZyb20gXCJzcmMvZ2l0TWFuYWdlci9naXRNYW5hZ2VyXCI7XG4gICAgaW1wb3J0IHsgRmlsZVN0YXR1c1Jlc3VsdCB9IGZyb20gXCJzcmMvdHlwZXNcIjtcbiAgICBpbXBvcnQgeyBEaXNjYXJkTW9kYWwgfSBmcm9tIFwic3JjL3VpL21vZGFscy9kaXNjYXJkTW9kYWxcIjtcbiAgICBpbXBvcnQgeyBnZXREaXNwbGF5UGF0aCwgZ2V0TmV3TGVhZiB9IGZyb20gXCJzcmMvdXRpbHNcIjtcbiAgICBpbXBvcnQgR2l0VmlldyBmcm9tIFwiLi4vc291cmNlQ29udHJvbFwiO1xuXG4gICAgZXhwb3J0IGxldCBjaGFuZ2U6IEZpbGVTdGF0dXNSZXN1bHQ7XG4gICAgZXhwb3J0IGxldCB2aWV3OiBHaXRWaWV3O1xuICAgIGV4cG9ydCBsZXQgbWFuYWdlcjogR2l0TWFuYWdlcjtcbiAgICBsZXQgYnV0dG9uczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgICQ6IHNpZGUgPSAodmlldy5sZWFmLmdldFJvb3QoKSBhcyBhbnkpLnNpZGUgPT0gXCJsZWZ0XCIgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjtcblxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBidXR0b25zLmZvckVhY2goKGIpID0+IHNldEljb24oYiwgYi5nZXRBdHRyKFwiZGF0YS1pY29uXCIpISkpLFxuICAgICAgICAwXG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIGhvdmVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIC8vRG9uJ3Qgc2hvdyBwcmV2aWV3cyBvZiBjb25maWctIG9yIGhpZGRlbiBmaWxlcy5cbiAgICAgICAgaWYgKGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoY2hhbmdlLnZhdWx0X3BhdGgpKSB7XG4gICAgICAgICAgICBob3ZlclByZXZpZXcoZXZlbnQsIHZpZXcgYXMgYW55LCBjaGFuZ2UudmF1bHRfcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvcGVuKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSB2aWV3LmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoY2hhbmdlLnZhdWx0X3BhdGgpO1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XG5cbiAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgZ2V0TmV3TGVhZihldmVudCk/Lm9wZW5GaWxlKGZpbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RhZ2UoKSB7XG4gICAgICAgIG1hbmFnZXIuc3RhZ2UoY2hhbmdlLnBhdGgsIGZhbHNlKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzaG93RGlmZihldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBnZXROZXdMZWFmKGV2ZW50KT8uc2V0Vmlld1N0YXRlKHtcbiAgICAgICAgICAgIHR5cGU6IERJRkZfVklFV19DT05GSUcudHlwZSxcbiAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICAgICAgZmlsZTogY2hhbmdlLnBhdGgsXG4gICAgICAgICAgICAgICAgc3RhZ2VkOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpc2NhcmQoKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZUZpbGUgPSBjaGFuZ2Uud29ya2luZ19kaXIgPT0gXCJVXCI7XG4gICAgICAgIG5ldyBEaXNjYXJkTW9kYWwodmlldy5hcHAsIGRlbGV0ZUZpbGUsIGNoYW5nZS52YXVsdF9wYXRoKVxuICAgICAgICAgICAgLm15T3BlbigpXG4gICAgICAgICAgICAudGhlbigoc2hvdWxkRGlzY2FyZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGREaXNjYXJkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWxldGVGaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmFwcC52YXVsdC5hZGFwdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZShjaGFuZ2UudmF1bHRfcGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5kaXNjYXJkKGNoYW5nZS5wYXRoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImdpdC1yZWZyZXNoXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuPC9zY3JpcHQ+XG5cbjwhLS0gVE9ETzogRml4IGFyYWktbGFiZWwgZm9yIGxlZnQgc2lkZWJhciBhbmQgaWYgaXQncyB0b28gbG9uZyAtLT5cbjwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LWNsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XG48IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1uby1ub25pbnRlcmFjdGl2ZS1lbGVtZW50LWludGVyYWN0aW9ucyAtLT5cbjwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW5vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAtLT5cbjwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LXVua25vd24tYXJpYS1hdHRyaWJ1dGUgLS0+XG48bWFpblxuICAgIG9uOm1vdXNlb3Zlcj17aG92ZXJ9XG4gICAgb246Y2xpY2t8c3RvcFByb3BhZ2F0aW9uPXtzaG93RGlmZn1cbiAgICBvbjphdXhjbGlja3xzdG9wUHJvcGFnYXRpb249e3Nob3dEaWZmfVxuICAgIG9uOmZvY3VzXG4gICAgY2xhc3M9XCJ0cmVlLWl0ZW0gbmF2LWZpbGVcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJ0cmVlLWl0ZW0tc2VsZiBpcy1jbGlja2FibGUgbmF2LWZpbGUtdGl0bGVcIlxuICAgICAgICBjbGFzczppcy1hY3RpdmU9e3ZpZXcucGx1Z2luLmxhc3REaWZmVmlld1N0YXRlPy5maWxlID09XG4gICAgICAgICAgICBjaGFuZ2UudmF1bHRfcGF0aCAmJlxuICAgICAgICAgICAgIXZpZXcucGx1Z2luLmxhc3REaWZmVmlld1N0YXRlPy5oYXNoICYmXG4gICAgICAgICAgICAhdmlldy5wbHVnaW4ubGFzdERpZmZWaWV3U3RhdGU/LnN0YWdlZH1cbiAgICAgICAgZGF0YS1wYXRoPXtjaGFuZ2UudmF1bHRfcGF0aH1cbiAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPXtzaWRlfVxuICAgICAgICBhcmlhLWxhYmVsPXtjaGFuZ2UudmF1bHRfcGF0aH1cbiAgICA+XG4gICAgICAgIDwhLS0gPGRpdlxuXHRcdFx0ZGF0YS1pY29uPVwiZm9sZGVyXCJcblx0XHRcdGJpbmQ6dGhpcz17YnV0dG9uc1szXX1cblx0XHRcdHN0eWxlPVwicGFkZGluZy1yaWdodDogNXB4OyBkaXNwbGF5OiBmbGV4O1wiXG5cdFx0Lz4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0cmVlLWl0ZW0taW5uZXIgbmF2LWZpbGUtdGl0bGUtY29udGVudFwiPlxuICAgICAgICAgICAge2dldERpc3BsYXlQYXRoKGNoYW5nZS52YXVsdF9wYXRoKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnaXQtdG9vbHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgeyNpZiB2aWV3LmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoY2hhbmdlLnZhdWx0X3BhdGgpfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb249XCJnby10by1maWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJPcGVuIEZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYmluZDp0aGlzPXtidXR0b25zWzFdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb246YXV4Y2xpY2t8c3RvcFByb3BhZ2F0aW9uPXtvcGVufVxuICAgICAgICAgICAgICAgICAgICAgICAgb246Y2xpY2t8c3RvcFByb3BhZ2F0aW9uPXtvcGVufVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgey9pZn1cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbj1cInVuZG9cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGlzY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17YnV0dG9uc1swXX1cbiAgICAgICAgICAgICAgICAgICAgb246Y2xpY2t8c3RvcFByb3BhZ2F0aW9uPXtkaXNjYXJkfVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsaWNrYWJsZS1pY29uXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uPVwicGx1c1wiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTdGFnZVwiXG4gICAgICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17YnV0dG9uc1syXX1cbiAgICAgICAgICAgICAgICAgICAgb246Y2xpY2t8c3RvcFByb3BhZ2F0aW9uPXtzdGFnZX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvblwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR5cGVcIiBkYXRhLXR5cGU9e2NoYW5nZS53b3JraW5nX2Rpcn0+XG4gICAgICAgICAgICAgICAge2NoYW5nZS53b3JraW5nX2Rpcn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbWFpbj5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4gICAgbWFpbiB7XG4gICAgICAgIC5uYXYtZmlsZS10aXRsZSB7XG4gICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICB9XG4gICAgfVxuPC9zdHlsZT5cbiIsICJleHBvcnQgeyBhZGRBbGxGZWF0aGVySWNvbnMsIGFkZEZlYXRoZXJJY29uLCBiYXNlNjRUb0FycmF5QnVmZmVyLCBnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMsIHdhaXQsIGNvcHksIGdldFNlbGVjdGlvbkZyb21DdXJyRmlsZSwgZ2V0U2VsZWN0aW9uRnJvbUVkaXRvciwgaG92ZXJQcmV2aWV3LCBpc0luVmF1bHQsIGNyZWF0ZU5ld01ETm90ZSwgb3Blbk9yU3dpdGNoLCBpc0xpbmtlZCwgaXNSZXNvbHZlZCwgYWRkUmVuZGVyZWRNYXJrZG93bkJ1dHRvbiwgUmVuZGVyZWRNYXJrZG93bk1vZGFsLCBvcGVuVmlldywgc2F2ZVZpZXdTaWRlLCBhZGRNRCwgc3RyaXBNRCwgcmVzb2x2ZWRMaW5rc0NvbXBsZXRlLCB3YWl0Rm9yUmVzb2x2ZWRMaW5rcywgc3BsaXRBdFlhbWwsIGdldEFjdGl2ZUZpbGVDb250ZW50LCB9IGZyb20gXCIuL3V0aWxzXCI7XG4iLCAiLyoqXG4gKiBUaGlzIG1vZHVsZSBjb250YWlucyB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGNvbW1vbmx5IHVzZWQgaW4gT2JzaWRpYW4gcGx1Z2lucy5cbiAqIEBtb2R1bGUgb2JzaWRpYW4tY29tbXVuaXR5LWxpYlxuICovXG5pbXBvcnQgKiBhcyBmZWF0aGVyIGZyb20gXCJmZWF0aGVyLWljb25zXCI7XG5pbXBvcnQgeyBhZGRJY29uLCBNYXJrZG93blJlbmRlcmVyLCBNYXJrZG93blZpZXcsIE1vZGFsLCBub3JtYWxpemVQYXRoLCBOb3RpY2UsIHJlcXVlc3QsIFRGaWxlLCB9IGZyb20gXCJvYnNpZGlhblwiO1xuLyoqXG4gKiBZb3UgY2FuIGF3YWl0IHRoaXMgRnVuY3Rpb24gdG8gZGVsYXkgZXhlY3V0aW9uXG4gKlxuICogQHBhcmFtIGRlbGF5IFRoZSBkZWxheSBpbiBtc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdChkZWxheSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xufVxuLyoqXG4gKiBBZGRzIGFsbCBvZmZpY2lhbCBGZWF0aGVyIEljb25zIHRvIE9ic2lkaWFuLlxuICogaHR0cHM6Ly9mZWF0aGVyaWNvbnMuY29tL1xuICpcbiAqIEBwYXJhbSBhdHRyIFNWRyBBdHRyaWJ1dGVzIGZvciB0aGUgSWNvbi4gVGhlIGRlZmF1bHQgc2hvdWxkIHdvcmsgZm9yIG1vc3QgdXNlY2FzZXMuXG4gKlxuICogQGRlcHJlY2F0ZWQgQXMgb2YgT2JzaWRpYW4gMC4xMy4yNyB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQsIGJlY2F1c2UgT2JzaWRpYW4gc2hpcHMgd2l0aCBgbHVjaWRlYCwgYSBtYWludGFpbmVkIGZvcmsgb2YgZmVhdGhlci4gKGh0dHBzOi8vbHVjaWRlLmRldi8pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGxGZWF0aGVySWNvbnMoYXR0ciA9IHsgdmlld0JveDogXCIwIDAgMjQgMjRcIiwgd2lkdGg6IFwiMTAwXCIsIGhlaWdodDogXCIxMDBcIiB9KSB7XG4gICAgT2JqZWN0LnZhbHVlcyhmZWF0aGVyLmljb25zKS5mb3JFYWNoKChpKSA9PiB7XG4gICAgICAgIGNvbnN0IHN2ZyA9IGkudG9TdmcoYXR0cik7XG4gICAgICAgIGFkZEljb24oYGZlYXRoZXItJHtpLm5hbWV9YCwgc3ZnKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQWRkcyBhIHNwZWNpZmljIEZlYXRoZXIgSWNvbiB0byBPYnNpZGlhbi5cbiAqXG4gKiBAcGFyYW0gbmFtZSBvZmZpY2lhbCBOYW1lIG9mIHRoZSBJY29uIChodHRwczovL2ZlYXRoZXJpY29ucy5jb20vKVxuICogQHBhcmFtIGF0dHIgU1ZHIEF0dHJpYnV0ZXMgZm9yIHRoZSBJY29uLiBUaGUgZGVmYXVsdCBzaG91bGQgd29yayBmb3IgbW9zdCB1c2VjYXNlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEljb24gbmFtZVxuICpcbiAqIEBkZXByZWNhdGVkIEFzIG9mIE9ic2lkaWFuIDAuMTMuMjcgdGhpcyBpcyBubyBsb25nZXIgbmVlZGVkLCBiZWNhdXNlIE9ic2lkaWFuIHNoaXBzIHdpdGggYGx1Y2lkZWAsIGEgbWFpbnRhaW5lZCBmb3JrIG9mIGZlYXRoZXIuIChodHRwczovL2x1Y2lkZS5kZXYvKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRmVhdGhlckljb24obmFtZSwgYXR0ciA9IHsgdmlld0JveDogXCIwIDAgMjQgMjRcIiwgd2lkdGg6IFwiMTAwXCIsIGhlaWdodDogXCIxMDBcIiB9KSB7XG4gICAgaWYgKGZlYXRoZXIuaWNvbnNbbmFtZV0pIHtcbiAgICAgICAgY29uc3QgaWNvbk5hbWUgPSBgZmVhdGhlci0ke25hbWV9YDtcbiAgICAgICAgYWRkSWNvbihpY29uTmFtZSwgZmVhdGhlci5pY29uc1tuYW1lXS50b1N2ZyhhdHRyKSk7XG4gICAgICAgIHJldHVybiBpY29uTmFtZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKGBUaGlzIEljb24gKCR7bmFtZX0pIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIEZlYXRoZXIgTGlicmFyeS5gKTtcbiAgICB9XG59XG4vKipcbiAqIENvbnZlcnQgYSBiYXNlNjQgU3RyaW5nIHRvIGFuIEFycmF5QnVmZmVyLlxuICogWW91IGNhbiB0aGVuIHVzZSB0aGUgQXJyYXlCdWZmZXIgdG8gc2F2ZSB0aGUgYXNzZXQgdG8gZGlzay5cbiAqXG4gKiBAcGFyYW0gYmFzZTY0IGJhc2U2NCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybnMgQXJyYXlCdWZmZXJcbiAqIEBkZXByZWNhdGVkIE9ic2lkaWFuIG9mZmVycyBpdCdzIG93biBtZXRob2QgYXMgb2YgMC4xNC41XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NCkge1xuICAgIGNvbnN0IGJpbmFyeV9zdHJpbmcgPSB3aW5kb3cuYXRvYihiYXNlNjQpO1xuICAgIGNvbnN0IGxlbiA9IGJpbmFyeV9zdHJpbmcubGVuZ3RoO1xuICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBieXRlc1tpXSA9IGJpbmFyeV9zdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzLmJ1ZmZlcjtcbn1cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIGFuIHVuZG9jdW1lbnRlZCBBUEkgb2YgT2JzaWRpYW4uXG4gKlxuICogQHBhcmFtIGZpbGVOYW1lIFRoZSBGaWxlbmFtZSBmb3IgeW91ciBBdHRhY2htZW50XG4gKiBAcGFyYW0gZm9ybWF0IFRoZSBGaWxlZm9ybWF0IG9mIHlvdXIgQXR0YWNobWVudFxuICogQHBhcmFtIHNvdXJjZUZpbGUgVGhlIFNvdXJjZWZpbGUgZnJvbSB3aGVyZSB0aGUgQXR0YWNobWVudCBnZXRzIGFkZGVkLCB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBBdHRhY2htZW50IEZvbGRlciBtaWdodCBiZSBkaWZmZXJlbnQgYmFzZWQgb24gd2hlcmUgaXQgZ2V0cyBpbnNlcnRlZC5cbiAqIEByZXR1cm5zIFRoZSBBdHRhY2htZW50IFBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhmaWxlTmFtZSwgZm9ybWF0LCBzb3VyY2VGaWxlKSB7XG4gICAgLy9AdHMtZXhwZWN0LWVycm9yXG4gICAgcmV0dXJuIGFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMoZmlsZU5hbWUsIGZvcm1hdCwgc291cmNlRmlsZSk7XG59XG4vKipcbiAqIENvcHkgYGNvbnRlbnRgIHRvIHRoZSB1c2VycyBjbGlwYm9hcmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gYmUgY29waWVkIHRvIGNsaXBib2FyZC5cbiAqIEBwYXJhbSB7KCkgPT4gYW55fSBzdWNjZXNzIFRoZSBjYWxsYmFjayB0byBydW4gd2hlbiB0ZXh0IGlzIHN1Y2Nlc3NmdWxseSBjb3BpZWQuIERlZmF1bHQgdGhyb3dzIGEgbmV3IGBOb3RpY2VgXG4gKiBAcGFyYW0geyhyZWFzb24/KSA9PiBhbnl9IGZhaWx1cmUgVGhlIGNhbGxiYWNrIHRvIHJ1biB3aGVuIHRleHQgd2FzIG5vdCBhYmxlIHRvIGJlIGNvcGllZC4gRGVmYXVsdCB0aHJvd3MgYSBuZXcgYE5vdGljZWAsIGFuZCBjb25zb2xlIGxvZ3MgdGhlIGVycm9yLmBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHkoY29udGVudCwgc3VjY2VzcyA9ICgpID0+IG5ldyBOb3RpY2UoXCJDb3BpZWQgdG8gY2xpcGJvYXJkXCIpLCBmYWlsdXJlID0gKHJlYXNvbikgPT4ge1xuICAgIG5ldyBOb3RpY2UoXCJDb3VsZCBub3QgY29weSB0byBjbGlwYm9hcmRcIik7XG4gICAgY29uc29sZS5sb2coeyByZWFzb24gfSk7XG59KSB7XG4gICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoY29udGVudCkudGhlbihzdWNjZXNzLCBmYWlsdXJlKTtcbn1cbi8qKlxuICogR2l2ZW4gYW4gZWRpdG9yLCBjaGVjayBpZiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQgYW5kIHJldHVybiB0aGF0IHNlbGVjdGlvbiwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZW50aXJlIGNvbnRlbnQgb2YgdGhlIGVkaXRvclxuICogQHBhcmFtICB7RWRpdG9yfSBlZGl0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvbkZyb21FZGl0b3IoZWRpdG9yKSB7XG4gICAgaWYgKGVkaXRvci5zb21ldGhpbmdTZWxlY3RlZCgpKVxuICAgICAgICByZXR1cm4gZWRpdG9yLmdldFNlbGVjdGlvbigpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGVkaXRvci5nZXRWYWx1ZSgpO1xufVxuLyoqXG4gKiBDaGVjayBpZiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQgaW4gdGhlIGN1cnJlbnQgZmlsZSBhbmQgcmV0dXJuIHRoYXQgc2VsZWN0aW9uLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgY3VycmVudCBmaWxlLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gW2NhY2hlZD10cnVlXSBVc2UgYGNhY2hlZFJlYWRgIG9yIGByZWFkYC4gYGNhY2hlZFJlYWRgIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gYG51bGxgIGlmIG5vdCBmb2N1c3NlZCBvbiBhIG1hcmtkb3duIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlbGVjdGlvbkZyb21DdXJyRmlsZShjYWNoZWQgPSB0cnVlKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHRleHQgPSAoX2EgPSB3aW5kb3cgPT09IG51bGwgfHwgd2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpO1xuICAgIGlmICh0ZXh0KVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXRBY3RpdmVGaWxlQ29udGVudChjYWNoZWQpO1xufVxuLyoqXG4gKiBDaGVjayBpZiBgbm90ZU5hbWVgIGlzIHRoZSBuYW1lIG9mIGEgbm90ZSB0aGF0IGV4aXN0cyBpbiB0aGUgdmF1bHQuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5vdGVOYW1lIEJhc2VuYW1lIG9mIHRoZSBub3RlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IFtzb3VyY2VQYXRoPVwiXCJdIE9wdGlvbmFsIGZpbGUgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS4gRGVmYXVsdCBpcyB0aGUgY3VycmVudCBmaWxlLlxuICogQHJldHVybnMgYm9vbGVhblxuICovXG5leHBvcnQgY29uc3QgaXNJblZhdWx0ID0gKG5vdGVOYW1lLCBzb3VyY2VQYXRoID0gXCJcIikgPT4gISFhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub3RlTmFtZSwgc291cmNlUGF0aCk7XG4vKipcbiAqIFdoZW4gaG92ZXJpbmcgYSBsaW5rIGdvaW5nIHRvIGB0b2AsIHNob3cgdGhlIE9ic2lkaWFuIGhvdmVyLXByZXZpZXcgb2YgdGhhdCBub3RlLlxuICpcbiAqIFlvdSBwcm9iYWJseSBoYXZlIHRvIGhvbGQgZG93biBgQ3RybGAgd2hlbiBob3ZlcmluZyB0aGUgbGluayBmb3IgdGhlIHByZXZpZXcgdG8gYXBwZWFyIVxuICogQHBhcmFtICB7TW91c2VFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSAge1lvdXJWaWV3fSB2aWV3IFRoZSB2aWV3IHdpdGggdGhlIGxpbmsgYmVpbmcgaG92ZXJlZFxuICogQHBhcmFtICB7c3RyaW5nfSB0byBUaGUgYmFzZW5hbWUgb2YgdGhlIG5vdGUgdG8gcHJldmlldy5cbiAqIEB0ZW1wbGF0ZSBZb3VyVmlldyBUaGUgVmlld1R5cGUgb2YgeW91ciB2aWV3XG4gKiBAcmV0dXJucyB2b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob3ZlclByZXZpZXcoZXZlbnQsIHZpZXcsIHRvKSB7XG4gICAgY29uc3QgdGFyZ2V0RWwgPSBldmVudC50YXJnZXQ7XG4gICAgYXBwLndvcmtzcGFjZS50cmlnZ2VyKFwiaG92ZXItbGlua1wiLCB7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICBzb3VyY2U6IHZpZXcuZ2V0Vmlld1R5cGUoKSxcbiAgICAgICAgaG92ZXJQYXJlbnQ6IHZpZXcsXG4gICAgICAgIHRhcmdldEVsLFxuICAgICAgICBsaW5rdGV4dDogdG8sXG4gICAgfSk7XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBtYXJrZG93biBub3RlIG5hbWVkIGBuZXdOYW1lYCBpbiB0aGUgdXNlcidzIHByZWZmZXJlZCBuZXctbm90ZS1mb2xkZXIuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5ld05hbWUgTmFtZSBvZiBuZXcgbm90ZSAod2l0aCBvciB3aXRob3V0ICcubWQnKVxuICogQHBhcmFtICB7c3RyaW5nfSBbY3VyckZpbGVQYXRoPVwiXCJdIEZpbGUgcGF0aCBvZiB0aGUgY3VycmVudCBub3RlLiBVc2UgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBmaWxlLlxuICogQHJldHVybnMge1Byb21pc2U8VEZpbGU+fSBuZXcgVEZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld01ETm90ZShuZXdOYW1lLCBjdXJyRmlsZVBhdGggPSBcIlwiKSB7XG4gICAgY29uc3QgbmV3RmlsZUZvbGRlciA9IGFwcC5maWxlTWFuYWdlci5nZXROZXdGaWxlUGFyZW50KGN1cnJGaWxlUGF0aCkucGF0aDtcbiAgICBjb25zdCBuZXdGaWxlUGF0aCA9IG5vcm1hbGl6ZVBhdGgoYCR7bmV3RmlsZUZvbGRlcn0ke25ld0ZpbGVGb2xkZXIgPT09IFwiL1wiID8gXCJcIiA6IFwiL1wifSR7YWRkTUQobmV3TmFtZSl9YCk7XG4gICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUobmV3RmlsZVBhdGgsIFwiXCIpO1xufVxuLyoqXG4gKiBBZGQgJy5tZCcgdG8gYG5vdGVOYW1lYCBpZiBpdCBpc24ndCBhbHJlYWR5IHRoZXJlLlxuICogQHBhcmFtICB7c3RyaW5nfSBub3RlTmFtZSB3aXRoIG9yIHdpdGhvdXQgJy5tZCcgb24gdGhlIGVuZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IG5vdGVOYW1lIHdpdGggJy5tZCcgb24gdGhlIGVuZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFkZE1EID0gKG5vdGVOYW1lKSA9PiB7XG4gICAgcmV0dXJuIG5vdGVOYW1lLm1hdGNoKC9cXC5NRCR8XFwubWQkL20pID8gbm90ZU5hbWUgOiBub3RlTmFtZSArIFwiLm1kXCI7XG59O1xuLyoqXG4gKiBTdHJpcCAnLm1kJyBvZmYgdGhlIGVuZCBvZiBhIG5vdGUgbmFtZSB0byBnZXQgaXRzIGJhc2VuYW1lLlxuICpcbiAqIFdvcmtzIHdpdGggdGhlIGVkZ2VjYXNlIHdoZXJlIGEgbm90ZSBoYXMgJy5tZCcgaW4gaXRzIGJhc2VuYW1lOiBgT2JzaWRpYW4ubWQubWRgLCBmb3IgZXhhbXBsZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gbm90ZU5hbWUgd2l0aCBvciB3aXRob3V0ICcubWQnIG9uIHRoZSBlbmQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBub3RlTmFtZSB3aXRob3V0ICcubWQnXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpcE1EID0gKG5vdGVOYW1lKSA9PiB7XG4gICAgaWYgKG5vdGVOYW1lLm1hdGNoKC9cXC5NRCR8XFwubWQkL20pKSB7XG4gICAgICAgIHJldHVybiBub3RlTmFtZS5zcGxpdCgvXFwuTUQkfFxcLm1kJC9tKS5zbGljZSgwLCAtMSkuam9pbihcIi5tZFwiKTtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbm90ZU5hbWU7XG59O1xuLyoqXG4gKiBXaGVuIGNsaWNraW5nIGEgbGluaywgY2hlY2sgaWYgdGhhdCBub3RlIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGxlYWYsIGFuZCBzd2l0Y2ggdG8gdGhhdCBsZWFmLCBpZiBzby4gT3RoZXJ3aXNlLCBvcGVuIHRoZSBub3RlIGluIGEgbmV3IHBhbmUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGRlc3QgTmFtZSBvZiBub3RlIHRvIG9wZW4uIElmIHlvdSB3YW50IHRvIG9wZW4gYSBub24tbWQgbm90ZSwgYmUgc3VyZSB0byBhZGQgdGhlIGZpbGUgZXh0ZW5zaW9uLlxuICogQHBhcmFtICB7TW91c2VFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSAge3tjcmVhdGVOZXdGaWxlOmJvb2xlYW59fSBbb3B0aW9ucz17Y3JlYXRlTmV3RmlsZTp0cnVlfV0gV2hldGhlciBvciBub3QgdG8gY3JlYXRlIGBkZXN0YCBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIElmIGBmYWxzZWAsIHNpbXBseSByZXR1cm4gZnJvbSB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBQcm9taXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuT3JTd2l0Y2goZGVzdCwgZXZlbnQsIG9wdGlvbnMgPSB7IGNyZWF0ZU5ld0ZpbGU6IHRydWUgfSkge1xuICAgIGNvbnN0IHsgd29ya3NwYWNlIH0gPSBhcHA7XG4gICAgbGV0IGRlc3RGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVzdCwgXCJcIik7XG4gICAgLy8gSWYgZGVzdCBkb2Vzbid0IGV4aXN0LCBtYWtlIGl0XG4gICAgaWYgKCFkZXN0RmlsZSAmJiBvcHRpb25zLmNyZWF0ZU5ld0ZpbGUpIHtcbiAgICAgICAgZGVzdEZpbGUgPSBhd2FpdCBjcmVhdGVOZXdNRE5vdGUoZGVzdCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFkZXN0RmlsZSAmJiAhb3B0aW9ucy5jcmVhdGVOZXdGaWxlKVxuICAgICAgICByZXR1cm47XG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhbHJlYWR5IG9wZW5cbiAgICBjb25zdCBsZWF2ZXNXaXRoRGVzdEFscmVhZHlPcGVuID0gW107XG4gICAgLy8gRm9yIGFsbCBvcGVuIGxlYXZlcywgaWYgdGhlIGxlYXZlJ3MgYmFzZW5hbWUgaXMgZXF1YWwgdG8gdGhlIGxpbmsgZGVzdGluYXRpb24sIHJhdGhlciBhY3RpdmF0ZSB0aGF0IGxlYWYgaW5zdGVhZCBvZiBvcGVuaW5nIGl0IGluIHR3byBwYW5lc1xuICAgIHdvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykge1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IChfYSA9IGxlYWYudmlldykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbGU7XG4gICAgICAgICAgICBpZiAoZmlsZSAmJiBmaWxlLmJhc2VuYW1lICsgXCIuXCIgKyBmaWxlLmV4dGVuc2lvbiA9PT0gZGVzdCkge1xuICAgICAgICAgICAgICAgIGxlYXZlc1dpdGhEZXN0QWxyZWFkeU9wZW4ucHVzaChsZWFmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFJhdGhlciBzd2l0Y2ggdG8gaXQgaWYgaXQgaXMgb3BlblxuICAgIGlmIChsZWF2ZXNXaXRoRGVzdEFscmVhZHlPcGVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhdmVzV2l0aERlc3RBbHJlYWR5T3BlblswXSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IG1vZGUgPSBhcHAudmF1bHQuZ2V0Q29uZmlnKFwiZGVmYXVsdFZpZXdNb2RlXCIpO1xuICAgICAgICBjb25zdCBsZWFmID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5nZXRNb2RpZmllclN0YXRlKFwiTWV0YVwiKVxuICAgICAgICAgICAgPyB3b3Jrc3BhY2Uuc3BsaXRBY3RpdmVMZWFmKClcbiAgICAgICAgICAgIDogd29ya3NwYWNlLmdldFVucGlubmVkTGVhZigpO1xuICAgICAgICAvL0B0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgYXdhaXQgbGVhZi5vcGVuRmlsZShkZXN0RmlsZSwgeyBhY3RpdmU6IHRydWUsIG1vZGUgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgcmVzb2x2ZWQgbGlua3MgZnJvbSBhcHAubWV0YWRhdGFDYWNoZSwgY2hlY2sgaWYgYGZyb21gIGhhcyBhIGxpbmsgdG8gYHRvYFxuICogQHBhcmFtICB7UmVzb2x2ZWRMaW5rc30gcmVzb2x2ZWRMaW5rc1xuICogQHBhcmFtICB7c3RyaW5nfSBmcm9tIE5vdGUgbmFtZSB3aXRoIGxpbmsgbGVhdmluZyAoV2l0aCBvciB3aXRob3V0ICcubWQnKVxuICogQHBhcmFtICB7c3RyaW5nfSB0byBOb3RlIG5hbWUgd2l0aCBsaW5rIGFycml2aW5nIChXaXRoIG9yIHdpdGhvdXQgJy5tZCcpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtkaXJlY3RlZD10cnVlXSBPbmx5IGNoZWNrIGlmIGBmcm9tYCBoYXMgYSBsaW5rIHRvIGB0b2AuIElmIG5vdCBkaXJlY3RlZCwgY2hlY2sgaW4gYm90aCBkaXJlY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xpbmtlZChyZXNvbHZlZExpbmtzLCBmcm9tLCB0bywgZGlyZWN0ZWQgPSB0cnVlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBmcm9tID0gYWRkTUQoZnJvbSk7XG4gICAgdG8gPSBhZGRNRCh0byk7XG4gICAgY29uc3QgZnJvbVRvID0gKF9hID0gcmVzb2x2ZWRMaW5rc1tmcm9tXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhc093blByb3BlcnR5KHRvKTtcbiAgICBpZiAoIWZyb21UbyAmJiAhZGlyZWN0ZWQpIHtcbiAgICAgICAgY29uc3QgdG9Gcm9tID0gKF9iID0gcmVzb2x2ZWRMaW5rc1t0b10pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5oYXNPd25Qcm9wZXJ0eShmcm9tKTtcbiAgICAgICAgcmV0dXJuIHRvRnJvbTtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gZnJvbVRvO1xufVxuLyoqXG4gKiBDaGVjayBpZiB0aGUgbGluayBgZnJvbWAgXHUyMTkyIGB0b2AgaXMgcmVzb2x2ZWQgb3Igbm90LlxuICogQHBhcmFtICB7c3RyaW5nfSB0b1xuICogQHBhcmFtICB7c3RyaW5nfSBmcm9tXG4gKiBAcmV0dXJucyBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc29sdmVkKHRvLCBmcm9tKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHsgcmVzb2x2ZWRMaW5rcyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGU7XG4gICAgcmV0dXJuICgoX2EgPSByZXNvbHZlZExpbmtzID09PSBudWxsIHx8IHJlc29sdmVkTGlua3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc29sdmVkTGlua3NbYWRkTUQoZnJvbSldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbYWRkTUQodG8pXSkgPiAwO1xufVxuLyoqXG4gKiBPcGVuIHlvdXIgdmlldyBvbiB0aGUgY2hvc2VuIGBzaWRlYCBpZiBpdCBpc24ndCBhbHJlYWR5IG9wZW5cbiAqIEBwYXJhbSAge3N0cmluZ30gdmlld1R5cGVcbiAqIEBwYXJhbSAge0NvbnN0cnVjdG9yPFlvdXJWaWV3Pn0gdmlld0NsYXNzIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciBvZiB5b3VyIHZpZXdcbiAqIEBwYXJhbSAge1wibGVmdFwifFwicmlnaHRcIn0gW3NpZGU9XCJyaWdodFwiXVxuICogQHJldHVybnMge1Byb21pc2U8WW91clZpZXc+fSBUaGUgb3BlbmVkIHZpZXdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5WaWV3KHZpZXdUeXBlLCB2aWV3Q2xhc3MsIHNpZGUgPSBcInJpZ2h0XCIpIHtcbiAgICBsZXQgbGVhZiA9IG51bGw7XG4gICAgZm9yIChsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKHZpZXdUeXBlKSkge1xuICAgICAgICBpZiAobGVhZi52aWV3IGluc3RhbmNlb2Ygdmlld0NsYXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVhZi52aWV3O1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGxlYWYuc2V0Vmlld1N0YXRlKHsgdHlwZTogXCJlbXB0eVwiIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgbGVhZiA9XG4gICAgICAgIChsZWFmICE9PSBudWxsICYmIGxlYWYgIT09IHZvaWQgMCA/IGxlYWYgOiBzaWRlID09PSBcInJpZ2h0XCIpXG4gICAgICAgICAgICA/IGFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKVxuICAgICAgICAgICAgOiBhcHAud29ya3NwYWNlLmdldExlZnRMZWFmKGZhbHNlKTtcbiAgICBhd2FpdCBsZWFmLnNldFZpZXdTdGF0ZSh7XG4gICAgICAgIHR5cGU6IHZpZXdUeXBlLFxuICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGxlYWYudmlldztcbn1cbi8qKlxuICogQ2hlY2sgd2hpY2ggc2lkZSBvZiB0aGUgd29ya3NwYWNlIHlvdXIgYHZpZXdUeXBlYCBpcyBvbiwgYW5kIHNhdmUgaXQgaW50byBgcGx1Z2luLnNldHRpbmdzW3NldHRpbmdOYW1lXWAuXG4gKlxuICogKipUaXAqKjogUnVuIHRoaXMgZnVuY3Rpb24gb24gYHBsdWdpbi51bmxvYWRgIHRvIHNhdmUgdGhlIGxhc3Qgc2lkZSB5b3VyIHZpZXcgd2FzIG9uIHdoZW4gY2xvc2luZywgdGhlbiB7QGxpbmsgb3BlblZpZXd9IG9uIHRoZSBzYW1lIHNpZGUgaXQgd2FzIGxhc3QuXG4gKiBAcGFyYW0gIHtZb3VyUGx1Z2lufSBwbHVnaW5cbiAqIEBwYXJhbSAge3N0cmluZ30gdmlld1R5cGVcbiAqIEBwYXJhbSAge3N0cmluZ30gc2V0dGluZ05hbWVcbiAqIEByZXR1cm5zIHtcImxlZnRcIiB8IFwicmlnaHRcIn0gYHNpZGVgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlVmlld1NpZGUocGx1Z2luLCB2aWV3VHlwZSwgc2V0dGluZ05hbWUpIHtcbiAgICBjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodmlld1R5cGUpWzBdO1xuICAgIGlmICghbGVhZikge1xuICAgICAgICBjb25zb2xlLmluZm8oYE9ic2lkaWFuLUNvbW11bml0eS1MaWI6IE5vIGluc3RhbmNlIG9mICcke3ZpZXdUeXBlfScgb3BlbiwgY2Fubm90IHNhdmUgc2lkZWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vQHRzLWlnbm9yZVxuICAgIGNvbnN0IHNpZGUgPSBsZWFmLmdldFJvb3QoKS5zaWRlO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIHBsdWdpbi5zZXR0aW5nc1tzZXR0aW5nTmFtZV0gPSBzaWRlO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2lkZTtcbn1cbi8qKlxuICogQSBNb2RhbCB1c2VkIGluIHtAbGluayBhZGRSZW5kZXJlZE1hcmtkb3duQnV0dG9ufSB0byBkaXNwbGF5IHJlbmRlcmVkIG1hcmtkb3duIGZyb20gYSByYXcgc3RyaW5nLCBvciBmZXRjaGVkIGZyb20gYSBwcm92aWRlZCB1cmwuXG4gKlxuICogIVtdKGh0dHBzOi8vaS5pbWd1ci5jb20vTk13TTUwRS5wbmcpXG4gKiBAcGFyYW0gIHtZb3VyUGx1Z2lufSBwbHVnaW5cbiAqIEBwYXJhbSAge3N0cmluZ30gc291cmNlIFJhdyBtYXJrZG93biBjb250ZW50IG9yIHVybCB0byBmaW5kIHJhdyBtYXJrZG93bi5cbiAqIEBwYXJhbSAge2Jvb2xlYW59IGZldGNoIFRydWUgXHUyMTkyIGZldGNoIG1hcmtkb3duIGZyb20gYHNvdXJjZWAgYXMgdXJsLiBGYWxzZSBcdTIxOTIgYHNvdXJjZWAgaXMgYWxyZWFkeSBhIG1hcmtkb3duIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbmRlcmVkTWFya2Rvd25Nb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW4sIHNvdXJjZSwgZmV0Y2gpIHtcbiAgICAgICAgc3VwZXIoYXBwKTtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmZldGNoID0gZmV0Y2g7XG4gICAgfVxuICAgIGFzeW5jIG9uT3BlbigpIHtcbiAgICAgICAgbGV0IHsgY29udGVudEVsLCBzb3VyY2UsIHBsdWdpbiwgZmV0Y2ggfSA9IHRoaXM7XG4gICAgICAgIGxldCBjb250ZW50ID0gc291cmNlO1xuICAgICAgICBpZiAoZmV0Y2gpIHtcbiAgICAgICAgICAgIGNvbnRlbnRFbC5jcmVhdGVEaXYoeyB0ZXh0OiBgV2FpdGluZyBmb3IgY29udGVudCBmcm9tOiAnJHtzb3VyY2V9J2AgfSk7XG4gICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgcmVxdWVzdCh7IHVybDogc291cmNlIH0pO1xuICAgICAgICAgICAgY29udGVudEVsLmVtcHR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbG9nRGl2ID0gY29udGVudEVsLmNyZWF0ZURpdih7IGNsczogXCJPQ0wtUmVuZGVyZWRNYXJrZG93bk1vZGFsXCIgfSk7XG4gICAgICAgIE1hcmtkb3duUmVuZGVyZXIucmVuZGVyTWFya2Rvd24oY29udGVudCwgbG9nRGl2LCBcIlwiLCBwbHVnaW4pO1xuICAgIH1cbiAgICBvbkNsb3NlKCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xuICAgIH1cbn1cbi8qKlxuICogQWRkIGEgYnV0dG9uIHRvIGFuIEhUTUxFTGVtZW50LCB3aGljaCwgd2hlbiBjbGlja2VkLCBwb3BzIHVwIGEge0BsaW5rIFJlbmRlcmVkTWFya2Rvd25Nb2RhbH0gc2hvd2luZyByZW5kZXJlZCBtYXJrZG93bi5cbiAqXG4gKiBVc2UgYGZldGNoYCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBtYXJrZG93biBzdHJpbmcgbmVlZHMgdG8gYmUgZmV0Y2hlZCwgb3IgaWYgaXQgaGFzIGJlZW4gcHJvdmlkZWQgYXMgYSBzdHJpbmcgYWxyZWFkeS5cbiAqXG4gKiAhW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9IaTRneXl2LnBuZylcbiAqIEBwYXJhbSAge1lvdXJQbHVnaW59IHBsdWdpblxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lckVsIEhUTUxFbGVtZW50IHRvIGFkZCB0aGUgYnV0dG9uIHRvXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNvdXJjZSBSYXcgbWFya2Rvd24gY29udGVudCBvciB1cmwgdG8gZmluZCByYXcgbWFya2Rvd24uXG4gKiBAcGFyYW0gIHtib29sZWFufSBmZXRjaCBUcnVlIFx1MjE5MiBmZXRjaCBtYXJrZG93biBmcm9tIGBzb3VyY2VgIGFzIHVybC4gRmFsc2UgXHUyMTkyIGBzb3VyY2VgIGlzIGFscmVhZHkgYSBtYXJrZG93biBzdHJpbmcuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGRpc3BsYXlUZXh0IFRleHQgdG8gZGlzcGxheSBpbiB0aGUgYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkUmVuZGVyZWRNYXJrZG93bkJ1dHRvbihwbHVnaW4sIGNvbnRhaW5lckVsLCBzb3VyY2UsIGZldGNoLCBkaXNwbGF5VGV4dCkge1xuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHsgdGV4dDogZGlzcGxheVRleHQgfSwgKGJ1dCkgPT4gYnV0Lm9uQ2xpY2tFdmVudCgoKSA9PiB7XG4gICAgICAgIG5ldyBSZW5kZXJlZE1hcmtkb3duTW9kYWwocGx1Z2luLCBzb3VyY2UsIGZldGNoKS5vcGVuKCk7XG4gICAgfSkpO1xufVxuLyoqXG4gKiBDaGVjayBpZiBgYXBwLm1ldGFkYXRhQ2FjaGUuUmVzb2x2ZWRMaW5rc2AgaGF2ZSBmdWxseSBpbml0YWxpc2VkLlxuICpcbiAqIFVzZWQgd2l0aCB7QGxpbmsgd2FpdEZvclJlc29sdmVkTGlua3N9LlxuICogQHBhcmFtICB7bnVtYmVyfSBub0ZpbGVzIE51bWJlciBvZiBmaWxlcyBpbiB5b3VyIHZhdWx0LlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlZExpbmtzQ29tcGxldGUobm9GaWxlcykge1xuICAgIGNvbnN0IHsgcmVzb2x2ZWRMaW5rcyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGU7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc29sdmVkTGlua3MpLmxlbmd0aCA9PT0gbm9GaWxlcztcbn1cbi8qKlxuICogV2FpdCBmb3IgYGFwcC5tZXRhZGF0YUNhY2hlLlJlc29sdmVkTGlua3NgIHRvIGhhdmUgZnVsbHkgaW5pdGlhbGlzZWQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFtkZWxheT0xMDAwXSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiBlYWNoIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFttYXg9NTBdIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gY2hlY2sgYmVmb3JlIHRocm93aW5nIGFuIGVycm9yIGFuZCBicmVha2luZyBvdXQgb2YgdGhlIGxvb3AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yUmVzb2x2ZWRMaW5rcyhkZWxheSA9IDEwMDAsIG1heCA9IDUwKSB7XG4gICAgY29uc3Qgbm9GaWxlcyA9IGFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCkubGVuZ3RoO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoIXJlc29sdmVkTGlua3NDb21wbGV0ZShub0ZpbGVzKSAmJiBpIDwgbWF4KSB7XG4gICAgICAgIGF3YWl0IHdhaXQoZGVsYXkpO1xuICAgICAgICBpKys7XG4gICAgfVxuICAgIGlmIChpID09PSBtYXgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJPYnNpZGlhbi1Db21tdW5pdHktTGliOiBSZXNvbHZlZExpbmtzIGRpZCBub3QgZmluaXNoIGluaXRpYWxpc2luZy4gYG1heGAgaXRlcmF0aW9ucyB3YXMgcmVhY2hlZCBmaXJzdC5cIik7XG4gICAgfVxufVxuLyoqXG4gKiBDaGVjayBpZiB0aGUgY29udGVudCBvZiBhIG5vdGUgaGFzIFlBTUwuIElmIHNvLCByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIFlBTUwgYW5kIHRoZSByZXN0IG9mIHRoZSBub3RlLiBJZiBub3QsIHJldHVybiBgWycnLCBjb250ZW50XWBcbiAqIEBwYXJhbSAge3N0cmluZ30gY29udGVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRBdFlhbWwoY29udGVudCkge1xuICAgIGlmICghL14tLS1cXG4vLnRlc3QoY29udGVudCkpXG4gICAgICAgIHJldHVybiBbXCJcIiwgY29udGVudF07XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IGNvbnRlbnQuc3BsaXQoXCItLS1cIik7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBzcGxpdHMuc2xpY2UoMCwgMikuam9pbihcIi0tLVwiKSArIFwiLS0tXCIsXG4gICAgICAgICAgICBzcGxpdHMuc2xpY2UoMikuam9pbihcIi0tLVwiKSxcbiAgICAgICAgXTtcbiAgICB9XG59XG4vKipcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNhY2hlZCBSZXR1cm4gY2FjaGVkIGZpbGUgY29udGVudCAqKm9yKiogcmV0dXJuIHdoYXQncyBvbiBkaXNrLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFjdGl2ZUZpbGVDb250ZW50KGNhY2hlZCA9IHRydWUpIHtcbiAgICBjb25zdCBjdXJyRmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuICAgIGlmICghKGN1cnJGaWxlIGluc3RhbmNlb2YgVEZpbGUpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoY2FjaGVkKVxuICAgICAgICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoY3VyckZpbGUpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5yZWFkKGN1cnJGaWxlKTtcbn1cbiIsICI8IS0tIEB0cy1pZ25vcmUgLS0+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuICAgIGltcG9ydCB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG4gICAgaW1wb3J0IHsgaG92ZXJQcmV2aWV3IH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcbiAgICBpbXBvcnQgeyBGaWxlU3RhdHVzUmVzdWx0IH0gZnJvbSBcInNyYy90eXBlc1wiO1xuICAgIGltcG9ydCB7IGdldERpc3BsYXlQYXRoLCBnZXROZXdMZWFmIH0gZnJvbSBcInNyYy91dGlsc1wiO1xuICAgIGltcG9ydCBHaXRWaWV3IGZyb20gXCIuLi9zb3VyY2VDb250cm9sXCI7XG5cbiAgICBleHBvcnQgbGV0IGNoYW5nZTogRmlsZVN0YXR1c1Jlc3VsdDtcbiAgICBleHBvcnQgbGV0IHZpZXc6IEdpdFZpZXc7XG4gICAgJDogc2lkZSA9ICh2aWV3LmxlYWYuZ2V0Um9vdCgpIGFzIGFueSkuc2lkZSA9PSBcImxlZnRcIiA/IFwicmlnaHRcIiA6IFwibGVmdFwiO1xuXG4gICAgZnVuY3Rpb24gaG92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy9Eb24ndCBzaG93IHByZXZpZXdzIG9mIGNvbmZpZy0gb3IgaGlkZGVuIGZpbGVzLlxuICAgICAgICBpZiAoYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChjaGFuZ2UudmF1bHRfcGF0aCkpIHtcbiAgICAgICAgICAgIGhvdmVyUHJldmlldyhldmVudCwgdmlldyBhcyBhbnksIGNoYW5nZS52YXVsdF9wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9wZW4oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHZpZXcuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChjaGFuZ2UudmF1bHRfcGF0aCk7XG4gICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgICAgICAgIGdldE5ld0xlYWYoZXZlbnQpPy5vcGVuRmlsZShmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cbjwvc2NyaXB0PlxuXG48IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxuPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbm8tbm9uaW50ZXJhY3RpdmUtZWxlbWVudC1pbnRlcmFjdGlvbnMgLS0+XG48bWFpblxuICAgIG9uOm1vdXNlb3Zlcj17aG92ZXJ9XG4gICAgb246Y2xpY2t8c3RvcFByb3BhZ2F0aW9uPXtvcGVufVxuICAgIG9uOmF1eGNsaWNrfHN0b3BQcm9wYWdhdGlvbj17b3Blbn1cbiAgICBvbjpmb2N1c1xuICAgIGNsYXNzPVwidHJlZS1pdGVtIG5hdi1maWxlXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwidHJlZS1pdGVtLXNlbGYgaXMtY2xpY2thYmxlIG5hdi1maWxlLXRpdGxlXCJcbiAgICAgICAgZGF0YS1wYXRoPXtjaGFuZ2UudmF1bHRfcGF0aH1cbiAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPXtzaWRlfVxuICAgICAgICBhcmlhLWxhYmVsPXtjaGFuZ2UudmF1bHRfcGF0aH1cbiAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0cmVlLWl0ZW0taW5uZXIgbmF2LWZpbGUtdGl0bGUtY29udGVudFwiPlxuICAgICAgICAgICAge2dldERpc3BsYXlQYXRoKGNoYW5nZS52YXVsdF9wYXRoKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnaXQtdG9vbHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHlwZVwiIGRhdGEtdHlwZT17Y2hhbmdlLndvcmtpbmdfZGlyfVxuICAgICAgICAgICAgICAgID57Y2hhbmdlLndvcmtpbmdfZGlyfTwvc3BhblxuICAgICAgICAgICAgPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbWFpbj5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4gICAgbWFpbiB7XG4gICAgICAgIC5uYXYtZmlsZS10aXRsZSB7XG4gICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICB9XG4gICAgfVxuPC9zdHlsZT5cbiIsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuICAgIGltcG9ydCB7IHNldEljb24sIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG4gICAgaW1wb3J0IHsgaG92ZXJQcmV2aWV3IH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcbiAgICBpbXBvcnQgeyBESUZGX1ZJRVdfQ09ORklHIH0gZnJvbSBcInNyYy9jb25zdGFudHNcIjtcbiAgICBpbXBvcnQgeyBHaXRNYW5hZ2VyIH0gZnJvbSBcInNyYy9naXRNYW5hZ2VyL2dpdE1hbmFnZXJcIjtcbiAgICBpbXBvcnQgeyBGaWxlU3RhdHVzUmVzdWx0IH0gZnJvbSBcInNyYy90eXBlc1wiO1xuICAgIGltcG9ydCB7IGdldERpc3BsYXlQYXRoLCBnZXROZXdMZWFmIH0gZnJvbSBcInNyYy91dGlsc1wiO1xuICAgIGltcG9ydCBHaXRWaWV3IGZyb20gXCIuLi9zb3VyY2VDb250cm9sXCI7XG5cbiAgICBleHBvcnQgbGV0IGNoYW5nZTogRmlsZVN0YXR1c1Jlc3VsdDtcbiAgICBleHBvcnQgbGV0IHZpZXc6IEdpdFZpZXc7XG4gICAgZXhwb3J0IGxldCBtYW5hZ2VyOiBHaXRNYW5hZ2VyO1xuICAgIGxldCBidXR0b25zOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgJDogc2lkZSA9ICh2aWV3LmxlYWYuZ2V0Um9vdCgpIGFzIGFueSkuc2lkZSA9PSBcImxlZnRcIiA/IFwicmlnaHRcIiA6IFwibGVmdFwiO1xuXG4gICAgd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IGJ1dHRvbnMuZm9yRWFjaCgoYikgPT4gc2V0SWNvbihiLCBiLmdldEF0dHIoXCJkYXRhLWljb25cIikhKSksXG4gICAgICAgIDBcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gaG92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy9Eb24ndCBzaG93IHByZXZpZXdzIG9mIGNvbmZpZy0gb3IgaGlkZGVuIGZpbGVzLlxuICAgICAgICBpZiAoYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChjaGFuZ2UudmF1bHRfcGF0aCkpIHtcbiAgICAgICAgICAgIGhvdmVyUHJldmlldyhldmVudCwgdmlldyBhcyBhbnksIGNoYW5nZS52YXVsdF9wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9wZW4oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHZpZXcuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChjaGFuZ2UudmF1bHRfcGF0aCk7XG4gICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgICAgICAgIGdldE5ld0xlYWYoZXZlbnQpPy5vcGVuRmlsZShmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNob3dEaWZmKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGdldE5ld0xlYWYoZXZlbnQpPy5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgdHlwZTogRElGRl9WSUVXX0NPTkZJRy50eXBlLFxuICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAgICAgICBmaWxlOiBjaGFuZ2UucGF0aCxcbiAgICAgICAgICAgICAgICBzdGFnZWQ6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnN0YWdlKCkge1xuICAgICAgICBtYW5hZ2VyLnVuc3RhZ2UoY2hhbmdlLnBhdGgsIGZhbHNlKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuICAgICAgICB9KTtcbiAgICB9XG48L3NjcmlwdD5cblxuPCEtLSBzdmVsdGUtaWdub3JlIGExMXktY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cbjwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW5vLW5vbmludGVyYWN0aXZlLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxuPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxuPG1haW5cbiAgICBvbjptb3VzZW92ZXI9e2hvdmVyfVxuICAgIG9uOmZvY3VzXG4gICAgb246Y2xpY2t8c3RvcFByb3BhZ2F0aW9uPXtzaG93RGlmZn1cbiAgICBvbjphdXhjbGlja3xzdG9wUHJvcGFnYXRpb249e3Nob3dEaWZmfVxuICAgIGNsYXNzPVwidHJlZS1pdGVtIG5hdi1maWxlXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwidHJlZS1pdGVtLXNlbGYgaXMtY2xpY2thYmxlIG5hdi1maWxlLXRpdGxlXCJcbiAgICAgICAgY2xhc3M6aXMtYWN0aXZlPXt2aWV3LnBsdWdpbi5sYXN0RGlmZlZpZXdTdGF0ZT8uZmlsZSA9PVxuICAgICAgICAgICAgY2hhbmdlLnZhdWx0X3BhdGggJiZcbiAgICAgICAgICAgICF2aWV3LnBsdWdpbi5sYXN0RGlmZlZpZXdTdGF0ZT8uaGFzaCAmJlxuICAgICAgICAgICAgdmlldy5wbHVnaW4ubGFzdERpZmZWaWV3U3RhdGU/LnN0YWdlZH1cbiAgICAgICAgZGF0YS1wYXRoPXtjaGFuZ2UudmF1bHRfcGF0aH1cbiAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPXtzaWRlfVxuICAgICAgICBhcmlhLWxhYmVsPXtjaGFuZ2UudmF1bHRfcGF0aH1cbiAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0cmVlLWl0ZW0taW5uZXIgbmF2LWZpbGUtdGl0bGUtY29udGVudFwiPlxuICAgICAgICAgICAge2dldERpc3BsYXlQYXRoKGNoYW5nZS52YXVsdF9wYXRoKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnaXQtdG9vbHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgeyNpZiB2aWV3LmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoY2hhbmdlLnZhdWx0X3BhdGgpfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb249XCJnby10by1maWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJPcGVuIEZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYmluZDp0aGlzPXtidXR0b25zWzFdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb246Y2xpY2t8c3RvcFByb3BhZ2F0aW9uPXtvcGVufVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgey9pZn1cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbj1cIm1pbnVzXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlVuc3RhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBiaW5kOnRoaXM9e2J1dHRvbnNbMF19XG4gICAgICAgICAgICAgICAgICAgIG9uOmNsaWNrfHN0b3BQcm9wYWdhdGlvbj17dW5zdGFnZX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvblwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR5cGVcIiBkYXRhLXR5cGU9e2NoYW5nZS5pbmRleH0+e2NoYW5nZS5pbmRleH08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L21haW4+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuICAgIG1haW4ge1xuICAgICAgICAubmF2LWZpbGUtdGl0bGUge1xuICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgfVxuICAgIH1cbjwvc3R5bGU+XG4iLCAiPCEtLSB0c2xpbnQ6ZGlzYWJsZSB0cygyMzQ1KSAgLS0+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuICAgIGltcG9ydCBPYnNpZGlhbkdpdCBmcm9tIFwic3JjL21haW5cIjtcbiAgICBpbXBvcnQgeyBGaWxlVHlwZSwgU3RhdHVzUm9vdFRyZWVJdGVtLCBUcmVlSXRlbSB9IGZyb20gXCJzcmMvdHlwZXNcIjtcbiAgICBpbXBvcnQgeyBEaXNjYXJkTW9kYWwgfSBmcm9tIFwic3JjL3VpL21vZGFscy9kaXNjYXJkTW9kYWxcIjtcbiAgICBpbXBvcnQgeyBzbGlkZSB9IGZyb20gXCJzdmVsdGUvdHJhbnNpdGlvblwiO1xuICAgIGltcG9ydCBHaXRWaWV3IGZyb20gXCIuLi9zb3VyY2VDb250cm9sXCI7XG4gICAgaW1wb3J0IEZpbGVDb21wb25lbnQgZnJvbSBcIi4vZmlsZUNvbXBvbmVudC5zdmVsdGVcIjtcbiAgICBpbXBvcnQgUHVsbGVkRmlsZUNvbXBvbmVudCBmcm9tIFwiLi9wdWxsZWRGaWxlQ29tcG9uZW50LnN2ZWx0ZVwiO1xuICAgIGltcG9ydCBTdGFnZWRGaWxlQ29tcG9uZW50IGZyb20gXCIuL3N0YWdlZEZpbGVDb21wb25lbnQuc3ZlbHRlXCI7XG4gICAgZXhwb3J0IGxldCBoaWVyYXJjaHk6IFN0YXR1c1Jvb3RUcmVlSXRlbTtcbiAgICBleHBvcnQgbGV0IHBsdWdpbjogT2JzaWRpYW5HaXQ7XG4gICAgZXhwb3J0IGxldCB2aWV3OiBHaXRWaWV3O1xuICAgIGV4cG9ydCBsZXQgZmlsZVR5cGU6IEZpbGVUeXBlO1xuICAgIGV4cG9ydCBsZXQgdG9wTGV2ZWwgPSBmYWxzZTtcbiAgICBjb25zdCBjbG9zZWQ6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gICAgJDogc2lkZSA9ICh2aWV3LmxlYWYuZ2V0Um9vdCgpIGFzIGFueSkuc2lkZSA9PSBcImxlZnRcIiA/IFwicmlnaHRcIiA6IFwibGVmdFwiO1xuXG4gICAgZnVuY3Rpb24gc3RhZ2UocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHBsdWdpbi5naXRNYW5hZ2VyLnN0YWdlQWxsKHsgZGlyOiBwYXRoIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJnaXQtcmVmcmVzaFwiKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1bnN0YWdlKHBhdGg6IHN0cmluZykge1xuICAgICAgICBwbHVnaW4uZ2l0TWFuYWdlci51bnN0YWdlQWxsKHsgZGlyOiBwYXRoIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJnaXQtcmVmcmVzaFwiKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkaXNjYXJkKGl0ZW06IFRyZWVJdGVtKSB7XG4gICAgICAgIG5ldyBEaXNjYXJkTW9kYWwodmlldy5hcHAsIGZhbHNlLCBpdGVtLnZhdWx0UGF0aClcbiAgICAgICAgICAgIC5teU9wZW4oKVxuICAgICAgICAgICAgLnRoZW4oKHNob3VsZERpc2NhcmQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRGlzY2FyZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBwbHVnaW4uZ2l0TWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgLmRpc2NhcmRBbGwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogaXRlbS5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcGx1Z2luLmNhY2hlZFN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJnaXQtcmVmcmVzaFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9sZChpdGVtOiBUcmVlSXRlbSkge1xuICAgICAgICBjbG9zZWRbaXRlbS50aXRsZV0gPSAhY2xvc2VkW2l0ZW0udGl0bGVdO1xuICAgIH1cbjwvc2NyaXB0PlxuXG48IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxuPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxuPG1haW4gY2xhc3M6dG9wTGV2ZWw+XG4gICAgeyNlYWNoIGhpZXJhcmNoeS5jaGlsZHJlbiBhcyBlbnRpdHl9XG4gICAgICAgIHsjaWYgZW50aXR5LmRhdGF9XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHsjaWYgZmlsZVR5cGUgPT0gRmlsZVR5cGUuc3RhZ2VkfVxuICAgICAgICAgICAgICAgICAgICA8U3RhZ2VkRmlsZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPXtlbnRpdHkuZGF0YX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI9e3BsdWdpbi5naXRNYW5hZ2VyfVxuICAgICAgICAgICAgICAgICAgICAgICAge3ZpZXd9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgezplbHNlIGlmIGZpbGVUeXBlID09IEZpbGVUeXBlLmNoYW5nZWR9XG4gICAgICAgICAgICAgICAgICAgIDxGaWxlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9e2VudGl0eS5kYXRhfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj17cGx1Z2luLmdpdE1hbmFnZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICB7dmlld31cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7OmVsc2UgaWYgZmlsZVR5cGUgPT0gRmlsZVR5cGUucHVsbGVkfVxuICAgICAgICAgICAgICAgICAgICA8UHVsbGVkRmlsZUNvbXBvbmVudCBjaGFuZ2U9e2VudGl0eS5kYXRhfSB7dmlld30gLz5cbiAgICAgICAgICAgICAgICB7L2lmfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIHs6ZWxzZX1cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBvbjpjbGlja3xzdG9wUHJvcGFnYXRpb249eygpID0+IGZvbGQoZW50aXR5KX1cbiAgICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtaXRlbSBuYXYtZm9sZGVyXCJcbiAgICAgICAgICAgICAgICBjbGFzczppcy1jb2xsYXBzZWQ9e2Nsb3NlZFtlbnRpdHkudGl0bGVdfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cmVlLWl0ZW0tc2VsZiBpcy1jbGlja2FibGUgbmF2LWZvbGRlci10aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdG9vbHRpcC1wb3NpdGlvbj17c2lkZX1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17ZW50aXR5LnZhdWx0UGF0aH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbj1cImZvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDVweDsgZGlzcGxheTogZmxleDsgXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cmVlLWl0ZW0taWNvbiBuYXYtZm9sZGVyLWNvbGxhcHNlLWluZGljYXRvciBjb2xsYXBzZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOmlzLWNvbGxhcHNlZD17Y2xvc2VkW2VudGl0eS50aXRsZV19XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3ZnLWljb24gcmlnaHQtdHJpYW5nbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48cGF0aCBkPVwiTTMgOEwxMiAxN0wyMSA4XCIgLz48L3N2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyZWUtaXRlbS1pbm5lciBuYXYtZm9sZGVyLXRpdGxlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtlbnRpdHkudGl0bGV9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2l0LXRvb2xzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsjaWYgZmlsZVR5cGUgPT0gRmlsZVR5cGUuc3RhZ2VkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb249XCJtaW51c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiVW5zdGFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjpjbGlja3xzdG9wUHJvcGFnYXRpb249eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdGFnZShlbnRpdHkucGF0aCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsaWNrYWJsZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdmctaWNvbiBsdWNpZGUtbWludXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48bGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MT1cIjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MT1cIjlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Mj1cIjE0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI9XCI5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPjwvc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs6ZWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uPVwidW5kb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGlzY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjpjbGlja3xzdG9wUHJvcGFnYXRpb249eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZChlbnRpdHkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3ZnLWljb24gbHVjaWRlLXVuZG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48cGF0aCBkPVwiTTMgN3Y2aDZcIiAvPjxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjEgMTdhOSA5IDAgMCAwLTktOSA5IDkgMCAwIDAtNiAyLjNMMyAxM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz48L3N2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uPVwicGx1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU3RhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246Y2xpY2t8c3RvcFByb3BhZ2F0aW9uPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlKGVudGl0eS5wYXRoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xpY2thYmxlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTggMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN2Zy1pY29uIGx1Y2lkZS1wbHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDE9XCI5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE9XCI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDI9XCI5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI9XCIxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz48bGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MT1cIjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MT1cIjlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Mj1cIjE0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI9XCI5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPjwvc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsvaWZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOjExcHhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgeyNpZiAhY2xvc2VkW2VudGl0eS50aXRsZV19XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJlZS1pdGVtLWNoaWxkcmVuIG5hdi1mb2xkZXItY2hpbGRyZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjpzbGlkZXxsb2NhbD17eyBkdXJhdGlvbjogMTUwIH19XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmVsdGU6c2VsZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeT17ZW50aXR5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwbHVnaW59XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZpZXd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZpbGVUeXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgey9pZn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB7L2lmfVxuICAgIHsvZWFjaH1cbjwvbWFpbj5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4gICAgbWFpbiB7XG4gICAgICAgIC5uYXYtZm9sZGVyLXRpdGxlIHtcbiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cbiAgICB9XG48L3N0eWxlPlxuIiwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XG4gICAgaW1wb3J0IHsgUGxhdGZvcm0sIHNldEljb24gfSBmcm9tIFwib2JzaWRpYW5cIjtcbiAgICBpbXBvcnQgeyBTT1VSQ0VfQ09OVFJPTF9WSUVXX0NPTkZJRyB9IGZyb20gXCJzcmMvY29uc3RhbnRzXCI7XG4gICAgaW1wb3J0IE9ic2lkaWFuR2l0IGZyb20gXCJzcmMvbWFpblwiO1xuICAgIGltcG9ydCB7XG4gICAgICAgIEZpbGVTdGF0dXNSZXN1bHQsXG4gICAgICAgIEZpbGVUeXBlLFxuICAgICAgICBQbHVnaW5TdGF0ZSxcbiAgICAgICAgU3RhdHVzLFxuICAgICAgICBTdGF0dXNSb290VHJlZUl0ZW0sXG4gICAgfSBmcm9tIFwic3JjL3R5cGVzXCI7XG4gICAgaW1wb3J0IHsgZ2V0RGlzcGxheVBhdGggfSBmcm9tIFwic3JjL3V0aWxzXCI7XG4gICAgaW1wb3J0IHsgb25EZXN0cm95IH0gZnJvbSBcInN2ZWx0ZVwiO1xuICAgIGltcG9ydCB7IHNsaWRlIH0gZnJvbSBcInN2ZWx0ZS90cmFuc2l0aW9uXCI7XG4gICAgaW1wb3J0IHsgRGlzY2FyZE1vZGFsIH0gZnJvbSBcIi4uL21vZGFscy9kaXNjYXJkTW9kYWxcIjtcbiAgICBpbXBvcnQgRmlsZUNvbXBvbmVudCBmcm9tIFwiLi9jb21wb25lbnRzL2ZpbGVDb21wb25lbnQuc3ZlbHRlXCI7XG4gICAgaW1wb3J0IFB1bGxlZEZpbGVDb21wb25lbnQgZnJvbSBcIi4vY29tcG9uZW50cy9wdWxsZWRGaWxlQ29tcG9uZW50LnN2ZWx0ZVwiO1xuICAgIGltcG9ydCBTdGFnZWRGaWxlQ29tcG9uZW50IGZyb20gXCIuL2NvbXBvbmVudHMvc3RhZ2VkRmlsZUNvbXBvbmVudC5zdmVsdGVcIjtcbiAgICBpbXBvcnQgVHJlZUNvbXBvbmVudCBmcm9tIFwiLi9jb21wb25lbnRzL3RyZWVDb21wb25lbnQuc3ZlbHRlXCI7XG4gICAgaW1wb3J0IEdpdFZpZXcgZnJvbSBcIi4vc291cmNlQ29udHJvbFwiO1xuXG4gICAgZXhwb3J0IGxldCBwbHVnaW46IE9ic2lkaWFuR2l0O1xuICAgIGV4cG9ydCBsZXQgdmlldzogR2l0VmlldztcbiAgICBsZXQgbG9hZGluZzogYm9vbGVhbjtcbiAgICBsZXQgc3RhdHVzOiBTdGF0dXMgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGxhc3RQdWxsZWRGaWxlczogRmlsZVN0YXR1c1Jlc3VsdFtdID0gW107XG4gICAgbGV0IGNvbW1pdE1lc3NhZ2UgPSBwbHVnaW4uc2V0dGluZ3MuY29tbWl0TWVzc2FnZTtcbiAgICBsZXQgYnV0dG9uczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGxldCBjaGFuZ2VIaWVyYXJjaHk6IFN0YXR1c1Jvb3RUcmVlSXRlbSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RhZ2VkSGllcmFyY2h5OiBTdGF0dXNSb290VHJlZUl0ZW0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGxhc3RQdWxsZWRGaWxlc0hpZXJhcmNoeTogU3RhdHVzUm9vdFRyZWVJdGVtO1xuICAgIGxldCBjaGFuZ2VzT3BlbiA9IHRydWU7XG4gICAgbGV0IHN0YWdlZE9wZW4gPSB0cnVlO1xuICAgIGxldCBsYXN0UHVsbGVkRmlsZXNPcGVuID0gdHJ1ZTtcblxuICAgIGxldCBzaG93VHJlZSA9IHBsdWdpbi5zZXR0aW5ncy50cmVlU3RydWN0dXJlO1xuICAgIGxldCBsYXlvdXRCdG46IEhUTUxFbGVtZW50O1xuICAgICQ6IHtcbiAgICAgICAgaWYgKGxheW91dEJ0bikge1xuICAgICAgICAgICAgbGF5b3V0QnRuLmVtcHR5KCk7XG4gICAgICAgICAgICBzZXRJY29uKGxheW91dEJ0biwgc2hvd1RyZWUgPyBcImxpc3RcIiA6IFwiZm9sZGVyXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJnaXQtdmlldy1yZWZyZXNoXCIsIHJlZnJlc2gpO1xuICAgIC8vVGhpcyBzaG91bGQgZ28gaW4gdGhlIG9uTW91bnQgY2FsbGJhY2ssIGZvciBzb21lIHJlYXNvbiBpdCBkb2Vzbid0IGZpcmUgdGhvdWdoXG4gICAgLy9zZXRUaW1lb3V0J3MgY2FsbGJhY2sgd2lsbCBleGVjdXRlIGFmdGVyIHRoZSBjdXJyZW50IGV2ZW50IGxvb3AgZmluaXNoZXMuXG4gICAgcGx1Z2luLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSgoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnRuKSA9PiBzZXRJY29uKGJ0biwgYnRuLmdldEF0dHIoXCJkYXRhLWljb25cIikhKSk7XG4gICAgICAgICAgICBzZXRJY29uKGxheW91dEJ0biwgc2hvd1RyZWUgPyBcImxpc3RcIiA6IFwiZm9sZGVyXCIpO1xuICAgICAgICB9LCAwKTtcbiAgICB9KTtcbiAgICBvbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwiZ2l0LXZpZXctcmVmcmVzaFwiLCByZWZyZXNoKTtcbiAgICB9KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGNvbW1pdCgpIHtcbiAgICAgICAgbG9hZGluZyA9IHRydWU7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBwbHVnaW4uaGFzVG9vQmlnRmlsZXMoc3RhdHVzLnN0YWdlZCkpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGx1Z2luLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+XG4gICAgICAgICAgICAgICAgcGx1Z2luLmdpdE1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgLmNvbW1pdCh7IG1lc3NhZ2U6IGNvbW1pdE1lc3NhZ2UgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1pdE1lc3NhZ2UgIT09IHBsdWdpbi5zZXR0aW5ncy5jb21taXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0TWVzc2FnZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0VXBBdXRvQmFja3VwKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maW5hbGx5KHRyaWdnZXJSZWZyZXNoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGJhY2t1cCgpIHtcbiAgICAgICAgbG9hZGluZyA9IHRydWU7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHBsdWdpbi5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PlxuICAgICAgICAgICAgICAgIHBsdWdpblxuICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQmFja3VwKGZhbHNlLCBmYWxzZSwgY29tbWl0TWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1pdE1lc3NhZ2UgIT09IHBsdWdpbi5zZXR0aW5ncy5jb21taXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0TWVzc2FnZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maW5hbGx5KHRyaWdnZXJSZWZyZXNoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgICAgIGlmICghcGx1Z2luLmdpdFJlYWR5KSB7XG4gICAgICAgICAgICBzdGF0dXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdW5QdXNoZWRDb21taXRzID0gYXdhaXQgcGx1Z2luLmdpdE1hbmFnZXIuZ2V0VW5wdXNoZWRDb21taXRzKCk7XG5cbiAgICAgICAgYnV0dG9ucy5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgICAgIGlmIChQbGF0Zm9ybS5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgIGJ0bi5yZW1vdmVDbGFzcyhcImJ1dHRvbi1ib3JkZXJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGJ0bi5pZCA9PSBcInB1c2hcIiAmJiB1blB1c2hlZENvbW1pdHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ0bi5hZGRDbGFzcyhcImJ1dHRvbi1ib3JkZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBidG4uZmlyc3RFbGVtZW50Q2hpbGQ/LnJlbW92ZUF0dHJpYnV0ZShcImNvbG9yXCIpO1xuICAgICAgICAgICAgICAgIGlmIChidG4uaWQgPT0gXCJwdXNoXCIgJiYgdW5QdXNoZWRDb21taXRzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBidG4uZmlyc3RFbGVtZW50Q2hpbGQ/LnNldEF0dHIoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInZhcigtLXRleHQtYWNjZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBzdGF0dXMgPSBwbHVnaW4uY2FjaGVkU3RhdHVzO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwbHVnaW4ubGFzdFB1bGxlZEZpbGVzICYmXG4gICAgICAgICAgICBwbHVnaW4ubGFzdFB1bGxlZEZpbGVzICE9IGxhc3RQdWxsZWRGaWxlc1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGxhc3RQdWxsZWRGaWxlcyA9IHBsdWdpbi5sYXN0UHVsbGVkRmlsZXM7XG5cbiAgICAgICAgICAgIGxhc3RQdWxsZWRGaWxlc0hpZXJhcmNoeSA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJcIixcbiAgICAgICAgICAgICAgICBwYXRoOiBcIlwiLFxuICAgICAgICAgICAgICAgIHZhdWx0UGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogcGx1Z2luLmdpdE1hbmFnZXIuZ2V0VHJlZVN0cnVjdHVyZShsYXN0UHVsbGVkRmlsZXMpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ID0gKGE6IEZpbGVTdGF0dXNSZXN1bHQsIGI6IEZpbGVTdGF0dXNSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS52YXVsdF9wYXRoXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgICAgICAgICAgICAgICAgLmxhc3QoKSFcbiAgICAgICAgICAgICAgICAgICAgLmxvY2FsZUNvbXBhcmUoZ2V0RGlzcGxheVBhdGgoYi52YXVsdF9wYXRoKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc3RhdHVzLmNoYW5nZWQuc29ydChzb3J0KTtcbiAgICAgICAgICAgIHN0YXR1cy5zdGFnZWQuc29ydChzb3J0KTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMuY2hhbmdlZC5sZW5ndGggKyBzdGF0dXMuc3RhZ2VkLmxlbmd0aCA+IDUwMCkge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoIXBsdWdpbi5sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5kaXNwbGF5RXJyb3IoXCJUb28gbWFueSBjaGFuZ2VzIHRvIGRpc3BsYXlcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VIaWVyYXJjaHkgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICB2YXVsdFBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBwbHVnaW4uZ2l0TWFuYWdlci5nZXRUcmVlU3RydWN0dXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHN0YWdlZEhpZXJhcmNoeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhdWx0UGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IHBsdWdpbi5naXRNYW5hZ2VyLmdldFRyZWVTdHJ1Y3R1cmUoc3RhdHVzLnN0YWdlZCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoYW5nZUhpZXJhcmNoeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHN0YWdlZEhpZXJhcmNoeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsb2FkaW5nID0gcGx1Z2luLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJpZ2dlclJlZnJlc2goKSB7XG4gICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZ2l0LXJlZnJlc2hcIikpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YWdlQWxsKCkge1xuICAgICAgICBsb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgcGx1Z2luLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+XG4gICAgICAgICAgICBwbHVnaW4uZ2l0TWFuYWdlclxuICAgICAgICAgICAgICAgIC5zdGFnZUFsbCh7IHN0YXR1czogc3RhdHVzIH0pXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkodHJpZ2dlclJlZnJlc2gpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5zdGFnZUFsbCgpIHtcbiAgICAgICAgbG9hZGluZyA9IHRydWU7XG4gICAgICAgIHBsdWdpbi5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PlxuICAgICAgICAgICAgcGx1Z2luLmdpdE1hbmFnZXJcbiAgICAgICAgICAgICAgICAudW5zdGFnZUFsbCh7IHN0YXR1czogc3RhdHVzIH0pXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkodHJpZ2dlclJlZnJlc2gpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHVzaCgpIHtcbiAgICAgICAgbG9hZGluZyA9IHRydWU7XG4gICAgICAgIHBsdWdpbi5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PlxuICAgICAgICAgICAgcGx1Z2luLnB1c2goKS5maW5hbGx5KHRyaWdnZXJSZWZyZXNoKVxuICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsKCkge1xuICAgICAgICBsb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgcGx1Z2luLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+XG4gICAgICAgICAgICBwbHVnaW4ucHVsbENoYW5nZXNGcm9tUmVtb3RlKCkuZmluYWxseSh0cmlnZ2VyUmVmcmVzaClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzY2FyZCgpIHtcbiAgICAgICAgbmV3IERpc2NhcmRNb2RhbChcbiAgICAgICAgICAgIHZpZXcuYXBwLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBwbHVnaW4uZ2l0TWFuYWdlci5nZXRSZWxhdGl2ZVZhdWx0UGF0aChcIi9cIilcbiAgICAgICAgKVxuICAgICAgICAgICAgLm15T3BlbigpXG4gICAgICAgICAgICAudGhlbigoc2hvdWxkRGlzY2FyZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGREaXNjYXJkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmdpdE1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlzY2FyZEFsbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcGx1Z2luLmNhY2hlZFN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJnaXQtcmVmcmVzaFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAkOiByb3dzID0gKGNvbW1pdE1lc3NhZ2UubWF0Y2goL1xcbi9nKSB8fCBbXSkubGVuZ3RoICsgMSB8fCAxO1xuPC9zY3JpcHQ+XG5cbjwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LWNsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XG48IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgLS0+XG48bWFpbiBkYXRhLXR5cGU9e1NPVVJDRV9DT05UUk9MX1ZJRVdfQ09ORklHLnR5cGV9PlxuICAgIDxkaXYgY2xhc3M9XCJuYXYtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBpZD1cImJhY2t1cC1idG5cIlxuICAgICAgICAgICAgICAgIGRhdGEtaWNvbj1cImFycm93LXVwLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvbiBuYXYtYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkJhY2t1cFwiXG4gICAgICAgICAgICAgICAgYmluZDp0aGlzPXtidXR0b25zWzVdfVxuICAgICAgICAgICAgICAgIG9uOmNsaWNrPXtiYWNrdXB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGlkPVwiY29tbWl0LWJ0blwiXG4gICAgICAgICAgICAgICAgZGF0YS1pY29uPVwiY2hlY2tcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xpY2thYmxlLWljb24gbmF2LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb21taXRcIlxuICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17YnV0dG9uc1swXX1cbiAgICAgICAgICAgICAgICBvbjpjbGljaz17Y29tbWl0fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBpZD1cInN0YWdlLWFsbFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvbiBuYXYtYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgZGF0YS1pY29uPVwicGx1cy1jaXJjbGVcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTdGFnZSBhbGxcIlxuICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17YnV0dG9uc1sxXX1cbiAgICAgICAgICAgICAgICBvbjpjbGljaz17c3RhZ2VBbGx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGlkPVwidW5zdGFnZS1hbGxcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xpY2thYmxlLWljb24gbmF2LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgIGRhdGEtaWNvbj1cIm1pbnVzLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlVuc3RhZ2UgYWxsXCJcbiAgICAgICAgICAgICAgICBiaW5kOnRoaXM9e2J1dHRvbnNbMl19XG4gICAgICAgICAgICAgICAgb246Y2xpY2s9e3Vuc3RhZ2VBbGx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGlkPVwicHVzaFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvbiBuYXYtYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgZGF0YS1pY29uPVwidXBsb2FkXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHVzaFwiXG4gICAgICAgICAgICAgICAgYmluZDp0aGlzPXtidXR0b25zWzNdfVxuICAgICAgICAgICAgICAgIG9uOmNsaWNrPXtwdXNofVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBpZD1cInB1bGxcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xpY2thYmxlLWljb24gbmF2LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgIGRhdGEtaWNvbj1cImRvd25sb2FkXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHVsbFwiXG4gICAgICAgICAgICAgICAgYmluZDp0aGlzPXtidXR0b25zWzRdfVxuICAgICAgICAgICAgICAgIG9uOmNsaWNrPXtwdWxsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBpZD1cImxheW91dENoYW5nZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvbiBuYXYtYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNoYW5nZSBMYXlvdXRcIlxuICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17bGF5b3V0QnRufVxuICAgICAgICAgICAgICAgIG9uOmNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNob3dUcmVlID0gIXNob3dUcmVlO1xuICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MudHJlZVN0cnVjdHVyZSA9IHNob3dUcmVlO1xuICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgaWQ9XCJyZWZyZXNoXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNsaWNrYWJsZS1pY29uIG5hdi1hY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzczpsb2FkaW5nXG4gICAgICAgICAgICAgICAgZGF0YS1pY29uPVwicmVmcmVzaC1jd1wiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlZnJlc2hcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luOiAxcHg7XCJcbiAgICAgICAgICAgICAgICBiaW5kOnRoaXM9e2J1dHRvbnNbNl19XG4gICAgICAgICAgICAgICAgb246Y2xpY2s9e3RyaWdnZXJSZWZyZXNofVxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImdpdC1jb21taXQtbXNnXCI+XG4gICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAge3Jvd3N9XG4gICAgICAgICAgICBjbGFzcz1cImNvbW1pdC1tc2ctaW5wdXRcIlxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cInRydWVcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb21taXQgTWVzc2FnZVwiXG4gICAgICAgICAgICBiaW5kOnZhbHVlPXtjb21taXRNZXNzYWdlfVxuICAgICAgICAvPlxuICAgICAgICB7I2lmIGNvbW1pdE1lc3NhZ2V9XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJnaXQtY29tbWl0LW1zZy1jbGVhci1idXR0b25cIlxuICAgICAgICAgICAgICAgIG9uOmNsaWNrPXsoKSA9PiAoY29tbWl0TWVzc2FnZSA9IFwiXCIpfVxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e1wiQ2xlYXJcIn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgIHsvaWZ9XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWZpbGVzLWNvbnRhaW5lclwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiPlxuICAgICAgICB7I2lmIHN0YXR1cyAmJiBzdGFnZWRIaWVyYXJjaHkgJiYgY2hhbmdlSGllcmFyY2h5fVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyZWUtaXRlbSBuYXYtZm9sZGVyIG1vZC1yb290XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyZWUtaXRlbS1jaGlsZHJlbiBuYXYtZm9sZGVyLWNoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhZ2VkIHRyZWUtaXRlbSBuYXYtZm9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOmlzLWNvbGxhcHNlZD17IXN0YWdlZE9wZW59XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtaXRlbS1zZWxmIGlzLWNsaWNrYWJsZSBuYXYtZm9sZGVyLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjpjbGljaz17KCkgPT4gKHN0YWdlZE9wZW4gPSAhc3RhZ2VkT3Blbil9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtaXRlbS1pY29uIG5hdi1mb2xkZXItY29sbGFwc2UtaW5kaWNhdG9yIGNvbGxhcHNlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczppcy1jb2xsYXBzZWQ9eyFzdGFnZWRPcGVufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN2Zy1pY29uIHJpZ2h0LXRyaWFuZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48cGF0aCBkPVwiTTMgOEwxMiAxN0wyMSA4XCIgLz48L3N2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtaXRlbS1pbm5lciBuYXYtZm9sZGVyLXRpdGxlLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2VkIENoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnaXQtdG9vbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb249XCJtaW51c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlVuc3RhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17YnV0dG9uc1s4XX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjpjbGlja3xzdG9wUHJvcGFnYXRpb249e3Vuc3RhZ2VBbGx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdmctaWNvbiBsdWNpZGUtbWludXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxPVwiNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MT1cIjlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDI9XCIxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Mj1cIjlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPjwvc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZXMtY291bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdGF0dXMuc3RhZ2VkLmxlbmd0aH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsjaWYgc3RhZ2VkT3Blbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJlZS1pdGVtLWNoaWxkcmVuIG5hdi1mb2xkZXItY2hpbGRyZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOnNsaWRlfGxvY2FsPXt7IGR1cmF0aW9uOiAxNTAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsjaWYgc2hvd1RyZWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VHJlZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeT17c3RhZ2VkSGllcmFyY2h5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwbHVnaW59XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZpZXd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGU9e0ZpbGVUeXBlLnN0YWdlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZXZlbD17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs6ZWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsjZWFjaCBzdGF0dXMuc3RhZ2VkIGFzIHN0YWdlZEZpbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN0YWdlZEZpbGVDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPXtzdGFnZWRGaWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmlld31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj17cGx1Z2luLmdpdE1hbmFnZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsvZWFjaH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey9pZn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsvaWZ9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoYW5nZXMgdHJlZS1pdGVtIG5hdi1mb2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6aXMtY29sbGFwc2VkPXshY2hhbmdlc09wZW59XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjpjbGljaz17KCkgPT4gKGNoYW5nZXNPcGVuID0gIWNoYW5nZXNPcGVuKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtaXRlbS1zZWxmIGlzLWNsaWNrYWJsZSBuYXYtZm9sZGVyLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJlZS1pdGVtLWljb24gbmF2LWZvbGRlci1jb2xsYXBzZS1pbmRpY2F0b3IgY29sbGFwc2UtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOmlzLWNvbGxhcHNlZD17IWNoYW5nZXNPcGVufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN2Zy1pY29uIHJpZ2h0LXRyaWFuZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48cGF0aCBkPVwiTTMgOEwxMiAxN0wyMSA4XCIgLz48L3N2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJlZS1pdGVtLWlubmVyIG5hdi1mb2xkZXItdGl0bGUtY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdpdC10b29sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbj1cInVuZG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEaXNjYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjpjbGlja3xzdG9wUHJvcGFnYXRpb249e2Rpc2NhcmR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3ZnLWljb24gbHVjaWRlLXVuZG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PHBhdGggZD1cIk0zIDd2Nmg2XCIgLz48cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMSAxN2E5IDkgMCAwIDAtOS05IDkgOSAwIDAgMC02IDIuM0wzIDEzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz48L3N2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbj1cInBsdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTdGFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZDp0aGlzPXtidXR0b25zWzldfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOmNsaWNrfHN0b3BQcm9wYWdhdGlvbj17c3RhZ2VBbGx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3ZnLWljb24gbHVjaWRlLXBsdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxPVwiMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyPVwiMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI9XCIxOVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+PGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyPVwiMTlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI9XCIxMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+PC9zdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlcy1jb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0YXR1cy5jaGFuZ2VkLmxlbmd0aH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsjaWYgY2hhbmdlc09wZW59XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtaXRlbS1jaGlsZHJlbiBuYXYtZm9sZGVyLWNoaWxkcmVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjpzbGlkZXxsb2NhbD17eyBkdXJhdGlvbjogMTUwIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7I2lmIHNob3dUcmVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRyZWVDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaHk9e2NoYW5nZUhpZXJhcmNoeX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGx1Z2lufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2aWV3fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlPXtGaWxlVHlwZS5jaGFuZ2VkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcExldmVsPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezplbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNlYWNoIHN0YXR1cy5jaGFuZ2VkIGFzIGNoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmlsZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmlld31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj17cGx1Z2luLmdpdE1hbmFnZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOmdpdC1yZWZyZXNoPXt0cmlnZ2VyUmVmcmVzaH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey9lYWNofVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7L2lmfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgey9pZn1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIHsjaWYgbGFzdFB1bGxlZEZpbGVzLmxlbmd0aCA+IDB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwdWxsZWQgbmF2LWZvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6aXMtY29sbGFwc2VkPXshbGFzdFB1bGxlZEZpbGVzT3Blbn1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJlZS1pdGVtLXNlbGYgaXMtY2xpY2thYmxlIG5hdi1mb2xkZXItdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjpjbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0UHVsbGVkRmlsZXNPcGVuID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbGFzdFB1bGxlZEZpbGVzT3Blbil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtaXRlbS1pY29uIG5hdi1mb2xkZXItY29sbGFwc2UtaW5kaWNhdG9yIGNvbGxhcHNlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN2Zy1pY29uIHJpZ2h0LXRyaWFuZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PHBhdGggZD1cIk0zIDhMMTIgMTdMMjEgOFwiIC8+PC9zdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cmVlLWl0ZW0taW5uZXIgbmF2LWZvbGRlci10aXRsZS1jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjZW50bHkgUHVsbGVkIEZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1pdGVtLWZsYWlyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57bGFzdFB1bGxlZEZpbGVzLmxlbmd0aH08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsjaWYgbGFzdFB1bGxlZEZpbGVzT3Blbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cmVlLWl0ZW0tY2hpbGRyZW4gbmF2LWZvbGRlci1jaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOnNsaWRlfGxvY2FsPXt7IGR1cmF0aW9uOiAxNTAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNpZiBzaG93VHJlZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VHJlZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaHk9e2xhc3RQdWxsZWRGaWxlc0hpZXJhcmNoeX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BsdWdpbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZpZXd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlPXtGaWxlVHlwZS5wdWxsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcExldmVsPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OmVsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNlYWNoIGxhc3RQdWxsZWRGaWxlcyBhcyBjaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQdWxsZWRGaWxlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZpZXd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjpnaXQtcmVmcmVzaD17dHJpZ2dlclJlZnJlc2h9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey9lYWNofVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey9pZn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgey9pZn1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB7L2lmfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIHsvaWZ9XG4gICAgPC9kaXY+XG48L21haW4+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuICAgIC5jb21taXQtbXNnLWlucHV0IHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICAgICAgcGFkZGluZzogN3B4IDVweDtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1mb3JtLWZpZWxkKTtcbiAgICB9XG5cbiAgICAuZ2l0LWNvbW1pdC1tc2cge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSB2YXIoLS1zaXplLTQtOCkpO1xuICAgICAgICBtYXJnaW46IDRweCBhdXRvO1xuICAgIH1cbiAgICBtYWluIHtcbiAgICAgICAgLmdpdC10b29scyB7XG4gICAgICAgICAgICAuZmlsZXMtY291bnQge1xuICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogdmFyKC0tc2l6ZS0yLTEpO1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMXB4O1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC5uYXYtZm9sZGVyLXRpdGxlIHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG5cbiAgICAuZ2l0LWNvbW1pdC1tc2ctY2xlYXItYnV0dG9uIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBjb2xvcjogdmFyKC0tc2VhcmNoLWNsZWFyLWJ1dHRvbi1jb2xvcik7XG4gICAgICAgIGN1cnNvcjogdmFyKC0tY3Vyc29yKTtcbiAgICAgICAgdG9wOiAtNHB4O1xuICAgICAgICByaWdodDogMnB4O1xuICAgICAgICBib3R0b206IDBweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDA7XG4gICAgICAgIGhlaWdodDogdmFyKC0taW5wdXQtaGVpZ2h0KTtcbiAgICAgICAgd2lkdGg6IDI4cHg7XG4gICAgICAgIG1hcmdpbjogYXV0bztcbiAgICAgICAgcGFkZGluZzogMCAwO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cyBlYXNlLWluLW91dDtcbiAgICB9XG5cbiAgICAuZ2l0LWNvbW1pdC1tc2ctY2xlYXItYnV0dG9uOmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCJcIjtcbiAgICAgICAgaGVpZ2h0OiB2YXIoLS1zZWFyY2gtY2xlYXItYnV0dG9uLXNpemUpO1xuICAgICAgICB3aWR0aDogdmFyKC0tc2VhcmNoLWNsZWFyLWJ1dHRvbi1zaXplKTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgICAgICAgbWFzay1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgdmlld0JveD0nMCAwIDEyIDEyJyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTYgMTJDOS4zMTM3MSAxMiAxMiA5LjMxMzcxIDEyIDZDMTIgMi42ODYyOSA5LjMxMzcxIDAgNiAwQzIuNjg2MjkgMCAwIDIuNjg2MjkgMCA2QzAgOS4zMTM3MSAyLjY4NjI5IDEyIDYgMTJaTTMuODcwNSAzLjA5NzY2TDYuMDAwMDMgNS4yMjcxOEw4LjEyOTU1IDMuMDk3NjZMOC45MDI0IDMuODcwNUw2Ljc3Mjg3IDYuMDAwMDNMOC45MDI0IDguMTI5NTVMOC4xMjk1NSA4LjkwMjRMNi4wMDAwMyA2Ljc3Mjg3TDMuODcwNSA4LjkwMjRMMy4wOTc2NiA4LjEyOTU1TDUuMjI3MTggNi4wMDAwM0wzLjA5NzY2IDMuODcwNUwzLjg3MDUgMy4wOTc2NlonIGZpbGw9J2N1cnJlbnRDb2xvcicvPjwvc3ZnPlwiKTtcbiAgICAgICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB2aWV3Qm94PScwIDAgMTIgMTInIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGwtcnVsZT0nZXZlbm9kZCcgY2xpcC1ydWxlPSdldmVub2RkJyBkPSdNNiAxMkM5LjMxMzcxIDEyIDEyIDkuMzEzNzEgMTIgNkMxMiAyLjY4NjI5IDkuMzEzNzEgMCA2IDBDMi42ODYyOSAwIDAgMi42ODYyOSAwIDZDMCA5LjMxMzcxIDIuNjg2MjkgMTIgNiAxMlpNMy44NzA1IDMuMDk3NjZMNi4wMDAwMyA1LjIyNzE4TDguMTI5NTUgMy4wOTc2Nkw4LjkwMjQgMy44NzA1TDYuNzcyODcgNi4wMDAwM0w4LjkwMjQgOC4xMjk1NUw4LjEyOTU1IDguOTAyNEw2LjAwMDAzIDYuNzcyODdMMy44NzA1IDguOTAyNEwzLjA5NzY2IDguMTI5NTVMNS4yMjcxOCA2LjAwMDAzTDMuMDk3NjYgMy44NzA1TDMuODcwNSAzLjA5NzY2WicgZmlsbD0nY3VycmVudENvbG9yJy8+PC9zdmc+XCIpO1xuICAgICAgICAtd2Via2l0LW1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgfVxuPC9zdHlsZT5cbiIsICJpbXBvcnQgT2JzaWRpYW5HaXQgZnJvbSBcInNyYy9tYWluXCI7XG5cbmV4cG9ydCBjbGFzcyBCcmFuY2hTdGF0dXNCYXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHN0YXR1c0JhckVsOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW46IE9ic2lkaWFuR2l0XG4gICAgKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuYWRkQ2xhc3MoXCJtb2QtY2xpY2thYmxlXCIpO1xuICAgICAgICB0aGlzLnN0YXR1c0JhckVsLm9uQ2xpY2tFdmVudCgoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc3dpdGNoQnJhbmNoKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGRpc3BsYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLnBsdWdpbi5naXRSZWFkeSkge1xuICAgICAgICAgICAgY29uc3QgYnJhbmNoSW5mbyA9IGF3YWl0IHRoaXMucGx1Z2luLmdpdE1hbmFnZXIuYnJhbmNoSW5mbygpO1xuICAgICAgICAgICAgaWYgKGJyYW5jaEluZm8uY3VycmVudCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLnNldFRleHQoYnJhbmNoSW5mby5jdXJyZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5lbXB0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5lbXB0eSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7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STtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBRztBQUFBLElBQy9EO0FBRUEsUUFBSSxPQUFPO0FBQUE7QUFBQSxNQUNUO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFDNUQ7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLElBQzFEO0FBRUEsUUFBSSxRQUFRO0FBQUE7QUFBQSxNQUNWO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFLO0FBQUEsTUFDdEQ7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUNsRDtBQUFBLE1BQU07QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFHO0FBQUEsSUFDaEM7QUFFQSxRQUFJLE9BQU87QUFBQTtBQUFBLE1BQ1Q7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FB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S0FBSyxJQUFJLEVBQUU7QUFBQSxNQUMzQixVQUFVLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixjQUFjLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFBQSxNQUMzQixZQUFZLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFBQSxNQUN4QixZQUFZLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUMxQixVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFBQSxNQUN0QixVQUFVLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixXQUFXLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN6QixhQUFhLENBQUMsS0FBSyxJQUFJLEdBQUc7QUFBQSxNQUMxQixhQUFhLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUMzQixhQUFhLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUMzQixRQUFRLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN0QixlQUFlLENBQUMsR0FBRyxLQUFLLEdBQUc7QUFBQSxNQUMzQixhQUFhLENBQUMsSUFBSSxLQUFLLEdBQUc7QUFBQSxNQUMxQixPQUFPLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUNyQixRQUFRLENBQUMsR0FBRyxLQUFLLEdBQUc7QUFBQSxNQUNwQixXQUFXLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN6QixVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFBQSxNQUN0QixhQUFhLENBQUMsSUFBSSxLQUFLLEdBQUc7QUFBQSxNQUMxQixVQUFVLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixTQUFTLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixTQUFTLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixjQUFjLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUM1QixVQUFVLENBQUMsS0FBSyxLQUFLLENBQUM7QUFBQSxNQUN0QixlQUFlLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUM3QjtBQUFBO0FBQUE7OztBQ3ZKQTtBQUFBLDZDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQSxRQUFJLGNBQWM7QUFBQTtBQUFBLE1BRWQsTUFBTTtBQUFBLFFBQ0YsTUFBTTtBQUFBLFFBQ04sTUFBTSxLQUFLO0FBQUEsUUFDWCxNQUFNLEtBQUs7QUFBQSxRQUNYLE1BQU07QUFBQSxRQUNOLE1BQU0sS0FBSztBQUFBLFFBQ1gsTUFBTTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLE1BQU07QUFBQSxRQUNGLE1BQU0sT0FBSztBQUFBLFFBQ1gsTUFBTTtBQUFBLFFBQ04sTUFBTTtBQUFBLFFBQ04sTUFBTTtBQUFBLFFBQ04sTUFBTSxPQUFLO0FBQUEsUUFDWCxNQUFNLE9BQUs7QUFBQSxNQUNmO0FBQUEsTUFDQSxNQUFNO0FBQUEsUUFDRixNQUFNLE9BQUs7QUFBQSxRQUNYLE1BQU07QUFBQSxRQUNOLE1BQU07QUFBQSxRQUNOLE1BQU07QUFBQSxRQUNOLE1BQU0sT0FBSztBQUFBLFFBQ1gsTUFBTSxPQUFLO0FBQUEsTUFDZjtBQUFBLE1BQ0EsTUFBTTtBQUFBLFFBQ0YsTUFBTSxJQUFJO0FBQUEsUUFDVixNQUFNLElBQUk7QUFBQSxRQUNWLE1BQU0sSUFBSTtBQUFBLFFBQ1YsTUFBTTtBQUFBLFFBQ04sTUFBTSxJQUFJO0FBQUEsUUFDVixNQUFNLElBQUk7QUFBQSxNQUNkO0FBQUEsTUFDQSxNQUFNO0FBQUEsUUFDRixNQUFNO0FBQUEsUUFDTixNQUFNLEtBQUs7QUFBQSxRQUNYLE1BQU0sS0FBSztBQUFBLFFBQ1gsTUFBTTtBQUFBLFFBQ04sTUFBTTtBQUFBLFFBQ04sTUFBTTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLE1BQU07QUFBQSxRQUNGLE1BQU0sSUFBSTtBQUFBLFFBQ1YsTUFBTSxJQUFJO0FBQUEsUUFDVixNQUFNLElBQUk7QUFBQSxRQUNWLE1BQU07QUFBQSxRQUNOLE1BQU0sSUFBSTtBQUFBLFFBQ1YsTUFBTTtBQUFBLE1BQ1Y7QUFBQTtBQUFBLE1BRUEsT0FBTztBQUFBLFFBQ0gsT0FBTztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsT0FBTyxNQUFJLEtBQUs7QUFBQSxRQUNoQixRQUFRO0FBQUEsTUFDWjtBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ0osT0FBTyxNQUFJO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixPQUFPLE1BQUksS0FBSztBQUFBLFFBQ2hCLFFBQVE7QUFBQSxNQUNaO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDSCxPQUFPLEtBQUssS0FBRztBQUFBLFFBQ2YsUUFBUSxLQUFLLEtBQUc7QUFBQSxRQUNoQixPQUFPO0FBQUEsUUFDUCxRQUFRLEtBQUssS0FBRztBQUFBLE1BQ3BCO0FBQUEsTUFDQSxRQUFRO0FBQUEsUUFDSixPQUFPLElBQUU7QUFBQSxRQUNULFFBQVEsSUFBRTtBQUFBLFFBQ1YsT0FBTyxNQUFJLEtBQUs7QUFBQSxRQUNoQixRQUFRO0FBQUEsTUFDWjtBQUFBO0FBQUEsTUFFQSxLQUFLO0FBQUEsUUFDRCxLQUFLO0FBQUEsUUFDTCxNQUFNLElBQUU7QUFBQSxNQUNaO0FBQUEsTUFDQSxNQUFNO0FBQUEsUUFDRixLQUFLO0FBQUEsUUFDTCxNQUFNO0FBQUEsTUFDVjtBQUFBO0FBQUEsTUFFQSxNQUFNO0FBQUEsUUFDRixNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsTUFDWDtBQUFBLE1BQ0EsT0FBTztBQUFBLFFBQ0gsTUFBTSxJQUFFO0FBQUEsUUFDUixPQUFPO0FBQUEsTUFDWDtBQUFBO0FBQUEsTUFFQSxPQUFPO0FBQUEsUUFDSCxPQUFPO0FBQUEsUUFDUCxRQUFRLElBQUk7QUFBQSxRQUNaLFFBQVEsSUFBRTtBQUFBLE1BQ2Q7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNKLE9BQU87QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFFBQVEsT0FBSztBQUFBLE1BQ2pCO0FBQUEsTUFDQSxRQUFRO0FBQUEsUUFDSixPQUFPO0FBQUEsUUFDUCxRQUFRLEtBQUs7QUFBQSxRQUNiLFFBQVE7QUFBQSxNQUNaO0FBQUEsSUFDSjtBQUVBLElBQUFBLFFBQU8sVUFBVSxTQUFVLE9BQU8sWUFBWSxZQUFZLFdBQVc7QUFDakUsVUFBSSxDQUFDLFlBQVksZUFBZSxVQUFVO0FBQ3RDLGNBQU0sSUFBSSxNQUFNLHVCQUF1QixVQUFVO0FBRXJELFVBQUksQ0FBQyxZQUFZLFVBQVUsRUFBRSxlQUFlLFVBQVU7QUFDbEQsY0FBTSxJQUFJLE1BQU0seUJBQXlCLGFBQWEsU0FBUyxVQUFVO0FBRTdFLFVBQUksWUFBWSxZQUFZLFVBQVUsRUFBRSxVQUFVLElBQUk7QUFFdEQsVUFBSSxjQUFjLE9BQU87QUFDckIsb0JBQVksS0FBSyxJQUFJLElBQUksU0FBUyxTQUFTLEtBQUssQ0FBQztBQUNqRCxlQUFPLEtBQUssTUFBTSxZQUFZLFNBQVMsSUFBSTtBQUFBLE1BQy9DO0FBRUEsYUFBTztBQUFBLElBQ1g7QUFBQTtBQUFBOzs7QUM5SEEsSUFBQUMsZUFBQTtBQUFBLGtEQUFBQyxVQUFBO0FBQUE7QUFBQTtBQUVBLFdBQU8sZUFBZUEsVUFBUyxjQUFjO0FBQUEsTUFDM0MsT0FBTztBQUFBLElBQ1QsQ0FBQztBQUNELElBQUFBLFNBQVEsV0FBVztBQUNuQixJQUFBQSxTQUFRLFVBQVU7QUFDbEIsSUFBQUEsU0FBUSxXQUFXO0FBQ25CLElBQUFBLFNBQVEsVUFBVTtBQUNsQixJQUFBQSxTQUFRLGFBQWFDO0FBQ3JCLElBQUFELFNBQVEsU0FBUyxJQUFJO0FBRXJCLFFBQUksYUFBYSx1QkFBdUIsb0JBQXFCO0FBRTdELFFBQUksb0JBQW9CLHVCQUF1Qiw0QkFBNkI7QUFFNUUsYUFBUyx1QkFBdUIsS0FBSztBQUFFLGFBQU8sT0FBTyxJQUFJLGFBQWEsTUFBTSxFQUFFLFdBQVcsSUFBSTtBQUFBLElBQUc7QUFFaEcsYUFBUyxnQkFBZ0JFLFlBQVUsYUFBYTtBQUFFLFVBQUksRUFBRUEsc0JBQW9CLGNBQWM7QUFBRSxjQUFNLElBQUksVUFBVSxtQ0FBbUM7QUFBQSxNQUFHO0FBQUEsSUFBRTtBQUV4SixhQUFTLGtCQUFrQixRQUFRLE9BQU87QUFBRSxlQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQUUsWUFBSSxhQUFhLE1BQU0sQ0FBQztBQUFHLG1CQUFXLGFBQWEsV0FBVyxjQUFjO0FBQU8sbUJBQVcsZUFBZTtBQUFNLFlBQUksV0FBVztBQUFZLHFCQUFXLFdBQVc7QUFBTSxlQUFPLGVBQWUsUUFBUSxXQUFXLEtBQUssVUFBVTtBQUFBLE1BQUc7QUFBQSxJQUFFO0FBRTVULGFBQVMsYUFBYSxhQUFhLFlBQVksYUFBYTtBQUFFLFVBQUk7QUFBWSwwQkFBa0IsWUFBWSxXQUFXLFVBQVU7QUFBRyxVQUFJO0FBQWEsMEJBQWtCLGFBQWEsV0FBVztBQUFHLGFBQU87QUFBQSxJQUFhO0FBRXROLGFBQVMsZUFBZSxLQUFLLEdBQUc7QUFBRSxhQUFPLGdCQUFnQixHQUFHLEtBQUssc0JBQXNCLEtBQUssQ0FBQyxLQUFLQyw2QkFBNEIsS0FBSyxDQUFDLEtBQUssaUJBQWlCO0FBQUEsSUFBRztBQUU3SixhQUFTLG1CQUFtQjtBQUFFLFlBQU0sSUFBSSxVQUFVLDJJQUEySTtBQUFBLElBQUc7QUFFaE0sYUFBU0EsNkJBQTRCLEdBQUcsUUFBUTtBQUFFLFVBQUksQ0FBQztBQUFHO0FBQVEsVUFBSSxPQUFPLE1BQU07QUFBVSxlQUFPQyxtQkFBa0IsR0FBRyxNQUFNO0FBQUcsVUFBSSxJQUFJLE9BQU8sVUFBVSxTQUFTLEtBQUssQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFO0FBQUcsVUFBSSxNQUFNLFlBQVksRUFBRTtBQUFhLFlBQUksRUFBRSxZQUFZO0FBQU0sVUFBSSxNQUFNLFNBQVMsTUFBTTtBQUFPLGVBQU8sTUFBTSxLQUFLLENBQUM7QUFBRyxVQUFJLE1BQU0sZUFBZSwyQ0FBMkMsS0FBSyxDQUFDO0FBQUcsZUFBT0EsbUJBQWtCLEdBQUcsTUFBTTtBQUFBLElBQUc7QUFFL1osYUFBU0EsbUJBQWtCLEtBQUssS0FBSztBQUFFLFVBQUksT0FBTyxRQUFRLE1BQU0sSUFBSTtBQUFRLGNBQU0sSUFBSTtBQUFRLGVBQVMsSUFBSSxHQUFHLE9BQU8sSUFBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssS0FBSztBQUFFLGFBQUssQ0FBQyxJQUFJLElBQUksQ0FBQztBQUFBLE1BQUc7QUFBRSxhQUFPO0FBQUEsSUFBTTtBQUV0TCxhQUFTLHNCQUFzQixLQUFLLEdBQUc7QUFBRSxVQUFJLE9BQU8sV0FBVyxlQUFlLEVBQUUsT0FBTyxZQUFZLE9BQU8sR0FBRztBQUFJO0FBQVEsVUFBSSxPQUFPLENBQUM7QUFBRyxVQUFJLEtBQUs7QUFBTSxVQUFJLEtBQUs7QUFBTyxVQUFJLEtBQUs7QUFBVyxVQUFJO0FBQUUsaUJBQVMsS0FBSyxJQUFJLE9BQU8sUUFBUSxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxPQUFPLEtBQUssTUFBTTtBQUFFLGVBQUssS0FBSyxHQUFHLEtBQUs7QUFBRyxjQUFJLEtBQUssS0FBSyxXQUFXO0FBQUc7QUFBQSxRQUFPO0FBQUEsTUFBRSxTQUFTLEtBQUs7QUFBRSxhQUFLO0FBQU0sYUFBSztBQUFBLE1BQUssVUFBRTtBQUFVLFlBQUk7QUFBRSxjQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsS0FBSztBQUFNLGVBQUcsUUFBUSxFQUFFO0FBQUEsUUFBRyxVQUFFO0FBQVUsY0FBSTtBQUFJLGtCQUFNO0FBQUEsUUFBSTtBQUFBLE1BQUU7QUFBRSxhQUFPO0FBQUEsSUFBTTtBQUV4ZSxhQUFTLGdCQUFnQixLQUFLO0FBQUUsVUFBSSxNQUFNLFFBQVEsR0FBRztBQUFHLGVBQU87QUFBQSxJQUFLO0FBRXBFLFFBQUksTUFBTTtBQUNWLFFBQUksV0FBVztBQUNmLFFBQUksTUFBTTtBQUNWLFFBQUksUUFBUTtBQUNaLFFBQUksVUFBVTtBQUNkLFFBQUksWUFBWTtBQUNoQixRQUFJLE1BQU07QUFFVixhQUFTQyxVQUFTLFVBQVUsUUFBUTtBQUNsQyxhQUFPLFNBQVMsUUFBUSxNQUFNLElBQUk7QUFBQSxJQUNwQztBQUVBLGFBQVMsU0FBUyxHQUFHLEdBQUcsR0FBRztBQUN6QixVQUFJLFFBQVEsSUFBSTtBQUNoQixVQUFJLFFBQVEsSUFBSTtBQUNoQixVQUFJLFFBQVEsSUFBSTtBQUNoQixVQUFJLE9BQU8sS0FBSyxJQUFJLE9BQU8sT0FBTyxLQUFLO0FBQ3ZDLFVBQUksT0FBTyxLQUFLLElBQUksT0FBTyxPQUFPLEtBQUs7QUFDdkMsVUFBSSxRQUFRLE9BQU87QUFDbkIsVUFBSSxLQUFLLE9BQU8sUUFBUTtBQUV4QixVQUFJLFVBQVUsR0FBRztBQUNmLGVBQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHO0FBQUEsTUFDdkI7QUFFQSxVQUFJLElBQUksU0FBUyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQztBQUV2QyxVQUFJLElBQUksV0FBWTtBQUNsQixnQkFBUSxNQUFNO0FBQUEsVUFDWixLQUFLLE9BQ0g7QUFDRSxvQkFBUSxRQUFRLFNBQVMsUUFBUTtBQUFBLFVBQ25DO0FBQUEsVUFFRixLQUFLLE9BQ0g7QUFDRSxvQkFBUSxRQUFRLFNBQVMsUUFBUTtBQUFBLFVBQ25DO0FBQUEsVUFFRixTQUNFO0FBQ0Usb0JBQVEsUUFBUSxTQUFTLFFBQVE7QUFBQSxVQUNuQztBQUFBLFFBQ0o7QUFBQSxNQUNGLEVBQUU7QUFFRixhQUFPLENBQUMsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUc7QUFBQSxJQUNsQztBQUVBLGFBQVMsU0FBUyxHQUFHLEdBQUcsR0FBRztBQUN6QixVQUFJLFFBQVEsSUFBSTtBQUNoQixVQUFJLFFBQVEsSUFBSTtBQUNoQixVQUFJLFFBQVEsSUFBSTtBQUNoQixVQUFJLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsS0FBSztBQUN4QyxVQUFJLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxRQUFRLElBQUksQ0FBQztBQUN2QyxVQUFJLElBQUksUUFBUSxJQUFJO0FBRXBCLFVBQUksT0FBTyxXQUFZO0FBQ3JCLFlBQUksUUFBUTtBQUFHLGlCQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDOUIsWUFBSSxRQUFRO0FBQUcsaUJBQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM5QixZQUFJLFFBQVE7QUFBRyxpQkFBTyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzlCLFlBQUksUUFBUTtBQUFHLGlCQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDOUIsWUFBSSxRQUFRO0FBQUcsaUJBQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM5QixlQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7QUFBQSxNQUNqQixFQUFFLEdBQ0UsUUFBUSxlQUFlLE1BQU0sQ0FBQyxHQUM5QixRQUFRLE1BQU0sQ0FBQyxHQUNmLFFBQVEsTUFBTSxDQUFDLEdBQ2YsUUFBUSxNQUFNLENBQUM7QUFFbkIsYUFBTyxFQUFFLFFBQVEsS0FBSyxNQUFNLFFBQVEsS0FBSyxNQUFNLFFBQVEsS0FBSyxHQUFHO0FBQUEsSUFDakU7QUFFQSxRQUFJLFFBQXFCLDJCQUFZO0FBQ25DLGVBQVNDLE9BQU0sT0FBTztBQUNwQixZQUFJLFFBQVEsZUFBZSxPQUFPLENBQUMsR0FDL0IsSUFBSSxNQUFNLENBQUMsR0FDWCxJQUFJLE1BQU0sQ0FBQyxHQUNYLElBQUksTUFBTSxDQUFDLEdBQ1gsSUFBSSxNQUFNLENBQUM7QUFFZix3QkFBZ0IsTUFBTUEsTUFBSztBQUUzQixhQUFLLFNBQVMsQ0FBQyxLQUFLLElBQUksS0FBSyxJQUFJLFNBQVMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLFNBQVMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLFNBQVMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFLLE9BQU8sSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLFdBQVcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFBQSxNQUNqTjtBQUVBLG1CQUFhQSxRQUFPLENBQUM7QUFBQSxRQUNuQixLQUFLO0FBQUEsUUFDTCxPQUFPLFNBQVMsY0FBYztBQUM1QixjQUFJLGVBQWUsZUFBZSxLQUFLLFFBQVEsQ0FBQyxHQUM1QyxJQUFJLGFBQWEsQ0FBQyxHQUNsQixJQUFJLGFBQWEsQ0FBQyxHQUNsQixJQUFJLGFBQWEsQ0FBQyxHQUNsQixJQUFJLGFBQWEsQ0FBQztBQUV0QixjQUFJLE1BQU0sR0FBRztBQUNYLG1CQUFPLE9BQU8sT0FBTyxHQUFHLElBQUksRUFBRSxPQUFPLEdBQUcsSUFBSSxFQUFFLE9BQU8sR0FBRyxHQUFHO0FBQUEsVUFDN0Q7QUFFQSxpQkFBTyxRQUFRLE9BQU8sR0FBRyxJQUFJLEVBQUUsT0FBTyxHQUFHLElBQUksRUFBRSxPQUFPLEdBQUcsSUFBSSxFQUFFLE9BQU8sR0FBRyxHQUFHO0FBQUEsUUFDOUU7QUFBQSxNQUNGLEdBQUc7QUFBQSxRQUNELEtBQUs7QUFBQSxRQUNMLE9BQU8sU0FBUyxjQUFjO0FBQzVCLGNBQUksb0JBQW9CLEtBQUssWUFBWSxHQUNyQyxxQkFBcUIsZUFBZSxtQkFBbUIsQ0FBQyxHQUN4RCxJQUFJLG1CQUFtQixDQUFDLEdBQ3hCLElBQUksbUJBQW1CLENBQUMsR0FDeEIsSUFBSSxtQkFBbUIsQ0FBQyxHQUN4QixJQUFJLG1CQUFtQixDQUFDO0FBRTVCLGNBQUksTUFBTSxHQUFHO0FBQ1gsbUJBQU8sT0FBTyxPQUFPLEdBQUcsSUFBSSxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUUsT0FBTyxHQUFHLElBQUk7QUFBQSxVQUMvRDtBQUVBLGlCQUFPLFFBQVEsT0FBTyxHQUFHLElBQUksRUFBRSxPQUFPLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUUsT0FBTyxHQUFHLEdBQUc7QUFBQSxRQUNoRjtBQUFBLE1BQ0YsR0FBRztBQUFBLFFBQ0QsS0FBSztBQUFBLFFBQ0wsT0FBTyxTQUFTLGNBQWM7QUFDNUIsY0FBSSxnQkFBZ0IsZUFBZSxLQUFLLFFBQVEsQ0FBQyxHQUM3QyxJQUFJLGNBQWMsQ0FBQyxHQUNuQixJQUFJLGNBQWMsQ0FBQyxHQUNuQixJQUFJLGNBQWMsQ0FBQyxHQUNuQixJQUFJLGNBQWMsQ0FBQztBQUV2QixjQUFJLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQzFDLGNBQUksT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDMUMsY0FBSSxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUMxQyxjQUFJLElBQUksSUFBSSxTQUFTLElBQUksS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsU0FBUyxHQUFHLEdBQUcsSUFBSTtBQUNsRSxpQkFBTyxJQUFJLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQztBQUFBLFFBQ25EO0FBQUEsTUFDRixHQUFHO0FBQUEsUUFDRCxLQUFLO0FBQUEsUUFDTCxPQUFPLFNBQVMsY0FBYztBQUM1QixpQkFBTyxLQUFLO0FBQUEsUUFDZDtBQUFBLE1BQ0YsR0FBRztBQUFBLFFBQ0QsS0FBSztBQUFBLFFBQ0wsT0FBTyxTQUFTLGNBQWM7QUFDNUIsY0FBSSxnQkFBZ0IsZUFBZSxLQUFLLFFBQVEsQ0FBQyxHQUM3QyxJQUFJLGNBQWMsQ0FBQyxHQUNuQixJQUFJLGNBQWMsQ0FBQyxHQUNuQixJQUFJLGNBQWMsQ0FBQyxHQUNuQixJQUFJLGNBQWMsQ0FBQztBQUV2QixjQUFJLFlBQVksU0FBUyxHQUFHLEdBQUcsQ0FBQyxHQUM1QixhQUFhLGVBQWUsV0FBVyxDQUFDLEdBQ3hDLElBQUksV0FBVyxDQUFDLEdBQ2hCLElBQUksV0FBVyxDQUFDLEdBQ2hCLElBQUksV0FBVyxDQUFDO0FBRXBCLGlCQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUFBLFFBQ3BCO0FBQUEsTUFDRixDQUFDLENBQUM7QUFFRixhQUFPQTtBQUFBLElBQ1QsRUFBRTtBQUVGLGFBQVMsU0FBUyxPQUFPO0FBQ3ZCLFVBQUksUUFBUSxlQUFlLE9BQU8sQ0FBQyxHQUMvQixJQUFJLE1BQU0sQ0FBQyxHQUNYLElBQUksTUFBTSxDQUFDLEdBQ1gsSUFBSSxNQUFNLENBQUMsR0FDWCxJQUFJLE1BQU0sQ0FBQztBQUVmLGFBQU8sSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFDL0I7QUFFQSxhQUFTLFFBQVEsT0FBTztBQUN0QixVQUFJLFFBQVEsZUFBZSxPQUFPLENBQUMsR0FDL0IsSUFBSSxNQUFNLENBQUMsR0FDWCxJQUFJLE1BQU0sQ0FBQyxHQUNYLElBQUksTUFBTSxDQUFDO0FBRWYsYUFBTyxTQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFDOUI7QUFFQSxhQUFTLFNBQVMsT0FBTztBQUN2QixVQUFJLFNBQVMsZUFBZSxPQUFPLENBQUMsR0FDaEMsSUFBSSxPQUFPLENBQUMsR0FDWixJQUFJLE9BQU8sQ0FBQyxHQUNaLElBQUksT0FBTyxDQUFDLEdBQ1osSUFBSSxPQUFPLENBQUM7QUFFaEIsVUFBSSxZQUFZLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FDNUIsYUFBYSxlQUFlLFdBQVcsQ0FBQyxHQUN4QyxJQUFJLFdBQVcsQ0FBQyxHQUNoQixJQUFJLFdBQVcsQ0FBQyxHQUNoQixJQUFJLFdBQVcsQ0FBQztBQUVwQixhQUFPLFNBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFBQSxJQUM5QjtBQUVBLGFBQVMsUUFBUSxRQUFRO0FBQ3ZCLFVBQUksU0FBUyxlQUFlLFFBQVEsQ0FBQyxHQUNqQyxJQUFJLE9BQU8sQ0FBQyxHQUNaLElBQUksT0FBTyxDQUFDLEdBQ1osSUFBSSxPQUFPLENBQUM7QUFFaEIsYUFBTyxTQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFDOUI7QUFFQSxhQUFTLGNBQWMsS0FBSztBQUMxQixVQUFJLFNBQVMsSUFBSSxLQUFLLEdBQUcsS0FBSyxTQUFTLEtBQUssR0FBRyxHQUMzQyxTQUFTLGVBQWUsUUFBUSxDQUFDLEdBQ2pDLElBQUksT0FBTyxDQUFDLEdBQ1osSUFBSSxPQUFPLENBQUMsR0FDWixJQUFJLE9BQU8sQ0FBQyxHQUNaLElBQUksT0FBTyxDQUFDO0FBRWhCLFVBQUksU0FBUyxFQUFFLFNBQVMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRTtBQUMvQyxVQUFJLFNBQVMsRUFBRSxTQUFTLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxHQUFHLEVBQUU7QUFDL0MsVUFBSSxTQUFTLEVBQUUsU0FBUyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksR0FBRyxFQUFFO0FBQy9DLFVBQUksTUFBTSxTQUFTLEVBQUUsU0FBUyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxZQUFZLENBQUMsS0FBSztBQUNoRixhQUFPLFNBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFBQSxJQUM5QjtBQUVBLGFBQVMsY0FBYyxLQUFLO0FBQzFCLFVBQUksU0FBUyxJQUFJLEtBQUssR0FBRyxLQUFLLFFBQVEsS0FBSyxHQUFHLEtBQUssTUFBTSxLQUFLLEdBQUcsS0FBSyxVQUFVLEtBQUssR0FBRyxHQUNwRixTQUFTLGVBQWUsUUFBUSxDQUFDLEdBQ2pDLElBQUksT0FBTyxDQUFDLEdBQ1osSUFBSSxPQUFPLENBQUMsR0FDWixJQUFJLE9BQU8sQ0FBQyxHQUNaLElBQUksT0FBTyxDQUFDO0FBRWhCLFVBQUlELFVBQVMsR0FBRyxHQUFHLElBQUksU0FBUyxHQUFHLEVBQUUsSUFBSSxNQUFNLE1BQU0sU0FBUyxHQUFHLEVBQUU7QUFDbkUsVUFBSUEsVUFBUyxHQUFHLEdBQUcsSUFBSSxTQUFTLEdBQUcsRUFBRSxJQUFJLE1BQU0sTUFBTSxTQUFTLEdBQUcsRUFBRTtBQUNuRSxVQUFJQSxVQUFTLEdBQUcsR0FBRyxJQUFJLElBQUksU0FBUyxHQUFHLEVBQUUsSUFBSSxNQUFNLE1BQU0sU0FBUyxHQUFHLEVBQUU7QUFDdkUsVUFBSSxNQUFNLFNBQVksSUFBSSxXQUFXLENBQUMsS0FBS0EsVUFBUyxHQUFHLEdBQUcsSUFBSSxNQUFNO0FBQ3BFLGFBQU8sU0FBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUFBLElBQzlCO0FBRUEsYUFBUyxjQUFjLEtBQUs7QUFDMUIsVUFBSSxZQUFZLElBQUksS0FBSyxHQUFHLEdBQ3hCLGFBQWEsZUFBZSxXQUFXLENBQUMsR0FDeEMsSUFBSSxXQUFXLENBQUMsR0FDaEIsT0FBTyxXQUFXLENBQUMsR0FDbkIsSUFBSSxXQUFXLENBQUMsR0FDaEIsSUFBSSxXQUFXLENBQUMsR0FDaEIsSUFBSSxXQUFXLENBQUM7QUFFcEIsYUFBTyxRQUFRO0FBQ2YsV0FBSyxHQUFHLGtCQUFrQixTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsTUFBTSxLQUFLO0FBQ2hFLFVBQUksV0FBVyxDQUFDO0FBQ2hCLFVBQUksV0FBVyxDQUFDO0FBQ2hCLFVBQUksTUFBTSxTQUFZLElBQUksV0FBVyxDQUFDLEtBQUtBLFVBQVMsR0FBRyxHQUFHLElBQUksTUFBTTtBQUNwRSxhQUFPLFNBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFBQSxJQUM5QjtBQUVBLGFBQVNKLFlBQVcsS0FBSztBQUN2QixVQUFJLFdBQVcsU0FBUyxFQUFFLEdBQUcsR0FBRztBQUM5QixlQUFPLFFBQVEsV0FBVyxTQUFTLEVBQUUsR0FBRyxDQUFDO0FBQUEsTUFDM0M7QUFFQSxVQUFJLElBQUksS0FBSyxHQUFHLEtBQUssU0FBUyxLQUFLLEdBQUcsR0FBRztBQUN2QyxlQUFPLGNBQWMsR0FBRztBQUFBLE1BQzFCO0FBRUEsVUFBSSxJQUFJLEtBQUssR0FBRyxLQUFLLFFBQVEsS0FBSyxHQUFHLEtBQUssTUFBTSxLQUFLLEdBQUcsS0FBSyxVQUFVLEtBQUssR0FBRyxHQUFHO0FBQ2hGLGVBQU8sY0FBYyxHQUFHO0FBQUEsTUFDMUI7QUFFQSxVQUFJLElBQUksS0FBSyxHQUFHLEdBQUc7QUFDakIsZUFBTyxjQUFjLEdBQUc7QUFBQSxNQUMxQjtBQUVBLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSSxXQUFXO0FBQUEsTUFDYixZQUFZQTtBQUFBLE1BQ1o7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQ0EsSUFBQUQsU0FBUSxTQUFTLElBQUk7QUFBQTtBQUFBOzs7QUN6VHJCO0FBQUEsNENBQUFPLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxRQUFRLE9BQU8sVUFBVTtBQUU3QixJQUFBQSxRQUFPLFVBQVUsU0FBUyxZQUFZLE9BQU87QUFDNUMsVUFBSSxNQUFNLE1BQU0sS0FBSyxLQUFLO0FBQzFCLFVBQUksU0FBUyxRQUFRO0FBQ3JCLFVBQUksQ0FBQyxRQUFRO0FBQ1osaUJBQVMsUUFBUSxvQkFDaEIsVUFBVSxRQUNWLE9BQU8sVUFBVSxZQUNqQixPQUFPLE1BQU0sV0FBVyxZQUN4QixNQUFNLFVBQVUsS0FDaEIsTUFBTSxLQUFLLE1BQU0sTUFBTSxNQUFNO0FBQUEsTUFDL0I7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7OztBQ2hCQTtBQUFBLCtDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUk7QUFDSixRQUFJLENBQUMsT0FBTyxNQUFNO0FBRWIsWUFBTSxPQUFPLFVBQVU7QUFDdkIsY0FBUSxPQUFPLFVBQVU7QUFDekIsZUFBUztBQUNULHFCQUFlLE9BQU8sVUFBVTtBQUNoQyx1QkFBaUIsQ0FBQyxhQUFhLEtBQUssRUFBRSxVQUFVLEtBQUssR0FBRyxVQUFVO0FBQ2xFLHdCQUFrQixhQUFhLEtBQUssV0FBWTtBQUFBLE1BQUMsR0FBRyxXQUFXO0FBQy9ELGtCQUFZO0FBQUEsUUFDZjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0Q7QUFDSSxtQ0FBNkIsU0FBVSxHQUFHO0FBQzdDLFlBQUksT0FBTyxFQUFFO0FBQ2IsZUFBTyxRQUFRLEtBQUssY0FBYztBQUFBLE1BQ25DO0FBQ0kscUJBQWU7QUFBQSxRQUNsQixtQkFBbUI7QUFBQSxRQUNuQixVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixlQUFlO0FBQUEsUUFDZixTQUFTO0FBQUEsUUFDVCxjQUFjO0FBQUEsUUFDZCxhQUFhO0FBQUEsUUFDYix3QkFBd0I7QUFBQSxRQUN4Qix1QkFBdUI7QUFBQSxRQUN2QixjQUFjO0FBQUEsUUFDZCxhQUFhO0FBQUEsUUFDYixjQUFjO0FBQUEsUUFDZCxjQUFjO0FBQUEsUUFDZCxTQUFTO0FBQUEsUUFDVCxhQUFhO0FBQUEsUUFDYixZQUFZO0FBQUEsUUFDWixVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsUUFDVixPQUFPO0FBQUEsUUFDUCxrQkFBa0I7QUFBQSxRQUNsQixvQkFBb0I7QUFBQSxRQUNwQixTQUFTO0FBQUEsTUFDVjtBQUNJLGlDQUE0QixXQUFZO0FBRTNDLFlBQUksT0FBTyxXQUFXLGFBQWE7QUFBRSxpQkFBTztBQUFBLFFBQU87QUFDbkQsaUJBQVMsS0FBSyxRQUFRO0FBQ3JCLGNBQUk7QUFDSCxnQkFBSSxDQUFDLGFBQWEsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLFFBQVEsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLFFBQVEsT0FBTyxPQUFPLENBQUMsTUFBTSxVQUFVO0FBQ3pHLGtCQUFJO0FBQ0gsMkNBQTJCLE9BQU8sQ0FBQyxDQUFDO0FBQUEsY0FDckMsU0FBUyxHQUFHO0FBQ1gsdUJBQU87QUFBQSxjQUNSO0FBQUEsWUFDRDtBQUFBLFVBQ0QsU0FBUyxHQUFHO0FBQ1gsbUJBQU87QUFBQSxVQUNSO0FBQUEsUUFDRDtBQUNBLGVBQU87QUFBQSxNQUNSLEVBQUU7QUFDRSw2Q0FBdUMsU0FBVSxHQUFHO0FBRXZELFlBQUksT0FBTyxXQUFXLGVBQWUsQ0FBQywwQkFBMEI7QUFDL0QsaUJBQU8sMkJBQTJCLENBQUM7QUFBQSxRQUNwQztBQUNBLFlBQUk7QUFDSCxpQkFBTywyQkFBMkIsQ0FBQztBQUFBLFFBQ3BDLFNBQVMsR0FBRztBQUNYLGlCQUFPO0FBQUEsUUFDUjtBQUFBLE1BQ0Q7QUFFQSxpQkFBVyxTQUFTLEtBQUssUUFBUTtBQUNoQyxZQUFJQyxZQUFXLFdBQVcsUUFBUSxPQUFPLFdBQVc7QUFDcEQsWUFBSUMsY0FBYSxNQUFNLEtBQUssTUFBTSxNQUFNO0FBQ3hDLFlBQUksY0FBYyxPQUFPLE1BQU07QUFDL0IsWUFBSSxXQUFXRCxhQUFZLE1BQU0sS0FBSyxNQUFNLE1BQU07QUFDbEQsWUFBSSxVQUFVLENBQUM7QUFFZixZQUFJLENBQUNBLGFBQVksQ0FBQ0MsZUFBYyxDQUFDLGFBQWE7QUFDN0MsZ0JBQU0sSUFBSSxVQUFVLG9DQUFvQztBQUFBLFFBQ3pEO0FBRUEsWUFBSSxZQUFZLG1CQUFtQkE7QUFDbkMsWUFBSSxZQUFZLE9BQU8sU0FBUyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxHQUFHO0FBQzFELG1CQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxFQUFFLEdBQUc7QUFDdkMsb0JBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQztBQUFBLFVBQ3ZCO0FBQUEsUUFDRDtBQUVBLFlBQUksZUFBZSxPQUFPLFNBQVMsR0FBRztBQUNyQyxtQkFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsRUFBRSxHQUFHO0FBQ3ZDLG9CQUFRLEtBQUssT0FBTyxDQUFDLENBQUM7QUFBQSxVQUN2QjtBQUFBLFFBQ0QsT0FBTztBQUNOLG1CQUFTLFFBQVEsUUFBUTtBQUN4QixnQkFBSSxFQUFFLGFBQWEsU0FBUyxnQkFBZ0IsSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHO0FBQ25FLHNCQUFRLEtBQUssT0FBTyxJQUFJLENBQUM7QUFBQSxZQUMxQjtBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBRUEsWUFBSSxnQkFBZ0I7QUFDbkIsY0FBSSxrQkFBa0IscUNBQXFDLE1BQU07QUFFakUsbUJBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEVBQUUsR0FBRztBQUMxQyxnQkFBSSxFQUFFLG1CQUFtQixVQUFVLENBQUMsTUFBTSxrQkFBa0IsSUFBSSxLQUFLLFFBQVEsVUFBVSxDQUFDLENBQUMsR0FBRztBQUMzRixzQkFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQUEsWUFDMUI7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUNBLGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRDtBQW5ISztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVNBO0FBSUE7QUF5QkE7QUFrQkE7QUFzREwsSUFBQUYsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDekhqQjtBQUFBLHNDQUFBRyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksUUFBUSxNQUFNLFVBQVU7QUFDNUIsUUFBSSxTQUFTO0FBRWIsUUFBSSxXQUFXLE9BQU87QUFDdEIsUUFBSSxXQUFXLFdBQVcsU0FBUyxLQUFLLEdBQUc7QUFBRSxhQUFPLFNBQVMsQ0FBQztBQUFBLElBQUcsSUFBSTtBQUVyRSxRQUFJLGVBQWUsT0FBTztBQUUxQixhQUFTLE9BQU8sU0FBUyxpQkFBaUI7QUFDekMsVUFBSSxPQUFPLE1BQU07QUFDaEIsWUFBSSx5QkFBMEIsV0FBWTtBQUV6QyxjQUFJLE9BQU8sT0FBTyxLQUFLLFNBQVM7QUFDaEMsaUJBQU8sUUFBUSxLQUFLLFdBQVcsVUFBVTtBQUFBLFFBQzFDLEVBQUUsR0FBRyxDQUFDO0FBQ04sWUFBSSxDQUFDLHdCQUF3QjtBQUM1QixpQkFBTyxPQUFPLFNBQVMsS0FBSyxRQUFRO0FBQ25DLGdCQUFJLE9BQU8sTUFBTSxHQUFHO0FBQ25CLHFCQUFPLGFBQWEsTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUFBLFlBQ3ZDO0FBQ0EsbUJBQU8sYUFBYSxNQUFNO0FBQUEsVUFDM0I7QUFBQSxRQUNEO0FBQUEsTUFDRCxPQUFPO0FBQ04sZUFBTyxPQUFPO0FBQUEsTUFDZjtBQUNBLGFBQU8sT0FBTyxRQUFRO0FBQUEsSUFDdkI7QUFFQSxJQUFBQSxRQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUMvQmpCO0FBQUEsb0NBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBR0EsSUFBQUEsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDSGpCO0FBQUEsbUNBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBR0EsSUFBQUEsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDSGpCO0FBQUEsb0NBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBR0EsSUFBQUEsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDSGpCO0FBQUEsa0NBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBR0EsSUFBQUEsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDSGpCO0FBQUEscUNBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBR0EsSUFBQUEsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDSGpCO0FBQUEsbUNBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBR0EsSUFBQUEsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDSGpCO0FBQUEsa0NBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBR0EsSUFBQUEsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDSGpCO0FBQUEsc0NBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBR0EsSUFBQUEsUUFBTyxVQUFVLFNBQVMsYUFBYTtBQUN0QyxVQUFJLE9BQU8sV0FBVyxjQUFjLE9BQU8sT0FBTywwQkFBMEIsWUFBWTtBQUFFLGVBQU87QUFBQSxNQUFPO0FBQ3hHLFVBQUksT0FBTyxPQUFPLGFBQWEsVUFBVTtBQUFFLGVBQU87QUFBQSxNQUFNO0FBRXhELFVBQUksTUFBTSxDQUFDO0FBQ1gsVUFBSSxNQUFNLE9BQU8sTUFBTTtBQUN2QixVQUFJLFNBQVMsT0FBTyxHQUFHO0FBQ3ZCLFVBQUksT0FBTyxRQUFRLFVBQVU7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUU3QyxVQUFJLE9BQU8sVUFBVSxTQUFTLEtBQUssR0FBRyxNQUFNLG1CQUFtQjtBQUFFLGVBQU87QUFBQSxNQUFPO0FBQy9FLFVBQUksT0FBTyxVQUFVLFNBQVMsS0FBSyxNQUFNLE1BQU0sbUJBQW1CO0FBQUUsZUFBTztBQUFBLE1BQU87QUFVbEYsVUFBSSxTQUFTO0FBQ2IsVUFBSSxHQUFHLElBQUk7QUFDWCxXQUFLLE9BQU8sS0FBSztBQUFFLGVBQU87QUFBQSxNQUFPO0FBQ2pDLFVBQUksT0FBTyxPQUFPLFNBQVMsY0FBYyxPQUFPLEtBQUssR0FBRyxFQUFFLFdBQVcsR0FBRztBQUFFLGVBQU87QUFBQSxNQUFPO0FBRXhGLFVBQUksT0FBTyxPQUFPLHdCQUF3QixjQUFjLE9BQU8sb0JBQW9CLEdBQUcsRUFBRSxXQUFXLEdBQUc7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUV0SCxVQUFJLE9BQU8sT0FBTyxzQkFBc0IsR0FBRztBQUMzQyxVQUFJLEtBQUssV0FBVyxLQUFLLEtBQUssQ0FBQyxNQUFNLEtBQUs7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUUxRCxVQUFJLENBQUMsT0FBTyxVQUFVLHFCQUFxQixLQUFLLEtBQUssR0FBRyxHQUFHO0FBQUUsZUFBTztBQUFBLE1BQU87QUFFM0UsVUFBSSxPQUFPLE9BQU8sNkJBQTZCLFlBQVk7QUFDMUQsWUFBSSxhQUFhLE9BQU8seUJBQXlCLEtBQUssR0FBRztBQUN6RCxZQUFJLFdBQVcsVUFBVSxVQUFVLFdBQVcsZUFBZSxNQUFNO0FBQUUsaUJBQU87QUFBQSxRQUFPO0FBQUEsTUFDcEY7QUFFQSxhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7OztBQ3pDQTtBQUFBLHNDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksYUFBYSxPQUFPLFdBQVcsZUFBZTtBQUNsRCxRQUFJLGdCQUFnQjtBQUVwQixJQUFBQSxRQUFPLFVBQVUsU0FBUyxtQkFBbUI7QUFDNUMsVUFBSSxPQUFPLGVBQWUsWUFBWTtBQUFFLGVBQU87QUFBQSxNQUFPO0FBQ3RELFVBQUksT0FBTyxXQUFXLFlBQVk7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUNsRCxVQUFJLE9BQU8sV0FBVyxLQUFLLE1BQU0sVUFBVTtBQUFFLGVBQU87QUFBQSxNQUFPO0FBQzNELFVBQUksT0FBTyxPQUFPLEtBQUssTUFBTSxVQUFVO0FBQUUsZUFBTztBQUFBLE1BQU87QUFFdkQsYUFBTyxjQUFjO0FBQUEsSUFDdEI7QUFBQTtBQUFBOzs7QUNaQTtBQUFBLG9DQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksT0FBTztBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsS0FBSyxDQUFDO0FBQUEsSUFDUDtBQUVBLFFBQUksVUFBVTtBQUdkLElBQUFBLFFBQU8sVUFBVSxTQUFTLFdBQVc7QUFFcEMsYUFBTyxFQUFFLFdBQVcsS0FBSyxFQUFFLFFBQVEsS0FBSyxPQUNwQyxFQUFFLGdCQUFnQjtBQUFBLElBQ3ZCO0FBQUE7QUFBQTs7O0FDZEEsSUFBQUMsMEJBQUE7QUFBQSxpREFBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFJQSxRQUFJLGdCQUFnQjtBQUNwQixRQUFJLFFBQVEsT0FBTyxVQUFVO0FBQzdCLFFBQUksTUFBTSxLQUFLO0FBQ2YsUUFBSSxXQUFXO0FBRWYsUUFBSSxXQUFXLFNBQVNDLFVBQVMsR0FBRyxHQUFHO0FBQ25DLFVBQUksTUFBTSxDQUFDO0FBRVgsZUFBUyxJQUFJLEdBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSyxHQUFHO0FBQ2xDLFlBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUFBLE1BQ2hCO0FBQ0EsZUFBUyxJQUFJLEdBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSyxHQUFHO0FBQ2xDLFlBQUksSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFBQSxNQUMzQjtBQUVBLGFBQU87QUFBQSxJQUNYO0FBRUEsUUFBSSxRQUFRLFNBQVNDLE9BQU0sU0FBUyxRQUFRO0FBQ3hDLFVBQUksTUFBTSxDQUFDO0FBQ1gsZUFBUyxJQUFJLFVBQVUsR0FBRyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSyxHQUFHLEtBQUssR0FBRztBQUNqRSxZQUFJLENBQUMsSUFBSSxRQUFRLENBQUM7QUFBQSxNQUN0QjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBRUEsUUFBSSxRQUFRLFNBQVUsS0FBSyxRQUFRO0FBQy9CLFVBQUksTUFBTTtBQUNWLGVBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRLEtBQUssR0FBRztBQUNwQyxlQUFPLElBQUksQ0FBQztBQUNaLFlBQUksSUFBSSxJQUFJLElBQUksUUFBUTtBQUNwQixpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFFQSxJQUFBRixRQUFPLFVBQVUsU0FBUyxLQUFLLE1BQU07QUFDakMsVUFBSSxTQUFTO0FBQ2IsVUFBSSxPQUFPLFdBQVcsY0FBYyxNQUFNLE1BQU0sTUFBTSxNQUFNLFVBQVU7QUFDbEUsY0FBTSxJQUFJLFVBQVUsZ0JBQWdCLE1BQU07QUFBQSxNQUM5QztBQUNBLFVBQUksT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUU3QixVQUFJO0FBQ0osVUFBSSxTQUFTLFdBQVk7QUFDckIsWUFBSSxnQkFBZ0IsT0FBTztBQUN2QixjQUFJLFNBQVMsT0FBTztBQUFBLFlBQ2hCO0FBQUEsWUFDQSxTQUFTLE1BQU0sU0FBUztBQUFBLFVBQzVCO0FBQ0EsY0FBSSxPQUFPLE1BQU0sTUFBTSxRQUFRO0FBQzNCLG1CQUFPO0FBQUEsVUFDWDtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUNBLGVBQU8sT0FBTztBQUFBLFVBQ1Y7QUFBQSxVQUNBLFNBQVMsTUFBTSxTQUFTO0FBQUEsUUFDNUI7QUFBQSxNQUVKO0FBRUEsVUFBSSxjQUFjLElBQUksR0FBRyxPQUFPLFNBQVMsS0FBSyxNQUFNO0FBQ3BELFVBQUksWUFBWSxDQUFDO0FBQ2pCLGVBQVMsSUFBSSxHQUFHLElBQUksYUFBYSxLQUFLO0FBQ2xDLGtCQUFVLENBQUMsSUFBSSxNQUFNO0FBQUEsTUFDekI7QUFFQSxjQUFRLFNBQVMsVUFBVSxzQkFBc0IsTUFBTSxXQUFXLEdBQUcsSUFBSSwyQ0FBMkMsRUFBRSxNQUFNO0FBRTVILFVBQUksT0FBTyxXQUFXO0FBQ2xCLFlBQUksUUFBUSxTQUFTRyxTQUFRO0FBQUEsUUFBQztBQUM5QixjQUFNLFlBQVksT0FBTztBQUN6QixjQUFNLFlBQVksSUFBSSxNQUFNO0FBQzVCLGNBQU0sWUFBWTtBQUFBLE1BQ3RCO0FBRUEsYUFBTztBQUFBLElBQ1g7QUFBQTtBQUFBOzs7QUNuRkE7QUFBQSx3Q0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLGlCQUFpQjtBQUVyQixJQUFBQSxRQUFPLFVBQVUsU0FBUyxVQUFVLFFBQVE7QUFBQTtBQUFBOzs7QUNKNUM7QUFBQSxpQ0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzlCLFFBQUksVUFBVSxPQUFPLFVBQVU7QUFDL0IsUUFBSSxPQUFPO0FBR1gsSUFBQUEsUUFBTyxVQUFVLEtBQUssS0FBSyxNQUFNLE9BQU87QUFBQTtBQUFBOzs7QUNQeEM7QUFBQSx3Q0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJQztBQUVKLFFBQUksU0FBUztBQUNiLFFBQUksYUFBYTtBQUNqQixRQUFJLGNBQWM7QUFDbEIsUUFBSSxrQkFBa0I7QUFDdEIsUUFBSSxlQUFlO0FBQ25CLFFBQUksYUFBYTtBQUNqQixRQUFJLFlBQVk7QUFFaEIsUUFBSSxZQUFZO0FBR2hCLFFBQUksd0JBQXdCLFNBQVUsa0JBQWtCO0FBQ3ZELFVBQUk7QUFDSCxlQUFPLFVBQVUsMkJBQTJCLG1CQUFtQixnQkFBZ0IsRUFBRTtBQUFBLE1BQ2xGLFNBQVMsR0FBRztBQUFBLE1BQUM7QUFBQSxJQUNkO0FBRUEsUUFBSSxRQUFRLE9BQU87QUFDbkIsUUFBSSxPQUFPO0FBQ1YsVUFBSTtBQUNILGNBQU0sQ0FBQyxHQUFHLEVBQUU7QUFBQSxNQUNiLFNBQVMsR0FBRztBQUNYLGdCQUFRO0FBQUEsTUFDVDtBQUFBLElBQ0Q7QUFFQSxRQUFJLGlCQUFpQixXQUFZO0FBQ2hDLFlBQU0sSUFBSSxXQUFXO0FBQUEsSUFDdEI7QUFDQSxRQUFJLGlCQUFpQixRQUNqQixXQUFZO0FBQ2QsVUFBSTtBQUVILGtCQUFVO0FBQ1YsZUFBTztBQUFBLE1BQ1IsU0FBUyxjQUFjO0FBQ3RCLFlBQUk7QUFFSCxpQkFBTyxNQUFNLFdBQVcsUUFBUSxFQUFFO0FBQUEsUUFDbkMsU0FBUyxZQUFZO0FBQ3BCLGlCQUFPO0FBQUEsUUFDUjtBQUFBLE1BQ0Q7QUFBQSxJQUNELEVBQUUsSUFDQTtBQUVILFFBQUksYUFBYSxzQkFBdUI7QUFDeEMsUUFBSSxXQUFXLG9CQUFxQjtBQUVwQyxRQUFJLFdBQVcsT0FBTyxtQkFDckIsV0FDRyxTQUFVLEdBQUc7QUFBRSxhQUFPLEVBQUU7QUFBQSxJQUFXLElBQ25DO0FBR0osUUFBSSxZQUFZLENBQUM7QUFFakIsUUFBSSxhQUFhLE9BQU8sZUFBZSxlQUFlLENBQUMsV0FBV0EsYUFBWSxTQUFTLFVBQVU7QUFFakcsUUFBSSxhQUFhO0FBQUEsTUFDaEIsV0FBVztBQUFBLE1BQ1gsb0JBQW9CLE9BQU8sbUJBQW1CLGNBQWNBLGFBQVk7QUFBQSxNQUN4RSxXQUFXO0FBQUEsTUFDWCxpQkFBaUIsT0FBTyxnQkFBZ0IsY0FBY0EsYUFBWTtBQUFBLE1BQ2xFLDRCQUE0QixjQUFjLFdBQVcsU0FBUyxDQUFDLEVBQUUsT0FBTyxRQUFRLEVBQUUsQ0FBQyxJQUFJQTtBQUFBLE1BQ3ZGLG9DQUFvQ0E7QUFBQSxNQUNwQyxtQkFBbUI7QUFBQSxNQUNuQixvQkFBb0I7QUFBQSxNQUNwQiw0QkFBNEI7QUFBQSxNQUM1Qiw0QkFBNEI7QUFBQSxNQUM1QixhQUFhLE9BQU8sWUFBWSxjQUFjQSxhQUFZO0FBQUEsTUFDMUQsWUFBWSxPQUFPLFdBQVcsY0FBY0EsYUFBWTtBQUFBLE1BQ3hELG1CQUFtQixPQUFPLGtCQUFrQixjQUFjQSxhQUFZO0FBQUEsTUFDdEUsb0JBQW9CLE9BQU8sbUJBQW1CLGNBQWNBLGFBQVk7QUFBQSxNQUN4RSxhQUFhO0FBQUEsTUFDYixjQUFjLE9BQU8sYUFBYSxjQUFjQSxhQUFZO0FBQUEsTUFDNUQsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2Ysd0JBQXdCO0FBQUEsTUFDeEIsZUFBZTtBQUFBLE1BQ2Ysd0JBQXdCO0FBQUEsTUFDeEIsV0FBVztBQUFBLE1BQ1gsVUFBVTtBQUFBO0FBQUEsTUFDVixlQUFlO0FBQUEsTUFDZixrQkFBa0IsT0FBTyxpQkFBaUIsY0FBY0EsYUFBWTtBQUFBLE1BQ3BFLGtCQUFrQixPQUFPLGlCQUFpQixjQUFjQSxhQUFZO0FBQUEsTUFDcEUsMEJBQTBCLE9BQU8seUJBQXlCLGNBQWNBLGFBQVk7QUFBQSxNQUNwRixjQUFjO0FBQUEsTUFDZCx1QkFBdUI7QUFBQSxNQUN2QixlQUFlLE9BQU8sY0FBYyxjQUFjQSxhQUFZO0FBQUEsTUFDOUQsZ0JBQWdCLE9BQU8sZUFBZSxjQUFjQSxhQUFZO0FBQUEsTUFDaEUsZ0JBQWdCLE9BQU8sZUFBZSxjQUFjQSxhQUFZO0FBQUEsTUFDaEUsY0FBYztBQUFBLE1BQ2QsV0FBVztBQUFBLE1BQ1gsdUJBQXVCLGNBQWMsV0FBVyxTQUFTLFNBQVMsQ0FBQyxFQUFFLE9BQU8sUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJQTtBQUFBLE1BQzVGLFVBQVUsT0FBTyxTQUFTLFdBQVcsT0FBT0E7QUFBQSxNQUM1QyxTQUFTLE9BQU8sUUFBUSxjQUFjQSxhQUFZO0FBQUEsTUFDbEQsMEJBQTBCLE9BQU8sUUFBUSxlQUFlLENBQUMsY0FBYyxDQUFDLFdBQVdBLGFBQVksVUFBUyxvQkFBSSxJQUFJLEdBQUUsT0FBTyxRQUFRLEVBQUUsQ0FBQztBQUFBLE1BQ3BJLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLGdCQUFnQjtBQUFBLE1BQ2hCLGNBQWM7QUFBQSxNQUNkLGFBQWEsT0FBTyxZQUFZLGNBQWNBLGFBQVk7QUFBQSxNQUMxRCxXQUFXLE9BQU8sVUFBVSxjQUFjQSxhQUFZO0FBQUEsTUFDdEQsZ0JBQWdCO0FBQUEsTUFDaEIsb0JBQW9CO0FBQUEsTUFDcEIsYUFBYSxPQUFPLFlBQVksY0FBY0EsYUFBWTtBQUFBLE1BQzFELFlBQVk7QUFBQSxNQUNaLFNBQVMsT0FBTyxRQUFRLGNBQWNBLGFBQVk7QUFBQSxNQUNsRCwwQkFBMEIsT0FBTyxRQUFRLGVBQWUsQ0FBQyxjQUFjLENBQUMsV0FBV0EsYUFBWSxVQUFTLG9CQUFJLElBQUksR0FBRSxPQUFPLFFBQVEsRUFBRSxDQUFDO0FBQUEsTUFDcEksdUJBQXVCLE9BQU8sc0JBQXNCLGNBQWNBLGFBQVk7QUFBQSxNQUM5RSxZQUFZO0FBQUEsTUFDWiw2QkFBNkIsY0FBYyxXQUFXLFNBQVMsR0FBRyxPQUFPLFFBQVEsRUFBRSxDQUFDLElBQUlBO0FBQUEsTUFDeEYsWUFBWSxhQUFhLFNBQVNBO0FBQUEsTUFDbEMsaUJBQWlCO0FBQUEsTUFDakIsb0JBQW9CO0FBQUEsTUFDcEIsZ0JBQWdCO0FBQUEsTUFDaEIsZUFBZTtBQUFBLE1BQ2YsZ0JBQWdCLE9BQU8sZUFBZSxjQUFjQSxhQUFZO0FBQUEsTUFDaEUsdUJBQXVCLE9BQU8sc0JBQXNCLGNBQWNBLGFBQVk7QUFBQSxNQUM5RSxpQkFBaUIsT0FBTyxnQkFBZ0IsY0FBY0EsYUFBWTtBQUFBLE1BQ2xFLGlCQUFpQixPQUFPLGdCQUFnQixjQUFjQSxhQUFZO0FBQUEsTUFDbEUsY0FBYztBQUFBLE1BQ2QsYUFBYSxPQUFPLFlBQVksY0FBY0EsYUFBWTtBQUFBLE1BQzFELGFBQWEsT0FBTyxZQUFZLGNBQWNBLGFBQVk7QUFBQSxNQUMxRCxhQUFhLE9BQU8sWUFBWSxjQUFjQSxhQUFZO0FBQUEsSUFDM0Q7QUFFQSxRQUFJLFVBQVU7QUFDYixVQUFJO0FBQ0gsYUFBSztBQUFBLE1BQ04sU0FBUyxHQUFHO0FBRVAscUJBQWEsU0FBUyxTQUFTLENBQUMsQ0FBQztBQUNyQyxtQkFBVyxtQkFBbUIsSUFBSTtBQUFBLE1BQ25DO0FBQUEsSUFDRDtBQUhNO0FBS04sUUFBSSxTQUFTLFNBQVNDLFFBQU8sTUFBTTtBQUNsQyxVQUFJO0FBQ0osVUFBSSxTQUFTLG1CQUFtQjtBQUMvQixnQkFBUSxzQkFBc0Isc0JBQXNCO0FBQUEsTUFDckQsV0FBVyxTQUFTLHVCQUF1QjtBQUMxQyxnQkFBUSxzQkFBc0IsaUJBQWlCO0FBQUEsTUFDaEQsV0FBVyxTQUFTLDRCQUE0QjtBQUMvQyxnQkFBUSxzQkFBc0IsdUJBQXVCO0FBQUEsTUFDdEQsV0FBVyxTQUFTLG9CQUFvQjtBQUN2QyxZQUFJLEtBQUtBLFFBQU8sMEJBQTBCO0FBQzFDLFlBQUksSUFBSTtBQUNQLGtCQUFRLEdBQUc7QUFBQSxRQUNaO0FBQUEsTUFDRCxXQUFXLFNBQVMsNEJBQTRCO0FBQy9DLFlBQUksTUFBTUEsUUFBTyxrQkFBa0I7QUFDbkMsWUFBSSxPQUFPLFVBQVU7QUFDcEIsa0JBQVEsU0FBUyxJQUFJLFNBQVM7QUFBQSxRQUMvQjtBQUFBLE1BQ0Q7QUFFQSxpQkFBVyxJQUFJLElBQUk7QUFFbkIsYUFBTztBQUFBLElBQ1I7QUFFQSxRQUFJLGlCQUFpQjtBQUFBLE1BQ3BCLFdBQVc7QUFBQSxNQUNYLDBCQUEwQixDQUFDLGVBQWUsV0FBVztBQUFBLE1BQ3JELG9CQUFvQixDQUFDLFNBQVMsV0FBVztBQUFBLE1BQ3pDLHdCQUF3QixDQUFDLFNBQVMsYUFBYSxTQUFTO0FBQUEsTUFDeEQsd0JBQXdCLENBQUMsU0FBUyxhQUFhLFNBQVM7QUFBQSxNQUN4RCxxQkFBcUIsQ0FBQyxTQUFTLGFBQWEsTUFBTTtBQUFBLE1BQ2xELHVCQUF1QixDQUFDLFNBQVMsYUFBYSxRQUFRO0FBQUEsTUFDdEQsNEJBQTRCLENBQUMsaUJBQWlCLFdBQVc7QUFBQSxNQUN6RCxvQkFBb0IsQ0FBQywwQkFBMEIsV0FBVztBQUFBLE1BQzFELDZCQUE2QixDQUFDLDBCQUEwQixhQUFhLFdBQVc7QUFBQSxNQUNoRixzQkFBc0IsQ0FBQyxXQUFXLFdBQVc7QUFBQSxNQUM3Qyx1QkFBdUIsQ0FBQyxZQUFZLFdBQVc7QUFBQSxNQUMvQyxtQkFBbUIsQ0FBQyxRQUFRLFdBQVc7QUFBQSxNQUN2QyxvQkFBb0IsQ0FBQyxTQUFTLFdBQVc7QUFBQSxNQUN6Qyx3QkFBd0IsQ0FBQyxhQUFhLFdBQVc7QUFBQSxNQUNqRCwyQkFBMkIsQ0FBQyxnQkFBZ0IsV0FBVztBQUFBLE1BQ3ZELDJCQUEyQixDQUFDLGdCQUFnQixXQUFXO0FBQUEsTUFDdkQsdUJBQXVCLENBQUMsWUFBWSxXQUFXO0FBQUEsTUFDL0MsZUFBZSxDQUFDLHFCQUFxQixXQUFXO0FBQUEsTUFDaEQsd0JBQXdCLENBQUMscUJBQXFCLGFBQWEsV0FBVztBQUFBLE1BQ3RFLHdCQUF3QixDQUFDLGFBQWEsV0FBVztBQUFBLE1BQ2pELHlCQUF5QixDQUFDLGNBQWMsV0FBVztBQUFBLE1BQ25ELHlCQUF5QixDQUFDLGNBQWMsV0FBVztBQUFBLE1BQ25ELGVBQWUsQ0FBQyxRQUFRLE9BQU87QUFBQSxNQUMvQixtQkFBbUIsQ0FBQyxRQUFRLFdBQVc7QUFBQSxNQUN2QyxrQkFBa0IsQ0FBQyxPQUFPLFdBQVc7QUFBQSxNQUNyQyxxQkFBcUIsQ0FBQyxVQUFVLFdBQVc7QUFBQSxNQUMzQyxxQkFBcUIsQ0FBQyxVQUFVLFdBQVc7QUFBQSxNQUMzQyx1QkFBdUIsQ0FBQyxVQUFVLGFBQWEsVUFBVTtBQUFBLE1BQ3pELHNCQUFzQixDQUFDLFVBQVUsYUFBYSxTQUFTO0FBQUEsTUFDdkQsc0JBQXNCLENBQUMsV0FBVyxXQUFXO0FBQUEsTUFDN0MsdUJBQXVCLENBQUMsV0FBVyxhQUFhLE1BQU07QUFBQSxNQUN0RCxpQkFBaUIsQ0FBQyxXQUFXLEtBQUs7QUFBQSxNQUNsQyxvQkFBb0IsQ0FBQyxXQUFXLFFBQVE7QUFBQSxNQUN4QyxxQkFBcUIsQ0FBQyxXQUFXLFNBQVM7QUFBQSxNQUMxQyx5QkFBeUIsQ0FBQyxjQUFjLFdBQVc7QUFBQSxNQUNuRCw2QkFBNkIsQ0FBQyxrQkFBa0IsV0FBVztBQUFBLE1BQzNELHFCQUFxQixDQUFDLFVBQVUsV0FBVztBQUFBLE1BQzNDLGtCQUFrQixDQUFDLE9BQU8sV0FBVztBQUFBLE1BQ3JDLGdDQUFnQyxDQUFDLHFCQUFxQixXQUFXO0FBQUEsTUFDakUscUJBQXFCLENBQUMsVUFBVSxXQUFXO0FBQUEsTUFDM0MscUJBQXFCLENBQUMsVUFBVSxXQUFXO0FBQUEsTUFDM0MsMEJBQTBCLENBQUMsZUFBZSxXQUFXO0FBQUEsTUFDckQseUJBQXlCLENBQUMsY0FBYyxXQUFXO0FBQUEsTUFDbkQsd0JBQXdCLENBQUMsYUFBYSxXQUFXO0FBQUEsTUFDakQseUJBQXlCLENBQUMsY0FBYyxXQUFXO0FBQUEsTUFDbkQsZ0NBQWdDLENBQUMscUJBQXFCLFdBQVc7QUFBQSxNQUNqRSwwQkFBMEIsQ0FBQyxlQUFlLFdBQVc7QUFBQSxNQUNyRCwwQkFBMEIsQ0FBQyxlQUFlLFdBQVc7QUFBQSxNQUNyRCx1QkFBdUIsQ0FBQyxZQUFZLFdBQVc7QUFBQSxNQUMvQyxzQkFBc0IsQ0FBQyxXQUFXLFdBQVc7QUFBQSxNQUM3QyxzQkFBc0IsQ0FBQyxXQUFXLFdBQVc7QUFBQSxJQUM5QztBQUVBLFFBQUksT0FBTztBQUNYLFFBQUksU0FBUztBQUNiLFFBQUksVUFBVSxLQUFLLEtBQUssU0FBUyxNQUFNLE1BQU0sVUFBVSxNQUFNO0FBQzdELFFBQUksZUFBZSxLQUFLLEtBQUssU0FBUyxPQUFPLE1BQU0sVUFBVSxNQUFNO0FBQ25FLFFBQUksV0FBVyxLQUFLLEtBQUssU0FBUyxNQUFNLE9BQU8sVUFBVSxPQUFPO0FBQ2hFLFFBQUksWUFBWSxLQUFLLEtBQUssU0FBUyxNQUFNLE9BQU8sVUFBVSxLQUFLO0FBQy9ELFFBQUksUUFBUSxLQUFLLEtBQUssU0FBUyxNQUFNLE9BQU8sVUFBVSxJQUFJO0FBRzFELFFBQUksYUFBYTtBQUNqQixRQUFJLGVBQWU7QUFDbkIsUUFBSSxlQUFlLFNBQVNDLGNBQWEsUUFBUTtBQUNoRCxVQUFJQyxTQUFRLFVBQVUsUUFBUSxHQUFHLENBQUM7QUFDbEMsVUFBSUMsUUFBTyxVQUFVLFFBQVEsRUFBRTtBQUMvQixVQUFJRCxXQUFVLE9BQU9DLFVBQVMsS0FBSztBQUNsQyxjQUFNLElBQUksYUFBYSxnREFBZ0Q7QUFBQSxNQUN4RSxXQUFXQSxVQUFTLE9BQU9ELFdBQVUsS0FBSztBQUN6QyxjQUFNLElBQUksYUFBYSxnREFBZ0Q7QUFBQSxNQUN4RTtBQUNBLFVBQUksU0FBUyxDQUFDO0FBQ2QsZUFBUyxRQUFRLFlBQVksU0FBVSxPQUFPLFFBQVEsT0FBTyxXQUFXO0FBQ3ZFLGVBQU8sT0FBTyxNQUFNLElBQUksUUFBUSxTQUFTLFdBQVcsY0FBYyxJQUFJLElBQUksVUFBVTtBQUFBLE1BQ3JGLENBQUM7QUFDRCxhQUFPO0FBQUEsSUFDUjtBQUdBLFFBQUksbUJBQW1CLFNBQVNFLGtCQUFpQixNQUFNLGNBQWM7QUFDcEUsVUFBSSxnQkFBZ0I7QUFDcEIsVUFBSTtBQUNKLFVBQUksT0FBTyxnQkFBZ0IsYUFBYSxHQUFHO0FBQzFDLGdCQUFRLGVBQWUsYUFBYTtBQUNwQyx3QkFBZ0IsTUFBTSxNQUFNLENBQUMsSUFBSTtBQUFBLE1BQ2xDO0FBRUEsVUFBSSxPQUFPLFlBQVksYUFBYSxHQUFHO0FBQ3RDLFlBQUksUUFBUSxXQUFXLGFBQWE7QUFDcEMsWUFBSSxVQUFVLFdBQVc7QUFDeEIsa0JBQVEsT0FBTyxhQUFhO0FBQUEsUUFDN0I7QUFDQSxZQUFJLE9BQU8sVUFBVSxlQUFlLENBQUMsY0FBYztBQUNsRCxnQkFBTSxJQUFJLFdBQVcsZUFBZSxPQUFPLHNEQUFzRDtBQUFBLFFBQ2xHO0FBRUEsZUFBTztBQUFBLFVBQ047QUFBQSxVQUNBLE1BQU07QUFBQSxVQUNOO0FBQUEsUUFDRDtBQUFBLE1BQ0Q7QUFFQSxZQUFNLElBQUksYUFBYSxlQUFlLE9BQU8sa0JBQWtCO0FBQUEsSUFDaEU7QUFFQSxJQUFBTixRQUFPLFVBQVUsU0FBUyxhQUFhLE1BQU0sY0FBYztBQUMxRCxVQUFJLE9BQU8sU0FBUyxZQUFZLEtBQUssV0FBVyxHQUFHO0FBQ2xELGNBQU0sSUFBSSxXQUFXLDJDQUEyQztBQUFBLE1BQ2pFO0FBQ0EsVUFBSSxVQUFVLFNBQVMsS0FBSyxPQUFPLGlCQUFpQixXQUFXO0FBQzlELGNBQU0sSUFBSSxXQUFXLDJDQUEyQztBQUFBLE1BQ2pFO0FBRUEsVUFBSSxNQUFNLGVBQWUsSUFBSSxNQUFNLE1BQU07QUFDeEMsY0FBTSxJQUFJLGFBQWEsb0ZBQW9GO0FBQUEsTUFDNUc7QUFDQSxVQUFJLFFBQVEsYUFBYSxJQUFJO0FBQzdCLFVBQUksb0JBQW9CLE1BQU0sU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJO0FBRXRELFVBQUksWUFBWSxpQkFBaUIsTUFBTSxvQkFBb0IsS0FBSyxZQUFZO0FBQzVFLFVBQUksb0JBQW9CLFVBQVU7QUFDbEMsVUFBSSxRQUFRLFVBQVU7QUFDdEIsVUFBSSxxQkFBcUI7QUFFekIsVUFBSSxRQUFRLFVBQVU7QUFDdEIsVUFBSSxPQUFPO0FBQ1YsNEJBQW9CLE1BQU0sQ0FBQztBQUMzQixxQkFBYSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7QUFBQSxNQUMzQztBQUVBLGVBQVMsSUFBSSxHQUFHLFFBQVEsTUFBTSxJQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDdkQsWUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixZQUFJSSxTQUFRLFVBQVUsTUFBTSxHQUFHLENBQUM7QUFDaEMsWUFBSUMsUUFBTyxVQUFVLE1BQU0sRUFBRTtBQUM3QixhQUVHRCxXQUFVLE9BQU9BLFdBQVUsT0FBT0EsV0FBVSxRQUN6Q0MsVUFBUyxPQUFPQSxVQUFTLE9BQU9BLFVBQVMsU0FFM0NELFdBQVVDLE9BQ1o7QUFDRCxnQkFBTSxJQUFJLGFBQWEsc0RBQXNEO0FBQUEsUUFDOUU7QUFDQSxZQUFJLFNBQVMsaUJBQWlCLENBQUMsT0FBTztBQUNyQywrQkFBcUI7QUFBQSxRQUN0QjtBQUVBLDZCQUFxQixNQUFNO0FBQzNCLDRCQUFvQixNQUFNLG9CQUFvQjtBQUU5QyxZQUFJLE9BQU8sWUFBWSxpQkFBaUIsR0FBRztBQUMxQyxrQkFBUSxXQUFXLGlCQUFpQjtBQUFBLFFBQ3JDLFdBQVcsU0FBUyxNQUFNO0FBQ3pCLGNBQUksRUFBRSxRQUFRLFFBQVE7QUFDckIsZ0JBQUksQ0FBQyxjQUFjO0FBQ2xCLG9CQUFNLElBQUksV0FBVyx3QkFBd0IsT0FBTyw2Q0FBNkM7QUFBQSxZQUNsRztBQUNBLG1CQUFPO0FBQUEsVUFDUjtBQUNBLGNBQUksU0FBVSxJQUFJLEtBQU0sTUFBTSxRQUFRO0FBQ3JDLGdCQUFJLE9BQU8sTUFBTSxPQUFPLElBQUk7QUFDNUIsb0JBQVEsQ0FBQyxDQUFDO0FBU1YsZ0JBQUksU0FBUyxTQUFTLFFBQVEsRUFBRSxtQkFBbUIsS0FBSyxNQUFNO0FBQzdELHNCQUFRLEtBQUs7QUFBQSxZQUNkLE9BQU87QUFDTixzQkFBUSxNQUFNLElBQUk7QUFBQSxZQUNuQjtBQUFBLFVBQ0QsT0FBTztBQUNOLG9CQUFRLE9BQU8sT0FBTyxJQUFJO0FBQzFCLG9CQUFRLE1BQU0sSUFBSTtBQUFBLFVBQ25CO0FBRUEsY0FBSSxTQUFTLENBQUMsb0JBQW9CO0FBQ2pDLHVCQUFXLGlCQUFpQixJQUFJO0FBQUEsVUFDakM7QUFBQSxRQUNEO0FBQUEsTUFDRDtBQUNBLGFBQU87QUFBQSxJQUNSO0FBQUE7QUFBQTs7O0FDdFdBO0FBQUEsNkNBQUFFLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxlQUFlO0FBR25CLFFBQUksa0JBQWtCLGFBQWEsMkJBQTJCLElBQUksS0FBSztBQUN2RSxRQUFJLGlCQUFpQjtBQUNwQixVQUFJO0FBQ0gsd0JBQWdCLENBQUMsR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFBQSxNQUN0QyxTQUFTLEdBQUc7QUFFWCwwQkFBa0I7QUFBQSxNQUNuQjtBQUFBLElBQ0Q7QUFFQSxJQUFBQSxRQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUNmakI7QUFBQSwrQkFBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLGVBQWU7QUFFbkIsUUFBSSxRQUFRLGFBQWEscUNBQXFDLElBQUk7QUFFbEUsUUFBSSxPQUFPO0FBQ1YsVUFBSTtBQUNILGNBQU0sQ0FBQyxHQUFHLFFBQVE7QUFBQSxNQUNuQixTQUFTLEdBQUc7QUFFWCxnQkFBUTtBQUFBLE1BQ1Q7QUFBQSxJQUNEO0FBRUEsSUFBQUEsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDZmpCO0FBQUEsK0NBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxrQkFBa0I7QUFFdEIsUUFBSSxlQUFlO0FBQ25CLFFBQUksYUFBYTtBQUVqQixRQUFJLE9BQU87QUFHWCxJQUFBQSxRQUFPLFVBQVUsU0FBUyxtQkFDekIsS0FDQSxVQUNBLE9BQ0M7QUFDRCxVQUFJLENBQUMsT0FBUSxPQUFPLFFBQVEsWUFBWSxPQUFPLFFBQVEsWUFBYTtBQUNuRSxjQUFNLElBQUksV0FBVyx3Q0FBd0M7QUFBQSxNQUM5RDtBQUNBLFVBQUksT0FBTyxhQUFhLFlBQVksT0FBTyxhQUFhLFVBQVU7QUFDakUsY0FBTSxJQUFJLFdBQVcsMENBQTBDO0FBQUEsTUFDaEU7QUFDQSxVQUFJLFVBQVUsU0FBUyxLQUFLLE9BQU8sVUFBVSxDQUFDLE1BQU0sYUFBYSxVQUFVLENBQUMsTUFBTSxNQUFNO0FBQ3ZGLGNBQU0sSUFBSSxXQUFXLHlEQUF5RDtBQUFBLE1BQy9FO0FBQ0EsVUFBSSxVQUFVLFNBQVMsS0FBSyxPQUFPLFVBQVUsQ0FBQyxNQUFNLGFBQWEsVUFBVSxDQUFDLE1BQU0sTUFBTTtBQUN2RixjQUFNLElBQUksV0FBVyx1REFBdUQ7QUFBQSxNQUM3RTtBQUNBLFVBQUksVUFBVSxTQUFTLEtBQUssT0FBTyxVQUFVLENBQUMsTUFBTSxhQUFhLFVBQVUsQ0FBQyxNQUFNLE1BQU07QUFDdkYsY0FBTSxJQUFJLFdBQVcsMkRBQTJEO0FBQUEsTUFDakY7QUFDQSxVQUFJLFVBQVUsU0FBUyxLQUFLLE9BQU8sVUFBVSxDQUFDLE1BQU0sV0FBVztBQUM5RCxjQUFNLElBQUksV0FBVyx5Q0FBeUM7QUFBQSxNQUMvRDtBQUVBLFVBQUksZ0JBQWdCLFVBQVUsU0FBUyxJQUFJLFVBQVUsQ0FBQyxJQUFJO0FBQzFELFVBQUksY0FBYyxVQUFVLFNBQVMsSUFBSSxVQUFVLENBQUMsSUFBSTtBQUN4RCxVQUFJLGtCQUFrQixVQUFVLFNBQVMsSUFBSSxVQUFVLENBQUMsSUFBSTtBQUM1RCxVQUFJLFFBQVEsVUFBVSxTQUFTLElBQUksVUFBVSxDQUFDLElBQUk7QUFHbEQsVUFBSSxPQUFPLENBQUMsQ0FBQyxRQUFRLEtBQUssS0FBSyxRQUFRO0FBRXZDLFVBQUksaUJBQWlCO0FBQ3BCLHdCQUFnQixLQUFLLFVBQVU7QUFBQSxVQUM5QixjQUFjLG9CQUFvQixRQUFRLE9BQU8sS0FBSyxlQUFlLENBQUM7QUFBQSxVQUN0RSxZQUFZLGtCQUFrQixRQUFRLE9BQU8sS0FBSyxhQUFhLENBQUM7QUFBQSxVQUNoRTtBQUFBLFVBQ0EsVUFBVSxnQkFBZ0IsUUFBUSxPQUFPLEtBQUssV0FBVyxDQUFDO0FBQUEsUUFDM0QsQ0FBQztBQUFBLE1BQ0YsV0FBVyxTQUFVLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGlCQUFrQjtBQUV6RSxZQUFJLFFBQVEsSUFBSTtBQUFBLE1BQ2pCLE9BQU87QUFDTixjQUFNLElBQUksYUFBYSw2R0FBNkc7QUFBQSxNQUNySTtBQUFBLElBQ0Q7QUFBQTtBQUFBOzs7QUN2REE7QUFBQSxtREFBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLGtCQUFrQjtBQUV0QixRQUFJLHlCQUF5QixTQUFTQywwQkFBeUI7QUFDOUQsYUFBTyxDQUFDLENBQUM7QUFBQSxJQUNWO0FBRUEsMkJBQXVCLDBCQUEwQixTQUFTLDBCQUEwQjtBQUVuRixVQUFJLENBQUMsaUJBQWlCO0FBQ3JCLGVBQU87QUFBQSxNQUNSO0FBQ0EsVUFBSTtBQUNILGVBQU8sZ0JBQWdCLENBQUMsR0FBRyxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxXQUFXO0FBQUEsTUFDL0QsU0FBUyxHQUFHO0FBRVgsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBRUEsSUFBQUQsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDckJqQjtBQUFBLDRDQUFBRSxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksT0FBTztBQUNYLFFBQUksYUFBYSxPQUFPLFdBQVcsY0FBYyxPQUFPLE9BQU8sS0FBSyxNQUFNO0FBRTFFLFFBQUksUUFBUSxPQUFPLFVBQVU7QUFDN0IsUUFBSSxTQUFTLE1BQU0sVUFBVTtBQUM3QixRQUFJLHFCQUFxQjtBQUV6QixRQUFJQyxjQUFhLFNBQVUsSUFBSTtBQUM5QixhQUFPLE9BQU8sT0FBTyxjQUFjLE1BQU0sS0FBSyxFQUFFLE1BQU07QUFBQSxJQUN2RDtBQUVBLFFBQUksc0JBQXNCLG1DQUFvQztBQUU5RCxRQUFJLGlCQUFpQixTQUFVLFFBQVEsTUFBTSxPQUFPLFdBQVc7QUFDOUQsVUFBSSxRQUFRLFFBQVE7QUFDbkIsWUFBSSxjQUFjLE1BQU07QUFDdkIsY0FBSSxPQUFPLElBQUksTUFBTSxPQUFPO0FBQzNCO0FBQUEsVUFDRDtBQUFBLFFBQ0QsV0FBVyxDQUFDQSxZQUFXLFNBQVMsS0FBSyxDQUFDLFVBQVUsR0FBRztBQUNsRDtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBRUEsVUFBSSxxQkFBcUI7QUFDeEIsMkJBQW1CLFFBQVEsTUFBTSxPQUFPLElBQUk7QUFBQSxNQUM3QyxPQUFPO0FBQ04sMkJBQW1CLFFBQVEsTUFBTSxLQUFLO0FBQUEsTUFDdkM7QUFBQSxJQUNEO0FBRUEsUUFBSSxtQkFBbUIsU0FBVSxRQUFRLEtBQUs7QUFDN0MsVUFBSSxhQUFhLFVBQVUsU0FBUyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUM7QUFDeEQsVUFBSSxRQUFRLEtBQUssR0FBRztBQUNwQixVQUFJLFlBQVk7QUFDZixnQkFBUSxPQUFPLEtBQUssT0FBTyxPQUFPLHNCQUFzQixHQUFHLENBQUM7QUFBQSxNQUM3RDtBQUNBLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUssR0FBRztBQUN6Qyx1QkFBZSxRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxXQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFBQSxNQUNyRTtBQUFBLElBQ0Q7QUFFQSxxQkFBaUIsc0JBQXNCLENBQUMsQ0FBQztBQUV6QyxJQUFBRCxRQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUM5Q2pCO0FBQUEsOENBQUFFLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxlQUFlO0FBQ25CLFFBQUlDLFVBQVM7QUFDYixRQUFJLGlCQUFpQixtQ0FBb0M7QUFDekQsUUFBSSxPQUFPO0FBRVgsUUFBSSxhQUFhO0FBQ2pCLFFBQUksU0FBUyxhQUFhLGNBQWM7QUFHeEMsSUFBQUQsUUFBTyxVQUFVLFNBQVMsa0JBQWtCLElBQUksUUFBUTtBQUN2RCxVQUFJLE9BQU8sT0FBTyxZQUFZO0FBQzdCLGNBQU0sSUFBSSxXQUFXLHdCQUF3QjtBQUFBLE1BQzlDO0FBQ0EsVUFBSSxPQUFPLFdBQVcsWUFBWSxTQUFTLEtBQUssU0FBUyxjQUFjLE9BQU8sTUFBTSxNQUFNLFFBQVE7QUFDakcsY0FBTSxJQUFJLFdBQVcsNENBQTRDO0FBQUEsTUFDbEU7QUFFQSxVQUFJLFFBQVEsVUFBVSxTQUFTLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUVqRCxVQUFJLCtCQUErQjtBQUNuQyxVQUFJLDJCQUEyQjtBQUMvQixVQUFJLFlBQVksTUFBTSxNQUFNO0FBQzNCLFlBQUksT0FBTyxLQUFLLElBQUksUUFBUTtBQUM1QixZQUFJLFFBQVEsQ0FBQyxLQUFLLGNBQWM7QUFDL0IseUNBQStCO0FBQUEsUUFDaEM7QUFDQSxZQUFJLFFBQVEsQ0FBQyxLQUFLLFVBQVU7QUFDM0IscUNBQTJCO0FBQUEsUUFDNUI7QUFBQSxNQUNEO0FBRUEsVUFBSSxnQ0FBZ0MsNEJBQTRCLENBQUMsT0FBTztBQUN2RSxZQUFJLGdCQUFnQjtBQUNuQixVQUFBQztBQUFBO0FBQUEsWUFBNkM7QUFBQSxZQUFLO0FBQUEsWUFBVTtBQUFBLFlBQVE7QUFBQSxZQUFNO0FBQUEsVUFBSTtBQUFBLFFBQy9FLE9BQU87QUFDTixVQUFBQTtBQUFBO0FBQUEsWUFBNkM7QUFBQSxZQUFLO0FBQUEsWUFBVTtBQUFBLFVBQU07QUFBQSxRQUNuRTtBQUFBLE1BQ0Q7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7OztBQ3pDQTtBQUFBLG9DQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksT0FBTztBQUNYLFFBQUksZUFBZTtBQUNuQixRQUFJLG9CQUFvQjtBQUV4QixRQUFJLGFBQWE7QUFDakIsUUFBSSxTQUFTLGFBQWEsNEJBQTRCO0FBQ3RELFFBQUksUUFBUSxhQUFhLDJCQUEyQjtBQUNwRCxRQUFJLGdCQUFnQixhQUFhLG1CQUFtQixJQUFJLEtBQUssS0FBSyxLQUFLLE9BQU8sTUFBTTtBQUVwRixRQUFJLGtCQUFrQjtBQUN0QixRQUFJLE9BQU8sYUFBYSxZQUFZO0FBRXBDLElBQUFBLFFBQU8sVUFBVSxTQUFTLFNBQVMsa0JBQWtCO0FBQ3BELFVBQUksT0FBTyxxQkFBcUIsWUFBWTtBQUMzQyxjQUFNLElBQUksV0FBVyx3QkFBd0I7QUFBQSxNQUM5QztBQUNBLFVBQUksT0FBTyxjQUFjLE1BQU0sT0FBTyxTQUFTO0FBQy9DLGFBQU87QUFBQSxRQUNOO0FBQUEsUUFDQSxJQUFJLEtBQUssR0FBRyxpQkFBaUIsVUFBVSxVQUFVLFNBQVMsRUFBRTtBQUFBLFFBQzVEO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFFQSxRQUFJLFlBQVksU0FBU0MsYUFBWTtBQUNwQyxhQUFPLGNBQWMsTUFBTSxRQUFRLFNBQVM7QUFBQSxJQUM3QztBQUVBLFFBQUksaUJBQWlCO0FBQ3BCLHNCQUFnQkQsUUFBTyxTQUFTLFNBQVMsRUFBRSxPQUFPLFVBQVUsQ0FBQztBQUFBLElBQzlELE9BQU87QUFDTixNQUFBQSxRQUFPLFFBQVEsUUFBUTtBQUFBLElBQ3hCO0FBQUE7QUFBQTs7O0FDbENBO0FBQUEsd0NBQUFFLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxlQUFlO0FBRW5CLFFBQUksV0FBVztBQUVmLFFBQUksV0FBVyxTQUFTLGFBQWEsMEJBQTBCLENBQUM7QUFFaEUsSUFBQUEsUUFBTyxVQUFVLFNBQVMsbUJBQW1CLE1BQU0sY0FBYztBQUNoRSxVQUFJLFlBQVksYUFBYSxNQUFNLENBQUMsQ0FBQyxZQUFZO0FBQ2pELFVBQUksT0FBTyxjQUFjLGNBQWMsU0FBUyxNQUFNLGFBQWEsSUFBSSxJQUFJO0FBQzFFLGVBQU8sU0FBUyxTQUFTO0FBQUEsTUFDMUI7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7OztBQ2RBLElBQUFDLDBCQUFBO0FBQUEsaURBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBR0EsUUFBSSxhQUFhO0FBQ2pCLFFBQUksYUFBYSxnQkFBNkI7QUFDOUMsUUFBSSxZQUFZO0FBQ2hCLFFBQUksV0FBVztBQUNmLFFBQUksUUFBUSxVQUFVLHNCQUFzQjtBQUM1QyxRQUFJLG9CQUFvQixVQUFVLHVDQUF1QztBQUN6RSxRQUFJLHFCQUFxQixhQUFhLE9BQU8sd0JBQXdCO0FBR3JFLElBQUFBLFFBQU8sVUFBVSxTQUFTQyxRQUFPLFFBQVEsU0FBUztBQUNqRCxVQUFJLFVBQVUsTUFBTTtBQUFFLGNBQU0sSUFBSSxVQUFVLDBCQUEwQjtBQUFBLE1BQUc7QUFDdkUsVUFBSSxLQUFLLFNBQVMsTUFBTTtBQUN4QixVQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzNCLGVBQU87QUFBQSxNQUNSO0FBQ0EsZUFBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsRUFBRSxHQUFHO0FBQzFDLFlBQUksT0FBTyxTQUFTLFVBQVUsQ0FBQyxDQUFDO0FBR2hDLFlBQUksT0FBTyxXQUFXLElBQUk7QUFDMUIsWUFBSSxhQUFhLGVBQWUsT0FBTyx5QkFBeUI7QUFDaEUsWUFBSSxZQUFZO0FBQ2YsY0FBSSxPQUFPLFdBQVcsSUFBSTtBQUMxQixtQkFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsRUFBRSxHQUFHO0FBQ3JDLGdCQUFJQyxPQUFNLEtBQUssQ0FBQztBQUNoQixnQkFBSSxrQkFBa0IsTUFBTUEsSUFBRyxHQUFHO0FBQ2pDLG9CQUFNLE1BQU1BLElBQUc7QUFBQSxZQUNoQjtBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBR0EsaUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEVBQUUsR0FBRztBQUNyQyxjQUFJLFVBQVUsS0FBSyxDQUFDO0FBQ3BCLGNBQUksa0JBQWtCLE1BQU0sT0FBTyxHQUFHO0FBQ3JDLGdCQUFJLFlBQVksS0FBSyxPQUFPO0FBQzVCLGVBQUcsT0FBTyxJQUFJO0FBQUEsVUFDZjtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBRUEsYUFBTztBQUFBLElBQ1I7QUFBQTtBQUFBOzs7QUM3Q0E7QUFBQSwyQ0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLGlCQUFpQjtBQUVyQixRQUFJLDhCQUE4QixXQUFZO0FBQzdDLFVBQUksQ0FBQyxPQUFPLFFBQVE7QUFDbkIsZUFBTztBQUFBLE1BQ1I7QUFLQSxVQUFJLE1BQU07QUFDVixVQUFJLFVBQVUsSUFBSSxNQUFNLEVBQUU7QUFDMUIsVUFBSSxNQUFNLENBQUM7QUFDWCxlQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxFQUFFLEdBQUc7QUFDeEMsWUFBSSxRQUFRLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQztBQUFBLE1BQzVCO0FBQ0EsVUFBSSxNQUFNLE9BQU8sT0FBTyxDQUFDLEdBQUcsR0FBRztBQUMvQixVQUFJLFNBQVM7QUFDYixlQUFTLEtBQUssS0FBSztBQUNsQixrQkFBVTtBQUFBLE1BQ1g7QUFDQSxhQUFPLFFBQVE7QUFBQSxJQUNoQjtBQUVBLFFBQUksNkJBQTZCLFdBQVk7QUFDNUMsVUFBSSxDQUFDLE9BQU8sVUFBVSxDQUFDLE9BQU8sbUJBQW1CO0FBQ2hELGVBQU87QUFBQSxNQUNSO0FBS0EsVUFBSSxVQUFVLE9BQU8sa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDL0MsVUFBSTtBQUNILGVBQU8sT0FBTyxTQUFTLElBQUk7QUFBQSxNQUM1QixTQUFTLEdBQUc7QUFDWCxlQUFPLFFBQVEsQ0FBQyxNQUFNO0FBQUEsTUFDdkI7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUVBLElBQUFBLFFBQU8sVUFBVSxTQUFTLGNBQWM7QUFDdkMsVUFBSSxDQUFDLE9BQU8sUUFBUTtBQUNuQixlQUFPO0FBQUEsTUFDUjtBQUNBLFVBQUksNEJBQTRCLEdBQUc7QUFDbEMsZUFBTztBQUFBLE1BQ1I7QUFDQSxVQUFJLDJCQUEyQixHQUFHO0FBQ2pDLGVBQU87QUFBQSxNQUNSO0FBQ0EsYUFBTyxPQUFPO0FBQUEsSUFDZjtBQUFBO0FBQUE7OztBQ3REQTtBQUFBLHVDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUlDLFVBQVM7QUFDYixRQUFJLGNBQWM7QUFFbEIsSUFBQUQsUUFBTyxVQUFVLFNBQVMsYUFBYTtBQUN0QyxVQUFJLFdBQVcsWUFBWTtBQUMzQixNQUFBQztBQUFBLFFBQ0M7QUFBQSxRQUNBLEVBQUUsUUFBUSxTQUFTO0FBQUEsUUFDbkIsRUFBRSxRQUFRLFdBQVk7QUFBRSxpQkFBTyxPQUFPLFdBQVc7QUFBQSxRQUFVLEVBQUU7QUFBQSxNQUM5RDtBQUNBLGFBQU87QUFBQSxJQUNSO0FBQUE7QUFBQTs7O0FDYkE7QUFBQSx3Q0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLG1CQUFtQjtBQUN2QixRQUFJLFdBQVc7QUFFZixRQUFJLGlCQUFpQjtBQUNyQixRQUFJLGNBQWM7QUFDbEIsUUFBSSxPQUFPO0FBRVgsUUFBSSxXQUFXLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFFM0MsUUFBSSxRQUFRLFNBQVNDLFFBQU8sUUFBUSxTQUFTO0FBQzVDLGFBQU8sU0FBUyxRQUFRLFNBQVM7QUFBQSxJQUNsQztBQUVBLHFCQUFpQixPQUFPO0FBQUEsTUFDdkI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0QsQ0FBQztBQUVELElBQUFELFFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ3JCakI7QUFBQSwrQ0FBQUUsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLHFCQUFxQixTQUFTQyxzQkFBcUI7QUFDdEQsYUFBTyxPQUFPLFNBQVMsSUFBSTtBQUFBLE1BQUMsRUFBRSxTQUFTO0FBQUEsSUFDeEM7QUFFQSxRQUFJLE9BQU8sT0FBTztBQUNsQixRQUFJLE1BQU07QUFDVCxVQUFJO0FBQ0gsYUFBSyxDQUFDLEdBQUcsUUFBUTtBQUFBLE1BQ2xCLFNBQVMsR0FBRztBQUVYLGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRDtBQUVBLHVCQUFtQixpQ0FBaUMsU0FBUyxpQ0FBaUM7QUFDN0YsVUFBSSxDQUFDLG1CQUFtQixLQUFLLENBQUMsTUFBTTtBQUNuQyxlQUFPO0FBQUEsTUFDUjtBQUNBLFVBQUksT0FBTyxLQUFLLFdBQVk7QUFBQSxNQUFDLEdBQUcsTUFBTTtBQUN0QyxhQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLO0FBQUEsSUFDekI7QUFFQSxRQUFJLFFBQVEsU0FBUyxVQUFVO0FBRS9CLHVCQUFtQiwwQkFBMEIsU0FBUywwQkFBMEI7QUFDL0UsYUFBTyxtQkFBbUIsS0FBSyxPQUFPLFVBQVUsY0FBYyxTQUFTLElBQUk7QUFBQSxNQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVM7QUFBQSxJQUMvRjtBQUVBLElBQUFELFFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQzlCakI7QUFBQSw0Q0FBQUUsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJQyxVQUFTO0FBQ2IsUUFBSSxpQkFBaUIsbUNBQW9DO0FBQ3pELFFBQUksaUNBQWlDLCtCQUFnQywrQkFBK0I7QUFFcEcsUUFBSSxhQUFhO0FBR2pCLElBQUFELFFBQU8sVUFBVSxTQUFTLGdCQUFnQixJQUFJLE1BQU07QUFDbkQsVUFBSSxPQUFPLE9BQU8sWUFBWTtBQUM3QixjQUFNLElBQUksV0FBVyx3QkFBd0I7QUFBQSxNQUM5QztBQUNBLFVBQUksUUFBUSxVQUFVLFNBQVMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ2pELFVBQUksQ0FBQyxTQUFTLGdDQUFnQztBQUM3QyxZQUFJLGdCQUFnQjtBQUNuQixVQUFBQztBQUFBO0FBQUEsWUFBNkM7QUFBQSxZQUFLO0FBQUEsWUFBUTtBQUFBLFlBQU07QUFBQSxZQUFNO0FBQUEsVUFBSTtBQUFBLFFBQzNFLE9BQU87QUFDTixVQUFBQTtBQUFBO0FBQUEsWUFBNkM7QUFBQSxZQUFLO0FBQUEsWUFBUTtBQUFBLFVBQUk7QUFBQSxRQUMvRDtBQUFBLE1BQ0Q7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7OztBQ3RCQSxJQUFBQywwQkFBQTtBQUFBLDBEQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksa0JBQWtCO0FBQ3RCLFFBQUksYUFBYTtBQUVqQixRQUFJLFVBQVU7QUFFZCxJQUFBQSxRQUFPLFVBQVUsZ0JBQWdCLFNBQVMsUUFBUTtBQUNqRCxVQUFJLFFBQVEsUUFBUSxTQUFTLFFBQVEsSUFBSSxHQUFHO0FBQzNDLGNBQU0sSUFBSSxXQUFXLG9EQUFvRDtBQUFBLE1BQzFFO0FBQ0EsVUFBSSxTQUFTO0FBQ2IsVUFBSSxLQUFLLFlBQVk7QUFDcEIsa0JBQVU7QUFBQSxNQUNYO0FBQ0EsVUFBSSxLQUFLLFFBQVE7QUFDaEIsa0JBQVU7QUFBQSxNQUNYO0FBQ0EsVUFBSSxLQUFLLFlBQVk7QUFDcEIsa0JBQVU7QUFBQSxNQUNYO0FBQ0EsVUFBSSxLQUFLLFdBQVc7QUFDbkIsa0JBQVU7QUFBQSxNQUNYO0FBQ0EsVUFBSSxLQUFLLFFBQVE7QUFDaEIsa0JBQVU7QUFBQSxNQUNYO0FBQ0EsVUFBSSxLQUFLLFNBQVM7QUFDakIsa0JBQVU7QUFBQSxNQUNYO0FBQ0EsVUFBSSxLQUFLLGFBQWE7QUFDckIsa0JBQVU7QUFBQSxNQUNYO0FBQ0EsVUFBSSxLQUFLLFFBQVE7QUFDaEIsa0JBQVU7QUFBQSxNQUNYO0FBQ0EsYUFBTztBQUFBLElBQ1IsR0FBRyxhQUFhLElBQUk7QUFBQTtBQUFBOzs7QUNyQ3BCLElBQUFDLG9CQUFBO0FBQUEsb0RBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxpQkFBaUI7QUFFckIsUUFBSSxzQkFBc0IsNEJBQTZCO0FBQ3ZELFFBQUksUUFBUSxPQUFPO0FBRW5CLElBQUFBLFFBQU8sVUFBVSxTQUFTLGNBQWM7QUFDdkMsVUFBSSx1QkFBd0IsT0FBUSxVQUFVLE9BQU87QUFDcEQsWUFBSSxhQUFhLE1BQU0sT0FBTyxXQUFXLE9BQU87QUFDaEQsWUFDQyxjQUNHLE9BQU8sV0FBVyxRQUFRLGNBQzFCLE9BQU8sT0FBTyxVQUFVLFdBQVcsYUFDbkMsT0FBTyxPQUFPLFVBQVUsZUFBZSxXQUN6QztBQUVELGNBQUksUUFBUTtBQUNaLGNBQUksSUFBSSxDQUFDO0FBQ1QsaUJBQU8sZUFBZSxHQUFHLGNBQWM7QUFBQSxZQUN0QyxLQUFLLFdBQVk7QUFDaEIsdUJBQVM7QUFBQSxZQUNWO0FBQUEsVUFDRCxDQUFDO0FBQ0QsaUJBQU8sZUFBZSxHQUFHLFVBQVU7QUFBQSxZQUNsQyxLQUFLLFdBQVk7QUFDaEIsdUJBQVM7QUFBQSxZQUNWO0FBQUEsVUFDRCxDQUFDO0FBQ0QsY0FBSSxVQUFVLE1BQU07QUFDbkIsbUJBQU8sV0FBVztBQUFBLFVBQ25CO0FBQUEsUUFDRDtBQUFBLE1BQ0Q7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7OztBQ25DQSxJQUFBQyxnQkFBQTtBQUFBLGdEQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksc0JBQXNCLDRCQUE2QjtBQUN2RCxRQUFJLGNBQWM7QUFDbEIsUUFBSSxPQUFPLE9BQU87QUFDbEIsUUFBSSxpQkFBaUIsT0FBTztBQUM1QixRQUFJLFVBQVU7QUFDZCxRQUFJLFdBQVcsT0FBTztBQUN0QixRQUFJQyxTQUFRO0FBRVosSUFBQUQsUUFBTyxVQUFVLFNBQVMsWUFBWTtBQUNyQyxVQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVTtBQUN0QyxjQUFNLElBQUksUUFBUSwyRkFBMkY7QUFBQSxNQUM5RztBQUNBLFVBQUksV0FBVyxZQUFZO0FBQzNCLFVBQUksUUFBUSxTQUFTQyxNQUFLO0FBQzFCLFVBQUksYUFBYSxLQUFLLE9BQU8sT0FBTztBQUNwQyxVQUFJLENBQUMsY0FBYyxXQUFXLFFBQVEsVUFBVTtBQUMvQyx1QkFBZSxPQUFPLFNBQVM7QUFBQSxVQUM5QixjQUFjO0FBQUEsVUFDZCxZQUFZO0FBQUEsVUFDWixLQUFLO0FBQUEsUUFDTixDQUFDO0FBQUEsTUFDRjtBQUNBLGFBQU87QUFBQSxJQUNSO0FBQUE7QUFBQTs7O0FDekJBO0FBQUEsaURBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSUMsVUFBUztBQUNiLFFBQUksV0FBVztBQUVmLFFBQUksaUJBQWlCO0FBQ3JCLFFBQUksY0FBYztBQUNsQixRQUFJLE9BQU87QUFFWCxRQUFJLGFBQWEsU0FBUyxZQUFZLENBQUM7QUFFdkMsSUFBQUEsUUFBTyxZQUFZO0FBQUEsTUFDbEI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0QsQ0FBQztBQUVELElBQUFELFFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ2pCakIsSUFBQUUsaUJBQUE7QUFBQSwwQ0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLGFBQWE7QUFHakIsSUFBQUEsUUFBTyxVQUFVLFNBQVMsc0JBQXNCO0FBQy9DLGFBQU8sV0FBVyxLQUFLLENBQUMsQ0FBQyxPQUFPO0FBQUEsSUFDakM7QUFBQTtBQUFBOzs7QUNQQTtBQUFBLHVDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksaUJBQWlCLGlCQUFpQztBQUN0RCxRQUFJLFlBQVk7QUFFaEIsUUFBSSxZQUFZLFVBQVUsMkJBQTJCO0FBRXJELFFBQUksc0JBQXNCLFNBQVMsWUFBWSxPQUFPO0FBQ3JELFVBQUksa0JBQWtCLFNBQVMsT0FBTyxVQUFVLFlBQVksT0FBTyxlQUFlLE9BQU87QUFDeEYsZUFBTztBQUFBLE1BQ1I7QUFDQSxhQUFPLFVBQVUsS0FBSyxNQUFNO0FBQUEsSUFDN0I7QUFFQSxRQUFJLG9CQUFvQixTQUFTLFlBQVksT0FBTztBQUNuRCxVQUFJLG9CQUFvQixLQUFLLEdBQUc7QUFDL0IsZUFBTztBQUFBLE1BQ1I7QUFDQSxhQUFPLFVBQVUsUUFDaEIsT0FBTyxVQUFVLFlBQ2pCLE9BQU8sTUFBTSxXQUFXLFlBQ3hCLE1BQU0sVUFBVSxLQUNoQixVQUFVLEtBQUssTUFBTSxvQkFDckIsVUFBVSxNQUFNLE1BQU0sTUFBTTtBQUFBLElBQzlCO0FBRUEsUUFBSSw0QkFBNkIsV0FBWTtBQUM1QyxhQUFPLG9CQUFvQixTQUFTO0FBQUEsSUFDckMsRUFBRTtBQUVGLHdCQUFvQixvQkFBb0I7QUFFeEMsSUFBQUEsUUFBTyxVQUFVLDRCQUE0QixzQkFBc0I7QUFBQTtBQUFBOzs7Ozs7Ozs7O0FDaENuRTtBQUFBLHlDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQSxRQUFJLFNBQVMsT0FBTyxRQUFRLGNBQWMsSUFBSTtBQUM5QyxRQUFJLG9CQUFvQixPQUFPLDRCQUE0QixTQUFTLE9BQU8seUJBQXlCLElBQUksV0FBVyxNQUFNLElBQUk7QUFDN0gsUUFBSSxVQUFVLFVBQVUscUJBQXFCLE9BQU8sa0JBQWtCLFFBQVEsYUFBYSxrQkFBa0IsTUFBTTtBQUNuSCxRQUFJLGFBQWEsVUFBVSxJQUFJLFVBQVU7QUFDekMsUUFBSSxTQUFTLE9BQU8sUUFBUSxjQUFjLElBQUk7QUFDOUMsUUFBSSxvQkFBb0IsT0FBTyw0QkFBNEIsU0FBUyxPQUFPLHlCQUF5QixJQUFJLFdBQVcsTUFBTSxJQUFJO0FBQzdILFFBQUksVUFBVSxVQUFVLHFCQUFxQixPQUFPLGtCQUFrQixRQUFRLGFBQWEsa0JBQWtCLE1BQU07QUFDbkgsUUFBSSxhQUFhLFVBQVUsSUFBSSxVQUFVO0FBQ3pDLFFBQUksYUFBYSxPQUFPLFlBQVksY0FBYyxRQUFRO0FBQzFELFFBQUksYUFBYSxhQUFhLFFBQVEsVUFBVSxNQUFNO0FBQ3RELFFBQUksYUFBYSxPQUFPLFlBQVksY0FBYyxRQUFRO0FBQzFELFFBQUksYUFBYSxhQUFhLFFBQVEsVUFBVSxNQUFNO0FBQ3RELFFBQUksYUFBYSxPQUFPLFlBQVksY0FBYyxRQUFRO0FBQzFELFFBQUksZUFBZSxhQUFhLFFBQVEsVUFBVSxRQUFRO0FBQzFELFFBQUksaUJBQWlCLFFBQVEsVUFBVTtBQUN2QyxRQUFJQyxrQkFBaUIsT0FBTyxVQUFVO0FBQ3RDLFFBQUksbUJBQW1CLFNBQVMsVUFBVTtBQUMxQyxRQUFJLFNBQVMsT0FBTyxVQUFVO0FBQzlCLFFBQUksU0FBUyxPQUFPLFVBQVU7QUFDOUIsUUFBSSxXQUFXLE9BQU8sVUFBVTtBQUNoQyxRQUFJLGVBQWUsT0FBTyxVQUFVO0FBQ3BDLFFBQUksZUFBZSxPQUFPLFVBQVU7QUFDcEMsUUFBSSxRQUFRLE9BQU8sVUFBVTtBQUM3QixRQUFJLFVBQVUsTUFBTSxVQUFVO0FBQzlCLFFBQUksUUFBUSxNQUFNLFVBQVU7QUFDNUIsUUFBSSxZQUFZLE1BQU0sVUFBVTtBQUNoQyxRQUFJLFNBQVMsS0FBSztBQUNsQixRQUFJLGdCQUFnQixPQUFPLFdBQVcsYUFBYSxPQUFPLFVBQVUsVUFBVTtBQUM5RSxRQUFJLE9BQU8sT0FBTztBQUNsQixRQUFJLGNBQWMsT0FBTyxXQUFXLGNBQWMsT0FBTyxPQUFPLGFBQWEsV0FBVyxPQUFPLFVBQVUsV0FBVztBQUNwSCxRQUFJLG9CQUFvQixPQUFPLFdBQVcsY0FBYyxPQUFPLE9BQU8sYUFBYTtBQUVuRixRQUFJLGNBQWMsT0FBTyxXQUFXLGNBQWMsT0FBTyxnQkFBZ0IsT0FBTyxPQUFPLGdCQUFnQixvQkFBb0IsV0FBVyxZQUNoSSxPQUFPLGNBQ1A7QUFDTixRQUFJLGVBQWUsT0FBTyxVQUFVO0FBRXBDLFFBQUksT0FBTyxPQUFPLFlBQVksYUFBYSxRQUFRLGlCQUFpQixPQUFPLG9CQUN2RSxDQUFDLEVBQUUsY0FBYyxNQUFNLFlBQ2pCLFNBQVUsR0FBRztBQUNYLGFBQU8sRUFBRTtBQUFBLElBQ2IsSUFDRTtBQUdWLGFBQVMsb0JBQW9CQyxNQUFLLEtBQUs7QUFDbkMsVUFDSUEsU0FBUSxZQUNMQSxTQUFRLGFBQ1JBLFNBQVFBLFFBQ1BBLFFBQU9BLE9BQU0sUUFBU0EsT0FBTSxPQUM3QixNQUFNLEtBQUssS0FBSyxHQUFHLEdBQ3hCO0FBQ0UsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJLFdBQVc7QUFDZixVQUFJLE9BQU9BLFNBQVEsVUFBVTtBQUN6QixZQUFJLE1BQU1BLE9BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQ0EsSUFBRyxJQUFJLE9BQU9BLElBQUc7QUFDOUMsWUFBSSxRQUFRQSxNQUFLO0FBQ2IsY0FBSSxTQUFTLE9BQU8sR0FBRztBQUN2QixjQUFJLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxTQUFTLENBQUM7QUFDNUMsaUJBQU8sU0FBUyxLQUFLLFFBQVEsVUFBVSxLQUFLLElBQUksTUFBTSxTQUFTLEtBQUssU0FBUyxLQUFLLEtBQUssZUFBZSxLQUFLLEdBQUcsTUFBTSxFQUFFO0FBQUEsUUFDMUg7QUFBQSxNQUNKO0FBQ0EsYUFBTyxTQUFTLEtBQUssS0FBSyxVQUFVLEtBQUs7QUFBQSxJQUM3QztBQUVBLFFBQUksY0FBYztBQUNsQixRQUFJLGdCQUFnQixZQUFZO0FBQ2hDLFFBQUksZ0JBQWdCLFNBQVMsYUFBYSxJQUFJLGdCQUFnQjtBQUU5RCxJQUFBRixRQUFPLFVBQVUsU0FBUyxTQUFTLEtBQUssU0FBUyxPQUFPLE1BQU07QUFDMUQsVUFBSSxPQUFPLFdBQVcsQ0FBQztBQUV2QixVQUFJLElBQUksTUFBTSxZQUFZLE1BQU0sS0FBSyxlQUFlLFlBQVksS0FBSyxlQUFlLFdBQVc7QUFDM0YsY0FBTSxJQUFJLFVBQVUsa0RBQWtEO0FBQUEsTUFDMUU7QUFDQSxVQUNJLElBQUksTUFBTSxpQkFBaUIsTUFBTSxPQUFPLEtBQUssb0JBQW9CLFdBQzNELEtBQUssa0JBQWtCLEtBQUssS0FBSyxvQkFBb0IsV0FDckQsS0FBSyxvQkFBb0IsT0FFakM7QUFDRSxjQUFNLElBQUksVUFBVSx3RkFBd0Y7QUFBQSxNQUNoSDtBQUNBLFVBQUksZ0JBQWdCLElBQUksTUFBTSxlQUFlLElBQUksS0FBSyxnQkFBZ0I7QUFDdEUsVUFBSSxPQUFPLGtCQUFrQixhQUFhLGtCQUFrQixVQUFVO0FBQ2xFLGNBQU0sSUFBSSxVQUFVLCtFQUErRTtBQUFBLE1BQ3ZHO0FBRUEsVUFDSSxJQUFJLE1BQU0sUUFBUSxLQUNmLEtBQUssV0FBVyxRQUNoQixLQUFLLFdBQVcsT0FDaEIsRUFBRSxTQUFTLEtBQUssUUFBUSxFQUFFLE1BQU0sS0FBSyxVQUFVLEtBQUssU0FBUyxJQUNsRTtBQUNFLGNBQU0sSUFBSSxVQUFVLDBEQUEwRDtBQUFBLE1BQ2xGO0FBQ0EsVUFBSSxJQUFJLE1BQU0sa0JBQWtCLEtBQUssT0FBTyxLQUFLLHFCQUFxQixXQUFXO0FBQzdFLGNBQU0sSUFBSSxVQUFVLG1FQUFtRTtBQUFBLE1BQzNGO0FBQ0EsVUFBSSxtQkFBbUIsS0FBSztBQUU1QixVQUFJLE9BQU8sUUFBUSxhQUFhO0FBQzVCLGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSSxRQUFRLE1BQU07QUFDZCxlQUFPO0FBQUEsTUFDWDtBQUNBLFVBQUksT0FBTyxRQUFRLFdBQVc7QUFDMUIsZUFBTyxNQUFNLFNBQVM7QUFBQSxNQUMxQjtBQUVBLFVBQUksT0FBTyxRQUFRLFVBQVU7QUFDekIsZUFBTyxjQUFjLEtBQUssSUFBSTtBQUFBLE1BQ2xDO0FBQ0EsVUFBSSxPQUFPLFFBQVEsVUFBVTtBQUN6QixZQUFJLFFBQVEsR0FBRztBQUNYLGlCQUFPLFdBQVcsTUFBTSxJQUFJLE1BQU07QUFBQSxRQUN0QztBQUNBLFlBQUksTUFBTSxPQUFPLEdBQUc7QUFDcEIsZUFBTyxtQkFBbUIsb0JBQW9CLEtBQUssR0FBRyxJQUFJO0FBQUEsTUFDOUQ7QUFDQSxVQUFJLE9BQU8sUUFBUSxVQUFVO0FBQ3pCLFlBQUksWUFBWSxPQUFPLEdBQUcsSUFBSTtBQUM5QixlQUFPLG1CQUFtQixvQkFBb0IsS0FBSyxTQUFTLElBQUk7QUFBQSxNQUNwRTtBQUVBLFVBQUksV0FBVyxPQUFPLEtBQUssVUFBVSxjQUFjLElBQUksS0FBSztBQUM1RCxVQUFJLE9BQU8sVUFBVSxhQUFhO0FBQUUsZ0JBQVE7QUFBQSxNQUFHO0FBQy9DLFVBQUksU0FBUyxZQUFZLFdBQVcsS0FBSyxPQUFPLFFBQVEsVUFBVTtBQUM5RCxlQUFPLFFBQVEsR0FBRyxJQUFJLFlBQVk7QUFBQSxNQUN0QztBQUVBLFVBQUlHLFVBQVMsVUFBVSxNQUFNLEtBQUs7QUFFbEMsVUFBSSxPQUFPLFNBQVMsYUFBYTtBQUM3QixlQUFPLENBQUM7QUFBQSxNQUNaLFdBQVcsUUFBUSxNQUFNLEdBQUcsS0FBSyxHQUFHO0FBQ2hDLGVBQU87QUFBQSxNQUNYO0FBRUEsZUFBUyxRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQ3BDLFlBQUksTUFBTTtBQUNOLGlCQUFPLFVBQVUsS0FBSyxJQUFJO0FBQzFCLGVBQUssS0FBSyxJQUFJO0FBQUEsUUFDbEI7QUFDQSxZQUFJLFVBQVU7QUFDVixjQUFJLFVBQVU7QUFBQSxZQUNWLE9BQU8sS0FBSztBQUFBLFVBQ2hCO0FBQ0EsY0FBSSxJQUFJLE1BQU0sWUFBWSxHQUFHO0FBQ3pCLG9CQUFRLGFBQWEsS0FBSztBQUFBLFVBQzlCO0FBQ0EsaUJBQU8sU0FBUyxPQUFPLFNBQVMsUUFBUSxHQUFHLElBQUk7QUFBQSxRQUNuRDtBQUNBLGVBQU8sU0FBUyxPQUFPLE1BQU0sUUFBUSxHQUFHLElBQUk7QUFBQSxNQUNoRDtBQUVBLFVBQUksT0FBTyxRQUFRLGNBQWMsQ0FBQyxTQUFTLEdBQUcsR0FBRztBQUM3QyxZQUFJLE9BQU8sT0FBTyxHQUFHO0FBQ3JCLFlBQUksT0FBTyxXQUFXLEtBQUssT0FBTztBQUNsQyxlQUFPLGVBQWUsT0FBTyxPQUFPLE9BQU8sa0JBQWtCLE9BQU8sS0FBSyxTQUFTLElBQUksUUFBUSxNQUFNLEtBQUssTUFBTSxJQUFJLElBQUksT0FBTztBQUFBLE1BQ2xJO0FBQ0EsVUFBSSxTQUFTLEdBQUcsR0FBRztBQUNmLFlBQUksWUFBWSxvQkFBb0IsU0FBUyxLQUFLLE9BQU8sR0FBRyxHQUFHLDBCQUEwQixJQUFJLElBQUksWUFBWSxLQUFLLEdBQUc7QUFDckgsZUFBTyxPQUFPLFFBQVEsWUFBWSxDQUFDLG9CQUFvQixVQUFVLFNBQVMsSUFBSTtBQUFBLE1BQ2xGO0FBQ0EsVUFBSSxVQUFVLEdBQUcsR0FBRztBQUNoQixZQUFJLElBQUksTUFBTSxhQUFhLEtBQUssT0FBTyxJQUFJLFFBQVEsQ0FBQztBQUNwRCxZQUFJLFFBQVEsSUFBSSxjQUFjLENBQUM7QUFDL0IsaUJBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsZUFBSyxNQUFNLE1BQU0sQ0FBQyxFQUFFLE9BQU8sTUFBTSxXQUFXLE1BQU0sTUFBTSxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsSUFBSTtBQUFBLFFBQ3JGO0FBQ0EsYUFBSztBQUNMLFlBQUksSUFBSSxjQUFjLElBQUksV0FBVyxRQUFRO0FBQUUsZUFBSztBQUFBLFFBQU87QUFDM0QsYUFBSyxPQUFPLGFBQWEsS0FBSyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUk7QUFDdEQsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJLFFBQVEsR0FBRyxHQUFHO0FBQ2QsWUFBSSxJQUFJLFdBQVcsR0FBRztBQUFFLGlCQUFPO0FBQUEsUUFBTTtBQUNyQyxZQUFJLEtBQUssV0FBVyxLQUFLLE9BQU87QUFDaEMsWUFBSUEsV0FBVSxDQUFDLGlCQUFpQixFQUFFLEdBQUc7QUFDakMsaUJBQU8sTUFBTSxhQUFhLElBQUlBLE9BQU0sSUFBSTtBQUFBLFFBQzVDO0FBQ0EsZUFBTyxPQUFPLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSTtBQUFBLE1BQ3pDO0FBQ0EsVUFBSSxRQUFRLEdBQUcsR0FBRztBQUNkLFlBQUksUUFBUSxXQUFXLEtBQUssT0FBTztBQUNuQyxZQUFJLEVBQUUsV0FBVyxNQUFNLGNBQWMsV0FBVyxPQUFPLENBQUMsYUFBYSxLQUFLLEtBQUssT0FBTyxHQUFHO0FBQ3JGLGlCQUFPLFFBQVEsT0FBTyxHQUFHLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxLQUFLLGNBQWMsUUFBUSxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxJQUFJO0FBQUEsUUFDbEg7QUFDQSxZQUFJLE1BQU0sV0FBVyxHQUFHO0FBQUUsaUJBQU8sTUFBTSxPQUFPLEdBQUcsSUFBSTtBQUFBLFFBQUs7QUFDMUQsZUFBTyxRQUFRLE9BQU8sR0FBRyxJQUFJLE9BQU8sTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJO0FBQUEsTUFDbEU7QUFDQSxVQUFJLE9BQU8sUUFBUSxZQUFZLGVBQWU7QUFDMUMsWUFBSSxpQkFBaUIsT0FBTyxJQUFJLGFBQWEsTUFBTSxjQUFjLGFBQWE7QUFDMUUsaUJBQU8sWUFBWSxLQUFLLEVBQUUsT0FBTyxXQUFXLE1BQU0sQ0FBQztBQUFBLFFBQ3ZELFdBQVcsa0JBQWtCLFlBQVksT0FBTyxJQUFJLFlBQVksWUFBWTtBQUN4RSxpQkFBTyxJQUFJLFFBQVE7QUFBQSxRQUN2QjtBQUFBLE1BQ0o7QUFDQSxVQUFJLE1BQU0sR0FBRyxHQUFHO0FBQ1osWUFBSSxXQUFXLENBQUM7QUFDaEIsWUFBSSxZQUFZO0FBQ1oscUJBQVcsS0FBSyxLQUFLLFNBQVUsT0FBT0MsTUFBSztBQUN2QyxxQkFBUyxLQUFLLFFBQVFBLE1BQUssS0FBSyxJQUFJLElBQUksU0FBUyxRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQUEsVUFDeEUsQ0FBQztBQUFBLFFBQ0w7QUFDQSxlQUFPLGFBQWEsT0FBTyxRQUFRLEtBQUssR0FBRyxHQUFHLFVBQVVELE9BQU07QUFBQSxNQUNsRTtBQUNBLFVBQUksTUFBTSxHQUFHLEdBQUc7QUFDWixZQUFJLFdBQVcsQ0FBQztBQUNoQixZQUFJLFlBQVk7QUFDWixxQkFBVyxLQUFLLEtBQUssU0FBVSxPQUFPO0FBQ2xDLHFCQUFTLEtBQUssUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUFBLFVBQ3JDLENBQUM7QUFBQSxRQUNMO0FBQ0EsZUFBTyxhQUFhLE9BQU8sUUFBUSxLQUFLLEdBQUcsR0FBRyxVQUFVQSxPQUFNO0FBQUEsTUFDbEU7QUFDQSxVQUFJLFVBQVUsR0FBRyxHQUFHO0FBQ2hCLGVBQU8saUJBQWlCLFNBQVM7QUFBQSxNQUNyQztBQUNBLFVBQUksVUFBVSxHQUFHLEdBQUc7QUFDaEIsZUFBTyxpQkFBaUIsU0FBUztBQUFBLE1BQ3JDO0FBQ0EsVUFBSSxVQUFVLEdBQUcsR0FBRztBQUNoQixlQUFPLGlCQUFpQixTQUFTO0FBQUEsTUFDckM7QUFDQSxVQUFJLFNBQVMsR0FBRyxHQUFHO0FBQ2YsZUFBTyxVQUFVLFFBQVEsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUFBLE1BQ3pDO0FBQ0EsVUFBSSxTQUFTLEdBQUcsR0FBRztBQUNmLGVBQU8sVUFBVSxRQUFRLGNBQWMsS0FBSyxHQUFHLENBQUMsQ0FBQztBQUFBLE1BQ3JEO0FBQ0EsVUFBSSxVQUFVLEdBQUcsR0FBRztBQUNoQixlQUFPLFVBQVUsZUFBZSxLQUFLLEdBQUcsQ0FBQztBQUFBLE1BQzdDO0FBQ0EsVUFBSSxTQUFTLEdBQUcsR0FBRztBQUNmLGVBQU8sVUFBVSxRQUFRLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFBQSxNQUN6QztBQUdBLFVBQUksT0FBTyxXQUFXLGVBQWUsUUFBUSxRQUFRO0FBQ2pELGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSSxRQUFRLFFBQVE7QUFDaEIsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxTQUFTLEdBQUcsR0FBRztBQUNoQyxZQUFJLEtBQUssV0FBVyxLQUFLLE9BQU87QUFDaEMsWUFBSSxnQkFBZ0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLFlBQVksZUFBZSxVQUFVLElBQUksZ0JBQWdCO0FBQ3ZHLFlBQUksV0FBVyxlQUFlLFNBQVMsS0FBSztBQUM1QyxZQUFJLFlBQVksQ0FBQyxpQkFBaUIsZUFBZSxPQUFPLEdBQUcsTUFBTSxPQUFPLGVBQWUsTUFBTSxPQUFPLEtBQUssTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksV0FBVyxXQUFXO0FBQ3BKLFlBQUksaUJBQWlCLGlCQUFpQixPQUFPLElBQUksZ0JBQWdCLGFBQWEsS0FBSyxJQUFJLFlBQVksT0FBTyxJQUFJLFlBQVksT0FBTyxNQUFNO0FBQ3ZJLFlBQUlFLE9BQU0sa0JBQWtCLGFBQWEsV0FBVyxNQUFNLE1BQU0sS0FBSyxRQUFRLEtBQUssQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLE9BQU87QUFDdkksWUFBSSxHQUFHLFdBQVcsR0FBRztBQUFFLGlCQUFPQSxPQUFNO0FBQUEsUUFBTTtBQUMxQyxZQUFJRixTQUFRO0FBQ1IsaUJBQU9FLE9BQU0sTUFBTSxhQUFhLElBQUlGLE9BQU0sSUFBSTtBQUFBLFFBQ2xEO0FBQ0EsZUFBT0UsT0FBTSxPQUFPLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSTtBQUFBLE1BQy9DO0FBQ0EsYUFBTyxPQUFPLEdBQUc7QUFBQSxJQUNyQjtBQUVBLGFBQVMsV0FBVyxHQUFHLGNBQWMsTUFBTTtBQUN2QyxVQUFJLGFBQWEsS0FBSyxjQUFjLGtCQUFrQixXQUFXLE1BQU07QUFDdkUsYUFBTyxZQUFZLElBQUk7QUFBQSxJQUMzQjtBQUVBLGFBQVMsTUFBTSxHQUFHO0FBQ2QsYUFBTyxTQUFTLEtBQUssT0FBTyxDQUFDLEdBQUcsTUFBTSxRQUFRO0FBQUEsSUFDbEQ7QUFFQSxhQUFTLFFBQVEsS0FBSztBQUFFLGFBQU8sTUFBTSxHQUFHLE1BQU0scUJBQXFCLENBQUMsZUFBZSxFQUFFLE9BQU8sUUFBUSxZQUFZLGVBQWU7QUFBQSxJQUFPO0FBQ3RJLGFBQVMsT0FBTyxLQUFLO0FBQUUsYUFBTyxNQUFNLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQyxlQUFlLEVBQUUsT0FBTyxRQUFRLFlBQVksZUFBZTtBQUFBLElBQU87QUFDcEksYUFBUyxTQUFTLEtBQUs7QUFBRSxhQUFPLE1BQU0sR0FBRyxNQUFNLHNCQUFzQixDQUFDLGVBQWUsRUFBRSxPQUFPLFFBQVEsWUFBWSxlQUFlO0FBQUEsSUFBTztBQUN4SSxhQUFTLFFBQVEsS0FBSztBQUFFLGFBQU8sTUFBTSxHQUFHLE1BQU0scUJBQXFCLENBQUMsZUFBZSxFQUFFLE9BQU8sUUFBUSxZQUFZLGVBQWU7QUFBQSxJQUFPO0FBQ3RJLGFBQVMsU0FBUyxLQUFLO0FBQUUsYUFBTyxNQUFNLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxlQUFlLEVBQUUsT0FBTyxRQUFRLFlBQVksZUFBZTtBQUFBLElBQU87QUFDeEksYUFBUyxTQUFTLEtBQUs7QUFBRSxhQUFPLE1BQU0sR0FBRyxNQUFNLHNCQUFzQixDQUFDLGVBQWUsRUFBRSxPQUFPLFFBQVEsWUFBWSxlQUFlO0FBQUEsSUFBTztBQUN4SSxhQUFTLFVBQVUsS0FBSztBQUFFLGFBQU8sTUFBTSxHQUFHLE1BQU0sdUJBQXVCLENBQUMsZUFBZSxFQUFFLE9BQU8sUUFBUSxZQUFZLGVBQWU7QUFBQSxJQUFPO0FBRzFJLGFBQVMsU0FBUyxLQUFLO0FBQ25CLFVBQUksbUJBQW1CO0FBQ25CLGVBQU8sT0FBTyxPQUFPLFFBQVEsWUFBWSxlQUFlO0FBQUEsTUFDNUQ7QUFDQSxVQUFJLE9BQU8sUUFBUSxVQUFVO0FBQ3pCLGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSSxDQUFDLE9BQU8sT0FBTyxRQUFRLFlBQVksQ0FBQyxhQUFhO0FBQ2pELGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSTtBQUNBLG9CQUFZLEtBQUssR0FBRztBQUNwQixlQUFPO0FBQUEsTUFDWCxTQUFTLEdBQUc7QUFBQSxNQUFDO0FBQ2IsYUFBTztBQUFBLElBQ1g7QUFFQSxhQUFTLFNBQVMsS0FBSztBQUNuQixVQUFJLENBQUMsT0FBTyxPQUFPLFFBQVEsWUFBWSxDQUFDLGVBQWU7QUFDbkQsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJO0FBQ0Esc0JBQWMsS0FBSyxHQUFHO0FBQ3RCLGVBQU87QUFBQSxNQUNYLFNBQVMsR0FBRztBQUFBLE1BQUM7QUFDYixhQUFPO0FBQUEsSUFDWDtBQUVBLFFBQUksU0FBUyxPQUFPLFVBQVUsa0JBQWtCLFNBQVVELE1BQUs7QUFBRSxhQUFPQSxRQUFPO0FBQUEsSUFBTTtBQUNyRixhQUFTLElBQUksS0FBS0EsTUFBSztBQUNuQixhQUFPLE9BQU8sS0FBSyxLQUFLQSxJQUFHO0FBQUEsSUFDL0I7QUFFQSxhQUFTLE1BQU0sS0FBSztBQUNoQixhQUFPSCxnQkFBZSxLQUFLLEdBQUc7QUFBQSxJQUNsQztBQUVBLGFBQVMsT0FBTyxHQUFHO0FBQ2YsVUFBSSxFQUFFLE1BQU07QUFBRSxlQUFPLEVBQUU7QUFBQSxNQUFNO0FBQzdCLFVBQUksSUFBSSxPQUFPLEtBQUssaUJBQWlCLEtBQUssQ0FBQyxHQUFHLHNCQUFzQjtBQUNwRSxVQUFJLEdBQUc7QUFBRSxlQUFPLEVBQUUsQ0FBQztBQUFBLE1BQUc7QUFDdEIsYUFBTztBQUFBLElBQ1g7QUFFQSxhQUFTLFFBQVEsSUFBSSxHQUFHO0FBQ3BCLFVBQUksR0FBRyxTQUFTO0FBQUUsZUFBTyxHQUFHLFFBQVEsQ0FBQztBQUFBLE1BQUc7QUFDeEMsZUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLFFBQVEsSUFBSSxHQUFHLEtBQUs7QUFDdkMsWUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHO0FBQUUsaUJBQU87QUFBQSxRQUFHO0FBQUEsTUFDakM7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUVBLGFBQVMsTUFBTSxHQUFHO0FBQ2QsVUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLE9BQU8sTUFBTSxVQUFVO0FBQ3pDLGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSTtBQUNBLGdCQUFRLEtBQUssQ0FBQztBQUNkLFlBQUk7QUFDQSxrQkFBUSxLQUFLLENBQUM7QUFBQSxRQUNsQixTQUFTLEdBQUc7QUFDUixpQkFBTztBQUFBLFFBQ1g7QUFDQSxlQUFPLGFBQWE7QUFBQSxNQUN4QixTQUFTLEdBQUc7QUFBQSxNQUFDO0FBQ2IsYUFBTztBQUFBLElBQ1g7QUFFQSxhQUFTLFVBQVUsR0FBRztBQUNsQixVQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssT0FBTyxNQUFNLFVBQVU7QUFDNUMsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJO0FBQ0EsbUJBQVcsS0FBSyxHQUFHLFVBQVU7QUFDN0IsWUFBSTtBQUNBLHFCQUFXLEtBQUssR0FBRyxVQUFVO0FBQUEsUUFDakMsU0FBUyxHQUFHO0FBQ1IsaUJBQU87QUFBQSxRQUNYO0FBQ0EsZUFBTyxhQUFhO0FBQUEsTUFDeEIsU0FBUyxHQUFHO0FBQUEsTUFBQztBQUNiLGFBQU87QUFBQSxJQUNYO0FBRUEsYUFBUyxVQUFVLEdBQUc7QUFDbEIsVUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssT0FBTyxNQUFNLFVBQVU7QUFDOUMsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJO0FBQ0EscUJBQWEsS0FBSyxDQUFDO0FBQ25CLGVBQU87QUFBQSxNQUNYLFNBQVMsR0FBRztBQUFBLE1BQUM7QUFDYixhQUFPO0FBQUEsSUFDWDtBQUVBLGFBQVMsTUFBTSxHQUFHO0FBQ2QsVUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLE9BQU8sTUFBTSxVQUFVO0FBQ3pDLGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSTtBQUNBLGdCQUFRLEtBQUssQ0FBQztBQUNkLFlBQUk7QUFDQSxrQkFBUSxLQUFLLENBQUM7QUFBQSxRQUNsQixTQUFTLEdBQUc7QUFDUixpQkFBTztBQUFBLFFBQ1g7QUFDQSxlQUFPLGFBQWE7QUFBQSxNQUN4QixTQUFTLEdBQUc7QUFBQSxNQUFDO0FBQ2IsYUFBTztBQUFBLElBQ1g7QUFFQSxhQUFTLFVBQVUsR0FBRztBQUNsQixVQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssT0FBTyxNQUFNLFVBQVU7QUFDNUMsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJO0FBQ0EsbUJBQVcsS0FBSyxHQUFHLFVBQVU7QUFDN0IsWUFBSTtBQUNBLHFCQUFXLEtBQUssR0FBRyxVQUFVO0FBQUEsUUFDakMsU0FBUyxHQUFHO0FBQ1IsaUJBQU87QUFBQSxRQUNYO0FBQ0EsZUFBTyxhQUFhO0FBQUEsTUFDeEIsU0FBUyxHQUFHO0FBQUEsTUFBQztBQUNiLGFBQU87QUFBQSxJQUNYO0FBRUEsYUFBUyxVQUFVLEdBQUc7QUFDbEIsVUFBSSxDQUFDLEtBQUssT0FBTyxNQUFNLFVBQVU7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUNqRCxVQUFJLE9BQU8sZ0JBQWdCLGVBQWUsYUFBYSxhQUFhO0FBQ2hFLGVBQU87QUFBQSxNQUNYO0FBQ0EsYUFBTyxPQUFPLEVBQUUsYUFBYSxZQUFZLE9BQU8sRUFBRSxpQkFBaUI7QUFBQSxJQUN2RTtBQUVBLGFBQVMsY0FBYyxLQUFLLE1BQU07QUFDOUIsVUFBSSxJQUFJLFNBQVMsS0FBSyxpQkFBaUI7QUFDbkMsWUFBSSxZQUFZLElBQUksU0FBUyxLQUFLO0FBQ2xDLFlBQUksVUFBVSxTQUFTLFlBQVkscUJBQXFCLFlBQVksSUFBSSxNQUFNO0FBQzlFLGVBQU8sY0FBYyxPQUFPLEtBQUssS0FBSyxHQUFHLEtBQUssZUFBZSxHQUFHLElBQUksSUFBSTtBQUFBLE1BQzVFO0FBRUEsVUFBSSxJQUFJLFNBQVMsS0FBSyxTQUFTLEtBQUssS0FBSyxZQUFZLE1BQU0sR0FBRyxnQkFBZ0IsT0FBTztBQUNyRixhQUFPLFdBQVcsR0FBRyxVQUFVLElBQUk7QUFBQSxJQUN2QztBQUVBLGFBQVMsUUFBUSxHQUFHO0FBQ2hCLFVBQUksSUFBSSxFQUFFLFdBQVcsQ0FBQztBQUN0QixVQUFJLElBQUk7QUFBQSxRQUNKLEdBQUc7QUFBQSxRQUNILEdBQUc7QUFBQSxRQUNILElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxNQUNSLEVBQUUsQ0FBQztBQUNILFVBQUksR0FBRztBQUFFLGVBQU8sT0FBTztBQUFBLE1BQUc7QUFDMUIsYUFBTyxTQUFTLElBQUksS0FBTyxNQUFNLE1BQU0sYUFBYSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFBQSxJQUMzRTtBQUVBLGFBQVMsVUFBVSxLQUFLO0FBQ3BCLGFBQU8sWUFBWSxNQUFNO0FBQUEsSUFDN0I7QUFFQSxhQUFTLGlCQUFpQixNQUFNO0FBQzVCLGFBQU8sT0FBTztBQUFBLElBQ2xCO0FBRUEsYUFBUyxhQUFhLE1BQU0sTUFBTSxTQUFTRSxTQUFRO0FBQy9DLFVBQUksZ0JBQWdCQSxVQUFTLGFBQWEsU0FBU0EsT0FBTSxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUk7QUFDckYsYUFBTyxPQUFPLE9BQU8sT0FBTyxRQUFRLGdCQUFnQjtBQUFBLElBQ3hEO0FBRUEsYUFBUyxpQkFBaUIsSUFBSTtBQUMxQixlQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsUUFBUSxLQUFLO0FBQ2hDLFlBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssR0FBRztBQUMzQixpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFFQSxhQUFTLFVBQVUsTUFBTSxPQUFPO0FBQzVCLFVBQUk7QUFDSixVQUFJLEtBQUssV0FBVyxLQUFNO0FBQ3RCLHFCQUFhO0FBQUEsTUFDakIsV0FBVyxPQUFPLEtBQUssV0FBVyxZQUFZLEtBQUssU0FBUyxHQUFHO0FBQzNELHFCQUFhLE1BQU0sS0FBSyxNQUFNLEtBQUssU0FBUyxDQUFDLEdBQUcsR0FBRztBQUFBLE1BQ3ZELE9BQU87QUFDSCxlQUFPO0FBQUEsTUFDWDtBQUNBLGFBQU87QUFBQSxRQUNILE1BQU07QUFBQSxRQUNOLE1BQU0sTUFBTSxLQUFLLE1BQU0sUUFBUSxDQUFDLEdBQUcsVUFBVTtBQUFBLE1BQ2pEO0FBQUEsSUFDSjtBQUVBLGFBQVMsYUFBYSxJQUFJQSxTQUFRO0FBQzlCLFVBQUksR0FBRyxXQUFXLEdBQUc7QUFBRSxlQUFPO0FBQUEsTUFBSTtBQUNsQyxVQUFJLGFBQWEsT0FBT0EsUUFBTyxPQUFPQSxRQUFPO0FBQzdDLGFBQU8sYUFBYSxNQUFNLEtBQUssSUFBSSxNQUFNLFVBQVUsSUFBSSxPQUFPQSxRQUFPO0FBQUEsSUFDekU7QUFFQSxhQUFTLFdBQVcsS0FBSyxTQUFTO0FBQzlCLFVBQUksUUFBUSxRQUFRLEdBQUc7QUFDdkIsVUFBSSxLQUFLLENBQUM7QUFDVixVQUFJLE9BQU87QUFDUCxXQUFHLFNBQVMsSUFBSTtBQUNoQixpQkFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNqQyxhQUFHLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLFFBQVEsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJO0FBQUEsUUFDakQ7QUFBQSxNQUNKO0FBQ0EsVUFBSSxPQUFPLE9BQU8sU0FBUyxhQUFhLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDckQsVUFBSTtBQUNKLFVBQUksbUJBQW1CO0FBQ25CLGlCQUFTLENBQUM7QUFDVixpQkFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUNsQyxpQkFBTyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQUEsUUFDbEM7QUFBQSxNQUNKO0FBRUEsZUFBU0MsUUFBTyxLQUFLO0FBQ2pCLFlBQUksQ0FBQyxJQUFJLEtBQUtBLElBQUcsR0FBRztBQUFFO0FBQUEsUUFBVTtBQUNoQyxZQUFJLFNBQVMsT0FBTyxPQUFPQSxJQUFHLENBQUMsTUFBTUEsUUFBT0EsT0FBTSxJQUFJLFFBQVE7QUFBRTtBQUFBLFFBQVU7QUFDMUUsWUFBSSxxQkFBcUIsT0FBTyxNQUFNQSxJQUFHLGFBQWEsUUFBUTtBQUUxRDtBQUFBLFFBQ0osV0FBVyxNQUFNLEtBQUssVUFBVUEsSUFBRyxHQUFHO0FBQ2xDLGFBQUcsS0FBSyxRQUFRQSxNQUFLLEdBQUcsSUFBSSxPQUFPLFFBQVEsSUFBSUEsSUFBRyxHQUFHLEdBQUcsQ0FBQztBQUFBLFFBQzdELE9BQU87QUFDSCxhQUFHLEtBQUtBLE9BQU0sT0FBTyxRQUFRLElBQUlBLElBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxRQUMvQztBQUFBLE1BQ0o7QUFDQSxVQUFJLE9BQU8sU0FBUyxZQUFZO0FBQzVCLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ2xDLGNBQUksYUFBYSxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsR0FBRztBQUNqQyxlQUFHLEtBQUssTUFBTSxRQUFRLEtBQUssQ0FBQyxDQUFDLElBQUksUUFBUSxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFBQSxVQUN2RTtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFBQTtBQUFBOzs7QUMzZ0JBO0FBQUEsdUNBQUFFLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxlQUFlO0FBQ25CLFFBQUksWUFBWTtBQUNoQixRQUFJLFVBQVU7QUFFZCxRQUFJLGFBQWE7QUFDakIsUUFBSSxXQUFXLGFBQWEsYUFBYSxJQUFJO0FBQzdDLFFBQUksT0FBTyxhQUFhLFNBQVMsSUFBSTtBQUVyQyxRQUFJLGNBQWMsVUFBVSx5QkFBeUIsSUFBSTtBQUN6RCxRQUFJLGNBQWMsVUFBVSx5QkFBeUIsSUFBSTtBQUN6RCxRQUFJLGNBQWMsVUFBVSx5QkFBeUIsSUFBSTtBQUN6RCxRQUFJLFVBQVUsVUFBVSxxQkFBcUIsSUFBSTtBQUNqRCxRQUFJLFVBQVUsVUFBVSxxQkFBcUIsSUFBSTtBQUNqRCxRQUFJLFVBQVUsVUFBVSxxQkFBcUIsSUFBSTtBQVFqRCxRQUFJLGNBQWMsU0FBVSxNQUFNQyxNQUFLO0FBRXRDLFVBQUksT0FBTztBQUVYLFVBQUk7QUFDSixjQUFRLE9BQU8sS0FBSyxVQUFVLE1BQU0sT0FBTyxNQUFNO0FBQ2hELFlBQUksS0FBSyxRQUFRQSxNQUFLO0FBQ3JCLGVBQUssT0FBTyxLQUFLO0FBRWpCLGVBQUs7QUFBQSxVQUFxRCxLQUFLO0FBQy9ELGVBQUssT0FBTztBQUNaLGlCQUFPO0FBQUEsUUFDUjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBR0EsUUFBSSxVQUFVLFNBQVUsU0FBU0EsTUFBSztBQUNyQyxVQUFJLE9BQU8sWUFBWSxTQUFTQSxJQUFHO0FBQ25DLGFBQU8sUUFBUSxLQUFLO0FBQUEsSUFDckI7QUFFQSxRQUFJLFVBQVUsU0FBVSxTQUFTQSxNQUFLLE9BQU87QUFDNUMsVUFBSSxPQUFPLFlBQVksU0FBU0EsSUFBRztBQUNuQyxVQUFJLE1BQU07QUFDVCxhQUFLLFFBQVE7QUFBQSxNQUNkLE9BQU87QUFFTixnQkFBUTtBQUFBLFFBQTBEO0FBQUE7QUFBQSxVQUNqRSxLQUFLQTtBQUFBLFVBQ0wsTUFBTSxRQUFRO0FBQUEsVUFDZDtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUVBLFFBQUksVUFBVSxTQUFVLFNBQVNBLE1BQUs7QUFDckMsYUFBTyxDQUFDLENBQUMsWUFBWSxTQUFTQSxJQUFHO0FBQUEsSUFDbEM7QUFHQSxJQUFBRCxRQUFPLFVBQVUsU0FBUyxpQkFBaUI7QUFDRixVQUFJO0FBQ1IsVUFBSTtBQUNLLFVBQUk7QUFHakQsVUFBSSxVQUFVO0FBQUEsUUFDYixRQUFRLFNBQVVDLE1BQUs7QUFDdEIsY0FBSSxDQUFDLFFBQVEsSUFBSUEsSUFBRyxHQUFHO0FBQ3RCLGtCQUFNLElBQUksV0FBVyxtQ0FBbUMsUUFBUUEsSUFBRyxDQUFDO0FBQUEsVUFDckU7QUFBQSxRQUNEO0FBQUEsUUFDQSxLQUFLLFNBQVVBLE1BQUs7QUFDbkIsY0FBSSxZQUFZQSxTQUFRLE9BQU9BLFNBQVEsWUFBWSxPQUFPQSxTQUFRLGFBQWE7QUFDOUUsZ0JBQUksS0FBSztBQUNSLHFCQUFPLFlBQVksS0FBS0EsSUFBRztBQUFBLFlBQzVCO0FBQUEsVUFDRCxXQUFXLE1BQU07QUFDaEIsZ0JBQUksSUFBSTtBQUNQLHFCQUFPLFFBQVEsSUFBSUEsSUFBRztBQUFBLFlBQ3ZCO0FBQUEsVUFDRCxPQUFPO0FBQ04sZ0JBQUksSUFBSTtBQUNQLHFCQUFPLFFBQVEsSUFBSUEsSUFBRztBQUFBLFlBQ3ZCO0FBQUEsVUFDRDtBQUFBLFFBQ0Q7QUFBQSxRQUNBLEtBQUssU0FBVUEsTUFBSztBQUNuQixjQUFJLFlBQVlBLFNBQVEsT0FBT0EsU0FBUSxZQUFZLE9BQU9BLFNBQVEsYUFBYTtBQUM5RSxnQkFBSSxLQUFLO0FBQ1IscUJBQU8sWUFBWSxLQUFLQSxJQUFHO0FBQUEsWUFDNUI7QUFBQSxVQUNELFdBQVcsTUFBTTtBQUNoQixnQkFBSSxJQUFJO0FBQ1AscUJBQU8sUUFBUSxJQUFJQSxJQUFHO0FBQUEsWUFDdkI7QUFBQSxVQUNELE9BQU87QUFDTixnQkFBSSxJQUFJO0FBQ1AscUJBQU8sUUFBUSxJQUFJQSxJQUFHO0FBQUEsWUFDdkI7QUFBQSxVQUNEO0FBQ0EsaUJBQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxLQUFLLFNBQVVBLE1BQUssT0FBTztBQUMxQixjQUFJLFlBQVlBLFNBQVEsT0FBT0EsU0FBUSxZQUFZLE9BQU9BLFNBQVEsYUFBYTtBQUM5RSxnQkFBSSxDQUFDLEtBQUs7QUFDVCxvQkFBTSxJQUFJLFNBQVM7QUFBQSxZQUNwQjtBQUNBLHdCQUFZLEtBQUtBLE1BQUssS0FBSztBQUFBLFVBQzVCLFdBQVcsTUFBTTtBQUNoQixnQkFBSSxDQUFDLElBQUk7QUFDUixtQkFBSyxJQUFJLEtBQUs7QUFBQSxZQUNmO0FBQ0Esb0JBQVEsSUFBSUEsTUFBSyxLQUFLO0FBQUEsVUFDdkIsT0FBTztBQUNOLGdCQUFJLENBQUMsSUFBSTtBQUVSLG1CQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxLQUFLO0FBQUEsWUFDNUI7QUFDQSxvQkFBUSxJQUFJQSxNQUFLLEtBQUs7QUFBQSxVQUN2QjtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBQ0EsYUFBTztBQUFBLElBQ1I7QUFBQTtBQUFBOzs7QUNoSUE7QUFBQSx3Q0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLFNBQVM7QUFDYixRQUFJLFVBQVUsdUJBQXdCO0FBRXRDLFFBQUksYUFBYTtBQUVqQixRQUFJLE9BQU87QUFBQSxNQUNWLFFBQVEsU0FBVSxHQUFHLE1BQU07QUFDMUIsWUFBSSxDQUFDLEtBQU0sT0FBTyxNQUFNLFlBQVksT0FBTyxNQUFNLFlBQWE7QUFDN0QsZ0JBQU0sSUFBSSxXQUFXLHNCQUFzQjtBQUFBLFFBQzVDO0FBQ0EsWUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM3QixnQkFBTSxJQUFJLFdBQVcseUJBQXlCO0FBQUEsUUFDL0M7QUFDQSxnQkFBUSxPQUFPLENBQUM7QUFDaEIsWUFBSSxDQUFDLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRztBQUN2QixnQkFBTSxJQUFJLFdBQVcsTUFBTSxPQUFPLHlCQUF5QjtBQUFBLFFBQzVEO0FBQUEsTUFDRDtBQUFBLE1BQ0EsS0FBSyxTQUFVLEdBQUcsTUFBTTtBQUN2QixZQUFJLENBQUMsS0FBTSxPQUFPLE1BQU0sWUFBWSxPQUFPLE1BQU0sWUFBYTtBQUM3RCxnQkFBTSxJQUFJLFdBQVcsc0JBQXNCO0FBQUEsUUFDNUM7QUFDQSxZQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzdCLGdCQUFNLElBQUksV0FBVyx5QkFBeUI7QUFBQSxRQUMvQztBQUNBLFlBQUksUUFBUSxRQUFRLElBQUksQ0FBQztBQUN6QixlQUFPLFNBQVMsTUFBTSxNQUFNLElBQUk7QUFBQSxNQUNqQztBQUFBLE1BQ0EsS0FBSyxTQUFVLEdBQUcsTUFBTTtBQUN2QixZQUFJLENBQUMsS0FBTSxPQUFPLE1BQU0sWUFBWSxPQUFPLE1BQU0sWUFBYTtBQUM3RCxnQkFBTSxJQUFJLFdBQVcsc0JBQXNCO0FBQUEsUUFDNUM7QUFDQSxZQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzdCLGdCQUFNLElBQUksV0FBVyx5QkFBeUI7QUFBQSxRQUMvQztBQUNBLFlBQUksUUFBUSxRQUFRLElBQUksQ0FBQztBQUN6QixlQUFPLENBQUMsQ0FBQyxTQUFTLE9BQU8sT0FBTyxNQUFNLElBQUk7QUFBQSxNQUMzQztBQUFBLE1BQ0EsS0FBSyxTQUFVLEdBQUcsTUFBTSxHQUFHO0FBQzFCLFlBQUksQ0FBQyxLQUFNLE9BQU8sTUFBTSxZQUFZLE9BQU8sTUFBTSxZQUFhO0FBQzdELGdCQUFNLElBQUksV0FBVyxzQkFBc0I7QUFBQSxRQUM1QztBQUNBLFlBQUksT0FBTyxTQUFTLFVBQVU7QUFDN0IsZ0JBQU0sSUFBSSxXQUFXLHlCQUF5QjtBQUFBLFFBQy9DO0FBQ0EsWUFBSSxRQUFRLFFBQVEsSUFBSSxDQUFDO0FBQ3pCLFlBQUksQ0FBQyxPQUFPO0FBQ1gsa0JBQVEsQ0FBQztBQUNULGtCQUFRLElBQUksR0FBRyxLQUFLO0FBQUEsUUFDckI7QUFDQSxjQUFNLE1BQU0sSUFBSSxJQUFJO0FBQUEsTUFDckI7QUFBQSxJQUNEO0FBRUEsUUFBSSxPQUFPLFFBQVE7QUFDbEIsYUFBTyxPQUFPLElBQUk7QUFBQSxJQUNuQjtBQUVBLElBQUFBLFFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQzVEakI7QUFBQSxrREFBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLE9BQU87QUFFWCxRQUFJLGVBQWU7QUFDbkIsUUFBSSxpQkFBaUIsT0FBTyxrQkFBa0IsV0FBVyxnQkFBZ0I7QUFFekUsSUFBQUEsUUFBTyxVQUFVLFNBQVMseUJBQXlCLGNBQWM7QUFDaEUsVUFBSSxDQUFDLGdCQUFnQjtBQUNwQixjQUFNLElBQUksYUFBYSxzQ0FBc0M7QUFBQSxNQUM5RDtBQUVBLFdBQUssSUFBSSxjQUFjLFlBQVksS0FBSztBQUV4QyxVQUFJLGFBQWE7QUFBQSxRQUNoQixNQUFNLFNBQVMsT0FBTztBQUNyQixjQUFJLFdBQVcsS0FBSyxJQUFJLE1BQU0sY0FBYztBQUM1QyxjQUFJLE9BQU8sS0FBSyxJQUFJLFVBQVUsVUFBVTtBQUN4QyxjQUFJO0FBQ0gsbUJBQU87QUFBQSxjQUNOO0FBQUEsY0FDQSxPQUFPLE9BQU8sU0FBaUIsU0FBUyxLQUFLO0FBQUEsWUFDOUM7QUFBQSxVQUNELFNBQVMsR0FBRztBQUNYLGlCQUFLLElBQUksVUFBVSxZQUFZLElBQUk7QUFDbkMsZ0JBQUksTUFBTSxnQkFBZ0I7QUFDekIsb0JBQU07QUFBQSxZQUNQO0FBQ0EsbUJBQU87QUFBQSxjQUNOLE1BQU07QUFBQSxjQUNOLE9BQU87QUFBQSxZQUNSO0FBQUEsVUFDRDtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBRUEsV0FBSyxJQUFJLFlBQVksZ0JBQWdCLFlBQVk7QUFFakQsYUFBTztBQUFBLElBQ1I7QUFBQTtBQUFBOzs7QUN2Q0E7QUFBQSxrQ0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUEsUUFBSSxXQUFXLENBQUMsRUFBRTtBQUVsQixJQUFBQSxRQUFPLFVBQVUsTUFBTSxXQUFXLFNBQVUsS0FBSztBQUMvQyxhQUFPLFNBQVMsS0FBSyxHQUFHLEtBQUs7QUFBQSxJQUMvQjtBQUFBO0FBQUE7OztBQ0pBO0FBQUEsb0NBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxXQUFXLE9BQU8sVUFBVTtBQUNoQyxRQUFJLGtCQUFrQixTQUFTQyxpQkFBZ0IsT0FBTztBQUNyRCxVQUFJO0FBQ0gsaUJBQVMsS0FBSyxLQUFLO0FBQ25CLGVBQU87QUFBQSxNQUNSLFNBQVMsR0FBRztBQUNYLGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRDtBQUNBLFFBQUksUUFBUSxPQUFPLFVBQVU7QUFDN0IsUUFBSSxXQUFXO0FBQ2YsUUFBSSxpQkFBaUIsaUJBQWlDO0FBRXRELElBQUFELFFBQU8sVUFBVSxTQUFTLFNBQVMsT0FBTztBQUN6QyxVQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzlCLGVBQU87QUFBQSxNQUNSO0FBQ0EsVUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM5QixlQUFPO0FBQUEsTUFDUjtBQUNBLGFBQU8saUJBQWlCLGdCQUFnQixLQUFLLElBQUksTUFBTSxLQUFLLEtBQUssTUFBTTtBQUFBLElBQ3hFO0FBQUE7QUFBQTs7O0FDdkJBO0FBQUEsaUNBQUFFLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBR0EsUUFBSSxPQUFPLE9BQU8sUUFBUSxjQUFjLElBQUksWUFBWSxNQUFNO0FBQzlELFFBQUksT0FBTyxPQUFPLFFBQVEsY0FBYyxJQUFJLFlBQVksTUFBTTtBQUU5RCxRQUFJO0FBRUosUUFBSSxDQUFDLE1BQU07QUFHVixpQkFBVyxTQUFTLE1BQU0sR0FBRztBQUU1QixlQUFPO0FBQUEsTUFDUjtBQUFBLElBQ0Q7QUFFQSxRQUFJLFVBQVUsT0FBTyxJQUFJLFVBQVUsTUFBTTtBQUN6QyxRQUFJLFVBQVUsT0FBTyxJQUFJLFVBQVUsTUFBTTtBQUN6QyxRQUFJLENBQUMsWUFBWSxDQUFDLFNBQVM7QUFHMUIsaUJBQVcsU0FBUyxNQUFNLEdBQUc7QUFFNUIsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBR0EsSUFBQUEsUUFBTyxVQUFVLFlBQVksU0FBUyxNQUFNLEdBQUc7QUFDOUMsVUFBSSxDQUFDLEtBQUssT0FBTyxNQUFNLFVBQVU7QUFDaEMsZUFBTztBQUFBLE1BQ1I7QUFDQSxVQUFJO0FBQ0gsZ0JBQVEsS0FBSyxDQUFDO0FBQ2QsWUFBSSxTQUFTO0FBQ1osY0FBSTtBQUNILG9CQUFRLEtBQUssQ0FBQztBQUFBLFVBQ2YsU0FBUyxHQUFHO0FBQ1gsbUJBQU87QUFBQSxVQUNSO0FBQUEsUUFDRDtBQUVBLGVBQU8sYUFBYTtBQUFBLE1BQ3JCLFNBQVMsR0FBRztBQUFBLE1BQUM7QUFDYixhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7OztBQzlDQTtBQUFBLGlDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksT0FBTyxPQUFPLFFBQVEsY0FBYyxJQUFJLFlBQVksTUFBTTtBQUM5RCxRQUFJLE9BQU8sT0FBTyxRQUFRLGNBQWMsSUFBSSxZQUFZLE1BQU07QUFFOUQsUUFBSTtBQUVKLFFBQUksQ0FBQyxNQUFNO0FBR1YsaUJBQVcsU0FBUyxNQUFNLEdBQUc7QUFFNUIsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBRUEsUUFBSSxVQUFVLE9BQU8sSUFBSSxVQUFVLE1BQU07QUFDekMsUUFBSSxVQUFVLE9BQU8sSUFBSSxVQUFVLE1BQU07QUFDekMsUUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTO0FBRzFCLGlCQUFXLFNBQVMsTUFBTSxHQUFHO0FBRTVCLGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRDtBQUdBLElBQUFBLFFBQU8sVUFBVSxZQUFZLFNBQVMsTUFBTSxHQUFHO0FBQzlDLFVBQUksQ0FBQyxLQUFLLE9BQU8sTUFBTSxVQUFVO0FBQ2hDLGVBQU87QUFBQSxNQUNSO0FBQ0EsVUFBSTtBQUNILGdCQUFRLEtBQUssQ0FBQztBQUNkLFlBQUksU0FBUztBQUNaLGNBQUk7QUFDSCxvQkFBUSxLQUFLLENBQUM7QUFBQSxVQUNmLFNBQVMsR0FBRztBQUNYLG1CQUFPO0FBQUEsVUFDUjtBQUFBLFFBQ0Q7QUFFQSxlQUFPLGFBQWE7QUFBQSxNQUNyQixTQUFTLEdBQUc7QUFBQSxNQUFDO0FBQ2IsYUFBTztBQUFBLElBQ1I7QUFBQTtBQUFBOzs7QUM3Q0E7QUFBQSwwQ0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFXQSxRQUFJLGNBQWM7QUFDbEIsUUFBSSwyQkFBMkI7QUFFL0IsUUFBSSxzQkFBdUIsS0FBSyxnQkFBNkIsR0FBRztBQUMzRCxrQkFBWSxPQUFPO0FBUXZCLE1BQUFBLFFBQU8sVUFBVSxTQUFTQyxhQUFZLFVBQVU7QUFFL0MsWUFBSSxZQUFZLFFBQVEsT0FBTyxTQUFTLFNBQVMsTUFBTSxhQUFhO0FBQ25FLGlCQUFPLFNBQVMsU0FBUyxFQUFFO0FBQUEsUUFDNUI7QUFDQSxZQUFJLFlBQVksUUFBUSxHQUFHO0FBRzFCLGlCQUFPLE1BQU0sVUFBVSxTQUFTLEVBQUUsS0FBSyxRQUFRO0FBQUEsUUFDaEQ7QUFBQSxNQUNEO0FBQUEsSUFDRCxPQUFPO0FBRUYsZ0JBQVU7QUFDVixpQkFBVztBQUNYLHFCQUFlO0FBQ2YsYUFBTyxhQUFhLFNBQVMsSUFBSTtBQUNqQyxhQUFPLGFBQWEsU0FBUyxJQUFJO0FBQ2pDLGtCQUFZO0FBQ1osbUJBQWEsVUFBVSxzQkFBc0I7QUFDN0Msb0JBQWMsVUFBVSw2QkFBNkI7QUFDckQscUJBQWUsVUFBVSx3QkFBd0I7QUFFakQsMkJBQXFCLFNBQVNDLG9CQUFtQixHQUFHQyxRQUFPO0FBQzlELFlBQUksU0FBUyxFQUFFO0FBQ2YsWUFBS0EsU0FBUSxLQUFNLFFBQVE7QUFDMUIsaUJBQU9BLFNBQVE7QUFBQSxRQUNoQjtBQUVBLFlBQUlDLFNBQVEsWUFBWSxHQUFHRCxNQUFLO0FBQ2hDLFlBQUlDLFNBQVEsU0FBVUEsU0FBUSxPQUFRO0FBQ3JDLGlCQUFPRCxTQUFRO0FBQUEsUUFDaEI7QUFFQSxZQUFJLFNBQVMsWUFBWSxHQUFHQSxTQUFRLENBQUM7QUFDckMsWUFBSSxTQUFTLFNBQVUsU0FBUyxPQUFRO0FBQ3ZDLGlCQUFPQSxTQUFRO0FBQUEsUUFDaEI7QUFFQSxlQUFPQSxTQUFRO0FBQUEsTUFDaEI7QUFFSSx5QkFBbUIsU0FBU0Usa0JBQWlCLFdBQVc7QUFDM0QsWUFBSSxJQUFJO0FBQ1IsZUFBTztBQUFBLFVBQ04sTUFBTSxTQUFTLE9BQU87QUFDckIsZ0JBQUksT0FBTyxLQUFLLFVBQVU7QUFDMUIsZ0JBQUk7QUFDSixnQkFBSSxDQUFDLE1BQU07QUFDVixzQkFBUSxVQUFVLENBQUM7QUFDbkIsbUJBQUs7QUFBQSxZQUNOO0FBQ0EsbUJBQU87QUFBQSxjQUNOO0FBQUEsY0FDQTtBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUFBLE1BQ0Q7QUFFSSxpQ0FBMkIsU0FBU0MsMEJBQXlCLFVBQVUseUJBQXlCO0FBQ25HLFlBQUksUUFBUSxRQUFRLEtBQUssWUFBWSxRQUFRLEdBQUc7QUFDL0MsaUJBQU8saUJBQWlCLFFBQVE7QUFBQSxRQUNqQztBQUNBLFlBQUksU0FBUyxRQUFRLEdBQUc7QUFDdkIsY0FBSSxJQUFJO0FBQ1IsaUJBQU87QUFBQSxZQUNOLE1BQU0sU0FBUyxPQUFPO0FBQ3JCLGtCQUFJLFlBQVksbUJBQW1CLFVBQVUsQ0FBQztBQUM5QyxrQkFBSSxRQUFRLGFBQWEsVUFBVSxHQUFHLFNBQVM7QUFDL0Msa0JBQUk7QUFDSixxQkFBTztBQUFBLGdCQUNOLE1BQU0sWUFBWSxTQUFTO0FBQUEsZ0JBQzNCO0FBQUEsY0FDRDtBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUdBLFlBQUksMkJBQTJCLE9BQU8sU0FBUyxxQkFBcUIsTUFBTSxhQUFhO0FBQ3RGLGlCQUFPLFNBQVMscUJBQXFCLEVBQUU7QUFBQSxRQUN4QztBQUFBLE1BQ0Q7QUFFQSxVQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07QUFTbkIsUUFBQU4sUUFBTyxVQUFVLFNBQVNDLGFBQVksVUFBVTtBQUMvQyxjQUFJLFlBQVksTUFBTTtBQUNyQixtQkFBTyx5QkFBeUIsVUFBVSxJQUFJO0FBQUEsVUFDL0M7QUFBQSxRQUNEO0FBQUEsTUFDRCxPQUFPO0FBU0YsZ0JBQVE7QUFDUixnQkFBUTtBQUdSLHNCQUFjLFVBQVUseUJBQXlCLElBQUk7QUFDckQsc0JBQWMsVUFBVSx5QkFBeUIsSUFBSTtBQUN6RCxZQUFJLE9BQU8sWUFBWSxlQUFlLENBQUMsUUFBUSxZQUFZLENBQUMsUUFBUSxTQUFTLE1BQU07QUFLOUUseUJBQWUsVUFBVSwwQkFBMEIsSUFBSTtBQUN2RCx5QkFBZSxVQUFVLDBCQUEwQixJQUFJO0FBQUEsUUFDNUQ7QUFJSSwyQkFBbUIsVUFBVSw0QkFBNEIsSUFBSSxLQUFLLFVBQVUscUNBQXFDLElBQUk7QUFDckgsMkJBQW1CLFVBQVUsNEJBQTRCLElBQUksS0FBSyxVQUFVLHFDQUFxQyxJQUFJO0FBRXJILGdDQUF3QixTQUFTTSx1QkFBc0IsVUFBVTtBQUNwRSxjQUFJLE1BQU0sUUFBUSxHQUFHO0FBQ3BCLGdCQUFJLGNBQWM7QUFDakIscUJBQU8seUJBQXlCLGFBQWEsUUFBUSxDQUFDO0FBQUEsWUFDdkQ7QUFDQSxnQkFBSSxrQkFBa0I7QUFDckIscUJBQU8saUJBQWlCLFFBQVE7QUFBQSxZQUNqQztBQUNBLGdCQUFJLGFBQWE7QUFDaEIsa0JBQUksVUFBVSxDQUFDO0FBQ2YsMEJBQVksVUFBVSxTQUFVLEdBQUcsR0FBRztBQUNyQywyQkFBVyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFBQSxjQUMzQixDQUFDO0FBQ0QscUJBQU8saUJBQWlCLE9BQU87QUFBQSxZQUNoQztBQUFBLFVBQ0Q7QUFDQSxjQUFJLE1BQU0sUUFBUSxHQUFHO0FBQ3BCLGdCQUFJLGNBQWM7QUFDakIscUJBQU8seUJBQXlCLGFBQWEsUUFBUSxDQUFDO0FBQUEsWUFDdkQ7QUFDQSxnQkFBSSxrQkFBa0I7QUFDckIscUJBQU8saUJBQWlCLFFBQVE7QUFBQSxZQUNqQztBQUNBLGdCQUFJLGFBQWE7QUFDaEIsa0JBQUksU0FBUyxDQUFDO0FBQ2QsMEJBQVksVUFBVSxTQUFVLEdBQUc7QUFDbEMsMkJBQVcsUUFBUSxDQUFDO0FBQUEsY0FDckIsQ0FBQztBQUNELHFCQUFPLGlCQUFpQixNQUFNO0FBQUEsWUFDL0I7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUVBLFFBQUFQLFFBQU8sVUFBVSxTQUFTQyxhQUFZLFVBQVU7QUFDL0MsaUJBQU8sc0JBQXNCLFFBQVEsS0FBSyx5QkFBeUIsUUFBUTtBQUFBLFFBQzVFO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUE3S0s7QUFxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFtQkE7QUFrQkE7QUFnREM7QUFDQTtBQUdBO0FBQ0E7QUFNQztBQUNBO0FBS0Q7QUFDQTtBQUVBO0FBQUE7QUFBQTs7O0FDdkpOLElBQUFPLDBCQUFBO0FBQUEsNkNBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxjQUFjLFNBQVUsT0FBTztBQUNsQyxhQUFPLFVBQVU7QUFBQSxJQUNsQjtBQUVBLElBQUFBLFFBQU8sVUFBVSxTQUFTLEdBQUcsR0FBRyxHQUFHO0FBQ2xDLFVBQUksTUFBTSxLQUFLLE1BQU0sR0FBRztBQUN2QixlQUFPLElBQUksTUFBTSxJQUFJO0FBQUEsTUFDdEI7QUFDQSxVQUFJLE1BQU0sR0FBRztBQUNaLGVBQU87QUFBQSxNQUNSO0FBQ0EsVUFBSSxZQUFZLENBQUMsS0FBSyxZQUFZLENBQUMsR0FBRztBQUNyQyxlQUFPO0FBQUEsTUFDUjtBQUNBLGFBQU87QUFBQSxJQUNSO0FBQUE7QUFBQTs7O0FDakJBLElBQUFDLG9CQUFBO0FBQUEsdUNBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxpQkFBaUI7QUFFckIsSUFBQUEsUUFBTyxVQUFVLFNBQVMsY0FBYztBQUN2QyxhQUFPLE9BQU8sT0FBTyxPQUFPLGFBQWEsT0FBTyxLQUFLO0FBQUEsSUFDdEQ7QUFBQTtBQUFBOzs7QUNOQSxJQUFBQyxnQkFBQTtBQUFBLG1DQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksY0FBYztBQUNsQixRQUFJQyxVQUFTO0FBRWIsSUFBQUQsUUFBTyxVQUFVLFNBQVMsZUFBZTtBQUN4QyxVQUFJLFdBQVcsWUFBWTtBQUMzQixNQUFBQyxRQUFPLFFBQVEsRUFBRSxJQUFJLFNBQVMsR0FBRztBQUFBLFFBQ2hDLElBQUksU0FBUyxlQUFlO0FBQzNCLGlCQUFPLE9BQU8sT0FBTztBQUFBLFFBQ3RCO0FBQUEsTUFDRCxDQUFDO0FBQ0QsYUFBTztBQUFBLElBQ1I7QUFBQTtBQUFBOzs7QUNiQTtBQUFBLG9DQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUlDLFVBQVM7QUFDYixRQUFJLFdBQVc7QUFFZixRQUFJLGlCQUFpQjtBQUNyQixRQUFJLGNBQWM7QUFDbEIsUUFBSSxPQUFPO0FBRVgsUUFBSSxXQUFXLFNBQVMsWUFBWSxHQUFHLE1BQU07QUFFN0MsSUFBQUEsUUFBTyxVQUFVO0FBQUEsTUFDaEI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0QsQ0FBQztBQUVELElBQUFELFFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ2pCakI7QUFBQSwwQ0FBQUUsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLFdBQVc7QUFDZixRQUFJLFlBQVk7QUFDaEIsUUFBSSxlQUFlO0FBRW5CLFFBQUksZUFBZSxhQUFhLGlCQUFpQixJQUFJO0FBRXJELFFBQUksY0FBYyxVQUFVLG9DQUFvQyxJQUFJO0FBQ3BFLFFBQUksWUFBWSxVQUFVLDJCQUEyQjtBQUdyRCxRQUFJLFVBQVUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsSUFBSSxhQUFhLENBQUMsRUFBRTtBQUNwRSxRQUFJLFdBQVcsQ0FBQyxDQUFDLFdBQVcsU0FBUyxPQUFPO0FBRzVDLElBQUFBLFFBQU8sVUFBVSxlQUFlLFdBQzdCLFNBQVMsY0FBYyxLQUFLO0FBQzdCLFVBQUksQ0FBQyxPQUFPLE9BQU8sUUFBUSxVQUFVO0FBQ3BDLGVBQU87QUFBQSxNQUNSO0FBQ0EsVUFBSTtBQUNILFlBQUksYUFBYTtBQUVoQixzQkFBWSxHQUFHO0FBQUEsUUFDaEIsT0FBTztBQUVOLG1CQUFTLEtBQUssQ0FBQztBQUFBLFFBQ2hCO0FBQ0EsZUFBTztBQUFBLE1BQ1IsU0FBUyxHQUFHO0FBQ1gsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNELElBQ0UsZUFFQyxTQUFTLGNBQWMsS0FBSztBQUM3QixhQUFPLFVBQVUsR0FBRyxNQUFNO0FBQUEsSUFDM0IsSUFDRSxTQUFTLGNBQWMsS0FBSztBQUM3QixhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7OztBQ3pDRjtBQUFBLHlDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksU0FBUyxLQUFLLFVBQVU7QUFDNUIsUUFBSSxnQkFBZ0IsU0FBUyxrQkFBa0IsT0FBTztBQUNyRCxVQUFJO0FBQ0gsZUFBTyxLQUFLLEtBQUs7QUFDakIsZUFBTztBQUFBLE1BQ1IsU0FBUyxHQUFHO0FBQ1gsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBRUEsUUFBSSxRQUFRLE9BQU8sVUFBVTtBQUM3QixRQUFJLFlBQVk7QUFDaEIsUUFBSSxpQkFBaUIsaUJBQWlDO0FBRXRELElBQUFBLFFBQU8sVUFBVSxTQUFTLGFBQWEsT0FBTztBQUM3QyxVQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsTUFBTTtBQUNoRCxlQUFPO0FBQUEsTUFDUjtBQUNBLGFBQU8saUJBQWlCLGNBQWMsS0FBSyxJQUFJLE1BQU0sS0FBSyxLQUFLLE1BQU07QUFBQSxJQUN0RTtBQUFBO0FBQUE7OztBQ3JCQTtBQUFBLG1DQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksWUFBWTtBQUNoQixRQUFJLGlCQUFpQixpQkFBaUM7QUFDdEQsUUFBSTtBQUNKLFFBQUk7QUFDSixRQUFJO0FBQ0osUUFBSTtBQUVKLFFBQUksZ0JBQWdCO0FBQ25CLFlBQU0sVUFBVSxpQ0FBaUM7QUFDakQsY0FBUSxVQUFVLHVCQUF1QjtBQUN6QyxzQkFBZ0IsQ0FBQztBQUViLHlCQUFtQixXQUFZO0FBQ2xDLGNBQU07QUFBQSxNQUNQO0FBQ0EsdUJBQWlCO0FBQUEsUUFDaEIsVUFBVTtBQUFBLFFBQ1YsU0FBUztBQUFBLE1BQ1Y7QUFFQSxVQUFJLE9BQU8sT0FBTyxnQkFBZ0IsVUFBVTtBQUMzQyx1QkFBZSxPQUFPLFdBQVcsSUFBSTtBQUFBLE1BQ3RDO0FBQUEsSUFDRDtBQVhLO0FBYUwsUUFBSSxZQUFZLFVBQVUsMkJBQTJCO0FBQ3JELFFBQUksT0FBTyxPQUFPO0FBQ2xCLFFBQUksYUFBYTtBQUVqQixJQUFBQSxRQUFPLFVBQVUsaUJBRWQsU0FBUyxRQUFRLE9BQU87QUFDekIsVUFBSSxDQUFDLFNBQVMsT0FBTyxVQUFVLFVBQVU7QUFDeEMsZUFBTztBQUFBLE1BQ1I7QUFFQSxVQUFJLGFBQWEsS0FBSyxPQUFPLFdBQVc7QUFDeEMsVUFBSSwyQkFBMkIsY0FBYyxJQUFJLFlBQVksT0FBTztBQUNwRSxVQUFJLENBQUMsMEJBQTBCO0FBQzlCLGVBQU87QUFBQSxNQUNSO0FBRUEsVUFBSTtBQUNILGNBQU0sT0FBTyxjQUFjO0FBQUEsTUFDNUIsU0FBUyxHQUFHO0FBQ1gsZUFBTyxNQUFNO0FBQUEsTUFDZDtBQUFBLElBQ0QsSUFDRSxTQUFTLFFBQVEsT0FBTztBQUV6QixVQUFJLENBQUMsU0FBVSxPQUFPLFVBQVUsWUFBWSxPQUFPLFVBQVUsWUFBYTtBQUN6RSxlQUFPO0FBQUEsTUFDUjtBQUVBLGFBQU8sVUFBVSxLQUFLLE1BQU07QUFBQSxJQUM3QjtBQUFBO0FBQUE7OztBQ3pERDtBQUFBLGlEQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksWUFBWTtBQUVoQixRQUFJLGNBQWMsVUFBVSwwQ0FBMEMsSUFBSTtBQUcxRSxJQUFBQSxRQUFPLFVBQVUsY0FDZCxTQUFTLG9CQUFvQixLQUFLO0FBQ25DLFVBQUksQ0FBQyxPQUFPLE9BQU8sUUFBUSxVQUFVO0FBQ3BDLGVBQU87QUFBQSxNQUNSO0FBQ0EsVUFBSTtBQUNILG9CQUFZLEdBQUc7QUFDZixlQUFPO0FBQUEsTUFDUixTQUFTLEdBQUc7QUFDWCxlQUFPO0FBQUEsTUFDUjtBQUFBLElBQ0QsSUFDRSxTQUFTLG9CQUFvQixLQUFLO0FBQ25DLGFBQU87QUFBQSxJQUNSO0FBQUE7QUFBQTs7O0FDckJEO0FBQUEsMkNBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxXQUFXLE9BQU8sVUFBVTtBQUNoQyxRQUFJLGtCQUFrQixTQUFTQyxpQkFBZ0IsT0FBTztBQUNyRCxVQUFJO0FBQ0gsaUJBQVMsS0FBSyxLQUFLO0FBQ25CLGVBQU87QUFBQSxNQUNSLFNBQVMsR0FBRztBQUNYLGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRDtBQUNBLFFBQUksUUFBUSxPQUFPLFVBQVU7QUFDN0IsUUFBSSxXQUFXO0FBQ2YsUUFBSSxpQkFBaUIsaUJBQWlDO0FBRXRELElBQUFELFFBQU8sVUFBVSxTQUFTLGVBQWUsT0FBTztBQUMvQyxVQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzlCLGVBQU87QUFBQSxNQUNSO0FBQ0EsVUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM5QixlQUFPO0FBQUEsTUFDUjtBQUNBLGFBQU8saUJBQWlCLGdCQUFnQixLQUFLLElBQUksTUFBTSxLQUFLLEtBQUssTUFBTTtBQUFBLElBQ3hFO0FBQUE7QUFBQTs7O0FDdkJBO0FBQUEsNENBQUFFLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxZQUFZO0FBQ2hCLFFBQUksYUFBYSxVQUFVLDRCQUE0QjtBQUN2RCxRQUFJLFlBQVksVUFBVSwyQkFBMkI7QUFFckQsUUFBSSxtQkFBbUIsU0FBUyxrQkFBa0IsT0FBTztBQUN4RCxVQUFJO0FBQ0gsbUJBQVcsS0FBSztBQUNoQixlQUFPO0FBQUEsTUFDUixTQUFTLEdBQUc7QUFDWCxlQUFPO0FBQUEsTUFDUjtBQUFBLElBQ0Q7QUFDQSxRQUFJLFlBQVk7QUFDaEIsUUFBSSxpQkFBaUIsaUJBQWlDO0FBRXRELElBQUFBLFFBQU8sVUFBVSxTQUFTLFVBQVUsT0FBTztBQUMxQyxVQUFJLE9BQU8sVUFBVSxXQUFXO0FBQy9CLGVBQU87QUFBQSxNQUNSO0FBQ0EsVUFBSSxVQUFVLFFBQVEsT0FBTyxVQUFVLFVBQVU7QUFDaEQsZUFBTztBQUFBLE1BQ1I7QUFDQSxhQUFPLGtCQUFrQixPQUFPLGVBQWUsUUFBUSxpQkFBaUIsS0FBSyxJQUFJLFVBQVUsS0FBSyxNQUFNO0FBQUEsSUFDdkc7QUFBQTtBQUFBOzs7QUN6QkE7QUFBQSxvQ0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLFFBQVEsT0FBTyxVQUFVO0FBQzdCLFFBQUksYUFBYSxzQkFBdUI7QUFFeEMsUUFBSSxZQUFZO0FBQ1gsaUJBQVcsT0FBTyxVQUFVO0FBQzVCLHVCQUFpQjtBQUNqQix1QkFBaUIsU0FBUyxtQkFBbUIsT0FBTztBQUN2RCxZQUFJLE9BQU8sTUFBTSxRQUFRLE1BQU0sVUFBVTtBQUN4QyxpQkFBTztBQUFBLFFBQ1I7QUFDQSxlQUFPLGVBQWUsS0FBSyxTQUFTLEtBQUssS0FBSyxDQUFDO0FBQUEsTUFDaEQ7QUFFQSxNQUFBQSxRQUFPLFVBQVUsU0FBUyxTQUFTLE9BQU87QUFDekMsWUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM5QixpQkFBTztBQUFBLFFBQ1I7QUFDQSxZQUFJLE1BQU0sS0FBSyxLQUFLLE1BQU0sbUJBQW1CO0FBQzVDLGlCQUFPO0FBQUEsUUFDUjtBQUNBLFlBQUk7QUFDSCxpQkFBTyxlQUFlLEtBQUs7QUFBQSxRQUM1QixTQUFTLEdBQUc7QUFDWCxpQkFBTztBQUFBLFFBQ1I7QUFBQSxNQUNEO0FBQUEsSUFDRCxPQUFPO0FBRU4sTUFBQUEsUUFBTyxVQUFVLFNBQVMsU0FBUyxPQUFPO0FBRXpDLGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRDtBQTVCSztBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7QUNSTDtBQUFBLHNDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksVUFBVSxPQUFPLFdBQVcsZUFBZTtBQUUvQyxJQUFBQSxRQUFPLFVBQVUsU0FBUyxtQkFBbUI7QUFDNUMsYUFBTyxPQUFPLFlBQVksY0FDdEIsT0FBTyxXQUFXLGNBQ2xCLE9BQU8sUUFBUSxFQUFFLE1BQU0sWUFDdkIsT0FBTyxPQUFPLEVBQUUsTUFBTTtBQUFBLElBQzNCO0FBQUE7QUFBQTs7O0FDVEE7QUFBQSxvQ0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLGFBQWEsc0JBQXVCO0FBRXhDLFFBQUksWUFBWTtBQUNYLHNCQUFnQixPQUFPLFVBQVU7QUFDakMsa0JBQVksU0FBUyxnQkFBZ0IsT0FBTztBQUMvQyxZQUFJO0FBQ0gsd0JBQWMsS0FBSyxLQUFLO0FBQ3hCLGlCQUFPO0FBQUEsUUFDUixTQUFTLEdBQUc7QUFBQSxRQUNaO0FBQ0EsZUFBTztBQUFBLE1BQ1I7QUFFQSxNQUFBQSxRQUFPLFVBQVUsU0FBUyxTQUFTLE9BQU87QUFDekMsWUFDQyxVQUFVLFFBQ1AsT0FBTyxVQUFVLGVBQ2pCLE9BQU8sVUFBVSxhQUNqQixPQUFPLFVBQVUsWUFDakIsT0FBTyxVQUFVLFlBQ2pCLE9BQU8sVUFBVSxZQUNqQixPQUFPLFVBQVUsWUFDbkI7QUFDRCxpQkFBTztBQUFBLFFBQ1I7QUFDQSxZQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzlCLGlCQUFPO0FBQUEsUUFDUjtBQUVBLGVBQU8sVUFBVSxLQUFLO0FBQUEsTUFDdkI7QUFBQSxJQUNELE9BQU87QUFDTixNQUFBQSxRQUFPLFVBQVUsU0FBUyxTQUFTLE9BQU87QUFDekMsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBaENLO0FBQ0E7QUFBQTtBQUFBOzs7QUNOTDtBQUFBLGdEQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksV0FBVztBQUNmLFFBQUksV0FBVztBQUNmLFFBQUksWUFBWTtBQUNoQixRQUFJLFdBQVc7QUFDZixRQUFJLFdBQVc7QUFHZixJQUFBQSxRQUFPLFVBQVUsU0FBUyxvQkFBb0IsT0FBTztBQUVwRCxVQUFJLFNBQVMsUUFBUyxPQUFPLFVBQVUsWUFBWSxPQUFPLFVBQVUsWUFBYTtBQUNoRixlQUFPO0FBQUEsTUFDUjtBQUNBLFVBQUksU0FBUyxLQUFLLEdBQUc7QUFDcEIsZUFBTztBQUFBLE1BQ1I7QUFDQSxVQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ3BCLGVBQU87QUFBQSxNQUNSO0FBQ0EsVUFBSSxVQUFVLEtBQUssR0FBRztBQUNyQixlQUFPO0FBQUEsTUFDUjtBQUNBLFVBQUksU0FBUyxLQUFLLEdBQUc7QUFDcEIsZUFBTztBQUFBLE1BQ1I7QUFDQSxVQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ3BCLGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRDtBQUFBO0FBQUE7OztBQzdCQTtBQUFBLHFDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksV0FBVyxPQUFPLFlBQVksY0FBYyxRQUFRLFlBQVksVUFBVTtBQUM5RSxRQUFJLFdBQVcsT0FBTyxZQUFZLGNBQWMsUUFBUSxZQUFZLFVBQVU7QUFFOUUsUUFBSTtBQUVKLFFBQUksQ0FBQyxVQUFVO0FBR2QsaUJBQVcsU0FBUyxVQUFVLEdBQUc7QUFFaEMsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBRUEsUUFBSSxVQUFVLFdBQVcsU0FBUyxVQUFVLE1BQU07QUFDbEQsUUFBSSxVQUFVLFdBQVcsU0FBUyxVQUFVLE1BQU07QUFDbEQsUUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTO0FBRzFCLGlCQUFXLFNBQVMsVUFBVSxHQUFHO0FBRWhDLGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRDtBQUdBLElBQUFBLFFBQU8sVUFBVSxZQUFZLFNBQVMsVUFBVSxHQUFHO0FBQ2xELFVBQUksQ0FBQyxLQUFLLE9BQU8sTUFBTSxVQUFVO0FBQ2hDLGVBQU87QUFBQSxNQUNSO0FBQ0EsVUFBSTtBQUNILGdCQUFRLEtBQUssR0FBRyxPQUFPO0FBQ3ZCLFlBQUksU0FBUztBQUNaLGNBQUk7QUFDSCxvQkFBUSxLQUFLLEdBQUcsT0FBTztBQUFBLFVBQ3hCLFNBQVMsR0FBRztBQUNYLG1CQUFPO0FBQUEsVUFDUjtBQUFBLFFBQ0Q7QUFFQSxlQUFPLGFBQWE7QUFBQSxNQUNyQixTQUFTLEdBQUc7QUFBQSxNQUFDO0FBQ2IsYUFBTztBQUFBLElBQ1I7QUFBQTtBQUFBOzs7QUM3Q0E7QUFBQSxxQ0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLGVBQWU7QUFDbkIsUUFBSSxZQUFZO0FBRWhCLFFBQUksV0FBVyxhQUFhLGFBQWEsSUFBSTtBQUU3QyxRQUFJLFVBQVUsVUFBVSx5QkFBeUIsSUFBSTtBQUVyRCxRQUFJLFNBQVM7QUFDUixnQkFBVSxVQUFVLHlCQUF5QixJQUFJO0FBR3JELE1BQUFBLFFBQU8sVUFBVSxTQUFTLFVBQVUsR0FBRztBQUN0QyxZQUFJLENBQUMsS0FBSyxPQUFPLE1BQU0sVUFBVTtBQUNoQyxpQkFBTztBQUFBLFFBQ1I7QUFDQSxZQUFJO0FBQ0gsa0JBQVEsR0FBRyxPQUFPO0FBQ2xCLGNBQUksU0FBUztBQUNaLGdCQUFJO0FBQ0gsc0JBQVEsR0FBRyxPQUFPO0FBQUEsWUFDbkIsU0FBUyxHQUFHO0FBQ1gscUJBQU87QUFBQSxZQUNSO0FBQUEsVUFDRDtBQUVBLGlCQUFPLGFBQWE7QUFBQSxRQUNyQixTQUFTLEdBQUc7QUFBQSxRQUFDO0FBQ2IsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNELE9BQU87QUFHTixNQUFBQSxRQUFPLFVBQVUsU0FBUyxVQUFVLEdBQUc7QUFFdEMsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBNUJLO0FBQUE7QUFBQTs7O0FDVkw7QUFBQSwyQ0FBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLFFBQVE7QUFDWixRQUFJLFFBQVE7QUFDWixRQUFJLFlBQVk7QUFDaEIsUUFBSSxZQUFZO0FBR2hCLElBQUFBLFFBQU8sVUFBVSxTQUFTLGdCQUF1QyxPQUFPO0FBQ3ZFLFVBQUksU0FBUyxPQUFPLFVBQVUsVUFBVTtBQUN2QyxZQUFJLE1BQU0sS0FBSyxHQUFHO0FBQ2pCLGlCQUFPO0FBQUEsUUFDUjtBQUNBLFlBQUksTUFBTSxLQUFLLEdBQUc7QUFDakIsaUJBQU87QUFBQSxRQUNSO0FBQ0EsWUFBSSxVQUFVLEtBQUssR0FBRztBQUNyQixpQkFBTztBQUFBLFFBQ1I7QUFDQSxZQUFJLFVBQVUsS0FBSyxHQUFHO0FBQ3JCLGlCQUFPO0FBQUEsUUFDUjtBQUFBLE1BQ0Q7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7OztBQ3hCQTtBQUFBLHNDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksVUFBVSxTQUFTLFVBQVU7QUFDakMsUUFBSSxlQUFlLE9BQU8sWUFBWSxZQUFZLFlBQVksUUFBUSxRQUFRO0FBQzlFLFFBQUk7QUFDSixRQUFJO0FBQ0osUUFBSSxPQUFPLGlCQUFpQixjQUFjLE9BQU8sT0FBTyxtQkFBbUIsWUFBWTtBQUN0RixVQUFJO0FBQ0gsdUJBQWUsT0FBTyxlQUFlLENBQUMsR0FBRyxVQUFVO0FBQUEsVUFDbEQsS0FBSyxXQUFZO0FBQ2hCLGtCQUFNO0FBQUEsVUFDUDtBQUFBLFFBQ0QsQ0FBQztBQUNELDJCQUFtQixDQUFDO0FBRXBCLHFCQUFhLFdBQVk7QUFBRSxnQkFBTTtBQUFBLFFBQUksR0FBRyxNQUFNLFlBQVk7QUFBQSxNQUMzRCxTQUFTLEdBQUc7QUFDWCxZQUFJLE1BQU0sa0JBQWtCO0FBQzNCLHlCQUFlO0FBQUEsUUFDaEI7QUFBQSxNQUNEO0FBQUEsSUFDRCxPQUFPO0FBQ04scUJBQWU7QUFBQSxJQUNoQjtBQUVBLFFBQUksbUJBQW1CO0FBQ3ZCLFFBQUksZUFBZSxTQUFTLG1CQUFtQixPQUFPO0FBQ3JELFVBQUk7QUFDSCxZQUFJLFFBQVEsUUFBUSxLQUFLLEtBQUs7QUFDOUIsZUFBTyxpQkFBaUIsS0FBSyxLQUFLO0FBQUEsTUFDbkMsU0FBUyxHQUFHO0FBQ1gsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBRUEsUUFBSSxvQkFBb0IsU0FBUyxpQkFBaUIsT0FBTztBQUN4RCxVQUFJO0FBQ0gsWUFBSSxhQUFhLEtBQUssR0FBRztBQUFFLGlCQUFPO0FBQUEsUUFBTztBQUN6QyxnQkFBUSxLQUFLLEtBQUs7QUFDbEIsZUFBTztBQUFBLE1BQ1IsU0FBUyxHQUFHO0FBQ1gsZUFBTztBQUFBLE1BQ1I7QUFBQSxJQUNEO0FBQ0EsUUFBSSxRQUFRLE9BQU8sVUFBVTtBQUM3QixRQUFJLGNBQWM7QUFDbEIsUUFBSSxVQUFVO0FBQ2QsUUFBSSxXQUFXO0FBQ2YsUUFBSSxXQUFXO0FBQ2YsUUFBSSxZQUFZO0FBQ2hCLFFBQUksWUFBWTtBQUNoQixRQUFJLGlCQUFpQixPQUFPLFdBQVcsY0FBYyxDQUFDLENBQUMsT0FBTztBQUU5RCxRQUFJLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUV0QixRQUFJLFFBQVEsU0FBUyxtQkFBbUI7QUFBRSxhQUFPO0FBQUEsSUFBTztBQUN4RCxRQUFJLE9BQU8sYUFBYSxVQUFVO0FBRTdCLFlBQU0sU0FBUztBQUNuQixVQUFJLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxLQUFLLFNBQVMsR0FBRyxHQUFHO0FBQ2pELGdCQUFRLFNBQVMsaUJBQWlCLE9BQU87QUFHeEMsZUFBSyxVQUFVLENBQUMsV0FBVyxPQUFPLFVBQVUsZUFBZSxPQUFPLFVBQVUsV0FBVztBQUN0RixnQkFBSTtBQUNILGtCQUFJLE1BQU0sTUFBTSxLQUFLLEtBQUs7QUFDMUIsc0JBQ0MsUUFBUSxZQUNMLFFBQVEsYUFDUixRQUFRLGFBQ1IsUUFBUSxnQkFDUCxNQUFNLEVBQUUsS0FBSztBQUFBLFlBQ25CLFNBQVMsR0FBRztBQUFBLFlBQU87QUFBQSxVQUNwQjtBQUNBLGlCQUFPO0FBQUEsUUFDUjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBbkJLO0FBcUJMLElBQUFBLFFBQU8sVUFBVSxlQUNkLFNBQVMsV0FBVyxPQUFPO0FBQzVCLFVBQUksTUFBTSxLQUFLLEdBQUc7QUFBRSxlQUFPO0FBQUEsTUFBTTtBQUNqQyxVQUFJLENBQUMsT0FBTztBQUFFLGVBQU87QUFBQSxNQUFPO0FBQzVCLFVBQUksT0FBTyxVQUFVLGNBQWMsT0FBTyxVQUFVLFVBQVU7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUM5RSxVQUFJO0FBQ0gscUJBQWEsT0FBTyxNQUFNLFlBQVk7QUFBQSxNQUN2QyxTQUFTLEdBQUc7QUFDWCxZQUFJLE1BQU0sa0JBQWtCO0FBQUUsaUJBQU87QUFBQSxRQUFPO0FBQUEsTUFDN0M7QUFDQSxhQUFPLENBQUMsYUFBYSxLQUFLLEtBQUssa0JBQWtCLEtBQUs7QUFBQSxJQUN2RCxJQUNFLFNBQVMsV0FBVyxPQUFPO0FBQzVCLFVBQUksTUFBTSxLQUFLLEdBQUc7QUFBRSxlQUFPO0FBQUEsTUFBTTtBQUNqQyxVQUFJLENBQUMsT0FBTztBQUFFLGVBQU87QUFBQSxNQUFPO0FBQzVCLFVBQUksT0FBTyxVQUFVLGNBQWMsT0FBTyxVQUFVLFVBQVU7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUM5RSxVQUFJLGdCQUFnQjtBQUFFLGVBQU8sa0JBQWtCLEtBQUs7QUFBQSxNQUFHO0FBQ3ZELFVBQUksYUFBYSxLQUFLLEdBQUc7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUN6QyxVQUFJLFdBQVcsTUFBTSxLQUFLLEtBQUs7QUFDL0IsVUFBSSxhQUFhLFdBQVcsYUFBYSxZQUFZLENBQUUsaUJBQWtCLEtBQUssUUFBUSxHQUFHO0FBQUUsZUFBTztBQUFBLE1BQU87QUFDekcsYUFBTyxrQkFBa0IsS0FBSztBQUFBLElBQy9CO0FBQUE7QUFBQTs7O0FDcEdEO0FBQUEsbUNBQUFDLFVBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBSSxhQUFhO0FBRWpCLFFBQUksUUFBUSxPQUFPLFVBQVU7QUFDN0IsUUFBSSxpQkFBaUIsT0FBTyxVQUFVO0FBRXRDLFFBQUksZUFBZSxTQUFTQyxjQUFhLE9BQU8sVUFBVSxVQUFVO0FBQ2hFLGVBQVMsSUFBSSxHQUFHLE1BQU0sTUFBTSxRQUFRLElBQUksS0FBSyxLQUFLO0FBQzlDLFlBQUksZUFBZSxLQUFLLE9BQU8sQ0FBQyxHQUFHO0FBQy9CLGNBQUksWUFBWSxNQUFNO0FBQ2xCLHFCQUFTLE1BQU0sQ0FBQyxHQUFHLEdBQUcsS0FBSztBQUFBLFVBQy9CLE9BQU87QUFDSCxxQkFBUyxLQUFLLFVBQVUsTUFBTSxDQUFDLEdBQUcsR0FBRyxLQUFLO0FBQUEsVUFDOUM7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxRQUFJLGdCQUFnQixTQUFTQyxlQUFjLFFBQVEsVUFBVSxVQUFVO0FBQ25FLGVBQVMsSUFBSSxHQUFHLE1BQU0sT0FBTyxRQUFRLElBQUksS0FBSyxLQUFLO0FBRS9DLFlBQUksWUFBWSxNQUFNO0FBQ2xCLG1CQUFTLE9BQU8sT0FBTyxDQUFDLEdBQUcsR0FBRyxNQUFNO0FBQUEsUUFDeEMsT0FBTztBQUNILG1CQUFTLEtBQUssVUFBVSxPQUFPLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTTtBQUFBLFFBQ3ZEO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxRQUFJLGdCQUFnQixTQUFTQyxlQUFjLFFBQVEsVUFBVSxVQUFVO0FBQ25FLGVBQVMsS0FBSyxRQUFRO0FBQ2xCLFlBQUksZUFBZSxLQUFLLFFBQVEsQ0FBQyxHQUFHO0FBQ2hDLGNBQUksWUFBWSxNQUFNO0FBQ2xCLHFCQUFTLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTTtBQUFBLFVBQ2pDLE9BQU87QUFDSCxxQkFBUyxLQUFLLFVBQVUsT0FBTyxDQUFDLEdBQUcsR0FBRyxNQUFNO0FBQUEsVUFDaEQ7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxRQUFJQyxXQUFVLFNBQVNBLFNBQVEsTUFBTSxVQUFVLFNBQVM7QUFDcEQsVUFBSSxDQUFDLFdBQVcsUUFBUSxHQUFHO0FBQ3ZCLGNBQU0sSUFBSSxVQUFVLDZCQUE2QjtBQUFBLE1BQ3JEO0FBRUEsVUFBSTtBQUNKLFVBQUksVUFBVSxVQUFVLEdBQUc7QUFDdkIsbUJBQVc7QUFBQSxNQUNmO0FBRUEsVUFBSSxNQUFNLEtBQUssSUFBSSxNQUFNLGtCQUFrQjtBQUN2QyxxQkFBYSxNQUFNLFVBQVUsUUFBUTtBQUFBLE1BQ3pDLFdBQVcsT0FBTyxTQUFTLFVBQVU7QUFDakMsc0JBQWMsTUFBTSxVQUFVLFFBQVE7QUFBQSxNQUMxQyxPQUFPO0FBQ0gsc0JBQWMsTUFBTSxVQUFVLFFBQVE7QUFBQSxNQUMxQztBQUFBLElBQ0o7QUFFQSxJQUFBSixRQUFPLFVBQVVJO0FBQUE7QUFBQTs7O0FDN0RqQjtBQUFBLHFEQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUdBLElBQUFBLFFBQU8sVUFBVTtBQUFBLE1BQ2hCO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Q7QUFBQTtBQUFBOzs7QUNmQTtBQUFBLGlEQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUksZ0JBQWdCO0FBRXBCLFFBQUksSUFBSSxPQUFPLGVBQWUsY0FBYyxTQUFTO0FBR3JELElBQUFBLFFBQU8sVUFBVSxTQUFTLHVCQUF1QjtBQUNoRCxVQUEyRCxNQUFNLENBQUM7QUFDbEUsZUFBUyxJQUFJLEdBQUcsSUFBSSxjQUFjLFFBQVEsS0FBSztBQUM5QyxZQUFJLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxNQUFNLFlBQVk7QUFFOUMsY0FBSSxJQUFJLE1BQU0sSUFBSSxjQUFjLENBQUM7QUFBQSxRQUNsQztBQUFBLE1BQ0Q7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7OztBQ2hCQTtBQUFBLDRDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUlDLFdBQVU7QUFDZCxRQUFJLHVCQUF1QjtBQUMzQixRQUFJLFdBQVc7QUFDZixRQUFJLFlBQVk7QUFDaEIsUUFBSSxPQUFPO0FBR1gsUUFBSSxZQUFZLFVBQVUsMkJBQTJCO0FBQ3JELFFBQUksaUJBQWlCLGlCQUFpQztBQUV0RCxRQUFJLElBQUksT0FBTyxlQUFlLGNBQWMsU0FBUztBQUNyRCxRQUFJLGNBQWMscUJBQXFCO0FBRXZDLFFBQUksU0FBUyxVQUFVLHdCQUF3QjtBQUMvQyxRQUFJLGlCQUFpQixPQUFPO0FBRzVCLFFBQUksV0FBVyxVQUFVLDJCQUEyQixJQUFJLEtBQUssU0FBUyxRQUFRLE9BQU8sT0FBTztBQUMzRixlQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDekMsWUFBSSxNQUFNLENBQUMsTUFBTSxPQUFPO0FBQ3ZCLGlCQUFPO0FBQUEsUUFDUjtBQUFBLE1BQ0Q7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUlBLFFBQUksUUFBUSxFQUFFLFdBQVcsS0FBSztBQUM5QixRQUFJLGtCQUFrQixRQUFRLGdCQUFnQjtBQUM3QyxNQUFBQSxTQUFRLGFBQWEsU0FBVSxZQUFZO0FBQzFDLFlBQUksTUFBTSxJQUFJLEVBQUUsVUFBVSxFQUFFO0FBQzVCLFlBQUksT0FBTyxlQUFlLEtBQUs7QUFDOUIsY0FBSSxRQUFRLGVBQWUsR0FBRztBQUU5QixjQUFJLGFBQWEsS0FBSyxPQUFPLE9BQU8sV0FBVztBQUMvQyxjQUFJLENBQUMsWUFBWTtBQUNoQixnQkFBSSxhQUFhLGVBQWUsS0FBSztBQUVyQyx5QkFBYSxLQUFLLFlBQVksT0FBTyxXQUFXO0FBQUEsVUFDakQ7QUFFQSxnQkFBTSxNQUFNLFVBQVUsSUFBSSxTQUFTLFdBQVcsR0FBRztBQUFBLFFBQ2xEO0FBQUEsTUFDRCxDQUFDO0FBQUEsSUFDRixPQUFPO0FBQ04sTUFBQUEsU0FBUSxhQUFhLFNBQVUsWUFBWTtBQUMxQyxZQUFJLE1BQU0sSUFBSSxFQUFFLFVBQVUsRUFBRTtBQUM1QixZQUFJLEtBQUssSUFBSSxTQUFTLElBQUk7QUFDMUIsWUFBSSxJQUFJO0FBRVAsZ0JBQU0sTUFBTSxVQUFVLElBQUksU0FBUyxFQUFFO0FBQUEsUUFDdEM7QUFBQSxNQUNELENBQUM7QUFBQSxJQUNGO0FBR0EsUUFBSSxpQkFBaUIsU0FBUyxrQkFBa0IsT0FBTztBQUNGLFVBQUksUUFBUTtBQUNoRSxNQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBRTBFO0FBQUE7QUFBQSxRQUV6RSxTQUFVLFFBQVEsWUFBWTtBQUM3QixjQUFJLENBQUMsT0FBTztBQUNYLGdCQUFJO0FBRUgsa0JBQUksTUFBTSxPQUFPLEtBQUssTUFBTSxZQUFZO0FBQ3ZDLHdCQUFRLE9BQU8sWUFBWSxDQUFDO0FBQUEsY0FDN0I7QUFBQSxZQUNELFNBQVMsR0FBRztBQUFBLFlBQU87QUFBQSxVQUNwQjtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBQ0EsYUFBTztBQUFBLElBQ1I7QUFHQSxRQUFJLFlBQVksU0FBUyxhQUFhLE9BQU87QUFDRyxVQUFJLFFBQVE7QUFDM0QsTUFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUUwRTtBQUFBO0FBQUEsUUFDYyxTQUFVLFFBQVEsTUFBTTtBQUM5RyxjQUFJLENBQUMsT0FBTztBQUNYLGdCQUFJO0FBRUgscUJBQU8sS0FBSztBQUNaLHNCQUFRLE9BQU8sTUFBTSxDQUFDO0FBQUEsWUFDdkIsU0FBUyxHQUFHO0FBQUEsWUFBTztBQUFBLFVBQ3BCO0FBQUEsUUFDRDtBQUFBLE1BQ0Q7QUFDQSxhQUFPO0FBQUEsSUFDUjtBQUdBLElBQUFELFFBQU8sVUFBVSxTQUFTLGdCQUFnQixPQUFPO0FBQ2hELFVBQUksQ0FBQyxTQUFTLE9BQU8sVUFBVSxVQUFVO0FBQUUsZUFBTztBQUFBLE1BQU87QUFDekQsVUFBSSxDQUFDLGdCQUFnQjtBQUVwQixZQUFJRSxPQUFNLE9BQU8sVUFBVSxLQUFLLEdBQUcsR0FBRyxFQUFFO0FBQ3hDLFlBQUksU0FBUyxhQUFhQSxJQUFHLElBQUksSUFBSTtBQUNwQyxpQkFBT0E7QUFBQSxRQUNSO0FBQ0EsWUFBSUEsU0FBUSxVQUFVO0FBQ3JCLGlCQUFPO0FBQUEsUUFDUjtBQUVBLGVBQU8sVUFBVSxLQUFLO0FBQUEsTUFDdkI7QUFDQSxVQUFJLENBQUMsTUFBTTtBQUFFLGVBQU87QUFBQSxNQUFNO0FBQzFCLGFBQU8sZUFBZSxLQUFLO0FBQUEsSUFDNUI7QUFBQTtBQUFBOzs7QUNuSEE7QUFBQSxtREFBQUMsVUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLFlBQVk7QUFDaEIsUUFBSSxjQUFjLFVBQVUsb0NBQW9DLElBQUk7QUFFcEUsUUFBSSxnQkFBZ0I7QUFHcEIsSUFBQUEsUUFBTyxVQUFVLFNBQVMsV0FBVyxJQUFJO0FBQ3hDLFVBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRztBQUN2QixlQUFPO0FBQUEsTUFDUjtBQUNBLGFBQU8sY0FBYyxZQUFZLEVBQUUsSUFBSSxHQUFHO0FBQUEsSUFDM0M7QUFBQTtBQUFBOzs7QUNiQTtBQUFBLHFDQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQUlDLFVBQVM7QUFDYixRQUFJLFlBQVk7QUFDaEIsUUFBSSxRQUFRO0FBQ1osUUFBSSxlQUFlO0FBQ25CLFFBQUlDLGVBQWM7QUFDbEIsUUFBSSxpQkFBaUI7QUFDckIsUUFBSSxLQUFLO0FBQ1QsUUFBSSxjQUFjO0FBQ2xCLFFBQUksVUFBVTtBQUNkLFFBQUksZ0JBQWdCO0FBQ3BCLFFBQUksU0FBUztBQUNiLFFBQUksVUFBVTtBQUNkLFFBQUksc0JBQXNCO0FBQzFCLFFBQUksYUFBYTtBQUNqQixRQUFJLHNCQUFzQjtBQUMxQixRQUFJLGtCQUFrQjtBQUN0QixRQUFJLGtCQUFrQjtBQUN0QixRQUFJLGFBQWE7QUFFakIsUUFBSSxnQkFBZ0IsVUFBVSwwQ0FBMEMsSUFBSTtBQUU1RSxRQUFJLFdBQVcsVUFBVSx3QkFBd0I7QUFDakQsUUFBSSxNQUFNLE9BQU87QUFDakIsUUFBSSxlQUFlLFVBQVUsMkJBQTJCO0FBRXhELFFBQUksT0FBTyxhQUFhLFNBQVMsSUFBSTtBQUNyQyxRQUFJLFVBQVUsVUFBVSxxQkFBcUIsSUFBSTtBQUNqRCxRQUFJLFVBQVUsVUFBVSxxQkFBcUIsSUFBSTtBQUNqRCxRQUFJLFdBQVcsVUFBVSxzQkFBc0IsSUFBSTtBQUNuRCxRQUFJLFVBQVUsVUFBVSxxQkFBcUIsSUFBSTtBQUNqRCxRQUFJLGFBQWEsVUFBVSx3QkFBd0IsSUFBSTtBQUN2RCxRQUFJLFVBQVUsVUFBVSxxQkFBcUIsSUFBSTtBQUNqRCxRQUFJLFdBQVcsVUFBVSxzQkFBc0IsSUFBSTtBQUduRCxhQUFTLG1CQUFtQixLQUFLLE1BQU0sTUFBTSxTQUFTO0FBQ3BELFVBQUksSUFBSUEsYUFBWSxHQUFHO0FBQ3ZCLFVBQUk7QUFDSixjQUFRLFNBQVMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxPQUFPLE1BQU07QUFDMUMsWUFBSSxrQkFBa0IsTUFBTSxPQUFPLE9BQU8sTUFBTSxPQUFPLEdBQUc7QUFFeEQscUJBQVcsS0FBSyxPQUFPLEtBQUs7QUFDNUIsaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUVBLGFBQU87QUFBQSxJQUNUO0FBR0EsYUFBUyw0QkFBNEIsTUFBTTtBQUN6QyxVQUFJLE9BQU8sU0FBUyxhQUFhO0FBQy9CLGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixlQUFPO0FBQUEsTUFDVDtBQUNBLFVBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsZUFBTztBQUFBLE1BQ1Q7QUFDQSxVQUFJLE9BQU8sU0FBUyxZQUFZLE9BQU8sU0FBUyxVQUFVO0FBRXhELGVBQU8sQ0FBQyxTQUFTLENBQUM7QUFBQSxNQUNwQjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBR0EsYUFBUyxzQkFBc0IsR0FBRyxHQUFHLE1BQU0sTUFBTSxNQUFNLFNBQVM7QUFDOUQsVUFBSSxXQUFXLDRCQUE0QixJQUFJO0FBQy9DLFVBQUksWUFBWSxNQUFNO0FBQ3BCLGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxPQUFPLFFBQVEsR0FBRyxRQUFRO0FBQzlCLFVBQUksWUFBWUQsUUFBTyxDQUFDLEdBQUcsTUFBTSxFQUFFLFFBQVEsTUFBTSxDQUFDO0FBQ2xELFVBQ0csT0FBTyxTQUFTLGVBQWUsQ0FBQyxRQUFRLEdBQUcsUUFBUSxLQUVqRCxDQUFDLGtCQUFrQixNQUFNLE1BQU0sV0FBVyxPQUFPLEdBQ3BEO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFFQSxhQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxrQkFBa0IsTUFBTSxNQUFNLFdBQVcsT0FBTztBQUFBLElBQ2xGO0FBR0EsYUFBUyxzQkFBc0IsR0FBRyxHQUFHLE1BQU07QUFDekMsVUFBSSxXQUFXLDRCQUE0QixJQUFJO0FBQy9DLFVBQUksWUFBWSxNQUFNO0FBQ3BCLGVBQU87QUFBQSxNQUNUO0FBRUEsYUFBTyxRQUFRLEdBQUcsUUFBUSxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVE7QUFBQSxJQUNyRDtBQUdBLGFBQVMsaUJBQWlCLEtBQUssS0FBSyxNQUFNLE9BQU8sTUFBTSxTQUFTO0FBQzlELFVBQUksSUFBSUMsYUFBWSxHQUFHO0FBQ3ZCLFVBQUk7QUFDSixVQUFJO0FBQ0osY0FBUSxTQUFTLEVBQUUsS0FBSyxNQUFNLENBQUMsT0FBTyxNQUFNO0FBQzFDLGVBQU8sT0FBTztBQUNkO0FBQUE7QUFBQSxVQUVFLGtCQUFrQixNQUFNLE1BQU0sTUFBTSxPQUFPLEtBRXhDLGtCQUFrQixPQUFPLFFBQVEsS0FBSyxJQUFJLEdBQUcsTUFBTSxPQUFPO0FBQUEsVUFDN0Q7QUFDQSxxQkFBVyxLQUFLLElBQUk7QUFDcEIsaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUVBLGFBQU87QUFBQSxJQUNUO0FBRUEsYUFBUyxrQkFBa0IsUUFBUSxVQUFVLFNBQVMsU0FBUztBQUM3RCxVQUFJLE9BQU8sV0FBVyxDQUFDO0FBR3ZCLFVBQUksS0FBSyxTQUFTLEdBQUcsUUFBUSxRQUFRLElBQUksV0FBVyxVQUFVO0FBQzVELGVBQU87QUFBQSxNQUNUO0FBRUEsVUFBSSxjQUFjLG9CQUFvQixNQUFNO0FBQzVDLFVBQUksZ0JBQWdCLG9CQUFvQixRQUFRO0FBQ2hELFVBQUksZ0JBQWdCLGVBQWU7QUFDakMsZUFBTztBQUFBLE1BQ1Q7QUFHQSxVQUFJLENBQUMsVUFBVSxDQUFDLFlBQWEsT0FBTyxXQUFXLFlBQVksT0FBTyxhQUFhLFVBQVc7QUFDeEYsZUFBTyxLQUFLLFNBQVMsR0FBRyxRQUFRLFFBQVEsSUFBSSxVQUFVO0FBQUEsTUFDeEQ7QUFZQSxVQUFJLFlBQVksUUFBUSxJQUFJLE1BQU07QUFDbEMsVUFBSSxjQUFjLFFBQVEsSUFBSSxRQUFRO0FBQ3RDLFVBQUk7QUFDSixVQUFJLGFBQWEsYUFBYTtBQUM1QixZQUFJLFFBQVEsSUFBSSxNQUFNLE1BQU0sUUFBUSxJQUFJLFFBQVEsR0FBRztBQUNqRCxpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGLE9BQU87QUFDTCxtQkFBVyxDQUFDO0FBQUEsTUFDZDtBQUNBLFVBQUksQ0FBQyxXQUFXO0FBQUUsZ0JBQVEsSUFBSSxRQUFRLFFBQVE7QUFBQSxNQUFHO0FBQ2pELFVBQUksQ0FBQyxhQUFhO0FBQUUsZ0JBQVEsSUFBSSxVQUFVLFFBQVE7QUFBQSxNQUFHO0FBR3JELGFBQU8sU0FBUyxRQUFRLFVBQVUsTUFBTSxPQUFPO0FBQUEsSUFDakQ7QUFFQSxhQUFTLFNBQVMsR0FBRztBQUNuQixVQUFJLENBQUMsS0FBSyxPQUFPLE1BQU0sWUFBWSxPQUFPLEVBQUUsV0FBVyxVQUFVO0FBQy9ELGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxPQUFPLEVBQUUsU0FBUyxjQUFjLE9BQU8sRUFBRSxVQUFVLFlBQVk7QUFDakUsZUFBTztBQUFBLE1BQ1Q7QUFDQSxVQUFJLEVBQUUsU0FBUyxLQUFLLE9BQU8sRUFBRSxDQUFDLE1BQU0sVUFBVTtBQUM1QyxlQUFPO0FBQUEsTUFDVDtBQUVBLGFBQU8sQ0FBQyxFQUFFLEVBQUUsZUFBZSxFQUFFLFlBQVksWUFBWSxFQUFFLFlBQVksU0FBUyxDQUFDO0FBQUEsSUFDL0U7QUFFQSxhQUFTLFNBQVMsR0FBRyxHQUFHLE1BQU0sU0FBUztBQUNyQyxVQUFJLFNBQVMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxHQUFHO0FBQy9CLGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxLQUFLQSxhQUFZLENBQUM7QUFDdEIsVUFBSSxLQUFLQSxhQUFZLENBQUM7QUFDdEIsVUFBSTtBQUNKLFVBQUk7QUFDSixVQUFJO0FBQ0osY0FBUSxVQUFVLEdBQUcsS0FBSyxNQUFNLENBQUMsUUFBUSxNQUFNO0FBQzdDLFlBQUksUUFBUSxTQUFTLE9BQU8sUUFBUSxVQUFVLFVBQVU7QUFDdEQsY0FBSSxDQUFDLEtBQUs7QUFBRSxrQkFBTSxJQUFJLEtBQUs7QUFBQSxVQUFHO0FBQzlCLGtCQUFRLEtBQUssUUFBUSxLQUFLO0FBQUEsUUFDNUIsV0FBVyxDQUFDLFFBQVEsR0FBRyxRQUFRLEtBQUssR0FBRztBQUNyQyxjQUFJLEtBQUssUUFBUTtBQUFFLG1CQUFPO0FBQUEsVUFBTztBQUNqQyxjQUFJLENBQUMsc0JBQXNCLEdBQUcsR0FBRyxRQUFRLEtBQUssR0FBRztBQUMvQyxtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLENBQUMsS0FBSztBQUFFLGtCQUFNLElBQUksS0FBSztBQUFBLFVBQUc7QUFDOUIsa0JBQVEsS0FBSyxRQUFRLEtBQUs7QUFBQSxRQUM1QjtBQUFBLE1BQ0Y7QUFDQSxVQUFJLEtBQUs7QUFDUCxnQkFBUSxVQUFVLEdBQUcsS0FBSyxNQUFNLENBQUMsUUFBUSxNQUFNO0FBRTdDLGNBQUksUUFBUSxTQUFTLE9BQU8sUUFBUSxVQUFVLFVBQVU7QUFDdEQsZ0JBQUksQ0FBQyxtQkFBbUIsS0FBSyxRQUFRLE9BQU8sS0FBSyxRQUFRLE9BQU8sR0FBRztBQUNqRSxxQkFBTztBQUFBLFlBQ1Q7QUFBQSxVQUNGLFdBQ0UsQ0FBQyxLQUFLLFVBQ0gsQ0FBQyxRQUFRLEdBQUcsUUFBUSxLQUFLLEtBQ3pCLENBQUMsbUJBQW1CLEtBQUssUUFBUSxPQUFPLEtBQUssUUFBUSxPQUFPLEdBQy9EO0FBQ0EsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUNBLGVBQU8sU0FBUyxHQUFHLE1BQU07QUFBQSxNQUMzQjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBRUEsYUFBUyxTQUFTLEdBQUcsR0FBRyxNQUFNLFNBQVM7QUFDckMsVUFBSSxTQUFTLENBQUMsTUFBTSxTQUFTLENBQUMsR0FBRztBQUMvQixlQUFPO0FBQUEsTUFDVDtBQUNBLFVBQUksS0FBS0EsYUFBWSxDQUFDO0FBQ3RCLFVBQUksS0FBS0EsYUFBWSxDQUFDO0FBQ3RCLFVBQUk7QUFDSixVQUFJO0FBQ0osVUFBSTtBQUNKLFVBQUlDO0FBQ0osVUFBSTtBQUNKLFVBQUk7QUFDSixjQUFRLFVBQVUsR0FBRyxLQUFLLE1BQU0sQ0FBQyxRQUFRLE1BQU07QUFDN0MsUUFBQUEsT0FBTSxRQUFRLE1BQU0sQ0FBQztBQUNyQixnQkFBUSxRQUFRLE1BQU0sQ0FBQztBQUN2QixZQUFJQSxRQUFPLE9BQU9BLFNBQVEsVUFBVTtBQUNsQyxjQUFJLENBQUMsS0FBSztBQUFFLGtCQUFNLElBQUksS0FBSztBQUFBLFVBQUc7QUFDOUIsa0JBQVEsS0FBS0EsSUFBRztBQUFBLFFBQ2xCLE9BQU87QUFDTCxrQkFBUSxRQUFRLEdBQUdBLElBQUc7QUFDdEIsY0FBSyxPQUFPLFVBQVUsZUFBZSxDQUFDLFFBQVEsR0FBR0EsSUFBRyxLQUFNLENBQUMsa0JBQWtCLE9BQU8sT0FBTyxNQUFNLE9BQU8sR0FBRztBQUN6RyxnQkFBSSxLQUFLLFFBQVE7QUFDZixxQkFBTztBQUFBLFlBQ1Q7QUFDQSxnQkFBSSxDQUFDLHNCQUFzQixHQUFHLEdBQUdBLE1BQUssT0FBTyxNQUFNLE9BQU8sR0FBRztBQUMzRCxxQkFBTztBQUFBLFlBQ1Q7QUFDQSxnQkFBSSxDQUFDLEtBQUs7QUFBRSxvQkFBTSxJQUFJLEtBQUs7QUFBQSxZQUFHO0FBQzlCLG9CQUFRLEtBQUtBLElBQUc7QUFBQSxVQUNsQjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsVUFBSSxLQUFLO0FBQ1AsZ0JBQVEsVUFBVSxHQUFHLEtBQUssTUFBTSxDQUFDLFFBQVEsTUFBTTtBQUM3QyxVQUFBQSxPQUFNLFFBQVEsTUFBTSxDQUFDO0FBQ3JCLGtCQUFRLFFBQVEsTUFBTSxDQUFDO0FBQ3ZCLGNBQUlBLFFBQU8sT0FBT0EsU0FBUSxVQUFVO0FBQ2xDLGdCQUFJLENBQUMsaUJBQWlCLEtBQUssR0FBR0EsTUFBSyxPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQ3hELHFCQUFPO0FBQUEsWUFDVDtBQUFBLFVBQ0YsV0FDRSxDQUFDLEtBQUssV0FDRixDQUFDLEVBQUUsSUFBSUEsSUFBRyxLQUFLLENBQUMsa0JBQWtCLFFBQVEsR0FBR0EsSUFBRyxHQUFHLE9BQU8sTUFBTSxPQUFPLE1BQ3hFLENBQUMsaUJBQWlCLEtBQUssR0FBR0EsTUFBSyxPQUFPRixRQUFPLENBQUMsR0FBRyxNQUFNLEVBQUUsUUFBUSxNQUFNLENBQUMsR0FBRyxPQUFPLEdBQ3JGO0FBQ0EsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUNBLGVBQU8sU0FBUyxHQUFHLE1BQU07QUFBQSxNQUMzQjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBRUEsYUFBUyxTQUFTLEdBQUcsR0FBRyxNQUFNLFNBQVM7QUFFckMsVUFBSSxHQUFHRTtBQUVQLFVBQUksT0FBTyxNQUFNLE9BQU8sR0FBRztBQUFFLGVBQU87QUFBQSxNQUFPO0FBQzNDLFVBQUksS0FBSyxRQUFRLEtBQUssTUFBTTtBQUFFLGVBQU87QUFBQSxNQUFPO0FBRTVDLFVBQUksYUFBYSxDQUFDLE1BQU0sYUFBYSxDQUFDLEdBQUc7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUV6RCxVQUFJLFlBQVksQ0FBQyxNQUFNLFlBQVksQ0FBQyxHQUFHO0FBQUUsZUFBTztBQUFBLE1BQU87QUFFdkQsVUFBSSxXQUFXLFFBQVEsQ0FBQztBQUN4QixVQUFJLFdBQVcsUUFBUSxDQUFDO0FBQ3hCLFVBQUksYUFBYSxVQUFVO0FBQUUsZUFBTztBQUFBLE1BQU87QUFHM0MsVUFBSSxXQUFXLGFBQWE7QUFDNUIsVUFBSSxXQUFXLGFBQWE7QUFDNUIsVUFBSSxhQUFhLFVBQVU7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUMzQyxVQUFJLFlBQVksVUFBVTtBQUN4QixZQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsU0FBUztBQUFFLGlCQUFPO0FBQUEsUUFBTztBQUFBLE1BQ3BFO0FBRUEsVUFBSSxXQUFXLFFBQVEsQ0FBQztBQUN4QixVQUFJLFdBQVcsUUFBUSxDQUFDO0FBQ3hCLFVBQUksYUFBYSxVQUFVO0FBQUUsZUFBTztBQUFBLE1BQU87QUFDM0MsV0FBSyxZQUFZLGNBQWMsRUFBRSxXQUFXLEVBQUUsVUFBVSxNQUFNLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSTtBQUM5RSxlQUFPO0FBQUEsTUFDVDtBQUVBLFVBQUksVUFBVSxPQUFPLENBQUM7QUFDdEIsVUFBSSxVQUFVLE9BQU8sQ0FBQztBQUN0QixVQUFJLFlBQVksU0FBUztBQUFFLGVBQU87QUFBQSxNQUFPO0FBQ3pDLFVBQUksV0FBVyxTQUFTO0FBQ3RCLFlBQUksU0FBUyxDQUFDLE1BQU0sU0FBUyxDQUFDLEdBQUc7QUFBRSxpQkFBTztBQUFBLFFBQU87QUFBQSxNQUNuRDtBQUNBLFVBQUksS0FBSyxVQUFVLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUc7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUU3RCxVQUFJLFNBQVMsZ0JBQWdCLENBQUM7QUFDOUIsVUFBSSxTQUFTLGdCQUFnQixDQUFDO0FBQzlCLFVBQUksV0FBVyxRQUFRO0FBQ3JCLGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxVQUFVLFFBQVE7QUFDcEIsWUFBSSxFQUFFLFdBQVcsRUFBRSxRQUFRO0FBQUUsaUJBQU87QUFBQSxRQUFPO0FBQzNDLGFBQUssSUFBSSxHQUFHLElBQUksRUFBRSxRQUFRLEtBQUs7QUFDN0IsY0FBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRztBQUFFLG1CQUFPO0FBQUEsVUFBTztBQUFBLFFBQ3JDO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFFQSxVQUFJLFlBQVksU0FBUyxDQUFDO0FBQzFCLFVBQUksWUFBWSxTQUFTLENBQUM7QUFDMUIsVUFBSSxjQUFjLFdBQVc7QUFBRSxlQUFPO0FBQUEsTUFBTztBQUM3QyxVQUFJLGFBQWEsV0FBVztBQUMxQixZQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVE7QUFBRSxpQkFBTztBQUFBLFFBQU87QUFDM0MsYUFBSyxJQUFJLEdBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSztBQUM3QixjQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHO0FBQUUsbUJBQU87QUFBQSxVQUFPO0FBQUEsUUFDckM7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUVBLFVBQUksaUJBQWlCLGNBQWMsQ0FBQztBQUNwQyxVQUFJLGlCQUFpQixjQUFjLENBQUM7QUFDcEMsVUFBSSxtQkFBbUIsZ0JBQWdCO0FBQUUsZUFBTztBQUFBLE1BQU87QUFDdkQsVUFBSSxrQkFBa0IsZ0JBQWdCO0FBQ3BDLFlBQUksV0FBVyxDQUFDLE1BQU0sV0FBVyxDQUFDLEdBQUc7QUFBRSxpQkFBTztBQUFBLFFBQU87QUFDckQsZUFBTyxPQUFPLGVBQWUsY0FBYyxrQkFBa0IsSUFBSSxXQUFXLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLE1BQU0sT0FBTztBQUFBLE1BQ2xIO0FBRUEsVUFBSSxTQUFTLG9CQUFvQixDQUFDO0FBQ2xDLFVBQUksU0FBUyxvQkFBb0IsQ0FBQztBQUNsQyxVQUFJLFdBQVcsUUFBUTtBQUFFLGVBQU87QUFBQSxNQUFPO0FBQ3ZDLFVBQUksVUFBVSxRQUFRO0FBQ3BCLFlBQUksY0FBYyxDQUFDLE1BQU0sY0FBYyxDQUFDLEdBQUc7QUFBRSxpQkFBTztBQUFBLFFBQU87QUFDM0QsZUFBTyxPQUFPLGVBQWUsY0FBYyxrQkFBa0IsSUFBSSxXQUFXLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLE1BQU0sT0FBTztBQUFBLE1BQ2xIO0FBRUEsVUFBSSxPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQUUsZUFBTztBQUFBLE1BQU87QUFFM0MsVUFBSSxLQUFLLFdBQVcsQ0FBQztBQUNyQixVQUFJLEtBQUssV0FBVyxDQUFDO0FBRXJCLFVBQUksR0FBRyxXQUFXLEdBQUcsUUFBUTtBQUFFLGVBQU87QUFBQSxNQUFPO0FBRzdDLFNBQUcsS0FBSztBQUNSLFNBQUcsS0FBSztBQUVSLFdBQUssSUFBSSxHQUFHLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUNuQyxZQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHO0FBQUUsaUJBQU87QUFBQSxRQUFPO0FBQUEsTUFDdEM7QUFHQSxXQUFLLElBQUksR0FBRyxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDbkMsUUFBQUEsT0FBTSxHQUFHLENBQUM7QUFDVixZQUFJLENBQUMsa0JBQWtCLEVBQUVBLElBQUcsR0FBRyxFQUFFQSxJQUFHLEdBQUcsTUFBTSxPQUFPLEdBQUc7QUFBRSxpQkFBTztBQUFBLFFBQU87QUFBQSxNQUN6RTtBQUVBLFVBQUksY0FBYyxnQkFBZ0IsQ0FBQztBQUNuQyxVQUFJLGNBQWMsZ0JBQWdCLENBQUM7QUFDbkMsVUFBSSxnQkFBZ0IsYUFBYTtBQUMvQixlQUFPO0FBQUEsTUFDVDtBQUNBLFVBQUksZ0JBQWdCLFNBQVMsZ0JBQWdCLE9BQU87QUFDbEQsZUFBTyxTQUFTLEdBQUcsR0FBRyxNQUFNLE9BQU87QUFBQSxNQUNyQztBQUNBLFVBQUksZ0JBQWdCLE9BQU87QUFDekIsZUFBTyxTQUFTLEdBQUcsR0FBRyxNQUFNLE9BQU87QUFBQSxNQUNyQztBQUVBLGFBQU87QUFBQSxJQUNUO0FBRUEsSUFBQUgsUUFBTyxVQUFVLFNBQVNJLFdBQVUsR0FBRyxHQUFHLE1BQU07QUFDOUMsYUFBTyxrQkFBa0IsR0FBRyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBQUEsSUFDdkQ7QUFBQTtBQUFBOzs7QUN2WUE7QUFBQTtBQUFBO0FBU0EsS0FBQyxXQUFZO0FBQ1g7QUFFQSxVQUFJLFFBQVE7QUFDWixVQUFJLFNBQVMsT0FBTyxXQUFXO0FBQy9CLFVBQUksT0FBTyxTQUFTLFNBQVMsQ0FBQztBQUM5QixVQUFJLEtBQUsscUJBQXFCO0FBQzVCLGlCQUFTO0FBQUEsTUFDWDtBQUNBLFVBQUksYUFBYSxDQUFDLFVBQVUsT0FBTyxTQUFTO0FBQzVDLFVBQUksVUFBVSxDQUFDLEtBQUssd0JBQXdCLE9BQU8sWUFBWSxZQUFZLFFBQVEsWUFBWSxRQUFRLFNBQVM7QUFDaEgsVUFBSSxTQUFTO0FBQ1gsZUFBTztBQUFBLE1BQ1QsV0FBVyxZQUFZO0FBQ3JCLGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxZQUFZLENBQUMsS0FBSywwQkFBMEIsT0FBTyxXQUFXLFlBQVksT0FBTztBQUNyRixVQUFJLE1BQU0sT0FBTyxXQUFXLGNBQWMsT0FBTztBQUNqRCxVQUFJLGVBQWUsQ0FBQyxLQUFLLDZCQUE2QixPQUFPLGdCQUFnQjtBQUM3RSxVQUFJLFlBQVksbUJBQW1CLE1BQU0sRUFBRTtBQUMzQyxVQUFJLFFBQVEsQ0FBQyxhQUFhLFNBQVMsT0FBTyxHQUFHO0FBQzdDLFVBQUksUUFBUSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUM7QUFDekIsVUFBSSxJQUFJO0FBQUEsUUFDTjtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwRjtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwRjtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwRjtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwRjtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwRjtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwRjtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwRjtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxNQUN0RjtBQUNBLFVBQUksZUFBZSxDQUFDLE9BQU8sU0FBUyxVQUFVLGFBQWE7QUFFM0QsVUFBSSxTQUFTLENBQUM7QUFFZCxVQUFJLEtBQUssd0JBQXdCLENBQUMsTUFBTSxTQUFTO0FBQy9DLGNBQU0sVUFBVSxTQUFVLEtBQUs7QUFDN0IsaUJBQU8sT0FBTyxVQUFVLFNBQVMsS0FBSyxHQUFHLE1BQU07QUFBQSxRQUNqRDtBQUFBLE1BQ0Y7QUFFQSxVQUFJLGlCQUFpQixLQUFLLHFDQUFxQyxDQUFDLFlBQVksU0FBUztBQUNuRixvQkFBWSxTQUFTLFNBQVUsS0FBSztBQUNsQyxpQkFBTyxPQUFPLFFBQVEsWUFBWSxJQUFJLFVBQVUsSUFBSSxPQUFPLGdCQUFnQjtBQUFBLFFBQzdFO0FBQUEsTUFDRjtBQUVBLFVBQUkscUJBQXFCLFNBQVUsWUFBWUMsUUFBTztBQUNwRCxlQUFPLFNBQVUsU0FBUztBQUN4QixpQkFBTyxJQUFJLE9BQU9BLFFBQU8sSUFBSSxFQUFFLE9BQU8sT0FBTyxFQUFFLFVBQVUsRUFBRTtBQUFBLFFBQzdEO0FBQUEsTUFDRjtBQUVBLFVBQUksZUFBZSxTQUFVQSxRQUFPO0FBQ2xDLFlBQUlDLFVBQVMsbUJBQW1CLE9BQU9ELE1BQUs7QUFDNUMsWUFBSSxTQUFTO0FBQ1gsVUFBQUMsVUFBUyxTQUFTQSxTQUFRRCxNQUFLO0FBQUEsUUFDakM7QUFDQSxRQUFBQyxRQUFPLFNBQVMsV0FBWTtBQUMxQixpQkFBTyxJQUFJLE9BQU9ELE1BQUs7QUFBQSxRQUN6QjtBQUNBLFFBQUFDLFFBQU8sU0FBUyxTQUFVLFNBQVM7QUFDakMsaUJBQU9BLFFBQU8sT0FBTyxFQUFFLE9BQU8sT0FBTztBQUFBLFFBQ3ZDO0FBQ0EsaUJBQVMsSUFBSSxHQUFHLElBQUksYUFBYSxRQUFRLEVBQUUsR0FBRztBQUM1QyxjQUFJLE9BQU8sYUFBYSxDQUFDO0FBQ3pCLFVBQUFBLFFBQU8sSUFBSSxJQUFJLG1CQUFtQixNQUFNRCxNQUFLO0FBQUEsUUFDL0M7QUFDQSxlQUFPQztBQUFBLE1BQ1Q7QUFFQSxVQUFJLFdBQVcsU0FBVSxRQUFRLE9BQU87QUFDdEMsWUFBSSxTQUFTLEtBQUssbUJBQW1CO0FBQ3JDLFlBQUksU0FBUyxLQUFLLDBCQUEwQjtBQUM1QyxZQUFJLFlBQVksUUFBUSxXQUFXO0FBQ25DLFlBQUksYUFBYSxTQUFVLFNBQVM7QUFDbEMsY0FBSSxPQUFPLFlBQVksVUFBVTtBQUMvQixtQkFBTyxPQUFPLFdBQVcsU0FBUyxFQUFFLE9BQU8sU0FBUyxNQUFNLEVBQUUsT0FBTyxLQUFLO0FBQUEsVUFDMUUsT0FBTztBQUNMLGdCQUFJLFlBQVksUUFBUSxZQUFZLFFBQVc7QUFDN0Msb0JBQU0sSUFBSSxNQUFNLEtBQUs7QUFBQSxZQUN2QixXQUFXLFFBQVEsZ0JBQWdCLGFBQWE7QUFDOUMsd0JBQVUsSUFBSSxXQUFXLE9BQU87QUFBQSxZQUNsQztBQUFBLFVBQ0Y7QUFDQSxjQUFJLE1BQU0sUUFBUSxPQUFPLEtBQUssWUFBWSxPQUFPLE9BQU8sS0FDdEQsUUFBUSxnQkFBZ0IsUUFBUTtBQUNoQyxtQkFBTyxPQUFPLFdBQVcsU0FBUyxFQUFFLE9BQU8sSUFBSSxPQUFPLE9BQU8sQ0FBQyxFQUFFLE9BQU8sS0FBSztBQUFBLFVBQzlFLE9BQU87QUFDTCxtQkFBTyxPQUFPLE9BQU87QUFBQSxVQUN2QjtBQUFBLFFBQ0Y7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUVBLFVBQUkseUJBQXlCLFNBQVUsWUFBWUQsUUFBTztBQUN4RCxlQUFPLFNBQVVFLE1BQUssU0FBUztBQUM3QixpQkFBTyxJQUFJLFdBQVdBLE1BQUtGLFFBQU8sSUFBSSxFQUFFLE9BQU8sT0FBTyxFQUFFLFVBQVUsRUFBRTtBQUFBLFFBQ3RFO0FBQUEsTUFDRjtBQUVBLFVBQUksbUJBQW1CLFNBQVVBLFFBQU87QUFDdEMsWUFBSUMsVUFBUyx1QkFBdUIsT0FBT0QsTUFBSztBQUNoRCxRQUFBQyxRQUFPLFNBQVMsU0FBVUMsTUFBSztBQUM3QixpQkFBTyxJQUFJLFdBQVdBLE1BQUtGLE1BQUs7QUFBQSxRQUNsQztBQUNBLFFBQUFDLFFBQU8sU0FBUyxTQUFVQyxNQUFLLFNBQVM7QUFDdEMsaUJBQU9ELFFBQU8sT0FBT0MsSUFBRyxFQUFFLE9BQU8sT0FBTztBQUFBLFFBQzFDO0FBQ0EsaUJBQVMsSUFBSSxHQUFHLElBQUksYUFBYSxRQUFRLEVBQUUsR0FBRztBQUM1QyxjQUFJLE9BQU8sYUFBYSxDQUFDO0FBQ3pCLFVBQUFELFFBQU8sSUFBSSxJQUFJLHVCQUF1QixNQUFNRCxNQUFLO0FBQUEsUUFDbkQ7QUFDQSxlQUFPQztBQUFBLE1BQ1Q7QUFFQSxlQUFTLE9BQU9ELFFBQU8sY0FBYztBQUNuQyxZQUFJLGNBQWM7QUFDaEIsaUJBQU8sQ0FBQyxJQUFJLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUN2RCxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsSUFDNUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksT0FBTyxFQUFFLElBQUksT0FBTyxFQUFFLElBQzlDLE9BQU8sRUFBRSxJQUFJLE9BQU8sRUFBRSxJQUFJLE9BQU8sRUFBRSxJQUFJLE9BQU8sRUFBRSxJQUFJO0FBQ3RELGVBQUssU0FBUztBQUFBLFFBQ2hCLE9BQU87QUFDTCxlQUFLLFNBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxRQUNsRTtBQUVBLFlBQUlBLFFBQU87QUFDVCxlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFBQSxRQUNaLE9BQU87QUFDTCxlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUs7QUFBQSxRQUNaO0FBRUEsYUFBSyxRQUFRLEtBQUssUUFBUSxLQUFLLFFBQVEsS0FBSyxTQUFTO0FBQ3JELGFBQUssWUFBWSxLQUFLLFNBQVM7QUFDL0IsYUFBSyxRQUFRO0FBQ2IsYUFBSyxRQUFRQTtBQUFBLE1BQ2Y7QUFFQSxhQUFPLFVBQVUsU0FBUyxTQUFVLFNBQVM7QUFDM0MsWUFBSSxLQUFLLFdBQVc7QUFDbEI7QUFBQSxRQUNGO0FBQ0EsWUFBSSxXQUFXLE9BQU8sT0FBTztBQUM3QixZQUFJLFNBQVMsVUFBVTtBQUNyQixjQUFJLFNBQVMsVUFBVTtBQUNyQixnQkFBSSxZQUFZLE1BQU07QUFDcEIsb0JBQU0sSUFBSSxNQUFNLEtBQUs7QUFBQSxZQUN2QixXQUFXLGdCQUFnQixRQUFRLGdCQUFnQixhQUFhO0FBQzlELHdCQUFVLElBQUksV0FBVyxPQUFPO0FBQUEsWUFDbEMsV0FBVyxDQUFDLE1BQU0sUUFBUSxPQUFPLEdBQUc7QUFDbEMsa0JBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLE9BQU8sT0FBTyxHQUFHO0FBQ2pELHNCQUFNLElBQUksTUFBTSxLQUFLO0FBQUEsY0FDdkI7QUFBQSxZQUNGO0FBQUEsVUFDRixPQUFPO0FBQ0wsa0JBQU0sSUFBSSxNQUFNLEtBQUs7QUFBQSxVQUN2QjtBQUNBLHNCQUFZO0FBQUEsUUFDZDtBQUNBLFlBQUksTUFBTUcsU0FBUSxHQUFHLEdBQUcsU0FBUyxRQUFRLFFBQVFDLFVBQVMsS0FBSztBQUUvRCxlQUFPRCxTQUFRLFFBQVE7QUFDckIsY0FBSSxLQUFLLFFBQVE7QUFDZixpQkFBSyxTQUFTO0FBQ2QsWUFBQUMsUUFBTyxDQUFDLElBQUksS0FBSztBQUNqQixZQUFBQSxRQUFPLEVBQUUsSUFBSUEsUUFBTyxDQUFDLElBQUlBLFFBQU8sQ0FBQyxJQUFJQSxRQUFPLENBQUMsSUFDM0NBLFFBQU8sQ0FBQyxJQUFJQSxRQUFPLENBQUMsSUFBSUEsUUFBTyxDQUFDLElBQUlBLFFBQU8sQ0FBQyxJQUM1Q0EsUUFBTyxDQUFDLElBQUlBLFFBQU8sQ0FBQyxJQUFJQSxRQUFPLEVBQUUsSUFBSUEsUUFBTyxFQUFFLElBQzlDQSxRQUFPLEVBQUUsSUFBSUEsUUFBTyxFQUFFLElBQUlBLFFBQU8sRUFBRSxJQUFJQSxRQUFPLEVBQUUsSUFBSTtBQUFBLFVBQ3hEO0FBRUEsY0FBSSxXQUFXO0FBQ2IsaUJBQUssSUFBSSxLQUFLLE9BQU9ELFNBQVEsVUFBVSxJQUFJLElBQUksRUFBRUEsUUFBTztBQUN0RCxjQUFBQyxRQUFPLEtBQUssQ0FBQyxLQUFLLFFBQVFELE1BQUssS0FBSyxNQUFNLE1BQU0sQ0FBQztBQUFBLFlBQ25EO0FBQUEsVUFDRixPQUFPO0FBQ0wsaUJBQUssSUFBSSxLQUFLLE9BQU9BLFNBQVEsVUFBVSxJQUFJLElBQUksRUFBRUEsUUFBTztBQUN0RCxxQkFBTyxRQUFRLFdBQVdBLE1BQUs7QUFDL0Isa0JBQUksT0FBTyxLQUFNO0FBQ2YsZ0JBQUFDLFFBQU8sS0FBSyxDQUFDLEtBQUssUUFBUSxNQUFNLE1BQU0sQ0FBQztBQUFBLGNBQ3pDLFdBQVcsT0FBTyxNQUFPO0FBQ3ZCLGdCQUFBQSxRQUFPLEtBQUssQ0FBQyxNQUFNLE1BQVEsUUFBUSxNQUFPLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELGdCQUFBQSxRQUFPLEtBQUssQ0FBQyxNQUFNLE1BQVEsT0FBTyxPQUFVLE1BQU0sTUFBTSxDQUFDO0FBQUEsY0FDM0QsV0FBVyxPQUFPLFNBQVUsUUFBUSxPQUFRO0FBQzFDLGdCQUFBQSxRQUFPLEtBQUssQ0FBQyxNQUFNLE1BQVEsUUFBUSxPQUFRLE1BQU0sTUFBTSxDQUFDO0FBQ3hELGdCQUFBQSxRQUFPLEtBQUssQ0FBQyxNQUFNLE1BQVMsUUFBUSxJQUFLLE9BQVUsTUFBTSxNQUFNLENBQUM7QUFDaEUsZ0JBQUFBLFFBQU8sS0FBSyxDQUFDLE1BQU0sTUFBUSxPQUFPLE9BQVUsTUFBTSxNQUFNLENBQUM7QUFBQSxjQUMzRCxPQUFPO0FBQ0wsdUJBQU8sVUFBYSxPQUFPLFNBQVUsS0FBTyxRQUFRLFdBQVcsRUFBRUQsTUFBSyxJQUFJO0FBQzFFLGdCQUFBQyxRQUFPLEtBQUssQ0FBQyxNQUFNLE1BQVEsUUFBUSxPQUFRLE1BQU0sTUFBTSxDQUFDO0FBQ3hELGdCQUFBQSxRQUFPLEtBQUssQ0FBQyxNQUFNLE1BQVMsUUFBUSxLQUFNLE9BQVUsTUFBTSxNQUFNLENBQUM7QUFDakUsZ0JBQUFBLFFBQU8sS0FBSyxDQUFDLE1BQU0sTUFBUyxRQUFRLElBQUssT0FBVSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxnQkFBQUEsUUFBTyxLQUFLLENBQUMsTUFBTSxNQUFRLE9BQU8sT0FBVSxNQUFNLE1BQU0sQ0FBQztBQUFBLGNBQzNEO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFFQSxlQUFLLGdCQUFnQjtBQUNyQixlQUFLLFNBQVMsSUFBSSxLQUFLO0FBQ3ZCLGNBQUksS0FBSyxJQUFJO0FBQ1gsaUJBQUssUUFBUUEsUUFBTyxFQUFFO0FBQ3RCLGlCQUFLLFFBQVEsSUFBSTtBQUNqQixpQkFBSyxLQUFLO0FBQ1YsaUJBQUssU0FBUztBQUFBLFVBQ2hCLE9BQU87QUFDTCxpQkFBSyxRQUFRO0FBQUEsVUFDZjtBQUFBLFFBQ0Y7QUFDQSxZQUFJLEtBQUssUUFBUSxZQUFZO0FBQzNCLGVBQUssVUFBVSxLQUFLLFFBQVEsY0FBYztBQUMxQyxlQUFLLFFBQVEsS0FBSyxRQUFRO0FBQUEsUUFDNUI7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUVBLGFBQU8sVUFBVSxXQUFXLFdBQVk7QUFDdEMsWUFBSSxLQUFLLFdBQVc7QUFDbEI7QUFBQSxRQUNGO0FBQ0EsYUFBSyxZQUFZO0FBQ2pCLFlBQUlBLFVBQVMsS0FBSyxRQUFRLElBQUksS0FBSztBQUNuQyxRQUFBQSxRQUFPLEVBQUUsSUFBSSxLQUFLO0FBQ2xCLFFBQUFBLFFBQU8sS0FBSyxDQUFDLEtBQUssTUFBTSxJQUFJLENBQUM7QUFDN0IsYUFBSyxRQUFRQSxRQUFPLEVBQUU7QUFDdEIsWUFBSSxLQUFLLElBQUk7QUFDWCxjQUFJLENBQUMsS0FBSyxRQUFRO0FBQ2hCLGlCQUFLLEtBQUs7QUFBQSxVQUNaO0FBQ0EsVUFBQUEsUUFBTyxDQUFDLElBQUksS0FBSztBQUNqQixVQUFBQSxRQUFPLEVBQUUsSUFBSUEsUUFBTyxDQUFDLElBQUlBLFFBQU8sQ0FBQyxJQUFJQSxRQUFPLENBQUMsSUFDM0NBLFFBQU8sQ0FBQyxJQUFJQSxRQUFPLENBQUMsSUFBSUEsUUFBTyxDQUFDLElBQUlBLFFBQU8sQ0FBQyxJQUM1Q0EsUUFBTyxDQUFDLElBQUlBLFFBQU8sQ0FBQyxJQUFJQSxRQUFPLEVBQUUsSUFBSUEsUUFBTyxFQUFFLElBQzlDQSxRQUFPLEVBQUUsSUFBSUEsUUFBTyxFQUFFLElBQUlBLFFBQU8sRUFBRSxJQUFJQSxRQUFPLEVBQUUsSUFBSTtBQUFBLFFBQ3hEO0FBQ0EsUUFBQUEsUUFBTyxFQUFFLElBQUksS0FBSyxVQUFVLElBQUksS0FBSyxVQUFVO0FBQy9DLFFBQUFBLFFBQU8sRUFBRSxJQUFJLEtBQUssU0FBUztBQUMzQixhQUFLLEtBQUs7QUFBQSxNQUNaO0FBRUEsYUFBTyxVQUFVLE9BQU8sV0FBWTtBQUNsQyxZQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxJQUN6RixJQUFJLEtBQUssSUFBSUEsVUFBUyxLQUFLLFFBQVEsR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtBQUU3RSxhQUFLLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxHQUFHO0FBRXhCLGVBQUtBLFFBQU8sSUFBSSxFQUFFO0FBQ2xCLGdCQUFPLE9BQU8sSUFBTSxNQUFNLE9BQVMsT0FBTyxLQUFPLE1BQU0sTUFBUSxPQUFPO0FBQ3RFLGVBQUtBLFFBQU8sSUFBSSxDQUFDO0FBQ2pCLGdCQUFPLE9BQU8sS0FBTyxNQUFNLE9BQVMsT0FBTyxLQUFPLE1BQU0sTUFBUSxPQUFPO0FBQ3ZFLFVBQUFBLFFBQU8sQ0FBQyxJQUFJQSxRQUFPLElBQUksRUFBRSxJQUFJLEtBQUtBLFFBQU8sSUFBSSxDQUFDLElBQUksTUFBTTtBQUFBLFFBQzFEO0FBRUEsYUFBSyxJQUFJO0FBQ1QsYUFBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEtBQUssR0FBRztBQUMxQixjQUFJLEtBQUssT0FBTztBQUNkLGdCQUFJLEtBQUssT0FBTztBQUNkLG1CQUFLO0FBQ0wsbUJBQUtBLFFBQU8sQ0FBQyxJQUFJO0FBQ2pCLGtCQUFJLEtBQUssYUFBYTtBQUN0QixrQkFBSSxLQUFLLFlBQVk7QUFBQSxZQUN2QixPQUFPO0FBQ0wsbUJBQUs7QUFDTCxtQkFBS0EsUUFBTyxDQUFDLElBQUk7QUFDakIsa0JBQUksS0FBSyxjQUFjO0FBQ3ZCLGtCQUFJLEtBQUssYUFBYTtBQUFBLFlBQ3hCO0FBQ0EsaUJBQUssUUFBUTtBQUFBLFVBQ2YsT0FBTztBQUNMLGtCQUFPLE1BQU0sSUFBTSxLQUFLLE9BQVMsTUFBTSxLQUFPLEtBQUssT0FBUyxNQUFNLEtBQU8sS0FBSztBQUM5RSxrQkFBTyxNQUFNLElBQU0sS0FBSyxPQUFTLE1BQU0sS0FBTyxLQUFLLE9BQVMsTUFBTSxLQUFPLEtBQUs7QUFDOUUsaUJBQUssSUFBSTtBQUNULGtCQUFNLEtBQU0sSUFBSSxJQUFLO0FBQ3JCLGlCQUFNLElBQUksSUFBTSxDQUFDLElBQUk7QUFDckIsaUJBQUssSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDLElBQUlBLFFBQU8sQ0FBQztBQUNsQyxpQkFBSyxLQUFLO0FBQ1YsZ0JBQUksSUFBSSxNQUFNO0FBQ2QsZ0JBQUksS0FBSyxNQUFNO0FBQUEsVUFDakI7QUFDQSxnQkFBTyxNQUFNLElBQU0sS0FBSyxPQUFTLE1BQU0sS0FBTyxLQUFLLE9BQVMsTUFBTSxLQUFPLEtBQUs7QUFDOUUsZ0JBQU8sTUFBTSxJQUFNLEtBQUssT0FBUyxNQUFNLEtBQU8sS0FBSyxPQUFTLE1BQU0sS0FBTyxLQUFLO0FBQzlFLGVBQUssSUFBSTtBQUNULGdCQUFNLEtBQU0sSUFBSSxJQUFLO0FBQ3JCLGVBQU0sSUFBSSxJQUFNLENBQUMsSUFBSTtBQUNyQixlQUFLLElBQUksS0FBSyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUlBLFFBQU8sSUFBSSxDQUFDO0FBQzFDLGVBQUssS0FBSztBQUNWLGNBQUksSUFBSSxNQUFNO0FBQ2QsY0FBSSxLQUFLLE1BQU07QUFDZixnQkFBTyxNQUFNLElBQU0sS0FBSyxPQUFTLE1BQU0sS0FBTyxLQUFLLE9BQVMsTUFBTSxLQUFPLEtBQUs7QUFDOUUsZ0JBQU8sTUFBTSxJQUFNLEtBQUssT0FBUyxNQUFNLEtBQU8sS0FBSyxPQUFTLE1BQU0sS0FBTyxLQUFLO0FBQzlFLGVBQUssSUFBSTtBQUNULGdCQUFNLEtBQU0sSUFBSSxJQUFLO0FBQ3JCLGVBQU0sSUFBSSxJQUFNLENBQUMsSUFBSTtBQUNyQixlQUFLLElBQUksS0FBSyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUlBLFFBQU8sSUFBSSxDQUFDO0FBQzFDLGVBQUssS0FBSztBQUNWLGNBQUksSUFBSSxNQUFNO0FBQ2QsY0FBSSxLQUFLLE1BQU07QUFDZixnQkFBTyxNQUFNLElBQU0sS0FBSyxPQUFTLE1BQU0sS0FBTyxLQUFLLE9BQVMsTUFBTSxLQUFPLEtBQUs7QUFDOUUsZ0JBQU8sTUFBTSxJQUFNLEtBQUssT0FBUyxNQUFNLEtBQU8sS0FBSyxPQUFTLE1BQU0sS0FBTyxLQUFLO0FBQzlFLGVBQUssSUFBSTtBQUNULGdCQUFNLEtBQU0sSUFBSSxJQUFLO0FBQ3JCLGVBQU0sSUFBSSxJQUFNLENBQUMsSUFBSTtBQUNyQixlQUFLLElBQUksS0FBSyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUlBLFFBQU8sSUFBSSxDQUFDO0FBQzFDLGVBQUssS0FBSztBQUNWLGNBQUksSUFBSSxNQUFNO0FBQ2QsY0FBSSxLQUFLLE1BQU07QUFBQSxRQUNqQjtBQUVBLGFBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUN6QixhQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDekIsYUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ3pCLGFBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUN6QixhQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDekIsYUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ3pCLGFBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUN6QixhQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFBQSxNQUMzQjtBQUVBLGFBQU8sVUFBVSxNQUFNLFdBQVk7QUFDakMsYUFBSyxTQUFTO0FBRWQsWUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssSUFDbEYsS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLO0FBRTFCLFlBQUksTUFBTSxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQUksVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUNsRSxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQUksVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUMxRCxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQUksVUFBVyxNQUFNLElBQUssRUFBSSxJQUN6RCxVQUFXLE1BQU0sSUFBSyxFQUFJLElBQUksVUFBVSxLQUFLLEVBQUksSUFDakQsVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUFJLFVBQVcsTUFBTSxLQUFNLEVBQUksSUFDMUQsVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUFJLFVBQVcsTUFBTSxLQUFNLEVBQUksSUFDMUQsVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUFJLFVBQVcsTUFBTSxJQUFLLEVBQUksSUFDekQsVUFBVyxNQUFNLElBQUssRUFBSSxJQUFJLFVBQVUsS0FBSyxFQUFJLElBQ2pELFVBQVcsTUFBTSxLQUFNLEVBQUksSUFBSSxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQzFELFVBQVcsTUFBTSxLQUFNLEVBQUksSUFBSSxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQzFELFVBQVcsTUFBTSxLQUFNLEVBQUksSUFBSSxVQUFXLE1BQU0sSUFBSyxFQUFJLElBQ3pELFVBQVcsTUFBTSxJQUFLLEVBQUksSUFBSSxVQUFVLEtBQUssRUFBSSxJQUNqRCxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQUksVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUMxRCxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQUksVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUMxRCxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQUksVUFBVyxNQUFNLElBQUssRUFBSSxJQUN6RCxVQUFXLE1BQU0sSUFBSyxFQUFJLElBQUksVUFBVSxLQUFLLEVBQUksSUFDakQsVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUFJLFVBQVcsTUFBTSxLQUFNLEVBQUksSUFDMUQsVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUFJLFVBQVcsTUFBTSxLQUFNLEVBQUksSUFDMUQsVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUFJLFVBQVcsTUFBTSxJQUFLLEVBQUksSUFDekQsVUFBVyxNQUFNLElBQUssRUFBSSxJQUFJLFVBQVUsS0FBSyxFQUFJLElBQ2pELFVBQVcsTUFBTSxLQUFNLEVBQUksSUFBSSxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQzFELFVBQVcsTUFBTSxLQUFNLEVBQUksSUFBSSxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQzFELFVBQVcsTUFBTSxLQUFNLEVBQUksSUFBSSxVQUFXLE1BQU0sSUFBSyxFQUFJLElBQ3pELFVBQVcsTUFBTSxJQUFLLEVBQUksSUFBSSxVQUFVLEtBQUssRUFBSSxJQUNqRCxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQUksVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUMxRCxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQUksVUFBVyxNQUFNLEtBQU0sRUFBSSxJQUMxRCxVQUFXLE1BQU0sS0FBTSxFQUFJLElBQUksVUFBVyxNQUFNLElBQUssRUFBSSxJQUN6RCxVQUFXLE1BQU0sSUFB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QUEsRUFFQSxhQUFhLFNBQWMsVUFBa0IsS0FBSyxLQUFZO0FBbndEbEUsUUFBQUE7QUFvd0RRLFFBQUksbUJBQW1CLE9BQU8sbUJBQW1CO0FBQzdDLFVBQUkseUJBQU8sU0FBUztBQUNwQjtBQUFBLElBQ0o7QUFFQSxjQUFVLFFBQVEsU0FBUztBQUMzQixRQUFJLHlCQUFPLFNBQVMsT0FBTztBQUMzQixZQUFRLElBQUksdUJBQXVCLE9BQU8sRUFBRTtBQUM1QyxLQUFBQSxNQUFBLEtBQUssY0FBTCxnQkFBQUEsSUFBZ0IsZUFBZSxRQUFRLFlBQVksR0FBRztBQUFBLEVBQzFEO0FBQUEsRUFFQSxJQUFJLFNBQWlCO0FBQ2pCLFlBQVEsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLE9BQU8sT0FBTztBQUFBLEVBQ2pEO0FBQ0o7IiwKICAibmFtZXMiOiBbImV4cG9ydHMiLCAibGVuIiwgImkiLCAibnVtIiwgImxlbjIiLCAiZXhwb3J0cyIsICJidWZmZXIiLCAiZXhwb3J0cyIsICJCdWZmZXIiLCAiZnJvbVN0cmluZyIsICJjb3B5IiwgImJ1ZmZlciIsICJlcXVhbHMiLCAiaSIsICJieXRlTGVuZ3RoIiwgImZpcnN0IiwgImxhc3QiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiQXN5bmNMb2NrIiwgImtleSIsICJkZWZlcnJlZCIsICJyZXNvbHZlIiwgInNlbGYiLCAiZm4iLCAiY2IiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiYnVmZmVyIiwgIkJ1ZmZlciIsICJrZXkiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiQnVmZmVyIiwgIkhhc2giLCAiaGFzaCIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJIYXNoIiwgIkJ1ZmZlciIsICJLIiwgIm51bSIsICJXIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgIkNSQzMyIiwgImV4cG9ydHMiLCAia2V5IiwgImV4cG9ydHMiLCAibGFzdCIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJyZXF1aXJlX2NyYzMyIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImNyYzMyIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiY3JjMzIiLCAibGFzdCIsICJmbHVzaCIsICJtZXRob2QiLCAiZGVmbGF0ZSIsICJzdGF0dXMiLCAiZXhwb3J0cyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJyZXF1aXJlX2RlZmxhdGUiLCAiZXhwb3J0cyIsICJzdGF0dXMiLCAiZGVmbGF0ZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJsYXN0IiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInJvb3QiLCAiZXhwb3J0cyIsICJjcmMzMiIsICJFWFRSQSIsICJjb3B5IiwgImluZmxhdGUiLCAiZmx1c2giLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAicmVxdWlyZV9pbmZsYXRlIiwgImV4cG9ydHMiLCAic3RhdHVzIiwgImluZmxhdGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiYXNzaWduIiwgImRlZmxhdGUiLCAiaW5mbGF0ZSIsICJwYWtvIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInJlc29sdmUiLCAia2V5IiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImRlZmluZSIsICJrZXkiLCAiaW5kZXgiLCAicmVnZXgiLCAicGF0aCIsICJyZXF1aXJlX2xpYiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJwYXRoIiwgImluaXQiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZmlsZTIiLCAiZGlmZiIsICJyb290IiwgInNpZGUiLCAiZGlmZjNNZXJnZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJwYXJzZSIsICJyZXF1aXJlX2NvbW1vbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJrZXkiLCAiaGFzaCIsICJkZWJ1ZyIsICJzZWxmIiwgImluZGV4IiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImluZGV4IiwgImxvZyIsICJwYXRoIiwgImV4aXN0cyIsICJleHBvcnRzIiwgIl9fZXhwb3J0IiwgImRlZmVycmVkIiwgInN0YXR1cyIsICJwcm9taXNlIiwgImV4cG9ydHMiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAicmVxdWlyZV9saWIiLCAiZXhwb3J0cyIsICJmcm9tU3RyaW5nIiwgImluc3RhbmNlIiwgIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsICJfYXJyYXlMaWtlVG9BcnJheSIsICJjb250YWlucyIsICJDb2xvciIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJpc09iamVjdCIsICJpc0Z1bmN0aW9uIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInJlcXVpcmVfaW1wbGVtZW50YXRpb24iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiY29uY2F0dHkiLCAic2xpY3kiLCAiRW1wdHkiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAidW5kZWZpbmVkIiwgImRvRXZhbCIsICJzdHJpbmdUb1BhdGgiLCAiZmlyc3QiLCAibGFzdCIsICJnZXRCYXNlSW50cmluc2ljIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImhhc1Byb3BlcnR5RGVzY3JpcHRvcnMiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiaXNGdW5jdGlvbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJkZWZpbmUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiYXBwbHlCaW5kIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInJlcXVpcmVfaW1wbGVtZW50YXRpb24iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiYXNzaWduIiwgImtleSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJkZWZpbmUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiYXNzaWduIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImZ1bmN0aW9uc0hhdmVOYW1lcyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJkZWZpbmUiLCAicmVxdWlyZV9pbXBsZW1lbnRhdGlvbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJyZXF1aXJlX3BvbHlmaWxsIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInJlcXVpcmVfc2hpbSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJyZWdleCIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJkZWZpbmUiLCAicmVxdWlyZV9zaGFtcyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJvYmplY3RUb1N0cmluZyIsICJudW0iLCAiaW5kZW50IiwgImtleSIsICJ0YWciLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAia2V5IiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInRyeVN0cmluZ09iamVjdCIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJnZXRJdGVyYXRvciIsICJhZHZhbmNlU3RyaW5nSW5kZXgiLCAiaW5kZXgiLCAiZmlyc3QiLCAiZ2V0QXJyYXlJdGVyYXRvciIsICJnZXROb25Db2xsZWN0aW9uSXRlcmF0b3IiLCAiZ2V0Q29sbGVjdGlvbkl0ZXJhdG9yIiwgInJlcXVpcmVfaW1wbGVtZW50YXRpb24iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAicmVxdWlyZV9wb2x5ZmlsbCIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJyZXF1aXJlX3NoaW0iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZGVmaW5lIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImRlZmluZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJ0cnlOdW1iZXJPYmplY3QiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZm9yRWFjaEFycmF5IiwgImZvckVhY2hTdHJpbmciLCAiZm9yRWFjaE9iamVjdCIsICJmb3JFYWNoIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImZvckVhY2giLCAidGFnIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImFzc2lnbiIsICJnZXRJdGVyYXRvciIsICJrZXkiLCAiZGVlcEVxdWFsIiwgImlzMjI0IiwgIm1ldGhvZCIsICJrZXkiLCAiaW5kZXgiLCAiYmxvY2tzIiwgImJ1ZmZlciIsICJleHBvcnRzIiwgIkhvZ2FuIiwgInRleHQiLCAidGFnIiwgImluZGV4IiwgImRlbGltaXRlcnMiLCAia2V5IiwgImV4cG9ydHMiLCAiSG9nYW4iLCAidGV4dCIsICJpbmRlbnQiLCAia2V5IiwgImluc3RhbmNlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgIkhvZ2FuIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInJvb3QiLCAibnVtIiwgInBhdGgiLCAiaXNPYmplY3QiLCAiaW5kZXgiLCAia2V5IiwgInRhZyIsICJnbG9iYWwiLCAiZG9jdW1lbnQiLCAiV2Vha01hcCIsICJub3JtYWxpemUiLCAiaHRtbCIsICJSZWZsZWN0IiwgInNpbXBsZSIsICJmaXJzdCIsICJTeW1ib2wiLCAiSWNvbiIsICJuYW1lIiwgImNvbnRlbnRzIiwgInRhZ3MiLCAiYXR0cnMiLCAiREVGQVVMVF9BVFRSUyIsICJjbGFzcyIsICJjb21iaW5lZEF0dHJzIiwgImF0dHJzVG9TdHJpbmciLCAiT2JqZWN0IiwgImtleXMiLCAibWFwIiwgImpvaW4iLCAiaWNvbnMiLCAicmVkdWNlIiwgIm9iamVjdCIsICJpY29uIiwgInRvU3ZnIiwgInJlcGxhY2UiLCAiRXJyb3IiLCAiZWxlbWVudHNUb1JlcGxhY2UiLCAicXVlcnlTZWxlY3RvckFsbCIsICJBcnJheSIsICJmcm9tIiwgImZvckVhY2giLCAiZWxlbWVudCIsICJyZXBsYWNlRWxlbWVudCIsICJlbGVtZW50QXR0cnMiLCAiZ2V0QXR0cnMiLCAic3ZnU3RyaW5nIiwgInN2Z0RvY3VtZW50IiwgIkRPTVBhcnNlciIsICJwYXJzZUZyb21TdHJpbmciLCAic3ZnRWxlbWVudCIsICJxdWVyeVNlbGVjdG9yIiwgInBhcmVudE5vZGUiLCAicmVwbGFjZUNoaWxkIiwgImF0dHJpYnV0ZXMiLCAiYXR0ciIsICJ2YWx1ZSIsICJjb25zb2xlIiwgIndhcm4iLCAiYnVmZmVyIiwgIkhhc2giLCAiaGFzaCIsICJpbmRleCIsICJ2ZXJzaW9uIiwgImtleSIsICJBc3luY0xvY2siLCAicGF0aCIsICJsYXN0IiwgImZpbGUiLCAiaW5vZGUiLCAidGV4dCIsICJfYSIsICJhcHBlbmQiLCAibW9kaWZpZWQiLCAidGFncyIsICJ0YWciLCAicmVmcyIsICJyZWYiLCAic3BhY2UiLCAicGFrbyIsICJudW0iLCAiY3JjMzIiLCAidHlwZXMiLCAib2lkIiwgImNvbW1pdCIsICJlbnRyeSIsICJjaGlsZHJlbiIsICJ3YWxrIiwgInJvb3QiLCAicGlmeSIsICJpZ25vcmUiLCAicHJvbWlzZXMiLCAiY2xlYW5HaXRSZWYiLCAiY2hlY2tvdXQiLCAiY29uZmxpY3RzIiwgIm1ldGhvZCIsICJuYW1lIiwgInNlcCIsICJyZXNvbHZlIiwgInN0YXR1cyIsICJyZWxhdGl2ZSIsICJHaXRSZW1vdGVIVFRQIiwgInJlbW90ZVJlZiIsICJkaXIiLCAiZGlmZjNNZXJnZSIsICJiYXNlT2lkIiwgIm91ck9pZCIsICJ0aGVpck9pZCIsICJmYXN0Rm9yd2FyZCIsICJhdHRyIiwgIndyaXRlT2JqZWN0IiwgImxpbmUiLCAicmVzdWx0IiwgImRpcm5hbWUiLCAidHJlZSIsICJpc0lnbm9yZWQiLCAiYWRkIiwgInJlbW92ZSIsICJmaWxlU3RhdHMiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfY2hpbGRfcHJvY2VzcyIsICJpbXBvcnRfZGVidWciLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9wcm9taXNlX2RlZmVycmVkIiwgIl9fZXNtIiwgImluZGV4IiwgInNlcGFyYXRvciIsICJwYXRoIiwgInJlbW92ZSIsICJudW0iLCAiY29tbWFuZHMiLCAiY29tbWFuZHMyIiwgImtleSIsICJ0ZXh0IiwgInBhcnNlIiwgIl9fZXhwb3J0IiwgImJ1ZmZlciIsICJmaWxlIiwgImFwcGVuZDIiLCAiZGVidWciLCAiZGVidWcyIiwgImxvZyIsICJyb290IiwgImluc3RhbmNlIiwgImJyYW5jaCIsICJjb21taXQiLCAic3RhdHVzIiwgImRlbGV0ZVJlZiIsICJtZXJnZSIsICJ0YWciLCAicHJvbWlzZSIsICJoYXNoIiwgImRpZmYiLCAiX19jb21tb25KUyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJfX3RvQ29tbW9uSlMiLCAibWV0aG9kIiwgIndhaXQiLCAiaW1wb3J0X29ic2lkaWFuIiwgIlBsdWdpblN0YXRlIiwgIkZpbGVUeXBlIiwgImltcG9ydF9vYnNpZGlhbiIsICJ3b3J0aFdhbGtpbmciLCAicm9vdCIsICJfYSIsICJkZWVwRXF1YWwiLCAiYnJhbmNoIiwgInBhdGgiLCAicGF0aCIsICJjaGlsZHJlbiIsICJmaXJzdCIsICJfYSIsICJzdGF0dXMiLCAiZmlsZXMiLCAibW9tZW50IiwgInN0YXR1czIiLCAiZXhpc3RzIiwgInBhdGgiLCAia2V5IiwgImRlYnVnIiwgInN0YXR1cyIsICJyZXNvbHZlIiwgInJvb3QiLCAiY3VycmVudEJyYW5jaCIsICJmaWxlIiwgIl9hIiwgImUiLCAiYnJhbmNoIiwgImhhc2giLCAiY29tbWl0IiwgImltcG9ydF9zdGF0ZSIsICJpbXBvcnRfc3RhdGUiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJzZWxmIiwgInBhdGgiLCAibGFzdCIsICJqb2luIiwgImRpZmYiLCAidmFsdWUiLCAib2JqIiwgImtleSIsICJkaWZmIiwgIl9sb29wIiwgImkiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJyZXNvbHZlIiwgImltcG9ydF9vYnNpZGlhbiIsICJwYXRoIiwgIl9hIiwgImZpbGUiLCAidGV4dCIsICJfYSIsICJtZXRob2QiLCAiY29sbGVjdCIsICJzdGF0dXMiLCAiZmlsZSIsICJjdXJyZW50QnJhbmNoIiwgImJyYW5jaCIsICJwYXRoIiwgImxvZyIsICJ3b3J0aFdhbGtpbmciLCAiaXNJZ25vcmVkIiwgImhhc2giLCAiY29tbWl0IiwgImRpZmYiLCAiZnJvbVZhbHVlIiwgImdldEl0ZXJhdG9yIiwgImZvckF3YWl0IiwgImJ1ZmZlciIsICJ0ZXh0IiwgIl9hIiwgImtleSIsICJwYXRoIiwgImtleSIsICJfYSIsICJfYSIsICJndXR0ZXIiLCAidGV4dCIsICJfYSIsICJpbXBvcnRfc3RhdGUiLCAiaW1wb3J0X3ZpZXciLCAiaW1wb3J0X2pzX3NoYTI1NiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiY29tbWl0IiwgImtleSIsICJfYSIsICJfYiIsICJfYSIsICJ0ZXh0IiwgImtleSIsICJfYSIsICJjb21taXQiLCAiZGlmZiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiX2EiLCAia2V5IiwgInVwZGF0ZSIsICJfYSIsICJhZGQiLCAiZ3V0dGVyIiwgImtleSIsICJmaWxlIiwgImtleSIsICJmaWxlIiwgIl9hIiwgImltcG9ydF9vYnNpZGlhbiIsICJfYSIsICJtb21lbnQiLCAiaW1wb3J0X29ic2lkaWFuIiwgImluZGV4IiwgImltcG9ydF9vYnNpZGlhbiIsICJyZXNvbHZlIiwgImltcG9ydF9vYnNpZGlhbiIsICJmaWxlIiwgImJyYW5jaCIsICJwYXRoIiwgImtleSIsICJfYSIsICJMaW5lVHlwZSIsICJDb2xvclNjaGVtZVR5cGUiLCAicGF0aCIsICJ0ZXh0IiwgImhhc2giLCAiaW5kZXgiLCAiZGlmZkxpbmVzIiwgIkRpZmYiLCAiZGlmZiIsICJzZWxmIiwgImJ1aWxkVmFsdWVzIiwgImxhc3QiLCAiZXh0cmFjdENvbW1vbiIsICJlcXVhbHMiLCAicmVtb3ZlRW1wdHkiLCAiY2FzdElucHV0IiwgInRva2VuaXplIiwgImpvaW4iLCAidmFsdWUiLCAicGF0aCIsICJjaGFyYWN0ZXJEaWZmIiwgImV4dGVuZGVkV29yZENoYXJzIiwgInJlV2hpdGVzcGFjZSIsICJ3b3JkRGlmZiIsICJEaWZmIiwgIndvcmREaWZmIiwgImxpbmVEaWZmIiwgIkRpZmYiLCAic2VudGVuY2VEaWZmIiwgIkRpZmYiLCAiY3NzRGlmZiIsICJEaWZmIiwgIl90eXBlb2YiLCAib2JqIiwgIm9iamVjdFByb3RvdHlwZVRvU3RyaW5nIiwgImpzb25EaWZmIiwgIkRpZmYiLCAibGluZURpZmYiLCAiY2Fub25pY2FsaXplIiwgImNhbm9uaWNhbGl6ZSIsICJrZXkiLCAib2JqZWN0UHJvdG90eXBlVG9TdHJpbmciLCAiX3R5cGVvZiIsICJhcnJheURpZmYiLCAiRGlmZiIsICJkaXN0YW5jZSIsICJmaWxlIiwgImRpZmYiLCAiZWxlbWVudCIsICJoaWdobGlnaHRlZExpbmUiLCAiZmlsZSIsICJiYXNlVGVtcGxhdGVzUGF0aCIsICJpY29uc0Jhc2VUZW1wbGF0ZXNQYXRoIiwgImZpbGUiLCAibWF0Y2hlciIsICJvbGRMaW5lcyIsICJuZXdMaW5lcyIsICJkaWZmIiwgImdlbmVyaWNUZW1wbGF0ZXNQYXRoIiwgImJhc2VUZW1wbGF0ZXNQYXRoIiwgImljb25zQmFzZVRlbXBsYXRlc1BhdGgiLCAidGFnc0Jhc2VUZW1wbGF0ZXNQYXRoIiwgImZpbGUiLCAibWF0Y2hlciIsICJvbGRMaW5lcyIsICJuZXdMaW5lcyIsICJodG1sIiwgImRpZmYiLCAiSG9nYW4iLCAiSG9nYW4iLCAiYyIsICJwIiwgInQiLCAiaW5kZW50IiwgImltcG9ydF9vYnNpZGlhbiIsICJfYSIsICJkaWZmIiwgImltcG9ydF9vYnNpZGlhbiIsICJlbGVtZW50IiwgImZpbGUiLCAibm93IiwgImVsZW1lbnQiLCAiX2EiLCAiYXBwZW5kIiwgInJvb3QiLCAiZWxlbWVudCIsICJrZXkiLCAiZWxlbWVudCIsICJlbGVtZW50IiwgImhhc2giLCAiZGVsYXkiLCAiZGV0YWNoIiwgImluaXQiLCAiZGVsYXkiLCAidGljayIsICJub3ciLCAiaW5pdCIsICJpbnN0YW5jZSIsICJjcmVhdGVfZnJhZ21lbnQiLCAiYXBwZW5kX3N0eWxlcyIsICJrZXkiLCAiYXR0ciIsICJfYSIsICJpbmRleCIsICJhcHBlbmQiLCAidGV4dCIsICJyZXNvbHZlIiwgImRlbGF5IiwgIl9hIiwgImN0eCIsICJwYXRoIiwgImN0eCIsICJjdHgiLCAiX2EiLCAiY3JlYXRlX2lmX2Jsb2NrIiwgInBhdGgiLCAiY3R4IiwgImNyZWF0ZV9pZl9ibG9jayIsICJIaXN0b3J5VmlldyIsICJpbXBvcnRfb2JzaWRpYW4iLCAicmVzb2x2ZSIsICJpbXBvcnRfb2JzaWRpYW4iLCAiYXBwIiwgInJlc29sdmUiLCAidGV4dCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImFwcCIsICJyZXNvbHZlIiwgImltcG9ydF9vYnNpZGlhbiIsICJfYSIsICJjdHgiLCAiY3R4IiwgIl9hIiwgImN0eCIsICJjdHgiLCAiY3JlYXRlX2lmX2Jsb2NrXzQiLCAicGF0aCIsICJjcmVhdGVfaWZfYmxvY2tfNCIsICJjcmVhdGVfaWZfYmxvY2tfMSIsICJjdHgiLCAidHJpZ2dlclJlZnJlc2giLCAiY3JlYXRlX2lmX2Jsb2NrXzIiLCAicGF0aCIsICJjcmVhdGVfaWZfYmxvY2siLCAiX2EiLCAiSGlzdG9yeVZpZXciLCAicGF0aCIsICJmaWxlIiwgInN0YXR1cyIsICJtb2RhbCIsICJjb25maXJtT3B0aW9uIiwgImJyYW5jaCIsICJub3ciLCAiZGlmZiIsICJ0ZXh0Il0KfQo= diff --git a/content/.obsidian/plugins/obsidian-git/manifest.json b/content/.obsidian/plugins/obsidian-git/manifest.json index 045f4f82..91dde32c 100644 --- a/content/.obsidian/plugins/obsidian-git/manifest.json +++ b/content/.obsidian/plugins/obsidian-git/manifest.json @@ -5,5 +5,5 @@ "isDesktopOnly": false, "fundingUrl": "https://ko-fi.com/vinzent", "js": "main.js", - "version": "2.24.2" + "version": "2.24.3" } diff --git a/content/.obsidian/plugins/obsidian-zotero-desktop-connector/main.js b/content/.obsidian/plugins/obsidian-zotero-desktop-connector/main.js index a58535d5..615c621a 100644 --- a/content/.obsidian/plugins/obsidian-zotero-desktop-connector/main.js +++ b/content/.obsidian/plugins/obsidian-zotero-desktop-connector/main.js @@ -95,7 +95,7 @@ ${n.message}`:m,x=[v,t,e].filter(Boolean).join(` {%- endif -%} `;async function ws(e,t){var r,o,s;if(!t)return t;let a=(t.creators||[]).reduce((l,u)=>(l[u.creatorType]||(l[u.creatorType]=[]),l[u.creatorType].push(u),l),{});await Promise.all(Object.keys(a).map(async l=>{t[`${l}s`]=(await bt(e,uO,{creators:a[l]})).trim()}));let n=(await bt(e,pO,t)).trim();n&&(t.pdfLink=n);let i=(await bt(e,dO,t)).trim();if(i&&(t.pdfZoteroLink=i),(r=t.notes)!=null&&r.length){let l=t.notes.reduce((u,c)=>c.note?`${u} -${c.note.trim()}`:u,"").trim();l&&(t.markdownNotes=l)}return(o=t.tags)!=null&&o.length&&(t.allTags=t.tags.map(l=>l.tag).join(", "),t.hashTags=t.tags.map(l=>`#${l.tag.replace(/\s+/g,"-")}`).join(", ")),(s=t.annotations)!=null&&s.length&&(t.formattedAnnotationsNew=(await bt(e,_x,t)).trim(),t.formattedAnnotations=(await bt(e,_x,{...t,lastExportDate:(0,Tx.moment)(0)})).trim()),t}var Pa=require("obsidian");var kx=require("obsidian"),nt=class extends kx.Modal{constructor(a,n){super(a);this.message=n}onOpen(){this.contentEl.createDiv({text:this.message})}onClose(){this.contentEl.empty()}};var Es=_e(require("path")),Mt={"Content-Type":"application/json","User-Agent":"obsidian/zotero",Accept:"application/json",Connection:"keep-alive"};function Dt(e,t){return e==="Zotero"?"23119":e==="Juris-M"?"24119":t||"23119"}async function Ss(e){let t=Es.default.dirname(e);await app.vault.adapter.exists(t)||await app.vault.createFolder(t)}function Fx(e){return e.replace(/\s*[*?]+\s*/g," ").trim().replace(/\s*[:"<>|]+\s*/g," - ").trim()}function Vn(e){let t=Es.default.parse(e),a=Fx(t.dir),n=Fx(t.name);return Es.default.join(a,`${n}${t.ext}`)}function fO(e){let t="0",a="0",n="0";e.length==4?(t="0x"+e[1]+e[1],a="0x"+e[2]+e[2],n="0x"+e[3]+e[3]):e.length==7&&(t="0x"+e[1]+e[2],a="0x"+e[3]+e[4],n="0x"+e[5]+e[6]);let i=+t/255,r=+a/255,o=+n/255,s=Math.min(i,r,o),l=Math.max(i,r,o),u=l-s,c=0,f=0,p=0;return u==0?c=0:l==i?c=(r-o)/u%6:l==r?c=(o-i)/u+2:c=(i-r)/u+4,c=Math.round(c*60),c<0&&(c+=360),p=(l+s)/2,f=u==0?0:u/(1-Math.abs(2*p-1)),f=+(f*100).toFixed(1),p=+(p*100).toFixed(1),{h:c,s:f,l:p}}function Px(e){let{h:t,s:a,l:n}=fO(e);return n<12?"Black":n>98?"White":a<2?"Gray":t<15?"Red":t<45?"Orange":t<65?"Yellow":t<170?"Green":t<190?"Cyan":t<263?"Blue":t<280?"Purple":t<335?"Magenta":"Red"}function Qt(e,t,a){let n=t.split("/").pop(),i=`zotero://${e}`,r="";if(/group/.test(t)?r=t.replace("http://zotero.org",i):r=`${i}/library/items/${n}`,a){let o=new URLSearchParams(a);r+=`?${o}`}return r}var Pe=require("obsidian");var dp=class e{constructor(t){this.compare=t;this.heapArray=[];this._limit=0}static getChildrenIndexOf(t){return[t*2+1,t*2+2]}static getParentIndexOf(t){if(t<=0)return-1;let a=t%2?1:2;return Math.floor((t-a)/2)}push(t){return this._sortNodeUp(this.heapArray.push(t)-1),!0}length(){return this.heapArray.length}peek(){return this.heapArray[0]}pop(){let t=this.heapArray.pop();return this.length()>0&&t!==void 0?this.replace(t):t}replace(t){let a=this.heapArray[0];return this.heapArray[0]=t,this._sortNodeDown(0),a}size(){return this.length()}_moveNode(t,a){[this.heapArray[t],this.heapArray[a]]=[this.heapArray[a],this.heapArray[t]]}_sortNodeDown(t){let a=t(this.heapArray.length>o&&this.compare(this.heapArray[o],this.heapArray[r])<0&&(r=o),r);for(;a;){let r=e.getChildrenIndexOf(t),o=r.reduce(i,r[0]),s=this.heapArray[o];typeof s!="undefined"&&this.compare(n,s)>0?(this._moveNode(t,o),t=o):a=!1}}_sortNodeUp(t){let a=t>0;for(;a;){let n=e.getParentIndexOf(t);n>=0&&this.compare(this.heapArray[n],this.heapArray[t])>0?(this._moveNode(t,n),t=n):a=!1}}};function mO(e,t){return e.prio-t.prio||e.counter-t.counter}var fp=class{constructor(t,a){this.maxConcurrent=t||1,this.minCycle=a||0,this.queueRunning=new Map,this.queueWaiting=new dp(mO),this.lastRun=0,this.nextTimer=null,this.counter=0}tryRun(){for(;this.queueWaiting.size()>0&&this.queueRunning.sizeactiveWindow.setTimeout(()=>{this.nextTimer=null,this.tryRun(),a()},this.minCycle-Date.now()+this.lastRun)));return}let t=this.queueWaiting.pop();if(t!==void 0){let a,i={wait:new Promise(o=>{a=o}),signal:a},r={hash:t.hash,prio:t.prio,finish:i};if(this.queueRunning.has(t.hash))throw new Error("async-await-queue: duplicate hash "+t.hash);this.queueRunning.set(t.hash,r),this.lastRun=Date.now(),t.start.signal()}}}end(t){let a=this.queueRunning.get(t);if(a===void 0)throw new Error("async-await-queue: queue desync for "+t);this.queueRunning.delete(t),a.finish.signal(),this.tryRun()}async wait(t,a){let n=a!=null?a:0,i,r=new Promise(s=>{i=s}),o={hash:t,prio:n,start:{signal:i,wait:r},counter:this.counter++};this.queueWaiting.push(o),this.tryRun(),await r,this.lastRun=Date.now()}run(t,a){let n=a!=null?a:0,i=Symbol();return this.wait(i,n).then(t).finally(()=>{this.end(i)})}stat(){return{running:this.queueRunning.size,waiting:this.queueWaiting.size(),last:this.lastRun}}async flush(t){for(;this.queueRunning.size>0||this.queueWaiting.size()>0;){let a=this.queueWaiting.peek();if(a&&await a.start.wait,t!==void 0&&this.queueWaiting.size()0&&await this.queueRunning.values().next().value.finish.wait}}},Ee=new fp(1);async function Ox(e,t){let a,n=new nt(app,"Fetching notes from Zotero...");n.open();let i=Symbol();try{await Ee.wait(i),a=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.notes",params:[e.map(r=>r.key)]}),headers:Mt})}catch(r){return console.error(r),n.close(),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),Ee.end(i),null}Ee.end(i),n.close();try{return JSON.parse(a).result}catch(r){return console.error(r),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),null}}async function Rx(e,t){let a,n=new nt(app,"Fetching collections from Zotero...");n.open();let i=Symbol();try{await Ee.wait(i),a=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.collections",params:[[e.key],!0]}),headers:Mt})}catch(r){return console.error(r),n.close(),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),Ee.end(i),null}Ee.end(i),n.close();try{return JSON.parse(a).result[e.key].map(s=>{let l=s,u=[s.name];for(;l.parentCollection;)u.push(l.parentCollection.name),l=l.parentCollection;return{key:s.key,name:s.name,fullPath:u.reverse().join("/")}})}catch(r){return console.error(r),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),null}}async function Cs(e,t){let a,n=new nt(app,"Fetching collections from Zotero...");n.open();let i=Symbol();try{await Ee.wait(i),a=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.attachments",params:[e.key]}),headers:Mt})}catch(r){return console.error(r),n.close(),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),Ee.end(i),null}Ee.end(i),n.close();try{return JSON.parse(a).result}catch(r){return console.error(r),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),null}}function Bx(e,t,a,n,i){return mp([e],t,a,n,i)}async function mp(e,t,a,n,i){var l;if(!e||!e.length)return null;let r,o;i||(o=new nt(app,"Fetching data from Zotero..."),o.open());let s=Symbol();try{let u={quickCopy:!0,contentType:"html"};a&&(delete u.quickCopy,u.id=a),await Ee.wait(s),r=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.bibliography",params:[e.map(c=>c.key),u,e[0].library]}),headers:Mt})}catch(u){return console.error(u),!i&&o.close(),new Pe.Notice(`Error retrieving formatted bibliography: ${u.message}`,1e4),Ee.end(s),null}Ee.end(s),!i&&o.close();try{let u=JSON.parse(r);if((l=u.error)!=null&&l.message)throw new Error(u.error.message);return n==="html"?u.result:(0,Pe.htmlToMarkdown)(u.result)}catch(u){console.error(u),console.error(`Response from BBT: ${r}`);let c=`Error converting formatted bibliography to markdown: ${u.message}`;return u.message.includes("element/document/fragment")&&(c="Error: Received empty bibliography from Zotero. Ensure Zotero's quick copy settings are set and the selected citation style is installed."),new Pe.Notice(c,1e4),null}}async function nr(e,t,a){var o;let n,i=new nt(app,"Fetching data from Zotero...");i.open();let r=Symbol();try{await Ee.wait(r),n=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.export",params:[e.map(s=>s.key),"36a3b0b5-bad0-4a04-b79b-441c7cef77db",a]}),headers:Mt})}catch(s){return console.error(s),i.close(),new Pe.Notice(`Error retrieving item data: ${s.message}`,1e4),Ee.end(r),null}Ee.end(r),i.close();try{let s=JSON.parse(n);if((o=s.error)!=null&&o.message)throw new Error(s.error.message);return Array.isArray(s.result)?JSON.parse(s.result[2]).items:JSON.parse(s.result).items}catch(s){return console.error(s),new Pe.Notice(`Error retrieving item data: ${s.message}`,1e4),null}}async function Nx(e,t,a){let n,i=new nt(app,"Fetching data from Zotero...");i.open();let r={},o=[],s=Symbol();try{await Ee.wait(s),n=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(a.database,a.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.citationkey",params:[t.map(f=>{let p=f.split("/").pop();return o.push(p),r[p]=f,`${e}:${p}`})]}),headers:Mt})}catch(f){return console.error(f),i.close(),new Pe.Notice(`Error retrieving item data: ${f.message}`,1e4),Ee.end(s),null}Ee.end(s),i.close();let l={},u=[];try{let f=JSON.parse(n);Object.keys(f.result).forEach(p=>{let b=p.split(":").pop();f.result[p]?(u.push({key:f.result[p],library:e}),l[b]={citekey:f.result[p],uri:r[b]}):l[b]={uri:r[b]}})}catch(f){return console.error(f),new Pe.Notice(`Error retrieving item data: ${f.message}`,1e4),null}let c=u.length?await nr(u,a,e):[];return o.map(f=>{if(l[f].citekey){let p=c.find(b=>{var d;return((d=rn(b))==null?void 0:d.key)===l[f].citekey});if(p)return p}return l[f]})}async function jx(e,t){var r;let a,n=new nt(app,"Fetching data from Zotero...");n.open();let i=Symbol();try{await Ee.wait(i),a=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.export",params:[[e.key],"f4b52ab0-f878-4556-85a0-c7aeedd09dfc",e.library]}),headers:Mt})}catch(o){return console.error(o),n.close(),new Pe.Notice(`Error retrieving item data: ${o.message}`,1e4),Ee.end(i),null}Ee.end(i),n.close();try{let o=JSON.parse(a);if((r=o.error)!=null&&r.message)throw new Error(o.error.message);let l=(Array.isArray(o.result)?JSON.parse(o.result[2]):JSON.parse(o.result)).map(u=>{let{issued:c}=u;if(!c||!c["date-parts"])return null;let f=c["date-parts"][0];return f.length?(0,Pe.moment)(`${f[0]}-${f[1]?lp(f[1]):"01"}-${f[2]?lp(f[2]):"01"}`,"YYYY-MM-DD"):null}).filter(u=>u);return l[0]?l[0]:null}catch(o){return console.error(o),new Pe.Notice(`Error retrieving item data: ${o.message}`,1e4),null}}function rn(e){return!e.citekey&&!e.citationKey?null:{key:e.citekey||e.citationKey,library:e.libraryID}}var As=!1,Lx=0;async function hp(e,t){if(As&&Date.now()-Lx<1e3*30)return As;let a;t||(a=new nt(app,"Fetching data from Zotero..."),a.open());let n=Symbol();try{await Ee.wait(n);let i=await(0,Pa.request)({method:"GET",url:`http://127.0.0.1:${Dt(e.database,e.port)}/better-bibtex/cayw?probe=true`,headers:Mt});return a==null||a.close(),As=i==="ready",Lx=Date.now(),Ee.end(n),As}catch(i){return a==null||a.close(),!t&&new Pa.Notice("Cannot connect to Zotero. Please ensure it is running and the Better BibTeX plugin is installed",1e4),Ee.end(n),!1}}function hO(e){switch(e.format){case"formatted-bibliography":return"format=formatted-bibliography";case"formatted-citation":return`format=formatted-citation${e.cslStyle?`&style=${e.cslStyle}`:""}`;case"pandoc":return`format=pandoc${e.brackets?"&brackets=true":""}`;case"latex":return`format=latex&command=${e.command||"cite"}`;case"biblatex":return`format=biblatex&command=${e.command||"autocite"}`}}async function Mx(e,t){let a=sp();if(!await hp(t))return null;let n=new nt(app,"Awaiting item selection from Zotero...");n.open();let i=Symbol();try{if(e.format==="formatted-bibliography"){n.close();let o=await on(t);return await mp(o,t,e.cslStyle)}await Ee.wait(i);let r=await(0,Pa.request)({method:"GET",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/cayw?${hO(e)}`,headers:Mt});return a.show(),n.close(),Ee.end(i),r}catch(r){return a.show(),console.error(r),n.close(),new Pa.Notice(`Error processing citation: ${r.message}`,1e4),Ee.end(i),null}}async function on(e){try{let t=await vO(e);if(!t)return[];let a=t.map(n=>rn(n)).filter(n=>!!n);return a.length?a:[]}catch(t){return[]}}async function vO(e){let t=sp();if(!await hp(e))return null;let a=new nt(app,"Awaiting item selection from Zotero...");a.open();let n=Symbol();try{await Ee.wait(n);let i=await(0,Pa.request)({method:"GET",url:`http://127.0.0.1:${Dt(e.database,e.port)}/better-bibtex/cayw?format=translate&translator=36a3b0b5-bad0-4a04-b79b-441c7cef77db&exportNotes=false`,headers:Mt});return t.show(),a.close(),Ee.end(n),i?JSON.parse(i).items||[]:null}catch(i){return t.show(),console.error(i),a.close(),new Pa.Notice(`Error retrieving cite key: ${i.message}`,1e4),Ee.end(n),null}}var Oa=require("fs"),zt=require("obsidian"),cn=_e(require("path"));var sn=require("obsidian");function Is(e,t){if(!t)return null;let a=app.vault.getAbstractFileByPath(bp(t));return a?app.vault.cachedRead(a):(new sn.Notice(`Error: ${e} template not found ${t}`),null)}async function Dx(e){let{exportFormat:t}=e,a=!t.headerTemplatePath&&!t.annotationTemplatePath&&!t.footerTemplatePath;return t.templatePath||a?{template:await Is("",t.templatePath)}:{headerTemplate:await Is("Header",t.headerTemplatePath),annotationTemplate:await Is("Annotation",t.annotationTemplatePath),footerTemplate:await Is("Footer",t.footerTemplatePath)}}function zx(e){let t=e.match(/%% Import Date: (\S+) %%\n$/);return t&&t[1]?(0,sn.moment)(t[1]):(t=e.match(/%% Export Date: (\S+) %%\n$/),t&&t[1]?(0,sn.moment)(t[1]):(0,sn.moment)(0))}function vp(e){return e+` +${c.note.trim()}`:u,"").trim();l&&(t.markdownNotes=l)}return(o=t.tags)!=null&&o.length&&(t.allTags=t.tags.map(l=>l.tag).join(", "),t.hashTags=t.tags.map(l=>`#${l.tag.replace(/\s+/g,"-")}`).join(", ")),(s=t.annotations)!=null&&s.length&&(t.formattedAnnotationsNew=(await bt(e,_x,t)).trim(),t.formattedAnnotations=(await bt(e,_x,{...t,lastExportDate:(0,Tx.moment)(0)})).trim()),t}var Pa=require("obsidian");var kx=require("obsidian"),nt=class extends kx.Modal{constructor(a,n){super(a);this.message=n}onOpen(){this.contentEl.createDiv({text:this.message})}onClose(){this.contentEl.empty()}};var Es=_e(require("path")),Mt={"Content-Type":"application/json","User-Agent":"obsidian/zotero",Accept:"application/json",Connection:"keep-alive"};function Dt(e,t){return e==="Zotero"?"23119":e==="Juris-M"?"24119":t||"23119"}async function Ss(e){let t=Es.default.dirname(e);await app.vault.adapter.exists(t)||await app.vault.createFolder(t)}function Fx(e){return e.replace(/\s*[*?]+\s*/g," ").trim().replace(/\s*[:"<>|]+\s*/g," - ").trim()}function Vn(e){let t=Es.default.parse(e),a=Fx(t.dir),n=Fx(t.name);return Es.default.join(a,`${n}${t.ext}`)}function fO(e){let t="0",a="0",n="0";e.length==4?(t="0x"+e[1]+e[1],a="0x"+e[2]+e[2],n="0x"+e[3]+e[3]):e.length==7&&(t="0x"+e[1]+e[2],a="0x"+e[3]+e[4],n="0x"+e[5]+e[6]);let i=+t/255,r=+a/255,o=+n/255,s=Math.min(i,r,o),l=Math.max(i,r,o),u=l-s,c=0,f=0,p=0;return u==0?c=0:l==i?c=(r-o)/u%6:l==r?c=(o-i)/u+2:c=(i-r)/u+4,c=Math.round(c*60),c<0&&(c+=360),p=(l+s)/2,f=u==0?0:u/(1-Math.abs(2*p-1)),f=+(f*100).toFixed(1),p=+(p*100).toFixed(1),{h:c,s:f,l:p}}function Px(e){let{h:t,s:a,l:n}=fO(e);return n<12?"Black":n>98?"White":a<2?"Gray":t<15?"Red":t<45?"Orange":t<65?"Yellow":t<170?"Green":t<190?"Cyan":t<263?"Blue":t<280?"Purple":t<335?"Magenta":"Red"}function Qt(e,t,a){let n=t.split("/").pop(),i=`zotero://${e}`,r="";if(/group/.test(t)?r=t.replace("http://zotero.org",i):r=`${i}/library/items/${n}`,a){let o=new URLSearchParams(a);r+=`?${o}`}return r}var Pe=require("obsidian");var dp=class e{constructor(t){this.compare=t;this.heapArray=[];this._limit=0}static getChildrenIndexOf(t){return[t*2+1,t*2+2]}static getParentIndexOf(t){if(t<=0)return-1;let a=t%2?1:2;return Math.floor((t-a)/2)}push(t){return this._sortNodeUp(this.heapArray.push(t)-1),!0}length(){return this.heapArray.length}peek(){return this.heapArray[0]}pop(){let t=this.heapArray.pop();return this.length()>0&&t!==void 0?this.replace(t):t}replace(t){let a=this.heapArray[0];return this.heapArray[0]=t,this._sortNodeDown(0),a}size(){return this.length()}_moveNode(t,a){[this.heapArray[t],this.heapArray[a]]=[this.heapArray[a],this.heapArray[t]]}_sortNodeDown(t){let a=t(this.heapArray.length>o&&this.compare(this.heapArray[o],this.heapArray[r])<0&&(r=o),r);for(;a;){let r=e.getChildrenIndexOf(t),o=r.reduce(i,r[0]),s=this.heapArray[o];typeof s!="undefined"&&this.compare(n,s)>0?(this._moveNode(t,o),t=o):a=!1}}_sortNodeUp(t){let a=t>0;for(;a;){let n=e.getParentIndexOf(t);n>=0&&this.compare(this.heapArray[n],this.heapArray[t])>0?(this._moveNode(t,n),t=n):a=!1}}};function mO(e,t){return e.prio-t.prio||e.counter-t.counter}var fp=class{constructor(t,a){this.maxConcurrent=t||1,this.minCycle=a||0,this.queueRunning=new Map,this.queueWaiting=new dp(mO),this.lastRun=0,this.nextTimer=null,this.counter=0}tryRun(){for(;this.queueWaiting.size()>0&&this.queueRunning.sizeactiveWindow.setTimeout(()=>{this.nextTimer=null,this.tryRun(),a()},this.minCycle-Date.now()+this.lastRun)));return}let t=this.queueWaiting.pop();if(t!==void 0){let a,i={wait:new Promise(o=>{a=o}),signal:a},r={hash:t.hash,prio:t.prio,finish:i};if(this.queueRunning.has(t.hash))throw new Error("async-await-queue: duplicate hash "+t.hash);this.queueRunning.set(t.hash,r),this.lastRun=Date.now(),t.start.signal()}}}end(t){let a=this.queueRunning.get(t);if(a===void 0)throw new Error("async-await-queue: queue desync for "+t);this.queueRunning.delete(t),a.finish.signal(),this.tryRun()}async wait(t,a){let n=a!=null?a:0,i,r=new Promise(s=>{i=s}),o={hash:t,prio:n,start:{signal:i,wait:r},counter:this.counter++};this.queueWaiting.push(o),this.tryRun(),await r,this.lastRun=Date.now()}run(t,a){let n=a!=null?a:0,i=Symbol();return this.wait(i,n).then(t).finally(()=>{this.end(i)})}stat(){return{running:this.queueRunning.size,waiting:this.queueWaiting.size(),last:this.lastRun}}async flush(t){for(;this.queueRunning.size>0||this.queueWaiting.size()>0;){let a=this.queueWaiting.peek();if(a&&await a.start.wait,t!==void 0&&this.queueWaiting.size()0&&await this.queueRunning.values().next().value.finish.wait}}},Ee=new fp(1);async function Ox(e,t){let a,n=new nt(app,"Fetching notes from Zotero...");n.open();let i=Symbol();try{await Ee.wait(i),a=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.notes",params:[e.map(r=>r.key)]}),headers:Mt})}catch(r){return console.error(r),n.close(),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),Ee.end(i),null}Ee.end(i),n.close();try{return JSON.parse(a).result}catch(r){return console.error(r),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),null}}async function Rx(e,t){let a,n=new nt(app,"Fetching collections from Zotero...");n.open();let i=Symbol();try{await Ee.wait(i),a=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.collections",params:[[e.key],!0]}),headers:Mt})}catch(r){return console.error(r),n.close(),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),Ee.end(i),null}Ee.end(i),n.close();try{return JSON.parse(a).result[e.key].map(s=>{let l=s,u=[s.name];for(;l.parentCollection;)u.push(l.parentCollection.name),l=l.parentCollection;return{key:s.key,name:s.name,fullPath:u.reverse().join("/")}})}catch(r){return console.error(r),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),null}}async function Cs(e,t){let a,n=new nt(app,"Fetching collections from Zotero...");n.open();let i=Symbol();try{await Ee.wait(i),a=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.attachments",params:[e.key,e.library]}),headers:Mt})}catch(r){return console.error(r),n.close(),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),Ee.end(i),null}Ee.end(i),n.close();try{return JSON.parse(a).result}catch(r){return console.error(r),new Pe.Notice(`Error retrieving notes: ${r.message}`,1e4),null}}function Bx(e,t,a,n,i){return mp([e],t,a,n,i)}async function mp(e,t,a,n,i){var l;if(!e||!e.length)return null;let r,o;i||(o=new nt(app,"Fetching data from Zotero..."),o.open());let s=Symbol();try{let u={quickCopy:!0,contentType:"html"};a&&(delete u.quickCopy,u.id=a),await Ee.wait(s),r=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.bibliography",params:[e.map(c=>c.key),u,e[0].library]}),headers:Mt})}catch(u){return console.error(u),!i&&o.close(),new Pe.Notice(`Error retrieving formatted bibliography: ${u.message}`,1e4),Ee.end(s),null}Ee.end(s),!i&&o.close();try{let u=JSON.parse(r);if((l=u.error)!=null&&l.message)throw new Error(u.error.message);return n==="html"?u.result:(0,Pe.htmlToMarkdown)(u.result)}catch(u){console.error(u),console.error(`Response from BBT: ${r}`);let c=`Error converting formatted bibliography to markdown: ${u.message}`;return u.message.includes("element/document/fragment")&&(c="Error: Received empty bibliography from Zotero. Ensure Zotero's quick copy settings are set and the selected citation style is installed."),new Pe.Notice(c,1e4),null}}async function nr(e,t,a){var o;let n,i=new nt(app,"Fetching data from Zotero...");i.open();let r=Symbol();try{await Ee.wait(r),n=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.export",params:[e.map(s=>s.key),"36a3b0b5-bad0-4a04-b79b-441c7cef77db",a]}),headers:Mt})}catch(s){return console.error(s),i.close(),new Pe.Notice(`Error retrieving item data: ${s.message}`,1e4),Ee.end(r),null}Ee.end(r),i.close();try{let s=JSON.parse(n);if((o=s.error)!=null&&o.message)throw new Error(s.error.message);return Array.isArray(s.result)?JSON.parse(s.result[2]).items:JSON.parse(s.result).items}catch(s){return console.error(s),new Pe.Notice(`Error retrieving item data: ${s.message}`,1e4),null}}async function Nx(e,t,a){let n,i=new nt(app,"Fetching data from Zotero...");i.open();let r={},o=[],s=Symbol();try{await Ee.wait(s),n=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(a.database,a.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.citationkey",params:[t.map(f=>{let p=f.split("/").pop();return o.push(p),r[p]=f,`${e}:${p}`})]}),headers:Mt})}catch(f){return console.error(f),i.close(),new Pe.Notice(`Error retrieving item data: ${f.message}`,1e4),Ee.end(s),null}Ee.end(s),i.close();let l={},u=[];try{let f=JSON.parse(n);Object.keys(f.result).forEach(p=>{let b=p.split(":").pop();f.result[p]?(u.push({key:f.result[p],library:e}),l[b]={citekey:f.result[p],uri:r[b]}):l[b]={uri:r[b]}})}catch(f){return console.error(f),new Pe.Notice(`Error retrieving item data: ${f.message}`,1e4),null}let c=u.length?await nr(u,a,e):[];return o.map(f=>{if(l[f].citekey){let p=c.find(b=>{var d;return((d=rn(b))==null?void 0:d.key)===l[f].citekey});if(p)return p}return l[f]})}async function jx(e,t){var r;let a,n=new nt(app,"Fetching data from Zotero...");n.open();let i=Symbol();try{await Ee.wait(i),a=await(0,Pe.request)({method:"POST",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/json-rpc`,body:JSON.stringify({jsonrpc:"2.0",method:"item.export",params:[[e.key],"f4b52ab0-f878-4556-85a0-c7aeedd09dfc",e.library]}),headers:Mt})}catch(o){return console.error(o),n.close(),new Pe.Notice(`Error retrieving item data: ${o.message}`,1e4),Ee.end(i),null}Ee.end(i),n.close();try{let o=JSON.parse(a);if((r=o.error)!=null&&r.message)throw new Error(o.error.message);let l=(Array.isArray(o.result)?JSON.parse(o.result[2]):JSON.parse(o.result)).map(u=>{let{issued:c}=u;if(!c||!c["date-parts"])return null;let f=c["date-parts"][0];return f.length?(0,Pe.moment)(`${f[0]}-${f[1]?lp(f[1]):"01"}-${f[2]?lp(f[2]):"01"}`,"YYYY-MM-DD"):null}).filter(u=>u);return l[0]?l[0]:null}catch(o){return console.error(o),new Pe.Notice(`Error retrieving item data: ${o.message}`,1e4),null}}function rn(e){return!e.citekey&&!e.citationKey?null:{key:e.citekey||e.citationKey,library:e.libraryID}}var As=!1,Lx=0;async function hp(e,t){if(As&&Date.now()-Lx<1e3*30)return As;let a;t||(a=new nt(app,"Fetching data from Zotero..."),a.open());let n=Symbol();try{await Ee.wait(n);let i=await(0,Pa.request)({method:"GET",url:`http://127.0.0.1:${Dt(e.database,e.port)}/better-bibtex/cayw?probe=true`,headers:Mt});return a==null||a.close(),As=i==="ready",Lx=Date.now(),Ee.end(n),As}catch(i){return a==null||a.close(),!t&&new Pa.Notice("Cannot connect to Zotero. Please ensure it is running and the Better BibTeX plugin is installed",1e4),Ee.end(n),!1}}function hO(e){switch(e.format){case"formatted-bibliography":return"format=formatted-bibliography";case"formatted-citation":return`format=formatted-citation${e.cslStyle?`&style=${e.cslStyle}`:""}`;case"pandoc":return`format=pandoc${e.brackets?"&brackets=true":""}`;case"latex":return`format=latex&command=${e.command||"cite"}`;case"biblatex":return`format=biblatex&command=${e.command||"autocite"}`}}async function Mx(e,t){let a=sp();if(!await hp(t))return null;let n=new nt(app,"Awaiting item selection from Zotero...");n.open();let i=Symbol();try{if(e.format==="formatted-bibliography"){n.close();let o=await on(t);return await mp(o,t,e.cslStyle)}await Ee.wait(i);let r=await(0,Pa.request)({method:"GET",url:`http://127.0.0.1:${Dt(t.database,t.port)}/better-bibtex/cayw?${hO(e)}`,headers:Mt});return a.show(),n.close(),Ee.end(i),r}catch(r){return a.show(),console.error(r),n.close(),new Pa.Notice(`Error processing citation: ${r.message}`,1e4),Ee.end(i),null}}async function on(e){try{let t=await vO(e);if(!t)return[];let a=t.map(n=>rn(n)).filter(n=>!!n);return a.length?a:[]}catch(t){return[]}}async function vO(e){let t=sp();if(!await hp(e))return null;let a=new nt(app,"Awaiting item selection from Zotero...");a.open();let n=Symbol();try{await Ee.wait(n);let i=await(0,Pa.request)({method:"GET",url:`http://127.0.0.1:${Dt(e.database,e.port)}/better-bibtex/cayw?format=translate&translator=36a3b0b5-bad0-4a04-b79b-441c7cef77db&exportNotes=false`,headers:Mt});return t.show(),a.close(),Ee.end(n),i?JSON.parse(i).items||[]:null}catch(i){return t.show(),console.error(i),a.close(),new Pa.Notice(`Error retrieving cite key: ${i.message}`,1e4),Ee.end(n),null}}var Oa=require("fs"),zt=require("obsidian"),cn=_e(require("path"));var sn=require("obsidian");function Is(e,t){if(!t)return null;let a=app.vault.getAbstractFileByPath(bp(t));return a?app.vault.cachedRead(a):(new sn.Notice(`Error: ${e} template not found ${t}`),null)}async function Dx(e){let{exportFormat:t}=e,a=!t.headerTemplatePath&&!t.annotationTemplatePath&&!t.footerTemplatePath;return t.templatePath||a?{template:await Is("",t.templatePath)}:{headerTemplate:await Is("Header",t.headerTemplatePath),annotationTemplate:await Is("Annotation",t.annotationTemplatePath),footerTemplate:await Is("Footer",t.footerTemplatePath)}}function zx(e){let t=e.match(/%% Import Date: (\S+) %%\n$/);return t&&t[1]?(0,sn.moment)(t[1]):(t=e.match(/%% Export Date: (\S+) %%\n$/),t&&t[1]?(0,sn.moment)(t[1]):(0,sn.moment)(0))}function vp(e){return e+` %% Import Date: ${(0,sn.moment)().toISOString(!0)} %% `}function Gx(e){let t=e.match(/%% Begin annotations %%([\w\W]+)%% End annotations %%/);return t&&t[1]?t[1].trim():""}function Hx(e){return` @@ -109,7 +109,7 @@ ${e} `))}async function Vx(e,t){let a=Object.keys(t),n=[];for(let i of a){let r=await gO(e,i,t[i]);if(!r)break;n.push(r)}return n.map(i=>i.path)}async function gO(e,t,a){let n=(0,zt.normalizePath)(Vn(ln(`${e}/${t}.md`))),i=app.vault.getAbstractFileByPath(n);try{i?await app.vault.modify(i,a):(await Ss(n),i=await app.vault.create(n,a))}catch(r){return console.error(r),new zt.Notice(`Error creating file "${n}": ${r.message}`,1e4),null}return i}var un=require("obsidian"),_s=_e(require("path"));var xO={noWrite:"-w",imageOutputPath:"-o",imageBaseName:"-n",imageFormat:"-f",imageDPI:"-d",imageQuality:"-q",ignoreBefore:"-b",attemptOCR:"-e",ocrLang:"-l",tesseractPath:"--tesseract-path",tessDataDir:"--tess-data-dir"};async function yp(e,t,a){let n=new nt(app,"Extracting annotations...");n.open();let i=[e];Object.keys(t).forEach(r=>{let o=t[r];if(o===""||o===void 0)return"";let s=xO[r];typeof o=="boolean"?o&&i.push(s):(i.push(s),typeof o=="string"&&o.startsWith("-")?i.push(`"${o}"`):i.push(o.toString()))});try{if(!Cx(a))return new un.Notice("Error: PDF utility is not executable",1e4),"[]";let o=await er(a||_s.default.join(_t(),nn()),i);if(n.close(),o.stderr.toLowerCase().includes("password"))return new un.Notice(`Error opening ${_s.default.basename(e)}: PDF is password protected`,1e4),"[]";if(o.stderr&&!o.stderr.includes("warning"))throw new un.Notice(`Error processing PDF: ${o.stderr}`,1e4),new Error(o.stderr);return o.stdout}catch(r){if(n.close(),r.message.toLowerCase().includes("password"))return new un.Notice(`Error opening ${_s.default.basename(e)}: PDF is password protected`,1e4),"[]";if(r.message.toLowerCase().includes("type3"))return new un.Notice(`Error processing annotations: ${r.message}`,1e4),"[]";throw console.error(r),new un.Notice(`Error processing PDF: ${r.message}`,1e4),r}}async function yO(e,t,a,n,i){t.note&&(t.note=(0,Be.htmlToMarkdown)(await gp(e.key,t.note,{}))),t.dateAdded&&(t.dateAdded=(0,Be.moment)(t.dateAdded)),t.dateModified&&(t.dateModified=(0,Be.moment)(t.dateModified)),t.desktopURI=Qt("select",t.uri),t.relations=await Zx(t,e.library,a,n,i)}function wO(e){var t;e.dateAdded&&(e.dateAdded=(0,Be.moment)(e.dateAdded)),e.dateModified&&(e.dateModified=(0,Be.moment)(e.dateModified)),e.uri&&(e.itemKey=e.uri.split("/").pop(),e.desktopURI=e.select||Qt("select",e.uri),(t=e.path)!=null&&t.endsWith(".pdf")&&(e.pdfURI=Qt("open-pdf",e.uri)))}function Ux(e,t,a){e.date=(0,Be.moment)(e.date),e.attachment=t,e.source="pdf",e.imagePath&&(e.imageBaseName=Jt.default.basename(e.imagePath),e.imageExtension=Jt.default.extname(e.imagePath).slice(1),e.imageRelativePath=(0,Be.normalizePath)(Jt.default.join(a,e.imageBaseName))),e.desktopURI=Qt("open-pdf",t.uri,{page:e.pageLabel})}function Jx(e,t,a,n,i,r=!1){var l;let o=e.annotationPosition.rects[0],s={date:(0,Be.moment)(e.dateModified),attachment:t,page:e.annotationPosition.pageIndex+1,pageLabel:e.annotationPageLabel,id:e.key,type:e.annotationType,x:o[0],y:o[1],color:e.annotationColor,colorCategory:Px(e.annotationColor),desktopURI:Qt("open-pdf",t.uri,{page:e.annotationPageLabel,annotation:e.key}),source:"zotero"};if(e.annotationText&&(s.annotatedText=e.annotationText),e.annotationComment&&(s.comment=e.annotationComment),e.annotationImagePath){let u=Jt.default.parse(e.annotationImagePath);s.imageBaseName=`${i}-${s.page}-x${Math.round(s.x)}-y${Math.round(s.y)}${u.ext}`,s.imageRelativePath=(0,Be.normalizePath)(Jt.default.join(n,s.imageBaseName)),s.imageExtension=u.ext.slice(1);let c=Jt.default.join(a,s.imageBaseName);if(r){(0,Ra.existsSync)(a)||(0,Ra.mkdirSync)(a,{recursive:!0});let f=Jt.default.join(u.dir,`${e.key}${u.ext}`);try{if(!(0,Ra.existsSync)(f)){let p=f;if(f=e.annotationImagePath,!(0,Ra.existsSync)(f))throw new Error("Cannot find annotation image: "+p)}(0,Ra.copyFileSync)(f,c)}catch(p){new Be.Notice("Error: unable to copy annotation image from Zotero into your vault",7e3),console.error(p)}}s.imagePath=c}return(l=e.tags)!=null&&l.length&&(s.tags=e.tags,s.allTags=e.tags.map(u=>u.tag).join(", "),s.hashTags=e.tags.map(u=>`#${u.tag.replace(/\s+/g,"-")}`).join(", ")),s}function Fs(e){let t=[],a=/^\+\s*/;return e.forEach(n=>{if(typeof n.comment=="string"&&a.test(n.comment)){n.comment=n.comment.replace(a,"");let i=t[t.length-1];if(i){i.annotatedText=i.annotatedText?i.annotatedText+"..."+n.annotatedText:n.annotatedText,i.comment=i.comment?i.comment+"..."+n.comment:n.comment;return}}t.push(n)}),t}async function Zx(e,t,a,n,i){var o;if(e.relations&&!Array.isArray(e.relations)){let s=[];for(let l of Object.values(e.relations))Array.isArray(l)&&s.push(...l);e.relations=s}if(!((o=e.relations)!=null&&o.length))return[];let r=await Nx(t,e.relations,n);for(let s of r)rn(s)&&await Ps(s,a,n,i,!0);return r}async function Ps(e,t,a,n,i){let r=rn(e);if(e.importDate=t,e.exportDate=t,e.desktopURI=e.select||Qt("select",e.uri,e.itemKey),e.accessDate&&(e.accessDate=(0,Be.moment)(e.accessDate)),e.dateAdded&&(e.dateAdded=(0,Be.moment)(e.dateAdded)),e.dateModified&&(e.dateModified=(0,Be.moment)(e.dateModified)),r){e.citekey||(e.citekey=r.key),e.citationKey||(e.citationKey=r.key);try{e.date=await jx(r,a)}catch(o){}try{e.collections=await Rx(r,a)}catch(o){}try{e.bibliography=await Bx(r,a,n)}catch(o){e.bibliography="Error generating bibliography"}}if(e.notes)for(let o of e.notes)await yO(r,o,t,a,n);if(e.attachments)for(let o of e.attachments)wO(o);i||(e.relations=await Zx(e,e.libraryID,t,a,n))}function qx(e,t){let a=e.message;try{if(a){let n=a.match(/\[Line (\d+), Column (\d+)]/);if(n){let r=t.split(/\n/g)[Number(n[1])-1],o=" ".repeat(Number(n[2])-1)+"^";return`${a} ${r} -${o}`}}}catch(n){}return a}function Ts(e,t,a){new Be.Notice(createFragment(n=>{n.createSpan({text:`Error parsing template "${t}": `}),n.createEl("code",{text:qx(e,a)})}),1e4)}function ks(e,t,a){return new Error(`Error parsing template "${t}": ${qx(e,a)}`)}async function wp(e,t,a,n){let{template:i,headerTemplate:r,annotationTemplate:o,footerTemplate:s}=await Dx(e);if(!i&&!r&&!o&&!s)throw new Error(`No templates found for export ${e.exportFormat.name}`);let l="",u=!1;if(i){try{l=await bt(e.exportFormat.templatePath,i,t),u=Kt.hasPersist(l)}catch(m){if(n)throw ks(m,e.exportFormat.templatePath,i);return Ts(m,e.exportFormat.templatePath,i),!1}return u?vp(l):l}let c="",f="",p="";try{c=r?await bt(e.exportFormat.headerTemplatePath,r,t):""}catch(m){if(n)throw ks(m,e.exportFormat.headerTemplatePath,r);return Ts(m,e.exportFormat.headerTemplatePath,r),!1}try{f=o?await bt(e.exportFormat.annotationTemplatePath,o,t):""}catch(m){if(n)throw ks(m,e.exportFormat.annotationTemplatePath,o);return Ts(m,e.exportFormat.annotationTemplatePath,o),!1}try{p=s?await bt(e.exportFormat.footerTemplatePath,s,t):""}catch(m){if(n)throw ks(m,e.exportFormat.footerTemplatePath,s);return Ts(m,e.exportFormat.footerTemplatePath,s),!1}let b=[];r&&c.trim()&&b.push(c);let d=o&&(a+f).trim();return d&&b.push(Hx(a+f)),s&&p.trim()&&b.push(p),d?vp(b.join("")):b.join("")}function EO({exportFormat:e}){return e.templatePath||e.headerTemplatePath||e.annotationTemplatePath||e.footerTemplatePath||""}async function Xx(e,t){let a={};try{let n=rn(e);n&&(a=(await Cs(n,t)||[]).reduce((r,o)=>(o!=null&&o.path&&(r[o.path]=o),r),{}))}catch(n){console.error(n)}return a}async function $x(e,t,a){var i;let n=t.attachments.find(r=>{var o,s;return((o=r.path)==null?void 0:o.endsWith(".pdf"))&&((s=r.annotations)==null?void 0:s.length)});return t.annotations=(i=n==null?void 0:n.annotations)!=null?i:[],t.lastImportDate=a,t.lastExportDate=a,t.isFirstImport=a.valueOf()===0,await ws(e,t)}async function Ep(e,t){var h,v;let a=(0,Be.moment)(),{database:n,exportFormat:i,settings:r}=e,o=EO(e),s=Hn(),l=t||await on(n);if(!l.length)return[];let u=l[0].library,c;try{c=await nr(l,n,u)}catch(x){return[]}let f=[];for(let x=0,E=c.length;x{if(!b.has(x)){let g=app.vault.getAbstractFileByPath(x),w=g?await app.vault.cachedRead(g):"",C=g?Gx(w):"",y=g?zx(w):(0,Be.moment)(0);b.set(x,{item:E,file:g,fileContent:w,lastImportDate:y,existingAnnotations:C})}},m=async x=>(0,Be.normalizePath)(Vn(ln(await bt(o,i.outputPathTemplate,x))));for(let x=0,E=c.length;x{var M;(M=N.annotationPosition.rects)!=null&&M.length&&T.push(Jx(N,A,j,B,L,!0))})),T.length&&r.shouldConcat&&(T=Fs(T)),P&&s)try{let N=await yp(_,{imageBaseName:L,imageDPI:r.pdfExportImageDPI,imageFormat:r.pdfExportImageFormat,imageOutputPath:j,imageQuality:r.pdfExportImageQuality,attemptOCR:r.pdfExportImageOCR,ocrLang:r.pdfExportImageOCRLang,tesseractPath:r.pdfExportImageTesseractPath,tessDataDir:r.pdfExportImageTessDataDir},r.exeOverridePath),M=JSON.parse(N);for(let D of M)Ux(D,A,B);r.shouldConcat&&M.length&&(M=Fs(M)),T.push(...M)}catch(N){}T.length&&(A.annotations=T),await d(k,g)}}for(let[x,E]of b.entries())try{let{existingAnnotations:g,file:w,fileContent:C,item:y,lastImportDate:S}=E,A=await $x(x,y,S),_=await wp(e,Kt.prepareTemplateData(A,C),g);if(!_)continue;w?await app.vault.modify(w,_):(await Ss(x),await app.vault.create(x,_)),f.push(x)}catch(g){new Be.Notice(`Import failed for ${x}, check developer console for details`,7e3),console.error(g)}return f}async function Yx(e){let t=(0,Be.moment)(),{database:a,format:n}=e,i=await on(a);if(!i.length)return null;let r=i[0].library,o;try{o=await nr(i,a,r)}catch(l){return null}if(o.length===0)return null;let s=[];for(let l=0,u=o.length;l{var d;return!!((d=b.path)!=null&&d.endsWith(".pdf"))})||c.length?c[0]:null,...o[l]};s.push(await bt("",n.template,p))}return s.join(" ")}function SO(e){let t=e.exportFormats.find(n=>!!n.cslStyle);if(t)return t.cslStyle;let a=e.citeFormats.find(n=>!!n.cslStyle);if(a)return a.cslStyle}async function Kx(e){var u,c;let t={database:e.database,port:e.port},a=await on(t),n=Hn();if(!a.length)return null;let i=a[0].library,r;try{r=await nr(a,t,i)}catch(f){return null}let o=(0,Be.moment)(),s=SO(e);for(let f=0,p=r.length;f{var C;(C=w.annotationPosition.rects)!=null&&C.length&&g.push(Jx(w,d[h],Jt.default.join(l,"output_path"),"base_name","output_path"))}),e.shouldConcat&&g.length&&(g=Fs(g)),n)try{let w=await yp(E,{noWrite:!0,imageBaseName:"base_name",imageDPI:e.pdfExportImageDPI,imageFormat:e.pdfExportImageFormat,imageOutputPath:Jt.default.join(l,"output_path"),imageQuality:e.pdfExportImageQuality,attemptOCR:e.pdfExportImageOCR,ocrLang:e.pdfExportImageOCRLang,tesseractPath:e.pdfExportImageTesseractPath,tessDataDir:e.pdfExportImageTessDataDir},e.exeOverridePath),C=JSON.parse(w);for(let y of C)Ux(y,d[h],"output_path");e.shouldConcat&&C.length&&(C=Fs(C)),g.push(...C)}catch(w){return!1}g.length&&(x.annotations=g)}}return await Promise.all(r.map(async f=>{await $x("",f,(0,Be.moment)(0))})),r}var Un="zdc-debug",CO={scheme:"Tomorrow",author:"Chris Kempson (http://chriskempson.com)",base00:"#ffffff",base01:"#e0e0e0",base02:"#d6d6d6",base03:"#8e908c",base04:"#969896",base05:"#4d4d4c",base06:"#282a2e",base07:"#1d1f21",base08:"#c82829",base09:"#f5871f",base0A:"#eab700",base0B:"#718c00",base0C:"#3e999f",base0D:"#4271ae",base0E:"#8959a8",base0F:"#a3685a"},AO={scheme:"Tomorrow Night",author:"Chris Kempson (http://chriskempson.com)",base00:"#1d1f21",base01:"#282a2e",base02:"#373b41",base03:"#969896",base04:"#b4b7b4",base05:"#c5c8c6",base06:"#e0e0e0",base07:"#ffffff",base08:"#cc6666",base09:"#de935f",base0A:"#f0c674",base0B:"#b5bd68",base0C:"#8abeb7",base0D:"#81a2be",base0E:"#b294bb",base0F:"#a3685a"};function IO({plugin:e,formatIndex:t,templateData:a}){let[n,i]=I.useState(null),[r,o]=I.useState(null),[s,l]=I.useState(0);return I.useEffect(()=>{let u=e.settings.exportFormats[t],c=u.templatePath?e.app.vault.getAbstractFileByPath(bp(u.templatePath)):null,f=b=>{b&&b===c&&l(Date.now())},p=()=>{l(Date.now())};return e.emitter.on("fileUpdated",f),e.emitter.on("settingsUpdated",p),()=>{e.emitter.off("fileUpdated",f),e.emitter.off("settingsUpdated",p)}},[t]),I.useEffect(()=>{if(i(null),t===null)return;let u={settings:e.settings,database:{database:e.settings.database,port:e.settings.port},exportFormat:e.settings.exportFormats[t]};(async()=>{try{let f="",p=(0,Ba.moment)(0),b=await wp(u,Kt.prepareTemplateData({...a,lastImportDate:p,lastExportDate:p},f),"",!0);o(b||null)}catch(f){i(f.message)}})()},[t,s,a]),!r&&!n?null:I.createElement("div",{className:`zt-json-viewer__preview${n?" error":""}`},I.createElement("pre",null,I.createElement("code",null,n||r)))}function _O({plugin:e}){let[t,a]=I.useState(null),[n,i]=I.useState(null),[r,o]=I.useState(null),s=I.useCallback(()=>{Kx(e.settings).then(l=>{!l||l.length===0?a("No data retrieved"):(a(null),i(l[0]))})},[]);return I.createElement("div",{className:"zt-json-viewer"},I.createElement("div",{className:"zt-json-viewer__btns"},I.createElement("div",null,I.createElement("button",{onClick:s},"Prompt For Selection")),I.createElement("div",null,I.createElement("select",{className:"dropdown",onChange:l=>{l.target.value?o(Number(l.target.value)):o(null)}},I.createElement("option",{value:""},"Preview Import Format"),e.settings.exportFormats.map((l,u)=>I.createElement("option",{key:u,value:u},l.name))))),t?I.createElement("div",null,t):I.createElement("div",null,n&&I.createElement(I.Fragment,null,r!==null&&I.createElement(IO,{plugin:e,formatIndex:r,templateData:n}),I.createElement("div",{className:"zt-json-viewer__data"},I.createElement(Sg,{data:n,sortObjectKeys:(l,u)=>l.localeCompare(u),isCustomNode:l=>l instanceof Ba.moment,valueRenderer:RO,labelRenderer:TO,theme:document.body.hasClass("theme-dark")?AO:CO,invertTheme:!1})))))}var Os=class extends Ba.ItemView{constructor(a,n){super(n);this.plugin=a,this.mountJsonViewer()}getViewType(){return Un}getIcon(){return"gear"}getDisplayText(){return"Zotero Data Explorer"}mountJsonViewer(){I.unmountComponentAtNode(this.contentEl),I.render(I.createElement(_O,{plugin:this.plugin}),this.contentEl)}unmountJsonViewer(){I.unmountComponentAtNode(this.contentEl)}async onClose(){this.unmountJsonViewer()}},TO=(e,t)=>{let a=e.length===1,n=e.slice(0,-1),i=kO(n);return I.createElement("span",{onContextMenu:a?void 0:o=>{let s=new Ba.Menu().addItem(l=>l.setIcon("lucide-copy").setTitle("Copy template path").onClick(()=>{navigator.clipboard.writeText(`{{${i}}}`)}));t==="Array"&&s.addItem(l=>l.setIcon("lucide-copy").setTitle("Copy template for loop").onClick(()=>{navigator.clipboard.writeText(`{% for item in ${i} %} +${o}`}}}catch(n){}return a}function Ts(e,t,a){new Be.Notice(createFragment(n=>{n.createSpan({text:`Error parsing template "${t}": `}),n.createEl("code",{text:qx(e,a)})}),1e4)}function ks(e,t,a){return new Error(`Error parsing template "${t}": ${qx(e,a)}`)}async function wp(e,t,a,n){let{template:i,headerTemplate:r,annotationTemplate:o,footerTemplate:s}=await Dx(e);if(!i&&!r&&!o&&!s)throw new Error(`No templates found for export ${e.exportFormat.name}`);let l="",u=!1;if(i){try{l=await bt(e.exportFormat.templatePath,i,t),u=Kt.hasPersist(l)}catch(m){if(n)throw ks(m,e.exportFormat.templatePath,i);return Ts(m,e.exportFormat.templatePath,i),!1}return u?vp(l):l}let c="",f="",p="";try{c=r?await bt(e.exportFormat.headerTemplatePath,r,t):""}catch(m){if(n)throw ks(m,e.exportFormat.headerTemplatePath,r);return Ts(m,e.exportFormat.headerTemplatePath,r),!1}try{f=o?await bt(e.exportFormat.annotationTemplatePath,o,t):""}catch(m){if(n)throw ks(m,e.exportFormat.annotationTemplatePath,o);return Ts(m,e.exportFormat.annotationTemplatePath,o),!1}try{p=s?await bt(e.exportFormat.footerTemplatePath,s,t):""}catch(m){if(n)throw ks(m,e.exportFormat.footerTemplatePath,s);return Ts(m,e.exportFormat.footerTemplatePath,s),!1}let b=[];r&&c.trim()&&b.push(c);let d=o&&(a+f).trim();return d&&b.push(Hx(a+f)),s&&p.trim()&&b.push(p),d?vp(b.join("")):b.join("")}function EO({exportFormat:e}){return e.templatePath||e.headerTemplatePath||e.annotationTemplatePath||e.footerTemplatePath||""}async function Xx(e,t){let a={};try{let n=rn(e);n&&(a=(await Cs(n,t)||[]).reduce((r,o)=>(o!=null&&o.path&&(r[o.path]=o),r),{}))}catch(n){console.error(n)}return a}async function $x(e,t,a){var i;let n=t.attachments.find(r=>{var o,s;return((o=r.path)==null?void 0:o.endsWith(".pdf"))&&((s=r.annotations)==null?void 0:s.length)});return t.annotations=(i=n==null?void 0:n.annotations)!=null?i:[],t.lastImportDate=a,t.lastExportDate=a,t.isFirstImport=a.valueOf()===0,await ws(e,t)}async function Ep(e,t){var h,v;let a=(0,Be.moment)(),{database:n,exportFormat:i,settings:r}=e,o=EO(e),s=Hn(),l=t||await on(n);if(!l.length)return[];let u=l[0].library,c;try{c=await nr(l,n,u)}catch(x){return[]}let f=[];for(let x of c)await Ps(x,a,n,i.cslStyle);let p=an(),b=new Map,d=async(x,E)=>{if(!b.has(x)){let g=app.vault.getAbstractFileByPath(x),w=g?await app.vault.cachedRead(g):"",C=g?Gx(w):"",y=g?zx(w):(0,Be.moment)(0);b.set(x,{item:E,file:g,fileContent:w,lastImportDate:y,existingAnnotations:C})}},m=async x=>(0,Be.normalizePath)(Vn(ln(await bt(o,i.outputPathTemplate,x))));for(let x=0,E=c.length;x{var M;(M=N.annotationPosition.rects)!=null&&M.length&&T.push(Jx(N,A,j,B,L,!0))})),T.length&&r.shouldConcat&&(T=Fs(T)),P&&s)try{let N=await yp(_,{imageBaseName:L,imageDPI:r.pdfExportImageDPI,imageFormat:r.pdfExportImageFormat,imageOutputPath:j,imageQuality:r.pdfExportImageQuality,attemptOCR:r.pdfExportImageOCR,ocrLang:r.pdfExportImageOCRLang,tesseractPath:r.pdfExportImageTesseractPath,tessDataDir:r.pdfExportImageTessDataDir},r.exeOverridePath),M=JSON.parse(N);for(let D of M)Ux(D,A,B);r.shouldConcat&&M.length&&(M=Fs(M)),T.push(...M)}catch(N){}T.length&&(A.annotations=T),await d(k,g)}}for(let[x,E]of b.entries())try{let{existingAnnotations:g,file:w,fileContent:C,item:y,lastImportDate:S}=E,A=await $x(x,y,S),_=await wp(e,Kt.prepareTemplateData(A,C),g);if(!_)continue;w?await app.vault.modify(w,_):(await Ss(x),await app.vault.create(x,_)),f.push(x)}catch(g){new Be.Notice(`Import failed for ${x}, check developer console for details`,7e3),console.error(g)}return f}async function Yx(e){let t=(0,Be.moment)(),{database:a,format:n}=e,i=await on(a);if(!i.length)return null;let r=i[0].library,o;try{o=await nr(i,a,r)}catch(l){return null}if(o.length===0)return null;let s=[];for(let l of o){await Ps(l,t,a,n.cslStyle);let u=l.attachments||[],f={attachment:u.find(p=>{var b;return!!((b=p.path)!=null&&b.endsWith(".pdf"))})||u.length?u[0]:null,...l};s.push(await bt("",n.template,f))}return s.join(" ")}function SO(e){let t=e.exportFormats.find(n=>!!n.cslStyle);if(t)return t.cslStyle;let a=e.citeFormats.find(n=>!!n.cslStyle);if(a)return a.cslStyle}async function Kx(e){var u,c;let t={database:e.database,port:e.port},a=await on(t),n=Hn();if(!a.length)return null;let i=a[0].library,r;try{r=await nr(a,t,i)}catch(f){return null}let o=(0,Be.moment)(),s=SO(e),l=an();for(let f of r){await Ps(f,o,t,s);let p=f.attachments,b=await Xx(f,t);for(let d of p){let m=d.path;if(!(m!=null&&m.endsWith(".pdf")))continue;let h=[];if((c=(u=b[m])==null?void 0:u.annotations)==null||c.forEach(v=>{var x;(x=v.annotationPosition.rects)!=null&&x.length&&h.push(Jx(v,d,Jt.default.join(l,"output_path"),"base_name","output_path"))}),e.shouldConcat&&h.length&&(h=Fs(h)),n)try{let v=await yp(m,{noWrite:!0,imageBaseName:"base_name",imageDPI:e.pdfExportImageDPI,imageFormat:e.pdfExportImageFormat,imageOutputPath:Jt.default.join(l,"output_path"),imageQuality:e.pdfExportImageQuality,attemptOCR:e.pdfExportImageOCR,ocrLang:e.pdfExportImageOCRLang,tesseractPath:e.pdfExportImageTesseractPath,tessDataDir:e.pdfExportImageTessDataDir},e.exeOverridePath),x=JSON.parse(v);for(let E of x)Ux(E,d,"output_path");e.shouldConcat&&x.length&&(x=Fs(x)),h.push(...x)}catch(v){return!1}h.length&&(d.annotations=h)}}return await Promise.all(r.map(async f=>{await $x("",f,(0,Be.moment)(0))})),r}var Un="zdc-debug",CO={scheme:"Tomorrow",author:"Chris Kempson (http://chriskempson.com)",base00:"#ffffff",base01:"#e0e0e0",base02:"#d6d6d6",base03:"#8e908c",base04:"#969896",base05:"#4d4d4c",base06:"#282a2e",base07:"#1d1f21",base08:"#c82829",base09:"#f5871f",base0A:"#eab700",base0B:"#718c00",base0C:"#3e999f",base0D:"#4271ae",base0E:"#8959a8",base0F:"#a3685a"},AO={scheme:"Tomorrow Night",author:"Chris Kempson (http://chriskempson.com)",base00:"#1d1f21",base01:"#282a2e",base02:"#373b41",base03:"#969896",base04:"#b4b7b4",base05:"#c5c8c6",base06:"#e0e0e0",base07:"#ffffff",base08:"#cc6666",base09:"#de935f",base0A:"#f0c674",base0B:"#b5bd68",base0C:"#8abeb7",base0D:"#81a2be",base0E:"#b294bb",base0F:"#a3685a"};function IO({plugin:e,formatIndex:t,templateData:a}){let[n,i]=I.useState(null),[r,o]=I.useState(null),[s,l]=I.useState(0);return I.useEffect(()=>{let u=e.settings.exportFormats[t],c=u.templatePath?e.app.vault.getAbstractFileByPath(bp(u.templatePath)):null,f=b=>{b&&b===c&&l(Date.now())},p=()=>{l(Date.now())};return e.emitter.on("fileUpdated",f),e.emitter.on("settingsUpdated",p),()=>{e.emitter.off("fileUpdated",f),e.emitter.off("settingsUpdated",p)}},[t]),I.useEffect(()=>{if(i(null),t===null)return;let u={settings:e.settings,database:{database:e.settings.database,port:e.settings.port},exportFormat:e.settings.exportFormats[t]};(async()=>{try{let f="",p=(0,Ba.moment)(0),b=await wp(u,Kt.prepareTemplateData({...a,lastImportDate:p,lastExportDate:p},f),"",!0);o(b||null)}catch(f){i(f.message)}})()},[t,s,a]),!r&&!n?null:I.createElement("div",{className:`zt-json-viewer__preview${n?" error":""}`},I.createElement("pre",null,I.createElement("code",null,n||r)))}function _O({plugin:e}){let[t,a]=I.useState(null),[n,i]=I.useState(null),[r,o]=I.useState(null),s=I.useCallback(()=>{Kx(e.settings).then(l=>{!l||l.length===0?a("No data retrieved"):(a(null),i(l[0]))})},[]);return I.createElement("div",{className:"zt-json-viewer"},I.createElement("div",{className:"zt-json-viewer__btns"},I.createElement("div",null,I.createElement("button",{onClick:s},"Prompt For Selection")),I.createElement("div",null,I.createElement("select",{className:"dropdown",onChange:l=>{l.target.value?o(Number(l.target.value)):o(null)}},I.createElement("option",{value:""},"Preview Import Format"),e.settings.exportFormats.map((l,u)=>I.createElement("option",{key:u,value:u},l.name))))),t?I.createElement("div",null,t):I.createElement("div",null,n&&I.createElement(I.Fragment,null,r!==null&&I.createElement(IO,{plugin:e,formatIndex:r,templateData:n}),I.createElement("div",{className:"zt-json-viewer__data"},I.createElement(Sg,{data:n,sortObjectKeys:(l,u)=>l.localeCompare(u),isCustomNode:l=>l instanceof Ba.moment,valueRenderer:RO,labelRenderer:TO,theme:document.body.hasClass("theme-dark")?AO:CO,invertTheme:!1})))))}var Os=class extends Ba.ItemView{constructor(a,n){super(n);this.plugin=a,this.mountJsonViewer()}getViewType(){return Un}getIcon(){return"gear"}getDisplayText(){return"Zotero Data Explorer"}mountJsonViewer(){I.unmountComponentAtNode(this.contentEl),I.render(I.createElement(_O,{plugin:this.plugin}),this.contentEl)}unmountJsonViewer(){I.unmountComponentAtNode(this.contentEl)}async onClose(){this.unmountJsonViewer()}},TO=(e,t)=>{let a=e.length===1,n=e.slice(0,-1),i=kO(n);return I.createElement("span",{onContextMenu:a?void 0:o=>{let s=new Ba.Menu().addItem(l=>l.setIcon("lucide-copy").setTitle("Copy template path").onClick(()=>{navigator.clipboard.writeText(`{{${i}}}`)}));t==="Array"&&s.addItem(l=>l.setIcon("lucide-copy").setTitle("Copy template for loop").onClick(()=>{navigator.clipboard.writeText(`{% for item in ${i} %} {% item %} {% endfor %}`)})),o.preventDefault(),s.showAtMouseEvent(o)}},a?"Template Data":e[0])},kO=e=>e.map(PO).reverse().join(""),FO=/^[$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*$/u,PO=(e,t,a)=>typeof e=="number"?`[${e}]`:FO.test(e)?t===a.length-1?`${e}`:`.${e}`:`[${JSON.stringify(e)}]`,OO=/^#(?:[\dA-F]{3}){1,2}$|^#(?:[\dA-F]{4}){1,2}$/i,RO=(e,t)=>t instanceof Ba.moment?I.createElement(I.Fragment,null,"\u{1F4C5} ",t.format("l LTS")):typeof t=="string"&&OO.test(t)?I.createElement(I.Fragment,null,I.createElement("span",{style:{backgroundColor:t},className:"zt-color-chip"}),t):typeof t=="string"&&t.length>800?t.slice(0,800)+"...":e;var ZA=_e(UA()),Zl=require("obsidian"),Sf=_e(require("os"));var JA=require("obsidian");function ca({name:e,className:t}){return I.createElement("span",{"data-icon":e,className:t,ref:a=>{a&&(0,JA.setIcon)(a,e)}})}function s9({name:e,description:t}){return I.createElement("div",{className:"setting-item-info"},I.createElement("div",{className:"setting-item-name"},e),I.createElement("div",{className:"setting-item-description"},t))}function He({name:e,description:t,children:a,isHeading:n}){return I.createElement("div",{className:`zt-setting-item setting-item${n?" setting-item-heading":""}`},I.createElement(s9,{name:e,description:t}),I.createElement("div",{className:"setting-item-control"},a))}var Va="1.0.15",Cf=1,l9={darwin:{x64:`https://github.com/mgmeyers/pdfannots2json/releases/download/${Va}/pdfannots2json.Mac.Intel.tar.gz`,arm64:`https://github.com/mgmeyers/pdfannots2json/releases/download/${Va}/pdfannots2json.Mac.M1.tar.gz`},linux:{x64:`https://github.com/mgmeyers/pdfannots2json/releases/download/${Va}/pdfannots2json.Linux.x64.tar.gz`},win32:{x64:`https://github.com/mgmeyers/pdfannots2json/releases/download/${Va}/pdfannots2json.Windows.x64.zip`}};function c9(){let e=l9[Sf.default.platform()];if(!e)return null;let t=e[Sf.default.arch()];return t||null}async function Af(){let e=c9();if(console.log("Obsidian Zotero Integration: Downloading "+e),!e)return!1;try{xx()&&Ex(),gx()&&wx(),Hn()&&yx(),await(0,ZA.default)(e,_t(),{extract:!0}),vx()}catch(t){console.error(t),new Zl.Notice("Error downloading PDF utility. Check the console for more details.",1e4)}return!0}function qA(e){let[t,a]=I.useState(null),[n,i]=I.useState(!1),[r,o]=I.useState(!1),[s,l]=I.useState(e.settings.exeOverridePath),u=I.useMemo(()=>(0,Zl.debounce)(m=>{l(m),e.updateSetting("exeOverridePath",m)},150,!0),[]);I.useEffect(()=>{let m=Hn(s);o(m),m&&Sx(s).then(h=>{a(`v${Va}`===h)}).catch(()=>{})},[s]);let c=I.useCallback(()=>{i(!0),Af().then(m=>{i(!1),m&&(a(!0),o(!0))})},[]),f=["Extracting data from PDFs requires an external tool.","This plugin will still work without it, but annotations will not be included in exports."],b=I.createElement(He,{name:"PDF Utility Path Override",description:I.createElement(I.Fragment,null,"Override the path to the PDF utility. Specify an absolute path to the pdfannots2json executable."," ",I.createElement("a",{href:"https://github.com/mgmeyers/pdfannots2json/releases",target:"_blank",rel:"noreferrer"},"Download the executable here.")," ","You may need to provide Obsidian the appropriate OS permissions to access the executable.")},I.createElement("input",{onChange:m=>u(m.target.value),type:"text",spellCheck:!1,value:s}),I.createElement("div",{className:"clickable-icon setting-editor-extra-setting-button","aria-label":"Select the pdfannots2json executable",onClick:()=>{let m=require("electron").remote.dialog.showOpenDialogSync({properties:["openFile"]});m&&m.length&&u(m[0])}},I.createElement(ca,{name:"lucide-folder-open"})));if(r&&t)return I.createElement(I.Fragment,null,I.createElement(He,{name:"PDF Utility",description:f.join(" ")},I.createElement("div",{className:"zt-asset-success"},I.createElement("div",{className:"zt-asset-success__icon"},I.createElement(ca,{name:"check-small"})),I.createElement("div",{className:"zt-asset-success__message"},"PDF utility is up to date."))),b);let d=I.createElement(I.Fragment,null,f.join(" ")," ",r&&I.createElement("strong",{className:"mod-warning"},"The PDF extraction tool requires updating. Please re-download."),!r&&!s&&I.createElement("strong",null,"Click the button to download."));return I.createElement(I.Fragment,null,I.createElement(He,{name:"PDF Utility",description:d},!s&&I.createElement("button",{disabled:n,onClick:c},n?"Downloading...":"Download")),b)}var Ja=require("obsidian");var V_=_e(r2());function o2(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),a.push.apply(a,n)}return a}function ae(e){for(var t=1;t0?$e(wi,--wt):0,xi--,Qe===10&&(xi=1,Kl--),Qe}function Et(){return Qe=wt2||yi(Qe)>3?"":" "}function g2(e,t){for(;--t&&Et()&&!(Qe<48||Qe>102||Qe>57&&Qe<65||Qe>70&&Qe<97););return Si(e,Dr()+(t<6&&Ht()==32&&Et()==32))}function Mf(e){for(;Et();)switch(Qe){case e:return wt;case 34:case 39:e!==34&&e!==39&&Mf(Qe);break;case 40:e===41&&Mf(e);break;case 92:Et();break}return wt}function x2(e,t){for(;Et()&&e+Qe!==47+10;)if(e+Qe===42+42&&Ht()===47)break;return"/*"+Si(t,wt-1)+"*"+xn(e===47?e:Et())}function y2(e){for(;!yi(Ht());)Et();return Si(e,wt)}function S2(e){return ec(tc("",null,null,null,[""],e=Ql(e),0,[0],e))}function tc(e,t,a,n,i,r,o,s,l){for(var u=0,c=0,f=o,p=0,b=0,d=0,m=1,h=1,v=1,x=0,E="",g=i,w=r,C=n,y=E;h;)switch(d=x,x=Et()){case 40:if(d!=108&&$e(y,f-1)==58){Lr(y+=ye(Ci(x),"&","&\f"),"&\f")!=-1&&(v=-1);break}case 34:case 39:case 91:y+=Ci(x);break;case 9:case 10:case 13:case 32:y+=b2(d);break;case 92:y+=g2(Dr()-1,7);continue;case 47:switch(Ht()){case 42:case 47:gi(v9(x2(Et(),Dr()),t,a),l);break;default:y+="/"}break;case 123*m:s[u++]=yt(y)*v;case 125*m:case 59:case 0:switch(x){case 0:case 125:h=0;case 59+c:v==-1&&(y=ye(y,/\f/g,"")),b>0&&yt(y)-f&&gi(b>32?E2(y+";",n,a,f-1):E2(ye(y," ","")+";",n,a,f-2),l);break;case 59:y+=";";default:if(gi(C=w2(y,t,a,u,c,i,s,E,g=[],w=[],f),r),x===123)if(c===0)tc(y,t,C,C,g,r,f,s,w);else switch(p===99&&$e(y,3)===110?100:p){case 100:case 108:case 109:case 115:tc(e,C,C,n&&gi(w2(e,C,C,0,0,i,s,E,i,g=[],f),w),i,w,f,s,n?g:w);break;default:tc(y,C,C,C,[""],w,0,s,w)}}u=c=b=0,m=v=1,E=y="",f=o;break;case 58:f=1+yt(y),b=d;default:if(m<1){if(x==123)--m;else if(x==125&&m++==0&&v2()==125)continue}switch(y+=xn(x),x*m){case 38:v=c>0?1:(y+="\f",-1);break;case 44:s[u++]=(yt(y)-1)*v,v=1;break;case 64:Ht()===45&&(y+=Ci(Et())),p=Ht(),c=f=yt(E=y+=y2(Dr())),x++;break;case 45:d===45&&yt(y)==2&&(m=0)}}return r}function w2(e,t,a,n,i,r,o,s,l,u,c){for(var f=i-1,p=i===0?r:[""],b=bi(p),d=0,m=0,h=0;d0?p[v]+" "+x:ye(x,/&\f/g,p[v])))&&(l[h++]=E);return Mr(e,t,a,i===0?mi:s,l,u,c)}function v9(e,t,a){return Mr(e,t,a,Xl,xn(h2()),Ua(e,2,-2),0)}function E2(e,t,a,n){return Mr(e,t,a,hi,Ua(e,0,n),Ua(e,n+1,-1),n)}function yn(e,t){for(var a="",n=bi(e),i=0;i6)switch($e(e,t+1)){case 109:if($e(e,t+4)!==45)break;case 102:return ye(e,/(.+:)(.+)-([^]+)/,"$1"+Se+"$2-$3$1"+jr+($e(e,t+3)==108?"$3":"$2-$3"))+e;case 115:return~Lr(e,"stretch")?k2(ye(e,"stretch","fill-available"),t)+e:e}break;case 4949:if($e(e,t+1)!==115)break;case 6444:switch($e(e,yt(e)-3-(~Lr(e,"!important")&&10))){case 107:return ye(e,":",":"+Se)+e;case 101:return ye(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+Se+($e(e,14)===45?"inline-":"")+"box$3$1"+Se+"$2$3$1"+dt+"$2box$3")+e}break;case 5936:switch($e(e,t+11)){case 114:return Se+e+dt+ye(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return Se+e+dt+ye(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return Se+e+dt+ye(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return Se+e+dt+e+e}return e}var E9=function(t,a,n,i){if(t.length>-1&&!t.return)switch(t.type){case hi:t.return=k2(t.value,t.length);break;case $l:return yn([Ei(t,{value:ye(t.value,"@","@"+Se)})],i);case mi:if(t.length)return Lf(t.props,function(r){switch(jf(r,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return yn([Ei(t,{props:[ye(r,/:(read-\w+)/,":"+jr+"$1")]})],i);case"::placeholder":return yn([Ei(t,{props:[ye(r,/:(plac\w+)/,":"+Se+"input-$1")]}),Ei(t,{props:[ye(r,/:(plac\w+)/,":"+jr+"$1")]}),Ei(t,{props:[ye(r,/:(plac\w+)/,dt+"input-$1")]})],i)}return""})}},S9=[E9],Df=function(t){var a=t.key;if(a==="css"){var n=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(n,function(m){var h=m.getAttribute("data-emotion");h.indexOf(" ")!==-1&&(document.head.appendChild(m),m.setAttribute("data-s",""))})}var i=t.stylisPlugins||S9,r={},o,s=[];o=t.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+a+' "]'),function(m){for(var h=m.getAttribute("data-emotion").split(" "),v=1;v=4;++n,i-=4)a=e.charCodeAt(n)&255|(e.charCodeAt(++n)&255)<<8|(e.charCodeAt(++n)&255)<<16|(e.charCodeAt(++n)&255)<<24,a=(a&65535)*1540483477+((a>>>16)*59797<<16),a^=a>>>24,t=(a&65535)*1540483477+((a>>>16)*59797<<16)^(t&65535)*1540483477+((t>>>16)*59797<<16);switch(i){case 3:t^=(e.charCodeAt(n+2)&255)<<16;case 2:t^=(e.charCodeAt(n+1)&255)<<8;case 1:t^=e.charCodeAt(n)&255,t=(t&65535)*1540483477+((t>>>16)*59797<<16)}return t^=t>>>13,t=(t&65535)*1540483477+((t>>>16)*59797<<16),((t^t>>>15)>>>0).toString(36)}var H2={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var L9=/[A-Z]|^ms/g,M9=/_EMO_([^_]+?)_([^]*?)_EMO_/g,J2=function(t){return t.charCodeAt(1)===45},W2=function(t){return t!=null&&typeof t!="boolean"},Zf=_2(function(e){return J2(e)?e:e.replace(L9,"-$&").toLowerCase()}),V2=function(t,a){switch(t){case"animation":case"animationName":if(typeof a=="string")return a.replace(M9,function(n,i,r){return ua={name:i,styles:r,next:ua},i})}return H2[t]!==1&&!J2(t)&&typeof a=="number"&&a!==0?a+"px":a};function zr(e,t,a){if(a==null)return"";if(a.__emotion_styles!==void 0)return a;switch(typeof a){case"boolean":return"";case"object":{if(a.anim===1)return ua={name:a.name,styles:a.styles,next:ua},a.name;if(a.styles!==void 0){var n=a.next;if(n!==void 0)for(;n!==void 0;)ua={name:n.name,styles:n.styles,next:ua},n=n.next;var i=a.styles+";";return i}return D9(e,t,a)}case"function":{if(e!==void 0){var r=ua,o=a(e);return ua=r,zr(e,t,o)}break}case"string":if(!1)var s,l;break}if(t==null)return a;var u=t[a];return u!==void 0?u:a}function D9(e,t,a){var n="";if(Array.isArray(a))for(var i=0;i=0)&&(a[i]=e[i]);return a}function Wt(e,t){if(e==null)return{};var a=Yf(e,t),n,i;if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}function Kf(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function K2(e){return{...e,top:e.y,left:e.x,right:e.x+e.width,bottom:e.y+e.height}}var V9=["top","right","bottom","left"],dJ=V9.reduce((e,t)=>e.concat(t,t+"-start",t+"-end"),[]);function pa(e){var t;return((t=e.ownerDocument)==null?void 0:t.defaultView)||window}function aI(e){return pa(e).getComputedStyle(e)}function nI(e){return e instanceof pa(e).Node}function iI(e){return nI(e)?(e.nodeName||"").toLowerCase():"#document"}function am(e){return e instanceof pa(e).HTMLElement}function em(e){return e instanceof pa(e).Element}function Q2(e){return typeof ShadowRoot!="undefined"&&(e instanceof pa(e).ShadowRoot||e instanceof ShadowRoot)}function rI(e){let{overflow:t,overflowX:a,overflowY:n,display:i}=aI(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+a)&&!["inline","contents"].includes(i)}function U9(){return!(typeof CSS=="undefined"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function J9(e){return["html","body","#document"].includes(iI(e))}var Z9=Math.min,q9=Math.max,bc=Math.round,vc=Math.floor,nm=e=>({x:e,y:e});function X9(e){let t=aI(e),a=parseFloat(t.width)||0,n=parseFloat(t.height)||0,i=am(e),r=i?e.offsetWidth:a,o=i?e.offsetHeight:n,s=bc(a)!==r||bc(n)!==o;return s&&(a=r,n=o),{width:a,height:n,$:s}}function im(e){return em(e)?e:e.contextElement}function Qf(e){let t=im(e);if(!am(t))return nm(1);let a=t.getBoundingClientRect(),{width:n,height:i,$:r}=X9(t),o=(r?bc(a.width):a.width)/n,s=(r?bc(a.height):a.height)/i;return o&&Number.isFinite(o)||(o=1),s&&Number.isFinite(s)||(s=1),{x:o,y:s}}var eI=nm(0);function $9(e,t,a){var n,i;if(t===void 0&&(t=!0),!U9())return eI;let r=e?pa(e):window;return!a||t&&a!==r?eI:{x:((n=r.visualViewport)==null?void 0:n.offsetLeft)||0,y:((i=r.visualViewport)==null?void 0:i.offsetTop)||0}}function tI(e,t,a,n){t===void 0&&(t=!1),a===void 0&&(a=!1);let i=e.getBoundingClientRect(),r=im(e),o=nm(1);t&&(n?em(n)&&(o=Qf(n)):o=Qf(e));let s=$9(r,a,n),l=(i.left+s.x)/o.x,u=(i.top+s.y)/o.y,c=i.width/o.x,f=i.height/o.y;if(r){let p=pa(r),b=n&&em(n)?pa(n):n,d=p.frameElement;for(;d&&n&&b!==p;){let m=Qf(d),h=d.getBoundingClientRect(),v=getComputedStyle(d),x=h.left+(d.clientLeft+parseFloat(v.paddingLeft))*m.x,E=h.top+(d.clientTop+parseFloat(v.paddingTop))*m.y;l*=m.x,u*=m.y,c*=m.x,f*=m.y,l+=x,u+=E,d=pa(d).frameElement}}return K2({width:c,height:f,x:l,y:u})}function oI(e){return((nI(e)?e.ownerDocument:e.document)||window.document).documentElement}function Y9(e){if(iI(e)==="html")return e;let t=e.assignedSlot||e.parentNode||Q2(e)&&e.host||oI(e);return Q2(t)?t.host:t}function sI(e){let t=Y9(e);return J9(t)?e.ownerDocument?e.ownerDocument.body:e.body:am(t)&&rI(t)?t:sI(t)}function tm(e,t){var a;t===void 0&&(t=[]);let n=sI(e),i=n===((a=e.ownerDocument)==null?void 0:a.body),r=pa(n);return i?t.concat(r,r.visualViewport||[],rI(n)?n:[]):t.concat(n,tm(n))}function lI(e,t,a,n){n===void 0&&(n={});let{ancestorScroll:i=!0,ancestorResize:r=!0,elementResize:o=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:l=!1}=n,u=im(e),c=i||r?[...u?tm(u):[],...tm(t)]:[];c.forEach(h=>{i&&h.addEventListener("scroll",a,{passive:!0}),r&&h.addEventListener("resize",a)});let f=u&&s?function(h,v){let x,E=null,g=oI(h);function w(){clearTimeout(x),E&&E.disconnect(),E=null}return function C(y,S){y===void 0&&(y=!1),S===void 0&&(S=1),w();let{left:A,top:_,width:P,height:F}=h.getBoundingClientRect();if(y||v(),!P||!F)return;let B={rootMargin:-vc(_)+"px "+-vc(g.clientWidth-(A+P))+"px "+-vc(g.clientHeight-(_+F))+"px "+-vc(A)+"px",threshold:q9(0,Z9(1,S))||1},j=!0;function L(k){let T=k[0].intersectionRatio;if(T!==S){if(!j)return C();T?C(!1,T):x=setTimeout(()=>{C(!1,1e-7)},100)}j=!1}try{E=new IntersectionObserver(L,{...B,root:g.ownerDocument})}catch(k){E=new IntersectionObserver(L,B)}E.observe(h)}(!0),w}(u,a):null,p,b=-1,d=null;o&&(d=new ResizeObserver(h=>{let[v]=h;v&&v.target===u&&d&&(d.unobserve(t),cancelAnimationFrame(b),b=requestAnimationFrame(()=>{d&&d.observe(t)})),a()}),u&&!l&&d.observe(u),d.observe(t));let m=l?tI(e):null;return l&&function h(){let v=tI(e);!m||v.x===m.x&&v.y===m.y&&v.width===m.width&&v.height===m.height||a(),m=v,p=requestAnimationFrame(h)}(),a(),()=>{c.forEach(h=>{i&&h.removeEventListener("scroll",a),r&&h.removeEventListener("resize",a)}),f&&f(),d&&d.disconnect(),d=null,l&&cancelAnimationFrame(p)}}var K9=ka,gc=K9;var Q9=["className","clearValue","cx","getStyles","getClassNames","getValue","hasValue","isMulti","isRtl","options","selectOption","selectProps","setValue","theme"],Hr=function(){};function eL(e,t){return t?t[0]==="-"?e+t:e+"__"+t:e}function uI(e,t){for(var a=arguments.length,n=new Array(a>2?a-2:0),i=2;i-1}function tL(e){return Wr(e)?window.innerHeight:e.clientHeight}function fI(e){return Wr(e)?window.pageYOffset:e.scrollTop}function wc(e,t){if(Wr(e)){window.scrollTo(0,t);return}e.scrollTop=t}function aL(e){var t=getComputedStyle(e),a=t.position==="absolute",n=/(auto|scroll)/;if(t.position==="fixed")return document.documentElement;for(var i=e;i=i.parentElement;)if(t=getComputedStyle(i),!(a&&t.position==="static")&&n.test(t.overflow+t.overflowY+t.overflowX))return i;return document.documentElement}function nL(e,t,a,n){return a*((e=e/n-1)*e*e+1)+t}function xc(e,t){var a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:200,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:Hr,i=fI(e),r=t-i,o=10,s=0;function l(){s+=o;var u=nL(s,i,r,a);wc(e,u),sa.bottom?wc(e,Math.min(t.offsetTop+t.clientHeight-e.offsetHeight+i,e.scrollHeight)):n.top-i1?a-1:0),i=1;i=d)return{placement:"bottom",maxHeight:t};if(A>=d&&!o)return r&&xc(l,_,F),{placement:"bottom",maxHeight:t};if(!o&&A>=n||o&&y>=n){r&&xc(l,_,F);var B=o?y-g:A-g;return{placement:"bottom",maxHeight:B}}if(i==="auto"||o){var j=t,L=o?C:S;return L>=n&&(j=Math.min(L-g-s,t)),{placement:"top",maxHeight:j}}if(i==="bottom")return r&&wc(l,_),{placement:"bottom",maxHeight:t};break;case"top":if(C>=d)return{placement:"top",maxHeight:t};if(S>=d&&!o)return r&&xc(l,P,F),{placement:"top",maxHeight:t};if(!o&&S>=n||o&&C>=n){var k=t;return(!o&&S>=n||o&&C>=n)&&(k=o?C-w:S-w),r&&xc(l,P,F),{placement:"top",maxHeight:k}}return{placement:"bottom",maxHeight:t};default:throw new Error('Invalid placement provided "'.concat(i,'".'))}return u}function lL(e){var t={bottom:"top",top:"bottom"};return e?t[e]:"bottom"}var xI=function(t){return t==="auto"?"bottom":t},yI=function(t,a){var n,i=t.placement,r=t.theme,o=r.borderRadius,s=r.spacing,l=r.colors;return ae((n={label:"menu"},jt(n,lL(i),"100%"),jt(n,"position","absolute"),jt(n,"width","100%"),jt(n,"zIndex",1),n),a?{}:{backgroundColor:l.neutral0,borderRadius:o,boxShadow:"0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1)",marginBottom:s.menuGutter,marginTop:s.menuGutter})},wI=_a(null),EI=function(t){var a=t.children,n=t.minMenuHeight,i=t.maxMenuHeight,r=t.menuPlacement,o=t.menuPosition,s=t.menuShouldScrollIntoView,l=t.theme,u=Yt(wI)||{},c=u.setPortalPlacement,f=ot(null),p=Re(i),b=Le(p,2),d=b[0],m=b[1],h=Re(null),v=Le(h,2),x=v[0],E=v[1],g=l.spacing.controlHeight;return gc(function(){var w=f.current;if(w){var C=o==="fixed",y=s&&!C,S=sL({maxHeight:i,menuEl:w,minHeight:n,placement:r,shouldScroll:y,isFixedPosition:C,controlHeight:g});m(S.maxHeight),E(S.placement),c==null||c(S.placement)}},[i,r,o,s,n,c,g]),a({ref:f,placerProps:ae(ae({},t),{},{placement:x||xI(r),maxHeight:d})})},cL=function(t){var a=t.children,n=t.innerRef,i=t.innerProps;return re("div",W({},Ze(t,"menu",{menu:!0}),{ref:n},i),a)},uL=cL,SI=function(t,a){var n=t.maxHeight,i=t.theme.spacing.baseUnit;return ae({maxHeight:n,overflowY:"auto",position:"relative",WebkitOverflowScrolling:"touch"},a?{}:{paddingBottom:i,paddingTop:i})},pL=function(t){var a=t.children,n=t.innerProps,i=t.innerRef,r=t.isMulti;return re("div",W({},Ze(t,"menuList",{"menu-list":!0,"menu-list--is-multi":r}),{ref:i},n),a)},CI=function(t,a){var n=t.theme,i=n.spacing.baseUnit,r=n.colors;return ae({textAlign:"center"},a?{}:{color:r.neutral40,padding:"".concat(i*2,"px ").concat(i*3,"px")})},AI=CI,II=CI,_I=function(t){var a=t.children,n=t.innerProps;return re("div",W({},Ze(t,"noOptionsMessage",{"menu-notice":!0,"menu-notice--no-options":!0}),n),a)};_I.defaultProps={children:"No options"};var TI=function(t){var a=t.children,n=t.innerProps;return re("div",W({},Ze(t,"loadingMessage",{"menu-notice":!0,"menu-notice--loading":!0}),n),a)};TI.defaultProps={children:"Loading..."};var kI=function(t){var a=t.rect,n=t.offset,i=t.position;return{left:a.left,position:i,top:n,width:a.width,zIndex:1}},dL=function(t){var a=t.appendTo,n=t.children,i=t.controlElement,r=t.innerProps,o=t.menuPlacement,s=t.menuPosition,l=ot(null),u=ot(null),c=Re(xI(o)),f=Le(c,2),p=f[0],b=f[1],d=At(function(){return{setPortalPlacement:b}},[]),m=Re(null),h=Le(m,2),v=h[0],x=h[1],E=Fe(function(){if(i){var y=iL(i),S=s==="fixed"?0:window.pageYOffset,A=y[p]+S;(A!==(v==null?void 0:v.offset)||y.left!==(v==null?void 0:v.rect.left)||y.width!==(v==null?void 0:v.rect.width))&&x({offset:A,rect:y})}},[i,s,p,v==null?void 0:v.offset,v==null?void 0:v.rect.left,v==null?void 0:v.rect.width]);gc(function(){E()},[E]);var g=Fe(function(){typeof u.current=="function"&&(u.current(),u.current=null),i&&l.current&&(u.current=lI(i,l.current,E,{elementResize:"ResizeObserver"in window}))},[i,E]);gc(function(){g()},[g]);var w=Fe(function(y){l.current=y,g()},[g]);if(!a&&s!=="fixed"||!v)return null;var C=re("div",W({ref:w},Ze(ae(ae({},t),{},{offset:v.offset,position:s,rect:v.rect}),"menuPortal",{"menu-portal":!0}),r),n);return re(wI.Provider,{value:d},a?yu(C,a):C)},FI=function(t){var a=t.isDisabled,n=t.isRtl;return{label:"container",direction:n?"rtl":void 0,pointerEvents:a?"none":void 0,position:"relative"}},fL=function(t){var a=t.children,n=t.innerProps,i=t.isDisabled,r=t.isRtl;return re("div",W({},Ze(t,"container",{"--is-disabled":i,"--is-rtl":r}),n),a)},PI=function(t,a){var n=t.theme.spacing,i=t.isMulti,r=t.hasValue,o=t.selectProps.controlShouldRenderValue;return ae({alignItems:"center",display:i&&r&&o?"flex":"grid",flex:1,flexWrap:"wrap",WebkitOverflowScrolling:"touch",position:"relative",overflow:"hidden"},a?{}:{padding:"".concat(n.baseUnit/2,"px ").concat(n.baseUnit*2,"px")})},mL=function(t){var a=t.children,n=t.innerProps,i=t.isMulti,r=t.hasValue;return re("div",W({},Ze(t,"valueContainer",{"value-container":!0,"value-container--is-multi":i,"value-container--has-value":r}),n),a)},OI=function(){return{alignItems:"center",alignSelf:"stretch",display:"flex",flexShrink:0}},hL=function(t){var a=t.children,n=t.innerProps;return re("div",W({},Ze(t,"indicatorsContainer",{indicators:!0}),n),a)},cI,vL=["size"];var bL={name:"8mmkcg",styles:"display:inline-block;fill:currentColor;line-height:1;stroke:currentColor;stroke-width:0"},RI=function(t){var a=t.size,n=Wt(t,vL);return re("svg",W({height:a,width:a,viewBox:"0 0 20 20","aria-hidden":"true",focusable:"false",css:bL},n))},cm=function(t){return re(RI,W({size:20},t),re("path",{d:"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z"}))},BI=function(t){return re(RI,W({size:20},t),re("path",{d:"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"}))},NI=function(t,a){var n=t.isFocused,i=t.theme,r=i.spacing.baseUnit,o=i.colors;return ae({label:"indicatorContainer",display:"flex",transition:"color 150ms"},a?{}:{color:n?o.neutral60:o.neutral20,padding:r*2,":hover":{color:n?o.neutral80:o.neutral40}})},jI=NI,gL=function(t){var a=t.children,n=t.innerProps;return re("div",W({},Ze(t,"dropdownIndicator",{indicator:!0,"dropdown-indicator":!0}),n),a||re(BI,null))},LI=NI,xL=function(t){var a=t.children,n=t.innerProps;return re("div",W({},Ze(t,"clearIndicator",{indicator:!0,"clear-indicator":!0}),n),a||re(cm,null))},MI=function(t,a){var n=t.isDisabled,i=t.theme,r=i.spacing.baseUnit,o=i.colors;return ae({label:"indicatorSeparator",alignSelf:"stretch",width:1},a?{}:{backgroundColor:n?o.neutral10:o.neutral20,marginBottom:r*2,marginTop:r*2})},yL=function(t){var a=t.innerProps;return re("span",W({},a,Ze(t,"indicatorSeparator",{"indicator-separator":!0})))},wL=Y2(cI||(cI=Kf([` diff --git a/content/.obsidian/plugins/obsidian-zotero-desktop-connector/manifest.json b/content/.obsidian/plugins/obsidian-zotero-desktop-connector/manifest.json index c513dbc8..2ad8d1c3 100644 --- a/content/.obsidian/plugins/obsidian-zotero-desktop-connector/manifest.json +++ b/content/.obsidian/plugins/obsidian-zotero-desktop-connector/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-zotero-desktop-connector", "name": "Zotero Integration", - "version": "3.1.7", + "version": "3.1.8", "minAppVersion": "1.1.1", "description": "Insert and import citations, bibliographies, notes, and PDF annotations from Zotero.", "author": "mgmeyers",